halo-infinite-api 13.0.0 → 14.0.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (76) hide show
  1. package/coverage/lcov-report/authentication/halo-authentication-client.ts.html +8 -5
  2. package/coverage/lcov-report/authentication/index.html +7 -7
  3. package/coverage/lcov-report/authentication/xbox-authentication-client.ts.html +24 -9
  4. package/coverage/lcov-report/core/halo-infinite-client.ts.html +13 -34
  5. package/coverage/lcov-report/core/index.html +14 -14
  6. package/coverage/lcov-report/core/request-policy.ts.html +1 -1
  7. package/coverage/lcov-report/core/token-persisters/in-memory-token-persister.ts.html +1 -1
  8. package/coverage/lcov-report/core/token-persisters/index.html +1 -1
  9. package/coverage/lcov-report/core/token-persisters/local-storage-token-persister.ts.html +1 -1
  10. package/coverage/lcov-report/core/token-persisters/node-fs-token-persister.ts.html +1 -1
  11. package/coverage/lcov-report/core/token-persisters/token-persister.ts.html +1 -1
  12. package/coverage/lcov-report/core/token-providers/auto-token-provider.ts.html +19 -43
  13. package/coverage/lcov-report/core/token-providers/index.html +37 -7
  14. package/coverage/lcov-report/core/token-providers/spartan-token-provider.ts.html +106 -0
  15. package/coverage/lcov-report/core/token-providers/{spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts.html → static-xsts-ticket-token-spartan-token-provider.ts.html} +25 -49
  16. package/coverage/lcov-report/core/token-providers/xbox-token-provider.ts.html +1 -1
  17. package/coverage/lcov-report/core/xbox-client.ts.html +1 -1
  18. package/coverage/lcov-report/endpoints/halo-core-endpoints.ts.html +1 -1
  19. package/coverage/lcov-report/endpoints/index.html +1 -1
  20. package/coverage/lcov-report/index.html +22 -37
  21. package/coverage/lcov-report/models/halo-infinite/api-formatted-date.ts.html +1 -1
  22. package/coverage/lcov-report/models/halo-infinite/asset-kind.ts.html +1 -1
  23. package/coverage/lcov-report/models/halo-infinite/asset-version-link.ts.html +1 -1
  24. package/coverage/lcov-report/models/halo-infinite/asset.ts.html +1 -1
  25. package/coverage/lcov-report/models/halo-infinite/ban-summary.ts.html +1 -1
  26. package/coverage/lcov-report/models/halo-infinite/game-variant-category.ts.html +1 -1
  27. package/coverage/lcov-report/models/halo-infinite/index.html +1 -1
  28. package/coverage/lcov-report/models/halo-infinite/match-info.ts.html +1 -1
  29. package/coverage/lcov-report/models/halo-infinite/match-outcome.ts.html +1 -1
  30. package/coverage/lcov-report/models/halo-infinite/match-skill.ts.html +1 -1
  31. package/coverage/lcov-report/models/halo-infinite/match-stats.ts.html +1 -1
  32. package/coverage/lcov-report/models/halo-infinite/match-type.ts.html +1 -1
  33. package/coverage/lcov-report/models/halo-infinite/matches-privacy.ts.html +1 -1
  34. package/coverage/lcov-report/models/halo-infinite/medals-metadata-file.ts.html +1 -1
  35. package/coverage/lcov-report/models/halo-infinite/player-match-history.ts.html +1 -1
  36. package/coverage/lcov-report/models/halo-infinite/playlist-csr-container.ts.html +1 -1
  37. package/coverage/lcov-report/models/halo-infinite/playlist-csr.ts.html +1 -1
  38. package/coverage/lcov-report/models/halo-infinite/playlist-experience.ts.html +1 -1
  39. package/coverage/lcov-report/models/halo-infinite/playlist.ts.html +1 -1
  40. package/coverage/lcov-report/models/halo-infinite/progression-file.ts.html +1 -1
  41. package/coverage/lcov-report/models/halo-infinite/season.ts.html +1 -1
  42. package/coverage/lcov-report/models/halo-infinite/service-record.ts.html +1 -1
  43. package/coverage/lcov-report/models/halo-infinite/skill-result.ts.html +1 -1
  44. package/coverage/lcov-report/models/halo-infinite/stats.ts.html +1 -1
  45. package/coverage/lcov-report/models/halo-infinite/user-info.ts.html +1 -1
  46. package/coverage/lcov-report/models/index.html +1 -1
  47. package/coverage/lcov-report/models/spartan-token-proof.ts.html +1 -1
  48. package/coverage/lcov-report/models/spartan-token-request.ts.html +1 -1
  49. package/coverage/lcov-report/models/spartan-token.ts.html +1 -1
  50. package/coverage/lcov-report/models/xbox-ticket.ts.html +1 -1
  51. package/coverage/lcov-report/util/date-time.ts.html +1 -1
  52. package/coverage/lcov-report/util/expiry-token-cache.ts.html +1 -1
  53. package/coverage/lcov-report/util/fetch-function.ts.html +1 -1
  54. package/coverage/lcov-report/util/global-contants.ts.html +1 -1
  55. package/coverage/lcov-report/util/index.html +1 -1
  56. package/coverage/lcov-report/util/keyed-expiry-token-cache.ts.html +1 -1
  57. package/coverage/lcov-report/util/request-error.ts.html +1 -1
  58. package/coverage/lcov-report/util/resolvable-promise.ts.html +29 -29
  59. package/coverage/lcov-report/util/xuid.ts.html +1 -1
  60. package/coverage/lcov.info +267 -267
  61. package/dist/index.cjs +32 -47
  62. package/dist/index.cjs.map +1 -1
  63. package/dist/index.d.cts +12 -17
  64. package/dist/index.d.ts +12 -17
  65. package/dist/index.js +32 -47
  66. package/dist/index.js.map +1 -1
  67. package/package.json +1 -1
  68. package/src/authentication/halo-authentication-client.ts +2 -1
  69. package/src/authentication/xbox-authentication-client.ts +10 -5
  70. package/src/core/halo-infinite-client.test.ts +18 -9
  71. package/src/core/halo-infinite-client.ts +5 -12
  72. package/src/core/token-providers/auto-token-provider.ts +15 -23
  73. package/src/core/token-providers/{spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts → static-xsts-ticket-token-spartan-token-provider.ts} +12 -20
  74. package/src/index.ts +2 -2
  75. package/coverage/lcov-report/core/token-providers/spartan-token-providers/index.html +0 -116
  76. /package/src/core/token-providers/{spartan-token-providers/index.ts → spartan-token-provider.ts} +0 -0
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/102</span>
28
+ <span class='fraction'>0/103</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/102</span>
49
+ <span class='fraction'>0/103</span>
50
50
  </div>
51
51
 
52
52
 
@@ -165,7 +165,9 @@
165
165
  <a name='L100'></a><a href='#L100'>100</a>
166
166
  <a name='L101'></a><a href='#L101'>101</a>
167
167
  <a name='L102'></a><a href='#L102'>102</a>
168
- <a name='L103'></a><a href='#L103'>103</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
168
+ <a name='L103'></a><a href='#L103'>103</a>
169
+ <a name='L104'></a><a href='#L104'>104</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
170
+ <span class="cline-any cline-no">&nbsp;</span>
169
171
  <span class="cline-any cline-no">&nbsp;</span>
170
172
  <span class="cline-any cline-no">&nbsp;</span>
171
173
  <span class="cline-any cline-no">&nbsp;</span>
@@ -276,13 +278,14 @@
276
278
  <span class="cstat-no" title="statement not covered" >import { RequestError } from "../util/request-error";</span>
277
279
  <span class="cstat-no" title="statement not covered" >import { unauthorizedRetryPolicy } from "../core/request-policy";</span>
278
280
  <span class="cstat-no" title="statement not covered" >import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";</span>
281
+ <span class="cstat-no" title="statement not covered" >import { SpartanTokenProvider } from "..";</span>
279
282
  <span class="cstat-no" title="statement not covered" ></span>
280
283
  <span class="cstat-no" title="statement not covered" >export interface Token {</span>
281
284
  <span class="cstat-no" title="statement not covered" > token: string;</span>
282
285
  <span class="cstat-no" title="statement not covered" > expiresAt: DateTime;</span>
283
286
  <span class="cstat-no" title="statement not covered" >}</span>
284
287
  <span class="cstat-no" title="statement not covered" ></span>
285
- <span class="cstat-no" title="statement not covered" >export class HaloAuthenticationClient {</span>
288
+ <span class="cstat-no" title="statement not covered" >export class HaloAuthenticationClient implements SpartanTokenProvider {</span>
286
289
  <span class="cstat-no" title="statement not covered" > private spartanTokenCache = new ExpiryTokenCache(</span>
287
290
  <span class="cstat-no" title="statement not covered" > async () =&gt; {</span>
288
291
  <span class="cstat-no" title="statement not covered" > const failureHandler = unauthorizedRetryPolicy.onFailure(</span>
@@ -376,7 +379,7 @@
376
379
  <div class='footer quiet pad2 space-top1 center small'>
377
380
  Code coverage generated by
378
381
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
379
- at 2025-11-19T04:39:38.927Z
382
+ at 2025-11-21T02:48:56.500Z
380
383
  </div>
381
384
  <script src="../prettify.js"></script>
382
385
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/263</span>
28
+ <span class='fraction'>0/269</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/263</span>
49
+ <span class='fraction'>0/269</span>
50
50
  </div>
51
51
 
52
52
 
@@ -84,13 +84,13 @@
84
84
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
85
85
  </td>
86
86
  <td data-value="0" class="pct low">0%</td>
87
- <td data-value="102" class="abs low">0/102</td>
87
+ <td data-value="103" class="abs low">0/103</td>
88
88
  <td data-value="0" class="pct low">0%</td>
89
89
  <td data-value="1" class="abs low">0/1</td>
90
90
  <td data-value="0" class="pct low">0%</td>
91
91
  <td data-value="1" class="abs low">0/1</td>
92
92
  <td data-value="0" class="pct low">0%</td>
93
- <td data-value="102" class="abs low">0/102</td>
93
+ <td data-value="103" class="abs low">0/103</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -99,13 +99,13 @@
99
99
  <div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
100
100
  </td>
101
101
  <td data-value="0" class="pct low">0%</td>
102
- <td data-value="161" class="abs low">0/161</td>
102
+ <td data-value="166" class="abs low">0/166</td>
103
103
  <td data-value="0" class="pct low">0%</td>
104
104
  <td data-value="1" class="abs low">0/1</td>
105
105
  <td data-value="0" class="pct low">0%</td>
106
106
  <td data-value="1" class="abs low">0/1</td>
107
107
  <td data-value="0" class="pct low">0%</td>
108
- <td data-value="161" class="abs low">0/161</td>
108
+ <td data-value="166" class="abs low">0/166</td>
109
109
  </tr>
110
110
 
111
111
  </tbody>
@@ -116,7 +116,7 @@
116
116
  <div class='footer quiet pad2 space-top1 center small'>
117
117
  Code coverage generated by
118
118
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
119
- at 2025-11-19T04:39:38.927Z
119
+ at 2025-11-21T02:48:56.500Z
120
120
  </div>
121
121
  <script src="../prettify.js"></script>
122
122
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/161</span>
28
+ <span class='fraction'>0/166</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/161</span>
49
+ <span class='fraction'>0/166</span>
50
50
  </div>
51
51
 
52
52
 
@@ -224,7 +224,17 @@
224
224
  <a name='L159'></a><a href='#L159'>159</a>
225
225
  <a name='L160'></a><a href='#L160'>160</a>
226
226
  <a name='L161'></a><a href='#L161'>161</a>
227
- <a name='L162'></a><a href='#L162'>162</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
227
+ <a name='L162'></a><a href='#L162'>162</a>
228
+ <a name='L163'></a><a href='#L163'>163</a>
229
+ <a name='L164'></a><a href='#L164'>164</a>
230
+ <a name='L165'></a><a href='#L165'>165</a>
231
+ <a name='L166'></a><a href='#L166'>166</a>
232
+ <a name='L167'></a><a href='#L167'>167</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
233
+ <span class="cline-any cline-no">&nbsp;</span>
234
+ <span class="cline-any cline-no">&nbsp;</span>
235
+ <span class="cline-any cline-no">&nbsp;</span>
236
+ <span class="cline-any cline-no">&nbsp;</span>
237
+ <span class="cline-any cline-no">&nbsp;</span>
228
238
  <span class="cline-any cline-no">&nbsp;</span>
229
239
  <span class="cline-any cline-no">&nbsp;</span>
230
240
  <span class="cline-any cline-no">&nbsp;</span>
@@ -495,16 +505,14 @@
495
505
  <span class="cstat-no" title="statement not covered" > );</span>
496
506
  <span class="cstat-no" title="statement not covered" ></span>
497
507
  <span class="cstat-no" title="statement not covered" > constructor(</span>
508
+ <span class="cstat-no" title="statement not covered" > private readonly getOauth2AccessToken: () =&gt; Promise&lt;string&gt;,</span>
498
509
  <span class="cstat-no" title="statement not covered" > private readonly tokenPersisterOrPromise?:</span>
499
510
  <span class="cstat-no" title="statement not covered" > | TokenPersister</span>
500
511
  <span class="cstat-no" title="statement not covered" > | Promise&lt;TokenPersister&gt;,</span>
501
512
  <span class="cstat-no" title="statement not covered" > private readonly fetchFn: FetchFunction = defaultFetch</span>
502
513
  <span class="cstat-no" title="statement not covered" > ) {}</span>
503
514
  <span class="cstat-no" title="statement not covered" ></span>
504
- <span class="cstat-no" title="statement not covered" > public async getXstsTicket(</span>
505
- <span class="cstat-no" title="statement not covered" > getOauth2AccessToken: () =&gt; Promise&lt;string&gt;,</span>
506
- <span class="cstat-no" title="statement not covered" > relyingParty: RelyingParty</span>
507
- <span class="cstat-no" title="statement not covered" > ) {</span>
515
+ <span class="cstat-no" title="statement not covered" > public async getXstsTicket(relyingParty: RelyingParty) {</span>
508
516
  <span class="cstat-no" title="statement not covered" > let xstsTicket = await this.xstsTicketCache.getExistingToken(relyingParty);</span>
509
517
  <span class="cstat-no" title="statement not covered" > if (!xstsTicket) {</span>
510
518
  <span class="cstat-no" title="statement not covered" > let userToken = await this.userTokenCache.getExistingToken();</span>
@@ -524,7 +532,7 @@
524
532
  <span class="cstat-no" title="statement not covered" > if (!userToken) {</span>
525
533
  <span class="cstat-no" title="statement not covered" > // Ouath2 token depends on nothing, so we can fetch it without</span>
526
534
  <span class="cstat-no" title="statement not covered" > // worrying if it is expired.</span>
527
- <span class="cstat-no" title="statement not covered" > const oauthToken = await getOauth2AccessToken();</span>
535
+ <span class="cstat-no" title="statement not covered" > const oauthToken = await this.getOauth2AccessToken();</span>
528
536
  <span class="cstat-no" title="statement not covered" > userToken = await this.userTokenCache.getToken(oauthToken);</span>
529
537
  <span class="cstat-no" title="statement not covered" > }</span>
530
538
  <span class="cstat-no" title="statement not covered" > return this.xstsTicketCache.getToken(relyingParty, userToken.Token);</span>
@@ -545,6 +553,13 @@
545
553
  <span class="cstat-no" title="statement not covered" ></span>
546
554
  <span class="cstat-no" title="statement not covered" > public getXboxLiveV3Token = (xboxTicket: XboxTicket) =&gt;</span>
547
555
  <span class="cstat-no" title="statement not covered" > `XBL3.0 x=${xboxTicket.DisplayClaims.xui[0].uhs};${xboxTicket.Token}`;</span>
556
+ <span class="cstat-no" title="statement not covered" ></span>
557
+ <span class="cstat-no" title="statement not covered" > public clearXboxUserToken = async () =&gt; {</span>
558
+ <span class="cstat-no" title="statement not covered" > // Clear from memory</span>
559
+ <span class="cstat-no" title="statement not covered" > this.userTokenCache.clearToken();</span>
560
+ <span class="cstat-no" title="statement not covered" > // Clear from storage</span>
561
+ <span class="cstat-no" title="statement not covered" > (await this.tokenPersisterOrPromise)?.clear("xbox.userToken");</span>
562
+ <span class="cstat-no" title="statement not covered" > };</span>
548
563
  <span class="cstat-no" title="statement not covered" >}</span>
549
564
  &nbsp;</pre></td></tr></table></pre>
550
565
 
@@ -553,7 +568,7 @@
553
568
  <div class='footer quiet pad2 space-top1 center small'>
554
569
  Code coverage generated by
555
570
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
556
- at 2025-11-19T04:39:38.927Z
571
+ at 2025-11-21T02:48:56.500Z
557
572
  </div>
558
573
  <script src="../prettify.js"></script>
559
574
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">44.72% </span>
26
+ <span class="strong">44.53% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>216/483</span>
28
+ <span class='fraction'>212/476</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">72.72% </span>
33
+ <span class="strong">88.88% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>8/11</span>
35
+ <span class='fraction'>8/9</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">44.72% </span>
47
+ <span class="strong">44.53% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>216/483</span>
49
+ <span class='fraction'>212/476</span>
50
50
  </div>
51
51
 
52
52
 
@@ -539,14 +539,7 @@
539
539
  <a name='L474'></a><a href='#L474'>474</a>
540
540
  <a name='L475'></a><a href='#L475'>475</a>
541
541
  <a name='L476'></a><a href='#L476'>476</a>
542
- <a name='L477'></a><a href='#L477'>477</a>
543
- <a name='L478'></a><a href='#L478'>478</a>
544
- <a name='L479'></a><a href='#L479'>479</a>
545
- <a name='L480'></a><a href='#L480'>480</a>
546
- <a name='L481'></a><a href='#L481'>481</a>
547
- <a name='L482'></a><a href='#L482'>482</a>
548
- <a name='L483'></a><a href='#L483'>483</a>
549
- <a name='L484'></a><a href='#L484'>484</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
542
+ <a name='L477'></a><a href='#L477'>477</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
550
543
  <span class="cline-any cline-yes">1x</span>
551
544
  <span class="cline-any cline-yes">1x</span>
552
545
  <span class="cline-any cline-yes">1x</span>
@@ -659,13 +652,6 @@
659
652
  <span class="cline-any cline-yes">1x</span>
660
653
  <span class="cline-any cline-yes">1x</span>
661
654
  <span class="cline-any cline-yes">1x</span>
662
- <span class="cline-any cline-no">&nbsp;</span>
663
- <span class="cline-any cline-no">&nbsp;</span>
664
- <span class="cline-any cline-no">&nbsp;</span>
665
- <span class="cline-any cline-yes">1x</span>
666
- <span class="cline-any cline-yes">1x</span>
667
- <span class="cline-any cline-yes">1x</span>
668
- <span class="cline-any cline-yes">1x</span>
669
655
  <span class="cline-any cline-yes">1x</span>
670
656
  <span class="cline-any cline-yes">1x</span>
671
657
  <span class="cline-any cline-yes">2x</span>
@@ -1047,7 +1033,7 @@ import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-conta
1047
1033
  import { ServiceRecord } from "../models/halo-infinite/service-record";
1048
1034
  import { UserInfo } from "../models/halo-infinite/user-info";
1049
1035
  import { GlobalConstants } from "../util/global-contants";
1050
- import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
1036
+ import { SpartanTokenProvider } from "./token-providers/spartan-token-provider";
1051
1037
  import { RequestError } from "../util/request-error";
1052
1038
  import { MatchesPrivacy } from "../models/halo-infinite/matches-privacy";
1053
1039
  import { MedalsMetadataFile } from "../models/halo-infinite/medals-metadata-file";
@@ -1131,20 +1117,13 @@ export class HaloInfiniteClient {
1131
1117
  &nbsp;
1132
1118
  constructor(
1133
1119
  private readonly spartanTokenProvider: SpartanTokenProvider,
1134
- private readonly clearXstsToken: () =&gt; Promise&lt;void&gt;,
1135
1120
  private readonly fetchFn: FetchFunction = defaultFetch
1136
1121
  ) {}
1137
1122
  &nbsp;
1138
- private async executeRequest(url: string, init: RequestInit) {
1123
+ protected async executeRequest(url: string, init: RequestInit) {
1139
1124
  const failureHandler = unauthorizedRetryPolicy.onFailure(
1140
1125
  async ({ handled }) =&gt; {
1141
1126
  if (handled) {
1142
- const expiration =
1143
- await this.spartanTokenProvider.getCurrentExpiration();
1144
- if (expiration<span class="branch-0 cbranch-no" title="branch not covered" > &amp;&amp; expiration &gt; DateTime.now().plus({ minutes: 1 }))</span> <span class="branch-0 cbranch-no" title="branch not covered" >{</span>
1145
- <span class="cstat-no" title="statement not covered" > // Token should still be valid, but was rejected. That means the xsts is likely invalid.</span>
1146
- <span class="cstat-no" title="statement not covered" > await this.clearXstsToken();</span>
1147
- <span class="cstat-no" title="statement not covered" > }</span>
1148
1127
  await this.spartanTokenProvider.clearSpartanToken();
1149
1128
  }
1150
1129
  }
@@ -1179,7 +1158,7 @@ export class HaloInfiniteClient {
1179
1158
  }
1180
1159
  }
1181
1160
  &nbsp;
1182
- private async executeJsonRequest&lt;T&gt;(url: string, init: RequestInit) {
1161
+ protected async executeJsonRequest&lt;T&gt;(url: string, init: RequestInit) {
1183
1162
  const response = await this.executeRequest(url, init);
1184
1163
  &nbsp;
1185
1164
  if (response.status &gt;= 200 &amp;&amp; response.status &lt; 300) {
@@ -1189,7 +1168,7 @@ export class HaloInfiniteClient {
1189
1168
  <span class="cstat-no" title="statement not covered" > }</span>
1190
1169
  }
1191
1170
  &nbsp;
1192
- private <span class="fstat-no" title="function not covered" >async executeResultsRequest&lt;T&gt;(</span>
1171
+ protected <span class="fstat-no" title="function not covered" >async executeResultsRequest&lt;T&gt;(</span>
1193
1172
  <span class="cstat-no" title="statement not covered" > ...args: Parameters&lt;HaloInfiniteClient["executeJsonRequest"]&gt;</span>
1194
1173
  <span class="cstat-no" title="statement not covered" > ) {</span>
1195
1174
  <span class="cstat-no" title="statement not covered" > let resultsContainer: ResultsContainer&lt;T&gt;;</span>
@@ -1211,7 +1190,7 @@ export class HaloInfiniteClient {
1211
1190
  <span class="cstat-no" title="statement not covered" > return resultsContainer.Value;</span>
1212
1191
  <span class="cstat-no" title="statement not covered" > }</span>
1213
1192
  &nbsp;
1214
- private <span class="fstat-no" title="function not covered" >async executePaginationRequest&lt;T&gt;(</span>
1193
+ protected <span class="fstat-no" title="function not covered" >async executePaginationRequest&lt;T&gt;(</span>
1215
1194
  <span class="cstat-no" title="statement not covered" > count: number,</span>
1216
1195
  <span class="cstat-no" title="statement not covered" > start: number,</span>
1217
1196
  <span class="cstat-no" title="statement not covered" > queryParameters: Record&lt;string, string&gt;,</span>
@@ -1519,7 +1498,7 @@ export class HaloInfiniteClient {
1519
1498
  <div class='footer quiet pad2 space-top1 center small'>
1520
1499
  Code coverage generated by
1521
1500
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1522
- at 2025-11-19T04:39:38.927Z
1501
+ at 2025-11-21T02:48:56.500Z
1523
1502
  </div>
1524
1503
  <script src="../prettify.js"></script>
1525
1504
  <script>
@@ -23,16 +23,16 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">37.54% </span>
26
+ <span class="strong">37.3% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>223/594</span>
28
+ <span class='fraction'>219/587</span>
29
29
  </div>
30
30
 
31
31
 
32
32
  <div class='fl pad1y space-right2'>
33
- <span class="strong">69.23% </span>
33
+ <span class="strong">81.81% </span>
34
34
  <span class="quiet">Branches</span>
35
- <span class='fraction'>9/13</span>
35
+ <span class='fraction'>9/11</span>
36
36
  </div>
37
37
 
38
38
 
@@ -44,9 +44,9 @@
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">37.54% </span>
47
+ <span class="strong">37.3% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>223/594</span>
49
+ <span class='fraction'>219/587</span>
50
50
  </div>
51
51
 
52
52
 
@@ -80,17 +80,17 @@
80
80
  </thead>
81
81
  <tbody><tr>
82
82
  <td class="file low" data-value="halo-infinite-client.ts"><a href="halo-infinite-client.ts.html">halo-infinite-client.ts</a></td>
83
- <td data-value="44.72" class="pic low">
83
+ <td data-value="44.53" class="pic low">
84
84
  <div class="chart"><div class="cover-fill" style="width: 44%"></div><div class="cover-empty" style="width: 56%"></div></div>
85
85
  </td>
86
- <td data-value="44.72" class="pct low">44.72%</td>
87
- <td data-value="483" class="abs low">216/483</td>
88
- <td data-value="72.72" class="pct medium">72.72%</td>
89
- <td data-value="11" class="abs medium">8/11</td>
86
+ <td data-value="44.53" class="pct low">44.53%</td>
87
+ <td data-value="476" class="abs low">212/476</td>
88
+ <td data-value="88.88" class="pct high">88.88%</td>
89
+ <td data-value="9" class="abs high">8/9</td>
90
90
  <td data-value="20.83" class="pct low">20.83%</td>
91
91
  <td data-value="24" class="abs low">5/24</td>
92
- <td data-value="44.72" class="pct low">44.72%</td>
93
- <td data-value="483" class="abs low">216/483</td>
92
+ <td data-value="44.53" class="pct low">44.53%</td>
93
+ <td data-value="476" class="abs low">212/476</td>
94
94
  </tr>
95
95
 
96
96
  <tr>
@@ -131,7 +131,7 @@
131
131
  <div class='footer quiet pad2 space-top1 center small'>
132
132
  Code coverage generated by
133
133
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
134
- at 2025-11-19T04:39:38.927Z
134
+ at 2025-11-21T02:48:56.500Z
135
135
  </div>
136
136
  <script src="../prettify.js"></script>
137
137
  <script>
@@ -91,7 +91,7 @@ export const unauthorizedRetryPolicy = retry(
91
91
  <div class='footer quiet pad2 space-top1 center small'>
92
92
  Code coverage generated by
93
93
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
94
- at 2025-11-19T04:39:38.927Z
94
+ at 2025-11-21T02:48:56.500Z
95
95
  </div>
96
96
  <script src="../prettify.js"></script>
97
97
  <script>
@@ -115,7 +115,7 @@ export const inMemoryTokenPersister: TokenPersister = {
115
115
  <div class='footer quiet pad2 space-top1 center small'>
116
116
  Code coverage generated by
117
117
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
118
- at 2025-11-19T04:39:38.927Z
118
+ at 2025-11-21T02:48:56.500Z
119
119
  </div>
120
120
  <script src="../../prettify.js"></script>
121
121
  <script>
@@ -146,7 +146,7 @@
146
146
  <div class='footer quiet pad2 space-top1 center small'>
147
147
  Code coverage generated by
148
148
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
149
- at 2025-11-19T04:39:38.927Z
149
+ at 2025-11-21T02:48:56.500Z
150
150
  </div>
151
151
  <script src="../../prettify.js"></script>
152
152
  <script>
@@ -124,7 +124,7 @@
124
124
  <div class='footer quiet pad2 space-top1 center small'>
125
125
  Code coverage generated by
126
126
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
127
- at 2025-11-19T04:39:38.927Z
127
+ at 2025-11-21T02:48:56.500Z
128
128
  </div>
129
129
  <script src="../../prettify.js"></script>
130
130
  <script>
@@ -184,7 +184,7 @@ export const nodeFsTokenPersister: TokenPersister = {
184
184
  <div class='footer quiet pad2 space-top1 center small'>
185
185
  Code coverage generated by
186
186
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
187
- at 2025-11-19T04:39:38.927Z
187
+ at 2025-11-21T02:48:56.500Z
188
188
  </div>
189
189
  <script src="../../prettify.js"></script>
190
190
  <script>
@@ -85,7 +85,7 @@
85
85
  <div class='footer quiet pad2 space-top1 center small'>
86
86
  Code coverage generated by
87
87
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
88
- at 2025-11-19T04:39:38.927Z
88
+ at 2025-11-21T02:48:56.500Z
89
89
  </div>
90
90
  <script src="../../prettify.js"></script>
91
91
  <script>
@@ -25,7 +25,7 @@
25
25
  <div class='fl pad1y space-right2'>
26
26
  <span class="strong">0% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>0/79</span>
28
+ <span class='fraction'>0/71</span>
29
29
  </div>
30
30
 
31
31
 
@@ -46,7 +46,7 @@
46
46
  <div class='fl pad1y space-right2'>
47
47
  <span class="strong">0% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>0/79</span>
49
+ <span class='fraction'>0/71</span>
50
50
  </div>
51
51
 
52
52
 
@@ -134,23 +134,7 @@
134
134
  <a name='L69'></a><a href='#L69'>69</a>
135
135
  <a name='L70'></a><a href='#L70'>70</a>
136
136
  <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a>
138
- <a name='L73'></a><a href='#L73'>73</a>
139
- <a name='L74'></a><a href='#L74'>74</a>
140
- <a name='L75'></a><a href='#L75'>75</a>
141
- <a name='L76'></a><a href='#L76'>76</a>
142
- <a name='L77'></a><a href='#L77'>77</a>
143
- <a name='L78'></a><a href='#L78'>78</a>
144
- <a name='L79'></a><a href='#L79'>79</a>
145
- <a name='L80'></a><a href='#L80'>80</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
146
- <span class="cline-any cline-no">&nbsp;</span>
147
- <span class="cline-any cline-no">&nbsp;</span>
148
- <span class="cline-any cline-no">&nbsp;</span>
149
- <span class="cline-any cline-no">&nbsp;</span>
150
- <span class="cline-any cline-no">&nbsp;</span>
151
- <span class="cline-any cline-no">&nbsp;</span>
152
- <span class="cline-any cline-no">&nbsp;</span>
153
- <span class="cline-any cline-no">&nbsp;</span>
137
+ <a name='L72'></a><a href='#L72'>72</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
154
138
  <span class="cline-any cline-no">&nbsp;</span>
155
139
  <span class="cline-any cline-no">&nbsp;</span>
156
140
  <span class="cline-any cline-no">&nbsp;</span>
@@ -227,7 +211,7 @@
227
211
  <span class="cstat-no" title="statement not covered" >} from "../../authentication/xbox-authentication-client";</span>
228
212
  <span class="cstat-no" title="statement not covered" >import { TokenPersister } from "../token-persisters";</span>
229
213
  <span class="cstat-no" title="statement not covered" >import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";</span>
230
- <span class="cstat-no" title="statement not covered" >import { SpartanTokenProvider } from "./spartan-token-providers";</span>
214
+ <span class="cstat-no" title="statement not covered" >import { SpartanTokenProvider } from "./spartan-token-provider";</span>
231
215
  <span class="cstat-no" title="statement not covered" >import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";</span>
232
216
  <span class="cstat-no" title="statement not covered" >import { XboxTokenProvider } from "./xbox-token-provider";</span>
233
217
  <span class="cstat-no" title="statement not covered" >import type { FetchFunction } from "../../util/fetch-function";</span>
@@ -239,11 +223,9 @@
239
223
  <span class="cstat-no" title="statement not covered" > * CORS restrictions.</span>
240
224
  <span class="cstat-no" title="statement not covered" > */</span>
241
225
  <span class="cstat-no" title="statement not covered" >export class AutoTokenProvider</span>
226
+ <span class="cstat-no" title="statement not covered" > extends HaloAuthenticationClient</span>
242
227
  <span class="cstat-no" title="statement not covered" > implements SpartanTokenProvider, XboxTokenProvider</span>
243
228
  <span class="cstat-no" title="statement not covered" >{</span>
244
- <span class="cstat-no" title="statement not covered" > public readonly getSpartanToken: () =&gt; Promise&lt;string&gt;;</span>
245
- <span class="cstat-no" title="statement not covered" > public readonly clearSpartanToken: () =&gt; Promise&lt;void&gt;;</span>
246
- <span class="cstat-no" title="statement not covered" > public readonly getCurrentExpiration: () =&gt; Promise&lt;DateTime | null&gt;;</span>
247
229
  <span class="cstat-no" title="statement not covered" > public readonly getXboxLiveV3Token: () =&gt; Promise&lt;string&gt;;</span>
248
230
  <span class="cstat-no" title="statement not covered" > public readonly clearXboxLiveV3Token: () =&gt; Promise&lt;void&gt;;</span>
249
231
  <span class="cstat-no" title="statement not covered" ></span>
@@ -252,21 +234,10 @@
252
234
  <span class="cstat-no" title="statement not covered" > tokenPersister?: TokenPersister | Promise&lt;TokenPersister&gt;,</span>
253
235
  <span class="cstat-no" title="statement not covered" > fetchFn?: FetchFunction</span>
254
236
  <span class="cstat-no" title="statement not covered" > ) {</span>
255
- <span class="cstat-no" title="statement not covered" > let tokenPeristerOrPromise: TokenPersister | Promise&lt;TokenPersister&gt;;</span>
256
- <span class="cstat-no" title="statement not covered" > if (tokenPersister) {</span>
257
- <span class="cstat-no" title="statement not covered" > tokenPeristerOrPromise = tokenPersister;</span>
258
- <span class="cstat-no" title="statement not covered" > } else {</span>
259
- <span class="cstat-no" title="statement not covered" > tokenPeristerOrPromise = inMemoryTokenPersister;</span>
260
- <span class="cstat-no" title="statement not covered" > }</span>
261
- <span class="cstat-no" title="statement not covered" > const xboxAuthClient = new XboxAuthenticationClient(</span>
262
- <span class="cstat-no" title="statement not covered" > tokenPersister,</span>
263
- <span class="cstat-no" title="statement not covered" > fetchFn</span>
264
- <span class="cstat-no" title="statement not covered" > );</span>
265
- <span class="cstat-no" title="statement not covered" > const haloAuthClient = new HaloAuthenticationClient(</span>
237
+ <span class="cstat-no" title="statement not covered" > super(</span>
266
238
  <span class="cstat-no" title="statement not covered" > {</span>
267
239
  <span class="cstat-no" title="statement not covered" > fetchToken: async () =&gt; {</span>
268
240
  <span class="cstat-no" title="statement not covered" > const xstsTicket = await xboxAuthClient.getXstsTicket(</span>
269
- <span class="cstat-no" title="statement not covered" > getOauth2AccessToken,</span>
270
241
  <span class="cstat-no" title="statement not covered" > RelyingParty.Halo</span>
271
242
  <span class="cstat-no" title="statement not covered" > );</span>
272
243
  <span class="cstat-no" title="statement not covered" > return xstsTicket.Token;</span>
@@ -285,19 +256,24 @@
285
256
  <span class="cstat-no" title="statement not covered" > },</span>
286
257
  <span class="cstat-no" title="statement not covered" > fetchFn</span>
287
258
  <span class="cstat-no" title="statement not covered" > );</span>
259
+ <span class="cstat-no" title="statement not covered" > let tokenPeristerOrPromise: TokenPersister | Promise&lt;TokenPersister&gt;;</span>
260
+ <span class="cstat-no" title="statement not covered" > if (tokenPersister) {</span>
261
+ <span class="cstat-no" title="statement not covered" > tokenPeristerOrPromise = tokenPersister;</span>
262
+ <span class="cstat-no" title="statement not covered" > } else {</span>
263
+ <span class="cstat-no" title="statement not covered" > tokenPeristerOrPromise = inMemoryTokenPersister;</span>
264
+ <span class="cstat-no" title="statement not covered" > }</span>
265
+ <span class="cstat-no" title="statement not covered" > const xboxAuthClient = new XboxAuthenticationClient(</span>
266
+ <span class="cstat-no" title="statement not covered" > getOauth2AccessToken,</span>
267
+ <span class="cstat-no" title="statement not covered" > tokenPersister,</span>
268
+ <span class="cstat-no" title="statement not covered" > fetchFn</span>
269
+ <span class="cstat-no" title="statement not covered" > );</span>
288
270
  <span class="cstat-no" title="statement not covered" ></span>
289
- <span class="cstat-no" title="statement not covered" > this.getSpartanToken = () =&gt; haloAuthClient.getSpartanToken();</span>
290
- <span class="cstat-no" title="statement not covered" > this.clearSpartanToken = () =&gt; haloAuthClient.clearSpartanToken();</span>
291
271
  <span class="cstat-no" title="statement not covered" > this.getXboxLiveV3Token = async () =&gt; {</span>
292
- <span class="cstat-no" title="statement not covered" > const xstsTicket = await xboxAuthClient.getXstsTicket(</span>
293
- <span class="cstat-no" title="statement not covered" > getOauth2AccessToken,</span>
294
- <span class="cstat-no" title="statement not covered" > RelyingParty.Xbox</span>
295
- <span class="cstat-no" title="statement not covered" > );</span>
272
+ <span class="cstat-no" title="statement not covered" > const xstsTicket = await xboxAuthClient.getXstsTicket(RelyingParty.Xbox);</span>
296
273
  <span class="cstat-no" title="statement not covered" > return xboxAuthClient.getXboxLiveV3Token(xstsTicket);</span>
297
274
  <span class="cstat-no" title="statement not covered" > };</span>
298
275
  <span class="cstat-no" title="statement not covered" > this.clearXboxLiveV3Token = () =&gt;</span>
299
276
  <span class="cstat-no" title="statement not covered" > xboxAuthClient.clearXstsTicket(RelyingParty.Xbox);</span>
300
- <span class="cstat-no" title="statement not covered" > this.getCurrentExpiration = () =&gt; haloAuthClient.getCurrentExpiration();</span>
301
277
  <span class="cstat-no" title="statement not covered" > }</span>
302
278
  <span class="cstat-no" title="statement not covered" >}</span>
303
279
  &nbsp;</pre></td></tr></table></pre>
@@ -307,7 +283,7 @@
307
283
  <div class='footer quiet pad2 space-top1 center small'>
308
284
  Code coverage generated by
309
285
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
310
- at 2025-11-19T04:39:38.927Z
286
+ at 2025-11-21T02:48:56.500Z
311
287
  </div>
312
288
  <script src="../../prettify.js"></script>
313
289
  <script>