halo-infinite-api 1.0.5 → 1.1.1

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 (42) hide show
  1. package/dist/core/halo-infinite-client.d.ts +16 -6
  2. package/dist/core/halo-infinite-client.js +38 -9
  3. package/dist/core/halo-infinite-client.js.map +1 -1
  4. package/dist/endpoints/halo-core-endpoints.d.ts +2 -0
  5. package/dist/endpoints/halo-core-endpoints.js +2 -0
  6. package/dist/endpoints/halo-core-endpoints.js.map +1 -1
  7. package/dist/index.d.ts +2 -0
  8. package/dist/index.js +1 -0
  9. package/dist/index.js.map +1 -1
  10. package/dist/models/halo-infinite/api-formatted-date.d.ts +3 -0
  11. package/dist/models/halo-infinite/api-formatted-date.js +2 -0
  12. package/dist/models/halo-infinite/api-formatted-date.js.map +1 -0
  13. package/dist/models/halo-infinite/asset-kind.d.ts +12 -0
  14. package/dist/models/halo-infinite/asset-kind.js +14 -0
  15. package/dist/models/halo-infinite/asset-kind.js.map +1 -0
  16. package/dist/models/halo-infinite/asset-version-link.d.ts +6 -0
  17. package/dist/models/halo-infinite/asset-version-link.js +2 -0
  18. package/dist/models/halo-infinite/asset-version-link.js.map +1 -0
  19. package/dist/models/halo-infinite/asset.d.ts +56 -0
  20. package/dist/models/halo-infinite/asset.js +2 -0
  21. package/dist/models/halo-infinite/asset.js.map +1 -0
  22. package/dist/models/halo-infinite/authoring-asset.d.ts +56 -0
  23. package/dist/models/halo-infinite/authoring-asset.js +2 -0
  24. package/dist/models/halo-infinite/authoring-asset.js.map +1 -0
  25. package/dist/models/halo-infinite/match-info.d.ts +5 -20
  26. package/dist/models/halo-infinite/match-outcome.d.ts +3 -1
  27. package/dist/models/halo-infinite/match-outcome.js +2 -0
  28. package/dist/models/halo-infinite/match-outcome.js.map +1 -1
  29. package/dist/models/halo-infinite/match-skill.d.ts +1 -1
  30. package/dist/models/spartan-token.d.ts +2 -3
  31. package/package.json +1 -1
  32. package/src/core/halo-infinite-client.ts +88 -23
  33. package/src/endpoints/halo-core-endpoints.ts +2 -0
  34. package/src/index.ts +2 -0
  35. package/src/models/halo-infinite/api-formatted-date.ts +3 -0
  36. package/src/models/halo-infinite/asset-kind.ts +12 -0
  37. package/src/models/halo-infinite/asset-version-link.ts +7 -0
  38. package/src/models/halo-infinite/asset.ts +59 -0
  39. package/src/models/halo-infinite/match-info.ts +5 -20
  40. package/src/models/halo-infinite/match-outcome.ts +2 -0
  41. package/src/models/halo-infinite/match-skill.ts +1 -1
  42. package/src/models/spartan-token.ts +3 -1
@@ -1,11 +1,13 @@
1
- import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-container";
2
- import { UserInfo } from "../models/halo-infinite/user-info";
3
- import { ServiceRecord } from "../models/halo-infinite/service-record";
4
- import { Playlist } from "../models/halo-infinite/playlist";
5
- import { MatchType } from "../models/halo-infinite/match-type";
1
+ import { MatchSkill } from "../models/halo-infinite/match-skill";
6
2
  import { MatchStats } from "../models/halo-infinite/match-stats";
3
+ import { MatchType } from "../models/halo-infinite/match-type";
7
4
  import { PlayerMatchHistory } from "../models/halo-infinite/player-match-history";
8
- import { MatchSkill } from "../models/halo-infinite/match-skill";
5
+ import { Playlist } from "../models/halo-infinite/playlist";
6
+ import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-container";
7
+ import { ServiceRecord } from "../models/halo-infinite/service-record";
8
+ import { UserInfo } from "../models/halo-infinite/user-info";
9
+ import { MapAsset, UgcGameVariantAsset } from "../models/halo-infinite/asset";
10
+ import { AssetKind } from "../models/halo-infinite/asset-kind";
9
11
  interface ResultContainer<TValue> {
10
12
  Id: string;
11
13
  ResultCode: number;
@@ -15,6 +17,10 @@ interface TokenPersister {
15
17
  load: <T>(tokenName: string) => Promise<T>;
16
18
  save: (tokenName: string, token: unknown) => Promise<void>;
17
19
  }
20
+ type AssetKindTypeMap = {
21
+ [AssetKind.Map]: MapAsset;
22
+ [AssetKind.UgcGameVariant]: UgcGameVariantAsset;
23
+ };
18
24
  export declare class HaloInfiniteClient {
19
25
  private readonly haloAuthClient;
20
26
  constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, tokenPersister?: TokenPersister);
@@ -41,5 +47,9 @@ export declare class HaloInfiniteClient {
41
47
  getPlayerMatches: (playerXuid: string, type?: MatchType, count?: number, start?: number) => Promise<PlayerMatchHistory[]>;
42
48
  getMatchStats: (matchId: string) => Promise<MatchStats<import("..").GameVariantCategory>>;
43
49
  getMatchSkill: (matchId: string, playerIds: string[]) => Promise<ResultContainer<MatchSkill>[]>;
50
+ /** Gets authoring metadata about a specific asset. */
51
+ getAsset: <TAssetType extends keyof AssetKindTypeMap>(assetType: TAssetType, assetId: string) => Promise<AssetKindTypeMap[TAssetType]>;
52
+ /** Gets metadata related to a concrete version of a specified asset. */
53
+ getSpecificAssetVersion: <TAssetType extends keyof AssetKindTypeMap>(assetType: TAssetType, assetId: string, versionId: string) => Promise<AssetKindTypeMap[TAssetType]>;
44
54
  }
45
55
  export {};
@@ -1,9 +1,23 @@
1
1
  import axios, { AxiosHeaders } from "axios";
2
- import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
3
- import { GlobalConstants } from "../util/global-contants";
4
- import { RelyingParty, XboxAuthenticationClient, } from "../authentication/xbox-authentication-client";
5
2
  import { HaloAuthenticationClient } from "../authentication/halo-authentication-client";
3
+ import { RelyingParty, XboxAuthenticationClient, } from "../authentication/xbox-authentication-client";
4
+ import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
6
5
  import { MatchType } from "../models/halo-infinite/match-type";
6
+ import { GlobalConstants } from "../util/global-contants";
7
+ import { AssetKind } from "../models/halo-infinite/asset-kind";
8
+ const assetKindUrlMap = {
9
+ [AssetKind.Map]: "Maps",
10
+ [AssetKind.UgcGameVariant]: "UgcGameVariants",
11
+ };
12
+ function wrapPlayerId(playerId) {
13
+ if (/^\w+(\d+)/) {
14
+ return playerId;
15
+ }
16
+ else {
17
+ // Assume xuid
18
+ return `xuid(${playerId})`;
19
+ }
20
+ }
7
21
  export class HaloInfiniteClient {
8
22
  haloAuthClient;
9
23
  constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
@@ -37,7 +51,7 @@ export class HaloInfiniteClient {
37
51
  }
38
52
  });
39
53
  }
40
- async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
54
+ async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT, throwOn404 = true) {
41
55
  const headers = new AxiosHeaders({
42
56
  "User-Agent": userAgent,
43
57
  Accept: "application/json",
@@ -52,11 +66,12 @@ export class HaloInfiniteClient {
52
66
  url,
53
67
  method,
54
68
  headers,
69
+ validateStatus: (status) => status < 400 || (status === 404 && !throwOn404),
55
70
  });
56
71
  return response.data;
57
72
  }
58
- async executeResultsRequest(...args) {
59
- const result = await this.executeRequest(...args);
73
+ async executeResultsRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
74
+ const result = await this.executeRequest(url, method, useSpartanToken, useClearance, userAgent, false);
60
75
  return result.Value;
61
76
  }
62
77
  async executePaginationRequest(count, start, queryParameters, ...args) {
@@ -72,7 +87,9 @@ export class HaloInfiniteClient {
72
87
  * @param playlistId - Unique ID for the playlist.
73
88
  * @param playerIds - Array of player xuids.
74
89
  */
75
- getPlaylistCsr = (playlistId, playerIds) => this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/playlist/${playlistId}/csrs?players=xuid(${playerIds.join("),xuid(")})`, "get");
90
+ getPlaylistCsr = (playlistId, playerIds) => this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/playlist/${playlistId}/csrs?players=${playerIds
91
+ .map(wrapPlayerId)
92
+ .join(",")}`, "get");
76
93
  /** Get gamertag info for a player.
77
94
  * @param gamerTag - Gamertag to lookup.
78
95
  */
@@ -85,8 +102,20 @@ export class HaloInfiniteClient {
85
102
  * @param playlistId - Unique ID for the playlist.
86
103
  */
87
104
  getPlaylist = (playlistId) => this.executeRequest(`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/multiplayer/file/playlists/assets/${playlistId}.json`, "get");
88
- getPlayerMatches = (playerXuid, type = MatchType.All, count = 25, start = 0) => this.executePaginationRequest(count, start, { type: type.toString() }, `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/xuid(${playerXuid})/matches`, "get");
105
+ getPlayerMatches = (playerXuid, type = MatchType.All, count = 25, start = 0) => {
106
+ let params = {};
107
+ if (type !== MatchType.All) {
108
+ params.type = type.toString();
109
+ }
110
+ return this.executePaginationRequest(count, start, params, `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/xuid(${wrapPlayerId(playerXuid)})/matches`, "get");
111
+ };
89
112
  getMatchStats = (matchId) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, "get");
90
- getMatchSkill = (matchId, playerIds) => this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=xuid(${playerIds.join("),xuid(")})`, "get");
113
+ getMatchSkill = (matchId, playerIds) => this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=${playerIds
114
+ .map(wrapPlayerId)
115
+ .join(",")}`, "get");
116
+ /** Gets authoring metadata about a specific asset. */
117
+ getAsset = (assetType, assetId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`, "get");
118
+ /** Gets metadata related to a concrete version of a specified asset. */
119
+ getSpecificAssetVersion = (assetType, assetId, versionId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`, "get");
91
120
  }
92
121
  //# sourceMappingURL=halo-infinite-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,EAAE,YAAY,EAAE,MAAM,OAAO,CAAC;AAC5C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAGrE,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AAG1D,OAAO,EACL,YAAY,EACZ,wBAAwB,GAEzB,MAAM,8CAA8C,CAAC;AACtD,OAAO,EAAE,wBAAwB,EAAE,MAAM,8CAA8C,CAAC;AAExF,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AA2B/D,MAAM,OAAO,kBAAkB;IACZ,cAAc,CAA2B;IAE1D,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,IAAI,CAAC,cAAc,GAAG,IAAI,wBAAwB,CAChD,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;IACJ,CAAC;IAEO,KAAK,CAAC,cAAc,CAC1B,GAAW,EACX,MAAc,EACd,eAAe,GAAG,IAAI,EACtB,YAAY,GAAG,KAAK,EACpB,YAAoB,eAAe,CAAC,wBAAwB;QAE5D,MAAM,OAAO,GAAG,IAAI,YAAY,CAAC;YAC/B,YAAY,EAAE,SAAS;YACvB,MAAM,EAAE,kBAAkB;SAC3B,CAAC,CAAC;QAEH,IAAI,eAAe,EAAE;YACnB,OAAO,CAAC,GAAG,CACT,6BAA6B,EAC7B,MAAM,IAAI,CAAC,cAAc,CAAC,eAAe,EAAE,CAC5C,CAAC;SACH;QAED,IAAI,YAAY,EAAE;YAChB,MAAM,IAAI,KAAK,CAAC,2BAA2B,CAAC,CAAC;SAC9C;QAED,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,OAAO,CAAI;YACtC,GAAG;YACH,MAAM;YACN,OAAO;SACR,CAAC,CAAC;QAEH,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAEO,KAAK,CAAC,qBAAqB,CACjC,GAAG,IAAsD;QAEzD,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CAAsB,GAAG,IAAI,CAAC,CAAC;QAEvE,OAAO,MAAM,CAAC,KAAK,CAAC;IACtB,CAAC;IAEO,KAAK,CAAC,wBAAwB,CACpC,KAAa,EACb,KAAa,EACb,eAAuC,EACvC,GAAG,IAAsD;QAEzD,MAAM,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,GAAG,IAAI,CAAC;QAC5B,MAAM,MAAM,GAAG,MAAM,IAAI,CAAC,cAAc,CACtC,GAAG,GAAG,IAAI,IAAI,eAAe,CAAC;YAC5B,GAAG,eAAe;YAClB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;YACvB,KAAK,EAAE,KAAK,CAAC,QAAQ,EAAE;SACxB,CAAC,EAAE,EACJ,GAAG,IAAI,CACR,CAAC;QAEF,OAAO,MAAM,CAAC,OAAO,CAAC;IACxB,CAAC;IAED;;;OAGG;IACI,cAAc,GAAG,CAAC,UAAkB,EAAE,SAAmB,EAAE,EAAE,CAClE,IAAI,CAAC,qBAAqB,CACxB,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,gBAAgB,UAAU,sBAAsB,SAAS,CAAC,IAAI,CAC5D,SAAS,CACV,GAAG,EACJ,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,OAAO,GAAG,CAAC,QAAgB,EAAE,EAAE,CACpC,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,OAAO,IAAI,iBAAiB,CAAC,aAAa,aAAa,QAAQ,GAAG,EAC/F,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,oBAAoB,GAAG,CAAC,QAAgB,EAAE,EAAE,CACjD,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,aAAa,eAAe,QAAQ,0BAA0B,EAC5H,KAAK,CACN,CAAC;IAEJ;;OAEG;IACI,WAAW,GAAG,CAAC,UAAkB,EAAE,EAAE,CAC1C,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,aAAa,IAAI,iBAAiB,CAAC,aAAa,yCAAyC,UAAU,OAAO,EACvI,KAAK,CACN,CAAC;IAEG,gBAAgB,GAAG,CACxB,UAAkB,EAClB,OAAkB,SAAS,CAAC,GAAG,EAC/B,QAAgB,EAAE,EAClB,QAAgB,CAAC,EACjB,EAAE,CACF,IAAI,CAAC,wBAAwB,CAC3B,KAAK,EACL,KAAK,EACL,EAAE,IAAI,EAAE,IAAI,CAAC,QAAQ,EAAE,EAAE,EACzB,WAAW,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,aAAa,oBAAoB,UAAU,WAAW,EACpH,KAAK,CACN,CAAC;IAEG,aAAa,GAAG,CAAC,OAAe,EAAE,EAAE,CACzC,IAAI,CAAC,cAAc,CACjB,WAAW,iBAAiB,CAAC,WAAW,IAAI,iBAAiB,CAAC,aAAa,eAAe,OAAO,QAAQ,EACzG,KAAK,CACN,CAAC;IAEG,aAAa,GAAG,CAAC,OAAe,EAAE,SAAmB,EAAE,EAAE,CAC9D,IAAI,CAAC,qBAAqB,CACxB,WAAW,iBAAiB,CAAC,WAAW,IACtC,iBAAiB,CAAC,aACpB,eAAe,OAAO,uBAAuB,SAAS,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,EACzE,KAAK,CACN,CAAC;CACL"}
1
+ {"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
@@ -9,6 +9,8 @@ export declare const HaloCoreEndpoints: {
9
9
  StatsOrigin: string;
10
10
  /** Game CMS origin */
11
11
  GameCmsOrigin: string;
12
+ /** Discovery origin */
13
+ DiscoveryOrigin: string;
12
14
  /** Service domain */
13
15
  ServiceDomain: string;
14
16
  };
@@ -9,6 +9,8 @@ export const HaloCoreEndpoints = {
9
9
  StatsOrigin: "halostats",
10
10
  /** Game CMS origin */
11
11
  GameCmsOrigin: "gamecms-hacs",
12
+ /** Discovery origin */
13
+ DiscoveryOrigin: "discovery-infiniteugc",
12
14
  /** Service domain */
13
15
  ServiceDomain: "svc.halowaypoint.com:443",
14
16
  };
@@ -1 +1 @@
1
- {"version":3,"file":"halo-core-endpoints.js","sourceRoot":"","sources":["../../src/endpoints/halo-core-endpoints.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,kDAAkD;IAClD,oBAAoB,EAAE,qDAAqD;IAE3E,mBAAmB;IACnB,WAAW,EAAE,OAAO;IACpB,qBAAqB;IACrB,OAAO,EAAE,SAAS;IAClB,mBAAmB;IACnB,WAAW,EAAE,WAAW;IACxB,sBAAsB;IACtB,aAAa,EAAE,cAAc;IAE7B,qBAAqB;IACrB,aAAa,EAAE,0BAA0B;CAC1C,CAAC"}
1
+ {"version":3,"file":"halo-core-endpoints.js","sourceRoot":"","sources":["../../src/endpoints/halo-core-endpoints.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,kDAAkD;IAClD,oBAAoB,EAAE,qDAAqD;IAE3E,mBAAmB;IACnB,WAAW,EAAE,OAAO;IACpB,qBAAqB;IACrB,OAAO,EAAE,SAAS;IAClB,mBAAmB;IACnB,WAAW,EAAE,WAAW;IACxB,sBAAsB;IACtB,aAAa,EAAE,cAAc;IAC7B,uBAAuB;IACvB,eAAe,EAAE,uBAAuB;IAExC,qBAAqB;IACrB,aAAa,EAAE,0BAA0B;CAC1C,CAAC"}
package/dist/index.d.ts CHANGED
@@ -8,3 +8,5 @@ export { GameVariantCategory } from "./models/halo-infinite/game-variant-categor
8
8
  export { MatchStats } from "./models/halo-infinite/match-stats";
9
9
  export { PlayerMatchHistory } from "./models/halo-infinite/player-match-history";
10
10
  export { Stats } from "./models/halo-infinite/stats";
11
+ export { MapAsset, UgcGameVariantAsset } from "./models/halo-infinite/asset";
12
+ export { AssetKind } from "./models/halo-infinite/asset-kind";
package/dist/index.js CHANGED
@@ -1,4 +1,5 @@
1
1
  export { HaloInfiniteClient } from "./core/halo-infinite-client";
2
2
  export { MatchType } from "./models/halo-infinite/match-type";
3
3
  export { GameVariantCategory } from "./models/halo-infinite/game-variant-category";
4
+ export { AssetKind } from "./models/halo-infinite/asset-kind";
4
5
  //# 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,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAKjE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,kBAAkB,EAAE,MAAM,6BAA6B,CAAC;AAKjE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAKnF,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC"}
@@ -0,0 +1,3 @@
1
+ export interface ApiFormattedDate {
2
+ ISO8601Date: string;
3
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=api-formatted-date.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"api-formatted-date.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/api-formatted-date.ts"],"names":[],"mappings":""}
@@ -0,0 +1,12 @@
1
+ export declare enum AssetKind {
2
+ Film = 0,
3
+ Map = 1,
4
+ Playlist = 2,
5
+ Prefab = 3,
6
+ TestAsset = 4,
7
+ UgcGameVariant = 5,
8
+ MapModePair = 6,
9
+ Project = 7,
10
+ Manifest = 8,
11
+ EngineGameVariant = 9
12
+ }
@@ -0,0 +1,14 @@
1
+ export var AssetKind;
2
+ (function (AssetKind) {
3
+ AssetKind[AssetKind["Film"] = 0] = "Film";
4
+ AssetKind[AssetKind["Map"] = 1] = "Map";
5
+ AssetKind[AssetKind["Playlist"] = 2] = "Playlist";
6
+ AssetKind[AssetKind["Prefab"] = 3] = "Prefab";
7
+ AssetKind[AssetKind["TestAsset"] = 4] = "TestAsset";
8
+ AssetKind[AssetKind["UgcGameVariant"] = 5] = "UgcGameVariant";
9
+ AssetKind[AssetKind["MapModePair"] = 6] = "MapModePair";
10
+ AssetKind[AssetKind["Project"] = 7] = "Project";
11
+ AssetKind[AssetKind["Manifest"] = 8] = "Manifest";
12
+ AssetKind[AssetKind["EngineGameVariant"] = 9] = "EngineGameVariant";
13
+ })(AssetKind || (AssetKind = {}));
14
+ //# sourceMappingURL=asset-kind.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-kind.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/asset-kind.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,SAWX;AAXD,WAAY,SAAS;IACnB,yCAAI,CAAA;IACJ,uCAAG,CAAA;IACH,iDAAQ,CAAA;IACR,6CAAM,CAAA;IACN,mDAAS,CAAA;IACT,6DAAc,CAAA;IACd,uDAAW,CAAA;IACX,+CAAO,CAAA;IACP,iDAAQ,CAAA;IACR,mEAAiB,CAAA;AACnB,CAAC,EAXW,SAAS,KAAT,SAAS,QAWpB"}
@@ -0,0 +1,6 @@
1
+ import { AssetKind } from "./asset-kind";
2
+ export interface AssetVersionLink {
3
+ AssetKind: AssetKind;
4
+ AssetId: string;
5
+ VersionId: string;
6
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=asset-version-link.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset-version-link.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/asset-version-link.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
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 UgcGameVariantAsset extends Asset {
51
+ CustomData: {
52
+ KeyValues: object;
53
+ HasNodeGraph: boolean;
54
+ };
55
+ EngineGameVariantLink?: Asset;
56
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"asset.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/asset.ts"],"names":[],"mappings":""}
@@ -0,0 +1,56 @@
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
+ }
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=authoring-asset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"authoring-asset.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/authoring-asset.ts"],"names":[],"mappings":""}
@@ -1,3 +1,4 @@
1
+ import { AssetVersionLink } from "./asset-version-link";
1
2
  import { GameVariantCategory } from "./game-variant-category";
2
3
  import { PlaylistExperience } from "./playlist-experience";
3
4
  export interface MatchInfo<TCategory extends GameVariantCategory = GameVariantCategory> {
@@ -7,28 +8,12 @@ export interface MatchInfo<TCategory extends GameVariantCategory = GameVariantCa
7
8
  LifecycleMode: number;
8
9
  GameVariantCategory: TCategory;
9
10
  LevelId: string;
10
- MapVariant: {
11
- AssetKind: number;
12
- AssetId: string;
13
- VersionId: string;
14
- };
15
- UgcGameVariant: {
16
- AssetKind: number;
17
- AssetId: string;
18
- VersionId: string;
19
- };
11
+ MapVariant: AssetVersionLink;
12
+ UgcGameVariant: AssetVersionLink;
20
13
  ClearanceId: string;
21
- Playlist: {
22
- AssetKind: number;
23
- AssetId: string;
24
- VersionId: string;
25
- };
14
+ Playlist: AssetVersionLink;
26
15
  PlaylistExperience: PlaylistExperience;
27
- PlaylistMapModePair: {
28
- AssetKind: number;
29
- AssetId: string;
30
- VersionId: string;
31
- };
16
+ PlaylistMapModePair: AssetVersionLink;
32
17
  SeasonId: string;
33
18
  PlayableDuration: string;
34
19
  TeamsEnabled: boolean;
@@ -1,4 +1,6 @@
1
1
  export declare enum MatchOutcome {
2
+ Tie = 1,
2
3
  Win = 2,
3
- Loss = 3
4
+ Loss = 3,
5
+ DidNotFinish = 4
4
6
  }
@@ -1,6 +1,8 @@
1
1
  export var MatchOutcome;
2
2
  (function (MatchOutcome) {
3
+ MatchOutcome[MatchOutcome["Tie"] = 1] = "Tie";
3
4
  MatchOutcome[MatchOutcome["Win"] = 2] = "Win";
4
5
  MatchOutcome[MatchOutcome["Loss"] = 3] = "Loss";
6
+ MatchOutcome[MatchOutcome["DidNotFinish"] = 4] = "DidNotFinish";
5
7
  })(MatchOutcome || (MatchOutcome = {}));
6
8
  //# sourceMappingURL=match-outcome.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"match-outcome.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/match-outcome.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,6CAAO,CAAA;IACP,+CAAQ,CAAA;AACV,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB"}
1
+ {"version":3,"file":"match-outcome.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/match-outcome.ts"],"names":[],"mappings":"AAAA,MAAM,CAAN,IAAY,YAKX;AALD,WAAY,YAAY;IACtB,6CAAO,CAAA;IACP,6CAAO,CAAA;IACP,+CAAQ,CAAA;IACR,+DAAgB,CAAA;AAClB,CAAC,EALW,YAAY,KAAZ,YAAY,QAKvB"}
@@ -32,7 +32,7 @@ export interface MatchSkill {
32
32
  Deaths: StatPerformance;
33
33
  };
34
34
  Counterfactuals: {
35
- SelfCounterfactual: Counterfactual;
35
+ SelfCounterfactuals: Counterfactual;
36
36
  TierCounterfactuals: {
37
37
  Bronze: Counterfactual;
38
38
  Silver: Counterfactual;
@@ -1,7 +1,6 @@
1
+ import { ApiFormattedDate } from "./halo-infinite/api-formatted-date";
1
2
  export interface SpartanToken {
2
3
  SpartanToken: string;
3
- ExpiresUtc: {
4
- ISO8601Date: string;
5
- };
4
+ ExpiresUtc: ApiFormattedDate;
6
5
  TokenDuration: string;
7
6
  }
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "halo-infinite-api",
3
3
  "type": "module",
4
- "version": "1.0.5",
4
+ "version": "1.1.1",
5
5
  "description": "An NPM package for accessing the official Halo Infinite API.",
6
6
  "main": "dist/index.js",
7
7
  "scripts": {
@@ -1,21 +1,21 @@
1
- import axios, { AxiosHeaders } from "axios";
2
- import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
3
- import { Method } from "axios";
4
- import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-container";
5
- import { GlobalConstants } from "../util/global-contants";
6
- import { UserInfo } from "../models/halo-infinite/user-info";
7
- import { ServiceRecord } from "../models/halo-infinite/service-record";
1
+ import axios, { AxiosHeaders, Method } from "axios";
2
+ import { HaloAuthenticationClient } from "../authentication/halo-authentication-client";
8
3
  import {
9
4
  RelyingParty,
10
5
  XboxAuthenticationClient,
11
- XboxAuthenticationToken,
12
6
  } from "../authentication/xbox-authentication-client";
13
- import { HaloAuthenticationClient } from "../authentication/halo-authentication-client";
14
- import { Playlist } from "../models/halo-infinite/playlist";
15
- import { MatchType } from "../models/halo-infinite/match-type";
7
+ import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
8
+ import { MatchSkill } from "../models/halo-infinite/match-skill";
16
9
  import { MatchStats } from "../models/halo-infinite/match-stats";
10
+ import { MatchType } from "../models/halo-infinite/match-type";
17
11
  import { PlayerMatchHistory } from "../models/halo-infinite/player-match-history";
18
- import { MatchSkill } from "../models/halo-infinite/match-skill";
12
+ import { Playlist } from "../models/halo-infinite/playlist";
13
+ import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-container";
14
+ import { ServiceRecord } from "../models/halo-infinite/service-record";
15
+ import { UserInfo } from "../models/halo-infinite/user-info";
16
+ import { GlobalConstants } from "../util/global-contants";
17
+ import { MapAsset, UgcGameVariantAsset } from "../models/halo-infinite/asset";
18
+ import { AssetKind } from "../models/halo-infinite/asset-kind";
19
19
 
20
20
  interface ResultContainer<TValue> {
21
21
  Id: string;
@@ -39,6 +39,27 @@ interface TokenPersister {
39
39
  save: (tokenName: string, token: unknown) => Promise<void>;
40
40
  }
41
41
 
42
+ type AssetKindTypeMap = {
43
+ [AssetKind.Map]: MapAsset;
44
+ [AssetKind.UgcGameVariant]: UgcGameVariantAsset;
45
+ };
46
+
47
+ const assetKindUrlMap = {
48
+ [AssetKind.Map]: "Maps",
49
+ [AssetKind.UgcGameVariant]: "UgcGameVariants",
50
+ } satisfies {
51
+ [key in keyof AssetKindTypeMap]: string;
52
+ };
53
+
54
+ function wrapPlayerId(playerId: string) {
55
+ if (/^\w+(\d+)/) {
56
+ return playerId;
57
+ } else {
58
+ // Assume xuid
59
+ return `xuid(${playerId})`;
60
+ }
61
+ }
62
+
42
63
  export class HaloInfiniteClient {
43
64
  private readonly haloAuthClient: HaloAuthenticationClient;
44
65
 
@@ -95,7 +116,8 @@ export class HaloInfiniteClient {
95
116
  method: Method,
96
117
  useSpartanToken = true,
97
118
  useClearance = false,
98
- userAgent: string = GlobalConstants.HALO_WAYPOINT_USER_AGENT
119
+ userAgent: string = GlobalConstants.HALO_WAYPOINT_USER_AGENT,
120
+ throwOn404: boolean = true
99
121
  ) {
100
122
  const headers = new AxiosHeaders({
101
123
  "User-Agent": userAgent,
@@ -117,15 +139,28 @@ export class HaloInfiniteClient {
117
139
  url,
118
140
  method,
119
141
  headers,
142
+ validateStatus: (status) =>
143
+ status < 400 || (status === 404 && !throwOn404),
120
144
  });
121
145
 
122
146
  return response.data;
123
147
  }
124
148
 
125
149
  private async executeResultsRequest<T>(
126
- ...args: Parameters<HaloInfiniteClient["executeRequest"]>
150
+ url: string,
151
+ method: Method,
152
+ useSpartanToken = true,
153
+ useClearance = false,
154
+ userAgent: string = GlobalConstants.HALO_WAYPOINT_USER_AGENT
127
155
  ) {
128
- const result = await this.executeRequest<ResultsContainer<T>>(...args);
156
+ const result = await this.executeRequest<ResultsContainer<T>>(
157
+ url,
158
+ method,
159
+ useSpartanToken,
160
+ useClearance,
161
+ userAgent,
162
+ false
163
+ );
129
164
 
130
165
  return result.Value;
131
166
  }
@@ -157,9 +192,9 @@ export class HaloInfiniteClient {
157
192
  this.executeResultsRequest<PlaylistCsrContainer>(
158
193
  `https://${HaloCoreEndpoints.SkillOrigin}.${
159
194
  HaloCoreEndpoints.ServiceDomain
160
- }/hi/playlist/${playlistId}/csrs?players=xuid(${playerIds.join(
161
- "),xuid("
162
- )})`,
195
+ }/hi/playlist/${playlistId}/csrs?players=${playerIds
196
+ .map(wrapPlayerId)
197
+ .join(",")}`,
163
198
  "get"
164
199
  );
165
200
 
@@ -195,14 +230,21 @@ export class HaloInfiniteClient {
195
230
  type: MatchType = MatchType.All,
196
231
  count: number = 25,
197
232
  start: number = 0
198
- ) =>
199
- this.executePaginationRequest<PlayerMatchHistory>(
233
+ ) => {
234
+ let params: Record<string, string> = {};
235
+ if (type !== MatchType.All) {
236
+ params.type = type.toString();
237
+ }
238
+ return this.executePaginationRequest<PlayerMatchHistory>(
200
239
  count,
201
240
  start,
202
- { type: type.toString() },
203
- `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/xuid(${playerXuid})/matches`,
241
+ params,
242
+ `https://${HaloCoreEndpoints.StatsOrigin}.${
243
+ HaloCoreEndpoints.ServiceDomain
244
+ }/hi/players/xuid(${wrapPlayerId(playerXuid)})/matches`,
204
245
  "get"
205
246
  );
247
+ };
206
248
 
207
249
  public getMatchStats = (matchId: string) =>
208
250
  this.executeRequest<MatchStats>(
@@ -214,7 +256,30 @@ export class HaloInfiniteClient {
214
256
  this.executeResultsRequest<MatchSkill>(
215
257
  `https://${HaloCoreEndpoints.SkillOrigin}.${
216
258
  HaloCoreEndpoints.ServiceDomain
217
- }/hi/matches/${matchId}/skill?players=xuid(${playerIds.join("),xuid(")})`,
259
+ }/hi/matches/${matchId}/skill?players=${playerIds
260
+ .map(wrapPlayerId)
261
+ .join(",")}`,
262
+ "get"
263
+ );
264
+
265
+ /** Gets authoring metadata about a specific asset. */
266
+ public getAsset = <TAssetType extends keyof AssetKindTypeMap>(
267
+ assetType: TAssetType,
268
+ assetId: string
269
+ ) =>
270
+ this.executeRequest<AssetKindTypeMap[TAssetType]>(
271
+ `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`,
272
+ "get"
273
+ );
274
+
275
+ /** Gets metadata related to a concrete version of a specified asset. */
276
+ public getSpecificAssetVersion = <TAssetType extends keyof AssetKindTypeMap>(
277
+ assetType: TAssetType,
278
+ assetId: string,
279
+ versionId: string
280
+ ) =>
281
+ this.executeRequest<AssetKindTypeMap[TAssetType]>(
282
+ `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`,
218
283
  "get"
219
284
  );
220
285
  }
@@ -10,6 +10,8 @@ export const HaloCoreEndpoints = {
10
10
  StatsOrigin: "halostats",
11
11
  /** Game CMS origin */
12
12
  GameCmsOrigin: "gamecms-hacs",
13
+ /** Discovery origin */
14
+ DiscoveryOrigin: "discovery-infiniteugc",
13
15
 
14
16
  /** Service domain */
15
17
  ServiceDomain: "svc.halowaypoint.com:443",
package/src/index.ts CHANGED
@@ -8,3 +8,5 @@ export { GameVariantCategory } from "./models/halo-infinite/game-variant-categor
8
8
  export { MatchStats } from "./models/halo-infinite/match-stats";
9
9
  export { PlayerMatchHistory } from "./models/halo-infinite/player-match-history";
10
10
  export { Stats } from "./models/halo-infinite/stats";
11
+ export { MapAsset, UgcGameVariantAsset } from "./models/halo-infinite/asset";
12
+ export { AssetKind } from "./models/halo-infinite/asset-kind";
@@ -0,0 +1,3 @@
1
+ export interface ApiFormattedDate {
2
+ ISO8601Date: string;
3
+ }
@@ -0,0 +1,12 @@
1
+ export enum AssetKind {
2
+ Film,
3
+ Map,
4
+ Playlist,
5
+ Prefab,
6
+ TestAsset,
7
+ UgcGameVariant,
8
+ MapModePair,
9
+ Project,
10
+ Manifest,
11
+ EngineGameVariant,
12
+ }
@@ -0,0 +1,7 @@
1
+ import { AssetKind } from "./asset-kind";
2
+
3
+ export interface AssetVersionLink {
4
+ AssetKind: AssetKind;
5
+ AssetId: string;
6
+ VersionId: string;
7
+ }
@@ -0,0 +1,59 @@
1
+ import { ApiFormattedDate } from "./api-formatted-date";
2
+
3
+ export interface Asset {
4
+ Tags: string[];
5
+ AssetId: string;
6
+ VersionId: string;
7
+ PublicName: string;
8
+ Description: string;
9
+ Files: {
10
+ Prefix: string;
11
+ FileRelativePaths: string[];
12
+ PrefixEndpoint: {
13
+ AuthorityId: string;
14
+ Path: string;
15
+ QueryString: any;
16
+ RetryPolicyId: string;
17
+ TopicName: string;
18
+ AcknowledgementTypeId: number;
19
+ AuthenticationLifetimeExtensionSupported: boolean;
20
+ ClearanceAware: boolean;
21
+ };
22
+ };
23
+ Contributors: string[];
24
+ AssetHome: number;
25
+ AssetStats: {
26
+ PlaysRecent: number;
27
+ PlaysAllTime: number;
28
+ Favorites: number;
29
+ Likes: number;
30
+ Bookmarks: number;
31
+ ParentAssetCount: number;
32
+ AverageRating: number;
33
+ NumberOfRatings: number;
34
+ };
35
+ InspectionResult: number;
36
+ CloneBehavior: number;
37
+ Order: number;
38
+ PublishedDate: ApiFormattedDate;
39
+ VersionNumber: number;
40
+ Admin: string;
41
+ }
42
+
43
+ export interface MapAsset extends Asset {
44
+ CustomData: {
45
+ NumOfObjectsOnMap: number;
46
+ TagLevelId: number;
47
+ IsBaked: boolean;
48
+ HasNodeGraph: boolean;
49
+ };
50
+ PrefabLinks: unknown[];
51
+ }
52
+
53
+ export interface UgcGameVariantAsset extends Asset {
54
+ CustomData: {
55
+ KeyValues: object;
56
+ HasNodeGraph: boolean;
57
+ };
58
+ EngineGameVariantLink?: Asset;
59
+ }
@@ -1,3 +1,4 @@
1
+ import { AssetVersionLink } from "./asset-version-link";
1
2
  import { GameVariantCategory } from "./game-variant-category";
2
3
  import { PlaylistExperience } from "./playlist-experience";
3
4
  export interface MatchInfo<
@@ -9,28 +10,12 @@ export interface MatchInfo<
9
10
  LifecycleMode: number;
10
11
  GameVariantCategory: TCategory;
11
12
  LevelId: string;
12
- MapVariant: {
13
- AssetKind: number;
14
- AssetId: string;
15
- VersionId: string;
16
- };
17
- UgcGameVariant: {
18
- AssetKind: number;
19
- AssetId: string;
20
- VersionId: string;
21
- };
13
+ MapVariant: AssetVersionLink;
14
+ UgcGameVariant: AssetVersionLink;
22
15
  ClearanceId: string;
23
- Playlist: {
24
- AssetKind: number;
25
- AssetId: string;
26
- VersionId: string;
27
- };
16
+ Playlist: AssetVersionLink;
28
17
  PlaylistExperience: PlaylistExperience;
29
- PlaylistMapModePair: {
30
- AssetKind: number;
31
- AssetId: string;
32
- VersionId: string;
33
- };
18
+ PlaylistMapModePair: AssetVersionLink;
34
19
  SeasonId: string;
35
20
  PlayableDuration: string;
36
21
  TeamsEnabled: boolean;
@@ -1,4 +1,6 @@
1
1
  export enum MatchOutcome {
2
+ Tie = 1,
2
3
  Win = 2,
3
4
  Loss = 3,
5
+ DidNotFinish = 4,
4
6
  }
@@ -35,7 +35,7 @@ export interface MatchSkill {
35
35
  Deaths: StatPerformance;
36
36
  };
37
37
  Counterfactuals: {
38
- SelfCounterfactual: Counterfactual;
38
+ SelfCounterfactuals: Counterfactual;
39
39
  TierCounterfactuals: {
40
40
  Bronze: Counterfactual;
41
41
  Silver: Counterfactual;
@@ -1,5 +1,7 @@
1
+ import { ApiFormattedDate } from "./halo-infinite/api-formatted-date";
2
+
1
3
  export interface SpartanToken {
2
4
  SpartanToken: string;
3
- ExpiresUtc: { ISO8601Date: string };
5
+ ExpiresUtc: ApiFormattedDate;
4
6
  TokenDuration: string;
5
7
  }