halo-infinite-api 1.2.2 → 2.0.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.
Files changed (62) hide show
  1. package/README.md +1 -1
  2. package/dist/authentication/halo-authentication-client.d.ts +4 -5
  3. package/dist/authentication/halo-authentication-client.js +23 -69
  4. package/dist/authentication/halo-authentication-client.js.map +1 -1
  5. package/dist/authentication/xbox-authentication-client.d.ts +9 -9
  6. package/dist/authentication/xbox-authentication-client.js +80 -63
  7. package/dist/authentication/xbox-authentication-client.js.map +1 -1
  8. package/dist/core/halo-infinite-client.d.ts +5 -8
  9. package/dist/core/halo-infinite-client.js +5 -35
  10. package/dist/core/halo-infinite-client.js.map +1 -1
  11. package/dist/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.d.ts +11 -0
  12. package/dist/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.js +43 -0
  13. package/dist/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.js.map +1 -0
  14. package/dist/core/spartan-token-fetchers/index.d.ts +3 -0
  15. package/dist/core/spartan-token-fetchers/index.js +2 -0
  16. package/dist/core/spartan-token-fetchers/index.js.map +1 -0
  17. package/dist/core/spartan-token-fetchers/static-xsts-ticket-token-spartan-token-provider.d.ts +12 -0
  18. package/dist/core/spartan-token-fetchers/static-xsts-ticket-token-spartan-token-provider.js +26 -0
  19. package/dist/core/spartan-token-fetchers/static-xsts-ticket-token-spartan-token-provider.js.map +1 -0
  20. package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.d.ts +11 -0
  21. package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.js +32 -0
  22. package/dist/core/spartan-token-providers/auto-xsts-spartan-token-provider.js.map +1 -0
  23. package/dist/core/spartan-token-providers/index.d.ts +3 -0
  24. package/dist/core/spartan-token-providers/index.js +2 -0
  25. package/dist/core/spartan-token-providers/index.js.map +1 -0
  26. package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.d.ts +12 -0
  27. package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js +26 -0
  28. package/dist/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.js.map +1 -0
  29. package/dist/core/token-persister.d.ts +4 -0
  30. package/dist/core/token-persister.js +2 -0
  31. package/dist/core/token-persister.js.map +1 -0
  32. package/dist/core/token-persisters/index.d.ts +4 -0
  33. package/dist/core/token-persisters/index.js +2 -0
  34. package/dist/core/token-persisters/index.js.map +1 -0
  35. package/dist/core/token-persisters/local-storage-token-persister.d.ts +2 -0
  36. package/dist/core/token-persisters/local-storage-token-persister.js +15 -0
  37. package/dist/core/token-persisters/local-storage-token-persister.js.map +1 -0
  38. package/dist/core/token-persisters/node-fs-token-persister.d.ts +2 -0
  39. package/dist/core/token-persisters/node-fs-token-persister.js +24 -0
  40. package/dist/core/token-persisters/node-fs-token-persister.js.map +1 -0
  41. package/dist/index.d.ts +5 -0
  42. package/dist/index.js +3 -0
  43. package/dist/index.js.map +1 -1
  44. package/dist/util/expiry-token-cache.d.ts +9 -0
  45. package/dist/util/expiry-token-cache.js +48 -0
  46. package/dist/util/expiry-token-cache.js.map +1 -0
  47. package/dist/util/resolvable-promise.d.ts +8 -0
  48. package/dist/util/resolvable-promise.js +31 -0
  49. package/dist/util/resolvable-promise.js.map +1 -0
  50. package/package.json +3 -2
  51. package/src/authentication/halo-authentication-client.ts +30 -72
  52. package/src/authentication/xbox-authentication-client.ts +107 -81
  53. package/src/core/halo-infinite-client.ts +9 -66
  54. package/src/core/spartan-token-providers/auto-xsts-spartan-token-provider.ts +55 -0
  55. package/src/core/spartan-token-providers/index.ts +3 -0
  56. package/src/core/spartan-token-providers/static-xsts-ticket-token-spartan-token-provider.ts +36 -0
  57. package/src/core/token-persisters/index.ts +4 -0
  58. package/src/core/token-persisters/local-storage-token-persister.ts +15 -0
  59. package/src/core/token-persisters/node-fs-token-persister.ts +23 -0
  60. package/src/index.ts +8 -0
  61. package/src/util/expiry-token-cache.ts +51 -0
  62. package/src/util/resolvable-promise.ts +32 -0
package/README.md CHANGED
@@ -21,7 +21,7 @@ The core requirement to use the endpoints in the library is to have a Spartan to
21
21
  >
22
22
  > The Spartan token is associated with _your identity_ and _your account_. **Do not share it** with anyone, under any circumstances. The API wrapper does not explicitly store it anywhere. It's your responsibility to make sure that it's secure and not available to anyone else.
23
23
 
24
- If you want to automatically generate the Spartan token, you can do so with the help of Grunt API without having to worry about doing any of the REST API calls yourself. Before you get started, make sure that you [register an Azure Active Directory application](https://docs.microsoft.com/azure/active-directory/develop/quickstart-register-app). You will need it in order to log in with your Microsoft account, that will be used to generate the token. Because this is just for you, you can use `https://localhost` as the redirect URI when you create the application, unless you're thinking of productizing whatever you're building.
24
+ If you want to automatically generate the Spartan token, you can do so with the help of this package without having to worry about doing any of the REST API calls yourself. Before you get started, make sure that you [register an Azure Active Directory application](https://docs.microsoft.com/azure/active-directory/develop/quickstart-register-app). You will need it in order to log in with your Microsoft account, that will be used to generate the token. Because this is just for you, you can use `https://localhost` as the redirect URI when you create the application, unless you're thinking of productizing whatever you're building.
25
25
 
26
26
  Once you have the application registered, you can use the following code to automatically generate the token and call endpoints:
27
27
 
@@ -7,11 +7,10 @@ export declare class HaloAuthenticationClient {
7
7
  private readonly fetchXstsToken;
8
8
  private readonly loadToken;
9
9
  private readonly saveToken;
10
- private currentTokenPromise;
11
- constructor(fetchXstsToken: () => Promise<string>, loadToken: () => Promise<{
12
- token?: string;
13
- expiresAt?: unknown;
10
+ private spartanTokenCache;
11
+ constructor(fetchXstsToken: () => Promise<string> | string, loadToken: () => Promise<{
12
+ token: string;
13
+ expiresAt: unknown;
14
14
  } | null>, saveToken: (token: Token) => Promise<void>);
15
15
  getSpartanToken(): Promise<string>;
16
- private fetchSpartanToken;
17
16
  }
@@ -1,80 +1,23 @@
1
1
  import axios from "axios";
2
2
  import { DateTime } from "luxon";
3
3
  import { coalesceDateTime } from "../util/date-time";
4
+ import { ExpiryTokenCache } from "../util/expiry-token-cache";
4
5
  export class HaloAuthenticationClient {
5
6
  fetchXstsToken;
6
7
  loadToken;
7
8
  saveToken;
8
- currentTokenPromise = undefined;
9
- constructor(fetchXstsToken, loadToken, saveToken) {
10
- this.fetchXstsToken = fetchXstsToken;
11
- this.loadToken = loadToken;
12
- this.saveToken = saveToken;
13
- }
14
- async getSpartanToken() {
15
- if (this.currentTokenPromise) {
16
- // Someone either already has a token or is in the process of getting one
17
- // Wait for them to finish, then check for validity
18
- const currentToken = await this.currentTokenPromise;
19
- if (currentToken.expiresAt > DateTime.now()) {
20
- // Current token is valid, return it
21
- return currentToken.token;
22
- }
23
- else {
24
- // Current token expired, start a new promise
25
- let promiseResolver;
26
- let promiseRejector;
27
- this.currentTokenPromise = new Promise((resolve, reject) => {
28
- promiseResolver = resolve;
29
- promiseRejector = reject;
30
- });
31
- try {
32
- const xstsToken = await this.fetchXstsToken();
33
- const newToken = await this.fetchSpartanToken(xstsToken);
34
- promiseResolver(newToken);
35
- await this.saveToken(newToken);
36
- return newToken.token;
37
- }
38
- catch (e) {
39
- promiseRejector(e);
40
- throw e;
41
- }
9
+ spartanTokenCache = new ExpiryTokenCache(async () => {
10
+ const persistedToken = await this.loadToken();
11
+ if (persistedToken?.expiresAt) {
12
+ const currentToken = {
13
+ token: persistedToken.token,
14
+ expiresAt: coalesceDateTime(persistedToken.expiresAt),
15
+ };
16
+ if (currentToken.expiresAt && currentToken.expiresAt > DateTime.now()) {
17
+ return currentToken;
42
18
  }
43
19
  }
44
- else {
45
- // We are the first caller, create a promise to block subsequent callers
46
- let promiseResolver;
47
- let promiseRejector;
48
- this.currentTokenPromise = new Promise((resolve, reject) => {
49
- promiseResolver = resolve;
50
- promiseRejector = reject;
51
- });
52
- try {
53
- const loadedToken = await this.loadToken();
54
- const currentToken = {
55
- token: loadedToken?.token ?? "",
56
- expiresAt: coalesceDateTime(loadedToken?.expiresAt),
57
- };
58
- if (currentToken.expiresAt && currentToken.expiresAt > DateTime.now()) {
59
- // Current token is valid, return it and alert other callers if applicable
60
- promiseResolver(currentToken);
61
- return currentToken.token;
62
- }
63
- else {
64
- const xstsToken = await this.fetchXstsToken();
65
- const newToken = await this.fetchSpartanToken(xstsToken);
66
- promiseResolver(newToken);
67
- await this.saveToken(newToken);
68
- return newToken.token;
69
- }
70
- }
71
- catch (e) {
72
- promiseRejector(e);
73
- throw e;
74
- }
75
- }
76
- }
77
- async fetchSpartanToken(xstsToken) {
20
+ const xstsToken = await this.fetchXstsToken();
78
21
  const tokenRequest = {
79
22
  Audience: "urn:343:s3:services",
80
23
  MinVersion: "4",
@@ -91,10 +34,21 @@ export class HaloAuthenticationClient {
91
34
  "Content-Type": "application/json; charset=utf-8",
92
35
  },
93
36
  });
94
- return {
37
+ const newToken = {
95
38
  token: response.data.SpartanToken,
96
39
  expiresAt: DateTime.fromISO(response.data.ExpiresUtc.ISO8601Date),
97
40
  };
41
+ await this.saveToken(newToken);
42
+ return newToken;
43
+ });
44
+ constructor(fetchXstsToken, loadToken, saveToken) {
45
+ this.fetchXstsToken = fetchXstsToken;
46
+ this.loadToken = loadToken;
47
+ this.saveToken = saveToken;
48
+ }
49
+ async getSpartanToken() {
50
+ const { token } = await this.spartanTokenCache.getToken();
51
+ return token;
98
52
  }
99
53
  }
100
54
  //# sourceMappingURL=halo-authentication-client.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,MAAM,OAAO,CAAC;AAC1B,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,OAAO,EAAE,gBAAgB,EAAE,MAAM,mBAAmB,CAAC;AACrD,OAAO,EAAE,gBAAgB,EAAE,MAAM,4BAA4B,CAAC;AAO9D,MAAM,OAAO,wBAAwB;IA+ChB;IACA;IAIA;IAnDX,iBAAiB,GAAG,IAAI,gBAAgB,CAAC,KAAK,IAAI,EAAE;QAC1D,MAAM,cAAc,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;QAE9C,IAAI,cAAc,EAAE,SAAS,EAAE;YAC7B,MAAM,YAAY,GAAG;gBACnB,KAAK,EAAE,cAAc,CAAC,KAAK;gBAC3B,SAAS,EAAE,gBAAgB,CAAC,cAAc,CAAC,SAAS,CAAa;aAClE,CAAC;YACF,IAAI,YAAY,CAAC,SAAS,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;gBACrE,OAAO,YAAY,CAAC;aACrB;SACF;QAED,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;QAE9C,MAAM,YAAY,GAAwB;YACxC,QAAQ,EAAE,qBAAqB;YAC/B,UAAU,EAAE,GAAG;YACf,KAAK,EAAE;gBACL;oBACE,KAAK,EAAE,SAAS;oBAChB,SAAS,EAAE,aAAa;iBACzB;aACF;SACF,CAAC;QACF,MAAM,QAAQ,GAAG,MAAM,KAAK,CAAC,IAAI,CAC/B,qDAAqD,EACrD,YAAY,EACZ;YACE,OAAO,EAAE;gBACP,YAAY,EACV,gEAAgE;gBAClE,cAAc,EAAE,iCAAiC;aAClD;SACF,CACF,CAAC;QAEF,MAAM,QAAQ,GAAG;YACf,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;YACjC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;SAClE,CAAC;QACF,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;QAC/B,OAAO,QAAQ,CAAC;IAClB,CAAC,CAAC,CAAC;IAEH,YACmB,cAA8C,EAC9C,SAGR,EACQ,SAA0C;QAL1C,mBAAc,GAAd,cAAc,CAAgC;QAC9C,cAAS,GAAT,SAAS,CAGjB;QACQ,cAAS,GAAT,SAAS,CAAiC;IAC1D,CAAC;IAEG,KAAK,CAAC,eAAe;QAC1B,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,QAAQ,EAAE,CAAC;QAC1D,OAAO,KAAK,CAAC;IACf,CAAC;CACF"}
@@ -1,5 +1,6 @@
1
1
  import { DateTime } from "luxon";
2
2
  import { XboxTicket } from "../models/xbox-ticket";
3
+ import { TokenPersister } from "../core/token-persisters";
3
4
  export declare enum RelyingParty {
4
5
  Xbox = "http://xboxlive.com",
5
6
  Halo = "https://prod.xsts.halowaypoint.com/"
@@ -13,20 +14,19 @@ export declare class XboxAuthenticationClient {
13
14
  private readonly clientId;
14
15
  private readonly redirectUri;
15
16
  private readonly getAuthCode;
16
- private readonly loadToken;
17
- private readonly saveToken;
18
- private currentTokenPromise;
17
+ private readonly tokenPersister?;
18
+ private accessTokenPromise;
19
+ private userTokenCache;
20
+ private xstsTicketCache;
19
21
  private readonly httpClient;
20
- constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, loadToken: () => Promise<{
21
- token?: string;
22
- expiresAt?: unknown;
23
- refreshToken?: string;
24
- } | null>, saveToken: (token: XboxAuthenticationToken) => Promise<void>);
22
+ constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, tokenPersister?: TokenPersister | undefined);
25
23
  private getPkce;
26
24
  getAccessToken(): Promise<string>;
27
25
  private fetchOauth2Token;
28
26
  private refreshOAuth2Token;
29
27
  getUserToken(accessToken: string): Promise<string>;
30
- getXstsTicket(userToken: string, relyingParty: RelyingParty): Promise<XboxTicket>;
28
+ getXstsTicket(userToken: string, relyingParty: RelyingParty): Promise<XboxTicket & {
29
+ expiresAt: DateTime;
30
+ }>;
31
31
  getXboxLiveV3Token: (userHash: string, userToken: string) => string;
32
32
  }
@@ -2,6 +2,8 @@ import axios from "axios";
2
2
  import pkceChallenge from "pkce-challenge";
3
3
  import { DateTime } from "luxon";
4
4
  import { coalesceDateTime } from "../util/date-time";
5
+ import { ResolvablePromise } from "../util/resolvable-promise";
6
+ import { ExpiryTokenCache } from "../util/expiry-token-cache";
5
7
  const SCOPES = ["Xboxlive.signin", "Xboxlive.offline_access"];
6
8
  export var RelyingParty;
7
9
  (function (RelyingParty) {
@@ -12,60 +14,103 @@ export class XboxAuthenticationClient {
12
14
  clientId;
13
15
  redirectUri;
14
16
  getAuthCode;
15
- loadToken;
16
- saveToken;
17
- currentTokenPromise = undefined;
17
+ tokenPersister;
18
+ accessTokenPromise = undefined;
19
+ userTokenCache = new ExpiryTokenCache(async (accessToken) => {
20
+ const persistedToken = await this.tokenPersister?.load("xbox.userToken");
21
+ if (persistedToken && persistedToken.expiresAt > DateTime.now()) {
22
+ return persistedToken;
23
+ }
24
+ const response = await this.httpClient.post("https://user.auth.xboxlive.com/user/authenticate", {
25
+ RelyingParty: "http://auth.xboxlive.com",
26
+ TokenType: "JWT",
27
+ Properties: {
28
+ AuthMethod: "RPS",
29
+ SiteName: "user.auth.xboxlive.com",
30
+ RpsTicket: `d=${accessToken}`,
31
+ },
32
+ }, {
33
+ headers: {
34
+ "Content-Type": "application/json",
35
+ Accept: "application/json",
36
+ "x-xbl-contract-version": "1",
37
+ },
38
+ });
39
+ const result = {
40
+ ...response.data,
41
+ expiresAt: DateTime.fromISO(response.data.NotAfter),
42
+ };
43
+ await this.tokenPersister?.save("xbox.userToken", result);
44
+ return result;
45
+ });
46
+ xstsTicketCache = new ExpiryTokenCache(async (userToken, relyingParty) => {
47
+ const persistedToken = await this.tokenPersister?.load("xbox.xstsTicket");
48
+ if (persistedToken && persistedToken.expiresAt > DateTime.now()) {
49
+ return persistedToken;
50
+ }
51
+ const response = await this.httpClient.post("https://xsts.auth.xboxlive.com/xsts/authorize", {
52
+ RelyingParty: relyingParty,
53
+ TokenType: "JWT",
54
+ Properties: {
55
+ SandboxId: "RETAIL",
56
+ UserTokens: [userToken],
57
+ },
58
+ }, {
59
+ headers: {
60
+ "Content-Type": "application/json",
61
+ Accept: "application/json",
62
+ "x-xbl-contract-version": "1",
63
+ },
64
+ });
65
+ const result = {
66
+ ...response.data,
67
+ expiresAt: DateTime.fromISO(response.data.NotAfter),
68
+ };
69
+ await this.tokenPersister?.save("xbox.xstsTicket", result);
70
+ return result;
71
+ });
18
72
  httpClient;
19
- constructor(clientId, redirectUri, getAuthCode, loadToken, saveToken) {
73
+ constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
20
74
  this.clientId = clientId;
21
75
  this.redirectUri = redirectUri;
22
76
  this.getAuthCode = getAuthCode;
23
- this.loadToken = loadToken;
24
- this.saveToken = saveToken;
77
+ this.tokenPersister = tokenPersister;
25
78
  this.httpClient = axios.create();
26
79
  }
27
80
  getPkce() {
28
81
  return pkceChallenge(43);
29
82
  }
30
83
  async getAccessToken() {
31
- if (this.currentTokenPromise) {
84
+ if (this.accessTokenPromise) {
32
85
  // Someone either already has a token or is in the process of getting one
33
86
  // Wait for them to finish, then check for validity
34
- const currentToken = await this.currentTokenPromise;
87
+ const currentToken = await this.accessTokenPromise;
35
88
  if (currentToken.expiresAt > DateTime.now()) {
36
89
  // Current token is valid, return it
37
90
  return currentToken.token;
38
91
  }
39
92
  else {
40
93
  // Current token expired, start a new promise
41
- let promiseResolver;
42
- let promiseRejector;
43
- this.currentTokenPromise = new Promise((resolve, reject) => {
44
- promiseResolver = resolve;
45
- promiseRejector = reject;
46
- });
94
+ this.accessTokenPromise =
95
+ new ResolvablePromise();
47
96
  try {
48
97
  const newToken = await this.refreshOAuth2Token(currentToken.refreshToken);
49
- promiseResolver(newToken);
50
- await this.saveToken(newToken);
98
+ this.accessTokenPromise.resolve(newToken);
99
+ await this.tokenPersister?.save("xbox.accessToken", newToken);
51
100
  return newToken.token;
52
101
  }
53
102
  catch (e) {
54
- promiseRejector(e);
103
+ this.accessTokenPromise.reject(e);
55
104
  throw e;
56
105
  }
57
106
  }
58
107
  }
59
108
  else {
60
109
  // We are the first caller, create a promise to block subsequent callers
61
- let promiseResolver;
62
- let promiseRejector;
63
- this.currentTokenPromise = new Promise((resolve, reject) => {
64
- promiseResolver = resolve;
65
- promiseRejector = reject;
66
- });
110
+ this.accessTokenPromise =
111
+ new ResolvablePromise();
67
112
  try {
68
- const loadedToken = await this.loadToken();
113
+ const loadedToken = await this.tokenPersister?.load("xbox.accessToken");
69
114
  const currentToken = {
70
115
  ...loadedToken,
71
116
  token: loadedToken?.token ?? "",
@@ -73,24 +118,24 @@ export class XboxAuthenticationClient {
73
118
  };
74
119
  if (currentToken.expiresAt && currentToken.expiresAt > DateTime.now()) {
75
120
  // Current token is valid, return it and alert other callers if applicable
76
- promiseResolver(currentToken);
121
+ this.accessTokenPromise.resolve(currentToken);
77
122
  return currentToken.token;
78
123
  }
79
124
  else {
80
125
  const newToken = await this.fetchOauth2Token();
81
- promiseResolver(newToken);
82
- await this.saveToken(newToken);
126
+ this.accessTokenPromise.resolve(newToken);
127
+ await this.tokenPersister?.save("xbox.accessToken", newToken);
83
128
  return newToken.token;
84
129
  }
85
130
  }
86
131
  catch (e) {
87
- promiseRejector(e);
132
+ this.accessTokenPromise.reject(e);
88
133
  throw e;
89
134
  }
90
135
  }
91
136
  }
92
137
  async fetchOauth2Token() {
93
- const { code_verifier, code_challenge } = await this.getPkce();
138
+ const { code_verifier, code_challenge } = this.getPkce();
94
139
  const authorizeUrl = `https://login.live.com/oauth20_authorize.srf?${new URLSearchParams({
95
140
  client_id: this.clientId,
96
141
  response_type: "code",
@@ -100,6 +145,7 @@ export class XboxAuthenticationClient {
100
145
  code_challenge,
101
146
  })}`;
102
147
  const code = await this.getAuthCode(authorizeUrl);
148
+ const requestStart = DateTime.now();
103
149
  const response = await this.httpClient.post("https://login.live.com/oauth20_token.srf", new URLSearchParams({
104
150
  grant_type: "authorization_code",
105
151
  code,
@@ -111,10 +157,9 @@ export class XboxAuthenticationClient {
111
157
  }), {
112
158
  headers: { "Content-Type": "application/x-www-form-urlencoded" },
113
159
  });
114
- const responseDate = DateTime.fromRFC2822(response.headers["date"]);
115
160
  return {
116
161
  token: response.data.access_token,
117
- expiresAt: responseDate.plus({ seconds: response.data.expires_in }),
162
+ expiresAt: requestStart.plus({ seconds: response.data.expires_in }),
118
163
  refreshToken: response.data.refresh_token,
119
164
  };
120
165
  }
@@ -136,39 +181,11 @@ export class XboxAuthenticationClient {
136
181
  };
137
182
  }
138
183
  async getUserToken(accessToken) {
139
- const response = await this.httpClient.post("https://user.auth.xboxlive.com/user/authenticate", {
140
- RelyingParty: "http://auth.xboxlive.com",
141
- TokenType: "JWT",
142
- Properties: {
143
- AuthMethod: "RPS",
144
- SiteName: "user.auth.xboxlive.com",
145
- RpsTicket: `d=${accessToken}`,
146
- },
147
- }, {
148
- headers: {
149
- "Content-Type": "application/json",
150
- Accept: "application/json",
151
- "x-xbl-contract-version": "1",
152
- },
153
- });
154
- return response.data.Token;
184
+ const { Token } = await this.userTokenCache.getToken(accessToken);
185
+ return Token;
155
186
  }
156
- async getXstsTicket(userToken, relyingParty) {
157
- const response = await this.httpClient.post("https://xsts.auth.xboxlive.com/xsts/authorize", {
158
- RelyingParty: relyingParty,
159
- TokenType: "JWT",
160
- Properties: {
161
- SandboxId: "RETAIL",
162
- UserTokens: [userToken],
163
- },
164
- }, {
165
- headers: {
166
- "Content-Type": "application/json",
167
- Accept: "application/json",
168
- "x-xbl-contract-version": "1",
169
- },
170
- });
171
- return response.data;
187
+ getXstsTicket(userToken, relyingParty) {
188
+ return this.xstsTicketCache.getToken(userToken, relyingParty);
172
189
  }
173
190
  getXboxLiveV3Token = (userHash, userToken) => `XBL3.0 x=${userHash};${userToken}`;
174
191
  }
@@ -1 +1 @@
1
- {"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"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"}
@@ -1,3 +1,5 @@
1
+ import { MapAsset, PlaylistAsset, UgcGameVariantAsset } from "../models/halo-infinite/asset";
2
+ import { AssetKind } from "../models/halo-infinite/asset-kind";
1
3
  import { MatchSkill } from "../models/halo-infinite/match-skill";
2
4
  import { MatchStats } from "../models/halo-infinite/match-stats";
3
5
  import { MatchType } from "../models/halo-infinite/match-type";
@@ -6,25 +8,20 @@ import { Playlist } from "../models/halo-infinite/playlist";
6
8
  import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-container";
7
9
  import { ServiceRecord } from "../models/halo-infinite/service-record";
8
10
  import { UserInfo } from "../models/halo-infinite/user-info";
9
- import { MapAsset, PlaylistAsset, UgcGameVariantAsset } from "../models/halo-infinite/asset";
10
- import { AssetKind } from "../models/halo-infinite/asset-kind";
11
+ import { SpartanTokenProvider } from "./spartan-token-providers";
11
12
  interface ResultContainer<TValue> {
12
13
  Id: string;
13
14
  ResultCode: 0 | 1;
14
15
  Result: TValue;
15
16
  }
16
- interface TokenPersister {
17
- load: <T>(tokenName: string) => Promise<T>;
18
- save: (tokenName: string, token: unknown) => Promise<void>;
19
- }
20
17
  export type AssetKindTypeMap = {
21
18
  [AssetKind.Map]: MapAsset;
22
19
  [AssetKind.UgcGameVariant]: UgcGameVariantAsset;
23
20
  [AssetKind.Playlist]: PlaylistAsset;
24
21
  };
25
22
  export declare class HaloInfiniteClient {
26
- private readonly haloAuthClient;
27
- constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, tokenPersister?: TokenPersister);
23
+ private spartanTokenProvider;
24
+ constructor(spartanTokenProvider: SpartanTokenProvider);
28
25
  private executeRequest;
29
26
  private executeResultsRequest;
30
27
  private executePaginationRequest;
@@ -1,10 +1,8 @@
1
1
  import axios, { AxiosError, AxiosHeaders } from "axios";
2
- import { HaloAuthenticationClient } from "../authentication/halo-authentication-client";
3
- import { RelyingParty, XboxAuthenticationClient, } from "../authentication/xbox-authentication-client";
4
2
  import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
3
+ import { AssetKind } from "../models/halo-infinite/asset-kind";
5
4
  import { MatchType } from "../models/halo-infinite/match-type";
6
5
  import { GlobalConstants } from "../util/global-contants";
7
- import { AssetKind } from "../models/halo-infinite/asset-kind";
8
6
  const assetKindUrlMap = {
9
7
  [AssetKind.Map]: "Maps",
10
8
  [AssetKind.UgcGameVariant]: "UgcGameVariants",
@@ -20,37 +18,9 @@ function wrapPlayerId(playerId) {
20
18
  }
21
19
  }
22
20
  export class HaloInfiniteClient {
23
- haloAuthClient;
24
- constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
25
- const xboxAuthClient = new XboxAuthenticationClient(clientId, redirectUri, getAuthCode, async () => {
26
- if (tokenPersister) {
27
- return await tokenPersister.load("xbox.authToken");
28
- }
29
- else {
30
- return null;
31
- }
32
- }, async (token) => {
33
- if (tokenPersister) {
34
- await tokenPersister.save("xbox.authToken", token);
35
- }
36
- });
37
- this.haloAuthClient = new HaloAuthenticationClient(async () => {
38
- const accessToken = await xboxAuthClient.getAccessToken();
39
- const userToken = await xboxAuthClient.getUserToken(accessToken);
40
- const xstsTicket = await xboxAuthClient.getXstsTicket(userToken, RelyingParty.Halo);
41
- return xstsTicket.Token;
42
- }, async () => {
43
- if (tokenPersister) {
44
- return await tokenPersister.load("halo.authToken");
45
- }
46
- else {
47
- return null;
48
- }
49
- }, async (token) => {
50
- if (tokenPersister) {
51
- await tokenPersister.save("halo.authToken", token);
52
- }
53
- });
21
+ spartanTokenProvider;
22
+ constructor(spartanTokenProvider) {
23
+ this.spartanTokenProvider = spartanTokenProvider;
54
24
  }
55
25
  async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
56
26
  const headers = new AxiosHeaders({
@@ -58,7 +28,7 @@ export class HaloInfiniteClient {
58
28
  Accept: "application/json",
59
29
  });
60
30
  if (useSpartanToken) {
61
- headers.set("x-343-authorization-spartan", await this.haloAuthClient.getSpartanToken());
31
+ headers.set("x-343-authorization-spartan", await this.spartanTokenProvider.getSpartanToken());
62
32
  }
63
33
  if (useClearance) {
64
34
  throw new Error("TODO: Implement clearance");
@@ -1 +1 @@
1
- {"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"halo-infinite-client.js","sourceRoot":"","sources":["../../src/core/halo-infinite-client.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,11 @@
1
+ import { TokenPersister } from "../token-persister";
2
+ import { SpartanTokenProvider } from ".";
3
+ /**
4
+ * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
5
+ * process. This is useful for applications that do not need to contend with
6
+ * CORS restrictions.
7
+ */
8
+ export declare class AutoXstsSpartanTokenProvider implements SpartanTokenProvider {
9
+ readonly getSpartanToken: () => Promise<string>;
10
+ constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, tokenPersister?: TokenPersister);
11
+ }
@@ -0,0 +1,43 @@
1
+ import { RelyingParty, XboxAuthenticationClient, } from "../../authentication/xbox-authentication-client";
2
+ import { HaloAuthenticationClient } from "../../authentication/halo-authentication-client";
3
+ /**
4
+ * A SpartanTokenProvider that fetches both the Xbox and Halo tokens in the same
5
+ * process. This is useful for applications that do not need to contend with
6
+ * CORS restrictions.
7
+ */
8
+ export class AutoXstsSpartanTokenProvider {
9
+ getSpartanToken;
10
+ constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
11
+ const xboxAuthClient = new XboxAuthenticationClient(clientId, redirectUri, getAuthCode, async () => {
12
+ if (tokenPersister) {
13
+ return await tokenPersister.load("xbox.authToken");
14
+ }
15
+ else {
16
+ return null;
17
+ }
18
+ }, async (token) => {
19
+ if (tokenPersister) {
20
+ await tokenPersister.save("xbox.authToken", token);
21
+ }
22
+ });
23
+ const haloAuthClient = new HaloAuthenticationClient(async () => {
24
+ const accessToken = await xboxAuthClient.getAccessToken();
25
+ const userToken = await xboxAuthClient.getUserToken(accessToken);
26
+ const xstsTicket = await xboxAuthClient.getXstsTicket(userToken, RelyingParty.Halo);
27
+ return xstsTicket.Token;
28
+ }, async () => {
29
+ if (tokenPersister) {
30
+ return await tokenPersister.load("halo.authToken");
31
+ }
32
+ else {
33
+ return null;
34
+ }
35
+ }, async (token) => {
36
+ if (tokenPersister) {
37
+ await tokenPersister.save("halo.authToken", token);
38
+ }
39
+ });
40
+ this.getSpartanToken = () => haloAuthClient.getSpartanToken();
41
+ }
42
+ }
43
+ //# sourceMappingURL=auto-xsts-sartan-token-provider.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auto-xsts-sartan-token-provider.js","sourceRoot":"","sources":["../../../src/core/spartan-token-fetchers/auto-xsts-sartan-token-provider.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,wBAAwB,GACzB,MAAM,iDAAiD,CAAC;AAEzD,OAAO,EAAE,wBAAwB,EAAE,MAAM,iDAAiD,CAAC;AAG3F;;;;GAIG;AACH,MAAM,OAAO,4BAA4B;IACvB,eAAe,CAAwB;IAEvD,YACE,QAAgB,EAChB,WAAmB,EACnB,WAAsD,EACtD,cAA+B;QAE/B,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,QAAQ,EACR,WAAW,EACX,WAAW,EACX,KAAK,IAAI,EAAE;YACT,IAAI,cAAc,EAAE;gBAClB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACpD;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,cAAc,EAAE;gBAClB,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;aACpD;QACH,CAAC,CACF,CAAC;QACF,MAAM,cAAc,GAAG,IAAI,wBAAwB,CACjD,KAAK,IAAI,EAAE;YACT,MAAM,WAAW,GAAG,MAAM,cAAc,CAAC,cAAc,EAAE,CAAC;YAC1D,MAAM,SAAS,GAAG,MAAM,cAAc,CAAC,YAAY,CAAC,WAAW,CAAC,CAAC;YACjE,MAAM,UAAU,GAAG,MAAM,cAAc,CAAC,aAAa,CACnD,SAAS,EACT,YAAY,CAAC,IAAI,CAClB,CAAC;YACF,OAAO,UAAU,CAAC,KAAK,CAAC;QAC1B,CAAC,EACD,KAAK,IAAI,EAAE;YACT,IAAI,cAAc,EAAE;gBAClB,OAAO,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,CAAC,CAAC;aACpD;iBAAM;gBACL,OAAO,IAAI,CAAC;aACb;QACH,CAAC,EACD,KAAK,EAAE,KAAK,EAAE,EAAE;YACd,IAAI,cAAc,EAAE;gBAClB,MAAM,cAAc,CAAC,IAAI,CAAC,gBAAgB,EAAE,KAAK,CAAC,CAAC;aACpD;QACH,CAAC,CACF,CAAC;QAEF,IAAI,CAAC,eAAe,GAAG,GAAG,EAAE,CAAC,cAAc,CAAC,eAAe,EAAE,CAAC;IAChE,CAAC;CACF"}