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.
- package/dist/authentication/halo-authentication-client.js +2 -1
- package/dist/authentication/halo-authentication-client.js.map +1 -1
- package/dist/core/halo-infinite-client.d.ts +11 -11
- package/dist/core/halo-infinite-client.js +57 -27
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/core/token-providers/auto-token-provider.d.ts +1 -1
- package/dist/core/xbox-client.d.ts +2 -2
- package/dist/core/xbox-client.js +17 -11
- package/dist/core/xbox-client.js.map +1 -1
- package/dist/index.d.ts +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
- package/src/authentication/halo-authentication-client.ts +2 -2
- package/src/core/halo-infinite-client.ts +93 -41
- package/src/core/token-providers/auto-token-provider.ts +1 -1
- package/src/core/xbox-client.ts +23 -11
- package/src/index.ts +6 -1
|
@@ -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":
|
|
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;
|
|
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,
|
|
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,
|
|
37
|
-
const headers =
|
|
38
|
-
|
|
39
|
-
|
|
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 (
|
|
46
|
-
|
|
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
|
-
|
|
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(",")}`,
|
|
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})`,
|
|
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(",")}`,
|
|
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`,
|
|
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`,
|
|
92
|
-
|
|
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`,
|
|
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,
|
|
100
|
-
return this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`,
|
|
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`,
|
|
103
|
-
|
|
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(",")}`,
|
|
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}`,
|
|
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}`,
|
|
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":"AAAA,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AACrE,OAAO,EAAE,iBAAiB,EAAE,MAAM,kCAAkC,CAAC;AAMrE,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAG/D,OAAO,EAAE,SAAS,EAAE,MAAM,oCAAoC,CAAC;AAM/D,OAAO,EAAE,eAAe,EAAE,MAAM,yBAAyB,CAAC;AA0B1D,MAAM,eAAe,GAAG;IACtB,CAAC,SAAS,CAAC,GAAG,CAAC,EAAE,MAAM;IACvB,CAAC,SAAS,CAAC,cAAc,CAAC,EAAE,iBAAiB;IAC7C,CAAC,SAAS,CAAC,QAAQ,CAAC,EAAE,WAAW;CAGlC,CAAC;AAEF,SAAS,YAAY,CAAC,QAAgB;IACpC,IAAI,aAAa,CAAC,IAAI,CAAC,QAAQ,CAAC,EAAE;QAChC,OAAO,QAAQ,CAAC;KACjB;SAAM;QACL,cAAc;QACd,OAAO,QAAQ,QAAQ,GAAG,CAAC;KAC5B;AACH,CAAC;AAED,SAAS,cAAc,CAAC,QAAgB;IACtC,MAAM,KAAK,GAAG,gBAAgB,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;IAC9C,IAAI,KAAK,EAAE;QACT,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;KACjB;SAAM;QACL,OAAO,QAAQ,CAAC;KACjB;AACH,CAAC;AAED,MAAM,OAAO,kBAAkB;IAEV;IACA;IAFnB,YACmB,oBAA0C,EAC1C,UAAyB,YAAY;QADrC,yBAAoB,GAApB,oBAAoB,CAAsB;QAC1C,YAAO,GAAP,OAAO,CAA8B;IACrD,CAAC;IAEI,KAAK,CAAC,cAAc,
|
|
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 "
|
|
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
|
}
|
package/dist/core/xbox-client.js
CHANGED
|
@@ -6,23 +6,29 @@ export class XboxClient {
|
|
|
6
6
|
this.xboxTokenProvider = xboxTokenProvider;
|
|
7
7
|
this.fetchFn = fetchFn;
|
|
8
8
|
}
|
|
9
|
-
async executeRequest(url,
|
|
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
|
-
|
|
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,
|
|
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;
|
|
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
|
@@ -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
|
-
|
|
77
|
-
|
|
78
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 = (
|
|
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
|
-
|
|
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 = (
|
|
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
|
-
|
|
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 = (
|
|
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
|
-
|
|
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 = (
|
|
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
|
-
|
|
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 = (
|
|
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
|
-
|
|
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
|
-
|
|
226
|
+
{
|
|
227
|
+
...init,
|
|
228
|
+
method: "get",
|
|
229
|
+
}
|
|
202
230
|
);
|
|
203
231
|
};
|
|
204
232
|
|
|
205
233
|
public getPlayerServiceRecord(
|
|
206
234
|
playerXuid: string,
|
|
207
|
-
|
|
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
|
-
|
|
241
|
+
{
|
|
242
|
+
...init,
|
|
243
|
+
method: "get",
|
|
244
|
+
}
|
|
214
245
|
);
|
|
215
246
|
}
|
|
216
247
|
|
|
217
|
-
public getMatchStats = (
|
|
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
|
-
|
|
254
|
+
{
|
|
255
|
+
...init,
|
|
256
|
+
method: "get",
|
|
257
|
+
}
|
|
221
258
|
);
|
|
222
259
|
|
|
223
|
-
public getMatchSkill = async (
|
|
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
|
-
|
|
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
|
-
|
|
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
|
-
|
|
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 "
|
|
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
|
package/src/core/xbox-client.ts
CHANGED
|
@@ -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,
|
|
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
|
-
|
|
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(
|
|
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 {
|
|
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";
|