@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.
@@ -2,8 +2,29 @@
2
2
  import { Buffer as Buffer2 } from "buffer";
3
3
  window.Buffer = Buffer2;
4
4
 
5
- // src/utils/Network.ts
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 = axios.create(
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 = Network.create({ baseURL: coreConfig.baseURL, ...this.axiosConfig.request });
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 axios2 from "axios";
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 refreshSession = ({ axiosConfig, refreshToken, clientId, tokenUrl }) => {
445
- const config = {
446
- ...axiosConfig,
447
- withCredentials: false,
448
- headers: {
449
- "Content-Type": "application/x-www-form-urlencoded",
450
- Authorization: `Basic ${Buffer.from(`${clientId}:`).toString("base64")}`
451
- }
452
- };
453
- const axios4 = Network.create(config);
454
- const payload = {
455
- refresh_token: refreshToken || void 0,
456
- client_id: clientId,
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
- await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE);
485
- }
486
- })();
487
- return Promise.resolve().then(doRefreshSession({ axiosConfig, clientId, refreshToken, tokenUrl })).finally(() => {
488
- isLocallyRefreshingToken = false;
489
- RefreshSession.unlock();
490
- });
491
- };
492
- var doRefreshSession = ({ axiosConfig, clientId, refreshToken, tokenUrl }) => async () => {
493
- if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {
494
- return false;
495
- }
496
- const result = await refreshSession({ axiosConfig, clientId, refreshToken, tokenUrl });
497
- if (result.error) {
498
- return false;
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 uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig, errorConfig) => {
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 axios2({
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 axios2(errorConfig);
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
- createSessionExpiredInterceptor,
782
- doRefreshSession,
783
- isType,
784
- refreshWithLock
816
+ isType
785
817
  };
786
818
  //# sourceMappingURL=index.browser.js.map