@accelbyte/sdk 0.0.0-dev-20240906023252 → 0.0.0-dev-20240910111050
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/cjs/node/index.cjs +156 -125
- package/dist/cjs/node/index.cjs.map +1 -1
- package/dist/es/browser/index.browser.js +153 -121
- package/dist/es/browser/index.browser.js.map +1 -1
- package/dist/es/node/index.node.js +153 -121
- package/dist/es/node/index.node.js.map +1 -1
- package/dist/index.d.ts +39 -36
- package/package.json +4 -3
|
@@ -2,8 +2,29 @@
|
|
|
2
2
|
import { Buffer as Buffer2 } from "buffer";
|
|
3
3
|
window.Buffer = Buffer2;
|
|
4
4
|
|
|
5
|
-
// src/utils/
|
|
5
|
+
// src/utils/ApiUtils.ts
|
|
6
6
|
import axios from "axios";
|
|
7
|
+
var ApiUtils = class {
|
|
8
|
+
};
|
|
9
|
+
ApiUtils.mergeAxiosConfigs = (config, overrides) => {
|
|
10
|
+
return {
|
|
11
|
+
...config,
|
|
12
|
+
...overrides,
|
|
13
|
+
headers: {
|
|
14
|
+
...config?.headers,
|
|
15
|
+
...overrides?.headers
|
|
16
|
+
}
|
|
17
|
+
};
|
|
18
|
+
};
|
|
19
|
+
ApiUtils.is4xxError = (error) => {
|
|
20
|
+
if (axios.isAxiosError(error) && error.response) {
|
|
21
|
+
return error.response.status >= 400 && error.response.status <= 499;
|
|
22
|
+
}
|
|
23
|
+
return false;
|
|
24
|
+
};
|
|
25
|
+
|
|
26
|
+
// src/utils/Network.ts
|
|
27
|
+
import axios2 from "axios";
|
|
7
28
|
import qs from "query-string";
|
|
8
29
|
|
|
9
30
|
// src/utils/SdkDevice.ts
|
|
@@ -47,7 +68,7 @@ var isMobile = (opts) => {
|
|
|
47
68
|
// src/utils/Network.ts
|
|
48
69
|
var _Network = class _Network {
|
|
49
70
|
static create(...configs) {
|
|
50
|
-
const axiosInstance =
|
|
71
|
+
const axiosInstance = axios2.create(
|
|
51
72
|
Object.assign(
|
|
52
73
|
{
|
|
53
74
|
paramsSerializer: qs.stringify
|
|
@@ -110,9 +131,12 @@ var AccelByteSDK = class _AccelByteSDK {
|
|
|
110
131
|
}
|
|
111
132
|
}
|
|
112
133
|
};
|
|
113
|
-
this.axiosInstance =
|
|
134
|
+
this.axiosInstance = this.createAxiosInstance();
|
|
114
135
|
this.token = {};
|
|
115
136
|
}
|
|
137
|
+
createAxiosInstance() {
|
|
138
|
+
return Network.create({ baseURL: this.coreConfig.baseURL, ...this.axiosConfig.request });
|
|
139
|
+
}
|
|
116
140
|
assembly() {
|
|
117
141
|
return {
|
|
118
142
|
axiosInstance: this.axiosInstance,
|
|
@@ -144,6 +168,7 @@ var AccelByteSDK = class _AccelByteSDK {
|
|
|
144
168
|
return this;
|
|
145
169
|
}
|
|
146
170
|
this.axiosConfig.interceptors = this.axiosConfig.interceptors.filter(filterCallback);
|
|
171
|
+
this.axiosInstance = this.createAxiosInstance();
|
|
147
172
|
return this;
|
|
148
173
|
}
|
|
149
174
|
setConfig({ coreConfig, axiosConfig }) {
|
|
@@ -155,6 +180,7 @@ var AccelByteSDK = class _AccelByteSDK {
|
|
|
155
180
|
...this.axiosConfig,
|
|
156
181
|
...axiosConfig
|
|
157
182
|
};
|
|
183
|
+
this.axiosInstance = this.createAxiosInstance();
|
|
158
184
|
return this;
|
|
159
185
|
}
|
|
160
186
|
setToken(token) {
|
|
@@ -162,6 +188,12 @@ var AccelByteSDK = class _AccelByteSDK {
|
|
|
162
188
|
...this.token,
|
|
163
189
|
...token
|
|
164
190
|
};
|
|
191
|
+
const configOverride = { headers: { Authorization: this.token.accessToken ? `Bearer ${this.token.accessToken}` : "" } };
|
|
192
|
+
this.axiosConfig = {
|
|
193
|
+
...this.axiosConfig,
|
|
194
|
+
request: ApiUtils.mergeAxiosConfigs(this.axiosInstance.defaults, configOverride)
|
|
195
|
+
};
|
|
196
|
+
this.axiosInstance = this.createAxiosInstance();
|
|
165
197
|
}
|
|
166
198
|
removeToken() {
|
|
167
199
|
this.token = {};
|
|
@@ -198,7 +230,7 @@ var ERROR_CODE_TOKEN_EXPIRED = 10196;
|
|
|
198
230
|
var ERROR_USER_BANNED = 10134;
|
|
199
231
|
|
|
200
232
|
// src/interceptors/AuthInterceptors.ts
|
|
201
|
-
import
|
|
233
|
+
import axios3 from "axios";
|
|
202
234
|
|
|
203
235
|
// src/utils/DesktopChecker.ts
|
|
204
236
|
var _DesktopChecker = class _DesktopChecker {
|
|
@@ -441,69 +473,83 @@ var LoginUrls = /* @__PURE__ */ ((LoginUrls2) => {
|
|
|
441
473
|
LoginUrls2["REVOKE"] = "/iam/v3/oauth/revoke";
|
|
442
474
|
return LoginUrls2;
|
|
443
475
|
})(LoginUrls || {});
|
|
444
|
-
var
|
|
445
|
-
|
|
446
|
-
|
|
447
|
-
|
|
448
|
-
|
|
449
|
-
|
|
450
|
-
|
|
451
|
-
|
|
452
|
-
|
|
453
|
-
|
|
454
|
-
|
|
455
|
-
|
|
456
|
-
|
|
457
|
-
grant_type: "refresh_token"
|
|
458
|
-
};
|
|
459
|
-
if (tokenUrl === "/iam/v4/oauth/token" /* GRANT_TOKEN_V4 */) {
|
|
460
|
-
return new OAuth20V4$(axios4).postOauthToken_v4(payload);
|
|
461
|
-
}
|
|
462
|
-
const oauth20 = new OAuth20$(axios4);
|
|
463
|
-
return oauth20.postOauthToken(payload);
|
|
464
|
-
};
|
|
465
|
-
var refreshWithLock = ({
|
|
466
|
-
axiosConfig,
|
|
467
|
-
refreshToken,
|
|
468
|
-
clientId,
|
|
469
|
-
tokenUrl
|
|
470
|
-
}) => {
|
|
471
|
-
if (RefreshSession.isLocked()) {
|
|
472
|
-
return Promise.resolve().then(async () => {
|
|
473
|
-
while (RefreshSession.isLocked()) {
|
|
474
|
-
await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE);
|
|
476
|
+
var noOp = () => {
|
|
477
|
+
};
|
|
478
|
+
var RefreshToken = class {
|
|
479
|
+
constructor({ config, interceptors }) {
|
|
480
|
+
// Return Promise<true> if refresh in any tab is successful;
|
|
481
|
+
this.runWithLock = () => {
|
|
482
|
+
if (RefreshSession.isLocked()) {
|
|
483
|
+
return Promise.resolve().then(async () => {
|
|
484
|
+
while (RefreshSession.isLocked()) {
|
|
485
|
+
await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE);
|
|
486
|
+
}
|
|
487
|
+
return {};
|
|
488
|
+
});
|
|
475
489
|
}
|
|
476
|
-
return {};
|
|
477
|
-
});
|
|
478
|
-
}
|
|
479
|
-
RefreshSession.lock(REFRESH_EXPIRY);
|
|
480
|
-
let isLocallyRefreshingToken = true;
|
|
481
|
-
(async () => {
|
|
482
|
-
while (isLocallyRefreshingToken) {
|
|
483
490
|
RefreshSession.lock(REFRESH_EXPIRY);
|
|
484
|
-
|
|
485
|
-
|
|
486
|
-
|
|
487
|
-
|
|
488
|
-
|
|
489
|
-
|
|
490
|
-
|
|
491
|
-
|
|
492
|
-
|
|
493
|
-
|
|
494
|
-
|
|
495
|
-
|
|
496
|
-
|
|
497
|
-
|
|
498
|
-
|
|
491
|
+
let isLocallyRefreshingToken = true;
|
|
492
|
+
(async () => {
|
|
493
|
+
while (isLocallyRefreshingToken) {
|
|
494
|
+
RefreshSession.lock(REFRESH_EXPIRY);
|
|
495
|
+
await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE);
|
|
496
|
+
}
|
|
497
|
+
})();
|
|
498
|
+
return Promise.resolve().then(() => this.run()).finally(() => {
|
|
499
|
+
isLocallyRefreshingToken = false;
|
|
500
|
+
RefreshSession.unlock();
|
|
501
|
+
});
|
|
502
|
+
};
|
|
503
|
+
this.run = async () => {
|
|
504
|
+
const { axiosConfig, refreshToken } = this.config;
|
|
505
|
+
if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {
|
|
506
|
+
return false;
|
|
507
|
+
}
|
|
508
|
+
const result = await this.refreshToken();
|
|
509
|
+
if (result.error) {
|
|
510
|
+
return false;
|
|
511
|
+
}
|
|
512
|
+
return result.response.data;
|
|
513
|
+
};
|
|
514
|
+
this.refreshToken = () => {
|
|
515
|
+
const { axiosConfig, refreshToken, clientId, tokenUrl } = this.config;
|
|
516
|
+
const config = {
|
|
517
|
+
...axiosConfig,
|
|
518
|
+
withCredentials: false,
|
|
519
|
+
headers: {
|
|
520
|
+
"Content-Type": "application/x-www-form-urlencoded",
|
|
521
|
+
Authorization: `Basic ${Buffer.from(`${clientId}:`).toString("base64")}`
|
|
522
|
+
}
|
|
523
|
+
};
|
|
524
|
+
const axios4 = Network.create(config);
|
|
525
|
+
for (const interceptor of this.interceptors) {
|
|
526
|
+
if (interceptor.type === "request") {
|
|
527
|
+
axios4.interceptors.request.use(interceptor?.onRequest, interceptor.onError);
|
|
528
|
+
}
|
|
529
|
+
if (interceptor.type === "response") {
|
|
530
|
+
axios4.interceptors.response.use(interceptor?.onSuccess, interceptor.onError);
|
|
531
|
+
}
|
|
532
|
+
}
|
|
533
|
+
const payload = {
|
|
534
|
+
refresh_token: refreshToken || void 0,
|
|
535
|
+
client_id: clientId,
|
|
536
|
+
grant_type: "refresh_token"
|
|
537
|
+
};
|
|
538
|
+
if (tokenUrl === "/iam/v4/oauth/token" /* GRANT_TOKEN_V4 */) {
|
|
539
|
+
return new OAuth20V4$(axios4).postOauthToken_v4(payload);
|
|
540
|
+
}
|
|
541
|
+
const oauth20 = new OAuth20$(axios4);
|
|
542
|
+
return oauth20.postOauthToken(payload);
|
|
543
|
+
};
|
|
544
|
+
this.config = config;
|
|
545
|
+
this.interceptors = interceptors || [];
|
|
499
546
|
}
|
|
500
|
-
return result.response.data;
|
|
501
547
|
};
|
|
502
|
-
var
|
|
548
|
+
var refreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig, errorConfig) => {
|
|
503
549
|
if (tokenResponse) {
|
|
504
550
|
const { access_token } = tokenResponse;
|
|
505
551
|
if (!axiosConfig.withCredentials && access_token) {
|
|
506
|
-
return
|
|
552
|
+
return axios3({
|
|
507
553
|
...errorConfig,
|
|
508
554
|
headers: {
|
|
509
555
|
...errorConfig.headers,
|
|
@@ -511,7 +557,7 @@ var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig,
|
|
|
511
557
|
}
|
|
512
558
|
});
|
|
513
559
|
} else {
|
|
514
|
-
return
|
|
560
|
+
return axios3(errorConfig);
|
|
515
561
|
}
|
|
516
562
|
}
|
|
517
563
|
if (onSessionExpired) {
|
|
@@ -519,6 +565,49 @@ var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig,
|
|
|
519
565
|
}
|
|
520
566
|
throw error;
|
|
521
567
|
};
|
|
568
|
+
var createAuthInterceptor = ({
|
|
569
|
+
clientId,
|
|
570
|
+
onSessionExpired,
|
|
571
|
+
onGetUserSession,
|
|
572
|
+
expectedErrorUrls = Object.values({ ...LoginUrls, ...GrantTokenUrls }),
|
|
573
|
+
getRefreshToken,
|
|
574
|
+
tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */
|
|
575
|
+
}) => {
|
|
576
|
+
return {
|
|
577
|
+
type: "response",
|
|
578
|
+
name: "session-expired",
|
|
579
|
+
onError: (e) => {
|
|
580
|
+
const error = e;
|
|
581
|
+
const { config, response } = error;
|
|
582
|
+
if (axios3.isCancel(error)) {
|
|
583
|
+
return Promise.reject(error);
|
|
584
|
+
}
|
|
585
|
+
if (!response) {
|
|
586
|
+
console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config?.baseURL}${config?.url}. ${error.message}
|
|
587
|
+
`);
|
|
588
|
+
}
|
|
589
|
+
if (response?.status === 401) {
|
|
590
|
+
const { url } = config || {};
|
|
591
|
+
const axiosConfig = config;
|
|
592
|
+
const refreshToken = getRefreshToken();
|
|
593
|
+
if (!url || url && expectedErrorUrls.includes(url)) {
|
|
594
|
+
return Promise.reject(error);
|
|
595
|
+
}
|
|
596
|
+
const refresh = new RefreshToken({
|
|
597
|
+
config: { axiosConfig, clientId, refreshToken, tokenUrl },
|
|
598
|
+
interceptors: [
|
|
599
|
+
createRefreshSessionInterceptor({ tokenUrl }),
|
|
600
|
+
createGetSessionInterceptor({ onGetUserSession: onGetUserSession || noOp, tokenUrl })
|
|
601
|
+
]
|
|
602
|
+
});
|
|
603
|
+
return refresh.runWithLock().then((tokenResponse) => {
|
|
604
|
+
return refreshComplete(error, tokenResponse, onSessionExpired, axiosConfig, config || {});
|
|
605
|
+
});
|
|
606
|
+
}
|
|
607
|
+
return Promise.reject(error);
|
|
608
|
+
}
|
|
609
|
+
};
|
|
610
|
+
};
|
|
522
611
|
var createRefreshSessionInterceptor = (options) => {
|
|
523
612
|
const { tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */ } = options || {};
|
|
524
613
|
return {
|
|
@@ -552,41 +641,6 @@ var createGetSessionInterceptor = ({
|
|
|
552
641
|
return response;
|
|
553
642
|
}
|
|
554
643
|
});
|
|
555
|
-
var createSessionExpiredInterceptor = ({
|
|
556
|
-
clientId,
|
|
557
|
-
onSessionExpired,
|
|
558
|
-
expectedErrorUrls = Object.values({ ...LoginUrls, ...GrantTokenUrls }),
|
|
559
|
-
getRefreshToken,
|
|
560
|
-
tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */
|
|
561
|
-
}) => {
|
|
562
|
-
return {
|
|
563
|
-
type: "response",
|
|
564
|
-
name: "session-expired",
|
|
565
|
-
onError: (e) => {
|
|
566
|
-
const error = e;
|
|
567
|
-
const { config, response } = error;
|
|
568
|
-
if (axios2.isCancel(error)) {
|
|
569
|
-
return Promise.reject(error);
|
|
570
|
-
}
|
|
571
|
-
if (!response) {
|
|
572
|
-
console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config?.baseURL}${config?.url}. ${error.message}
|
|
573
|
-
`);
|
|
574
|
-
}
|
|
575
|
-
if (response?.status === 401) {
|
|
576
|
-
const { url } = config || {};
|
|
577
|
-
const axiosConfig = config;
|
|
578
|
-
const refreshToken = getRefreshToken();
|
|
579
|
-
if (!url || url && expectedErrorUrls.includes(url)) {
|
|
580
|
-
return Promise.reject(error);
|
|
581
|
-
}
|
|
582
|
-
return refreshWithLock({ axiosConfig, clientId, refreshToken, tokenUrl }).then((tokenResponse) => {
|
|
583
|
-
return uponRefreshComplete(error, tokenResponse, onSessionExpired, axiosConfig, config || {});
|
|
584
|
-
});
|
|
585
|
-
}
|
|
586
|
-
return Promise.reject(error);
|
|
587
|
-
}
|
|
588
|
-
};
|
|
589
|
-
};
|
|
590
644
|
|
|
591
645
|
// src/constants/paths.ts
|
|
592
646
|
var INTERNAL_SERVICES = {
|
|
@@ -681,27 +735,6 @@ var ErrorInterceptors = [
|
|
|
681
735
|
}
|
|
682
736
|
];
|
|
683
737
|
|
|
684
|
-
// src/utils/ApiUtils.ts
|
|
685
|
-
import axios3 from "axios";
|
|
686
|
-
var ApiUtils = class {
|
|
687
|
-
};
|
|
688
|
-
ApiUtils.mergeAxiosConfigs = (config, overrides) => {
|
|
689
|
-
return {
|
|
690
|
-
...config,
|
|
691
|
-
...overrides,
|
|
692
|
-
headers: {
|
|
693
|
-
...config?.headers,
|
|
694
|
-
...overrides?.headers
|
|
695
|
-
}
|
|
696
|
-
};
|
|
697
|
-
};
|
|
698
|
-
ApiUtils.is4xxError = (error) => {
|
|
699
|
-
if (axios3.isAxiosError(error) && error.response) {
|
|
700
|
-
return error.response.status >= 400 && error.response.status <= 499;
|
|
701
|
-
}
|
|
702
|
-
return false;
|
|
703
|
-
};
|
|
704
|
-
|
|
705
738
|
// src/utils/Type.ts
|
|
706
739
|
function isType(schema, data) {
|
|
707
740
|
return schema.safeParse(data).success;
|
|
@@ -772,15 +805,14 @@ export {
|
|
|
772
805
|
IamErrorCode,
|
|
773
806
|
Network,
|
|
774
807
|
RefreshSession,
|
|
808
|
+
RefreshToken,
|
|
775
809
|
SdkDevice,
|
|
776
810
|
UrlHelper,
|
|
777
811
|
Validate,
|
|
812
|
+
createAuthInterceptor,
|
|
778
813
|
createCustomPathInterceptor,
|
|
779
814
|
createGetSessionInterceptor,
|
|
780
815
|
createRefreshSessionInterceptor,
|
|
781
|
-
|
|
782
|
-
doRefreshSession,
|
|
783
|
-
isType,
|
|
784
|
-
refreshWithLock
|
|
816
|
+
isType
|
|
785
817
|
};
|
|
786
818
|
//# sourceMappingURL=index.browser.js.map
|