halo-infinite-api 5.1.1 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/.vscode/settings.json +3 -0
- package/dist/authentication/halo-authentication-client.d.ts +2 -1
- package/dist/authentication/halo-authentication-client.js +3 -3
- package/dist/authentication/halo-authentication-client.js.map +1 -1
- package/dist/authentication/xbox-authentication-client.d.ts +3 -2
- package/dist/authentication/xbox-authentication-client.js +13 -11
- package/dist/authentication/xbox-authentication-client.js.map +1 -1
- package/dist/core/halo-infinite-client.d.ts +3 -2
- package/dist/core/halo-infinite-client.js +4 -4
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/core/token-persisters/index.d.ts +4 -4
- package/dist/core/token-persisters/index.js +3 -1
- package/dist/core/token-persisters/index.js.map +1 -1
- package/dist/core/token-persisters/node-fs-token-persister.d.ts +1 -1
- package/dist/core/token-persisters/node-fs-token-persister.js +9 -6
- package/dist/core/token-persisters/node-fs-token-persister.js.map +1 -1
- package/dist/core/token-persisters/token-persister.d.ts +4 -0
- package/dist/core/token-persisters/token-persister.js +2 -0
- package/dist/core/token-persisters/token-persister.js.map +1 -0
- package/dist/core/token-providers/auto-token-provider.d.ts +2 -1
- package/dist/core/token-providers/auto-token-provider.js +12 -8
- package/dist/core/token-providers/auto-token-provider.js.map +1 -1
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.d.ts +1 -1
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js +2 -2
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map +1 -1
- package/dist/core/xbox-client.d.ts +4 -3
- package/dist/core/xbox-client.js +4 -4
- package/dist/core/xbox-client.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/util/fetch-function.d.ts +2 -0
- package/dist/util/fetch-function.js +5 -0
- package/dist/util/fetch-function.js.map +1 -0
- package/package.json +6 -1
- package/src/authentication/halo-authentication-client.ts +3 -4
- package/src/authentication/xbox-authentication-client.ts +22 -14
- package/src/core/halo-infinite-client.ts +5 -9
- package/src/core/token-persisters/index.ts +4 -4
- package/src/core/token-persisters/node-fs-token-persister.ts +16 -7
- package/src/core/token-persisters/token-persister.ts +4 -0
- package/src/core/token-providers/auto-token-provider.ts +18 -8
- package/src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts +8 -4
- package/src/core/xbox-client.ts +6 -10
- package/src/index.ts +2 -1
- package/src/util/fetch-function.ts +12 -0
|
@@ -1,4 +1,5 @@
|
|
|
1
1
|
import { DateTime } from "luxon";
|
|
2
|
+
import { FetchFunction } from "../util/fetch-function";
|
|
2
3
|
export interface Token {
|
|
3
4
|
token: string;
|
|
4
5
|
expiresAt: DateTime;
|
|
@@ -12,6 +13,6 @@ export declare class HaloAuthenticationClient {
|
|
|
12
13
|
constructor(fetchXstsToken: () => Promise<string> | string, loadToken: () => Promise<{
|
|
13
14
|
token: string;
|
|
14
15
|
expiresAt: unknown;
|
|
15
|
-
} | null>, saveToken: (token: Token) => Promise<void>, fetchFn?:
|
|
16
|
+
} | null>, saveToken: (token: Token) => Promise<void>, fetchFn?: FetchFunction);
|
|
16
17
|
getSpartanToken(): Promise<string>;
|
|
17
18
|
}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { DateTime } from "luxon";
|
|
2
2
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
3
|
+
import { defaultFetch } from "../util/fetch-function";
|
|
3
4
|
export class HaloAuthenticationClient {
|
|
4
5
|
fetchXstsToken;
|
|
5
6
|
loadToken;
|
|
@@ -17,7 +18,7 @@ export class HaloAuthenticationClient {
|
|
|
17
18
|
},
|
|
18
19
|
],
|
|
19
20
|
};
|
|
20
|
-
const
|
|
21
|
+
const result = await this.fetchFn("https://settings.svc.halowaypoint.com/spartan-token", {
|
|
21
22
|
method: "POST",
|
|
22
23
|
body: JSON.stringify(tokenRequest),
|
|
23
24
|
headers: {
|
|
@@ -25,7 +26,6 @@ export class HaloAuthenticationClient {
|
|
|
25
26
|
"Content-Type": "application/json; charset=utf-8",
|
|
26
27
|
},
|
|
27
28
|
});
|
|
28
|
-
const result = (await response.json());
|
|
29
29
|
const newToken = {
|
|
30
30
|
token: result.SpartanToken,
|
|
31
31
|
expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
|
|
@@ -33,7 +33,7 @@ export class HaloAuthenticationClient {
|
|
|
33
33
|
await this.saveToken(newToken);
|
|
34
34
|
return newToken;
|
|
35
35
|
}, () => this.loadToken());
|
|
36
|
-
constructor(fetchXstsToken, loadToken, saveToken, fetchFn =
|
|
36
|
+
constructor(fetchXstsToken, loadToken, saveToken, fetchFn = defaultFetch) {
|
|
37
37
|
this.fetchXstsToken = fetchXstsToken;
|
|
38
38
|
this.loadToken = loadToken;
|
|
39
39
|
this.saveToken = saveToken;
|
|
@@ -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;
|
|
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;AAOrE,MAAM,OAAO,wBAAwB;IAuChB;IACA;IAIA;IACA;IA5CX,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,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAC/B,qDAAqD,EACrD;YACE,MAAM,EAAE,MAAM;YACd,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,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,UAAyB,YAAY;QANrC,mBAAc,GAAd,cAAc,CAAgC;QAC9C,cAAS,GAAT,SAAS,CAGjB;QACQ,cAAS,GAAT,SAAS,CAAiC;QAC1C,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;CACF"}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DateTime } from "luxon";
|
|
2
2
|
import { TokenPersister } from "../core/token-persisters";
|
|
3
3
|
import { XboxTicket } from "../models/xbox-ticket";
|
|
4
|
+
import { FetchFunction } from "../util/fetch-function";
|
|
4
5
|
export declare enum RelyingParty {
|
|
5
6
|
Xbox = "http://xboxlive.com",
|
|
6
7
|
Halo = "https://prod.xsts.halowaypoint.com/"
|
|
@@ -11,11 +12,11 @@ export interface XboxAuthenticationToken {
|
|
|
11
12
|
refreshToken: string;
|
|
12
13
|
}
|
|
13
14
|
export declare class XboxAuthenticationClient {
|
|
14
|
-
private readonly
|
|
15
|
+
private readonly tokenPersisterOrPromise?;
|
|
15
16
|
private readonly fetchFn;
|
|
16
17
|
private userTokenCache;
|
|
17
18
|
private xstsTicketCache;
|
|
18
|
-
constructor(
|
|
19
|
+
constructor(tokenPersisterOrPromise?: TokenPersister | Promise<TokenPersister> | undefined, fetchFn?: FetchFunction);
|
|
19
20
|
getXstsTicket(getOauth2AccessToken: () => Promise<string>, relyingParty: RelyingParty): Promise<{
|
|
20
21
|
expiresAt: DateTime;
|
|
21
22
|
IssueInstant: string;
|
|
@@ -1,16 +1,17 @@
|
|
|
1
1
|
import { DateTime } from "luxon";
|
|
2
2
|
import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
|
|
3
3
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
4
|
+
import { defaultFetch } from "../util/fetch-function";
|
|
4
5
|
export var RelyingParty;
|
|
5
6
|
(function (RelyingParty) {
|
|
6
7
|
RelyingParty["Xbox"] = "http://xboxlive.com";
|
|
7
8
|
RelyingParty["Halo"] = "https://prod.xsts.halowaypoint.com/";
|
|
8
9
|
})(RelyingParty || (RelyingParty = {}));
|
|
9
10
|
export class XboxAuthenticationClient {
|
|
10
|
-
|
|
11
|
+
tokenPersisterOrPromise;
|
|
11
12
|
fetchFn;
|
|
12
13
|
userTokenCache = new ExpiryTokenCache(async (accessToken) => {
|
|
13
|
-
const
|
|
14
|
+
const result = await this.fetchFn("https://user.auth.xboxlive.com/user/authenticate", {
|
|
14
15
|
method: "POST",
|
|
15
16
|
headers: {
|
|
16
17
|
"Content-Type": "application/json",
|
|
@@ -27,16 +28,18 @@ export class XboxAuthenticationClient {
|
|
|
27
28
|
},
|
|
28
29
|
}),
|
|
29
30
|
});
|
|
30
|
-
const result = (await response.json());
|
|
31
31
|
const token = {
|
|
32
32
|
...result,
|
|
33
33
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
34
34
|
};
|
|
35
|
-
await this.
|
|
35
|
+
await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
|
|
36
36
|
return token;
|
|
37
|
-
}, async () =>
|
|
37
|
+
}, async () => {
|
|
38
|
+
const tokenPersister = await this.tokenPersisterOrPromise;
|
|
39
|
+
return ((await tokenPersister?.load("xbox.userToken")) ?? null);
|
|
40
|
+
});
|
|
38
41
|
xstsTicketCache = new KeyedExpiryTokenCache(async (relyingParty, userToken) => {
|
|
39
|
-
const
|
|
42
|
+
const result = await this.fetchFn("https://xsts.auth.xboxlive.com/xsts/authorize", {
|
|
40
43
|
method: "POST",
|
|
41
44
|
headers: {
|
|
42
45
|
"Content-Type": "application/json",
|
|
@@ -52,16 +55,15 @@ export class XboxAuthenticationClient {
|
|
|
52
55
|
},
|
|
53
56
|
}),
|
|
54
57
|
});
|
|
55
|
-
const result = (await response.json());
|
|
56
58
|
const token = {
|
|
57
59
|
...result,
|
|
58
60
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
59
61
|
};
|
|
60
|
-
await this.
|
|
62
|
+
await (await this.tokenPersisterOrPromise)?.save("xbox.xstsTicket." + relyingParty, token);
|
|
61
63
|
return token;
|
|
62
|
-
}, async (relyingParty) => (await this.
|
|
63
|
-
constructor(
|
|
64
|
-
this.
|
|
64
|
+
}, async (relyingParty) => (await (await this.tokenPersisterOrPromise)?.load("xbox.xstsTicket." + relyingParty)) ?? null);
|
|
65
|
+
constructor(tokenPersisterOrPromise, fetchFn = defaultFetch) {
|
|
66
|
+
this.tokenPersisterOrPromise = tokenPersisterOrPromise;
|
|
65
67
|
this.fetchFn = fetchFn;
|
|
66
68
|
}
|
|
67
69
|
async getXstsTicket(getOauth2AccessToken, relyingParty) {
|
|
@@ -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;
|
|
1
|
+
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FetchFunction } from "../util/fetch-function";
|
|
1
2
|
import { MapAsset, PlaylistAsset, UgcGameVariantAsset } from "../models/halo-infinite/asset";
|
|
2
3
|
import { AssetKind } from "../models/halo-infinite/asset-kind";
|
|
3
4
|
import { MatchSkill } from "../models/halo-infinite/match-skill";
|
|
@@ -20,9 +21,9 @@ export type AssetKindTypeMap = {
|
|
|
20
21
|
[AssetKind.Playlist]: PlaylistAsset;
|
|
21
22
|
};
|
|
22
23
|
export declare class HaloInfiniteClient {
|
|
23
|
-
private spartanTokenProvider;
|
|
24
|
+
private readonly spartanTokenProvider;
|
|
24
25
|
private readonly fetchFn;
|
|
25
|
-
constructor(spartanTokenProvider: SpartanTokenProvider, fetchFn?:
|
|
26
|
+
constructor(spartanTokenProvider: SpartanTokenProvider, fetchFn?: FetchFunction);
|
|
26
27
|
private executeRequest;
|
|
27
28
|
private executeResultsRequest;
|
|
28
29
|
private executePaginationRequest;
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { defaultFetch } from "../util/fetch-function";
|
|
1
2
|
import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
|
|
2
3
|
import { AssetKind } from "../models/halo-infinite/asset-kind";
|
|
3
4
|
import { MatchType } from "../models/halo-infinite/match-type";
|
|
@@ -28,9 +29,9 @@ function unwrapPlayerId(playerId) {
|
|
|
28
29
|
export class HaloInfiniteClient {
|
|
29
30
|
spartanTokenProvider;
|
|
30
31
|
fetchFn;
|
|
31
|
-
constructor(spartanTokenProvider, fetchFn) {
|
|
32
|
+
constructor(spartanTokenProvider, fetchFn = defaultFetch) {
|
|
32
33
|
this.spartanTokenProvider = spartanTokenProvider;
|
|
33
|
-
this.fetchFn = fetchFn
|
|
34
|
+
this.fetchFn = fetchFn;
|
|
34
35
|
}
|
|
35
36
|
async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
|
|
36
37
|
const headers = {
|
|
@@ -44,11 +45,10 @@ export class HaloInfiniteClient {
|
|
|
44
45
|
if (useClearance) {
|
|
45
46
|
throw new Error("TODO: Implement clearance");
|
|
46
47
|
}
|
|
47
|
-
const
|
|
48
|
+
const result = await this.fetchFn(url, {
|
|
48
49
|
method,
|
|
49
50
|
headers,
|
|
50
51
|
});
|
|
51
|
-
const result = (await response.json());
|
|
52
52
|
return result;
|
|
53
53
|
}
|
|
54
54
|
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,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAMrE,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;AA0B1D,MAAM,eAAe,GAAG;IACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM;IACvB,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,iBAAiB;IAC7C,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW;CAGlC,CAAC;AAEF,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAChC,OAAO,QAAQ,CAAC;KACjB;SAAM;QACL,cAAc;QACd,OAAO,QAAQ,QAAQ,GAAG,CAAC;KAC5B;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,KAAK,EAAE;QACT,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;KACjB;SAAM;QACL,OAAO,QAAQ,CAAC;KACjB;AACH,CAAC;AAED,MAAM,OAAO,kBAAkB;
|
|
1
|
+
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
1
|
+
export { TokenPersister } from "./token-persister";
|
|
2
|
+
export { localStorageTokenPersister } from "./local-storage-token-persister";
|
|
3
|
+
export { nodeFsTokenPersister } from "./node-fs-token-persister";
|
|
4
|
+
export { inMemoryTokenPersister } from "./in-memory-token-persister";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/token-persisters/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/token-persisters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { TokenPersister } from ".";
|
|
1
|
+
import type { TokenPersister } from ".";
|
|
2
2
|
export declare const nodeFsTokenPersister: TokenPersister;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import fs from "fs/promises";
|
|
2
1
|
export const nodeFsTokenPersister = {
|
|
3
2
|
load: async (tokenName) => {
|
|
4
|
-
const
|
|
3
|
+
const tokenDir = process.env.TOKEN_ROOT ||
|
|
4
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
5
5
|
try {
|
|
6
|
-
const json = await fs.readFile(
|
|
6
|
+
const json = await (await import("fs/promises")).readFile(`${tokenDir}/${tokenName}`, {
|
|
7
|
+
encoding: "utf-8",
|
|
8
|
+
});
|
|
7
9
|
return JSON.parse(json);
|
|
8
10
|
}
|
|
9
11
|
catch (e) {
|
|
@@ -16,9 +18,10 @@ export const nodeFsTokenPersister = {
|
|
|
16
18
|
}
|
|
17
19
|
},
|
|
18
20
|
save: async (tokenName, token) => {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
await fs.
|
|
21
|
+
const tokenDir = process.env.TOKEN_ROOT ||
|
|
22
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
23
|
+
await (await import("fs/promises")).mkdir(tokenDir, { recursive: true });
|
|
24
|
+
await (await import("fs/promises")).writeFile(`${tokenDir}/${tokenName}`, JSON.stringify(token));
|
|
22
25
|
},
|
|
23
26
|
};
|
|
24
27
|
//# 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":"
|
|
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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/token-persister.ts"],"names":[],"mappings":""}
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { TokenPersister } from "../token-persisters";
|
|
2
2
|
import { SpartanTokenProvider } from "./spartan-token-providers";
|
|
3
3
|
import { XboxTokenProvider } from "./xbox-token-provider";
|
|
4
|
+
import { FetchFunction } from "src/util/fetch-function";
|
|
4
5
|
/**
|
|
5
6
|
* A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
|
|
6
7
|
* process. This is useful for applications that do not need to contend with
|
|
@@ -9,5 +10,5 @@ import { XboxTokenProvider } from "./xbox-token-provider";
|
|
|
9
10
|
export declare class AutoTokenProvider implements SpartanTokenProvider, XboxTokenProvider {
|
|
10
11
|
readonly getSpartanToken: () => Promise<string>;
|
|
11
12
|
readonly getXboxLiveV3Token: () => Promise<string>;
|
|
12
|
-
constructor(getOauth2AccessToken: () => Promise<string>, tokenPersister?: TokenPersister);
|
|
13
|
+
constructor(getOauth2AccessToken: () => Promise<string>, tokenPersister?: TokenPersister | Promise<TokenPersister>, fetchFn?: FetchFunction);
|
|
13
14
|
}
|
|
@@ -9,21 +9,25 @@ import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-pers
|
|
|
9
9
|
export class AutoTokenProvider {
|
|
10
10
|
getSpartanToken;
|
|
11
11
|
getXboxLiveV3Token;
|
|
12
|
-
constructor(getOauth2AccessToken, tokenPersister) {
|
|
13
|
-
let
|
|
12
|
+
constructor(getOauth2AccessToken, tokenPersister, fetchFn) {
|
|
13
|
+
let tokenPeristerOrPromise;
|
|
14
14
|
if (tokenPersister) {
|
|
15
|
-
|
|
15
|
+
tokenPeristerOrPromise = tokenPersister;
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
|
-
|
|
18
|
+
tokenPeristerOrPromise = inMemoryTokenPersister;
|
|
19
19
|
}
|
|
20
|
-
const xboxAuthClient = new XboxAuthenticationClient(tokenPersister);
|
|
20
|
+
const xboxAuthClient = new XboxAuthenticationClient(tokenPersister, fetchFn);
|
|
21
21
|
const haloAuthClient = new HaloAuthenticationClient(async () => {
|
|
22
22
|
const xstsTicket = await xboxAuthClient.getXstsTicket(getOauth2AccessToken, RelyingParty.Halo);
|
|
23
23
|
return xstsTicket.Token;
|
|
24
|
-
}, async () =>
|
|
25
|
-
await
|
|
26
|
-
|
|
24
|
+
}, async () => {
|
|
25
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
26
|
+
return await tokenPersister.load("halo.authToken");
|
|
27
|
+
}, async (token) => {
|
|
28
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
29
|
+
await tokenPersister.save("halo.authToken", token);
|
|
30
|
+
}, fetchFn);
|
|
27
31
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
28
32
|
this.getXboxLiveV3Token = async () => {
|
|
29
33
|
const xstsTicket = await xboxAuthClient.getXstsTicket(getOauth2AccessToken, RelyingParty.Xbox);
|
|
@@ -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;
|
|
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;IACJ,CAAC;CACF"}
|
|
@@ -8,5 +8,5 @@ import { SpartanTokenProvider } from ".";
|
|
|
8
8
|
*/
|
|
9
9
|
export declare class StaticXstsTicketTokenSpartanTokenProvider implements SpartanTokenProvider {
|
|
10
10
|
readonly getSpartanToken: () => Promise<string>;
|
|
11
|
-
constructor(xstsTicketToken: string, tokenPersister?: TokenPersister);
|
|
11
|
+
constructor(xstsTicketToken: string, tokenPersister?: TokenPersister | Promise<TokenPersister>);
|
|
12
12
|
}
|
|
@@ -16,8 +16,8 @@ export class StaticXstsTicketTokenSpartanTokenProvider {
|
|
|
16
16
|
else {
|
|
17
17
|
actualTokenPersister = inMemoryTokenPersister;
|
|
18
18
|
}
|
|
19
|
-
const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
|
|
20
|
-
await actualTokenPersister.save("halo.authToken", token);
|
|
19
|
+
const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => (await (await actualTokenPersister).load("halo.authToken")) ?? null, async (token) => {
|
|
20
|
+
await (await actualTokenPersister).save("halo.authToken", token);
|
|
21
21
|
});
|
|
22
22
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
23
23
|
}
|
|
@@ -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,
|
|
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;IAChE,CAAC;CACF"}
|
|
@@ -1,14 +1,15 @@
|
|
|
1
|
+
import { FetchFunction } from "../util/fetch-function";
|
|
1
2
|
import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
|
|
2
3
|
export declare class XboxClient {
|
|
3
|
-
private xboxTokenProvider;
|
|
4
|
+
private readonly xboxTokenProvider;
|
|
4
5
|
private readonly fetchFn;
|
|
5
|
-
constructor(xboxTokenProvider: XboxTokenProvider, fetchFn?:
|
|
6
|
+
constructor(xboxTokenProvider: XboxTokenProvider, fetchFn?: FetchFunction);
|
|
6
7
|
private executeRequest;
|
|
7
8
|
searchUsers(query: string): Promise<{
|
|
8
9
|
id: string;
|
|
9
10
|
gamertag: string;
|
|
10
11
|
displayPicUri: string;
|
|
11
|
-
score:
|
|
12
|
+
score: number;
|
|
12
13
|
}[]>;
|
|
13
14
|
recentPlayers(): Promise<unknown>;
|
|
14
15
|
}
|
package/dist/core/xbox-client.js
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
|
+
import { defaultFetch } from "../util/fetch-function";
|
|
1
2
|
export class XboxClient {
|
|
2
3
|
xboxTokenProvider;
|
|
3
4
|
fetchFn;
|
|
4
|
-
constructor(xboxTokenProvider, fetchFn) {
|
|
5
|
+
constructor(xboxTokenProvider, fetchFn = defaultFetch) {
|
|
5
6
|
this.xboxTokenProvider = xboxTokenProvider;
|
|
6
|
-
this.fetchFn = fetchFn
|
|
7
|
+
this.fetchFn = fetchFn;
|
|
7
8
|
}
|
|
8
9
|
async executeRequest(url, method) {
|
|
9
|
-
const
|
|
10
|
+
const result = await this.fetchFn(url, {
|
|
10
11
|
method,
|
|
11
12
|
headers: {
|
|
12
13
|
Accept: "application/json",
|
|
@@ -14,7 +15,6 @@ export class XboxClient {
|
|
|
14
15
|
"x-xbl-contract-version": "1",
|
|
15
16
|
},
|
|
16
17
|
});
|
|
17
|
-
const result = (await response.json());
|
|
18
18
|
return result;
|
|
19
19
|
}
|
|
20
20
|
async searchUsers(query) {
|
|
@@ -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":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAGrE,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,MAA6B;QACxE,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE;YACxC,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,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/dist/index.d.ts
CHANGED
|
@@ -19,5 +19,6 @@ export { MatchInfo } from "./models/halo-infinite/match-info";
|
|
|
19
19
|
export { SpartanTokenProvider } from "./core/token-providers/spartan-token-providers";
|
|
20
20
|
export { AutoTokenProvider, AutoTokenProvider as AutoXstsSpartanTokenProvider, } from "./core/token-providers/auto-token-provider";
|
|
21
21
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
22
|
-
export { TokenPersister } from "./core/token-persisters";
|
|
22
|
+
export { TokenPersister } from "./core/token-persisters/token-persister";
|
|
23
23
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
24
|
+
export { FetchFunction } from "./util/fetch-function";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"fetch-function.js","sourceRoot":"","sources":["../../src/util/fetch-function.ts"],"names":[],"mappings":"AAKA,MAAM,CAAC,MAAM,YAAY,GAAG,KAAK,EAC/B,KAAwB,EACxB,IAAkB,EACE,EAAE;IACtB,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC;IAC1C,OAAO,QAAQ,CAAC,IAAI,EAAE,CAAC;AACzB,CAAC,CAAC"}
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "halo-infinite-api",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.2.0",
|
|
5
5
|
"description": "An NPM package for accessing the official Halo Infinite API.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js",
|
|
9
|
+
"./token-persisters": "./dist/core/token-persisters/index.js"
|
|
10
|
+
},
|
|
7
11
|
"scripts": {
|
|
8
12
|
"prepack": "tsc --project tsconfig.app.json"
|
|
9
13
|
},
|
|
@@ -34,6 +38,7 @@
|
|
|
34
38
|
},
|
|
35
39
|
"dependencies": {
|
|
36
40
|
"@azure/msal-node": "^2.2.0",
|
|
41
|
+
"axios": "^1.6.2",
|
|
37
42
|
"expiry-map": "^2.0.0",
|
|
38
43
|
"luxon": "^3.3.0",
|
|
39
44
|
"pkce-challenge": "^3.1.0",
|
|
@@ -2,6 +2,7 @@ import { DateTime } from "luxon";
|
|
|
2
2
|
import type { SpartanToken } from "../models/spartan-token";
|
|
3
3
|
import type { SpartanTokenRequest } from "../models/spartan-token-request";
|
|
4
4
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
5
|
+
import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
5
6
|
|
|
6
7
|
export interface Token {
|
|
7
8
|
token: string;
|
|
@@ -23,7 +24,7 @@ export class HaloAuthenticationClient {
|
|
|
23
24
|
},
|
|
24
25
|
],
|
|
25
26
|
};
|
|
26
|
-
const
|
|
27
|
+
const result = await this.fetchFn<SpartanToken>(
|
|
27
28
|
"https://settings.svc.halowaypoint.com/spartan-token",
|
|
28
29
|
{
|
|
29
30
|
method: "POST",
|
|
@@ -36,8 +37,6 @@ export class HaloAuthenticationClient {
|
|
|
36
37
|
}
|
|
37
38
|
);
|
|
38
39
|
|
|
39
|
-
const result = (await response.json()) as SpartanToken;
|
|
40
|
-
|
|
41
40
|
const newToken = {
|
|
42
41
|
token: result.SpartanToken,
|
|
43
42
|
expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
|
|
@@ -55,7 +54,7 @@ export class HaloAuthenticationClient {
|
|
|
55
54
|
expiresAt: unknown;
|
|
56
55
|
} | null>,
|
|
57
56
|
private readonly saveToken: (token: Token) => Promise<void>,
|
|
58
|
-
private readonly fetchFn:
|
|
57
|
+
private readonly fetchFn: FetchFunction = defaultFetch
|
|
59
58
|
) {}
|
|
60
59
|
|
|
61
60
|
public async getSpartanToken() {
|
|
@@ -3,6 +3,7 @@ import { TokenPersister } from "../core/token-persisters";
|
|
|
3
3
|
import { XboxTicket } from "../models/xbox-ticket";
|
|
4
4
|
import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
|
|
5
5
|
import { ExpiryTokenCache } from "../util/expiry-token-cache";
|
|
6
|
+
import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
6
7
|
|
|
7
8
|
export enum RelyingParty {
|
|
8
9
|
Xbox = "http://xboxlive.com",
|
|
@@ -18,7 +19,7 @@ export interface XboxAuthenticationToken {
|
|
|
18
19
|
export class XboxAuthenticationClient {
|
|
19
20
|
private userTokenCache = new ExpiryTokenCache(
|
|
20
21
|
async (accessToken: string) => {
|
|
21
|
-
const
|
|
22
|
+
const result = await this.fetchFn<XboxTicket>(
|
|
22
23
|
"https://user.auth.xboxlive.com/user/authenticate",
|
|
23
24
|
{
|
|
24
25
|
method: "POST",
|
|
@@ -39,23 +40,25 @@ export class XboxAuthenticationClient {
|
|
|
39
40
|
}
|
|
40
41
|
);
|
|
41
42
|
|
|
42
|
-
const result = (await response.json()) as XboxTicket;
|
|
43
|
-
|
|
44
43
|
const token = {
|
|
45
44
|
...result,
|
|
46
45
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
47
46
|
};
|
|
48
|
-
await this.
|
|
47
|
+
await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
|
|
49
48
|
return token;
|
|
50
49
|
},
|
|
51
|
-
async () =>
|
|
52
|
-
|
|
53
|
-
|
|
54
|
-
|
|
50
|
+
async () => {
|
|
51
|
+
const tokenPersister = await this.tokenPersisterOrPromise;
|
|
52
|
+
return (
|
|
53
|
+
(await tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
|
|
54
|
+
"xbox.userToken"
|
|
55
|
+
)) ?? null
|
|
56
|
+
);
|
|
57
|
+
}
|
|
55
58
|
);
|
|
56
59
|
private xstsTicketCache = new KeyedExpiryTokenCache(
|
|
57
60
|
async (relyingParty: RelyingParty, userToken: string) => {
|
|
58
|
-
const
|
|
61
|
+
const result = await this.fetchFn<XboxTicket>(
|
|
59
62
|
"https://xsts.auth.xboxlive.com/xsts/authorize",
|
|
60
63
|
{
|
|
61
64
|
method: "POST",
|
|
@@ -74,24 +77,29 @@ export class XboxAuthenticationClient {
|
|
|
74
77
|
}),
|
|
75
78
|
}
|
|
76
79
|
);
|
|
77
|
-
const result = (await response.json()) as XboxTicket;
|
|
78
80
|
|
|
79
81
|
const token = {
|
|
80
82
|
...result,
|
|
81
83
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
82
84
|
};
|
|
83
|
-
await
|
|
85
|
+
await (
|
|
86
|
+
await this.tokenPersisterOrPromise
|
|
87
|
+
)?.save("xbox.xstsTicket." + relyingParty, token);
|
|
84
88
|
return token;
|
|
85
89
|
},
|
|
86
90
|
async (relyingParty) =>
|
|
87
|
-
(await
|
|
91
|
+
(await (
|
|
92
|
+
await this.tokenPersisterOrPromise
|
|
93
|
+
)?.load<XboxTicket & { expiresAt: unknown }>(
|
|
88
94
|
"xbox.xstsTicket." + relyingParty
|
|
89
95
|
)) ?? null
|
|
90
96
|
);
|
|
91
97
|
|
|
92
98
|
constructor(
|
|
93
|
-
private readonly
|
|
94
|
-
|
|
99
|
+
private readonly tokenPersisterOrPromise?:
|
|
100
|
+
| TokenPersister
|
|
101
|
+
| Promise<TokenPersister>,
|
|
102
|
+
private readonly fetchFn: FetchFunction = defaultFetch
|
|
95
103
|
) {}
|
|
96
104
|
|
|
97
105
|
public async getXstsTicket(
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
1
2
|
import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
|
|
2
3
|
import {
|
|
3
4
|
MapAsset,
|
|
@@ -66,13 +67,10 @@ function unwrapPlayerId(playerId: string) {
|
|
|
66
67
|
}
|
|
67
68
|
|
|
68
69
|
export class HaloInfiniteClient {
|
|
69
|
-
private readonly fetchFn: typeof fetch;
|
|
70
70
|
constructor(
|
|
71
|
-
private spartanTokenProvider: SpartanTokenProvider,
|
|
72
|
-
fetchFn
|
|
73
|
-
) {
|
|
74
|
-
this.fetchFn = fetchFn ?? fetch;
|
|
75
|
-
}
|
|
71
|
+
private readonly spartanTokenProvider: SpartanTokenProvider,
|
|
72
|
+
private readonly fetchFn: FetchFunction = defaultFetch
|
|
73
|
+
) {}
|
|
76
74
|
|
|
77
75
|
private async executeRequest<T>(
|
|
78
76
|
url: string,
|
|
@@ -95,13 +93,11 @@ export class HaloInfiniteClient {
|
|
|
95
93
|
throw new Error("TODO: Implement clearance");
|
|
96
94
|
}
|
|
97
95
|
|
|
98
|
-
const
|
|
96
|
+
const result = await this.fetchFn<T>(url, {
|
|
99
97
|
method,
|
|
100
98
|
headers,
|
|
101
99
|
});
|
|
102
100
|
|
|
103
|
-
const result = (await response.json()) as T;
|
|
104
|
-
|
|
105
101
|
return result;
|
|
106
102
|
}
|
|
107
103
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
1
|
+
export { TokenPersister } from "./token-persister";
|
|
2
|
+
export { localStorageTokenPersister } from "./local-storage-token-persister";
|
|
3
|
+
export { nodeFsTokenPersister } from "./node-fs-token-persister";
|
|
4
|
+
export { inMemoryTokenPersister } from "./in-memory-token-persister";
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { TokenPersister } from ".";
|
|
1
|
+
import type { TokenPersister } from ".";
|
|
3
2
|
|
|
4
3
|
export const nodeFsTokenPersister: TokenPersister = {
|
|
5
4
|
load: async (tokenName) => {
|
|
6
|
-
const
|
|
5
|
+
const tokenDir =
|
|
6
|
+
process.env.TOKEN_ROOT ||
|
|
7
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
7
8
|
try {
|
|
8
|
-
const json = await
|
|
9
|
+
const json = await (
|
|
10
|
+
await import("fs/promises")
|
|
11
|
+
).readFile(`${tokenDir}/${tokenName}`, {
|
|
12
|
+
encoding: "utf-8",
|
|
13
|
+
});
|
|
9
14
|
return JSON.parse(json);
|
|
10
15
|
} catch (e) {
|
|
11
16
|
if (e && typeof e === "object" && "code" in e && e.code === "ENOENT") {
|
|
@@ -16,8 +21,12 @@ export const nodeFsTokenPersister: TokenPersister = {
|
|
|
16
21
|
}
|
|
17
22
|
},
|
|
18
23
|
save: async (tokenName, token) => {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
const tokenDir =
|
|
25
|
+
process.env.TOKEN_ROOT ||
|
|
26
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
27
|
+
await (await import("fs/promises")).mkdir(tokenDir, { recursive: true });
|
|
28
|
+
await (
|
|
29
|
+
await import("fs/promises")
|
|
30
|
+
).writeFile(`${tokenDir}/${tokenName}`, JSON.stringify(token));
|
|
22
31
|
},
|
|
23
32
|
};
|
|
@@ -7,6 +7,7 @@ import { HaloAuthenticationClient } from "../../authentication/halo-authenticati
|
|
|
7
7
|
import { SpartanTokenProvider } from "./spartan-token-providers";
|
|
8
8
|
import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";
|
|
9
9
|
import { XboxTokenProvider } from "./xbox-token-provider";
|
|
10
|
+
import { FetchFunction } from "src/util/fetch-function";
|
|
10
11
|
|
|
11
12
|
/**
|
|
12
13
|
* A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
|
|
@@ -21,15 +22,19 @@ export class AutoTokenProvider
|
|
|
21
22
|
|
|
22
23
|
constructor(
|
|
23
24
|
getOauth2AccessToken: () => Promise<string>,
|
|
24
|
-
tokenPersister?: TokenPersister
|
|
25
|
+
tokenPersister?: TokenPersister | Promise<TokenPersister>,
|
|
26
|
+
fetchFn?: FetchFunction
|
|
25
27
|
) {
|
|
26
|
-
let
|
|
28
|
+
let tokenPeristerOrPromise: TokenPersister | Promise<TokenPersister>;
|
|
27
29
|
if (tokenPersister) {
|
|
28
|
-
|
|
30
|
+
tokenPeristerOrPromise = tokenPersister;
|
|
29
31
|
} else {
|
|
30
|
-
|
|
32
|
+
tokenPeristerOrPromise = inMemoryTokenPersister;
|
|
31
33
|
}
|
|
32
|
-
const xboxAuthClient = new XboxAuthenticationClient(
|
|
34
|
+
const xboxAuthClient = new XboxAuthenticationClient(
|
|
35
|
+
tokenPersister,
|
|
36
|
+
fetchFn
|
|
37
|
+
);
|
|
33
38
|
const haloAuthClient = new HaloAuthenticationClient(
|
|
34
39
|
async () => {
|
|
35
40
|
const xstsTicket = await xboxAuthClient.getXstsTicket(
|
|
@@ -38,10 +43,15 @@ export class AutoTokenProvider
|
|
|
38
43
|
);
|
|
39
44
|
return xstsTicket.Token;
|
|
40
45
|
},
|
|
41
|
-
async () =>
|
|
46
|
+
async () => {
|
|
47
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
48
|
+
return await tokenPersister.load("halo.authToken");
|
|
49
|
+
},
|
|
42
50
|
async (token) => {
|
|
43
|
-
await
|
|
44
|
-
|
|
51
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
52
|
+
await tokenPersister.save("halo.authToken", token);
|
|
53
|
+
},
|
|
54
|
+
fetchFn
|
|
45
55
|
);
|
|
46
56
|
|
|
47
57
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
@@ -14,8 +14,11 @@ export class StaticXstsTicketTokenSpartanTokenProvider
|
|
|
14
14
|
{
|
|
15
15
|
public readonly getSpartanToken: () => Promise<string>;
|
|
16
16
|
|
|
17
|
-
constructor(
|
|
18
|
-
|
|
17
|
+
constructor(
|
|
18
|
+
xstsTicketToken: string,
|
|
19
|
+
tokenPersister?: TokenPersister | Promise<TokenPersister>
|
|
20
|
+
) {
|
|
21
|
+
let actualTokenPersister: TokenPersister | Promise<TokenPersister>;
|
|
19
22
|
if (tokenPersister) {
|
|
20
23
|
actualTokenPersister = tokenPersister;
|
|
21
24
|
} else {
|
|
@@ -24,9 +27,10 @@ export class StaticXstsTicketTokenSpartanTokenProvider
|
|
|
24
27
|
|
|
25
28
|
const haloAuthClient = new HaloAuthenticationClient(
|
|
26
29
|
() => xstsTicketToken,
|
|
27
|
-
async () =>
|
|
30
|
+
async () =>
|
|
31
|
+
(await (await actualTokenPersister).load("halo.authToken")) ?? null,
|
|
28
32
|
async (token) => {
|
|
29
|
-
await actualTokenPersister.save("halo.authToken", token);
|
|
33
|
+
await (await actualTokenPersister).save("halo.authToken", token);
|
|
30
34
|
}
|
|
31
35
|
);
|
|
32
36
|
|
package/src/core/xbox-client.ts
CHANGED
|
@@ -1,16 +1,14 @@
|
|
|
1
|
+
import { FetchFunction, defaultFetch } from "../util/fetch-function";
|
|
1
2
|
import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
|
|
2
3
|
|
|
3
4
|
export class XboxClient {
|
|
4
|
-
private readonly fetchFn: typeof fetch;
|
|
5
5
|
constructor(
|
|
6
|
-
private xboxTokenProvider: XboxTokenProvider,
|
|
7
|
-
fetchFn
|
|
8
|
-
) {
|
|
9
|
-
this.fetchFn = fetchFn ?? fetch;
|
|
10
|
-
}
|
|
6
|
+
private readonly xboxTokenProvider: XboxTokenProvider,
|
|
7
|
+
private readonly fetchFn: FetchFunction = defaultFetch
|
|
8
|
+
) {}
|
|
11
9
|
|
|
12
10
|
private async executeRequest<T>(url: string, method: RequestInit["method"]) {
|
|
13
|
-
const
|
|
11
|
+
const result = await this.fetchFn<T>(url, {
|
|
14
12
|
method,
|
|
15
13
|
headers: {
|
|
16
14
|
Accept: "application/json",
|
|
@@ -19,8 +17,6 @@ export class XboxClient {
|
|
|
19
17
|
},
|
|
20
18
|
});
|
|
21
19
|
|
|
22
|
-
const result = (await response.json()) as T;
|
|
23
|
-
|
|
24
20
|
return result;
|
|
25
21
|
}
|
|
26
22
|
|
|
@@ -32,7 +28,7 @@ export class XboxClient {
|
|
|
32
28
|
id: string;
|
|
33
29
|
gamertag: string;
|
|
34
30
|
displayPicUri: string;
|
|
35
|
-
score:
|
|
31
|
+
score: number;
|
|
36
32
|
};
|
|
37
33
|
text: string;
|
|
38
34
|
}
|
package/src/index.ts
CHANGED
|
@@ -28,5 +28,6 @@ export {
|
|
|
28
28
|
AutoTokenProvider as AutoXstsSpartanTokenProvider,
|
|
29
29
|
} from "./core/token-providers/auto-token-provider";
|
|
30
30
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
31
|
-
export { TokenPersister } from "./core/token-persisters";
|
|
31
|
+
export { TokenPersister } from "./core/token-persisters/token-persister";
|
|
32
32
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
33
|
+
export { FetchFunction } from "./util/fetch-function";
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
export type FetchFunction = <TResponse = unknown>(
|
|
2
|
+
input: RequestInfo | URL,
|
|
3
|
+
init?: RequestInit
|
|
4
|
+
) => Promise<TResponse>;
|
|
5
|
+
|
|
6
|
+
export const defaultFetch = async <TResponse>(
|
|
7
|
+
input: RequestInfo | URL,
|
|
8
|
+
init?: RequestInit
|
|
9
|
+
): Promise<TResponse> => {
|
|
10
|
+
const response = await fetch(input, init);
|
|
11
|
+
return response.json();
|
|
12
|
+
};
|