@blizzard-api/client 0.0.8 → 0.1.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/README.md +44 -0
- package/dist/index.cjs +48 -6
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +5 -4
- package/dist/index.d.ts +5 -4
- package/dist/index.js +48 -6
- package/dist/index.js.map +1 -1
- package/package.json +5 -5
package/README.md
ADDED
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
# @blizzard-api/client
|
|
2
|
+
|
|
3
|
+
This package provides a client that is meant to be used together with one or more of the packages dedicated to a blizzard game.
|
|
4
|
+
|
|
5
|
+
Currently available packages are:
|
|
6
|
+
|
|
7
|
+
- `@blizzard-api/wow`
|
|
8
|
+
|
|
9
|
+
Planned packages are:
|
|
10
|
+
|
|
11
|
+
- `@blizzard-api/d3`
|
|
12
|
+
- `@blizzard-api/hs`
|
|
13
|
+
- `@blizzard-api/owl`
|
|
14
|
+
- `@blizzard-api/sc2`
|
|
15
|
+
- `@blizzard-api/wow-classic`
|
|
16
|
+
|
|
17
|
+
## Installation
|
|
18
|
+
|
|
19
|
+
```sh
|
|
20
|
+
npm i @blizzard-api/client
|
|
21
|
+
```
|
|
22
|
+
|
|
23
|
+
## Usage
|
|
24
|
+
|
|
25
|
+
```ts
|
|
26
|
+
import { createBlizzardApiClient } from '@blizzard-api/client';
|
|
27
|
+
import { wow } from '@blizzard-api/wow';
|
|
28
|
+
|
|
29
|
+
const client = await createBlizzardApiClient({
|
|
30
|
+
key: 'environment.blizzardClientId',
|
|
31
|
+
secret: 'environment.blizzardClientSecret',
|
|
32
|
+
origin: 'eu',
|
|
33
|
+
});
|
|
34
|
+
|
|
35
|
+
//Response will automatically be typed with the appropriate values
|
|
36
|
+
const response = await client.sendRequest(wow.commodities());
|
|
37
|
+
|
|
38
|
+
console.log(response.data);
|
|
39
|
+
^ typeof AuctionHouseCommoditiesResponse
|
|
40
|
+
```
|
|
41
|
+
|
|
42
|
+
## Authentication
|
|
43
|
+
|
|
44
|
+
Please refer to the [battle.net documentation](https://develop.battle.net/documentation/guides/getting-started) for guides on how to obtain Blizzard API credentials.
|
package/dist/index.cjs
CHANGED
|
@@ -30,18 +30,18 @@ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: tru
|
|
|
30
30
|
// src/index.ts
|
|
31
31
|
var src_exports = {};
|
|
32
32
|
__export(src_exports, {
|
|
33
|
-
|
|
33
|
+
createBlizzardApiClient: () => createBlizzardApiClient
|
|
34
34
|
});
|
|
35
35
|
module.exports = __toCommonJS(src_exports);
|
|
36
36
|
|
|
37
|
-
// src/client/
|
|
37
|
+
// src/client/client.ts
|
|
38
38
|
var import_node_querystring = require("querystring");
|
|
39
39
|
var import_core = require("@blizzard-api/core");
|
|
40
40
|
var import_axios = __toESM(require("axios"), 1);
|
|
41
41
|
var BlizzardApiClient = class {
|
|
42
42
|
defaults;
|
|
43
43
|
constructor(options) {
|
|
44
|
-
const { origin, locale } = (0, import_core.
|
|
44
|
+
const { origin, locale } = (0, import_core.getBlizzardApi)(options.origin, options.locale);
|
|
45
45
|
this.defaults = {
|
|
46
46
|
key: options.key,
|
|
47
47
|
secret: options.secret,
|
|
@@ -53,13 +53,13 @@ var BlizzardApiClient = class {
|
|
|
53
53
|
axios = import_axios.default.create();
|
|
54
54
|
getRequestUrl(resource, options) {
|
|
55
55
|
const config = { ...this.defaults, ...options };
|
|
56
|
-
const endpoint = (0, import_core.
|
|
56
|
+
const endpoint = (0, import_core.getBlizzardApi)(config.origin, config.locale);
|
|
57
57
|
const backslashSeparator = resource.path.startsWith("/") ? "" : "/";
|
|
58
58
|
return `${endpoint.hostname}${backslashSeparator}${resource.path}`;
|
|
59
59
|
}
|
|
60
60
|
getRequestConfig(resource, options, headers) {
|
|
61
61
|
const config = { ...this.defaults, ...options };
|
|
62
|
-
const endpoint = (0, import_core.
|
|
62
|
+
const endpoint = (0, import_core.getBlizzardApi)(config.origin, config.locale);
|
|
63
63
|
const namespace = resource.namespace ? { "Battlenet-Namespace": `${resource.namespace}-${endpoint.origin}` } : void 0;
|
|
64
64
|
return {
|
|
65
65
|
headers: {
|
|
@@ -118,8 +118,50 @@ var BlizzardApiClient = class {
|
|
|
118
118
|
);
|
|
119
119
|
};
|
|
120
120
|
};
|
|
121
|
+
|
|
122
|
+
// src/client/create-client.ts
|
|
123
|
+
var getTokenExpiration = (expiresIn) => expiresIn * 1e3 - 6e4;
|
|
124
|
+
var createBlizzardApiClient = async (options, onTokenRefresh = true) => {
|
|
125
|
+
const { key, secret, token } = options;
|
|
126
|
+
if (!key) {
|
|
127
|
+
throw new Error(`Client missing 'key' parameter`);
|
|
128
|
+
}
|
|
129
|
+
if (!secret) {
|
|
130
|
+
throw new Error(`Client missing 'secret' parameter`);
|
|
131
|
+
}
|
|
132
|
+
const client = new BlizzardApiClient(options);
|
|
133
|
+
const refreshToken = async () => {
|
|
134
|
+
const response = await client.getAccessToken();
|
|
135
|
+
client.setAccessToken(response.data.access_token);
|
|
136
|
+
if (typeof onTokenRefresh === "function") {
|
|
137
|
+
onTokenRefresh?.(response.data);
|
|
138
|
+
}
|
|
139
|
+
const timeout = setTimeout(() => void refreshToken(), getTokenExpiration(response.data.expires_in));
|
|
140
|
+
timeout.unref();
|
|
141
|
+
};
|
|
142
|
+
if (!onTokenRefresh) {
|
|
143
|
+
return client;
|
|
144
|
+
}
|
|
145
|
+
if (token) {
|
|
146
|
+
try {
|
|
147
|
+
const validatedToken = await client.validateAccessToken({ token });
|
|
148
|
+
const expiry = getTokenExpiration(validatedToken.data.exp);
|
|
149
|
+
if (expiry - Date.now() < 6e4) {
|
|
150
|
+
await refreshToken();
|
|
151
|
+
} else {
|
|
152
|
+
const timeout = setTimeout(() => void refreshToken(), expiry - Date.now());
|
|
153
|
+
timeout.unref();
|
|
154
|
+
}
|
|
155
|
+
} catch {
|
|
156
|
+
await refreshToken();
|
|
157
|
+
}
|
|
158
|
+
} else {
|
|
159
|
+
await refreshToken();
|
|
160
|
+
}
|
|
161
|
+
return client;
|
|
162
|
+
};
|
|
121
163
|
// Annotate the CommonJS export names for ESM import in node:
|
|
122
164
|
0 && (module.exports = {
|
|
123
|
-
|
|
165
|
+
createBlizzardApiClient
|
|
124
166
|
});
|
|
125
167
|
//# sourceMappingURL=index.cjs.map
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/index.ts","../src/client/index.ts"],"sourcesContent":["export { BlizzardApiClient } from './client/index.js';\r\nexport * from './client/types';\r\n","import { stringify } from 'node:querystring';\r\nimport { getEndpoint } from '@blizzard-api/core';\r\nimport type { Origins, Locales, ResourceResponse, Resource } from '@blizzard-api/core';\r\nimport type { AxiosResponse } from 'axios';\r\nimport axios from 'axios';\r\nimport type {\r\n AccessToken,\r\n AccessTokenRequestArguments,\r\n ClientOptions,\r\n IBlizzardApiClient,\r\n ValidateAccessTokenArguments,\r\n ValidateAccessTokenResponse,\r\n} from './types';\r\n\r\nexport class BlizzardApiClient implements IBlizzardApiClient {\r\n public defaults: {\r\n key: string;\r\n secret: string;\r\n origin: Origins;\r\n locale: Locales;\r\n token?: string;\r\n };\r\n\r\n constructor(options: ClientOptions) {\r\n const { origin, locale } = getEndpoint(options.origin, options.locale);\r\n this.defaults = {\r\n key: options.key,\r\n secret: options.secret,\r\n token: options.token,\r\n origin: origin,\r\n locale: locale,\r\n };\r\n }\r\n\r\n public axios = axios.create();\r\n\r\n public getRequestUrl<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n ) {\r\n const config = { ...this.defaults, ...options };\r\n const endpoint = getEndpoint(config.origin, config.locale);\r\n\r\n const backslashSeparator = resource.path.startsWith('/') ? '' : '/';\r\n\r\n return `${endpoint.hostname}${backslashSeparator}${resource.path}`;\r\n }\r\n\r\n public getRequestConfig<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n headers?: Record<string, string>,\r\n ) {\r\n const config = { ...this.defaults, ...options };\r\n const endpoint = getEndpoint(config.origin, config.locale);\r\n\r\n const namespace = resource.namespace\r\n ? { 'Battlenet-Namespace': `${resource.namespace}-${endpoint.origin}` }\r\n : undefined;\r\n\r\n return {\r\n headers: {\r\n ...headers,\r\n ...namespace,\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${config.token}`,\r\n },\r\n params: {\r\n locale: endpoint.locale,\r\n ...resource.parameters,\r\n },\r\n };\r\n }\r\n\r\n public sendRequest<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n headers?: Record<string, string>,\r\n ): ResourceResponse<AxiosResponse<T>> {\r\n const url = this.getRequestUrl(resource, options);\r\n const config = this.getRequestConfig(resource, options, headers);\r\n\r\n return this.axios.get<T>(url, config);\r\n }\r\n\r\n public getAccessToken = async (options?: AccessTokenRequestArguments): Promise<AxiosResponse<AccessToken>> => {\r\n const { key, secret, origin } = { ...this.defaults, ...options };\r\n return this.axios.post<AccessToken>(`https://${origin}.battle.net/oauth/token`, undefined, {\r\n params: {\r\n grant_type: 'client_credentials',\r\n },\r\n auth: {\r\n username: key,\r\n password: secret,\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n };\r\n\r\n public setAccessToken = (token: string): void => {\r\n this.defaults.token = token;\r\n };\r\n\r\n public refreshAccessToken = async (options?: AccessTokenRequestArguments): Promise<AxiosResponse<AccessToken>> => {\r\n const response = await this.getAccessToken(options);\r\n this.setAccessToken(response.data.access_token);\r\n return response;\r\n };\r\n\r\n public validateAccessToken = async (\r\n options?: ValidateAccessTokenArguments,\r\n ): Promise<AxiosResponse<ValidateAccessTokenResponse>> => {\r\n const { origin, token } = { ...this.defaults, ...options };\r\n\r\n if (!token) {\r\n throw new Error('No token has been set previously or been passed to the validateAccessToken method.');\r\n }\r\n\r\n return await this.axios.post<ValidateAccessTokenResponse>(\r\n `https://${origin}.battle.net/oauth/check_token`,\r\n stringify({ token }),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n },\r\n );\r\n };\r\n}\r\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACAA,8BAA0B;AAC1B,kBAA4B;AAG5B,mBAAkB;AAUX,IAAM,oBAAN,MAAsD;AAAA,EACpD;AAAA,EAQP,YAAY,SAAwB;AAClC,UAAM,EAAE,QAAQ,OAAO,QAAI,yBAAY,QAAQ,QAAQ,QAAQ,MAAM;AACrE,SAAK,WAAW;AAAA,MACd,KAAK,QAAQ;AAAA,MACb,QAAQ,QAAQ;AAAA,MAChB,OAAO,QAAQ;AAAA,MACf;AAAA,MACA;AAAA,IACF;AAAA,EACF;AAAA,EAEO,QAAQ,aAAAA,QAAM,OAAO;AAAA,EAErB,cACL,UACA,SACA;AACA,UAAM,SAAS,EAAE,GAAG,KAAK,UAAU,GAAG,QAAQ;AAC9C,UAAM,eAAW,yBAAY,OAAO,QAAQ,OAAO,MAAM;AAEzD,UAAM,qBAAqB,SAAS,KAAK,WAAW,GAAG,IAAI,KAAK;AAEhE,WAAO,GAAG,SAAS,QAAQ,GAAG,kBAAkB,GAAG,SAAS,IAAI;AAAA,EAClE;AAAA,EAEO,iBACL,UACA,SACA,SACA;AACA,UAAM,SAAS,EAAE,GAAG,KAAK,UAAU,GAAG,QAAQ;AAC9C,UAAM,eAAW,yBAAY,OAAO,QAAQ,OAAO,MAAM;AAEzD,UAAM,YAAY,SAAS,YACvB,EAAE,uBAAuB,GAAG,SAAS,SAAS,IAAI,SAAS,MAAM,GAAG,IACpE;AAEJ,WAAO;AAAA,MACL,SAAS;AAAA,QACP,GAAG;AAAA,QACH,GAAG;AAAA,QACH,gBAAgB;AAAA,QAChB,eAAe,UAAU,OAAO,KAAK;AAAA,MACvC;AAAA,MACA,QAAQ;AAAA,QACN,QAAQ,SAAS;AAAA,QACjB,GAAG,SAAS;AAAA,MACd;AAAA,IACF;AAAA,EACF;AAAA,EAEO,YACL,UACA,SACA,SACoC;AACpC,UAAM,MAAM,KAAK,cAAc,UAAU,OAAO;AAChD,UAAM,SAAS,KAAK,iBAAiB,UAAU,SAAS,OAAO;AAE/D,WAAO,KAAK,MAAM,IAAO,KAAK,MAAM;AAAA,EACtC;AAAA,EAEO,iBAAiB,OAAO,YAA+E;AAC5G,UAAM,EAAE,KAAK,QAAQ,OAAO,IAAI,EAAE,GAAG,KAAK,UAAU,GAAG,QAAQ;AAC/D,WAAO,KAAK,MAAM,KAAkB,WAAW,MAAM,2BAA2B,QAAW;AAAA,MACzF,QAAQ;AAAA,QACN,YAAY;AAAA,MACd;AAAA,MACA,MAAM;AAAA,QACJ,UAAU;AAAA,QACV,UAAU;AAAA,MACZ;AAAA,MACA,SAAS;AAAA,QACP,gBAAgB;AAAA,MAClB;AAAA,IACF,CAAC;AAAA,EACH;AAAA,EAEO,iBAAiB,CAAC,UAAwB;AAC/C,SAAK,SAAS,QAAQ;AAAA,EACxB;AAAA,EAEO,qBAAqB,OAAO,YAA+E;AAChH,UAAM,WAAW,MAAM,KAAK,eAAe,OAAO;AAClD,SAAK,eAAe,SAAS,KAAK,YAAY;AAC9C,WAAO;AAAA,EACT;AAAA,EAEO,sBAAsB,OAC3B,YACwD;AACxD,UAAM,EAAE,QAAQ,MAAM,IAAI,EAAE,GAAG,KAAK,UAAU,GAAG,QAAQ;AAEzD,QAAI,CAAC,OAAO;AACV,YAAM,IAAI,MAAM,oFAAoF;AAAA,IACtG;AAEA,WAAO,MAAM,KAAK,MAAM;AAAA,MACtB,WAAW,MAAM;AAAA,UACjB,mCAAU,EAAE,MAAM,CAAC;AAAA,MACnB;AAAA,QACE,SAAS;AAAA,UACP,gBAAgB;AAAA,QAClB;AAAA,MACF;AAAA,IACF;AAAA,EACF;AACF;","names":["axios"]}
|
|
1
|
+
{"version":3,"sources":["../src/index.ts","../src/client/client.ts","../src/client/create-client.ts"],"sourcesContent":["export { createBlizzardApiClient } from './client/create-client';\r\nexport * from './client/types';\r\n","import { stringify } from 'node:querystring';\r\nimport { getBlizzardApi } from '@blizzard-api/core';\r\nimport type { Origins, Locales, ResourceResponse, Resource } from '@blizzard-api/core';\r\nimport type { AxiosResponse } from 'axios';\r\nimport axios from 'axios';\r\nimport type {\r\n AccessToken,\r\n AccessTokenRequestArguments,\r\n ClientOptions,\r\n IBlizzardApiClient,\r\n ValidateAccessTokenArguments,\r\n ValidateAccessTokenResponse,\r\n} from './types';\r\n\r\nexport class BlizzardApiClient implements IBlizzardApiClient {\r\n public defaults: {\r\n key: string;\r\n secret: string;\r\n origin: Origins;\r\n locale: Locales;\r\n token?: string;\r\n };\r\n\r\n constructor(options: ClientOptions) {\r\n const { origin, locale } = getBlizzardApi(options.origin, options.locale);\r\n this.defaults = {\r\n key: options.key,\r\n secret: options.secret,\r\n token: options.token,\r\n origin: origin,\r\n locale: locale,\r\n };\r\n }\r\n\r\n private axios = axios.create();\r\n\r\n public getRequestUrl<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n ) {\r\n const config = { ...this.defaults, ...options };\r\n const endpoint = getBlizzardApi(config.origin, config.locale);\r\n\r\n const backslashSeparator = resource.path.startsWith('/') ? '' : '/';\r\n\r\n return `${endpoint.hostname}${backslashSeparator}${resource.path}`;\r\n }\r\n\r\n public getRequestConfig<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n headers?: Record<string, string>,\r\n ) {\r\n const config = { ...this.defaults, ...options };\r\n const endpoint = getBlizzardApi(config.origin, config.locale);\r\n\r\n const namespace = resource.namespace\r\n ? { 'Battlenet-Namespace': `${resource.namespace}-${endpoint.origin}` }\r\n : undefined;\r\n\r\n return {\r\n headers: {\r\n ...headers,\r\n ...namespace,\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${config.token}`,\r\n },\r\n params: {\r\n locale: endpoint.locale,\r\n ...resource.parameters,\r\n },\r\n };\r\n }\r\n\r\n public sendRequest<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n headers?: Record<string, string>,\r\n ): ResourceResponse<AxiosResponse<T>> {\r\n const url = this.getRequestUrl(resource, options);\r\n const config = this.getRequestConfig(resource, options, headers);\r\n\r\n return this.axios.get<T>(url, config);\r\n }\r\n\r\n public getAccessToken = async (options?: AccessTokenRequestArguments): Promise<AxiosResponse<AccessToken>> => {\r\n const { key, secret, origin } = { ...this.defaults, ...options };\r\n return this.axios.post<AccessToken>(`https://${origin}.battle.net/oauth/token`, undefined, {\r\n params: {\r\n grant_type: 'client_credentials',\r\n },\r\n auth: {\r\n username: key,\r\n password: secret,\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n };\r\n\r\n public setAccessToken = (token: string): void => {\r\n this.defaults.token = token;\r\n };\r\n\r\n public refreshAccessToken = async (options?: AccessTokenRequestArguments): Promise<AxiosResponse<AccessToken>> => {\r\n const response = await this.getAccessToken(options);\r\n this.setAccessToken(response.data.access_token);\r\n return response;\r\n };\r\n\r\n public validateAccessToken = async (\r\n options?: ValidateAccessTokenArguments,\r\n ): Promise<AxiosResponse<ValidateAccessTokenResponse>> => {\r\n const { origin, token } = { ...this.defaults, ...options };\r\n\r\n if (!token) {\r\n throw new Error('No token has been set previously or been passed to the validateAccessToken method.');\r\n }\r\n\r\n return await this.axios.post<ValidateAccessTokenResponse>(\r\n `https://${origin}.battle.net/oauth/check_token`,\r\n stringify({ token }),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n },\r\n );\r\n };\r\n}\r\n","import { BlizzardApiClient } from './client';\r\nimport type { AccessToken, ClientOptions } from './types';\r\n\r\nconst getTokenExpiration = (expiresIn: number) => expiresIn * 1000 - 60_000;\r\n\r\nexport const createBlizzardApiClient = async (\r\n /**\r\n * Client options.\r\n * @see ClientOptions\r\n * @see https://develop.battle.net/documentation/guides/getting-started\r\n */\r\n options: ClientOptions,\r\n /**\r\n * Callback function to handle token refresh.\r\n *\r\n * If set to `true`, the client will automatically refresh the token.\r\n *\r\n * If set to `false`, the client will not refresh the token.\r\n *\r\n * If set to a function, the function will be called with the new token.\r\n */\r\n onTokenRefresh: boolean | ((token: AccessToken) => void) = true,\r\n): Promise<BlizzardApiClient> => {\r\n const { key, secret, token } = options;\r\n if (!key) {\r\n throw new Error(`Client missing 'key' parameter`);\r\n }\r\n if (!secret) {\r\n throw new Error(`Client missing 'secret' parameter`);\r\n }\r\n\r\n const client = new BlizzardApiClient(options);\r\n\r\n const refreshToken = async () => {\r\n const response = await client.getAccessToken();\r\n\r\n client.setAccessToken(response.data.access_token);\r\n\r\n if (typeof onTokenRefresh === 'function') {\r\n onTokenRefresh?.(response.data);\r\n }\r\n\r\n //Schedule a refresh of the token\r\n const timeout = setTimeout(() => void refreshToken(), getTokenExpiration(response.data.expires_in));\r\n timeout.unref();\r\n };\r\n\r\n //If tokenRefresh is false, return the client without refreshing the token\r\n if (!onTokenRefresh) {\r\n return client;\r\n }\r\n\r\n if (token) {\r\n try {\r\n //If token is set, validate the token\r\n const validatedToken = await client.validateAccessToken({ token });\r\n const expiry = getTokenExpiration(validatedToken.data.exp);\r\n //If token is expiring in less than 60 seconds, refresh the token\r\n if (expiry - Date.now() < 60_000) {\r\n await refreshToken();\r\n } else {\r\n //If token is not expiring, schedule a refresh\r\n const timeout = setTimeout(() => void refreshToken(), expiry - Date.now());\r\n //Unref the timeout so the process can exit\r\n timeout.unref();\r\n }\r\n } catch {\r\n //If token is invalid, refresh the token\r\n await refreshToken();\r\n }\r\n } else {\r\n //If token is not set, refresh the token\r\n await refreshToken();\r\n }\r\n\r\n return client;\r\n};\r\n"],"mappings":"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","names":["axios"]}
|
package/dist/index.d.cts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import * as axios from 'axios';
|
|
2
|
-
import { AxiosResponse } from 'axios';
|
|
3
1
|
import { Origins, Locales, Resource, ResourceResponse } from '@blizzard-api/core';
|
|
2
|
+
import { AxiosResponse } from 'axios';
|
|
4
3
|
|
|
5
4
|
interface AccessToken {
|
|
6
5
|
access_token: string;
|
|
@@ -48,7 +47,7 @@ declare class BlizzardApiClient implements IBlizzardApiClient {
|
|
|
48
47
|
token?: string;
|
|
49
48
|
};
|
|
50
49
|
constructor(options: ClientOptions);
|
|
51
|
-
|
|
50
|
+
private axios;
|
|
52
51
|
getRequestUrl<T, Protected extends boolean = false>(resource: Resource<T, Protected>, options?: Partial<ClientOptions>): string;
|
|
53
52
|
getRequestConfig<T, Protected extends boolean = false>(resource: Resource<T, Protected>, options?: Partial<ClientOptions>, headers?: Record<string, string>): {
|
|
54
53
|
headers: {
|
|
@@ -67,4 +66,6 @@ declare class BlizzardApiClient implements IBlizzardApiClient {
|
|
|
67
66
|
validateAccessToken: (options?: ValidateAccessTokenArguments) => Promise<AxiosResponse<ValidateAccessTokenResponse>>;
|
|
68
67
|
}
|
|
69
68
|
|
|
70
|
-
|
|
69
|
+
declare const createBlizzardApiClient: (options: ClientOptions, onTokenRefresh?: boolean | ((token: AccessToken) => void)) => Promise<BlizzardApiClient>;
|
|
70
|
+
|
|
71
|
+
export { type AccessToken, type AccessTokenRequestArguments, type ClientOptions, type IBlizzardApiClient, type ValidateAccessTokenArguments, type ValidateAccessTokenResponse, createBlizzardApiClient };
|
package/dist/index.d.ts
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
|
-
import * as axios from 'axios';
|
|
2
|
-
import { AxiosResponse } from 'axios';
|
|
3
1
|
import { Origins, Locales, Resource, ResourceResponse } from '@blizzard-api/core';
|
|
2
|
+
import { AxiosResponse } from 'axios';
|
|
4
3
|
|
|
5
4
|
interface AccessToken {
|
|
6
5
|
access_token: string;
|
|
@@ -48,7 +47,7 @@ declare class BlizzardApiClient implements IBlizzardApiClient {
|
|
|
48
47
|
token?: string;
|
|
49
48
|
};
|
|
50
49
|
constructor(options: ClientOptions);
|
|
51
|
-
|
|
50
|
+
private axios;
|
|
52
51
|
getRequestUrl<T, Protected extends boolean = false>(resource: Resource<T, Protected>, options?: Partial<ClientOptions>): string;
|
|
53
52
|
getRequestConfig<T, Protected extends boolean = false>(resource: Resource<T, Protected>, options?: Partial<ClientOptions>, headers?: Record<string, string>): {
|
|
54
53
|
headers: {
|
|
@@ -67,4 +66,6 @@ declare class BlizzardApiClient implements IBlizzardApiClient {
|
|
|
67
66
|
validateAccessToken: (options?: ValidateAccessTokenArguments) => Promise<AxiosResponse<ValidateAccessTokenResponse>>;
|
|
68
67
|
}
|
|
69
68
|
|
|
70
|
-
|
|
69
|
+
declare const createBlizzardApiClient: (options: ClientOptions, onTokenRefresh?: boolean | ((token: AccessToken) => void)) => Promise<BlizzardApiClient>;
|
|
70
|
+
|
|
71
|
+
export { type AccessToken, type AccessTokenRequestArguments, type ClientOptions, type IBlizzardApiClient, type ValidateAccessTokenArguments, type ValidateAccessTokenResponse, createBlizzardApiClient };
|
package/dist/index.js
CHANGED
|
@@ -1,11 +1,11 @@
|
|
|
1
|
-
// src/client/
|
|
1
|
+
// src/client/client.ts
|
|
2
2
|
import { stringify } from "querystring";
|
|
3
|
-
import {
|
|
3
|
+
import { getBlizzardApi } from "@blizzard-api/core";
|
|
4
4
|
import axios from "axios";
|
|
5
5
|
var BlizzardApiClient = class {
|
|
6
6
|
defaults;
|
|
7
7
|
constructor(options) {
|
|
8
|
-
const { origin, locale } =
|
|
8
|
+
const { origin, locale } = getBlizzardApi(options.origin, options.locale);
|
|
9
9
|
this.defaults = {
|
|
10
10
|
key: options.key,
|
|
11
11
|
secret: options.secret,
|
|
@@ -17,13 +17,13 @@ var BlizzardApiClient = class {
|
|
|
17
17
|
axios = axios.create();
|
|
18
18
|
getRequestUrl(resource, options) {
|
|
19
19
|
const config = { ...this.defaults, ...options };
|
|
20
|
-
const endpoint =
|
|
20
|
+
const endpoint = getBlizzardApi(config.origin, config.locale);
|
|
21
21
|
const backslashSeparator = resource.path.startsWith("/") ? "" : "/";
|
|
22
22
|
return `${endpoint.hostname}${backslashSeparator}${resource.path}`;
|
|
23
23
|
}
|
|
24
24
|
getRequestConfig(resource, options, headers) {
|
|
25
25
|
const config = { ...this.defaults, ...options };
|
|
26
|
-
const endpoint =
|
|
26
|
+
const endpoint = getBlizzardApi(config.origin, config.locale);
|
|
27
27
|
const namespace = resource.namespace ? { "Battlenet-Namespace": `${resource.namespace}-${endpoint.origin}` } : void 0;
|
|
28
28
|
return {
|
|
29
29
|
headers: {
|
|
@@ -82,7 +82,49 @@ var BlizzardApiClient = class {
|
|
|
82
82
|
);
|
|
83
83
|
};
|
|
84
84
|
};
|
|
85
|
+
|
|
86
|
+
// src/client/create-client.ts
|
|
87
|
+
var getTokenExpiration = (expiresIn) => expiresIn * 1e3 - 6e4;
|
|
88
|
+
var createBlizzardApiClient = async (options, onTokenRefresh = true) => {
|
|
89
|
+
const { key, secret, token } = options;
|
|
90
|
+
if (!key) {
|
|
91
|
+
throw new Error(`Client missing 'key' parameter`);
|
|
92
|
+
}
|
|
93
|
+
if (!secret) {
|
|
94
|
+
throw new Error(`Client missing 'secret' parameter`);
|
|
95
|
+
}
|
|
96
|
+
const client = new BlizzardApiClient(options);
|
|
97
|
+
const refreshToken = async () => {
|
|
98
|
+
const response = await client.getAccessToken();
|
|
99
|
+
client.setAccessToken(response.data.access_token);
|
|
100
|
+
if (typeof onTokenRefresh === "function") {
|
|
101
|
+
onTokenRefresh?.(response.data);
|
|
102
|
+
}
|
|
103
|
+
const timeout = setTimeout(() => void refreshToken(), getTokenExpiration(response.data.expires_in));
|
|
104
|
+
timeout.unref();
|
|
105
|
+
};
|
|
106
|
+
if (!onTokenRefresh) {
|
|
107
|
+
return client;
|
|
108
|
+
}
|
|
109
|
+
if (token) {
|
|
110
|
+
try {
|
|
111
|
+
const validatedToken = await client.validateAccessToken({ token });
|
|
112
|
+
const expiry = getTokenExpiration(validatedToken.data.exp);
|
|
113
|
+
if (expiry - Date.now() < 6e4) {
|
|
114
|
+
await refreshToken();
|
|
115
|
+
} else {
|
|
116
|
+
const timeout = setTimeout(() => void refreshToken(), expiry - Date.now());
|
|
117
|
+
timeout.unref();
|
|
118
|
+
}
|
|
119
|
+
} catch {
|
|
120
|
+
await refreshToken();
|
|
121
|
+
}
|
|
122
|
+
} else {
|
|
123
|
+
await refreshToken();
|
|
124
|
+
}
|
|
125
|
+
return client;
|
|
126
|
+
};
|
|
85
127
|
export {
|
|
86
|
-
|
|
128
|
+
createBlizzardApiClient
|
|
87
129
|
};
|
|
88
130
|
//# sourceMappingURL=index.js.map
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/client/
|
|
1
|
+
{"version":3,"sources":["../src/client/client.ts","../src/client/create-client.ts"],"sourcesContent":["import { stringify } from 'node:querystring';\r\nimport { getBlizzardApi } from '@blizzard-api/core';\r\nimport type { Origins, Locales, ResourceResponse, Resource } from '@blizzard-api/core';\r\nimport type { AxiosResponse } from 'axios';\r\nimport axios from 'axios';\r\nimport type {\r\n AccessToken,\r\n AccessTokenRequestArguments,\r\n ClientOptions,\r\n IBlizzardApiClient,\r\n ValidateAccessTokenArguments,\r\n ValidateAccessTokenResponse,\r\n} from './types';\r\n\r\nexport class BlizzardApiClient implements IBlizzardApiClient {\r\n public defaults: {\r\n key: string;\r\n secret: string;\r\n origin: Origins;\r\n locale: Locales;\r\n token?: string;\r\n };\r\n\r\n constructor(options: ClientOptions) {\r\n const { origin, locale } = getBlizzardApi(options.origin, options.locale);\r\n this.defaults = {\r\n key: options.key,\r\n secret: options.secret,\r\n token: options.token,\r\n origin: origin,\r\n locale: locale,\r\n };\r\n }\r\n\r\n private axios = axios.create();\r\n\r\n public getRequestUrl<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n ) {\r\n const config = { ...this.defaults, ...options };\r\n const endpoint = getBlizzardApi(config.origin, config.locale);\r\n\r\n const backslashSeparator = resource.path.startsWith('/') ? '' : '/';\r\n\r\n return `${endpoint.hostname}${backslashSeparator}${resource.path}`;\r\n }\r\n\r\n public getRequestConfig<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n headers?: Record<string, string>,\r\n ) {\r\n const config = { ...this.defaults, ...options };\r\n const endpoint = getBlizzardApi(config.origin, config.locale);\r\n\r\n const namespace = resource.namespace\r\n ? { 'Battlenet-Namespace': `${resource.namespace}-${endpoint.origin}` }\r\n : undefined;\r\n\r\n return {\r\n headers: {\r\n ...headers,\r\n ...namespace,\r\n 'Content-Type': 'application/json',\r\n Authorization: `Bearer ${config.token}`,\r\n },\r\n params: {\r\n locale: endpoint.locale,\r\n ...resource.parameters,\r\n },\r\n };\r\n }\r\n\r\n public sendRequest<T, Protected extends boolean = false>(\r\n resource: Resource<T, Protected>,\r\n options?: Partial<ClientOptions>,\r\n headers?: Record<string, string>,\r\n ): ResourceResponse<AxiosResponse<T>> {\r\n const url = this.getRequestUrl(resource, options);\r\n const config = this.getRequestConfig(resource, options, headers);\r\n\r\n return this.axios.get<T>(url, config);\r\n }\r\n\r\n public getAccessToken = async (options?: AccessTokenRequestArguments): Promise<AxiosResponse<AccessToken>> => {\r\n const { key, secret, origin } = { ...this.defaults, ...options };\r\n return this.axios.post<AccessToken>(`https://${origin}.battle.net/oauth/token`, undefined, {\r\n params: {\r\n grant_type: 'client_credentials',\r\n },\r\n auth: {\r\n username: key,\r\n password: secret,\r\n },\r\n headers: {\r\n 'Content-Type': 'application/json',\r\n },\r\n });\r\n };\r\n\r\n public setAccessToken = (token: string): void => {\r\n this.defaults.token = token;\r\n };\r\n\r\n public refreshAccessToken = async (options?: AccessTokenRequestArguments): Promise<AxiosResponse<AccessToken>> => {\r\n const response = await this.getAccessToken(options);\r\n this.setAccessToken(response.data.access_token);\r\n return response;\r\n };\r\n\r\n public validateAccessToken = async (\r\n options?: ValidateAccessTokenArguments,\r\n ): Promise<AxiosResponse<ValidateAccessTokenResponse>> => {\r\n const { origin, token } = { ...this.defaults, ...options };\r\n\r\n if (!token) {\r\n throw new Error('No token has been set previously or been passed to the validateAccessToken method.');\r\n }\r\n\r\n return await this.axios.post<ValidateAccessTokenResponse>(\r\n `https://${origin}.battle.net/oauth/check_token`,\r\n stringify({ token }),\r\n {\r\n headers: {\r\n 'Content-Type': 'application/x-www-form-urlencoded',\r\n },\r\n },\r\n );\r\n };\r\n}\r\n","import { BlizzardApiClient } from './client';\r\nimport type { AccessToken, ClientOptions } from './types';\r\n\r\nconst getTokenExpiration = (expiresIn: number) => expiresIn * 1000 - 60_000;\r\n\r\nexport const createBlizzardApiClient = async (\r\n /**\r\n * Client options.\r\n * @see ClientOptions\r\n * @see https://develop.battle.net/documentation/guides/getting-started\r\n */\r\n options: ClientOptions,\r\n /**\r\n * Callback function to handle token refresh.\r\n *\r\n * If set to `true`, the client will automatically refresh the token.\r\n *\r\n * If set to `false`, the client will not refresh the token.\r\n *\r\n * If set to a function, the function will be called with the new token.\r\n */\r\n onTokenRefresh: boolean | ((token: AccessToken) => void) = true,\r\n): Promise<BlizzardApiClient> => {\r\n const { key, secret, token } = options;\r\n if (!key) {\r\n throw new Error(`Client missing 'key' parameter`);\r\n }\r\n if (!secret) {\r\n throw new Error(`Client missing 'secret' parameter`);\r\n }\r\n\r\n const client = new BlizzardApiClient(options);\r\n\r\n const refreshToken = async () => {\r\n const response = await client.getAccessToken();\r\n\r\n client.setAccessToken(response.data.access_token);\r\n\r\n if (typeof onTokenRefresh === 'function') {\r\n onTokenRefresh?.(response.data);\r\n }\r\n\r\n //Schedule a refresh of the token\r\n const timeout = setTimeout(() => void refreshToken(), getTokenExpiration(response.data.expires_in));\r\n timeout.unref();\r\n };\r\n\r\n //If tokenRefresh is false, return the client without refreshing the token\r\n if (!onTokenRefresh) {\r\n return client;\r\n }\r\n\r\n if (token) {\r\n try {\r\n //If token is set, validate the token\r\n const validatedToken = await client.validateAccessToken({ token });\r\n const expiry = getTokenExpiration(validatedToken.data.exp);\r\n //If token is expiring in less than 60 seconds, refresh the token\r\n if (expiry - Date.now() < 60_000) {\r\n await refreshToken();\r\n } else {\r\n //If token is not expiring, schedule a refresh\r\n const timeout = setTimeout(() => void refreshToken(), expiry - Date.now());\r\n //Unref the timeout so the process can exit\r\n timeout.unref();\r\n }\r\n } catch {\r\n //If token is invalid, refresh the token\r\n await refreshToken();\r\n }\r\n } else {\r\n //If token is not set, refresh the token\r\n await refreshToken();\r\n }\r\n\r\n return client;\r\n};\r\n"],"mappings":"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","names":[]}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@blizzard-api/client",
|
|
3
|
-
"version": "0.0
|
|
3
|
+
"version": "0.1.0",
|
|
4
4
|
"license": "MIT",
|
|
5
5
|
"author": "Putro",
|
|
6
6
|
"description": "A node.js axios client to integrate with the blizzard battle.net api.",
|
|
7
|
-
"repository": "https://github.com/Pewtro/blizzard/packages/client",
|
|
7
|
+
"repository": "https://github.com/Pewtro/blizzard/tree/main/packages/client",
|
|
8
8
|
"type": "module",
|
|
9
9
|
"engines": {
|
|
10
10
|
"node": ">=18 <19 || >=20"
|
|
@@ -47,11 +47,11 @@
|
|
|
47
47
|
"axios": "1.6.8"
|
|
48
48
|
},
|
|
49
49
|
"peerDependencies": {
|
|
50
|
-
"@blizzard-api/core": "0.0.
|
|
50
|
+
"@blizzard-api/core": "0.0.9"
|
|
51
51
|
},
|
|
52
52
|
"devDependencies": {
|
|
53
|
-
"@blizzard-api/core": "0.0.
|
|
54
|
-
"@blizzard-api/wow": "0.
|
|
53
|
+
"@blizzard-api/core": "0.0.9",
|
|
54
|
+
"@blizzard-api/wow": "0.1.1"
|
|
55
55
|
},
|
|
56
56
|
"scripts": {
|
|
57
57
|
"build": "tsup",
|