@@ -7,98 +7,98 @@ import { SessionIDB } from './SessionDatabase';
77// Any provided database via SessionOptions will be ignored.
88// Database will be an IndexedDB.
99export interface WebWorkerSessionOptions extends SessionOptions {
10- workerUrl ?: string | URL ;
10+ workerUrl ?: string | URL ;
1111}
1212
1313/**
1414 * This Session provides background token refreshing using a Web Worker.
1515 */
1616export class WebWorkerSession extends SessionCore {
17- private worker : SharedWorker ;
17+ private worker : SharedWorker ;
1818
19- constructor (
20- clientDetails ?: DereferencableIdClientDetails | DynamicRegistrationClientDetails ,
21- sessionOptions ?: WebWorkerSessionOptions
22- ) {
23- const database = new SessionIDB ( ) ;
24- const options = { ...sessionOptions , database } ;
25- super ( clientDetails , options ) ;
19+ constructor (
20+ clientDetails ?: DereferencableIdClientDetails | DynamicRegistrationClientDetails ,
21+ sessionOptions ?: WebWorkerSessionOptions
22+ ) {
23+ const database = new SessionIDB ( ) ;
24+ const options = { ...sessionOptions , database } ;
25+ super ( clientDetails , options ) ;
2626
27- // Allow consumer to provide worker URL, or use default
28- const workerUrl = sessionOptions ?. workerUrl ?? getWorkerUrl ( )
29- this . worker = new SharedWorker ( workerUrl , { type : 'module' } ) ;
30- this . worker . port . onmessage = ( event ) => {
31- this . handleWorkerMessage ( event . data ) . catch ( console . error ) ;
32- } ;
33- window . addEventListener ( 'beforeunload' , ( ) => {
34- this . worker . port . postMessage ( { type : RefreshMessageTypes . DISCONNECT } ) ;
35- } ) ;
36- }
37-
38- private async handleWorkerMessage ( data : any ) {
39- const { type, payload, error } = data ;
40- switch ( type ) {
41- case RefreshMessageTypes . TOKEN_DETAILS :
42- const wasActive = this . isActive ;
43- await this . setTokenDetails ( payload . tokenDetails ) ;
44- if ( wasActive !== this . isActive )
45- this . dispatchStateChangeEvent ( ) ;
46- if ( this . refreshPromise && this . resolveRefresh ) {
47- this . resolveRefresh ( ) ;
48- this . clearRefreshPromise ( ) ;
49- }
50- break ;
51- case RefreshMessageTypes . ERROR_ON_REFRESH :
52- if ( this . isActive )
53- this . dispatchExpirationWarningEvent ( ) ;
54- if ( this . refreshPromise && this . rejectRefresh ) {
55- if ( this . isActive ) {
56- this . rejectRefresh ( new Error ( error || 'Token refresh failed' ) ) ;
57- } else {
58- this . rejectRefresh ( new Error ( "No session to restore" ) ) ;
59- }
60- this . clearRefreshPromise ( ) ;
61- }
62- break ;
63- case RefreshMessageTypes . EXPIRED :
64- if ( this . isActive ) {
65- this . dispatchExpirationEvent ( ) ;
66- await this . logout ( ) ;
67- }
68- if ( this . refreshPromise && this . rejectRefresh ) {
69- this . rejectRefresh ( new Error ( error || 'Token refresh failed' ) ) ;
70- this . clearRefreshPromise ( ) ;
71- }
72- break ;
73- }
27+ // Allow consumer to provide worker URL, or use default
28+ const workerUrl = sessionOptions ?. workerUrl ?? getWorkerUrl ( )
29+ this . worker = new SharedWorker ( workerUrl , { type : 'module' } ) ;
30+ this . worker . port . onmessage = ( event ) => {
31+ this . handleWorkerMessage ( event . data ) . catch ( console . error ) ;
7432 } ;
33+ window . addEventListener ( 'beforeunload' , ( ) => {
34+ this . worker . port . postMessage ( { type : RefreshMessageTypes . DISCONNECT } ) ;
35+ } ) ;
36+ }
7537
76-
77- async handleRedirectFromLogin ( ) {
78- await super . handleRedirectFromLogin ( ) ;
79- if ( this . isActive ) { // If login was successful, tell the worker to schedule refreshing
80- this . worker . port . postMessage ( {
81- type : RefreshMessageTypes . SCHEDULE ,
82- payload : { ...this . getTokenDetails ( ) , expires_in : this . getExpiresIn ( ) }
83- } ) ;
38+ private async handleWorkerMessage ( data : any ) {
39+ const { type, payload, error } = data ;
40+ switch ( type ) {
41+ case RefreshMessageTypes . TOKEN_DETAILS :
42+ const wasActive = this . isActive ;
43+ await this . setTokenDetails ( payload . tokenDetails ) ;
44+ if ( wasActive !== this . isActive )
45+ this . dispatchStateChangeEvent ( ) ;
46+ if ( this . refreshPromise && this . resolveRefresh ) {
47+ this . resolveRefresh ( ) ;
48+ this . clearRefreshPromise ( ) ;
49+ }
50+ break ;
51+ case RefreshMessageTypes . ERROR_ON_REFRESH :
52+ if ( this . isActive )
53+ this . dispatchExpirationWarningEvent ( ) ;
54+ if ( this . refreshPromise && this . rejectRefresh ) {
55+ if ( this . isActive ) {
56+ this . rejectRefresh ( new Error ( error || 'Token refresh failed' ) ) ;
57+ } else {
58+ this . rejectRefresh ( new Error ( "No session to restore" ) ) ;
59+ }
60+ this . clearRefreshPromise ( ) ;
61+ }
62+ break ;
63+ case RefreshMessageTypes . EXPIRED :
64+ if ( this . isActive ) {
65+ this . dispatchExpirationEvent ( ) ;
66+ await this . logout ( ) ;
8467 }
68+ if ( this . refreshPromise && this . rejectRefresh ) {
69+ this . rejectRefresh ( new Error ( error || 'Token refresh failed' ) ) ;
70+ this . clearRefreshPromise ( ) ;
71+ }
72+ break ;
8573 }
74+ } ;
8675
87- async restore ( ) {
88- if ( this . refreshPromise ) {
89- return this . refreshPromise ;
90- }
91- this . refreshPromise = new Promise ( ( resolve , reject ) => {
92- this . resolveRefresh = resolve ;
93- this . rejectRefresh = reject ;
94- } ) ;
95- this . worker . port . postMessage ( { type : RefreshMessageTypes . REFRESH } ) ;
96- return this . refreshPromise ;
76+
77+ async handleRedirectFromLogin ( url : string ) {
78+ await super . handleRedirectFromLogin ( url ) ;
79+ if ( this . isActive ) { // If login was successful, tell the worker to schedule refreshing
80+ this . worker . port . postMessage ( {
81+ type : RefreshMessageTypes . SCHEDULE ,
82+ payload : { ...this . getTokenDetails ( ) , expires_in : this . getExpiresIn ( ) }
83+ } ) ;
9784 }
85+ }
9886
99- async logout ( ) {
100- this . worker . port . postMessage ( { type : RefreshMessageTypes . STOP } ) ;
101- await super . logout ( ) ;
87+ async restore ( ) {
88+ if ( this . refreshPromise ) {
89+ return this . refreshPromise ;
10290 }
91+ this . refreshPromise = new Promise ( ( resolve , reject ) => {
92+ this . resolveRefresh = resolve ;
93+ this . rejectRefresh = reject ;
94+ } ) ;
95+ this . worker . port . postMessage ( { type : RefreshMessageTypes . REFRESH } ) ;
96+ return this . refreshPromise ;
97+ }
10398
104- }
99+ async logout ( ) {
100+ this . worker . port . postMessage ( { type : RefreshMessageTypes . STOP } ) ;
101+ await super . logout ( ) ;
102+ }
103+
104+ }
0 commit comments