halo-infinite-api 6.2.0 → 7.0.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/README.md +6 -4
- package/dist/core/halo-infinite-client.d.ts +6 -2
- package/dist/core/halo-infinite-client.js +5 -7
- package/dist/core/halo-infinite-client.js.map +1 -1
- package/dist/index.d.ts +3 -2
- package/dist/index.js +1 -0
- package/dist/index.js.map +1 -1
- package/dist/models/halo-infinite/progression-file.d.ts +51 -0
- package/dist/models/halo-infinite/progression-file.js +7 -0
- package/dist/models/halo-infinite/progression-file.js.map +1 -0
- package/dist/models/halo-infinite/service-record.d.ts +1 -1
- package/dist/util/expiry-token-cache.js +1 -1
- package/dist/util/expiry-token-cache.js.map +1 -1
- package/dist/util/keyed-expiry-token-cache.js +1 -1
- package/dist/util/keyed-expiry-token-cache.js.map +1 -1
- package/package.json +50 -50
- package/src/core/halo-infinite-client.ts +26 -21
- package/src/index.ts +9 -2
- package/src/models/halo-infinite/progression-file.ts +54 -0
- package/src/models/halo-infinite/service-record.ts +1 -1
- package/src/util/expiry-token-cache.ts +1 -1
- package/src/util/keyed-expiry-token-cache.ts +1 -1
package/README.md
CHANGED
|
@@ -9,10 +9,12 @@ The package is currently limited to the endpoints I've needed to use in other pr
|
|
|
9
9
|
- GET https://profile.svc.halowaypoint.com/users/{gamerTag}
|
|
10
10
|
- GET https://profile.svc.halowaypoint.com/users?xuids={xuids}
|
|
11
11
|
- GET https://skill.svc.halowaypoint.com/hi/playlist/{playlistId}/csrs?players={playerIds}
|
|
12
|
+
- GET https://skill.svc.halowaypoint.com/hi/matches/{matchId}/skill
|
|
12
13
|
- GET https://gamecms-hacs.svc.halowaypoint.com/hi/multiplayer/file/playlists/assets/{playlistId}.json
|
|
14
|
+
- GET https://gamecms-hacs.svc.halowaypoint.com/hi/Progression/file/{filename}.json
|
|
13
15
|
- GET https://halostats.svc.halowaypoint.com/hi/playlist/{playlistId}/csrs?players={playerIds}
|
|
14
16
|
- GET https://halostats.svc.halowaypoint.com/hi/players/xuid({playerId})/matches
|
|
15
|
-
- GET https://
|
|
17
|
+
- GET https://halostats.svc.halowaypoint.com/hi/players/{gamerTagOrWrappedXuid}/Matchmade/servicerecord
|
|
16
18
|
- GET https://halostats.svc.halowaypoint.com/hi/matches/{matchId}/stats
|
|
17
19
|
- GET https://discovery-infiniteugc.svc.halowaypoint.com/hi/{assetType}/{assetId}
|
|
18
20
|
- GET https://discovery-infiniteugc.svc.halowaypoint.com/hi/{assetType}/{assetId}/versions/{versionId}
|
|
@@ -38,7 +40,7 @@ import { HaloInfiniteClient, AutoXstsSpartanTokenProvider } from "halo-infinite-
|
|
|
38
40
|
|
|
39
41
|
const oauthApplication = new msal.PublicClientApplication({
|
|
40
42
|
auth: {
|
|
41
|
-
clientId: "
|
|
43
|
+
clientId: "00000000-0000-0000-0000-000000000000",
|
|
42
44
|
authority: "https://login.live.com", // Override the default authority with the xbox one
|
|
43
45
|
knownAuthorities: ["login.live.com"],
|
|
44
46
|
protocolMode: "OIDC", // Shit, I actually have no idea what this does, but Microsoft says I need it
|
|
@@ -46,9 +48,9 @@ const oauthApplication = new msal.PublicClientApplication({
|
|
|
46
48
|
});
|
|
47
49
|
|
|
48
50
|
const client = new HaloInfiniteClient(
|
|
49
|
-
//
|
|
51
|
+
// Another choice for token providers is the StaticXstsTicketTokenSpartanTokenProvider,
|
|
50
52
|
// which uses a preset spartan token
|
|
51
|
-
new
|
|
53
|
+
new AutoTokenProvider(async () => {
|
|
52
54
|
const token = await oauthApplication.acquireTokenInteractive({
|
|
53
55
|
// offline_access gives us a refresh token which we can use to continually
|
|
54
56
|
// get new credentials from Microsoft as the old ones expire.
|
|
@@ -11,6 +11,7 @@ import { ServiceRecord } from "../models/halo-infinite/service-record";
|
|
|
11
11
|
import { UserInfo } from "../models/halo-infinite/user-info";
|
|
12
12
|
import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
|
|
13
13
|
import { MatchesPrivacy } from "src/models/halo-infinite/matches-privacy";
|
|
14
|
+
import { ProgressionFileType, ProgressionFileTypeMap } from "src/models/halo-infinite/progression-file";
|
|
14
15
|
export interface ResultContainer<TValue> {
|
|
15
16
|
Id: string;
|
|
16
17
|
ResultCode: 0 | 1;
|
|
@@ -48,13 +49,15 @@ export declare class HaloInfiniteClient {
|
|
|
48
49
|
/** Get service record for a player.
|
|
49
50
|
* @param gamerTag - Gamertag to lookup.
|
|
50
51
|
*/
|
|
51
|
-
getUserServiceRecord: (
|
|
52
|
+
getUserServiceRecord: (gamerTagOrWrappedXuid: string, queryParameters?: {
|
|
53
|
+
seasonId?: string;
|
|
54
|
+
playlistAssetId?: string;
|
|
55
|
+
}, init?: Omit<RequestInit, "body" | "method">) => Promise<ServiceRecord>;
|
|
52
56
|
/** Get playlist information
|
|
53
57
|
* @param playlistId - Unique ID for the playlist.
|
|
54
58
|
*/
|
|
55
59
|
getPlaylist: (playlistId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<Playlist>;
|
|
56
60
|
getPlayerMatches: (playerXuid: string, type?: MatchType, count?: number, start?: number, init?: Omit<RequestInit, "body" | "method">) => Promise<PlayerMatchHistory[]>;
|
|
57
|
-
getPlayerServiceRecord(playerXuid: string, init?: Omit<RequestInit, "body" | "method">): Promise<ServiceRecord>;
|
|
58
61
|
getMatchStats: (matchId: string, init?: Omit<RequestInit, "body" | "method">) => Promise<MatchStats<import("..").GameVariantCategory>>;
|
|
59
62
|
getMatchSkill: (matchId: string, playerIds: string[], init?: Omit<RequestInit, "body" | "method">) => Promise<ResultContainer<MatchSkill<0>>[]>;
|
|
60
63
|
/** Gets authoring metadata about a specific asset. */
|
|
@@ -67,4 +70,5 @@ export declare class HaloInfiniteClient {
|
|
|
67
70
|
}>;
|
|
68
71
|
getMatchesPrivacy: (playerXuid: string, init?: Omit<RequestInit, "body" | "method">) => Promise<MatchesPrivacy>;
|
|
69
72
|
updateMatchesPrivacy: (playerXuid: string, matchesPrivacy: MatchesPrivacy, init?: Omit<RequestInit, "body" | "method">) => Promise<MatchesPrivacy>;
|
|
73
|
+
getProgressionFile: <TFileType extends ProgressionFileType>(filename: `${TFileType}/${string}.json`, init?: Omit<RequestInit, "body" | "method">) => Promise<ProgressionFileTypeMap[TFileType]>;
|
|
70
74
|
}
|
|
@@ -115,7 +115,7 @@ export class HaloInfiniteClient {
|
|
|
115
115
|
/** Get service record for a player.
|
|
116
116
|
* @param gamerTag - Gamertag to lookup.
|
|
117
117
|
*/
|
|
118
|
-
getUserServiceRecord = (
|
|
118
|
+
getUserServiceRecord = (gamerTagOrWrappedXuid, queryParameters, init) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${gamerTagOrWrappedXuid}/Matchmade/servicerecord?${new URLSearchParams(queryParameters).toString()}`, {
|
|
119
119
|
...init,
|
|
120
120
|
method: "get",
|
|
121
121
|
});
|
|
@@ -136,12 +136,6 @@ export class HaloInfiniteClient {
|
|
|
136
136
|
method: "get",
|
|
137
137
|
});
|
|
138
138
|
};
|
|
139
|
-
getPlayerServiceRecord(playerXuid, init) {
|
|
140
|
-
return this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`, {
|
|
141
|
-
...init,
|
|
142
|
-
method: "get",
|
|
143
|
-
});
|
|
144
|
-
}
|
|
145
139
|
getMatchStats = (matchId, init) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`, {
|
|
146
140
|
...init,
|
|
147
141
|
method: "get",
|
|
@@ -180,5 +174,9 @@ export class HaloInfiniteClient {
|
|
|
180
174
|
body: JSON.stringify({ matchesPrivacy }),
|
|
181
175
|
});
|
|
182
176
|
};
|
|
177
|
+
getProgressionFile = (filename, init) => this.executeRequest(`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Progression/file/${filename}`, {
|
|
178
|
+
...init,
|
|
179
|
+
method: "get",
|
|
180
|
+
});
|
|
183
181
|
}
|
|
184
182
|
//# 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;AAOrE,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;AAE1D,OAAO,EAAE,YAAY,EAAE,MAAM,uBAAuB,CAAC;
|
|
1
|
+
{"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -6,7 +6,7 @@ export { AutoTokenProvider, AutoTokenProvider as AutoXstsSpartanTokenProvider, }
|
|
|
6
6
|
export { SpartanTokenProvider } from "./core/token-providers/spartan-token-providers";
|
|
7
7
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
8
8
|
export { XboxClient } from "./core/xbox-client";
|
|
9
|
-
export { Asset, MapAsset, PlaylistAsset, UgcGameVariantAsset,
|
|
9
|
+
export { Asset, MapAsset, MapModePairAsset, PlaylistAsset, UgcGameVariantAsset, } from "./models/halo-infinite/asset";
|
|
10
10
|
export { AssetKind } from "./models/halo-infinite/asset-kind";
|
|
11
11
|
export { AssetVersionLink } from "./models/halo-infinite/asset-version-link";
|
|
12
12
|
export { GameVariantCategory } from "./models/halo-infinite/game-variant-category";
|
|
@@ -21,9 +21,10 @@ export { Playlist } from "./models/halo-infinite/playlist";
|
|
|
21
21
|
export { PlaylistCsr } from "./models/halo-infinite/playlist-csr";
|
|
22
22
|
export { PlaylistCsrContainer } from "./models/halo-infinite/playlist-csr-container";
|
|
23
23
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
24
|
+
export { SeasonCalendarProgressionFile, CsrSeasonCalendarProgressionFile, ProgressionFileType, ProgressionFileTypeMap, SeasonProgressionFile, } from "./models/halo-infinite/progression-file";
|
|
24
25
|
export { ServiceRecord } from "./models/halo-infinite/service-record";
|
|
25
26
|
export { Stats } from "./models/halo-infinite/stats";
|
|
26
27
|
export { UserInfo } from "./models/halo-infinite/user-info";
|
|
28
|
+
export { XboxTicket } from "./models/xbox-ticket";
|
|
27
29
|
export { FetchFunction } from "./util/fetch-function";
|
|
28
30
|
export { RequestError } from "./util/request-error";
|
|
29
|
-
export { XboxTicket } from "./models/xbox-ticket";
|
package/dist/index.js
CHANGED
|
@@ -10,5 +10,6 @@ export { MatchOutcome } from "./models/halo-infinite/match-outcome";
|
|
|
10
10
|
export { MatchType } from "./models/halo-infinite/match-type";
|
|
11
11
|
export { Privacy, } from "./models/halo-infinite/matches-privacy";
|
|
12
12
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
13
|
+
export { ProgressionFileType, } from "./models/halo-infinite/progression-file";
|
|
13
14
|
export { RequestError } from "./util/request-error";
|
|
14
15
|
//# 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,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,wBAAwB,GAEzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAEL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAEL,OAAO,GACR,MAAM,wCAAwC,CAAC;AAKhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,wBAAwB,EAAE,MAAM,6CAA6C,CAAC;AACvF,OAAO,EACL,YAAY,EACZ,wBAAwB,GAEzB,MAAM,6CAA6C,CAAC;AACrD,OAAO,EAEL,kBAAkB,GAEnB,MAAM,6BAA6B,CAAC;AAErC,OAAO,EACL,iBAAiB,EACjB,iBAAiB,IAAI,4BAA4B,GAClD,MAAM,4CAA4C,CAAC;AAEpD,OAAO,EAAE,yCAAyC,EAAE,MAAM,gGAAgG,CAAC;AAC3J,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAQhD,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAE9D,OAAO,EAAE,mBAAmB,EAAE,MAAM,8CAA8C,CAAC;AAEnF,OAAO,EAAE,YAAY,EAAE,MAAM,sCAAsC,CAAC;AAGpE,OAAO,EAAE,SAAS,EAAE,MAAM,mCAAmC,CAAC;AAC9D,OAAO,EAEL,OAAO,GACR,MAAM,wCAAwC,CAAC;AAKhD,OAAO,EAAE,kBAAkB,EAAE,MAAM,4CAA4C,CAAC;AAChF,OAAO,EAGL,mBAAmB,GAGpB,MAAM,yCAAyC,CAAC;AAMjD,OAAO,EAAE,YAAY,EAAE,MAAM,sBAAsB,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
import { ApiFormattedDate } from "./api-formatted-date";
|
|
2
|
+
export declare enum ProgressionFileType {
|
|
3
|
+
Seasons = "Seasons",
|
|
4
|
+
Calendars = "Calendars",
|
|
5
|
+
"Csr/Seasons" = "Csr/Seasons"
|
|
6
|
+
}
|
|
7
|
+
export type ProgressionFileTypeMap = {
|
|
8
|
+
Calendars: SeasonCalendarProgressionFile;
|
|
9
|
+
Seasons: SeasonProgressionFile;
|
|
10
|
+
["Csr/Seasons"]: CsrSeasonCalendarProgressionFile;
|
|
11
|
+
};
|
|
12
|
+
export interface SeasonCalendarProgressionFile {
|
|
13
|
+
Seasons: {
|
|
14
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
15
|
+
OperationTrackPath: `RewardTracks/Operations/${string}.json`;
|
|
16
|
+
SeasonMetadata: `Seasons/${string}.json`;
|
|
17
|
+
StartDate: ApiFormattedDate;
|
|
18
|
+
EndDate: ApiFormattedDate;
|
|
19
|
+
}[];
|
|
20
|
+
Events: {
|
|
21
|
+
RewardTrackPath: `RewardTracks/Events/Rituals/${string}.json`;
|
|
22
|
+
StartDate: ApiFormattedDate;
|
|
23
|
+
EndDate: ApiFormattedDate;
|
|
24
|
+
}[];
|
|
25
|
+
CareerRank: {
|
|
26
|
+
RewardTrackPath: `RewardTracks/CareerRanks/${string}.json`;
|
|
27
|
+
};
|
|
28
|
+
}
|
|
29
|
+
export interface CsrSeasonCalendarProgressionFile {
|
|
30
|
+
Seasons: {
|
|
31
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
32
|
+
StartDate: ApiFormattedDate;
|
|
33
|
+
EndDate: ApiFormattedDate;
|
|
34
|
+
}[];
|
|
35
|
+
}
|
|
36
|
+
export interface SeasonProgressionFile {
|
|
37
|
+
DateRange: string;
|
|
38
|
+
Name: string;
|
|
39
|
+
Logo: string;
|
|
40
|
+
Number: number;
|
|
41
|
+
Description: string;
|
|
42
|
+
SummaryBackgroundPath: string;
|
|
43
|
+
BattlePassSeasonUpsellBackgroundImage: string;
|
|
44
|
+
ChallengesBackgroundPath: string;
|
|
45
|
+
BattlePassLogoImage: string;
|
|
46
|
+
SeasonLogoImage: string;
|
|
47
|
+
RitualLogoImage: string;
|
|
48
|
+
StorefrontBackgroundImage: string;
|
|
49
|
+
CardBackgroundImage: string;
|
|
50
|
+
ProgressionBackgroundImage: string;
|
|
51
|
+
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
export var ProgressionFileType;
|
|
2
|
+
(function (ProgressionFileType) {
|
|
3
|
+
ProgressionFileType["Seasons"] = "Seasons";
|
|
4
|
+
ProgressionFileType["Calendars"] = "Calendars";
|
|
5
|
+
ProgressionFileType["Csr/Seasons"] = "Csr/Seasons";
|
|
6
|
+
})(ProgressionFileType || (ProgressionFileType = {}));
|
|
7
|
+
//# sourceMappingURL=progression-file.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"progression-file.js","sourceRoot":"","sources":["../../../src/models/halo-infinite/progression-file.ts"],"names":[],"mappings":"AAEA,MAAM,CAAN,IAAY,mBAIX;AAJD,WAAY,mBAAmB;IAC7B,0CAAmB,CAAA;IACnB,8CAAuB,CAAA;IACvB,kDAA6B,CAAA;AAC/B,CAAC,EAJW,mBAAmB,KAAnB,mBAAmB,QAI9B"}
|
|
@@ -16,7 +16,7 @@ export interface ServiceRecord {
|
|
|
16
16
|
StockpileStats: StockpileStats;
|
|
17
17
|
}
|
|
18
18
|
interface Subqueries {
|
|
19
|
-
SeasonIds: string[];
|
|
19
|
+
SeasonIds: (`Csr/Seasons/${string}.json` | `Seasons/${string}.json`)[];
|
|
20
20
|
GameVariantCategories: number[];
|
|
21
21
|
IsRanked: boolean[];
|
|
22
22
|
PlaylistAssetIds: string[];
|
|
@@ -15,7 +15,7 @@ export class ExpiryTokenCache {
|
|
|
15
15
|
// Someone either already has a token or is in the process of getting one
|
|
16
16
|
// Wait for them to finish, then check for validity
|
|
17
17
|
const currentToken = await this.tokenFetchPromise;
|
|
18
|
-
if (currentToken.expiresAt > DateTime.now()) {
|
|
18
|
+
if (currentToken.expiresAt > DateTime.now().minus({ minute: 1 })) {
|
|
19
19
|
// Current token is valid, return it
|
|
20
20
|
return currentToken;
|
|
21
21
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/expiry-token-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAO,gBAAgB;IAOR;IACA;IAJX,iBAAiB,GAA0C,SAAS,CAAC;IAE7E,YACmB,gBAAqD,EACrD,oBAEhB;QAHgB,qBAAgB,GAAhB,gBAAgB,CAAqC;QACrD,yBAAoB,GAApB,oBAAoB,CAEpC;IACA,CAAC;IAEJ,+DAA+D;IAC/D,KAAK,CAAC,QAAQ,CAAC,GAAG,IAAW;QAC3B,IAAI,IAAI,CAAC,iBAAiB,EAAE;YAC1B,yEAAyE;YACzE,mDAAmD;YACnD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC;YAElD,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/expiry-token-cache.ts"],"names":[],"mappings":"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"}
|
|
@@ -43,7 +43,7 @@ export class KeyedExpiryTokenCache {
|
|
|
43
43
|
const existingToken = await this.getExistingToken(key);
|
|
44
44
|
if (existingToken?.expiresAt) {
|
|
45
45
|
const expiresAt = coalesceDateTime(existingToken.expiresAt);
|
|
46
|
-
if (expiresAt && expiresAt > DateTime.now()) {
|
|
46
|
+
if (expiresAt && expiresAt > DateTime.now().minus({ minute: 1 })) {
|
|
47
47
|
const newToken = { ...existingToken, expiresAt };
|
|
48
48
|
tokenFetchPromise.resolve(newToken);
|
|
49
49
|
return newToken;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"keyed-expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/keyed-expiry-token-cache.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AACjC,OAAO,EAAE,iBAAiB,EAAE,MAAM,sBAAsB,CAAC;AACzD,OAAO,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAC;AAE/C,MAAM,OAAO,qBAAqB;IAWb;IAIA;IAVF,oBAAoB,GAAG,IAAI,GAAG,EAG5C,CAAC;IAEJ,YACmB,gBAGG,EACH,oBAEwD;QANxD,qBAAgB,GAAhB,gBAAgB,CAGb;QACH,yBAAoB,GAApB,oBAAoB,CAEoC;IACxE,CAAC;IAEJ,KAAK,CAAC,QAAQ,CAAC,GAAS,EAAE,GAAG,IAAW;QACtC,IAAI,iBAAiB,GAAG,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;QAC3D,IAAI,iBAAiB,EAAE;YACrB,yEAAyE;YACzE,mDAAmD;YACnD,MAAM,YAAY,GAAG,MAAM,iBAAiB,CAAC;YAE7C,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;gBAC3C,oCAAoC;gBACpC,OAAO,YAAY,CAAC;aACrB;iBAAM;gBACL,6CAA6C;gBAC7C,iBAAiB,GAAG,IAAI,iBAAiB,EAAU,CAAC;gBACpD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;gBAEtD,IAAI;oBACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,EAAE,GAAG,IAAI,CAAC,CAAC;oBAC3D,iBAAiB,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC;oBACpC,OAAO,QAAQ,CAAC;iBACjB;gBAAC,OAAO,CAAC,EAAE;oBACV,iBAAiB,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC;oBAC5B,iBAAiB,GAAG,SAAS,CAAC;oBAC9B,MAAM,CAAC,CAAC;iBACT;aACF;SACF;aAAM;YACL,0CAA0C;YAC1C,iBAAiB,GAAG,IAAI,iBAAiB,EAAU,CAAC;YACpD,IAAI,CAAC,oBAAoB,CAAC,GAAG,CAAC,GAAG,EAAE,iBAAiB,CAAC,CAAC;YAEtD,IAAI;gBACF,MAAM,aAAa,GAAG,MAAM,IAAI,CAAC,gBAAgB,CAAC,GAAG,CAAC,CAAC;gBAEvD,IAAI,aAAa,EAAE,SAAS,EAAE;oBAC5B,MAAM,SAAS,GAAG,gBAAgB,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;oBAC5D,IAAI,SAAS,IAAI,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;
|
|
1
|
+
{"version":3,"file":"keyed-expiry-token-cache.js","sourceRoot":"","sources":["../../src/util/keyed-expiry-token-cache.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,50 +1,50 @@
|
|
|
1
|
-
{
|
|
2
|
-
"name": "halo-infinite-api",
|
|
3
|
-
"type": "module",
|
|
4
|
-
"version": "
|
|
5
|
-
"description": "An NPM package for accessing the official Halo Infinite API.",
|
|
6
|
-
"main": "dist/index.js",
|
|
7
|
-
"exports": {
|
|
8
|
-
".": "./dist/index.js",
|
|
9
|
-
"./token-persisters": "./dist/core/token-persisters/index.js"
|
|
10
|
-
},
|
|
11
|
-
"scripts": {
|
|
12
|
-
"prepack": "tsc --project tsconfig.app.json"
|
|
13
|
-
},
|
|
14
|
-
"repository": {
|
|
15
|
-
"type": "git",
|
|
16
|
-
"url": "git+https://github.com/GravlLift/halo-infinite-api.git"
|
|
17
|
-
},
|
|
18
|
-
"keywords": [
|
|
19
|
-
"halo",
|
|
20
|
-
"infinite",
|
|
21
|
-
"api"
|
|
22
|
-
],
|
|
23
|
-
"author": "GravlLift",
|
|
24
|
-
"license": "ISC",
|
|
25
|
-
"bugs": {
|
|
26
|
-
"url": "https://github.com/GravlLift/halo-infinite-api/issues"
|
|
27
|
-
},
|
|
28
|
-
"homepage": "https://github.com/GravlLift/halo-infinite-api#readme",
|
|
29
|
-
"devDependencies": {
|
|
30
|
-
"@types/jest": "^29.5.0",
|
|
31
|
-
"@types/luxon": "^3.3.0",
|
|
32
|
-
"jest": "^29.5.0",
|
|
33
|
-
"jest-environment-jsdom": "^29.5.0",
|
|
34
|
-
"ts-jest": "^29.1.0",
|
|
35
|
-
"ts-node": "^10.9.1",
|
|
36
|
-
"typescript": "^5.0.4",
|
|
37
|
-
"yargs": "^17.7.1"
|
|
38
|
-
},
|
|
39
|
-
"dependencies": {
|
|
40
|
-
"@azure/msal-node": "^2.2.0",
|
|
41
|
-
"axios": "^1.6.2",
|
|
42
|
-
"expiry-map": "^2.0.0",
|
|
43
|
-
"luxon": "^3.3.0",
|
|
44
|
-
"pkce-challenge": "^3.1.0",
|
|
45
|
-
"simple-oauth2": "^5.0.0"
|
|
46
|
-
},
|
|
47
|
-
"publishConfig": {
|
|
48
|
-
"@GravlLift:registry": "https://npm.pkg.github.com"
|
|
49
|
-
}
|
|
50
|
-
}
|
|
1
|
+
{
|
|
2
|
+
"name": "halo-infinite-api",
|
|
3
|
+
"type": "module",
|
|
4
|
+
"version": "7.0.1",
|
|
5
|
+
"description": "An NPM package for accessing the official Halo Infinite API.",
|
|
6
|
+
"main": "dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js",
|
|
9
|
+
"./token-persisters": "./dist/core/token-persisters/index.js"
|
|
10
|
+
},
|
|
11
|
+
"scripts": {
|
|
12
|
+
"prepack": "tsc --project tsconfig.app.json"
|
|
13
|
+
},
|
|
14
|
+
"repository": {
|
|
15
|
+
"type": "git",
|
|
16
|
+
"url": "git+https://github.com/GravlLift/halo-infinite-api.git"
|
|
17
|
+
},
|
|
18
|
+
"keywords": [
|
|
19
|
+
"halo",
|
|
20
|
+
"infinite",
|
|
21
|
+
"api"
|
|
22
|
+
],
|
|
23
|
+
"author": "GravlLift",
|
|
24
|
+
"license": "ISC",
|
|
25
|
+
"bugs": {
|
|
26
|
+
"url": "https://github.com/GravlLift/halo-infinite-api/issues"
|
|
27
|
+
},
|
|
28
|
+
"homepage": "https://github.com/GravlLift/halo-infinite-api#readme",
|
|
29
|
+
"devDependencies": {
|
|
30
|
+
"@types/jest": "^29.5.0",
|
|
31
|
+
"@types/luxon": "^3.3.0",
|
|
32
|
+
"jest": "^29.5.0",
|
|
33
|
+
"jest-environment-jsdom": "^29.5.0",
|
|
34
|
+
"ts-jest": "^29.1.0",
|
|
35
|
+
"ts-node": "^10.9.1",
|
|
36
|
+
"typescript": "^5.0.4",
|
|
37
|
+
"yargs": "^17.7.1"
|
|
38
|
+
},
|
|
39
|
+
"dependencies": {
|
|
40
|
+
"@azure/msal-node": "^2.2.0",
|
|
41
|
+
"axios": "^1.6.2",
|
|
42
|
+
"expiry-map": "^2.0.0",
|
|
43
|
+
"luxon": "^3.3.0",
|
|
44
|
+
"pkce-challenge": "^3.1.0",
|
|
45
|
+
"simple-oauth2": "^5.0.0"
|
|
46
|
+
},
|
|
47
|
+
"publishConfig": {
|
|
48
|
+
"@GravlLift:registry": "https://npm.pkg.github.com"
|
|
49
|
+
}
|
|
50
|
+
}
|
|
@@ -19,6 +19,10 @@ import { GlobalConstants } from "../util/global-contants";
|
|
|
19
19
|
import { SpartanTokenProvider } from "./token-providers/spartan-token-providers";
|
|
20
20
|
import { RequestError } from "../util/request-error";
|
|
21
21
|
import { MatchesPrivacy } from "src/models/halo-infinite/matches-privacy";
|
|
22
|
+
import {
|
|
23
|
+
ProgressionFileType,
|
|
24
|
+
ProgressionFileTypeMap,
|
|
25
|
+
} from "src/models/halo-infinite/progression-file";
|
|
22
26
|
|
|
23
27
|
export interface ResultContainer<TValue> {
|
|
24
28
|
Id: string;
|
|
@@ -45,10 +49,10 @@ export type AssetKindTypeMap = {
|
|
|
45
49
|
};
|
|
46
50
|
|
|
47
51
|
const assetKindUrlMap = {
|
|
48
|
-
[AssetKind.Map]: "Maps",
|
|
49
|
-
[AssetKind.UgcGameVariant]: "UgcGameVariants",
|
|
50
|
-
[AssetKind.Playlist]: "Playlists",
|
|
51
|
-
[AssetKind.MapModePair]: "MapModePairs",
|
|
52
|
+
[AssetKind.Map]: "Maps" as const,
|
|
53
|
+
[AssetKind.UgcGameVariant]: "UgcGameVariants" as const,
|
|
54
|
+
[AssetKind.Playlist]: "Playlists" as const,
|
|
55
|
+
[AssetKind.MapModePair]: "MapModePairs" as const,
|
|
52
56
|
} satisfies {
|
|
53
57
|
[key in keyof AssetKindTypeMap]: string;
|
|
54
58
|
};
|
|
@@ -203,11 +207,16 @@ export class HaloInfiniteClient {
|
|
|
203
207
|
* @param gamerTag - Gamertag to lookup.
|
|
204
208
|
*/
|
|
205
209
|
public getUserServiceRecord = (
|
|
206
|
-
|
|
210
|
+
gamerTagOrWrappedXuid: string,
|
|
211
|
+
queryParameters?: { seasonId?: string; playlistAssetId?: string },
|
|
207
212
|
init?: Omit<RequestInit, "body" | "method">
|
|
208
213
|
) =>
|
|
209
214
|
this.executeRequest<ServiceRecord>(
|
|
210
|
-
`https://${HaloCoreEndpoints.StatsOrigin}.${
|
|
215
|
+
`https://${HaloCoreEndpoints.StatsOrigin}.${
|
|
216
|
+
HaloCoreEndpoints.ServiceDomain
|
|
217
|
+
}/hi/players/${gamerTagOrWrappedXuid}/Matchmade/servicerecord?${new URLSearchParams(
|
|
218
|
+
queryParameters
|
|
219
|
+
).toString()}`,
|
|
211
220
|
{
|
|
212
221
|
...init,
|
|
213
222
|
method: "get",
|
|
@@ -254,21 +263,6 @@ export class HaloInfiniteClient {
|
|
|
254
263
|
);
|
|
255
264
|
};
|
|
256
265
|
|
|
257
|
-
public getPlayerServiceRecord(
|
|
258
|
-
playerXuid: string,
|
|
259
|
-
init?: Omit<RequestInit, "body" | "method">
|
|
260
|
-
) {
|
|
261
|
-
return this.executeRequest<ServiceRecord>(
|
|
262
|
-
`https://${HaloCoreEndpoints.StatsOrigin}.${
|
|
263
|
-
HaloCoreEndpoints.ServiceDomain
|
|
264
|
-
}/hi/players/${wrapPlayerId(playerXuid)}/Matchmade/servicerecord`,
|
|
265
|
-
{
|
|
266
|
-
...init,
|
|
267
|
-
method: "get",
|
|
268
|
-
}
|
|
269
|
-
);
|
|
270
|
-
}
|
|
271
|
-
|
|
272
266
|
public getMatchStats = (
|
|
273
267
|
matchId: string,
|
|
274
268
|
init?: Omit<RequestInit, "body" | "method">
|
|
@@ -371,4 +365,15 @@ export class HaloInfiniteClient {
|
|
|
371
365
|
}
|
|
372
366
|
);
|
|
373
367
|
};
|
|
368
|
+
public getProgressionFile = <TFileType extends ProgressionFileType>(
|
|
369
|
+
filename: `${TFileType}/${string}.json`,
|
|
370
|
+
init?: Omit<RequestInit, "body" | "method">
|
|
371
|
+
): Promise<ProgressionFileTypeMap[TFileType]> =>
|
|
372
|
+
this.executeRequest(
|
|
373
|
+
`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Progression/file/${filename}`,
|
|
374
|
+
{
|
|
375
|
+
...init,
|
|
376
|
+
method: "get",
|
|
377
|
+
}
|
|
378
|
+
);
|
|
374
379
|
}
|
package/src/index.ts
CHANGED
|
@@ -20,9 +20,9 @@ export { XboxClient } from "./core/xbox-client";
|
|
|
20
20
|
export {
|
|
21
21
|
Asset,
|
|
22
22
|
MapAsset,
|
|
23
|
+
MapModePairAsset,
|
|
23
24
|
PlaylistAsset,
|
|
24
25
|
UgcGameVariantAsset,
|
|
25
|
-
MapModePairAsset,
|
|
26
26
|
} from "./models/halo-infinite/asset";
|
|
27
27
|
export { AssetKind } from "./models/halo-infinite/asset-kind";
|
|
28
28
|
export { AssetVersionLink } from "./models/halo-infinite/asset-version-link";
|
|
@@ -41,9 +41,16 @@ export { Playlist } from "./models/halo-infinite/playlist";
|
|
|
41
41
|
export { PlaylistCsr } from "./models/halo-infinite/playlist-csr";
|
|
42
42
|
export { PlaylistCsrContainer } from "./models/halo-infinite/playlist-csr-container";
|
|
43
43
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
44
|
+
export {
|
|
45
|
+
SeasonCalendarProgressionFile,
|
|
46
|
+
CsrSeasonCalendarProgressionFile,
|
|
47
|
+
ProgressionFileType,
|
|
48
|
+
ProgressionFileTypeMap,
|
|
49
|
+
SeasonProgressionFile,
|
|
50
|
+
} from "./models/halo-infinite/progression-file";
|
|
44
51
|
export { ServiceRecord } from "./models/halo-infinite/service-record";
|
|
45
52
|
export { Stats } from "./models/halo-infinite/stats";
|
|
46
53
|
export { UserInfo } from "./models/halo-infinite/user-info";
|
|
54
|
+
export { XboxTicket } from "./models/xbox-ticket";
|
|
47
55
|
export { FetchFunction } from "./util/fetch-function";
|
|
48
56
|
export { RequestError } from "./util/request-error";
|
|
49
|
-
export { XboxTicket } from "./models/xbox-ticket";
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { ApiFormattedDate } from "./api-formatted-date";
|
|
2
|
+
|
|
3
|
+
export enum ProgressionFileType {
|
|
4
|
+
Seasons = "Seasons",
|
|
5
|
+
Calendars = "Calendars",
|
|
6
|
+
"Csr/Seasons" = "Csr/Seasons",
|
|
7
|
+
}
|
|
8
|
+
|
|
9
|
+
export type ProgressionFileTypeMap = {
|
|
10
|
+
Calendars: SeasonCalendarProgressionFile;
|
|
11
|
+
Seasons: SeasonProgressionFile;
|
|
12
|
+
["Csr/Seasons"]: CsrSeasonCalendarProgressionFile;
|
|
13
|
+
};
|
|
14
|
+
|
|
15
|
+
export interface SeasonCalendarProgressionFile {
|
|
16
|
+
Seasons: {
|
|
17
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
18
|
+
OperationTrackPath: `RewardTracks/Operations/${string}.json`;
|
|
19
|
+
SeasonMetadata: `Seasons/${string}.json`;
|
|
20
|
+
StartDate: ApiFormattedDate;
|
|
21
|
+
EndDate: ApiFormattedDate;
|
|
22
|
+
}[];
|
|
23
|
+
Events: {
|
|
24
|
+
RewardTrackPath: `RewardTracks/Events/Rituals/${string}.json`;
|
|
25
|
+
StartDate: ApiFormattedDate;
|
|
26
|
+
EndDate: ApiFormattedDate;
|
|
27
|
+
}[];
|
|
28
|
+
CareerRank: { RewardTrackPath: `RewardTracks/CareerRanks/${string}.json` };
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export interface CsrSeasonCalendarProgressionFile {
|
|
32
|
+
Seasons: {
|
|
33
|
+
CsrSeasonFilePath: `Csr/Seasons/${string}.json`;
|
|
34
|
+
StartDate: ApiFormattedDate;
|
|
35
|
+
EndDate: ApiFormattedDate;
|
|
36
|
+
}[];
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
export interface SeasonProgressionFile {
|
|
40
|
+
DateRange: string;
|
|
41
|
+
Name: string;
|
|
42
|
+
Logo: string;
|
|
43
|
+
Number: number;
|
|
44
|
+
Description: string;
|
|
45
|
+
SummaryBackgroundPath: string;
|
|
46
|
+
BattlePassSeasonUpsellBackgroundImage: string;
|
|
47
|
+
ChallengesBackgroundPath: string;
|
|
48
|
+
BattlePassLogoImage: string;
|
|
49
|
+
SeasonLogoImage: string;
|
|
50
|
+
RitualLogoImage: string;
|
|
51
|
+
StorefrontBackgroundImage: string;
|
|
52
|
+
CardBackgroundImage: string;
|
|
53
|
+
ProgressionBackgroundImage: string;
|
|
54
|
+
}
|
|
@@ -22,7 +22,7 @@ export class ExpiryTokenCache<
|
|
|
22
22
|
// Wait for them to finish, then check for validity
|
|
23
23
|
const currentToken = await this.tokenFetchPromise;
|
|
24
24
|
|
|
25
|
-
if (currentToken.expiresAt > DateTime.now()) {
|
|
25
|
+
if (currentToken.expiresAt > DateTime.now().minus({ minute: 1 })) {
|
|
26
26
|
// Current token is valid, return it
|
|
27
27
|
return currentToken;
|
|
28
28
|
} else {
|
|
@@ -57,7 +57,7 @@ export class KeyedExpiryTokenCache<
|
|
|
57
57
|
|
|
58
58
|
if (existingToken?.expiresAt) {
|
|
59
59
|
const expiresAt = coalesceDateTime(existingToken.expiresAt);
|
|
60
|
-
if (expiresAt && expiresAt > DateTime.now()) {
|
|
60
|
+
if (expiresAt && expiresAt > DateTime.now().minus({ minute: 1 })) {
|
|
61
61
|
const newToken = { ...existingToken, expiresAt } as TToken;
|
|
62
62
|
tokenFetchPromise.resolve(newToken);
|
|
63
63
|
return newToken;
|