halo-infinite-api 5.0.0 → 5.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -7,10 +7,11 @@ export declare class HaloAuthenticationClient {
7
7
  private readonly fetchXstsToken;
8
8
  private readonly loadToken;
9
9
  private readonly saveToken;
10
+ private readonly fetchFn;
10
11
  private spartanTokenCache;
11
12
  constructor(fetchXstsToken: () => Promise<string> | string, loadToken: () => Promise<{
12
13
  token: string;
13
14
  expiresAt: unknown;
14
- } | null>, saveToken: (token: Token) => Promise<void>);
15
+ } | null>, saveToken: (token: Token) => Promise<void>, fetchFn?: typeof fetch);
15
16
  getSpartanToken(): Promise<string>;
16
17
  }
@@ -1,10 +1,10 @@
1
- import axios from "axios";
2
1
  import { DateTime } from "luxon";
3
2
  import { ExpiryTokenCache } from "../util/expiry-token-cache";
4
3
  export class HaloAuthenticationClient {
5
4
  fetchXstsToken;
6
5
  loadToken;
7
6
  saveToken;
7
+ fetchFn;
8
8
  spartanTokenCache = new ExpiryTokenCache(async () => {
9
9
  const xstsToken = await this.fetchXstsToken();
10
10
  const tokenRequest = {
@@ -17,23 +17,26 @@ export class HaloAuthenticationClient {
17
17
  },
18
18
  ],
19
19
  };
20
- const response = await axios.post("https://settings.svc.halowaypoint.com/spartan-token", tokenRequest, {
20
+ const response = await this.fetchFn("https://settings.svc.halowaypoint.com/spartan-token", {
21
+ body: JSON.stringify(tokenRequest),
21
22
  headers: {
22
23
  "User-Agent": "HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
23
24
  "Content-Type": "application/json; charset=utf-8",
24
25
  },
25
26
  });
27
+ const result = (await response.json());
26
28
  const newToken = {
27
- token: response.data.SpartanToken,
28
- expiresAt: DateTime.fromISO(response.data.ExpiresUtc.ISO8601Date),
29
+ token: result.SpartanToken,
30
+ expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
29
31
  };
30
32
  await this.saveToken(newToken);
31
33
  return newToken;
32
34
  }, () => this.loadToken());
33
- constructor(fetchXstsToken, loadToken, saveToken) {
35
+ constructor(fetchXstsToken, loadToken, saveToken, fetchFn = fetch) {
34
36
  this.fetchXstsToken = fetchXstsToken;
35
37
  this.loadToken = loadToken;
36
38
  this.saveToken = saveToken;
39
+ this.fetchFn = fetchFn;
37
40
  }
38
41
  async getSpartanToken() {
39
42
  const { token } = await this.spartanTokenCache.getToken();
@@ -1 +1 @@
1
- {"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAIjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAO9D,MAAM,OAAO,wBAAwB;IAsChB;IACA;IAIA;IA1CX,iBAAiB,GAAG,IAAI,gBAAgB,CAC9C,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE9C,MAAM,YAAY,GAAwB;YACxC,QAAQ,EAAE,qBAAqB;YAC/B,UAAU,EAAE,GAAG;YACf,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,SAAS;oBAChB,SAAS,EAAE,aAAa;iBACzB;aACF;SACF,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,qDAAqD,EACrD,YAAY,EACZ;YACE,OAAO,EAAE;gBACP,YAAY,EACV,gEAAgE;gBAClE,cAAc,EAAE,iCAAiC;aAClD;SACF,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;YACjC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;SAClE,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;QAL1C,mBAAc,GAAd,cAAc,CAAgC;QAC9C,cAAS,GAAT,SAAS,CAGjB;QACQ,cAAS,GAAT,SAAS,CAAiC;IAC1D,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
+ {"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAO9D,MAAM,OAAO,wBAAwB;IAwChB;IACA;IAIA;IACA;IA7CX,iBAAiB,GAAG,IAAI,gBAAgB,CAC9C,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE9C,MAAM,YAAY,GAAwB;YACxC,QAAQ,EAAE,qBAAqB;YAC/B,UAAU,EAAE,GAAG;YACf,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,SAAS;oBAChB,SAAS,EAAE,aAAa;iBACzB;aACF;SACF,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CACjC,qDAAqD,EACrD;YACE,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YAClC,OAAO,EAAE;gBACP,YAAY,EACV,gEAAgE;gBAClE,cAAc,EAAE,iCAAiC;aAClD;SACF,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;QAEvD,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,MAAM,CAAC,YAAY;YAC1B,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;SAC3D,CAAC;QACF,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC,EACD,GAAG,EAAE,CAAC,IAAI,CAAC,SAAS,EAAE,CACvB,CAAC;IAEF,YACmB,cAA8C,EAC9C,SAGR,EACQ,SAA0C,EAC1C,UAAwB,KAAK;QAN7B,mBAAc,GAAd,cAAc,CAAgC;QAC9C,cAAS,GAAT,SAAS,CAGjB;QACQ,cAAS,GAAT,SAAS,CAAiC;QAC1C,YAAO,GAAP,OAAO,CAAsB;IAC7C,CAAC;IAEG,KAAK,CAAC,eAAe;QAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -12,10 +12,10 @@ export interface XboxAuthenticationToken {
12
12
  }
13
13
  export declare class XboxAuthenticationClient {
14
14
  private readonly tokenPersister?;
15
+ private readonly fetchFn;
15
16
  private userTokenCache;
16
17
  private xstsTicketCache;
17
- private readonly httpClient;
18
- constructor(tokenPersister?: TokenPersister | undefined);
18
+ constructor(tokenPersister?: TokenPersister | undefined, fetchFn?: typeof fetch);
19
19
  getXstsTicket(getOauth2AccessToken: () => Promise<string>, relyingParty: RelyingParty): Promise<{
20
20
  expiresAt: DateTime;
21
21
  IssueInstant: string;
@@ -1,4 +1,3 @@
1
- import axios from "axios";
2
1
  import { DateTime } from "luxon";
3
2
  import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
4
3
  import { ExpiryTokenCache } from "../util/expiry-token-cache";
@@ -9,55 +8,61 @@ export var RelyingParty;
9
8
  })(RelyingParty || (RelyingParty = {}));
10
9
  export class XboxAuthenticationClient {
11
10
  tokenPersister;
11
+ fetchFn;
12
12
  userTokenCache = new ExpiryTokenCache(async (accessToken) => {
13
- const response = await this.httpClient.post("https://user.auth.xboxlive.com/user/authenticate", {
14
- RelyingParty: "http://auth.xboxlive.com",
15
- TokenType: "JWT",
16
- Properties: {
17
- AuthMethod: "RPS",
18
- SiteName: "user.auth.xboxlive.com",
19
- RpsTicket: `d=${accessToken}`,
20
- },
21
- }, {
13
+ const response = await this.fetchFn("https://user.auth.xboxlive.com/user/authenticate", {
14
+ method: "POST",
22
15
  headers: {
23
16
  "Content-Type": "application/json",
24
17
  Accept: "application/json",
25
18
  "x-xbl-contract-version": "1",
26
19
  },
20
+ body: JSON.stringify({
21
+ RelyingParty: "http://auth.xboxlive.com",
22
+ TokenType: "JWT",
23
+ Properties: {
24
+ AuthMethod: "RPS",
25
+ SiteName: "user.auth.xboxlive.com",
26
+ RpsTicket: `d=${accessToken}`,
27
+ },
28
+ }),
27
29
  });
28
- const result = {
29
- ...response.data,
30
- expiresAt: DateTime.fromISO(response.data.NotAfter),
30
+ const result = (await response.json());
31
+ const token = {
32
+ ...result,
33
+ expiresAt: DateTime.fromISO(result.NotAfter),
31
34
  };
32
- await this.tokenPersister?.save("xbox.userToken", result);
33
- return result;
35
+ await this.tokenPersister?.save("xbox.userToken", token);
36
+ return token;
34
37
  }, async () => (await this.tokenPersister?.load("xbox.userToken")) ?? null);
35
38
  xstsTicketCache = new KeyedExpiryTokenCache(async (relyingParty, userToken) => {
36
- const response = await this.httpClient.post("https://xsts.auth.xboxlive.com/xsts/authorize", {
37
- RelyingParty: relyingParty,
38
- TokenType: "JWT",
39
- Properties: {
40
- SandboxId: "RETAIL",
41
- UserTokens: [userToken],
42
- },
43
- }, {
39
+ const response = await this.fetchFn("https://xsts.auth.xboxlive.com/xsts/authorize", {
40
+ method: "POST",
44
41
  headers: {
45
42
  "Content-Type": "application/json",
46
43
  Accept: "application/json",
47
44
  "x-xbl-contract-version": "1",
48
45
  },
46
+ body: JSON.stringify({
47
+ RelyingParty: relyingParty,
48
+ TokenType: "JWT",
49
+ Properties: {
50
+ SandboxId: "RETAIL",
51
+ UserTokens: [userToken],
52
+ },
53
+ }),
49
54
  });
50
- const result = {
51
- ...response.data,
52
- expiresAt: DateTime.fromISO(response.data.NotAfter),
55
+ const result = (await response.json());
56
+ const token = {
57
+ ...result,
58
+ expiresAt: DateTime.fromISO(result.NotAfter),
53
59
  };
54
- await this.tokenPersister?.save("xbox.xstsTicket." + relyingParty, result);
55
- return result;
60
+ await this.tokenPersister?.save("xbox.xstsTicket." + relyingParty, token);
61
+ return token;
56
62
  }, async (relyingParty) => (await this.tokenPersister?.load("xbox.xstsTicket." + relyingParty)) ?? null);
57
- httpClient;
58
- constructor(tokenPersister) {
63
+ constructor(tokenPersister, fetchFn = fetch) {
59
64
  this.tokenPersister = tokenPersister;
60
- this.httpClient = axios.create();
65
+ this.fetchFn = fetchFn;
61
66
  }
62
67
  async getXstsTicket(getOauth2AccessToken, relyingParty) {
63
68
  let xstsTicket = await this.xstsTicketCache.getExistingToken(relyingParty);
@@ -1 +1 @@
1
- {"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
@@ -21,7 +21,8 @@ export type AssetKindTypeMap = {
21
21
  };
22
22
  export declare class HaloInfiniteClient {
23
23
  private spartanTokenProvider;
24
- constructor(spartanTokenProvider: SpartanTokenProvider);
24
+ private readonly fetchFn;
25
+ constructor(spartanTokenProvider: SpartanTokenProvider, fetchFn?: typeof fetch);
25
26
  private executeRequest;
26
27
  private executeResultsRequest;
27
28
  private executePaginationRequest;
@@ -1,4 +1,3 @@
1
- import axios, { AxiosError, AxiosHeaders } from "axios";
2
1
  import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
3
2
  import { AssetKind } from "../models/halo-infinite/asset-kind";
4
3
  import { MatchType } from "../models/halo-infinite/match-type";
@@ -28,26 +27,29 @@ function unwrapPlayerId(playerId) {
28
27
  }
29
28
  export class HaloInfiniteClient {
30
29
  spartanTokenProvider;
31
- constructor(spartanTokenProvider) {
30
+ fetchFn;
31
+ constructor(spartanTokenProvider, fetchFn) {
32
32
  this.spartanTokenProvider = spartanTokenProvider;
33
+ this.fetchFn = fetchFn ?? fetch;
33
34
  }
34
35
  async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
35
- const headers = new AxiosHeaders({
36
+ const headers = {
36
37
  "User-Agent": userAgent,
37
38
  Accept: "application/json",
38
- });
39
+ };
39
40
  if (useSpartanToken) {
40
- headers.set("x-343-authorization-spartan", await this.spartanTokenProvider.getSpartanToken());
41
+ headers["x-343-authorization-spartan"] =
42
+ await this.spartanTokenProvider.getSpartanToken();
41
43
  }
42
44
  if (useClearance) {
43
45
  throw new Error("TODO: Implement clearance");
44
46
  }
45
- const response = await axios.request({
46
- url,
47
+ const response = await this.fetchFn(url, {
47
48
  method,
48
49
  headers,
49
50
  });
50
- return response.data;
51
+ const result = (await response.json());
52
+ return result;
51
53
  }
52
54
  async executeResultsRequest(...args) {
53
55
  const result = await this.executeRequest(...args);
@@ -99,21 +101,9 @@ export class HaloInfiniteClient {
99
101
  }
100
102
  getMatchStats = (matchId) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, "get");
101
103
  getMatchSkill = async (matchId, playerIds) => {
102
- try {
103
- return await this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=${playerIds
104
- .map(wrapPlayerId)
105
- .join(",")}`, "get");
106
- }
107
- catch (e) {
108
- if (e instanceof AxiosError &&
109
- e.response?.status === 404 &&
110
- e.response.data) {
111
- return e.response.data.Value;
112
- }
113
- else {
114
- throw e;
115
- }
116
- }
104
+ return await this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=${playerIds
105
+ .map(wrapPlayerId)
106
+ .join(",")}`, "get");
117
107
  };
118
108
  /** Gets authoring metadata about a specific asset. */
119
109
  getAsset = (assetType, assetId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`, "get");
@@ -1 +1 @@
1
- {"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,UAAU,EAAE,YAAY,EAAU,MAAM,OAAO,CAAC;AAChE,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;IACT;IAApB,YAAoB,oBAA0C;QAA1C,yBAAoB,GAApB,oBAAoB,CAAsB;IAAG,CAAC;IAE1D,KAAK,CAAC,cAAc,CAC1B,GAAW,EACX,MAAc,EACd,eAAe,GAAG,IAAI,EACtB,YAAY,GAAG,KAAK,EACpB,YAAoB,eAAe,CAAC,wBAAwB;QAE5D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,YAAY,EAAE,SAAS;YACvB,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QAEH,IAAI,eAAe,EAAE;YACnB,OAAO,CAAC,GAAG,CACT,6BAA6B,EAC7B,MAAM,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAClD,CAAC;SACH;QAED,IAAI,YAAY,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;SAC9C;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAI;YACtC,GAAG;YACH,MAAM;YACN,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,GAAG,IAAsD;QAEzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAsB,GAAG,IAAI,CAAC,CAAC;QAEvE,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,KAAa,EACb,KAAa,EACb,eAAuC,EACvC,GAAG,IAAsD;QAEzD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CACtC,GAAG,GAAG,IAAI,IAAI,eAAe,CAAC;YAC5B,GAAG,eAAe;YAClB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;YACvB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;SACxB,CAAC,EAAE,EACJ,GAAG,IAAI,CACR,CAAC;QAEF,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,cAAc,GAAG,CAAC,UAAkB,EAAE,SAAmB,EAAE,EAAE,CAClE,IAAI,CAAC,qBAAqB,CACxB,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,gBAAgB,UAAU,iBAAiB,SAAS;SACjD,GAAG,CAAC,YAAY,CAAC;SACjB,IAAI,CAAC,GAAG,CAAC,EAAE,EACd,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,OAAO,GAAG,CAAC,QAAgB,EAAE,EAAE,CACpC,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,OAAO,IAAI,iBAAiB,CAAC,aAAa,aAAa,QAAQ,GAAG,EAC/F,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,QAAQ,GAAG,CAAC,KAAe,EAAE,EAAE;QACpC,OAAO,IAAI,CAAC,cAAc,CACxB,WAAW,iBAAiB,CAAC,OAAO,IAClC,iBAAiB,CAAC,aACpB,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC/D,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IAEF;;OAEG;IACI,oBAAoB,GAAG,CAAC,QAAgB,EAAE,EAAE,CACjD,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,aAAa,eAAe,QAAQ,0BAA0B,EAC5H,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,WAAW,GAAG,CAAC,UAAkB,EAAE,EAAE,CAC1C,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,aAAa,IAAI,iBAAiB,CAAC,aAAa,yCAAyC,UAAU,OAAO,EACvI,KAAK,CACN,CAAC;IAEG,gBAAgB,GAAG,CACxB,UAAkB,EAClB,OAAkB,SAAS,CAAC,GAAG,EAC/B,QAAgB,EAAE,EAClB,QAAgB,CAAC,EACjB,EAAE;QACF,IAAI,MAAM,GAA2B,EAAE,CAAC;QACxC,IAAI,IAAI,KAAK,SAAS,CAAC,GAAG,EAAE;YAC1B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;SAC/B;QACD,OAAO,IAAI,CAAC,wBAAwB,CAClC,KAAK,EACL,KAAK,EACL,MAAM,EACN,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,eAAe,YAAY,CAAC,UAAU,CAAC,UAAU,EACjD,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IAEK,sBAAsB,CAC3B,UAAkB,EAClB,OAAkB,SAAS,CAAC,GAAG;QAE/B,OAAO,IAAI,CAAC,cAAc,CACxB,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,eAAe,YAAY,CAAC,UAAU,CAAC,0BAA0B,EACjE,KAAK,CACN,CAAC;IACJ,CAAC;IAEM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CACzC,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,aAAa,eAAe,OAAO,QAAQ,EACzG,KAAK,CACN,CAAC;IAEG,aAAa,GAAG,KAAK,EAAE,OAAe,EAAE,SAAmB,EAAE,EAAE;QACpE,IAAI;YACF,OAAO,MAAM,IAAI,CAAC,qBAAqB,CACrC,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,eAAe,OAAO,kBAAkB,SAAS;iBAC9C,GAAG,CAAC,YAAY,CAAC;iBACjB,IAAI,CAAC,GAAG,CAAC,EAAE,EACd,KAAK,CACN,CAAC;SACH;QAAC,OAAO,CAAC,EAAE;YACV,IACE,CAAC,YAAY,UAAU;gBACvB,CAAC,CAAC,QAAQ,EAAE,MAAM,KAAK,GAAG;gBAC1B,CAAC,CAAC,QAAQ,CAAC,IAAI,EACf;gBACA,OAAQ,CAAC,CAAC,QAAQ,CAAC,IAA4C,CAAC,KAAK,CAAC;aACvE;iBAAM;gBACL,MAAM,CAAC,CAAC;aACT;SACF;IACH,CAAC,CAAC;IAEF,sDAAsD;IAC/C,QAAQ,GAAG,CAChB,SAAqB,EACrB,OAAe,EACf,EAAE,CACF,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,eAAe,IAAI,iBAAiB,CAAC,aAAa,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE,EAC7H,KAAK,CACN,CAAC;IAEJ,wEAAwE;IACjE,uBAAuB,GAAG,CAC/B,SAAqB,EACrB,OAAe,EACf,SAAiB,EACjB,EAAE,CACF,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,eAAe,IAAI,iBAAiB,CAAC,aAAa,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,OAAO,aAAa,SAAS,EAAE,EACnJ,KAAK,CACN,CAAC;CACL"}
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;IAGnB;IAFO,OAAO,CAAe;IACvC,YACU,oBAA0C,EAClD,OAAsB;QADd,yBAAoB,GAApB,oBAAoB,CAAsB;QAGlD,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAK,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,GAAW,EACX,MAA6B,EAC7B,eAAe,GAAG,IAAI,EACtB,YAAY,GAAG,KAAK,EACpB,YAAoB,eAAe,CAAC,wBAAwB;QAE5D,MAAM,OAAO,GAAgB;YAC3B,YAAY,EAAE,SAAS;YACvB,MAAM,EAAE,kBAAkB;SAC3B,CAAC;QAEF,IAAI,eAAe,EAAE;YACnB,OAAO,CAAC,6BAA6B,CAAC;gBACpC,MAAM,IAAI,CAAC,oBAAoB,CAAC,eAAe,EAAE,CAAC;SACrD;QAED,IAAI,YAAY,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;SAC9C;QAED,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,MAAM;YACN,OAAO;SACR,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;QAE5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,GAAG,IAAsD;QAEzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAsB,GAAG,IAAI,CAAC,CAAC;QAEvE,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,KAAa,EACb,KAAa,EACb,eAAuC,EACvC,GAAG,IAAsD;QAEzD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CACtC,GAAG,GAAG,IAAI,IAAI,eAAe,CAAC;YAC5B,GAAG,eAAe;YAClB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;YACvB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;SACxB,CAAC,EAAE,EACJ,GAAG,IAAI,CACR,CAAC;QAEF,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,cAAc,GAAG,CAAC,UAAkB,EAAE,SAAmB,EAAE,EAAE,CAClE,IAAI,CAAC,qBAAqB,CACxB,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,gBAAgB,UAAU,iBAAiB,SAAS;SACjD,GAAG,CAAC,YAAY,CAAC;SACjB,IAAI,CAAC,GAAG,CAAC,EAAE,EACd,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,OAAO,GAAG,CAAC,QAAgB,EAAE,EAAE,CACpC,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,OAAO,IAAI,iBAAiB,CAAC,aAAa,aAAa,QAAQ,GAAG,EAC/F,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,QAAQ,GAAG,CAAC,KAAe,EAAE,EAAE;QACpC,OAAO,IAAI,CAAC,cAAc,CACxB,WAAW,iBAAiB,CAAC,OAAO,IAClC,iBAAiB,CAAC,aACpB,gBAAgB,KAAK,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,cAAc,CAAC,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,GAAG,CAAC,EAAE,EAC/D,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IAEF;;OAEG;IACI,oBAAoB,GAAG,CAAC,QAAgB,EAAE,EAAE,CACjD,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,aAAa,eAAe,QAAQ,0BAA0B,EAC5H,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,WAAW,GAAG,CAAC,UAAkB,EAAE,EAAE,CAC1C,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,aAAa,IAAI,iBAAiB,CAAC,aAAa,yCAAyC,UAAU,OAAO,EACvI,KAAK,CACN,CAAC;IAEG,gBAAgB,GAAG,CACxB,UAAkB,EAClB,OAAkB,SAAS,CAAC,GAAG,EAC/B,QAAgB,EAAE,EAClB,QAAgB,CAAC,EACjB,EAAE;QACF,IAAI,MAAM,GAA2B,EAAE,CAAC;QACxC,IAAI,IAAI,KAAK,SAAS,CAAC,GAAG,EAAE;YAC1B,MAAM,CAAC,IAAI,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;SAC/B;QACD,OAAO,IAAI,CAAC,wBAAwB,CAClC,KAAK,EACL,KAAK,EACL,MAAM,EACN,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,eAAe,YAAY,CAAC,UAAU,CAAC,UAAU,EACjD,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IAEK,sBAAsB,CAC3B,UAAkB,EAClB,OAAkB,SAAS,CAAC,GAAG;QAE/B,OAAO,IAAI,CAAC,cAAc,CACxB,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,eAAe,YAAY,CAAC,UAAU,CAAC,0BAA0B,EACjE,KAAK,CACN,CAAC;IACJ,CAAC;IAEM,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CACzC,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,aAAa,eAAe,OAAO,QAAQ,EACzG,KAAK,CACN,CAAC;IAEG,aAAa,GAAG,KAAK,EAAE,OAAe,EAAE,SAAmB,EAAE,EAAE;QACpE,OAAO,MAAM,IAAI,CAAC,qBAAqB,CACrC,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,eAAe,OAAO,kBAAkB,SAAS;aAC9C,GAAG,CAAC,YAAY,CAAC;aACjB,IAAI,CAAC,GAAG,CAAC,EAAE,EACd,KAAK,CACN,CAAC;IACJ,CAAC,CAAC;IAEF,sDAAsD;IAC/C,QAAQ,GAAG,CAChB,SAAqB,EACrB,OAAe,EACf,EAAE,CACF,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,eAAe,IAAI,iBAAiB,CAAC,aAAa,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,OAAO,EAAE,EAC7H,KAAK,CACN,CAAC;IAEJ,wEAAwE;IACjE,uBAAuB,GAAG,CAC/B,SAAqB,EACrB,OAAe,EACf,SAAiB,EACjB,EAAE,CACF,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,eAAe,IAAI,iBAAiB,CAAC,aAAa,OAAO,eAAe,CAAC,SAAS,CAAC,IAAI,OAAO,aAAa,SAAS,EAAE,EACnJ,KAAK,CACN,CAAC;CACL"}
@@ -1,7 +1,8 @@
1
1
  import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
2
2
  export declare class XboxClient {
3
3
  private xboxTokenProvider;
4
- constructor(xboxTokenProvider: XboxTokenProvider);
4
+ private readonly fetchFn;
5
+ constructor(xboxTokenProvider: XboxTokenProvider, fetchFn?: typeof fetch);
5
6
  private executeRequest;
6
7
  searchUsers(query: string): Promise<{
7
8
  id: string;
@@ -1,21 +1,21 @@
1
- import axios, { AxiosHeaders } from "axios";
2
1
  export class XboxClient {
3
2
  xboxTokenProvider;
4
- constructor(xboxTokenProvider) {
3
+ fetchFn;
4
+ constructor(xboxTokenProvider, fetchFn) {
5
5
  this.xboxTokenProvider = xboxTokenProvider;
6
+ this.fetchFn = fetchFn ?? fetch;
6
7
  }
7
8
  async executeRequest(url, method) {
8
- const headers = new AxiosHeaders({
9
- Accept: "application/json",
10
- Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
11
- "x-xbl-contract-version": "1",
12
- });
13
- const response = await axios.request({
14
- url,
9
+ const response = await this.fetchFn(url, {
15
10
  method,
16
- headers,
11
+ headers: {
12
+ Accept: "application/json",
13
+ Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
14
+ "x-xbl-contract-version": "1",
15
+ },
17
16
  });
18
- return response.data;
17
+ const result = (await response.json());
18
+ return result;
19
19
  }
20
20
  async searchUsers(query) {
21
21
  const { results } = await this.executeRequest(`https://usersearch.xboxlive.com/suggest?q=${encodeURIComponent(query)}`, "GET");
@@ -1 +1 @@
1
- {"version":3,"file":"xbox-client.js","sourceRoot":"","sources":["../../src/core/xbox-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAU,MAAM,OAAO,CAAC;AAGpD,MAAM,OAAO,UAAU;IACD;IAApB,YAAoB,iBAAoC;QAApC,sBAAiB,GAAjB,iBAAiB,CAAmB;IAAG,CAAC;IAEpD,KAAK,CAAC,cAAc,CAAI,GAAW,EAAE,MAAc;QACzD,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,MAAM,EAAE,kBAAkB;YAC1B,aAAa,EAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;YAChE,wBAAwB,EAAE,GAAG;SAC9B,CAAC,CAAC;QACH,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAI;YACtC,GAAG;YACH,MAAM;YACN,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,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"}
1
+ {"version":3,"file":"xbox-client.js","sourceRoot":"","sources":["../../src/core/xbox-client.ts"],"names":[],"mappings":"AAEA,MAAM,OAAO,UAAU;IAGX;IAFO,OAAO,CAAe;IACvC,YACU,iBAAoC,EAC5C,OAAsB;QADd,sBAAiB,GAAjB,iBAAiB,CAAmB;QAG5C,IAAI,CAAC,OAAO,GAAG,OAAO,IAAI,KAAK,CAAC;IAClC,CAAC;IAEO,KAAK,CAAC,cAAc,CAAI,GAAW,EAAE,MAA6B;QACxE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,MAAM;YACN,OAAO,EAAE;gBACP,MAAM,EAAE,kBAAkB;gBAC1B,aAAa,EAAE,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE;gBAChE,wBAAwB,EAAE,GAAG;aAC9B;SACF,CAAC,CAAC;QAEH,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;QAE5C,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,WAAW,CAAC,KAAa;QACpC,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAa3C,6CAA6C,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACxE,KAAK,CACN,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,aAAa;QACxB,OAAO,MAAM,IAAI,CAAC,cAAc,CAC9B,8DAA8D,EAC9D,KAAK,CACN,CAAC;IACJ,CAAC;CACF"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "halo-infinite-api",
3
3
  "type": "module",
4
- "version": "5.0.0",
4
+ "version": "5.1.0",
5
5
  "description": "An NPM package for accessing the official Halo Infinite API.",
6
6
  "main": "dist/index.js",
7
7
  "scripts": {
@@ -34,7 +34,6 @@
34
34
  },
35
35
  "dependencies": {
36
36
  "@azure/msal-node": "^2.2.0",
37
- "axios": "^1.3.5",
38
37
  "expiry-map": "^2.0.0",
39
38
  "luxon": "^3.3.0",
40
39
  "pkce-challenge": "^3.1.0",
@@ -1,8 +1,6 @@
1
- import axios from "axios";
2
1
  import { DateTime } from "luxon";
3
2
  import type { SpartanToken } from "../models/spartan-token";
4
3
  import type { SpartanTokenRequest } from "../models/spartan-token-request";
5
- import { coalesceDateTime } from "../util/date-time";
6
4
  import { ExpiryTokenCache } from "../util/expiry-token-cache";
7
5
 
8
6
  export interface Token {
@@ -25,10 +23,10 @@ export class HaloAuthenticationClient {
25
23
  },
26
24
  ],
27
25
  };
28
- const response = await axios.post<SpartanToken>(
26
+ const response = await this.fetchFn(
29
27
  "https://settings.svc.halowaypoint.com/spartan-token",
30
- tokenRequest,
31
28
  {
29
+ body: JSON.stringify(tokenRequest),
32
30
  headers: {
33
31
  "User-Agent":
34
32
  "HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
@@ -37,9 +35,11 @@ export class HaloAuthenticationClient {
37
35
  }
38
36
  );
39
37
 
38
+ const result = (await response.json()) as SpartanToken;
39
+
40
40
  const newToken = {
41
- token: response.data.SpartanToken,
42
- expiresAt: DateTime.fromISO(response.data.ExpiresUtc.ISO8601Date),
41
+ token: result.SpartanToken,
42
+ expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
43
43
  };
44
44
  await this.saveToken(newToken);
45
45
  return newToken;
@@ -53,7 +53,8 @@ export class HaloAuthenticationClient {
53
53
  token: string;
54
54
  expiresAt: unknown;
55
55
  } | null>,
56
- private readonly saveToken: (token: Token) => Promise<void>
56
+ private readonly saveToken: (token: Token) => Promise<void>,
57
+ private readonly fetchFn: typeof fetch = fetch
57
58
  ) {}
58
59
 
59
60
  public async getSpartanToken() {
@@ -1,4 +1,3 @@
1
- import axios, { AxiosInstance } from "axios";
2
1
  import { DateTime } from "luxon";
3
2
  import { TokenPersister } from "../core/token-persisters";
4
3
  import { XboxTicket } from "../models/xbox-ticket";
@@ -19,32 +18,35 @@ export interface XboxAuthenticationToken {
19
18
  export class XboxAuthenticationClient {
20
19
  private userTokenCache = new ExpiryTokenCache(
21
20
  async (accessToken: string) => {
22
- const response = await this.httpClient.post<XboxTicket>(
21
+ const response = await this.fetchFn(
23
22
  "https://user.auth.xboxlive.com/user/authenticate",
24
23
  {
25
- RelyingParty: "http://auth.xboxlive.com",
26
- TokenType: "JWT",
27
- Properties: {
28
- AuthMethod: "RPS",
29
- SiteName: "user.auth.xboxlive.com",
30
- RpsTicket: `d=${accessToken}`,
31
- },
32
- },
33
- {
24
+ method: "POST",
34
25
  headers: {
35
26
  "Content-Type": "application/json",
36
27
  Accept: "application/json",
37
28
  "x-xbl-contract-version": "1",
38
29
  },
30
+ body: JSON.stringify({
31
+ RelyingParty: "http://auth.xboxlive.com",
32
+ TokenType: "JWT",
33
+ Properties: {
34
+ AuthMethod: "RPS",
35
+ SiteName: "user.auth.xboxlive.com",
36
+ RpsTicket: `d=${accessToken}`,
37
+ },
38
+ }),
39
39
  }
40
40
  );
41
41
 
42
- const result = {
43
- ...response.data,
44
- expiresAt: DateTime.fromISO(response.data.NotAfter),
42
+ const result = (await response.json()) as XboxTicket;
43
+
44
+ const token = {
45
+ ...result,
46
+ expiresAt: DateTime.fromISO(result.NotAfter),
45
47
  };
46
- await this.tokenPersister?.save("xbox.userToken", result);
47
- return result;
48
+ await this.tokenPersister?.save("xbox.userToken", token);
49
+ return token;
48
50
  },
49
51
  async () =>
50
52
  (await this.tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
@@ -53,34 +55,33 @@ export class XboxAuthenticationClient {
53
55
  );
54
56
  private xstsTicketCache = new KeyedExpiryTokenCache(
55
57
  async (relyingParty: RelyingParty, userToken: string) => {
56
- const response = await this.httpClient.post<XboxTicket>(
58
+ const response = await this.fetchFn(
57
59
  "https://xsts.auth.xboxlive.com/xsts/authorize",
58
60
  {
59
- RelyingParty: relyingParty,
60
- TokenType: "JWT",
61
- Properties: {
62
- SandboxId: "RETAIL",
63
- UserTokens: [userToken],
64
- },
65
- },
66
- {
61
+ method: "POST",
67
62
  headers: {
68
63
  "Content-Type": "application/json",
69
64
  Accept: "application/json",
70
65
  "x-xbl-contract-version": "1",
71
66
  },
67
+ body: JSON.stringify({
68
+ RelyingParty: relyingParty,
69
+ TokenType: "JWT",
70
+ Properties: {
71
+ SandboxId: "RETAIL",
72
+ UserTokens: [userToken],
73
+ },
74
+ }),
72
75
  }
73
76
  );
77
+ const result = (await response.json()) as XboxTicket;
74
78
 
75
- const result = {
76
- ...response.data,
77
- expiresAt: DateTime.fromISO(response.data.NotAfter),
79
+ const token = {
80
+ ...result,
81
+ expiresAt: DateTime.fromISO(result.NotAfter),
78
82
  };
79
- await this.tokenPersister?.save(
80
- "xbox.xstsTicket." + relyingParty,
81
- result
82
- );
83
- return result;
83
+ await this.tokenPersister?.save("xbox.xstsTicket." + relyingParty, token);
84
+ return token;
84
85
  },
85
86
  async (relyingParty) =>
86
87
  (await this.tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
@@ -88,11 +89,10 @@ export class XboxAuthenticationClient {
88
89
  )) ?? null
89
90
  );
90
91
 
91
- private readonly httpClient: AxiosInstance;
92
-
93
- constructor(private readonly tokenPersister?: TokenPersister) {
94
- this.httpClient = axios.create();
95
- }
92
+ constructor(
93
+ private readonly tokenPersister?: TokenPersister,
94
+ private readonly fetchFn: typeof fetch = fetch
95
+ ) {}
96
96
 
97
97
  public async getXstsTicket(
98
98
  getOauth2AccessToken: () => Promise<string>,
@@ -1,4 +1,3 @@
1
- import axios, { AxiosError, AxiosHeaders, Method } from "axios";
2
1
  import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
3
2
  import {
4
3
  MapAsset,
@@ -67,38 +66,43 @@ function unwrapPlayerId(playerId: string) {
67
66
  }
68
67
 
69
68
  export class HaloInfiniteClient {
70
- constructor(private spartanTokenProvider: SpartanTokenProvider) {}
69
+ private readonly fetchFn: typeof fetch;
70
+ constructor(
71
+ private spartanTokenProvider: SpartanTokenProvider,
72
+ fetchFn?: typeof fetch
73
+ ) {
74
+ this.fetchFn = fetchFn ?? fetch;
75
+ }
71
76
 
72
77
  private async executeRequest<T>(
73
78
  url: string,
74
- method: Method,
79
+ method: RequestInit["method"],
75
80
  useSpartanToken = true,
76
81
  useClearance = false,
77
82
  userAgent: string = GlobalConstants.HALO_WAYPOINT_USER_AGENT
78
83
  ) {
79
- const headers = new AxiosHeaders({
84
+ const headers: HeadersInit = {
80
85
  "User-Agent": userAgent,
81
86
  Accept: "application/json",
82
- });
87
+ };
83
88
 
84
89
  if (useSpartanToken) {
85
- headers.set(
86
- "x-343-authorization-spartan",
87
- await this.spartanTokenProvider.getSpartanToken()
88
- );
90
+ headers["x-343-authorization-spartan"] =
91
+ await this.spartanTokenProvider.getSpartanToken();
89
92
  }
90
93
 
91
94
  if (useClearance) {
92
95
  throw new Error("TODO: Implement clearance");
93
96
  }
94
97
 
95
- const response = await axios.request<T>({
96
- url,
98
+ const response = await this.fetchFn(url, {
97
99
  method,
98
100
  headers,
99
101
  });
100
102
 
101
- return response.data;
103
+ const result = (await response.json()) as T;
104
+
105
+ return result;
102
106
  }
103
107
 
104
108
  private async executeResultsRequest<T>(
@@ -221,26 +225,14 @@ export class HaloInfiniteClient {
221
225
  );
222
226
 
223
227
  public getMatchSkill = async (matchId: string, playerIds: string[]) => {
224
- try {
225
- return await this.executeResultsRequest<MatchSkill>(
226
- `https://${HaloCoreEndpoints.SkillOrigin}.${
227
- HaloCoreEndpoints.ServiceDomain
228
- }/hi/matches/${matchId}/skill?players=${playerIds
229
- .map(wrapPlayerId)
230
- .join(",")}`,
231
- "get"
232
- );
233
- } catch (e) {
234
- if (
235
- e instanceof AxiosError &&
236
- e.response?.status === 404 &&
237
- e.response.data
238
- ) {
239
- return (e.response.data as ResultsContainer<MatchSkill<0 | 1>>).Value;
240
- } else {
241
- throw e;
242
- }
243
- }
228
+ return await this.executeResultsRequest<MatchSkill>(
229
+ `https://${HaloCoreEndpoints.SkillOrigin}.${
230
+ HaloCoreEndpoints.ServiceDomain
231
+ }/hi/matches/${matchId}/skill?players=${playerIds
232
+ .map(wrapPlayerId)
233
+ .join(",")}`,
234
+ "get"
235
+ );
244
236
  };
245
237
 
246
238
  /** Gets authoring metadata about a specific asset. */
@@ -1,22 +1,27 @@
1
- import axios, { AxiosHeaders, Method } from "axios";
2
1
  import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
3
2
 
4
3
  export class XboxClient {
5
- constructor(private xboxTokenProvider: XboxTokenProvider) {}
4
+ private readonly fetchFn: typeof fetch;
5
+ constructor(
6
+ private xboxTokenProvider: XboxTokenProvider,
7
+ fetchFn?: typeof fetch
8
+ ) {
9
+ this.fetchFn = fetchFn ?? fetch;
10
+ }
6
11
 
7
- private async executeRequest<T>(url: string, method: Method) {
8
- const headers = new AxiosHeaders({
9
- Accept: "application/json",
10
- Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
11
- "x-xbl-contract-version": "1",
12
- });
13
- const response = await axios.request<T>({
14
- url,
12
+ private async executeRequest<T>(url: string, method: RequestInit["method"]) {
13
+ const response = await this.fetchFn(url, {
15
14
  method,
16
- headers,
15
+ headers: {
16
+ Accept: "application/json",
17
+ Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
18
+ "x-xbl-contract-version": "1",
19
+ },
17
20
  });
18
21
 
19
- return response.data;
22
+ const result = (await response.json()) as T;
23
+
24
+ return result;
20
25
  }
21
26
 
22
27
  public async searchUsers(query: string) {