halo-infinite-api 5.3.2 → 6.0.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 (54) hide show
  1. package/dist/authentication/halo-authentication-client.js +15 -7
  2. package/dist/authentication/halo-authentication-client.js.map +1 -1
  3. package/dist/authentication/xbox-authentication-client.js +29 -14
  4. package/dist/authentication/xbox-authentication-client.js.map +1 -1
  5. package/dist/core/halo-infinite-client.js +28 -12
  6. package/dist/core/halo-infinite-client.js.map +1 -1
  7. package/dist/core/xbox-client.js +8 -2
  8. package/dist/core/xbox-client.js.map +1 -1
  9. package/dist/index.d.ts +1 -0
  10. package/dist/index.js +1 -0
  11. package/dist/index.js.map +1 -1
  12. package/dist/models/halo-infinite/match-skill.d.ts +3 -12
  13. package/dist/util/fetch-function.d.ts +2 -2
  14. package/dist/util/fetch-function.js +1 -4
  15. package/dist/util/fetch-function.js.map +1 -1
  16. package/dist/util/request-error.d.ts +5 -0
  17. package/dist/util/request-error.js +10 -0
  18. package/dist/util/request-error.js.map +1 -0
  19. package/package.json +1 -1
  20. package/src/authentication/halo-authentication-client.ts +22 -18
  21. package/src/authentication/xbox-authentication-client.ts +62 -51
  22. package/src/core/halo-infinite-client.ts +23 -8
  23. package/src/core/xbox-client.ts +7 -2
  24. package/src/index.ts +1 -0
  25. package/src/models/halo-infinite/match-skill.ts +3 -12
  26. package/src/util/fetch-function.ts +4 -7
  27. package/src/util/request-error.ts +12 -0
  28. package/dist/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.d.ts +0 -11
  29. package/dist/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.js +0 -43
  30. package/dist/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.js.map +0 -1
  31. package/dist/core/spartan-token-fetchers/index.d.ts +0 -3
  32. package/dist/core/spartan-token-fetchers/index.js +0 -2
  33. package/dist/core/spartan-token-fetchers/index.js.map +0 -1
  34. package/dist/core/spartan-token-fetchers/static-xsts-ticket-token-spartan-token-provider.d.ts +0 -12
  35. package/dist/core/spartan-token-fetchers/static-xsts-ticket-token-spartan-token-provider.js +0 -26
  36. package/dist/core/spartan-token-fetchers/static-xsts-ticket-token-spartan-token-provider.js.map +0 -1
  37. package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.d.ts +0 -11
  38. package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.js +0 -29
  39. package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.js.map +0 -1
  40. package/dist/core/spartan-token-providers/index.d.ts +0 -3
  41. package/dist/core/spartan-token-providers/index.js +0 -2
  42. package/dist/core/spartan-token-providers/index.js.map +0 -1
  43. package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.d.ts +0 -12
  44. package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js +0 -25
  45. package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map +0 -1
  46. package/dist/core/token-persister.d.ts +0 -4
  47. package/dist/core/token-persister.js +0 -2
  48. package/dist/core/token-persister.js.map +0 -1
  49. package/dist/core/token-providers/spartan-token-providers/auto-xsts-spartan-token-provider.d.ts +0 -11
  50. package/dist/core/token-providers/spartan-token-providers/auto-xsts-spartan-token-provider.js +0 -29
  51. package/dist/core/token-providers/spartan-token-providers/auto-xsts-spartan-token-provider.js.map +0 -1
  52. package/dist/models/halo-infinite/authoring-asset.d.ts +0 -56
  53. package/dist/models/halo-infinite/authoring-asset.js +0 -2
  54. package/dist/models/halo-infinite/authoring-asset.js.map +0 -1
@@ -2,6 +2,7 @@ import { DateTime } from "luxon";
2
2
  import { ExpiryTokenCache } from "../util/expiry-token-cache";
3
3
  import { defaultFetch } from "../util/fetch-function";
4
4
  import { GlobalConstants } from "../util/global-contants";
5
+ import { RequestError } from "../util/request-error";
5
6
  export class HaloAuthenticationClient {
6
7
  fetchXstsToken;
7
8
  loadToken;
@@ -19,7 +20,8 @@ export class HaloAuthenticationClient {
19
20
  },
20
21
  ],
21
22
  };
22
- const result = await this.fetchFn("https://settings.svc.halowaypoint.com/spartan-token", {
23
+ const url = "https://settings.svc.halowaypoint.com/spartan-token";
24
+ const response = await this.fetchFn(url, {
23
25
  method: "POST",
24
26
  body: JSON.stringify(tokenRequest),
25
27
  headers: {
@@ -28,12 +30,18 @@ export class HaloAuthenticationClient {
28
30
  Accept: "application/json, text/plain, */*",
29
31
  },
30
32
  });
31
- const newToken = {
32
- token: result.SpartanToken,
33
- expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
34
- };
35
- await this.saveToken(newToken);
36
- return newToken;
33
+ if (response.status >= 200 && response.status < 300) {
34
+ const result = (await response.json());
35
+ const newToken = {
36
+ token: result.SpartanToken,
37
+ expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
38
+ };
39
+ await this.saveToken(newToken);
40
+ return newToken;
41
+ }
42
+ else {
43
+ throw new RequestError(url, response);
44
+ }
37
45
  }, () => this.loadToken());
38
46
  constructor(fetchXstsToken, loadToken, saveToken, fetchFn = defaultFetch) {
39
47
  this.fetchXstsToken = fetchXstsToken;
@@ -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;AAC9D,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAO1D,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,EAAE,eAAe,CAAC,wBAAwB;gBACtD,cAAc,EAAE,iCAAiC;gBACjD,MAAM,EAAE,mCAAmC;aAC5C;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
+ {"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;AACrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAC1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AAOrD,MAAM,OAAO,wBAAwB;IA0ChB;IACA;IAIA;IACA;IA/CX,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,GAAG,GAAG,qDAAqD,CAAC;QAClE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,MAAM,EAAE,MAAM;YACd,IAAI,EAAE,IAAI,CAAC,SAAS,CAAC,YAAY,CAAC;YAClC,OAAO,EAAE;gBACP,YAAY,EAAE,eAAe,CAAC,wBAAwB;gBACtD,cAAc,EAAE,iCAAiC;gBACjD,MAAM,EAAE,mCAAmC;aAC5C;SACF,CAAC,CAAC;QACH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;YACnD,MAAM,MAAM,GAAG,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAiB,CAAC;YAEvD,MAAM,QAAQ,GAAG;gBACf,KAAK,EAAE,MAAM,CAAC,YAAY;gBAC1B,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,UAAU,CAAC,WAAW,CAAC;aAC3D,CAAC;YACF,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;YAC/B,OAAO,QAAQ,CAAC;SACjB;aAAM;YACL,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;SACvC;IACH,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"}
@@ -2,6 +2,7 @@ import { DateTime } from "luxon";
2
2
  import { KeyedExpiryTokenCache } from "../util/keyed-expiry-token-cache";
3
3
  import { ExpiryTokenCache } from "../util/expiry-token-cache";
4
4
  import { defaultFetch } from "../util/fetch-function";
5
+ import { RequestError } from "../util/request-error";
5
6
  export var RelyingParty;
6
7
  (function (RelyingParty) {
7
8
  RelyingParty["Xbox"] = "http://xboxlive.com";
@@ -11,7 +12,8 @@ export class XboxAuthenticationClient {
11
12
  tokenPersisterOrPromise;
12
13
  fetchFn;
13
14
  userTokenCache = new ExpiryTokenCache(async (accessToken) => {
14
- const result = await this.fetchFn("https://user.auth.xboxlive.com/user/authenticate", {
15
+ const url = "https://user.auth.xboxlive.com/user/authenticate";
16
+ const response = await this.fetchFn(url, {
15
17
  method: "POST",
16
18
  headers: {
17
19
  "Content-Type": "application/json",
@@ -28,18 +30,25 @@ export class XboxAuthenticationClient {
28
30
  },
29
31
  }),
30
32
  });
31
- const token = {
32
- ...result,
33
- expiresAt: DateTime.fromISO(result.NotAfter),
34
- };
35
- await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
36
- return token;
33
+ if (response.status >= 200 && response.status < 300) {
34
+ const result = (await response.json());
35
+ const token = {
36
+ ...result,
37
+ expiresAt: DateTime.fromISO(result.NotAfter),
38
+ };
39
+ await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
40
+ return token;
41
+ }
42
+ else {
43
+ throw new RequestError(url, response);
44
+ }
37
45
  }, async () => {
38
46
  const tokenPersister = await this.tokenPersisterOrPromise;
39
47
  return ((await tokenPersister?.load("xbox.userToken")) ?? null);
40
48
  });
41
49
  xstsTicketCache = new KeyedExpiryTokenCache(async (relyingParty, userToken) => {
42
- const result = await this.fetchFn("https://xsts.auth.xboxlive.com/xsts/authorize", {
50
+ const url = "https://xsts.auth.xboxlive.com/xsts/authorize";
51
+ const response = await this.fetchFn(url, {
43
52
  method: "POST",
44
53
  headers: {
45
54
  "Content-Type": "application/json",
@@ -55,12 +64,18 @@ export class XboxAuthenticationClient {
55
64
  },
56
65
  }),
57
66
  });
58
- const token = {
59
- ...result,
60
- expiresAt: DateTime.fromISO(result.NotAfter),
61
- };
62
- await (await this.tokenPersisterOrPromise)?.save("xbox.xstsTicket." + relyingParty, token);
63
- return token;
67
+ if (response.status >= 200 && response.status < 300) {
68
+ const result = (await response.json());
69
+ const token = {
70
+ ...result,
71
+ expiresAt: DateTime.fromISO(result.NotAfter),
72
+ };
73
+ await (await this.tokenPersisterOrPromise)?.save("xbox.xstsTicket." + relyingParty, token);
74
+ return token;
75
+ }
76
+ else {
77
+ throw new RequestError(url, response);
78
+ }
64
79
  }, async (relyingParty) => (await (await this.tokenPersisterOrPromise)?.load("xbox.xstsTicket." + relyingParty)) ?? null);
65
80
  constructor(tokenPersisterOrPromise, fetchFn = defaultFetch) {
66
81
  this.tokenPersisterOrPromise = tokenPersisterOrPromise;
@@ -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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"}
@@ -3,6 +3,7 @@ import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
3
3
  import { AssetKind } from "../models/halo-infinite/asset-kind";
4
4
  import { MatchType } from "../models/halo-infinite/match-type";
5
5
  import { GlobalConstants } from "../util/global-contants";
6
+ import { RequestError } from "../util/request-error";
6
7
  const assetKindUrlMap = {
7
8
  [AssetKind.Map]: "Maps",
8
9
  [AssetKind.UgcGameVariant]: "UgcGameVariants",
@@ -42,15 +43,32 @@ export class HaloInfiniteClient {
42
43
  headers.set("Accept", "application/json");
43
44
  }
44
45
  headers.set("x-343-authorization-spartan", await this.spartanTokenProvider.getSpartanToken());
45
- const result = await this.fetchFn(url, {
46
+ const response = await this.fetchFn(url, {
46
47
  ...init,
47
48
  headers,
48
49
  });
49
- return result;
50
+ if (response.status >= 200 && response.status < 300) {
51
+ return (await response.json());
52
+ }
53
+ else {
54
+ throw new RequestError(url, response);
55
+ }
50
56
  }
51
57
  async executeResultsRequest(...args) {
52
- const result = await this.executeRequest(...args);
53
- return result.Value;
58
+ let resultsContainer;
59
+ try {
60
+ resultsContainer = await this.executeRequest(...args);
61
+ }
62
+ catch (e) {
63
+ if (e instanceof RequestError && e.response.status === 404) {
64
+ // 404s if even one of the xuids is invalid
65
+ resultsContainer = (await e.response.json());
66
+ }
67
+ else {
68
+ throw e;
69
+ }
70
+ }
71
+ return resultsContainer.Value;
54
72
  }
55
73
  async executePaginationRequest(count, start, queryParameters, ...args) {
56
74
  const [url, ...rest] = args;
@@ -127,14 +145,12 @@ export class HaloInfiniteClient {
127
145
  ...init,
128
146
  method: "get",
129
147
  });
130
- getMatchSkill = async (matchId, playerIds, init) => {
131
- return await this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=${playerIds
132
- .map(wrapPlayerId)
133
- .join(",")}`, {
134
- ...init,
135
- method: "get",
136
- });
137
- };
148
+ getMatchSkill = async (matchId, playerIds, init) => await this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=${playerIds
149
+ .map(wrapPlayerId)
150
+ .join(",")}`, {
151
+ ...init,
152
+ method: "get",
153
+ });
138
154
  /** Gets authoring metadata about a specific asset. */
139
155
  getAsset = (assetType, assetId, init) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`, {
140
156
  ...init,
@@ -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,3 +1,4 @@
1
+ import { RequestError } from "../util/request-error";
1
2
  import { defaultFetch } from "../util/fetch-function";
2
3
  export class XboxClient {
3
4
  xboxTokenProvider;
@@ -17,11 +18,16 @@ export class XboxClient {
17
18
  if (!headers.has("x-xbl-contract-version")) {
18
19
  headers.set("x-xbl-contract-version", "1");
19
20
  }
20
- const result = await this.fetchFn(url, {
21
+ const response = await this.fetchFn(url, {
21
22
  ...init,
22
23
  headers,
23
24
  });
24
- return result;
25
+ if (response.status >= 200 && response.status < 300) {
26
+ return (await response.json());
27
+ }
28
+ else {
29
+ throw new RequestError(url, response);
30
+ }
25
31
  }
26
32
  async searchUsers(query, init) {
27
33
  const { results } = await this.executeRequest(`https://usersearch.xboxlive.com/suggest?q=${encodeURIComponent(query)}`, { ...init, method: "GET" });
@@ -1 +1 @@
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,IAAiB;QAC5D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;SAC3C;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;YACjC,OAAO,CAAC,GAAG,CACT,eAAe,EACf,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAClD,CAAC;SACH;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE;YAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;SAC5C;QACD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,OAAO,CAAI,GAAG,EAAE;YACxC,GAAG,IAAI;YACP,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,MAAM,CAAC;IAChB,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,KAAa,EACb,IAA2C;QAE3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAa3C,6CAA6C,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACxE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAC3B,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,IAA2C;QACpE,OAAO,MAAM,IAAI,CAAC,cAAc,CAC9B,8DAA8D,EAC9D,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAC3B,CAAC;IACJ,CAAC;CACF"}
1
+ {"version":3,"file":"xbox-client.js","sourceRoot":"","sources":["../../src/core/xbox-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;AACrD,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,IAAiB;QAC5D,MAAM,OAAO,GAAG,IAAI,OAAO,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;QAC1C,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE;YAC1B,OAAO,CAAC,GAAG,CAAC,QAAQ,EAAE,kBAAkB,CAAC,CAAC;SAC3C;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,eAAe,CAAC,EAAE;YACjC,OAAO,CAAC,GAAG,CACT,eAAe,EACf,MAAM,IAAI,CAAC,iBAAiB,CAAC,kBAAkB,EAAE,CAClD,CAAC;SACH;QACD,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,wBAAwB,CAAC,EAAE;YAC1C,OAAO,CAAC,GAAG,CAAC,wBAAwB,EAAE,GAAG,CAAC,CAAC;SAC5C;QACD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE;YACvC,GAAG,IAAI;YACP,OAAO;SACR,CAAC,CAAC;QAEH,IAAI,QAAQ,CAAC,MAAM,IAAI,GAAG,IAAI,QAAQ,CAAC,MAAM,GAAG,GAAG,EAAE;YACnD,OAAO,CAAC,MAAM,QAAQ,CAAC,IAAI,EAAE,CAAM,CAAC;SACrC;aAAM;YACL,MAAM,IAAI,YAAY,CAAC,GAAG,EAAE,QAAQ,CAAC,CAAC;SACvC;IACH,CAAC;IAEM,KAAK,CAAC,WAAW,CACtB,KAAa,EACb,IAA2C;QAE3C,MAAM,EAAE,OAAO,EAAE,GAAG,MAAM,IAAI,CAAC,cAAc,CAa3C,6CAA6C,kBAAkB,CAAC,KAAK,CAAC,EAAE,EACxE,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAC3B,CAAC;QACF,OAAO,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,MAAM,EAAE,EAAE,EAAE,CAAC,MAAM,CAAC,CAAC;IAC7C,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,IAA2C;QACpE,OAAO,MAAM,IAAI,CAAC,cAAc,CAC9B,8DAA8D,EAC9D,EAAE,GAAG,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,CAC3B,CAAC;IACJ,CAAC;CACF"}
package/dist/index.d.ts CHANGED
@@ -24,3 +24,4 @@ export { ServiceRecord } from "./models/halo-infinite/service-record";
24
24
  export { Stats } from "./models/halo-infinite/stats";
25
25
  export { UserInfo } from "./models/halo-infinite/user-info";
26
26
  export { FetchFunction } from "./util/fetch-function";
27
+ export { RequestError } from "./util/request-error";
package/dist/index.js CHANGED
@@ -9,4 +9,5 @@ export { GameVariantCategory } from "./models/halo-infinite/game-variant-categor
9
9
  export { MatchOutcome } from "./models/halo-infinite/match-outcome";
10
10
  export { MatchType } from "./models/halo-infinite/match-type";
11
11
  export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
12
+ export { RequestError } from "./util/request-error";
12
13
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,wBAAwB,GAEzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAEL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOhD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAK9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,wBAAwB,GAEzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAEL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAOhD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAK9D,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAKhF,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
@@ -1,13 +1,4 @@
1
- interface CsrObject {
2
- Value: number;
3
- MeasurementMatchesRemaining: number;
4
- Tier: string;
5
- TierStart: number;
6
- NextTier: string;
7
- NextTierStart: number;
8
- NextSubTier: number;
9
- InitialMeasurementMatches: number;
10
- }
1
+ import { PlaylistCsr } from "./playlist-csr";
11
2
  interface StatPerformance {
12
3
  Count: number;
13
4
  Expected: number;
@@ -24,8 +15,8 @@ export interface MatchSkill<TResult extends 1 | 0 = 0> {
24
15
  [key: number]: number;
25
16
  };
26
17
  RankRecap: {
27
- PreMatchCsr: CsrObject;
28
- PostMatchCsr: CsrObject;
18
+ PreMatchCsr: PlaylistCsr;
19
+ PostMatchCsr: PlaylistCsr;
29
20
  };
30
21
  StatPerformances: TResult extends 0 ? {
31
22
  Kills: StatPerformance;
@@ -1,2 +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>;
1
+ export type FetchFunction = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
2
+ export declare const defaultFetch: (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
@@ -1,5 +1,2 @@
1
- export const defaultFetch = async (input, init) => {
2
- const response = await fetch(input, init);
3
- return response.json();
4
- };
1
+ export const defaultFetch = async (input, init) => fetch(input, init);
5
2
  //# sourceMappingURL=fetch-function.js.map
@@ -1 +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"}
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,EACC,EAAE,CAAC,KAAK,CAAC,KAAK,EAAE,IAAI,CAAC,CAAC"}
@@ -0,0 +1,5 @@
1
+ export declare class RequestError extends Error {
2
+ readonly request: RequestInfo | URL;
3
+ readonly response: Response;
4
+ constructor(request: RequestInfo | URL, response: Response);
5
+ }
@@ -0,0 +1,10 @@
1
+ export class RequestError extends Error {
2
+ request;
3
+ response;
4
+ constructor(request, response) {
5
+ super(`${typeof request === "object" && "url" in request ? request.url : request} ${response.status} ${response.statusText}`);
6
+ this.request = request;
7
+ this.response = response;
8
+ }
9
+ }
10
+ //# sourceMappingURL=request-error.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"request-error.js","sourceRoot":"","sources":["../../src/util/request-error.ts"],"names":[],"mappings":"AAAA,MAAM,OAAO,YAAa,SAAQ,KAAK;IAEnB;IACA;IAFlB,YACkB,OAA0B,EAC1B,QAAkB;QAElC,KAAK,CACH,GACE,OAAO,OAAO,KAAK,QAAQ,IAAI,KAAK,IAAI,OAAO,CAAC,CAAC,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC,CAAC,OAClE,IAAI,QAAQ,CAAC,MAAM,IAAI,QAAQ,CAAC,UAAU,EAAE,CAC7C,CAAC;QAPc,YAAO,GAAP,OAAO,CAAmB;QAC1B,aAAQ,GAAR,QAAQ,CAAU;IAOpC,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.3.2",
4
+ "version": "6.0.0",
5
5
  "description": "An NPM package for accessing the official Halo Infinite API.",
6
6
  "main": "dist/index.js",
7
7
  "exports": {
@@ -4,6 +4,7 @@ import type { SpartanTokenRequest } from "../models/spartan-token-request";
4
4
  import { ExpiryTokenCache } from "../util/expiry-token-cache";
5
5
  import { FetchFunction, defaultFetch } from "../util/fetch-function";
6
6
  import { GlobalConstants } from "../util/global-contants";
7
+ import { RequestError } from "../util/request-error";
7
8
 
8
9
  export interface Token {
9
10
  token: string;
@@ -25,25 +26,28 @@ export class HaloAuthenticationClient {
25
26
  },
26
27
  ],
27
28
  };
28
- const result = await this.fetchFn<SpartanToken>(
29
- "https://settings.svc.halowaypoint.com/spartan-token",
30
- {
31
- method: "POST",
32
- body: JSON.stringify(tokenRequest),
33
- headers: {
34
- "User-Agent": GlobalConstants.HALO_WAYPOINT_USER_AGENT,
35
- "Content-Type": "application/json; charset=utf-8",
36
- Accept: "application/json, text/plain, */*",
37
- },
38
- }
39
- );
29
+ const url = "https://settings.svc.halowaypoint.com/spartan-token";
30
+ const response = await this.fetchFn(url, {
31
+ method: "POST",
32
+ body: JSON.stringify(tokenRequest),
33
+ headers: {
34
+ "User-Agent": GlobalConstants.HALO_WAYPOINT_USER_AGENT,
35
+ "Content-Type": "application/json; charset=utf-8",
36
+ Accept: "application/json, text/plain, */*",
37
+ },
38
+ });
39
+ if (response.status >= 200 && response.status < 300) {
40
+ const result = (await response.json()) as SpartanToken;
40
41
 
41
- const newToken = {
42
- token: result.SpartanToken,
43
- expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
44
- };
45
- await this.saveToken(newToken);
46
- return newToken;
42
+ const newToken = {
43
+ token: result.SpartanToken,
44
+ expiresAt: DateTime.fromISO(result.ExpiresUtc.ISO8601Date),
45
+ };
46
+ await this.saveToken(newToken);
47
+ return newToken;
48
+ } else {
49
+ throw new RequestError(url, response);
50
+ }
47
51
  },
48
52
  () => this.loadToken()
49
53
  );
@@ -4,6 +4,7 @@ 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
6
  import { FetchFunction, defaultFetch } from "../util/fetch-function";
7
+ import { RequestError } from "../util/request-error";
7
8
 
8
9
  export enum RelyingParty {
9
10
  Xbox = "http://xboxlive.com",
@@ -19,33 +20,39 @@ export interface XboxAuthenticationToken {
19
20
  export class XboxAuthenticationClient {
20
21
  private userTokenCache = new ExpiryTokenCache(
21
22
  async (accessToken: string) => {
22
- const result = await this.fetchFn<XboxTicket>(
23
- "https://user.auth.xboxlive.com/user/authenticate",
24
- {
25
- method: "POST",
26
- headers: {
27
- "Content-Type": "application/json",
28
- Accept: "application/json",
29
- "x-xbl-contract-version": "1",
23
+ const url = "https://user.auth.xboxlive.com/user/authenticate";
24
+ const response = await this.fetchFn(url, {
25
+ method: "POST",
26
+ headers: {
27
+ "Content-Type": "application/json",
28
+ Accept: "application/json",
29
+ "x-xbl-contract-version": "1",
30
+ },
31
+ body: JSON.stringify({
32
+ RelyingParty: "http://auth.xboxlive.com",
33
+ TokenType: "JWT",
34
+ Properties: {
35
+ AuthMethod: "RPS",
36
+ SiteName: "user.auth.xboxlive.com",
37
+ RpsTicket: `d=${accessToken}`,
30
38
  },
31
- body: JSON.stringify({
32
- RelyingParty: "http://auth.xboxlive.com",
33
- TokenType: "JWT",
34
- Properties: {
35
- AuthMethod: "RPS",
36
- SiteName: "user.auth.xboxlive.com",
37
- RpsTicket: `d=${accessToken}`,
38
- },
39
- }),
40
- }
41
- );
39
+ }),
40
+ });
41
+
42
+ if (response.status >= 200 && response.status < 300) {
43
+ const result = (await response.json()) as XboxTicket;
42
44
 
43
- const token = {
44
- ...result,
45
- expiresAt: DateTime.fromISO(result.NotAfter),
46
- };
47
- await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
48
- return token;
45
+ const token = {
46
+ ...result,
47
+ expiresAt: DateTime.fromISO(result.NotAfter),
48
+ };
49
+ await (
50
+ await this.tokenPersisterOrPromise
51
+ )?.save("xbox.userToken", token);
52
+ return token;
53
+ } else {
54
+ throw new RequestError(url, response);
55
+ }
49
56
  },
50
57
  async () => {
51
58
  const tokenPersister = await this.tokenPersisterOrPromise;
@@ -58,34 +65,38 @@ export class XboxAuthenticationClient {
58
65
  );
59
66
  private xstsTicketCache = new KeyedExpiryTokenCache(
60
67
  async (relyingParty: RelyingParty, userToken: string) => {
61
- const result = await this.fetchFn<XboxTicket>(
62
- "https://xsts.auth.xboxlive.com/xsts/authorize",
63
- {
64
- method: "POST",
65
- headers: {
66
- "Content-Type": "application/json",
67
- Accept: "application/json",
68
- "x-xbl-contract-version": "1",
68
+ const url = "https://xsts.auth.xboxlive.com/xsts/authorize";
69
+ const response = await this.fetchFn(url, {
70
+ method: "POST",
71
+ headers: {
72
+ "Content-Type": "application/json",
73
+ Accept: "application/json",
74
+ "x-xbl-contract-version": "1",
75
+ },
76
+ body: JSON.stringify({
77
+ RelyingParty: relyingParty,
78
+ TokenType: "JWT",
79
+ Properties: {
80
+ SandboxId: "RETAIL",
81
+ UserTokens: [userToken],
69
82
  },
70
- body: JSON.stringify({
71
- RelyingParty: relyingParty,
72
- TokenType: "JWT",
73
- Properties: {
74
- SandboxId: "RETAIL",
75
- UserTokens: [userToken],
76
- },
77
- }),
78
- }
79
- );
83
+ }),
84
+ });
80
85
 
81
- const token = {
82
- ...result,
83
- expiresAt: DateTime.fromISO(result.NotAfter),
84
- };
85
- await (
86
- await this.tokenPersisterOrPromise
87
- )?.save("xbox.xstsTicket." + relyingParty, token);
88
- return token;
86
+ if (response.status >= 200 && response.status < 300) {
87
+ const result = (await response.json()) as XboxTicket;
88
+
89
+ const token = {
90
+ ...result,
91
+ expiresAt: DateTime.fromISO(result.NotAfter),
92
+ };
93
+ await (
94
+ await this.tokenPersisterOrPromise
95
+ )?.save("xbox.xstsTicket." + relyingParty, token);
96
+ return token;
97
+ } else {
98
+ throw new RequestError(url, response);
99
+ }
89
100
  },
90
101
  async (relyingParty) =>
91
102
  (await (
@@ -16,6 +16,7 @@ import { ServiceRecord } from "../models/halo-infinite/service-record";
16
16
  import { UserInfo } from "../models/halo-infinite/user-info";
17
17
  import { GlobalConstants } from "../util/global-contants";
18
18
  import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
19
+ import { RequestError } from "../util/request-error";
19
20
 
20
21
  export interface ResultContainer<TValue> {
21
22
  Id: string;
@@ -85,20 +86,35 @@ export class HaloInfiniteClient {
85
86
  await this.spartanTokenProvider.getSpartanToken()
86
87
  );
87
88
 
88
- const result = await this.fetchFn<T>(url, {
89
+ const response = await this.fetchFn(url, {
89
90
  ...init,
90
91
  headers,
91
92
  });
92
93
 
93
- return result;
94
+ if (response.status >= 200 && response.status < 300) {
95
+ return (await response.json()) as T;
96
+ } else {
97
+ throw new RequestError(url, response);
98
+ }
94
99
  }
95
100
 
96
101
  private async executeResultsRequest<T>(
97
102
  ...args: Parameters<HaloInfiniteClient["executeRequest"]>
98
103
  ) {
99
- const result = await this.executeRequest<ResultsContainer<T>>(...args);
100
-
101
- return result.Value;
104
+ let resultsContainer: ResultsContainer<T>;
105
+ try {
106
+ resultsContainer = await this.executeRequest<ResultsContainer<T>>(
107
+ ...args
108
+ );
109
+ } catch (e) {
110
+ if (e instanceof RequestError && e.response.status === 404) {
111
+ // 404s if even one of the xuids is invalid
112
+ resultsContainer = (await e.response.json()) as ResultsContainer<T>;
113
+ } else {
114
+ throw e;
115
+ }
116
+ }
117
+ return resultsContainer.Value;
102
118
  }
103
119
 
104
120
  private async executePaginationRequest<T>(
@@ -265,8 +281,8 @@ export class HaloInfiniteClient {
265
281
  matchId: string,
266
282
  playerIds: string[],
267
283
  init?: Omit<RequestInit, "body" | "method">
268
- ) => {
269
- return await this.executeResultsRequest<MatchSkill>(
284
+ ) =>
285
+ await this.executeResultsRequest<MatchSkill>(
270
286
  `https://${HaloCoreEndpoints.SkillOrigin}.${
271
287
  HaloCoreEndpoints.ServiceDomain
272
288
  }/hi/matches/${matchId}/skill?players=${playerIds
@@ -277,7 +293,6 @@ export class HaloInfiniteClient {
277
293
  method: "get",
278
294
  }
279
295
  );
280
- };
281
296
 
282
297
  /** Gets authoring metadata about a specific asset. */
283
298
  public getAsset = <TAssetType extends keyof AssetKindTypeMap>(
@@ -1,3 +1,4 @@
1
+ import { RequestError } from "../util/request-error";
1
2
  import { FetchFunction, defaultFetch } from "../util/fetch-function";
2
3
  import { XboxTokenProvider } from "./token-providers/xbox-token-provider";
3
4
 
@@ -21,12 +22,16 @@ export class XboxClient {
21
22
  if (!headers.has("x-xbl-contract-version")) {
22
23
  headers.set("x-xbl-contract-version", "1");
23
24
  }
24
- const result = await this.fetchFn<T>(url, {
25
+ const response = await this.fetchFn(url, {
25
26
  ...init,
26
27
  headers,
27
28
  });
28
29
 
29
- return result;
30
+ if (response.status >= 200 && response.status < 300) {
31
+ return (await response.json()) as T;
32
+ } else {
33
+ throw new RequestError(url, response);
34
+ }
30
35
  }
31
36
 
32
37
  public async searchUsers(
package/src/index.ts CHANGED
@@ -40,3 +40,4 @@ export { ServiceRecord } from "./models/halo-infinite/service-record";
40
40
  export { Stats } from "./models/halo-infinite/stats";
41
41
  export { UserInfo } from "./models/halo-infinite/user-info";
42
42
  export { FetchFunction } from "./util/fetch-function";
43
+ export { RequestError } from "./util/request-error";
@@ -1,13 +1,4 @@
1
- interface CsrObject {
2
- Value: number;
3
- MeasurementMatchesRemaining: number;
4
- Tier: string;
5
- TierStart: number;
6
- NextTier: string;
7
- NextTierStart: number;
8
- NextSubTier: number;
9
- InitialMeasurementMatches: number;
10
- }
1
+ import { PlaylistCsr } from "./playlist-csr";
11
2
 
12
3
  interface StatPerformance {
13
4
  Count: number;
@@ -27,8 +18,8 @@ export interface MatchSkill<TResult extends 1 | 0 = 0> {
27
18
  [key: number]: number;
28
19
  };
29
20
  RankRecap: {
30
- PreMatchCsr: CsrObject;
31
- PostMatchCsr: CsrObject;
21
+ PreMatchCsr: PlaylistCsr;
22
+ PostMatchCsr: PlaylistCsr;
32
23
  };
33
24
  StatPerformances: TResult extends 0
34
25
  ? {
@@ -1,12 +1,9 @@
1
- export type FetchFunction = <TResponse = unknown>(
1
+ export type FetchFunction = (
2
2
  input: RequestInfo | URL,
3
3
  init?: RequestInit
4
- ) => Promise<TResponse>;
4
+ ) => Promise<Response>;
5
5
 
6
- export const defaultFetch = async <TResponse>(
6
+ export const defaultFetch = async (
7
7
  input: RequestInfo | URL,
8
8
  init?: RequestInit
9
- ): Promise<TResponse> => {
10
- const response = await fetch(input, init);
11
- return response.json();
12
- };
9
+ ): Promise<Response> => fetch(input, init);
@@ -0,0 +1,12 @@
1
+ export class RequestError extends Error {
2
+ constructor(
3
+ public readonly request: RequestInfo | URL,
4
+ public readonly response: Response
5
+ ) {
6
+ super(
7
+ `${
8
+ typeof request === "object" && "url" in request ? request.url : request
9
+ } ${response.status} ${response.statusText}`
10
+ );
11
+ }
12
+ }
@@ -1,11 +0,0 @@
1
- import { TokenPersister } from "../token-persister";
2
- import { SpartanTokenProvider } from ".";
3
- /**
4
- * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
5
- * process. This is useful for applications that do not need to contend with
6
- * CORS restrictions.
7
- */
8
- export declare class AutoXstsSpartanTokenProvider implements SpartanTokenProvider {
9
- readonly getSpartanToken: () => Promise<string>;
10
- constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, tokenPersister?: TokenPersister);
11
- }
@@ -1,43 +0,0 @@
1
- import { RelyingParty, XboxAuthenticationClient, } from "../../authentication/xbox-authentication-client";
2
- import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
3
- /**
4
- * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
5
- * process. This is useful for applications that do not need to contend with
6
- * CORS restrictions.
7
- */
8
- export class AutoXstsSpartanTokenProvider {
9
- getSpartanToken;
10
- constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
11
- const xboxAuthClient = new XboxAuthenticationClient(clientId, redirectUri, getAuthCode, async () => {
12
- if (tokenPersister) {
13
- return await tokenPersister.load("xbox.authToken");
14
- }
15
- else {
16
- return null;
17
- }
18
- }, async (token) => {
19
- if (tokenPersister) {
20
- await tokenPersister.save("xbox.authToken", token);
21
- }
22
- });
23
- const haloAuthClient = new HaloAuthenticationClient(async () => {
24
- const accessToken = await xboxAuthClient.getAccessToken();
25
- const userToken = await xboxAuthClient.getUserToken(accessToken);
26
- const xstsTicket = await xboxAuthClient.getXstsTicket(userToken, RelyingParty.Halo);
27
- return xstsTicket.Token;
28
- }, async () => {
29
- if (tokenPersister) {
30
- return await tokenPersister.load("halo.authToken");
31
- }
32
- else {
33
- return null;
34
- }
35
- }, async (token) => {
36
- if (tokenPersister) {
37
- await tokenPersister.save("halo.authToken", token);
38
- }
39
- });
40
- this.getSpartanToken = () => haloAuthClient.getSpartanToken();
41
- }
42
- }
43
- //# sourceMappingURL=auto-xsts-sartan-token-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-xsts-sartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAG3F;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IACvB,eAAe,CAAwB;IAEvD,YACE,QAAgB,EAChB,WAAmB,EACnB,WAAsD,EACtD,cAA+B;QAE/B,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,QAAQ,EACR,WAAW,EACX,WAAW,EACX,KAAK,IAAI,EAAE;YACT,IAAI,cAAc,EAAE;gBAClB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACpD;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,cAAc,EAAE;gBAClB,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;aACpD;QACH,CAAC,CACF,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,KAAK,IAAI,EAAE;YACT,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC;YAC1D,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,SAAS,EACT,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,cAAc,EAAE;gBAClB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACpD;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,cAAc,EAAE;gBAClB,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;aACpD;QACH,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
@@ -1,3 +0,0 @@
1
- export interface SpartanTokenProvider {
2
- getSpartanToken(): Promise<string>;
3
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/spartan-token-fetchers/index.ts"],"names":[],"mappings":""}
@@ -1,12 +0,0 @@
1
- import { TokenPersister } from "../token-persister";
2
- import { SpartanTokenProvider } from ".";
3
- /**
4
- * A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.
5
- * Since requests to the Halo API are subject to CORS restrictions a
6
- * HaloAuthenticationClient can be instantitated with a pre-fetched XSTS ticket
7
- * and run on a server (such as one provided by the user).
8
- */
9
- export declare class StaticXstsTicketTokenSpartanTokenProvider implements SpartanTokenProvider {
10
- readonly getSpartanToken: () => Promise<string>;
11
- constructor(xstsTicketToken: string, tokenPersister?: TokenPersister);
12
- }
@@ -1,26 +0,0 @@
1
- import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
2
- /**
3
- * A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.
4
- * Since requests to the Halo API are subject to CORS restrictions a
5
- * HaloAuthenticationClient can be instantitated with a pre-fetched XSTS ticket
6
- * and run on a server (such as one provided by the user).
7
- */
8
- export class StaticXstsTicketTokenSpartanTokenProvider {
9
- getSpartanToken;
10
- constructor(xstsTicketToken, tokenPersister) {
11
- const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => {
12
- if (tokenPersister) {
13
- return await tokenPersister.load("halo.authToken");
14
- }
15
- else {
16
- return null;
17
- }
18
- }, async (token) => {
19
- if (tokenPersister) {
20
- await tokenPersister.save("halo.authToken", token);
21
- }
22
- });
23
- this.getSpartanToken = () => haloAuthClient.getSpartanToken();
24
- }
25
- }
26
- //# sourceMappingURL=static-xsts-ticket-token-spartan-token-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-fetchers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAG3F;;;;;GAKG;AAEH,MAAM,OAAO,yCAAyC;IAGpC,eAAe,CAAwB;IAEvD,YAAY,eAAuB,EAAE,cAA+B;QAClE,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,GAAG,EAAE,CAAC,eAAe,EACrB,KAAK,IAAI,EAAE;YACT,IAAI,cAAc,EAAE;gBAClB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACpD;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,cAAc,EAAE;gBAClB,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;aACpD;QACH,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
@@ -1,11 +0,0 @@
1
- import { TokenPersister } from "../token-persisters";
2
- import { SpartanTokenProvider } from ".";
3
- /**
4
- * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
5
- * process. This is useful for applications that do not need to contend with
6
- * CORS restrictions.
7
- */
8
- export declare class AutoXstsSpartanTokenProvider implements SpartanTokenProvider {
9
- readonly getSpartanToken: () => Promise<string>;
10
- constructor(getOauth2AccessToken: () => Promise<string>, tokenPersister?: TokenPersister);
11
- }
@@ -1,29 +0,0 @@
1
- import { XboxAuthenticationClient, } from "../../authentication/xbox-authentication-client";
2
- import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
3
- import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";
4
- /**
5
- * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
6
- * process. This is useful for applications that do not need to contend with
7
- * CORS restrictions.
8
- */
9
- export class AutoXstsSpartanTokenProvider {
10
- getSpartanToken;
11
- constructor(getOauth2AccessToken, tokenPersister) {
12
- let actualTokenPersister;
13
- if (tokenPersister) {
14
- actualTokenPersister = tokenPersister;
15
- }
16
- else {
17
- actualTokenPersister = inMemoryTokenPersister;
18
- }
19
- const xboxAuthClient = new XboxAuthenticationClient(tokenPersister);
20
- const haloAuthClient = new HaloAuthenticationClient(async () => {
21
- const xstsTicket = await xboxAuthClient.getXstsTicket(getOauth2AccessToken);
22
- return xstsTicket.Token;
23
- }, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
24
- await actualTokenPersister.save("halo.authToken", token);
25
- });
26
- this.getSpartanToken = () => haloAuthClient.getSpartanToken();
27
- }
28
- }
29
- //# sourceMappingURL=auto-xsts-spartan-token-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-xsts-spartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-providers/auto-xsts-spartan-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAEvF;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IACvB,eAAe,CAAwB;IAEvD,YACE,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,CACrB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC7D,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
@@ -1,3 +0,0 @@
1
- export interface SpartanTokenProvider {
2
- getSpartanToken(): Promise<string>;
3
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=index.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/spartan-token-providers/index.ts"],"names":[],"mappings":""}
@@ -1,12 +0,0 @@
1
- import { TokenPersister } from "../token-persisters";
2
- import { SpartanTokenProvider } from ".";
3
- /**
4
- * A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.
5
- * Since requests to the Halo API are subject to CORS restrictions a
6
- * HaloAuthenticationClient can be instantitated with a pre-fetched XSTS ticket
7
- * and run on a server (such as one provided by the user).
8
- */
9
- export declare class StaticXstsTicketTokenSpartanTokenProvider implements SpartanTokenProvider {
10
- readonly getSpartanToken: () => Promise<string>;
11
- constructor(xstsTicketToken: string, tokenPersister?: TokenPersister);
12
- }
@@ -1,25 +0,0 @@
1
- import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
2
- import { inMemoryTokenPersister } from "../token-persisters/in-memory-token-persister";
3
- /**
4
- * A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.
5
- * Since requests to the Halo API are subject to CORS restrictions a
6
- * HaloAuthenticationClient can be instantitated with a pre-fetched XSTS ticket
7
- * and run on a server (such as one provided by the user).
8
- */
9
- export class StaticXstsTicketTokenSpartanTokenProvider {
10
- getSpartanToken;
11
- constructor(xstsTicketToken, tokenPersister) {
12
- let actualTokenPersister;
13
- if (tokenPersister) {
14
- actualTokenPersister = tokenPersister;
15
- }
16
- else {
17
- actualTokenPersister = inMemoryTokenPersister;
18
- }
19
- const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
20
- await actualTokenPersister.save("halo.authToken", token);
21
- });
22
- this.getSpartanToken = () => haloAuthClient.getSpartanToken();
23
- }
24
- }
25
- //# sourceMappingURL=static-xsts-ticket-token-spartan-token-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAEvF;;;;;GAKG;AACH,MAAM,OAAO,yCAAyC;IAGpC,eAAe,CAAwB;IAEvD,YAAY,eAAuB,EAAE,cAA+B;QAClE,IAAI,oBAAoC,CAAC;QACzC,IAAI,cAAc,EAAE;YAClB,oBAAoB,GAAG,cAAc,CAAC;SACvC;aAAM;YACL,oBAAoB,GAAG,sBAAsB,CAAC;SAC/C;QAED,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,GAAG,EAAE,CAAC,eAAe,EACrB,KAAK,IAAI,EAAE,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC7D,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
@@ -1,4 +0,0 @@
1
- export interface TokenPersister {
2
- load: <T>(tokenName: string) => Promise<T> | T;
3
- save: (tokenName: string, token: unknown) => Promise<void> | void;
4
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=token-persister.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"token-persister.js","sourceRoot":"","sources":["../../src/core/token-persister.ts"],"names":[],"mappings":""}
@@ -1,11 +0,0 @@
1
- import { TokenPersister } from "../../token-persisters";
2
- import { SpartanTokenProvider } from ".";
3
- /**
4
- * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
5
- * process. This is useful for applications that do not need to contend with
6
- * CORS restrictions.
7
- */
8
- export declare class AutoXstsSpartanTokenProvider implements SpartanTokenProvider {
9
- readonly getSpartanToken: () => Promise<string>;
10
- constructor(getOauth2AccessToken: () => Promise<string>, tokenPersister?: TokenPersister);
11
- }
@@ -1,29 +0,0 @@
1
- import { XboxAuthenticationClient, } from "../../../authentication/xbox-authentication-client";
2
- import { HaloAuthenticationClient } from "../../../authentication/halo-authentication-client";
3
- import { inMemoryTokenPersister } from "../../token-persisters/in-memory-token-persister";
4
- /**
5
- * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
6
- * process. This is useful for applications that do not need to contend with
7
- * CORS restrictions.
8
- */
9
- export class AutoXstsSpartanTokenProvider {
10
- getSpartanToken;
11
- constructor(getOauth2AccessToken, tokenPersister) {
12
- let actualTokenPersister;
13
- if (tokenPersister) {
14
- actualTokenPersister = tokenPersister;
15
- }
16
- else {
17
- actualTokenPersister = inMemoryTokenPersister;
18
- }
19
- const xboxAuthClient = new XboxAuthenticationClient(tokenPersister);
20
- const haloAuthClient = new HaloAuthenticationClient(async () => {
21
- const xstsTicket = await xboxAuthClient.getXstsTicket(getOauth2AccessToken);
22
- return xstsTicket.Token;
23
- }, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
24
- await actualTokenPersister.save("halo.authToken", token);
25
- });
26
- this.getSpartanToken = () => haloAuthClient.getSpartanToken();
27
- }
28
- }
29
- //# sourceMappingURL=auto-xsts-spartan-token-provider.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"auto-xsts-spartan-token-provider.js","sourceRoot":"","sources":["../../../../src/core/token-providers/spartan-token-providers/auto-xsts-spartan-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EAEL,wBAAwB,GACzB,MAAM,oDAAoD,CAAC;AAE5D,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAE9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAE1F;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IACvB,eAAe,CAAwB;IAEvD,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,CACrB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE,CAAC,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,CAAC,EAC7D,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,oBAAoB,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QAC3D,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
@@ -1,56 +0,0 @@
1
- import { ApiFormattedDate } from "./api-formatted-date";
2
- export interface Asset {
3
- Tags: string[];
4
- AssetId: string;
5
- VersionId: string;
6
- PublicName: string;
7
- Description: string;
8
- Files: {
9
- Prefix: string;
10
- FileRelativePaths: string[];
11
- PrefixEndpoint: {
12
- AuthorityId: string;
13
- Path: string;
14
- QueryString: any;
15
- RetryPolicyId: string;
16
- TopicName: string;
17
- AcknowledgementTypeId: number;
18
- AuthenticationLifetimeExtensionSupported: boolean;
19
- ClearanceAware: boolean;
20
- };
21
- };
22
- Contributors: string[];
23
- AssetHome: number;
24
- AssetStats: {
25
- PlaysRecent: number;
26
- PlaysAllTime: number;
27
- Favorites: number;
28
- Likes: number;
29
- Bookmarks: number;
30
- ParentAssetCount: number;
31
- AverageRating: number;
32
- NumberOfRatings: number;
33
- };
34
- InspectionResult: number;
35
- CloneBehavior: number;
36
- Order: number;
37
- PublishedDate: ApiFormattedDate;
38
- VersionNumber: number;
39
- Admin: string;
40
- }
41
- export interface MapAsset extends Asset {
42
- CustomData: {
43
- NumOfObjectsOnMap: number;
44
- TagLevelId: number;
45
- IsBaked: boolean;
46
- HasNodeGraph: boolean;
47
- };
48
- PrefabLinks: unknown[];
49
- }
50
- export interface UcgGameVariantAsset extends Asset {
51
- CustomData: {
52
- KeyValues: object;
53
- HasNodeGraph: boolean;
54
- };
55
- EngineGameVariantLink?: Asset;
56
- }
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=authoring-asset.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"authoring-asset.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/authoring-asset.ts"],"names":[],"mappings":""}