@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.
@@ -45,16 +45,15 @@ __export(index_node_exports, {
45
45
  IamErrorCode: () => IamErrorCode,
46
46
  Network: () => Network,
47
47
  RefreshSession: () => RefreshSession,
48
+ RefreshToken: () => RefreshToken,
48
49
  SdkDevice: () => SdkDevice,
49
50
  UrlHelper: () => UrlHelper,
50
51
  Validate: () => Validate,
52
+ createAuthInterceptor: () => createAuthInterceptor,
51
53
  createCustomPathInterceptor: () => createCustomPathInterceptor,
52
54
  createGetSessionInterceptor: () => createGetSessionInterceptor,
53
55
  createRefreshSessionInterceptor: () => createRefreshSessionInterceptor,
54
- createSessionExpiredInterceptor: () => createSessionExpiredInterceptor,
55
- doRefreshSession: () => doRefreshSession,
56
- isType: () => isType,
57
- refreshWithLock: () => refreshWithLock
56
+ isType: () => isType
58
57
  });
59
58
  module.exports = __toCommonJS(index_node_exports);
60
59
 
@@ -64,8 +63,29 @@ if (!global.crypto) {
64
63
  global.crypto = import_crypto.webcrypto;
65
64
  }
66
65
 
67
- // src/utils/Network.ts
66
+ // src/utils/ApiUtils.ts
68
67
  var import_axios = __toESM(require("axios"), 1);
68
+ var ApiUtils = class {
69
+ };
70
+ ApiUtils.mergeAxiosConfigs = (config, overrides) => {
71
+ return {
72
+ ...config,
73
+ ...overrides,
74
+ headers: {
75
+ ...config == null ? void 0 : config.headers,
76
+ ...overrides == null ? void 0 : overrides.headers
77
+ }
78
+ };
79
+ };
80
+ ApiUtils.is4xxError = (error) => {
81
+ if (import_axios.default.isAxiosError(error) && error.response) {
82
+ return error.response.status >= 400 && error.response.status <= 499;
83
+ }
84
+ return false;
85
+ };
86
+
87
+ // src/utils/Network.ts
88
+ var import_axios2 = __toESM(require("axios"), 1);
69
89
  var import_query_string = __toESM(require("query-string"), 1);
70
90
 
71
91
  // src/utils/SdkDevice.ts
@@ -109,7 +129,7 @@ var isMobile = (opts) => {
109
129
  // src/utils/Network.ts
110
130
  var _Network = class _Network {
111
131
  static create(...configs) {
112
- const axiosInstance = import_axios.default.create(
132
+ const axiosInstance = import_axios2.default.create(
113
133
  Object.assign(
114
134
  {
115
135
  paramsSerializer: import_query_string.default.stringify
@@ -173,9 +193,12 @@ var AccelByteSDK = class _AccelByteSDK {
173
193
  }
174
194
  }
175
195
  };
176
- this.axiosInstance = Network.create({ baseURL: coreConfig.baseURL, ...this.axiosConfig.request });
196
+ this.axiosInstance = this.createAxiosInstance();
177
197
  this.token = {};
178
198
  }
199
+ createAxiosInstance() {
200
+ return Network.create({ baseURL: this.coreConfig.baseURL, ...this.axiosConfig.request });
201
+ }
179
202
  assembly() {
180
203
  return {
181
204
  axiosInstance: this.axiosInstance,
@@ -208,6 +231,7 @@ var AccelByteSDK = class _AccelByteSDK {
208
231
  return this;
209
232
  }
210
233
  this.axiosConfig.interceptors = this.axiosConfig.interceptors.filter(filterCallback);
234
+ this.axiosInstance = this.createAxiosInstance();
211
235
  return this;
212
236
  }
213
237
  setConfig({ coreConfig, axiosConfig }) {
@@ -219,6 +243,7 @@ var AccelByteSDK = class _AccelByteSDK {
219
243
  ...this.axiosConfig,
220
244
  ...axiosConfig
221
245
  };
246
+ this.axiosInstance = this.createAxiosInstance();
222
247
  return this;
223
248
  }
224
249
  setToken(token) {
@@ -226,6 +251,12 @@ var AccelByteSDK = class _AccelByteSDK {
226
251
  ...this.token,
227
252
  ...token
228
253
  };
254
+ const configOverride = { headers: { Authorization: this.token.accessToken ? `Bearer ${this.token.accessToken}` : "" } };
255
+ this.axiosConfig = {
256
+ ...this.axiosConfig,
257
+ request: ApiUtils.mergeAxiosConfigs(this.axiosInstance.defaults, configOverride)
258
+ };
259
+ this.axiosInstance = this.createAxiosInstance();
229
260
  }
230
261
  removeToken() {
231
262
  this.token = {};
@@ -262,7 +293,7 @@ var ERROR_CODE_TOKEN_EXPIRED = 10196;
262
293
  var ERROR_USER_BANNED = 10134;
263
294
 
264
295
  // src/interceptors/AuthInterceptors.ts
265
- var import_axios2 = __toESM(require("axios"), 1);
296
+ var import_axios3 = __toESM(require("axios"), 1);
266
297
 
267
298
  // src/utils/DesktopChecker.ts
268
299
  var _DesktopChecker = class _DesktopChecker {
@@ -506,69 +537,83 @@ var LoginUrls = /* @__PURE__ */ ((LoginUrls2) => {
506
537
  LoginUrls2["REVOKE"] = "/iam/v3/oauth/revoke";
507
538
  return LoginUrls2;
508
539
  })(LoginUrls || {});
509
- var refreshSession = ({ axiosConfig, refreshToken, clientId, tokenUrl }) => {
510
- const config = {
511
- ...axiosConfig,
512
- withCredentials: false,
513
- headers: {
514
- "Content-Type": "application/x-www-form-urlencoded",
515
- Authorization: `Basic ${Buffer.from(`${clientId}:`).toString("base64")}`
516
- }
517
- };
518
- const axios4 = Network.create(config);
519
- const payload = {
520
- refresh_token: refreshToken || void 0,
521
- client_id: clientId,
522
- grant_type: "refresh_token"
523
- };
524
- if (tokenUrl === "/iam/v4/oauth/token" /* GRANT_TOKEN_V4 */) {
525
- return new OAuth20V4$(axios4).postOauthToken_v4(payload);
526
- }
527
- const oauth20 = new OAuth20$(axios4);
528
- return oauth20.postOauthToken(payload);
529
- };
530
- var refreshWithLock = ({
531
- axiosConfig,
532
- refreshToken,
533
- clientId,
534
- tokenUrl
535
- }) => {
536
- if (RefreshSession.isLocked()) {
537
- return Promise.resolve().then(async () => {
538
- while (RefreshSession.isLocked()) {
539
- await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE);
540
+ var noOp = () => {
541
+ };
542
+ var RefreshToken = class {
543
+ constructor({ config, interceptors }) {
544
+ // Return Promise<true> if refresh in any tab is successful;
545
+ this.runWithLock = () => {
546
+ if (RefreshSession.isLocked()) {
547
+ return Promise.resolve().then(async () => {
548
+ while (RefreshSession.isLocked()) {
549
+ await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE);
550
+ }
551
+ return {};
552
+ });
540
553
  }
541
- return {};
542
- });
543
- }
544
- RefreshSession.lock(REFRESH_EXPIRY);
545
- let isLocallyRefreshingToken = true;
546
- (async () => {
547
- while (isLocallyRefreshingToken) {
548
554
  RefreshSession.lock(REFRESH_EXPIRY);
549
- await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE);
550
- }
551
- })();
552
- return Promise.resolve().then(doRefreshSession({ axiosConfig, clientId, refreshToken, tokenUrl })).finally(() => {
553
- isLocallyRefreshingToken = false;
554
- RefreshSession.unlock();
555
- });
556
- };
557
- var doRefreshSession = ({ axiosConfig, clientId, refreshToken, tokenUrl }) => async () => {
558
- if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {
559
- return false;
560
- }
561
- const result = await refreshSession({ axiosConfig, clientId, refreshToken, tokenUrl });
562
- if (result.error) {
563
- return false;
555
+ let isLocallyRefreshingToken = true;
556
+ (async () => {
557
+ while (isLocallyRefreshingToken) {
558
+ RefreshSession.lock(REFRESH_EXPIRY);
559
+ await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE);
560
+ }
561
+ })();
562
+ return Promise.resolve().then(() => this.run()).finally(() => {
563
+ isLocallyRefreshingToken = false;
564
+ RefreshSession.unlock();
565
+ });
566
+ };
567
+ this.run = async () => {
568
+ const { axiosConfig, refreshToken } = this.config;
569
+ if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {
570
+ return false;
571
+ }
572
+ const result = await this.refreshToken();
573
+ if (result.error) {
574
+ return false;
575
+ }
576
+ return result.response.data;
577
+ };
578
+ this.refreshToken = () => {
579
+ const { axiosConfig, refreshToken, clientId, tokenUrl } = this.config;
580
+ const config = {
581
+ ...axiosConfig,
582
+ withCredentials: false,
583
+ headers: {
584
+ "Content-Type": "application/x-www-form-urlencoded",
585
+ Authorization: `Basic ${Buffer.from(`${clientId}:`).toString("base64")}`
586
+ }
587
+ };
588
+ const axios4 = Network.create(config);
589
+ for (const interceptor of this.interceptors) {
590
+ if (interceptor.type === "request") {
591
+ axios4.interceptors.request.use(interceptor == null ? void 0 : interceptor.onRequest, interceptor.onError);
592
+ }
593
+ if (interceptor.type === "response") {
594
+ axios4.interceptors.response.use(interceptor == null ? void 0 : interceptor.onSuccess, interceptor.onError);
595
+ }
596
+ }
597
+ const payload = {
598
+ refresh_token: refreshToken || void 0,
599
+ client_id: clientId,
600
+ grant_type: "refresh_token"
601
+ };
602
+ if (tokenUrl === "/iam/v4/oauth/token" /* GRANT_TOKEN_V4 */) {
603
+ return new OAuth20V4$(axios4).postOauthToken_v4(payload);
604
+ }
605
+ const oauth20 = new OAuth20$(axios4);
606
+ return oauth20.postOauthToken(payload);
607
+ };
608
+ this.config = config;
609
+ this.interceptors = interceptors || [];
564
610
  }
565
- return result.response.data;
566
611
  };
567
- var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig, errorConfig) => {
612
+ var refreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig, errorConfig) => {
568
613
  if (tokenResponse) {
569
614
  const { access_token } = tokenResponse;
570
615
  if (!axiosConfig.withCredentials && access_token) {
571
- return (0, import_axios2.default)({
616
+ return (0, import_axios3.default)({
572
617
  ...errorConfig,
573
618
  headers: {
574
619
  ...errorConfig.headers,
@@ -576,7 +621,7 @@ var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig,
576
621
  }
577
622
  });
578
623
  } else {
579
- return (0, import_axios2.default)(errorConfig);
624
+ return (0, import_axios3.default)(errorConfig);
580
625
  }
581
626
  }
582
627
  if (onSessionExpired) {
@@ -584,6 +629,49 @@ var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig,
584
629
  }
585
630
  throw error;
586
631
  };
632
+ var createAuthInterceptor = ({
633
+ clientId,
634
+ onSessionExpired,
635
+ onGetUserSession,
636
+ expectedErrorUrls = Object.values({ ...LoginUrls, ...GrantTokenUrls }),
637
+ getRefreshToken,
638
+ tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */
639
+ }) => {
640
+ return {
641
+ type: "response",
642
+ name: "session-expired",
643
+ onError: (e) => {
644
+ const error = e;
645
+ const { config, response } = error;
646
+ if (import_axios3.default.isCancel(error)) {
647
+ return Promise.reject(error);
648
+ }
649
+ if (!response) {
650
+ console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config == null ? void 0 : config.baseURL}${config == null ? void 0 : config.url}. ${error.message}
651
+ `);
652
+ }
653
+ if ((response == null ? void 0 : response.status) === 401) {
654
+ const { url } = config || {};
655
+ const axiosConfig = config;
656
+ const refreshToken = getRefreshToken();
657
+ if (!url || url && expectedErrorUrls.includes(url)) {
658
+ return Promise.reject(error);
659
+ }
660
+ const refresh = new RefreshToken({
661
+ config: { axiosConfig, clientId, refreshToken, tokenUrl },
662
+ interceptors: [
663
+ createRefreshSessionInterceptor({ tokenUrl }),
664
+ createGetSessionInterceptor({ onGetUserSession: onGetUserSession || noOp, tokenUrl })
665
+ ]
666
+ });
667
+ return refresh.runWithLock().then((tokenResponse) => {
668
+ return refreshComplete(error, tokenResponse, onSessionExpired, axiosConfig, config || {});
669
+ });
670
+ }
671
+ return Promise.reject(error);
672
+ }
673
+ };
674
+ };
587
675
  var createRefreshSessionInterceptor = (options) => {
588
676
  const { tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */ } = options || {};
589
677
  return {
@@ -617,41 +705,6 @@ var createGetSessionInterceptor = ({
617
705
  return response;
618
706
  }
619
707
  });
620
- var createSessionExpiredInterceptor = ({
621
- clientId,
622
- onSessionExpired,
623
- expectedErrorUrls = Object.values({ ...LoginUrls, ...GrantTokenUrls }),
624
- getRefreshToken,
625
- tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */
626
- }) => {
627
- return {
628
- type: "response",
629
- name: "session-expired",
630
- onError: (e) => {
631
- const error = e;
632
- const { config, response } = error;
633
- if (import_axios2.default.isCancel(error)) {
634
- return Promise.reject(error);
635
- }
636
- if (!response) {
637
- console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config == null ? void 0 : config.baseURL}${config == null ? void 0 : config.url}. ${error.message}
638
- `);
639
- }
640
- if ((response == null ? void 0 : response.status) === 401) {
641
- const { url } = config || {};
642
- const axiosConfig = config;
643
- const refreshToken = getRefreshToken();
644
- if (!url || url && expectedErrorUrls.includes(url)) {
645
- return Promise.reject(error);
646
- }
647
- return refreshWithLock({ axiosConfig, clientId, refreshToken, tokenUrl }).then((tokenResponse) => {
648
- return uponRefreshComplete(error, tokenResponse, onSessionExpired, axiosConfig, config || {});
649
- });
650
- }
651
- return Promise.reject(error);
652
- }
653
- };
654
- };
655
708
 
656
709
  // src/constants/paths.ts
657
710
  var INTERNAL_SERVICES = {
@@ -747,27 +800,6 @@ var ErrorInterceptors = [
747
800
  }
748
801
  ];
749
802
 
750
- // src/utils/ApiUtils.ts
751
- var import_axios3 = __toESM(require("axios"), 1);
752
- var ApiUtils = class {
753
- };
754
- ApiUtils.mergeAxiosConfigs = (config, overrides) => {
755
- return {
756
- ...config,
757
- ...overrides,
758
- headers: {
759
- ...config == null ? void 0 : config.headers,
760
- ...overrides == null ? void 0 : overrides.headers
761
- }
762
- };
763
- };
764
- ApiUtils.is4xxError = (error) => {
765
- if (import_axios3.default.isAxiosError(error) && error.response) {
766
- return error.response.status >= 400 && error.response.status <= 499;
767
- }
768
- return false;
769
- };
770
-
771
803
  // src/utils/Type.ts
772
804
  function isType(schema, data) {
773
805
  return schema.safeParse(data).success;
@@ -839,15 +871,14 @@ var UrlHelper = _UrlHelper;
839
871
  IamErrorCode,
840
872
  Network,
841
873
  RefreshSession,
874
+ RefreshToken,
842
875
  SdkDevice,
843
876
  UrlHelper,
844
877
  Validate,
878
+ createAuthInterceptor,
845
879
  createCustomPathInterceptor,
846
880
  createGetSessionInterceptor,
847
881
  createRefreshSessionInterceptor,
848
- createSessionExpiredInterceptor,
849
- doRefreshSession,
850
- isType,
851
- refreshWithLock
882
+ isType
852
883
  });
853
884
  //# sourceMappingURL=index.cjs.map