halo-infinite-api 2.0.0 → 2.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/xbox-authentication-client.d.ts +15 -2
- package/dist/authentication/xbox-authentication-client.js +18 -7
- package/dist/authentication/xbox-authentication-client.js.map +1 -1
- package/dist/core/halo-infinite-client.d.ts +4 -0
- package/dist/core/halo-infinite-client.js +15 -0
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.js +10 -11
- package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.js.map +1 -1
- package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js +10 -11
- package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map +1 -1
- package/dist/core/token-persisters/in-memory-token-persister.d.ts +2 -0
- package/dist/core/token-persisters/in-memory-token-persister.js +10 -0
- package/dist/core/token-persisters/in-memory-token-persister.js.map +1 -0
- package/package.json +1 -1
- package/src/authentication/xbox-authentication-client.ts +20 -9
- package/src/core/halo-infinite-client.ts +21 -0
- package/src/core/spartan-token-providers/auto-xsts-spartan-token-provider.ts +9 -10
- package/src/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts +10 -11
- package/src/core/token-persisters/in-memory-token-persister.ts +12 -0
|
@@ -1,5 +1,4 @@
|
|
|
1
1
|
import { DateTime } from "luxon";
|
|
2
|
-
import { XboxTicket } from "../models/xbox-ticket";
|
|
3
2
|
import { TokenPersister } from "../core/token-persisters";
|
|
4
3
|
export declare enum RelyingParty {
|
|
5
4
|
Xbox = "http://xboxlive.com",
|
|
@@ -25,8 +24,22 @@ export declare class XboxAuthenticationClient {
|
|
|
25
24
|
private fetchOauth2Token;
|
|
26
25
|
private refreshOAuth2Token;
|
|
27
26
|
getUserToken(accessToken: string): Promise<string>;
|
|
28
|
-
getXstsTicket(userToken: string, relyingParty: RelyingParty): Promise<
|
|
27
|
+
getXstsTicket(userToken: string, relyingParty: RelyingParty): Promise<{
|
|
29
28
|
expiresAt: DateTime;
|
|
29
|
+
IssueInstant: string;
|
|
30
|
+
NotAfter: string;
|
|
31
|
+
Token: string;
|
|
32
|
+
DisplayClaims: {
|
|
33
|
+
xui: [{
|
|
34
|
+
uhs: string;
|
|
35
|
+
gtg: string;
|
|
36
|
+
xid: string;
|
|
37
|
+
agg: string;
|
|
38
|
+
usr: string;
|
|
39
|
+
utr: string;
|
|
40
|
+
prv: string;
|
|
41
|
+
}];
|
|
42
|
+
};
|
|
30
43
|
}>;
|
|
31
44
|
getXboxLiveV3Token: (userHash: string, userToken: string) => string;
|
|
32
45
|
}
|
|
@@ -18,8 +18,11 @@ export class XboxAuthenticationClient {
|
|
|
18
18
|
accessTokenPromise = undefined;
|
|
19
19
|
userTokenCache = new ExpiryTokenCache(async (accessToken) => {
|
|
20
20
|
const persistedToken = await this.tokenPersister?.load("xbox.userToken");
|
|
21
|
-
if (persistedToken
|
|
22
|
-
|
|
21
|
+
if (persistedToken?.expiresAt) {
|
|
22
|
+
const expiresAt = coalesceDateTime(persistedToken.expiresAt);
|
|
23
|
+
if (expiresAt && expiresAt > DateTime.now()) {
|
|
24
|
+
return { ...persistedToken, expiresAt };
|
|
25
|
+
}
|
|
23
26
|
}
|
|
24
27
|
const response = await this.httpClient.post("https://user.auth.xboxlive.com/user/authenticate", {
|
|
25
28
|
RelyingParty: "http://auth.xboxlive.com",
|
|
@@ -45,8 +48,11 @@ export class XboxAuthenticationClient {
|
|
|
45
48
|
});
|
|
46
49
|
xstsTicketCache = new ExpiryTokenCache(async (userToken, relyingParty) => {
|
|
47
50
|
const persistedToken = await this.tokenPersister?.load("xbox.xstsTicket");
|
|
48
|
-
if (persistedToken
|
|
49
|
-
|
|
51
|
+
if (persistedToken?.expiresAt) {
|
|
52
|
+
const expiresAt = coalesceDateTime(persistedToken.expiresAt);
|
|
53
|
+
if (expiresAt && expiresAt > DateTime.now()) {
|
|
54
|
+
return { ...persistedToken, expiresAt };
|
|
55
|
+
}
|
|
50
56
|
}
|
|
51
57
|
const response = await this.httpClient.post("https://xsts.auth.xboxlive.com/xsts/authorize", {
|
|
52
58
|
RelyingParty: relyingParty,
|
|
@@ -78,7 +84,12 @@ export class XboxAuthenticationClient {
|
|
|
78
84
|
this.httpClient = axios.create();
|
|
79
85
|
}
|
|
80
86
|
getPkce() {
|
|
81
|
-
|
|
87
|
+
if (typeof pkceChallenge === "function") {
|
|
88
|
+
return pkceChallenge(43);
|
|
89
|
+
}
|
|
90
|
+
else {
|
|
91
|
+
return pkceChallenge.default(43);
|
|
92
|
+
}
|
|
82
93
|
}
|
|
83
94
|
async getAccessToken() {
|
|
84
95
|
if (this.accessTokenPromise) {
|
|
@@ -164,6 +175,7 @@ export class XboxAuthenticationClient {
|
|
|
164
175
|
};
|
|
165
176
|
}
|
|
166
177
|
async refreshOAuth2Token(refreshToken) {
|
|
178
|
+
const requestStart = DateTime.now();
|
|
167
179
|
const response = await this.httpClient.post("https://login.live.com/oauth20_token.srf", new URLSearchParams({
|
|
168
180
|
grant_type: "refresh_token",
|
|
169
181
|
refresh_token: refreshToken,
|
|
@@ -173,10 +185,9 @@ export class XboxAuthenticationClient {
|
|
|
173
185
|
}), {
|
|
174
186
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
175
187
|
});
|
|
176
|
-
const responseDate = DateTime.fromRFC2822(response.headers["date"]);
|
|
177
188
|
return {
|
|
178
189
|
token: response.data.access_token,
|
|
179
|
-
expiresAt:
|
|
190
|
+
expiresAt: requestStart.plus({ seconds: response.data.expires_in }),
|
|
180
191
|
refreshToken: response.data.refresh_token,
|
|
181
192
|
};
|
|
182
193
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,aAAa,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,iBAAiB,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAG9D,MAAM,MAAM,GAAG,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;AAE9D,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,4DAA4C,CAAA;AAC9C,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAQD,MAAM,OAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -34,6 +34,10 @@ export declare class HaloInfiniteClient {
|
|
|
34
34
|
* @param gamerTag - Gamertag to lookup.
|
|
35
35
|
*/
|
|
36
36
|
getUser: (gamerTag: string) => Promise<UserInfo>;
|
|
37
|
+
/** Get gamertag info for several players.
|
|
38
|
+
* @param xuids - Xuids to lookup.
|
|
39
|
+
*/
|
|
40
|
+
getUsers: (xuids: string[]) => Promise<UserInfo[]>;
|
|
37
41
|
/** Get service record for a player.
|
|
38
42
|
* @param gamerTag - Gamertag to lookup.
|
|
39
43
|
*/
|
|
@@ -17,6 +17,15 @@ function wrapPlayerId(playerId) {
|
|
|
17
17
|
return `xuid(${playerId})`;
|
|
18
18
|
}
|
|
19
19
|
}
|
|
20
|
+
function unwrapPlayerId(playerId) {
|
|
21
|
+
const match = /^\w+\((\d+)\)$/.exec(playerId);
|
|
22
|
+
if (match) {
|
|
23
|
+
return match[1];
|
|
24
|
+
}
|
|
25
|
+
else {
|
|
26
|
+
return playerId;
|
|
27
|
+
}
|
|
28
|
+
}
|
|
20
29
|
export class HaloInfiniteClient {
|
|
21
30
|
spartanTokenProvider;
|
|
22
31
|
constructor(spartanTokenProvider) {
|
|
@@ -64,6 +73,12 @@ export class HaloInfiniteClient {
|
|
|
64
73
|
* @param gamerTag - Gamertag to lookup.
|
|
65
74
|
*/
|
|
66
75
|
getUser = (gamerTag) => this.executeRequest(`https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users/gt(${gamerTag})`, "get");
|
|
76
|
+
/** Get gamertag info for several players.
|
|
77
|
+
* @param xuids - Xuids to lookup.
|
|
78
|
+
*/
|
|
79
|
+
getUsers = (xuids) => {
|
|
80
|
+
return this.executeRequest(`https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users?xuids=${xuids.map((x) => unwrapPlayerId(x)).join(",")}`, "get");
|
|
81
|
+
};
|
|
67
82
|
/** Get service record for a player.
|
|
68
83
|
* @param gamerTag - Gamertag to lookup.
|
|
69
84
|
*/
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { RelyingParty, XboxAuthenticationClient, } from "../../authentication/xbox-authentication-client";
|
|
2
2
|
import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
|
|
3
|
+
import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";
|
|
3
4
|
/**
|
|
4
5
|
* A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
|
|
5
6
|
* process. This is useful for applications that do not need to contend with
|
|
@@ -8,23 +9,21 @@ import { HaloAuthenticationClient } from "../../authentication/halo-authenticati
|
|
|
8
9
|
export class AutoXstsSpartanTokenProvider {
|
|
9
10
|
getSpartanToken;
|
|
10
11
|
constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
|
|
12
|
+
let actualTokenPersister;
|
|
13
|
+
if (tokenPersister) {
|
|
14
|
+
actualTokenPersister = tokenPersister;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
actualTokenPersister = inMemoryTokenPersister;
|
|
18
|
+
}
|
|
11
19
|
const xboxAuthClient = new XboxAuthenticationClient(clientId, redirectUri, getAuthCode, tokenPersister);
|
|
12
20
|
const haloAuthClient = new HaloAuthenticationClient(async () => {
|
|
13
21
|
const accessToken = await xboxAuthClient.getAccessToken();
|
|
14
22
|
const userToken = await xboxAuthClient.getUserToken(accessToken);
|
|
15
23
|
const xstsTicket = await xboxAuthClient.getXstsTicket(userToken, RelyingParty.Halo);
|
|
16
24
|
return xstsTicket.Token;
|
|
17
|
-
}, async () => {
|
|
18
|
-
|
|
19
|
-
return await tokenPersister.load("halo.authToken");
|
|
20
|
-
}
|
|
21
|
-
else {
|
|
22
|
-
return null;
|
|
23
|
-
}
|
|
24
|
-
}, async (token) => {
|
|
25
|
-
if (tokenPersister) {
|
|
26
|
-
await tokenPersister.save("halo.authToken", token);
|
|
27
|
-
}
|
|
25
|
+
}, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
|
|
26
|
+
await actualTokenPersister.save("halo.authToken", token);
|
|
28
27
|
});
|
|
29
28
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
30
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-xsts-spartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-providers/auto-xsts-spartan-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"auto-xsts-spartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-providers/auto-xsts-spartan-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;AAEvF;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IACvB,eAAe,CAAwB;IAEvD,YACE,QAAgB,EAChB,WAAmB,EACnB,WAAsD,EACtD,cAA+B;QAE/B,IAAI,oBAAoC,CAAC;QACzC,IAAI,cAAc,EAAE;YAClB,oBAAoB,GAAG,cAAc,CAAC;SACvC;aAAM;YACL,oBAAoB,GAAG,sBAAsB,CAAC;SAC/C;QACD,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,QAAQ,EACR,WAAW,EACX,WAAW,EACX,cAAc,CACf,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,KAAK,IAAI,EAAE;YACT,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC;YAC1D,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,SAAS,EACT,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC7D,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
|
package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js
CHANGED
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
|
|
2
|
+
import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";
|
|
2
3
|
/**
|
|
3
4
|
* A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.
|
|
4
5
|
* Since requests to the Halo API are subject to CORS restrictions a
|
|
@@ -8,17 +9,15 @@ import { HaloAuthenticationClient } from "../../authentication/halo-authenticati
|
|
|
8
9
|
export class StaticXstsTicketTokenSpartanTokenProvider {
|
|
9
10
|
getSpartanToken;
|
|
10
11
|
constructor(xstsTicketToken, tokenPersister) {
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
await tokenPersister.save("halo.authToken", token);
|
|
21
|
-
}
|
|
12
|
+
let actualTokenPersister;
|
|
13
|
+
if (tokenPersister) {
|
|
14
|
+
actualTokenPersister = tokenPersister;
|
|
15
|
+
}
|
|
16
|
+
else {
|
|
17
|
+
actualTokenPersister = inMemoryTokenPersister;
|
|
18
|
+
}
|
|
19
|
+
const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
|
|
20
|
+
await actualTokenPersister.save("halo.authToken", token);
|
|
22
21
|
});
|
|
23
22
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
24
23
|
}
|
package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;
|
|
1
|
+
{"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAEvF;;;;;GAKG;AACH,MAAM,OAAO,yCAAyC;IAGpC,eAAe,CAAwB;IAEvD,YAAY,eAAuB,EAAE,cAA+B;QAClE,IAAI,oBAAoC,CAAC;QACzC,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,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC7D,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
|
|
@@ -0,0 +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"}
|
package/package.json
CHANGED
|
@@ -26,11 +26,14 @@ export class XboxAuthenticationClient {
|
|
|
26
26
|
| undefined = undefined;
|
|
27
27
|
private userTokenCache = new ExpiryTokenCache(async (accessToken: string) => {
|
|
28
28
|
const persistedToken = await this.tokenPersister?.load<
|
|
29
|
-
XboxTicket & { expiresAt
|
|
29
|
+
XboxTicket & { expiresAt?: unknown }
|
|
30
30
|
>("xbox.userToken");
|
|
31
31
|
|
|
32
|
-
if (persistedToken
|
|
33
|
-
|
|
32
|
+
if (persistedToken?.expiresAt) {
|
|
33
|
+
const expiresAt = coalesceDateTime(persistedToken.expiresAt);
|
|
34
|
+
if (expiresAt && expiresAt > DateTime.now()) {
|
|
35
|
+
return { ...persistedToken, expiresAt };
|
|
36
|
+
}
|
|
34
37
|
}
|
|
35
38
|
|
|
36
39
|
const response = await this.httpClient.post<XboxTicket>(
|
|
@@ -66,8 +69,11 @@ export class XboxAuthenticationClient {
|
|
|
66
69
|
XboxTicket & { expiresAt: DateTime }
|
|
67
70
|
>("xbox.xstsTicket");
|
|
68
71
|
|
|
69
|
-
if (persistedToken
|
|
70
|
-
|
|
72
|
+
if (persistedToken?.expiresAt) {
|
|
73
|
+
const expiresAt = coalesceDateTime(persistedToken.expiresAt);
|
|
74
|
+
if (expiresAt && expiresAt > DateTime.now()) {
|
|
75
|
+
return { ...persistedToken, expiresAt };
|
|
76
|
+
}
|
|
71
77
|
}
|
|
72
78
|
|
|
73
79
|
const response = await this.httpClient.post<XboxTicket>(
|
|
@@ -110,7 +116,13 @@ export class XboxAuthenticationClient {
|
|
|
110
116
|
}
|
|
111
117
|
|
|
112
118
|
private getPkce() {
|
|
113
|
-
|
|
119
|
+
// Some sort of module issue here, we work around it
|
|
120
|
+
type PkceChallenge = typeof pkceChallenge;
|
|
121
|
+
if (typeof pkceChallenge === "function") {
|
|
122
|
+
return pkceChallenge(43);
|
|
123
|
+
} else {
|
|
124
|
+
return (pkceChallenge as { default: PkceChallenge }).default(43);
|
|
125
|
+
}
|
|
114
126
|
}
|
|
115
127
|
|
|
116
128
|
public async getAccessToken() {
|
|
@@ -224,6 +236,7 @@ export class XboxAuthenticationClient {
|
|
|
224
236
|
private async refreshOAuth2Token(
|
|
225
237
|
refreshToken: string
|
|
226
238
|
): Promise<XboxAuthenticationToken> {
|
|
239
|
+
const requestStart = DateTime.now();
|
|
227
240
|
const response = await this.httpClient.post<{
|
|
228
241
|
access_token: string;
|
|
229
242
|
expires_in: number;
|
|
@@ -244,11 +257,9 @@ export class XboxAuthenticationClient {
|
|
|
244
257
|
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
245
258
|
}
|
|
246
259
|
);
|
|
247
|
-
|
|
248
|
-
const responseDate = DateTime.fromRFC2822(response.headers["date"]);
|
|
249
260
|
return {
|
|
250
261
|
token: response.data.access_token,
|
|
251
|
-
expiresAt:
|
|
262
|
+
expiresAt: requestStart.plus({ seconds: response.data.expires_in }),
|
|
252
263
|
refreshToken: response.data.refresh_token,
|
|
253
264
|
};
|
|
254
265
|
}
|
|
@@ -57,6 +57,15 @@ function wrapPlayerId(playerId: string) {
|
|
|
57
57
|
}
|
|
58
58
|
}
|
|
59
59
|
|
|
60
|
+
function unwrapPlayerId(playerId: string) {
|
|
61
|
+
const match = /^\w+\((\d+)\)$/.exec(playerId);
|
|
62
|
+
if (match) {
|
|
63
|
+
return match[1];
|
|
64
|
+
} else {
|
|
65
|
+
return playerId;
|
|
66
|
+
}
|
|
67
|
+
}
|
|
68
|
+
|
|
60
69
|
export class HaloInfiniteClient {
|
|
61
70
|
constructor(private spartanTokenProvider: SpartanTokenProvider) {}
|
|
62
71
|
|
|
@@ -142,6 +151,18 @@ export class HaloInfiniteClient {
|
|
|
142
151
|
"get"
|
|
143
152
|
);
|
|
144
153
|
|
|
154
|
+
/** Get gamertag info for several players.
|
|
155
|
+
* @param xuids - Xuids to lookup.
|
|
156
|
+
*/
|
|
157
|
+
public getUsers = (xuids: string[]) => {
|
|
158
|
+
return this.executeRequest<UserInfo[]>(
|
|
159
|
+
`https://${HaloCoreEndpoints.Profile}.${
|
|
160
|
+
HaloCoreEndpoints.ServiceDomain
|
|
161
|
+
}/users?xuids=${xuids.map((x) => unwrapPlayerId(x)).join(",")}`,
|
|
162
|
+
"get"
|
|
163
|
+
);
|
|
164
|
+
};
|
|
165
|
+
|
|
145
166
|
/** Get service record for a player.
|
|
146
167
|
* @param gamerTag - Gamertag to lookup.
|
|
147
168
|
*/
|
|
@@ -5,6 +5,7 @@ import {
|
|
|
5
5
|
import { TokenPersister } from "../token-persisters";
|
|
6
6
|
import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
|
|
7
7
|
import { SpartanTokenProvider } from ".";
|
|
8
|
+
import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";
|
|
8
9
|
|
|
9
10
|
/**
|
|
10
11
|
* A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
|
|
@@ -20,6 +21,12 @@ export class AutoXstsSpartanTokenProvider implements SpartanTokenProvider {
|
|
|
20
21
|
getAuthCode: (authorizeUrl: string) => Promise<string>,
|
|
21
22
|
tokenPersister?: TokenPersister
|
|
22
23
|
) {
|
|
24
|
+
let actualTokenPersister: TokenPersister;
|
|
25
|
+
if (tokenPersister) {
|
|
26
|
+
actualTokenPersister = tokenPersister;
|
|
27
|
+
} else {
|
|
28
|
+
actualTokenPersister = inMemoryTokenPersister;
|
|
29
|
+
}
|
|
23
30
|
const xboxAuthClient = new XboxAuthenticationClient(
|
|
24
31
|
clientId,
|
|
25
32
|
redirectUri,
|
|
@@ -36,17 +43,9 @@ export class AutoXstsSpartanTokenProvider implements SpartanTokenProvider {
|
|
|
36
43
|
);
|
|
37
44
|
return xstsTicket.Token;
|
|
38
45
|
},
|
|
39
|
-
async () =>
|
|
40
|
-
if (tokenPersister) {
|
|
41
|
-
return await tokenPersister.load("halo.authToken");
|
|
42
|
-
} else {
|
|
43
|
-
return null;
|
|
44
|
-
}
|
|
45
|
-
},
|
|
46
|
+
async () => await actualTokenPersister.load("halo.authToken"),
|
|
46
47
|
async (token) => {
|
|
47
|
-
|
|
48
|
-
await tokenPersister.save("halo.authToken", token);
|
|
49
|
-
}
|
|
48
|
+
await actualTokenPersister.save("halo.authToken", token);
|
|
50
49
|
}
|
|
51
50
|
);
|
|
52
51
|
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { TokenPersister } from "../token-persisters";
|
|
2
2
|
import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
|
|
3
3
|
import { SpartanTokenProvider } from ".";
|
|
4
|
+
import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";
|
|
4
5
|
|
|
5
6
|
/**
|
|
6
7
|
* A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.
|
|
@@ -8,26 +9,24 @@ import { SpartanTokenProvider } from ".";
|
|
|
8
9
|
* HaloAuthenticationClient can be instantitated with a pre-fetched XSTS ticket
|
|
9
10
|
* and run on a server (such as one provided by the user).
|
|
10
11
|
*/
|
|
11
|
-
|
|
12
12
|
export class StaticXstsTicketTokenSpartanTokenProvider
|
|
13
13
|
implements SpartanTokenProvider
|
|
14
14
|
{
|
|
15
15
|
public readonly getSpartanToken: () => Promise<string>;
|
|
16
16
|
|
|
17
17
|
constructor(xstsTicketToken: string, tokenPersister?: TokenPersister) {
|
|
18
|
+
let actualTokenPersister: TokenPersister;
|
|
19
|
+
if (tokenPersister) {
|
|
20
|
+
actualTokenPersister = tokenPersister;
|
|
21
|
+
} else {
|
|
22
|
+
actualTokenPersister = inMemoryTokenPersister;
|
|
23
|
+
}
|
|
24
|
+
|
|
18
25
|
const haloAuthClient = new HaloAuthenticationClient(
|
|
19
26
|
() => xstsTicketToken,
|
|
20
|
-
async () =>
|
|
21
|
-
if (tokenPersister) {
|
|
22
|
-
return await tokenPersister.load("halo.authToken");
|
|
23
|
-
} else {
|
|
24
|
-
return null;
|
|
25
|
-
}
|
|
26
|
-
},
|
|
27
|
+
async () => await actualTokenPersister.load("halo.authToken"),
|
|
27
28
|
async (token) => {
|
|
28
|
-
|
|
29
|
-
await tokenPersister.save("halo.authToken", token);
|
|
30
|
-
}
|
|
29
|
+
await actualTokenPersister.save("halo.authToken", token);
|
|
31
30
|
}
|
|
32
31
|
);
|
|
33
32
|
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { TokenPersister } from ".";
|
|
2
|
+
|
|
3
|
+
const tokens = new Map<string, any>();
|
|
4
|
+
|
|
5
|
+
export const inMemoryTokenPersister: TokenPersister = {
|
|
6
|
+
load: (tokenName) => {
|
|
7
|
+
return tokens.get(tokenName);
|
|
8
|
+
},
|
|
9
|
+
save: (tokenName, token) => {
|
|
10
|
+
tokens.set(tokenName, token);
|
|
11
|
+
},
|
|
12
|
+
};
|