bunite-core 0.8.0 → 0.9.0

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.
Files changed (57) hide show
  1. package/package.json +9 -7
  2. package/src/{bun → host}/core/App.ts +45 -81
  3. package/src/{bun → host}/core/BrowserView.ts +64 -64
  4. package/src/{bun → host}/core/BrowserWindow.ts +14 -14
  5. package/src/host/core/Socket.ts +98 -0
  6. package/src/host/core/SurfaceBrowserIPC.ts +7 -0
  7. package/src/host/core/SurfaceManager.ts +154 -0
  8. package/src/host/encryptedPipe.ts +62 -0
  9. package/src/{bun → host}/events/appEvents.ts +0 -1
  10. package/src/host/index.ts +29 -0
  11. package/src/{bun/proc → host}/native.ts +38 -52
  12. package/src/{shared → host}/paths.ts +20 -26
  13. package/src/{bun/preload/inline.ts → host/preloadBundle.ts} +2 -2
  14. package/src/host/serveWeb.ts +81 -0
  15. package/src/native/linux/bunite_linux_runtime.cpp +2 -2
  16. package/src/native/mac/bunite_mac_ffi.mm +2 -2
  17. package/src/native/shared/ffi_exports.h +1 -1
  18. package/src/native/win/native_host_ffi.cpp +2 -2
  19. package/src/preload/runtime.built.js +1 -1
  20. package/src/preload/runtime.ts +54 -219
  21. package/src/preload/tsconfig.json +3 -10
  22. package/src/rpc/encrypt.ts +74 -0
  23. package/src/rpc/error.ts +58 -0
  24. package/src/rpc/framework.ts +132 -0
  25. package/src/rpc/hash.ts +142 -0
  26. package/src/rpc/index.ts +129 -0
  27. package/src/rpc/peer.ts +1055 -0
  28. package/src/rpc/renderer.ts +82 -0
  29. package/src/rpc/schema.ts +246 -0
  30. package/src/rpc/stream.ts +72 -0
  31. package/src/rpc/transport.ts +81 -0
  32. package/src/rpc/wire.ts +150 -0
  33. package/src/{preload/webviewElement.ts → webview/native.ts} +68 -48
  34. package/src/{shared/webviewPolyfill.ts → webview/polyfill.ts} +4 -7
  35. package/src/bun/core/Socket.ts +0 -187
  36. package/src/bun/core/SurfaceBrowserIPC.ts +0 -65
  37. package/src/bun/core/SurfaceManager.ts +0 -201
  38. package/src/bun/index.ts +0 -53
  39. package/src/bun/preload/index.ts +0 -73
  40. package/src/preload/tsconfig.tsbuildinfo +0 -1
  41. package/src/shared/rpc.ts +0 -424
  42. package/src/shared/rpcDemux.ts +0 -219
  43. package/src/shared/rpcWire.ts +0 -54
  44. package/src/shared/rpcWireConstants.ts +0 -3
  45. package/src/shared/webRpcHandler.ts +0 -77
  46. package/src/shared/webSocketTransport.ts +0 -26
  47. package/src/view/index.ts +0 -196
  48. /package/src/{shared → host}/cefVersion.ts +0 -0
  49. /package/src/{bun → host}/core/SurfaceRegistry.ts +0 -0
  50. /package/src/{bun → host}/core/singleInstanceLock.ts +0 -0
  51. /package/src/{bun → host}/core/windowIds.ts +0 -0
  52. /package/src/{bun → host}/events/event.ts +0 -0
  53. /package/src/{bun → host}/events/eventEmitter.ts +0 -0
  54. /package/src/{bun → host}/events/webviewEvents.ts +0 -0
  55. /package/src/{bun → host}/events/windowEvents.ts +0 -0
  56. /package/src/{shared → host}/log.ts +0 -0
  57. /package/src/{shared → host}/platform.ts +0 -0
@@ -0,0 +1,81 @@
1
+ import type { Server, ServerWebSocket, WebSocketHandler } from "bun";
2
+ import { AsyncLocalStorage } from "node:async_hooks";
3
+ import type { BytesPipe } from "../rpc/transport";
4
+ import { createConnection, _setCallContextStorage } from "../rpc/peer";
5
+ import { createFrameTransport } from "../rpc/transport";
6
+ import type { SchemaShape, ServerDescriptor } from "../rpc/schema";
7
+ import { DEFAULT_MAX_BYTES } from "../rpc/wire";
8
+
9
+ _setCallContextStorage(new AsyncLocalStorage<{ callId: number }>());
10
+
11
+ interface PipeSlot {
12
+ _bunitePipe?: { handler?: (bytes: Uint8Array) => void };
13
+ }
14
+
15
+ function asBytes(message: unknown): Uint8Array {
16
+ if (typeof message === "string") return new TextEncoder().encode(message);
17
+ if (message instanceof Uint8Array) return message;
18
+ if (message instanceof ArrayBuffer) return new Uint8Array(message);
19
+ if (ArrayBuffer.isView(message)) return new Uint8Array(message.buffer, message.byteOffset, message.byteLength);
20
+ return new Uint8Array(0);
21
+ }
22
+
23
+ export function createBunWebSocketServerHandler<TData extends object>(
24
+ onConnection: (ws: ServerWebSocket<TData>, pipe: BytesPipe) => void,
25
+ onClose?: (ws: ServerWebSocket<TData>) => void
26
+ ): WebSocketHandler<TData> {
27
+ return {
28
+ open(ws) {
29
+ const slot = ws.data as TData & PipeSlot;
30
+ const handlerBox: { handler?: (bytes: Uint8Array) => void } = {};
31
+ slot._bunitePipe = handlerBox;
32
+ const pipe: BytesPipe = {
33
+ send: (bytes) => { ws.send(bytes); },
34
+ setReceive: (h) => { handlerBox.handler = h; },
35
+ close: () => { ws.close(); },
36
+ };
37
+ onConnection(ws, pipe);
38
+ },
39
+ message(ws, message) {
40
+ const slot = ws.data as TData & PipeSlot;
41
+ slot._bunitePipe?.handler?.(asBytes(message));
42
+ },
43
+ close(ws) {
44
+ const slot = ws.data as TData & PipeSlot;
45
+ slot._bunitePipe = undefined;
46
+ onClose?.(ws);
47
+ },
48
+ };
49
+ }
50
+
51
+ const DEFAULT_RPC_PATH = "/rpc";
52
+
53
+ export interface WebRpcMount {
54
+ fetch(req: Request, srv: Server<object>): Response | undefined;
55
+ websocket: WebSocketHandler<object> & { maxPayloadLength: number };
56
+ }
57
+
58
+ export function serveWeb<S extends SchemaShape>(
59
+ descriptor: ServerDescriptor<S>,
60
+ opts: { path?: string } = {}
61
+ ): WebRpcMount {
62
+ const path = opts.path ?? DEFAULT_RPC_PATH;
63
+ return {
64
+ fetch(req, srv) {
65
+ if (new URL(req.url).pathname !== path) return undefined;
66
+ const upgraded = srv.upgrade(req, { data: {} });
67
+ return upgraded ? undefined : new Response("WebSocket upgrade failed", { status: 400 });
68
+ },
69
+ websocket: {
70
+ ...createBunWebSocketServerHandler<object>((_ws, pipe) => {
71
+ const conn = createConnection({
72
+ transport: createFrameTransport(pipe),
73
+ mode: "web",
74
+ origin: "web-client",
75
+ });
76
+ conn.serve(descriptor);
77
+ }),
78
+ maxPayloadLength: DEFAULT_MAX_BYTES,
79
+ },
80
+ };
81
+ }
@@ -34,9 +34,9 @@ extern "C" BUNITE_EXPORT const char* bunite_engine_version(void) {
34
34
  }
35
35
 
36
36
  extern "C" BUNITE_EXPORT bool bunite_init(
37
- const char* engine_dir, bool hide_console, bool popup_blocking, const char* engine_config_json
37
+ const char* cef_dir, bool hide_console, bool popup_blocking, const char* engine_config_json
38
38
  ) {
39
- (void)engine_dir; (void)hide_console; (void)engine_config_json;
39
+ (void)cef_dir; (void)hide_console; (void)engine_config_json;
40
40
  auto& rt = bunite_linux::g_runtime;
41
41
  if (rt.initialized) return true;
42
42
  rt.popup_blocking = popup_blocking;
@@ -61,12 +61,12 @@ extern "C" BUNITE_EXPORT void bunite_set_log_level(int32_t level) {
61
61
  }
62
62
 
63
63
  extern "C" BUNITE_EXPORT bool bunite_init(
64
- const char* engine_dir, // ignored — WKWebView is a system framework
64
+ const char* cef_dir, // ignored — WKWebView is a system framework
65
65
  bool hide_console, // ignored — no console concept on macOS
66
66
  bool popup_blocking,
67
67
  const char* engine_config_json // reserved
68
68
  ) {
69
- (void)engine_dir;
69
+ (void)cef_dir;
70
70
  (void)hide_console;
71
71
  (void)engine_config_json;
72
72
 
@@ -18,7 +18,7 @@ extern "C" {
18
18
  BUNITE_EXPORT int32_t bunite_abi_version(void);
19
19
  BUNITE_EXPORT void bunite_set_log_level(int32_t level);
20
20
  BUNITE_EXPORT bool bunite_init(
21
- const char* engine_dir,
21
+ const char* cef_dir,
22
22
  bool hide_console,
23
23
  bool popup_blocking,
24
24
  const char* engine_config_json
@@ -80,7 +80,7 @@ extern "C" BUNITE_EXPORT void bunite_set_log_level(int32_t level) {
80
80
  }
81
81
 
82
82
  extern "C" BUNITE_EXPORT bool bunite_init(
83
- const char* engine_dir,
83
+ const char* cef_dir,
84
84
  bool hide_console,
85
85
  bool popup_blocking,
86
86
  const char* engine_config_json
@@ -96,7 +96,7 @@ extern "C" BUNITE_EXPORT bool bunite_init(
96
96
  g_runtime.shutdown_finalize_posted.store(false);
97
97
  g_runtime.shutting_down.store(false);
98
98
  g_runtime.process_helper_path = resolveProcessHelperPath();
99
- g_runtime.cef_dir = engine_dir ? engine_dir : "";
99
+ g_runtime.cef_dir = cef_dir ? cef_dir : "";
100
100
  g_runtime.popup_blocking = popup_blocking;
101
101
  g_runtime.chromium_flags = bunite_win::parseChromiumFlagsJson(
102
102
  engine_config_json ? engine_config_json : "");
@@ -1 +1 @@
1
- class _{element;onBoundsChange;observer=null;rafId=0;lastRect={x:0,y:0,width:0,height:0};dirty=!1;stopped=!1;constructor(z,q){this.element=z,this.onBoundsChange=q}start(){this.observer=new ResizeObserver(()=>this.markDirty()),this.observer.observe(this.element),this.scheduleFrame()}stop(){if(this.stopped=!0,this.observer?.disconnect(),this.observer=null,this.rafId)cancelAnimationFrame(this.rafId),this.rafId=0}markDirty(){this.dirty=!0}scheduleFrame(){if(this.stopped)return;this.rafId=requestAnimationFrame(()=>{this.flush(),this.scheduleFrame()})}flush(){let z=window.devicePixelRatio||1,q=this.element.getBoundingClientRect(),J={x:Math.round(q.x*z),y:Math.round(q.y*z),width:Math.round(q.width*z),height:Math.round(q.height*z)};if(!this.dirty&&J.x===this.lastRect.x&&J.y===this.lastRect.y&&J.width===this.lastRect.width&&J.height===this.lastRect.height)return;this.dirty=!1,this.lastRect=J,this.onBoundsChange(J)}}class $ extends HTMLElement{static observedAttributes=["src"];_surfaceId=null;_syncCtrl=null;_initPromise=null;_aborted=!1;_pendingSrc=null;_syncHidden=!1;_userHidden=!1;_layoutObserver=null;_unsubNavigate=null;constructor(){super()}connectedCallback(){this._aborted=!1,this._syncHidden=!1,this._userHidden=!1,this._unsubNavigate=bunite.on("__bunite:webview.didNavigate",(z)=>{if(z?.surfaceId===this._surfaceId)this.dispatchEvent(new CustomEvent("did-navigate",{detail:{url:z.url}}))}),this._waitForLayout()}_waitForLayout(){if(this._layoutObserver)return;let z=()=>{if(!this.isConnected||this._aborted)return!0;let q=this.getBoundingClientRect();if(q.width>0&&q.height>0){if(this.getAttribute("src")||this._pendingSrc||"")this.initSurface();return!0}return!1};requestAnimationFrame(()=>{if(z())return;this._layoutObserver=new ResizeObserver(()=>{if(z())this._layoutObserver?.disconnect(),this._layoutObserver=null}),this._layoutObserver.observe(this)})}disconnectedCallback(){if(this._aborted=!0,this._unsubNavigate?.(),this._unsubNavigate=null,this._layoutObserver?.disconnect(),this._layoutObserver=null,this._syncCtrl?.stop(),this._syncCtrl=null,this._surfaceId!=null){let z=this._surfaceId;this._surfaceId=null,bunite.invoke("__bunite:surface.remove",{surfaceId:z}).catch(()=>{})}else if(this._initPromise)this._initPromise.then((z)=>{bunite.invoke("__bunite:surface.remove",{surfaceId:z.surfaceId}).catch(()=>{})}).catch(()=>{});this._initPromise=null}attributeChangedCallback(z,q,J){if(z!=="src")return;if(this._surfaceId!=null)bunite.invoke("__bunite:webview.navigate",{surfaceId:this._surfaceId,url:J||""}).catch(()=>{});else if(this._initPromise)this._pendingSrc=J||"";else if(this.isConnected&&!this._aborted&&J)this._waitForLayout()}setHidden(z){this._userHidden=z,this._applySurfaceHidden()}goBack(){if(this._surfaceId!=null)bunite.invoke("__bunite:webview.goBack",{surfaceId:this._surfaceId}).catch(()=>{})}reload(){if(this._surfaceId!=null)bunite.invoke("__bunite:webview.reload",{surfaceId:this._surfaceId}).catch(()=>{})}navigate(z){this.setAttribute("src",z)}_applySurfaceHidden(){if(this._surfaceId==null)return;bunite.invoke("__bunite:surface.setHidden",{surfaceId:this._surfaceId,hidden:this._userHidden||this._syncHidden}).catch(()=>{})}initSurface(){if(this._surfaceId!=null||this._initPromise!=null)return;let z=window.devicePixelRatio||1,q=this.getBoundingClientRect(),J=this._pendingSrc||this.getAttribute("src")||"";this._pendingSrc=null;let F=bunite.invoke("__bunite:surface.init",{src:J,x:Math.round(q.x*z),y:Math.round(q.y*z),width:Math.round(q.width*z),height:Math.round(q.height*z),hidden:this._userHidden});this._initPromise=F,F.then((G)=>{if(this._initPromise!==F)return;if(this._aborted){bunite.invoke("__bunite:surface.remove",{surfaceId:G.surfaceId}).catch(()=>{});return}if(this._surfaceId=G.surfaceId,this._userHidden)this._applySurfaceHidden();if(this._pendingSrc!=null){let H=this._pendingSrc;this._pendingSrc=null,bunite.invoke("__bunite:webview.navigate",{surfaceId:this._surfaceId,url:H}).catch(()=>{})}this._syncCtrl=new _(this,(H)=>{if(this._surfaceId==null)return;if(H.width===0&&H.height===0){if(!this._syncHidden)this._syncHidden=!0,this._applySurfaceHidden();return}if(this._syncHidden)this._syncHidden=!1,this._applySurfaceHidden();bunite.invoke("__bunite:surface.resize",{surfaceId:this._surfaceId,x:H.x,y:H.y,w:H.width,h:H.height}).catch(()=>{})}),this._syncCtrl.start()}).catch(()=>{}).finally(()=>{if(this._initPromise===F)this._initPromise=null})}}if(typeof customElements<"u"){customElements.define("bunite-webview",$);let z=()=>bunite.invoke("__bunite:surface.bringAllVisiblesToFront").catch(()=>{});document.addEventListener("pointerdown",z,!0),document.addEventListener("dragstart",()=>{bunite.invoke("__bunite:surface.setAllPassthrough",{passthrough:!0}).catch(()=>{})},!0),document.addEventListener("dragend",()=>{bunite.invoke("__bunite:surface.setAllPassthrough",{passthrough:!1}).catch(()=>{}),z()},!0)}var Z=(()=>{let z;return()=>{if(!z){let q=Uint8Array.from(atob(__buniteSecretKeyBase64),(J)=>J.charCodeAt(0));z=crypto.subtle.importKey("raw",q,"AES-GCM",!1,["encrypt","decrypt"])}return z}})();async function K(z){let q=await Z(),J=crypto.getRandomValues(new Uint8Array(12)),F=new Uint8Array(await crypto.subtle.encrypt({name:"AES-GCM",iv:J},q,z)),G=new Uint8Array(1+J.length+F.length);return G[0]=1,G.set(J,1),G.set(F,1+J.length),G}async function W(z){if(z.length<29)throw Error("Invalid bunite RPC frame.");if(z[0]!==1)throw Error("Unsupported bunite RPC frame version.");let q=await Z(),J=z.slice(1,13),F=z.slice(13);return new Uint8Array(await crypto.subtle.decrypt({name:"AES-GCM",iv:J},q,F))}function I(z){let q=[];function J(F){if(F===null||F===void 0)q.push(192);else if(F===!0)q.push(195);else if(F===!1)q.push(194);else if(typeof F==="number")if(Number.isInteger(F)&&F>=0&&F<128)q.push(F);else if(Number.isInteger(F)&&F>=-32&&F<0)q.push(F&255);else if(Number.isInteger(F)&&F>=0&&F<=65535)q.push(205,F>>8&255,F&255);else if(Number.isInteger(F)&&F>=0&&F<=4294967295)q.push(206,F>>24&255,F>>16&255,F>>8&255,F&255);else{let G=new ArrayBuffer(9),H=new DataView(G);H.setUint8(0,203),H.setFloat64(1,F);for(let M=0;M<9;M++)q.push(H.getUint8(M))}else if(typeof F==="string"){let G=new TextEncoder().encode(F);if(G.length<32)q.push(160|G.length);else if(G.length<256)q.push(217,G.length);else if(G.length<65536)q.push(218,G.length>>8&255,G.length&255);else q.push(219,G.length>>24&255,G.length>>16&255,G.length>>8&255,G.length&255);for(let H=0;H<G.length;H++)q.push(G[H])}else if(Array.isArray(F)){if(F.length<16)q.push(144|F.length);else if(F.length<65536)q.push(220,F.length>>8&255,F.length&255);else q.push(221,F.length>>24&255,F.length>>16&255,F.length>>8&255,F.length&255);F.forEach(J)}else if(typeof F==="object"){let G=Object.keys(F);if(G.length<16)q.push(128|G.length);else if(G.length<65536)q.push(222,G.length>>8&255,G.length&255);else q.push(223,G.length>>24&255,G.length>>16&255,G.length>>8&255,G.length&255);for(let H of G)J(H),J(F[H])}}return J(z),new Uint8Array(q)}function D(z){let q=0;function J(){let F=z[q++];if(F<=127)return F;if(F>=224)return F-256;if(F===192)return null;if(F===194)return!1;if(F===195)return!0;if(F===204)return z[q++];if(F===205){let G=z[q]<<8|z[q+1];return q+=2,G}if(F===206){let G=(z[q]<<24|z[q+1]<<16|z[q+2]<<8|z[q+3])>>>0;return q+=4,G}if(F===203){let G=new DataView(z.buffer,z.byteOffset+q,8);return q+=8,G.getFloat64(0)}if(F===208){let G=z[q++];return G>127?G-256:G}if(F===209){let G=z[q]<<8|z[q+1];return q+=2,G>32767?G-65536:G}if(F===210){let G=z[q]<<24|z[q+1]<<16|z[q+2]<<8|z[q+3];return q+=4,G}if((F&224)===160){let G=F&31,H=new TextDecoder().decode(z.subarray(q,q+G));return q+=G,H}if(F===217){let G=z[q++],H=new TextDecoder().decode(z.subarray(q,q+G));return q+=G,H}if(F===218){let G=z[q]<<8|z[q+1];q+=2;let H=new TextDecoder().decode(z.subarray(q,q+G));return q+=G,H}if(F===219){let G=(z[q]<<24|z[q+1]<<16|z[q+2]<<8|z[q+3])>>>0;q+=4;let H=new TextDecoder().decode(z.subarray(q,q+G));return q+=G,H}if((F&240)===144){let G=F&15,H=[];for(let M=0;M<G;M++)H.push(J());return H}if(F===220){let G=z[q]<<8|z[q+1];q+=2;let H=[];for(let M=0;M<G;M++)H.push(J());return H}if(F===221){let G=(z[q]<<24|z[q+1]<<16|z[q+2]<<8|z[q+3])>>>0;q+=4;let H=[];for(let M=0;M<G;M++)H.push(J());return H}if((F&240)===128){let G=F&15,H={};for(let M=0;M<G;M++)H[J()]=J();return H}if(F===222){let G=z[q]<<8|z[q+1];q+=2;let H={};for(let M=0;M<G;M++)H[J()]=J();return H}if(F===223){let G=(z[q]<<24|z[q+1]<<16|z[q+2]<<8|z[q+3])>>>0;q+=4;let H={};for(let M=0;M<G;M++)H[J()]=J();return H}if(F===196){let G=z[q++],H=z.slice(q,q+G);return q+=G,H}if(F===197){let G=z[q]<<8|z[q+1];q+=2;let H=z.slice(q,q+G);return q+=G,H}return}return J()}var N=window;N.__bunite??={};N.__buniteWebviewId=__buniteWebviewId;N.__buniteRpcSocketPort=__buniteRpcSocketPort;N.__bunite_encrypt=K;N.__bunite_decrypt=W;var R=new Map,U=new Map,Q=null,X=!1;function T(z){if(X)return;X=!0,z.addEventListener("message",async(q)=>{try{let J=await W(new Uint8Array(q.data)),F=D(J);if(F?.type==="response"&&F.scope==="global"){let G=U.get(F.id);if(G)U.delete(F.id),clearTimeout(G.timeout),F.success?G.resolve(F.payload):G.reject(Error(F.error||"Unknown error"))}else if(F?.type==="event"){let G=R.get(F.channel);if(G)for(let H of G)H(F.data)}}catch{}}),z.addEventListener("close",()=>{X=!1,Q=null})}function O(){let z=N.__bunite?._socket;if(z&&z.readyState<=WebSocket.OPEN&&z!==Q)return Q=z,T(z),z;if(Q&&Q.readyState<=WebSocket.OPEN)return Q;return Q=new WebSocket(`ws://localhost:${__buniteRpcSocketPort}/socket?webviewId=${__buniteWebviewId}`),Q.binaryType="arraybuffer",N.__bunite._socket=Q,T(Q),Q}N.bunite=N.__bunite;N.bunite.on=(z,q)=>{O();let J=R.get(z);if(!J)J=new Set,R.set(z,J);return J.add(q),()=>{J.delete(q)}};N.bunite.off=(z,q)=>{R.get(z)?.delete(q)};var S=1;N.bunite.invoke=(z,q)=>new Promise((J,F)=>{let G=O(),H=S++,M=setTimeout(()=>{U.delete(H),F(Error(`bunite.invoke timed out: ${z}`))},15000);U.set(H,{resolve:J,reject:F,timeout:M});let B={type:"request",id:H,method:z,params:q??null,scope:"global"},Y=async()=>{let A=await K(I(B));G.send(A.buffer)};if(G.readyState===WebSocket.OPEN)Y();else G.addEventListener("open",()=>Y(),{once:!0})});
1
+ var On=Symbol("CallDef"),Pn=Symbol("StreamDef"),Ep=Symbol("CapDef"),Hn=Symbol("CapRefToken"),Nn=Symbol("CapArrayToken"),vn=Symbol("CapRecordToken"),dm=Symbol("Schema");function Qe(e){return{[Hn]:!0,cap:e}}Qe.array=(e)=>({[Nn]:!0,cap:e});Qe.record=(e)=>({[vn]:!0,cap:e});var k=Qe;function re(e){return typeof e==="object"&&e!==null&&e[Hn]===!0}function le(e){return typeof e==="object"&&e!==null&&e[Nn]===!0}function de(e){return typeof e==="object"&&e!==null&&e[vn]===!0}function ye(e){return typeof e==="object"&&e!==null&&e[On]===!0}function Re(e){return typeof e==="object"&&e!==null&&e[Pn]===!0}function b(e){return{[On]:!0,idempotent:!!e?.idempotent,returns:e?.returns}}function Ie(e){return{[Pn]:!0,hint:e?.hint}}function W(e,n){return{[Ep]:!0,methods:e,disposal:n?.disposal??void 0}}var Ip=()=>{throw Error("schema.topologyHash bound after hash.ts import")};function Kn(e){Ip=e}function Gn(e){let n=new Map,p=[];for(let C of e.caps){if(n.has(C))continue;n.set(C,p.length),p.push(null)}let m=(C)=>{let r=n.get(C);if(r!==void 0)return r;let y=p.length;return n.set(C,y),p.push(null),y};for(let C=0;C<p.length;C++){if(p[C]!==null)continue;let r=e.caps[C];p[C]=Yn(r,m)}let o=Object.keys(e.roots).map((C)=>({name:C,capIndex:m(e.roots[C])}));for(let C=0;C<p.length;C++){if(p[C]!==null)continue;let r=[...n.keys()][C];p[C]=Yn(r,m)}return{v:1,roots:o,caps:p}}function Yn(e,n){let m={methods:Object.keys(e.methods).map((C)=>{let r=e.methods[C];if(ye(r))return{name:C,kind:"call",idempotent:r.idempotent,returns:Fp(r.returns,n)};if(Re(r))return{name:C,kind:"stream"};throw Error(`Unknown method def for "${C}"`)})},o=e.disposal;if(o)m.disposal={method:o.method,async:!!o.async};return m}function Fp(e,n){if(!e)return{kind:"type"};if(re(e))return{kind:"cap",capIndex:n(e.cap)};if(le(e))return{kind:"capArray",capIndex:n(e.cap)};if(de(e))return{kind:"capRecord",capIndex:n(e.cap)};return{kind:"type"}}function Ze(e){if(Array.isArray(e))return"["+e.map(Ze).join(",")+"]";if(e&&typeof e==="object")return"{"+Object.keys(e).sort().map((p)=>JSON.stringify(p)+":"+Ze(e[p])).join(",")+"}";return JSON.stringify(e)}async function Xn(e){let n=Gn(e),p=Ze(n),m=new TextEncoder().encode(p),o=await crypto.subtle.digest("SHA-256",m);return Mp(new Uint8Array(o))}function Mp(e){let n="";for(let p=0;p<e.length;p++)n+=e[p].toString(16).padStart(2,"0");return n}Kn(Xn);var We;try{We=new TextDecoder}catch(e){}var _,S,a=0;var jn=[],qe=jn,Se=0,H={},F,pe,q=0,z=0,U,g,L=[],E,$n={useRecords:!1,mapsAsObjects:!0};class Oe{}var Be=new Oe;Be.name="MessagePack 0xC1";var me=!1,Un=2,Ln,Qn,Zn;class V{constructor(e){if(e){if(e.useRecords===!1&&e.mapsAsObjects===void 0)e.mapsAsObjects=!0;if(e.sequential&&e.trusted!==!1){if(e.trusted=!0,!e.structures&&e.useRecords!=!1){if(e.structures=[],!e.maxSharedStructures)e.maxSharedStructures=0}}if(e.structures)e.structures.sharedLength=e.structures.length;else if(e.getStructures)(e.structures=[]).uninitialized=!0,e.structures.sharedLength=0;if(e.int64AsNumber)e.int64AsType="number"}Object.assign(this,e)}unpack(e,n){if(_)return pp(()=>{return Me(),this?this.unpack(e,n):V.prototype.unpack.call($n,e,n)});if(!e.buffer&&e.constructor===ArrayBuffer)e=typeof Buffer<"u"?Buffer.from(e):new Uint8Array(e);if(typeof n==="object")S=n.end||e.length,a=n.start||0;else a=0,S=n>-1?n:e.length;Se=0,z=0,pe=null,qe=jn,U=null,_=e;try{E=e.dataView||(e.dataView=new DataView(e.buffer,e.byteOffset,e.byteLength))}catch(p){if(_=null,e instanceof Uint8Array)throw p;throw Error("Source must be a Uint8Array or Buffer but was a "+(e&&typeof e=="object"?e.constructor.name:typeof e))}if(this instanceof V){if(H=this,this.structures)return F=this.structures,Fe(n);else if(!F||F.length>0)F=[]}else if(H=$n,!F||F.length>0)F=[];return Fe(n)}unpackMultiple(e,n){let p,m=0;try{me=!0;let o=e.length,C=this?this.unpack(e,o):He.unpack(e,o);if(n){if(n(C,m,a)===!1)return;while(a<o)if(m=a,n(Fe(),m,a)===!1)return}else{p=[C];while(a<o)m=a,p.push(Fe());return p}}catch(o){throw o.lastPosition=m,o.values=p,o}finally{me=!1,Me()}}_mergeStructures(e,n){if(Qn)e=Qn.call(this,e);if(e=e||[],Object.isFrozen(e))e=e.map((p)=>p.slice(0));for(let p=0,m=e.length;p<m;p++){let o=e[p];if(o){if(o.isShared=!0,p>=32)o.highByte=p-32>>5}}e.sharedLength=e.length;for(let p in n||[])if(p>=0){let m=e[p],o=n[p];if(o){if(m)(e.restoreStructures||(e.restoreStructures=[]))[p]=m;e[p]=o}}return this.structures=e}decode(e,n){return this.unpack(e,n)}}function Fe(e){try{if(!H.trusted&&!me){let p=F.sharedLength||0;if(p<F.length)F.length=p}let n;if(H.randomAccessStructure&&_[a]<64&&_[a]>=32&&Ln){if(n=Ln(_,a,S,H),_=null,!(e&&e.lazy)&&n)n=n.toJSON();a=S}else n=X();if(U)a=U.postBundlePosition,U=null;if(me)F.restoreStructures=null;if(a==S){if(F&&F.restoreStructures)kn();if(F=null,_=null,g)g=null}else if(a>S)throw Error("Unexpected end of MessagePack data");else if(!me){let p;try{p=JSON.stringify(n,(m,o)=>typeof o==="bigint"?`${o}n`:o).slice(0,100)}catch(m){p="(JSON view not available "+m+")"}throw Error("Data read, but end of buffer not reached "+p)}return n}catch(n){if(F&&F.restoreStructures)kn();if(Me(),n instanceof RangeError||n.message.startsWith("Unexpected end of buffer")||a>S)n.incomplete=!0;throw n}}function kn(){for(let e in F.restoreStructures)F[e]=F.restoreStructures[e];F.restoreStructures=null}function X(){let e=_[a++];if(e<160)if(e<128)if(e<64)return e;else{let n=F[e&63]||H.getStructures&&un()[e&63];if(n){if(!n.read)n.read=ze(n,e&63);return n.read()}else return e}else if(e<144)if(e-=128,H.mapsAsObjects){let n={};for(let p=0;p<e;p++){let m=ep();if(m==="__proto__")m="__proto_";n[m]=X()}return n}else{let n=new Map;for(let p=0;p<e;p++)n.set(X(),X());return n}else{e-=144;let n=Array(e);for(let p=0;p<e;p++)n[p]=X();if(H.freezeData)return Object.freeze(n);return n}else if(e<192){let n=e-160;if(z>=a)return pe.slice(a-q,(a+=n)-q);if(z==0&&S<140){let p=n<16?Ve(n):gn(n);if(p!=null)return p}return Je(n)}else{let n;switch(e){case 192:return null;case 193:if(U)if(n=X(),n>0)return U[1].slice(U.position1,U.position1+=n);else return U[0].slice(U.position0,U.position0-=n);return Be;case 194:return!1;case 195:return!0;case 196:if(n=_[a++],n===void 0)throw Error("Unexpected end of buffer");return ke(n);case 197:return n=E.getUint16(a),a+=2,ke(n);case 198:return n=E.getUint32(a),a+=4,ke(n);case 199:return ae(_[a++]);case 200:return n=E.getUint16(a),a+=2,ae(n);case 201:return n=E.getUint32(a),a+=4,ae(n);case 202:if(n=E.getFloat32(a),H.useFloat32>2){let p=Pe[(_[a]&127)<<1|_[a+1]>>7];return a+=4,(p*n+(n>0?0.5:-0.5)>>0)/p}return a+=4,n;case 203:return n=E.getFloat64(a),a+=8,n;case 204:return _[a++];case 205:return n=E.getUint16(a),a+=2,n;case 206:return n=E.getUint32(a),a+=4,n;case 207:if(H.int64AsType==="number")n=E.getUint32(a)*4294967296,n+=E.getUint32(a+4);else if(H.int64AsType==="string")n=E.getBigUint64(a).toString();else if(H.int64AsType==="auto"){if(n=E.getBigUint64(a),n<=BigInt(2)<<BigInt(52))n=Number(n)}else n=E.getBigUint64(a);return a+=8,n;case 208:return E.getInt8(a++);case 209:return n=E.getInt16(a),a+=2,n;case 210:return n=E.getInt32(a),a+=4,n;case 211:if(H.int64AsType==="number")n=E.getInt32(a)*4294967296,n+=E.getUint32(a+4);else if(H.int64AsType==="string")n=E.getBigInt64(a).toString();else if(H.int64AsType==="auto"){if(n=E.getBigInt64(a),n>=BigInt(-2)<<BigInt(52)&&n<=BigInt(2)<<BigInt(52))n=Number(n)}else n=E.getBigInt64(a);return a+=8,n;case 212:if(n=_[a++],n==114)return zn(_[a++]&63);else{let p=L[n];if(p)if(p.read)return a++,p.read(X());else if(p.noBuffer)return a++,p();else return p(_.subarray(a,++a));else throw Error("Unknown extension "+n)}case 213:if(n=_[a],n==114)return a++,zn(_[a++]&63,_[a++]);else return ae(2);case 214:return ae(4);case 215:return ae(8);case 216:return ae(16);case 217:if(n=_[a++],z>=a)return pe.slice(a-q,(a+=n)-q);return Pp(n);case 218:if(n=E.getUint16(a),a+=2,z>=a)return pe.slice(a-q,(a+=n)-q);return Hp(n);case 219:if(n=E.getUint32(a),a+=4,z>=a)return pe.slice(a-q,(a+=n)-q);return ip(n);case 220:return n=E.getUint16(a),a+=2,qn(n);case 221:return n=E.getUint32(a),a+=4,qn(n);case 222:return n=E.getUint16(a),a+=2,Sn(n);case 223:return n=E.getUint32(a),a+=4,Sn(n);default:if(e>=224)return e-256;if(e===void 0){let p=Error("Unexpected end of MessagePack data");throw p.incomplete=!0,p}throw Error("Unknown MessagePack token "+e)}}}var Op=/^[a-zA-Z_$][a-zA-Z\d_$]*$/;function ze(e,n){function p(){if(p.count++>Un){let o;try{o=e.read=Function("r","return function(){return "+(H.freezeData?"Object.freeze":"")+"({"+e.map((C)=>C==="__proto__"?"__proto_:r()":Op.test(C)?C+":r()":"["+JSON.stringify(C)+"]:r()").join(",")+"})}")(X)}catch(C){return Un=1/0,p()}if(e.highByte===0)e.read=Wn(n,e.read);return o()}let m={};for(let o=0,C=e.length;o<C;o++){let r=e[o];if(r==="__proto__")r="__proto_";m[r]=X()}if(H.freezeData)return Object.freeze(m);return m}if(p.count=0,e.highByte===0)return Wn(n,p);return p}var Wn=(e,n)=>{return function(){let p=_[a++];if(p===0)return n();let m=e<32?-(e+(p<<5)):e+(p<<5),o=F[m]||un()[m];if(!o)throw Error("Record id is not defined for "+m);if(!o.read)o.read=ze(o,e);return o.read()}};function un(){let e=pp(()=>{return _=null,H.getStructures()});return F=H._mergeStructures(e,F)}var Je=Te,Pp=Te,Hp=Te,ip=Te;function Te(e){let n;if(e<16){if(n=Ve(e))return n}if(e>64&&We)return We.decode(_.subarray(a,a+=e));let p=a+e,m=[];n="";while(a<p){let o=_[a++];if((o&128)===0)m.push(o);else if((o&224)===192){let C=_[a++]&63,r=(o&31)<<6|C;if(r<128)m.push(65533);else m.push(r)}else if((o&240)===224){let C=_[a++]&63,r=_[a++]&63,y=(o&31)<<12|C<<6|r;if(y<2048||y>=55296&&y<=57343)m.push(65533);else m.push(y)}else if((o&248)===240){let C=_[a++]&63,r=_[a++]&63,y=_[a++]&63,D=(o&7)<<18|C<<12|r<<6|y;if(D<65536||D>1114111)m.push(65533);else if(D>65535)D-=65536,m.push(D>>>10&1023|55296),D=56320|D&1023,m.push(D);else m.push(D)}else m.push(65533);if(m.length>=4096)n+=$.apply(String,m),m.length=0}if(m.length>0)n+=$.apply(String,m);return n}function qn(e){let n=Array(e);for(let p=0;p<e;p++)n[p]=X();if(H.freezeData)return Object.freeze(n);return n}function Sn(e){if(H.mapsAsObjects){let n={};for(let p=0;p<e;p++){let m=ep();if(m==="__proto__")m="__proto_";n[m]=X()}return n}else{let n=new Map;for(let p=0;p<e;p++)n.set(X(),X());return n}}var $=String.fromCharCode;function gn(e){let n=a,p=Array(e);for(let m=0;m<e;m++){let o=_[a++];if((o&128)>0){a=n;return}p[m]=o}return $.apply(String,p)}function Ve(e){if(e<4)if(e<2)if(e===0)return"";else{let n=_[a++];if((n&128)>1){a-=1;return}return $(n)}else{let n=_[a++],p=_[a++];if((n&128)>0||(p&128)>0){a-=2;return}if(e<3)return $(n,p);let m=_[a++];if((m&128)>0){a-=3;return}return $(n,p,m)}else{let n=_[a++],p=_[a++],m=_[a++],o=_[a++];if((n&128)>0||(p&128)>0||(m&128)>0||(o&128)>0){a-=4;return}if(e<6)if(e===4)return $(n,p,m,o);else{let C=_[a++];if((C&128)>0){a-=5;return}return $(n,p,m,o,C)}else if(e<8){let C=_[a++],r=_[a++];if((C&128)>0||(r&128)>0){a-=6;return}if(e<7)return $(n,p,m,o,C,r);let y=_[a++];if((y&128)>0){a-=7;return}return $(n,p,m,o,C,r,y)}else{let C=_[a++],r=_[a++],y=_[a++],D=_[a++];if((C&128)>0||(r&128)>0||(y&128)>0||(D&128)>0){a-=8;return}if(e<10)if(e===8)return $(n,p,m,o,C,r,y,D);else{let t=_[a++];if((t&128)>0){a-=9;return}return $(n,p,m,o,C,r,y,D,t)}else if(e<12){let t=_[a++],w=_[a++];if((t&128)>0||(w&128)>0){a-=10;return}if(e<11)return $(n,p,m,o,C,r,y,D,t,w);let I=_[a++];if((I&128)>0){a-=11;return}return $(n,p,m,o,C,r,y,D,t,w,I)}else{let t=_[a++],w=_[a++],I=_[a++],v=_[a++];if((t&128)>0||(w&128)>0||(I&128)>0||(v&128)>0){a-=12;return}if(e<14)if(e===12)return $(n,p,m,o,C,r,y,D,t,w,I,v);else{let G=_[a++];if((G&128)>0){a-=13;return}return $(n,p,m,o,C,r,y,D,t,w,I,v,G)}else{let G=_[a++],Z=_[a++];if((G&128)>0||(Z&128)>0){a-=14;return}if(e<15)return $(n,p,m,o,C,r,y,D,t,w,I,v,G,Z);let M=_[a++];if((M&128)>0){a-=15;return}return $(n,p,m,o,C,r,y,D,t,w,I,v,G,Z,M)}}}}}function Jn(){let e=_[a++],n;if(e<192)n=e-160;else switch(e){case 217:n=_[a++];break;case 218:n=E.getUint16(a),a+=2;break;case 219:n=E.getUint32(a),a+=4;break;default:throw Error("Expected string")}return Te(n)}function ke(e){return H.copyBuffers?Uint8Array.prototype.slice.call(_,a,a+=e):_.subarray(a,a+=e)}function ae(e){let n=_[a++];if(L[n]){let p;return L[n](_.subarray(a,p=a+=e),(m)=>{a=m;try{return X()}finally{a=p}})}else throw Error("Unknown extension type "+n)}var Bn=Array(4096);function ep(){let e=_[a++];if(e>=160&&e<192){if(e=e-160,z>=a)return pe.slice(a-q,(a+=e)-q);else if(!(z==0&&S<180))return Je(e)}else return a--,np(X());let n=(e<<5^(e>1?E.getUint16(a):e>0?_[a]:0))&4095,p=Bn[n],m=a,o=a+e-3,C,r=0;if(p&&p.bytes==e){while(m<o){if(C=E.getUint32(m),C!=p[r++]){m=1879048192;break}m+=4}o+=3;while(m<o)if(C=_[m++],C!=p[r++]){m=1879048192;break}if(m===o)return a=m,p.string;o-=3,m=a}p=[],Bn[n]=p,p.bytes=e;while(m<o)C=E.getUint32(m),p.push(C),m+=4;o+=3;while(m<o)C=_[m++],p.push(C);let y=e<16?Ve(e):gn(e);if(y!=null)return p.string=y;return p.string=Je(e)}function np(e){if(typeof e==="string")return e;if(typeof e==="number"||typeof e==="boolean"||typeof e==="bigint")return e.toString();if(e==null)return e+"";if(H.allowArraysInMapKeys&&Array.isArray(e)&&e.flat().every((n)=>["string","number","boolean","bigint"].includes(typeof n)))return e.flat().toString();throw Error(`Invalid property type for record: ${typeof e}`)}var zn=(e,n)=>{let p=X().map(np),m=e;if(n!==void 0)e=e<32?-((n<<5)+e):(n<<5)+e,p.highByte=n;let o=F[e];if(o&&(o.isShared||me))(F.restoreStructures||(F.restoreStructures=[]))[e]=o;return F[e]=p,p.read=ze(p,m),p.read()};L[0]=()=>{};L[0].noBuffer=!0;L[66]=(e)=>{let n=e.byteLength%8||8,p=BigInt(e[0]&128?e[0]-256:e[0]);for(let m=1;m<n;m++)p<<=BigInt(8),p+=BigInt(e[m]);if(e.byteLength!==n){let m=new DataView(e.buffer,e.byteOffset,e.byteLength),o=(C,r)=>{let y=r-C;if(y<=40){let I=m.getBigUint64(C);for(let v=C+8;v<r;v+=8)I<<=BigInt(64),I|=m.getBigUint64(v);return I}let D=C+(y>>4<<3),t=o(C,D),w=o(D,r);return t<<BigInt((r-D)*8)|w};p=p<<BigInt((m.byteLength-n)*8)|o(n,m.byteLength)}return p};var Vn={Error,EvalError,RangeError,ReferenceError,SyntaxError,TypeError,URIError,AggregateError:typeof AggregateError==="function"?AggregateError:null};L[101]=()=>{let e=X();if(!Vn[e[0]]){let n=Error(e[1],{cause:e[2]});return n.name=e[0],n}return Vn[e[0]](e[1],{cause:e[2]})};L[105]=(e)=>{if(H.structuredClone===!1)throw Error("Structured clone extension is disabled");let n=E.getUint32(a-4);if(!g)g=new Map;let p=_[a],m;if(p>=144&&p<160||p==220||p==221)m=[];else if(p>=128&&p<144||p==222||p==223)m=new Map;else if((p>=199&&p<=201||p>=212&&p<=216)&&_[a+1]===115)m=new Set;else m={};let o={target:m};g.set(n,o);let C=X();if(!o.used)return o.target=C;else Object.assign(m,C);if(m instanceof Map)for(let[r,y]of C.entries())m.set(r,y);if(m instanceof Set)for(let r of Array.from(C))m.add(r);return m};L[112]=(e)=>{if(H.structuredClone===!1)throw Error("Structured clone extension is disabled");let n=E.getUint32(a-4),p=g.get(n);return p.used=!0,p.target};L[115]=()=>new Set(X());var je=["Int8","Uint8","Uint8Clamped","Int16","Uint16","Int32","Uint32","Float32","Float64","BigInt64","BigUint64"].map((e)=>e+"Array"),Np=typeof globalThis==="object"?globalThis:window;L[116]=(e)=>{let n=e[0],p=Uint8Array.prototype.slice.call(e,1).buffer,m=je[n];if(!m){if(n===16)return p;if(n===17)return new DataView(p);throw Error("Could not find typed array for code "+n)}return new Np[m](p)};L[120]=()=>{let e=X();return new RegExp(e[0],e[1])};var vp=[];L[98]=(e)=>{let n=(e[0]<<24)+(e[1]<<16)+(e[2]<<8)+e[3],p=a;return a+=n-e.length,U=vp,U=[Jn(),Jn()],U.position0=0,U.position1=0,U.postBundlePosition=a,a=p,X()};L[255]=(e)=>{if(e.length==4)return new Date((e[0]*16777216+(e[1]<<16)+(e[2]<<8)+e[3])*1000);else if(e.length==8)return new Date(((e[0]<<22)+(e[1]<<14)+(e[2]<<6)+(e[3]>>2))/1e6+((e[3]&3)*4294967296+e[4]*16777216+(e[5]<<16)+(e[6]<<8)+e[7])*1000);else if(e.length==12)return new Date(((e[0]<<24)+(e[1]<<16)+(e[2]<<8)+e[3])/1e6+((e[4]&128?-281474976710656:0)+e[6]*1099511627776+e[7]*4294967296+e[8]*16777216+(e[9]<<16)+(e[10]<<8)+e[11])*1000);else return new Date("invalid")};function pp(e){if(Zn)Zn();let n=S,p=a,m=Se,o=q,C=z,r=pe,y=qe,D=g,t=U,w=new Uint8Array(_.slice(0,S)),I=F,v=F.slice(0,F.length),G=H,Z=me,M=e();return S=n,a=p,Se=m,q=o,z=C,pe=r,qe=y,g=D,U=t,_=w,me=Z,F=I,F.splice(0,F.length,...v),H=G,E=new DataView(_.buffer,_.byteOffset,_.byteLength),M}function Me(){_=null,g=null,F=null}function mp(e){if(e.unpack)L[e.type]=e.unpack;else L[e.type]=e}var Pe=Array(147);for(let e=0;e<256;e++)Pe[e]=+("1e"+Math.floor(45.15-e*0.30103));var He=new V({useRecords:!1}),Kp=He.unpack,Yp=He.unpackMultiple,Gp=He.unpack;var Xp=new Float32Array(1),xm=new Uint8Array(Xp.buffer,0,4);var Ne;try{Ne=new TextEncoder}catch(e){}var ve,Ke,xe=typeof Buffer<"u",ie=xe?function(e){return Buffer.allocUnsafeSlow(e)}:Uint8Array,rp=xe?Buffer:Uint8Array,op=xe?4294967296:2144337920,l,we,i,f=0,Q,Y=null,$p,Up=21760,Lp=/[\u0080-\uFFFF]/,se=Symbol("record-id");class _e extends V{constructor(e){super(e);this.offset=0;let n,p,m,o,C,r=rp.prototype.utf8Write?function(d,T){return l.utf8Write(d,T,l.byteLength-T)}:Ne&&Ne.encodeInto?function(d,T){return Ne.encodeInto(d,l.subarray(T)).written}:!1,y=this;if(!e)e={};let D=e&&e.sequential,t=e.structures||e.saveStructures,w=e.maxSharedStructures;if(w==null)w=t?32:0;if(w>8160)throw Error("Maximum maxSharedStructure is 8160");if(e.structuredClone&&e.moreTypes==null)this.moreTypes=!0;let I=e.maxOwnStructures;if(I==null)I=t?32:64;if(!this.structures&&e.useRecords!=!1)this.structures=[];let v=w>32||I+w>64,G=w+64,Z=w+I+64;if(Z>8256)throw Error("Maximum maxSharedStructure + maxOwnStructure is 8192");let M=[],ee=0,fe=0;this.pack=this.encode=function(d,T){if(!l)l=new ie(8192),i=l.dataView||(l.dataView=new DataView(l.buffer,0,8192)),f=0;if(Q=l.length-10,Q-f<2048)l=new ie(l.length),i=l.dataView||(l.dataView=new DataView(l.buffer,0,l.length)),Q=l.length-10,f=0;else f=f+7&2147483640;if(p=f,T&Rp)f+=T&255;if(C=y.structuredClone?new Map:null,y.bundleStrings&&typeof d!=="string")Y=[],Y.size=1/0;else Y=null;if(o=y.structures,o){if(o.uninitialized)o=y._mergeStructures(y.getStructures());let R=o.sharedLength||0;if(R>w)throw Error("Shared structures is larger than maximum shared structures, try increasing maxSharedStructures to "+o.sharedLength);if(!o.transitions){o.transitions=Object.create(null);for(let s=0;s<R;s++){let c=o[s];if(!c)continue;let h,A=o.transitions;for(let O=0,P=c.length;O<P;O++){let B=c[O];if(h=A[B],!h)h=A[B]=Object.create(null);A=h}A[se]=s+64}this.lastNamedStructuresLength=R}if(!D)o.nextId=R+64}if(m)m=!1;let x;try{if(y.randomAccessStructure&&d&&typeof d==="object")if(d.constructor===Object)Mn(d);else if(d.constructor!==Map&&!Array.isArray(d)&&!Ke.some((s)=>d instanceof s))Mn(d.toJSON?d.toJSON():d);else K(d);else K(d);let R=Y;if(Y)ap(p,K,0);if(C&&C.idsToInsert){let s=C.idsToInsert.sort((O,P)=>O.offset>P.offset?1:-1),c=s.length,h=-1;while(R&&c>0){let O=s[--c].offset+p;if(O<R.stringsPosition+p&&h===-1)h=0;if(O>R.position+p){if(h>=0)h+=6}else{if(h>=0)i.setUint32(R.position+p,i.getUint32(R.position+p)+h),h=-1;R=R.previous,c++}}if(h>=0&&R)i.setUint32(R.position+p,i.getUint32(R.position+p)+h);if(f+=s.length*6,f>Q)u(f);y.offset=f;let A=Qp(l.subarray(p,f),s);return C=null,A}if(y.offset=f,T&dp)return l.start=p,l.end=f,l;return l.subarray(p,f)}catch(R){throw x=R,R}finally{if(o){if(bn(),m&&y.saveStructures){let R=o.sharedLength||0,s=l.subarray(p,f),c=Zp(o,y);if(!x){if(y.saveStructures(c,c.isCompatible)===!1)return y.pack(d,T);if(y.lastNamedStructuresLength=R,l.length>1073741824)l=null;return s}}}if(l.length>1073741824)l=null;if(T&yp)f=p}};let bn=()=>{if(fe<10)fe++;let d=o.sharedLength||0;if(o.length>d&&!D)o.length=d;if(ee>1e4){if(o.transitions=null,fe=0,ee=0,M.length>0)M=[]}else if(M.length>0&&!D){for(let T=0,x=M.length;T<x;T++)M[T][se]=0;M=[]}},Ue=(d)=>{var T=d.length;if(T<16)l[f++]=144|T;else if(T<65536)l[f++]=220,l[f++]=T>>8,l[f++]=T&255;else l[f++]=221,i.setUint32(f,T),f+=4;for(let x=0;x<T;x++)K(d[x])},K=(d)=>{if(f>Q)l=u(f);var T=typeof d,x;if(T==="string"){let R=d.length;if(Y&&R>=4&&R<4096){if((Y.size+=R)>Up){let A,O=(Y[0]?Y[0].length*3+Y[1].length:0)+10;if(f+O>Q)l=u(f+O);let P;if(Y.position)P=Y,l[f]=200,f+=3,l[f++]=98,A=f-p,f+=4,ap(p,K,0),i.setUint16(A+p-3,f-p-A);else l[f++]=214,l[f++]=98,A=f-p,f+=4;Y=["",""],Y.previous=P,Y.size=0,Y.position=A}let h=Lp.test(d);Y[h?0:1]+=d,l[f++]=193,K(h?-R:R);return}let s;if(R<32)s=1;else if(R<256)s=2;else if(R<65536)s=3;else s=5;let c=R*3;if(f+c>Q)l=u(f+c);if(R<64||!r){let h,A,O,P=f+s;for(h=0;h<R;h++)if(A=d.charCodeAt(h),A<128)l[P++]=A;else if(A<2048)l[P++]=A>>6|192,l[P++]=A&63|128;else if((A&64512)===55296&&((O=d.charCodeAt(h+1))&64512)===56320)A=65536+((A&1023)<<10)+(O&1023),h++,l[P++]=A>>18|240,l[P++]=A>>12&63|128,l[P++]=A>>6&63|128,l[P++]=A&63|128;else l[P++]=A>>12|224,l[P++]=A>>6&63|128,l[P++]=A&63|128;x=P-f-s}else x=r(d,f+s);if(x<32)l[f++]=160|x;else if(x<256){if(s<2)l.copyWithin(f+2,f+1,f+1+x);l[f++]=217,l[f++]=x}else if(x<65536){if(s<3)l.copyWithin(f+3,f+2,f+2+x);l[f++]=218,l[f++]=x>>8,l[f++]=x&255}else{if(s<5)l.copyWithin(f+5,f+3,f+3+x);l[f++]=219,i.setUint32(f,x),f+=4}f+=x}else if(T==="number")if(d>>>0===d)if(d<32||d<128&&this.useRecords===!1||d<64&&!this.randomAccessStructure)l[f++]=d;else if(d<256)l[f++]=204,l[f++]=d;else if(d<65536)l[f++]=205,l[f++]=d>>8,l[f++]=d&255;else l[f++]=206,i.setUint32(f,d),f+=4;else if(d>>0===d)if(d>=-32)l[f++]=256+d;else if(d>=-128)l[f++]=208,l[f++]=d+256;else if(d>=-32768)l[f++]=209,i.setInt16(f,d),f+=2;else l[f++]=210,i.setInt32(f,d),f+=4;else{let R;if((R=this.useFloat32)>0&&d<4294967296&&d>=-2147483648){l[f++]=202,i.setFloat32(f,d);let s;if(R<4||(s=d*Pe[(l[f]&127)<<1|l[f+1]>>7])>>0===s){f+=4;return}else f--}l[f++]=203,i.setFloat64(f,d),f+=8}else if(T==="object"||T==="function")if(!d)l[f++]=192;else{if(C){let s=C.get(d);if(s){if(!s.id){let c=C.idsToInsert||(C.idsToInsert=[]);s.id=c.push(s)}l[f++]=214,l[f++]=112,i.setUint32(f,s.id),f+=4;return}else C.set(d,{offset:f-p})}let R=d.constructor;if(R===Object)Ee(d);else if(R===Array)Ue(d);else if(R===Map)if(this.mapAsEmptyObject)l[f++]=128;else{if(x=d.size,x<16)l[f++]=128|x;else if(x<65536)l[f++]=222,l[f++]=x>>8,l[f++]=x&255;else l[f++]=223,i.setUint32(f,x),f+=4;for(let[s,c]of d)K(s),K(c)}else{for(let s=0,c=ve.length;s<c;s++){let h=Ke[s];if(d instanceof h){let A=ve[s];if(A.write){if(A.type)l[f++]=212,l[f++]=A.type,l[f++]=0;let De=A.write.call(this,d);if(De===d)if(Array.isArray(d))Ue(d);else Ee(d);else K(De);return}let O=l,P=i,B=f;l=null;let ne;try{ne=A.pack.call(this,d,(De)=>{if(l=O,O=null,f+=De,f>Q)u(f);return{target:l,targetView:i,position:f-De}},K)}finally{if(O)l=O,i=P,f=B,Q=l.length-10}if(ne){if(ne.length+f>Q)u(ne.length+f);f=Cp(ne,l,f,A.type)}return}}if(Array.isArray(d))Ue(d);else{if(d.toJSON){let s=d.toJSON();if(s!==d)return K(s)}if(T==="function")return K(this.writeFunction&&this.writeFunction(d));Ee(d)}}}else if(T==="boolean")l[f++]=d?195:194;else if(T==="bigint"){if(d<9223372036854776000&&d>=-9223372036854776000)l[f++]=211,i.setBigInt64(f,d);else if(d<18446744073709552000&&d>0)l[f++]=207,i.setBigUint64(f,d);else if(this.largeBigIntToFloat)l[f++]=203,i.setFloat64(f,Number(d));else if(this.largeBigIntToString)return K(d.toString());else if(this.useBigIntExtension||this.moreTypes){let R=d<0?BigInt(-1):BigInt(0),s;if(d>>BigInt(65536)===R){let c=BigInt(18446744073709552000)-BigInt(1),h=[];while(!0){if(h.push(d&c),d>>BigInt(63)===R)break;d>>=BigInt(64)}s=new Uint8Array(new BigUint64Array(h).buffer),s.reverse()}else{let c=d<0,h=(c?~d:d).toString(16);if(h.length%2)h="0"+h;else if(parseInt(h.charAt(0),16)>=8)h="00"+h;if(xe)s=Buffer.from(h,"hex");else{s=new Uint8Array(h.length/2);for(let A=0;A<s.length;A++)s[A]=parseInt(h.slice(A*2,A*2+2),16)}if(c)for(let A=0;A<s.length;A++)s[A]=~s[A]}if(s.length+f>Q)u(s.length+f);f=Cp(s,l,f,66);return}else throw RangeError(d+" was too large to fit in MessagePack 64-bit integer format, use useBigIntExtension, or set largeBigIntToFloat to convert to float-64, or set largeBigIntToString to convert to string");f+=8}else if(T==="undefined")if(this.encodeUndefinedAsNil)l[f++]=192;else l[f++]=212,l[f++]=0,l[f++]=0;else throw Error("Unknown type: "+T)},tn=this.variableMapSize||this.coercibleKeyAsNumber||this.skipValues?(d)=>{let T;if(this.skipValues){T=[];for(let s in d)if((typeof d.hasOwnProperty!=="function"||d.hasOwnProperty(s))&&!this.skipValues.includes(d[s]))T.push(s)}else T=Object.keys(d);let x=T.length;if(x<16)l[f++]=128|x;else if(x<65536)l[f++]=222,l[f++]=x>>8,l[f++]=x&255;else l[f++]=223,i.setUint32(f,x),f+=4;let R;if(this.coercibleKeyAsNumber)for(let s=0;s<x;s++){R=T[s];let c=Number(R);K(isNaN(c)?R:c),K(d[R])}else for(let s=0;s<x;s++)K(R=T[s]),K(d[R])}:(d)=>{l[f++]=222;let T=f-p;f+=2;let x=0;for(let R in d)if(typeof d.hasOwnProperty!=="function"||d.hasOwnProperty(R))K(R),K(d[R]),x++;if(x>65535)throw Error('Object is too large to serialize with fast 16-bit map size, use the "variableMapSize" option to serialize this object');l[T+++p]=x>>8,l[T+p]=x&255},En=this.useRecords===!1?tn:e.progressiveRecords&&!v?(d)=>{let T,x=o.transitions||(o.transitions=Object.create(null)),R=f++-p,s;for(let c in d)if(typeof d.hasOwnProperty!=="function"||d.hasOwnProperty(c)){if(T=x[c],T)x=T;else{let h=Object.keys(d),A=x;x=o.transitions;let O=0;for(let P=0,B=h.length;P<B;P++){let ne=h[P];if(T=x[ne],!T)T=x[ne]=Object.create(null),O++;x=T}if(R+p+1==f)f--,Le(x,h,O);else Fn(x,h,R,O);s=!0,x=A[c]}K(d[c])}if(!s){let c=x[se];if(c)l[R+p]=c;else Fn(x,Object.keys(d),R,0)}}:(d)=>{let T,x=o.transitions||(o.transitions=Object.create(null)),R=0;for(let c in d)if(typeof d.hasOwnProperty!=="function"||d.hasOwnProperty(c)){if(T=x[c],!T)T=x[c]=Object.create(null),R++;x=T}let s=x[se];if(s)if(s>=96&&v)l[f++]=((s-=96)&31)+96,l[f++]=s>>5;else l[f++]=s;else Le(x,x.__keys__||Object.keys(d),R);for(let c in d)if(typeof d.hasOwnProperty!=="function"||d.hasOwnProperty(c))K(d[c])},In=typeof this.useRecords=="function"&&this.useRecords,Ee=In?(d)=>{In(d)?En(d):tn(d)}:En,u=(d)=>{let T;if(d>16777216){if(d-p>op)throw Error("Packed buffer would be larger than maximum buffer size");T=Math.min(op,Math.round(Math.max((d-p)*(d>67108864?1.25:2),4194304)/4096)*4096)}else T=(Math.max(d-p<<2,l.length-1)>>12)+1<<12;let x=new ie(T);if(i=x.dataView||(x.dataView=new DataView(x.buffer,0,T)),d=Math.min(d,l.length),l.copy)l.copy(x,0,p,d);else x.set(l.slice(p,d));return f-=p,p=0,Q=x.length-10,l=x},Le=(d,T,x)=>{let R=o.nextId;if(!R)R=64;if(R<G&&this.shouldShareStructure&&!this.shouldShareStructure(T)){if(R=o.nextOwnId,!(R<Z))R=G;o.nextOwnId=R+1}else{if(R>=Z)R=G;o.nextId=R+1}let s=T.highByte=R>=96&&v?R-96>>5:-1;if(d[se]=R,d.__keys__=T,o[R-64]=T,R<G)if(T.isShared=!0,o.sharedLength=R-63,m=!0,s>=0)l[f++]=(R&31)+96,l[f++]=s;else l[f++]=R;else{if(s>=0)l[f++]=213,l[f++]=114,l[f++]=(R&31)+96,l[f++]=s;else l[f++]=212,l[f++]=114,l[f++]=R;if(x)ee+=fe*x;if(M.length>=I)M.shift()[se]=0;M.push(d),K(T)}},Fn=(d,T,x,R)=>{let s=l,c=f,h=Q,A=p;if(l=we,f=0,p=0,!l)we=l=new ie(8192);Q=l.length-10,Le(d,T,R),we=l;let O=f;if(l=s,f=c,Q=h,p=A,O>1){let P=f+O-1;if(P>Q)u(P);let B=x+p;l.copyWithin(B+O,B+1,f),l.set(we.slice(0,O),B),f=P}else l[x+p]=we[0]},Mn=(d)=>{let T=$p(d,l,p,f,o,u,(x,R,s)=>{if(s)return m=!0;f=R;let c=l;if(K(x),bn(),c!==l)return{position:f,targetView:i,target:l};return f},this);if(T===0)return Ee(d);f=T}}useBuffer(e){l=e,l.dataView||(l.dataView=new DataView(l.buffer,l.byteOffset,l.byteLength)),i=l.dataView,f=0}set position(e){f=e}get position(){return f}clearSharedData(){if(this.structures)this.structures=[];if(this.typedStructs)this.typedStructs=[]}}Ke=[Date,Set,Error,RegExp,ArrayBuffer,Object.getPrototypeOf(Uint8Array.prototype).constructor,DataView,Oe];ve=[{pack(e,n,p){let m=e.getTime()/1000;if((this.useTimestamp32||e.getMilliseconds()===0)&&m>=0&&m<4294967296){let{target:o,targetView:C,position:r}=n(6);o[r++]=214,o[r++]=255,C.setUint32(r,m)}else if(m>0&&m<4294967296){let{target:o,targetView:C,position:r}=n(10);o[r++]=215,o[r++]=255,C.setUint32(r,e.getMilliseconds()*4000000+(m/1000/4294967296>>0)),C.setUint32(r+4,m)}else if(isNaN(m)){if(this.onInvalidDate)return n(0),p(this.onInvalidDate());let{target:o,targetView:C,position:r}=n(3);o[r++]=212,o[r++]=255,o[r++]=255}else{let{target:o,targetView:C,position:r}=n(15);o[r++]=199,o[r++]=12,o[r++]=255,C.setUint32(r,e.getMilliseconds()*1e6),C.setBigInt64(r+4,BigInt(Math.floor(m)))}}},{pack(e,n,p){if(this.setAsEmptyObject)return n(0),p({});let m=Array.from(e),{target:o,position:C}=n(this.moreTypes?3:0);if(this.moreTypes)o[C++]=212,o[C++]=115,o[C++]=0;p(m)}},{pack(e,n,p){let{target:m,position:o}=n(this.moreTypes?3:0);if(this.moreTypes)m[o++]=212,m[o++]=101,m[o++]=0;p([e.name,e.message,e.cause])}},{pack(e,n,p){let{target:m,position:o}=n(this.moreTypes?3:0);if(this.moreTypes)m[o++]=212,m[o++]=120,m[o++]=0;p([e.source,e.flags])}},{pack(e,n){if(this.moreTypes)ue(e,16,n);else ge(xe?Buffer.from(e):new Uint8Array(e),n)}},{pack(e,n){let p=e.constructor;if(p!==rp&&this.moreTypes)ue(e,je.indexOf(p.name),n);else ge(e,n)}},{pack(e,n){if(this.moreTypes)ue(e,17,n);else ge(xe?Buffer.from(e):new Uint8Array(e),n)}},{pack(e,n){let{target:p,position:m}=n(1);p[m]=193}}];function ue(e,n,p,m){let o=e.byteLength;if(o+1<256){var{target:C,position:r}=p(4+o);C[r++]=199,C[r++]=o+1}else if(o+1<65536){var{target:C,position:r}=p(5+o);C[r++]=200,C[r++]=o+1>>8,C[r++]=o+1&255}else{var{target:C,position:r,targetView:y}=p(7+o);C[r++]=201,y.setUint32(r,o+1),r+=4}if(C[r++]=116,C[r++]=n,!e.buffer)e=new Uint8Array(e);C.set(new Uint8Array(e.buffer,e.byteOffset,e.byteLength),r)}function ge(e,n){let p=e.byteLength;var m,o;if(p<256){var{target:m,position:o}=n(p+2);m[o++]=196,m[o++]=p}else if(p<65536){var{target:m,position:o}=n(p+3);m[o++]=197,m[o++]=p>>8,m[o++]=p&255}else{var{target:m,position:o,targetView:C}=n(p+5);m[o++]=198,C.setUint32(o,p),o+=4}m.set(e,o)}function Cp(e,n,p,m){let o=e.length;switch(o){case 1:n[p++]=212;break;case 2:n[p++]=213;break;case 4:n[p++]=214;break;case 8:n[p++]=215;break;case 16:n[p++]=216;break;default:if(o<256)n[p++]=199,n[p++]=o;else if(o<65536)n[p++]=200,n[p++]=o>>8,n[p++]=o&255;else n[p++]=201,n[p++]=o>>24,n[p++]=o>>16&255,n[p++]=o>>8&255,n[p++]=o&255}return n[p++]=m,n.set(e,p),p+=o,p}function Qp(e,n){let p,m=n.length*6,o=e.length-m;while(p=n.pop()){let{offset:C,id:r}=p;e.copyWithin(C+m,C,o),m-=6;let y=C+m;e[y++]=214,e[y++]=105,e[y++]=r>>24,e[y++]=r>>16&255,e[y++]=r>>8&255,e[y++]=r&255,o=C}return e}function ap(e,n,p){if(Y.length>0){i.setUint32(Y.position+e,f+p-Y.position-e),Y.stringsPosition=f-e;let m=Y;Y=null,n(m[0]),n(m[1])}}function en(e){if(e.Class){if(!e.pack&&!e.write)throw Error("Extension has no pack or write function");if(e.pack&&!e.type)throw Error("Extension has no type (numeric code to identify the extension)");Ke.unshift(e.Class),ve.unshift(e)}mp(e)}function Zp(e,n){return e.isCompatible=(p)=>{let m=!p||(n.lastNamedStructuresLength||0)===p.length;if(!m)n._mergeStructures(p);return m},e}var lp=new _e({useRecords:!1}),kp=lp.pack,Wp=lp.pack;var dp=512,yp=1024,Rp=2048;var xp=80;class j{capId;constructor(e){this.capId=e}}var qp=new Set(["hello","goaway","call","result","cancel","stream","drop"]);function nn(e){if(typeof e!=="object"||e===null)return!1;let n=e,p=n.op;if(typeof p!=="string"||!qp.has(p))return!1;switch(p){case"hello":return n.v===1&&(n.mode==="native"||n.mode==="web")&&Array.isArray(n.features)&&typeof n.maxBytes==="number"&&typeof n.origin==="string";case"goaway":return n.reason===void 0||typeof n.reason==="string";case"call":return typeof n.id==="number"&&typeof n.method==="number"&&typeof n.target==="object"&&n.target!==null&&n.target.kind==="cap"&&typeof n.target.id==="number";case"result":return typeof n.id==="number"&&(n.ok===!0||n.ok===!1);case"cancel":return typeof n.id==="number";case"stream":return typeof n.id==="number"&&typeof n.ev==="string"&&(n.ev==="next"||n.ev==="credit"||n.ev==="end"||n.ev==="error");case"drop":return Array.isArray(n.caps)}}var sp=!1;function Sp(){if(sp)return;sp=!0,en({Class:j,type:xp,pack:(e)=>Jp(e.capId),unpack:(e)=>new j(zp(e))})}function pn(){return Sp(),{packr:new _e({useRecords:!0,sequential:!0,moreTypes:!0}),unpackr:new V({useRecords:!0,sequential:!0,moreTypes:!0})}}function Jp(e){let n=new Uint8Array(5),p=e>>>0,m=0;while(p>=128)n[m++]=p&127|128,p>>>=7;return n[m++]=p&127,n.subarray(0,m)}var Bp=5;function zp(e){let n=0,p=0,m=Math.min(e.length,Bp);for(let o=0;o<m;o++){let C=e[o];if(n|=(C&127)<<p,(C&128)===0)return n>>>0;p+=7}throw Error("Truncated or oversize varuint")}var mn=67108864,on=1;class N extends Error{code;details;retry;constructor(e){super(e.message??e.code);this.name="IpcError",this.code=e.code,this.details=e.details,this.retry=e.retry}toStatus(){return{code:this.code,message:this.message,details:this.details,retry:this.retry}}}var Ye=W({focus:b(),close:b(),setBounds:b(),setTitle:b(),id:b({idempotent:!0}),label:b({idempotent:!0})}),Cn=W({create:b({returns:k(Ye)}),list:b({returns:k.array(Ye),idempotent:!0}),focus:b(),close:b()}),Ge=W({text:b({idempotent:!0}),bytes:b({idempotent:!0}),path:b({idempotent:!0}),revoke:b()},{disposal:{method:"revoke",async:!0}}),an=W({openFile:b({returns:k.array(Ge)}),saveFile:b({returns:k(Ge)}),showMessage:b()}),fn=W({readText:b({idempotent:!0}),writeText:b(),readBytes:b({idempotent:!0}),writeBytes:b()}),rn=W({openExternal:b(),showItemInFolder:b()}),ln=W({init:b(),resize:b(),remove:b(),setHidden:b(),setMasks:b(),setAllPassthrough:b(),bringAllVisiblesToFront:b(),navigate:b(),goBack:b(),reload:b(),didNavigate:Ie()}),Ae=W({window:b({returns:k(Cn),idempotent:!0}),dialogs:b({returns:k(an),idempotent:!0}),clipboard:b({returns:k(fn),idempotent:!0}),shell:b({returns:k(rn),idempotent:!0}),appName:b({idempotent:!0}),appVersion:b({idempotent:!0}),theme:b({idempotent:!0}),themeWatch:Ie(),surface:b({returns:k(ln),idempotent:!0})}),oe={Runtime:1,Window:2,Dialogs:3,FileRef:4,Clipboard:5,Shell:6,BrowserWindow:7},Vp=new Map([[Ae,oe.Runtime],[Cn,oe.Window],[an,oe.Dialogs],[Ge,oe.FileRef],[fn,oe.Clipboard],[rn,oe.Shell],[Ye,oe.BrowserWindow],[ln,8]]);function _p(e){return Vp.get(e)}var ce=0,yn=1,wp=0,Ap=1,he=2,cp=128,sn=1024,jp=500,up=32,gp=8,em=1024;function nm(e){let n=e?.initialBudget;if(typeof n!=="number"||!Number.isFinite(n)||!Number.isInteger(n)||n<1)return up;return Math.min(n,em)}var Xe=null;class xn{entries=new Map;nextCapId=he;capLimit;constructor(e=sn){this.capLimit=e}install(e,n){if(this.entries.has(e))throw Error(`cap-id ${e} already installed`);let p={capId:e,...n};return this.entries.set(e,p),p}allocate(e){if(this.entries.size>=this.capLimit)throw new N({code:"resource_exhausted",message:`cap-table limit ${this.capLimit}`});let n=this.nextCapId++;while(this.entries.has(n))n=this.nextCapId++;return this.install(n,e)}get(e){return this.entries.get(e)}release(e,n=1){let p=this.entries.get(e);if(!p)return!1;if(p.refCount=Math.max(0,p.refCount-n),p.refCount===0&&e>=he)return this.entries.delete(e),!0;return!1}clear(){this.entries.clear(),this.nextCapId=he}size(){return this.entries.size}values(){return this.entries.values()}}var pm={origin:"bunite://internal",topOrigin:"bunite://internal",partition:"default",isAppRes:!0,isMainFrame:!0,userGesture:!1,level:"app-internal"},Rn=Symbol("bunite.rpc.ExportedCap"),Dp=Symbol("bunite.rpc.CapProxyMeta");function mm(e){return typeof e==="object"&&e!==null&&e[Rn]===!0}var om=typeof FinalizationRegistry<"u"?new FinalizationRegistry((e)=>{if(e.dropped())return;let n=e.connRef.deref();if(!n||n.closed)return;n._dropFromFinalizer(e.capId)}):{register:()=>{}};class hp{transport;capTable;pending=new Map;clientStreams=new Map;serverStreams=new Map;serverCallChildren=new Map;serverActiveCalls=new Map;rootInstances=new Map;userRootsSchema=null;closeHandlers=new Set;nextCallId=1;remoteHello=null;remoteReady;resolveRemoteReady;rejectRemoteReady;closed_=!1;maxBytes;mode;origin;features;attestation;peerId;constructor(e){this.transport=e.transport,this.mode=e.mode,this.origin=e.origin,this.features=e.features??[],this.maxBytes=e.maxBytes??mn,this.attestation=e.attestation??pm,this.peerId=e.peerId??"peer",this.capTable=new xn(e.capLimit??sn),this.capTable.install(ce,{typeId:wp,cap:null,impl:null,refCount:1}),this.capTable.install(yn,{typeId:Ap,cap:Ae,impl:e.runtime??null,refCount:1}),this.remoteReady=new Promise((n,p)=>{this.resolveRemoteReady=n,this.rejectRemoteReady=p}),this.remoteReady.catch(()=>{}),this.transport.setReceive((n)=>this.handleFrame(n)),this.transport.send({op:"hello",v:on,mode:this.mode,features:this.features,maxBytes:this.maxBytes,origin:this.origin})}get closed(){return this.closed_}onClose(e){return this.closeHandlers.add(e),()=>this.closeHandlers.delete(e)}serve(e){let n=this.capTable.get(ce);if(!n)throw Error("UserRoots slot missing");this.rootInstances.clear(),this.userRootsSchema=e.schema;let p=this.buildUserRootsCap(e.schema,e.impls);n.cap=p.def,n.impl=p.impl}buildUserRootsCap(e,n){let p={},m={};for(let o of Object.keys(e.roots)){let C=e.roots[o];p[o]=b({returns:k(C),idempotent:!0}),m[o]=(r,y)=>{let D=this.rootInstances.get(o);if(D!==void 0){let w=this.capTable.get(D);if(w)return w.refCount+=1,{[Rn]:!0,cap:C,capId:D,typeId:w.typeId};this.rootInstances.delete(o)}let t=y.exportCap(C,n[o]);return this.rootInstances.set(o,t.capId),t}}return{def:W(p),impl:m}}runtimeProxy=null;runtime(){if(!this.runtimeProxy)this.runtimeProxy=this.makeCapProxy(Ae,yn);return this.runtimeProxy}async bootstrap(e,n){await this.remoteReady;let m=Object.keys(e.roots).indexOf(n);if(m<0)throw new N({code:"invalid_argument",message:`root "${n}" not in schema`});let o=e.roots[n],C=await e.topologyHash(),r=await this.sendCallTyped(ce,m,void 0,void 0,{topologyHash:C});if(!(r instanceof j))throw new N({code:"protocol_error",message:"bootstrap did not return a CapRef"});return this.makeCapProxy(o,r.capId)}handleFrame(e){if(this.closed_)return;switch(e.op){case"hello":this.handleHello(e);return;case"call":this.handleCall(e);return;case"result":this.handleResult(e);return;case"cancel":this.handleCancel(e);return;case"stream":this.handleStreamFrame(e);return;case"drop":this.handleDrop(e);return;case"goaway":this.handleGoaway(e);return;default:this.handleUnknownFrame(e);return}}handleUnknownFrame(e){let n=e?.id;if(typeof n==="number"){this.transport.send({op:"result",id:n,ok:!1,error:{code:"protocol_error",message:"unknown opcode"}});return}this.transport.send({op:"goaway",reason:"protocol_error",error:{code:"protocol_error",message:"unknown opcode"}}),this.shutdown("protocol_error")}handleHello(e){this.remoteHello=e,this.resolveRemoteReady(e)}handleGoaway(e){this.rejectRemoteReady(new N(e.error??{code:"unavailable",message:e.reason??"peer goaway"})),this.shutdown(e.reason??"remote goaway")}async handleCall(e){let n=this.capTable.get(e.target.id);if(!n)return this.sendError(e.id,"not_found",`cap-id ${e.target.id} not found`);if(n.capId===ce){if(!this.userRootsSchema)return this.sendError(e.id,"not_supported","no server attached");let y=e.meta?.topologyHash;if(y){let D=await this.userRootsSchema.topologyHash();if(y!==D)return this.sendError(e.id,"failed_precondition",`topologyHash mismatch (client ${y.slice(0,8)} vs server ${D.slice(0,8)})`)}}let p=n.cap;if(!p||!n.impl)return this.sendError(e.id,"not_supported","cap has no impl");let m=Object.keys(p.methods);if(e.method>=m.length)return this.sendError(e.id,"not_supported",`method index ${e.method} out of range`);let o=m[e.method],C=p.methods[o],r=n.impl[o];if(typeof r!=="function")return this.sendError(e.id,"not_supported",`method "${o}" has no handler`);await this.invokeServerMethod(e,C,r)}async invokeServerMethod(e,n,p){let m=this.makeCallCtx(e);if(Re(n)){let o=nm(n.hint);try{let C=()=>p(e.args,m),r=Xe,D=(r?()=>r.run({callId:e.id},C):C)();this.runServerStream(e.id,D,m,o)}catch(C){this.transport.send({op:"stream",id:e.id,ev:"error",error:dn(C)})}return}if(ye(n)){let o=n.idempotent?void 0:this.armServerDeadline(e,m);this.serverActiveCalls.set(e.id,m._ctrl);let C=Cm(n.returns),r=()=>Promise.resolve(p(e.args,m)),y=Xe,D=y?()=>y.run({callId:e.id},r):r;try{let t=await D();if(o)clearTimeout(o);if(!this.serverActiveCalls.delete(e.id))return;let w=C(t);this.transport.send({op:"result",id:e.id,ok:!0,value:w})}catch(t){if(o)clearTimeout(o);if(!this.serverActiveCalls.delete(e.id))return;this.sendErrorFromException(e.id,t)}return}this.sendError(e.id,"not_supported","unknown method kind")}armServerDeadline(e,n){let p=e.meta?.deadlineMs;if(!p)return;return setTimeout(()=>{n._ctrl.abort()},p)}makeCallCtx(e){let n=new AbortController;return{callId:e.id,peerId:this.peerId,attestation:this.attestation,signal:n.signal,deadline:e.meta?.deadlineMs,context:e.meta?.context,_ctrl:n,exportCap:(m,o)=>this.exportCap(m,o)}}exportCap(e,n){let p=_p(e)??cp,m=this.capTable.allocate({typeId:p,cap:e,impl:n,refCount:1});return{[Rn]:!0,cap:e,capId:m.capId,typeId:m.typeId}}runServerStream(e,n,p,m){let o=n[Symbol.asyncIterator](),C=p._ctrl,r={iter:o,abort:C,cancelled:!1,credit:m,creditWaker:null};this.serverStreams.set(e,r);let y=()=>{if(r.credit>0||r.cancelled)return Promise.resolve();return new Promise((t)=>{r.creditWaker=t})};(async()=>{let t=!1;try{while(!r.cancelled){if(r.credit===0)await y();if(r.cancelled)break;let{done:w,value:I}=await o.next();if(w)break;if(r.cancelled)break;r.credit-=1,this.transport.send({op:"stream",id:e,ev:"next",value:I})}}catch(w){t=!0,this.transport.send({op:"stream",id:e,ev:"error",error:dn(w)})}finally{if(!t)this.transport.send({op:"stream",id:e,ev:"end"});this.serverStreams.delete(e)}})()}handleResult(e){let n=this.pending.get(e.id);if(n){if(this.pending.delete(e.id),this.serverCallChildren.delete(e.id),n.timer)clearTimeout(n.timer);if(e.ok){let m=n.decodeReturn?n.decodeReturn(e.value):e.value;n.resolve(m)}else n.reject(new N(e.error));return}let p=this.clientStreams.get(e.id);if(p){this.clientStreams.delete(e.id);let m=e.ok?new N({code:"protocol_error",message:"stream method returned result frame"}):new N(e.error);p.fail(m)}}handleCancel(e){let n=this.serverStreams.get(e.id);if(n)n.cancelled=!0,n.abort.abort(),n.iter?.return?.(),this.serverStreams.delete(e.id);let p=this.serverActiveCalls.get(e.id);if(p)this.serverActiveCalls.delete(e.id),p.abort(),this.transport.send({op:"result",id:e.id,ok:!1,error:{code:"cancelled",message:e.reason}});for(let[m,o]of this.serverCallChildren){if(o.parentId!==e.id)continue;if(this.serverCallChildren.delete(m),this.pending.has(m))this.transport.send({op:"cancel",id:m,reason:e.reason})}}releaseRef(e){if(typeof e!=="object"||e===null)return;let n=e[Dp];if(!n||n.dropped)return;n.dropped=!0,this.sendDrop(n.capId)}sendDrop(e){if(this.closed_)return;if(e<he)return;this.transport.send({op:"drop",caps:[{id:e,delta:1}]})}handleStreamFrame(e){if(e.ev==="credit"){let p=this.serverStreams.get(e.id);if(!p)return;p.credit+=e.credit?.messages??0;let m=p.creditWaker;p.creditWaker=null,m?.();return}let n=this.clientStreams.get(e.id);if(!n)return;switch(e.ev){case"next":n.push(e.value);return;case"end":n.end(),this.clientStreams.delete(e.id);return;case"error":n.fail(new N(e.error)),this.clientStreams.delete(e.id);return}}handleDrop(e){for(let{id:n,delta:p}of e.caps)if(this.capTable.release(n,p)){for(let[o,C]of this.rootInstances)if(C===n){this.rootInstances.delete(o);break}}}sendError(e,n,p){this.transport.send({op:"result",id:e,ok:!1,error:{code:n,message:p}})}sendErrorFromException(e,n){this.transport.send({op:"result",id:e,ok:!1,error:dn(n)})}nextId(){return this.nextCallId++}sendCallRaw(e,n,p,m){return this.sendCallTyped(e,n,p,void 0,m)}sendCallTyped(e,n,p,m,o){if(this.closed_)return Promise.reject(new N({code:"unavailable",message:"connection closed"}));let C=this.nextId();return new Promise((r,y)=>{let D=new AbortController,t={resolve:r,reject:y,abort:D,decodeReturn:m};if(o?.deadlineMs)t.timer=setTimeout(()=>{if(this.pending.delete(C))this.transport.send({op:"cancel",id:C,reason:"deadline_exceeded"}),y(new N({code:"deadline_exceeded"}))},o.deadlineMs+jp);this.pending.set(C,t);let w=o;if(w?.parentCallId===void 0&&Xe){let I=Xe.getStore();if(I)w={...w??{},parentCallId:I.callId}}if(w?.parentCallId!==void 0)this.serverCallChildren.set(C,{parentId:w.parentCallId});this.transport.send({op:"call",id:C,target:{kind:"cap",id:e},method:n,args:p,meta:w})})}openClientStream(e,n,p,m){if(this.closed_){let D=Tp(0,()=>{},()=>{});return D.fail(new N({code:"unavailable",message:"connection closed"})),D.stream}let o=this.nextId(),y=Tp(o,()=>{if(this.clientStreams.delete(o))this.transport.send({op:"cancel",id:o,reason:"client_cancel"})},(D)=>{if(this.closed_||!this.clientStreams.has(o))return;this.transport.send({op:"stream",id:o,ev:"credit",credit:{messages:D}})});return this.clientStreams.set(o,y),this.transport.send({op:"call",id:o,target:{kind:"cap",id:e},method:n,args:p,meta:m}),y.stream}makeCapProxy(e,n){let p=Object.keys(e.methods),m={},o={capId:n,dropped:!1};m[Dp]=o;let C=()=>{if(o.dropped)return;o.dropped=!0,this.sendDrop(n)};for(let y=0;y<p.length;y++){let D=p[y],t=e.methods[D];if(Re(t))m[D]=(w)=>this.openClientStream(n,y,w);else if(ye(t)){let w=am(t.returns,(I,v)=>this.makeCapProxy(I,v));m[D]=(I)=>this.sendCallTyped(n,y,I,w)}}let r=e.disposal;if(r){let y=()=>{let D=m[r.method];return D?.()};m[Symbol.asyncDispose]=async()=>{let D=y();await Promise.resolve(D),C()},m[Symbol.dispose]=()=>{let D=y();C()}}if(typeof FinalizationRegistry<"u")om.register(m,{connRef:new WeakRef(this),capId:n,dropped:()=>o.dropped});return m}_dropFromFinalizer(e){try{this.sendDrop(e)}catch{}}shutdown(e){if(this.closed_)return;this.closed_=!0;for(let n of this.pending.values()){if(n.timer)clearTimeout(n.timer);n.reject(new N({code:"unavailable",message:e}))}this.pending.clear();for(let n of this.clientStreams.values())n.fail(new N({code:"unavailable",message:e}));this.clientStreams.clear();for(let n of this.serverStreams.values())n.cancelled=!0,n.abort.abort(),n.iter?.return?.();this.serverStreams.clear();for(let n of this.serverActiveCalls.values())n.abort();this.serverActiveCalls.clear();for(let n of this.capTable.values())this.invokeServerDisposal(n);if(this.capTable.clear(),!this.remoteHello)this.rejectRemoteReady(new N({code:"unavailable",message:e}));for(let n of this.closeHandlers)try{n()}catch{}this.closeHandlers.clear();try{this.transport.close()}catch{}}invokeServerDisposal(e){let n=e.cap;if(!n)return;let p=n.disposal;if(!p)return;let m=e.impl,o=m?.[p.method];if(!o)return;try{o.call(m,void 0,void 0)}catch{}}}function Cm(e){if(!e)return(p)=>p;let n=(p,m)=>{if(!mm(p))throw new N({code:"protocol_error",message:"expected ctx.exportCap return for cap method"});if(p.cap!==m)throw new N({code:"protocol_error",message:"exported cap type mismatch with method returns"});return new j(p.capId)};if(re(e))return(p)=>n(p,e.cap);if(le(e))return(p)=>{if(!Array.isArray(p))throw new N({code:"protocol_error",message:"expected ExportedCap[] for cap.array method"});return p.map((m)=>n(m,e.cap))};if(de(e))return(p)=>{if(!p||typeof p!=="object")throw new N({code:"protocol_error",message:"expected Record<string, ExportedCap> for cap.record method"});let m={};for(let o of Object.keys(p))m[o]=n(p[o],e.cap);return m};return(p)=>p}function am(e,n){if(!e)return;if(re(e)){let p=e.cap;return(m)=>{if(!(m instanceof j))throw new N({code:"protocol_error",message:"expected CapRef"});return n(p,m.capId)}}if(le(e)){let p=e.cap,m=p.disposal;return(o)=>{if(!Array.isArray(o))throw new N({code:"protocol_error",message:"expected array"});let C=o.map((r)=>{if(!(r instanceof j))throw new N({code:"protocol_error",message:"expected CapRef in array"});return n(p,r.capId)});return fm(C,m),C}}if(de(e)){let p=e.cap;return(m)=>{if(!m||typeof m!=="object")throw new N({code:"protocol_error",message:"expected record"});let o={};for(let C of Object.keys(m)){let r=m[C];if(!(r instanceof j))throw new N({code:"protocol_error",message:"expected CapRef in record"});o[C]=n(p,r.capId)}return o}}return}function fm(e,n){if(!n)return;let p=n.async?Symbol.asyncDispose:Symbol.dispose;e[p]=n.async?()=>Promise.all(e.map((m)=>{let o=m[Symbol.asyncDispose];return o?o.call(m):void 0})).then(()=>{return}):()=>{for(let m of e)m[Symbol.dispose]?.call(m)}}function dn(e){if(e instanceof N)return e.toStatus();if(e instanceof Error)return{code:"unknown",message:e.message};return{code:"unknown",message:String(e)}}function Tp(e,n,p){let m=[],o=[],C=!1,r=null,y=!1,D=0;function t(){if(D+=1,D>=gp)p(D),D=0}function w(){if(m.length>0){let M=m.shift();return t(),{value:M,done:!1}}if(r)return null;if(C||y)return{value:void 0,done:!0};return null}function I(){let M=w();if(M)return Promise.resolve(M);if(r)return Promise.reject(r);return new Promise((ee,fe)=>o.push({resolve:ee,reject:fe}))}function v(){while(o.length>0){let M=o.shift(),ee=w();if(ee){M.resolve(ee);continue}if(r){M.reject(r);continue}o.unshift(M);break}}function G(){if(y||C||r)return;y=!0,n(),v()}return{stream:{[Symbol.asyncIterator]:()=>({next:I,return:()=>{return G(),Promise.resolve({value:void 0,done:!0})},throw:(M)=>{return G(),Promise.reject(M)}}),[Symbol.dispose]:G,cancel:G},push(M){if(y||C||r)return;m.push(M),v()},end(){C=!0,v()},fail(M){r=M,v()}}}function _n(e){return new hp(e)}function Dn(e,n={}){let p=pn(),m;return e.setReceive((o)=>{let C;try{C=p.unpackr.unpack(o)}catch(r){n.onProtocolError?.(`unpack failed: ${r instanceof Error?r.message:String(r)}`),e.close();return}if(!nn(C)){n.onProtocolError?.("malformed frame"),e.close();return}m?.(C)}),{send(o){let C=p.packr.pack(o);e.send(C instanceof Uint8Array?C:new Uint8Array(C))},setReceive(o){m=o},close(){e.close()}}}function Tn(e){if("binaryType"in e)try{e.binaryType="arraybuffer"}catch{}let n,p=(m)=>{if(!n)return;let o=m.data;if(o instanceof Uint8Array){n(o);return}if(o instanceof ArrayBuffer){n(new Uint8Array(o));return}if(typeof Blob<"u"&&o instanceof Blob){o.arrayBuffer().then((C)=>n?.(new Uint8Array(C)));return}};return e.addEventListener("message",p),{send(m){e.send(m)},setReceive(m){n=m},close(){e.removeEventListener?.("message",p),e.close?.()}}}function be(e){let n=new ArrayBuffer(e.byteLength);return new Uint8Array(n).set(e),n}async function rm(e){return crypto.subtle.importKey("raw",be(e),"AES-GCM",!1,["encrypt","decrypt"])}async function wn(e,n){let p=await rm(n),m,o=Promise.resolve(),C=Promise.resolve(),r=!1,y=()=>{if(!r)r=!0,e.close()};return e.setReceive((D)=>{if(r)return;if(D.length<13||D[0]!==1){y();return}let t=be(D.subarray(1,13)),w=be(D.subarray(13));C=C.then(async()=>{if(r)return;try{let I=await crypto.subtle.decrypt({name:"AES-GCM",iv:t},p,w);m?.(new Uint8Array(I))}catch{y()}})}),{send(D){if(r)return;let t=be(D);o=o.then(async()=>{if(r)return;try{let w=crypto.getRandomValues(new Uint8Array(12)),I=be(w),v=await crypto.subtle.encrypt({name:"AES-GCM",iv:I},p,t),G=new Uint8Array(v),Z=new Uint8Array(13+G.byteLength);Z[0]=1,Z.set(w,1),Z.set(G,13),e.send(Z)}catch{y()}})},setReceive(D){m=D},close(){y()}}}class lm{buffer=[];waiters=[];ctrl=new AbortController;cleanup;ended=!1;failure=null;constructor(e){let n=(p)=>{if(this.ended||this.failure)return;let m=this.waiters.shift();if(m){m.resolve({value:p,done:!1});return}this.buffer.push(p)};try{let p=e(n,this.ctrl.signal);if(typeof p==="function")this.cleanup=p}catch(p){this.failure=p}}[Symbol.asyncIterator](){return{next:async()=>{if(this.buffer.length>0)return{value:this.buffer.shift(),done:!1};if(this.failure)throw this.failure;if(this.ended)return{value:void 0,done:!0};return new Promise((e,n)=>this.waiters.push({resolve:e,reject:n}))},return:async()=>{return this.dispose(),{value:void 0,done:!0}}}}cancel(){this.dispose()}[Symbol.dispose](){this.dispose()}dispose(){if(this.ended)return;this.ended=!0,this.ctrl.abort();try{this.cleanup?.()}catch{}while(this.waiters.length>0)this.waiters.shift().resolve({value:void 0,done:!0})}}var An=null;function cn(){if(!An)An=host.runtime().then((e)=>e.surface());return An}function J(e){return cn().then(e).catch((n)=>{if(globalThis.__BUNITE_DEBUG__)console.warn("[bunite] surface call failed",n);return})}class bp{element;onBoundsChange;observer=null;rafId=0;lastRect={x:0,y:0,width:0,height:0};dirty=!1;stopped=!1;constructor(e,n){this.element=e,this.onBoundsChange=n}start(){this.observer=new ResizeObserver(()=>this.markDirty()),this.observer.observe(this.element),this.scheduleFrame()}stop(){if(this.stopped=!0,this.observer?.disconnect(),this.observer=null,this.rafId)cancelAnimationFrame(this.rafId),this.rafId=0}markDirty(){this.dirty=!0}scheduleFrame(){if(this.stopped)return;this.rafId=requestAnimationFrame(()=>{this.flush(),this.scheduleFrame()})}flush(){let e=window.devicePixelRatio||1,n=this.element.getBoundingClientRect(),p={x:Math.round(n.x*e),y:Math.round(n.y*e),width:Math.round(n.width*e),height:Math.round(n.height*e)};if(!this.dirty&&p.x===this.lastRect.x&&p.y===this.lastRect.y&&p.width===this.lastRect.width&&p.height===this.lastRect.height)return;this.dirty=!1,this.lastRect=p,this.onBoundsChange(p)}}class tp extends HTMLElement{static observedAttributes=["src"];_surfaceId=null;_syncCtrl=null;_initPromise=null;_aborted=!1;_pendingSrc=null;_syncHidden=!1;_userHidden=!1;_layoutObserver=null;_unsubNavigate=null;constructor(){super()}connectedCallback(){this._aborted=!1,this._syncHidden=!1,this._userHidden=!1;let e=new AbortController;this._unsubNavigate=()=>e.abort(),(async()=>{try{let p=(await cn()).didNavigate();for await(let m of p){if(e.signal.aborted)break;if(m.surfaceId===this._surfaceId)this.dispatchEvent(new CustomEvent("did-navigate",{detail:{url:m.url}}))}}catch(n){if(globalThis.__BUNITE_DEBUG__)console.warn("[bunite] didNavigate stream failed",n)}})(),this._waitForLayout()}_waitForLayout(){if(this._layoutObserver)return;let e=()=>{if(!this.isConnected||this._aborted)return!0;let n=this.getBoundingClientRect();if(n.width>0&&n.height>0){if(this.getAttribute("src")||this._pendingSrc||"")this.initSurface();return!0}return!1};requestAnimationFrame(()=>{if(e())return;this._layoutObserver=new ResizeObserver(()=>{if(e())this._layoutObserver?.disconnect(),this._layoutObserver=null}),this._layoutObserver.observe(this)})}disconnectedCallback(){if(this._aborted=!0,this._unsubNavigate?.(),this._unsubNavigate=null,this._layoutObserver?.disconnect(),this._layoutObserver=null,this._syncCtrl?.stop(),this._syncCtrl=null,this._surfaceId!=null){let e=this._surfaceId;this._surfaceId=null,J((n)=>n.remove({surfaceId:e}))}else if(this._initPromise)this._initPromise.then((e)=>{J((n)=>n.remove({surfaceId:e.surfaceId}))}).catch(()=>{});this._initPromise=null}attributeChangedCallback(e,n,p){if(e!=="src")return;if(this._surfaceId!=null){let m=this._surfaceId;J((o)=>o.navigate({surfaceId:m,url:p||""}))}else if(this._initPromise)this._pendingSrc=p||"";else if(this.isConnected&&!this._aborted&&p)this._waitForLayout()}setHidden(e){this._userHidden=e,this._applySurfaceHidden()}goBack(){let e=this._surfaceId;if(e!=null)J((n)=>n.goBack({surfaceId:e}))}reload(){let e=this._surfaceId;if(e!=null)J((n)=>n.reload({surfaceId:e}))}navigate(e){this.setAttribute("src",e)}_applySurfaceHidden(){let e=this._surfaceId;if(e==null)return;let n=this._userHidden||this._syncHidden;J((p)=>p.setHidden({surfaceId:e,hidden:n}))}initSurface(){if(this._surfaceId!=null||this._initPromise!=null)return;let e=window.devicePixelRatio||1,n=this.getBoundingClientRect(),p=this._pendingSrc||this.getAttribute("src")||"";this._pendingSrc=null;let m=cn().then((o)=>o.init({src:p,x:Math.round(n.x*e),y:Math.round(n.y*e),width:Math.round(n.width*e),height:Math.round(n.height*e),hidden:this._userHidden}));this._initPromise=m,m.then((o)=>{if(this._initPromise!==m)return;if(this._aborted){J((C)=>C.remove({surfaceId:o.surfaceId}));return}if(this._surfaceId=o.surfaceId,this._userHidden)this._applySurfaceHidden();if(this._pendingSrc!=null){let C=this._pendingSrc;this._pendingSrc=null;let r=this._surfaceId;if(r!=null)J((y)=>y.navigate({surfaceId:r,url:C}))}this._syncCtrl=new bp(this,(C)=>{let r=this._surfaceId;if(r==null)return;if(C.width===0&&C.height===0){if(!this._syncHidden)this._syncHidden=!0,this._applySurfaceHidden();return}if(this._syncHidden)this._syncHidden=!1,this._applySurfaceHidden();J((D)=>D.resize({surfaceId:r,x:C.x,y:C.y,w:C.width,h:C.height}))}),this._syncCtrl.start()}).catch(()=>{}).finally(()=>{if(this._initPromise===m)this._initPromise=null})}}if(typeof customElements<"u"){customElements.define("bunite-webview",tp);let e=()=>{J((n)=>n.bringAllVisiblesToFront())};document.addEventListener("pointerdown",e,!0),document.addEventListener("dragstart",()=>{J((n)=>n.setAllPassthrough({passthrough:!0}))},!0),document.addEventListener("dragend",()=>{J((n)=>n.setAllPassthrough({passthrough:!1})),e()},!0)}var hn=null,te=null;function $e(){if(hn)return Promise.resolve(hn);if(te)return te;let e=(async()=>{let n=new WebSocket(`ws://localhost:${__buniteRpcSocketPort}/rpc?webviewId=${__buniteWebviewId}`);n.binaryType="arraybuffer",await new Promise((C,r)=>{n.addEventListener("open",()=>C(),{once:!0}),n.addEventListener("error",()=>r(Error("bunite preload ws connect failed")),{once:!0})});let p=Uint8Array.from(atob(__buniteSecretKeyBase64),(C)=>C.charCodeAt(0)),m=await wn(Tn(n),p),o=_n({transport:Dn(m),mode:"native",origin:location.origin});return hn=o,o})();return te=e,e.catch(()=>{if(te===e)te=null}),e}var Ce=window;Ce.__bunite??={};Ce.__buniteWebviewId=__buniteWebviewId;Ce.__buniteRpcSocketPort=__buniteRpcSocketPort;Ce.host??={};Ce.host.bootstrap=async(e,n)=>(await $e()).bootstrap(e,n);Ce.host.serve=async(e)=>{(await $e()).serve(e)};Ce.host.runtime=async()=>(await $e()).runtime();Ce.host.releaseRef=async(e)=>{(await $e()).releaseRef(e)};
@@ -1,236 +1,71 @@
1
- // Preload runtime injected into every appres:// page. Config vars (__bunite*) prepended by inline.ts.
1
+ import {
2
+ createConnection,
3
+ createFrameTransport,
4
+ createWebSocketPipe,
5
+ createEncryptedPipe,
6
+ type Connection,
7
+ type Schema,
8
+ type SchemaShape,
9
+ type ClientOf,
10
+ type ServerDescriptor,
11
+ type WebSocketLike,
12
+ } from "../rpc/index";
2
13
 
3
14
  declare const __buniteWebviewId: number;
4
15
  declare const __buniteRpcSocketPort: number;
5
16
  declare const __buniteSecretKeyBase64: string;
6
17
 
7
- const RPC_FRAME_VERSION = 1;
8
- const RPC_IV_LENGTH = 12;
9
-
10
- // --- Crypto key (lazy) ---
11
-
12
- const getCryptoKey = (() => {
13
- let keyPromise: Promise<CryptoKey>;
14
- return () => {
15
- if (!keyPromise) {
16
- const raw = Uint8Array.from(atob(__buniteSecretKeyBase64), c => c.charCodeAt(0));
17
- keyPromise = crypto.subtle.importKey("raw", raw, "AES-GCM", false, ["encrypt", "decrypt"]);
18
- }
19
- return keyPromise;
20
- };
21
- })();
22
-
23
- async function buniteEncrypt(data: Uint8Array): Promise<Uint8Array> {
24
- const key = await getCryptoKey();
25
- const iv = crypto.getRandomValues(new Uint8Array(RPC_IV_LENGTH));
26
- const encrypted = new Uint8Array(await crypto.subtle.encrypt({ name: "AES-GCM", iv }, key, data as unknown as ArrayBuffer));
27
- const frame = new Uint8Array(1 + iv.length + encrypted.length);
28
- frame[0] = RPC_FRAME_VERSION;
29
- frame.set(iv, 1);
30
- frame.set(encrypted, 1 + iv.length);
31
- return frame;
32
- }
33
-
34
- async function buniteDecrypt(frame: Uint8Array): Promise<Uint8Array> {
35
- if (frame.length < 1 + RPC_IV_LENGTH + 16) {
36
- throw new Error("Invalid bunite RPC frame.");
37
- }
38
- if (frame[0] !== RPC_FRAME_VERSION) {
39
- throw new Error("Unsupported bunite RPC frame version.");
40
- }
41
- const key = await getCryptoKey();
42
- const iv = frame.slice(1, 1 + RPC_IV_LENGTH);
43
- const encrypted = frame.slice(1 + RPC_IV_LENGTH);
44
- return new Uint8Array(await crypto.subtle.decrypt({ name: "AES-GCM", iv }, key, encrypted));
45
- }
46
-
47
- // --- Minimal msgpack encoder/decoder ---
48
-
49
- function mpEncode(val: unknown): Uint8Array {
50
- const parts: number[] = [];
51
-
52
- function w(v: unknown): void {
53
- if (v === null || v === undefined) {
54
- parts.push(0xc0);
55
- } else if (v === true) {
56
- parts.push(0xc3);
57
- } else if (v === false) {
58
- parts.push(0xc2);
59
- } else if (typeof v === "number") {
60
- if (Number.isInteger(v) && v >= 0 && v < 128) {
61
- parts.push(v);
62
- } else if (Number.isInteger(v) && v >= -32 && v < 0) {
63
- parts.push(v & 0xff);
64
- } else if (Number.isInteger(v) && v >= 0 && v <= 0xffff) {
65
- parts.push(0xcd, (v >> 8) & 0xff, v & 0xff);
66
- } else if (Number.isInteger(v) && v >= 0 && v <= 0xffffffff) {
67
- parts.push(0xce, (v >> 24) & 0xff, (v >> 16) & 0xff, (v >> 8) & 0xff, v & 0xff);
68
- } else {
69
- const b = new ArrayBuffer(9);
70
- const dv = new DataView(b);
71
- dv.setUint8(0, 0xcb);
72
- dv.setFloat64(1, v);
73
- for (let i = 0; i < 9; i++) parts.push(dv.getUint8(i));
74
- }
75
- } else if (typeof v === "string") {
76
- const bytes = new TextEncoder().encode(v);
77
- if (bytes.length < 32) parts.push(0xa0 | bytes.length);
78
- else if (bytes.length < 256) parts.push(0xd9, bytes.length);
79
- else if (bytes.length < 65536) parts.push(0xda, (bytes.length >> 8) & 0xff, bytes.length & 0xff);
80
- else parts.push(0xdb, (bytes.length >> 24) & 0xff, (bytes.length >> 16) & 0xff, (bytes.length >> 8) & 0xff, bytes.length & 0xff);
81
- for (let i = 0; i < bytes.length; i++) parts.push(bytes[i]);
82
- } else if (Array.isArray(v)) {
83
- if (v.length < 16) parts.push(0x90 | v.length);
84
- else if (v.length < 65536) parts.push(0xdc, (v.length >> 8) & 0xff, v.length & 0xff);
85
- else parts.push(0xdd, (v.length >> 24) & 0xff, (v.length >> 16) & 0xff, (v.length >> 8) & 0xff, v.length & 0xff);
86
- v.forEach(w);
87
- } else if (typeof v === "object") {
88
- const keys = Object.keys(v as Record<string, unknown>);
89
- if (keys.length < 16) parts.push(0x80 | keys.length);
90
- else if (keys.length < 65536) parts.push(0xde, (keys.length >> 8) & 0xff, keys.length & 0xff);
91
- else parts.push(0xdf, (keys.length >> 24) & 0xff, (keys.length >> 16) & 0xff, (keys.length >> 8) & 0xff, keys.length & 0xff);
92
- for (const k of keys) { w(k); w((v as Record<string, unknown>)[k]); }
93
- }
94
- }
95
-
96
- w(val);
97
- return new Uint8Array(parts);
98
- }
99
-
100
- function mpDecode(buf: Uint8Array): unknown {
101
- let pos = 0;
102
-
103
- function r(): unknown {
104
- const b = buf[pos++];
105
- if (b <= 0x7f) return b;
106
- if (b >= 0xe0) return b - 256;
107
- if (b === 0xc0) return null;
108
- if (b === 0xc2) return false;
109
- if (b === 0xc3) return true;
110
- if (b === 0xcc) return buf[pos++];
111
- if (b === 0xcd) { const v = (buf[pos] << 8) | buf[pos + 1]; pos += 2; return v; }
112
- if (b === 0xce) { const v = ((buf[pos] << 24) | (buf[pos + 1] << 16) | (buf[pos + 2] << 8) | buf[pos + 3]) >>> 0; pos += 4; return v; }
113
- if (b === 0xcb) { const dv = new DataView(buf.buffer, buf.byteOffset + pos, 8); pos += 8; return dv.getFloat64(0); }
114
- if (b === 0xd0) { const v = buf[pos++]; return v > 127 ? v - 256 : v; }
115
- if (b === 0xd1) { const v = (buf[pos] << 8) | buf[pos + 1]; pos += 2; return v > 32767 ? v - 65536 : v; }
116
- if (b === 0xd2) { const v = (buf[pos] << 24) | (buf[pos + 1] << 16) | (buf[pos + 2] << 8) | buf[pos + 3]; pos += 4; return v; }
117
- // fixstr
118
- if ((b & 0xe0) === 0xa0) { const len = b & 0x1f; const s = new TextDecoder().decode(buf.subarray(pos, pos + len)); pos += len; return s; }
119
- if (b === 0xd9) { const len = buf[pos++]; const s = new TextDecoder().decode(buf.subarray(pos, pos + len)); pos += len; return s; }
120
- if (b === 0xda) { const len = (buf[pos] << 8) | buf[pos + 1]; pos += 2; const s = new TextDecoder().decode(buf.subarray(pos, pos + len)); pos += len; return s; }
121
- if (b === 0xdb) { const len = ((buf[pos] << 24) | (buf[pos + 1] << 16) | (buf[pos + 2] << 8) | buf[pos + 3]) >>> 0; pos += 4; const s = new TextDecoder().decode(buf.subarray(pos, pos + len)); pos += len; return s; }
122
- // fixarray
123
- if ((b & 0xf0) === 0x90) { const len = b & 0x0f; const arr: unknown[] = []; for (let i = 0; i < len; i++) arr.push(r()); return arr; }
124
- if (b === 0xdc) { const len = (buf[pos] << 8) | buf[pos + 1]; pos += 2; const arr: unknown[] = []; for (let i = 0; i < len; i++) arr.push(r()); return arr; }
125
- if (b === 0xdd) { const len = ((buf[pos] << 24) | (buf[pos + 1] << 16) | (buf[pos + 2] << 8) | buf[pos + 3]) >>> 0; pos += 4; const arr: unknown[] = []; for (let i = 0; i < len; i++) arr.push(r()); return arr; }
126
- // fixmap
127
- if ((b & 0xf0) === 0x80) { const len = b & 0x0f; const obj: Record<string, unknown> = {}; for (let i = 0; i < len; i++) { obj[r() as string] = r(); } return obj; }
128
- if (b === 0xde) { const len = (buf[pos] << 8) | buf[pos + 1]; pos += 2; const obj: Record<string, unknown> = {}; for (let i = 0; i < len; i++) { obj[r() as string] = r(); } return obj; }
129
- if (b === 0xdf) { const len = ((buf[pos] << 24) | (buf[pos + 1] << 16) | (buf[pos + 2] << 8) | buf[pos + 3]) >>> 0; pos += 4; const obj: Record<string, unknown> = {}; for (let i = 0; i < len; i++) { obj[r() as string] = r(); } return obj; }
130
- // bin8, bin16
131
- if (b === 0xc4) { const len = buf[pos++]; const bin = buf.slice(pos, pos + len); pos += len; return bin; }
132
- if (b === 0xc5) { const len = (buf[pos] << 8) | buf[pos + 1]; pos += 2; const bin = buf.slice(pos, pos + len); pos += len; return bin; }
133
- return undefined;
134
- }
135
-
136
- return r();
18
+ let _conn: Connection | null = null;
19
+ let _connPromise: Promise<Connection> | null = null;
20
+
21
+ function ensureConnection(): Promise<Connection> {
22
+ if (_conn) return Promise.resolve(_conn);
23
+ if (_connPromise) return _connPromise;
24
+ const attempt = (async () => {
25
+ const ws = new WebSocket(
26
+ `ws://localhost:${__buniteRpcSocketPort}/rpc?webviewId=${__buniteWebviewId}`
27
+ );
28
+ ws.binaryType = "arraybuffer";
29
+ await new Promise<void>((resolve, reject) => {
30
+ ws.addEventListener("open", () => resolve(), { once: true });
31
+ ws.addEventListener("error", () => reject(new Error("bunite preload ws connect failed")), { once: true });
32
+ });
33
+ const rawKey = Uint8Array.from(atob(__buniteSecretKeyBase64), (c) => c.charCodeAt(0));
34
+ const pipe = await createEncryptedPipe(createWebSocketPipe(ws as unknown as WebSocketLike), rawKey);
35
+ const conn = createConnection({
36
+ transport: createFrameTransport(pipe),
37
+ mode: "native",
38
+ origin: location.origin,
39
+ });
40
+ _conn = conn;
41
+ return conn;
42
+ })();
43
+ _connPromise = attempt;
44
+ attempt.catch(() => {
45
+ if (_connPromise === attempt) _connPromise = null;
46
+ });
47
+ return attempt;
137
48
  }
138
49
 
139
- // --- Expose globals ---
140
-
141
50
  const w = window as any;
142
51
  w.__bunite ??= {};
143
52
  w.__buniteWebviewId = __buniteWebviewId;
144
53
  w.__buniteRpcSocketPort = __buniteRpcSocketPort;
145
- w.__bunite_encrypt = buniteEncrypt;
146
- w.__bunite_decrypt = buniteDecrypt;
147
-
148
- // --- Shared WebSocket transport ---
149
-
150
- const eventListeners = new Map<string, Set<(data: any) => void>>();
151
- const pending = new Map<number, { resolve: (v: unknown) => void; reject: (e: Error) => void; timeout: ReturnType<typeof setTimeout> }>();
152
- let socket: WebSocket | null = null;
153
- let listenerAttached = false;
54
+ w.host ??= {};
154
55
 
155
- function attachListener(ws: WebSocket) {
156
- if (listenerAttached) return;
157
- listenerAttached = true;
158
- ws.addEventListener("message", async (event) => {
159
- try {
160
- const decrypted = await buniteDecrypt(new Uint8Array(event.data as ArrayBuffer));
161
- const packet = mpDecode(decrypted) as any;
162
- if (packet?.type === "response" && packet.scope === "global") {
163
- const p = pending.get(packet.id);
164
- if (p) {
165
- pending.delete(packet.id);
166
- clearTimeout(p.timeout);
167
- packet.success ? p.resolve(packet.payload) : p.reject(new Error(packet.error || "Unknown error"));
168
- }
169
- } else if (packet?.type === "event") {
170
- const set = eventListeners.get(packet.channel);
171
- if (set) for (const fn of set) fn(packet.data);
172
- }
173
- } catch { /* ignore malformed frames */ }
174
- });
175
- ws.addEventListener("close", () => { listenerAttached = false; socket = null; });
176
- }
177
-
178
- function ensureSocket(): WebSocket {
179
- const existing = w.__bunite?._socket;
180
- if (existing && existing.readyState <= WebSocket.OPEN && existing !== socket) {
181
- socket = existing;
182
- attachListener(existing);
183
- return existing;
184
- }
185
- if (socket && socket.readyState <= WebSocket.OPEN) return socket;
186
- socket = new WebSocket(
187
- `ws://localhost:${__buniteRpcSocketPort}/socket?webviewId=${__buniteWebviewId}`
188
- );
189
- socket.binaryType = "arraybuffer";
190
- w.__bunite._socket = socket;
191
- attachListener(socket);
192
- return socket;
193
- }
56
+ w.host.bootstrap = async <S extends SchemaShape, K extends keyof S["roots"] & string>(
57
+ schema: Schema<S>,
58
+ name: K
59
+ ): Promise<ClientOf<S["roots"][K]>> => (await ensureConnection()).bootstrap(schema, name);
194
60
 
195
- // --- bunite.on/off: main→renderer events ---
196
-
197
- w.bunite = w.__bunite;
198
- w.bunite.on = (channel: string, handler: (data: any) => void) => {
199
- ensureSocket();
200
- let set = eventListeners.get(channel);
201
- if (!set) { set = new Set(); eventListeners.set(channel, set); }
202
- set.add(handler);
203
- return () => { set!.delete(handler); };
204
- };
205
- w.bunite.off = (channel: string, handler: (data: any) => void) => {
206
- eventListeners.get(channel)?.delete(handler);
61
+ w.host.serve = async <S extends SchemaShape>(descriptor: ServerDescriptor<S>): Promise<void> => {
62
+ (await ensureConnection()).serve(descriptor);
207
63
  };
208
64
 
209
- // --- bunite.invoke: global IPC ---
210
-
211
- let nextId = 1;
212
-
213
- w.bunite.invoke = (method: string, params?: unknown) =>
214
- new Promise((resolve, reject) => {
215
- const ws = ensureSocket();
216
- const id = nextId++;
217
- const timeout = setTimeout(() => {
218
- pending.delete(id);
219
- reject(new Error(`bunite.invoke timed out: ${method}`));
220
- }, 15000);
221
- pending.set(id, { resolve, reject, timeout });
65
+ w.host.runtime = async () => (await ensureConnection()).runtime();
222
66
 
223
- const packet = { type: "request", id, method, params: params ?? null, scope: "global" };
224
- const doSend = async () => {
225
- const encrypted = await buniteEncrypt(mpEncode(packet));
226
- ws.send(encrypted.buffer as ArrayBuffer);
227
- };
228
-
229
- if (ws.readyState === WebSocket.OPEN) {
230
- doSend();
231
- } else {
232
- ws.addEventListener("open", () => doSend(), { once: true });
233
- }
234
- });
67
+ w.host.releaseRef = async (proxy: unknown): Promise<void> => {
68
+ (await ensureConnection()).releaseRef(proxy);
69
+ };
235
70
 
236
- import "./webviewElement";
71
+ import "../webview/native";
@@ -1,14 +1,7 @@
1
1
  {
2
+ "extends": "../../../tsconfig.base.json",
2
3
  "compilerOptions": {
3
- "composite": true,
4
- "target": "ES2022",
5
- "module": "ES2022",
6
- "moduleResolution": "bundler",
7
- "lib": ["ES2022", "DOM"],
8
- "strict": true,
9
- "exactOptionalPropertyTypes": false,
10
- "skipLibCheck": true,
11
- "noEmit": true
4
+ "composite": true
12
5
  },
13
- "include": ["runtime.ts", "webviewElement.ts"]
6
+ "include": ["runtime.ts", "../webview/native.ts", "../rpc/**/*.ts"]
14
7
  }