@@ -5,6 +5,7 @@ let checkoutSessionId;
5
5
let userDataCache = null ;
6
6
let userFamilyDataCache = null ;
7
7
let userFamilySemaphore = null ;
8
+ let tokenSemaphore = null ;
8
9
let nextAllowedRequest = 0 ;
9
10
10
11
/** @type {browser } ExtensionApi */
@@ -196,24 +197,9 @@ async function FetchSteamUserFamilyData( callback )
196
197
197
198
try
198
199
{
199
- const tokenResponseFetch = await fetch (
200
- `https://store.steampowered.com/pointssummary/ajaxgetasyncconfig` ,
201
- {
202
- credentials : 'include' ,
203
- headers : {
204
- Accept : 'application/json' ,
205
- } ,
206
- }
207
- ) ;
208
- const token = await tokenResponseFetch . json ( ) ;
209
-
210
- if ( ! token || ! token . success || ! token . data || ! token . data . webapi_token )
211
- {
212
- throw new Error ( 'Are you logged on the Steam Store in this browser?' ) ;
213
- }
214
-
200
+ const token = await GetStoreToken ( ) ;
215
201
const paramsSharedLibrary = new URLSearchParams ( ) ;
216
- paramsSharedLibrary . set ( 'access_token' , token . data . webapi_token ) ;
202
+ paramsSharedLibrary . set ( 'access_token' , token ) ;
217
203
paramsSharedLibrary . set ( 'family_groupid' , '0' ) ; // family_groupid is ignored
218
204
paramsSharedLibrary . set ( 'include_excluded' , 'true' ) ;
219
205
paramsSharedLibrary . set ( 'include_free' , 'true' ) ;
@@ -402,6 +388,62 @@ function GetAchievementsGroups( appid, callback )
402
388
. catch ( ( error ) => callback ( { success : false , error : error . message } ) ) ;
403
389
}
404
390
391
+ /**
392
+ * @return {Promise<String> }
393
+ */
394
+ async function GetStoreToken ( )
395
+ {
396
+ if ( tokenSemaphore !== null )
397
+ {
398
+ return await tokenSemaphore ;
399
+ }
400
+ let token = null ;
401
+ let semaphoreResolve = null ;
402
+ tokenSemaphore = new Promise ( resolve =>
403
+ {
404
+ semaphoreResolve = resolve ;
405
+ } ) ;
406
+
407
+ try
408
+ {
409
+ token = await GetLocalOption ( { storetoken : false } ) . then ( data => data . storetoken ) ;
410
+ if ( token )
411
+ {
412
+ const jwt = token . split ( '.' ) ;
413
+ const payload = JSON . parse ( atob ( jwt [ 1 ] ) ) ;
414
+ const expiration = payload . exp * 1000 ;
415
+ if ( Date . now ( ) < expiration )
416
+ {
417
+ return token ;
418
+ }
419
+ }
420
+
421
+ token = await fetch (
422
+ `https://store.steampowered.com/pointssummary/ajaxgetasyncconfig` ,
423
+ {
424
+ credentials : 'include' ,
425
+ headers : {
426
+ Accept : 'application/json' ,
427
+ } ,
428
+ }
429
+ ) . then ( response => response . json ( ) ) ;
430
+
431
+ if ( ! token || ! token . success || ! token . data || ! token . data . webapi_token )
432
+ {
433
+ throw new Error ( 'Are you logged on the Steam Store in this browser?' ) ;
434
+ }
435
+
436
+ await SetLocalOption ( 'storetoken' , token . data . webapi_token ) ;
437
+
438
+ return token . data . webapi_token ;
439
+ }
440
+ finally
441
+ {
442
+ semaphoreResolve ( token ) ;
443
+ tokenSemaphore = null ;
444
+ } ;
445
+ }
446
+
405
447
/**
406
448
* @param {Function } callback
407
449
*/
0 commit comments