@statewalker/webrun-http-browser 0.1.0 → 0.2.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.
- package/dist/index-sw-umd.js +413 -270
- package/dist/index-sw-umd.min.js +2 -2
- package/dist/index-sw.js +409 -265
- package/dist/index-sw.min.js +2 -2
- package/dist/index-umd.js +286 -417
- package/dist/index-umd.min.js +2 -2
- package/dist/index.js +277 -412
- package/dist/index.min.js +2 -2
- package/package.json +1 -1
- package/public/index.html +61 -93
- package/public-relay/heartbeat.js +1 -1
- package/public-relay/relay-sw.js +6 -343
- package/public-relay/relay.html +5 -26
- package/src/{data-channels.js → core/data-channels.js} +26 -10
- package/src/core/index.js +4 -0
- package/src/http/HttpError.js +59 -0
- package/src/{http-send-recieve.js → http/http-send-recieve.js} +1 -1
- package/src/http/index.js +3 -0
- package/src/index.js +4 -9
- package/src/relay/index-sw.js +216 -0
- package/{public-relay/relay-lib.js → src/relay/index.js} +80 -6
- package/src/relay/splitServiceUrl.js +24 -0
- package/src/{http-sw-dispatcher.js → sw/http-sw-dispatcher.js} +1 -1
- package/src/{sw-dispatcher.js → sw/sw-dispatcher.js} +1 -1
- package/public/abc.txt +0 -1
- package/public/index-service-worker.js +0 -1
- /package/src/{data-calls.js → core/data-calls.js} +0 -0
- /package/src/{data-send-recieve.js → core/data-send-recieve.js} +0 -0
- /package/src/{errors.js → core/errors.js} +0 -0
- /package/src/{http-stubs.js → http/http-stubs.js} +0 -0
- /package/src/{readable-streams.js → http/readable-streams.js} +0 -0
package/dist/index-umd.min.js
CHANGED
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
// @statewalker/webrun-http-browser v0.
|
|
2
|
-
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).statewalker=e.statewalker||{},e.statewalker["webrun-http-browser"]=e.statewalker["webrun-http-browser"]||{}))}(this,(function(e){"use strict";function t(e){return Object.assign({message:e,stack:e.stack},e)}function n(e){return"string"==typeof e&&(e={message:e}),Object.assign(new Error(e.message),e)}async function r(e,t,r,...s){return new Promise(((a,o)=>{const i=new MessageChannel;i.port1.onmessage=e=>{const{result:t,error:r}=e.data;r?o(n(r)):a(t)},e.postMessage({type:t,params:r},[i.port2,...s])}))}function s(e,n,r){const s=async e=>{if(!e.data||e.data.type!==n)return;const[s,...a]=e.ports;let o={};try{const t=e.data.params;o.result=await r(e,t,...a)}catch(e){o.error=t(e)}s.postMessage(o)};e.addEventListener("message",s);try{e.start&&e.start()}catch(e){}return()=>e.removeEventListener("message",s)}function a(e=console.error){let t=0;const n={},r=r=>{const s=t++;return n[s]=Object.assign((function(t){try{return delete n[s],!t&&r&&r()}catch(t){e(t)}}),{action:r})},s=e=>Object.values(n).forEach((t=>t.action===e&&t(!0))),a=()=>Object.values(n).forEach((e=>e()));return Object.assign([r,a,s],{register:r,clear:a,unregister:s})}async function*o(e){yield*async function*(e,t=[]){let n,r,s=async(e,n,s)=>{const a={error:e,value:n,done:s};return a.promise=new Promise((e=>a.notify=e)),await t.push(a),r&&r(),r=null,a.promise};const a=e=>s(void 0,e,!1),o=()=>s(void 0,void 0,!0),i=e=>s(e,void 0,!0),c=e(Object.assign([a,o,i],{next:a,complete:o,error:i}));let l;try{for(;;)if(l=await t.shift(),l)try{if(l.error)throw l.error;if(l.done)break;yield l.value}finally{l.notify(!0)}else await(n=r?n:new Promise((e=>r=e)))}finally{for(r&&r(),s=()=>!1,"function"==typeof c&&await c();l=await t.shift();)l.notify(!1)}}((t=>e((async({done:e=!0,value:n,error:r}={})=>{r?await t.error(r):e?await t.complete():await t.next(n)}))))}async function i(e,t){let n;try{for await(let n of t)await e({done:!1,value:n})}catch(e){n=e}finally{await e({done:!0,error:n})}}async function*c(e,t,n={}){const r=new MessageChannel;e.postMessage({type:"START_CALL",params:n},[r.port2]);const s=u(r.port1);try{await s.start(),s.sendAll(t),yield*s.recieveAll()}finally{await s.close()}}function l(e,t){const n=async e=>{const{type:n,params:r}=e.data||{};if("START_CALL"!==n)return;const s=u(e.ports[0]);try{await s.start();const e=s.recieveAll(),n=await t(e,r);await s.sendAll(n)}finally{await s.close()}};e.addEventListener("message",n);try{e.start&&e.start()}catch(e){}return()=>e.removeEventListener("message",n)}function u(e){let t=[],n=[];const r=async e=>{for(let n of t)await n(e)},s=d(e,r);return{start:()=>s.start(),close:async()=>{await r({done:!0}),[...n].forEach((e=>e.return&&e.return())),await s.close()},recieveAll:async function*(){yield*o((e=>(t.push(e),()=>t=t.filter((t=>t!==e)))))},sendAll:async function(e){await i(s.invoke,async function*(){try{n.push(e),yield*e}finally{n=n.filter((t=>t!==e))}}())}}}function d(e,r=(()=>{throw new Error("Handler not implemented")})){const s="REQUEST",a="RESPONSE",o="message",i={};let c=0;const l=async o=>{const c=o.data||{},{type:l,callId:u}=c;if(l===s)try{const{request:t}=c;let n=await r(t,...o.ports||[]);const[s,...i]=Array.isArray(n)?n:void 0!==n?[n]:[];e.postMessage({type:a,callId:u,response:s},i)}catch(n){e.postMessage({type:a,callId:u,error:t(n)})}else if(l===a){const{callId:e,response:t,error:r}=c,s=i[e];delete i[e],s&&(r?s.reject(n(r)):s.resolve(t))}};return{start:async()=>{e.addEventListener(o,l),await e.start()},close:async()=>{e.removeEventListener(o,l),await e.close()},invoke:async function(t={},...n){const r=++c;return new Promise(((a,o)=>{try{i[r]={resolve:a,reject:o},e.postMessage({type:s,callId:r,request:t},n)}catch(e){o(e),delete t[r]}}))}}}function h(e){return new ReadableStream({type:"bytes",async pull(t){let n=!1;try{for(;;){const n=await e.next();if(!n||n.done)break;t.enqueue(await n.value)}}catch(e){n=!0,t.error(e)}finally{!n&&t.close()}}})}async function*f(e){const t=await e.getReader();let n,r;for(;({done:n,value:r}=await t.read())&&!n;)yield await r}function p(e){return async t=>{t=await t;const n=["url","method","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"].reduce(((e,n)=>{const r=t[n];return void 0!==r&&(e[n]=r),e}),{}),r=t.body?f(t.body):[],s=await e({options:n,content:r});let a=null,o={};if(s){o=s.options;const e=s.content;"HEAD"!==n.method&&"OPTIONS"!==n.method?a=h(e):e&&e.return&&e.return()}else o={status:404,statusText:"Error 404: Not Found"};return new Response(a,o)}}function w(e){return async t=>{const{options:n,content:r}=await t;let s;const{url:a,mode:o}=n;delete n.mode,delete n.url,"GET"!==n.method&&"HEAD"!==n.method&&"OPTIONS"!==n.method?(s=h(r),n.duplex="half"):r&&r.return&&r.return();const i=new Request(a,{...n,body:s}),c=await e(i);return{options:{status:c.status,statusText:c.statusText,headers:Object.fromEntries([...c.headers])},content:await f(await c.body)}}}async function*y(e){const{options:t,content:n}=await e,r=new TextEncoder;yield r.encode(JSON.stringify(t)),yield*n}async function m(e){e=await e;const{done:t,value:n}=await e.next();let r={};if(!t&&n){const e=(new TextDecoder).decode(n);r=JSON.parse(e)}return{options:r,content:e}}function g(e,t){const n=w(t);return l(e,(e=>y(n(m(e)))))}async function v(e,t){const n=p((async t=>await m(c(e,y(t)))));return await n(t)}function _(e){return new Promise(((t,n)=>{e.oncomplete=e.onsuccess=()=>t(e.result),e.onabort=e.onerror=()=>n(e.error)}))}let C;function I(){return C||(C=function(e,t){const n=indexedDB.open(e);n.onupgradeneeded=()=>n.result.createObjectStore(t);const r=_(n);return(e,n)=>r.then((r=>n(r.transaction(t,e).objectStore(t))))}("keyval-store","keyval")),C}class R{constructor(e){if(this.options=e,!this.key)throw new Error("Key is not defined.");if(!this.scope)throw new Error("Scope is not defined")}get key(){return this.options.key}get scope(){return this.options.scope||new URL("./",this.serviceWorkerUrl).pathname}get rootUrl(){return new URL(this.scope,"undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:document.currentScript&&document.currentScript.src||new URL("index-umd.min.js",document.baseURI).href)}get serviceWorkerUrl(){if(!this._serviceWorkerUrl){let e=this.options.serviceWorkerUrl?new URL(this.options.serviceWorkerUrl):new URL("./index-sw.js",this.rootUrl);this._serviceWorkerUrl=e+""}return this._serviceWorkerUrl}async _newCommunicationChannel(){const e=new MessageChannel;return[e.port1,e.port2]}async _setCommunicationPort(e){await this.options.bindPort(e)}async _updateCommunicationChannel(){if(!this._serviceWorker)return;const[e,t]=await this._newCommunicationChannel();await this._setCommunicationPort(e),await r(this._serviceWorker,"UPDATE_COMMUNICATION_PORT",this._getRegistrationInfo(),t)}_getRegistrationInfo(){return{key:this.key}}async start(){return this._registrationPromise=this._registrationPromise||(async()=>{const[e,t]=a();this._cleanupRegistrations=t,e((()=>this._cleanupRegistrations=null));const n=await navigator.serviceWorker.register(this.serviceWorkerUrl,{scope:this.scope});e((()=>n.unregister())),e(s(navigator.serviceWorker,"UPDATE_COMMUNICATION_PORT",(async(e,t,n)=>(console.log("[UPDATE_COMMUNICATION_PORT]",n),this._setCommunicationPort(n),this._getRegistrationInfo())))),this._serviceWorker=await async function(){return await new Promise((e=>{const t=navigator.serviceWorker;if(t.controller)e(t.controller);else{const n=()=>{e(t.controller),t.removeEventListener("controllerchange",n),t.oncontrollerchange=null};t.addEventListener("controllerchange",n),t.oncontrollerchange=n}}))}(),await async function(e){const t=()=>"activated"===e.state;await new Promise((async n=>{t()?n():e.onstatechange=()=>{t()&&(e.onstatechange=null,n())}}))}(this._serviceWorker),await this._updateCommunicationChannel()})()}async stop(){this._cleanupRegistrations&&this._cleanupRegistrations();const e=await navigator.serviceWorker.getRegistrations();for(let t of e)try{await t.unregister()}catch(e){console.log("Service Worker registration failed: ",e)}}}class k{constructor({self:e,log:t}){this.self=e,this.log=t,this.handlersIndex=new Map}get scope(){return new URL("./","undefined"==typeof document&&"undefined"==typeof location?require("url").pathToFileURL(__filename).href:"undefined"==typeof document?location.href:document.currentScript&&document.currentScript.src||new URL("index-umd.min.js",document.baseURI).href)+""}async loadChannelInfo(e){let t;await this._checkActivation();for(let n of this.handlersIndex.values()){if(n.key!==e)continue;const r=n.clientId;if(!await self.clients.get(r))throw this.handlersIndex.delete(r),Object.assign(new Error("Error 410: Resource Gone"),{status:410});t=n;break}return t}start(){this._cleanup=s(this.self,"UPDATE_COMMUNICATION_PORT",(async(e,t,n)=>{const r=e.source.id;return this.log("[UPDATE_COMMUNICATION_PORT]",r,t),await this._updateChannelInfo({...t,port:n,clientId:r}),{...t}})),this.self.onmessage=()=>{},this.self.addEventListener("install",(e=>{this.log("Skip waiting on install.",e),this.self.skipWaiting()})),this.self.addEventListener("activate",(async e=>{this.log("Claim control over all clients.",e,clients,this.self.clients),e.waitUntil((async()=>{await this.self.clients.claim(),await this._checkActivation()})())}))}async stop(){this._cleanup&&(await this._cleanup(),this._cleanup=void 0)}async _checkActivation(){return this._activationPromise=this._activationPromise||this._activate()}async _activate(){this.log("[checkActivation]");let e=await this._loadClientIds();for(let[t,n]of e.entries()){const e=new MessageChannel,s=e.port1,a=await r(n,"UPDATE_COMMUNICATION_PORT",{},e.port2);await this._updateChannelInfo({...a,port:s,clientId:t})}}async _updateChannelInfo(e){this.log("[updateClientInfo]",e),this.handlersIndex.set(e.clientId,e),await this._updateClientIds([])}async _loadClientIds(){const e=new Set(await function(e,t=I()){return t("readonly",(t=>_(t.get(e))))}("clientIds")||[]);return await this._updateClientIds(e)}async _updateClientIds(e){e=new Set(e);for(let t of this.handlersIndex.keys())e.add(t);const t=new Map;for(let n of e){const e=await this.self.clients.get(n);e?t.set(n,e):this.handlersIndex.delete(n)}return await function(e,t,n=I()){return n("readwrite",(n=>(n.put(t,e),_(n.transaction))))}("clientIds",[...t.keys()].sort()),t}}class b extends k{constructor(e){super(e)}start(){super.start(),this.self.addEventListener("fetch",this._handleFetchEvent.bind(this))}_handleFetchEvent(e){e.respondWith((async()=>{const t=e.request;try{const e=t.url,n=this.scope;let r;if(0===e.indexOf(n)){const t=e.substring(n.length).replace(/^\/?([^\/]+).*$/,"$1");r=await this.loadChannelInfo(t)}if(r&&r.port)return await v(r.port,t);{const n=new Request(e,{method:t.method,headers:t.headers,body:t.body,referrer:t.referrer,referrerPolicy:t.referrerPolicy,credentials:t.credentials,cache:t.cache,redirect:t.redirect,integrity:t.integrity});return await fetch(n)}}catch(e){return console.error(e),new Response(null,{status:500,statusText:"Error 500: Internal error"})}})())}}e.SwHttpAdapter=class extends R{constructor(e){super(e),this._handlers=new Map}async _setCommunicationPort(e){this._cleanupRequestChannel&&this._cleanupRequestChannel(),this._cleanupRequestChannel=g(e,this._handleHttpRequest.bind(this))}async _handleHttpRequest(e){const t=e.url;let n;for(let e of this._handlers.entries()){const[r]=e;if(0===t.indexOf(r)){n=e[1];break}}return n?n(e):new Response(null,{status:404,statusMessage:"Error 404: Not found"})}async register(e,t){e="./"+(e||"").replace(/^[\.\/]+/,"");const n=this.rootUrl,r=new URL(e,n)+"";return this._handlers.set(r,t),{baseUrl:r,prefix:e,async remove(){this._handlers.delete(r)}}}},e.SwHttpDispatcher=b,e.SwPortDispatcher=k,e.SwPortHandler=R,e.callChannel=r,e.deserializeError=n,e.fromReadableStream=f,e.handleChannelCalls=s,e.handleHttpRequests=g,e.handleStreams=l,e.newChannel=u,e.newHttpClientStub=p,e.newHttpServerStub=w,e.newInvokationChannel=d,e.newRegistry=a,e.recieveData=o,e.sendData=i,e.sendHttpRequest=v,e.sendStream=c,e.serializeError=t,e.startHttpDispatcher=function({self:e,log:t}){const n=new b({self:e,log:t});return n.start(),()=>{n.stop()}},e.toReadableStream=h}));
|
|
1
|
+
// @statewalker/webrun-http-browser v0.2.0 https://github.com/statewalker/statewalker-webrun-http-browser Copyright 2023 Mikhail Kotelnikov
|
|
2
|
+
!function(e,t){"object"==typeof exports&&"undefined"!=typeof module?t(exports):"function"==typeof define&&define.amd?define(["exports"],t):t(((e="undefined"!=typeof globalThis?globalThis:e||self).statewalker=e.statewalker||{},e.statewalker["webrun-http-browser"]=e.statewalker["webrun-http-browser"]||{}))}(this,(function(e){"use strict";function t(e){return Object.assign({message:e,stack:e.stack},e)}function n(e){return"string"==typeof e&&(e={message:e}),Object.assign(new Error(e.message),e)}async function r(e,t,r,...o){return new Promise(((a,s)=>{const c=new MessageChannel;c.port1.onmessage=e=>{const{result:t,error:r}=e.data;r?s(n(r)):a(t)},e.postMessage({type:t,params:r},[c.port2,...o])}))}function o(e,n,r){const o=async e=>{if(!e.data||e.data.type!==n)return;const[o,...a]=e.ports;let s={};try{const t=e.data.params;s.result=await r(e,t,...a)}catch(e){s.error=t(e)}o.postMessage(s)};e.addEventListener("message",o);try{e.start&&e.start()}catch(e){}return()=>e.removeEventListener("message",o)}function a(e=console.error){let t=0;const n={},r=r=>{const o=t++;return n[o]=Object.assign((function(t){try{return delete n[o],!t&&r&&r()}catch(t){e(t)}}),{action:r})},o=e=>Object.values(n).forEach((t=>t.action===e&&t(!0))),a=()=>Object.values(n).forEach((e=>e()));return Object.assign([r,a,o],{register:r,clear:a,unregister:o})}async function*s(e){yield*async function*(e,t=[]){let n,r,o=async(e,n,o)=>{const a={error:e,value:n,done:o};return a.promise=new Promise((e=>a.notify=e)),await t.push(a),r&&r(),r=null,a.promise};const a=e=>o(void 0,e,!1),s=()=>o(void 0,void 0,!0),c=e=>o(e,void 0,!0),i=e(Object.assign([a,s,c],{next:a,complete:s,error:c}));let l;try{for(;;)if(l=await t.shift(),l)try{if(l.error)throw l.error;if(l.done)break;yield l.value}finally{l.notify(!0)}else await(n=r?n:new Promise((e=>r=e)))}finally{for(r&&r(),o=()=>!1,"function"==typeof i&&await i();l=await t.shift();)l.notify(!1)}}((t=>e((async({done:e=!0,value:n,error:r}={})=>{r?await t.error(r):e?await t.complete():await t.next(n)}))))}async function c(e,t){let n;try{for await(let n of t)await e({done:!1,value:n})}catch(e){n=e}finally{await e({done:!0,error:n})}}async function*i(e,t,n={}){const r=new MessageChannel;e.postMessage({type:"START_CALL",params:n},[r.port2]);const o=u(r.port1);try{await o.start(),o.sendAll(t),yield*o.recieveAll()}finally{await o.close()}}function l(e,t){const n=async e=>{const{type:n,params:r}=e.data||{};if("START_CALL"!==n)return;const o=u(e.ports[0]);try{await o.start();const e=o.recieveAll(),n=await t(e,r);await o.sendAll(n)}finally{await o.close()}};e.addEventListener("message",n);try{e.start&&e.start()}catch(e){}return()=>e.removeEventListener("message",n)}function u(e){let t=[],n=[];const r=async e=>{for(let n of t)await n(e)},o=d({port:e,handler:r});return{start:()=>o.start(),close:async()=>{await r({done:!0}),[...n].forEach((e=>e.return&&e.return())),await o.close()},recieveAll:async function*(){yield*s((e=>(t.push(e),()=>t=t.filter((t=>t!==e)))))},sendAll:async function(e){await c(o.invoke,async function*(){try{n.push(e),yield*e}finally{n=n.filter((t=>t!==e))}}())}}}function d({port:e,handler:r=(()=>{throw new Error("Handler not implemented")}),onError:o=console.error,newCallId:a=(()=>d.__counter=(d.__counter||0)+1)}){const s="REQUEST",c="RESPONSE",i="message",l={},u=async o=>{const a=o.data||{},{type:i,callId:u}=a;if(i===s)try{const{request:t}=a;let n=await r(t,...o.ports||[]);const[s,...i]=Array.isArray(n)?n:void 0!==n?[n]:[];e.postMessage({type:c,callId:u,response:s},i)}catch(n){e.postMessage({type:c,callId:u,error:t(n)})}else if(i===c){const{callId:e,response:t,error:r}=a,o=l[e];delete l[e],o&&(r?o.reject(n(r)):o.resolve(t))}};return{start:async()=>{try{e.addEventListener(i,u),e.start&&await e.start()}catch(e){o(e)}},close:async()=>{try{e.removeEventListener(i,u),e.close&&await e.close()}catch(e){o(e)}},invoke:async function(t={},...n){const r=a();return new Promise(((o,a)=>{try{l[r]={resolve:o,reject:a},e.postMessage({type:s,callId:r,request:t},n)}catch(e){a(e),delete t[r]}}))}}}function f(e){return new ReadableStream({type:"bytes",async pull(t){let n=!1;try{for(;;){const n=await e.next();if(!n||n.done)break;t.enqueue(await n.value)}}catch(e){n=!0,t.error(e)}finally{!n&&t.close()}}})}async function*p(e){const t=await e.getReader();let n,r;for(;({done:n,value:r}=await t.read())&&!n;)yield await r}function y(e){return async t=>{t=await t;const n=["url","method","mode","credentials","cache","redirect","referrer","referrerPolicy","integrity","keepalive"].reduce(((e,n)=>{const r=t[n];return void 0!==r&&(e[n]=r),e}),{}),r=t.body?p(t.body):[],o=await e({options:n,content:r});let a=null,s={};if(o){s=o.options;const e=o.content;"HEAD"!==n.method&&"OPTIONS"!==n.method?a=f(e):e&&e.return&&e.return()}else s={status:404,statusText:"Error 404: Not Found"};return new Response(a,s)}}function w(e){return async t=>{const{options:n,content:r}=await t;let o;const{url:a,mode:s}=n;delete n.mode,delete n.url,"GET"!==n.method&&"HEAD"!==n.method&&"OPTIONS"!==n.method?(o=f(r),n.duplex="half"):r&&r.return&&r.return();const c=new Request(a,{...n,body:o}),i=await e(c);return{options:{status:i.status,statusText:i.statusText,headers:Object.fromEntries([...i.headers])},content:await p(await i.body)}}}async function*m(e){const{options:t,content:n}=await e,r=new TextEncoder;yield r.encode(JSON.stringify(t)),yield*n}async function h(e){e=await e;const{done:t,value:n}=await e.next();let r={};if(!t&&n){const e=(new TextDecoder).decode(n);r=JSON.parse(e)}return{options:r,content:e}}function g(e,t){const n=w(t);return l(e,(e=>m(n(h(e)))))}async function v(e,t){const n=y((async t=>await h(i(e,m(t)))));return await n(t)}function b(){const e=new MessageChannel;return e.port1.onmessage=e=>{navigator.serviceWorker.controller.postMessage(e.data,e.ports)},navigator.serviceWorker.addEventListener("message",(t=>{e.port1.postMessage(t.data,t.ports)})),e.port2}async function E({swUrl:e,scopeUrl:t,type:n}){await navigator.serviceWorker.register(e,{type:n,scope:t});const r=await async function(){return await new Promise((e=>{const t=navigator.serviceWorker;if(t.controller)e(t.controller);else{const n=()=>{e(t.controller),t.removeEventListener("controllerchange",n),t.oncontrollerchange=null};t.addEventListener("controllerchange",n),t.oncontrollerchange=n}}))}();return await async function(e){const t=()=>"activated"===e.state;await new Promise((async n=>{t()?n():e.onstatechange=()=>{t()&&(e.onstatechange=null,n())}}))}(r),r}async function R({key:e,communicationPort:t,...n}){const o=new MessageChannel;return await r(t,"CONNECT",{key:e,...n},o.port2)?o.port1:(o.port1.close(),o.port2.close(),null)}async function k({key:e,handler:t,communicationPort:n}){const[s,c]=a();return await r(n,"REGISTER",{key:e}),s((()=>r(n,"UNREGISTER",{key:e}))),s(o(n,"CONNECT",t)),c}e.callChannel=r,e.callHttpService=async function(e,{key:t,port:n}){const r=await R({key:t,communicationPort:n});return await v(r,e)},e.deserializeError=n,e.fromReadableStream=p,e.getRelayWindowMessageHandler=function({swUrl:e=new URL("./index-sw.js","undefined"==typeof document&&"undefined"==typeof location?new(require("url").URL)("file:"+__filename).href:"undefined"==typeof document?location.href:document.currentScript&&document.currentScript.src||new URL("index-umd.min.js",document.baseURI).href)+"",scopeUrl:t=new URL("../","undefined"==typeof document&&"undefined"==typeof location?new(require("url").URL)("file:"+__filename).href:"undefined"==typeof document?location.href:document.currentScript&&document.currentScript.src||new URL("index-umd.min.js",document.baseURI).href)+""}={}){let n;return async r=>{if("CONNECT"===r.data.type){const o=(r.ports||[])[0];if(n)return void o.close();n=o,await E({swUrl:e,scopeUrl:t});const a=b();a.onmessage=e=>{n.postMessage(e.data,e.ports)},n.onmessage=e=>{a.postMessage(e.data,e.ports)}}}},e.handleChannelCalls=o,e.handleHttpRequests=g,e.handleStreams=l,e.initHttpService=async function(e,{key:t,port:n}){return await k({key:t,communicationPort:n,handler:async(t,n,r)=>(g(r,e),!0)})},e.initServiceWorker=E,e.initServiceWorker1=async function({swUrl:e,scopeUrl:t,type:n}){const{installing:r,waiting:o,active:a}=await navigator.serviceWorker.register(e,{scope:t});(r||o||a).addEventListener("statechange",(e=>{console.log("state",e.target.state)}));const s=navigator.serviceWorker;await new Promise((e=>{if(s.controller)e();else{const t=()=>{e(),s.removeEventListener("controllerchange",t),s.oncontrollerchange=null};s.addEventListener("controllerchange",t),s.oncontrollerchange=t}}));const c=s.controller,i=()=>"activated"===c.state;return await new Promise((async e=>{i()?e(c):c.onstatechange=()=>{i()&&(c.onstatechange=null,e(c))}}))},e.initializeConnection=R,e.newHttpClientStub=y,e.newHttpServerStub=w,e.newInvokationChannel=d,e.newRegistry=a,e.newRemoteRelayChannel=async function({baseUrl:e=new URL("./","undefined"==typeof document&&"undefined"==typeof location?new(require("url").URL)("file:"+__filename).href:"undefined"==typeof document?location.href:document.currentScript&&document.currentScript.src||new URL("index-umd.min.js",document.baseURI).href),url:t=new URL("./relay.html",e),container:n=document.body}={}){const r=new MessageChannel,{iframe:o,promise:a}=await async function(e){const t=document.createElement("iframe");return t.src=e,Object.assign(t.style,{padding:0,margin:0,border:"none",outline:"none",width:"100%",height:"100%"}),{iframe:t,promise:new Promise(((e,n)=>{try{t.onerror=n,t.onload=()=>e(t)}catch(e){n(e)}}))}}(t);return Object.assign(o.style,{position:"fixed",width:"1px",height:"1px",top:"-1000",left:"-1000",display:"block",opacity:"0",border:"none",outline:"none"}),n.appendChild(o),a.then((()=>{o.contentWindow.postMessage({type:"CONNECT"},"*",[r.port1])})),{port:r.port2,close:()=>{n.parentElement&&n.parentElement.removeChild(n),r.port1.close(),r.port2.close()}}},e.newServiceWorkerPort=b,e.recieveData=s,e.registerConnectionsHandler=k,e.sendData=c,e.sendHttpRequest=v,e.sendStream=i,e.serializeError=t,e.splitServiceUrl=function(e,t="~"){let n="",r="",o=e+"";const a=o.indexOf(t);let s="";return a>=0&&(s=o.substring(0,a+t.length),o.substring(a+t.length).replace(/^([^\/]+)/,((e,t)=>(s+=e,s.length<o.length&&(s+="/"),n=t,r=o.substring(s.length),"")))),{url:e,key:n,baseUrl:s,path:r}},e.toReadableStream=f}));
|