matrix-by-lmx 1.2.0 → 1.3.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.
Potentially problematic release.
This version of matrix-by-lmx might be problematic. Click here for more details.
- package/baremux/LICENSE +7 -0
- package/baremux/index.js +2 -0
- package/baremux/worker.js +2 -0
- package/index.svg +2 -1
- package/libcurl/LICENSE +661 -0
- package/libcurl/index.mjs +6475 -0
- package/package.json +6 -2
- package/scram/LICENSE +661 -0
- package/scram/scramjet.all.js +196 -0
- package/scram/scramjet.sync.js +2 -0
- package/scram/scramjet.wasm.wasm +0 -0
- package/sw.js +14 -0
package/baremux/LICENSE
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
Copyright 2024 Mercury Workshop Inc.
|
|
2
|
+
|
|
3
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the “Software”), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
4
|
+
|
|
5
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
6
|
+
|
|
7
|
+
THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/baremux/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!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).BareMux={})}(this,(function(e){"use strict";const t=globalThis.fetch,r=globalThis.SharedWorker,a=globalThis.localStorage,s=globalThis.navigator.serviceWorker,o=MessagePort.prototype.postMessage,n={prototype:{send:WebSocket.prototype.send},CLOSED:WebSocket.CLOSED,CLOSING:WebSocket.CLOSING,CONNECTING:WebSocket.CONNECTING,OPEN:WebSocket.OPEN};async function c(){const e=(await self.clients.matchAll({type:"window",includeUncontrolled:!0})).map((async e=>{const t=await function(e){let t=new MessageChannel;return new Promise((r=>{e.postMessage({type:"getPort",port:t.port2},[t.port2]),t.port1.onmessage=e=>{r(e.data)}}))}(e);return await i(t),t})),t=Promise.race([Promise.any(e),new Promise(((e,t)=>setTimeout(t,1e3,new TypeError("timeout"))))]);try{return await t}catch(e){if(e instanceof AggregateError)throw console.error("bare-mux: failed to get a bare-mux SharedWorker MessagePort as all clients returned an invalid MessagePort."),new Error("All clients returned an invalid MessagePort.",{cause:e});return console.warn("bare-mux: failed to get a bare-mux SharedWorker MessagePort within 1s, retrying"),await c()}}function i(e){const t=new MessageChannel,r=new Promise(((e,r)=>{t.port1.onmessage=t=>{"pong"===t.data.type&&e()},setTimeout(r,1500)}));return o.call(e,{message:{type:"ping"},port:t.port2},[t.port2]),r}function l(e,t){const a=new r(e,"bare-mux-worker");return t&&s.addEventListener("message",(t=>{if("getPort"===t.data.type&&t.data.port){console.debug("bare-mux: recieved request for port from sw");const a=new r(e,"bare-mux-worker");o.call(t.data.port,a.port,[a.port])}})),a.port}let h=null;function d(){if(null===h){const e=new MessageChannel,t=new ReadableStream;let r;try{o.call(e.port1,t,[t]),r=!0}catch(e){r=!1}return h=r,r}return h}class p{channel;port;workerPath;constructor(e){this.channel=new BroadcastChannel("bare-mux"),e instanceof MessagePort||e instanceof Promise?this.port=e:this.createChannel(e,!0)}createChannel(e,t){if(self.clients)this.port=c(),this.channel.onmessage=e=>{"refreshPort"===e.data.type&&(this.port=c())};else if(e&&SharedWorker){if(!e.startsWith("/")&&!e.includes(":"))throw new Error("Invalid URL. Must be absolute or start at the root.");this.port=l(e,t),console.debug("bare-mux: setting localStorage bare-mux-path to",e),a["bare-mux-path"]=e}else{if(!SharedWorker)throw new Error("Unable to get a channel to the SharedWorker.");{const e=a["bare-mux-path"];if(console.debug("bare-mux: got localStorage bare-mux-path:",e),!e)throw new Error("Unable to get bare-mux workerPath from localStorage.");this.port=l(e,t)}}}async sendMessage(e,t){this.port instanceof Promise&&(this.port=await this.port);try{await i(this.port)}catch{return console.warn("bare-mux: Failed to get a ping response from the worker within 1.5s. Assuming port is dead."),this.createChannel(),await this.sendMessage(e,t)}const r=new MessageChannel,a=[r.port2,...t||[]],s=new Promise(((e,t)=>{r.port1.onmessage=r=>{const a=r.data;"error"===a.type?t(a.error):e(a)}}));return o.call(this.port,{message:e,port:r.port2},a),await s}}class u extends EventTarget{protocols;url;readyState=n.CONNECTING;channel;constructor(e,t=[],r,a){super(),this.protocols=t,this.url=e.toString(),this.protocols=t;const s=e=>{this.protocols=e,this.readyState=n.OPEN;const t=new Event("open");this.dispatchEvent(t)},o=async e=>{const t=new MessageEvent("message",{data:e});this.dispatchEvent(t)},c=(e,t)=>{this.readyState=n.CLOSED;const r=new CloseEvent("close",{code:e,reason:t});this.dispatchEvent(r)},i=()=>{this.readyState=n.CLOSED;const e=new Event("error");this.dispatchEvent(e)};this.channel=new MessageChannel,this.channel.port1.onmessage=e=>{"open"===e.data.type?s(e.data.args[0]):"message"===e.data.type?o(e.data.args[0]):"close"===e.data.type?c(e.data.args[0],e.data.args[1]):"error"===e.data.type&&i()},r.sendMessage({type:"websocket",websocket:{url:e.toString(),protocols:t,requestHeaders:a,channel:this.channel.port2}},[this.channel.port2])}send(...e){if(this.readyState===n.CONNECTING)throw new DOMException("Failed to execute 'send' on 'WebSocket': Still in CONNECTING state.");let t=e[0];t.buffer&&(t=t.buffer.slice(t.byteOffset,t.byteOffset+t.byteLength)),o.call(this.channel.port1,{type:"data",data:t},t instanceof ArrayBuffer?[t]:[])}close(e,t){o.call(this.channel.port1,{type:"close",closeCode:e,closeReason:t})}}function w(e,t,r){console.error(`error while processing '${r}': `,t),e.postMessage({type:"error",error:t})}function f(e){for(let t=0;t<e.length;t++){const r=e[t];if(!"!#$%&'*+-.0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ^_`abcdefghijklmnopqrstuvwxyz|~".includes(r))return!1}return!0}const g=["ws:","wss:"],b=[101,204,205,304],y=[301,302,303,307,308];class m{worker;constructor(e){this.worker=new p(e)}createWebSocket(e,t=[],r,a){try{e=new URL(e)}catch(t){throw new DOMException(`Faiiled to construct 'WebSocket': The URL '${e}' is invalid.`)}if(!g.includes(e.protocol))throw new DOMException(`Failed to construct 'WebSocket': The URL's scheme must be either 'ws' or 'wss'. '${e.protocol}' is not allowed.`);Array.isArray(t)||(t=[t]),t=t.map(String);for(const e of t)if(!f(e))throw new DOMException(`Failed to construct 'WebSocket': The subprotocol '${e}' is invalid.`);a=a||{};return new u(e,t,this.worker,a)}async fetch(e,r){const a=new Request(e,r),s=r?.headers||a.headers,o=s instanceof Headers?Object.fromEntries(s):s,n=a.body;let c=new URL(a.url);if(c.protocol.startsWith("blob:")){const e=await t(c),r=new Response(e.body,e);return r.rawHeaders=Object.fromEntries(e.headers),r.rawResponse={body:e.body,headers:Object.fromEntries(e.headers),status:e.status,statusText:e.statusText},r.finalURL=c.toString(),r}for(let e=0;;e++){let t=(await this.worker.sendMessage({type:"fetch",fetch:{remote:c.toString(),method:a.method,headers:o,body:n||void 0}},n?[n]:[])).fetch,s=new Response(b.includes(t.status)?void 0:t.body,{headers:new Headers(t.headers),status:t.status,statusText:t.statusText});s.rawHeaders=t.headers,s.rawResponse=t,s.finalURL=c.toString();const i=r?.redirect||a.redirect;if(!y.includes(s.status))return s;switch(i){case"follow":{const t=s.headers.get("location");if(20>e&&null!==t){c=new URL(t,c);continue}throw new TypeError("Failed to fetch")}case"error":throw new TypeError("Failed to fetch");case"manual":return s}}}}console.debug("bare-mux: running v2.1.9 (build dc9dc6e)"),e.BareClient=m,e.BareMuxConnection=class{worker;constructor(e){this.worker=new p(e)}async getTransport(){return(await this.worker.sendMessage({type:"get"})).name}async setTransport(e,t,r){await this.setManualTransport(`\n\t\t\tconst { default: BareTransport } = await import("${e}");\n\t\t\treturn [BareTransport, "${e}"];\n\t\t`,t,r)}async setManualTransport(e,t,r){if("bare-mux-remote"===e)throw new Error("Use setRemoteTransport.");await this.worker.sendMessage({type:"set",client:{function:e,args:t}},r)}async setRemoteTransport(e,t){const r=new MessageChannel;r.port1.onmessage=async t=>{const r=t.data.port,a=t.data.message;if("fetch"===a.type)try{e.ready||await e.init(),await async function(e,t,r){const a=await r.request(new URL(e.fetch.remote),e.fetch.method,e.fetch.body,e.fetch.headers,null);if(!d()&&a.body instanceof ReadableStream){const e=new Response(a.body);a.body=await e.arrayBuffer()}a.body instanceof ReadableStream||a.body instanceof ArrayBuffer?o.call(t,{type:"fetch",fetch:a},[a.body]):o.call(t,{type:"fetch",fetch:a})}(a,r,e)}catch(e){w(r,e,"fetch")}else if("websocket"===a.type)try{e.ready||await e.init(),await async function(e,t,r){const[a,s]=r.connect(new URL(e.websocket.url),e.websocket.protocols,e.websocket.requestHeaders,(t=>{o.call(e.websocket.channel,{type:"open",args:[t]})}),(t=>{t instanceof ArrayBuffer?o.call(e.websocket.channel,{type:"message",args:[t]},[t]):o.call(e.websocket.channel,{type:"message",args:[t]})}),((t,r)=>{o.call(e.websocket.channel,{type:"close",args:[t,r]})}),(t=>{o.call(e.websocket.channel,{type:"error",args:[t]})}));e.websocket.channel.onmessage=e=>{"data"===e.data.type?a(e.data.data):"close"===e.data.type&&s(e.data.closeCode,e.data.closeReason)},o.call(t,{type:"websocket"})}(a,r,e)}catch(e){w(r,e,"websocket")}},await this.worker.sendMessage({type:"set",client:{function:"bare-mux-remote",args:[r.port2,t]}},[r.port2])}getInnerPort(){return this.worker.port}},e.BareWebSocket=u,e.WebSocketFields=n,e.WorkerConnection=p,e.browserSupportsTransferringStreams=d,e.default=m,e.maxRedirects=20,e.validProtocol=f,Object.defineProperty(e,"__esModule",{value:!0})}));
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
!function(){"use strict";const e=MessagePort.prototype.postMessage;let t=null;function a(e,t,a){console.error(`error while processing '${a}': `,t),e.postMessage({type:"error",error:t})}async function n(a,n,s){const o=await s.request(new URL(a.fetch.remote),a.fetch.method,a.fetch.body,a.fetch.headers,null);if(!function(){if(null===t){const a=new MessageChannel,n=new ReadableStream;let s;try{e.call(a.port1,n,[n]),s=!0}catch(e){s=!1}return t=s,s}return t}()&&o.body instanceof ReadableStream){const e=new Response(o.body);o.body=await e.arrayBuffer()}o.body instanceof ReadableStream||o.body instanceof ArrayBuffer?e.call(n,{type:"fetch",fetch:o},[o.body]):e.call(n,{type:"fetch",fetch:o})}let s=null,o="";function c(){return new Error("there are no bare clients",{cause:"No BareTransport was set. Try creating a BareMuxConnection and calling `setTransport()` or `setManualTransport()` on it before using BareClient."})}function r(t,a){const n=s;let o=[a];t.fetch?.body&&o.push(t.fetch.body),t.websocket?.channel&&o.push(t.websocket.channel),e.call(n,{message:t,port:a},o)}function l(t){t.onmessage=async t=>{const l=t.data.port,i=t.data.message;if("ping"===i.type)e.call(l,{type:"pong"});else if("set"===i.type)try{const t=async function(){}.constructor;if("bare-mux-remote"===i.client.function)s=i.client.args[0],o=`bare-mux-remote (${i.client.args[1]})`;else try{const e=new t(i.client.function),[a,n]=await e();s=new a(...i.client.args),o=n}catch(e){throw e.cause="The BareTransport provided was invalid. Common causes of this are a default export that is not a class that implements BareTransport if you are using `setTransport()`",e}console.log("set transport to ",s,o),e.call(l,{type:"set"})}catch(e){a(l,e,"set")}else if("get"===i.type)l.postMessage({type:"get",name:o});else if("fetch"===i.type)try{if(!s)throw c();if(s instanceof MessagePort)return void r(i,l);s.ready||await s.init(),await n(i,l,s)}catch(e){a(l,e,"fetch")}else if("websocket"===i.type)try{if(!s)throw c();if(s instanceof MessagePort)return void r(i,l);s.ready||await s.init(),await async function(t,a,n){const[s,o]=n.connect(new URL(t.websocket.url),t.websocket.protocols,t.websocket.requestHeaders,(a=>{e.call(t.websocket.channel,{type:"open",args:[a]})}),(a=>{a instanceof ArrayBuffer?e.call(t.websocket.channel,{type:"message",args:[a]},[a]):e.call(t.websocket.channel,{type:"message",args:[a]})}),((a,n)=>{e.call(t.websocket.channel,{type:"close",args:[a,n]})}),(a=>{e.call(t.websocket.channel,{type:"error",args:[a]})}));t.websocket.channel.onmessage=e=>{"data"===e.data.type?s(e.data.data):"close"===e.data.type&&o(e.data.closeCode,e.data.closeReason)},e.call(a,{type:"websocket"})}(i,l,s)}catch(e){a(l,e,"websocket")}}}new BroadcastChannel("bare-mux").postMessage({type:"refreshPort"}),self.onconnect=e=>{l(e.ports[0])},console.debug("bare-mux: running v2.1.9 (build dc9dc6e)")}();
|
|
2
|
+
//# sourceMappingURL=worker.js.map
|
package/index.svg
CHANGED
|
@@ -6,7 +6,7 @@
|
|
|
6
6
|
<section id="games" class="view"><div class="head"><b class="tag">MATRIX / CLOUD ARCADE</b><h1>Pick a game.</h1><p>Live community catalog loaded directly from its public CDN.</p></div><div class="tools"><input id="game-search" placeholder="Search games"/><span id="count" class="count">Loading…</span></div><div id="game-grid" class="grid"></div></section>
|
|
7
7
|
<section id="apps" class="view"><div class="head"><b class="tag">MATRIX / APPS</b><h1>Web apps.</h1></div><div id="apps-grid" class="grid apps"></div></section>
|
|
8
8
|
<section id="tools" class="view"><div class="head"><b class="tag">MATRIX / UTILITIES</b><h1>Useful tools.</h1></div><div class="grid"><div class="panel"><h3>Clock</h3><p id="clock">--:--:--</p></div><div class="panel"><h3>Editable workspace</h3><button id="edit">Enable editing</button></div><div class="panel"><h3>Reset</h3><button id="reset">Return home</button></div></div></section>
|
|
9
|
-
<section id="settings" class="view"><div class="head"><b class="tag">MATRIX / SETTINGS</b><h1>Preferences.</h1></div><div class="panel"><h3>
|
|
9
|
+
<section id="settings" class="view"><div class="head"><b class="tag">MATRIX / SETTINGS</b><h1>Preferences.</h1></div><div class="panel"><h3>Scramjet browser mode</h3><p>The SVG package includes its own service worker and official Scramjet client assets. Traffic uses the Mercury Workshop Wisp relay; no Vercel or Render deployment is required.</p></div><div class="panel"><h3>Player containment</h3><p>Search, Apps, and Games open in the same full-screen Matrix player with Back, Reload, and Exit controls.</p></div></section></main></div>
|
|
10
10
|
<div id="player" class="player"><div class="bar"><b class="tab-dot">M</b><strong id="pt">Matrix Player</strong><span id="player-state">Ready</span><button id="back">Back</button><button id="reload">Reload</button><button id="close">Exit</button></div><iframe id="frame" title="Matrix player" allow="fullscreen;autoplay;gamepad"></iframe></div>
|
|
11
11
|
<script><![CDATA[
|
|
12
12
|
(function(){var names={home:"New Tab",games:"Games",apps:"Apps",tools:"Utilities",settings:"Settings"},all=[],blobUrl="",player=document.getElementById("player"),frame=document.getElementById("frame"),proxy="";function show(v){document.querySelectorAll(".view").forEach(function(x){x.classList.toggle("on",x.id===v)});document.querySelectorAll(".nav").forEach(function(x){x.classList.toggle("on",x.dataset.v===v)});document.getElementById("title").textContent=names[v]}document.querySelectorAll("[data-v]").forEach(function(x){x.onclick=function(){show(x.dataset.v)}});document.querySelectorAll("[data-go]").forEach(function(x){x.onclick=function(){show(x.dataset.go)}});function open(t,u){document.getElementById("pt").textContent=t;frame.src=u;player.classList.add("on")}async function openGame(g){document.getElementById("pt").textContent=g.name+" · Loading";player.classList.add("on");try{var url=g.url.replace("{HTML_URL}","https://cdn.jsdelivr.net/gh/bubbls/ugs-singlefile/UGS-Files"),r=await fetch(url),html=await r.text(),base=new URL(".",url).href;html=/<head[\s>]/i.test(html)?html.replace(/<head([^>]*)>/i,"<head$1><base href=\""+base+"\">"):"<base href=\""+base+"\">"+html;if(blobUrl)URL.revokeObjectURL(blobUrl);blobUrl=URL.createObjectURL(new Blob([html],{type:"text/html"}));frame.src=blobUrl;document.getElementById("pt").textContent=g.name}catch(e){document.getElementById("pt").textContent="Could not load "+g.name;frame.src="about:blank"}}document.getElementById("close").onclick=function(){player.classList.remove("on");frame.src="about:blank";if(blobUrl){URL.revokeObjectURL(blobUrl);blobUrl=""}};document.getElementById("reload").onclick=function(){var u=frame.src;frame.src="about:blank";setTimeout(function(){frame.src=u},20)};
|
|
@@ -15,5 +15,6 @@ function render(){var q=document.getElementById("game-search").value.toLowerCase
|
|
|
15
15
|
proxy="";
|
|
16
16
|
open=function(t,u){document.getElementById("pt").textContent=t;document.getElementById("player-state").textContent="Loading…";player.classList.add("on");player.style.display="grid";player.style.zIndex="9999";player.style.visibility="visible";frame.src=u};document.getElementById("close").onclick=function(){player.classList.remove("on");player.style.display="none";frame.src="about:blank";if(blobUrl){URL.revokeObjectURL(blobUrl);blobUrl=""}};document.getElementById("back").onclick=function(){try{frame.contentWindow.history.back()}catch(e){}};frame.addEventListener("load",function(){document.getElementById("player-state").textContent=frame.src==="about:blank"?"Ready":"Inside Matrix"});
|
|
17
17
|
function safeText(v){return String(v==null?"":v).replace(/[&<>"']/g,function(c){return{"&":"&","<":"<",">":">",'"':""","'":"'"}[c]})}function pageHtml(title,body){return "<!doctype html><html><head><meta charset='utf-8'><meta name='viewport' content='width=device-width'><style>*{box-sizing:border-box}body{margin:0;padding:32px;color:#edf6ff;background:linear-gradient(135deg,#07111f,#0a1930);font-family:Arial,sans-serif}h1{margin:0 0 8px;font-size:36px}p{color:#9fb3cb;line-height:1.55}.results{display:grid;grid-template-columns:repeat(auto-fit,minmax(260px,1fr));gap:14px;margin-top:24px}.result{padding:20px;border:1px solid #294c76;border-radius:12px;background:#0d1d31;box-shadow:0 15px 35px #0005}.result h2{margin:0 0 10px;font-size:18px;color:#8dcbff}.badge{color:#6baee8;font:11px Consolas;letter-spacing:1px}textarea{width:100%;height:65vh;padding:18px;border:1px solid #315781;border-radius:12px;color:#fff;background:#091524;font:16px/1.6 Consolas;resize:none}</style></head><body><span class='badge'>MATRIX / SVG</span><h1>"+safeText(title)+"</h1>"+body+"</body></html>"}function openSvgPage(title,body){open(title,"about:blank");frame.removeAttribute("src");frame.srcdoc=pageHtml(title,body)}async function svgSearch(q){openSvgPage("Search: "+q,"<p>Searching Wikipedia inside Matrix…</p>");try{var api="https://en.wikipedia.org/w/api.php?action=query&generator=search&gsrsearch="+encodeURIComponent(q)+"&gsrlimit=15&prop=extracts&exintro=1&explaintext=1&exsentences=3&format=json&origin=*",r=await fetch(api);if(!r.ok)throw new Error("Search service returned "+r.status);var data=await r.json(),items=Object.values(data.query&&data.query.pages||{}).sort(function(a,b){return(a.index||0)-(b.index||0)}),cards=items.length?items.map(function(x){return"<article class='result'><h2>"+safeText(x.title)+"</h2><p>"+safeText(x.extract||"No summary available.")+"</p></article>"}).join(""):"<p>No results found.</p>";openSvgPage("Search: "+q,"<p>Results stay inside this SVG.</p><div class='results'>"+cards+"</div>")}catch(e){openSvgPage("Search unavailable","<p>"+safeText(e.message)+"</p><p>Check your connection and try again.</p>")}}document.getElementById("search").onsubmit=function(e){e.preventDefault();var q=document.getElementById("q").value.trim();if(q)svgSearch(q)};var svgApps=[["Wikipedia Search","Search public summaries inside Matrix",function(){show("home");document.getElementById("q").focus()}],["Game Finder","Browse the Matrix game catalog",function(){show("games")}],["Notes","Write in a private temporary workspace",function(){openSvgPage("Notes","<p>Notes stay in this tab until it is closed.</p><textarea autofocus placeholder='Start typing…'></textarea>")}],["Clock","Open a distraction-free live clock",function(){openSvgPage("Clock","<p style='font-size:clamp(60px,14vw,170px);color:#8dcbff'>"+new Date().toLocaleTimeString()+"</p>")}],["Utilities","Open Matrix utilities",function(){show("tools")}],["About Matrix","View SVG-only mode details",function(){show("settings")}],["Random Game","Pick something from the catalog",function(){if(all.length)openGame(all[Math.floor(Math.random()*all.length)]);else show("games")}]];ag.innerHTML="";svgApps.forEach(function(a){var b=document.createElement("button");b.className="card";b.innerHTML="<small>SVG APP</small><strong></strong><span></span>";b.querySelector("strong").textContent=a[0];b.querySelector("span").textContent=a[1];b.onclick=a[2];ag.appendChild(b)});
|
|
18
|
+
var sjController=null,sjConnection=null,sjFrame=null,sjReady=null,wispRelay="wss://wisp.mercurywork.shop/",webApps=[["YouTube","https://www.youtube.com/"],["Twitch","https://www.twitch.tv/"],["ChatGPT","https://chatgpt.com/"],["Discord","https://discord.com/app"],["Instagram","https://www.instagram.com/"],["TikTok","https://www.tiktok.com/"],["GitHub","https://github.com/"]];function asset(p){return new URL(p,location.href).href}function loadScript(src){return new Promise(function(resolve,reject){var s=document.createElement("script");s.src=src;s.onload=resolve;s.onerror=function(){reject(new Error("Could not load "+src))};document.head.appendChild(s)})}async function prepareBrowser(){if(sjReady)return sjReady;sjReady=(async function(){if(!navigator.serviceWorker)throw new Error("This browser does not allow service workers in SVG documents.");await loadScript(asset("./scram/scramjet.all.js"));await loadScript(asset("./baremux/index.js"));var C=$scramjetLoadController().ScramjetController,prefix=new URL("./sj/",location.href).pathname;sjController=new C({prefix:prefix,files:{wasm:asset("./scram/scramjet.wasm.wasm"),all:asset("./scram/scramjet.all.js"),sync:asset("./scram/scramjet.sync.js")}});await sjController.init();await navigator.serviceWorker.register(asset("./sw.js"),{scope:new URL("./",location.href).pathname});sjConnection=new BareMux.BareMuxConnection(asset("./baremux/worker.js"));await sjConnection.setTransport(asset("./libcurl/index.mjs"),[{websocket:wispRelay}]);return true})().catch(function(e){sjReady=null;throw e});return sjReady}async function openWeb(title,url){open(title,"about:blank");document.getElementById("player-state").textContent="Starting secure browser…";try{await prepareBrowser();if(!sjFrame)sjFrame=sjController.createFrame(frame);await sjFrame.go(url);document.getElementById("player-state").textContent="Inside Matrix"}catch(e){openSvgPage("Browser unavailable","<p>"+safeText(e.message)+"</p><p>The official Wisp relay may be offline or this browser may block service workers in SVG files.</p>")}}ag.innerHTML="";webApps.forEach(function(a){var b=document.createElement("button");b.className="card";b.innerHTML="<small>SCRAMJET WEB APP</small><strong></strong><span>Open inside Matrix ↗</span>";b.querySelector("strong").textContent=a[0];b.onclick=function(){openWeb(a[0],a[1])};ag.appendChild(b)});document.getElementById("search").onsubmit=function(e){e.preventDefault();var q=document.getElementById("q").value.trim();if(!q)return;var isUrl=/^(https?:\/\/|localhost(?::\d+)?(?:\/|$)|(?:[a-z0-9-]+\.)+[a-z]{2,}(?:[\/:?#]|$))/i.test(q),target=isUrl?(/^https?:\/\//i.test(q)?q:"https://"+q):"https://www.google.com/search?q="+encodeURIComponent(q);document.getElementById("msg").textContent="Opening through Matrix Scramjet…";openWeb(isUrl?q:"Search: "+q,target)};
|
|
18
19
|
var fx=document.createElement("style");fx.textContent=".shell,.main{min-height:0}.main{overflow:hidden}.view{min-height:0;overscroll-behavior:contain;scrollbar-color:#53a9ff #0a1320;scrollbar-width:thin;padding-bottom:90px;background:linear-gradient(120deg,#06101ed9,#071222a8),url('background.gif') center/cover fixed}.view::-webkit-scrollbar{width:10px}.view::-webkit-scrollbar-track{background:#0a1320}.view::-webkit-scrollbar-thumb{border:2px solid #0a1320;border-radius:10px;background:linear-gradient(#63bcff,#765cff)}.view.on{animation:viewIn .42s cubic-bezier(.2,.8,.2,1)}body:before,body:after{content:'';position:fixed;pointer-events:none;z-index:0;border-radius:50%;filter:blur(80px);opacity:.18;animation:drift 9s ease-in-out infinite alternate}body:before{width:420px;height:420px;left:12%;top:-180px;background:#168cff}body:after{width:360px;height:360px;right:-100px;bottom:-140px;background:#874cff;animation-delay:-4s}.side{background:#081221e8;backdrop-filter:blur(18px)}.side,.main{position:relative;z-index:1}.brand b{box-shadow:0 0 25px #4a9dff66;animation:logoPulse 2.6s ease-in-out infinite}.top{background:#07111ddd;backdrop-filter:blur(16px);box-shadow:0 8px 35px #0005}.nav{transition:transform .2s,color .2s,background .2s,box-shadow .2s}.nav:hover{transform:translateX(5px);box-shadow:inset 3px 0 #65b8ff}.hero h1,.head h1{background:linear-gradient(110deg,#fff 15%,#78bdff 48%,#b08cff 70%,#fff 88%);background-size:220% auto;color:transparent;background-clip:text;-webkit-background-clip:text;animation:shine 5s linear infinite}.hero em{color:transparent}.search{background:#07111dcc;backdrop-filter:blur(12px);box-shadow:0 18px 70px #168cff20,0 0 0 1px #6abaff18;transition:transform .25s,box-shadow .25s}.search:focus-within{transform:translateY(-3px);box-shadow:0 22px 80px #168cff3d,0 0 0 1px #72c3ff}.search button,.quick button,.bar button{transition:transform .18s,filter .18s,box-shadow .18s}.search button:hover,.quick button:hover,.bar button:hover{transform:translateY(-2px);filter:brightness(1.18);box-shadow:0 8px 28px #4aa7ff42}.card{position:relative;overflow:hidden;transform:translateY(0);transition:transform .22s,border-color .22s,box-shadow .22s,background .22s;background:linear-gradient(145deg,#101d30e8,#0b1421dc);backdrop-filter:blur(12px)}.card:before{content:'';position:absolute;inset:-100% 45%;transform:rotate(25deg);background:linear-gradient(90deg,transparent,#ffffff16,transparent);transition:transform .55s}.card:hover{transform:translateY(-6px) scale(1.015);border-color:#70bdff;box-shadow:0 18px 45px #0008,0 0 30px #318fff24;background:linear-gradient(145deg,#152944ed,#101a2ce8)}.card:hover:before{transform:translateX(320%) rotate(25deg)}.card strong{font-size:16px}.tag{animation:tagPulse 2s ease-in-out infinite}.panel input{width:min(540px,100%);margin:8px 8px 8px 0;padding:12px;border:1px solid #35547d;border-radius:6px;color:#fff;background:#07111dcc}.panel button{padding:12px 18px;border:1px solid #4c8dd0;border-radius:6px;color:#fff;background:#173a61;cursor:pointer}.panel a{color:#78bdff}.player{position:fixed!important;inset:0!important;width:100%!important;height:100%!important;background:#080d15!important;visibility:hidden}.player.on{display:grid!important;visibility:visible!important;grid-template-rows:58px minmax(0,1fr)!important}.player .bar{background:#07111d;border-bottom:1px solid #203354;box-shadow:0 8px 30px #0008}.tab-dot{display:grid;place-items:center;width:30px;height:30px;border:1px solid #65b8ff;border-radius:8px;color:#9ed4ff;box-shadow:0 0 18px #4a9dff55}.player-state{margin-right:8px;color:#6f91b5;font:10px Consolas;text-transform:uppercase;letter-spacing:1px}.player iframe{display:block!important;min-height:0!important;background:#fff}.spinner{filter:drop-shadow(0 0 8px #69baff)}@keyframes viewIn{from{opacity:0;transform:translateY(14px) scale(.992)}to{opacity:1;transform:none}}@keyframes shine{to{background-position:220% center}}@keyframes logoPulse{50%{transform:scale(1.06);box-shadow:0 0 38px #4a9dffaa}}@keyframes tagPulse{50%{opacity:.58;text-shadow:0 0 16px #7abbff}}@keyframes drift{to{transform:translate(90px,80px) scale(1.18)}}@media(prefers-reduced-motion:reduce){*,*:before,*:after{animation:none!important;transition:none!important}}";document.head.appendChild(fx);
|
|
19
20
|
})();]]></script></body></html></foreignObject></svg>
|