|
118 | 118 | const importWS=async(f)=>{try{log('Importing...','info');const txt=await f.text();const imp=JSON.parse(txt);if(!imp.v||!imp.data)throw new Error('Invalid .wolf file');log(`Importing: ${imp.name}`,'info');const db=await new Promise((r,j)=>{const q=indexedDB.open(IDB);q.onsuccess=()=>r(q.result);q.onerror=()=>j(q.error)});const tx=db.transaction(['blocks'],'readwrite');const st=tx.objectStore('blocks');await new Promise((r,j)=>{const q=st.clear();q.onsuccess=()=>r();q.onerror=()=>j(q.error)});for(const i of imp.data)await new Promise((r,j)=>{const q=st.add(i);q.onsuccess=()=>r();q.onerror=()=>j(q.error)});db.close();log('Imported. Reloading...','success');setTimeout(()=>window.location.reload(),2000)}catch(e){log(`Import failed: ${e.message}`,'error')}}; |
119 | 119 | const runCmd=async(c,d)=>{log(d,'info');try{await cx.run("/bin/bash",["-c",c],{env:["HOME=/root","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","DEBIAN_FRONTEND=noninteractive"],cwd:"/root",uid:0,gid:0})}catch(e){log(`Command: ${e.message}`,'warning')}}; |
120 | 120 | const loadDisk=async()=>{const m=[{n:'WebSocket',t:30000,f:()=>CheerpX.CloudDevice.create("wss://disks.webvm.io/debian_large_20230522_5044875331.ext2")},{n:'HTTP',t:45000,f:()=>CheerpX.HttpBytesDevice.create("https://disks.webvm.io/debian_mini_20230519_5022088024.ext2")}];for(const x of m){try{log(`Connecting ${x.n}...`,'warning');const d=await Promise.race([x.f(),new Promise((_,j)=>setTimeout(()=>j(new Error('timeout')),x.t))]);log(`${x.n} connected`,'success');return d}catch(e){log(`${x.n} failed: ${e.message}`,'error');if(x===m[m.length-1])throw e}}}; |
121 | | - const init=async()=>{try{log('Starting GravelBox','success');if(!window.crossOriginIsolated||typeof SharedArrayBuffer==='undefined'){log('Waiting for isolation...','warning');for(let i=0;i<20;i++){await new Promise(r=>setTimeout(r,500));if(window.crossOriginIsolated)break}if(!window.crossOriginIsolated)throw new Error('Isolation failed')}log('Isolation OK','success');prog(10,'Loading disk...');idb=await CheerpX.IDBDevice.create(IDB);log('Storage ready','success');const disk=await loadDisk();prog(30,'Building filesystem...');const ovr=await CheerpX.OverlayDevice.create(disk,idb);log('Overlay ready','success');const web=await CheerpX.WebDevice.create("");prog(50,'Starting VM...');log('Booting VM...','info');cx=await CheerpX.Linux.create({mounts:[{type:"ext2",path:"/",dev:ovr},{type:"dir",path:"/app",dev:web},{type:"devs",path:"/dev"},{type:"devs",path:"/dev/shm"},{type:"proc",path:"/proc"}]});log('VM started','success');cx.setKmsCanvas(el.canvas);log('Display configured','success');prog(65,'Installing desktop...');await runCmd("apt-get update","Updating packages");prog(70,'Installing KDE...');await runCmd("apt-get install -y kde-plasma-desktop xserver-xorg","Installing KDE Plasma");prog(90,'Configuring X11...');await runCmd("apt-get install -y xinit","Installing X11");prog(95,'Starting desktop...');el.exp.disabled=false;prog(100,'Ready');log('Launching KDE...','success');await new Promise(r=>setTimeout(r,1000));el.stc.classList.add('hidden');el.con.classList.add('hidden');el.desk.classList.add('active');await cx.run("/usr/bin/startx",[],{env:["HOME=/root","USER=root","DISPLAY=:0"],cwd:"/root",uid:0,gid:0})}catch(e){log(`Fatal: ${e.message}`,'error');prog(0,'Failed')}}; |
| 121 | + const init=async()=>{try{log('Starting GravelBox','success');if(!window.crossOriginIsolated||typeof SharedArrayBuffer==='undefined'){log('Waiting for isolation...','warning');for(let i=0;i<20;i++){await new Promise(r=>setTimeout(r,500));if(window.crossOriginIsolated)break}if(!window.crossOriginIsolated)throw new Error('Isolation failed')}log('Isolation OK','success');prog(10,'Loading disk...');idb=await CheerpX.IDBDevice.create(IDB);log('Storage ready','success');const disk=await loadDisk();prog(30,'Building filesystem...');const ovr=await CheerpX.OverlayDevice.create(disk,idb);log('Overlay ready','success');const web=await CheerpX.WebDevice.create("");prog(50,'Starting VM...');log('Booting VM...','info');cx=await CheerpX.Linux.create({mounts:[{type:"ext2",path:"/",dev:ovr},{type:"dir",path:"/app",dev:web},{type:"devs",path:"/dev"},{type:"devs",path:"/dev/shm"},{type:"proc",path:"/proc"}]});log('VM started','success');cx.setKmsCanvas(el.canvas);log('Display configured','success');prog(65,'Installing desktop...');await runCmd("apt-get update","Updating packages");prog(70,'Installing XFCE...');await runCmd("apt-get install -y xfce4 xfce4-terminal xserver-xorg xinit","Installing XFCE Desktop");prog(90,'Configuring display...');await runCmd("echo 'exec startxfce4' > /root/.xinitrc","Configuring XFCE startup");prog(95,'Starting desktop...');el.exp.disabled=false;prog(100,'Ready');log('Launching XFCE...','success');await new Promise(r=>setTimeout(r,1000));el.stc.classList.add('hidden');el.con.classList.add('hidden');el.desk.classList.add('active');await cx.run("/usr/bin/startx",[],{env:["HOME=/root","USER=root","DISPLAY=:0"],cwd:"/root",uid:0,gid:0})}catch(e){log(`Fatal: ${e.message}`,'error');prog(0,'Failed')}}; |
122 | 122 | document.addEventListener('DOMContentLoaded',()=>{el={stat:$('statusText'),bar:$('progressBar'),pct:$('progressText'),out:$('consoleOutput'),stc:$('statusCard'),con:$('consoleCard'),desk:$('desktop-container'),canvas:$('desktop-canvas'),exp:$('exportBtn'),imp:$('importBtn'),exM:$('exportModal'),imM:$('importModal'),exN:$('exportName'),imF:$('importFile')};el.exp.onclick=()=>el.exM.classList.add('active');el.imp.onclick=()=>el.imM.classList.add('active');$('cancelExport').onclick=()=>el.exM.classList.remove('active');$('cancelImport').onclick=()=>el.imM.classList.remove('active');$('confirmExport').onclick=async()=>{const n=el.exN.value.trim()||'workspace';el.exM.classList.remove('active');await exportWS(n)};$('confirmImport').onclick=async()=>{const f=el.imF.files[0];if(!f){log('Select a .wolf file','warning');return}el.imM.classList.remove('active');await importWS(f)};setTimeout(init,1000)}); |
123 | 123 | </script> |
124 | 124 | </body> |
|
0 commit comments