@tensorix/metahub 0.2.0 → 0.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/dist/cli.js +18447 -16164
- package/dist/cli.js.map +43 -34
- package/dist/core/blobs.d.ts +10 -0
- package/dist/core/blobs.d.ts.map +1 -1
- package/dist/core/cache.d.ts +5 -0
- package/dist/core/cache.d.ts.map +1 -1
- package/dist/core/config.d.ts +4 -0
- package/dist/core/config.d.ts.map +1 -1
- package/dist/core/crdt.d.ts +7 -0
- package/dist/core/crdt.d.ts.map +1 -1
- package/dist/core/schema-init.d.ts +29 -0
- package/dist/core/schema-init.d.ts.map +1 -1
- package/dist/core/schema.d.ts +1 -1
- package/dist/core/schema.d.ts.map +1 -1
- package/dist/core/shares.d.ts +60 -0
- package/dist/core/shares.d.ts.map +1 -0
- package/dist/core/sites-core.d.ts.map +1 -1
- package/dist/core/sites.d.ts.map +1 -1
- package/dist/core/sync/auth.d.ts +15 -2
- package/dist/core/sync/auth.d.ts.map +1 -1
- package/dist/core/sync/blob-routes.d.ts.map +1 -1
- package/dist/core/sync/client.d.ts +5 -0
- package/dist/core/sync/client.d.ts.map +1 -1
- package/dist/core/sync/e2ee.d.ts +7 -0
- package/dist/core/sync/e2ee.d.ts.map +1 -1
- package/dist/core/sync/peers.d.ts +1 -2
- package/dist/core/sync/peers.d.ts.map +1 -1
- package/dist/core/sync/server.d.ts.map +1 -1
- package/dist/core/sync/share-actions.d.ts +69 -0
- package/dist/core/sync/share-actions.d.ts.map +1 -0
- package/dist/core/sync/share-export.d.ts +72 -0
- package/dist/core/sync/share-export.d.ts.map +1 -0
- package/dist/core/sync/share-render.d.ts +10 -0
- package/dist/core/sync/share-render.d.ts.map +1 -0
- package/dist/core/sync/share-serve.d.ts +3 -0
- package/dist/core/sync/share-serve.d.ts.map +1 -0
- package/dist/core/sync/storage-s3-bun.d.ts +9 -0
- package/dist/core/sync/storage-s3-bun.d.ts.map +1 -1
- package/dist/core/sync/storage-url.d.ts +18 -0
- package/dist/core/sync/storage-url.d.ts.map +1 -0
- package/dist/db-worker.js +92 -62
- package/dist/index.js +19584 -17607
- package/dist/index.js.map +36 -29
- package/dist/sw.js +1 -1
- package/dist/webui/server/assets.d.ts.map +1 -1
- package/dist/webui/server/routes.d.ts.map +1 -1
- package/dist/webui/server/share-routes.d.ts +3 -0
- package/dist/webui/server/share-routes.d.ts.map +1 -0
- package/dist/webui.js +84 -58
- package/package.json +2 -1
package/dist/sw.js
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
function H(J,Y,Z,z){let Q=Z.get("id"),$=Z.get("db"),G=z??{},D=(V)=>V!=null?Number(V):void 0;switch(`${J} ${Y}`){case"GET /api/databases":return{op:"listDatabases",args:[]};case"POST /api/databases":return{op:"createDatabase",args:[G]};case"PATCH /api/database":return Q?{op:"updateDatabase",args:[Q,G]}:null;case"POST /api/database/duplicate":return Q?{op:"duplicateDatabase",args:[Q,G]}:null;case"DELETE /api/database":return Q?{op:"deleteDatabase",args:[Q]}:null;case"GET /api/database/activity":return $?{op:"listDatabaseActivity",args:[$,D(Z.get("limit"))]}:null;case"GET /api/properties":return $?{op:"listProperties",args:[$]}:null;case"POST /api/properties":{let{db:V,...X}=G;return V?{op:"addProperty",args:[V,X]}:null}case"PATCH /api/property":return Q?{op:"updateProperty",args:[Q,G]}:null;case"PATCH /api/property/width":return Q?{op:"setPropertyWidth",args:[Q,G.width]}:null;case"DELETE /api/property":return Q?{op:"removeProperty",args:[Q]}:null;case"GET /api/property/history":return Q?{op:"listPropertyRevisions",args:[Q]}:null;case"POST /api/property/revert":return Q?{op:"revertProperty",args:[Q,G.to]}:null;case"GET /api/records":return $?{op:"listRecords",args:[$,{sort:Z.get("sort")??void 0,limit:D(Z.get("limit"))}]}:null;case"POST /api/records":return $?{op:"createRecord",args:[$,G]}:null;case"GET /api/record":return Q?{op:"getRecord",args:[Q]}:null;case"PATCH /api/record":return Q?{op:"updateRecord",args:[Q,G]}:null;case"PATCH /api/record/order":{let{target:V,where:X}=G;return Q&&V?{op:"moveRecord",args:[Q,V,X]}:null}case"GET /api/record/history":return Q?{op:"listRecordRevisions",args:[Q]}:null;case"GET /api/record/at":return Q?{op:"recordAtVersion",args:[Q,Z.get("version")]}:null;case"GET /api/record/field-history":return Q?{op:"recordFieldHistory",args:[Q,Z.get("prop")]}:null;case"POST /api/record/revert":return Q?{op:"revertRecord",args:[Q,G.to]}:null;case"DELETE /api/record":return Q?{op:"deleteRecord",args:[Q]}:null;case"GET /api/documents":return{op:"listDocuments",args:[{database_id:Z.get("db")??void 0,parent_id:Z.get("parent")??void 0}]};case"POST /api/documents":return{op:"createDocument",args:[G]};case"GET /api/document":return Q?{op:"getDocument",args:[Q]}:null;case"PATCH /api/document":{let{if_match:V,...X}=G;return Q?{op:"updateDocument",args:[Q,X,V]}:null}case"POST /api/document/duplicate":return Q?{op:"duplicateDocument",args:[Q,G]}:null;case"PATCH /api/document/move":{let{target:V,where:X}=G;return Q&&V?{op:"moveDocument",args:[Q,V,X]}:null}case"GET /api/document/history":return Q?{op:"listDocumentRevisions",args:[Q]}:null;case"GET /api/document/at":return Q?{op:"documentAtVersion",args:[Q,Z.get("version")]}:null;case"POST /api/document/revert":{let{to:V,if_match:X}=G;return Q&&V?{op:"revertDocument",args:[Q,V,X]}:null}case"DELETE /api/document":return Q?{op:"deleteDocument",args:[Q]}:null;case"GET /api/nodes":return{op:"nodes",args:[]};case"GET /api/search":{let V=Z.get("q");return V?{op:"search",args:[V,D(Z.get("limit"))]}:null}default:return null}}function w(J,Y){if(J===null)return"unknown";if(J.status>=500)return"unknown";if(J.ok)return Y?.ok===!0?"server":"none";return"none"}async function x(){let J=null,Y=null;try{J=await fetch("/health",{cache:"no-store"}),Y=J.ok?await J.json().catch(()=>null):null}catch{J=null}return w(J,Y)}var q=Math.floor(167772160);function u(J){if(J instanceof ArrayBuffer)return J;let Y=new Uint8Array(J.byteLength);return Y.set(J),Y.buffer}async function m(J){let Y=await crypto.subtle.digest("SHA-256",u(J));return[...new Uint8Array(Y)].map((Z)=>Z.toString(16).padStart(2,"0")).join("")}async function P(J,Y){return(await m(J)).slice(0,Y.length)===Y}var v={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",avif:"image/avif",svg:"image/svg+xml",pdf:"application/pdf"};function S(J){let Y=J.lastIndexOf("."),Z=Y>=0?J.slice(Y+1).toLowerCase():"";return v[Z]??"application/octet-stream"}var j=null;function y(){if(j)return j;return j=new Promise((J,Y)=>{let Z=indexedDB.open("mh-blobs",1);Z.onupgradeneeded=()=>{let z=Z.result;if(!z.objectStoreNames.contains("spool"))z.createObjectStore("spool",{keyPath:"hash"});if(!z.objectStoreNames.contains("meta"))z.createObjectStore("meta",{keyPath:"hash"})},Z.onsuccess=()=>J(Z.result),Z.onerror=()=>Y(Z.error)}),j}function U(J,Y,Z){return y().then((z)=>new Promise((Q,$)=>{let G=Z(z.transaction(J,Y).objectStore(J));G.onsuccess=()=>Q(G.result),G.onerror=()=>$(G.error)}))}var K=(J)=>`/blob/${J}`;async function b(J,Y){let Z=await U("meta","readonly",(Q)=>Q.get(J)),z={hash:J,size:Y,accessed:Date.now(),pinned:Z?.pinned??0};await U("meta","readwrite",(Q)=>Q.put(z))}async function p(J){let Y=await U("meta","readonly",(Z)=>Z.get(J));if(!Y)return;Y.accessed=Date.now(),await U("meta","readwrite",(Z)=>Z.put(Y))}function l(J){return J.trim().toLowerCase().startsWith("text/html")}async function g(J){let Y=await caches.open("mh-blob-v1"),Z=await Y.match(K(J));if(!Z)return;if(l(Z.headers.get("content-type")??"")){await Y.delete(K(J)),await U("meta","readwrite",(z)=>z.delete(J)).catch(()=>{});return}return p(J),Z}async function M(J,Y,Z){await(await caches.open("mh-blob-v1")).put(K(J),new Response(Y,{headers:{"content-type":Z,"cache-control":"public, max-age=31536000, immutable"}})),await b(J,Y.byteLength),await c()}async function c(){let J=await U("meta","readonly",(Q)=>Q.getAll())??[],Y=J.reduce((Q,$)=>Q+$.size,0);if(Y<=209715200)return;let Z=await caches.open("mh-blob-v1"),z=J.filter((Q)=>!Q.pinned).sort((Q,$)=>Q.accessed-$.accessed);for(let Q of z){if(Y<=q)break;await Z.delete(K(Q.hash)),await U("meta","readwrite",($)=>$.delete(Q.hash)),Y-=Q.size}}var F=globalThis,B=F.caches,d="__MH_SW_VERSION__",N=`mh-shell-${d}`,O="mh-api-v1",o="mh-wasm-v1",T=["/","/webui.js","/webui.css","/manifest.webmanifest","/db-worker.js","/mh-runtime.js"],k=3500,n=12000;function L(J){return J.ok&&J.headers.get("x-mh-unlock")==null}var f=null;async function R(){if(f==null){let J=await x();if(J==="unknown")return!1;f=J}return f==="none"}F.addEventListener("install",(J)=>{J.waitUntil((async()=>{try{let Y=await B.open(N);await Promise.allSettled(T.map(async(Z)=>{let z=await fetch(Z);if(L(z))await Y.put(Z,z)})),await F.skipWaiting()}catch(Y){try{await(await B.open("mh-debug")).put("/__mh-sw-install-error",new Response(String(Y?.stack??Y)))}catch{}throw Y}})())});F.addEventListener("activate",(J)=>{J.waitUntil((async()=>{for(let Y of await B.keys())if(Y.startsWith("mh-shell-")&&Y!==N)await B.delete(Y);await F.clients.claim()})())});function A(J,Y){return new Promise((Z,z)=>{let Q=setTimeout(()=>z(Error("sw: network timeout")),Y);fetch(J).then(($)=>{clearTimeout(Q),Z($)},($)=>{clearTimeout(Q),z($)})})}async function _(J,Y,Z,z){let Q=await B.open(Y),$=z??J;try{let G=await A(J,Z);if(L(G))await Q.put($,G.clone());return G}catch(G){let D=await Q.match($);if(D)return D;throw G}}function h(J,Y,Z){return new Promise((z,Q)=>{let $=new MessageChannel,G=setTimeout(()=>Q(Error("sw: rpc timeout")),n);$.port1.onmessage=(D)=>{clearTimeout(G),z(D.data)},J.postMessage({kind:"mh-rpc",op:Y,args:Z},[$.port2])})}async function W(J,Y,Z){let z=new Set,Q=[];if(J.clientId){let $=await F.clients.get(J.clientId);if($)Q.push($)}for(let $ of await F.clients.matchAll({type:"window",includeUncontrolled:!0}))if(!Q.some((G)=>G.id===$.id))Q.push($);for(let $ of Q){if(z.has($.id))continue;z.add($.id);try{let G=await h($,Y,Z);if(!G.ok&&G.error?.code==="unavailable")continue;return G}catch{continue}}return null}var i={invalid_input:400,not_found:404,ambiguous:400,stale:409,conflict:409,auth:401,network:502};function C(J){if(J.ok)return new Response(JSON.stringify(J.result??null),{headers:{"content-type":"application/json","x-mh-source":"replica"}});let Y=J.error?.code;return new Response(JSON.stringify({error:J.error?.message??"replica error",code:Y}),{status:Y?i[Y]??400:502,headers:{"content-type":"application/json","x-mh-source":"replica"}})}async function a(J){let Y=J.request,Z=new URL(Y.url),z=null;if(Y.method!=="GET"&&(Y.headers.get("content-type")??"").includes("json"))z=await Y.clone().json().catch(()=>null);if(await R()){let Q=H(Y.method,Z.pathname,Z.searchParams,z);if(Q){let $=await W(J,Q.op,Q.args);if($)return C($)}return new Response(JSON.stringify({error:"no metahub server (bucket-only mode)",code:"network"}),{status:502,headers:{"content-type":"application/json","x-mh-source":"replica"}})}try{let Q=Y.method==="GET"?await A(Y,k*2):await fetch(Y);if(Y.method==="GET"&&L(Q))await(await B.open(O)).put(Y,Q.clone());return Q}catch(Q){let $=H(Y.method,Z.pathname,Z.searchParams,z);if($){let G=await W(J,$.op,$.args);if(G)return C(G)}if(Y.method==="GET"){let G=await(await B.open(O)).match(Y);if(G)return G}throw Q}}function r(J){let Z=J.toLowerCase().indexOf("<head>");if(Z>=0)return J.slice(0,Z+6)+'<script src="/mh-runtime.js"></script>'+J.slice(Z+6);return'<script src="/mh-runtime.js"></script>'+J}function s(J){let Y=J.content_type.includes("text/html"),Z=J.content??"",z;if(J.encoding==="utf8")z=Y?r(Z):Z;else{let Q=atob(Z),$=new Uint8Array(Q.length);for(let G=0;G<Q.length;G++)$[G]=Q.charCodeAt(G);z=$}return new Response(z,{headers:{"content-type":J.content_type,"x-mh-source":"replica"}})}function t(J,Y){let Z=`${JSON.stringify(J)},${JSON.stringify(Y)}`;return new Response(`<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script src="/mh-runtime.js"></script></head><body><p style="font:14px system-ui;color:#888;margin:2em">正在从本地副本加载…</p><script>__mhOfflineBootstrap(${Z})</script></body></html>`,{headers:{"content-type":"text/html; charset=utf-8","x-mh-source":"bootstrap"}})}async function E(J,Y){let Z=Y.pathname.slice(7);if(Z==="")return null;let z=Z.indexOf("/");if(z===-1)return Response.redirect(`${Y.origin}/sites/${Z}/`,301);let Q=decodeURIComponent(Z.slice(0,z)),$=decodeURIComponent(Z.slice(z+1)),G=await W(J,"siteFile",[Q,$]);if(G?.ok&&G.result)return s(G.result);if(G?.ok&&G.result==null)return new Response("not found (offline replica)",{status:404});if(J.request.mode==="navigate")return t(Q,$);return null}async function e(J){let Y=J.request,Z=new URL(Y.url);if(await R())return await E(J,Z)??new Response("not found",{status:404});try{return await A(Y,k)}catch(z){let Q=await E(J,Z);if(Q)return Q;throw z}}async function JJ(J){let Y=J.request,Z=new URL(Y.url),z=decodeURIComponent(Z.pathname.slice(6)),Q=z.indexOf("."),$=(Q>=0?z.slice(0,Q):z).toLowerCase();if(!/^[0-9a-f]{16,64}$/.test($))return fetch(Y);let G=S(z),D=await g($);if(D)return D;if(!await R())try{let V=await A(new Request(Y,{cache:"no-store"}),k*2);if(V.ok){let X=await V.clone().arrayBuffer();if(await P(X,$))return await M($,X,V.headers.get("content-type")??G),V}}catch{}let I=await W(J,"blobBytes",[$]);if(I?.ok&&I.result){let V=I.result;if(await P(V,$))return await M($,V,G),new Response(V,{headers:{"content-type":G,"x-mh-source":"replica"}})}return new Response("blob unavailable offline",{status:404})}F.addEventListener("fetch",(J)=>{let Y=J.request,Z=new URL(Y.url);if(Z.origin!==F.location.origin)return;if(Z.pathname.startsWith("/api/")){J.respondWith(a(J));return}if(Y.method!=="GET")return;if(Z.pathname.startsWith("/sites/")){J.respondWith(e(J));return}if(Z.pathname.startsWith("/blob/")){J.respondWith(JJ(J));return}if(Y.mode==="navigate"){if(Z.pathname!=="/")return;J.respondWith(_(Y,N,k,"/"));return}if(T.includes(Z.pathname)||Z.pathname.startsWith("/icons/")){J.respondWith(_(Y,N,k));return}if(Z.pathname==="/sqlite3.wasm"){J.respondWith((async()=>{let z=await B.open(o),Q=await z.match(Y);if(Q)return Q;let $=await fetch(Y);if(L($))await z.put(Y,$.clone());return $})());return}});
|
|
1
|
+
function H(J,Y,Z,z){let Q=Z.get("id"),$=Z.get("db"),G=z??{},D=(V)=>V!=null?Number(V):void 0;switch(`${J} ${Y}`){case"GET /api/databases":return{op:"listDatabases",args:[]};case"POST /api/databases":return{op:"createDatabase",args:[G]};case"PATCH /api/database":return Q?{op:"updateDatabase",args:[Q,G]}:null;case"POST /api/database/duplicate":return Q?{op:"duplicateDatabase",args:[Q,G]}:null;case"DELETE /api/database":return Q?{op:"deleteDatabase",args:[Q]}:null;case"GET /api/database/activity":return $?{op:"listDatabaseActivity",args:[$,D(Z.get("limit"))]}:null;case"GET /api/properties":return $?{op:"listProperties",args:[$]}:null;case"POST /api/properties":{let{db:V,...X}=G;return V?{op:"addProperty",args:[V,X]}:null}case"PATCH /api/property":return Q?{op:"updateProperty",args:[Q,G]}:null;case"PATCH /api/property/width":return Q?{op:"setPropertyWidth",args:[Q,G.width]}:null;case"DELETE /api/property":return Q?{op:"removeProperty",args:[Q]}:null;case"GET /api/property/history":return Q?{op:"listPropertyRevisions",args:[Q]}:null;case"POST /api/property/revert":return Q?{op:"revertProperty",args:[Q,G.to]}:null;case"GET /api/records":return $?{op:"listRecords",args:[$,{sort:Z.get("sort")??void 0,limit:D(Z.get("limit"))}]}:null;case"POST /api/records":return $?{op:"createRecord",args:[$,G]}:null;case"GET /api/record":return Q?{op:"getRecord",args:[Q]}:null;case"PATCH /api/record":return Q?{op:"updateRecord",args:[Q,G]}:null;case"PATCH /api/record/order":{let{target:V,where:X}=G;return Q&&V?{op:"moveRecord",args:[Q,V,X]}:null}case"GET /api/record/history":return Q?{op:"listRecordRevisions",args:[Q]}:null;case"GET /api/record/at":return Q?{op:"recordAtVersion",args:[Q,Z.get("version")]}:null;case"GET /api/record/field-history":return Q?{op:"recordFieldHistory",args:[Q,Z.get("prop")]}:null;case"POST /api/record/revert":return Q?{op:"revertRecord",args:[Q,G.to]}:null;case"DELETE /api/record":return Q?{op:"deleteRecord",args:[Q]}:null;case"GET /api/documents":return{op:"listDocuments",args:[{database_id:Z.get("db")??void 0,parent_id:Z.get("parent")??void 0}]};case"POST /api/documents":return{op:"createDocument",args:[G]};case"GET /api/document":return Q?{op:"getDocument",args:[Q]}:null;case"PATCH /api/document":{let{if_match:V,...X}=G;return Q?{op:"updateDocument",args:[Q,X,V]}:null}case"POST /api/document/duplicate":return Q?{op:"duplicateDocument",args:[Q,G]}:null;case"PATCH /api/document/move":{let{target:V,where:X}=G;return Q&&V?{op:"moveDocument",args:[Q,V,X]}:null}case"GET /api/document/history":return Q?{op:"listDocumentRevisions",args:[Q]}:null;case"GET /api/document/at":return Q?{op:"documentAtVersion",args:[Q,Z.get("version")]}:null;case"POST /api/document/revert":{let{to:V,if_match:X}=G;return Q&&V?{op:"revertDocument",args:[Q,V,X]}:null}case"DELETE /api/document":return Q?{op:"deleteDocument",args:[Q]}:null;case"GET /api/nodes":return{op:"nodes",args:[]};case"GET /api/search":{let V=Z.get("q");return V?{op:"search",args:[V,D(Z.get("limit"))]}:null}default:return null}}function w(J,Y){if(J===null)return"unknown";if(J.status>=500)return"unknown";if(J.ok)return Y?.ok===!0?"server":"none";return"none"}async function g(){let J=null,Y=null;try{J=await fetch("/health",{cache:"no-store"}),Y=J.ok?await J.json().catch(()=>null):null}catch{J=null}return w(J,Y)}var q=Math.floor(167772160);function u(J){if(J instanceof ArrayBuffer)return J;let Y=new Uint8Array(J.byteLength);return Y.set(J),Y.buffer}async function v(J){let Y=await crypto.subtle.digest("SHA-256",u(J));return[...new Uint8Array(Y)].map((Z)=>Z.toString(16).padStart(2,"0")).join("")}async function M(J,Y){return(await v(J)).slice(0,Y.length)===Y}var m={png:"image/png",jpg:"image/jpeg",jpeg:"image/jpeg",gif:"image/gif",webp:"image/webp",avif:"image/avif",svg:"image/svg+xml",pdf:"application/pdf"};function O(J){let Y=J.lastIndexOf("."),Z=Y>=0?J.slice(Y+1).toLowerCase():"";return m[Z]??"application/octet-stream"}var N=null;function y(){if(N)return N;return N=new Promise((J,Y)=>{let Z=indexedDB.open("mh-blobs",1);Z.onupgradeneeded=()=>{let z=Z.result;if(!z.objectStoreNames.contains("spool"))z.createObjectStore("spool",{keyPath:"hash"});if(!z.objectStoreNames.contains("meta"))z.createObjectStore("meta",{keyPath:"hash"})},Z.onsuccess=()=>J(Z.result),Z.onerror=()=>Y(Z.error)}),N}function k(J,Y,Z){return y().then((z)=>new Promise((Q,$)=>{let G=Z(z.transaction(J,Y).objectStore(J));G.onsuccess=()=>Q(G.result),G.onerror=()=>$(G.error)}))}var W=(J)=>`/blob/${J}`;async function b(J,Y,Z){let z=await k("meta","readonly",($)=>$.get(J)),Q={hash:J,size:Y,accessed:Date.now(),pinned:z?.pinned??0,content_type:Z??z?.content_type};await k("meta","readwrite",($)=>$.put(Q))}async function p(J){let Y=await k("meta","readonly",(Z)=>Z.get(J));if(!Y)return;Y.accessed=Date.now(),await k("meta","readwrite",(Z)=>Z.put(Y))}function l(J){return J.trim().toLowerCase().startsWith("text/html")}async function x(J){let Y=await caches.open("mh-blob-v1"),Z=await Y.match(W(J));if(!Z)return;if(l(Z.headers.get("content-type")??"")){await Y.delete(W(J)),await k("meta","readwrite",(z)=>z.delete(J)).catch(()=>{});return}return p(J),Z}async function P(J,Y,Z){await(await caches.open("mh-blob-v1")).put(W(J),new Response(Y,{headers:{"content-type":Z,"cache-control":"public, max-age=31536000, immutable"}})),await b(J,Y.byteLength,Z),await d()}async function d(){let J=await k("meta","readonly",(Q)=>Q.getAll())??[],Y=J.reduce((Q,$)=>Q+$.size,0);if(Y<=209715200)return;let Z=await caches.open("mh-blob-v1"),z=J.filter((Q)=>!Q.pinned).sort((Q,$)=>Q.accessed-$.accessed);for(let Q of z){if(Y<=q)break;await Z.delete(W(Q.hash)),await k("meta","readwrite",($)=>$.delete(Q.hash)),Y-=Q.size}}var F=globalThis,U=F.caches,c="__MH_SW_VERSION__",K=`mh-shell-${c}`,_="mh-api-v1",o="mh-wasm-v1",T=["/","/webui.js","/webui.css","/manifest.webmanifest","/db-worker.js","/mh-runtime.js"],I=3500,i=12000;function B(J){return J.ok&&J.headers.get("x-mh-unlock")==null}var R=null;async function S(){if(R==null){let J=await g();if(J==="unknown")return!1;R=J}return R==="none"}F.addEventListener("install",(J)=>{J.waitUntil((async()=>{try{let Y=await U.open(K);await Promise.allSettled(T.map(async(Z)=>{let z=await fetch(Z);if(B(z))await Y.put(Z,z)})),await F.skipWaiting()}catch(Y){try{await(await U.open("mh-debug")).put("/__mh-sw-install-error",new Response(String(Y?.stack??Y)))}catch{}throw Y}})())});F.addEventListener("activate",(J)=>{J.waitUntil((async()=>{for(let Y of await U.keys())if(Y.startsWith("mh-shell-")&&Y!==K)await U.delete(Y);await F.clients.claim()})())});function A(J,Y){return new Promise((Z,z)=>{let Q=setTimeout(()=>z(Error("sw: network timeout")),Y);fetch(J).then(($)=>{clearTimeout(Q),Z($)},($)=>{clearTimeout(Q),z($)})})}async function C(J,Y,Z,z){let Q=await U.open(Y),$=z??J;try{let G=await A(J,Z);if(B(G))await Q.put($,G.clone());return G}catch(G){let D=await Q.match($);if(D)return D;throw G}}function h(J,Y,Z){return new Promise((z,Q)=>{let $=new MessageChannel,G=setTimeout(()=>Q(Error("sw: rpc timeout")),i);$.port1.onmessage=(D)=>{clearTimeout(G),z(D.data)},J.postMessage({kind:"mh-rpc",op:Y,args:Z},[$.port2])})}async function L(J,Y,Z){let z=new Set,Q=[];if(J.clientId){let $=await F.clients.get(J.clientId);if($)Q.push($)}for(let $ of await F.clients.matchAll({type:"window",includeUncontrolled:!0}))if(!Q.some((G)=>G.id===$.id))Q.push($);for(let $ of Q){if(z.has($.id))continue;z.add($.id);try{let G=await h($,Y,Z);if(!G.ok&&G.error?.code==="unavailable")continue;return G}catch{continue}}return null}var n={invalid_input:400,not_found:404,ambiguous:400,stale:409,conflict:409,auth:401,network:502};function E(J){if(J.ok)return new Response(JSON.stringify(J.result??null),{headers:{"content-type":"application/json","x-mh-source":"replica"}});let Y=J.error?.code;return new Response(JSON.stringify({error:J.error?.message??"replica error",code:Y}),{status:Y?n[Y]??400:502,headers:{"content-type":"application/json","x-mh-source":"replica"}})}async function a(J){let Y=J.request,Z=new URL(Y.url),z=null;if(Y.method!=="GET"&&(Y.headers.get("content-type")??"").includes("json"))z=await Y.clone().json().catch(()=>null);if(await S()){let Q=H(Y.method,Z.pathname,Z.searchParams,z);if(Q){let $=await L(J,Q.op,Q.args);if($)return E($)}return new Response(JSON.stringify({error:"no metahub server (bucket-only mode)",code:"network"}),{status:502,headers:{"content-type":"application/json","x-mh-source":"replica"}})}try{let Q=Y.method==="GET"?await A(Y,I*2):await fetch(Y);if(Y.method==="GET"&&B(Q))await(await U.open(_)).put(Y,Q.clone());return Q}catch(Q){let $=H(Y.method,Z.pathname,Z.searchParams,z);if($){let G=await L(J,$.op,$.args);if(G)return E(G)}if(Y.method==="GET"){let G=await(await U.open(_)).match(Y);if(G)return G}throw Q}}function r(J){let Z=J.toLowerCase().indexOf("<head>");if(Z>=0)return J.slice(0,Z+6)+'<script src="/mh-runtime.js"></script>'+J.slice(Z+6);return'<script src="/mh-runtime.js"></script>'+J}function s(J){let Y=J.content_type.includes("text/html"),Z=J.content??"",z;if(J.encoding==="utf8")z=Y?r(Z):Z;else{let Q=atob(Z),$=new Uint8Array(Q.length);for(let G=0;G<Q.length;G++)$[G]=Q.charCodeAt(G);z=$}return new Response(z,{headers:{"content-type":J.content_type,"x-mh-source":"replica"}})}function t(J,Y){let Z=`${JSON.stringify(J)},${JSON.stringify(Y)}`;return new Response(`<!doctype html><html><head><meta charset="utf-8"><meta name="viewport" content="width=device-width, initial-scale=1"><script src="/mh-runtime.js"></script></head><body><p style="font:14px system-ui;color:#888;margin:2em">正在从本地副本加载…</p><script>__mhOfflineBootstrap(${Z})</script></body></html>`,{headers:{"content-type":"text/html; charset=utf-8","x-mh-source":"bootstrap"}})}async function f(J,Y){let Z=Y.pathname.slice(7);if(Z==="")return null;let z=Z.indexOf("/");if(z===-1)return Response.redirect(`${Y.origin}/sites/${Z}/`,301);let Q=decodeURIComponent(Z.slice(0,z)),$=decodeURIComponent(Z.slice(z+1)),G=await L(J,"siteFile",[Q,$]);if(G?.ok&&G.result)return s(G.result);if(G?.ok&&G.result==null)return new Response("not found (offline replica)",{status:404});if(J.request.mode==="navigate")return t(Q,$);return null}async function e(J){let Y=J.request,Z=new URL(Y.url);if(await S())return await f(J,Z)??new Response("not found",{status:404});try{return await A(Y,I)}catch(z){let Q=await f(J,Z);if(Q)return Q;throw z}}async function JJ(J){let Y=J.request,Z=new URL(Y.url),z=decodeURIComponent(Z.pathname.slice(6)),Q=z.indexOf("."),$=(Q>=0?z.slice(0,Q):z).toLowerCase();if(!/^[0-9a-f]{16,64}$/.test($))return fetch(Y);let G=O(z),D=await x($);if(D)return D;if(!await S())try{let V=await A(new Request(Y,{cache:"no-store"}),I*2);if(V.ok){let X=await V.clone().arrayBuffer();if(await M(X,$))return await P($,X,V.headers.get("content-type")??G),V}}catch{}let j=await L(J,"blobBytes",[$]);if(j?.ok&&j.result){let V=j.result;if(await M(V,$))return await P($,V,G),new Response(V,{headers:{"content-type":G,"x-mh-source":"replica"}})}return new Response("blob unavailable offline",{status:404})}F.addEventListener("fetch",(J)=>{let Y=J.request,Z=new URL(Y.url);if(Z.origin!==F.location.origin)return;if(Z.pathname.startsWith("/api/")){J.respondWith(a(J));return}if(Y.method!=="GET")return;if(Z.pathname.startsWith("/sites/")){J.respondWith(e(J));return}if(Z.pathname.startsWith("/blob/")){J.respondWith(JJ(J));return}if(Y.mode==="navigate"){if(Z.pathname!=="/")return;J.respondWith(C(Y,K,I,"/"));return}if(T.includes(Z.pathname)||Z.pathname.startsWith("/icons/")){J.respondWith(C(Y,K,I));return}if(Z.pathname==="/sqlite3.wasm"){J.respondWith((async()=>{let z=await U.open(o),Q=await z.match(Y);if(Q)return Q;let $=await fetch(Y);if(B($))await z.put(Y,$.clone());return $})());return}});
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/webui/server/assets.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"assets.d.ts","sourceRoot":"","sources":["../../../src/webui/server/assets.ts"],"names":[],"mappings":"AAqEA,wBAAgB,cAAc,CAAC,MAAM,EAAE;IACrC,EAAE,EAAE,MAAM,CAAC;IACX,EAAE,EAAE,MAAM,CAAC;IACX,QAAQ,EAAE,MAAM,CAAC;IACjB,OAAO,EAAE,MAAM,CAAC;IAChB,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,UAAU,CAAC;CAClB,GAAG,IAAI,CAYP;AAuID;;;;2EAI2E;AAC3E,wBAAsB,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC,CAM/C;AAUD;0CAC0C;AAC1C,wBAAsB,UAAU,CAAC,GAAG,EAAE,OAAO,GAAG,OAAO,CAAC,QAAQ,GAAG,IAAI,CAAC,CA+CvE"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/webui/server/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,KAAK,EAAiB,MAAM,2BAA2B,CAAC;
|
|
1
|
+
{"version":3,"file":"routes.d.ts","sourceRoot":"","sources":["../../../src/webui/server/routes.ts"],"names":[],"mappings":"AAEA,OAAO,EAAiB,KAAK,KAAK,EAAiB,MAAM,2BAA2B,CAAC;AAwarF,eAAO,MAAM,WAAW,EAAE,KAAK,EAke9B,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"share-routes.d.ts","sourceRoot":"","sources":["../../../src/webui/server/share-routes.ts"],"names":[],"mappings":"AACA,OAAO,EAAiB,KAAK,KAAK,EAAE,MAAM,2BAA2B,CAAC;AAwDtE,eAAO,MAAM,WAAW,EAAE,KAAK,EA8F9B,CAAC"}
|