halo-infinite-api 5.1.2 → 5.2.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/authentication/xbox-authentication-client.d.ts +2 -2
- package/dist/authentication/xbox-authentication-client.js +10 -7
- package/dist/authentication/xbox-authentication-client.js.map +1 -1
- package/dist/core/token-persisters/index.d.ts +4 -4
- package/dist/core/token-persisters/index.js +3 -1
- package/dist/core/token-persisters/index.js.map +1 -1
- package/dist/core/token-persisters/node-fs-token-persister.d.ts +1 -1
- package/dist/core/token-persisters/node-fs-token-persister.js +9 -6
- package/dist/core/token-persisters/node-fs-token-persister.js.map +1 -1
- package/dist/core/token-persisters/token-persister.d.ts +4 -0
- package/dist/core/token-persisters/token-persister.js +2 -0
- package/dist/core/token-persisters/token-persister.js.map +1 -0
- package/dist/core/token-providers/auto-token-provider.d.ts +1 -1
- package/dist/core/token-providers/auto-token-provider.js +9 -5
- package/dist/core/token-providers/auto-token-provider.js.map +1 -1
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.d.ts +1 -1
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js +2 -2
- package/dist/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map +1 -1
- package/dist/core/xbox-client.d.ts +1 -1
- package/dist/index.d.ts +1 -1
- package/package.json +5 -1
- package/src/authentication/xbox-authentication-client.ts +18 -8
- package/src/core/token-persisters/index.ts +4 -4
- package/src/core/token-persisters/node-fs-token-persister.ts +16 -7
- package/src/core/token-persisters/token-persister.ts +4 -0
- package/src/core/token-providers/auto-token-provider.ts +10 -6
- package/src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts +8 -4
- package/src/core/xbox-client.ts +1 -1
- package/src/index.ts +1 -1
|
@@ -12,11 +12,11 @@ export interface XboxAuthenticationToken {
|
|
|
12
12
|
refreshToken: string;
|
|
13
13
|
}
|
|
14
14
|
export declare class XboxAuthenticationClient {
|
|
15
|
-
private readonly
|
|
15
|
+
private readonly tokenPersisterOrPromise?;
|
|
16
16
|
private readonly fetchFn;
|
|
17
17
|
private userTokenCache;
|
|
18
18
|
private xstsTicketCache;
|
|
19
|
-
constructor(
|
|
19
|
+
constructor(tokenPersisterOrPromise?: TokenPersister | Promise<TokenPersister> | undefined, fetchFn?: FetchFunction);
|
|
20
20
|
getXstsTicket(getOauth2AccessToken: () => Promise<string>, relyingParty: RelyingParty): Promise<{
|
|
21
21
|
expiresAt: DateTime;
|
|
22
22
|
IssueInstant: string;
|
|
@@ -8,7 +8,7 @@ export var RelyingParty;
|
|
|
8
8
|
RelyingParty["Halo"] = "https://prod.xsts.halowaypoint.com/";
|
|
9
9
|
})(RelyingParty || (RelyingParty = {}));
|
|
10
10
|
export class XboxAuthenticationClient {
|
|
11
|
-
|
|
11
|
+
tokenPersisterOrPromise;
|
|
12
12
|
fetchFn;
|
|
13
13
|
userTokenCache = new ExpiryTokenCache(async (accessToken) => {
|
|
14
14
|
const result = await this.fetchFn("https://user.auth.xboxlive.com/user/authenticate", {
|
|
@@ -32,9 +32,12 @@ export class XboxAuthenticationClient {
|
|
|
32
32
|
...result,
|
|
33
33
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
34
34
|
};
|
|
35
|
-
await this.
|
|
35
|
+
await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
|
|
36
36
|
return token;
|
|
37
|
-
}, async () =>
|
|
37
|
+
}, async () => {
|
|
38
|
+
const tokenPersister = await this.tokenPersisterOrPromise;
|
|
39
|
+
return ((await tokenPersister?.load("xbox.userToken")) ?? null);
|
|
40
|
+
});
|
|
38
41
|
xstsTicketCache = new KeyedExpiryTokenCache(async (relyingParty, userToken) => {
|
|
39
42
|
const result = await this.fetchFn("https://xsts.auth.xboxlive.com/xsts/authorize", {
|
|
40
43
|
method: "POST",
|
|
@@ -56,11 +59,11 @@ export class XboxAuthenticationClient {
|
|
|
56
59
|
...result,
|
|
57
60
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
58
61
|
};
|
|
59
|
-
await this.
|
|
62
|
+
await (await this.tokenPersisterOrPromise)?.save("xbox.xstsTicket." + relyingParty, token);
|
|
60
63
|
return token;
|
|
61
|
-
}, async (relyingParty) => (await this.
|
|
62
|
-
constructor(
|
|
63
|
-
this.
|
|
64
|
+
}, async (relyingParty) => (await (await this.tokenPersisterOrPromise)?.load("xbox.xstsTicket." + relyingParty)) ?? null);
|
|
65
|
+
constructor(tokenPersisterOrPromise, fetchFn = defaultFetch) {
|
|
66
|
+
this.tokenPersisterOrPromise = tokenPersisterOrPromise;
|
|
64
67
|
this.fetchFn = fetchFn;
|
|
65
68
|
}
|
|
66
69
|
async getXstsTicket(getOauth2AccessToken, relyingParty) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,qBAAqB,EAAE,MAAM,kCAAkC,CAAC;AACzE,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAC9D,OAAO,EAAiB,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAErE,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,4DAA4C,CAAA;AAC9C,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAQD,MAAM,OAAO,wBAAwB;
|
|
1
|
+
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
1
|
+
export { TokenPersister } from "./token-persister";
|
|
2
|
+
export { localStorageTokenPersister } from "./local-storage-token-persister";
|
|
3
|
+
export { nodeFsTokenPersister } from "./node-fs-token-persister";
|
|
4
|
+
export { inMemoryTokenPersister } from "./in-memory-token-persister";
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/token-persisters/index.ts"],"names":[],"mappings":""}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/core/token-persisters/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,0BAA0B,EAAE,MAAM,iCAAiC,CAAC;AAC7E,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EAAE,sBAAsB,EAAE,MAAM,6BAA6B,CAAC"}
|
|
@@ -1,2 +1,2 @@
|
|
|
1
|
-
import { TokenPersister } from ".";
|
|
1
|
+
import type { TokenPersister } from ".";
|
|
2
2
|
export declare const nodeFsTokenPersister: TokenPersister;
|
|
@@ -1,9 +1,11 @@
|
|
|
1
|
-
import fs from "fs/promises";
|
|
2
1
|
export const nodeFsTokenPersister = {
|
|
3
2
|
load: async (tokenName) => {
|
|
4
|
-
const
|
|
3
|
+
const tokenDir = process.env.TOKEN_ROOT ||
|
|
4
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
5
5
|
try {
|
|
6
|
-
const json = await fs.readFile(
|
|
6
|
+
const json = await (await import("fs/promises")).readFile(`${tokenDir}/${tokenName}`, {
|
|
7
|
+
encoding: "utf-8",
|
|
8
|
+
});
|
|
7
9
|
return JSON.parse(json);
|
|
8
10
|
}
|
|
9
11
|
catch (e) {
|
|
@@ -16,9 +18,10 @@ export const nodeFsTokenPersister = {
|
|
|
16
18
|
}
|
|
17
19
|
},
|
|
18
20
|
save: async (tokenName, token) => {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
await fs.
|
|
21
|
+
const tokenDir = process.env.TOKEN_ROOT ||
|
|
22
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
23
|
+
await (await import("fs/promises")).mkdir(tokenDir, { recursive: true });
|
|
24
|
+
await (await import("fs/promises")).writeFile(`${tokenDir}/${tokenName}`, JSON.stringify(token));
|
|
22
25
|
},
|
|
23
26
|
};
|
|
24
27
|
//# sourceMappingURL=node-fs-token-persister.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"node-fs-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/node-fs-token-persister.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"node-fs-token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/node-fs-token-persister.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,MAAM,oBAAoB,GAAmB;IAClD,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,EAAE;QACxB,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,UAAU;YACtB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,IAAI;YACF,MAAM,IAAI,GAAG,MAAM,CACjB,MAAM,MAAM,CAAC,aAAa,CAAC,CAC5B,CAAC,QAAQ,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE;gBACrC,QAAQ,EAAE,OAAO;aAClB,CAAC,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC;SACzB;QAAC,OAAO,CAAC,EAAE;YACV,IAAI,CAAC,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,MAAM,IAAI,CAAC,IAAI,CAAC,CAAC,IAAI,KAAK,QAAQ,EAAE;gBACpE,OAAO,IAAI,CAAC;aACb;iBAAM;gBACL,MAAM,CAAC,CAAC;aACT;SACF;IACH,CAAC;IACD,IAAI,EAAE,KAAK,EAAE,SAAS,EAAE,KAAK,EAAE,EAAE;QAC/B,MAAM,QAAQ,GACZ,OAAO,CAAC,GAAG,CAAC,UAAU;YACtB,CAAC,MAAM,MAAM,CAAC,MAAM,CAAC,CAAC,CAAC,IAAI,CAAC,SAAS,EAAE,UAAU,CAAC,CAAC;QACrD,MAAM,CAAC,MAAM,MAAM,CAAC,aAAa,CAAC,CAAC,CAAC,KAAK,CAAC,QAAQ,EAAE,EAAE,SAAS,EAAE,IAAI,EAAE,CAAC,CAAC;QACzE,MAAM,CACJ,MAAM,MAAM,CAAC,aAAa,CAAC,CAC5B,CAAC,SAAS,CAAC,GAAG,QAAQ,IAAI,SAAS,EAAE,EAAE,IAAI,CAAC,SAAS,CAAC,KAAK,CAAC,CAAC,CAAC;IACjE,CAAC;CACF,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"token-persister.js","sourceRoot":"","sources":["../../../src/core/token-persisters/token-persister.ts"],"names":[],"mappings":""}
|
|
@@ -10,5 +10,5 @@ import { FetchFunction } from "src/util/fetch-function";
|
|
|
10
10
|
export declare class AutoTokenProvider implements SpartanTokenProvider, XboxTokenProvider {
|
|
11
11
|
readonly getSpartanToken: () => Promise<string>;
|
|
12
12
|
readonly getXboxLiveV3Token: () => Promise<string>;
|
|
13
|
-
constructor(getOauth2AccessToken: () => Promise<string>, tokenPersister?: TokenPersister
|
|
13
|
+
constructor(getOauth2AccessToken: () => Promise<string>, tokenPersister?: TokenPersister | Promise<TokenPersister>, fetchFn?: FetchFunction);
|
|
14
14
|
}
|
|
@@ -10,19 +10,23 @@ export class AutoTokenProvider {
|
|
|
10
10
|
getSpartanToken;
|
|
11
11
|
getXboxLiveV3Token;
|
|
12
12
|
constructor(getOauth2AccessToken, tokenPersister, fetchFn) {
|
|
13
|
-
let
|
|
13
|
+
let tokenPeristerOrPromise;
|
|
14
14
|
if (tokenPersister) {
|
|
15
|
-
|
|
15
|
+
tokenPeristerOrPromise = tokenPersister;
|
|
16
16
|
}
|
|
17
17
|
else {
|
|
18
|
-
|
|
18
|
+
tokenPeristerOrPromise = inMemoryTokenPersister;
|
|
19
19
|
}
|
|
20
20
|
const xboxAuthClient = new XboxAuthenticationClient(tokenPersister, fetchFn);
|
|
21
21
|
const haloAuthClient = new HaloAuthenticationClient(async () => {
|
|
22
22
|
const xstsTicket = await xboxAuthClient.getXstsTicket(getOauth2AccessToken, RelyingParty.Halo);
|
|
23
23
|
return xstsTicket.Token;
|
|
24
|
-
}, async () =>
|
|
25
|
-
await
|
|
24
|
+
}, async () => {
|
|
25
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
26
|
+
return await tokenPersister.load("halo.authToken");
|
|
27
|
+
}, async (token) => {
|
|
28
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
29
|
+
await tokenPersister.save("halo.authToken", token);
|
|
26
30
|
}, fetchFn);
|
|
27
31
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
28
32
|
this.getXboxLiveV3Token = async () => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"auto-token-provider.js","sourceRoot":"","sources":["../../../src/core/token-providers/auto-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAIvF;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAGZ,eAAe,CAAwB;IACvC,kBAAkB,CAAwB;IAE1D,YACE,oBAA2C,EAC3C,
|
|
1
|
+
{"version":3,"file":"auto-token-provider.js","sourceRoot":"","sources":["../../../src/core/token-providers/auto-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAE3F,OAAO,EAAE,sBAAsB,EAAE,MAAM,+CAA+C,CAAC;AAIvF;;;;GAIG;AACH,MAAM,OAAO,iBAAiB;IAGZ,eAAe,CAAwB;IACvC,kBAAkB,CAAwB;IAE1D,YACE,oBAA2C,EAC3C,cAAyD,EACzD,OAAuB;QAEvB,IAAI,sBAAgE,CAAC;QACrE,IAAI,cAAc,EAAE;YAClB,sBAAsB,GAAG,cAAc,CAAC;SACzC;aAAM;YACL,sBAAsB,GAAG,sBAAsB,CAAC;SACjD;QACD,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,cAAc,EACd,OAAO,CACR,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,KAAK,IAAI,EAAE;YACT,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE;YACT,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC;YACpD,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;QACrD,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,cAAc,GAAG,MAAM,sBAAsB,CAAC;YACpD,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACrD,CAAC,EACD,OAAO,CACR,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;QAC9D,IAAI,CAAC,kBAAkB,GAAG,KAAK,IAAI,EAAE;YACnC,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,oBAAoB,EACpB,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,cAAc,CAAC,kBAAkB,CAAC,UAAU,CAAC,CAAC;QACvD,CAAC,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -8,5 +8,5 @@ import { SpartanTokenProvider } from ".";
|
|
|
8
8
|
*/
|
|
9
9
|
export declare class StaticXstsTicketTokenSpartanTokenProvider implements SpartanTokenProvider {
|
|
10
10
|
readonly getSpartanToken: () => Promise<string>;
|
|
11
|
-
constructor(xstsTicketToken: string, tokenPersister?: TokenPersister);
|
|
11
|
+
constructor(xstsTicketToken: string, tokenPersister?: TokenPersister | Promise<TokenPersister>);
|
|
12
12
|
}
|
|
@@ -16,8 +16,8 @@ export class StaticXstsTicketTokenSpartanTokenProvider {
|
|
|
16
16
|
else {
|
|
17
17
|
actualTokenPersister = inMemoryTokenPersister;
|
|
18
18
|
}
|
|
19
|
-
const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => await actualTokenPersister.load("halo.authToken"), async (token) => {
|
|
20
|
-
await actualTokenPersister.save("halo.authToken", token);
|
|
19
|
+
const haloAuthClient = new HaloAuthenticationClient(() => xstsTicketToken, async () => (await (await actualTokenPersister).load("halo.authToken")) ?? null, async (token) => {
|
|
20
|
+
await (await actualTokenPersister).save("halo.authToken", token);
|
|
21
21
|
});
|
|
22
22
|
this.getSpartanToken = () => haloAuthClient.getSpartanToken();
|
|
23
23
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../../src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAE9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,OAAO,yCAAyC;IAGpC,eAAe,CAAwB;IAEvD,
|
|
1
|
+
{"version":3,"file":"static-xsts-ticket-token-spartan-token-provider.js","sourceRoot":"","sources":["../../../../src/core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,wBAAwB,EAAE,MAAM,oDAAoD,CAAC;AAE9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,kDAAkD,CAAC;AAE1F;;;;;GAKG;AACH,MAAM,OAAO,yCAAyC;IAGpC,eAAe,CAAwB;IAEvD,YACE,eAAuB,EACvB,cAAyD;QAEzD,IAAI,oBAA8D,CAAC;QACnE,IAAI,cAAc,EAAE;YAClB,oBAAoB,GAAG,cAAc,CAAC;SACvC;aAAM;YACL,oBAAoB,GAAG,sBAAsB,CAAC;SAC/C;QAED,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,GAAG,EAAE,CAAC,eAAe,EACrB,KAAK,IAAI,EAAE,CACT,CAAC,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC,IAAI,IAAI,EACrE,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,MAAM,CAAC,MAAM,oBAAoB,CAAC,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;QACnE,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}
|
package/dist/index.d.ts
CHANGED
|
@@ -19,6 +19,6 @@ export { MatchInfo } from "./models/halo-infinite/match-info";
|
|
|
19
19
|
export { SpartanTokenProvider } from "./core/token-providers/spartan-token-providers";
|
|
20
20
|
export { AutoTokenProvider, AutoTokenProvider as AutoXstsSpartanTokenProvider, } from "./core/token-providers/auto-token-provider";
|
|
21
21
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
22
|
-
export { TokenPersister } from "./core/token-persisters";
|
|
22
|
+
export { TokenPersister } from "./core/token-persisters/token-persister";
|
|
23
23
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
24
24
|
export { FetchFunction } from "./util/fetch-function";
|
package/package.json
CHANGED
|
@@ -1,9 +1,13 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "halo-infinite-api",
|
|
3
3
|
"type": "module",
|
|
4
|
-
"version": "5.
|
|
4
|
+
"version": "5.2.0",
|
|
5
5
|
"description": "An NPM package for accessing the official Halo Infinite API.",
|
|
6
6
|
"main": "dist/index.js",
|
|
7
|
+
"exports": {
|
|
8
|
+
".": "./dist/index.js",
|
|
9
|
+
"./token-persisters": "./dist/core/token-persisters/index.js"
|
|
10
|
+
},
|
|
7
11
|
"scripts": {
|
|
8
12
|
"prepack": "tsc --project tsconfig.app.json"
|
|
9
13
|
},
|
|
@@ -44,13 +44,17 @@ export class XboxAuthenticationClient {
|
|
|
44
44
|
...result,
|
|
45
45
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
46
46
|
};
|
|
47
|
-
await this.
|
|
47
|
+
await (await this.tokenPersisterOrPromise)?.save("xbox.userToken", token);
|
|
48
48
|
return token;
|
|
49
49
|
},
|
|
50
|
-
async () =>
|
|
51
|
-
|
|
52
|
-
|
|
53
|
-
|
|
50
|
+
async () => {
|
|
51
|
+
const tokenPersister = await this.tokenPersisterOrPromise;
|
|
52
|
+
return (
|
|
53
|
+
(await tokenPersister?.load<XboxTicket & { expiresAt: unknown }>(
|
|
54
|
+
"xbox.userToken"
|
|
55
|
+
)) ?? null
|
|
56
|
+
);
|
|
57
|
+
}
|
|
54
58
|
);
|
|
55
59
|
private xstsTicketCache = new KeyedExpiryTokenCache(
|
|
56
60
|
async (relyingParty: RelyingParty, userToken: string) => {
|
|
@@ -78,17 +82,23 @@ export class XboxAuthenticationClient {
|
|
|
78
82
|
...result,
|
|
79
83
|
expiresAt: DateTime.fromISO(result.NotAfter),
|
|
80
84
|
};
|
|
81
|
-
await
|
|
85
|
+
await (
|
|
86
|
+
await this.tokenPersisterOrPromise
|
|
87
|
+
)?.save("xbox.xstsTicket." + relyingParty, token);
|
|
82
88
|
return token;
|
|
83
89
|
},
|
|
84
90
|
async (relyingParty) =>
|
|
85
|
-
(await
|
|
91
|
+
(await (
|
|
92
|
+
await this.tokenPersisterOrPromise
|
|
93
|
+
)?.load<XboxTicket & { expiresAt: unknown }>(
|
|
86
94
|
"xbox.xstsTicket." + relyingParty
|
|
87
95
|
)) ?? null
|
|
88
96
|
);
|
|
89
97
|
|
|
90
98
|
constructor(
|
|
91
|
-
private readonly
|
|
99
|
+
private readonly tokenPersisterOrPromise?:
|
|
100
|
+
| TokenPersister
|
|
101
|
+
| Promise<TokenPersister>,
|
|
92
102
|
private readonly fetchFn: FetchFunction = defaultFetch
|
|
93
103
|
) {}
|
|
94
104
|
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export
|
|
2
|
-
|
|
3
|
-
|
|
4
|
-
}
|
|
1
|
+
export { TokenPersister } from "./token-persister";
|
|
2
|
+
export { localStorageTokenPersister } from "./local-storage-token-persister";
|
|
3
|
+
export { nodeFsTokenPersister } from "./node-fs-token-persister";
|
|
4
|
+
export { inMemoryTokenPersister } from "./in-memory-token-persister";
|
|
@@ -1,11 +1,16 @@
|
|
|
1
|
-
import
|
|
2
|
-
import { TokenPersister } from ".";
|
|
1
|
+
import type { TokenPersister } from ".";
|
|
3
2
|
|
|
4
3
|
export const nodeFsTokenPersister: TokenPersister = {
|
|
5
4
|
load: async (tokenName) => {
|
|
6
|
-
const
|
|
5
|
+
const tokenDir =
|
|
6
|
+
process.env.TOKEN_ROOT ||
|
|
7
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
7
8
|
try {
|
|
8
|
-
const json = await
|
|
9
|
+
const json = await (
|
|
10
|
+
await import("fs/promises")
|
|
11
|
+
).readFile(`${tokenDir}/${tokenName}`, {
|
|
12
|
+
encoding: "utf-8",
|
|
13
|
+
});
|
|
9
14
|
return JSON.parse(json);
|
|
10
15
|
} catch (e) {
|
|
11
16
|
if (e && typeof e === "object" && "code" in e && e.code === "ENOENT") {
|
|
@@ -16,8 +21,12 @@ export const nodeFsTokenPersister: TokenPersister = {
|
|
|
16
21
|
}
|
|
17
22
|
},
|
|
18
23
|
save: async (tokenName, token) => {
|
|
19
|
-
const
|
|
20
|
-
|
|
21
|
-
|
|
24
|
+
const tokenDir =
|
|
25
|
+
process.env.TOKEN_ROOT ||
|
|
26
|
+
(await import("path")).join(__dirname, "./tokens");
|
|
27
|
+
await (await import("fs/promises")).mkdir(tokenDir, { recursive: true });
|
|
28
|
+
await (
|
|
29
|
+
await import("fs/promises")
|
|
30
|
+
).writeFile(`${tokenDir}/${tokenName}`, JSON.stringify(token));
|
|
22
31
|
},
|
|
23
32
|
};
|
|
@@ -22,14 +22,14 @@ export class AutoTokenProvider
|
|
|
22
22
|
|
|
23
23
|
constructor(
|
|
24
24
|
getOauth2AccessToken: () => Promise<string>,
|
|
25
|
-
tokenPersister?: TokenPersister
|
|
25
|
+
tokenPersister?: TokenPersister | Promise<TokenPersister>,
|
|
26
26
|
fetchFn?: FetchFunction
|
|
27
27
|
) {
|
|
28
|
-
let
|
|
28
|
+
let tokenPeristerOrPromise: TokenPersister | Promise<TokenPersister>;
|
|
29
29
|
if (tokenPersister) {
|
|
30
|
-
|
|
30
|
+
tokenPeristerOrPromise = tokenPersister;
|
|
31
31
|
} else {
|
|
32
|
-
|
|
32
|
+
tokenPeristerOrPromise = inMemoryTokenPersister;
|
|
33
33
|
}
|
|
34
34
|
const xboxAuthClient = new XboxAuthenticationClient(
|
|
35
35
|
tokenPersister,
|
|
@@ -43,9 +43,13 @@ export class AutoTokenProvider
|
|
|
43
43
|
);
|
|
44
44
|
return xstsTicket.Token;
|
|
45
45
|
},
|
|
46
|
-
async () =>
|
|
46
|
+
async () => {
|
|
47
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
48
|
+
return await tokenPersister.load("halo.authToken");
|
|
49
|
+
},
|
|
47
50
|
async (token) => {
|
|
48
|
-
await
|
|
51
|
+
const tokenPersister = await tokenPeristerOrPromise;
|
|
52
|
+
await tokenPersister.save("halo.authToken", token);
|
|
49
53
|
},
|
|
50
54
|
fetchFn
|
|
51
55
|
);
|
|
@@ -14,8 +14,11 @@ export class StaticXstsTicketTokenSpartanTokenProvider
|
|
|
14
14
|
{
|
|
15
15
|
public readonly getSpartanToken: () => Promise<string>;
|
|
16
16
|
|
|
17
|
-
constructor(
|
|
18
|
-
|
|
17
|
+
constructor(
|
|
18
|
+
xstsTicketToken: string,
|
|
19
|
+
tokenPersister?: TokenPersister | Promise<TokenPersister>
|
|
20
|
+
) {
|
|
21
|
+
let actualTokenPersister: TokenPersister | Promise<TokenPersister>;
|
|
19
22
|
if (tokenPersister) {
|
|
20
23
|
actualTokenPersister = tokenPersister;
|
|
21
24
|
} else {
|
|
@@ -24,9 +27,10 @@ export class StaticXstsTicketTokenSpartanTokenProvider
|
|
|
24
27
|
|
|
25
28
|
const haloAuthClient = new HaloAuthenticationClient(
|
|
26
29
|
() => xstsTicketToken,
|
|
27
|
-
async () =>
|
|
30
|
+
async () =>
|
|
31
|
+
(await (await actualTokenPersister).load("halo.authToken")) ?? null,
|
|
28
32
|
async (token) => {
|
|
29
|
-
await actualTokenPersister.save("halo.authToken", token);
|
|
33
|
+
await (await actualTokenPersister).save("halo.authToken", token);
|
|
30
34
|
}
|
|
31
35
|
);
|
|
32
36
|
|
package/src/core/xbox-client.ts
CHANGED
package/src/index.ts
CHANGED
|
@@ -28,6 +28,6 @@ export {
|
|
|
28
28
|
AutoTokenProvider as AutoXstsSpartanTokenProvider,
|
|
29
29
|
} from "./core/token-providers/auto-token-provider";
|
|
30
30
|
export { StaticXstsTicketTokenSpartanTokenProvider } from "./core/token-providers/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider";
|
|
31
|
-
export { TokenPersister } from "./core/token-persisters";
|
|
31
|
+
export { TokenPersister } from "./core/token-persisters/token-persister";
|
|
32
32
|
export { PlaylistExperience } from "./models/halo-infinite/playlist-experience";
|
|
33
33
|
export { FetchFunction } from "./util/fetch-function";
|