@@ -36,34 +36,75 @@ export const scramjet = new ScramjetController({
3636 } ,
3737} ) ;
3838
39- scramjet . init ( ) ;
40- navigator . serviceWorker . register ( "./sw.js" ) ;
41-
4239export let browser : Browser ;
4340
44- try {
45- let shell = < Shell > </ Shell > ;
46- browser = new Browser ( ) ;
47- let de = localStorage [ "browserstate" ] ;
48- if ( de ) {
49- browser . deserialize ( JSON . parse ( de ) ) ;
50- } else {
51- let tab = browser . newTab ( ) ;
52- browser . activetab = tab ;
41+ function mount ( ) {
42+ try {
43+ let shell = < Shell > </ Shell > ;
44+ browser = new Browser ( ) ;
45+ let de = localStorage [ "browserstate" ] ;
46+ if ( de ) {
47+ browser . deserialize ( JSON . parse ( de ) ) ;
48+ } else {
49+ let tab = browser . newTab ( ) ;
50+ browser . activetab = tab ;
51+ }
52+
53+ ( self as any ) . browser = browser ;
54+ let built = < App > { shell } </ App > ;
55+ app . replaceWith ( built ) ;
56+ built . addEventListener ( "contextmenu" , ( e ) => {
57+ e . preventDefault ( ) ;
58+ } ) ;
59+ } catch ( e ) {
60+ let err = e as any ;
61+ app . replaceWith (
62+ document . createTextNode (
63+ `Error mounting: ${ "message" in err ? err . message : err } `
64+ )
65+ ) ;
66+ console . error ( err ) ;
5367 }
68+ }
5469
55- ( self as any ) . browser = browser ;
56- let built = < App > { shell } </ App > ;
57- app . replaceWith ( built ) ;
58- built . addEventListener ( "contextmenu" , ( e ) => {
59- e . preventDefault ( ) ;
70+ function waitForStateChange ( worker : ServiceWorker , targetState : string ) {
71+ return new Promise < void > ( ( resolve ) => {
72+ if ( worker . state === targetState ) {
73+ resolve ( ) ;
74+ return ;
75+ }
76+
77+ worker . addEventListener ( "statechange" , function listener ( ) {
78+ if ( worker . state === targetState ) {
79+ worker . removeEventListener ( "statechange" , listener ) ;
80+ resolve ( ) ;
81+ }
82+ } ) ;
6083 } ) ;
61- } catch ( e ) {
62- let err = e as any ;
63- app . replaceWith (
64- document . createTextNode (
65- `Error mounting: ${ "message" in err ? err . message : err } `
66- )
67- ) ;
68- console . error ( err ) ;
6984}
85+ async function init ( ) {
86+ try {
87+ scramjet . init ( ) ;
88+ let registration = await navigator . serviceWorker . register ( "./sw.js" ) ;
89+
90+ if ( registration . installing ) {
91+ app . innerText = "Installing service worker..." ;
92+ await waitForStateChange ( registration . installing , "installed" ) ;
93+ }
94+
95+ if ( registration . waiting ) {
96+ app . innerText = "Service worker installed, activating..." ;
97+ await waitForStateChange ( registration . waiting , "activated" ) ;
98+ }
99+
100+ if ( registration . active ) {
101+ app . innerText = "Service worker activated, mounting app..." ;
102+ mount ( ) ;
103+ }
104+ } catch ( e ) {
105+ console . error ( "Error during service worker registration:" , e ) ;
106+ app . innerText =
107+ "Failed to register service worker. Check console for details." ;
108+ }
109+ }
110+ init ( ) ;
0 commit comments