halo-infinite-api 1.0.4 → 1.1.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/core/halo-infinite-client.d.ts +16 -6
- package/dist/core/halo-infinite-client.js +19 -4
- 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/spartan-token.d.ts +2 -3
- package/package.json +1 -1
- package/src/core/halo-infinite-client.ts +54 -16
- 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/spartan-token.ts +3 -1
|
@@ -1,11 +1,13 @@
|
|
|
1
|
+
import { MatchSkill } from "../models/halo-infinite/match-skill";
|
|
2
|
+
import { MatchStats } from "../models/halo-infinite/match-stats";
|
|
3
|
+
import { MatchType } from "../models/halo-infinite/match-type";
|
|
4
|
+
import { PlayerMatchHistory } from "../models/halo-infinite/player-match-history";
|
|
5
|
+
import { Playlist } from "../models/halo-infinite/playlist";
|
|
1
6
|
import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-container";
|
|
2
|
-
import { UserInfo } from "../models/halo-infinite/user-info";
|
|
3
7
|
import { ServiceRecord } from "../models/halo-infinite/service-record";
|
|
4
|
-
import {
|
|
5
|
-
import {
|
|
6
|
-
import {
|
|
7
|
-
import { PlayerMatchHistory } from "src/models/halo-infinite/player-match-history";
|
|
8
|
-
import { MatchSkill } from "src/models/halo-infinite/match-skill";
|
|
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,14 @@
|
|
|
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
|
+
};
|
|
7
12
|
export class HaloInfiniteClient {
|
|
8
13
|
haloAuthClient;
|
|
9
14
|
constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
|
|
@@ -85,8 +90,18 @@ export class HaloInfiniteClient {
|
|
|
85
90
|
* @param playlistId - Unique ID for the playlist.
|
|
86
91
|
*/
|
|
87
92
|
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) =>
|
|
93
|
+
getPlayerMatches = (playerXuid, type = MatchType.All, count = 25, start = 0) => {
|
|
94
|
+
let params = {};
|
|
95
|
+
if (type !== MatchType.All) {
|
|
96
|
+
params.type = type.toString();
|
|
97
|
+
}
|
|
98
|
+
return this.executePaginationRequest(count, start, params, `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/xuid(${playerXuid})/matches`, "get");
|
|
99
|
+
};
|
|
89
100
|
getMatchStats = (matchId) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, "get");
|
|
90
101
|
getMatchSkill = (matchId, playerIds) => this.executeResultsRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/skill?players=xuid(${playerIds.join("),xuid(")})`, "get");
|
|
102
|
+
/** Gets authoring metadata about a specific asset. */
|
|
103
|
+
getAsset = (assetType, assetId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`, "get");
|
|
104
|
+
/** Gets metadata related to a concrete version of a specified asset. */
|
|
105
|
+
getSpecificAssetVersion = (assetType, assetId, versionId) => this.executeRequest(`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`, "get");
|
|
91
106
|
}
|
|
92
107
|
//# 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 {
|
|
7
|
+
import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
|
|
8
|
+
import { MatchSkill } from "../models/halo-infinite/match-skill";
|
|
9
|
+
import { MatchStats } from "../models/halo-infinite/match-stats";
|
|
15
10
|
import { MatchType } from "../models/halo-infinite/match-type";
|
|
16
|
-
import {
|
|
17
|
-
import {
|
|
18
|
-
import {
|
|
11
|
+
import { PlayerMatchHistory } from "../models/halo-infinite/player-match-history";
|
|
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,18 @@ 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
|
+
|
|
42
54
|
export class HaloInfiniteClient {
|
|
43
55
|
private readonly haloAuthClient: HaloAuthenticationClient;
|
|
44
56
|
|
|
@@ -195,14 +207,19 @@ export class HaloInfiniteClient {
|
|
|
195
207
|
type: MatchType = MatchType.All,
|
|
196
208
|
count: number = 25,
|
|
197
209
|
start: number = 0
|
|
198
|
-
) =>
|
|
199
|
-
|
|
210
|
+
) => {
|
|
211
|
+
let params: Record<string, string> = {};
|
|
212
|
+
if (type !== MatchType.All) {
|
|
213
|
+
params.type = type.toString();
|
|
214
|
+
}
|
|
215
|
+
return this.executePaginationRequest<PlayerMatchHistory>(
|
|
200
216
|
count,
|
|
201
217
|
start,
|
|
202
|
-
|
|
218
|
+
params,
|
|
203
219
|
`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/xuid(${playerXuid})/matches`,
|
|
204
220
|
"get"
|
|
205
221
|
);
|
|
222
|
+
};
|
|
206
223
|
|
|
207
224
|
public getMatchStats = (matchId: string) =>
|
|
208
225
|
this.executeRequest<MatchStats>(
|
|
@@ -217,4 +234,25 @@ export class HaloInfiniteClient {
|
|
|
217
234
|
}/hi/matches/${matchId}/skill?players=xuid(${playerIds.join("),xuid(")})`,
|
|
218
235
|
"get"
|
|
219
236
|
);
|
|
237
|
+
|
|
238
|
+
/** Gets authoring metadata about a specific asset. */
|
|
239
|
+
public getAsset = <TAssetType extends keyof AssetKindTypeMap>(
|
|
240
|
+
assetType: TAssetType,
|
|
241
|
+
assetId: string
|
|
242
|
+
) =>
|
|
243
|
+
this.executeRequest<AssetKindTypeMap[TAssetType]>(
|
|
244
|
+
`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`,
|
|
245
|
+
"get"
|
|
246
|
+
);
|
|
247
|
+
|
|
248
|
+
/** Gets metadata related to a concrete version of a specified asset. */
|
|
249
|
+
public getSpecificAssetVersion = <TAssetType extends keyof AssetKindTypeMap>(
|
|
250
|
+
assetType: TAssetType,
|
|
251
|
+
assetId: string,
|
|
252
|
+
versionId: string
|
|
253
|
+
) =>
|
|
254
|
+
this.executeRequest<AssetKindTypeMap[TAssetType]>(
|
|
255
|
+
`https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`,
|
|
256
|
+
"get"
|
|
257
|
+
);
|
|
220
258
|
}
|
|
@@ -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;
|