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.
- package/dist/core/halo-infinite-client.d.ts +16 -6
- package/dist/core/halo-infinite-client.js +38 -9
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/endpoints/halo-core-endpoints.d.ts +2 -0
- package/dist/endpoints/halo-core-endpoints.js +2 -0
- package/dist/endpoints/halo-core-endpoints.js.map +1 -1
- package/dist/index.d.ts +2 -0
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/halo-infinite/api-formatted-date.d.ts +3 -0
- package/dist/models/halo-infinite/api-formatted-date.js +2 -0
- package/dist/models/halo-infinite/api-formatted-date.js.map +1 -0
- package/dist/models/halo-infinite/asset-kind.d.ts +12 -0
- package/dist/models/halo-infinite/asset-kind.js +14 -0
- package/dist/models/halo-infinite/asset-kind.js.map +1 -0
- package/dist/models/halo-infinite/asset-version-link.d.ts +6 -0
- package/dist/models/halo-infinite/asset-version-link.js +2 -0
- package/dist/models/halo-infinite/asset-version-link.js.map +1 -0
- package/dist/models/halo-infinite/asset.d.ts +56 -0
- package/dist/models/halo-infinite/asset.js +2 -0
- package/dist/models/halo-infinite/asset.js.map +1 -0
- package/dist/models/halo-infinite/authoring-asset.d.ts +56 -0
- package/dist/models/halo-infinite/authoring-asset.js +2 -0
- package/dist/models/halo-infinite/authoring-asset.js.map +1 -0
- package/dist/models/halo-infinite/match-info.d.ts +5 -20
- package/dist/models/halo-infinite/match-outcome.d.ts +3 -1
- package/dist/models/halo-infinite/match-outcome.js +2 -0
- package/dist/models/halo-infinite/match-outcome.js.map +1 -1
- package/dist/models/halo-infinite/match-skill.d.ts +1 -1
- package/dist/models/spartan-token.d.ts +2 -3
- package/package.json +1 -1
- package/src/core/halo-infinite-client.ts +88 -23
- package/src/endpoints/halo-core-endpoints.ts +2 -0
- package/src/index.ts +2 -0
- package/src/models/halo-infinite/api-formatted-date.ts +3 -0
- package/src/models/halo-infinite/asset-kind.ts +12 -0
- package/src/models/halo-infinite/asset-version-link.ts +7 -0
- package/src/models/halo-infinite/asset.ts +59 -0
- package/src/models/halo-infinite/match-info.ts +5 -20
- package/src/models/halo-infinite/match-outcome.ts +2 -0
- package/src/models/halo-infinite/match-skill.ts +1 -1
- package/src/models/spartan-token.ts +3 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
|
-
import {
|
|
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 {
|
|
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(
|
|
59
|
-
const result = await this.executeRequest(
|
|
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
|
|
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) =>
|
|
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
|
|
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,
|
|
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 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;
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"api-formatted-date.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/api-formatted-date.ts"],"names":[],"mappings":""}
|
|
@@ -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 @@
|
|
|
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 @@
|
|
|
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 @@
|
|
|
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
|
-
|
|
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,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,
|
|
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"}
|
package/package.json
CHANGED
|
@@ -1,21 +1,21 @@
|
|
|
1
|
-
import axios, { AxiosHeaders } from "axios";
|
|
2
|
-
import {
|
|
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 {
|
|
14
|
-
import {
|
|
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 {
|
|
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
|
-
|
|
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>>(
|
|
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
|
|
161
|
-
|
|
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
|
-
|
|
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
|
-
|
|
203
|
-
`https://${HaloCoreEndpoints.StatsOrigin}.${
|
|
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
|
|
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,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
|
-
|
|
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;
|