halo-infinite-api 5.2.1 → 5.3.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.
@@ -1,6 +1,7 @@
1
1
  import { DateTime } from "luxon";
2
2
  import { ExpiryTokenCache } from "../util/expiry-token-cache";
3
3
  import { defaultFetch } from "../util/fetch-function";
4
+ import { GlobalConstants } from "../util/global-contants";
4
5
  export class HaloAuthenticationClient {
5
6
  fetchXstsToken;
6
7
  loadToken;
@@ -22,7 +23,7 @@ export class HaloAuthenticationClient {
22
23
  method: "POST",
23
24
  body: JSON.stringify(tokenRequest),
24
25
  headers: {
25
- "User-Agent": "HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
26
+ "User-Agent": GlobalConstants.HALO_WAYPOINT_USER_AGENT,
26
27
  "Content-Type": "application/json; charset=utf-8",
27
28
  Accept: "application/json, text/plain, */*",
28
29
  },
@@ -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;AAOrE,MAAM,OAAO,wBAAwB;IAwChB;IACA;IAIA;IACA;IA7CX,iBAAiB,GAAG,IAAI,gBAAgB,CAC9C,KAAK,IAAI,EAAE;QACT,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE9C,MAAM,YAAY,GAAwB;YACxC,QAAQ,EAAE,qBAAqB;YAC/B,UAAU,EAAE,GAAG;YACf,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,SAAS;oBAChB,SAAS,EAAE,aAAa;iBACzB;aACF;SACF,CAAC;QACF,MAAM,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;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;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"}
@@ -31,30 +31,30 @@ export declare class HaloInfiniteClient {
31
31
  * @param playlistId - Unique ID for the playlist.
32
32
  * @param playerIds - Array of player xuids.
33
33
  */
34
- getPlaylistCsr: (playlistId: string, playerIds: string[]) => Promise<ResultContainer<PlaylistCsrContainer>[]>;
34
+ getPlaylistCsr: (playlistId: string, playerIds: string[], init?: Omit<RequestInit, "body" | "method">) => Promise<ResultContainer<PlaylistCsrContainer>[]>;
35
35
  /** Get gamertag info for a player.
36
36
  * @param gamerTag - Gamertag to lookup.
37
37
  */
38
- getUser: (gamerTag: string) => Promise<UserInfo>;
38
+ getUser: (gamerTag: string, init?: Omit<RequestInit, "body" | "method">) => Promise<UserInfo>;
39
39
  /** Get gamertag info for several players.
40
40
  * @param xuids - Xuids to lookup.
41
41
  */
42
- getUsers: (xuids: string[]) => Promise<UserInfo[]>;
42
+ getUsers: (xuids: string[], init?: Omit<RequestInit, "body" | "method">) => Promise<UserInfo[]>;
43
43
  /** Get service record for a player.
44
44
  * @param gamerTag - Gamertag to lookup.
45
45
  */
46
- getUserServiceRecord: (gamerTag: string) => Promise<ServiceRecord>;
46
+ getUserServiceRecord: (gamerTag: string, init?: Omit<RequestInit, "body" | "method">) => Promise<ServiceRecord>;
47
47
  /** Get playlist information
48
48
  * @param playlistId - Unique ID for the playlist.
49
49
  */
50
- getPlaylist: (playlistId: string) => Promise<Playlist>;
51
- getPlayerMatches: (playerXuid: string, type?: MatchType, count?: number, start?: number) => Promise<PlayerMatchHistory[]>;
52
- getPlayerServiceRecord(playerXuid: string, type?: MatchType): Promise<ServiceRecord>;
53
- getMatchStats: (matchId: string) => Promise<MatchStats<import("..").GameVariantCategory>>;
54
- getMatchSkill: (matchId: string, playerIds: string[]) => Promise<ResultContainer<MatchSkill<0>>[]>;
50
+ getPlaylist: (playlistId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<Playlist>;
51
+ getPlayerMatches: (playerXuid: string, type?: MatchType, count?: number, start?: number, init?: Omit<RequestInit, "body" | "method">) => Promise<PlayerMatchHistory[]>;
52
+ getPlayerServiceRecord(playerXuid: string, init?: Omit<RequestInit, "body" | "method">): Promise<ServiceRecord>;
53
+ getMatchStats: (matchId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<MatchStats<import("..").GameVariantCategory>>;
54
+ getMatchSkill: (matchId: string, playerIds: string[], init?: Omit<RequestInit, "body" | "method">) => Promise<ResultContainer<MatchSkill<0>>[]>;
55
55
  /** Gets authoring metadata about a specific asset. */
56
- getAsset: <TAssetType extends keyof AssetKindTypeMap>(assetType: TAssetType, assetId: string) => Promise<AssetKindTypeMap[TAssetType]>;
56
+ getAsset: <TAssetType extends keyof AssetKindTypeMap>(assetType: TAssetType, assetId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<AssetKindTypeMap[TAssetType]>;
57
57
  /** Gets metadata related to a concrete version of a specified asset. */
58
- getSpecificAssetVersion: <TAssetType extends keyof AssetKindTypeMap>(assetType: TAssetType, assetId: string, versionId: string) => Promise<AssetKindTypeMap[TAssetType]>;
58
+ getSpecificAssetVersion: <TAssetType extends keyof AssetKindTypeMap>(assetType: TAssetType, assetId: string, versionId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<AssetKindTypeMap[TAssetType]>;
59
59
  }
60
60
  export {};
@@ -33,20 +33,17 @@ export class HaloInfiniteClient {
33
33
  this.spartanTokenProvider = spartanTokenProvider;
34
34
  this.fetchFn = fetchFn;
35
35
  }
36
- async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
37
- const headers = {
38
- "User-Agent": userAgent,
39
- Accept: "application/json",
40
- };
41
- if (useSpartanToken) {
42
- headers["x-343-authorization-spartan"] =
43
- await this.spartanTokenProvider.getSpartanToken();
36
+ async executeRequest(url, init) {
37
+ const headers = new Headers(init.headers);
38
+ if (!headers.has("User-Agent")) {
39
+ headers.set("User-Agent", GlobalConstants.HALO_PC_USER_AGENT);
44
40
  }
45
- if (useClearance) {
46
- throw new Error("TODO: Implement clearance");
41
+ if (!headers.has("Accept")) {
42
+ headers.set("Accept", "application/json");
47
43
  }
44
+ headers.set("x-343-authorization-spartan", await this.spartanTokenProvider.getSpartanToken());
48
45
  const result = await this.fetchFn(url, {
49
- method,
46
+ ...init,
50
47
  headers,
51
48
  });
52
49
  return result;
@@ -68,46 +65,79 @@ export class HaloInfiniteClient {
68
65
  * @param playlistId - Unique ID for the playlist.
69
66
  * @param playerIds - Array of player xuids.
70
67
  */
71
- getPlaylistCsr = (playlistId, playerIds) => this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/playlist/${playlistId}/csrs?players=${playerIds
68
+ getPlaylistCsr = (playlistId, playerIds, init) => this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/playlist/${playlistId}/csrs?players=${playerIds
72
69
  .map(wrapPlayerId)
73
- .join(",")}`, "get");
70
+ .join(",")}`, {
71
+ ...init,
72
+ method: "get",
73
+ });
74
74
  /** Get gamertag info for a player.
75
75
  * @param gamerTag - Gamertag to lookup.
76
76
  */
77
- getUser = (gamerTag) => this.executeRequest(`https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users/gt(${gamerTag})`, "get");
77
+ getUser = (gamerTag, init) => this.executeRequest(`https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users/gt(${gamerTag})`, {
78
+ ...init,
79
+ method: "get",
80
+ });
78
81
  /** Get gamertag info for several players.
79
82
  * @param xuids - Xuids to lookup.
80
83
  */
81
- getUsers = (xuids) => {
82
- return this.executeRequest(`https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users?xuids=${xuids.map((x) => unwrapPlayerId(x)).join(",")}`, "get");
84
+ getUsers = (xuids, init) => {
85
+ return this.executeRequest(`https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users?xuids=${xuids.map((x) => unwrapPlayerId(x)).join(",")}`, {
86
+ ...init,
87
+ method: "get",
88
+ });
83
89
  };
84
90
  /** Get service record for a player.
85
91
  * @param gamerTag - Gamertag to lookup.
86
92
  */
87
- getUserServiceRecord = (gamerTag) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${gamerTag}/Matchmade/servicerecord`, "get");
93
+ getUserServiceRecord = (gamerTag, init) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${gamerTag}/Matchmade/servicerecord`, {
94
+ ...init,
95
+ method: "get",
96
+ });
88
97
  /** Get playlist information
89
98
  * @param playlistId - Unique ID for the playlist.
90
99
  */
91
- getPlaylist = (playlistId) => this.executeRequest(`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/multiplayer/file/playlists/assets/${playlistId}.json`, "get");
92
- getPlayerMatches = (playerXuid, type = MatchType.All, count = 25, start = 0) => {
100
+ getPlaylist = (playlistId, init) => this.executeRequest(`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/multiplayer/file/playlists/assets/${playlistId}.json`, {
101
+ ...init,
102
+ method: "get",
103
+ });
104
+ getPlayerMatches = (playerXuid, type = MatchType.All, count = 25, start = 0, init) => {
93
105
  let params = {};
94
106
  if (type !== MatchType.All) {
95
107
  params.type = type.toString();
96
108
  }
97
- return this.executePaginationRequest(count, start, params, `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/matches`, "get");
109
+ return this.executePaginationRequest(count, start, params, `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/matches`, {
110
+ ...init,
111
+ method: "get",
112
+ });
98
113
  };
99
- getPlayerServiceRecord(playerXuid, type = MatchType.All) {
100
- return this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`, "get");
114
+ getPlayerServiceRecord(playerXuid, init) {
115
+ return this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`, {
116
+ ...init,
117
+ method: "get",
118
+ });
101
119
  }
102
- getMatchStats = (matchId) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, "get");
103
- getMatchSkill = async (matchId, playerIds) => {
120
+ getMatchStats = (matchId, init) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, {
121
+ ...init,
122
+ method: "get",
123
+ });
124
+ getMatchSkill = async (matchId, playerIds, init) => {
104
125
  return await this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=${playerIds
105
126
  .map(wrapPlayerId)
106
- .join(",")}`, "get");
127
+ .join(",")}`, {
128
+ ...init,
129
+ method: "get",
130
+ });
107
131
  };
108
132
  /** Gets authoring metadata about a specific asset. */
109
- getAsset = (assetType, assetId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`, "get");
133
+ getAsset = (assetType, assetId, init) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`, {
134
+ ...init,
135
+ method: "get",
136
+ });
110
137
  /** Gets metadata related to a concrete version of a specified asset. */
111
- getSpecificAssetVersion = (assetType, assetId, versionId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`, "get");
138
+ getSpecificAssetVersion = (assetType, assetId, versionId, init) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`, {
139
+ ...init,
140
+ method: "get",
141
+ });
112
142
  }
113
143
  //# 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":"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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,7 +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
+ import type { FetchFunction } from "../../util/fetch-function";
5
5
  /**
6
6
  * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
7
7
  * process. This is useful for applications that do not need to contend with
@@ -5,11 +5,11 @@ export declare class XboxClient {
5
5
  private readonly fetchFn;
6
6
  constructor(xboxTokenProvider: XboxTokenProvider, fetchFn?: FetchFunction);
7
7
  private executeRequest;
8
- searchUsers(query: string): Promise<{
8
+ searchUsers(query: string, init?: Omit<RequestInit, "body" | "method">): Promise<{
9
9
  id: string;
10
10
  gamertag: string;
11
11
  displayPicUri: string;
12
12
  score: number;
13
13
  }[]>;
14
- recentPlayers(): Promise<unknown>;
14
+ recentPlayers(init?: Omit<RequestInit, "body" | "method">): Promise<unknown>;
15
15
  }
@@ -6,23 +6,29 @@ export class XboxClient {
6
6
  this.xboxTokenProvider = xboxTokenProvider;
7
7
  this.fetchFn = fetchFn;
8
8
  }
9
- async executeRequest(url, method) {
9
+ async executeRequest(url, init) {
10
+ const headers = new Headers(init.headers);
11
+ if (!headers.has("Accept")) {
12
+ headers.set("Accept", "application/json");
13
+ }
14
+ if (!headers.has("Authorization")) {
15
+ headers.set("Authorization", await this.xboxTokenProvider.getXboxLiveV3Token());
16
+ }
17
+ if (!headers.has("x-xbl-contract-version")) {
18
+ headers.set("x-xbl-contract-version", "1");
19
+ }
10
20
  const result = await this.fetchFn(url, {
11
- method,
12
- headers: {
13
- Accept: "application/json",
14
- Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
15
- "x-xbl-contract-version": "1",
16
- },
21
+ ...init,
22
+ headers,
17
23
  });
18
24
  return result;
19
25
  }
20
- async searchUsers(query) {
21
- const { results } = await this.executeRequest(`https://usersearch.xboxlive.com/suggest?q=${encodeURIComponent(query)}`, "GET");
26
+ async searchUsers(query, init) {
27
+ const { results } = await this.executeRequest(`https://usersearch.xboxlive.com/suggest?q=${encodeURIComponent(query)}`, { ...init, method: "GET" });
22
28
  return results.map(({ result }) => result);
23
29
  }
24
- async recentPlayers() {
25
- return await this.executeRequest("https://peoplehub.xboxlive.com/users/me/people/recentplayers", "GET");
30
+ async recentPlayers(init) {
31
+ return await this.executeRequest("https://peoplehub.xboxlive.com/users/me/people/recentplayers", { ...init, method: "GET" });
26
32
  }
27
33
  }
28
34
  //# sourceMappingURL=xbox-client.js.map
@@ -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,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"}
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"}
package/dist/index.d.ts CHANGED
@@ -10,7 +10,7 @@ export { GameVariantCategory } from "./models/halo-infinite/game-variant-categor
10
10
  export { MatchStats } from "./models/halo-infinite/match-stats";
11
11
  export { PlayerMatchHistory } from "./models/halo-infinite/player-match-history";
12
12
  export { Stats } from "./models/halo-infinite/stats";
13
- export { MapAsset, UgcGameVariantAsset } from "./models/halo-infinite/asset";
13
+ export { MapAsset, UgcGameVariantAsset, PlaylistAsset, Asset, } from "./models/halo-infinite/asset";
14
14
  export { AssetKind } from "./models/halo-infinite/asset-kind";
15
15
  export { MatchOutcome } from "./models/halo-infinite/match-outcome";
16
16
  export { MatchSkill } from "./models/halo-infinite/match-skill";
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,YAAY,GACb,MAAM,6CAA6C,CAAC;AAKrD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAKnF,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAKpE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAE3J,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EACL,wBAAwB,EACxB,YAAY,GACb,MAAM,6CAA6C,CAAC;AAKrD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAUnF,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAKpE,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AACpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAE3J,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAEhF,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC"}
package/package.json CHANGED
@@ -1,7 +1,7 @@
1
1
  {
2
2
  "name": "halo-infinite-api",
3
3
  "type": "module",
4
- "version": "5.2.1",
4
+ "version": "5.3.0",
5
5
  "description": "An NPM package for accessing the official Halo Infinite API.",
6
6
  "main": "dist/index.js",
7
7
  "exports": {
@@ -3,6 +3,7 @@ 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
5
  import { FetchFunction, defaultFetch } from "../util/fetch-function";
6
+ import { GlobalConstants } from "../util/global-contants";
6
7
 
7
8
  export interface Token {
8
9
  token: string;
@@ -30,8 +31,7 @@ export class HaloAuthenticationClient {
30
31
  method: "POST",
31
32
  body: JSON.stringify(tokenRequest),
32
33
  headers: {
33
- "User-Agent":
34
- "HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
34
+ "User-Agent": GlobalConstants.HALO_WAYPOINT_USER_AGENT,
35
35
  "Content-Type": "application/json; charset=utf-8",
36
36
  Accept: "application/json, text/plain, */*",
37
37
  },
@@ -72,29 +72,21 @@ export class HaloInfiniteClient {
72
72
  private readonly fetchFn: FetchFunction = defaultFetch
73
73
  ) {}
74
74
 
75
- private async executeRequest<T>(
76
- url: string,
77
- method: RequestInit["method"],
78
- useSpartanToken = true,
79
- useClearance = false,
80
- userAgent: string = GlobalConstants.HALO_WAYPOINT_USER_AGENT
81
- ) {
82
- const headers: HeadersInit = {
83
- "User-Agent": userAgent,
84
- Accept: "application/json",
85
- };
86
-
87
- if (useSpartanToken) {
88
- headers["x-343-authorization-spartan"] =
89
- await this.spartanTokenProvider.getSpartanToken();
75
+ private async executeRequest<T>(url: string, init: RequestInit) {
76
+ const headers = new Headers(init.headers);
77
+ if (!headers.has("User-Agent")) {
78
+ headers.set("User-Agent", GlobalConstants.HALO_PC_USER_AGENT);
90
79
  }
91
-
92
- if (useClearance) {
93
- throw new Error("TODO: Implement clearance");
80
+ if (!headers.has("Accept")) {
81
+ headers.set("Accept", "application/json");
94
82
  }
83
+ headers.set(
84
+ "x-343-authorization-spartan",
85
+ await this.spartanTokenProvider.getSpartanToken()
86
+ );
95
87
 
96
88
  const result = await this.fetchFn<T>(url, {
97
- method,
89
+ ...init,
98
90
  headers,
99
91
  });
100
92
 
@@ -132,60 +124,93 @@ export class HaloInfiniteClient {
132
124
  * @param playlistId - Unique ID for the playlist.
133
125
  * @param playerIds - Array of player xuids.
134
126
  */
135
- public getPlaylistCsr = (playlistId: string, playerIds: string[]) =>
127
+ public getPlaylistCsr = (
128
+ playlistId: string,
129
+ playerIds: string[],
130
+ init?: Omit<RequestInit, "body" | "method">
131
+ ) =>
136
132
  this.executeResultsRequest<PlaylistCsrContainer>(
137
133
  `https://${HaloCoreEndpoints.SkillOrigin}.${
138
134
  HaloCoreEndpoints.ServiceDomain
139
135
  }/hi/playlist/${playlistId}/csrs?players=${playerIds
140
136
  .map(wrapPlayerId)
141
137
  .join(",")}`,
142
- "get"
138
+ {
139
+ ...init,
140
+ method: "get",
141
+ }
143
142
  );
144
143
 
145
144
  /** Get gamertag info for a player.
146
145
  * @param gamerTag - Gamertag to lookup.
147
146
  */
148
- public getUser = (gamerTag: string) =>
147
+ public getUser = (
148
+ gamerTag: string,
149
+ init?: Omit<RequestInit, "body" | "method">
150
+ ) =>
149
151
  this.executeRequest<UserInfo>(
150
152
  `https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users/gt(${gamerTag})`,
151
- "get"
153
+
154
+ {
155
+ ...init,
156
+ method: "get",
157
+ }
152
158
  );
153
159
 
154
160
  /** Get gamertag info for several players.
155
161
  * @param xuids - Xuids to lookup.
156
162
  */
157
- public getUsers = (xuids: string[]) => {
163
+ public getUsers = (
164
+ xuids: string[],
165
+ init?: Omit<RequestInit, "body" | "method">
166
+ ) => {
158
167
  return this.executeRequest<UserInfo[]>(
159
168
  `https://${HaloCoreEndpoints.Profile}.${
160
169
  HaloCoreEndpoints.ServiceDomain
161
170
  }/users?xuids=${xuids.map((x) => unwrapPlayerId(x)).join(",")}`,
162
- "get"
171
+ {
172
+ ...init,
173
+ method: "get",
174
+ }
163
175
  );
164
176
  };
165
177
 
166
178
  /** Get service record for a player.
167
179
  * @param gamerTag - Gamertag to lookup.
168
180
  */
169
- public getUserServiceRecord = (gamerTag: string) =>
181
+ public getUserServiceRecord = (
182
+ gamerTag: string,
183
+ init?: Omit<RequestInit, "body" | "method">
184
+ ) =>
170
185
  this.executeRequest<ServiceRecord>(
171
186
  `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${gamerTag}/Matchmade/servicerecord`,
172
- "get"
187
+ {
188
+ ...init,
189
+ method: "get",
190
+ }
173
191
  );
174
192
 
175
193
  /** Get playlist information
176
194
  * @param playlistId - Unique ID for the playlist.
177
195
  */
178
- public getPlaylist = (playlistId: string) =>
196
+ public getPlaylist = (
197
+ playlistId: string,
198
+ init?: Omit<RequestInit, "body" | "method">
199
+ ) =>
179
200
  this.executeRequest<Playlist>(
180
201
  `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/multiplayer/file/playlists/assets/${playlistId}.json`,
181
- "get"
202
+ {
203
+ ...init,
204
+ method: "get",
205
+ }
182
206
  );
183
207
 
184
208
  public getPlayerMatches = (
185
209
  playerXuid: string,
186
210
  type: MatchType = MatchType.All,
187
211
  count: number = 25,
188
- start: number = 0
212
+ start: number = 0,
213
+ init?: Omit<RequestInit, "body" | "method">
189
214
  ) => {
190
215
  let params: Record<string, string> = {};
191
216
  if (type !== MatchType.All) {
@@ -198,57 +223,84 @@ export class HaloInfiniteClient {
198
223
  `https://${HaloCoreEndpoints.StatsOrigin}.${
199
224
  HaloCoreEndpoints.ServiceDomain
200
225
  }/hi/players/${wrapPlayerId(playerXuid)}/matches`,
201
- "get"
226
+ {
227
+ ...init,
228
+ method: "get",
229
+ }
202
230
  );
203
231
  };
204
232
 
205
233
  public getPlayerServiceRecord(
206
234
  playerXuid: string,
207
- type: MatchType = MatchType.All
235
+ init?: Omit<RequestInit, "body" | "method">
208
236
  ) {
209
237
  return this.executeRequest<ServiceRecord>(
210
238
  `https://${HaloCoreEndpoints.StatsOrigin}.${
211
239
  HaloCoreEndpoints.ServiceDomain
212
240
  }/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`,
213
- "get"
241
+ {
242
+ ...init,
243
+ method: "get",
244
+ }
214
245
  );
215
246
  }
216
247
 
217
- public getMatchStats = (matchId: string) =>
248
+ public getMatchStats = (
249
+ matchId: string,
250
+ init?: Omit<RequestInit, "body" | "method">
251
+ ) =>
218
252
  this.executeRequest<MatchStats>(
219
253
  `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`,
220
- "get"
254
+ {
255
+ ...init,
256
+ method: "get",
257
+ }
221
258
  );
222
259
 
223
- public getMatchSkill = async (matchId: string, playerIds: string[]) => {
260
+ public getMatchSkill = async (
261
+ matchId: string,
262
+ playerIds: string[],
263
+ init?: Omit<RequestInit, "body" | "method">
264
+ ) => {
224
265
  return await this.executeResultsRequest<MatchSkill>(
225
266
  `https://${HaloCoreEndpoints.SkillOrigin}.${
226
267
  HaloCoreEndpoints.ServiceDomain
227
268
  }/hi/matches/${matchId}/skill?players=${playerIds
228
269
  .map(wrapPlayerId)
229
270
  .join(",")}`,
230
- "get"
271
+ {
272
+ ...init,
273
+ method: "get",
274
+ }
231
275
  );
232
276
  };
233
277
 
234
278
  /** Gets authoring metadata about a specific asset. */
235
279
  public getAsset = <TAssetType extends keyof AssetKindTypeMap>(
236
280
  assetType: TAssetType,
237
- assetId: string
281
+ assetId: string,
282
+ init?: Omit<RequestInit, "body" | "method">
238
283
  ) =>
239
284
  this.executeRequest<AssetKindTypeMap[TAssetType]>(
240
285
  `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`,
241
- "get"
286
+ {
287
+ ...init,
288
+ method: "get",
289
+ }
242
290
  );
243
291
 
244
292
  /** Gets metadata related to a concrete version of a specified asset. */
245
293
  public getSpecificAssetVersion = <TAssetType extends keyof AssetKindTypeMap>(
246
294
  assetType: TAssetType,
247
295
  assetId: string,
248
- versionId: string
296
+ versionId: string,
297
+ init?: Omit<RequestInit, "body" | "method">
249
298
  ) =>
250
299
  this.executeRequest<AssetKindTypeMap[TAssetType]>(
251
300
  `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`,
252
- "get"
301
+ {
302
+ ...init,
303
+ method: "get",
304
+ }
253
305
  );
254
306
  }
@@ -7,7 +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
+ import type { FetchFunction } from "../../util/fetch-function";
11
11
 
12
12
  /**
13
13
  * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
@@ -7,20 +7,32 @@ export class XboxClient {
7
7
  private readonly fetchFn: FetchFunction = defaultFetch
8
8
  ) {}
9
9
 
10
- private async executeRequest<T>(url: string, method: RequestInit["method"]) {
10
+ private async executeRequest<T>(url: string, init: RequestInit) {
11
+ const headers = new Headers(init.headers);
12
+ if (!headers.has("Accept")) {
13
+ headers.set("Accept", "application/json");
14
+ }
15
+ if (!headers.has("Authorization")) {
16
+ headers.set(
17
+ "Authorization",
18
+ await this.xboxTokenProvider.getXboxLiveV3Token()
19
+ );
20
+ }
21
+ if (!headers.has("x-xbl-contract-version")) {
22
+ headers.set("x-xbl-contract-version", "1");
23
+ }
11
24
  const result = await this.fetchFn<T>(url, {
12
- method,
13
- headers: {
14
- Accept: "application/json",
15
- Authorization: await this.xboxTokenProvider.getXboxLiveV3Token(),
16
- "x-xbl-contract-version": "1",
17
- },
25
+ ...init,
26
+ headers,
18
27
  });
19
28
 
20
29
  return result;
21
30
  }
22
31
 
23
- public async searchUsers(query: string) {
32
+ public async searchUsers(
33
+ query: string,
34
+ init?: Omit<RequestInit, "body" | "method">
35
+ ) {
24
36
  const { results } = await this.executeRequest<{
25
37
  results: [
26
38
  {
@@ -35,15 +47,15 @@ export class XboxClient {
35
47
  ];
36
48
  }>(
37
49
  `https://usersearch.xboxlive.com/suggest?q=${encodeURIComponent(query)}`,
38
- "GET"
50
+ { ...init, method: "GET" }
39
51
  );
40
52
  return results.map(({ result }) => result);
41
53
  }
42
54
 
43
- public async recentPlayers() {
55
+ public async recentPlayers(init?: Omit<RequestInit, "body" | "method">) {
44
56
  return await this.executeRequest<unknown>(
45
57
  "https://peoplehub.xboxlive.com/users/me/people/recentplayers",
46
- "GET"
58
+ { ...init, method: "GET" }
47
59
  );
48
60
  }
49
61
  }
package/src/index.ts CHANGED
@@ -16,7 +16,12 @@ export { GameVariantCategory } from "./models/halo-infinite/game-variant-categor
16
16
  export { MatchStats } from "./models/halo-infinite/match-stats";
17
17
  export { PlayerMatchHistory } from "./models/halo-infinite/player-match-history";
18
18
  export { Stats } from "./models/halo-infinite/stats";
19
- export { MapAsset, UgcGameVariantAsset } from "./models/halo-infinite/asset";
19
+ export {
20
+ MapAsset,
21
+ UgcGameVariantAsset,
22
+ PlaylistAsset,
23
+ Asset,
24
+ } from "./models/halo-infinite/asset";
20
25
  export { AssetKind } from "./models/halo-infinite/asset-kind";
21
26
  export { MatchOutcome } from "./models/halo-infinite/match-outcome";
22
27
  export { MatchSkill } from "./models/halo-infinite/match-skill";