halo-infinite-api 5.0.0 → 5.1.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 +2 -1
- package/dist/authentication/halo-authentication-client.js +8 -5
- package/dist/authentication/halo-authentication-client.js.map +1 -1
- package/dist/authentication/xbox-authentication-client.d.ts +2 -2
- package/dist/authentication/xbox-authentication-client.js +36 -31
- package/dist/authentication/xbox-authentication-client.js.map +1 -1
- package/dist/core/halo-infinite-client.d.ts +2 -1
- package/dist/core/halo-infinite-client.js +13 -23
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/core/xbox-client.d.ts +2 -1
- package/dist/core/xbox-client.js +11 -11
- package/dist/core/xbox-client.js.map +1 -1
- package/package.json +1 -2
- package/src/authentication/halo-authentication-client.ts +8 -7
- package/src/authentication/xbox-authentication-client.ts +38 -38
- package/src/core/halo-infinite-client.ts +24 -32
- package/src/core/xbox-client.ts +17 -12
|
@@ -7,10 +7,11 @@ export declare class HaloAuthenticationClient {
|
|
|
7
7
|
private readonly fetchXstsToken;
|
|
8
8
|
private readonly loadToken;
|
|
9
9
|
private readonly saveToken;
|
|
10
|
+
private readonly fetchFn;
|
|
10
11
|
private spartanTokenCache;
|
|
11
12
|
constructor(fetchXstsToken: () => Promise<string> | string, loadToken: () => Promise<{
|
|
12
13
|
token: string;
|
|
13
14
|
expiresAt: unknown;
|
|
14
|
-
} | null>, saveToken: (token: Token) => Promise<void
|
|
15
|
+
} | null>, saveToken: (token: Token) => Promise<void>, fetchFn?: typeof fetch);
|
|
15
16
|
getSpartanToken(): Promise<string>;
|
|
16
17
|
}
|
|
@@ -1,10 +1,10 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
1
|
import { DateTime } from "luxon";
|
|
3
2
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
4
3
|
export class HaloAuthenticationClient {
|
|
5
4
|
fetchXstsToken;
|
|
6
5
|
loadToken;
|
|
7
6
|
saveToken;
|
|
7
|
+
fetchFn;
|
|
8
8
|
spartanTokenCache = new ExpiryTokenCache(async () => {
|
|
9
9
|
const xstsToken = await this.fetchXstsToken();
|
|
10
10
|
const tokenRequest = {
|
|
@@ -17,23 +17,26 @@ export class HaloAuthenticationClient {
|
|
|
17
17
|
},
|
|
18
18
|
],
|
|
19
19
|
};
|
|
20
|
-
const response = await
|
|
20
|
+
const response = await this.fetchFn("https://settings.svc.halowaypoint.com/spartan-token", {
|
|
21
|
+
body: JSON.stringify(tokenRequest),
|
|
21
22
|
headers: {
|
|
22
23
|
"User-Agent": "HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
|
|
23
24
|
"Content-Type": "application/json; charset=utf-8",
|
|
24
25
|
},
|
|
25
26
|
});
|
|
27
|
+
const result = (await response.json());
|
|
26
28
|
const newToken = {
|
|
27
|
-
token:
|
|
28
|
-
expiresAt: DateTime.fromISO(
|
|
29
|
+
token: result.SpartanToken,
|
|
30
|
+
expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
|
|
29
31
|
};
|
|
30
32
|
await this.saveToken(newToken);
|
|
31
33
|
return newToken;
|
|
32
34
|
}, () => this.loadToken());
|
|
33
|
-
constructor(fetchXstsToken, loadToken, saveToken) {
|
|
35
|
+
constructor(fetchXstsToken, loadToken, saveToken, fetchFn = fetch) {
|
|
34
36
|
this.fetchXstsToken = fetchXstsToken;
|
|
35
37
|
this.loadToken = loadToken;
|
|
36
38
|
this.saveToken = saveToken;
|
|
39
|
+
this.fetchFn = fetchFn;
|
|
37
40
|
}
|
|
38
41
|
async getSpartanToken() {
|
|
39
42
|
const { token } = await this.spartanTokenCache.getToken();
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
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;AAO9D,MAAM,OAAO,wBAAwB;IAwChB;IACA;IAIA;IACA;IA7CX,iBAAiB,GAAG,IAAI,gBAAgB,CAC9C,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE9C,MAAM,YAAY,GAAwB;YACxC,QAAQ,EAAE,qBAAqB;YAC/B,UAAU,EAAE,GAAG;YACf,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,SAAS;oBAChB,SAAS,EAAE,aAAa;iBACzB;aACF;SACF,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CACjC,qDAAqD,EACrD;YACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YAClC,OAAO,EAAE;gBACP,YAAY,EACV,gEAAgE;gBAClE,cAAc,EAAE,iCAAiC;aAClD;SACF,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;QAEvD,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,YAAY;YAC1B,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;SAC3D,CAAC;QACF,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CACvB,CAAC;IAEF,YACmB,cAA8C,EAC9C,SAGR,EACQ,SAA0C,EAC1C,UAAwB,KAAK;QAN7B,mBAAc,GAAd,cAAc,CAAgC;QAC9C,cAAS,GAAT,SAAS,CAGjB;QACQ,cAAS,GAAT,SAAS,CAAiC;QAC1C,YAAO,GAAP,OAAO,CAAsB;IAC7C,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;CACF"}
|
|
@@ -12,10 +12,10 @@ export interface XboxAuthenticationToken {
|
|
|
12
12
|
}
|
|
13
13
|
export declare class XboxAuthenticationClient {
|
|
14
14
|
private readonly tokenPersister?;
|
|
15
|
+
private readonly fetchFn;
|
|
15
16
|
private userTokenCache;
|
|
16
17
|
private xstsTicketCache;
|
|
17
|
-
|
|
18
|
-
constructor(tokenPersister?: TokenPersister | undefined);
|
|
18
|
+
constructor(tokenPersister?: TokenPersister | undefined, fetchFn?: typeof fetch);
|
|
19
19
|
getXstsTicket(getOauth2AccessToken: () => Promise<string>, relyingParty: RelyingParty): Promise<{
|
|
20
20
|
expiresAt: DateTime;
|
|
21
21
|
IssueInstant: string;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
1
|
import { DateTime } from "luxon";
|
|
3
2
|
import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
|
|
4
3
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
@@ -9,55 +8,61 @@ export var RelyingParty;
|
|
|
9
8
|
})(RelyingParty || (RelyingParty = {}));
|
|
10
9
|
export class XboxAuthenticationClient {
|
|
11
10
|
tokenPersister;
|
|
11
|
+
fetchFn;
|
|
12
12
|
userTokenCache = new ExpiryTokenCache(async (accessToken) => {
|
|
13
|
-
const response = await this.
|
|
14
|
-
|
|
15
|
-
TokenType: "JWT",
|
|
16
|
-
Properties: {
|
|
17
|
-
AuthMethod: "RPS",
|
|
18
|
-
SiteName: "user.auth.xboxlive.com",
|
|
19
|
-
RpsTicket: `d=${accessToken}`,
|
|
20
|
-
},
|
|
21
|
-
}, {
|
|
13
|
+
const response = await this.fetchFn("https://user.auth.xboxlive.com/user/authenticate", {
|
|
14
|
+
method: "POST",
|
|
22
15
|
headers: {
|
|
23
16
|
"Content-Type": "application/json",
|
|
24
17
|
Accept: "application/json",
|
|
25
18
|
"x-xbl-contract-version": "1",
|
|
26
19
|
},
|
|
20
|
+
body: JSON.stringify({
|
|
21
|
+
RelyingParty: "http://auth.xboxlive.com",
|
|
22
|
+
TokenType: "JWT",
|
|
23
|
+
Properties: {
|
|
24
|
+
AuthMethod: "RPS",
|
|
25
|
+
SiteName: "user.auth.xboxlive.com",
|
|
26
|
+
RpsTicket: `d=${accessToken}`,
|
|
27
|
+
},
|
|
28
|
+
}),
|
|
27
29
|
});
|
|
28
|
-
const result =
|
|
29
|
-
|
|
30
|
-
|
|
30
|
+
const result = (await response.json());
|
|
31
|
+
const token = {
|
|
32
|
+
...result,
|
|
33
|
+
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
31
34
|
};
|
|
32
|
-
await this.tokenPersister?.save("xbox.userToken",
|
|
33
|
-
return
|
|
35
|
+
await this.tokenPersister?.save("xbox.userToken", token);
|
|
36
|
+
return token;
|
|
34
37
|
}, async () => (await this.tokenPersister?.load("xbox.userToken")) ?? null);
|
|
35
38
|
xstsTicketCache = new KeyedExpiryTokenCache(async (relyingParty, userToken) => {
|
|
36
|
-
const response = await this.
|
|
37
|
-
|
|
38
|
-
TokenType: "JWT",
|
|
39
|
-
Properties: {
|
|
40
|
-
SandboxId: "RETAIL",
|
|
41
|
-
UserTokens: [userToken],
|
|
42
|
-
},
|
|
43
|
-
}, {
|
|
39
|
+
const response = await this.fetchFn("https://xsts.auth.xboxlive.com/xsts/authorize", {
|
|
40
|
+
method: "POST",
|
|
44
41
|
headers: {
|
|
45
42
|
"Content-Type": "application/json",
|
|
46
43
|
Accept: "application/json",
|
|
47
44
|
"x-xbl-contract-version": "1",
|
|
48
45
|
},
|
|
46
|
+
body: JSON.stringify({
|
|
47
|
+
RelyingParty: relyingParty,
|
|
48
|
+
TokenType: "JWT",
|
|
49
|
+
Properties: {
|
|
50
|
+
SandboxId: "RETAIL",
|
|
51
|
+
UserTokens: [userToken],
|
|
52
|
+
},
|
|
53
|
+
}),
|
|
49
54
|
});
|
|
50
|
-
const result =
|
|
51
|
-
|
|
52
|
-
|
|
55
|
+
const result = (await response.json());
|
|
56
|
+
const token = {
|
|
57
|
+
...result,
|
|
58
|
+
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
53
59
|
};
|
|
54
|
-
await this.tokenPersister?.save("xbox.xstsTicket." + relyingParty,
|
|
55
|
-
return
|
|
60
|
+
await this.tokenPersister?.save("xbox.xstsTicket." + relyingParty, token);
|
|
61
|
+
return token;
|
|
56
62
|
}, async (relyingParty) => (await this.tokenPersister?.load("xbox.xstsTicket." + relyingParty)) ?? null);
|
|
57
|
-
|
|
58
|
-
constructor(tokenPersister) {
|
|
63
|
+
constructor(tokenPersister, fetchFn = fetch) {
|
|
59
64
|
this.tokenPersister = tokenPersister;
|
|
60
|
-
this.
|
|
65
|
+
this.fetchFn = fetchFn;
|
|
61
66
|
}
|
|
62
67
|
async getXstsTicket(getOauth2AccessToken, relyingParty) {
|
|
63
68
|
let xstsTicket = await this.xstsTicketCache.getExistingToken(relyingParty);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -21,7 +21,8 @@ export type AssetKindTypeMap = {
|
|
|
21
21
|
};
|
|
22
22
|
export declare class HaloInfiniteClient {
|
|
23
23
|
private spartanTokenProvider;
|
|
24
|
-
|
|
24
|
+
private readonly fetchFn;
|
|
25
|
+
constructor(spartanTokenProvider: SpartanTokenProvider, fetchFn?: typeof fetch);
|
|
25
26
|
private executeRequest;
|
|
26
27
|
private executeResultsRequest;
|
|
27
28
|
private executePaginationRequest;
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import axios, { AxiosError, AxiosHeaders } from "axios";
|
|
2
1
|
import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
|
|
3
2
|
import { AssetKind } from "../models/halo-infinite/asset-kind";
|
|
4
3
|
import { MatchType } from "../models/halo-infinite/match-type";
|
|
@@ -28,26 +27,29 @@ function unwrapPlayerId(playerId) {
|
|
|
28
27
|
}
|
|
29
28
|
export class HaloInfiniteClient {
|
|
30
29
|
spartanTokenProvider;
|
|
31
|
-
|
|
30
|
+
fetchFn;
|
|
31
|
+
constructor(spartanTokenProvider, fetchFn) {
|
|
32
32
|
this.spartanTokenProvider = spartanTokenProvider;
|
|
33
|
+
this.fetchFn = fetchFn ?? fetch;
|
|
33
34
|
}
|
|
34
35
|
async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
|
|
35
|
-
const headers =
|
|
36
|
+
const headers = {
|
|
36
37
|
"User-Agent": userAgent,
|
|
37
38
|
Accept: "application/json",
|
|
38
|
-
}
|
|
39
|
+
};
|
|
39
40
|
if (useSpartanToken) {
|
|
40
|
-
headers
|
|
41
|
+
headers["x-343-authorization-spartan"] =
|
|
42
|
+
await this.spartanTokenProvider.getSpartanToken();
|
|
41
43
|
}
|
|
42
44
|
if (useClearance) {
|
|
43
45
|
throw new Error("TODO: Implement clearance");
|
|
44
46
|
}
|
|
45
|
-
const response = await
|
|
46
|
-
url,
|
|
47
|
+
const response = await this.fetchFn(url, {
|
|
47
48
|
method,
|
|
48
49
|
headers,
|
|
49
50
|
});
|
|
50
|
-
|
|
51
|
+
const result = (await response.json());
|
|
52
|
+
return result;
|
|
51
53
|
}
|
|
52
54
|
async executeResultsRequest(...args) {
|
|
53
55
|
const result = await this.executeRequest(...args);
|
|
@@ -99,21 +101,9 @@ export class HaloInfiniteClient {
|
|
|
99
101
|
}
|
|
100
102
|
getMatchStats = (matchId) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, "get");
|
|
101
103
|
getMatchSkill = async (matchId, playerIds) => {
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
.join(",")}`, "get");
|
|
106
|
-
}
|
|
107
|
-
catch (e) {
|
|
108
|
-
if (e instanceof AxiosError &&
|
|
109
|
-
e.response?.status === 404 &&
|
|
110
|
-
e.response.data) {
|
|
111
|
-
return e.response.data.Value;
|
|
112
|
-
}
|
|
113
|
-
else {
|
|
114
|
-
throw e;
|
|
115
|
-
}
|
|
116
|
-
}
|
|
104
|
+
return await this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=${playerIds
|
|
105
|
+
.map(wrapPlayerId)
|
|
106
|
+
.join(",")}`, "get");
|
|
117
107
|
};
|
|
118
108
|
/** Gets authoring metadata about a specific asset. */
|
|
119
109
|
getAsset = (assetType, assetId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`, "get");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"AAAA,OAAO,
|
|
1
|
+
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
|
|
2
2
|
export declare class XboxClient {
|
|
3
3
|
private xboxTokenProvider;
|
|
4
|
-
|
|
4
|
+
private readonly fetchFn;
|
|
5
|
+
constructor(xboxTokenProvider: XboxTokenProvider, fetchFn?: typeof fetch);
|
|
5
6
|
private executeRequest;
|
|
6
7
|
searchUsers(query: string): Promise<{
|
|
7
8
|
id: string;
|
package/dist/core/xbox-client.js
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import axios, { AxiosHeaders } from "axios";
|
|
2
1
|
export class XboxClient {
|
|
3
2
|
xboxTokenProvider;
|
|
4
|
-
|
|
3
|
+
fetchFn;
|
|
4
|
+
constructor(xboxTokenProvider, fetchFn) {
|
|
5
5
|
this.xboxTokenProvider = xboxTokenProvider;
|
|
6
|
+
this.fetchFn = fetchFn ?? fetch;
|
|
6
7
|
}
|
|
7
8
|
async executeRequest(url, method) {
|
|
8
|
-
const
|
|
9
|
-
Accept: "application/json",
|
|
10
|
-
Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
|
|
11
|
-
"x-xbl-contract-version": "1",
|
|
12
|
-
});
|
|
13
|
-
const response = await axios.request({
|
|
14
|
-
url,
|
|
9
|
+
const response = await this.fetchFn(url, {
|
|
15
10
|
method,
|
|
16
|
-
headers
|
|
11
|
+
headers: {
|
|
12
|
+
Accept: "application/json",
|
|
13
|
+
Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
|
|
14
|
+
"x-xbl-contract-version": "1",
|
|
15
|
+
},
|
|
17
16
|
});
|
|
18
|
-
|
|
17
|
+
const result = (await response.json());
|
|
18
|
+
return result;
|
|
19
19
|
}
|
|
20
20
|
async searchUsers(query) {
|
|
21
21
|
const { results } = await this.executeRequest(`https://usersearch.xboxlive.com/suggest?q=${encodeURIComponent(query)}`, "GET");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xbox-client.js","sourceRoot":"","sources":["../../src/core/xbox-client.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"xbox-client.js","sourceRoot":"","sources":["../../src/core/xbox-client.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IAGX;IAFO,OAAO,CAAe;IACvC,YACU,iBAAoC,EAC5C,OAAsB;QADd,sBAAiB,GAAjB,iBAAiB,CAAmB;QAG5C,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAK,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,cAAc,CAAI,GAAW,EAAE,MAA6B;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,MAAM;YACN,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;gBAChE,wBAAwB,EAAE,GAAG;aAC9B;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;QAE5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAa;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAa3C,6CAA6C,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACxE,KAAK,CACN,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,OAAO,MAAM,IAAI,CAAC,cAAc,CAC9B,8DAA8D,EAC9D,KAAK,CACN,CAAC;IACJ,CAAC;CACF"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "halo-infinite-api",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.1.0",
|
|
5
5
|
"description": "An NPM package for accessing the official Halo Infinite API.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"scripts": {
|
|
@@ -34,7 +34,6 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@azure/msal-node": "^2.2.0",
|
|
37
|
-
"axios": "^1.3.5",
|
|
38
37
|
"expiry-map": "^2.0.0",
|
|
39
38
|
"luxon": "^3.3.0",
|
|
40
39
|
"pkce-challenge": "^3.1.0",
|
|
@@ -1,8 +1,6 @@
|
|
|
1
|
-
import axios from "axios";
|
|
2
1
|
import { DateTime } from "luxon";
|
|
3
2
|
import type { SpartanToken } from "../models/spartan-token";
|
|
4
3
|
import type { SpartanTokenRequest } from "../models/spartan-token-request";
|
|
5
|
-
import { coalesceDateTime } from "../util/date-time";
|
|
6
4
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
7
5
|
|
|
8
6
|
export interface Token {
|
|
@@ -25,10 +23,10 @@ export class HaloAuthenticationClient {
|
|
|
25
23
|
},
|
|
26
24
|
],
|
|
27
25
|
};
|
|
28
|
-
const response = await
|
|
26
|
+
const response = await this.fetchFn(
|
|
29
27
|
"https://settings.svc.halowaypoint.com/spartan-token",
|
|
30
|
-
tokenRequest,
|
|
31
28
|
{
|
|
29
|
+
body: JSON.stringify(tokenRequest),
|
|
32
30
|
headers: {
|
|
33
31
|
"User-Agent":
|
|
34
32
|
"HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
|
|
@@ -37,9 +35,11 @@ export class HaloAuthenticationClient {
|
|
|
37
35
|
}
|
|
38
36
|
);
|
|
39
37
|
|
|
38
|
+
const result = (await response.json()) as SpartanToken;
|
|
39
|
+
|
|
40
40
|
const newToken = {
|
|
41
|
-
token:
|
|
42
|
-
expiresAt: DateTime.fromISO(
|
|
41
|
+
token: result.SpartanToken,
|
|
42
|
+
expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
|
|
43
43
|
};
|
|
44
44
|
await this.saveToken(newToken);
|
|
45
45
|
return newToken;
|
|
@@ -53,7 +53,8 @@ export class HaloAuthenticationClient {
|
|
|
53
53
|
token: string;
|
|
54
54
|
expiresAt: unknown;
|
|
55
55
|
} | null>,
|
|
56
|
-
private readonly saveToken: (token: Token) => Promise<void
|
|
56
|
+
private readonly saveToken: (token: Token) => Promise<void>,
|
|
57
|
+
private readonly fetchFn: typeof fetch = fetch
|
|
57
58
|
) {}
|
|
58
59
|
|
|
59
60
|
public async getSpartanToken() {
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import axios, { AxiosInstance } from "axios";
|
|
2
1
|
import { DateTime } from "luxon";
|
|
3
2
|
import { TokenPersister } from "../core/token-persisters";
|
|
4
3
|
import { XboxTicket } from "../models/xbox-ticket";
|
|
@@ -19,32 +18,35 @@ export interface XboxAuthenticationToken {
|
|
|
19
18
|
export class XboxAuthenticationClient {
|
|
20
19
|
private userTokenCache = new ExpiryTokenCache(
|
|
21
20
|
async (accessToken: string) => {
|
|
22
|
-
const response = await this.
|
|
21
|
+
const response = await this.fetchFn(
|
|
23
22
|
"https://user.auth.xboxlive.com/user/authenticate",
|
|
24
23
|
{
|
|
25
|
-
|
|
26
|
-
TokenType: "JWT",
|
|
27
|
-
Properties: {
|
|
28
|
-
AuthMethod: "RPS",
|
|
29
|
-
SiteName: "user.auth.xboxlive.com",
|
|
30
|
-
RpsTicket: `d=${accessToken}`,
|
|
31
|
-
},
|
|
32
|
-
},
|
|
33
|
-
{
|
|
24
|
+
method: "POST",
|
|
34
25
|
headers: {
|
|
35
26
|
"Content-Type": "application/json",
|
|
36
27
|
Accept: "application/json",
|
|
37
28
|
"x-xbl-contract-version": "1",
|
|
38
29
|
},
|
|
30
|
+
body: JSON.stringify({
|
|
31
|
+
RelyingParty: "http://auth.xboxlive.com",
|
|
32
|
+
TokenType: "JWT",
|
|
33
|
+
Properties: {
|
|
34
|
+
AuthMethod: "RPS",
|
|
35
|
+
SiteName: "user.auth.xboxlive.com",
|
|
36
|
+
RpsTicket: `d=${accessToken}`,
|
|
37
|
+
},
|
|
38
|
+
}),
|
|
39
39
|
}
|
|
40
40
|
);
|
|
41
41
|
|
|
42
|
-
const result =
|
|
43
|
-
|
|
44
|
-
|
|
42
|
+
const result = (await response.json()) as XboxTicket;
|
|
43
|
+
|
|
44
|
+
const token = {
|
|
45
|
+
...result,
|
|
46
|
+
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
45
47
|
};
|
|
46
|
-
await this.tokenPersister?.save("xbox.userToken",
|
|
47
|
-
return
|
|
48
|
+
await this.tokenPersister?.save("xbox.userToken", token);
|
|
49
|
+
return token;
|
|
48
50
|
},
|
|
49
51
|
async () =>
|
|
50
52
|
(await this.tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
|
|
@@ -53,34 +55,33 @@ export class XboxAuthenticationClient {
|
|
|
53
55
|
);
|
|
54
56
|
private xstsTicketCache = new KeyedExpiryTokenCache(
|
|
55
57
|
async (relyingParty: RelyingParty, userToken: string) => {
|
|
56
|
-
const response = await this.
|
|
58
|
+
const response = await this.fetchFn(
|
|
57
59
|
"https://xsts.auth.xboxlive.com/xsts/authorize",
|
|
58
60
|
{
|
|
59
|
-
|
|
60
|
-
TokenType: "JWT",
|
|
61
|
-
Properties: {
|
|
62
|
-
SandboxId: "RETAIL",
|
|
63
|
-
UserTokens: [userToken],
|
|
64
|
-
},
|
|
65
|
-
},
|
|
66
|
-
{
|
|
61
|
+
method: "POST",
|
|
67
62
|
headers: {
|
|
68
63
|
"Content-Type": "application/json",
|
|
69
64
|
Accept: "application/json",
|
|
70
65
|
"x-xbl-contract-version": "1",
|
|
71
66
|
},
|
|
67
|
+
body: JSON.stringify({
|
|
68
|
+
RelyingParty: relyingParty,
|
|
69
|
+
TokenType: "JWT",
|
|
70
|
+
Properties: {
|
|
71
|
+
SandboxId: "RETAIL",
|
|
72
|
+
UserTokens: [userToken],
|
|
73
|
+
},
|
|
74
|
+
}),
|
|
72
75
|
}
|
|
73
76
|
);
|
|
77
|
+
const result = (await response.json()) as XboxTicket;
|
|
74
78
|
|
|
75
|
-
const
|
|
76
|
-
...
|
|
77
|
-
expiresAt: DateTime.fromISO(
|
|
79
|
+
const token = {
|
|
80
|
+
...result,
|
|
81
|
+
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
78
82
|
};
|
|
79
|
-
await this.tokenPersister?.save(
|
|
80
|
-
|
|
81
|
-
result
|
|
82
|
-
);
|
|
83
|
-
return result;
|
|
83
|
+
await this.tokenPersister?.save("xbox.xstsTicket." + relyingParty, token);
|
|
84
|
+
return token;
|
|
84
85
|
},
|
|
85
86
|
async (relyingParty) =>
|
|
86
87
|
(await this.tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
|
|
@@ -88,11 +89,10 @@ export class XboxAuthenticationClient {
|
|
|
88
89
|
)) ?? null
|
|
89
90
|
);
|
|
90
91
|
|
|
91
|
-
|
|
92
|
-
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
}
|
|
92
|
+
constructor(
|
|
93
|
+
private readonly tokenPersister?: TokenPersister,
|
|
94
|
+
private readonly fetchFn: typeof fetch = fetch
|
|
95
|
+
) {}
|
|
96
96
|
|
|
97
97
|
public async getXstsTicket(
|
|
98
98
|
getOauth2AccessToken: () => Promise<string>,
|
|
@@ -1,4 +1,3 @@
|
|
|
1
|
-
import axios, { AxiosError, AxiosHeaders, Method } from "axios";
|
|
2
1
|
import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
|
|
3
2
|
import {
|
|
4
3
|
MapAsset,
|
|
@@ -67,38 +66,43 @@ function unwrapPlayerId(playerId: string) {
|
|
|
67
66
|
}
|
|
68
67
|
|
|
69
68
|
export class HaloInfiniteClient {
|
|
70
|
-
|
|
69
|
+
private readonly fetchFn: typeof fetch;
|
|
70
|
+
constructor(
|
|
71
|
+
private spartanTokenProvider: SpartanTokenProvider,
|
|
72
|
+
fetchFn?: typeof fetch
|
|
73
|
+
) {
|
|
74
|
+
this.fetchFn = fetchFn ?? fetch;
|
|
75
|
+
}
|
|
71
76
|
|
|
72
77
|
private async executeRequest<T>(
|
|
73
78
|
url: string,
|
|
74
|
-
method:
|
|
79
|
+
method: RequestInit["method"],
|
|
75
80
|
useSpartanToken = true,
|
|
76
81
|
useClearance = false,
|
|
77
82
|
userAgent: string = GlobalConstants.HALO_WAYPOINT_USER_AGENT
|
|
78
83
|
) {
|
|
79
|
-
const headers =
|
|
84
|
+
const headers: HeadersInit = {
|
|
80
85
|
"User-Agent": userAgent,
|
|
81
86
|
Accept: "application/json",
|
|
82
|
-
}
|
|
87
|
+
};
|
|
83
88
|
|
|
84
89
|
if (useSpartanToken) {
|
|
85
|
-
headers
|
|
86
|
-
|
|
87
|
-
await this.spartanTokenProvider.getSpartanToken()
|
|
88
|
-
);
|
|
90
|
+
headers["x-343-authorization-spartan"] =
|
|
91
|
+
await this.spartanTokenProvider.getSpartanToken();
|
|
89
92
|
}
|
|
90
93
|
|
|
91
94
|
if (useClearance) {
|
|
92
95
|
throw new Error("TODO: Implement clearance");
|
|
93
96
|
}
|
|
94
97
|
|
|
95
|
-
const response = await
|
|
96
|
-
url,
|
|
98
|
+
const response = await this.fetchFn(url, {
|
|
97
99
|
method,
|
|
98
100
|
headers,
|
|
99
101
|
});
|
|
100
102
|
|
|
101
|
-
|
|
103
|
+
const result = (await response.json()) as T;
|
|
104
|
+
|
|
105
|
+
return result;
|
|
102
106
|
}
|
|
103
107
|
|
|
104
108
|
private async executeResultsRequest<T>(
|
|
@@ -221,26 +225,14 @@ export class HaloInfiniteClient {
|
|
|
221
225
|
);
|
|
222
226
|
|
|
223
227
|
public getMatchSkill = async (matchId: string, playerIds: string[]) => {
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
|
|
227
|
-
|
|
228
|
-
|
|
229
|
-
|
|
230
|
-
|
|
231
|
-
|
|
232
|
-
);
|
|
233
|
-
} catch (e) {
|
|
234
|
-
if (
|
|
235
|
-
e instanceof AxiosError &&
|
|
236
|
-
e.response?.status === 404 &&
|
|
237
|
-
e.response.data
|
|
238
|
-
) {
|
|
239
|
-
return (e.response.data as ResultsContainer<MatchSkill<0 | 1>>).Value;
|
|
240
|
-
} else {
|
|
241
|
-
throw e;
|
|
242
|
-
}
|
|
243
|
-
}
|
|
228
|
+
return await this.executeResultsRequest<MatchSkill>(
|
|
229
|
+
`https://${HaloCoreEndpoints.SkillOrigin}.${
|
|
230
|
+
HaloCoreEndpoints.ServiceDomain
|
|
231
|
+
}/hi/matches/${matchId}/skill?players=${playerIds
|
|
232
|
+
.map(wrapPlayerId)
|
|
233
|
+
.join(",")}`,
|
|
234
|
+
"get"
|
|
235
|
+
);
|
|
244
236
|
};
|
|
245
237
|
|
|
246
238
|
/** Gets authoring metadata about a specific asset. */
|
package/src/core/xbox-client.ts
CHANGED
|
@@ -1,22 +1,27 @@
|
|
|
1
|
-
import axios, { AxiosHeaders, Method } from "axios";
|
|
2
1
|
import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
|
|
3
2
|
|
|
4
3
|
export class XboxClient {
|
|
5
|
-
|
|
4
|
+
private readonly fetchFn: typeof fetch;
|
|
5
|
+
constructor(
|
|
6
|
+
private xboxTokenProvider: XboxTokenProvider,
|
|
7
|
+
fetchFn?: typeof fetch
|
|
8
|
+
) {
|
|
9
|
+
this.fetchFn = fetchFn ?? fetch;
|
|
10
|
+
}
|
|
6
11
|
|
|
7
|
-
private async executeRequest<T>(url: string, method:
|
|
8
|
-
const
|
|
9
|
-
Accept: "application/json",
|
|
10
|
-
Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
|
|
11
|
-
"x-xbl-contract-version": "1",
|
|
12
|
-
});
|
|
13
|
-
const response = await axios.request<T>({
|
|
14
|
-
url,
|
|
12
|
+
private async executeRequest<T>(url: string, method: RequestInit["method"]) {
|
|
13
|
+
const response = await this.fetchFn(url, {
|
|
15
14
|
method,
|
|
16
|
-
headers
|
|
15
|
+
headers: {
|
|
16
|
+
Accept: "application/json",
|
|
17
|
+
Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
|
|
18
|
+
"x-xbl-contract-version": "1",
|
|
19
|
+
},
|
|
17
20
|
});
|
|
18
21
|
|
|
19
|
-
|
|
22
|
+
const result = (await response.json()) as T;
|
|
23
|
+
|
|
24
|
+
return result;
|
|
20
25
|
}
|
|
21
26
|
|
|
22
27
|
public async searchUsers(query: string) {
|