microsoft-webui-desktop 3.0.3

Configurable native desktop SDK for WebUI applications
Documentation
1
2
3
4
// Copyright (c) Microsoft Corporation.
// Licensed under the MIT license.

"use strict";(()=>{var M=["invalid-frame","invalid-payload","payload-too-large","unsupported-version","schema-mismatch","permission-denied","unknown-method","receiver-unavailable","not-ready","overloaded","cancelled","deadline-exceeded","navigated","closed","transport","handler"],a=class extends Error{constructor(d,m=d,o="Check the connection and the generated contract.",p){super(m);this.code=d;this.help=o;this.applicationCode=p;this.name="IpcError"}code;help;applicationCode};function B(e){return M.includes(e)?e:"transport"}function I(e,s="transport"){if(e instanceof a)return e;if(e&&typeof e=="object"){let d=Object.getOwnPropertyDescriptor(e,"name")?.value,m=Object.getOwnPropertyDescriptor(e,"code")?.value;if(d==="IpcError"&&M.includes(m))return new a(m)}return new a(s)}var k=Object.freeze({maxFrameBytes:1048576,maxNativeControlBytes:4096,maxPendingCallsPerDirection:64,maxOutstandingNotificationsPerDirection:64,maxQueuedFramesPerDirection:128,maxQueuedBytesPerDirection:8388608,maxAdmittedInputBytesPerFrame:8388608,maxRetainedBytesPerFrame:16777216,maxWorkerTasksPerFrameIncludingRetiredDocuments:128,maxCallbacksPerEvent:16,maxCallbacksPerDocument:128,maxCallbackTasksPerDocument:128,maxCollectionEntriesPerMessage:16384,maxSchemaDepth:16,maxReadinessWaiters:16,defaultTimeoutMs:3e4,maxTimeoutMs:3e5,notificationAcceptTimeoutMs:3e4,handshakeTimeoutMs:5e3,maxErrorTextBytesTotal:2048,reservedControlFramesPerDirection:128});function L(e){for(let s of Object.keys(k))if(!Number.isSafeInteger(e[s])||e[s]<=0)throw new a("invalid-frame",`Invalid IPC limit: ${s}`);if(e.maxFrameBytes>16*1048576||e.maxNativeControlBytes>65536||e.maxPendingCallsPerDirection>4096||e.maxCallbacksPerDocument>1024||e.maxQueuedBytesPerDirection>64*1048576||e.maxFrameBytes>e.maxQueuedBytesPerDirection||e.defaultTimeoutMs>e.maxTimeoutMs||e.maxTimeoutMs>3e5||e.maxOutstandingNotificationsPerDirection>4096||e.maxCallbacksPerEvent>e.maxCallbacksPerDocument||e.maxSchemaDepth>16||e.maxReadinessWaiters>16||e.notificationAcceptTimeoutMs>e.maxTimeoutMs||e.maxWorkerTasksPerFrameIncludingRetiredDocuments>4096||e.maxCallbackTasksPerDocument>4096||e.maxQueuedFramesPerDirection>8192||e.reservedControlFramesPerDirection>8192||e.maxCollectionEntriesPerMessage>1048576||e.maxErrorTextBytesTotal>2048||e.handshakeTimeoutMs>5e3||e.maxFrameBytes<e.maxErrorTextBytesTotal+128)throw new a("invalid-frame","Inconsistent IPC limits.");if(e.maxAdmittedInputBytesPerFrame>64*1048576||e.maxRetainedBytesPerFrame>128*1048576||e.maxAdmittedInputBytesPerFrame<e.maxFrameBytes||e.maxRetainedBytesPerFrame<e.maxAdmittedInputBytesPerFrame)throw new a("invalid-frame","Inconsistent IPC byte budgets.")}function A(e){return{wireVersion:e.wireVersion,contractName:e.contractName,contractMajor:e.contractMajor,schemaHash:e.schemaHash}}function P(e,s){if(typeof e!="string"||e.length!==s)return!1;for(let d=0;d<e.length;d++){let m=e.charCodeAt(d);if(!(m>=48&&m<=57)&&!(m>=97&&m<=102))return!1}return!0}function N(e,s=!1){if(typeof e!="string"||e.length===0||e.length>20)return!1;try{let d=BigInt(e);return d>=(s?0n:1n)&&d<=0xffffffffffffffffn&&String(d)===e}catch{return!1}}function C(e){if(!e||typeof e!="object"||Array.isArray(e))throw new a("invalid-frame");let s=JSON.stringify(e);if(s.length>k.maxNativeControlBytes||new TextEncoder().encode(s).byteLength>k.maxNativeControlBytes)throw new a("invalid-frame");return e}function F(e,s,d=0n){let m="";for(let t of crypto.getRandomValues(new Uint8Array(16)))m+=t.toString(16).padStart(2,"0");let o,p,c,i=!1,r=!1,f,w=!1,y=d,g,E="1",b=e.subscribe(R);function j(t){try{Promise.resolve(e.postMessage({kind:"disconnect",generation:t.generation,token:t.token})).catch(()=>{})}catch{}}function D(){if(!f)return;let t=f;f=void 0,w=!1,j(t)}function T(t,n){return t.kind==="helloResult"&&t.callId===E&&t.navigation===n.navigation&&t.documentNonce===n.documentNonce&&t.challenge===n.challenge}function S(t,n){try{let l=C(t);T(l,n)&&!l.error&&N(l.generation)&&P(l.token,32)&&j({generation:l.generation,token:l.token})}catch{}}function v(t){if(!g)return;let n=g;g=void 0,p=void 0,o=void 0,clearTimeout(n.timer),r=!0,b.close(),c=void 0,D(),n.reject(t)}function R(t){if(!r)try{let n=C(t);if(n.kind==="ready"||n.kind==="closed"){if(!N(n.generation))throw new a("invalid-frame");if(BigInt(n.generation)<=d)return;if(n.kind==="ready")c?.({kind:"ready",generation:n.generation});else{let u=B(n.code);c?.({kind:"closed",generation:n.generation,code:u}),(!f||n.generation===f.generation)&&v(new a(u))}return}if(!g||!o||!T(n,o))return;if(n.error){let u=C(n.error);v(new a(B(u.code)));return}if(!N(n.generation))throw new a("invalid-frame");if(!P(n.token,32))throw new a("invalid-frame");f={generation:n.generation,token:n.token};let l=o.nativeCarrierVersion;if(l===1?n.nativeCarrierVersion!==1:n.nativeCarrierVersion!==void 0)throw new a("unsupported-version");if(BigInt(n.generation)<=d)throw new a("navigated");y=BigInt(n.generation);let x=C(n.limits);L(x),w=l===1;let h=g;g=void 0,clearTimeout(h.timer),h.resolve({generation:n.generation,token:n.token,limits:Object.freeze({...x}),...w?{nativeCarrierVersion:1}:{}})}catch(n){v(I(n,"invalid-frame"))}}return{bootstrap:Object.freeze({documentNonce:m,activate(t){if(r||!t||t.documentNonce!==m||!N(t.navigation,!0)||!P(t.challenge,32)||t.nativeCarrierVersion!==void 0&&(t.nativeCarrierVersion!==1||!s))return!1;if(o)return o.navigation===t.navigation&&o.challenge===t.challenge&&o.nativeCarrierVersion===t.nativeCarrierVersion;o=Object.freeze({navigation:t.navigation,documentNonce:m,challenge:t.challenge,...t.nativeCarrierVersion===1?{nativeCarrierVersion:1}:{}});let n=p;return p=void 0,n?.(),!0},hello(t){if(i||r)return Promise.reject(new a("not-ready"));i=!0;try{if(t=A(t),t.wireVersion!==3||!t.contractName||t.contractName.length>1024||!Number.isSafeInteger(t.contractMajor)||t.contractMajor<=0||t.contractMajor>4294967295||!P(t.schemaHash,64))throw new a("invalid-payload")}catch(n){return r=!0,b.close(),c=void 0,Promise.reject(I(n,"invalid-payload"))}return new Promise((n,l)=>{g={resolve:n,reject:l,timer:setTimeout(()=>{v(new a("deadline-exceeded","Native IPC admission timed out.")),r=!0,b.close(),c=void 0},k.handshakeTimeoutMs)};let x=()=>{if(!o)return;let h=o;Promise.resolve().then(()=>{if(!g||r)return;let u={...t,...h,kind:"hello",callId:E};return C(u),e.postMessage(u)}).then(u=>{u!==void 0&&(r?S(u,h):R(u))}).catch(u=>v(I(u)))};o?x():p=x})},subscribeControl(t){if(r)throw new a("closed");if(c)throw new a("invalid-frame","A transport already owns this document.");return c=t,{close(){c===t&&(c=void 0)}}},disconnect(t,n){if(!r){if(f){if(t!==f.generation||n!==f.token)return}else if(t!=="0"||n!=="")return;r=!0,p=void 0,o=void 0,v(new a("closed")),b.close(),c=void 0,D()}},get nativeData(){return!r&&w?s:void 0}}),get generation(){return y},retire(){let t=g,n=c,l=f?.generation??"0";r=!0,g=void 0,w=!1,c=void 0,o=void 0,p=void 0,t&&clearTimeout(t.timer),b.close(),D(),t?.reject(new a("navigated")),n?.({kind:"closed",generation:l,code:"navigated"})}}}function O(e,s,d,m){if("__webuiDesktopIpcV2"in e)throw new a("invalid-frame","Conflicting IPC bootstrap.");if(!Object.isExtensible(e))throw new a("invalid-frame","IPC bootstrap target is not extensible.");let o=F(s,m),p=Object.freeze({get documentNonce(){return o.bootstrap.documentNonce},activate:c=>o.bootstrap.activate(c),hello:c=>o.bootstrap.hello(c),subscribeControl:c=>o.bootstrap.subscribeControl(c),disconnect:(c,i)=>o.bootstrap.disconnect(c,i),get nativeData(){return o.bootstrap.nativeData}});return Object.defineProperty(e,"__webuiDesktopIpcV2",{value:p,writable:!1,configurable:!1}),d?.(c=>{let i=o;try{i.retire()}finally{c&&(o=F(s,m,i.generation))}}),p}var V="webui.linux.local.ipc.v1",H=4,_=Number.MAX_SAFE_INTEGER;if(window===window.top){let o=function(i,r){if(s.size>=H||e===_)return Promise.reject(new Error("Native IPC bridge overloaded"));let f=++e;return new Promise((w,y)=>{let g=setTimeout(()=>{s.delete(f),y(new Error("Native IPC bridge deadline exceeded"))},5e3);s.set(f,{lane:i,resolve:w,reject:y,timer:g}),window.postMessage({marker:V,direction:"page-to-native",lane:i,id:f,payload:r},location.origin)})};z=o;let e=0,s=new Map,d,m;window.addEventListener("message",i=>{if(i.source!==window||i.origin!==location.origin)return;let r=i.data;if(!r||typeof r!="object"||Array.isArray(r)||r.marker!==V||r.direction!=="native-to-page"||r.lane!=="control"&&r.lane!=="data"||r.kind!=="reply"||!Number.isSafeInteger(r.id)||r.id<1)return;let f=s.get(r.id);!f||f.lane!==r.lane||(s.delete(r.id),clearTimeout(f.timer),r.ok===!0?f.resolve(r.payload):f.reject(new Error("Native IPC bridge rejected message")))});let p={postMessage:i=>o("control",i),subscribe(i){if(d)throw new Error("Duplicate native control receiver");return d=i,{close(){d===i&&(d=void 0)}}}},c={postMessage:i=>o("data",i),subscribe(i){if(m)throw new Error("Duplicate native data receiver");return m=i,{close(){m===i&&(m=void 0)}}}};Object.defineProperty(window,"__webuiDesktopIpcReceiveV2",{value:Object.freeze(i=>d?.(i)),configurable:!1,writable:!1}),Object.defineProperty(window,"__webuiDesktopIpcDataReceiveV1",{value:Object.freeze(i=>m?.(i)),configurable:!1,writable:!1}),O(window,p,i=>{window.addEventListener("pagehide",r=>{r.isTrusted&&i(r.persisted)})},c)}var z;})();