@artemjs/vfskit-front 1.2.0 → 1.2.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 +1 -1
- package/dist/conformance.js +1 -1
- package/dist/index.js +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<h1 align="center">vfskit</h1>
|
|
6
6
|
|
|
7
7
|
<p align="center">
|
|
8
|
-
<img src="https://img.shields.io/badge/version-1.2.
|
|
8
|
+
<img src="https://img.shields.io/badge/version-1.2.1-7c8cff?style=flat-square" alt="version">
|
|
9
9
|
<img src="https://img.shields.io/badge/license-MIT-56e6c4?style=flat-square" alt="license">
|
|
10
10
|
<img src="https://img.shields.io/badge/TypeScript-strict-3178c6?style=flat-square" alt="typescript">
|
|
11
11
|
<img src="https://img.shields.io/badge/module-ESM-f0db4f?style=flat-square" alt="esm">
|
package/dist/conformance.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
var h=new TextEncoder,
|
|
1
|
+
var h=new TextEncoder,v=new TextDecoder;function w(a){return typeof a=="string"?h.encode(a):a instanceof Uint8Array?a:new Uint8Array(a)}function o(a){return v.decode(a)}function d(a){let t=0;for(let i of a)t+=i.length;let e=new Uint8Array(t),n=0;for(let i of a)e.set(i,n),n+=i.length;return e}var m=Symbol.for("vfskit.VfsError"),u=class extends Error{code;path;[m]=!0;constructor(t,e,n){super(e),this.name="VfsError",this.code=t,this.path=n}};function f(a){return typeof a=="object"&&a!==null&&a[m]===!0}async function y(a,t,e){if(a.readStream)return a.readStream(t,e);let n=await a.read(t,e);return new ReadableStream({start(i){i.enqueue(n),i.close()}})}async function p(a,t,e){if(a.writeStream)return a.writeStream(t,e);let n=[];return new WritableStream({write(i){n.push(i)},async close(){await a.write(t,d(n),e)}})}async function l(a){let t=[],e=a.getReader();for(;;){let{done:n,value:i}=await e.read();if(n)break;i&&t.push(i)}return d(t)}function x(a){throw new Error("conformance: "+a)}function c(a,t="expected truthy"){a||x(t)}function r(a,t,e){a!==t&&x(e??`expected ${JSON.stringify(t)}, got ${JSON.stringify(a)}`)}async function s(a,t){let e;try{await a()}catch(n){e=n}c(f(e)&&e.code===t,`expected error ${t}, got ${f(e)?e.code:e}`)}async function b(a){let t;try{await a()}catch(e){t=e}c(t,"expected throw")}async function S(a,t=2e3){for(let n=0;n<t;n+=10){if(a())return;await new Promise(i=>setTimeout(i,10))}}var g=[{name:"writes and reads a file",async run(a){let t=a();await t.write("/a.txt","hello"),r(o(await t.read("/a.txt")),"hello")}},{name:"reports existence",async run(a){let t=a();r(await t.exists("/a.txt"),!1),await t.write("/a.txt","x"),r(await t.exists("/a.txt"),!0)}},{name:"stats a file",async run(a){let t=a();await t.write("/a.txt","hello");let e=await t.stat("/a.txt");r(e.type,"file"),c(e.size>0)}},{name:"throws NOT_FOUND for missing read",async run(a){let t=a();await s(()=>t.read("/nope"),"NOT_FOUND")}},{name:"lists directory children",async run(a){let t=a();await t.mkdir("/d"),await t.write("/d/a","1"),await t.write("/d/b","2"),r((await t.list("/d")).map(e=>e.name).sort().join(","),"a,b")}},{name:"lists recursively",async run(a){let t=a();await t.mkdir("/d"),await t.mkdir("/d/sub"),await t.write("/d/sub/a","1"),c((await t.list("/d",{recursive:!0})).some(e=>e.path==="/d/sub/a"))}},{name:"removes a file",async run(a){let t=a();await t.write("/a","1"),await t.remove("/a"),r(await t.exists("/a"),!1)}},{name:"requires recursive to remove a non-empty dir",async run(a){let t=a();await t.mkdir("/d"),await t.write("/d/a","1"),await b(()=>t.remove("/d")),await t.remove("/d",{recursive:!0}),r(await t.exists("/d"),!1)}},{name:"moves a file",async run(a){let t=a();await t.write("/a","1"),await t.move("/a","/b"),r(await t.exists("/a"),!1),r(o(await t.read("/b")),"1")}},{name:"copies a file",async run(a){let t=a();await t.write("/a","1"),await t.copy("/a","/b"),r(o(await t.read("/a")),"1"),r(o(await t.read("/b")),"1")}},{name:"stores and reads metadata",async run(a){let t=a();await t.write("/a","1",{meta:{tag:"x"}}),r((await t.getMeta("/a")).tag,"x"),await t.setMeta("/a",{tag:"y"}),r((await t.getMeta("/a")).tag,"y")}},{name:"emits watch events when supported",async run(a){let t=a();if(!t.capabilities().watch)return;let e=[],n=t.watch("/",i=>e.push(i.type+":"+i.path));await new Promise(i=>setTimeout(i,60)),await t.write("/a","1"),await S(()=>e.includes("create:/a")),n(),c(e.includes("create:/a"))}},{name:"moves a directory subtree",async run(a){let t=a();await t.mkdir("/d"),await t.mkdir("/d/sub"),await t.write("/d/sub/a","1"),await t.move("/d","/e"),r(await t.exists("/d"),!1),r(o(await t.read("/e/sub/a")),"1")}},{name:"copies a directory subtree deeply",async run(a){let t=a();await t.mkdir("/d"),await t.write("/d/a","1"),await t.copy("/d","/e"),await t.write("/e/a","2"),r(o(await t.read("/d/a")),"1"),r(o(await t.read("/e/a")),"2")}},{name:"isolates returned read buffers from the store",async run(a){let t=a();await t.write("/a","abc");let e=await t.read("/a");e[0]=0,r(o(await t.read("/a")),"abc")}},{name:"does not confuse sibling prefixes",async run(a){let t=a();await t.mkdir("/d"),await t.mkdir("/dx"),await t.write("/dx/a","1"),c(!(await t.list("/d")).some(e=>e.name==="a"))}},{name:"reports byte size matching written content",async run(a){let t=a();await t.write("/a","hello"),r((await t.stat("/a")).size,5)}},{name:"throws ALREADY_EXISTS creating an existing dir without recursive",async run(a){let t=a();await t.mkdir("/d"),await s(()=>t.mkdir("/d"),"ALREADY_EXISTS")}},{name:"preserves metadata when overwriting content without new meta",async run(a){let t=a();await t.write("/a","1",{meta:{tag:"x"}}),await t.write("/a","2"),r((await t.getMeta("/a")).tag,"x")}},{name:"throws NOT_A_DIRECTORY creating a directory under a file",async run(a){let t=a();await t.write("/f","1"),await s(()=>t.mkdir("/f/sub",{recursive:!0}),"NOT_A_DIRECTORY")}},{name:"throws ALREADY_EXISTS moving or copying onto an existing path",async run(a){let t=a();await t.write("/a","1"),await t.write("/b","2"),await s(()=>t.move("/a","/b"),"ALREADY_EXISTS"),await s(()=>t.copy("/a","/b"),"ALREADY_EXISTS")}},{name:"conditional write succeeds on matching version and CONFLICTs on stale (when capable)",async run(a){let t=a();if(!t.capabilities().conditionalWrite)return;await t.write("/a","1");let e=(await t.stat("/a")).version;c(typeof e=="string"&&e.length>0,"expected a version token"),await t.write("/a","2",{ifMatch:e}),r(o(await t.read("/a")),"2"),await s(()=>t.write("/a","3",{ifMatch:e}),"CONFLICT"),r(o(await t.read("/a")),"2")}},{name:"ifAbsent rejects overwriting an existing file (when capable)",async run(a){let t=a();t.capabilities().conditionalWrite&&(await t.write("/a","1"),await s(()=>t.write("/a","2",{ifAbsent:!0}),"ALREADY_EXISTS"),r(o(await t.read("/a")),"1"))}},{name:"rejects removing the root",async run(a){let t=a();await s(()=>t.remove("/"),"IO"),await s(()=>t.remove("/",{recursive:!0}),"IO")}},{name:"mkdir over an existing file throws ALREADY_EXISTS",async run(a){let t=a();await t.write("/f","1"),await s(()=>t.mkdir("/f"),"ALREADY_EXISTS"),await s(()=>t.mkdir("/f",{recursive:!0}),"ALREADY_EXISTS")}},{name:"ifMatch on a missing file always conflicts (when capable)",async run(a){let t=a();t.capabilities().conditionalWrite&&(await s(()=>t.write("/a","x",{ifMatch:"0"}),"CONFLICT"),await s(()=>t.write("/a","x",{ifMatch:""}),"CONFLICT"))}},{name:"setMeta assigns a new version (when capable)",async run(a){let t=a();if(!t.capabilities().conditionalWrite)return;await t.write("/a","1");let e=(await t.stat("/a")).version;await t.setMeta("/a",{x:1});let n=(await t.stat("/a")).version;c(typeof n=="string"&&n.length>0&&n!==e,"expected a new version after setMeta")}},{name:"copy assigns a new version to the copy (when capable)",async run(a){let t=a();if(!t.capabilities().conditionalWrite)return;await t.write("/a","1");let e=(await t.stat("/a")).version;await t.copy("/a","/b");let n=(await t.stat("/b")).version;c(typeof n=="string"&&n.length>0&&n!==e,"expected a new version on copy")}},{name:"rejects copy or move into its own subtree",async run(a){let t=a();await t.mkdir("/d"),await t.write("/d/a","1"),await s(()=>t.copy("/d","/d/x"),"IO"),await s(()=>t.move("/d","/d/x"),"IO")}},{name:"throws NOT_A_DIRECTORY copying under a file",async run(a){let t=a();await t.write("/f","1"),await t.write("/src","2"),await s(()=>t.copy("/src","/f/x"),"NOT_A_DIRECTORY")}},{name:"changes the version token on move (when capable)",async run(a){let t=a();if(!t.capabilities().conditionalWrite)return;await t.write("/a","1");let e=(await t.stat("/a")).version;await t.move("/a","/b");let n=(await t.stat("/b")).version;c(typeof n=="string"&&n.length>0&&n!==e,"expected a new version after move")}},{name:"streams content in and back out (helper, native or buffered)",async run(a){let t=a(),n=(await p(t,"/s.bin")).getWriter();await n.write(w("chunk-one;")),await n.write(w("chunk-two")),await n.close(),r(o(await l(await y(t,"/s.bin"))),"chunk-one;chunk-two"),r(o(await t.read("/s.bin")),"chunk-one;chunk-two")}}];function E(a){let t=globalThis;t.describe("vfs conformance",()=>{for(let e of g)t.it(e.name,()=>e.run(a))})}export{g as conformanceCases,E as runConformance};
|
package/dist/index.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function f(t){let a=[];for(let o of t.split("/"))if(!(o===""||o===".")){if(o===".."){a.pop();continue}a.push(o)}return"/"+a.join("/")}function ht(...t){return f(t.join("/"))}function A(t){let a=f(t),o=a.lastIndexOf("/");return o<=0?"/":a.slice(0,o)}function C(t){let a=f(t);return a.slice(a.lastIndexOf("/")+1)}function R(t){return f(t).split("/").filter(Boolean)}var B=Symbol.for("vfskit.VfsError"),x=class extends Error{code;path;[B]=!0;constructor(a,o,i){super(o),this.name="VfsError",this.code=a,this.path=i}},b=t=>new x("NOT_FOUND",`not found: ${t}`,t),O=t=>new x("ALREADY_EXISTS",`already exists: ${t}`,t),U=t=>new x("NOT_A_DIRECTORY",`not a directory: ${t}`,t),E=t=>new x("IS_A_DIRECTORY",`is a directory: ${t}`,t),vt=t=>new x("PERMISSION_DENIED",`permission denied: ${t}`,t),V=t=>new x("UNSUPPORTED",`unsupported: ${t}`),W=t=>new x("CONFLICT",`version conflict: ${t}`,t),k=(t,a)=>new x("IO",t,a);function bt(t){return typeof t=="object"&&t!==null&&t[B]===!0}var Y=new TextEncoder,j=new TextDecoder;function S(t){return typeof t=="string"?Y.encode(t):t instanceof Uint8Array?t:new Uint8Array(t)}function xt(t){return j.decode(t)}function P(t){let a=0;for(let p of t)a+=p.length;let o=new Uint8Array(a),i=0;for(let p of t)o.set(p,i),i+=p.length;return o}async function Ot(t,a,o){if(t.readStream)return t.readStream(a,o);let i=await t.read(a,o);return new ReadableStream({start(p){p.enqueue(i),p.close()}})}async function Ut(t,a,o){if(t.writeStream)return t.writeStream(a,o);let i=[];return new WritableStream({write(p){i.push(p)},async close(){await t.write(a,P(i),o)}})}async function Et(t){let a=[],o=t.getReader();for(;;){let{done:i,value:p}=await o.read();if(i)break;p&&a.push(p)}return P(a)}var $={streaming:!1,watch:!0,atomicMove:!0,nativeMeta:!0,randomAccess:!1,conditionalWrite:!0};function G(){let t=()=>Date.now(),a=0,o=()=>String(++a),i=new Map([["/",{type:"dir",meta:{},mtime:t(),ctime:t()}]]),p=new Set,u=(y,n)=>n===y||n.startsWith(y==="/"?"/":y+"/"),m=(y,n)=>{for(let e of p)u(e.base,n)&&e.cb({type:y,path:n})},w=y=>{let n=i.get(y);if(!n)throw b(y);return n},l=y=>{let n=A(y),e=i.get(n);if(!e)throw b(n);if(e.type!=="dir")throw U(n)};return{capabilities:()=>$,async read(y){let n=f(y),e=w(n);if(e.type==="dir")throw E(n);return e.data.slice()},async write(y,n,e){let r=f(y);l(r);let s=i.get(r);if(s&&s.type==="dir")throw E(r);if(e?.ifAbsent&&s)throw O(r);if(e?.ifMatch!==void 0&&s?.version!==e.ifMatch)throw W(r);let c=s?s.ctime:t();i.set(r,{type:"file",data:S(n).slice(),meta:e?.meta?{...e.meta}:s?.meta??{},ctime:c,mtime:t(),version:o()}),m(s?"update":"create",r)},async list(y,n){let e=f(y);if(w(e).type!=="dir")throw U(e);let s=[];for(let[c,d]of i)c===e||!u(e,c)||!n?.recursive&&A(c)!==e||s.push({name:c.slice(c.lastIndexOf("/")+1),path:c,type:d.type});return s},async stat(y){let n=f(y),e=w(n);return{type:e.type,size:e.type==="file"?e.data.length:0,mtime:e.mtime,ctime:e.ctime,meta:{...e.meta},version:e.type==="file"?e.version:void 0}},async exists(y){return i.has(f(y))},async mkdir(y,n){let e=f(y);if(i.has(e)){if(n?.recursive)return;throw O(e)}if(n?.recursive){let r="";for(let s of e.split("/").filter(Boolean)){r+="/"+s;let c=i.get(r);if(c){if(c.type!=="dir")throw U(r);continue}i.set(r,{type:"dir",meta:{},mtime:t(),ctime:t()}),m("create",r)}return}l(e),i.set(e,{type:"dir",meta:{},mtime:t(),ctime:t()}),m("create",e)},async remove(y,n){let e=f(y);w(e);let r=[...i.keys()].filter(s=>s!==e&&u(e,s));if(r.length&&!n?.recursive)throw k("directory not empty",e);for(let s of[...r,e])i.delete(s),m("remove",s)},async move(y,n){let e=f(y),r=f(n);if(w(e),l(r),i.has(r))throw O(r);if(u(e,r))throw k("cannot move into itself",r);for(let s of[...i.keys()].filter(c=>c===e||u(e,c))){let c=i.get(s);i.delete(s),i.set(r+s.slice(e.length),c)}m("remove",e),m("create",r)},async copy(y,n){let e=f(y),r=f(n);if(w(e),l(r),i.has(r))throw O(r);for(let s of[...i.keys()].filter(c=>c===e||u(e,c))){let c=i.get(s);i.set(r+s.slice(e.length),c.type==="file"?{type:"file",data:c.data.slice(),meta:{...c.meta},mtime:c.mtime,ctime:c.ctime,version:o()}:{type:"dir",meta:{...c.meta},mtime:c.mtime,ctime:c.ctime})}m("create",r)},async getMeta(y){return{...w(f(y)).meta}},async setMeta(y,n){let e=w(f(y));e.meta={...n},e.mtime=t()},watch(y,n){let e={base:f(y),cb:n};return p.add(e),()=>{p.delete(e)}}}}var X=t=>t.values(),Q={streaming:!0,watch:!1,atomicMove:!1,nativeMeta:!1,randomAccess:!1,conditionalWrite:!1};function D(t,a){let o=a.name;throw o==="NotFoundError"?b(t):o==="TypeMismatchError"?U(t):o==="InvalidModificationError"?k("not empty",t):k(String(a?.message??a),t)}function Z(t){let a=t?Promise.resolve(t):navigator.storage.getDirectory(),o=n=>n==="/.vfskit"||n.startsWith("/.vfskit/"),i=async(n,e)=>{let r=await a;for(let s of n)r=await r.getDirectoryHandle(s,{create:e});return r},p=n=>i(R(A(n)),!1),u=async n=>{if(f(n)==="/")return"dir";let e=await p(n).catch(()=>null);if(!e)return null;let r=C(n);try{return await e.getFileHandle(r),"file"}catch{}try{return await e.getDirectoryHandle(r),"dir"}catch{return null}},m=async()=>{try{let e=await(await(await i([".vfskit"],!1)).getFileHandle("meta.json")).getFile();return JSON.parse(await e.text())}catch{return{}}},w=async n=>{let s=(await(await(await i([".vfskit"],!0)).getFileHandle("meta.json",{create:!0})).createWritable()).getWriter();await s.write(S(JSON.stringify(n))),await s.close()},l=async n=>{let e=await m();n(e)&&await w(e)},y=async(n,e)=>(await p(n)).getFileHandle(C(n),{create:e});return{capabilities:()=>Q,async read(n){let e=f(n);if(e==="/")throw E(e);try{return new Uint8Array(await(await(await y(e,!1)).getFile()).arrayBuffer())}catch(r){if(await u(e)==="dir")throw E(e);D(e,r)}},async write(n,e,r){let s=f(n);if(await u(s)==="dir")throw E(s);try{let d=(await(await y(s,!0)).createWritable()).getWriter();await d.write(S(e)),await d.close()}catch(c){D(A(s),c)}r?.meta&&await l(c=>(c[s]=r.meta,!0))},async list(n,e){let r=f(n),s=[],c=async d=>{let h=await i(R(d),!1);for await(let g of X(h)){let v=f(d+"/"+g.name);if(o(v))continue;let M=g.kind==="directory"?"dir":"file";s.push({name:g.name,path:v,type:M}),e?.recursive&&M==="dir"&&await c(v)}};try{await c(r)}catch(d){if(await u(r)==="file")throw U(r);D(r,d)}return s},async stat(n){let e=f(n),r=await u(e);if(r===null)throw b(e);let s=0;return r==="file"&&(s=(await(await y(e,!1)).getFile()).size),{type:r,size:s,mtime:0,ctime:0,meta:(await m())[e]??{}}},async exists(n){return await u(n)!==null},async mkdir(n,e){let r=f(n);if(await u(r)!==null){if(e?.recursive)return;throw O(r)}if(e?.recursive){let c="";for(let d of R(r)){c+="/"+d;let h=await u(c);if(h==="file")throw U(c);h===null&&await i(R(c),!0)}return}try{await(await p(r)).getDirectoryHandle(C(r),{create:!0})}catch(c){D(A(r),c)}},async remove(n,e){let r=f(n);if(await u(r)===null)throw b(r);let c=await p(r);try{await c.removeEntry(C(r),{recursive:!!e?.recursive})}catch(d){D(r,d)}await l(d=>{let h=!1;for(let g of Object.keys(d))(g===r||g.startsWith(r+"/"))&&(delete d[g],h=!0);return h})},async move(n,e){await this.copy(n,e),await this.remove(n,{recursive:!0})},async copy(n,e){let r=f(n),s=f(e);if(await u(r)===null)throw b(r);if(await u(s)!==null)throw O(s);if(s===r||s.startsWith(r+"/"))throw k("cannot copy into itself",s);if(await p(s).catch(()=>null)===null)throw b(A(s));let d=await m(),h=!1,g=async(v,M)=>{if(await u(v)==="file")await this.write(M,await this.read(v)),d[v]&&(d[M]=d[v],h=!0);else{await this.mkdir(M),d[v]&&(d[M]=d[v],h=!0);for(let L of await this.list(v))await g(L.path,M+"/"+L.name)}};await g(r,s),h&&await w(d)},async getMeta(n){let e=f(n);if(await u(e)===null)throw b(e);return(await m())[e]??{}},async setMeta(n,e){let r=f(n);if(await u(r)===null)throw b(r);await l(s=>(s[r]=e,!0))},async readStream(n){let e=f(n);try{return(await(await y(e,!1)).getFile()).stream()}catch(r){if(await u(e)==="dir")throw E(e);D(e,r)}},async writeStream(n){let e=f(n);if(await u(e)==="dir")throw E(e);try{return await(await y(e,!0)).createWritable()}catch(r){D(A(e),r)}},watch(){return()=>{}}}}var tt={streaming:!1,watch:!1,atomicMove:!1,nativeMeta:!0,randomAccess:!1,conditionalWrite:!0};function et(t){let a="";for(let o=0;o<t.length;o+=32768)a+=String.fromCharCode(...t.subarray(o,o+32768));return btoa(a)}function K(t){let a=atob(t),o=new Uint8Array(a.length);for(let i=0;i<a.length;i++)o[i]=a.charCodeAt(i);return o}function rt(){let t=new Map;return{async get(a){return t.get(a)},async set(a,o){t.set(a,o)},async delete(a){t.delete(a)},async list(a){return[...t.keys()].filter(o=>o.startsWith(a))}}}function nt(t=globalThis.localStorage){return{async get(a){return t.getItem(a)},async set(a,o){t.setItem(a,o)},async delete(a){t.removeItem(a)},async list(a){let o=[];for(let i=0;i<t.length;i++){let p=t.key(i);p&&p.startsWith(a)&&o.push(p)}return o}}}function at(t){let a=t.store,o=(t.prefix?t.prefix+":":"")+"vfs:",i=r=>o+f(r),p=r=>r.slice(o.length),u=(r,s)=>s===r||s.startsWith(r==="/"?"/":r+"/"),m=async r=>{let s=await a.get(i(r));return s?JSON.parse(s):void 0},w=(r,s)=>a.set(i(r),JSON.stringify(s)),l=async r=>{let s=await m(r);if(!s)throw b(r);return s},y=async r=>(await a.list(i(r)===o+"/"?o+"/":i(r)+"/")).map(p).filter(s=>s!==r&&u(r,s)),n=async r=>{let s=A(r),c=await m(s);if(!c)throw b(s);if(c.t!=="dir")throw U(s)},e=(async()=>{await a.get(i("/"))||await w("/",{t:"dir",m:{},v:0})})();return{capabilities:()=>tt,async read(r){await e;let s=f(r),c=await l(s);if(c.t==="dir")throw E(s);return K(c.d??"")},async write(r,s,c){await e;let d=f(r);await n(d);let h=await m(d);if(h?.t==="dir")throw E(d);if(c?.ifAbsent&&h)throw O(d);if(c?.ifMatch!==void 0&&String(h?.v??"")!==c.ifMatch)throw W(d);await w(d,{t:"file",d:et(S(s)),m:c?.meta??h?.m??{},v:(h?.v??0)+1})},async list(r,s){await e;let c=f(r);if((await l(c)).t!=="dir")throw U(c);let h=[];for(let g of await y(c)){if(!s?.recursive&&A(g)!==c)continue;let v=await m(g);v&&h.push({name:g.slice(g.lastIndexOf("/")+1),path:g,type:v.t})}return h},async stat(r){await e;let s=f(r),c=await l(s);return{type:c.t,size:c.t==="file"?K(c.d??"").length:0,mtime:0,ctime:0,meta:{...c.m},version:c.t==="file"?String(c.v):void 0}},async exists(r){return await e,!!await m(f(r))},async mkdir(r,s){await e;let c=f(r);if(await m(c)){if(s?.recursive)return;throw O(c)}if(s?.recursive){let h="";for(let g of c.split("/").filter(Boolean)){h+="/"+g;let v=await m(h);if(v?.t==="file")throw U(h);v||await w(h,{t:"dir",m:{},v:0})}return}await n(c),await w(c,{t:"dir",m:{},v:0})},async remove(r,s){await e;let c=f(r);await l(c);let d=await y(c);if(d.length&&!s?.recursive)throw k("directory not empty",c);for(let h of[...d,c])await a.delete(i(h))},async move(r,s){await this.copy(r,s),await this.remove(r,{recursive:!0})},async copy(r,s){await e;let c=f(r),d=f(s);if(await l(c),await n(d),await m(d))throw O(d);if(u(c,d))throw k("cannot copy into itself",d);for(let h of[c,...await y(c)]){let g=await m(h);g&&await w(d+h.slice(c.length),{...g,v:(g.v??0)+1})}},async getMeta(r){return await e,{...(await l(f(r))).m}},async setMeta(r,s){await e;let c=f(r),d=await l(c);await w(c,{...d,m:{...s}})},watch(){return()=>{}}}}var N=new Uint8Array([86,75,1]),H=47,F=globalThis.crypto.subtle;function _(t){let a=new Uint8Array(t);return globalThis.crypto.getRandomValues(a),a}async function it(t,a){let o=await F.importKey("raw",new TextEncoder().encode(t),"PBKDF2",!1,["deriveKey"]);return F.deriveKey({name:"PBKDF2",salt:a.slice(),iterations:21e4,hash:"SHA-256"},o,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function st(t,a){if(!a.key&&!a.passphrase)throw new Error("encrypt: key or passphrase required");let o=a.key?F.importKey("raw",a.key.slice(),"AES-GCM",!1,["encrypt","decrypt"]):null,i=u=>o??it(a.passphrase,u),p={...t.capabilities(),streaming:!1,randomAccess:!1};return{...t,readStream:void 0,writeStream:void 0,capabilities:()=>p,async stat(u){let m=await t.stat(u);return m.type==="file"?{...m,size:Math.max(0,m.size-H)}:m},async write(u,m,w){let l=_(16),y=_(12),n=await i(l),e=new Uint8Array(await F.encrypt({name:"AES-GCM",iv:y},n,S(m).slice()));await t.write(u,P([N,l,y,e]),w)},async read(u,m){let w=await t.read(u,m);if(w.length<H||w[0]!==N[0]||w[1]!==N[1]||w[2]!==N[2])throw k("invalid ciphertext",u);let l=await i(w.slice(3,19)),y;try{y=await F.decrypt({name:"AES-GCM",iv:w.slice(19,31)},l,w.slice(31))}catch{throw k("decryption failed",u)}return new Uint8Array(y)}}}function ot(t,a={}){let o=a.store??new Map,i=a.ttlMs??0,p=()=>i?Date.now():0,u=()=>i?Date.now()+i:1/0,m=(l,y)=>y===l||y.startsWith(l==="/"?"/":l+"/"),w=l=>{for(let y of[...o.keys()])m(l,y)&&o.delete(y)};return{...t,readStream:void 0,writeStream:void 0,async read(l,y){let n=f(l),e=o.get(n);if(e&&e.exp>p())return e.data.slice();let r=await t.read(n,y);return o.set(n,{data:r.slice(),exp:u()}),r.slice()},async write(l,y,n){let e=f(l),r=S(y).slice();await t.write(e,r,n),o.set(e,{data:r,exp:u()})},async remove(l,y){let n=f(l);await t.remove(n,y),w(n)},async move(l,y){let n=f(l),e=f(y);await t.move(n,e),w(n),w(e)},async copy(l,y){let n=f(l),e=f(y);await t.copy(n,e),w(e)}}}var ct=new TextEncoder,yt=new TextDecoder,T=new Uint8Array(0);function pt(t,a=T){let o=ct.encode(JSON.stringify(t)),i=new Uint8Array(4+o.length+a.length);return new DataView(i.buffer).setUint32(0,o.length),i.set(o,4),i.set(a,4+o.length),i}function ut(t){let o=new DataView(t.buffer,t.byteOffset,t.byteLength).getUint32(0);return{header:JSON.parse(yt.decode(t.subarray(4,4+o))),data:t.subarray(4+o)}}function z(t,a,o=[],i){return pt({m:t,p:a,a:o},i)}function q(t){let{header:a,data:o}=ut(t);return a.ok?{ok:!0,value:a.v,data:o}:{ok:!1,data:T,code:a.c,message:a.e,path:a.p}}function I(t,a,o=T){let i=new Uint8Array(5+o.length);return i[0]=t,new DataView(i.buffer).setUint32(1,a),i.set(o,5),i}function J(t){let a=new DataView(t.buffer,t.byteOffset,t.byteLength);return{type:t[0],id:a.getUint32(1),payload:t.subarray(5)}}function ft(t){let a=t.request?t:t.transport,o=t.capabilities??{streaming:!1,watch:!!a.watch,atomicMove:!1,nativeMeta:!0,randomAccess:!1,conditionalWrite:!0},i=async(p,u,m,w)=>{let l=m?[...m]:[];for(;l.length&&l[l.length-1]===void 0;)l.pop();let y=q(await a.request(z(p,u,l,w)));if(!y.ok)throw new x(y.code,y.message??"",y.path);return y};return{capabilities:()=>o,async read(p,u){return(await i("read",p,[u])).data},async write(p,u,m){await i("write",p,[m],S(u))},async list(p,u){return(await i("list",p,[u])).value},async stat(p){return(await i("stat",p)).value},async exists(p){return(await i("exists",p)).value},async mkdir(p,u){await i("mkdir",p,[u])},async remove(p,u){await i("remove",p,[u])},async move(p,u){await i("move",p,[u])},async copy(p,u){await i("copy",p,[u])},async getMeta(p){return(await i("getMeta",p)).value},async setMeta(p,u){await i("setMeta",p,[u])},watch(p,u){if(!a.watch)throw V("watch");return a.watch(p,u)}}}function lt(t,a){let o=a??((i,p)=>fetch(i,p));return{async request(i){let p=await o(t,{method:"POST",body:i});return new Uint8Array(await p.arrayBuffer())}}}var dt=new TextEncoder,wt=new TextDecoder;function mt(t,a){let o=a?a():new WebSocket(t);try{o.binaryType="arraybuffer"}catch{}let i=new Map,p=new Map,u=0,m=o.readyState===1?Promise.resolve():new Promise(w=>{o.addEventListener?o.addEventListener("open",()=>w()):o.onopen=()=>w()});return o.onmessage=w=>{let{type:l,id:y,payload:n}=J(new Uint8Array(w.data));l===1?(i.get(y)?.(n),i.delete(y)):l===4&&p.get(y)?.(JSON.parse(wt.decode(n)))},{async request(w){await m;let l=++u;return new Promise(y=>{i.set(l,y),o.send(I(0,l,w))})},watch(w,l){let y=++u;return p.set(y,l),m.then(()=>o.send(I(2,y,dt.encode(JSON.stringify({path:w}))))),()=>{p.delete(y),m.then(()=>o.send(I(3,y,T)))}}}}export{B as BRAND,x as VfsError,O as alreadyExists,C as basename,ot as cache,Et as collect,P as concat,W as conflict,A as dirname,st as encrypt,lt as httpTransport,k as io,E as isADirectory,bt as isVfsError,ht as join,at as kv,nt as localStorageKv,rt as memKv,G as memory,f as normalize,U as notADirectory,b as notFound,Z as opfs,vt as permissionDenied,Ot as readStream,ft as remote,R as segments,S as toBytes,xt as toText,V as unsupported,Ut as writeStream,mt as wsTransport};
|
|
1
|
+
function u(e){let a=[];for(let o of e.split("/"))if(!(o===""||o===".")){if(o===".."){a.pop();continue}a.push(o)}return"/"+a.join("/")}function gt(...e){return u(e.join("/"))}function b(e){let a=u(e),o=a.lastIndexOf("/");return o<=0?"/":a.slice(0,o)}function R(e){let a=u(e);return a.slice(a.lastIndexOf("/")+1)}function P(e){return u(e).split("/").filter(Boolean)}var K=Symbol.for("vfskit.VfsError"),x=class extends Error{code;path;[K]=!0;constructor(a,o,s){super(o),this.name="VfsError",this.code=a,this.path=s}},k=e=>new x("NOT_FOUND",`not found: ${e}`,e),U=e=>new x("ALREADY_EXISTS",`already exists: ${e}`,e),S=e=>new x("NOT_A_DIRECTORY",`not a directory: ${e}`,e),E=e=>new x("IS_A_DIRECTORY",`is a directory: ${e}`,e),bt=e=>new x("PERMISSION_DENIED",`permission denied: ${e}`,e),L=e=>new x("UNSUPPORTED",`unsupported: ${e}`),N=e=>new x("CONFLICT",`version conflict: ${e}`,e),v=(e,a)=>new x("IO",e,a);function kt(e){return typeof e=="object"&&e!==null&&e[K]===!0}var j=new TextEncoder,$=new TextDecoder;function A(e){return typeof e=="string"?j.encode(e):e instanceof Uint8Array?e:new Uint8Array(e)}function St(e){return $.decode(e)}function F(e){let a=0;for(let p of e)a+=p.length;let o=new Uint8Array(a),s=0;for(let p of e)o.set(p,s),s+=p.length;return o}async function Ut(e,a,o){if(e.readStream)return e.readStream(a,o);let s=await e.read(a,o);return new ReadableStream({start(p){p.enqueue(s),p.close()}})}async function Et(e,a,o){if(e.writeStream)return e.writeStream(a,o);let s=[];return new WritableStream({write(p){s.push(p)},async close(){await e.write(a,F(s),o)}})}async function Mt(e){let a=[],o=e.getReader();for(;;){let{done:s,value:p}=await o.read();if(s)break;p&&a.push(p)}return F(a)}var G={streaming:!1,watch:!0,atomicMove:!0,nativeMeta:!0,randomAccess:!1,conditionalWrite:!0};function X(){let e=()=>Date.now(),a=0,o=()=>String(++a),s=new Map([["/",{type:"dir",meta:{},mtime:e(),ctime:e()}]]),p=new Set,f=(y,n)=>n===y||n.startsWith(y==="/"?"/":y+"/"),m=(y,n)=>{for(let t of p)f(t.base,n)&&t.cb({type:y,path:n})},w=y=>{let n=s.get(y);if(!n)throw k(y);return n},d=y=>{let n=b(y),t=s.get(n);if(!t)throw k(n);if(t.type!=="dir")throw S(n)};return{capabilities:()=>G,async read(y){let n=u(y),t=w(n);if(t.type==="dir")throw E(n);return t.data.slice()},async write(y,n,t){let r=u(y);d(r);let i=s.get(r);if(i&&i.type==="dir")throw E(r);if(t?.ifAbsent&&i)throw U(r);if(t?.ifMatch!==void 0&&i?.version!==t.ifMatch)throw N(r);let c=i?i.ctime:e();s.set(r,{type:"file",data:A(n).slice(),meta:t?.meta?{...t.meta}:i?.meta??{},ctime:c,mtime:e(),version:o()}),m(i?"update":"create",r)},async list(y,n){let t=u(y);if(w(t).type!=="dir")throw S(t);let i=[];for(let[c,l]of s)c===t||!f(t,c)||!n?.recursive&&b(c)!==t||i.push({name:c.slice(c.lastIndexOf("/")+1),path:c,type:l.type});return i},async stat(y){let n=u(y),t=w(n);return{type:t.type,size:t.type==="file"?t.data.length:0,mtime:t.mtime,ctime:t.ctime,meta:{...t.meta},version:t.type==="file"?t.version:void 0}},async exists(y){return s.has(u(y))},async mkdir(y,n){let t=u(y),r=s.get(t);if(r){if(n?.recursive&&r.type==="dir")return;throw U(t)}if(n?.recursive){let i="";for(let c of t.split("/").filter(Boolean)){i+="/"+c;let l=s.get(i);if(l){if(l.type!=="dir")throw S(i);continue}s.set(i,{type:"dir",meta:{},mtime:e(),ctime:e()}),m("create",i)}return}d(t),s.set(t,{type:"dir",meta:{},mtime:e(),ctime:e()}),m("create",t)},async remove(y,n){let t=u(y);if(t==="/")throw v("cannot remove root",t);w(t);let r=[...s.keys()].filter(i=>i!==t&&f(t,i));if(r.length&&!n?.recursive)throw v("directory not empty",t);for(let i of[...r,t])s.delete(i),m("remove",i)},async move(y,n){let t=u(y),r=u(n);if(w(t),d(r),s.has(r))throw U(r);if(f(t,r))throw v("cannot move into itself",r);for(let i of[...s.keys()].filter(c=>c===t||f(t,c))){let c=s.get(i);s.delete(i),c.type==="file"&&(c.version=o()),s.set(r+i.slice(t.length),c)}m("remove",t),m("create",r)},async copy(y,n){let t=u(y),r=u(n);if(w(t),d(r),s.has(r))throw U(r);if(f(t,r))throw v("cannot copy into itself",r);for(let i of[...s.keys()].filter(c=>c===t||f(t,c))){let c=s.get(i);s.set(r+i.slice(t.length),c.type==="file"?{type:"file",data:c.data.slice(),meta:{...c.meta},mtime:c.mtime,ctime:c.ctime,version:o()}:{type:"dir",meta:{...c.meta},mtime:c.mtime,ctime:c.ctime})}m("create",r)},async getMeta(y){return{...w(u(y)).meta}},async setMeta(y,n){let t=w(u(y));t.meta={...n},t.mtime=e(),t.type==="file"&&(t.version=o())},watch(y,n){let t={base:u(y),cb:n};return p.add(t),()=>{p.delete(t)}}}}var Q=e=>e.values(),Z={streaming:!0,watch:!1,atomicMove:!1,nativeMeta:!1,randomAccess:!1,conditionalWrite:!1};function D(e,a){let o=a.name;throw o==="NotFoundError"?k(e):o==="TypeMismatchError"?S(e):o==="InvalidModificationError"?v("not empty",e):v(String(a?.message??a),e)}function tt(e){let a=e?Promise.resolve(e):navigator.storage.getDirectory(),o=n=>n==="/.vfskit"||n.startsWith("/.vfskit/"),s=async(n,t)=>{let r=await a;for(let i of n)r=await r.getDirectoryHandle(i,{create:t});return r},p=n=>s(P(b(n)),!1),f=async n=>{if(u(n)==="/")return"dir";let t=await p(n).catch(()=>null);if(!t)return null;let r=R(n);try{return await t.getFileHandle(r),"file"}catch{}try{return await t.getDirectoryHandle(r),"dir"}catch{return null}},m=async()=>{try{let t=await(await(await s([".vfskit"],!1)).getFileHandle("meta.json")).getFile();return JSON.parse(await t.text())}catch{return{}}},w=async n=>{let i=(await(await(await s([".vfskit"],!0)).getFileHandle("meta.json",{create:!0})).createWritable()).getWriter();await i.write(A(JSON.stringify(n))),await i.close()},d=async n=>{let t=await m();n(t)&&await w(t)},y=async(n,t)=>(await p(n)).getFileHandle(R(n),{create:t});return{capabilities:()=>Z,async read(n){let t=u(n);if(t==="/")throw E(t);try{return new Uint8Array(await(await(await y(t,!1)).getFile()).arrayBuffer())}catch(r){if(await f(t)==="dir")throw E(t);D(t,r)}},async write(n,t,r){let i=u(n);if(await f(i)==="dir")throw E(i);try{let l=(await(await y(i,!0)).createWritable()).getWriter();await l.write(A(t)),await l.close()}catch(c){D(b(i),c)}r?.meta&&await d(c=>(c[i]=r.meta,!0))},async list(n,t){let r=u(n),i=[],c=async l=>{let h=await s(P(l),!1);for await(let g of Q(h)){let O=u(l+"/"+g.name);if(o(O))continue;let M=g.kind==="directory"?"dir":"file";i.push({name:g.name,path:O,type:M}),t?.recursive&&M==="dir"&&await c(O)}};try{await c(r)}catch(l){if(await f(r)==="file")throw S(r);D(r,l)}return i},async stat(n){let t=u(n),r=await f(t);if(r===null)throw k(t);let i=0;return r==="file"&&(i=(await(await y(t,!1)).getFile()).size),{type:r,size:i,mtime:0,ctime:0,meta:(await m())[t]??{}}},async exists(n){return await f(n)!==null},async mkdir(n,t){let r=u(n),i=await f(r);if(i!==null){if(t?.recursive&&i==="dir")return;throw U(r)}if(t?.recursive){let c="";for(let l of P(r)){c+="/"+l;let h=await f(c);if(h==="file")throw S(c);h===null&&await s(P(c),!0)}return}try{await(await p(r)).getDirectoryHandle(R(r),{create:!0})}catch(c){D(b(r),c)}},async remove(n,t){let r=u(n);if(r==="/")throw v("cannot remove root",r);if(await f(r)===null)throw k(r);let c=await p(r);try{await c.removeEntry(R(r),{recursive:!!t?.recursive})}catch(l){D(r,l)}await d(l=>{let h=!1;for(let g of Object.keys(l))(g===r||g.startsWith(r+"/"))&&(delete l[g],h=!0);return h})},async move(n,t){await this.copy(n,t),await this.remove(n,{recursive:!0})},async copy(n,t){let r=u(n),i=u(t);if(await f(r)===null)throw k(r);if(await f(i)!==null)throw U(i);if(i===r||i.startsWith(r+"/"))throw v("cannot copy into itself",i);let l=await f(b(i));if(l===null)throw k(b(i));if(l!=="dir")throw S(b(i));let h=await m(),g=!1,O=async(M,C)=>{if(await f(M)==="file")await this.write(C,await this.read(M)),h[M]&&(h[C]=h[M],g=!0);else{await this.mkdir(C),h[M]&&(h[C]=h[M],g=!0);for(let B of await this.list(M))await O(B.path,C+"/"+B.name)}};await O(r,i),g&&await w(h)},async getMeta(n){let t=u(n);if(await f(t)===null)throw k(t);return(await m())[t]??{}},async setMeta(n,t){let r=u(n);if(await f(r)===null)throw k(r);await d(i=>(i[r]=t,!0))},async readStream(n){let t=u(n);try{return(await(await y(t,!1)).getFile()).stream()}catch(r){if(await f(t)==="dir")throw E(t);D(t,r)}},async writeStream(n){let t=u(n);if(await f(t)==="dir")throw E(t);try{return await(await y(t,!0)).createWritable()}catch(r){D(b(t),r)}},watch(){return()=>{}}}}var et={streaming:!1,watch:!1,atomicMove:!1,nativeMeta:!0,randomAccess:!1,conditionalWrite:!0};function rt(e){let a="";for(let o=0;o<e.length;o+=32768)a+=String.fromCharCode(...e.subarray(o,o+32768));return btoa(a)}function H(e){let a=atob(e),o=new Uint8Array(a.length);for(let s=0;s<a.length;s++)o[s]=a.charCodeAt(s);return o}function nt(){let e=new Map;return{async get(a){return e.get(a)},async set(a,o){e.set(a,o)},async delete(a){e.delete(a)},async list(a){return[...e.keys()].filter(o=>o.startsWith(a))}}}function at(e=globalThis.localStorage){return{async get(a){return e.getItem(a)},async set(a,o){e.setItem(a,o)},async delete(a){e.removeItem(a)},async list(a){let o=[];for(let s=0;s<e.length;s++){let p=e.key(s);p&&p.startsWith(a)&&o.push(p)}return o}}}function it(e){let a=e.store,o=(e.prefix?e.prefix+":":"")+"vfs:",s=r=>o+u(r),p=r=>r.slice(o.length),f=(r,i)=>i===r||i.startsWith(r==="/"?"/":r+"/"),m=async r=>{let i=await a.get(s(r));return i?JSON.parse(i):void 0},w=(r,i)=>a.set(s(r),JSON.stringify(i)),d=async r=>{let i=await m(r);if(!i)throw k(r);return i},y=async r=>(await a.list(s(r)===o+"/"?o+"/":s(r)+"/")).map(p).filter(i=>i!==r&&f(r,i)),n=async r=>{let i=b(r),c=await m(i);if(!c)throw k(i);if(c.t!=="dir")throw S(i)},t=(async()=>{await a.get(s("/"))||await w("/",{t:"dir",m:{},v:0})})();return{capabilities:()=>et,async read(r){await t;let i=u(r),c=await d(i);if(c.t==="dir")throw E(i);return H(c.d??"")},async write(r,i,c){await t;let l=u(r);await n(l);let h=await m(l);if(h?.t==="dir")throw E(l);if(c?.ifAbsent&&h)throw U(l);if(c?.ifMatch!==void 0&&(h?String(h.v):void 0)!==c.ifMatch)throw N(l);await w(l,{t:"file",d:rt(A(i)),m:c?.meta??h?.m??{},v:(h?.v??0)+1})},async list(r,i){await t;let c=u(r);if((await d(c)).t!=="dir")throw S(c);let h=[];for(let g of await y(c)){if(!i?.recursive&&b(g)!==c)continue;let O=await m(g);O&&h.push({name:g.slice(g.lastIndexOf("/")+1),path:g,type:O.t})}return h},async stat(r){await t;let i=u(r),c=await d(i);return{type:c.t,size:c.t==="file"?H(c.d??"").length:0,mtime:0,ctime:0,meta:{...c.m},version:c.t==="file"?String(c.v):void 0}},async exists(r){return await t,!!await m(u(r))},async mkdir(r,i){await t;let c=u(r),l=await m(c);if(l){if(i?.recursive&&l.t==="dir")return;throw U(c)}if(i?.recursive){let h="";for(let g of c.split("/").filter(Boolean)){h+="/"+g;let O=await m(h);if(O?.t==="file")throw S(h);O||await w(h,{t:"dir",m:{},v:0})}return}await n(c),await w(c,{t:"dir",m:{},v:0})},async remove(r,i){await t;let c=u(r);if(c==="/")throw v("cannot remove root",c);await d(c);let l=await y(c);if(l.length&&!i?.recursive)throw v("directory not empty",c);for(let h of[...l,c])await a.delete(s(h))},async move(r,i){await this.copy(r,i),await this.remove(r,{recursive:!0})},async copy(r,i){await t;let c=u(r),l=u(i);if(await d(c),await n(l),await m(l))throw U(l);if(f(c,l))throw v("cannot copy into itself",l);for(let h of[c,...await y(c)]){let g=await m(h);g&&await w(l+h.slice(c.length),{...g,v:(g.v??0)+1})}},async getMeta(r){return await t,{...(await d(u(r))).m}},async setMeta(r,i){await t;let c=u(r),l=await d(c);await w(c,{...l,m:{...i},v:l.t==="file"?(l.v??0)+1:l.v})},watch(){return()=>{}}}}var I=new Uint8Array([86,75,1]),_=47,T=globalThis.crypto.subtle;function z(e){let a=new Uint8Array(e);return globalThis.crypto.getRandomValues(a),a}async function st(e,a){let o=await T.importKey("raw",new TextEncoder().encode(e),"PBKDF2",!1,["deriveKey"]);return T.deriveKey({name:"PBKDF2",salt:a.slice(),iterations:21e4,hash:"SHA-256"},o,{name:"AES-GCM",length:256},!1,["encrypt","decrypt"])}function ot(e,a){if(!a.key&&!a.passphrase)throw new Error("encrypt: key or passphrase required");let o=a.key?T.importKey("raw",a.key.slice(),"AES-GCM",!1,["encrypt","decrypt"]):null,s=f=>o??st(a.passphrase,f),p={...e.capabilities(),streaming:!1,randomAccess:!1};return{...e,readStream:void 0,writeStream:void 0,capabilities:()=>p,async stat(f){let m=await e.stat(f);return m.type==="file"?{...m,size:Math.max(0,m.size-_)}:m},async write(f,m,w){let d=z(16),y=z(12),n=await s(d),t=new Uint8Array(await T.encrypt({name:"AES-GCM",iv:y},n,A(m).slice()));await e.write(f,F([I,d,y,t]),w)},async read(f,m){let w=await e.read(f,m);if(w.length<_||w[0]!==I[0]||w[1]!==I[1]||w[2]!==I[2])throw v("invalid ciphertext",f);let d=await s(w.slice(3,19)),y;try{y=await T.decrypt({name:"AES-GCM",iv:w.slice(19,31)},d,w.slice(31))}catch{throw v("decryption failed",f)}return new Uint8Array(y)}}}function ct(e,a={}){let o=a.store??new Map,s=a.ttlMs??0,p=()=>s?Date.now():0,f=()=>s?Date.now()+s:1/0,m=(d,y)=>y===d||y.startsWith(d==="/"?"/":d+"/"),w=d=>{for(let y of[...o.keys()])m(d,y)&&o.delete(y)};return{...e,readStream:void 0,writeStream:void 0,async read(d,y){let n=u(d),t=o.get(n);if(t&&t.exp>p())return t.data.slice();let r=await e.read(n,y);return o.set(n,{data:r.slice(),exp:f()}),r.slice()},async write(d,y,n){let t=u(d),r=A(y).slice();await e.write(t,r,n),o.set(t,{data:r,exp:f()})},async remove(d,y){let n=u(d);await e.remove(n,y),w(n)},async move(d,y){let n=u(d),t=u(y);await e.move(n,t),w(n),w(t)},async copy(d,y){let n=u(d),t=u(y);await e.copy(n,t),w(t)}}}var yt=new TextEncoder,pt=new TextDecoder,W=new Uint8Array(0);function ft(e,a=W){let o=yt.encode(JSON.stringify(e)),s=new Uint8Array(4+o.length+a.length);return new DataView(s.buffer).setUint32(0,o.length),s.set(o,4),s.set(a,4+o.length),s}function ut(e){let o=new DataView(e.buffer,e.byteOffset,e.byteLength).getUint32(0);return{header:JSON.parse(pt.decode(e.subarray(4,4+o))),data:e.subarray(4+o)}}function q(e,a,o=[],s){return ft({m:e,p:a,a:o},s)}function J(e){let{header:a,data:o}=ut(e);return a.ok?{ok:!0,value:a.v,data:o}:{ok:!1,data:W,code:a.c,message:a.e,path:a.p}}function V(e,a,o=W){let s=new Uint8Array(5+o.length);return s[0]=e,new DataView(s.buffer).setUint32(1,a),s.set(o,5),s}function Y(e){let a=new DataView(e.buffer,e.byteOffset,e.byteLength);return{type:e[0],id:a.getUint32(1),payload:e.subarray(5)}}function dt(e){let a=e.request?e:e.transport,o=e.capabilities??{streaming:!1,watch:!!a.watch,atomicMove:!1,nativeMeta:!0,randomAccess:!1,conditionalWrite:!0},s=async(p,f,m,w)=>{let d=m?[...m]:[];for(;d.length&&d[d.length-1]===void 0;)d.pop();let y=J(await a.request(q(p,f,d,w)));if(!y.ok)throw new x(y.code,y.message??"",y.path);return y};return{capabilities:()=>o,async read(p,f){return(await s("read",p,[f])).data},async write(p,f,m){await s("write",p,[m],A(f))},async list(p,f){return(await s("list",p,[f])).value},async stat(p){return(await s("stat",p)).value},async exists(p){return(await s("exists",p)).value},async mkdir(p,f){await s("mkdir",p,[f])},async remove(p,f){await s("remove",p,[f])},async move(p,f){await s("move",p,[f])},async copy(p,f){await s("copy",p,[f])},async getMeta(p){return(await s("getMeta",p)).value},async setMeta(p,f){await s("setMeta",p,[f])},watch(p,f){if(!a.watch)throw L("watch");return a.watch(p,f)}}}function lt(e,a){let o=a??((s,p)=>fetch(s,p));return{async request(s){let p=await o(e,{method:"POST",body:s});return new Uint8Array(await p.arrayBuffer())}}}var wt=new TextEncoder,mt=new TextDecoder;function ht(e,a){let o=a?a():new WebSocket(e);try{o.binaryType="arraybuffer"}catch{}let s=new Map,p=new Map,f=0,m=o.readyState===1?Promise.resolve():new Promise(w=>{o.addEventListener?o.addEventListener("open",()=>w()):o.onopen=()=>w()});return o.onmessage=w=>{let{type:d,id:y,payload:n}=Y(new Uint8Array(w.data));d===1?(s.get(y)?.(n),s.delete(y)):d===4&&p.get(y)?.(JSON.parse(mt.decode(n)))},{async request(w){await m;let d=++f;return new Promise(y=>{s.set(d,y),o.send(V(0,d,w))})},watch(w,d){let y=++f;return p.set(y,d),m.then(()=>o.send(V(2,y,wt.encode(JSON.stringify({path:w}))))),()=>{p.delete(y),m.then(()=>o.send(V(3,y,W)))}}}}export{K as BRAND,x as VfsError,U as alreadyExists,R as basename,ct as cache,Mt as collect,F as concat,N as conflict,b as dirname,ot as encrypt,lt as httpTransport,v as io,E as isADirectory,kt as isVfsError,gt as join,it as kv,at as localStorageKv,nt as memKv,X as memory,u as normalize,S as notADirectory,k as notFound,tt as opfs,bt as permissionDenied,Ut as readStream,dt as remote,P as segments,A as toBytes,St as toText,L as unsupported,Et as writeStream,ht as wsTransport};
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@artemjs/vfskit-front",
|
|
3
|
-
"version": "1.2.
|
|
3
|
+
"version": "1.2.1",
|
|
4
4
|
"description": "Universal VFS abstraction for the browser - in-memory + encryption + a remote client that drives any vfskit backend. Frontend kit, served via jsDelivr.",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"vfs",
|