Split the Plug Development page into a quick-start with more subtopics: Architecture (loading, sandboxing, execution), Reference (manifests, hooks, syscalls), and Distribution and Testing. Swap the Excalidraw architecture embed for a Mermaid diagram, and update the website Dockerfile to ship the Mermaid plug instead of Excalidraw.
14 lines
5.0 KiB
JavaScript
14 lines
5.0 KiB
JavaScript
var h=Object.defineProperty;var v=(e,t)=>{for(var n in t)h(e,n,{get:t[n],enumerable:!0})};function b(e){let t=atob(e),n=t.length,r=new Uint8Array(n);for(let i=0;i<n;i++)r[i]=t.charCodeAt(i);return r}function g(e){typeof e=="string"&&(e=new TextEncoder().encode(e));let t="",n=e.byteLength;for(let r=0;r<n;r++)t+=String.fromCharCode(e[r]);return btoa(t)}var te=new Uint8Array(16),w=class{constructor(e="",t=1e3){this.prefix=e,this.maxCaptureSize=t,this.prefix=e,this.originalConsole={log:console.log.bind(console),info:console.info.bind(console),warn:console.warn.bind(console),error:console.error.bind(console),debug:console.debug.bind(console)},this.patchConsole()}originalConsole;logBuffer=[];patchConsole(){let e=t=>(...n)=>{let r=this.prefix?[this.prefix,...n]:n;this.originalConsole[t](...r),this.captureLog(t,n)};console.log=e("log"),console.info=e("info"),console.warn=e("warn"),console.error=e("error"),console.debug=e("debug")}captureLog(e,t){let n={level:e,timestamp:Date.now(),message:t.map(r=>{if(typeof r=="string")return r;try{return JSON.stringify(r)}catch{return String(r)}}).join(" ")};this.logBuffer.push(n),this.logBuffer.length>this.maxCaptureSize&&this.logBuffer.shift()}async postToServer(e,t){if(this.logBuffer.length>0){let r=[...this.logBuffer];this.logBuffer=[];try{if(!(await fetch(e,{method:"POST",headers:{"Content-Type":"application/json"},body:JSON.stringify(r.map(s=>({...s,source:t})))})).ok)throw new Error("Failed to post logs to server")}catch(i){console.warn("Could not post logs to server",i.message),this.logBuffer.unshift(...r)}}}},p;function C(e=""){return p=new w(e),p}var u=e=>{throw new Error("Not initialized yet")},m=typeof window>"u"&&typeof globalThis.WebSocketPair>"u",d=new Map,l=0;m&&(globalThis.syscall=async(e,...t)=>await new Promise((n,r)=>{l++,d.set(l,{resolve:n,reject:r}),u({type:"sys",id:l,name:e,args:t})}));function f(e,t,n){m&&(u=n,self.addEventListener("message",r=>{(async()=>{let i=r.data;switch(i.type){case"inv":{let s=e[i.name];if(!s)throw new Error(`Function not loaded: ${i.name}`);try{let a=await Promise.resolve(s(...i.args||[]));u({type:"invr",id:i.id,result:a})}catch(a){console.error("An exception was thrown as a result of invoking function",i.name,"error:",a.message),u({type:"invr",id:i.id,error:a.message})}}break;case"sysr":{let s=i.id,a=d.get(s);if(!a)throw Error("Invalid request id");d.delete(s),i.error?a.reject(new Error(i.error)):a.resolve(i.result)}break}})().catch(console.error)}),u({type:"manifest",manifest:t}),C(`[${t.name} plug]`))}async function T(e,t){if(typeof e!="string"){let n=new Uint8Array(await e.arrayBuffer()),r=n.length>0?g(n):void 0;t={method:e.method,headers:Object.fromEntries(e.headers.entries()),base64Body:r},e=e.url}return syscall("sandboxFetch.fetch",e,t)}globalThis.nativeFetch=globalThis.fetch;function S(){globalThis.fetch=async(e,t)=>{let n=t?.body?g(new Uint8Array(await new Response(t.body).arrayBuffer())):void 0,r=await T(e,t&&{method:t.method,headers:t.headers,base64Body:n});return new Response(r.base64Body?b(r.base64Body):null,{status:r.status,headers:r.headers})}}m&&S();typeof globalThis.syscall>"u"&&(globalThis.syscall=()=>{throw new Error("Not implemented here")});function o(e,...t){return globalThis.syscall(e,...t)}var c={};v(c,{cleanDatabases:()=>Q,getBaseURI:()=>R,getConfig:()=>j,getMode:()=>L,getURLPrefix:()=>B,getVersion:()=>O,invokeCommand:()=>E,invokeFunction:()=>U,listCommands:()=>K,listSyscalls:()=>k,reloadPlugs:()=>D,wipeClient:()=>W});function U(e,...t){return o("system.invokeFunction",e,...t)}function E(e,t){return o("system.invokeCommand",e,t)}function K(){return o("system.listCommands")}function k(){return o("system.listSyscalls")}function D(){return o("system.reloadPlugs")}function L(){return o("system.getMode")}function B(){return o("system.getURLPrefix")}function R(){return o("system.getBaseURI")}function O(){return o("system.getVersion")}function j(e,t=void 0){return o("system.getConfig",e,t)}function W(e=!1){return o("system.wipeClient",e)}function Q(){return o("system.cleanDatabases")}var pe=new Uint8Array(16);async function y(e){let t=await c.getConfig("mermaid",{version:"11.10.1"}),n=t?.version,r=t?.integrity?`"${t.integrity}"`:'"sha256-BmQmdWDS8X2OTbrwELWK366LV6escyWhHHe0XCTU/Hk="';t?.integrity_disabled&&(r=void 0);let i="";if(t?.icon_packs)for(let s of t?.icon_packs)i+=`{
|
|
name: "${s.name}",
|
|
loader: () => fetch("${s.url}").then(r => r.json()),
|
|
},`;return{html:`<pre class="mermaid">${e.replaceAll("<","<")}</pre>`,script:`
|
|
loadJsByUrl("https://cdn.jsdelivr.net/npm/mermaid@${n}/dist/mermaid.min.js", ${r}).then(() => {
|
|
mermaid.init().then(updateHeight);
|
|
mermaid.registerIconPacks([${i}]);
|
|
});
|
|
document.addEventListener("click", () => {
|
|
api({type: "blur"});
|
|
});
|
|
`}}var x={mermaidWidget:y},P={name:"mermaid",version:.1,imports:["https://get.silverbullet.md/global.plug.json"],functions:{mermaidWidget:{path:"./mermaid.ts:widget",codeWidget:"mermaid"}},assets:{}},ke={manifest:P,functionMapping:x};f(x,P,self.postMessage);export{ke as plug};
|
|
//# sourceMappingURL=mermaid.plug.js.map
|