@@ -7,6 +7,7 @@ import { logout } from "./components/Navbar";
77import i18n from "./i18n" ;
88import { showAlert } from "./components/Alert" ;
99import { Base64 } from "js-base64" ;
10+ import { Message , MessageType } from "./types" ;
1011
1112export async function get_salt ( ) {
1213 const { data, response} = await fetchClient . GET ( "/auth/generate_salt" ) ;
@@ -101,21 +102,25 @@ export async function refresh_access_token() {
101102 } ) ;
102103
103104 if ( ! error || response . status === 502 ) {
104- if ( ! localStorage . getItem ( "loginSalt" ) || ! localStorage . getItem ( "secretKey" ) ) {
105+ const hasLoginSalt = localStorage . getItem ( "loginSalt" ) ;
106+ const hasSecret = await getSecretKeyFromServiceWorker ( ) ;
107+ if ( ! hasLoginSalt || ! hasSecret ) {
105108 logout ( false ) ;
106109 }
107110 loggedIn . value = AppState . LoggedIn ;
108111 } else {
109112 auth_already_failed = true ;
110113 resetSecret ( ) ;
111114 localStorage . removeItem ( "loginSalt" ) ;
112- localStorage . removeItem ( "secretKey" ) ;
115+ await clearSecretKeyFromServiceWorker ( ) ;
113116 loggedIn . value = AppState . LoggedOut ;
114117 }
115118 } catch ( e ) {
116119 resetSecret ( ) ;
117120 //This means we are logged in but the refresh failed
118- if ( localStorage . getItem ( "loginSalt" ) && localStorage . getItem ( "secretKey" ) ) {
121+ const hasLoginSalt = localStorage . getItem ( "loginSalt" ) ;
122+ const hasSecret = await getSecretKeyFromServiceWorker ( ) ;
123+ if ( hasLoginSalt && hasSecret ) {
119124 loggedIn . value = AppState . LoggedIn ;
120125 }
121126 console . error ( e ) ;
@@ -125,6 +130,61 @@ export async function refresh_access_token() {
125130export let secret : Uint8Array | null = null ;
126131export let pub_key : Uint8Array | null = null ;
127132
133+ // Service Worker communication functions
134+ export async function storeSecretKeyInServiceWorker ( secretKey : string ) : Promise < void > {
135+ if ( ! navigator . serviceWorker . controller ) {
136+ return ;
137+ }
138+
139+ const msg : Message = {
140+ type : MessageType . StoreSecret ,
141+ data : secretKey
142+ } ;
143+ navigator . serviceWorker . controller . postMessage ( msg ) ;
144+ }
145+
146+ export async function getSecretKeyFromServiceWorker ( ) : Promise < string | null > {
147+ return new Promise ( ( resolve ) => {
148+ if ( ! navigator . serviceWorker . controller ) {
149+ resolve ( null ) ;
150+ return ;
151+ }
152+
153+ const timeout = setTimeout ( ( ) => {
154+ resolve ( null ) ;
155+ } , 5000 ) ; // 5 second timeout
156+
157+ const handleMessage = ( event : MessageEvent ) => {
158+ const msg = event . data as Message ;
159+ if ( msg . type === MessageType . StoreSecret ) {
160+ clearTimeout ( timeout ) ;
161+ navigator . serviceWorker . removeEventListener ( 'message' , handleMessage ) ;
162+ resolve ( msg . data ) ;
163+ }
164+ } ;
165+
166+ navigator . serviceWorker . addEventListener ( 'message' , handleMessage ) ;
167+
168+ const requestMsg : Message = {
169+ type : MessageType . RequestSecret ,
170+ data : null
171+ } ;
172+ navigator . serviceWorker . controller . postMessage ( requestMsg ) ;
173+ } ) ;
174+ }
175+
176+ export async function clearSecretKeyFromServiceWorker ( ) : Promise < void > {
177+ if ( ! navigator . serviceWorker . controller ) {
178+ return ;
179+ }
180+
181+ const msg : Message = {
182+ type : MessageType . ClearSecret ,
183+ data : null
184+ } ;
185+ navigator . serviceWorker . controller . postMessage ( msg ) ;
186+ }
187+
128188export async function get_decrypted_secret ( ) {
129189 await sodium . ready ;
130190 const t = i18n . t ;
@@ -134,9 +194,9 @@ export async function get_decrypted_secret() {
134194 showAlert ( t ( "chargers.loading_secret_failed" , { status, response : error } ) , "danger" ) ;
135195 return ;
136196 }
137- const encoded_key = localStorage . getItem ( "secretKey" ) ;
197+ const encoded_key = await getSecretKeyFromServiceWorker ( ) ;
138198 if ( ! encoded_key ) {
139- showAlert ( t ( "chargers.loading_secret_failed" , { status : 'no_key' , response : 'No secretKey in localStorage ' } ) , "danger" ) ;
199+ showAlert ( t ( "chargers.loading_secret_failed" , { status : 'no_key' , response : 'No secretKey in service worker cache ' } ) , "danger" ) ;
140200 return ;
141201 }
142202 const secret_key = Base64 . toUint8Array ( encoded_key ) ;
@@ -147,6 +207,8 @@ export async function get_decrypted_secret() {
147207export function resetSecret ( ) {
148208 secret = null ;
149209 pub_key = null ;
210+ // Also clear the secret from service worker cache
211+ clearSecretKeyFromServiceWorker ( ) . catch ( ( e : any ) => console . warn ( "Failed to clear secret from service worker:" , e ) ) ;
150212}
151213
152214export const isDebugMode = signal ( false ) ;
0 commit comments