From 2b4eb3123eadb35fc3686883b79f4dcd0fcb75ca Mon Sep 17 00:00:00 2001 From: Leon van Kammen Date: Tue, 6 Aug 2024 16:48:29 +0200 Subject: [PATCH] offline-first --- com/example/helloworld-html.js | 1 + com/example/helloworld-htmlform.js | 1 + com/example/helloworld-iframe.js | 1 + com/example/helloworld-window.js | 1 + com/example/helloworld.js | 1 + com/isoterminal.js | 3 +- com/launcher-optional.js | 1 + com/launcher.js | 7 +++- com/require.js | 6 +-- com/save.js | 45 ++++++++++++++++----- com/selfcontainer.js | 64 ++++++++++++++++++++++++++++++ 11 files changed, 114 insertions(+), 17 deletions(-) create mode 100644 com/selfcontainer.js diff --git a/com/example/helloworld-html.js b/com/example/helloworld-html.js index 31252c7..1833b67 100644 --- a/com/example/helloworld-html.js +++ b/com/example/helloworld-html.js @@ -57,6 +57,7 @@ AFRAME.registerComponent('helloworld-html', { "icons": [ { "src": "https://css.gg/browser.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNNCA4QzQuNTUyMjggOCA1IDcuNTUyMjggNSA3QzUgNi40NDc3MiA0LjU1MjI4IDYgNCA2QzMuNDQ3NzIgNiAzIDYuNDQ3NzIgMyA3QzMgNy41NTIyOCAzLjQ0NzcyIDggNCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNOCA3QzggNy41NTIyOCA3LjU1MjI4IDggNyA4QzYuNDQ3NzIgOCA2IDcuNTUyMjggNiA3QzYgNi40NDc3MiA2LjQ0NzcyIDYgNyA2QzcuNTUyMjggNiA4IDYuNDQ3NzIgOCA3WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNMTAgOEMxMC41NTIzIDggMTEgNy41NTIyOCAxMSA3QzExIDYuNDQ3NzIgMTAuNTUyMyA2IDEwIDZDOS40NDc3MSA2IDkgNi40NDc3MiA5IDdDOSA3LjU1MjI4IDkuNDQ3NzEgOCAxMCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMyAzQzEuMzQzMTUgMyAwIDQuMzQzMTUgMCA2VjE4QzAgMTkuNjU2OSAxLjM0MzE1IDIxIDMgMjFIMjFDMjIuNjU2OSAyMSAyNCAxOS42NTY5IDI0IDE4VjZDMjQgNC4zNDMxNSAyMi42NTY5IDMgMjEgM0gzWk0yMSA1SDNDMi40NDc3MiA1IDIgNS40NDc3MiAyIDZWOUgyMlY2QzIyIDUuNDQ3NzIgMjEuNTUyMyA1IDIxIDVaTTIgMThWMTFIMjJWMThDMjIgMTguNTUyMyAyMS41NTIzIDE5IDIxIDE5SDNDMi40NDc3MiAxOSAyIDE4LjU1MjMgMiAxOFoiCiAgICBmaWxsPSJjdXJyZW50Q29sb3IiCiAgLz4KPC9zdmc+", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/example/helloworld-htmlform.js b/com/example/helloworld-htmlform.js index 7bbda72..511fe0d 100644 --- a/com/example/helloworld-htmlform.js +++ b/com/example/helloworld-htmlform.js @@ -107,6 +107,7 @@ AFRAME.registerComponent('helloworld-htmlform', { "icons": [ { "src": "https://css.gg/browser.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNNCA4QzQuNTUyMjggOCA1IDcuNTUyMjggNSA3QzUgNi40NDc3MiA0LjU1MjI4IDYgNCA2QzMuNDQ3NzIgNiAzIDYuNDQ3NzIgMyA3QzMgNy41NTIyOCAzLjQ0NzcyIDggNCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNOCA3QzggNy41NTIyOCA3LjU1MjI4IDggNyA4QzYuNDQ3NzIgOCA2IDcuNTUyMjggNiA3QzYgNi40NDc3MiA2LjQ0NzcyIDYgNyA2QzcuNTUyMjggNiA4IDYuNDQ3NzIgOCA3WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNMTAgOEMxMC41NTIzIDggMTEgNy41NTIyOCAxMSA3QzExIDYuNDQ3NzIgMTAuNTUyMyA2IDEwIDZDOS40NDc3MSA2IDkgNi40NDc3MiA5IDdDOSA3LjU1MjI4IDkuNDQ3NzEgOCAxMCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMyAzQzEuMzQzMTUgMyAwIDQuMzQzMTUgMCA2VjE4QzAgMTkuNjU2OSAxLjM0MzE1IDIxIDMgMjFIMjFDMjIuNjU2OSAyMSAyNCAxOS42NTY5IDI0IDE4VjZDMjQgNC4zNDMxNSAyMi42NTY5IDMgMjEgM0gzWk0yMSA1SDNDMi40NDc3MiA1IDIgNS40NDc3MiAyIDZWOUgyMlY2QzIyIDUuNDQ3NzIgMjEuNTUyMyA1IDIxIDVaTTIgMThWMTFIMjJWMThDMjIgMTguNTUyMyAyMS41NTIzIDE5IDIxIDE5SDNDMi40NDc3MiAxOSAyIDE4LjU1MjMgMiAxOFoiCiAgICBmaWxsPSJjdXJyZW50Q29sb3IiCiAgLz4KPC9zdmc+", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/example/helloworld-iframe.js b/com/example/helloworld-iframe.js index 29fad50..ae1776e 100644 --- a/com/example/helloworld-iframe.js +++ b/com/example/helloworld-iframe.js @@ -104,6 +104,7 @@ AFRAME.registerComponent('helloworld-iframe', { "icons": [ { "src": "https://css.gg/browse.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNNCA4QzQuNTUyMjggOCA1IDcuNTUyMjggNSA3QzUgNi40NDc3MiA0LjU1MjI4IDYgNCA2QzMuNDQ3NzIgNiAzIDYuNDQ3NzIgMyA3QzMgNy41NTIyOCAzLjQ0NzcyIDggNCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNOCA3QzggNy41NTIyOCA3LjU1MjI4IDggNyA4QzYuNDQ3NzIgOCA2IDcuNTUyMjggNiA3QzYgNi40NDc3MiA2LjQ0NzcyIDYgNyA2QzcuNTUyMjggNiA4IDYuNDQ3NzIgOCA3WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNMTAgOEMxMC41NTIzIDggMTEgNy41NTIyOCAxMSA3QzExIDYuNDQ3NzIgMTAuNTUyMyA2IDEwIDZDOS40NDc3MSA2IDkgNi40NDc3MiA5IDdDOSA3LjU1MjI4IDkuNDQ3NzEgOCAxMCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMyAzQzEuMzQzMTUgMyAwIDQuMzQzMTUgMCA2VjE4QzAgMTkuNjU2OSAxLjM0MzE1IDIxIDMgMjFIMjFDMjIuNjU2OSAyMSAyNCAxOS42NTY5IDI0IDE4VjZDMjQgNC4zNDMxNSAyMi42NTY5IDMgMjEgM0gzWk0yMSA1SDNDMi40NDc3MiA1IDIgNS40NDc3MiAyIDZWOUgyMlY2QzIyIDUuNDQ3NzIgMjEuNTUyMyA1IDIxIDVaTTIgMThWMTFIMjJWMThDMjIgMTguNTUyMyAyMS41NTIzIDE5IDIxIDE5SDNDMi40NDc3MiAxOSAyIDE4LjU1MjMgMiAxOFoiCiAgICBmaWxsPSJjdXJyZW50Q29sb3IiCiAgLz4KPC9zdmc+", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/example/helloworld-window.js b/com/example/helloworld-window.js index 7e88cd7..580f6f5 100644 --- a/com/example/helloworld-window.js +++ b/com/example/helloworld-window.js @@ -86,6 +86,7 @@ AFRAME.registerComponent('helloworld-window', { "icons": [ { "src": "https://css.gg/browser.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNNCA4QzQuNTUyMjggOCA1IDcuNTUyMjggNSA3QzUgNi40NDc3MiA0LjU1MjI4IDYgNCA2QzMuNDQ3NzIgNiAzIDYuNDQ3NzIgMyA3QzMgNy41NTIyOCAzLjQ0NzcyIDggNCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNOCA3QzggNy41NTIyOCA3LjU1MjI4IDggNyA4QzYuNDQ3NzIgOCA2IDcuNTUyMjggNiA3QzYgNi40NDc3MiA2LjQ0NzcyIDYgNyA2QzcuNTUyMjggNiA4IDYuNDQ3NzIgOCA3WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBkPSJNMTAgOEMxMC41NTIzIDggMTEgNy41NTIyOCAxMSA3QzExIDYuNDQ3NzIgMTAuNTUyMyA2IDEwIDZDOS40NDc3MSA2IDkgNi40NDc3MiA5IDdDOSA3LjU1MjI4IDkuNDQ3NzEgOCAxMCA4WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMyAzQzEuMzQzMTUgMyAwIDQuMzQzMTUgMCA2VjE4QzAgMTkuNjU2OSAxLjM0MzE1IDIxIDMgMjFIMjFDMjIuNjU2OSAyMSAyNCAxOS42NTY5IDI0IDE4VjZDMjQgNC4zNDMxNSAyMi42NTY5IDMgMjEgM0gzWk0yMSA1SDNDMi40NDc3MiA1IDIgNS40NDc3MiAyIDZWOUgyMlY2QzIyIDUuNDQ3NzIgMjEuNTUyMyA1IDIxIDVaTTIgMThWMTFIMjJWMThDMjIgMTguNTUyMyAyMS41NTIzIDE5IDIxIDE5SDNDMi40NDc3MiAxOSAyIDE4LjU1MjMgMiAxOFoiCiAgICBmaWxsPSJjdXJyZW50Q29sb3IiCiAgLz4KPC9zdmc+", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/example/helloworld.js b/com/example/helloworld.js index cad2f6f..d2c09a5 100644 --- a/com/example/helloworld.js +++ b/com/example/helloworld.js @@ -44,6 +44,7 @@ AFRAME.registerComponent('helloworld', { "icons": [ { "src": "https://css.gg/shape-hexagon.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNNiAxNS4yMzQ4TDEyIDE4LjU2ODFMMTggMTUuMjM0OFY4Ljc2NTIxTDEyIDUuNDMxODhMNiA4Ljc2NTIxVjE1LjIzNDhaTTEyIDJMMyA3VjE3TDEyIDIyTDIxIDE3VjdMMTIgMloiCiAgICBmaWxsPSJjdXJyZW50Q29sb3IiCiAgLz4KPC9zdmc+", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/isoterminal.js b/com/isoterminal.js index 017d9ca..064a345 100644 --- a/com/isoterminal.js +++ b/com/isoterminal.js @@ -152,7 +152,7 @@ AFRAME.registerComponent('isoterminal', { // emulator.serial0_send("/mnt/test-i386 > /mnt/result\n"); // emulator.serial0_send("echo test fini''shed\n"); //} - console.dir({line,new_line}) + //console.dir({line,new_line}) if(new_line && new_line.includes("buildroot login:")) { @@ -233,6 +233,7 @@ AFRAME.registerComponent('isoterminal', { "icons": [ { "src": "https://css.gg/terminal.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNNS4wMzMzIDE0LjgyODRMNi40NDc1MSAxNi4yNDI2TDEwLjY5MDIgMTJMNi40NDc1MSA3Ljc1NzMzTDUuMDMzMyA5LjE3MTU1TDcuODYxNzIgMTJMNS4wMzMzIDE0LjgyODRaIgogICAgZmlsbD0iY3VycmVudENvbG9yIgogIC8+CiAgPHBhdGggZD0iTTE1IDE0SDExVjE2SDE1VjE0WiIgZmlsbD0iY3VycmVudENvbG9yIiAvPgogIDxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMiAyQzAuODk1NDMxIDIgMCAyLjg5NTQzIDAgNFYyMEMwIDIxLjEwNDYgMC44OTU0MyAyMiAyIDIySDIyQzIzLjEwNDYgMjIgMjQgMjEuMTA0NiAyNCAyMFY0QzI0IDIuODk1NDMgMjMuMTA0NiAyIDIyIDJIMlpNMjIgNEgyTDIgMjBIMjJWNFoiCiAgICBmaWxsPSJjdXJyZW50Q29sb3IiCiAgLz4KPC9zdmc+", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/launcher-optional.js b/com/launcher-optional.js index b0bdcdd..09cced9 100644 --- a/com/launcher-optional.js +++ b/com/launcher-optional.js @@ -47,6 +47,7 @@ AFRAME.registerComponent('launcher-optional', { "icons": [ { "src": "https://css.gg/add-r.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNMTIgNkMxMi41NTIzIDYgMTMgNi40NDc3MiAxMyA3VjExSDE3QzE3LjU1MjMgMTEgMTggMTEuNDQ3NyAxOCAxMkMxOCAxMi41NTIzIDE3LjU1MjMgMTMgMTcgMTNIMTNWMTdDMTMgMTcuNTUyMyAxMi41NTIzIDE4IDEyIDE4QzExLjQ0NzcgMTggMTEgMTcuNTUyMyAxMSAxN1YxM0g3QzYuNDQ3NzIgMTMgNiAxMi41NTIzIDYgMTJDNiAxMS40NDc3IDYuNDQ3NzIgMTEgNyAxMUgxMVY3QzExIDYuNDQ3NzIgMTEuNDQ3NyA2IDEyIDZaIgogICAgZmlsbD0iY3VycmVudENvbG9yIgogIC8+CiAgPHBhdGgKICAgIGZpbGwtcnVsZT0iZXZlbm9kZCIKICAgIGNsaXAtcnVsZT0iZXZlbm9kZCIKICAgIGQ9Ik01IDIyQzMuMzQzMTUgMjIgMiAyMC42NTY5IDIgMTlWNUMyIDMuMzQzMTUgMy4zNDMxNSAyIDUgMkgxOUMyMC42NTY5IDIgMjIgMy4zNDMxNSAyMiA1VjE5QzIyIDIwLjY1NjkgMjAuNjU2OSAyMiAxOSAyMkg1Wk00IDE5QzQgMTkuNTUyMyA0LjQ0NzcyIDIwIDUgMjBIMTlDMTkuNTUyMyAyMCAyMCAxOS41NTIzIDIwIDE5VjVDMjAgNC40NDc3MiAxOS41NTIzIDQgMTkgNEg1QzQuNDQ3NzIgNCA0IDQuNDQ3NzIgNCA1VjE5WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgo8L3N2Zz4K", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/launcher.js b/com/launcher.js index 26aa254..bab964c 100644 --- a/com/launcher.js +++ b/com/launcher.js @@ -63,7 +63,10 @@ AFRAME.registerComponent('launcher', { if( this.data.attach ){ this.el.object3D.visible = false if( this.isHand(this.data.attach) ){ - this.data.attach.addEventListener('model-loaded', () => this.attachMenu() ) + this.data.attach.addEventListener('model-loaded', () => { + this.ready = true + this.attachMenu() + }) // add button this.menubutton = this.createMenuButton() this.menubutton.object3D.visible = false @@ -280,7 +283,7 @@ AFRAME.registerComponent('launcher', { }, tick: function(){ - if( this.data.open ){ + if( this.ready && this.data.open ){ let indexTipPosition = document.querySelector('#right-hand[hand-tracking-controls]').components['hand-tracking-controls'].indexTipPosition this.el.object3D.getWorldPosition(this.worldPosition) const lookingAtPalm = this.data.attach.components['hand-tracking-controls'].wristObject3D.rotation.z > 2.0 diff --git a/com/require.js b/com/require.js index 36ac00d..e9e30c5 100644 --- a/com/require.js +++ b/com/require.js @@ -34,7 +34,7 @@ AFRAME.utils.require = function(arr_or_obj,opts){ if( AFRAME.required[id] ) return // already loaded before AFRAME.required[id] = true - if( !document.head.querySelector(`script#${id}`) ){ + if( !document.body.querySelector(`script#${id}`) ){ let {type} = parseURI(package) let p = new Promise( (resolve,reject) => { switch(type){ @@ -43,13 +43,13 @@ AFRAME.utils.require = function(arr_or_obj,opts){ script.onload = () => setTimeout( () => resolve(id), 50 ) script.onerror = (e) => reject(e) script.src = package - document.head.appendChild(script) + document.body.appendChild(script) break; case "css": let link = document.createElement("link") link.id = id link.href = package link.rel = 'stylesheet' - document.head.appendChild(link) + document.body.appendChild(link) resolve(id) break; } diff --git a/com/save.js b/com/save.js index eb6843a..68e3a43 100644 --- a/com/save.js +++ b/com/save.js @@ -3,10 +3,13 @@ AFRAME.registerComponent('save', { foo: { type:"string"} }, - init: function () { + init: async function () { this.el.object3D.visible = false + await AFRAME.utils.require(this.dependencies) + }, - //this.el.innerHTML = ` ` + dependencies:{ + 'xhook': 'https://jpillora.com/xhook/dist/xhook.min.js' }, events:{ @@ -17,6 +20,28 @@ AFRAME.registerComponent('save', { }, + convert:{ + + arrayBufferToBase64: function(buffer){ + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) binary += String.fromCharCode(bytes[i]); + return window.btoa(binary); + }, + + base64ToArrayBuffer: function(base64) { + const binaryString = window.atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); + + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes.buffer; + } + }, + save: function(){ let l = document.querySelector("#left-hand") let r = document.querySelector("#right-hand") @@ -33,11 +58,8 @@ AFRAME.registerComponent('save', { save_state: async function(){ if( window.emulator ){ let binaryString = ''; - const state = await emulator.restore_state(state); - uint8Array.forEach(byte => binaryString += String.fromCharCode(byte) ); - let b64data = btoa(binaryString); - console.log(b64data) - + const state = await emulator.save_state() //restore_state(state); + //console.log(this.convert.arrayBufferToBase64(state)) } }, @@ -53,8 +75,8 @@ AFRAME.registerComponent('save', { inlineFiles: function(){ let p = [] - let tags = [ ...document.querySelectorAll('script'), - ...document.querySelectorAll('link') + let tags = [ ...document.querySelectorAll('script[src]'), + ...document.querySelectorAll('link[href]') ] tags.map( (el) => { let remoteFile = el.src || el.href @@ -67,12 +89,12 @@ AFRAME.registerComponent('save', { case 'LINK': el2 = document.createElement('style') el2.setAttribute("type","text/css") el2.setAttribute("_href", el.href ) - el2.innerHTML = text + el2.innerHTML = `${text}` el.parentNode.appendChild(el2) el.remove() break; - case 'SCRIPT': el.innerHTML = text + case 'SCRIPT': el.innerHTML = `${text.replace(/<\//g,'</')}` el.setAttribute("_src", el.src) el.removeAttribute("src") break; @@ -92,6 +114,7 @@ AFRAME.registerComponent('save', { "icons": [ { "src": "https://css.gg/arrow-down-r.svg", + "src": "data:image/svg+xml;base64,PHN2ZwogIHdpZHRoPSIyNCIKICBoZWlnaHQ9IjI0IgogIHZpZXdCb3g9IjAgMCAyNCAyNCIKICBmaWxsPSJub25lIgogIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyIKPgogIDxwYXRoCiAgICBkPSJNMTQuODI4NCAxMi4wMjU5TDE2LjI0MjYgMTMuNDQwMkwxMiAxNy42ODI4TDcuNzU3MzMgMTMuNDQwMkw5LjE3MTU1IDEyLjAyNTlMMTEgMTMuODU0NFY2LjMxNzI0SDEzVjEzLjg1NDRMMTQuODI4NCAxMi4wMjU5WiIKICAgIGZpbGw9ImN1cnJlbnRDb2xvciIKICAvPgogIDxwYXRoCiAgICBmaWxsLXJ1bGU9ImV2ZW5vZGQiCiAgICBjbGlwLXJ1bGU9ImV2ZW5vZGQiCiAgICBkPSJNMSA1QzEgMi43OTA4NiAyLjc5MDg2IDEgNSAxSDE5QzIxLjIwOTEgMSAyMyAyLjc5MDg2IDIzIDVWMTlDMjMgMjEuMjA5MSAyMS4yMDkxIDIzIDE5IDIzSDVDMi43OTA4NiAyMyAxIDIxLjIwOTEgMSAxOVY1Wk01IDNIMTlDMjAuMTA0NiAzIDIxIDMuODk1NDMgMjEgNVYxOUMyMSAyMC4xMDQ2IDIwLjEwNDYgMjEgMTkgMjFINUMzLjg5NTQzIDIxIDMgMjAuMTA0NiAzIDE5VjVDMyAzLjg5NTQzIDMuODk1NDMgMyA1IDNaIgogICAgZmlsbD0iY3VycmVudENvbG9yIgogIC8+Cjwvc3ZnPg==", "type": "image/svg+xml", "sizes": "512x512" } diff --git a/com/selfcontainer.js b/com/selfcontainer.js new file mode 100644 index 0000000..0346331 --- /dev/null +++ b/com/selfcontainer.js @@ -0,0 +1,64 @@ +AFRAME.registerComponent('selfcontainer', { + schema: { + foo: { type:"string"} + }, + + init: async function () { + this.installProxyServer() + }, + + events:{ }, + + convert:{ + + arrayBufferToBase64: function(buffer){ + let binary = ''; + const bytes = new Uint8Array(buffer); + const len = bytes.byteLength; + for (let i = 0; i < len; i++) binary += String.fromCharCode(bytes[i]); + return window.btoa(binary); + }, + + base64ToArrayBuffer: function(base64) { + const binaryString = window.atob(base64); + const len = binaryString.length; + const bytes = new Uint8Array(len); + + for (let i = 0; i < len; i++) { + bytes[i] = binaryString.charCodeAt(i); + } + return bytes.buffer; + } + }, + + + installProxyServer: function(){ + if( !window.store ) window.store = {} + // selfcontain every webrequest to store (and serve if stored) + let curry = function(me){ + return function(request, response, cb){ + let data = request ? window.store[ request.url ] || false : false + if( data ){ // return inline version + console.log('selfcontained cache: '+request.url) + let res = new Response() + res[ data.binary ? 'data' : 'text' ] = data.binary ? () => me.convert.base64ToArrayBuffer(data.text) : data.text + cb(res) + }else{ + if( response.text ){ + data = {text: response.text} + }else{ + data = {binary: true, text: me.convert.arrayBufferToBase64(response.data)} + } + window.store[ request.url ] = data + let $store = document.querySelector('script#store') + if( $store ) $store.remove + document.head.innerHTML += `\n<`+`template id="store">\nwindow.store = ${JSON.stringify(window.store,null,2)}\n`+`<`+`/template>` + cb(response); + } + }); + } + xhook.after( curry(me) ) + } + +}); +