halo-infinite-api 7.0.1 → 8.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/dist/authentication/halo-authentication-client.d.ts +5 -2
- package/dist/authentication/halo-authentication-client.js +48 -32
- package/dist/authentication/halo-authentication-client.js.map +1 -1
- package/dist/authentication/xbox-authentication-client.d.ts +1 -0
- package/dist/authentication/xbox-authentication-client.js +16 -2
- package/dist/authentication/xbox-authentication-client.js.map +1 -1
- package/dist/core/halo-infinite-client.d.ts +2 -2
- package/dist/core/halo-infinite-client.js +29 -17
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/core/request-policy.d.ts +1 -0
- package/dist/core/request-policy.js +4 -0
- package/dist/core/request-policy.js.map +1 -0
- package/dist/core/token-persisters/in-memory-token-persister.js +3 -0
- package/dist/core/token-persisters/in-memory-token-persister.js.map +1 -1
- package/dist/core/token-persisters/local-storage-token-persister.js +3 -0
- package/dist/core/token-persisters/local-storage-token-persister.js.map +1 -1
- package/dist/core/token-persisters/node-fs-token-persister.js +5 -0
- package/dist/core/token-persisters/node-fs-token-persister.js.map +1 -1
- package/dist/core/token-persisters/token-persister.d.ts +1 -0
- package/dist/core/token-providers/auto-token-provider.d.ts +2 -0
- package/dist/core/token-providers/auto-token-provider.js +9 -0
- package/dist/core/token-providers/auto-token-provider.js.map +1 -1
- package/dist/core/token-providers/spartan-token-providers/index.d.ts +1 -0
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.d.ts +1 -0
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js +7 -1
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map +1 -1
- package/dist/core/token-providers/xbox-token-provider.d.ts +1 -0
- package/dist/core/xbox-client.js +25 -18
- package/dist/core/xbox-client.js.map +1 -1
- package/dist/util/expiry-token-cache.d.ts +1 -0
- package/dist/util/expiry-token-cache.js +3 -0
- package/dist/util/expiry-token-cache.js.map +1 -1
- package/dist/util/keyed-expiry-token-cache.d.ts +1 -0
- package/dist/util/keyed-expiry-token-cache.js +3 -0
- package/dist/util/keyed-expiry-token-cache.js.map +1 -1
- package/package.json +2 -1
- package/src/authentication/halo-authentication-client.ts +47 -31
- package/src/authentication/xbox-authentication-client.ts +24 -7
- package/src/core/halo-infinite-client.ts +35 -21
- package/src/core/request-policy.ts +9 -0
- package/src/core/token-persisters/in-memory-token-persister.ts +3 -0
- package/src/core/token-persisters/local-storage-token-persister.ts +3 -0
- package/src/core/token-persisters/node-fs-token-persister.ts +6 -0
- package/src/core/token-persisters/token-persister.ts +1 -0
- package/src/core/token-providers/auto-token-provider.ts +12 -0
- package/src/core/token-providers/spartan-token-providers/index.ts +1 -0
- package/src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts +10 -0
- package/src/core/token-providers/xbox-token-provider.ts +1 -0
- package/src/core/xbox-client.ts +30 -22
- package/src/util/expiry-token-cache.ts +4 -0
- package/src/util/keyed-expiry-token-cache.ts +4 -0
|
@@ -6,13 +6,16 @@ export interface Token {
|
|
|
6
6
|
}
|
|
7
7
|
export declare class HaloAuthenticationClient {
|
|
8
8
|
private readonly fetchXstsToken;
|
|
9
|
+
private readonly clearXstsToken;
|
|
9
10
|
private readonly loadToken;
|
|
10
11
|
private readonly saveToken;
|
|
12
|
+
private readonly clearToken;
|
|
11
13
|
private readonly fetchFn;
|
|
12
14
|
private spartanTokenCache;
|
|
13
|
-
constructor(fetchXstsToken: () => Promise<string> | string, loadToken: () => Promise<{
|
|
15
|
+
constructor(fetchXstsToken: () => Promise<string> | string, clearXstsToken: () => Promise<void>, loadToken: () => Promise<{
|
|
14
16
|
token: string;
|
|
15
17
|
expiresAt: unknown;
|
|
16
|
-
} | null>, saveToken: (token: Token) => Promise<void>, fetchFn?: FetchFunction);
|
|
18
|
+
} | null>, saveToken: (token: Token) => Promise<void>, clearToken: () => Promise<void>, fetchFn?: FetchFunction);
|
|
17
19
|
getSpartanToken(): Promise<string>;
|
|
20
|
+
clearSpartanToken(): Promise<void>;
|
|
18
21
|
}
|
|
@@ -3,55 +3,71 @@ import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
|
3
3
|
import { defaultFetch } from "../util/fetch-function";
|
|
4
4
|
import { GlobalConstants } from "../util/global-contants";
|
|
5
5
|
import { RequestError } from "../util/request-error";
|
|
6
|
+
import { unauthorizedRetryPolicy } from "../core/request-policy";
|
|
6
7
|
export class HaloAuthenticationClient {
|
|
7
8
|
fetchXstsToken;
|
|
9
|
+
clearXstsToken;
|
|
8
10
|
loadToken;
|
|
9
11
|
saveToken;
|
|
12
|
+
clearToken;
|
|
10
13
|
fetchFn;
|
|
11
14
|
spartanTokenCache = new ExpiryTokenCache(async () => {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
15
|
+
const failureHandler = unauthorizedRetryPolicy.onFailure(() => this.clearXstsToken());
|
|
16
|
+
try {
|
|
17
|
+
return await unauthorizedRetryPolicy.execute(async () => {
|
|
18
|
+
const xstsToken = await this.fetchXstsToken();
|
|
19
|
+
const tokenRequest = {
|
|
20
|
+
Audience: "urn:343:s3:services",
|
|
21
|
+
MinVersion: "4",
|
|
22
|
+
Proof: [
|
|
23
|
+
{
|
|
24
|
+
Token: xstsToken,
|
|
25
|
+
TokenType: "Xbox_XSTSv3",
|
|
26
|
+
},
|
|
27
|
+
],
|
|
28
|
+
};
|
|
29
|
+
const url = "https://settings.svc.halowaypoint.com/spartan-token";
|
|
30
|
+
const response = await this.fetchFn(url, {
|
|
31
|
+
method: "POST",
|
|
32
|
+
body: JSON.stringify(tokenRequest),
|
|
33
|
+
headers: {
|
|
34
|
+
"User-Agent": GlobalConstants.HALO_WAYPOINT_USER_AGENT,
|
|
35
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
36
|
+
Accept: "application/json, text/plain, */*",
|
|
37
|
+
},
|
|
38
|
+
});
|
|
39
|
+
if (response.status >= 200 && response.status < 300) {
|
|
40
|
+
const result_2 = (await response.json());
|
|
41
|
+
const newToken = {
|
|
42
|
+
token: result_2.SpartanToken,
|
|
43
|
+
expiresAt: DateTime.fromISO(result_2.ExpiresUtc.ISO8601Date),
|
|
44
|
+
};
|
|
45
|
+
await this.saveToken(newToken);
|
|
46
|
+
return newToken;
|
|
47
|
+
}
|
|
48
|
+
else {
|
|
49
|
+
throw new RequestError(url, response);
|
|
50
|
+
}
|
|
51
|
+
});
|
|
41
52
|
}
|
|
42
|
-
|
|
43
|
-
|
|
53
|
+
finally {
|
|
54
|
+
failureHandler.dispose();
|
|
44
55
|
}
|
|
45
56
|
}, () => this.loadToken());
|
|
46
|
-
constructor(fetchXstsToken, loadToken, saveToken, fetchFn = defaultFetch) {
|
|
57
|
+
constructor(fetchXstsToken, clearXstsToken, loadToken, saveToken, clearToken, fetchFn = defaultFetch) {
|
|
47
58
|
this.fetchXstsToken = fetchXstsToken;
|
|
59
|
+
this.clearXstsToken = clearXstsToken;
|
|
48
60
|
this.loadToken = loadToken;
|
|
49
61
|
this.saveToken = saveToken;
|
|
62
|
+
this.clearToken = clearToken;
|
|
50
63
|
this.fetchFn = fetchFn;
|
|
51
64
|
}
|
|
52
65
|
async getSpartanToken() {
|
|
53
66
|
const { token } = await this.spartanTokenCache.getToken();
|
|
54
67
|
return token;
|
|
55
68
|
}
|
|
69
|
+
clearSpartanToken() {
|
|
70
|
+
return this.clearToken();
|
|
71
|
+
}
|
|
56
72
|
}
|
|
57
73
|
//# sourceMappingURL=halo-authentication-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAE,uBAAuB,EAAE,MAAM,wBAAwB,CAAC;AAOjE,MAAM,OAAO,wBAAwB;IAmDhB;IACA;IACA;IAIA;IACA;IACA;IA1DX,iBAAiB,GAAG,IAAI,gBAAgB,CAC9C,KAAK,IAAI,EAAE;QACT,MAAM,cAAc,GAAG,uBAAuB,CAAC,SAAS,CAAC,GAAG,EAAE,CAC5D,IAAI,CAAC,cAAc,EAAE,CACtB,CAAC;QACF,IAAI;YACF,OAAO,MAAM,uBAAuB,CAAC,OAAO,CAAC,KAAK,IAAI,EAAE;gBACtD,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;gBAE9C,MAAM,YAAY,GAAwB;oBACxC,QAAQ,EAAE,qBAAqB;oBAC/B,UAAU,EAAE,GAAG;oBACf,KAAK,EAAE;wBACL;4BACE,KAAK,EAAE,SAAS;4BAChB,SAAS,EAAE,aAAa;yBACzB;qBACF;iBACF,CAAC;gBACF,MAAM,GAAG,GAAG,qDAAqD,CAAC;gBAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;oBACvC,MAAM,EAAE,MAAM;oBACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;oBAClC,OAAO,EAAE;wBACP,YAAY,EAAE,eAAe,CAAC,wBAAwB;wBACtD,cAAc,EAAE,iCAAiC;wBACjD,MAAM,EAAE,mCAAmC;qBAC5C;iBACF,CAAC,CAAC;gBACH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;oBACnD,MAAM,QAAQ,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;oBAEzD,MAAM,QAAQ,GAAG;wBACf,KAAK,EAAE,QAAQ,CAAC,YAAY;wBAC5B,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,UAAU,CAAC,WAAW,CAAC;qBAC7D,CAAC;oBACF,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAC/B,OAAO,QAAQ,CAAC;iBACjB;qBAAM;oBACL,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;iBACvC;YACH,CAAC,CAAC,CAAC;SACJ;gBAAS;YACR,cAAc,CAAC,OAAO,EAAE,CAAC;SAC1B;IACH,CAAC,EACD,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CACvB,CAAC;IAEF,YACmB,cAA8C,EAC9C,cAAmC,EACnC,SAGR,EACQ,SAA0C,EAC1C,UAA+B,EAC/B,UAAyB,YAAY;QARrC,mBAAc,GAAd,cAAc,CAAgC;QAC9C,mBAAc,GAAd,cAAc,CAAqB;QACnC,cAAS,GAAT,SAAS,CAGjB;QACQ,cAAS,GAAT,SAAS,CAAiC;QAC1C,eAAU,GAAV,UAAU,CAAqB;QAC/B,YAAO,GAAP,OAAO,CAA8B;IACrD,CAAC;IAEG,KAAK,CAAC,eAAe;QAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;IAEM,iBAAiB;QACtB,OAAO,IAAI,CAAC,UAAU,EAAE,CAAC;IAC3B,CAAC;CACF"}
|
|
@@ -3,6 +3,7 @@ import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
|
|
|
3
3
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
4
4
|
import { defaultFetch } from "../util/fetch-function";
|
|
5
5
|
import { RequestError } from "../util/request-error";
|
|
6
|
+
import { unauthorizedRetryPolicy } from "../core/request-policy";
|
|
6
7
|
export var RelyingParty;
|
|
7
8
|
(function (RelyingParty) {
|
|
8
9
|
RelyingParty["Xbox"] = "http://xboxlive.com";
|
|
@@ -86,14 +87,27 @@ export class XboxAuthenticationClient {
|
|
|
86
87
|
if (!xstsTicket) {
|
|
87
88
|
let userToken = await this.userTokenCache.getExistingToken();
|
|
88
89
|
if (!userToken) {
|
|
90
|
+
const userTokenFailureHandler = unauthorizedRetryPolicy.onFailure(() => {
|
|
91
|
+
this.userTokenCache.clearToken();
|
|
92
|
+
});
|
|
89
93
|
// Ouath2 token depends on nothing, so we can fetch it without
|
|
90
94
|
// worrying if it is expired.
|
|
91
|
-
userToken = await
|
|
95
|
+
userToken = await unauthorizedRetryPolicy
|
|
96
|
+
.execute(async () => this.userTokenCache.getToken(await getOauth2AccessToken()))
|
|
97
|
+
.finally(() => userTokenFailureHandler.dispose());
|
|
92
98
|
}
|
|
93
|
-
|
|
99
|
+
const xstsTicketFailureHandler = unauthorizedRetryPolicy.onFailure(() => {
|
|
100
|
+
this.xstsTicketCache.clearToken(relyingParty);
|
|
101
|
+
});
|
|
102
|
+
xstsTicket = await unauthorizedRetryPolicy
|
|
103
|
+
.execute(() => this.xstsTicketCache.getToken(relyingParty, userToken.Token))
|
|
104
|
+
.finally(() => xstsTicketFailureHandler.dispose());
|
|
94
105
|
}
|
|
95
106
|
return xstsTicket;
|
|
96
107
|
}
|
|
108
|
+
clearXstsTicket = async (relyingParty) => {
|
|
109
|
+
this.xstsTicketCache.clearToken(relyingParty);
|
|
110
|
+
};
|
|
97
111
|
getXboxLiveV3Token = (xboxTicket) => `XBL3.0 x=${xboxTicket.DisplayClaims.xui[0].uhs};${xboxTicket.Token}`;
|
|
98
112
|
}
|
|
99
113
|
//# sourceMappingURL=xbox-authentication-client.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -10,8 +10,8 @@ import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-conta
|
|
|
10
10
|
import { ServiceRecord } from "../models/halo-infinite/service-record";
|
|
11
11
|
import { UserInfo } from "../models/halo-infinite/user-info";
|
|
12
12
|
import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
|
|
13
|
-
import { MatchesPrivacy } from "
|
|
14
|
-
import { ProgressionFileType, ProgressionFileTypeMap } from "
|
|
13
|
+
import { MatchesPrivacy } from "../models/halo-infinite/matches-privacy";
|
|
14
|
+
import { ProgressionFileType, ProgressionFileTypeMap } from "../models/halo-infinite/progression-file";
|
|
15
15
|
export interface ResultContainer<TValue> {
|
|
16
16
|
Id: string;
|
|
17
17
|
ResultCode: 0 | 1;
|
|
@@ -4,6 +4,7 @@ import { AssetKind } from "../models/halo-infinite/asset-kind";
|
|
|
4
4
|
import { MatchType } from "../models/halo-infinite/match-type";
|
|
5
5
|
import { GlobalConstants } from "../util/global-contants";
|
|
6
6
|
import { RequestError } from "../util/request-error";
|
|
7
|
+
import { unauthorizedRetryPolicy } from "./request-policy";
|
|
7
8
|
const assetKindUrlMap = {
|
|
8
9
|
[AssetKind.Map]: "Maps",
|
|
9
10
|
[AssetKind.UgcGameVariant]: "UgcGameVariants",
|
|
@@ -35,24 +36,35 @@ export class HaloInfiniteClient {
|
|
|
35
36
|
this.spartanTokenProvider = spartanTokenProvider;
|
|
36
37
|
this.fetchFn = fetchFn;
|
|
37
38
|
}
|
|
38
|
-
|
|
39
|
-
const
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
39
|
+
executeRequest(url, init) {
|
|
40
|
+
const failureHandler = unauthorizedRetryPolicy.onFailure(() => this.spartanTokenProvider.clearSpartanToken());
|
|
41
|
+
try {
|
|
42
|
+
return unauthorizedRetryPolicy.execute(async () => {
|
|
43
|
+
const headers = new Headers(init.headers);
|
|
44
|
+
if (!headers.has("User-Agent")) {
|
|
45
|
+
headers.set("User-Agent", GlobalConstants.HALO_PC_USER_AGENT);
|
|
46
|
+
}
|
|
47
|
+
if (!headers.has("Accept")) {
|
|
48
|
+
headers.set("Accept", "application/json");
|
|
49
|
+
}
|
|
50
|
+
headers.set("x-343-authorization-spartan", await this.spartanTokenProvider.getSpartanToken());
|
|
51
|
+
const response = await this.fetchFn(url, {
|
|
52
|
+
...init,
|
|
53
|
+
headers,
|
|
54
|
+
});
|
|
55
|
+
if (init.body) {
|
|
56
|
+
throw new RequestError("test", { status: 401 });
|
|
57
|
+
}
|
|
58
|
+
if (response.status >= 200 && response.status < 300) {
|
|
59
|
+
return (await response.json());
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
throw new RequestError(url, response);
|
|
63
|
+
}
|
|
64
|
+
});
|
|
53
65
|
}
|
|
54
|
-
|
|
55
|
-
|
|
66
|
+
finally {
|
|
67
|
+
failureHandler.dispose();
|
|
56
68
|
}
|
|
57
69
|
}
|
|
58
70
|
async executeResultsRequest(...args) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAOrE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAM/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const unauthorizedRetryPolicy: import("cockatiel").RetryPolicy;
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import { ConstantBackoff, handleWhenResult, retry } from "cockatiel";
|
|
2
|
+
import { RequestError } from "../util/request-error";
|
|
3
|
+
export const unauthorizedRetryPolicy = retry(handleWhenResult((error) => error instanceof RequestError && error.response.status === 401), { maxAttempts: 2, backoff: new ConstantBackoff(50) });
|
|
4
|
+
//# sourceMappingURL=request-policy.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"request-policy.js","sourceRoot":"","sources":["../../src/core/request-policy.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,gBAAgB,EAAE,KAAK,EAAE,MAAM,WAAW,CAAC;AACrE,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAErD,MAAM,CAAC,MAAM,uBAAuB,GAAG,KAAK,CAC1C,gBAAgB,CACd,CAAC,KAAK,EAAE,EAAE,CAAC,KAAK,YAAY,YAAY,IAAI,KAAK,CAAC,QAAQ,CAAC,MAAM,KAAK,GAAG,CAC1E,EACD,EAAE,WAAW,EAAE,CAAC,EAAE,OAAO,EAAE,IAAI,eAAe,CAAC,EAAE,CAAC,EAAE,CACrD,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"in-memory-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/in-memory-token-persister.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAe,CAAC;AAEtC,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE;QAClB,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"in-memory-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/in-memory-token-persister.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,GAAG,IAAI,GAAG,EAAe,CAAC;AAEtC,MAAM,CAAC,MAAM,sBAAsB,GAAmB;IACpD,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE;QAClB,OAAO,MAAM,CAAC,GAAG,CAAC,SAAS,CAAC,CAAC;IAC/B,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACzB,MAAM,CAAC,GAAG,CAAC,SAAS,EAAE,KAAK,CAAC,CAAC;IAC/B,CAAC;IACD,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE;QACnB,MAAM,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;IAC3B,CAAC;CACF,CAAC"}
|
|
@@ -11,5 +11,8 @@ export const localStorageTokenPersister = {
|
|
|
11
11
|
save: (tokenName, token) => {
|
|
12
12
|
localStorage.setItem(tokenName, JSON.stringify(token));
|
|
13
13
|
},
|
|
14
|
+
clear: (tokenName) => {
|
|
15
|
+
localStorage.removeItem(tokenName);
|
|
16
|
+
},
|
|
14
17
|
};
|
|
15
18
|
//# sourceMappingURL=local-storage-token-persister.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"local-storage-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/local-storage-token-persister.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAmB;IACxD,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACzB;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACzB,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"local-storage-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/local-storage-token-persister.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,0BAA0B,GAAmB;IACxD,IAAI,EAAE,CAAC,SAAS,EAAE,EAAE;QAClB,MAAM,IAAI,GAAG,YAAY,CAAC,OAAO,CAAC,SAAS,CAAC,CAAC;QAC7C,IAAI,IAAI,EAAE;YACR,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACzB;aAAM;YACL,OAAO,IAAI,CAAC;SACb;IACH,CAAC;IACD,IAAI,EAAE,CAAC,SAAS,EAAE,KAAK,EAAE,EAAE;QACzB,YAAY,CAAC,OAAO,CAAC,SAAS,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACzD,CAAC;IACD,KAAK,EAAE,CAAC,SAAS,EAAE,EAAE;QACnB,YAAY,CAAC,UAAU,CAAC,SAAS,CAAC,CAAC;IACrC,CAAC;CACF,CAAC"}
|
|
@@ -23,5 +23,10 @@ export const nodeFsTokenPersister = {
|
|
|
23
23
|
await (await import("fs/promises")).mkdir(tokenDir, { recursive: true });
|
|
24
24
|
await (await import("fs/promises")).writeFile(`${tokenDir}/${tokenName}`, JSON.stringify(token));
|
|
25
25
|
},
|
|
26
|
+
clear: async (tokenName) => {
|
|
27
|
+
const tokenDir = process.env.TOKEN_ROOT ||
|
|
28
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
29
|
+
await (await import("fs/promises")).unlink(`${tokenDir}/${tokenName}`);
|
|
30
|
+
},
|
|
26
31
|
};
|
|
27
32
|
//# sourceMappingURL=node-fs-token-persister.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-fs-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/node-fs-token-persister.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACxB,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,UAAU;YACtB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,CACjB,MAAM,MAAM,CAAC,aAAa,CAAC,CAC5B,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE;gBACrC,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACzB;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACpE,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,MAAM,CAAC,CAAC;aACT;SACF;IACH,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,UAAU;YACtB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,CACJ,MAAM,MAAM,CAAC,aAAa,CAAC,CAC5B,CAAC,SAAS,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;CACF,CAAC"}
|
|
1
|
+
{"version":3,"file":"node-fs-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/node-fs-token-persister.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACxB,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,UAAU;YACtB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,CACjB,MAAM,MAAM,CAAC,aAAa,CAAC,CAC5B,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE;gBACrC,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACzB;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACpE,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,MAAM,CAAC,CAAC;aACT;SACF;IACH,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,UAAU;YACtB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,CACJ,MAAM,MAAM,CAAC,aAAa,CAAC,CAC5B,CAAC,SAAS,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;IACD,KAAK,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACzB,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,UAAU;YACtB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,CAAC,CAAC;IACzE,CAAC;CACF,CAAC"}
|
|
@@ -9,6 +9,8 @@ import type { FetchFunction } from "../../util/fetch-function";
|
|
|
9
9
|
*/
|
|
10
10
|
export declare class AutoTokenProvider implements SpartanTokenProvider, XboxTokenProvider {
|
|
11
11
|
readonly getSpartanToken: () => Promise<string>;
|
|
12
|
+
readonly clearSpartanToken: () => Promise<void>;
|
|
12
13
|
readonly getXboxLiveV3Token: () => Promise<string>;
|
|
14
|
+
readonly clearXboxLiveV3Token: () => Promise<void>;
|
|
13
15
|
constructor(getOauth2AccessToken: () => Promise<string>, tokenPersister?: TokenPersister | Promise<TokenPersister>, fetchFn?: FetchFunction);
|
|
14
16
|
}
|
|
@@ -8,7 +8,9 @@ import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-pers
|
|
|
8
8
|
*/
|
|
9
9
|
export class AutoTokenProvider {
|
|
10
10
|
getSpartanToken;
|
|
11
|
+
clearSpartanToken;
|
|
11
12
|
getXboxLiveV3Token;
|
|
13
|
+
clearXboxLiveV3Token;
|
|
12
14
|
constructor(getOauth2AccessToken, tokenPersister, fetchFn) {
|
|
13
15
|
let tokenPeristerOrPromise;
|
|
14
16
|
if (tokenPersister) {
|
|
@@ -21,18 +23,25 @@ export class AutoTokenProvider {
|
|
|
21
23
|
const haloAuthClient = new HaloAuthenticationClient(async () => {
|
|
22
24
|
const xstsTicket = await xboxAuthClient.getXstsTicket(getOauth2AccessToken, RelyingParty.Halo);
|
|
23
25
|
return xstsTicket.Token;
|
|
26
|
+
}, async () => {
|
|
27
|
+
await xboxAuthClient.clearXstsTicket(RelyingParty.Halo);
|
|
24
28
|
}, async () => {
|
|
25
29
|
const tokenPersister = await tokenPeristerOrPromise;
|
|
26
30
|
return await tokenPersister.load("halo.authToken");
|
|
27
31
|
}, async (token) => {
|
|
28
32
|
const tokenPersister = await tokenPeristerOrPromise;
|
|
29
33
|
await tokenPersister.save("halo.authToken", token);
|
|
34
|
+
}, async () => {
|
|
35
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
36
|
+
await tokenPersister.clear("halo.authToken");
|
|
30
37
|
}, fetchFn);
|
|
31
38
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
39
|
+
this.clearSpartanToken = () => haloAuthClient.clearSpartanToken();
|
|
32
40
|
this.getXboxLiveV3Token = async () => {
|
|
33
41
|
const xstsTicket = await xboxAuthClient.getXstsTicket(getOauth2AccessToken, RelyingParty.Xbox);
|
|
34
42
|
return xboxAuthClient.getXboxLiveV3Token(xstsTicket);
|
|
35
43
|
};
|
|
44
|
+
this.clearXboxLiveV3Token = () => xboxAuthClient.clearXstsTicket(RelyingParty.Xbox);
|
|
36
45
|
}
|
|
37
46
|
}
|
|
38
47
|
//# sourceMappingURL=auto-token-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-token-provider.js","sourceRoot":"","sources":["../../../src/core/token-providers/auto-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAIvF;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAGZ,eAAe,CAAwB;IACvC,kBAAkB,CAAwB;IAE1D,YACE,oBAA2C,EAC3C,cAAyD,EACzD,OAAuB;QAEvB,IAAI,sBAAgE,CAAC;QACrE,IAAI,cAAc,EAAE;YAClB,sBAAsB,GAAG,cAAc,CAAC;SACzC;aAAM;YACL,sBAAsB,GAAG,sBAAsB,CAAC;SACjD;QACD,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,cAAc,EACd,OAAO,CACR,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,KAAK,IAAI,EAAE;YACT,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC;YACpD,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC;YACpD,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC,EACD,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;QAC9D,IAAI,CAAC,kBAAkB,GAAG,KAAK,IAAI,EAAE;YACnC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-token-provider.js","sourceRoot":"","sources":["../../../src/core/token-providers/auto-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAIvF;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAGZ,eAAe,CAAwB;IACvC,iBAAiB,CAAsB;IACvC,kBAAkB,CAAwB;IAC1C,oBAAoB,CAAsB;IAE1D,YACE,oBAA2C,EAC3C,cAAyD,EACzD,OAAuB;QAEvB,IAAI,sBAAgE,CAAC;QACrE,IAAI,cAAc,EAAE;YAClB,sBAAsB,GAAG,cAAc,CAAC;SACzC;aAAM;YACL,sBAAsB,GAAG,sBAAsB,CAAC;SACjD;QACD,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,cAAc,EACd,OAAO,CACR,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,KAAK,IAAI,EAAE;YACT,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;QAC1D,CAAC,EACD,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC;YACpD,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC;YACpD,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC,EACD,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC;YACpD,MAAM,cAAc,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC/C,CAAC,EACD,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;QAC9D,IAAI,CAAC,iBAAiB,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC;QAClE,IAAI,CAAC,kBAAkB,GAAG,KAAK,IAAI,EAAE;YACnC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC,CAAC;QACF,IAAI,CAAC,oBAAoB,GAAG,GAAG,EAAE,CAC/B,cAAc,CAAC,eAAe,CAAC,YAAY,CAAC,IAAI,CAAC,CAAC;IACtD,CAAC;CACF"}
|
|
@@ -8,5 +8,6 @@ import { SpartanTokenProvider } from ".";
|
|
|
8
8
|
*/
|
|
9
9
|
export declare class StaticXstsTicketTokenSpartanTokenProvider implements SpartanTokenProvider {
|
|
10
10
|
readonly getSpartanToken: () => Promise<string>;
|
|
11
|
+
readonly clearSpartanToken: () => Promise<void>;
|
|
11
12
|
constructor(xstsTicketToken: string, tokenPersister?: TokenPersister | Promise<TokenPersister>);
|
|
12
13
|
}
|
|
@@ -8,6 +8,7 @@ import { inMemoryTokenPersister } from "../../token-persisters/in-memory-token-p
|
|
|
8
8
|
*/
|
|
9
9
|
export class StaticXstsTicketTokenSpartanTokenProvider {
|
|
10
10
|
getSpartanToken;
|
|
11
|
+
clearSpartanToken;
|
|
11
12
|
constructor(xstsTicketToken, tokenPersister) {
|
|
12
13
|
let actualTokenPersister;
|
|
13
14
|
if (tokenPersister) {
|
|
@@ -16,10 +17,15 @@ export class StaticXstsTicketTokenSpartanTokenProvider {
|
|
|
16
17
|
else {
|
|
17
18
|
actualTokenPersister = inMemoryTokenPersister;
|
|
18
19
|
}
|
|
19
|
-
const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () =>
|
|
20
|
+
const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => {
|
|
21
|
+
console.warn("StaticXstsTicketTokenSpartanTokenProvider does not clearing xstsTickets");
|
|
22
|
+
}, async () => (await (await actualTokenPersister).load("halo.authToken")) ?? null, async (token) => {
|
|
20
23
|
await (await actualTokenPersister).save("halo.authToken", token);
|
|
24
|
+
}, async () => {
|
|
25
|
+
await (await actualTokenPersister).clear("halo.authToken");
|
|
21
26
|
});
|
|
22
27
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
28
|
+
this.clearSpartanToken = () => haloAuthClient.clearSpartanToken();
|
|
23
29
|
}
|
|
24
30
|
}
|
|
25
31
|
//# sourceMappingURL=static-xsts-ticket-token-spartan-token-provider.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../../src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAE9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,OAAO,yCAAyC;IAGpC,eAAe,CAAwB;IAEvD,YACE,eAAuB,EACvB,cAAyD;QAEzD,IAAI,oBAA8D,CAAC;QACnE,IAAI,cAAc,EAAE;YAClB,oBAAoB,GAAG,cAAc,CAAC;SACvC;aAAM;YACL,oBAAoB,GAAG,sBAAsB,CAAC;SAC/C;QAED,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,GAAG,EAAE,CAAC,eAAe,EACrB,KAAK,IAAI,EAAE,CACT,CAAC,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,IAAI,EACrE,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;
|
|
1
|
+
{"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../../src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAE9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,OAAO,yCAAyC;IAGpC,eAAe,CAAwB;IACvC,iBAAiB,CAAsB;IAEvD,YACE,eAAuB,EACvB,cAAyD;QAEzD,IAAI,oBAA8D,CAAC;QACnE,IAAI,cAAc,EAAE;YAClB,oBAAoB,GAAG,cAAc,CAAC;SACvC;aAAM;YACL,oBAAoB,GAAG,sBAAsB,CAAC;SAC/C;QAED,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,GAAG,EAAE,CAAC,eAAe,EACrB,KAAK,IAAI,EAAE;YACT,OAAO,CAAC,IAAI,CACV,yEAAyE,CAC1E,CAAC;QACJ,CAAC,EACD,KAAK,IAAI,EAAE,CACT,CAAC,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,IAAI,EACrE,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC,EACD,KAAK,IAAI,EAAE;YACT,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,KAAK,CAAC,gBAAgB,CAAC,CAAC;QAC7D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;QAC9D,IAAI,CAAC,iBAAiB,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,iBAAiB,EAAE,CAAC;IACpE,CAAC;CACF"}
|
package/dist/core/xbox-client.js
CHANGED
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RequestError } from "../util/request-error";
|
|
2
2
|
import { defaultFetch } from "../util/fetch-function";
|
|
3
|
+
import { unauthorizedRetryPolicy } from "./request-policy";
|
|
3
4
|
export class XboxClient {
|
|
4
5
|
xboxTokenProvider;
|
|
5
6
|
fetchFn;
|
|
@@ -8,25 +9,31 @@ export class XboxClient {
|
|
|
8
9
|
this.fetchFn = fetchFn;
|
|
9
10
|
}
|
|
10
11
|
async executeRequest(url, init) {
|
|
11
|
-
const
|
|
12
|
-
|
|
13
|
-
headers.
|
|
12
|
+
const failureHandler = unauthorizedRetryPolicy.onFailure(() => this.xboxTokenProvider.clearXboxLiveV3Token());
|
|
13
|
+
try {
|
|
14
|
+
const headers = new Headers(init.headers);
|
|
15
|
+
if (!headers.has("Accept")) {
|
|
16
|
+
headers.set("Accept", "application/json");
|
|
17
|
+
}
|
|
18
|
+
if (!headers.has("Authorization")) {
|
|
19
|
+
headers.set("Authorization", await this.xboxTokenProvider.getXboxLiveV3Token());
|
|
20
|
+
}
|
|
21
|
+
if (!headers.has("x-xbl-contract-version")) {
|
|
22
|
+
headers.set("x-xbl-contract-version", "1");
|
|
23
|
+
}
|
|
24
|
+
const response = await this.fetchFn(url, {
|
|
25
|
+
...init,
|
|
26
|
+
headers,
|
|
27
|
+
});
|
|
28
|
+
if (response.status >= 200 && response.status < 300) {
|
|
29
|
+
return (await response.json());
|
|
30
|
+
}
|
|
31
|
+
else {
|
|
32
|
+
throw new RequestError(url, response);
|
|
33
|
+
}
|
|
14
34
|
}
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
}
|
|
18
|
-
if (!headers.has("x-xbl-contract-version")) {
|
|
19
|
-
headers.set("x-xbl-contract-version", "1");
|
|
20
|
-
}
|
|
21
|
-
const response = await this.fetchFn(url, {
|
|
22
|
-
...init,
|
|
23
|
-
headers,
|
|
24
|
-
});
|
|
25
|
-
if (response.status >= 200 && response.status < 300) {
|
|
26
|
-
return (await response.json());
|
|
27
|
-
}
|
|
28
|
-
else {
|
|
29
|
-
throw new RequestError(url, response);
|
|
35
|
+
finally {
|
|
36
|
+
failureHandler.dispose();
|
|
30
37
|
}
|
|
31
38
|
}
|
|
32
39
|
async searchUsers(query, init) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xbox-client.js","sourceRoot":"","sources":["../../src/core/xbox-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;
|
|
1
|
+
{"version":3,"file":"xbox-client.js","sourceRoot":"","sources":["../../src/core/xbox-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAErE,OAAO,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE3D,MAAM,OAAO,UAAU;IAEF;IACA;IAFnB,YACmB,iBAAoC,EACpC,UAAyB,YAAY;QADrC,sBAAiB,GAAjB,iBAAiB,CAAmB;QACpC,YAAO,GAAP,OAAO,CAA8B;IACrD,CAAC;IAEI,KAAK,CAAC,cAAc,CAAI,GAAW,EAAE,IAAiB;QAC5D,MAAM,cAAc,GAAG,uBAAuB,CAAC,SAAS,CAAC,GAAG,EAAE,CAC5D,IAAI,CAAC,iBAAiB,CAAC,oBAAoB,EAAE,CAC9C,CAAC;QACF,IAAI;YACF,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;gBAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;aAC3C;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;gBACjC,OAAO,CAAC,GAAG,CACT,eAAe,EACf,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAClD,CAAC;aACH;YACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE;gBAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;aAC5C;YACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;gBACvC,GAAG,IAAI;gBACP,OAAO;aACR,CAAC,CAAC;YAEH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;gBACnD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;aACrC;iBAAM;gBACL,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;aACvC;SACF;gBAAS;YACR,cAAc,CAAC,OAAO,EAAE,CAAC;SAC1B;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,KAAa,EACb,IAA2C;QAE3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAa3C,6CAA6C,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACxE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAC3B,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,IAA2C;QACpE,OAAO,MAAM,IAAI,CAAC,cAAc,CAC9B,8DAA8D,EAC9D,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAC3B,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/expiry-token-cache.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/expiry-token-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/keyed-expiry-token-cache.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"keyed-expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/keyed-expiry-token-cache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "halo-infinite-api",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "
|
|
4
|
+
"version": "8.0.0",
|
|
5
5
|
"description": "An NPM package for accessing the official Halo Infinite API.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"exports": {
|
|
@@ -39,6 +39,7 @@
|
|
|
39
39
|
"dependencies": {
|
|
40
40
|
"@azure/msal-node": "^2.2.0",
|
|
41
41
|
"axios": "^1.6.2",
|
|
42
|
+
"cockatiel": "^3.1.2",
|
|
42
43
|
"expiry-map": "^2.0.0",
|
|
43
44
|
"luxon": "^3.3.0",
|
|
44
45
|
"pkce-challenge": "^3.1.0",
|
|
@@ -5,6 +5,7 @@ import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
|
5
5
|
import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
6
6
|
import { GlobalConstants } from "../util/global-contants";
|
|
7
7
|
import { RequestError } from "../util/request-error";
|
|
8
|
+
import { unauthorizedRetryPolicy } from "../core/request-policy";
|
|
8
9
|
|
|
9
10
|
export interface Token {
|
|
10
11
|
token: string;
|
|
@@ -14,39 +15,48 @@ export interface Token {
|
|
|
14
15
|
export class HaloAuthenticationClient {
|
|
15
16
|
private spartanTokenCache = new ExpiryTokenCache(
|
|
16
17
|
async () => {
|
|
17
|
-
const
|
|
18
|
+
const failureHandler = unauthorizedRetryPolicy.onFailure(() =>
|
|
19
|
+
this.clearXstsToken()
|
|
20
|
+
);
|
|
21
|
+
try {
|
|
22
|
+
return await unauthorizedRetryPolicy.execute(async () => {
|
|
23
|
+
const xstsToken = await this.fetchXstsToken();
|
|
18
24
|
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
36
|
-
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
25
|
+
const tokenRequest: SpartanTokenRequest = {
|
|
26
|
+
Audience: "urn:343:s3:services",
|
|
27
|
+
MinVersion: "4",
|
|
28
|
+
Proof: [
|
|
29
|
+
{
|
|
30
|
+
Token: xstsToken,
|
|
31
|
+
TokenType: "Xbox_XSTSv3",
|
|
32
|
+
},
|
|
33
|
+
],
|
|
34
|
+
};
|
|
35
|
+
const url = "https://settings.svc.halowaypoint.com/spartan-token";
|
|
36
|
+
const response = await this.fetchFn(url, {
|
|
37
|
+
method: "POST",
|
|
38
|
+
body: JSON.stringify(tokenRequest),
|
|
39
|
+
headers: {
|
|
40
|
+
"User-Agent": GlobalConstants.HALO_WAYPOINT_USER_AGENT,
|
|
41
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
42
|
+
Accept: "application/json, text/plain, */*",
|
|
43
|
+
},
|
|
44
|
+
});
|
|
45
|
+
if (response.status >= 200 && response.status < 300) {
|
|
46
|
+
const result_2 = (await response.json()) as SpartanToken;
|
|
41
47
|
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
47
|
-
|
|
48
|
-
|
|
49
|
-
|
|
48
|
+
const newToken = {
|
|
49
|
+
token: result_2.SpartanToken,
|
|
50
|
+
expiresAt: DateTime.fromISO(result_2.ExpiresUtc.ISO8601Date),
|
|
51
|
+
};
|
|
52
|
+
await this.saveToken(newToken);
|
|
53
|
+
return newToken;
|
|
54
|
+
} else {
|
|
55
|
+
throw new RequestError(url, response);
|
|
56
|
+
}
|
|
57
|
+
});
|
|
58
|
+
} finally {
|
|
59
|
+
failureHandler.dispose();
|
|
50
60
|
}
|
|
51
61
|
},
|
|
52
62
|
() => this.loadToken()
|
|
@@ -54,11 +64,13 @@ export class HaloAuthenticationClient {
|
|
|
54
64
|
|
|
55
65
|
constructor(
|
|
56
66
|
private readonly fetchXstsToken: () => Promise<string> | string,
|
|
67
|
+
private readonly clearXstsToken: () => Promise<void>,
|
|
57
68
|
private readonly loadToken: () => Promise<{
|
|
58
69
|
token: string;
|
|
59
70
|
expiresAt: unknown;
|
|
60
71
|
} | null>,
|
|
61
72
|
private readonly saveToken: (token: Token) => Promise<void>,
|
|
73
|
+
private readonly clearToken: () => Promise<void>,
|
|
62
74
|
private readonly fetchFn: FetchFunction = defaultFetch
|
|
63
75
|
) {}
|
|
64
76
|
|
|
@@ -66,4 +78,8 @@ export class HaloAuthenticationClient {
|
|
|
66
78
|
const { token } = await this.spartanTokenCache.getToken();
|
|
67
79
|
return token;
|
|
68
80
|
}
|
|
81
|
+
|
|
82
|
+
public clearSpartanToken() {
|
|
83
|
+
return this.clearToken();
|
|
84
|
+
}
|
|
69
85
|
}
|
|
@@ -5,6 +5,7 @@ import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
|
|
|
5
5
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
6
6
|
import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
7
7
|
import { RequestError } from "../util/request-error";
|
|
8
|
+
import { unauthorizedRetryPolicy } from "../core/request-policy";
|
|
8
9
|
|
|
9
10
|
export enum RelyingParty {
|
|
10
11
|
Xbox = "http://xboxlive.com",
|
|
@@ -121,20 +122,36 @@ export class XboxAuthenticationClient {
|
|
|
121
122
|
if (!xstsTicket) {
|
|
122
123
|
let userToken = await this.userTokenCache.getExistingToken();
|
|
123
124
|
if (!userToken) {
|
|
125
|
+
const userTokenFailureHandler = unauthorizedRetryPolicy.onFailure(
|
|
126
|
+
() => {
|
|
127
|
+
this.userTokenCache.clearToken();
|
|
128
|
+
}
|
|
129
|
+
);
|
|
124
130
|
// Ouath2 token depends on nothing, so we can fetch it without
|
|
125
131
|
// worrying if it is expired.
|
|
126
|
-
userToken = await
|
|
127
|
-
|
|
128
|
-
|
|
132
|
+
userToken = await unauthorizedRetryPolicy
|
|
133
|
+
.execute(async () =>
|
|
134
|
+
this.userTokenCache.getToken(await getOauth2AccessToken())
|
|
135
|
+
)
|
|
136
|
+
.finally(() => userTokenFailureHandler.dispose());
|
|
129
137
|
}
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
);
|
|
138
|
+
|
|
139
|
+
const xstsTicketFailureHandler = unauthorizedRetryPolicy.onFailure(() => {
|
|
140
|
+
this.xstsTicketCache.clearToken(relyingParty);
|
|
141
|
+
});
|
|
142
|
+
xstsTicket = await unauthorizedRetryPolicy
|
|
143
|
+
.execute(() =>
|
|
144
|
+
this.xstsTicketCache.getToken(relyingParty, userToken!.Token)
|
|
145
|
+
)
|
|
146
|
+
.finally(() => xstsTicketFailureHandler.dispose());
|
|
134
147
|
}
|
|
135
148
|
return xstsTicket;
|
|
136
149
|
}
|
|
137
150
|
|
|
151
|
+
public clearXstsTicket = async (relyingParty: RelyingParty) => {
|
|
152
|
+
this.xstsTicketCache.clearToken(relyingParty);
|
|
153
|
+
};
|
|
154
|
+
|
|
138
155
|
public getXboxLiveV3Token = (xboxTicket: XboxTicket) =>
|
|
139
156
|
`XBL3.0 x=${xboxTicket.DisplayClaims.xui[0].uhs};${xboxTicket.Token}`;
|
|
140
157
|
}
|
|
@@ -18,11 +18,12 @@ import { UserInfo } from "../models/halo-infinite/user-info";
|
|
|
18
18
|
import { GlobalConstants } from "../util/global-contants";
|
|
19
19
|
import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
|
|
20
20
|
import { RequestError } from "../util/request-error";
|
|
21
|
-
import { MatchesPrivacy } from "
|
|
21
|
+
import { MatchesPrivacy } from "../models/halo-infinite/matches-privacy";
|
|
22
22
|
import {
|
|
23
23
|
ProgressionFileType,
|
|
24
24
|
ProgressionFileTypeMap,
|
|
25
|
-
} from "
|
|
25
|
+
} from "../models/halo-infinite/progression-file";
|
|
26
|
+
import { unauthorizedRetryPolicy } from "./request-policy";
|
|
26
27
|
|
|
27
28
|
export interface ResultContainer<TValue> {
|
|
28
29
|
Id: string;
|
|
@@ -81,28 +82,41 @@ export class HaloInfiniteClient {
|
|
|
81
82
|
private readonly fetchFn: FetchFunction = defaultFetch
|
|
82
83
|
) {}
|
|
83
84
|
|
|
84
|
-
private
|
|
85
|
-
const
|
|
86
|
-
|
|
87
|
-
headers.set("User-Agent", GlobalConstants.HALO_PC_USER_AGENT);
|
|
88
|
-
}
|
|
89
|
-
if (!headers.has("Accept")) {
|
|
90
|
-
headers.set("Accept", "application/json");
|
|
91
|
-
}
|
|
92
|
-
headers.set(
|
|
93
|
-
"x-343-authorization-spartan",
|
|
94
|
-
await this.spartanTokenProvider.getSpartanToken()
|
|
85
|
+
private executeRequest<T>(url: string, init: RequestInit) {
|
|
86
|
+
const failureHandler = unauthorizedRetryPolicy.onFailure(() =>
|
|
87
|
+
this.spartanTokenProvider.clearSpartanToken()
|
|
95
88
|
);
|
|
89
|
+
try {
|
|
90
|
+
return unauthorizedRetryPolicy.execute(async () => {
|
|
91
|
+
const headers = new Headers(init.headers);
|
|
92
|
+
if (!headers.has("User-Agent")) {
|
|
93
|
+
headers.set("User-Agent", GlobalConstants.HALO_PC_USER_AGENT);
|
|
94
|
+
}
|
|
95
|
+
if (!headers.has("Accept")) {
|
|
96
|
+
headers.set("Accept", "application/json");
|
|
97
|
+
}
|
|
98
|
+
headers.set(
|
|
99
|
+
"x-343-authorization-spartan",
|
|
100
|
+
await this.spartanTokenProvider.getSpartanToken()
|
|
101
|
+
);
|
|
96
102
|
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
103
|
+
const response = await this.fetchFn(url, {
|
|
104
|
+
...init,
|
|
105
|
+
headers,
|
|
106
|
+
});
|
|
107
|
+
|
|
108
|
+
if (init.body) {
|
|
109
|
+
throw new RequestError("test", { status: 401 } as Response);
|
|
110
|
+
}
|
|
101
111
|
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
112
|
+
if (response.status >= 200 && response.status < 300) {
|
|
113
|
+
return (await response.json()) as T;
|
|
114
|
+
} else {
|
|
115
|
+
throw new RequestError(url, response);
|
|
116
|
+
}
|
|
117
|
+
});
|
|
118
|
+
} finally {
|
|
119
|
+
failureHandler.dispose();
|
|
106
120
|
}
|
|
107
121
|
}
|
|
108
122
|
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { ConstantBackoff, handleWhenResult, retry } from "cockatiel";
|
|
2
|
+
import { RequestError } from "../util/request-error";
|
|
3
|
+
|
|
4
|
+
export const unauthorizedRetryPolicy = retry(
|
|
5
|
+
handleWhenResult(
|
|
6
|
+
(error) => error instanceof RequestError && error.response.status === 401
|
|
7
|
+
),
|
|
8
|
+
{ maxAttempts: 2, backoff: new ConstantBackoff(50) }
|
|
9
|
+
);
|
|
@@ -29,4 +29,10 @@ export const nodeFsTokenPersister: TokenPersister = {
|
|
|
29
29
|
await import("fs/promises")
|
|
30
30
|
).writeFile(`${tokenDir}/${tokenName}`, JSON.stringify(token));
|
|
31
31
|
},
|
|
32
|
+
clear: async (tokenName) => {
|
|
33
|
+
const tokenDir =
|
|
34
|
+
process.env.TOKEN_ROOT ||
|
|
35
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
36
|
+
await (await import("fs/promises")).unlink(`${tokenDir}/${tokenName}`);
|
|
37
|
+
},
|
|
32
38
|
};
|
|
@@ -18,7 +18,9 @@ export class AutoTokenProvider
|
|
|
18
18
|
implements SpartanTokenProvider, XboxTokenProvider
|
|
19
19
|
{
|
|
20
20
|
public readonly getSpartanToken: () => Promise<string>;
|
|
21
|
+
public readonly clearSpartanToken: () => Promise<void>;
|
|
21
22
|
public readonly getXboxLiveV3Token: () => Promise<string>;
|
|
23
|
+
public readonly clearXboxLiveV3Token: () => Promise<void>;
|
|
22
24
|
|
|
23
25
|
constructor(
|
|
24
26
|
getOauth2AccessToken: () => Promise<string>,
|
|
@@ -43,6 +45,9 @@ export class AutoTokenProvider
|
|
|
43
45
|
);
|
|
44
46
|
return xstsTicket.Token;
|
|
45
47
|
},
|
|
48
|
+
async () => {
|
|
49
|
+
await xboxAuthClient.clearXstsTicket(RelyingParty.Halo);
|
|
50
|
+
},
|
|
46
51
|
async () => {
|
|
47
52
|
const tokenPersister = await tokenPeristerOrPromise;
|
|
48
53
|
return await tokenPersister.load("halo.authToken");
|
|
@@ -51,10 +56,15 @@ export class AutoTokenProvider
|
|
|
51
56
|
const tokenPersister = await tokenPeristerOrPromise;
|
|
52
57
|
await tokenPersister.save("halo.authToken", token);
|
|
53
58
|
},
|
|
59
|
+
async () => {
|
|
60
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
61
|
+
await tokenPersister.clear("halo.authToken");
|
|
62
|
+
},
|
|
54
63
|
fetchFn
|
|
55
64
|
);
|
|
56
65
|
|
|
57
66
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
67
|
+
this.clearSpartanToken = () => haloAuthClient.clearSpartanToken();
|
|
58
68
|
this.getXboxLiveV3Token = async () => {
|
|
59
69
|
const xstsTicket = await xboxAuthClient.getXstsTicket(
|
|
60
70
|
getOauth2AccessToken,
|
|
@@ -62,5 +72,7 @@ export class AutoTokenProvider
|
|
|
62
72
|
);
|
|
63
73
|
return xboxAuthClient.getXboxLiveV3Token(xstsTicket);
|
|
64
74
|
};
|
|
75
|
+
this.clearXboxLiveV3Token = () =>
|
|
76
|
+
xboxAuthClient.clearXstsTicket(RelyingParty.Xbox);
|
|
65
77
|
}
|
|
66
78
|
}
|
|
@@ -13,6 +13,7 @@ export class StaticXstsTicketTokenSpartanTokenProvider
|
|
|
13
13
|
implements SpartanTokenProvider
|
|
14
14
|
{
|
|
15
15
|
public readonly getSpartanToken: () => Promise<string>;
|
|
16
|
+
public readonly clearSpartanToken: () => Promise<void>;
|
|
16
17
|
|
|
17
18
|
constructor(
|
|
18
19
|
xstsTicketToken: string,
|
|
@@ -27,13 +28,22 @@ export class StaticXstsTicketTokenSpartanTokenProvider
|
|
|
27
28
|
|
|
28
29
|
const haloAuthClient = new HaloAuthenticationClient(
|
|
29
30
|
() => xstsTicketToken,
|
|
31
|
+
async () => {
|
|
32
|
+
console.warn(
|
|
33
|
+
"StaticXstsTicketTokenSpartanTokenProvider does not clearing xstsTickets"
|
|
34
|
+
);
|
|
35
|
+
},
|
|
30
36
|
async () =>
|
|
31
37
|
(await (await actualTokenPersister).load("halo.authToken")) ?? null,
|
|
32
38
|
async (token) => {
|
|
33
39
|
await (await actualTokenPersister).save("halo.authToken", token);
|
|
40
|
+
},
|
|
41
|
+
async () => {
|
|
42
|
+
await (await actualTokenPersister).clear("halo.authToken");
|
|
34
43
|
}
|
|
35
44
|
);
|
|
36
45
|
|
|
37
46
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
47
|
+
this.clearSpartanToken = () => haloAuthClient.clearSpartanToken();
|
|
38
48
|
}
|
|
39
49
|
}
|
package/src/core/xbox-client.ts
CHANGED
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { RequestError } from "../util/request-error";
|
|
2
2
|
import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
3
3
|
import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
|
|
4
|
+
import { unauthorizedRetryPolicy } from "./request-policy";
|
|
4
5
|
|
|
5
6
|
export class XboxClient {
|
|
6
7
|
constructor(
|
|
@@ -8,29 +9,36 @@ export class XboxClient {
|
|
|
8
9
|
private readonly fetchFn: FetchFunction = defaultFetch
|
|
9
10
|
) {}
|
|
10
11
|
|
|
11
|
-
private async executeRequest<T>(url: string, init: RequestInit) {
|
|
12
|
-
const
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
headers.
|
|
18
|
-
"
|
|
19
|
-
|
|
20
|
-
)
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
24
|
-
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
12
|
+
private async executeRequest<T>(url: string, init: RequestInit): Promise<T> {
|
|
13
|
+
const failureHandler = unauthorizedRetryPolicy.onFailure(() =>
|
|
14
|
+
this.xboxTokenProvider.clearXboxLiveV3Token()
|
|
15
|
+
);
|
|
16
|
+
try {
|
|
17
|
+
const headers = new Headers(init.headers);
|
|
18
|
+
if (!headers.has("Accept")) {
|
|
19
|
+
headers.set("Accept", "application/json");
|
|
20
|
+
}
|
|
21
|
+
if (!headers.has("Authorization")) {
|
|
22
|
+
headers.set(
|
|
23
|
+
"Authorization",
|
|
24
|
+
await this.xboxTokenProvider.getXboxLiveV3Token()
|
|
25
|
+
);
|
|
26
|
+
}
|
|
27
|
+
if (!headers.has("x-xbl-contract-version")) {
|
|
28
|
+
headers.set("x-xbl-contract-version", "1");
|
|
29
|
+
}
|
|
30
|
+
const response = await this.fetchFn(url, {
|
|
31
|
+
...init,
|
|
32
|
+
headers,
|
|
33
|
+
});
|
|
29
34
|
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
35
|
+
if (response.status >= 200 && response.status < 300) {
|
|
36
|
+
return (await response.json()) as T;
|
|
37
|
+
} else {
|
|
38
|
+
throw new RequestError(url, response);
|
|
39
|
+
}
|
|
40
|
+
} finally {
|
|
41
|
+
failureHandler.dispose();
|
|
34
42
|
}
|
|
35
43
|
}
|
|
36
44
|
|