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.
Files changed (44) hide show
  1. package/.vscode/settings.json +3 -0
  2. package/dist/authentication/halo-authentication-client.d.ts +2 -1
  3. package/dist/authentication/halo-authentication-client.js +3 -3
  4. package/dist/authentication/halo-authentication-client.js.map +1 -1
  5. package/dist/authentication/xbox-authentication-client.d.ts +3 -2
  6. package/dist/authentication/xbox-authentication-client.js +13 -11
  7. package/dist/authentication/xbox-authentication-client.js.map +1 -1
  8. package/dist/core/halo-infinite-client.d.ts +3 -2
  9. package/dist/core/halo-infinite-client.js +4 -4
  10. package/dist/core/halo-infinite-client.js.map +1 -1
  11. package/dist/core/token-persisters/index.d.ts +4 -4
  12. package/dist/core/token-persisters/index.js +3 -1
  13. package/dist/core/token-persisters/index.js.map +1 -1
  14. package/dist/core/token-persisters/node-fs-token-persister.d.ts +1 -1
  15. package/dist/core/token-persisters/node-fs-token-persister.js +9 -6
  16. package/dist/core/token-persisters/node-fs-token-persister.js.map +1 -1
  17. package/dist/core/token-persisters/token-persister.d.ts +4 -0
  18. package/dist/core/token-persisters/token-persister.js +2 -0
  19. package/dist/core/token-persisters/token-persister.js.map +1 -0
  20. package/dist/core/token-providers/auto-token-provider.d.ts +2 -1
  21. package/dist/core/token-providers/auto-token-provider.js +12 -8
  22. package/dist/core/token-providers/auto-token-provider.js.map +1 -1
  23. package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.d.ts +1 -1
  24. package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js +2 -2
  25. package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map +1 -1
  26. package/dist/core/xbox-client.d.ts +4 -3
  27. package/dist/core/xbox-client.js +4 -4
  28. package/dist/core/xbox-client.js.map +1 -1
  29. package/dist/index.d.ts +2 -1
  30. package/dist/util/fetch-function.d.ts +2 -0
  31. package/dist/util/fetch-function.js +5 -0
  32. package/dist/util/fetch-function.js.map +1 -0
  33. package/package.json +6 -1
  34. package/src/authentication/halo-authentication-client.ts +3 -4
  35. package/src/authentication/xbox-authentication-client.ts +22 -14
  36. package/src/core/halo-infinite-client.ts +5 -9
  37. package/src/core/token-persisters/index.ts +4 -4
  38. package/src/core/token-persisters/node-fs-token-persister.ts +16 -7
  39. package/src/core/token-persisters/token-persister.ts +4 -0
  40. package/src/core/token-providers/auto-token-provider.ts +18 -8
  41. package/src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts +8 -4
  42. package/src/core/xbox-client.ts +6 -10
  43. package/src/index.ts +2 -1
  44. package/src/util/fetch-function.ts +12 -0
@@ -0,0 +1,3 @@
1
+ {
2
+ "javascript.preferences.importModuleSpecifier": "relative"
3
+ }
@@ -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?: typeof fetch);
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 response = await this.fetchFn("https://settings.svc.halowaypoint.com/spartan-token", {
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 = fetch) {
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;AAO9D,MAAM,OAAO,wBAAwB;IAyChB;IACA;IAIA;IACA;IA9CX,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,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,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"}
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 tokenPersister?;
15
+ private readonly tokenPersisterOrPromise?;
15
16
  private readonly fetchFn;
16
17
  private userTokenCache;
17
18
  private xstsTicketCache;
18
- constructor(tokenPersister?: TokenPersister | undefined, fetchFn?: typeof fetch);
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
- tokenPersister;
11
+ tokenPersisterOrPromise;
11
12
  fetchFn;
12
13
  userTokenCache = new ExpiryTokenCache(async (accessToken) => {
13
- const response = await this.fetchFn("https://user.auth.xboxlive.com/user/authenticate", {
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.tokenPersister?.save("xbox.userToken", token);
35
+ await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
36
36
  return token;
37
- }, async () => (await this.tokenPersister?.load("xbox.userToken")) ?? null);
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 response = await this.fetchFn("https://xsts.auth.xboxlive.com/xsts/authorize", {
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.tokenPersister?.save("xbox.xstsTicket." + relyingParty, token);
62
+ await (await this.tokenPersisterOrPromise)?.save("xbox.xstsTicket." + relyingParty, token);
61
63
  return token;
62
- }, async (relyingParty) => (await this.tokenPersister?.load("xbox.xstsTicket." + relyingParty)) ?? null);
63
- constructor(tokenPersister, fetchFn = fetch) {
64
- this.tokenPersister = tokenPersister;
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;AAE9D,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,4DAA4C,CAAA;AAC9C,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAQD,MAAM,OAAO,wBAAwB;IA2EhB;IACA;IA3EX,cAAc,GAAG,IAAI,gBAAgB,CAC3C,KAAK,EAAE,WAAmB,EAAE,EAAE;QAC5B,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CACjC,kDAAkD,EAClD;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,wBAAwB,EAAE,GAAG;aAC9B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,YAAY,EAAE,0BAA0B;gBACxC,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE;oBACV,UAAU,EAAE,KAAK;oBACjB,QAAQ,EAAE,wBAAwB;oBAClC,SAAS,EAAE,KAAK,WAAW,EAAE;iBAC9B;aACF,CAAC;SACH,CACF,CAAC;QAEF,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;QAErD,MAAM,KAAK,GAAG;YACZ,GAAG,MAAM;YACT,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC7C,CAAC;QACF,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACzD,OAAO,KAAK,CAAC;IACf,CAAC,EACD,KAAK,IAAI,EAAE,CACT,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,CAC9B,gBAAgB,CACjB,CAAC,IAAI,IAAI,CACb,CAAC;IACM,eAAe,GAAG,IAAI,qBAAqB,CACjD,KAAK,EAAE,YAA0B,EAAE,SAAiB,EAAE,EAAE;QACtD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CACjC,+CAA+C,EAC/C;YACE,MAAM,EAAE,MAAM;YACd,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,wBAAwB,EAAE,GAAG;aAC9B;YACD,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC;gBACnB,YAAY,EAAE,YAAY;gBAC1B,SAAS,EAAE,KAAK;gBAChB,UAAU,EAAE;oBACV,SAAS,EAAE,QAAQ;oBACnB,UAAU,EAAE,CAAC,SAAS,CAAC;iBACxB;aACF,CAAC;SACH,CACF,CAAC;QACF,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAe,CAAC;QAErD,MAAM,KAAK,GAAG;YACZ,GAAG,MAAM;YACT,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC;SAC7C,CAAC;QACF,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,CAAC,kBAAkB,GAAG,YAAY,EAAE,KAAK,CAAC,CAAC;QAC1E,OAAO,KAAK,CAAC;IACf,CAAC,EACD,KAAK,EAAE,YAAY,EAAE,EAAE,CACrB,CAAC,MAAM,IAAI,CAAC,cAAc,EAAE,IAAI,CAC9B,kBAAkB,GAAG,YAAY,CAClC,CAAC,IAAI,IAAI,CACb,CAAC;IAEF,YACmB,cAA+B,EAC/B,UAAwB,KAAK;QAD7B,mBAAc,GAAd,cAAc,CAAiB;QAC/B,YAAO,GAAP,OAAO,CAAsB;IAC7C,CAAC;IAEG,KAAK,CAAC,aAAa,CACxB,oBAA2C,EAC3C,YAA0B;QAE1B,IAAI,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,gBAAgB,CAAC,YAAY,CAAC,CAAC;QAC3E,IAAI,CAAC,UAAU,EAAE;YACf,IAAI,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,gBAAgB,EAAE,CAAC;YAC7D,IAAI,CAAC,SAAS,EAAE;gBACd,8DAA8D;gBAC9D,6BAA6B;gBAC7B,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,CAAC,QAAQ,CAC5C,MAAM,oBAAoB,EAAE,CAC7B,CAAC;aACH;YACD,UAAU,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,QAAQ,CAC9C,YAAY,EACZ,SAAS,CAAC,KAAK,CAChB,CAAC;SACH;QACD,OAAO,UAAU,CAAC;IACpB,CAAC;IAEM,kBAAkB,GAAG,CAAC,UAAsB,EAAE,EAAE,CACrD,YAAY,UAAU,CAAC,aAAa,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC;CACzE"}
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?: typeof fetch);
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 ?? fetch;
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 response = await this.fetchFn(url, {
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":"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"}
1
+ {"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,4 @@
1
- export interface TokenPersister {
2
- load: <T>(tokenName: string) => Promise<T | null> | T | null;
3
- save: (tokenName: string, token: unknown) => Promise<void> | void;
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,2 +1,4 @@
1
- export {};
1
+ export { localStorageTokenPersister } from "./local-storage-token-persister";
2
+ export { nodeFsTokenPersister } from "./node-fs-token-persister";
3
+ export { inMemoryTokenPersister } from "./in-memory-token-persister";
2
4
  //# sourceMappingURL=index.js.map
@@ -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 storageFileName = `./tokens/${tokenName}`;
3
+ const tokenDir = process.env.TOKEN_ROOT ||
4
+ (await import("path")).join(__dirname, "./tokens");
5
5
  try {
6
- const json = await fs.readFile(storageFileName, { encoding: "utf-8" });
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 storageFileName = `./tokens/${tokenName}`;
20
- await fs.mkdir(`./tokens/`, { recursive: true });
21
- await fs.writeFile(storageFileName, JSON.stringify(token));
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":"AAAA,OAAO,EAAE,MAAM,aAAa,CAAC;AAG7B,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACxB,MAAM,eAAe,GAAG,YAAY,SAAS,EAAE,CAAC;QAChD,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,EAAE,CAAC,QAAQ,CAAC,eAAe,EAAE,EAAE,QAAQ,EAAE,OAAO,EAAE,CAAC,CAAC;YACvE,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,eAAe,GAAG,YAAY,SAAS,EAAE,CAAC;QAChD,MAAM,EAAE,CAAC,KAAK,CAAC,WAAW,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACjD,MAAM,EAAE,CAAC,SAAS,CAAC,eAAe,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IAC7D,CAAC;CACF,CAAC"}
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,4 @@
1
+ export interface TokenPersister {
2
+ load: <T>(tokenName: string) => Promise<T | null> | T | null;
3
+ save: (tokenName: string, token: unknown) => Promise<void> | void;
4
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=token-persister.js.map
@@ -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 actualTokenPersister;
12
+ constructor(getOauth2AccessToken, tokenPersister, fetchFn) {
13
+ let tokenPeristerOrPromise;
14
14
  if (tokenPersister) {
15
- actualTokenPersister = tokenPersister;
15
+ tokenPeristerOrPromise = tokenPersister;
16
16
  }
17
17
  else {
18
- actualTokenPersister = inMemoryTokenPersister;
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 () => await actualTokenPersister.load("halo.authToken"), async (token) => {
25
- await actualTokenPersister.save("halo.authToken", token);
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;AAGvF;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAGZ,eAAe,CAAwB;IACvC,kBAAkB,CAAwB;IAE1D,YACE,oBAA2C,EAC3C,cAA+B;QAE/B,IAAI,oBAAoC,CAAC;QACzC,IAAI,cAAc,EAAE;YAClB,oBAAoB,GAAG,cAAc,CAAC;SACvC;aAAM;YACL,oBAAoB,GAAG,sBAAsB,CAAC;SAC/C;QACD,MAAM,cAAc,GAAG,IAAI,wBAAwB,CAAC,cAAc,CAAC,CAAC;QACpE,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,CACF,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
+ {"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,YAAY,eAAuB,EAAE,cAA+B;QAClE,IAAI,oBAAoC,CAAC;QACzC,IAAI,cAAc,EAAE;YAClB,oBAAoB,GAAG,cAAc,CAAC;SACvC;aAAM;YACL,oBAAoB,GAAG,sBAAsB,CAAC;SAC/C;QAED,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,GAAG,EAAE,CAAC,eAAe,EACrB,KAAK,IAAI,EAAE,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC7D,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
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?: typeof fetch);
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: 0.0;
12
+ score: number;
12
13
  }[]>;
13
14
  recentPlayers(): Promise<unknown>;
14
15
  }
@@ -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 ?? fetch;
7
+ this.fetchFn = fetchFn;
7
8
  }
8
9
  async executeRequest(url, method) {
9
- const response = await this.fetchFn(url, {
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":"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"}
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,2 @@
1
+ export type FetchFunction = <TResponse = unknown>(input: RequestInfo | URL, init?: RequestInit) => Promise<TResponse>;
2
+ export declare const defaultFetch: <TResponse>(input: RequestInfo | URL, init?: RequestInit) => Promise<TResponse>;
@@ -0,0 +1,5 @@
1
+ export const defaultFetch = async (input, init) => {
2
+ const response = await fetch(input, init);
3
+ return response.json();
4
+ };
5
+ //# sourceMappingURL=fetch-function.js.map
@@ -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.1.1",
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 response = await this.fetchFn(
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: typeof fetch = fetch
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 response = await this.fetchFn(
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.tokenPersister?.save("xbox.userToken", token);
47
+ await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
49
48
  return token;
50
49
  },
51
- async () =>
52
- (await this.tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
53
- "xbox.userToken"
54
- )) ?? null
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 response = await this.fetchFn(
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 this.tokenPersister?.save("xbox.xstsTicket." + relyingParty, token);
85
+ await (
86
+ await this.tokenPersisterOrPromise
87
+ )?.save("xbox.xstsTicket." + relyingParty, token);
84
88
  return token;
85
89
  },
86
90
  async (relyingParty) =>
87
- (await this.tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
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 tokenPersister?: TokenPersister,
94
- private readonly fetchFn: typeof fetch = fetch
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?: typeof fetch
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 response = await this.fetchFn(url, {
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 interface TokenPersister {
2
- load: <T>(tokenName: string) => Promise<T | null> | T | null;
3
- save: (tokenName: string, token: unknown) => Promise<void> | void;
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 fs from "fs/promises";
2
- import { TokenPersister } from ".";
1
+ import type { TokenPersister } from ".";
3
2
 
4
3
  export const nodeFsTokenPersister: TokenPersister = {
5
4
  load: async (tokenName) => {
6
- const storageFileName = `./tokens/${tokenName}`;
5
+ const tokenDir =
6
+ process.env.TOKEN_ROOT ||
7
+ (await import("path")).join(__dirname, "./tokens");
7
8
  try {
8
- const json = await fs.readFile(storageFileName, { encoding: "utf-8" });
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 storageFileName = `./tokens/${tokenName}`;
20
- await fs.mkdir(`./tokens/`, { recursive: true });
21
- await fs.writeFile(storageFileName, JSON.stringify(token));
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
  };
@@ -0,0 +1,4 @@
1
+ export interface TokenPersister {
2
+ load: <T>(tokenName: string) => Promise<T | null> | T | null;
3
+ save: (tokenName: string, token: unknown) => Promise<void> | void;
4
+ }
@@ -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 actualTokenPersister: TokenPersister;
28
+ let tokenPeristerOrPromise: TokenPersister | Promise<TokenPersister>;
27
29
  if (tokenPersister) {
28
- actualTokenPersister = tokenPersister;
30
+ tokenPeristerOrPromise = tokenPersister;
29
31
  } else {
30
- actualTokenPersister = inMemoryTokenPersister;
32
+ tokenPeristerOrPromise = inMemoryTokenPersister;
31
33
  }
32
- const xboxAuthClient = new XboxAuthenticationClient(tokenPersister);
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 () => await actualTokenPersister.load("halo.authToken"),
46
+ async () => {
47
+ const tokenPersister = await tokenPeristerOrPromise;
48
+ return await tokenPersister.load("halo.authToken");
49
+ },
42
50
  async (token) => {
43
- await actualTokenPersister.save("halo.authToken", token);
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(xstsTicketToken: string, tokenPersister?: TokenPersister) {
18
- let actualTokenPersister: TokenPersister;
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 () => await actualTokenPersister.load("halo.authToken"),
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
 
@@ -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?: typeof fetch
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 response = await this.fetchFn(url, {
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: 0.0;
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
+ };