halo-infinite-api 1.0.1 → 1.0.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/dist/authentication/halo-authentication-client.d.ts +14 -0
- package/dist/authentication/halo-authentication-client.js +95 -0
- package/dist/authentication/halo-authentication-client.js.map +1 -0
- package/dist/authentication/xbox-authentication-client.d.ts +28 -0
- package/dist/authentication/xbox-authentication-client.js +178 -0
- package/dist/authentication/xbox-authentication-client.js.map +1 -0
- package/dist/core/halo-infinite-client.d.ts +37 -0
- package/dist/core/halo-infinite-client.js +79 -0
- package/dist/core/halo-infinite-client.js.map +1 -0
- package/dist/endpoints/halo-core-endpoints.d.ts +14 -0
- package/dist/endpoints/halo-core-endpoints.js +15 -0
- package/dist/endpoints/halo-core-endpoints.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.js +2 -19934
- package/dist/index.js.map +1 -7
- package/dist/models/halo-infinite/playlist-csr-container.d.ts +6 -0
- package/dist/models/halo-infinite/playlist-csr-container.js +2 -0
- package/dist/models/halo-infinite/playlist-csr-container.js.map +1 -0
- package/dist/models/halo-infinite/playlist-csr.d.ts +11 -0
- package/dist/models/halo-infinite/playlist-csr.js +2 -0
- package/dist/models/halo-infinite/playlist-csr.js.map +1 -0
- package/dist/models/halo-infinite/playlist.d.ts +12 -0
- package/dist/models/halo-infinite/playlist.js +2 -0
- package/dist/models/halo-infinite/playlist.js.map +1 -0
- package/dist/models/halo-infinite/service-record.d.ts +113 -0
- package/dist/models/halo-infinite/service-record.js +2 -0
- package/dist/models/halo-infinite/service-record.js.map +1 -0
- package/dist/models/halo-infinite/skill-result.d.ts +3 -0
- package/dist/models/halo-infinite/skill-result.js +2 -0
- package/dist/models/halo-infinite/skill-result.js.map +1 -0
- package/dist/models/halo-infinite/user-info.d.ts +10 -0
- package/dist/models/halo-infinite/user-info.js +2 -0
- package/dist/models/halo-infinite/user-info.js.map +1 -0
- package/dist/models/spartan-token-proof.d.ts +4 -0
- package/dist/models/spartan-token-proof.js +2 -0
- package/dist/models/spartan-token-proof.js.map +1 -0
- package/dist/models/spartan-token-request.d.ts +6 -0
- package/dist/models/spartan-token-request.js +2 -0
- package/dist/models/spartan-token-request.js.map +1 -0
- package/dist/models/spartan-token.d.ts +7 -0
- package/dist/models/spartan-token.js +2 -0
- package/dist/models/spartan-token.js.map +1 -0
- package/dist/models/xbox-ticket.d.ts +18 -0
- package/dist/models/xbox-ticket.js +2 -0
- package/dist/models/xbox-ticket.js.map +1 -0
- package/dist/util/global-contants.d.ts +5 -0
- package/dist/util/global-contants.js +6 -0
- package/dist/util/global-contants.js.map +1 -0
- package/package.json +2 -3
- package/tsconfig.app.json +5 -2
- package/build.mts +0 -11
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
export interface Token {
|
|
3
|
+
token: string;
|
|
4
|
+
expiresAt: DateTime;
|
|
5
|
+
}
|
|
6
|
+
export declare class HaloAuthenticationClient {
|
|
7
|
+
private readonly fetchXstsToken;
|
|
8
|
+
private readonly loadToken;
|
|
9
|
+
private readonly saveToken;
|
|
10
|
+
private currentTokenPromise;
|
|
11
|
+
constructor(fetchXstsToken: () => Promise<string>, loadToken: () => Promise<Token | null>, saveToken: (token: Token) => Promise<void>);
|
|
12
|
+
getSpartanToken(): Promise<string>;
|
|
13
|
+
private fetchSpartanToken;
|
|
14
|
+
}
|
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import { DateTime } from "luxon";
|
|
3
|
+
export class HaloAuthenticationClient {
|
|
4
|
+
fetchXstsToken;
|
|
5
|
+
loadToken;
|
|
6
|
+
saveToken;
|
|
7
|
+
currentTokenPromise = undefined;
|
|
8
|
+
constructor(fetchXstsToken, loadToken, saveToken) {
|
|
9
|
+
this.fetchXstsToken = fetchXstsToken;
|
|
10
|
+
this.loadToken = loadToken;
|
|
11
|
+
this.saveToken = saveToken;
|
|
12
|
+
}
|
|
13
|
+
async getSpartanToken() {
|
|
14
|
+
if (this.currentTokenPromise) {
|
|
15
|
+
// Someone either already has a token or is in the process of getting one
|
|
16
|
+
// Wait for them to finish, then check for validity
|
|
17
|
+
const currentToken = await this.currentTokenPromise;
|
|
18
|
+
if (currentToken.expiresAt > DateTime.now()) {
|
|
19
|
+
// Current token is valid, return it
|
|
20
|
+
return currentToken.token;
|
|
21
|
+
}
|
|
22
|
+
else {
|
|
23
|
+
// Current token expired, start a new promise
|
|
24
|
+
let promiseResolver;
|
|
25
|
+
let promiseRejector;
|
|
26
|
+
this.currentTokenPromise = new Promise((resolve, reject) => {
|
|
27
|
+
promiseResolver = resolve;
|
|
28
|
+
promiseRejector = reject;
|
|
29
|
+
});
|
|
30
|
+
try {
|
|
31
|
+
const xstsToken = await this.fetchXstsToken();
|
|
32
|
+
const newToken = await this.fetchSpartanToken(xstsToken);
|
|
33
|
+
promiseResolver(newToken);
|
|
34
|
+
await this.saveToken(newToken);
|
|
35
|
+
return newToken.token;
|
|
36
|
+
}
|
|
37
|
+
catch (e) {
|
|
38
|
+
promiseRejector(e);
|
|
39
|
+
throw e;
|
|
40
|
+
}
|
|
41
|
+
}
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
// We are the first caller, create a promise to block subsequent callers
|
|
45
|
+
let promiseResolver;
|
|
46
|
+
let promiseRejector;
|
|
47
|
+
this.currentTokenPromise = new Promise((resolve, reject) => {
|
|
48
|
+
promiseResolver = resolve;
|
|
49
|
+
promiseRejector = reject;
|
|
50
|
+
});
|
|
51
|
+
try {
|
|
52
|
+
const currentToken = await this.loadToken();
|
|
53
|
+
if (currentToken && currentToken.expiresAt > DateTime.now()) {
|
|
54
|
+
// Current token is valid, return it and alert other callers if applicable
|
|
55
|
+
promiseResolver(currentToken);
|
|
56
|
+
return currentToken.token;
|
|
57
|
+
}
|
|
58
|
+
else {
|
|
59
|
+
const xstsToken = await this.fetchXstsToken();
|
|
60
|
+
const newToken = await this.fetchSpartanToken(xstsToken);
|
|
61
|
+
promiseResolver(newToken);
|
|
62
|
+
await this.saveToken(newToken);
|
|
63
|
+
return newToken.token;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
catch (e) {
|
|
67
|
+
promiseRejector(e);
|
|
68
|
+
throw e;
|
|
69
|
+
}
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
async fetchSpartanToken(xstsToken) {
|
|
73
|
+
const tokenRequest = {
|
|
74
|
+
Audience: "urn:343:s3:services",
|
|
75
|
+
MinVersion: "4",
|
|
76
|
+
Proof: [
|
|
77
|
+
{
|
|
78
|
+
Token: xstsToken,
|
|
79
|
+
TokenType: "Xbox_XSTSv3",
|
|
80
|
+
},
|
|
81
|
+
],
|
|
82
|
+
};
|
|
83
|
+
const response = await axios.post("https://settings.svc.halowaypoint.com/spartan-token", tokenRequest, {
|
|
84
|
+
headers: {
|
|
85
|
+
"User-Agent": "HaloWaypoint/2021112313511900 CFNetwork/1327.0.4 Darwin/21.2.0",
|
|
86
|
+
"Content-Type": "application/json; charset=utf-8",
|
|
87
|
+
},
|
|
88
|
+
});
|
|
89
|
+
return {
|
|
90
|
+
token: response.data.SpartanToken,
|
|
91
|
+
expiresAt: DateTime.fromISO(response.data.ExpiresUtc.ISO8601Date),
|
|
92
|
+
};
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=halo-authentication-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"halo-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/halo-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAG7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAOjC,MAAM,OAAO,wBAAwB;IAIhB;IACA;IACA;IALX,mBAAmB,GAA+B,SAAS,CAAC;IAEpE,YACmB,cAAqC,EACrC,SAAsC,EACtC,SAA0C;QAF1C,mBAAc,GAAd,cAAc,CAAuB;QACrC,cAAS,GAAT,SAAS,CAA6B;QACtC,cAAS,GAAT,SAAS,CAAiC;IAC1D,CAAC;IAEG,KAAK,CAAC,eAAe;QAC1B,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,yEAAyE;YACzE,mDAAmD;YACnD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;YAEpD,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;gBAC3C,oCAAoC;gBACpC,OAAO,YAAY,CAAC,KAAK,CAAC;aAC3B;iBAAM;gBACL,6CAA6C;gBAC7C,IAAI,eAAwC,CAAC;gBAC7C,IAAI,eAA0C,CAAC;gBAC/C,IAAI,CAAC,mBAAmB,GAAG,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAChE,eAAe,GAAG,OAAO,CAAC;oBAC1B,eAAe,GAAG,MAAM,CAAC;gBAC3B,CAAC,CAAC,CAAC;gBAEH,IAAI;oBACF,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBACzD,eAAe,CAAC,QAAQ,CAAC,CAAC;oBAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAC/B,OAAO,QAAQ,CAAC,KAAK,CAAC;iBACvB;gBAAC,OAAO,CAAC,EAAE;oBACV,eAAe,CAAC,CAAC,CAAC,CAAC;oBACnB,MAAM,CAAC,CAAC;iBACT;aACF;SACF;aAAM;YACL,wEAAwE;YACxE,IAAI,eAAwC,CAAC;YAC7C,IAAI,eAA0C,CAAC;YAC/C,IAAI,CAAC,mBAAmB,GAAG,IAAI,OAAO,CAAQ,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAChE,eAAe,GAAG,OAAO,CAAC;gBAC1B,eAAe,GAAG,MAAM,CAAC;YAC3B,CAAC,CAAC,CAAC;YAEH,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBAE5C,IAAI,YAAY,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;oBAC3D,0EAA0E;oBAC1E,eAAe,CAAC,YAAY,CAAC,CAAC;oBAC9B,OAAO,YAAY,CAAC,KAAK,CAAC;iBAC3B;qBAAM;oBACL,MAAM,SAAS,GAAG,MAAM,IAAI,CAAC,cAAc,EAAE,CAAC;oBAC9C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,iBAAiB,CAAC,SAAS,CAAC,CAAC;oBACzD,eAAe,CAAC,QAAQ,CAAC,CAAC;oBAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAC/B,OAAO,QAAQ,CAAC,KAAK,CAAC;iBACvB;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,CAAC,CAAC;aACT;SACF;IACH,CAAC;IAEO,KAAK,CAAC,iBAAiB,CAAC,SAAiB;QAC/C,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;QACF,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;YACjC,SAAS,EAAE,QAAQ,CAAC,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAC,UAAU,CAAC,WAAW,CAAC;SAClE,CAAC;IACJ,CAAC;CACF"}
|
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { DateTime } from "luxon";
|
|
2
|
+
import { XboxTicket } from "../models/xbox-ticket";
|
|
3
|
+
export declare enum RelyingParty {
|
|
4
|
+
Xbox = "http://xboxlive.com",
|
|
5
|
+
Halo = "https://prod.xsts.halowaypoint.com/"
|
|
6
|
+
}
|
|
7
|
+
export interface XboxAuthenticationToken {
|
|
8
|
+
token: string;
|
|
9
|
+
expiresAt: DateTime;
|
|
10
|
+
refreshToken: string;
|
|
11
|
+
}
|
|
12
|
+
export declare class XboxAuthenticationClient {
|
|
13
|
+
private readonly clientId;
|
|
14
|
+
private readonly redirectUri;
|
|
15
|
+
private readonly getAuthCode;
|
|
16
|
+
private readonly loadToken;
|
|
17
|
+
private readonly saveToken;
|
|
18
|
+
private currentTokenPromise;
|
|
19
|
+
private readonly httpClient;
|
|
20
|
+
constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, loadToken: () => Promise<XboxAuthenticationToken | null>, saveToken: (token: XboxAuthenticationToken) => Promise<void>);
|
|
21
|
+
private getPkce;
|
|
22
|
+
getAccessToken(): Promise<string>;
|
|
23
|
+
private fetchOauth2Token;
|
|
24
|
+
private refreshOAuth2Token;
|
|
25
|
+
getUserToken(accessToken: string): Promise<string>;
|
|
26
|
+
getXstsTicket(userToken: string, relyingParty: RelyingParty): Promise<XboxTicket>;
|
|
27
|
+
getXboxLiveV3Token: (userHash: string, userToken: string) => string;
|
|
28
|
+
}
|
|
@@ -0,0 +1,178 @@
|
|
|
1
|
+
import axios from "axios";
|
|
2
|
+
import getPkce from "oauth-pkce";
|
|
3
|
+
import { DateTime } from "luxon";
|
|
4
|
+
const SCOPES = ["Xboxlive.signin", "Xboxlive.offline_access"];
|
|
5
|
+
export var RelyingParty;
|
|
6
|
+
(function (RelyingParty) {
|
|
7
|
+
RelyingParty["Xbox"] = "http://xboxlive.com";
|
|
8
|
+
RelyingParty["Halo"] = "https://prod.xsts.halowaypoint.com/";
|
|
9
|
+
})(RelyingParty || (RelyingParty = {}));
|
|
10
|
+
export class XboxAuthenticationClient {
|
|
11
|
+
clientId;
|
|
12
|
+
redirectUri;
|
|
13
|
+
getAuthCode;
|
|
14
|
+
loadToken;
|
|
15
|
+
saveToken;
|
|
16
|
+
currentTokenPromise = undefined;
|
|
17
|
+
httpClient;
|
|
18
|
+
constructor(clientId, redirectUri, getAuthCode, loadToken, saveToken) {
|
|
19
|
+
this.clientId = clientId;
|
|
20
|
+
this.redirectUri = redirectUri;
|
|
21
|
+
this.getAuthCode = getAuthCode;
|
|
22
|
+
this.loadToken = loadToken;
|
|
23
|
+
this.saveToken = saveToken;
|
|
24
|
+
this.httpClient = axios.create();
|
|
25
|
+
}
|
|
26
|
+
getPkce() {
|
|
27
|
+
return new Promise((resolve, reject) => {
|
|
28
|
+
getPkce(43, (err, { verifier, challenge }) => {
|
|
29
|
+
if (err) {
|
|
30
|
+
reject(err);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
resolve({ verifier, challenge });
|
|
34
|
+
}
|
|
35
|
+
});
|
|
36
|
+
});
|
|
37
|
+
}
|
|
38
|
+
async getAccessToken() {
|
|
39
|
+
if (this.currentTokenPromise) {
|
|
40
|
+
// Someone either already has a token or is in the process of getting one
|
|
41
|
+
// Wait for them to finish, then check for validity
|
|
42
|
+
const currentToken = await this.currentTokenPromise;
|
|
43
|
+
if (currentToken.expiresAt > DateTime.now()) {
|
|
44
|
+
// Current token is valid, return it
|
|
45
|
+
return currentToken.token;
|
|
46
|
+
}
|
|
47
|
+
else {
|
|
48
|
+
// Current token expired, start a new promise
|
|
49
|
+
let promiseResolver;
|
|
50
|
+
let promiseRejector;
|
|
51
|
+
this.currentTokenPromise = new Promise((resolve, reject) => {
|
|
52
|
+
promiseResolver = resolve;
|
|
53
|
+
promiseRejector = reject;
|
|
54
|
+
});
|
|
55
|
+
try {
|
|
56
|
+
const newToken = await this.refreshOAuth2Token(currentToken.refreshToken);
|
|
57
|
+
promiseResolver(newToken);
|
|
58
|
+
await this.saveToken(newToken);
|
|
59
|
+
return newToken.token;
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
promiseRejector(e);
|
|
63
|
+
throw e;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
else {
|
|
68
|
+
// We are the first caller, create a promise to block subsequent callers
|
|
69
|
+
let promiseResolver;
|
|
70
|
+
let promiseRejector;
|
|
71
|
+
this.currentTokenPromise = new Promise((resolve, reject) => {
|
|
72
|
+
promiseResolver = resolve;
|
|
73
|
+
promiseRejector = reject;
|
|
74
|
+
});
|
|
75
|
+
try {
|
|
76
|
+
const currentToken = await this.loadToken();
|
|
77
|
+
if (currentToken && currentToken.expiresAt > DateTime.now()) {
|
|
78
|
+
// Current token is valid, return it and alert other callers if applicable
|
|
79
|
+
promiseResolver(currentToken);
|
|
80
|
+
return currentToken.token;
|
|
81
|
+
}
|
|
82
|
+
else {
|
|
83
|
+
const newToken = await this.fetchOauth2Token();
|
|
84
|
+
promiseResolver(newToken);
|
|
85
|
+
await this.saveToken(newToken);
|
|
86
|
+
return newToken.token;
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
catch (e) {
|
|
90
|
+
promiseRejector(e);
|
|
91
|
+
throw e;
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
async fetchOauth2Token() {
|
|
96
|
+
const { verifier, challenge } = await this.getPkce();
|
|
97
|
+
const authorizeUrl = `https://login.live.com/oauth20_authorize.srf?${new URLSearchParams({
|
|
98
|
+
client_id: this.clientId,
|
|
99
|
+
response_type: "code",
|
|
100
|
+
redirect_uri: this.redirectUri,
|
|
101
|
+
scope: SCOPES.join(" "),
|
|
102
|
+
code_challenge_method: "S256",
|
|
103
|
+
code_challenge: challenge,
|
|
104
|
+
})}`;
|
|
105
|
+
const code = await this.getAuthCode(authorizeUrl);
|
|
106
|
+
const response = await this.httpClient.post("https://login.live.com/oauth20_token.srf", new URLSearchParams({
|
|
107
|
+
grant_type: "authorization_code",
|
|
108
|
+
code,
|
|
109
|
+
approval_prompt: "auto",
|
|
110
|
+
scope: SCOPES.join(" "),
|
|
111
|
+
redirect_uri: this.redirectUri,
|
|
112
|
+
client_id: this.clientId,
|
|
113
|
+
code_verifier: verifier,
|
|
114
|
+
}), {
|
|
115
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
116
|
+
});
|
|
117
|
+
const responseDate = DateTime.fromRFC2822(response.headers["date"]);
|
|
118
|
+
return {
|
|
119
|
+
token: response.data.access_token,
|
|
120
|
+
expiresAt: responseDate.plus({ seconds: response.data.expires_in }),
|
|
121
|
+
refreshToken: response.data.refresh_token,
|
|
122
|
+
};
|
|
123
|
+
}
|
|
124
|
+
async refreshOAuth2Token(refreshToken) {
|
|
125
|
+
const response = await this.httpClient.post("https://login.live.com/oauth20_token.srf", new URLSearchParams({
|
|
126
|
+
grant_type: "refresh_token",
|
|
127
|
+
refresh_token: refreshToken,
|
|
128
|
+
scope: SCOPES.join(" "),
|
|
129
|
+
redirect_uri: this.redirectUri,
|
|
130
|
+
client_id: this.clientId,
|
|
131
|
+
}), {
|
|
132
|
+
headers: { "Content-Type": "application/x-www-form-urlencoded" },
|
|
133
|
+
});
|
|
134
|
+
const responseDate = DateTime.fromRFC2822(response.headers["date"]);
|
|
135
|
+
return {
|
|
136
|
+
token: response.data.access_token,
|
|
137
|
+
expiresAt: responseDate.plus({ seconds: response.data.expires_in }),
|
|
138
|
+
refreshToken: response.data.refresh_token,
|
|
139
|
+
};
|
|
140
|
+
}
|
|
141
|
+
async getUserToken(accessToken) {
|
|
142
|
+
const response = await this.httpClient.post("https://user.auth.xboxlive.com/user/authenticate", {
|
|
143
|
+
RelyingParty: "http://auth.xboxlive.com",
|
|
144
|
+
TokenType: "JWT",
|
|
145
|
+
Properties: {
|
|
146
|
+
AuthMethod: "RPS",
|
|
147
|
+
SiteName: "user.auth.xboxlive.com",
|
|
148
|
+
RpsTicket: `d=${accessToken}`,
|
|
149
|
+
},
|
|
150
|
+
}, {
|
|
151
|
+
headers: {
|
|
152
|
+
"Content-Type": "application/json",
|
|
153
|
+
Accept: "application/json",
|
|
154
|
+
"x-xbl-contract-version": "1",
|
|
155
|
+
},
|
|
156
|
+
});
|
|
157
|
+
return response.data.Token;
|
|
158
|
+
}
|
|
159
|
+
async getXstsTicket(userToken, relyingParty) {
|
|
160
|
+
const response = await this.httpClient.post("https://xsts.auth.xboxlive.com/xsts/authorize", {
|
|
161
|
+
RelyingParty: relyingParty,
|
|
162
|
+
TokenType: "JWT",
|
|
163
|
+
Properties: {
|
|
164
|
+
SandboxId: "RETAIL",
|
|
165
|
+
UserTokens: [userToken],
|
|
166
|
+
},
|
|
167
|
+
}, {
|
|
168
|
+
headers: {
|
|
169
|
+
"Content-Type": "application/json",
|
|
170
|
+
Accept: "application/json",
|
|
171
|
+
"x-xbl-contract-version": "1",
|
|
172
|
+
},
|
|
173
|
+
});
|
|
174
|
+
return response.data;
|
|
175
|
+
}
|
|
176
|
+
getXboxLiveV3Token = (userHash, userToken) => `XBL3.0 x=${userHash};${userToken}`;
|
|
177
|
+
}
|
|
178
|
+
//# sourceMappingURL=xbox-authentication-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xbox-authentication-client.js","sourceRoot":"","sources":["../../src/authentication/xbox-authentication-client.ts"],"names":[],"mappings":"AAAA,OAAO,KAAwB,MAAM,OAAO,CAAC;AAC7C,OAAO,OAAO,MAAM,YAAY,CAAC;AACjC,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAGjC,MAAM,MAAM,GAAG,CAAC,iBAAiB,EAAE,yBAAyB,CAAC,CAAC;AAE9D,MAAM,CAAN,IAAY,YAGX;AAHD,WAAY,YAAY;IACtB,4CAA4B,CAAA;IAC5B,4DAA4C,CAAA;AAC9C,CAAC,EAHW,YAAY,KAAZ,YAAY,QAGvB;AAQD,MAAM,OAAO,wBAAwB;IAMhB;IACA;IACA;IACA;IACA;IATX,mBAAmB,GACzB,SAAS,CAAC;IACK,UAAU,CAAgB;IAE3C,YACmB,QAAgB,EAChB,WAAmB,EACnB,WAAsD,EACtD,SAAwD,EACxD,SAEC;QAND,aAAQ,GAAR,QAAQ,CAAQ;QAChB,gBAAW,GAAX,WAAW,CAAQ;QACnB,gBAAW,GAAX,WAAW,CAA2C;QACtD,cAAS,GAAT,SAAS,CAA+C;QACxD,cAAS,GAAT,SAAS,CAER;QAElB,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC;IACnC,CAAC;IAEO,OAAO;QACb,OAAO,IAAI,OAAO,CAGf,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YACrB,OAAO,CAAC,EAAE,EAAE,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,SAAS,EAAE,EAAE,EAAE;gBAC3C,IAAI,GAAG,EAAE;oBACP,MAAM,CAAC,GAAG,CAAC,CAAC;iBACb;qBAAM;oBACL,OAAO,CAAC,EAAE,QAAQ,EAAE,SAAS,EAAE,CAAC,CAAC;iBAClC;YACH,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAEM,KAAK,CAAC,cAAc;QACzB,IAAI,IAAI,CAAC,mBAAmB,EAAE;YAC5B,yEAAyE;YACzE,mDAAmD;YACnD,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,mBAAmB,CAAC;YAEpD,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;gBAC3C,oCAAoC;gBACpC,OAAO,YAAY,CAAC,KAAK,CAAC;aAC3B;iBAAM;gBACL,6CAA6C;gBAC7C,IAAI,eAA0D,CAAC;gBAC/D,IAAI,eAA0C,CAAC;gBAC/C,IAAI,CAAC,mBAAmB,GAAG,IAAI,OAAO,CACpC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;oBAClB,eAAe,GAAG,OAAO,CAAC;oBAC1B,eAAe,GAAG,MAAM,CAAC;gBAC3B,CAAC,CACF,CAAC;gBAEF,IAAI;oBACF,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,kBAAkB,CAC5C,YAAY,CAAC,YAAY,CAC1B,CAAC;oBACF,eAAe,CAAC,QAAQ,CAAC,CAAC;oBAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAC/B,OAAO,QAAQ,CAAC,KAAK,CAAC;iBACvB;gBAAC,OAAO,CAAC,EAAE;oBACV,eAAe,CAAC,CAAC,CAAC,CAAC;oBACnB,MAAM,CAAC,CAAC;iBACT;aACF;SACF;aAAM;YACL,wEAAwE;YACxE,IAAI,eAA0D,CAAC;YAC/D,IAAI,eAA0C,CAAC;YAC/C,IAAI,CAAC,mBAAmB,GAAG,IAAI,OAAO,CACpC,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;gBAClB,eAAe,GAAG,OAAO,CAAC;gBAC1B,eAAe,GAAG,MAAM,CAAC;YAC3B,CAAC,CACF,CAAC;YAEF,IAAI;gBACF,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,SAAS,EAAE,CAAC;gBAE5C,IAAI,YAAY,IAAI,YAAY,CAAC,SAAS,GAAG,QAAQ,CAAC,GAAG,EAAE,EAAE;oBAC3D,0EAA0E;oBAC1E,eAAe,CAAC,YAAY,CAAC,CAAC;oBAC9B,OAAO,YAAY,CAAC,KAAK,CAAC;iBAC3B;qBAAM;oBACL,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,gBAAgB,EAAE,CAAC;oBAC/C,eAAe,CAAC,QAAQ,CAAC,CAAC;oBAC1B,MAAM,IAAI,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAC;oBAC/B,OAAO,QAAQ,CAAC,KAAK,CAAC;iBACvB;aACF;YAAC,OAAO,CAAC,EAAE;gBACV,eAAe,CAAC,CAAC,CAAC,CAAC;gBACnB,MAAM,CAAC,CAAC;aACT;SACF;IACH,CAAC;IAEO,KAAK,CAAC,gBAAgB;QAC5B,MAAM,EAAE,QAAQ,EAAE,SAAS,EAAE,GAAG,MAAM,IAAI,CAAC,OAAO,EAAE,CAAC;QAErD,MAAM,YAAY,GAAG,gDAAgD,IAAI,eAAe,CACtF;YACE,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,aAAa,EAAE,MAAM;YACrB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,qBAAqB,EAAE,MAAM;YAC7B,cAAc,EAAE,SAAS;SAC1B,CACF,EAAE,CAAC;QAEJ,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,WAAW,CAAC,YAAY,CAAC,CAAC;QAElD,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAQzC,0CAA0C,EAC1C,IAAI,eAAe,CAAC;YAClB,UAAU,EAAE,oBAAoB;YAChC,IAAI;YACJ,eAAe,EAAE,MAAM;YACvB,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,SAAS,EAAE,IAAI,CAAC,QAAQ;YACxB,aAAa,EAAE,QAAQ;SACxB,CAAC,EACF;YACE,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;SACjE,CACF,CAAC;QAEF,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;YACjC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa;SAC1C,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,kBAAkB,CAC9B,YAAoB;QAEpB,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CAQzC,0CAA0C,EAC1C,IAAI,eAAe,CAAC;YAClB,UAAU,EAAE,eAAe;YAC3B,aAAa,EAAE,YAAY;YAC3B,KAAK,EAAE,MAAM,CAAC,IAAI,CAAC,GAAG,CAAC;YACvB,YAAY,EAAE,IAAI,CAAC,WAAW;YAC9B,SAAS,EAAE,IAAI,CAAC,QAAQ;SACzB,CAAC,EACF;YACE,OAAO,EAAE,EAAE,cAAc,EAAE,mCAAmC,EAAE;SACjE,CACF,CAAC;QAEF,MAAM,YAAY,GAAG,QAAQ,CAAC,WAAW,CAAC,QAAQ,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC;QACpE,OAAO;YACL,KAAK,EAAE,QAAQ,CAAC,IAAI,CAAC,YAAY;YACjC,SAAS,EAAE,YAAY,CAAC,IAAI,CAAC,EAAE,OAAO,EAAE,QAAQ,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACnE,YAAY,EAAE,QAAQ,CAAC,IAAI,CAAC,aAAa;SAC1C,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,YAAY,CAAC,WAAmB;QAC3C,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACzC,kDAAkD,EAClD;YACE,YAAY,EAAE,0BAA0B;YACxC,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE;gBACV,UAAU,EAAE,KAAK;gBACjB,QAAQ,EAAE,wBAAwB;gBAClC,SAAS,EAAE,KAAK,WAAW,EAAE;aAC9B;SACF,EACD;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,wBAAwB,EAAE,GAAG;aAC9B;SACF,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC,KAAK,CAAC;IAC7B,CAAC;IAEM,KAAK,CAAC,aAAa,CAAC,SAAiB,EAAE,YAA0B;QACtE,MAAM,QAAQ,GAAG,MAAM,IAAI,CAAC,UAAU,CAAC,IAAI,CACzC,+CAA+C,EAC/C;YACE,YAAY,EAAE,YAAY;YAC1B,SAAS,EAAE,KAAK;YAChB,UAAU,EAAE;gBACV,SAAS,EAAE,QAAQ;gBACnB,UAAU,EAAE,CAAC,SAAS,CAAC;aACxB;SACF,EACD;YACE,OAAO,EAAE;gBACP,cAAc,EAAE,kBAAkB;gBAClC,MAAM,EAAE,kBAAkB;gBAC1B,wBAAwB,EAAE,GAAG;aAC9B;SACF,CACF,CAAC;QAEF,OAAO,QAAQ,CAAC,IAAI,CAAC;IACvB,CAAC;IAEM,kBAAkB,GAAG,CAAC,QAAgB,EAAE,SAAiB,EAAE,EAAE,CAClE,YAAY,QAAQ,IAAI,SAAS,EAAE,CAAC;CACvC"}
|
|
@@ -0,0 +1,37 @@
|
|
|
1
|
+
import { PlaylistCsrContainer } from "../models/halo-infinite/playlist-csr-container";
|
|
2
|
+
import { UserInfo } from "../models/halo-infinite/user-info";
|
|
3
|
+
import { ServiceRecord } from "../models/halo-infinite/service-record";
|
|
4
|
+
import { Playlist } from "../models/halo-infinite/playlist";
|
|
5
|
+
interface ResultContainer<TValue> {
|
|
6
|
+
Id: string;
|
|
7
|
+
ResultCode: number;
|
|
8
|
+
Result: TValue;
|
|
9
|
+
}
|
|
10
|
+
interface TokenPersister {
|
|
11
|
+
load: <T>(tokenName: string) => Promise<T>;
|
|
12
|
+
save: (tokenName: string, token: unknown) => Promise<void>;
|
|
13
|
+
}
|
|
14
|
+
export declare class HaloInfiniteClient {
|
|
15
|
+
private readonly haloAuthClient;
|
|
16
|
+
constructor(clientId: string, redirectUri: string, getAuthCode: (authorizeUrl: string) => Promise<string>, tokenPersister?: TokenPersister);
|
|
17
|
+
private executeRequest;
|
|
18
|
+
private executeArrayRequest;
|
|
19
|
+
/** Gets playlist Competitive Skill Rank (CSR) for a player or a set of players.
|
|
20
|
+
* @param playlistId - Unique ID for the playlist.
|
|
21
|
+
* @param playerIds - Array of player xuids.
|
|
22
|
+
*/
|
|
23
|
+
getPlaylistCsr: (playlistId: string, playerIds: string[]) => Promise<ResultContainer<PlaylistCsrContainer>[]>;
|
|
24
|
+
/** Get gamertag info for a player.
|
|
25
|
+
* @param gamerTag - Gamertag to lookup.
|
|
26
|
+
*/
|
|
27
|
+
getUser: (gamerTag: string) => Promise<UserInfo>;
|
|
28
|
+
/** Get service record for a player.
|
|
29
|
+
* @param gamerTag - Gamertag to lookup.
|
|
30
|
+
*/
|
|
31
|
+
getUserServiceRecord: (gamerTag: string) => Promise<ServiceRecord>;
|
|
32
|
+
/** Get playlist information
|
|
33
|
+
* @param playlistId - Unique ID for the playlist.
|
|
34
|
+
*/
|
|
35
|
+
getPlaylist: (playlistId: string) => Promise<Playlist>;
|
|
36
|
+
}
|
|
37
|
+
export {};
|
|
@@ -0,0 +1,79 @@
|
|
|
1
|
+
import axios, { AxiosHeaders } from "axios";
|
|
2
|
+
import { HaloCoreEndpoints } from "../endpoints/halo-core-endpoints";
|
|
3
|
+
import { GlobalConstants } from "../util/global-contants";
|
|
4
|
+
import { RelyingParty, XboxAuthenticationClient, } from "../authentication/xbox-authentication-client";
|
|
5
|
+
import { HaloAuthenticationClient } from "../authentication/halo-authentication-client";
|
|
6
|
+
export class HaloInfiniteClient {
|
|
7
|
+
haloAuthClient;
|
|
8
|
+
constructor(clientId, redirectUri, getAuthCode, tokenPersister) {
|
|
9
|
+
const xboxAuthClient = new XboxAuthenticationClient(clientId, redirectUri, getAuthCode, async () => {
|
|
10
|
+
if (tokenPersister) {
|
|
11
|
+
return await tokenPersister.load("xbox.authToken");
|
|
12
|
+
}
|
|
13
|
+
else {
|
|
14
|
+
return null;
|
|
15
|
+
}
|
|
16
|
+
}, async (token) => {
|
|
17
|
+
if (tokenPersister) {
|
|
18
|
+
await tokenPersister.save("xbox.authToken", token);
|
|
19
|
+
}
|
|
20
|
+
});
|
|
21
|
+
this.haloAuthClient = new HaloAuthenticationClient(async () => {
|
|
22
|
+
const accessToken = await xboxAuthClient.getAccessToken();
|
|
23
|
+
const userToken = await xboxAuthClient.getUserToken(accessToken);
|
|
24
|
+
const xstsTicket = await xboxAuthClient.getXstsTicket(userToken, RelyingParty.Halo);
|
|
25
|
+
return xstsTicket.Token;
|
|
26
|
+
}, async () => {
|
|
27
|
+
if (tokenPersister) {
|
|
28
|
+
return await tokenPersister.load("halo.authToken");
|
|
29
|
+
}
|
|
30
|
+
else {
|
|
31
|
+
return null;
|
|
32
|
+
}
|
|
33
|
+
}, async (token) => {
|
|
34
|
+
if (tokenPersister) {
|
|
35
|
+
await tokenPersister.save("halo.authToken", token);
|
|
36
|
+
}
|
|
37
|
+
});
|
|
38
|
+
}
|
|
39
|
+
async executeRequest(url, method, useSpartanToken = true, useClearance = false, userAgent = GlobalConstants.HALO_WAYPOINT_USER_AGENT) {
|
|
40
|
+
const headers = new AxiosHeaders({
|
|
41
|
+
"User-Agent": userAgent,
|
|
42
|
+
Accept: "application/json",
|
|
43
|
+
});
|
|
44
|
+
if (useSpartanToken) {
|
|
45
|
+
headers.set("x-343-authorization-spartan", await this.haloAuthClient.getSpartanToken());
|
|
46
|
+
}
|
|
47
|
+
if (useClearance) {
|
|
48
|
+
throw new Error("TODO: Implement clearance");
|
|
49
|
+
}
|
|
50
|
+
const response = await axios.request({
|
|
51
|
+
url,
|
|
52
|
+
method,
|
|
53
|
+
headers,
|
|
54
|
+
});
|
|
55
|
+
return response.data;
|
|
56
|
+
}
|
|
57
|
+
async executeArrayRequest(...args) {
|
|
58
|
+
const result = await this.executeRequest(...args);
|
|
59
|
+
return result.Value;
|
|
60
|
+
}
|
|
61
|
+
/** Gets playlist Competitive Skill Rank (CSR) for a player or a set of players.
|
|
62
|
+
* @param playlistId - Unique ID for the playlist.
|
|
63
|
+
* @param playerIds - Array of player xuids.
|
|
64
|
+
*/
|
|
65
|
+
getPlaylistCsr = (playlistId, playerIds) => this.executeArrayRequest(`https://${HaloCoreEndpoints.SkillOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/playlist/${playlistId}/csrs?players=xuid(${playerIds.join("),xuid(")})`, "get");
|
|
66
|
+
/** Get gamertag info for a player.
|
|
67
|
+
* @param gamerTag - Gamertag to lookup.
|
|
68
|
+
*/
|
|
69
|
+
getUser = (gamerTag) => this.executeRequest(`https://${HaloCoreEndpoints.Profile}.${HaloCoreEndpoints.ServiceDomain}/users/gt(${gamerTag})`, "get");
|
|
70
|
+
/** Get service record for a player.
|
|
71
|
+
* @param gamerTag - Gamertag to lookup.
|
|
72
|
+
*/
|
|
73
|
+
getUserServiceRecord = (gamerTag) => this.executeRequest(`https://${HaloCoreEndpoints.StatsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/players/${gamerTag}/Matchmade/servicerecord`, "get");
|
|
74
|
+
/** Get playlist information
|
|
75
|
+
* @param playlistId - Unique ID for the playlist.
|
|
76
|
+
*/
|
|
77
|
+
getPlaylist = (playlistId) => this.executeRequest(`https://${HaloCoreEndpoints.GameCmsOrigin}.${HaloCoreEndpoints.ServiceDomain}/hi/multiplayer/file/playlists/assets/${playlistId}.json`, "get");
|
|
78
|
+
}
|
|
79
|
+
//# sourceMappingURL=halo-infinite-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
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,14 @@
|
|
|
1
|
+
export declare const HaloCoreEndpoints: {
|
|
2
|
+
/** Endpoint used to produce the Spartan token. */
|
|
3
|
+
SpartanTokenEndpoint: string;
|
|
4
|
+
/** Skill origin */
|
|
5
|
+
SkillOrigin: string;
|
|
6
|
+
/** Profile origin */
|
|
7
|
+
Profile: string;
|
|
8
|
+
/** Stats origin */
|
|
9
|
+
StatsOrigin: string;
|
|
10
|
+
/** Game CMS origin */
|
|
11
|
+
GameCmsOrigin: string;
|
|
12
|
+
/** Service domain */
|
|
13
|
+
ServiceDomain: string;
|
|
14
|
+
};
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
export const HaloCoreEndpoints = {
|
|
2
|
+
/** Endpoint used to produce the Spartan token. */
|
|
3
|
+
SpartanTokenEndpoint: "https://settings.svc.halowaypoint.com/spartan-token",
|
|
4
|
+
/** Skill origin */
|
|
5
|
+
SkillOrigin: "skill",
|
|
6
|
+
/** Profile origin */
|
|
7
|
+
Profile: "profile",
|
|
8
|
+
/** Stats origin */
|
|
9
|
+
StatsOrigin: "halostats",
|
|
10
|
+
/** Game CMS origin */
|
|
11
|
+
GameCmsOrigin: "gamecms-hacs",
|
|
12
|
+
/** Service domain */
|
|
13
|
+
ServiceDomain: "svc.halowaypoint.com:443",
|
|
14
|
+
};
|
|
15
|
+
//# sourceMappingURL=halo-core-endpoints.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"halo-core-endpoints.js","sourceRoot":"","sources":["../../src/endpoints/halo-core-endpoints.ts"],"names":[],"mappings":"AAAA,MAAM,CAAC,MAAM,iBAAiB,GAAG;IAC/B,kDAAkD;IAClD,oBAAoB,EAAE,qDAAqD;IAE3E,mBAAmB;IACnB,WAAW,EAAE,OAAO;IACpB,qBAAqB;IACrB,OAAO,EAAE,SAAS;IAClB,mBAAmB;IACnB,WAAW,EAAE,WAAW;IACxB,sBAAsB;IACtB,aAAa,EAAE,cAAc;IAE7B,qBAAqB;IACrB,aAAa,EAAE,0BAA0B;CAC1C,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,5 @@
|
|
|
1
|
+
export { HaloInfiniteClient } from "./core/halo-infinite-client";
|
|
2
|
+
export { Playlist } from "./models/halo-infinite/playlist";
|
|
3
|
+
export { PlaylistCsrContainer } from "./models/halo-infinite/playlist-csr-container";
|
|
4
|
+
export { UserInfo } from "./models/halo-infinite/user-info";
|
|
5
|
+
export { ServiceRecord } from "./models/halo-infinite/service-record";
|