halo-infinite-api 14.2.0 → 14.2.2
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/coverage/lcov-report/authentication/halo-authentication-client.ts.html +1 -1
- package/coverage/lcov-report/authentication/index.html +1 -1
- package/coverage/lcov-report/authentication/xbox-authentication-client.ts.html +1 -1
- package/coverage/lcov-report/core/halo-infinite-client.ts.html +57 -9
- package/coverage/lcov-report/core/index.html +14 -14
- package/coverage/lcov-report/core/request-policy.ts.html +1 -1
- package/coverage/lcov-report/core/token-persisters/in-memory-token-persister.ts.html +1 -1
- package/coverage/lcov-report/core/token-persisters/index.html +18 -18
- package/coverage/lcov-report/core/token-persisters/local-storage-token-persister.ts.html +1 -1
- package/coverage/lcov-report/core/token-persisters/node-fs-token-persister.ts.html +42 -15
- package/coverage/lcov-report/core/token-persisters/token-persister.ts.html +1 -1
- package/coverage/lcov-report/core/token-providers/auto-token-provider.ts.html +1 -1
- package/coverage/lcov-report/core/token-providers/index.html +1 -1
- package/coverage/lcov-report/core/token-providers/spartan-token-provider.ts.html +1 -1
- package/coverage/lcov-report/core/token-providers/static-xsts-ticket-token-spartan-token-provider.ts.html +1 -1
- package/coverage/lcov-report/core/token-providers/xbox-token-provider.ts.html +1 -1
- package/coverage/lcov-report/core/xbox-client.ts.html +1 -1
- package/coverage/lcov-report/endpoints/halo-core-endpoints.ts.html +2 -2
- package/coverage/lcov-report/endpoints/index.html +1 -1
- package/coverage/lcov-report/index.html +52 -37
- package/coverage/lcov-report/models/halo-infinite/api-formatted-date.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/asset-kind.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/asset-version-link.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/asset.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/ban-message.ts.html +97 -0
- package/coverage/lcov-report/models/halo-infinite/ban-summary.ts.html +28 -4
- package/coverage/lcov-report/models/halo-infinite/game-variant-category.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/index.html +25 -10
- package/coverage/lcov-report/models/halo-infinite/match-count.ts.html +5 -5
- package/coverage/lcov-report/models/halo-infinite/match-info.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-outcome.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-skill.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-stats.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/match-type.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/matches-privacy.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/medals-metadata-file.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/player-match-history.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist-csr-container.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist-csr.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist-experience.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/playlist.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/progression-file.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/season.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/service-record.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/settings.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/skill-result.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/stats.ts.html +1 -1
- package/coverage/lcov-report/models/halo-infinite/user-info.ts.html +1 -1
- package/coverage/lcov-report/models/index.html +1 -1
- package/coverage/lcov-report/models/spartan-token-proof.ts.html +1 -1
- package/coverage/lcov-report/models/spartan-token-request.ts.html +1 -1
- package/coverage/lcov-report/models/spartan-token.ts.html +1 -1
- package/coverage/lcov-report/models/xbox-ticket.ts.html +1 -1
- package/coverage/lcov-report/types/import-meta.d.ts.html +100 -0
- package/coverage/lcov-report/types/index.html +116 -0
- package/coverage/lcov-report/util/date-time.ts.html +2 -2
- package/coverage/lcov-report/util/expiry-token-cache.ts.html +2 -2
- package/coverage/lcov-report/util/fetch-function.ts.html +1 -1
- package/coverage/lcov-report/util/global-contants.ts.html +1 -1
- package/coverage/lcov-report/util/index.html +5 -5
- package/coverage/lcov-report/util/keyed-expiry-token-cache.ts.html +2 -2
- package/coverage/lcov-report/util/request-error.ts.html +2 -2
- package/coverage/lcov-report/util/resolvable-promise.ts.html +32 -32
- package/coverage/lcov-report/util/xuid.ts.html +3 -3
- package/coverage/lcov.info +287 -224
- package/dist/core/token-persisters/index.cjs +12 -6
- package/dist/core/token-persisters/index.cjs.map +1 -1
- package/dist/core/token-persisters/index.js +12 -6
- package/dist/core/token-persisters/index.js.map +1 -1
- package/dist/index.cjs +22 -1
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +17 -5
- package/dist/index.d.ts +17 -5
- package/dist/index.js +21 -2
- package/dist/index.js.map +1 -1
- package/jest.config.ts +1 -0
- package/jest.setup.ts +5 -0
- package/package.json +2 -2
- package/scripts/jest-runner.mjs +31 -0
- package/src/core/halo-infinite-client.ts +17 -1
- package/src/core/token-persisters/node-fs-token-persister.ts +15 -6
- package/src/endpoints/halo-core-endpoints.ts +1 -1
- package/src/index.ts +7 -1
- package/src/models/halo-infinite/ban-message.ts +4 -0
- package/src/models/halo-infinite/ban-summary.ts +8 -0
- package/src/models/halo-infinite/match-count.ts +4 -4
- package/src/types/import-meta.d.ts +5 -0
- package/tests/types/import-meta.d.ts +5 -0
- package/tsconfig.app.json +1 -6
- package/tsconfig.json +9 -10
|
@@ -19,11 +19,14 @@ var localStorageTokenPersister = {
|
|
|
19
19
|
};
|
|
20
20
|
|
|
21
21
|
// src/core/token-persisters/node-fs-token-persister.ts
|
|
22
|
+
function escapeTokenNameForFilesystem(tokenName) {
|
|
23
|
+
return tokenName.replace(/[^a-zA-Z0-9-_]/g, "_");
|
|
24
|
+
}
|
|
22
25
|
var nodeFsTokenPersister = {
|
|
23
26
|
load: async (tokenName) => {
|
|
24
|
-
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(
|
|
27
|
+
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(undefined, "./tokens");
|
|
25
28
|
try {
|
|
26
|
-
const json = await (await import('fs/promises')).readFile(`${tokenDir}/${tokenName}`, {
|
|
29
|
+
const json = await (await import('fs/promises')).readFile(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`, {
|
|
27
30
|
encoding: "utf-8"
|
|
28
31
|
});
|
|
29
32
|
return JSON.parse(json);
|
|
@@ -36,13 +39,16 @@ var nodeFsTokenPersister = {
|
|
|
36
39
|
}
|
|
37
40
|
},
|
|
38
41
|
save: async (tokenName, token) => {
|
|
39
|
-
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(
|
|
42
|
+
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(undefined, "./tokens");
|
|
40
43
|
await (await import('fs/promises')).mkdir(tokenDir, { recursive: true });
|
|
41
|
-
await (await import('fs/promises')).writeFile(
|
|
44
|
+
await (await import('fs/promises')).writeFile(
|
|
45
|
+
`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`,
|
|
46
|
+
JSON.stringify(token)
|
|
47
|
+
);
|
|
42
48
|
},
|
|
43
49
|
clear: async (tokenName) => {
|
|
44
|
-
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(
|
|
45
|
-
await (await import('fs/promises')).unlink(`${tokenDir}/${tokenName}`);
|
|
50
|
+
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(undefined, "./tokens");
|
|
51
|
+
await (await import('fs/promises')).unlink(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`);
|
|
46
52
|
}
|
|
47
53
|
};
|
|
48
54
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/token-persisters/local-storage-token-persister.ts","../../../src/core/token-persisters/node-fs-token-persister.ts","../../../src/core/token-persisters/in-memory-token-persister.ts"],"names":[],"mappings":";;;AAEO,IAAM,0BAAA,GAA6C;AAAA,EACxD,IAAA,EAAM,CAAC,SAAA,KAAc;AACnB,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAC3C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EACA,IAAA,EAAM,CAAC,SAAA,EAAW,KAAA,KAAU;AAC1B,IAAA,YAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACvD,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,SAAA,KAAc;AACpB,IAAA,YAAA,CAAa,WAAW,SAAS,CAAA;AAAA,EACnC;AACF;;;
|
|
1
|
+
{"version":3,"sources":["../../../src/core/token-persisters/local-storage-token-persister.ts","../../../src/core/token-persisters/node-fs-token-persister.ts","../../../src/core/token-persisters/in-memory-token-persister.ts"],"names":[],"mappings":"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","file":"index.cjs","sourcesContent":["import { TokenPersister } from \".\";\n\nexport const localStorageTokenPersister: TokenPersister = {\n load: (tokenName) => {\n const json = localStorage.getItem(tokenName);\n if (json) {\n return JSON.parse(json);\n } else {\n return null;\n }\n },\n save: (tokenName, token) => {\n localStorage.setItem(tokenName, JSON.stringify(token));\n },\n clear: (tokenName) => {\n localStorage.removeItem(tokenName);\n },\n};\n","import type { TokenPersister } from \".\";\n\nfunction escapeTokenNameForFilesystem(tokenName: string): string {\n return tokenName.replace(/[^a-zA-Z0-9-_]/g, \"_\");\n}\n\nexport const nodeFsTokenPersister: TokenPersister = {\n load: async (tokenName) => {\n const tokenDir =\n process.env.TOKEN_ROOT ||\n (await import(\"path\")).join(import.meta.dirname, \"./tokens\");\n try {\n const json = await (\n await import(\"fs/promises\")\n ).readFile(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`, {\n encoding: \"utf-8\",\n });\n return JSON.parse(json);\n } catch (e) {\n if (e && typeof e === \"object\" && \"code\" in e && e.code === \"ENOENT\") {\n return null;\n } else {\n throw e;\n }\n }\n },\n save: async (tokenName, token) => {\n const tokenDir =\n process.env.TOKEN_ROOT ||\n (await import(\"path\")).join(import.meta.dirname, \"./tokens\");\n await (await import(\"fs/promises\")).mkdir(tokenDir, { recursive: true });\n await (\n await import(\"fs/promises\")\n ).writeFile(\n `${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`,\n JSON.stringify(token)\n );\n },\n clear: async (tokenName) => {\n const tokenDir =\n process.env.TOKEN_ROOT ||\n (await import(\"path\")).join(import.meta.dirname, \"./tokens\");\n await (\n await import(\"fs/promises\")\n ).unlink(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`);\n },\n};\n","import { TokenPersister } from \".\";\n\nconst tokens = new Map<string, any>();\n\nexport const inMemoryTokenPersister: TokenPersister = {\n load: (tokenName) => {\n return tokens.get(tokenName);\n },\n save: (tokenName, token) => {\n tokens.set(tokenName, token);\n },\n clear: (tokenName) => {\n tokens.delete(tokenName);\n },\n};\n"]}
|
|
@@ -17,11 +17,14 @@ var localStorageTokenPersister = {
|
|
|
17
17
|
};
|
|
18
18
|
|
|
19
19
|
// src/core/token-persisters/node-fs-token-persister.ts
|
|
20
|
+
function escapeTokenNameForFilesystem(tokenName) {
|
|
21
|
+
return tokenName.replace(/[^a-zA-Z0-9-_]/g, "_");
|
|
22
|
+
}
|
|
20
23
|
var nodeFsTokenPersister = {
|
|
21
24
|
load: async (tokenName) => {
|
|
22
|
-
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(
|
|
25
|
+
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(import.meta.dirname, "./tokens");
|
|
23
26
|
try {
|
|
24
|
-
const json = await (await import('fs/promises')).readFile(`${tokenDir}/${tokenName}`, {
|
|
27
|
+
const json = await (await import('fs/promises')).readFile(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`, {
|
|
25
28
|
encoding: "utf-8"
|
|
26
29
|
});
|
|
27
30
|
return JSON.parse(json);
|
|
@@ -34,13 +37,16 @@ var nodeFsTokenPersister = {
|
|
|
34
37
|
}
|
|
35
38
|
},
|
|
36
39
|
save: async (tokenName, token) => {
|
|
37
|
-
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(
|
|
40
|
+
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(import.meta.dirname, "./tokens");
|
|
38
41
|
await (await import('fs/promises')).mkdir(tokenDir, { recursive: true });
|
|
39
|
-
await (await import('fs/promises')).writeFile(
|
|
42
|
+
await (await import('fs/promises')).writeFile(
|
|
43
|
+
`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`,
|
|
44
|
+
JSON.stringify(token)
|
|
45
|
+
);
|
|
40
46
|
},
|
|
41
47
|
clear: async (tokenName) => {
|
|
42
|
-
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(
|
|
43
|
-
await (await import('fs/promises')).unlink(`${tokenDir}/${tokenName}`);
|
|
48
|
+
const tokenDir = process.env.TOKEN_ROOT || (await import('path')).join(import.meta.dirname, "./tokens");
|
|
49
|
+
await (await import('fs/promises')).unlink(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`);
|
|
44
50
|
}
|
|
45
51
|
};
|
|
46
52
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../src/core/token-persisters/local-storage-token-persister.ts","../../../src/core/token-persisters/node-fs-token-persister.ts","../../../src/core/token-persisters/in-memory-token-persister.ts"],"names":[],"mappings":";AAEO,IAAM,0BAAA,GAA6C;AAAA,EACxD,IAAA,EAAM,CAAC,SAAA,KAAc;AACnB,IAAA,MAAM,IAAA,GAAO,YAAA,CAAa,OAAA,CAAQ,SAAS,CAAA;AAC3C,IAAA,IAAI,IAAA,EAAM;AACR,MAAA,OAAO,IAAA,CAAK,MAAM,IAAI,CAAA;AAAA,IACxB,CAAA,MAAO;AACL,MAAA,OAAO,IAAA;AAAA,IACT;AAAA,EACF,CAAA;AAAA,EACA,IAAA,EAAM,CAAC,SAAA,EAAW,KAAA,KAAU;AAC1B,IAAA,YAAA,CAAa,OAAA,CAAQ,SAAA,EAAW,IAAA,CAAK,SAAA,CAAU,KAAK,CAAC,CAAA;AAAA,EACvD,CAAA;AAAA,EACA,KAAA,EAAO,CAAC,SAAA,KAAc;AACpB,IAAA,YAAA,CAAa,WAAW,SAAS,CAAA;AAAA,EACnC;AACF;;;
|
|
1
|
+
{"version":3,"sources":["../../../src/core/token-persisters/local-storage-token-persister.ts","../../../src/core/token-persisters/node-fs-token-persister.ts","../../../src/core/token-persisters/in-memory-token-persister.ts"],"names":[],"mappings":"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","file":"index.js","sourcesContent":["import { TokenPersister } from \".\";\n\nexport const localStorageTokenPersister: TokenPersister = {\n load: (tokenName) => {\n const json = localStorage.getItem(tokenName);\n if (json) {\n return JSON.parse(json);\n } else {\n return null;\n }\n },\n save: (tokenName, token) => {\n localStorage.setItem(tokenName, JSON.stringify(token));\n },\n clear: (tokenName) => {\n localStorage.removeItem(tokenName);\n },\n};\n","import type { TokenPersister } from \".\";\n\nfunction escapeTokenNameForFilesystem(tokenName: string): string {\n return tokenName.replace(/[^a-zA-Z0-9-_]/g, \"_\");\n}\n\nexport const nodeFsTokenPersister: TokenPersister = {\n load: async (tokenName) => {\n const tokenDir =\n process.env.TOKEN_ROOT ||\n (await import(\"path\")).join(import.meta.dirname, \"./tokens\");\n try {\n const json = await (\n await import(\"fs/promises\")\n ).readFile(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`, {\n encoding: \"utf-8\",\n });\n return JSON.parse(json);\n } catch (e) {\n if (e && typeof e === \"object\" && \"code\" in e && e.code === \"ENOENT\") {\n return null;\n } else {\n throw e;\n }\n }\n },\n save: async (tokenName, token) => {\n const tokenDir =\n process.env.TOKEN_ROOT ||\n (await import(\"path\")).join(import.meta.dirname, \"./tokens\");\n await (await import(\"fs/promises\")).mkdir(tokenDir, { recursive: true });\n await (\n await import(\"fs/promises\")\n ).writeFile(\n `${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`,\n JSON.stringify(token)\n );\n },\n clear: async (tokenName) => {\n const tokenDir =\n process.env.TOKEN_ROOT ||\n (await import(\"path\")).join(import.meta.dirname, \"./tokens\");\n await (\n await import(\"fs/promises\")\n ).unlink(`${tokenDir}/${escapeTokenNameForFilesystem(tokenName)}`);\n },\n};\n","import { TokenPersister } from \".\";\n\nconst tokens = new Map<string, any>();\n\nexport const inMemoryTokenPersister: TokenPersister = {\n load: (tokenName) => {\n return tokens.get(tokenName);\n },\n save: (tokenName, token) => {\n tokens.set(tokenName, token);\n },\n clear: (tokenName) => {\n tokens.delete(tokenName);\n },\n};\n"]}
|
package/dist/index.cjs
CHANGED
|
@@ -155,7 +155,7 @@ var HaloCoreEndpoints = {
|
|
|
155
155
|
GameCmsOrigin: "gamecms-hacs",
|
|
156
156
|
/** Discovery origin */
|
|
157
157
|
DiscoveryOrigin: "discovery-infiniteugc",
|
|
158
|
-
CommsOrigin: "
|
|
158
|
+
CommsOrigin: "comms",
|
|
159
159
|
BanProcessorOrigin: "banprocessor",
|
|
160
160
|
SettingsOrigin: "settings",
|
|
161
161
|
/** Service domain */
|
|
@@ -744,6 +744,15 @@ var HaloInfiniteClient = class {
|
|
|
744
744
|
method: "get"
|
|
745
745
|
}
|
|
746
746
|
);
|
|
747
|
+
getBanMessage(banPath, init) {
|
|
748
|
+
return this.executeJsonRequest(
|
|
749
|
+
`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/banning/file/${banPath}`,
|
|
750
|
+
{
|
|
751
|
+
...init,
|
|
752
|
+
method: "get"
|
|
753
|
+
}
|
|
754
|
+
);
|
|
755
|
+
}
|
|
747
756
|
getSeasonCalendar = (init) => this.executeJsonRequest(
|
|
748
757
|
`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/progression/file/calendars/seasons/seasoncalendar.json`,
|
|
749
758
|
{
|
|
@@ -925,6 +934,16 @@ var XboxClient = class {
|
|
|
925
934
|
}
|
|
926
935
|
};
|
|
927
936
|
|
|
937
|
+
// src/models/halo-infinite/ban-summary.ts
|
|
938
|
+
var BanType = /* @__PURE__ */ ((BanType2) => {
|
|
939
|
+
BanType2[BanType2["Matchmaking"] = 1] = "Matchmaking";
|
|
940
|
+
return BanType2;
|
|
941
|
+
})(BanType || {});
|
|
942
|
+
var BanScope = /* @__PURE__ */ ((BanScope2) => {
|
|
943
|
+
BanScope2[BanScope2["Global"] = 1] = "Global";
|
|
944
|
+
return BanScope2;
|
|
945
|
+
})(BanScope || {});
|
|
946
|
+
|
|
928
947
|
// src/models/halo-infinite/game-variant-category.ts
|
|
929
948
|
var GameVariantCategory = /* @__PURE__ */ ((GameVariantCategory2) => {
|
|
930
949
|
GameVariantCategory2[GameVariantCategory2["MultiplayerSlayer"] = 6] = "MultiplayerSlayer";
|
|
@@ -983,6 +1002,8 @@ var ProgressionFileType = /* @__PURE__ */ ((ProgressionFileType2) => {
|
|
|
983
1002
|
exports.AssetKind = AssetKind;
|
|
984
1003
|
exports.AutoTokenProvider = AutoTokenProvider;
|
|
985
1004
|
exports.AutoXstsSpartanTokenProvider = AutoTokenProvider;
|
|
1005
|
+
exports.BanScope = BanScope;
|
|
1006
|
+
exports.BanType = BanType;
|
|
986
1007
|
exports.GameVariantCategory = GameVariantCategory;
|
|
987
1008
|
exports.HaloAuthenticationClient = HaloAuthenticationClient;
|
|
988
1009
|
exports.HaloInfiniteClient = HaloInfiniteClient;
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/util/resolvable-promise.ts","../src/util/date-time.ts","../src/util/expiry-token-cache.ts","../src/util/fetch-function.ts","../src/util/global-contants.ts","../src/util/request-error.ts","../src/core/request-policy.ts","../src/endpoints/halo-core-endpoints.ts","../src/authentication/halo-authentication-client.ts","../src/util/keyed-expiry-token-cache.ts","../src/authentication/xbox-authentication-client.ts","../src/models/halo-infinite/asset-kind.ts","../src/models/halo-infinite/match-type.ts","../src/util/xuid.ts","../src/core/halo-infinite-client.ts","../src/core/token-persisters/in-memory-token-persister.ts","../src/core/token-providers/auto-token-provider.ts","../src/core/token-providers/static-xsts-ticket-token-spartan-token-provider.ts","../src/core/xbox-client.ts","../src/models/halo-infinite/game-variant-category.ts","../src/models/halo-infinite/match-outcome.ts","../src/models/halo-infinite/matches-privacy.ts","../src/models/halo-infinite/playlist-experience.ts","../src/models/halo-infinite/progression-file.ts"],"names":["DateTime","newToken","retry","handleType","RelyingParty","AssetKind","MatchType","GameVariantCategory","MatchOutcome","Privacy","PlaylistExperience","ProgressionFileType"],"mappings":"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","file":"index.cjs","sourcesContent":["export class ResolvablePromise<TReturn> extends Promise<TReturn> {\n isCompleted = false;\n readonly resolve: (value: TReturn | PromiseLike<TReturn>) => void;\n readonly reject: (reason?: unknown) => void;\n constructor() {\n let resolve!: (value: TReturn | PromiseLike<TReturn>) => void;\n let reject!: (reason?: unknown) => void;\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n this.resolve = (v) => {\n this.isCompleted = true;\n return resolve(v);\n };\n this.reject = (r) => {\n this.isCompleted = true;\n return reject(r);\n };\n }\n\n // you can also use Symbol.species in order to\n // return a Promise for then/catch/finally\n static get [Symbol.species]() {\n return Promise;\n }\n\n // Promise overrides his Symbol.toStringTag\n get [Symbol.toStringTag]() {\n return \"ResolvablePromise\";\n }\n}\n","import { DateTime } from \"luxon\";\n\nexport function coalesceDateTime(maybeDateTime: unknown) {\n if (DateTime.isDateTime(maybeDateTime)) {\n return maybeDateTime;\n } else if (maybeDateTime instanceof Date) {\n return DateTime.fromJSDate(maybeDateTime);\n } else if (typeof maybeDateTime === \"string\") {\n return DateTime.fromISO(maybeDateTime);\n }\n return undefined;\n}\n","import { DateTime } from \"luxon\";\nimport { ResolvablePromise } from \"./resolvable-promise\";\nimport { coalesceDateTime } from \"./date-time\";\n\nexport class ExpiryTokenCache<\n TToken extends { expiresAt: DateTime },\n TArgs extends any[]\n> {\n private tokenFetchPromise: ResolvablePromise<TToken> | undefined = undefined;\n\n constructor(\n private readonly generateNewToken: (...args: TArgs) => Promise<TToken>,\n private readonly existingTokenFetcher: () => Promise<\n (Omit<TToken, \"expiresAt\"> & { expiresAt: unknown }) | null\n >\n ) {}\n\n // TODO: Compare args and separate cache entries based on input\n async getToken(...args: TArgs): Promise<TToken> {\n if (this.tokenFetchPromise) {\n // Someone either already has a token or is in the process of getting one\n // Wait for them to finish, then check for validity\n const currentToken = await this.tokenFetchPromise;\n\n if (currentToken.expiresAt > DateTime.now().minus({ minute: 1 })) {\n // Current token is valid, return it\n return currentToken;\n } else {\n // Current token expired, start a new promise\n const newPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromise = newPromise;\n\n try {\n const newToken = await this.generateNewToken(...args);\n newPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n newPromise.reject(e);\n if (this.tokenFetchPromise === newPromise) {\n this.tokenFetchPromise = undefined;\n }\n throw e;\n }\n }\n } else {\n // No one has a token, start a new promise\n const newPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromise = newPromise;\n\n try {\n const existingToken = await this.getExistingToken();\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now()) {\n const newToken = { ...existingToken, expiresAt } as TToken;\n newPromise.resolve(newToken);\n return newToken;\n }\n }\n\n const newToken = await this.generateNewToken(...args);\n newPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n newPromise.reject(e);\n if (this.tokenFetchPromise === newPromise) {\n this.tokenFetchPromise = undefined;\n }\n throw e;\n }\n }\n }\n\n async getExistingToken() {\n const existingToken = await this.existingTokenFetcher();\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now()) {\n return { ...existingToken, expiresAt } as TToken;\n }\n }\n\n return null;\n }\n\n clearToken() {\n this.tokenFetchPromise = undefined;\n }\n}\n","export type FetchFunction = (\n input: RequestInfo | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport const defaultFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n): Promise<Response> => fetch(input, init);\n","export const GlobalConstants = {\n HALO_WAYPOINT_USER_AGENT:\n \"HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0\",\n HALO_PC_USER_AGENT: \"SHIVA-2043073184/6.10021.18539.0 (release; PC)\",\n DEFAULT_AUTH_SCOPES: [\"Xboxlive.signin\", \"Xboxlive.offline_access\"],\n};\n","export class RequestError extends Error {\n public readonly url: string;\n constructor(\n public readonly request: RequestInfo | URL,\n public readonly response: Response\n ) {\n super(\n `${response.status} from ${\n typeof request === \"object\" && \"url\" in request\n ? request.url\n : typeof request === \"string\"\n ? request\n : request.href\n }`\n );\n this.url =\n typeof request === \"object\" && \"url\" in request\n ? request.url\n : typeof request === \"string\"\n ? request\n : request.href;\n this.name = \"RequestError\";\n }\n}\n","import { handleType, retry } from \"cockatiel\";\nimport { RequestError } from \"../util/request-error\";\n\nexport const unauthorizedRetryPolicy = retry(\n handleType(RequestError, (error) => error.response.status === 401),\n { maxAttempts: 2 }\n);\n","export const HaloCoreEndpoints = {\n /** Skill origin */\n SkillOrigin: \"skill\",\n /** Profile origin */\n Profile: \"profile\",\n /** Stats origin */\n StatsOrigin: \"halostats\",\n /** Game CMS origin */\n GameCmsOrigin: \"gamecms-hacs\",\n /** Discovery origin */\n DiscoveryOrigin: \"discovery-infiniteugc\",\n\n CommsOrigin: \"wpcomms\",\n BanProcessorOrigin: \"banprocessor\",\n SettingsOrigin: \"settings\",\n\n /** Service domain */\n ServiceDomain: \"svc.halowaypoint.com:443\",\n};\n","import { DateTime } from \"luxon\";\nimport type { SpartanToken } from \"../models/spartan-token\";\nimport type { SpartanTokenRequest } from \"../models/spartan-token-request\";\nimport { ExpiryTokenCache } from \"../util/expiry-token-cache\";\nimport { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { GlobalConstants } from \"../util/global-contants\";\nimport { RequestError } from \"../util/request-error\";\nimport { unauthorizedRetryPolicy } from \"../core/request-policy\";\nimport { HaloCoreEndpoints } from \"../endpoints/halo-core-endpoints\";\nimport { SpartanTokenProvider } from \"..\";\n\nexport interface Token {\n token: string;\n expiresAt: DateTime;\n}\n\nexport class HaloAuthenticationClient implements SpartanTokenProvider {\n private spartanTokenCache = new ExpiryTokenCache(\n async () => {\n const failureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n await this.xsts.clearXstsToken();\n }\n }\n );\n try {\n return await unauthorizedRetryPolicy.execute(async () => {\n const xstsToken = await this.xsts.fetchToken();\n\n const tokenRequest: SpartanTokenRequest = {\n Audience: \"urn:343:s3:services\",\n MinVersion: \"4\",\n Proof: [\n {\n Token: xstsToken,\n TokenType: \"Xbox_XSTSv3\",\n },\n ],\n };\n const url = `https://${HaloCoreEndpoints.SettingsOrigin}.${HaloCoreEndpoints.ServiceDomain}/spartan-token`;\n const response = await this.fetchFn(url, {\n method: \"POST\",\n body: JSON.stringify(tokenRequest),\n headers: {\n \"User-Agent\": GlobalConstants.HALO_WAYPOINT_USER_AGENT,\n \"Content-Type\": \"application/json; charset=utf-8\",\n Accept: \"application/json, text/plain, */*\",\n },\n });\n if (response.status >= 200 && response.status < 300) {\n const result_2 = (await response.json()) as SpartanToken;\n\n const newToken = {\n token: result_2.SpartanToken,\n expiresAt: DateTime.fromISO(result_2.ExpiresUtc.ISO8601Date),\n };\n await this.tokenStore.saveToken(newToken);\n return newToken;\n } else {\n throw new RequestError(url, response);\n }\n });\n } finally {\n failureHandler.dispose();\n }\n },\n () => this.tokenStore.loadToken()\n );\n\n constructor(\n private readonly xsts: {\n fetchToken: () => Promise<string> | string;\n clearXstsToken: () => Promise<void>;\n },\n private readonly tokenStore: {\n loadToken: () => Promise<{\n token: string;\n expiresAt: unknown;\n } | null>;\n saveToken: (token: Token) => Promise<void>;\n clearToken: () => Promise<void>;\n },\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n public async getSpartanToken() {\n const { token } = await this.spartanTokenCache.getToken();\n return token;\n }\n\n public async clearSpartanToken() {\n // Clear from memory\n this.spartanTokenCache.clearToken();\n // Clear from storage\n await this.tokenStore.clearToken();\n }\n\n public async getCurrentExpiration(): Promise<DateTime | null> {\n const currentToken = await this.spartanTokenCache.getExistingToken();\n return currentToken ? currentToken.expiresAt : null;\n }\n}\n","import { DateTime } from \"luxon\";\nimport { ResolvablePromise } from \"./resolvable-promise\";\nimport { coalesceDateTime } from \"./date-time\";\n\nexport class KeyedExpiryTokenCache<\n TToken extends { expiresAt: DateTime },\n TKey extends string,\n TArgs extends any[]\n> {\n private readonly tokenFetchPromiseMap = new Map<\n TKey,\n ResolvablePromise<TToken>\n >();\n\n constructor(\n private readonly generateNewToken: (\n key: TKey,\n ...args: TArgs\n ) => Promise<TToken>,\n private readonly existingTokenFetcher: (\n key: TKey\n ) => Promise<(Omit<TToken, \"expiresAt\"> & { expiresAt: unknown }) | null>\n ) {}\n\n async getToken(key: TKey, ...args: TArgs): Promise<TToken> {\n let tokenFetchPromise = this.tokenFetchPromiseMap.get(key);\n if (tokenFetchPromise) {\n // Someone either already has a token or is in the process of getting one\n // Wait for them to finish, then check for validity\n const currentToken = await tokenFetchPromise;\n\n if (currentToken.expiresAt > DateTime.now()) {\n // Current token is valid, return it\n return currentToken;\n } else {\n // Current token expired, start a new promise\n tokenFetchPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromiseMap.set(key, tokenFetchPromise);\n\n try {\n const newToken = await this.generateNewToken(key, ...args);\n tokenFetchPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n tokenFetchPromise.reject(e);\n tokenFetchPromise = undefined;\n throw e;\n }\n }\n } else {\n // No one has a token, start a new promise\n tokenFetchPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromiseMap.set(key, tokenFetchPromise);\n\n try {\n const existingToken = await this.getExistingToken(key);\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now().minus({ minute: 1 })) {\n const newToken = { ...existingToken, expiresAt } as TToken;\n tokenFetchPromise.resolve(newToken);\n return newToken;\n }\n }\n\n const newToken = await this.generateNewToken(key, ...args);\n tokenFetchPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n tokenFetchPromise.reject(e);\n tokenFetchPromise = undefined;\n throw e;\n }\n }\n }\n\n async getExistingToken(key: TKey) {\n const existingToken = await this.existingTokenFetcher(key);\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now()) {\n return { ...existingToken, expiresAt } as TToken;\n }\n }\n\n return null;\n }\n\n clearToken(key: TKey) {\n this.tokenFetchPromiseMap.delete(key);\n }\n}\n","import { DateTime } from \"luxon\";\nimport { TokenPersister } from \"../core/token-persisters\";\nimport { XboxTicket } from \"../models/xbox-ticket\";\nimport { KeyedExpiryTokenCache } from \"../util/keyed-expiry-token-cache\";\nimport { ExpiryTokenCache } from \"../util/expiry-token-cache\";\nimport { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { RequestError } from \"../util/request-error\";\nimport { unauthorizedRetryPolicy } from \"../core/request-policy\";\n\nexport enum RelyingParty {\n Xbox = \"http://xboxlive.com\",\n Halo = \"https://prod.xsts.halowaypoint.com/\",\n}\n\nexport interface XboxAuthenticationToken {\n token: string;\n expiresAt: DateTime;\n refreshToken: string;\n}\n\nexport class XboxAuthenticationClient {\n static readonly userTokenName = \"xbox.userToken\";\n static readonly xstsTicketName = (relyingParty: RelyingParty) =>\n `xbox.xstsTicket.${relyingParty}`;\n\n private userTokenCache = new ExpiryTokenCache(\n async (accessToken: string) => {\n const url = \"https://user.auth.xboxlive.com/user/authenticate\";\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-xbl-contract-version\": \"1\",\n },\n body: JSON.stringify({\n RelyingParty: \"http://auth.xboxlive.com\",\n TokenType: \"JWT\",\n Properties: {\n AuthMethod: \"RPS\",\n SiteName: \"user.auth.xboxlive.com\",\n RpsTicket: `d=${accessToken}`,\n },\n }),\n });\n\n if (response.status >= 200 && response.status < 300) {\n const result = (await response.json()) as XboxTicket;\n\n const token = {\n ...result,\n expiresAt: DateTime.fromISO(result.NotAfter),\n };\n await (\n await this.tokenPersisterOrPromise\n )?.save(\"xbox.userToken\", token);\n return token;\n } else {\n throw new RequestError(url, response);\n }\n },\n async () => {\n const tokenPersister = await this.tokenPersisterOrPromise;\n return (\n (await tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(\n XboxAuthenticationClient.userTokenName\n )) ?? null\n );\n }\n );\n private xstsTicketCache = new KeyedExpiryTokenCache(\n async (relyingParty: RelyingParty, userToken: string) => {\n const url = \"https://xsts.auth.xboxlive.com/xsts/authorize\";\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-xbl-contract-version\": \"1\",\n },\n body: JSON.stringify({\n RelyingParty: relyingParty,\n TokenType: \"JWT\",\n Properties: {\n SandboxId: \"RETAIL\",\n UserTokens: [userToken],\n },\n }),\n });\n\n if (response.status >= 200 && response.status < 300) {\n const result = (await response.json()) as XboxTicket;\n\n const token = {\n ...result,\n expiresAt: DateTime.fromISO(result.NotAfter),\n };\n await (\n await this.tokenPersisterOrPromise\n )?.save(XboxAuthenticationClient.xstsTicketName(relyingParty), token);\n return token;\n } else {\n throw new RequestError(url, response);\n }\n },\n async (relyingParty) =>\n (await (\n await this.tokenPersisterOrPromise\n )?.load<XboxTicket & { expiresAt: unknown }>(\n \"xbox.xstsTicket.\" + relyingParty\n )) ?? null\n );\n\n constructor(\n private readonly getOauth2AccessToken: () => Promise<string>,\n private readonly tokenPersisterOrPromise?:\n | TokenPersister\n | Promise<TokenPersister>,\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n public async getXstsTicket(relyingParty: RelyingParty) {\n let xstsTicket = await this.xstsTicketCache.getExistingToken(relyingParty);\n if (!xstsTicket) {\n let userToken = await this.userTokenCache.getExistingToken();\n const xstsTicketFailureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n // Clear from memory\n this.userTokenCache.clearToken();\n // Clear from storage\n await (await this.tokenPersisterOrPromise)?.clear(\"xbox.userToken\");\n userToken = null;\n }\n }\n );\n xstsTicket = await unauthorizedRetryPolicy\n .execute(async () => {\n if (!userToken) {\n // Ouath2 token depends on nothing, so we can fetch it without\n // worrying if it is expired.\n const oauthToken = await this.getOauth2AccessToken();\n userToken = await this.userTokenCache.getToken(oauthToken);\n }\n return this.xstsTicketCache.getToken(relyingParty, userToken.Token);\n })\n .finally(() => xstsTicketFailureHandler.dispose());\n }\n return xstsTicket;\n }\n\n public clearXstsTicket = async (relyingParty: RelyingParty) => {\n // Clear from memory\n this.xstsTicketCache.clearToken(relyingParty);\n // Clear from storage\n (await this.tokenPersisterOrPromise)?.clear(\n \"xbox.xstsTicket.\" + relyingParty\n );\n };\n\n public getXboxLiveV3Token = (xboxTicket: XboxTicket) =>\n `XBL3.0 x=${xboxTicket.DisplayClaims.xui[0].uhs};${xboxTicket.Token}`;\n\n public clearXboxUserToken = async () => {\n // Clear from memory\n this.userTokenCache.clearToken();\n // Clear from storage\n (await this.tokenPersisterOrPromise)?.clear(\"xbox.userToken\");\n };\n}\n","export enum AssetKind {\n Film,\n Map,\n Playlist,\n Prefab,\n TestAsset,\n UgcGameVariant,\n MapModePair,\n Project,\n Manifest,\n EngineGameVariant,\n}\n","export enum MatchType {\n All = 0,\n Matchmaking = 1,\n Custom = 2,\n Local = 3,\n}\n","export function wrapPlayerId(playerId: string) {\n if (/^\\w+\\(\\d+\\)/.test(playerId)) {\n return playerId;\n } else {\n // Assume xuid\n return `xuid(${playerId})`;\n }\n}\n\nexport function unwrapPlayerId(playerId: string) {\n const match = /^\\w+\\((\\d+)\\)$/.exec(playerId);\n if (match) {\n return match[1];\n } else {\n return playerId;\n }\n}\n","import { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { HaloCoreEndpoints } from \"../endpoints/halo-core-endpoints\";\nimport {\n MapAsset,\n MapModePairAsset,\n PlaylistAsset,\n UgcGameVariantAsset,\n} from \"../models/halo-infinite/asset\";\nimport { AssetKind } from \"../models/halo-infinite/asset-kind\";\nimport { MatchSkill } from \"../models/halo-infinite/match-skill\";\nimport { MatchStats } from \"../models/halo-infinite/match-stats\";\nimport { MatchType } from \"../models/halo-infinite/match-type\";\nimport { PlayerMatchHistory } from \"../models/halo-infinite/player-match-history\";\nimport { Playlist } from \"../models/halo-infinite/playlist\";\nimport { PlaylistCsrContainer } from \"../models/halo-infinite/playlist-csr-container\";\nimport { ServiceRecord } from \"../models/halo-infinite/service-record\";\nimport { UserInfo } from \"../models/halo-infinite/user-info\";\nimport { GlobalConstants } from \"../util/global-contants\";\nimport { SpartanTokenProvider } from \"./token-providers/spartan-token-provider\";\nimport { RequestError } from \"../util/request-error\";\nimport { MatchesPrivacy } from \"../models/halo-infinite/matches-privacy\";\nimport { MedalsMetadataFile } from \"../models/halo-infinite/medals-metadata-file\";\nimport {\n ProgressionFileType,\n ProgressionFileTypeMap,\n} from \"../models/halo-infinite/progression-file\";\nimport { unauthorizedRetryPolicy } from \"./request-policy\";\nimport { BanSummary } from \"../models/halo-infinite/ban-summary\";\nimport { KeyedExpiryTokenCache } from \"../util/keyed-expiry-token-cache\";\nimport { DateTime } from \"luxon\";\nimport { wrapPlayerId, unwrapPlayerId } from \"../util/xuid\";\nimport { SeasonCalendarContainer } from \"../models/halo-infinite/season\";\nimport { Settings } from \"../models/halo-infinite/settings\";\nimport { MatchCount } from \"src/models/halo-infinite/match-count\";\n\nexport interface ResultContainer<TValue> {\n Id: string;\n ResultCode: 0 | 1;\n Result: TValue;\n}\n\nexport interface ResultsContainer<TValue> {\n Value: ResultContainer<TValue>[];\n}\n\ninterface PaginationContainer<TValue> {\n Start: number;\n Count: number;\n ResultCount: number;\n Results: TValue[];\n}\n\nexport type AssetKindTypeMap = {\n [AssetKind.Map]: MapAsset;\n [AssetKind.UgcGameVariant]: UgcGameVariantAsset;\n [AssetKind.Playlist]: PlaylistAsset;\n [AssetKind.MapModePair]: MapModePairAsset;\n};\n\nconst assetKindUrlMap = {\n [AssetKind.Map]: \"Maps\" as const,\n [AssetKind.UgcGameVariant]: \"UgcGameVariants\" as const,\n [AssetKind.Playlist]: \"Playlists\" as const,\n [AssetKind.MapModePair]: \"MapModePairs\" as const,\n} satisfies {\n [key in keyof AssetKindTypeMap]: string;\n};\nexport class HaloInfiniteClient {\n private clearanceMap = new Map<\n string,\n {\n FlightConfigurationId: string;\n expiresAt: DateTime;\n }\n >();\n private clearanceCache = new KeyedExpiryTokenCache(\n async () => {\n const { xuid } = await this.getCurrentUser();\n const response = await this.executeRequest(\n `https://${HaloCoreEndpoints.SettingsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/oban/flight-configurations/titles/hi/audiences/retail/players/${wrapPlayerId(\n xuid\n )}/active`,\n { method: \"get\" },\n false\n );\n const {\n FlightConfigurationId,\n }: {\n FlightConfigurationId: string;\n } = await response.json();\n const expiresHeader = response.headers.get(\"expires\");\n return {\n FlightConfigurationId,\n expiresAt: expiresHeader\n ? DateTime.fromHTTP(expiresHeader)\n : DateTime.now().plus({ seconds: 5 }),\n };\n },\n async (spartanToken) => this.clearanceMap.get(spartanToken) ?? null\n );\n\n constructor(\n private readonly spartanTokenProvider: SpartanTokenProvider,\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n protected async executeRequest(\n url: string,\n init: RequestInit,\n skipAuth: boolean\n ) {\n const failureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n await this.spartanTokenProvider.clearSpartanToken();\n }\n }\n );\n try {\n return await unauthorizedRetryPolicy.execute(async () => {\n const headers = new Headers(init.headers);\n if (!headers.has(\"User-Agent\")) {\n headers.set(\"User-Agent\", GlobalConstants.HALO_PC_USER_AGENT);\n }\n if (!headers.has(\"Accept\")) {\n headers.set(\"Accept\", \"application/json\");\n }\n if (!skipAuth) {\n headers.set(\n \"x-343-authorization-spartan\",\n await this.spartanTokenProvider.getSpartanToken()\n );\n }\n\n const response = await this.fetchFn(url, {\n ...init,\n headers,\n });\n\n if (!response.ok) {\n throw new RequestError(url, response);\n }\n\n return response;\n });\n } finally {\n failureHandler.dispose();\n }\n }\n\n protected async executeJsonRequest<T>(\n url: string,\n init: RequestInit,\n skipAuth?: boolean\n ) {\n const response = await this.executeRequest(url, init, skipAuth ?? false);\n\n if (response.status >= 200 && response.status < 300) {\n return (await response.json()) as T;\n } else {\n throw new RequestError(url, response);\n }\n }\n\n protected async executeResultsRequest<T>(\n ...args: Parameters<HaloInfiniteClient[\"executeJsonRequest\"]>\n ) {\n let resultsContainer: ResultsContainer<T>;\n try {\n resultsContainer = await this.executeJsonRequest<ResultsContainer<T>>(\n ...args\n );\n } catch (e) {\n if (e instanceof RequestError && e.response.status === 404) {\n const contentLength = e.response.headers.get(\"Content-Length\");\n if (contentLength && parseInt(contentLength) > 0) {\n // 404s if even one of the xuids is invalid\n resultsContainer = (await e.response.json()) as ResultsContainer<T>;\n }\n }\n\n throw e;\n }\n return resultsContainer.Value;\n }\n\n protected async executePaginationRequest<T>(\n count: number,\n start: number,\n queryParameters: Record<string, string>,\n ...args: Parameters<HaloInfiniteClient[\"executeJsonRequest\"]>\n ) {\n const [url, ...rest] = args;\n const result = await this.executeJsonRequest<PaginationContainer<T>>(\n `${url}?${new URLSearchParams({\n ...queryParameters,\n count: count.toString(),\n start: start.toString(),\n })}`,\n ...rest\n );\n\n return result.Results;\n }\n\n /** Gets playlist Competitive Skill Rank (CSR) for a player or a set of players.\n * @param playlistId - Unique ID for the playlist.\n * @param playerIds - Array of player xuids.\n */\n public getPlaylistCsr = (\n playlistId: string,\n playerIds: string[],\n seasonId?: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n const urlParams = new URLSearchParams({\n players: playerIds.map(wrapPlayerId).join(\",\"),\n });\n if (seasonId) {\n urlParams.set(\"season\", seasonId);\n }\n return this.executeResultsRequest<PlaylistCsrContainer>(\n `https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/playlist/${playlistId}/csrs?${urlParams}`,\n {\n ...init,\n method: \"get\",\n }\n );\n };\n\n /** Get gamertag info for a player.\n * @param gamerTag - Gamertag to lookup.\n */\n public getUser = (\n gamerTag: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<UserInfo>(\n `https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users/gt(${gamerTag})`,\n\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Get gamertag info for several players.\n * @param xuids - Xuids to lookup.\n */\n public getUsers = (\n xuids: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n return this.executeJsonRequest<UserInfo[]>(\n `https://${HaloCoreEndpoints.Profile}.${\n HaloCoreEndpoints.ServiceDomain\n }/users?xuids=${xuids.map((x) => unwrapPlayerId(x)).join(\",\")}`,\n {\n ...init,\n method: \"get\",\n }\n );\n };\n\n /** Get service record for a player.\n * @param gamerTag - Gamertag to lookup.\n */\n public getUserServiceRecord = (\n gamerTagOrWrappedXuid: string,\n queryParameters?: { seasonId?: string; playlistAssetId?: string },\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<ServiceRecord>(\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${gamerTagOrWrappedXuid}/Matchmade/servicerecord?${new URLSearchParams(\n queryParameters\n ).toString()}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Get playlist information\n * @param playlistId - Unique ID for the playlist.\n */\n public getPlaylist = async (\n playlistId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n const clearanceToken = await this.clearanceCache.getToken(\n await this.spartanTokenProvider.getSpartanToken()\n );\n return this.executeJsonRequest<Playlist>(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/multiplayer/file/playlists/assets/${playlistId}.json`,\n {\n ...init,\n method: \"get\",\n headers: {\n ...init?.headers,\n \"343-clearance\": clearanceToken.FlightConfigurationId,\n },\n }\n );\n };\n\n public getPlayerMatches = (\n playerXuid: string,\n type: MatchType = MatchType.All,\n count: number = 25,\n start: number = 0,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n let params: Record<string, string> = {};\n if (type !== MatchType.All) {\n params.type = type.toString();\n }\n return this.executePaginationRequest<PlayerMatchHistory>(\n count,\n start,\n params,\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${wrapPlayerId(playerXuid)}/matches`,\n {\n ...init,\n method: \"get\",\n }\n );\n };\n\n public getPlayerMatchCount = (\n playerXuid: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<MatchCount>(\n `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${wrapPlayerId(playerXuid)}/matches/count`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMatchStats = (\n matchId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<MatchStats>(\n `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMatchSkill = async (\n matchId: string,\n playerIds: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n await this.executeResultsRequest<MatchSkill>(\n `https://${HaloCoreEndpoints.SkillOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/matches/${matchId}/skill?players=${playerIds\n .map(wrapPlayerId)\n .join(\",\")}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Gets authoring metadata about a specific asset. */\n public getAsset = <TAssetType extends keyof AssetKindTypeMap>(\n assetType: TAssetType,\n assetId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<AssetKindTypeMap[TAssetType]>(\n `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Gets metadata related to a concrete version of a specified asset. */\n public getSpecificAssetVersion = <TAssetType extends keyof AssetKindTypeMap>(\n assetType: TAssetType,\n assetId: string,\n versionId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<AssetKindTypeMap[TAssetType]>(\n `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`,\n {\n ...init,\n headers: {\n Origin: \"https://www.halowaypoint.com\",\n },\n method: \"get\",\n }\n );\n\n // Don't be fooled, the \"profile\" version of this endpoint is worthless\n public getCurrentUser = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<{ xuid: string; notificationsReadDate: string }> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.CommsOrigin}.${HaloCoreEndpoints.ServiceDomain}/users/me`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMatchesPrivacy = (\n playerXuid: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<MatchesPrivacy> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${wrapPlayerId(playerXuid)}/matches-privacy`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public updateMatchesPrivacy = (\n playerXuid: string,\n matchesPrivacy: MatchesPrivacy,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<MatchesPrivacy> => {\n const headers = new Headers(init?.headers);\n headers.set(\"Content-Type\", \"application/json\");\n return this.executeJsonRequest(\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${wrapPlayerId(playerXuid)}/matches-privacy`,\n {\n ...init,\n method: \"put\",\n headers,\n body: JSON.stringify({ matchesPrivacy }),\n }\n );\n };\n\n public getProgressionFile = <TFileType extends ProgressionFileType>(\n filename: `${TFileType}/${string}.json`,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<ProgressionFileTypeMap[TFileType]> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Progression/file/${filename}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMedalsMetadataFile = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<MedalsMetadataFile> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Waypoint/file/medals/metadata.json`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getBanSummary = (\n xuids: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<BanSummary> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.BanProcessorOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/bansummary?targets=${xuids.map(wrapPlayerId).join(\",\")}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getSeasonCalendar = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<SeasonCalendarContainer> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/progression/file/calendars/seasons/seasoncalendar.json`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getSettings = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<Settings> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.SettingsOrigin}.${HaloCoreEndpoints.ServiceDomain}/settings/hipc/e2a0a7c6-6efe-42af-9283-c2ab73250c48`,\n {\n ...init,\n method: \"get\",\n },\n true\n );\n}\n","import { TokenPersister } from \".\";\n\nconst tokens = new Map<string, any>();\n\nexport const inMemoryTokenPersister: TokenPersister = {\n load: (tokenName) => {\n return tokens.get(tokenName);\n },\n save: (tokenName, token) => {\n tokens.set(tokenName, token);\n },\n clear: (tokenName) => {\n tokens.delete(tokenName);\n },\n};\n","import { HaloAuthenticationClient } from \"../../authentication/halo-authentication-client\";\nimport {\n RelyingParty,\n XboxAuthenticationClient,\n} from \"../../authentication/xbox-authentication-client\";\nimport type { FetchFunction } from \"../../util/fetch-function\";\nimport { TokenPersister } from \"../token-persisters\";\nimport { inMemoryTokenPersister } from \"../token-persisters/in-memory-token-persister\";\nimport { SpartanTokenProvider } from \"./spartan-token-provider\";\nimport { XboxTokenProvider } from \"./xbox-token-provider\";\n\n/**\n * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same\n * process. This is useful for applications that do not need to contend with\n * CORS restrictions.\n */\nexport class AutoTokenProvider\n extends HaloAuthenticationClient\n implements SpartanTokenProvider, XboxTokenProvider\n{\n public readonly getXboxLiveV3Token: () => Promise<string>;\n public readonly clearXboxLiveV3Token: () => Promise<void>;\n\n constructor(\n getOauth2AccessToken: () => Promise<string>,\n tokenPersister?: TokenPersister | Promise<TokenPersister>,\n fetchFn?: FetchFunction\n ) {\n super(\n {\n fetchToken: async () => {\n const xstsTicket = await xboxAuthClient.getXstsTicket(\n RelyingParty.Halo\n );\n return xstsTicket.Token;\n },\n clearXstsToken: () => xboxAuthClient.clearXstsTicket(RelyingParty.Halo),\n },\n {\n loadToken: async () =>\n (await (await tokenPeristerOrPromise).load(\"halo.authToken\")) ?? null,\n saveToken: async (token) => {\n await (await tokenPeristerOrPromise).save(\"halo.authToken\", token);\n },\n clearToken: async () => {\n await (await tokenPeristerOrPromise).clear(\"halo.authToken\");\n },\n },\n fetchFn\n );\n let tokenPeristerOrPromise: TokenPersister | Promise<TokenPersister>;\n if (tokenPersister) {\n tokenPeristerOrPromise = tokenPersister;\n } else {\n tokenPeristerOrPromise = inMemoryTokenPersister;\n }\n const xboxAuthClient = new XboxAuthenticationClient(\n getOauth2AccessToken,\n tokenPersister,\n fetchFn\n );\n\n this.getXboxLiveV3Token = async () => {\n const xstsTicket = await xboxAuthClient.getXstsTicket(RelyingParty.Xbox);\n return xboxAuthClient.getXboxLiveV3Token(xstsTicket);\n };\n this.clearXboxLiveV3Token = () =>\n xboxAuthClient.clearXstsTicket(RelyingParty.Xbox);\n }\n}\n","import { HaloAuthenticationClient } from \"../../authentication/halo-authentication-client\";\nimport { TokenPersister } from \"../token-persisters\";\nimport { inMemoryTokenPersister } from \"../token-persisters/in-memory-token-persister\";\nimport { SpartanTokenProvider } from \"./spartan-token-provider\";\n\n/**\n * A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.\n * Since requests to the Halo API are subject to CORS restrictions a\n * HaloAuthenticationClient can be instantitated with a pre-fetched XSTS ticket\n * and run on a server (such as one provided by the user).\n */\nexport class StaticXstsTicketTokenSpartanTokenProvider\n extends HaloAuthenticationClient\n implements SpartanTokenProvider\n{\n constructor(\n xstsTicketToken: string,\n tokenPersister?: TokenPersister | Promise<TokenPersister>\n ) {\n super(\n {\n fetchToken: () => xstsTicketToken,\n clearXstsToken: async () => {\n console.warn(\n \"StaticXstsTicketTokenSpartanTokenProvider does not support clearing xstsTickets\"\n );\n },\n },\n {\n loadToken: async () =>\n (await (await actualTokenPersister).load(\"halo.authToken\")) ?? null,\n saveToken: async (token) => {\n await (await actualTokenPersister).save(\"halo.authToken\", token);\n },\n clearToken: async () => {\n await (await actualTokenPersister).clear(\"halo.authToken\");\n },\n }\n );\n let actualTokenPersister: TokenPersister | Promise<TokenPersister>;\n if (tokenPersister) {\n actualTokenPersister = tokenPersister;\n } else {\n actualTokenPersister = inMemoryTokenPersister;\n }\n }\n}\n","import { RequestError } from \"../util/request-error\";\nimport { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { XboxTokenProvider } from \"./token-providers/xbox-token-provider\";\nimport { unauthorizedRetryPolicy } from \"./request-policy\";\nimport { unwrapPlayerId } from \"../util/xuid\";\n\nexport class XboxClient {\n constructor(\n private readonly xboxTokenProvider: XboxTokenProvider,\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n private async executeRequest<T>(url: string, init: RequestInit): Promise<T> {\n const failureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n await this.xboxTokenProvider.clearXboxLiveV3Token();\n }\n }\n );\n try {\n return await unauthorizedRetryPolicy.execute(async () => {\n const headers = new Headers(init.headers);\n if (!headers.has(\"Accept\")) {\n headers.set(\"Accept\", \"application/json\");\n }\n if (!headers.has(\"Authorization\")) {\n headers.set(\n \"Authorization\",\n await this.xboxTokenProvider.getXboxLiveV3Token()\n );\n }\n if (!headers.has(\"x-xbl-contract-version\")) {\n headers.set(\"x-xbl-contract-version\", \"3\");\n }\n const response = await this.fetchFn(url, {\n ...init,\n headers,\n });\n\n if (response.status >= 200 && response.status < 300) {\n return (await response.json()) as T;\n } else {\n throw new RequestError(url, response);\n }\n });\n } finally {\n failureHandler.dispose();\n }\n }\n\n public async searchUsers(\n query: string,\n maxItems: number = 5,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) {\n const { people } = await this.executeRequest<{\n people: [\n {\n xuid: string;\n gamertag: string;\n displayPicRaw: string;\n }\n ];\n }>(\n `https://peoplehub.xboxlive.com/users/me/people/search?q=${encodeURIComponent(\n query\n )}&maxItems=${maxItems}`,\n { ...init, method: \"GET\" }\n );\n return people;\n }\n\n public async recentPlayers(init?: Omit<RequestInit, \"body\" | \"method\">) {\n return await this.executeRequest<unknown>(\n \"https://peoplehub.xboxlive.com/users/me/people/recentplayers\",\n { ...init, method: \"GET\" }\n );\n }\n\n public async getProfiles(\n xuids: string[],\n settings: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) {\n return await this.executeRequest<{\n profileUsers: {\n id: string;\n settings: { id: string; value: string }[];\n }[];\n }>(\"https://profile.xboxlive.com/users/batch/profile/settings\", {\n ...init,\n headers: {\n ...init?.headers,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify({\n userIds: xuids.map(unwrapPlayerId),\n settings,\n }),\n });\n }\n}\n","export enum GameVariantCategory {\n MultiplayerSlayer = 6,\n MultiplayerAttrition = 7,\n MultiplayerElimination = 8,\n MultiplayerFiesta = 9,\n MultiplayerStrongholds = 11,\n MultiplayerKingOfTheHill = 12,\n MultiplayerTotalControl = 14,\n MultiplayerCtf = 15,\n MultiplayerExtraction = 17,\n MultiplayerOddball = 18,\n MultiplayerStockpile = 19,\n MultiplayerInfection = 22,\n MultiplayerVIP = 23,\n MultiplayerEscalation = 24,\n MultiplayerGrifball = 25,\n MultiplayerLandGrab = 39,\n MultiplayerMinigame = 41,\n MultiplayerFirefight = 42,\n}\n","export enum MatchOutcome {\n Tie = 1,\n Win = 2,\n Loss = 3,\n DidNotFinish = 4,\n}\n","export enum Privacy {\n Show = 1,\n Hide = 2,\n}\n\nexport interface MatchesPrivacy {\n MatchmadeGames: Privacy;\n OtherGames: Privacy;\n}\n","export enum PlaylistExperience {\n Arena = 2,\n Social = 3,\n Featured = 5,\n}\n","import { ApiFormattedDate } from \"./api-formatted-date\";\n\nexport enum ProgressionFileType {\n Seasons = \"Seasons\",\n Calendars = \"Calendars\",\n \"Csr/Seasons\" = \"Csr/Seasons\",\n}\n\nexport type ProgressionFileTypeMap = {\n Calendars: SeasonCalendarProgressionFile;\n Seasons: SeasonProgressionFile;\n [\"Csr/Seasons\"]: CsrSeasonCalendarProgressionFile;\n};\n\nexport interface SeasonCalendarProgressionFile {\n Seasons: {\n CsrSeasonFilePath: `Csr/Seasons/${string}.json`;\n OperationTrackPath: `RewardTracks/Operations/${string}.json`;\n SeasonMetadata: `Seasons/${string}.json`;\n StartDate: ApiFormattedDate;\n EndDate: ApiFormattedDate;\n }[];\n Events: {\n RewardTrackPath: `RewardTracks/Events/Rituals/${string}.json`;\n StartDate: ApiFormattedDate;\n EndDate: ApiFormattedDate;\n }[];\n CareerRank: { RewardTrackPath: `RewardTracks/CareerRanks/${string}.json` };\n}\n\nexport interface CsrSeasonCalendarProgressionFile {\n Seasons: {\n CsrSeasonFilePath: `Csr/Seasons/${string}.json`;\n StartDate: ApiFormattedDate;\n EndDate: ApiFormattedDate;\n }[];\n}\n\nexport interface SeasonProgressionFile {\n DateRange: string;\n Name: string;\n Logo: string;\n Number: number;\n Description: string;\n SummaryBackgroundPath: string;\n BattlePassSeasonUpsellBackgroundImage: string;\n ChallengesBackgroundPath: string;\n BattlePassLogoImage: string;\n SeasonLogoImage: string;\n RitualLogoImage: string;\n StorefrontBackgroundImage: string;\n CardBackgroundImage: string;\n ProgressionBackgroundImage: string;\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/util/resolvable-promise.ts","../src/util/date-time.ts","../src/util/expiry-token-cache.ts","../src/util/fetch-function.ts","../src/util/global-contants.ts","../src/util/request-error.ts","../src/core/request-policy.ts","../src/endpoints/halo-core-endpoints.ts","../src/authentication/halo-authentication-client.ts","../src/util/keyed-expiry-token-cache.ts","../src/authentication/xbox-authentication-client.ts","../src/models/halo-infinite/asset-kind.ts","../src/models/halo-infinite/match-type.ts","../src/util/xuid.ts","../src/core/halo-infinite-client.ts","../src/core/token-persisters/in-memory-token-persister.ts","../src/core/token-providers/auto-token-provider.ts","../src/core/token-providers/static-xsts-ticket-token-spartan-token-provider.ts","../src/core/xbox-client.ts","../src/models/halo-infinite/ban-summary.ts","../src/models/halo-infinite/game-variant-category.ts","../src/models/halo-infinite/match-outcome.ts","../src/models/halo-infinite/matches-privacy.ts","../src/models/halo-infinite/playlist-experience.ts","../src/models/halo-infinite/progression-file.ts"],"names":["DateTime","newToken","retry","handleType","RelyingParty","AssetKind","MatchType","BanType","BanScope","GameVariantCategory","MatchOutcome","Privacy","PlaylistExperience","ProgressionFileType"],"mappings":"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","file":"index.cjs","sourcesContent":["export class ResolvablePromise<TReturn> extends Promise<TReturn> {\n isCompleted = false;\n readonly resolve: (value: TReturn | PromiseLike<TReturn>) => void;\n readonly reject: (reason?: unknown) => void;\n constructor() {\n let resolve!: (value: TReturn | PromiseLike<TReturn>) => void;\n let reject!: (reason?: unknown) => void;\n super((res, rej) => {\n resolve = res;\n reject = rej;\n });\n this.resolve = (v) => {\n this.isCompleted = true;\n return resolve(v);\n };\n this.reject = (r) => {\n this.isCompleted = true;\n return reject(r);\n };\n }\n\n // you can also use Symbol.species in order to\n // return a Promise for then/catch/finally\n static get [Symbol.species]() {\n return Promise;\n }\n\n // Promise overrides his Symbol.toStringTag\n get [Symbol.toStringTag]() {\n return \"ResolvablePromise\";\n }\n}\n","import { DateTime } from \"luxon\";\n\nexport function coalesceDateTime(maybeDateTime: unknown) {\n if (DateTime.isDateTime(maybeDateTime)) {\n return maybeDateTime;\n } else if (maybeDateTime instanceof Date) {\n return DateTime.fromJSDate(maybeDateTime);\n } else if (typeof maybeDateTime === \"string\") {\n return DateTime.fromISO(maybeDateTime);\n }\n return undefined;\n}\n","import { DateTime } from \"luxon\";\nimport { ResolvablePromise } from \"./resolvable-promise\";\nimport { coalesceDateTime } from \"./date-time\";\n\nexport class ExpiryTokenCache<\n TToken extends { expiresAt: DateTime },\n TArgs extends any[]\n> {\n private tokenFetchPromise: ResolvablePromise<TToken> | undefined = undefined;\n\n constructor(\n private readonly generateNewToken: (...args: TArgs) => Promise<TToken>,\n private readonly existingTokenFetcher: () => Promise<\n (Omit<TToken, \"expiresAt\"> & { expiresAt: unknown }) | null\n >\n ) {}\n\n // TODO: Compare args and separate cache entries based on input\n async getToken(...args: TArgs): Promise<TToken> {\n if (this.tokenFetchPromise) {\n // Someone either already has a token or is in the process of getting one\n // Wait for them to finish, then check for validity\n const currentToken = await this.tokenFetchPromise;\n\n if (currentToken.expiresAt > DateTime.now().minus({ minute: 1 })) {\n // Current token is valid, return it\n return currentToken;\n } else {\n // Current token expired, start a new promise\n const newPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromise = newPromise;\n\n try {\n const newToken = await this.generateNewToken(...args);\n newPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n newPromise.reject(e);\n if (this.tokenFetchPromise === newPromise) {\n this.tokenFetchPromise = undefined;\n }\n throw e;\n }\n }\n } else {\n // No one has a token, start a new promise\n const newPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromise = newPromise;\n\n try {\n const existingToken = await this.getExistingToken();\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now()) {\n const newToken = { ...existingToken, expiresAt } as TToken;\n newPromise.resolve(newToken);\n return newToken;\n }\n }\n\n const newToken = await this.generateNewToken(...args);\n newPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n newPromise.reject(e);\n if (this.tokenFetchPromise === newPromise) {\n this.tokenFetchPromise = undefined;\n }\n throw e;\n }\n }\n }\n\n async getExistingToken() {\n const existingToken = await this.existingTokenFetcher();\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now()) {\n return { ...existingToken, expiresAt } as TToken;\n }\n }\n\n return null;\n }\n\n clearToken() {\n this.tokenFetchPromise = undefined;\n }\n}\n","export type FetchFunction = (\n input: RequestInfo | URL,\n init?: RequestInit\n) => Promise<Response>;\n\nexport const defaultFetch = async (\n input: RequestInfo | URL,\n init?: RequestInit\n): Promise<Response> => fetch(input, init);\n","export const GlobalConstants = {\n HALO_WAYPOINT_USER_AGENT:\n \"HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0\",\n HALO_PC_USER_AGENT: \"SHIVA-2043073184/6.10021.18539.0 (release; PC)\",\n DEFAULT_AUTH_SCOPES: [\"Xboxlive.signin\", \"Xboxlive.offline_access\"],\n};\n","export class RequestError extends Error {\n public readonly url: string;\n constructor(\n public readonly request: RequestInfo | URL,\n public readonly response: Response\n ) {\n super(\n `${response.status} from ${\n typeof request === \"object\" && \"url\" in request\n ? request.url\n : typeof request === \"string\"\n ? request\n : request.href\n }`\n );\n this.url =\n typeof request === \"object\" && \"url\" in request\n ? request.url\n : typeof request === \"string\"\n ? request\n : request.href;\n this.name = \"RequestError\";\n }\n}\n","import { handleType, retry } from \"cockatiel\";\nimport { RequestError } from \"../util/request-error\";\n\nexport const unauthorizedRetryPolicy = retry(\n handleType(RequestError, (error) => error.response.status === 401),\n { maxAttempts: 2 }\n);\n","export const HaloCoreEndpoints = {\n /** Skill origin */\n SkillOrigin: \"skill\",\n /** Profile origin */\n Profile: \"profile\",\n /** Stats origin */\n StatsOrigin: \"halostats\",\n /** Game CMS origin */\n GameCmsOrigin: \"gamecms-hacs\",\n /** Discovery origin */\n DiscoveryOrigin: \"discovery-infiniteugc\",\n\n CommsOrigin: \"comms\",\n BanProcessorOrigin: \"banprocessor\",\n SettingsOrigin: \"settings\",\n\n /** Service domain */\n ServiceDomain: \"svc.halowaypoint.com:443\",\n};\n","import { DateTime } from \"luxon\";\nimport type { SpartanToken } from \"../models/spartan-token\";\nimport type { SpartanTokenRequest } from \"../models/spartan-token-request\";\nimport { ExpiryTokenCache } from \"../util/expiry-token-cache\";\nimport { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { GlobalConstants } from \"../util/global-contants\";\nimport { RequestError } from \"../util/request-error\";\nimport { unauthorizedRetryPolicy } from \"../core/request-policy\";\nimport { HaloCoreEndpoints } from \"../endpoints/halo-core-endpoints\";\nimport { SpartanTokenProvider } from \"..\";\n\nexport interface Token {\n token: string;\n expiresAt: DateTime;\n}\n\nexport class HaloAuthenticationClient implements SpartanTokenProvider {\n private spartanTokenCache = new ExpiryTokenCache(\n async () => {\n const failureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n await this.xsts.clearXstsToken();\n }\n }\n );\n try {\n return await unauthorizedRetryPolicy.execute(async () => {\n const xstsToken = await this.xsts.fetchToken();\n\n const tokenRequest: SpartanTokenRequest = {\n Audience: \"urn:343:s3:services\",\n MinVersion: \"4\",\n Proof: [\n {\n Token: xstsToken,\n TokenType: \"Xbox_XSTSv3\",\n },\n ],\n };\n const url = `https://${HaloCoreEndpoints.SettingsOrigin}.${HaloCoreEndpoints.ServiceDomain}/spartan-token`;\n const response = await this.fetchFn(url, {\n method: \"POST\",\n body: JSON.stringify(tokenRequest),\n headers: {\n \"User-Agent\": GlobalConstants.HALO_WAYPOINT_USER_AGENT,\n \"Content-Type\": \"application/json; charset=utf-8\",\n Accept: \"application/json, text/plain, */*\",\n },\n });\n if (response.status >= 200 && response.status < 300) {\n const result_2 = (await response.json()) as SpartanToken;\n\n const newToken = {\n token: result_2.SpartanToken,\n expiresAt: DateTime.fromISO(result_2.ExpiresUtc.ISO8601Date),\n };\n await this.tokenStore.saveToken(newToken);\n return newToken;\n } else {\n throw new RequestError(url, response);\n }\n });\n } finally {\n failureHandler.dispose();\n }\n },\n () => this.tokenStore.loadToken()\n );\n\n constructor(\n private readonly xsts: {\n fetchToken: () => Promise<string> | string;\n clearXstsToken: () => Promise<void>;\n },\n private readonly tokenStore: {\n loadToken: () => Promise<{\n token: string;\n expiresAt: unknown;\n } | null>;\n saveToken: (token: Token) => Promise<void>;\n clearToken: () => Promise<void>;\n },\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n public async getSpartanToken() {\n const { token } = await this.spartanTokenCache.getToken();\n return token;\n }\n\n public async clearSpartanToken() {\n // Clear from memory\n this.spartanTokenCache.clearToken();\n // Clear from storage\n await this.tokenStore.clearToken();\n }\n\n public async getCurrentExpiration(): Promise<DateTime | null> {\n const currentToken = await this.spartanTokenCache.getExistingToken();\n return currentToken ? currentToken.expiresAt : null;\n }\n}\n","import { DateTime } from \"luxon\";\nimport { ResolvablePromise } from \"./resolvable-promise\";\nimport { coalesceDateTime } from \"./date-time\";\n\nexport class KeyedExpiryTokenCache<\n TToken extends { expiresAt: DateTime },\n TKey extends string,\n TArgs extends any[]\n> {\n private readonly tokenFetchPromiseMap = new Map<\n TKey,\n ResolvablePromise<TToken>\n >();\n\n constructor(\n private readonly generateNewToken: (\n key: TKey,\n ...args: TArgs\n ) => Promise<TToken>,\n private readonly existingTokenFetcher: (\n key: TKey\n ) => Promise<(Omit<TToken, \"expiresAt\"> & { expiresAt: unknown }) | null>\n ) {}\n\n async getToken(key: TKey, ...args: TArgs): Promise<TToken> {\n let tokenFetchPromise = this.tokenFetchPromiseMap.get(key);\n if (tokenFetchPromise) {\n // Someone either already has a token or is in the process of getting one\n // Wait for them to finish, then check for validity\n const currentToken = await tokenFetchPromise;\n\n if (currentToken.expiresAt > DateTime.now()) {\n // Current token is valid, return it\n return currentToken;\n } else {\n // Current token expired, start a new promise\n tokenFetchPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromiseMap.set(key, tokenFetchPromise);\n\n try {\n const newToken = await this.generateNewToken(key, ...args);\n tokenFetchPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n tokenFetchPromise.reject(e);\n tokenFetchPromise = undefined;\n throw e;\n }\n }\n } else {\n // No one has a token, start a new promise\n tokenFetchPromise = new ResolvablePromise<TToken>();\n this.tokenFetchPromiseMap.set(key, tokenFetchPromise);\n\n try {\n const existingToken = await this.getExistingToken(key);\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now().minus({ minute: 1 })) {\n const newToken = { ...existingToken, expiresAt } as TToken;\n tokenFetchPromise.resolve(newToken);\n return newToken;\n }\n }\n\n const newToken = await this.generateNewToken(key, ...args);\n tokenFetchPromise.resolve(newToken);\n return newToken;\n } catch (e) {\n tokenFetchPromise.reject(e);\n tokenFetchPromise = undefined;\n throw e;\n }\n }\n }\n\n async getExistingToken(key: TKey) {\n const existingToken = await this.existingTokenFetcher(key);\n\n if (existingToken?.expiresAt) {\n const expiresAt = coalesceDateTime(existingToken.expiresAt);\n if (expiresAt && expiresAt > DateTime.now()) {\n return { ...existingToken, expiresAt } as TToken;\n }\n }\n\n return null;\n }\n\n clearToken(key: TKey) {\n this.tokenFetchPromiseMap.delete(key);\n }\n}\n","import { DateTime } from \"luxon\";\nimport { TokenPersister } from \"../core/token-persisters\";\nimport { XboxTicket } from \"../models/xbox-ticket\";\nimport { KeyedExpiryTokenCache } from \"../util/keyed-expiry-token-cache\";\nimport { ExpiryTokenCache } from \"../util/expiry-token-cache\";\nimport { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { RequestError } from \"../util/request-error\";\nimport { unauthorizedRetryPolicy } from \"../core/request-policy\";\n\nexport enum RelyingParty {\n Xbox = \"http://xboxlive.com\",\n Halo = \"https://prod.xsts.halowaypoint.com/\",\n}\n\nexport interface XboxAuthenticationToken {\n token: string;\n expiresAt: DateTime;\n refreshToken: string;\n}\n\nexport class XboxAuthenticationClient {\n static readonly userTokenName = \"xbox.userToken\";\n static readonly xstsTicketName = (relyingParty: RelyingParty) =>\n `xbox.xstsTicket.${relyingParty}`;\n\n private userTokenCache = new ExpiryTokenCache(\n async (accessToken: string) => {\n const url = \"https://user.auth.xboxlive.com/user/authenticate\";\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-xbl-contract-version\": \"1\",\n },\n body: JSON.stringify({\n RelyingParty: \"http://auth.xboxlive.com\",\n TokenType: \"JWT\",\n Properties: {\n AuthMethod: \"RPS\",\n SiteName: \"user.auth.xboxlive.com\",\n RpsTicket: `d=${accessToken}`,\n },\n }),\n });\n\n if (response.status >= 200 && response.status < 300) {\n const result = (await response.json()) as XboxTicket;\n\n const token = {\n ...result,\n expiresAt: DateTime.fromISO(result.NotAfter),\n };\n await (\n await this.tokenPersisterOrPromise\n )?.save(\"xbox.userToken\", token);\n return token;\n } else {\n throw new RequestError(url, response);\n }\n },\n async () => {\n const tokenPersister = await this.tokenPersisterOrPromise;\n return (\n (await tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(\n XboxAuthenticationClient.userTokenName\n )) ?? null\n );\n }\n );\n private xstsTicketCache = new KeyedExpiryTokenCache(\n async (relyingParty: RelyingParty, userToken: string) => {\n const url = \"https://xsts.auth.xboxlive.com/xsts/authorize\";\n const response = await this.fetchFn(url, {\n method: \"POST\",\n headers: {\n \"Content-Type\": \"application/json\",\n Accept: \"application/json\",\n \"x-xbl-contract-version\": \"1\",\n },\n body: JSON.stringify({\n RelyingParty: relyingParty,\n TokenType: \"JWT\",\n Properties: {\n SandboxId: \"RETAIL\",\n UserTokens: [userToken],\n },\n }),\n });\n\n if (response.status >= 200 && response.status < 300) {\n const result = (await response.json()) as XboxTicket;\n\n const token = {\n ...result,\n expiresAt: DateTime.fromISO(result.NotAfter),\n };\n await (\n await this.tokenPersisterOrPromise\n )?.save(XboxAuthenticationClient.xstsTicketName(relyingParty), token);\n return token;\n } else {\n throw new RequestError(url, response);\n }\n },\n async (relyingParty) =>\n (await (\n await this.tokenPersisterOrPromise\n )?.load<XboxTicket & { expiresAt: unknown }>(\n \"xbox.xstsTicket.\" + relyingParty\n )) ?? null\n );\n\n constructor(\n private readonly getOauth2AccessToken: () => Promise<string>,\n private readonly tokenPersisterOrPromise?:\n | TokenPersister\n | Promise<TokenPersister>,\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n public async getXstsTicket(relyingParty: RelyingParty) {\n let xstsTicket = await this.xstsTicketCache.getExistingToken(relyingParty);\n if (!xstsTicket) {\n let userToken = await this.userTokenCache.getExistingToken();\n const xstsTicketFailureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n // Clear from memory\n this.userTokenCache.clearToken();\n // Clear from storage\n await (await this.tokenPersisterOrPromise)?.clear(\"xbox.userToken\");\n userToken = null;\n }\n }\n );\n xstsTicket = await unauthorizedRetryPolicy\n .execute(async () => {\n if (!userToken) {\n // Ouath2 token depends on nothing, so we can fetch it without\n // worrying if it is expired.\n const oauthToken = await this.getOauth2AccessToken();\n userToken = await this.userTokenCache.getToken(oauthToken);\n }\n return this.xstsTicketCache.getToken(relyingParty, userToken.Token);\n })\n .finally(() => xstsTicketFailureHandler.dispose());\n }\n return xstsTicket;\n }\n\n public clearXstsTicket = async (relyingParty: RelyingParty) => {\n // Clear from memory\n this.xstsTicketCache.clearToken(relyingParty);\n // Clear from storage\n (await this.tokenPersisterOrPromise)?.clear(\n \"xbox.xstsTicket.\" + relyingParty\n );\n };\n\n public getXboxLiveV3Token = (xboxTicket: XboxTicket) =>\n `XBL3.0 x=${xboxTicket.DisplayClaims.xui[0].uhs};${xboxTicket.Token}`;\n\n public clearXboxUserToken = async () => {\n // Clear from memory\n this.userTokenCache.clearToken();\n // Clear from storage\n (await this.tokenPersisterOrPromise)?.clear(\"xbox.userToken\");\n };\n}\n","export enum AssetKind {\n Film,\n Map,\n Playlist,\n Prefab,\n TestAsset,\n UgcGameVariant,\n MapModePair,\n Project,\n Manifest,\n EngineGameVariant,\n}\n","export enum MatchType {\n All = 0,\n Matchmaking = 1,\n Custom = 2,\n Local = 3,\n}\n","export function wrapPlayerId(playerId: string) {\n if (/^\\w+\\(\\d+\\)/.test(playerId)) {\n return playerId;\n } else {\n // Assume xuid\n return `xuid(${playerId})`;\n }\n}\n\nexport function unwrapPlayerId(playerId: string) {\n const match = /^\\w+\\((\\d+)\\)$/.exec(playerId);\n if (match) {\n return match[1];\n } else {\n return playerId;\n }\n}\n","import { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { HaloCoreEndpoints } from \"../endpoints/halo-core-endpoints\";\nimport {\n MapAsset,\n MapModePairAsset,\n PlaylistAsset,\n UgcGameVariantAsset,\n} from \"../models/halo-infinite/asset\";\nimport { AssetKind } from \"../models/halo-infinite/asset-kind\";\nimport { MatchSkill } from \"../models/halo-infinite/match-skill\";\nimport { MatchStats } from \"../models/halo-infinite/match-stats\";\nimport { MatchType } from \"../models/halo-infinite/match-type\";\nimport { PlayerMatchHistory } from \"../models/halo-infinite/player-match-history\";\nimport { Playlist } from \"../models/halo-infinite/playlist\";\nimport { PlaylistCsrContainer } from \"../models/halo-infinite/playlist-csr-container\";\nimport { ServiceRecord } from \"../models/halo-infinite/service-record\";\nimport { UserInfo } from \"../models/halo-infinite/user-info\";\nimport { GlobalConstants } from \"../util/global-contants\";\nimport { SpartanTokenProvider } from \"./token-providers/spartan-token-provider\";\nimport { RequestError } from \"../util/request-error\";\nimport { MatchesPrivacy } from \"../models/halo-infinite/matches-privacy\";\nimport { MedalsMetadataFile } from \"../models/halo-infinite/medals-metadata-file\";\nimport {\n ProgressionFileType,\n ProgressionFileTypeMap,\n} from \"../models/halo-infinite/progression-file\";\nimport { unauthorizedRetryPolicy } from \"./request-policy\";\nimport { BanSummary } from \"../models/halo-infinite/ban-summary\";\nimport { KeyedExpiryTokenCache } from \"../util/keyed-expiry-token-cache\";\nimport { DateTime } from \"luxon\";\nimport { wrapPlayerId, unwrapPlayerId } from \"../util/xuid\";\nimport { SeasonCalendarContainer } from \"../models/halo-infinite/season\";\nimport { Settings } from \"../models/halo-infinite/settings\";\nimport { MatchCount } from \"src/models/halo-infinite/match-count\";\nimport { BanMessage } from \"../models/halo-infinite/ban-message\";\n\nexport interface ResultContainer<TValue> {\n Id: string;\n ResultCode: 0 | 1;\n Result: TValue;\n}\n\nexport interface ResultsContainer<TValue> {\n Value: ResultContainer<TValue>[];\n}\n\ninterface PaginationContainer<TValue> {\n Start: number;\n Count: number;\n ResultCount: number;\n Results: TValue[];\n}\n\nexport type AssetKindTypeMap = {\n [AssetKind.Map]: MapAsset;\n [AssetKind.UgcGameVariant]: UgcGameVariantAsset;\n [AssetKind.Playlist]: PlaylistAsset;\n [AssetKind.MapModePair]: MapModePairAsset;\n};\n\nconst assetKindUrlMap = {\n [AssetKind.Map]: \"Maps\" as const,\n [AssetKind.UgcGameVariant]: \"UgcGameVariants\" as const,\n [AssetKind.Playlist]: \"Playlists\" as const,\n [AssetKind.MapModePair]: \"MapModePairs\" as const,\n} satisfies {\n [key in keyof AssetKindTypeMap]: string;\n};\nexport class HaloInfiniteClient {\n private clearanceMap = new Map<\n string,\n {\n FlightConfigurationId: string;\n expiresAt: DateTime;\n }\n >();\n private clearanceCache = new KeyedExpiryTokenCache(\n async () => {\n const { xuid } = await this.getCurrentUser();\n const response = await this.executeRequest(\n `https://${HaloCoreEndpoints.SettingsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/oban/flight-configurations/titles/hi/audiences/retail/players/${wrapPlayerId(\n xuid\n )}/active`,\n { method: \"get\" },\n false\n );\n const {\n FlightConfigurationId,\n }: {\n FlightConfigurationId: string;\n } = await response.json();\n const expiresHeader = response.headers.get(\"expires\");\n return {\n FlightConfigurationId,\n expiresAt: expiresHeader\n ? DateTime.fromHTTP(expiresHeader)\n : DateTime.now().plus({ seconds: 5 }),\n };\n },\n async (spartanToken) => this.clearanceMap.get(spartanToken) ?? null\n );\n\n constructor(\n private readonly spartanTokenProvider: SpartanTokenProvider,\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n protected async executeRequest(\n url: string,\n init: RequestInit,\n skipAuth: boolean\n ) {\n const failureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n await this.spartanTokenProvider.clearSpartanToken();\n }\n }\n );\n try {\n return await unauthorizedRetryPolicy.execute(async () => {\n const headers = new Headers(init.headers);\n if (!headers.has(\"User-Agent\")) {\n headers.set(\"User-Agent\", GlobalConstants.HALO_PC_USER_AGENT);\n }\n if (!headers.has(\"Accept\")) {\n headers.set(\"Accept\", \"application/json\");\n }\n if (!skipAuth) {\n headers.set(\n \"x-343-authorization-spartan\",\n await this.spartanTokenProvider.getSpartanToken()\n );\n }\n\n const response = await this.fetchFn(url, {\n ...init,\n headers,\n });\n\n if (!response.ok) {\n throw new RequestError(url, response);\n }\n\n return response;\n });\n } finally {\n failureHandler.dispose();\n }\n }\n\n protected async executeJsonRequest<T>(\n url: string,\n init: RequestInit,\n skipAuth?: boolean\n ) {\n const response = await this.executeRequest(url, init, skipAuth ?? false);\n\n if (response.status >= 200 && response.status < 300) {\n return (await response.json()) as T;\n } else {\n throw new RequestError(url, response);\n }\n }\n\n protected async executeResultsRequest<T>(\n ...args: Parameters<HaloInfiniteClient[\"executeJsonRequest\"]>\n ) {\n let resultsContainer: ResultsContainer<T>;\n try {\n resultsContainer = await this.executeJsonRequest<ResultsContainer<T>>(\n ...args\n );\n } catch (e) {\n if (e instanceof RequestError && e.response.status === 404) {\n const contentLength = e.response.headers.get(\"Content-Length\");\n if (contentLength && parseInt(contentLength) > 0) {\n // 404s if even one of the xuids is invalid\n resultsContainer = (await e.response.json()) as ResultsContainer<T>;\n }\n }\n\n throw e;\n }\n return resultsContainer.Value;\n }\n\n protected async executePaginationRequest<T>(\n count: number,\n start: number,\n queryParameters: Record<string, string>,\n ...args: Parameters<HaloInfiniteClient[\"executeJsonRequest\"]>\n ) {\n const [url, ...rest] = args;\n const result = await this.executeJsonRequest<PaginationContainer<T>>(\n `${url}?${new URLSearchParams({\n ...queryParameters,\n count: count.toString(),\n start: start.toString(),\n })}`,\n ...rest\n );\n\n return result.Results;\n }\n\n /** Gets playlist Competitive Skill Rank (CSR) for a player or a set of players.\n * @param playlistId - Unique ID for the playlist.\n * @param playerIds - Array of player xuids.\n */\n public getPlaylistCsr = (\n playlistId: string,\n playerIds: string[],\n seasonId?: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n const urlParams = new URLSearchParams({\n players: playerIds.map(wrapPlayerId).join(\",\"),\n });\n if (seasonId) {\n urlParams.set(\"season\", seasonId);\n }\n return this.executeResultsRequest<PlaylistCsrContainer>(\n `https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/playlist/${playlistId}/csrs?${urlParams}`,\n {\n ...init,\n method: \"get\",\n }\n );\n };\n\n /** Get gamertag info for a player.\n * @param gamerTag - Gamertag to lookup.\n */\n public getUser = (\n gamerTag: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<UserInfo>(\n `https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users/gt(${gamerTag})`,\n\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Get gamertag info for several players.\n * @param xuids - Xuids to lookup.\n */\n public getUsers = (\n xuids: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n return this.executeJsonRequest<UserInfo[]>(\n `https://${HaloCoreEndpoints.Profile}.${\n HaloCoreEndpoints.ServiceDomain\n }/users?xuids=${xuids.map((x) => unwrapPlayerId(x)).join(\",\")}`,\n {\n ...init,\n method: \"get\",\n }\n );\n };\n\n /** Get service record for a player.\n * @param gamerTag - Gamertag to lookup.\n */\n public getUserServiceRecord = (\n gamerTagOrWrappedXuid: string,\n queryParameters?: { seasonId?: string; playlistAssetId?: string },\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<ServiceRecord>(\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${gamerTagOrWrappedXuid}/Matchmade/servicerecord?${new URLSearchParams(\n queryParameters\n ).toString()}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Get playlist information\n * @param playlistId - Unique ID for the playlist.\n */\n public getPlaylist = async (\n playlistId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n const clearanceToken = await this.clearanceCache.getToken(\n await this.spartanTokenProvider.getSpartanToken()\n );\n return this.executeJsonRequest<Playlist>(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/multiplayer/file/playlists/assets/${playlistId}.json`,\n {\n ...init,\n method: \"get\",\n headers: {\n ...init?.headers,\n \"343-clearance\": clearanceToken.FlightConfigurationId,\n },\n }\n );\n };\n\n public getPlayerMatches = (\n playerXuid: string,\n type: MatchType = MatchType.All,\n count: number = 25,\n start: number = 0,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) => {\n let params: Record<string, string> = {};\n if (type !== MatchType.All) {\n params.type = type.toString();\n }\n return this.executePaginationRequest<PlayerMatchHistory>(\n count,\n start,\n params,\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${wrapPlayerId(playerXuid)}/matches`,\n {\n ...init,\n method: \"get\",\n }\n );\n };\n\n public getPlayerMatchCount = (\n playerXuid: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<MatchCount>(\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${wrapPlayerId(playerXuid)}/matches/count`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMatchStats = (\n matchId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<MatchStats>(\n `https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/matches/${matchId}/stats`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMatchSkill = async (\n matchId: string,\n playerIds: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n await this.executeResultsRequest<MatchSkill>(\n `https://${HaloCoreEndpoints.SkillOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/matches/${matchId}/skill?players=${playerIds\n .map(wrapPlayerId)\n .join(\",\")}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Gets authoring metadata about a specific asset. */\n public getAsset = <TAssetType extends keyof AssetKindTypeMap>(\n assetType: TAssetType,\n assetId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<AssetKindTypeMap[TAssetType]>(\n `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n /** Gets metadata related to a concrete version of a specified asset. */\n public getSpecificAssetVersion = <TAssetType extends keyof AssetKindTypeMap>(\n assetType: TAssetType,\n assetId: string,\n versionId: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) =>\n this.executeJsonRequest<AssetKindTypeMap[TAssetType]>(\n `https://${HaloCoreEndpoints.DiscoveryOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/${assetKindUrlMap[assetType]}/${assetId}/versions/${versionId}`,\n {\n ...init,\n headers: {\n Origin: \"https://www.halowaypoint.com\",\n },\n method: \"get\",\n }\n );\n\n // Don't be fooled, the \"profile\" version of this endpoint is worthless\n public getCurrentUser = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<{ xuid: string; notificationsReadDate: string }> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.CommsOrigin}.${HaloCoreEndpoints.ServiceDomain}/users/me`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMatchesPrivacy = (\n playerXuid: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<MatchesPrivacy> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${wrapPlayerId(playerXuid)}/matches-privacy`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public updateMatchesPrivacy = (\n playerXuid: string,\n matchesPrivacy: MatchesPrivacy,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<MatchesPrivacy> => {\n const headers = new Headers(init?.headers);\n headers.set(\"Content-Type\", \"application/json\");\n return this.executeJsonRequest(\n `https://${HaloCoreEndpoints.StatsOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/players/${wrapPlayerId(playerXuid)}/matches-privacy`,\n {\n ...init,\n method: \"put\",\n headers,\n body: JSON.stringify({ matchesPrivacy }),\n }\n );\n };\n\n public getProgressionFile = <TFileType extends ProgressionFileType>(\n filename: `${TFileType}/${string}.json`,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<ProgressionFileTypeMap[TFileType]> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Progression/file/${filename}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getMedalsMetadataFile = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<MedalsMetadataFile> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/Waypoint/file/medals/metadata.json`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getBanSummary = (\n xuids: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<BanSummary> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.BanProcessorOrigin}.${\n HaloCoreEndpoints.ServiceDomain\n }/hi/bansummary?targets=${xuids.map(wrapPlayerId).join(\",\")}`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getBanMessage(\n banPath: string,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<BanMessage> {\n return this.executeJsonRequest(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/banning/file/${banPath}`,\n {\n ...init,\n method: \"get\",\n }\n );\n }\n\n public getSeasonCalendar = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<SeasonCalendarContainer> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/progression/file/calendars/seasons/seasoncalendar.json`,\n {\n ...init,\n method: \"get\",\n }\n );\n\n public getSettings = (\n init?: Omit<RequestInit, \"body\" | \"method\">\n ): Promise<Settings> =>\n this.executeJsonRequest(\n `https://${HaloCoreEndpoints.SettingsOrigin}.${HaloCoreEndpoints.ServiceDomain}/settings/hipc/e2a0a7c6-6efe-42af-9283-c2ab73250c48`,\n {\n ...init,\n method: \"get\",\n },\n true\n );\n}\n","import { TokenPersister } from \".\";\n\nconst tokens = new Map<string, any>();\n\nexport const inMemoryTokenPersister: TokenPersister = {\n load: (tokenName) => {\n return tokens.get(tokenName);\n },\n save: (tokenName, token) => {\n tokens.set(tokenName, token);\n },\n clear: (tokenName) => {\n tokens.delete(tokenName);\n },\n};\n","import { HaloAuthenticationClient } from \"../../authentication/halo-authentication-client\";\nimport {\n RelyingParty,\n XboxAuthenticationClient,\n} from \"../../authentication/xbox-authentication-client\";\nimport type { FetchFunction } from \"../../util/fetch-function\";\nimport { TokenPersister } from \"../token-persisters\";\nimport { inMemoryTokenPersister } from \"../token-persisters/in-memory-token-persister\";\nimport { SpartanTokenProvider } from \"./spartan-token-provider\";\nimport { XboxTokenProvider } from \"./xbox-token-provider\";\n\n/**\n * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same\n * process. This is useful for applications that do not need to contend with\n * CORS restrictions.\n */\nexport class AutoTokenProvider\n extends HaloAuthenticationClient\n implements SpartanTokenProvider, XboxTokenProvider\n{\n public readonly getXboxLiveV3Token: () => Promise<string>;\n public readonly clearXboxLiveV3Token: () => Promise<void>;\n\n constructor(\n getOauth2AccessToken: () => Promise<string>,\n tokenPersister?: TokenPersister | Promise<TokenPersister>,\n fetchFn?: FetchFunction\n ) {\n super(\n {\n fetchToken: async () => {\n const xstsTicket = await xboxAuthClient.getXstsTicket(\n RelyingParty.Halo\n );\n return xstsTicket.Token;\n },\n clearXstsToken: () => xboxAuthClient.clearXstsTicket(RelyingParty.Halo),\n },\n {\n loadToken: async () =>\n (await (await tokenPeristerOrPromise).load(\"halo.authToken\")) ?? null,\n saveToken: async (token) => {\n await (await tokenPeristerOrPromise).save(\"halo.authToken\", token);\n },\n clearToken: async () => {\n await (await tokenPeristerOrPromise).clear(\"halo.authToken\");\n },\n },\n fetchFn\n );\n let tokenPeristerOrPromise: TokenPersister | Promise<TokenPersister>;\n if (tokenPersister) {\n tokenPeristerOrPromise = tokenPersister;\n } else {\n tokenPeristerOrPromise = inMemoryTokenPersister;\n }\n const xboxAuthClient = new XboxAuthenticationClient(\n getOauth2AccessToken,\n tokenPersister,\n fetchFn\n );\n\n this.getXboxLiveV3Token = async () => {\n const xstsTicket = await xboxAuthClient.getXstsTicket(RelyingParty.Xbox);\n return xboxAuthClient.getXboxLiveV3Token(xstsTicket);\n };\n this.clearXboxLiveV3Token = () =>\n xboxAuthClient.clearXstsTicket(RelyingParty.Xbox);\n }\n}\n","import { HaloAuthenticationClient } from \"../../authentication/halo-authentication-client\";\nimport { TokenPersister } from \"../token-persisters\";\nimport { inMemoryTokenPersister } from \"../token-persisters/in-memory-token-persister\";\nimport { SpartanTokenProvider } from \"./spartan-token-provider\";\n\n/**\n * A SpartanTokenProvider that fetches uses a pre-fetched XSTS ticket token.\n * Since requests to the Halo API are subject to CORS restrictions a\n * HaloAuthenticationClient can be instantitated with a pre-fetched XSTS ticket\n * and run on a server (such as one provided by the user).\n */\nexport class StaticXstsTicketTokenSpartanTokenProvider\n extends HaloAuthenticationClient\n implements SpartanTokenProvider\n{\n constructor(\n xstsTicketToken: string,\n tokenPersister?: TokenPersister | Promise<TokenPersister>\n ) {\n super(\n {\n fetchToken: () => xstsTicketToken,\n clearXstsToken: async () => {\n console.warn(\n \"StaticXstsTicketTokenSpartanTokenProvider does not support clearing xstsTickets\"\n );\n },\n },\n {\n loadToken: async () =>\n (await (await actualTokenPersister).load(\"halo.authToken\")) ?? null,\n saveToken: async (token) => {\n await (await actualTokenPersister).save(\"halo.authToken\", token);\n },\n clearToken: async () => {\n await (await actualTokenPersister).clear(\"halo.authToken\");\n },\n }\n );\n let actualTokenPersister: TokenPersister | Promise<TokenPersister>;\n if (tokenPersister) {\n actualTokenPersister = tokenPersister;\n } else {\n actualTokenPersister = inMemoryTokenPersister;\n }\n }\n}\n","import { RequestError } from \"../util/request-error\";\nimport { FetchFunction, defaultFetch } from \"../util/fetch-function\";\nimport { XboxTokenProvider } from \"./token-providers/xbox-token-provider\";\nimport { unauthorizedRetryPolicy } from \"./request-policy\";\nimport { unwrapPlayerId } from \"../util/xuid\";\n\nexport class XboxClient {\n constructor(\n private readonly xboxTokenProvider: XboxTokenProvider,\n private readonly fetchFn: FetchFunction = defaultFetch\n ) {}\n\n private async executeRequest<T>(url: string, init: RequestInit): Promise<T> {\n const failureHandler = unauthorizedRetryPolicy.onFailure(\n async ({ handled }) => {\n if (handled) {\n await this.xboxTokenProvider.clearXboxLiveV3Token();\n }\n }\n );\n try {\n return await unauthorizedRetryPolicy.execute(async () => {\n const headers = new Headers(init.headers);\n if (!headers.has(\"Accept\")) {\n headers.set(\"Accept\", \"application/json\");\n }\n if (!headers.has(\"Authorization\")) {\n headers.set(\n \"Authorization\",\n await this.xboxTokenProvider.getXboxLiveV3Token()\n );\n }\n if (!headers.has(\"x-xbl-contract-version\")) {\n headers.set(\"x-xbl-contract-version\", \"3\");\n }\n const response = await this.fetchFn(url, {\n ...init,\n headers,\n });\n\n if (response.status >= 200 && response.status < 300) {\n return (await response.json()) as T;\n } else {\n throw new RequestError(url, response);\n }\n });\n } finally {\n failureHandler.dispose();\n }\n }\n\n public async searchUsers(\n query: string,\n maxItems: number = 5,\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) {\n const { people } = await this.executeRequest<{\n people: [\n {\n xuid: string;\n gamertag: string;\n displayPicRaw: string;\n }\n ];\n }>(\n `https://peoplehub.xboxlive.com/users/me/people/search?q=${encodeURIComponent(\n query\n )}&maxItems=${maxItems}`,\n { ...init, method: \"GET\" }\n );\n return people;\n }\n\n public async recentPlayers(init?: Omit<RequestInit, \"body\" | \"method\">) {\n return await this.executeRequest<unknown>(\n \"https://peoplehub.xboxlive.com/users/me/people/recentplayers\",\n { ...init, method: \"GET\" }\n );\n }\n\n public async getProfiles(\n xuids: string[],\n settings: string[],\n init?: Omit<RequestInit, \"body\" | \"method\">\n ) {\n return await this.executeRequest<{\n profileUsers: {\n id: string;\n settings: { id: string; value: string }[];\n }[];\n }>(\"https://profile.xboxlive.com/users/batch/profile/settings\", {\n ...init,\n headers: {\n ...init?.headers,\n \"Content-Type\": \"application/json\",\n },\n method: \"POST\",\n body: JSON.stringify({\n userIds: xuids.map(unwrapPlayerId),\n settings,\n }),\n });\n }\n}\n","import { ResultContainer } from \"src\";\nimport { ApiFormattedDate } from \"./api-formatted-date\";\n\nexport enum BanType {\n Matchmaking = 1,\n}\n\nexport enum BanScope {\n Global = 1,\n}\n\nexport interface BanSummary {\n Results: ResultContainer<{\n BansInEffect: {\n Type: number;\n Scope: number;\n MessageId: unknown;\n MessageUri: unknown;\n EnforceUntilUtc: ApiFormattedDate;\n BanMessagePath: string;\n }[];\n }>[];\n Links: {\n Self: {\n AuthorityId: string;\n Path: string;\n QueryString: string;\n RetryPolicyId: string;\n TopicName: string;\n AcknowledgementTypeId: number;\n AuthenticationLifetimeExtensionSupported: boolean;\n ClearanceAware: boolean;\n };\n };\n}\n","export enum GameVariantCategory {\n MultiplayerSlayer = 6,\n MultiplayerAttrition = 7,\n MultiplayerElimination = 8,\n MultiplayerFiesta = 9,\n MultiplayerStrongholds = 11,\n MultiplayerKingOfTheHill = 12,\n MultiplayerTotalControl = 14,\n MultiplayerCtf = 15,\n MultiplayerExtraction = 17,\n MultiplayerOddball = 18,\n MultiplayerStockpile = 19,\n MultiplayerInfection = 22,\n MultiplayerVIP = 23,\n MultiplayerEscalation = 24,\n MultiplayerGrifball = 25,\n MultiplayerLandGrab = 39,\n MultiplayerMinigame = 41,\n MultiplayerFirefight = 42,\n}\n","export enum MatchOutcome {\n Tie = 1,\n Win = 2,\n Loss = 3,\n DidNotFinish = 4,\n}\n","export enum Privacy {\n Show = 1,\n Hide = 2,\n}\n\nexport interface MatchesPrivacy {\n MatchmadeGames: Privacy;\n OtherGames: Privacy;\n}\n","export enum PlaylistExperience {\n Arena = 2,\n Social = 3,\n Featured = 5,\n}\n","import { ApiFormattedDate } from \"./api-formatted-date\";\n\nexport enum ProgressionFileType {\n Seasons = \"Seasons\",\n Calendars = \"Calendars\",\n \"Csr/Seasons\" = \"Csr/Seasons\",\n}\n\nexport type ProgressionFileTypeMap = {\n Calendars: SeasonCalendarProgressionFile;\n Seasons: SeasonProgressionFile;\n [\"Csr/Seasons\"]: CsrSeasonCalendarProgressionFile;\n};\n\nexport interface SeasonCalendarProgressionFile {\n Seasons: {\n CsrSeasonFilePath: `Csr/Seasons/${string}.json`;\n OperationTrackPath: `RewardTracks/Operations/${string}.json`;\n SeasonMetadata: `Seasons/${string}.json`;\n StartDate: ApiFormattedDate;\n EndDate: ApiFormattedDate;\n }[];\n Events: {\n RewardTrackPath: `RewardTracks/Events/Rituals/${string}.json`;\n StartDate: ApiFormattedDate;\n EndDate: ApiFormattedDate;\n }[];\n CareerRank: { RewardTrackPath: `RewardTracks/CareerRanks/${string}.json` };\n}\n\nexport interface CsrSeasonCalendarProgressionFile {\n Seasons: {\n CsrSeasonFilePath: `Csr/Seasons/${string}.json`;\n StartDate: ApiFormattedDate;\n EndDate: ApiFormattedDate;\n }[];\n}\n\nexport interface SeasonProgressionFile {\n DateRange: string;\n Name: string;\n Logo: string;\n Number: number;\n Description: string;\n SummaryBackgroundPath: string;\n BattlePassSeasonUpsellBackgroundImage: string;\n ChallengesBackgroundPath: string;\n BattlePassLogoImage: string;\n SeasonLogoImage: string;\n RitualLogoImage: string;\n StorefrontBackgroundImage: string;\n CardBackgroundImage: string;\n ProgressionBackgroundImage: string;\n}\n"]}
|