halo-infinite-api 12.0.2 → 13.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.
- package/.github/workflows/publish.yml +5 -3
- package/.prettierrc +3 -0
- package/coverage/lcov-report/authentication/halo-authentication-client.ts.html +44 -17
- package/coverage/lcov-report/authentication/index.html +5 -5
- package/coverage/lcov-report/authentication/xbox-authentication-client.ts.html +1 -1
- package/coverage/lcov-report/core/halo-infinite-client.ts.html +29 -8
- package/coverage/lcov-report/core/index.html +16 -16
- package/coverage/lcov-report/core/request-policy.ts.html +1 -1
- package/coverage/lcov-report/core/token-persisters/in-memory-token-persister.ts.html +1 -1
- package/coverage/lcov-report/core/token-persisters/index.html +1 -1
- package/coverage/lcov-report/core/token-persisters/local-storage-token-persister.ts.html +1 -1
- package/coverage/lcov-report/core/token-persisters/node-fs-token-persister.ts.html +1 -1
- package/coverage/lcov-report/core/token-persisters/token-persister.ts.html +1 -1
- package/coverage/lcov-report/core/token-providers/auto-token-provider.ts.html +27 -24
- package/coverage/lcov-report/core/token-providers/index.html +5 -5
- package/coverage/lcov-report/core/token-providers/spartan-token-providers/index.html +5 -5
- package/coverage/lcov-report/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts.html +37 -16
- package/coverage/lcov-report/core/token-providers/xbox-token-provider.ts.html +1 -1
- package/coverage/lcov-report/core/xbox-client.ts.html +4 -7
- package/coverage/lcov-report/endpoints/halo-core-endpoints.ts.html +1 -1
- package/coverage/lcov-report/endpoints/index.html +1 -1
- package/coverage/lcov-report/index.html +20 -20
- package/coverage/lcov-report/models/halo-infinite/api-formatted-date.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/asset-kind.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/asset-version-link.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/asset.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/ban-summary.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/game-variant-category.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/index.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-info.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-outcome.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-skill.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-stats.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-type.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/matches-privacy.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/medals-metadata-file.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/player-match-history.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist-csr-container.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist-csr.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist-experience.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/progression-file.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/season.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/service-record.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/skill-result.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/stats.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/user-info.ts.html +1 -1
- package/coverage/lcov-report/models/index.html +1 -1
- package/coverage/lcov-report/models/spartan-token-proof.ts.html +1 -1
- package/coverage/lcov-report/models/spartan-token-request.ts.html +1 -1
- package/coverage/lcov-report/models/spartan-token.ts.html +1 -1
- package/coverage/lcov-report/models/xbox-ticket.ts.html +1 -1
- package/coverage/lcov-report/util/date-time.ts.html +1 -1
- package/coverage/lcov-report/util/expiry-token-cache.ts.html +1 -1
- package/coverage/lcov-report/util/fetch-function.ts.html +1 -1
- package/coverage/lcov-report/util/global-contants.ts.html +1 -1
- package/coverage/lcov-report/util/index.html +1 -1
- package/coverage/lcov-report/util/keyed-expiry-token-cache.ts.html +1 -1
- package/coverage/lcov-report/util/request-error.ts.html +1 -1
- package/coverage/lcov-report/util/resolvable-promise.ts.html +1 -1
- package/coverage/lcov-report/util/xuid.ts.html +1 -1
- package/coverage/lcov.info +228 -203
- package/dist/index.cjs +54 -44
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +19 -10
- package/dist/index.d.ts +19 -10
- package/dist/index.js +54 -44
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/authentication/halo-authentication-client.ts +22 -13
- package/src/core/halo-infinite-client.test.ts +6 -1
- package/src/core/halo-infinite-client.ts +7 -0
- package/src/core/token-providers/auto-token-provider.ts +21 -20
- package/src/core/token-providers/spartan-token-providers/index.ts +3 -0
- package/src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts +19 -12
- package/src/core/xbox-client.ts +0 -1
- package/.github/workflows/npm-publish.yml +0 -22
|
@@ -61,9 +61,11 @@ jobs:
|
|
|
61
61
|
else
|
|
62
62
|
COMMITS=$(git log "$PREV_TAG..HEAD" --pretty=format:'- %s')
|
|
63
63
|
fi
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
64
|
+
{
|
|
65
|
+
echo "commits<<EOF"
|
|
66
|
+
echo "$COMMITS"
|
|
67
|
+
echo "EOF"
|
|
68
|
+
} >> $GITHUB_OUTPUT
|
|
67
69
|
|
|
68
70
|
- name: Create GitHub Release
|
|
69
71
|
uses: actions/create-release@v1
|
package/.prettierrc
ADDED
|
@@ -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/
|
|
28
|
+
<span class='fraction'>0/102</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/
|
|
49
|
+
<span class='fraction'>0/102</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -156,7 +156,25 @@
|
|
|
156
156
|
<a name='L91'></a><a href='#L91'>91</a>
|
|
157
157
|
<a name='L92'></a><a href='#L92'>92</a>
|
|
158
158
|
<a name='L93'></a><a href='#L93'>93</a>
|
|
159
|
-
<a name='L94'></a><a href='#L94'>94</a
|
|
159
|
+
<a name='L94'></a><a href='#L94'>94</a>
|
|
160
|
+
<a name='L95'></a><a href='#L95'>95</a>
|
|
161
|
+
<a name='L96'></a><a href='#L96'>96</a>
|
|
162
|
+
<a name='L97'></a><a href='#L97'>97</a>
|
|
163
|
+
<a name='L98'></a><a href='#L98'>98</a>
|
|
164
|
+
<a name='L99'></a><a href='#L99'>99</a>
|
|
165
|
+
<a name='L100'></a><a href='#L100'>100</a>
|
|
166
|
+
<a name='L101'></a><a href='#L101'>101</a>
|
|
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"> </span>
|
|
169
|
+
<span class="cline-any cline-no"> </span>
|
|
170
|
+
<span class="cline-any cline-no"> </span>
|
|
171
|
+
<span class="cline-any cline-no"> </span>
|
|
172
|
+
<span class="cline-any cline-no"> </span>
|
|
173
|
+
<span class="cline-any cline-no"> </span>
|
|
174
|
+
<span class="cline-any cline-no"> </span>
|
|
175
|
+
<span class="cline-any cline-no"> </span>
|
|
176
|
+
<span class="cline-any cline-no"> </span>
|
|
177
|
+
<span class="cline-any cline-no"> </span>
|
|
160
178
|
<span class="cline-any cline-no"> </span>
|
|
161
179
|
<span class="cline-any cline-no"> </span>
|
|
162
180
|
<span class="cline-any cline-no"> </span>
|
|
@@ -270,13 +288,13 @@
|
|
|
270
288
|
<span class="cstat-no" title="statement not covered" > const failureHandler = unauthorizedRetryPolicy.onFailure(</span>
|
|
271
289
|
<span class="cstat-no" title="statement not covered" > async ({ handled }) => {</span>
|
|
272
290
|
<span class="cstat-no" title="statement not covered" > if (handled) {</span>
|
|
273
|
-
<span class="cstat-no" title="statement not covered" > await this.clearXstsToken();</span>
|
|
291
|
+
<span class="cstat-no" title="statement not covered" > await this.xsts.clearXstsToken();</span>
|
|
274
292
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
275
293
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
276
294
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
277
295
|
<span class="cstat-no" title="statement not covered" > try {</span>
|
|
278
296
|
<span class="cstat-no" title="statement not covered" > return await unauthorizedRetryPolicy.execute(async () => {</span>
|
|
279
|
-
<span class="cstat-no" title="statement not covered" > const xstsToken = await this.
|
|
297
|
+
<span class="cstat-no" title="statement not covered" > const xstsToken = await this.xsts.fetchToken();</span>
|
|
280
298
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
281
299
|
<span class="cstat-no" title="statement not covered" > const tokenRequest: SpartanTokenRequest = {</span>
|
|
282
300
|
<span class="cstat-no" title="statement not covered" > Audience: "urn:343:s3:services",</span>
|
|
@@ -305,7 +323,7 @@
|
|
|
305
323
|
<span class="cstat-no" title="statement not covered" > token: result_2.SpartanToken,</span>
|
|
306
324
|
<span class="cstat-no" title="statement not covered" > expiresAt: DateTime.fromISO(result_2.ExpiresUtc.ISO8601Date),</span>
|
|
307
325
|
<span class="cstat-no" title="statement not covered" > };</span>
|
|
308
|
-
<span class="cstat-no" title="statement not covered" > await this.saveToken(newToken);</span>
|
|
326
|
+
<span class="cstat-no" title="statement not covered" > await this.tokenStore.saveToken(newToken);</span>
|
|
309
327
|
<span class="cstat-no" title="statement not covered" > return newToken;</span>
|
|
310
328
|
<span class="cstat-no" title="statement not covered" > } else {</span>
|
|
311
329
|
<span class="cstat-no" title="statement not covered" > throw new RequestError(url, response);</span>
|
|
@@ -315,18 +333,22 @@
|
|
|
315
333
|
<span class="cstat-no" title="statement not covered" > failureHandler.dispose();</span>
|
|
316
334
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
317
335
|
<span class="cstat-no" title="statement not covered" > },</span>
|
|
318
|
-
<span class="cstat-no" title="statement not covered" > () => this.loadToken()</span>
|
|
336
|
+
<span class="cstat-no" title="statement not covered" > () => this.tokenStore.loadToken()</span>
|
|
319
337
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
320
338
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
321
339
|
<span class="cstat-no" title="statement not covered" > constructor(</span>
|
|
322
|
-
<span class="cstat-no" title="statement not covered" > private readonly
|
|
323
|
-
<span class="cstat-no" title="statement not covered" >
|
|
324
|
-
<span class="cstat-no" title="statement not covered" >
|
|
325
|
-
<span class="cstat-no" title="statement not covered" >
|
|
326
|
-
<span class="cstat-no" title="statement not covered" >
|
|
327
|
-
<span class="cstat-no" title="statement not covered" >
|
|
328
|
-
<span class="cstat-no" title="statement not covered" >
|
|
329
|
-
<span class="cstat-no" title="statement not covered" >
|
|
340
|
+
<span class="cstat-no" title="statement not covered" > private readonly xsts: {</span>
|
|
341
|
+
<span class="cstat-no" title="statement not covered" > fetchToken: () => Promise<string> | string;</span>
|
|
342
|
+
<span class="cstat-no" title="statement not covered" > clearXstsToken: () => Promise<void>;</span>
|
|
343
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
344
|
+
<span class="cstat-no" title="statement not covered" > private readonly tokenStore: {</span>
|
|
345
|
+
<span class="cstat-no" title="statement not covered" > loadToken: () => Promise<{</span>
|
|
346
|
+
<span class="cstat-no" title="statement not covered" > token: string;</span>
|
|
347
|
+
<span class="cstat-no" title="statement not covered" > expiresAt: unknown;</span>
|
|
348
|
+
<span class="cstat-no" title="statement not covered" > } | null>;</span>
|
|
349
|
+
<span class="cstat-no" title="statement not covered" > saveToken: (token: Token) => Promise<void>;</span>
|
|
350
|
+
<span class="cstat-no" title="statement not covered" > clearToken: () => Promise<void>;</span>
|
|
351
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
330
352
|
<span class="cstat-no" title="statement not covered" > private readonly fetchFn: FetchFunction = defaultFetch</span>
|
|
331
353
|
<span class="cstat-no" title="statement not covered" > ) {}</span>
|
|
332
354
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
@@ -339,7 +361,12 @@
|
|
|
339
361
|
<span class="cstat-no" title="statement not covered" > // Clear from memory</span>
|
|
340
362
|
<span class="cstat-no" title="statement not covered" > this.spartanTokenCache.clearToken();</span>
|
|
341
363
|
<span class="cstat-no" title="statement not covered" > // Clear from storage</span>
|
|
342
|
-
<span class="cstat-no" title="statement not covered" > await this.clearToken();</span>
|
|
364
|
+
<span class="cstat-no" title="statement not covered" > await this.tokenStore.clearToken();</span>
|
|
365
|
+
<span class="cstat-no" title="statement not covered" > }</span>
|
|
366
|
+
<span class="cstat-no" title="statement not covered" ></span>
|
|
367
|
+
<span class="cstat-no" title="statement not covered" > public async getCurrentExpiration(): Promise<DateTime | null> {</span>
|
|
368
|
+
<span class="cstat-no" title="statement not covered" > const currentToken = await this.spartanTokenCache.getExistingToken();</span>
|
|
369
|
+
<span class="cstat-no" title="statement not covered" > return currentToken ? currentToken.expiresAt : null;</span>
|
|
343
370
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
344
371
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
345
372
|
</pre></td></tr></table></pre>
|
|
@@ -349,7 +376,7 @@
|
|
|
349
376
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
350
377
|
Code coverage generated by
|
|
351
378
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
352
|
-
at 2025-
|
|
379
|
+
at 2025-11-19T04:39:38.927Z
|
|
353
380
|
</div>
|
|
354
381
|
<script src="../prettify.js"></script>
|
|
355
382
|
<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/
|
|
28
|
+
<span class='fraction'>0/263</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/
|
|
49
|
+
<span class='fraction'>0/263</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="
|
|
87
|
+
<td data-value="102" class="abs low">0/102</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="
|
|
93
|
+
<td data-value="102" class="abs low">0/102</td>
|
|
94
94
|
</tr>
|
|
95
95
|
|
|
96
96
|
<tr>
|
|
@@ -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-
|
|
119
|
+
at 2025-11-19T04:39:38.927Z
|
|
120
120
|
</div>
|
|
121
121
|
<script src="../prettify.js"></script>
|
|
122
122
|
<script>
|
|
@@ -553,7 +553,7 @@
|
|
|
553
553
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
554
554
|
Code coverage generated by
|
|
555
555
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
556
|
-
at 2025-
|
|
556
|
+
at 2025-11-19T04:39:38.927Z
|
|
557
557
|
</div>
|
|
558
558
|
<script src="../prettify.js"></script>
|
|
559
559
|
<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.
|
|
26
|
+
<span class="strong">44.72% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>216/483</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">72.72% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>8/
|
|
35
|
+
<span class='fraction'>8/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">44.
|
|
47
|
+
<span class="strong">44.72% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>216/483</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -539,7 +539,14 @@
|
|
|
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
|
|
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>
|
|
543
550
|
<span class="cline-any cline-yes">1x</span>
|
|
544
551
|
<span class="cline-any cline-yes">1x</span>
|
|
545
552
|
<span class="cline-any cline-yes">1x</span>
|
|
@@ -652,6 +659,13 @@
|
|
|
652
659
|
<span class="cline-any cline-yes">1x</span>
|
|
653
660
|
<span class="cline-any cline-yes">1x</span>
|
|
654
661
|
<span class="cline-any cline-yes">1x</span>
|
|
662
|
+
<span class="cline-any cline-no"> </span>
|
|
663
|
+
<span class="cline-any cline-no"> </span>
|
|
664
|
+
<span class="cline-any cline-no"> </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>
|
|
655
669
|
<span class="cline-any cline-yes">1x</span>
|
|
656
670
|
<span class="cline-any cline-yes">1x</span>
|
|
657
671
|
<span class="cline-any cline-yes">2x</span>
|
|
@@ -1117,6 +1131,7 @@ export class HaloInfiniteClient {
|
|
|
1117
1131
|
|
|
1118
1132
|
constructor(
|
|
1119
1133
|
private readonly spartanTokenProvider: SpartanTokenProvider,
|
|
1134
|
+
private readonly clearXstsToken: () => Promise<void>,
|
|
1120
1135
|
private readonly fetchFn: FetchFunction = defaultFetch
|
|
1121
1136
|
) {}
|
|
1122
1137
|
|
|
@@ -1124,6 +1139,12 @@ export class HaloInfiniteClient {
|
|
|
1124
1139
|
const failureHandler = unauthorizedRetryPolicy.onFailure(
|
|
1125
1140
|
async ({ handled }) => {
|
|
1126
1141
|
if (handled) {
|
|
1142
|
+
const expiration =
|
|
1143
|
+
await this.spartanTokenProvider.getCurrentExpiration();
|
|
1144
|
+
if (expiration<span class="branch-0 cbranch-no" title="branch not covered" > && expiration > 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>
|
|
1127
1148
|
await this.spartanTokenProvider.clearSpartanToken();
|
|
1128
1149
|
}
|
|
1129
1150
|
}
|
|
@@ -1498,7 +1519,7 @@ export class HaloInfiniteClient {
|
|
|
1498
1519
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
1499
1520
|
Code coverage generated by
|
|
1500
1521
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
1501
|
-
at 2025-
|
|
1522
|
+
at 2025-11-19T04:39:38.927Z
|
|
1502
1523
|
</div>
|
|
1503
1524
|
<script src="../prettify.js"></script>
|
|
1504
1525
|
<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.
|
|
26
|
+
<span class="strong">37.54% </span>
|
|
27
27
|
<span class="quiet">Statements</span>
|
|
28
|
-
<span class='fraction'>
|
|
28
|
+
<span class='fraction'>223/594</span>
|
|
29
29
|
</div>
|
|
30
30
|
|
|
31
31
|
|
|
32
32
|
<div class='fl pad1y space-right2'>
|
|
33
|
-
<span class="strong">
|
|
33
|
+
<span class="strong">69.23% </span>
|
|
34
34
|
<span class="quiet">Branches</span>
|
|
35
|
-
<span class='fraction'>9/
|
|
35
|
+
<span class='fraction'>9/13</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.
|
|
47
|
+
<span class="strong">37.54% </span>
|
|
48
48
|
<span class="quiet">Lines</span>
|
|
49
|
-
<span class='fraction'>
|
|
49
|
+
<span class='fraction'>223/594</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.
|
|
83
|
+
<td data-value="44.72" 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.
|
|
87
|
-
<td data-value="
|
|
88
|
-
<td data-value="
|
|
89
|
-
<td data-value="
|
|
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>
|
|
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.
|
|
93
|
-
<td data-value="
|
|
92
|
+
<td data-value="44.72" class="pct low">44.72%</td>
|
|
93
|
+
<td data-value="483" class="abs low">216/483</td>
|
|
94
94
|
</tr>
|
|
95
95
|
|
|
96
96
|
<tr>
|
|
@@ -114,13 +114,13 @@
|
|
|
114
114
|
<div class="chart"><div class="cover-fill" style="width: 0%"></div><div class="cover-empty" style="width: 100%"></div></div>
|
|
115
115
|
</td>
|
|
116
116
|
<td data-value="0" class="pct low">0%</td>
|
|
117
|
-
<td data-value="
|
|
117
|
+
<td data-value="104" class="abs low">0/104</td>
|
|
118
118
|
<td data-value="0" class="pct low">0%</td>
|
|
119
119
|
<td data-value="1" class="abs low">0/1</td>
|
|
120
120
|
<td data-value="0" class="pct low">0%</td>
|
|
121
121
|
<td data-value="1" class="abs low">0/1</td>
|
|
122
122
|
<td data-value="0" class="pct low">0%</td>
|
|
123
|
-
<td data-value="
|
|
123
|
+
<td data-value="104" class="abs low">0/104</td>
|
|
124
124
|
</tr>
|
|
125
125
|
|
|
126
126
|
</tbody>
|
|
@@ -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-
|
|
134
|
+
at 2025-11-19T04:39:38.927Z
|
|
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-
|
|
94
|
+
at 2025-11-19T04:39:38.927Z
|
|
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-
|
|
118
|
+
at 2025-11-19T04:39:38.927Z
|
|
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-
|
|
149
|
+
at 2025-11-19T04:39:38.927Z
|
|
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-
|
|
127
|
+
at 2025-11-19T04:39:38.927Z
|
|
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-
|
|
187
|
+
at 2025-11-19T04:39:38.927Z
|
|
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-
|
|
88
|
+
at 2025-11-19T04:39:38.927Z
|
|
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/
|
|
28
|
+
<span class='fraction'>0/79</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/
|
|
49
|
+
<span class='fraction'>0/79</span>
|
|
50
50
|
</div>
|
|
51
51
|
|
|
52
52
|
|
|
@@ -141,7 +141,9 @@
|
|
|
141
141
|
<a name='L76'></a><a href='#L76'>76</a>
|
|
142
142
|
<a name='L77'></a><a href='#L77'>77</a>
|
|
143
143
|
<a name='L78'></a><a href='#L78'>78</a>
|
|
144
|
-
<a name='L79'></a><a href='#L79'>79</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"> </span>
|
|
146
|
+
<span class="cline-any cline-no"> </span>
|
|
145
147
|
<span class="cline-any cline-no"> </span>
|
|
146
148
|
<span class="cline-any cline-no"> </span>
|
|
147
149
|
<span class="cline-any cline-no"> </span>
|
|
@@ -229,6 +231,7 @@
|
|
|
229
231
|
<span class="cstat-no" title="statement not covered" >import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";</span>
|
|
230
232
|
<span class="cstat-no" title="statement not covered" >import { XboxTokenProvider } from "./xbox-token-provider";</span>
|
|
231
233
|
<span class="cstat-no" title="statement not covered" >import type { FetchFunction } from "../../util/fetch-function";</span>
|
|
234
|
+
<span class="cstat-no" title="statement not covered" >import type { DateTime } from "luxon";</span>
|
|
232
235
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
233
236
|
<span class="cstat-no" title="statement not covered" >/**</span>
|
|
234
237
|
<span class="cstat-no" title="statement not covered" > * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same</span>
|
|
@@ -240,6 +243,7 @@
|
|
|
240
243
|
<span class="cstat-no" title="statement not covered" >{</span>
|
|
241
244
|
<span class="cstat-no" title="statement not covered" > public readonly getSpartanToken: () => Promise<string>;</span>
|
|
242
245
|
<span class="cstat-no" title="statement not covered" > public readonly clearSpartanToken: () => Promise<void>;</span>
|
|
246
|
+
<span class="cstat-no" title="statement not covered" > public readonly getCurrentExpiration: () => Promise<DateTime | null>;</span>
|
|
243
247
|
<span class="cstat-no" title="statement not covered" > public readonly getXboxLiveV3Token: () => Promise<string>;</span>
|
|
244
248
|
<span class="cstat-no" title="statement not covered" > public readonly clearXboxLiveV3Token: () => Promise<void>;</span>
|
|
245
249
|
<span class="cstat-no" title="statement not covered" ></span>
|
|
@@ -259,27 +263,25 @@
|
|
|
259
263
|
<span class="cstat-no" title="statement not covered" > fetchFn</span>
|
|
260
264
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
261
265
|
<span class="cstat-no" title="statement not covered" > const haloAuthClient = new HaloAuthenticationClient(</span>
|
|
262
|
-
<span class="cstat-no" title="statement not covered" >
|
|
263
|
-
<span class="cstat-no" title="statement not covered" >
|
|
264
|
-
<span class="cstat-no" title="statement not covered" >
|
|
265
|
-
<span class="cstat-no" title="statement not covered" >
|
|
266
|
-
<span class="cstat-no" title="statement not covered" >
|
|
267
|
-
<span class="cstat-no" title="statement not covered" >
|
|
268
|
-
<span class="cstat-no" title="statement not covered" >
|
|
269
|
-
<span class="cstat-no" title="statement not covered" >
|
|
270
|
-
<span class="cstat-no" title="statement not covered" >
|
|
271
|
-
<span class="cstat-no" title="statement not covered" > },</span>
|
|
272
|
-
<span class="cstat-no" title="statement not covered" > async () => {</span>
|
|
273
|
-
<span class="cstat-no" title="statement not covered" > const tokenPersister = await tokenPeristerOrPromise;</span>
|
|
274
|
-
<span class="cstat-no" title="statement not covered" > return await tokenPersister.load("halo.authToken");</span>
|
|
275
|
-
<span class="cstat-no" title="statement not covered" > },</span>
|
|
276
|
-
<span class="cstat-no" title="statement not covered" > async (token) => {</span>
|
|
277
|
-
<span class="cstat-no" title="statement not covered" > const tokenPersister = await tokenPeristerOrPromise;</span>
|
|
278
|
-
<span class="cstat-no" title="statement not covered" > await tokenPersister.save("halo.authToken", token);</span>
|
|
266
|
+
<span class="cstat-no" title="statement not covered" > {</span>
|
|
267
|
+
<span class="cstat-no" title="statement not covered" > fetchToken: async () => {</span>
|
|
268
|
+
<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
|
+
<span class="cstat-no" title="statement not covered" > RelyingParty.Halo</span>
|
|
271
|
+
<span class="cstat-no" title="statement not covered" > );</span>
|
|
272
|
+
<span class="cstat-no" title="statement not covered" > return xstsTicket.Token;</span>
|
|
273
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
274
|
+
<span class="cstat-no" title="statement not covered" > clearXstsToken: () => xboxAuthClient.clearXstsTicket(RelyingParty.Halo),</span>
|
|
279
275
|
<span class="cstat-no" title="statement not covered" > },</span>
|
|
280
|
-
<span class="cstat-no" title="statement not covered" >
|
|
281
|
-
<span class="cstat-no" title="statement not covered" >
|
|
282
|
-
<span class="cstat-no" title="statement not covered" >
|
|
276
|
+
<span class="cstat-no" title="statement not covered" > {</span>
|
|
277
|
+
<span class="cstat-no" title="statement not covered" > loadToken: async () =></span>
|
|
278
|
+
<span class="cstat-no" title="statement not covered" > (await (await tokenPeristerOrPromise).load("halo.authToken")) ?? null,</span>
|
|
279
|
+
<span class="cstat-no" title="statement not covered" > saveToken: async (token) => {</span>
|
|
280
|
+
<span class="cstat-no" title="statement not covered" > await (await tokenPeristerOrPromise).save("halo.authToken", token);</span>
|
|
281
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
282
|
+
<span class="cstat-no" title="statement not covered" > clearToken: async () => {</span>
|
|
283
|
+
<span class="cstat-no" title="statement not covered" > await (await tokenPeristerOrPromise).clear("halo.authToken");</span>
|
|
284
|
+
<span class="cstat-no" title="statement not covered" > },</span>
|
|
283
285
|
<span class="cstat-no" title="statement not covered" > },</span>
|
|
284
286
|
<span class="cstat-no" title="statement not covered" > fetchFn</span>
|
|
285
287
|
<span class="cstat-no" title="statement not covered" > );</span>
|
|
@@ -295,6 +297,7 @@
|
|
|
295
297
|
<span class="cstat-no" title="statement not covered" > };</span>
|
|
296
298
|
<span class="cstat-no" title="statement not covered" > this.clearXboxLiveV3Token = () =></span>
|
|
297
299
|
<span class="cstat-no" title="statement not covered" > xboxAuthClient.clearXstsTicket(RelyingParty.Xbox);</span>
|
|
300
|
+
<span class="cstat-no" title="statement not covered" > this.getCurrentExpiration = () => haloAuthClient.getCurrentExpiration();</span>
|
|
298
301
|
<span class="cstat-no" title="statement not covered" > }</span>
|
|
299
302
|
<span class="cstat-no" title="statement not covered" >}</span>
|
|
300
303
|
</pre></td></tr></table></pre>
|
|
@@ -304,7 +307,7 @@
|
|
|
304
307
|
<div class='footer quiet pad2 space-top1 center small'>
|
|
305
308
|
Code coverage generated by
|
|
306
309
|
<a href="https://istanbul.js.org/" target="_blank" rel="noopener noreferrer">istanbul</a>
|
|
307
|
-
at 2025-
|
|
310
|
+
at 2025-11-19T04:39:38.927Z
|
|
308
311
|
</div>
|
|
309
312
|
<script src="../../prettify.js"></script>
|
|
310
313
|
<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/
|
|
28
|
+
<span class='fraction'>0/83</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/
|
|
49
|
+
<span class='fraction'>0/83</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="
|
|
87
|
+
<td data-value="79" class="abs low">0/79</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="
|
|
93
|
+
<td data-value="79" class="abs low">0/79</td>
|
|
94
94
|
</tr>
|
|
95
95
|
|
|
96
96
|
<tr>
|
|
@@ -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-
|
|
119
|
+
at 2025-11-19T04:39:38.927Z
|
|
120
120
|
</div>
|
|
121
121
|
<script src="../../prettify.js"></script>
|
|
122
122
|
<script>
|