halo-infinite-api 14.0.0 → 14.2.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 (75) hide show
  1. package/coverage/lcov-report/authentication/halo-authentication-client.ts.html +1 -1
  2. package/coverage/lcov-report/authentication/index.html +5 -5
  3. package/coverage/lcov-report/authentication/xbox-authentication-client.ts.html +18 -6
  4. package/coverage/lcov-report/core/halo-infinite-client.ts.html +127 -16
  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 +8 -11
  13. package/coverage/lcov-report/core/token-providers/index.html +7 -7
  14. package/coverage/lcov-report/core/token-providers/spartan-token-provider.ts.html +1 -1
  15. package/coverage/lcov-report/core/token-providers/static-xsts-ticket-token-spartan-token-provider.ts.html +7 -10
  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 +36 -36
  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 +38 -8
  28. package/coverage/lcov-report/models/halo-infinite/match-count.ts.html +100 -0
  29. package/coverage/lcov-report/models/halo-infinite/match-info.ts.html +1 -1
  30. package/coverage/lcov-report/models/halo-infinite/match-outcome.ts.html +1 -1
  31. package/coverage/lcov-report/models/halo-infinite/match-skill.ts.html +1 -1
  32. package/coverage/lcov-report/models/halo-infinite/match-stats.ts.html +1 -1
  33. package/coverage/lcov-report/models/halo-infinite/match-type.ts.html +1 -1
  34. package/coverage/lcov-report/models/halo-infinite/matches-privacy.ts.html +1 -1
  35. package/coverage/lcov-report/models/halo-infinite/medals-metadata-file.ts.html +1 -1
  36. package/coverage/lcov-report/models/halo-infinite/player-match-history.ts.html +1 -1
  37. package/coverage/lcov-report/models/halo-infinite/playlist-csr-container.ts.html +1 -1
  38. package/coverage/lcov-report/models/halo-infinite/playlist-csr.ts.html +1 -1
  39. package/coverage/lcov-report/models/halo-infinite/playlist-experience.ts.html +1 -1
  40. package/coverage/lcov-report/models/halo-infinite/playlist.ts.html +1 -1
  41. package/coverage/lcov-report/models/halo-infinite/progression-file.ts.html +1 -1
  42. package/coverage/lcov-report/models/halo-infinite/season.ts.html +1 -1
  43. package/coverage/lcov-report/models/halo-infinite/service-record.ts.html +1 -1
  44. package/coverage/lcov-report/models/halo-infinite/settings.ts.html +205 -0
  45. package/coverage/lcov-report/models/halo-infinite/skill-result.ts.html +1 -1
  46. package/coverage/lcov-report/models/halo-infinite/stats.ts.html +1 -1
  47. package/coverage/lcov-report/models/halo-infinite/user-info.ts.html +1 -1
  48. package/coverage/lcov-report/models/index.html +1 -1
  49. package/coverage/lcov-report/models/spartan-token-proof.ts.html +1 -1
  50. package/coverage/lcov-report/models/spartan-token-request.ts.html +1 -1
  51. package/coverage/lcov-report/models/spartan-token.ts.html +1 -1
  52. package/coverage/lcov-report/models/xbox-ticket.ts.html +1 -1
  53. package/coverage/lcov-report/util/date-time.ts.html +21 -21
  54. package/coverage/lcov-report/util/expiry-token-cache.ts.html +1 -1
  55. package/coverage/lcov-report/util/fetch-function.ts.html +1 -1
  56. package/coverage/lcov-report/util/global-contants.ts.html +1 -1
  57. package/coverage/lcov-report/util/index.html +16 -16
  58. package/coverage/lcov-report/util/keyed-expiry-token-cache.ts.html +1 -1
  59. package/coverage/lcov-report/util/request-error.ts.html +1 -1
  60. package/coverage/lcov-report/util/resolvable-promise.ts.html +1 -1
  61. package/coverage/lcov-report/util/xuid.ts.html +1 -1
  62. package/coverage/lcov.info +331 -216
  63. package/dist/index.cjs +31 -11
  64. package/dist/index.cjs.map +1 -1
  65. package/dist/index.d.cts +45 -2
  66. package/dist/index.d.ts +45 -2
  67. package/dist/index.js +31 -11
  68. package/dist/index.js.map +1 -1
  69. package/package.json +1 -1
  70. package/src/authentication/xbox-authentication-client.ts +6 -2
  71. package/src/core/halo-infinite-client.ts +45 -8
  72. package/src/core/token-providers/auto-token-provider.ts +3 -4
  73. package/src/core/token-providers/static-xsts-ticket-token-spartan-token-provider.ts +2 -3
  74. package/src/models/halo-infinite/match-count.ts +6 -0
  75. package/src/models/halo-infinite/settings.ts +40 -0
@@ -379,7 +379,7 @@
379
379
  <div class='footer quiet pad2 space-top1 center small'>
380
380
  Code coverage generated by
381
381
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
382
- at 2025-11-21T02:48:56.500Z
382
+ at 2025-12-14T17:51:28.165Z
383
383
  </div>
384
384
  <script src="../prettify.js"></script>
385
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/269</span>
28
+ <span class='fraction'>0/273</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/269</span>
49
+ <span class='fraction'>0/273</span>
50
50
  </div>
51
51
 
52
52
 
@@ -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="166" class="abs low">0/166</td>
102
+ <td data-value="170" class="abs low">0/170</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="166" class="abs low">0/166</td>
108
+ <td data-value="170" class="abs low">0/170</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-21T02:48:56.500Z
119
+ at 2025-12-14T17:51:28.165Z
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/166</span>
28
+ <span class='fraction'>0/170</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/166</span>
49
+ <span class='fraction'>0/170</span>
50
50
  </div>
51
51
 
52
52
 
@@ -229,7 +229,15 @@
229
229
  <a name='L164'></a><a href='#L164'>164</a>
230
230
  <a name='L165'></a><a href='#L165'>165</a>
231
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>
232
+ <a name='L167'></a><a href='#L167'>167</a>
233
+ <a name='L168'></a><a href='#L168'>168</a>
234
+ <a name='L169'></a><a href='#L169'>169</a>
235
+ <a name='L170'></a><a href='#L170'>170</a>
236
+ <a name='L171'></a><a href='#L171'>171</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
237
+ <span class="cline-any cline-no">&nbsp;</span>
238
+ <span class="cline-any cline-no">&nbsp;</span>
239
+ <span class="cline-any cline-no">&nbsp;</span>
240
+ <span class="cline-any cline-no">&nbsp;</span>
233
241
  <span class="cline-any cline-no">&nbsp;</span>
234
242
  <span class="cline-any cline-no">&nbsp;</span>
235
243
  <span class="cline-any cline-no">&nbsp;</span>
@@ -416,6 +424,10 @@
416
424
  <span class="cstat-no" title="statement not covered" >}</span>
417
425
  <span class="cstat-no" title="statement not covered" ></span>
418
426
  <span class="cstat-no" title="statement not covered" >export class XboxAuthenticationClient {</span>
427
+ <span class="cstat-no" title="statement not covered" > static readonly userTokenName = "xbox.userToken";</span>
428
+ <span class="cstat-no" title="statement not covered" > static readonly xstsTicketName = (relyingParty: RelyingParty) =&gt;</span>
429
+ <span class="cstat-no" title="statement not covered" > `xbox.xstsTicket.${relyingParty}`;</span>
430
+ <span class="cstat-no" title="statement not covered" ></span>
419
431
  <span class="cstat-no" title="statement not covered" > private userTokenCache = new ExpiryTokenCache(</span>
420
432
  <span class="cstat-no" title="statement not covered" > async (accessToken: string) =&gt; {</span>
421
433
  <span class="cstat-no" title="statement not covered" > const url = "https://user.auth.xboxlive.com/user/authenticate";</span>
@@ -456,7 +468,7 @@
456
468
  <span class="cstat-no" title="statement not covered" > const tokenPersister = await this.tokenPersisterOrPromise;</span>
457
469
  <span class="cstat-no" title="statement not covered" > return (</span>
458
470
  <span class="cstat-no" title="statement not covered" > (await tokenPersister?.load&lt;XboxTicket &amp; { expiresAt: unknown }&gt;(</span>
459
- <span class="cstat-no" title="statement not covered" > "xbox.userToken"</span>
471
+ <span class="cstat-no" title="statement not covered" > XboxAuthenticationClient.userTokenName</span>
460
472
  <span class="cstat-no" title="statement not covered" > )) ?? null</span>
461
473
  <span class="cstat-no" title="statement not covered" > );</span>
462
474
  <span class="cstat-no" title="statement not covered" > }</span>
@@ -490,7 +502,7 @@
490
502
  <span class="cstat-no" title="statement not covered" > };</span>
491
503
  <span class="cstat-no" title="statement not covered" > await (</span>
492
504
  <span class="cstat-no" title="statement not covered" > await this.tokenPersisterOrPromise</span>
493
- <span class="cstat-no" title="statement not covered" > )?.save("xbox.xstsTicket." + relyingParty, token);</span>
505
+ <span class="cstat-no" title="statement not covered" > )?.save(XboxAuthenticationClient.xstsTicketName(relyingParty), token);</span>
494
506
  <span class="cstat-no" title="statement not covered" > return token;</span>
495
507
  <span class="cstat-no" title="statement not covered" > } else {</span>
496
508
  <span class="cstat-no" title="statement not covered" > throw new RequestError(url, response);</span>
@@ -568,7 +580,7 @@
568
580
  <div class='footer quiet pad2 space-top1 center small'>
569
581
  Code coverage generated by
570
582
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
571
- at 2025-11-21T02:48:56.500Z
583
+ at 2025-12-14T17:51:28.165Z
572
584
  </div>
573
585
  <script src="../prettify.js"></script>
574
586
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">44.53% </span>
26
+ <span class="strong">44.83% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>212/476</span>
28
+ <span class='fraction'>230/513</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,16 +37,16 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">20.83% </span>
40
+ <span class="strong">19.23% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>5/24</span>
42
+ <span class='fraction'>5/26</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">44.53% </span>
47
+ <span class="strong">44.83% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>212/476</span>
49
+ <span class='fraction'>230/513</span>
50
50
  </div>
51
51
 
52
52
 
@@ -539,7 +539,46 @@
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></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
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>
550
+ <a name='L485'></a><a href='#L485'>485</a>
551
+ <a name='L486'></a><a href='#L486'>486</a>
552
+ <a name='L487'></a><a href='#L487'>487</a>
553
+ <a name='L488'></a><a href='#L488'>488</a>
554
+ <a name='L489'></a><a href='#L489'>489</a>
555
+ <a name='L490'></a><a href='#L490'>490</a>
556
+ <a name='L491'></a><a href='#L491'>491</a>
557
+ <a name='L492'></a><a href='#L492'>492</a>
558
+ <a name='L493'></a><a href='#L493'>493</a>
559
+ <a name='L494'></a><a href='#L494'>494</a>
560
+ <a name='L495'></a><a href='#L495'>495</a>
561
+ <a name='L496'></a><a href='#L496'>496</a>
562
+ <a name='L497'></a><a href='#L497'>497</a>
563
+ <a name='L498'></a><a href='#L498'>498</a>
564
+ <a name='L499'></a><a href='#L499'>499</a>
565
+ <a name='L500'></a><a href='#L500'>500</a>
566
+ <a name='L501'></a><a href='#L501'>501</a>
567
+ <a name='L502'></a><a href='#L502'>502</a>
568
+ <a name='L503'></a><a href='#L503'>503</a>
569
+ <a name='L504'></a><a href='#L504'>504</a>
570
+ <a name='L505'></a><a href='#L505'>505</a>
571
+ <a name='L506'></a><a href='#L506'>506</a>
572
+ <a name='L507'></a><a href='#L507'>507</a>
573
+ <a name='L508'></a><a href='#L508'>508</a>
574
+ <a name='L509'></a><a href='#L509'>509</a>
575
+ <a name='L510'></a><a href='#L510'>510</a>
576
+ <a name='L511'></a><a href='#L511'>511</a>
577
+ <a name='L512'></a><a href='#L512'>512</a>
578
+ <a name='L513'></a><a href='#L513'>513</a>
579
+ <a name='L514'></a><a href='#L514'>514</a></td><td class="line-coverage quiet"><span class="cline-any cline-yes">1x</span>
580
+ <span class="cline-any cline-yes">1x</span>
581
+ <span class="cline-any cline-yes">1x</span>
543
582
  <span class="cline-any cline-yes">1x</span>
544
583
  <span class="cline-any cline-yes">1x</span>
545
584
  <span class="cline-any cline-yes">1x</span>
@@ -635,6 +674,11 @@
635
674
  <span class="cline-any cline-no">&nbsp;</span>
636
675
  <span class="cline-any cline-no">&nbsp;</span>
637
676
  <span class="cline-any cline-no">&nbsp;</span>
677
+ <span class="cline-any cline-no">&nbsp;</span>
678
+ <span class="cline-any cline-yes">1x</span>
679
+ <span class="cline-any cline-yes">1x</span>
680
+ <span class="cline-any cline-yes">1x</span>
681
+ <span class="cline-any cline-yes">1x</span>
638
682
  <span class="cline-any cline-yes">1x</span>
639
683
  <span class="cline-any cline-yes">1x</span>
640
684
  <span class="cline-any cline-yes">1x</span>
@@ -672,6 +716,12 @@
672
716
  <span class="cline-any cline-yes">2x</span>
673
717
  <span class="cline-any cline-yes">2x</span>
674
718
  <span class="cline-any cline-yes">2x</span>
719
+ <span class="cline-any cline-yes">2x</span>
720
+ <span class="cline-any cline-yes">2x</span>
721
+ <span class="cline-any cline-yes">1x</span>
722
+ <span class="cline-any cline-yes">1x</span>
723
+ <span class="cline-any cline-yes">1x</span>
724
+ <span class="cline-any cline-yes">1x</span>
675
725
  <span class="cline-any cline-yes">1x</span>
676
726
  <span class="cline-any cline-yes">1x</span>
677
727
  <span class="cline-any cline-yes">1x</span>
@@ -882,6 +932,18 @@
882
932
  <span class="cline-any cline-no">&nbsp;</span>
883
933
  <span class="cline-any cline-no">&nbsp;</span>
884
934
  <span class="cline-any cline-no">&nbsp;</span>
935
+ <span class="cline-any cline-yes">1x</span>
936
+ <span class="cline-any cline-yes">1x</span>
937
+ <span class="cline-any cline-yes">1x</span>
938
+ <span class="cline-any cline-no">&nbsp;</span>
939
+ <span class="cline-any cline-no">&nbsp;</span>
940
+ <span class="cline-any cline-no">&nbsp;</span>
941
+ <span class="cline-any cline-no">&nbsp;</span>
942
+ <span class="cline-any cline-no">&nbsp;</span>
943
+ <span class="cline-any cline-no">&nbsp;</span>
944
+ <span class="cline-any cline-no">&nbsp;</span>
945
+ <span class="cline-any cline-no">&nbsp;</span>
946
+ <span class="cline-any cline-no">&nbsp;</span>
885
947
  <span class="cline-any cline-no">&nbsp;</span>
886
948
  <span class="cline-any cline-no">&nbsp;</span>
887
949
  <span class="cline-any cline-no">&nbsp;</span>
@@ -1015,6 +1077,18 @@
1015
1077
  <span class="cline-any cline-no">&nbsp;</span>
1016
1078
  <span class="cline-any cline-yes">1x</span>
1017
1079
  <span class="cline-any cline-yes">1x</span>
1080
+ <span class="cline-any cline-yes">1x</span>
1081
+ <span class="cline-any cline-no">&nbsp;</span>
1082
+ <span class="cline-any cline-no">&nbsp;</span>
1083
+ <span class="cline-any cline-no">&nbsp;</span>
1084
+ <span class="cline-any cline-no">&nbsp;</span>
1085
+ <span class="cline-any cline-no">&nbsp;</span>
1086
+ <span class="cline-any cline-no">&nbsp;</span>
1087
+ <span class="cline-any cline-no">&nbsp;</span>
1088
+ <span class="cline-any cline-no">&nbsp;</span>
1089
+ <span class="cline-any cline-no">&nbsp;</span>
1090
+ <span class="cline-any cline-yes">1x</span>
1091
+ <span class="cline-any cline-yes">1x</span>
1018
1092
  <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js">import { FetchFunction, defaultFetch } from "../util/fetch-function";
1019
1093
  import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
1020
1094
  import {
@@ -1047,6 +1121,8 @@ import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
1047
1121
  import { DateTime } from "luxon";
1048
1122
  import { wrapPlayerId, unwrapPlayerId } from "../util/xuid";
1049
1123
  import { SeasonCalendarContainer } from "../models/halo-infinite/season";
1124
+ import { Settings } from "../models/halo-infinite/settings";
1125
+ import { MatchCount } from "src/models/halo-infinite/match-count";
1050
1126
  &nbsp;
1051
1127
  export interface ResultContainer&lt;TValue&gt; {
1052
1128
  Id: string;
@@ -1097,7 +1173,8 @@ export class HaloInfiniteClient {
1097
1173
  <span class="cstat-no" title="statement not covered" > }/oban/flight-configurations/titles/hi/audiences/retail/players/${wrapPlayerId(</span>
1098
1174
  <span class="cstat-no" title="statement not covered" > xuid</span>
1099
1175
  <span class="cstat-no" title="statement not covered" > )}/active`,</span>
1100
- <span class="cstat-no" title="statement not covered" > { method: "get" }</span>
1176
+ <span class="cstat-no" title="statement not covered" > { method: "get" },</span>
1177
+ <span class="cstat-no" title="statement not covered" > false</span>
1101
1178
  <span class="cstat-no" title="statement not covered" > );</span>
1102
1179
  <span class="cstat-no" title="statement not covered" > const {</span>
1103
1180
  <span class="cstat-no" title="statement not covered" > FlightConfigurationId,</span>
@@ -1120,7 +1197,11 @@ export class HaloInfiniteClient {
1120
1197
  private readonly fetchFn: FetchFunction = defaultFetch
1121
1198
  ) {}
1122
1199
  &nbsp;
1123
- protected async executeRequest(url: string, init: RequestInit) {
1200
+ protected async executeRequest(
1201
+ url: string,
1202
+ init: RequestInit,
1203
+ skipAuth: boolean
1204
+ ) {
1124
1205
  const failureHandler = unauthorizedRetryPolicy.onFailure(
1125
1206
  async ({ handled }) =&gt; {
1126
1207
  if (handled) {
@@ -1137,10 +1218,12 @@ export class HaloInfiniteClient {
1137
1218
  if (!headers.has("Accept")) {
1138
1219
  headers.set("Accept", "application/json");
1139
1220
  }
1140
- headers.set(
1141
- "x-343-authorization-spartan",
1142
- await this.spartanTokenProvider.getSpartanToken()
1143
- );
1221
+ if (!skipAuth) {
1222
+ headers.set(
1223
+ "x-343-authorization-spartan",
1224
+ await this.spartanTokenProvider.getSpartanToken()
1225
+ );
1226
+ }
1144
1227
  &nbsp;
1145
1228
  const response = await this.fetchFn(url, {
1146
1229
  ...init,
@@ -1158,8 +1241,12 @@ export class HaloInfiniteClient {
1158
1241
  }
1159
1242
  }
1160
1243
  &nbsp;
1161
- protected async executeJsonRequest&lt;T&gt;(url: string, init: RequestInit) {
1162
- const response = await this.executeRequest(url, init);
1244
+ protected async executeJsonRequest&lt;T&gt;(
1245
+ url: string,
1246
+ init: RequestInit,
1247
+ skipAuth?: boolean
1248
+ ) {
1249
+ const response = await this.executeRequest(url, init, skipAuth ?? false);
1163
1250
  &nbsp;
1164
1251
  if (response.status &gt;= 200 &amp;&amp; response.status &lt; 300) {
1165
1252
  return (await response.json()) as T;
@@ -1335,6 +1422,18 @@ export class HaloInfiniteClient {
1335
1422
  <span class="cstat-no" title="statement not covered" > }</span>
1336
1423
  <span class="cstat-no" title="statement not covered" > );</span>
1337
1424
  };
1425
+ &nbsp;
1426
+ public getPlayerMatchCount = <span class="fstat-no" title="function not covered" >(</span>
1427
+ <span class="cstat-no" title="statement not covered" > playerXuid: string,</span>
1428
+ <span class="cstat-no" title="statement not covered" > init?: Omit&lt;RequestInit, "body" | "method"&gt;</span>
1429
+ <span class="cstat-no" title="statement not covered" > ) =&gt;</span>
1430
+ <span class="cstat-no" title="statement not covered" > this.executeJsonRequest&lt;MatchCount&gt;(</span>
1431
+ <span class="cstat-no" title="statement not covered" > `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/matches/count`,</span>
1432
+ <span class="cstat-no" title="statement not covered" > {</span>
1433
+ <span class="cstat-no" title="statement not covered" > ...init,</span>
1434
+ <span class="cstat-no" title="statement not covered" > method: "get",</span>
1435
+ <span class="cstat-no" title="statement not covered" > }</span>
1436
+ );
1338
1437
  &nbsp;
1339
1438
  public getMatchStats = <span class="fstat-no" title="function not covered" >(</span>
1340
1439
  <span class="cstat-no" title="statement not covered" > matchId: string,</span>
@@ -1490,6 +1589,18 @@ export class HaloInfiniteClient {
1490
1589
  <span class="cstat-no" title="statement not covered" > method: "get",</span>
1491
1590
  <span class="cstat-no" title="statement not covered" > }</span>
1492
1591
  );
1592
+ &nbsp;
1593
+ public getSettings = <span class="fstat-no" title="function not covered" >(</span>
1594
+ <span class="cstat-no" title="statement not covered" > init?: Omit&lt;RequestInit, "body" | "method"&gt;</span>
1595
+ <span class="cstat-no" title="statement not covered" > ): Promise&lt;Settings&gt; =&gt;</span>
1596
+ <span class="cstat-no" title="statement not covered" > this.executeJsonRequest(</span>
1597
+ <span class="cstat-no" title="statement not covered" > `https://${HaloCoreEndpoints.SettingsOrigin}.${HaloCoreEndpoints.ServiceDomain}/settings/hipc/e2a0a7c6-6efe-42af-9283-c2ab73250c48`,</span>
1598
+ <span class="cstat-no" title="statement not covered" > {</span>
1599
+ <span class="cstat-no" title="statement not covered" > ...init,</span>
1600
+ <span class="cstat-no" title="statement not covered" > method: "get",</span>
1601
+ <span class="cstat-no" title="statement not covered" > },</span>
1602
+ <span class="cstat-no" title="statement not covered" > true</span>
1603
+ );
1493
1604
  }
1494
1605
  &nbsp;</pre></td></tr></table></pre>
1495
1606
 
@@ -1498,7 +1609,7 @@ export class HaloInfiniteClient {
1498
1609
  <div class='footer quiet pad2 space-top1 center small'>
1499
1610
  Code coverage generated by
1500
1611
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
1501
- at 2025-11-21T02:48:56.500Z
1612
+ at 2025-12-14T17:51:28.165Z
1502
1613
  </div>
1503
1614
  <script src="../prettify.js"></script>
1504
1615
  <script>
@@ -23,9 +23,9 @@
23
23
  <div class='clearfix'>
24
24
 
25
25
  <div class='fl pad1y space-right2'>
26
- <span class="strong">37.3% </span>
26
+ <span class="strong">37.98% </span>
27
27
  <span class="quiet">Statements</span>
28
- <span class='fraction'>219/587</span>
28
+ <span class='fraction'>237/624</span>
29
29
  </div>
30
30
 
31
31
 
@@ -37,16 +37,16 @@
37
37
 
38
38
 
39
39
  <div class='fl pad1y space-right2'>
40
- <span class="strong">20% </span>
40
+ <span class="strong">18.51% </span>
41
41
  <span class="quiet">Functions</span>
42
- <span class='fraction'>5/25</span>
42
+ <span class='fraction'>5/27</span>
43
43
  </div>
44
44
 
45
45
 
46
46
  <div class='fl pad1y space-right2'>
47
- <span class="strong">37.3% </span>
47
+ <span class="strong">37.98% </span>
48
48
  <span class="quiet">Lines</span>
49
- <span class='fraction'>219/587</span>
49
+ <span class='fraction'>237/624</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.53" class="pic low">
83
+ <td data-value="44.83" 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.53" class="pct low">44.53%</td>
87
- <td data-value="476" class="abs low">212/476</td>
86
+ <td data-value="44.83" class="pct low">44.83%</td>
87
+ <td data-value="513" class="abs low">230/513</td>
88
88
  <td data-value="88.88" class="pct high">88.88%</td>
89
89
  <td data-value="9" class="abs high">8/9</td>
90
- <td data-value="20.83" class="pct low">20.83%</td>
91
- <td data-value="24" class="abs low">5/24</td>
92
- <td data-value="44.53" class="pct low">44.53%</td>
93
- <td data-value="476" class="abs low">212/476</td>
90
+ <td data-value="19.23" class="pct low">19.23%</td>
91
+ <td data-value="26" class="abs low">5/26</td>
92
+ <td data-value="44.83" class="pct low">44.83%</td>
93
+ <td data-value="513" class="abs low">230/513</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-21T02:48:56.500Z
134
+ at 2025-12-14T17:51:28.165Z
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-21T02:48:56.500Z
94
+ at 2025-12-14T17:51:28.165Z
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-21T02:48:56.500Z
118
+ at 2025-12-14T17:51:28.165Z
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-21T02:48:56.500Z
149
+ at 2025-12-14T17:51:28.165Z
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-21T02:48:56.500Z
127
+ at 2025-12-14T17:51:28.165Z
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-21T02:48:56.500Z
187
+ at 2025-12-14T17:51:28.165Z
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-21T02:48:56.500Z
88
+ at 2025-12-14T17:51:28.165Z
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/71</span>
28
+ <span class='fraction'>0/70</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/71</span>
49
+ <span class='fraction'>0/70</span>
50
50
  </div>
51
51
 
52
52
 
@@ -133,8 +133,7 @@
133
133
  <a name='L68'></a><a href='#L68'>68</a>
134
134
  <a name='L69'></a><a href='#L69'>69</a>
135
135
  <a name='L70'></a><a href='#L70'>70</a>
136
- <a name='L71'></a><a href='#L71'>71</a>
137
- <a name='L72'></a><a href='#L72'>72</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
136
+ <a name='L71'></a><a href='#L71'>71</a></td><td class="line-coverage quiet"><span class="cline-any cline-no">&nbsp;</span>
138
137
  <span class="cline-any cline-no">&nbsp;</span>
139
138
  <span class="cline-any cline-no">&nbsp;</span>
140
139
  <span class="cline-any cline-no">&nbsp;</span>
@@ -204,18 +203,16 @@
204
203
  <span class="cline-any cline-no">&nbsp;</span>
205
204
  <span class="cline-any cline-no">&nbsp;</span>
206
205
  <span class="cline-any cline-no">&nbsp;</span>
207
- <span class="cline-any cline-no">&nbsp;</span>
208
- <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import {</span></span></span>
206
+ <span class="cline-any cline-neutral">&nbsp;</span></td><td class="text"><pre class="prettyprint lang-js"><span class="cstat-no" title="statement not covered" ><span class="fstat-no" title="function not covered" ><span class="branch-0 cbranch-no" title="branch not covered" >import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";</span></span></span>
207
+ <span class="cstat-no" title="statement not covered" >import {</span>
209
208
  <span class="cstat-no" title="statement not covered" > RelyingParty,</span>
210
209
  <span class="cstat-no" title="statement not covered" > XboxAuthenticationClient,</span>
211
210
  <span class="cstat-no" title="statement not covered" >} from "../../authentication/xbox-authentication-client";</span>
211
+ <span class="cstat-no" title="statement not covered" >import type { FetchFunction } from "../../util/fetch-function";</span>
212
212
  <span class="cstat-no" title="statement not covered" >import { TokenPersister } from "../token-persisters";</span>
213
- <span class="cstat-no" title="statement not covered" >import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";</span>
214
- <span class="cstat-no" title="statement not covered" >import { SpartanTokenProvider } from "./spartan-token-provider";</span>
215
213
  <span class="cstat-no" title="statement not covered" >import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";</span>
214
+ <span class="cstat-no" title="statement not covered" >import { SpartanTokenProvider } from "./spartan-token-provider";</span>
216
215
  <span class="cstat-no" title="statement not covered" >import { XboxTokenProvider } from "./xbox-token-provider";</span>
217
- <span class="cstat-no" title="statement not covered" >import type { FetchFunction } from "../../util/fetch-function";</span>
218
- <span class="cstat-no" title="statement not covered" >import type { DateTime } from "luxon";</span>
219
216
  <span class="cstat-no" title="statement not covered" ></span>
220
217
  <span class="cstat-no" title="statement not covered" >/**</span>
221
218
  <span class="cstat-no" title="statement not covered" > * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same</span>
@@ -283,7 +280,7 @@
283
280
  <div class='footer quiet pad2 space-top1 center small'>
284
281
  Code coverage generated by
285
282
  <a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
286
- at 2025-11-21T02:48:56.500Z
283
+ at 2025-12-14T17:51:28.165Z
287
284
  </div>
288
285
  <script src="../../prettify.js"></script>
289
286
  <script>