halo-infinite-api 5.1.0 → 5.1.2
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 +4 -3
- package/dist/authentication/halo-authentication-client.js.map +1 -1
- package/dist/authentication/xbox-authentication-client.d.ts +2 -1
- package/dist/authentication/xbox-authentication-client.js +4 -5
- 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-providers/auto-token-provider.d.ts +2 -1
- package/dist/core/token-providers/auto-token-provider.js +3 -3
- package/dist/core/token-providers/auto-token-provider.js.map +1 -1
- package/dist/core/xbox-client.d.ts +3 -2
- package/dist/core/xbox-client.js +4 -4
- package/dist/core/xbox-client.js.map +1 -1
- package/dist/index.d.ts +1 -0
- 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 +2 -1
- package/src/authentication/halo-authentication-client.ts +4 -4
- package/src/authentication/xbox-authentication-client.ts +4 -6
- package/src/core/halo-infinite-client.ts +5 -9
- package/src/core/token-providers/auto-token-provider.ts +9 -3
- package/src/core/xbox-client.ts +5 -9
- package/src/index.ts +1 -0
- 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,14 +18,14 @@ export class HaloAuthenticationClient {
|
|
|
17
18
|
},
|
|
18
19
|
],
|
|
19
20
|
};
|
|
20
|
-
const
|
|
21
|
+
const result = await this.fetchFn("https://settings.svc.halowaypoint.com/spartan-token", {
|
|
22
|
+
method: "POST",
|
|
21
23
|
body: JSON.stringify(tokenRequest),
|
|
22
24
|
headers: {
|
|
23
25
|
"User-Agent": "HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
|
|
24
26
|
"Content-Type": "application/json; charset=utf-8",
|
|
25
27
|
},
|
|
26
28
|
});
|
|
27
|
-
const result = (await response.json());
|
|
28
29
|
const newToken = {
|
|
29
30
|
token: result.SpartanToken,
|
|
30
31
|
expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
|
|
@@ -32,7 +33,7 @@ export class HaloAuthenticationClient {
|
|
|
32
33
|
await this.saveToken(newToken);
|
|
33
34
|
return newToken;
|
|
34
35
|
}, () => this.loadToken());
|
|
35
|
-
constructor(fetchXstsToken, loadToken, saveToken, fetchFn =
|
|
36
|
+
constructor(fetchXstsToken, loadToken, saveToken, fetchFn = defaultFetch) {
|
|
36
37
|
this.fetchXstsToken = fetchXstsToken;
|
|
37
38
|
this.loadToken = loadToken;
|
|
38
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/"
|
|
@@ -15,7 +16,7 @@ export declare class XboxAuthenticationClient {
|
|
|
15
16
|
private readonly fetchFn;
|
|
16
17
|
private userTokenCache;
|
|
17
18
|
private xstsTicketCache;
|
|
18
|
-
constructor(tokenPersister?: TokenPersister | undefined, fetchFn?:
|
|
19
|
+
constructor(tokenPersister?: TokenPersister | undefined, fetchFn?: FetchFunction);
|
|
19
20
|
getXstsTicket(getOauth2AccessToken: () => Promise<string>, relyingParty: RelyingParty): Promise<{
|
|
20
21
|
expiresAt: DateTime;
|
|
21
22
|
IssueInstant: string;
|
|
@@ -1,6 +1,7 @@
|
|
|
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";
|
|
@@ -10,7 +11,7 @@ export class XboxAuthenticationClient {
|
|
|
10
11
|
tokenPersister;
|
|
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,7 +28,6 @@ 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),
|
|
@@ -36,7 +36,7 @@ export class XboxAuthenticationClient {
|
|
|
36
36
|
return token;
|
|
37
37
|
}, async () => (await this.tokenPersister?.load("xbox.userToken")) ?? null);
|
|
38
38
|
xstsTicketCache = new KeyedExpiryTokenCache(async (relyingParty, userToken) => {
|
|
39
|
-
const
|
|
39
|
+
const result = await this.fetchFn("https://xsts.auth.xboxlive.com/xsts/authorize", {
|
|
40
40
|
method: "POST",
|
|
41
41
|
headers: {
|
|
42
42
|
"Content-Type": "application/json",
|
|
@@ -52,7 +52,6 @@ export class XboxAuthenticationClient {
|
|
|
52
52
|
},
|
|
53
53
|
}),
|
|
54
54
|
});
|
|
55
|
-
const result = (await response.json());
|
|
56
55
|
const token = {
|
|
57
56
|
...result,
|
|
58
57
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
@@ -60,7 +59,7 @@ export class XboxAuthenticationClient {
|
|
|
60
59
|
await this.tokenPersister?.save("xbox.xstsTicket." + relyingParty, token);
|
|
61
60
|
return token;
|
|
62
61
|
}, async (relyingParty) => (await this.tokenPersister?.load("xbox.xstsTicket." + relyingParty)) ?? null);
|
|
63
|
-
constructor(tokenPersister, fetchFn =
|
|
62
|
+
constructor(tokenPersister, fetchFn = defaultFetch) {
|
|
64
63
|
this.tokenPersister = tokenPersister;
|
|
65
64
|
this.fetchFn = fetchFn;
|
|
66
65
|
}
|
|
@@ -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,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, fetchFn?: FetchFunction);
|
|
13
14
|
}
|
|
@@ -9,7 +9,7 @@ import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-pers
|
|
|
9
9
|
export class AutoTokenProvider {
|
|
10
10
|
getSpartanToken;
|
|
11
11
|
getXboxLiveV3Token;
|
|
12
|
-
constructor(getOauth2AccessToken, tokenPersister) {
|
|
12
|
+
constructor(getOauth2AccessToken, tokenPersister, fetchFn) {
|
|
13
13
|
let actualTokenPersister;
|
|
14
14
|
if (tokenPersister) {
|
|
15
15
|
actualTokenPersister = tokenPersister;
|
|
@@ -17,13 +17,13 @@ export class AutoTokenProvider {
|
|
|
17
17
|
else {
|
|
18
18
|
actualTokenPersister = 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
24
|
}, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
|
|
25
25
|
await actualTokenPersister.save("halo.authToken", token);
|
|
26
|
-
});
|
|
26
|
+
}, fetchFn);
|
|
27
27
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
28
28
|
this.getXboxLiveV3Token = async () => {
|
|
29
29
|
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,cAA+B,EAC/B,OAAuB;QAEvB,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,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,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,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"}
|
|
@@ -1,8 +1,9 @@
|
|
|
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;
|
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
|
@@ -21,3 +21,4 @@ export { AutoTokenProvider, AutoTokenProvider as AutoXstsSpartanTokenProvider, }
|
|
|
21
21
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
22
22
|
export { TokenPersister } from "./core/token-persisters";
|
|
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,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "halo-infinite-api",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.1.
|
|
4
|
+
"version": "5.1.2",
|
|
5
5
|
"description": "An NPM package for accessing the official Halo Infinite API.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
7
|
"scripts": {
|
|
@@ -34,6 +34,7 @@
|
|
|
34
34
|
},
|
|
35
35
|
"dependencies": {
|
|
36
36
|
"@azure/msal-node": "^2.2.0",
|
|
37
|
+
"axios": "^1.6.2",
|
|
37
38
|
"expiry-map": "^2.0.0",
|
|
38
39
|
"luxon": "^3.3.0",
|
|
39
40
|
"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,9 +24,10 @@ 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
|
{
|
|
30
|
+
method: "POST",
|
|
29
31
|
body: JSON.stringify(tokenRequest),
|
|
30
32
|
headers: {
|
|
31
33
|
"User-Agent":
|
|
@@ -35,8 +37,6 @@ export class HaloAuthenticationClient {
|
|
|
35
37
|
}
|
|
36
38
|
);
|
|
37
39
|
|
|
38
|
-
const result = (await response.json()) as SpartanToken;
|
|
39
|
-
|
|
40
40
|
const newToken = {
|
|
41
41
|
token: result.SpartanToken,
|
|
42
42
|
expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
|
|
@@ -54,7 +54,7 @@ export class HaloAuthenticationClient {
|
|
|
54
54
|
expiresAt: unknown;
|
|
55
55
|
} | null>,
|
|
56
56
|
private readonly saveToken: (token: Token) => Promise<void>,
|
|
57
|
-
private readonly fetchFn:
|
|
57
|
+
private readonly fetchFn: FetchFunction = defaultFetch
|
|
58
58
|
) {}
|
|
59
59
|
|
|
60
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,8 +40,6 @@ 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),
|
|
@@ -55,7 +54,7 @@ export class XboxAuthenticationClient {
|
|
|
55
54
|
);
|
|
56
55
|
private xstsTicketCache = new KeyedExpiryTokenCache(
|
|
57
56
|
async (relyingParty: RelyingParty, userToken: string) => {
|
|
58
|
-
const
|
|
57
|
+
const result = await this.fetchFn<XboxTicket>(
|
|
59
58
|
"https://xsts.auth.xboxlive.com/xsts/authorize",
|
|
60
59
|
{
|
|
61
60
|
method: "POST",
|
|
@@ -74,7 +73,6 @@ export class XboxAuthenticationClient {
|
|
|
74
73
|
}),
|
|
75
74
|
}
|
|
76
75
|
);
|
|
77
|
-
const result = (await response.json()) as XboxTicket;
|
|
78
76
|
|
|
79
77
|
const token = {
|
|
80
78
|
...result,
|
|
@@ -91,7 +89,7 @@ export class XboxAuthenticationClient {
|
|
|
91
89
|
|
|
92
90
|
constructor(
|
|
93
91
|
private readonly tokenPersister?: TokenPersister,
|
|
94
|
-
private readonly fetchFn:
|
|
92
|
+
private readonly fetchFn: FetchFunction = defaultFetch
|
|
95
93
|
) {}
|
|
96
94
|
|
|
97
95
|
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
|
|
|
@@ -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,7 +22,8 @@ export class AutoTokenProvider
|
|
|
21
22
|
|
|
22
23
|
constructor(
|
|
23
24
|
getOauth2AccessToken: () => Promise<string>,
|
|
24
|
-
tokenPersister?: TokenPersister
|
|
25
|
+
tokenPersister?: TokenPersister,
|
|
26
|
+
fetchFn?: FetchFunction
|
|
25
27
|
) {
|
|
26
28
|
let actualTokenPersister: TokenPersister;
|
|
27
29
|
if (tokenPersister) {
|
|
@@ -29,7 +31,10 @@ export class AutoTokenProvider
|
|
|
29
31
|
} else {
|
|
30
32
|
actualTokenPersister = 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(
|
|
@@ -41,7 +46,8 @@ export class AutoTokenProvider
|
|
|
41
46
|
async () => await actualTokenPersister.load("halo.authToken"),
|
|
42
47
|
async (token) => {
|
|
43
48
|
await actualTokenPersister.save("halo.authToken", token);
|
|
44
|
-
}
|
|
49
|
+
},
|
|
50
|
+
fetchFn
|
|
45
51
|
);
|
|
46
52
|
|
|
47
53
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
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
|
|
package/src/index.ts
CHANGED
|
@@ -30,3 +30,4 @@ export {
|
|
|
30
30
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
31
31
|
export { TokenPersister } from "./core/token-persisters";
|
|
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
|
+
};
|