@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.
@@ -4,8 +4,29 @@ if (!global.crypto) {
4
4
  global.crypto = webcrypto;
5
5
  }
6
6
 
7
- // src/utils/Network.ts
7
+ // src/utils/ApiUtils.ts
8
8
  import axios from "axios";
9
+ var ApiUtils = class {
10
+ };
11
+ ApiUtils.mergeAxiosConfigs = (config, overrides) => {
12
+ return {
13
+ ...config,
14
+ ...overrides,
15
+ headers: {
16
+ ...config == null ? void 0 : config.headers,
17
+ ...overrides == null ? void 0 : overrides.headers
18
+ }
19
+ };
20
+ };
21
+ ApiUtils.is4xxError = (error) => {
22
+ if (axios.isAxiosError(error) && error.response) {
23
+ return error.response.status >= 400 && error.response.status <= 499;
24
+ }
25
+ return false;
26
+ };
27
+
28
+ // src/utils/Network.ts
29
+ import axios2 from "axios";
9
30
  import qs from "query-string";
10
31
 
11
32
  // src/utils/SdkDevice.ts
@@ -49,7 +70,7 @@ var isMobile = (opts) => {
49
70
  // src/utils/Network.ts
50
71
  var _Network = class _Network {
51
72
  static create(...configs) {
52
- const axiosInstance = axios.create(
73
+ const axiosInstance = axios2.create(
53
74
  Object.assign(
54
75
  {
55
76
  paramsSerializer: qs.stringify
@@ -113,9 +134,12 @@ var AccelByteSDK = class _AccelByteSDK {
113
134
  }
114
135
  }
115
136
  };
116
- this.axiosInstance = Network.create({ baseURL: coreConfig.baseURL, ...this.axiosConfig.request });
137
+ this.axiosInstance = this.createAxiosInstance();
117
138
  this.token = {};
118
139
  }
140
+ createAxiosInstance() {
141
+ return Network.create({ baseURL: this.coreConfig.baseURL, ...this.axiosConfig.request });
142
+ }
119
143
  assembly() {
120
144
  return {
121
145
  axiosInstance: this.axiosInstance,
@@ -148,6 +172,7 @@ var AccelByteSDK = class _AccelByteSDK {
148
172
  return this;
149
173
  }
150
174
  this.axiosConfig.interceptors = this.axiosConfig.interceptors.filter(filterCallback);
175
+ this.axiosInstance = this.createAxiosInstance();
151
176
  return this;
152
177
  }
153
178
  setConfig({ coreConfig, axiosConfig }) {
@@ -159,6 +184,7 @@ var AccelByteSDK = class _AccelByteSDK {
159
184
  ...this.axiosConfig,
160
185
  ...axiosConfig
161
186
  };
187
+ this.axiosInstance = this.createAxiosInstance();
162
188
  return this;
163
189
  }
164
190
  setToken(token) {
@@ -166,6 +192,12 @@ var AccelByteSDK = class _AccelByteSDK {
166
192
  ...this.token,
167
193
  ...token
168
194
  };
195
+ const configOverride = { headers: { Authorization: this.token.accessToken ? `Bearer ${this.token.accessToken}` : "" } };
196
+ this.axiosConfig = {
197
+ ...this.axiosConfig,
198
+ request: ApiUtils.mergeAxiosConfigs(this.axiosInstance.defaults, configOverride)
199
+ };
200
+ this.axiosInstance = this.createAxiosInstance();
169
201
  }
170
202
  removeToken() {
171
203
  this.token = {};
@@ -202,7 +234,7 @@ var ERROR_CODE_TOKEN_EXPIRED = 10196;
202
234
  var ERROR_USER_BANNED = 10134;
203
235
 
204
236
  // src/interceptors/AuthInterceptors.ts
205
- import axios2 from "axios";
237
+ import axios3 from "axios";
206
238
 
207
239
  // src/utils/DesktopChecker.ts
208
240
  var _DesktopChecker = class _DesktopChecker {
@@ -446,69 +478,83 @@ var LoginUrls = /* @__PURE__ */ ((LoginUrls2) => {
446
478
  LoginUrls2["REVOKE"] = "/iam/v3/oauth/revoke";
447
479
  return LoginUrls2;
448
480
  })(LoginUrls || {});
449
- var refreshSession = ({ axiosConfig, refreshToken, clientId, tokenUrl }) => {
450
- const config = {
451
- ...axiosConfig,
452
- withCredentials: false,
453
- headers: {
454
- "Content-Type": "application/x-www-form-urlencoded",
455
- Authorization: `Basic ${Buffer.from(`${clientId}:`).toString("base64")}`
456
- }
457
- };
458
- const axios4 = Network.create(config);
459
- const payload = {
460
- refresh_token: refreshToken || void 0,
461
- client_id: clientId,
462
- grant_type: "refresh_token"
463
- };
464
- if (tokenUrl === "/iam/v4/oauth/token" /* GRANT_TOKEN_V4 */) {
465
- return new OAuth20V4$(axios4).postOauthToken_v4(payload);
466
- }
467
- const oauth20 = new OAuth20$(axios4);
468
- return oauth20.postOauthToken(payload);
469
- };
470
- var refreshWithLock = ({
471
- axiosConfig,
472
- refreshToken,
473
- clientId,
474
- tokenUrl
475
- }) => {
476
- if (RefreshSession.isLocked()) {
477
- return Promise.resolve().then(async () => {
478
- while (RefreshSession.isLocked()) {
479
- await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE);
481
+ var noOp = () => {
482
+ };
483
+ var RefreshToken = class {
484
+ constructor({ config, interceptors }) {
485
+ // Return Promise<true> if refresh in any tab is successful;
486
+ this.runWithLock = () => {
487
+ if (RefreshSession.isLocked()) {
488
+ return Promise.resolve().then(async () => {
489
+ while (RefreshSession.isLocked()) {
490
+ await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE);
491
+ }
492
+ return {};
493
+ });
480
494
  }
481
- return {};
482
- });
483
- }
484
- RefreshSession.lock(REFRESH_EXPIRY);
485
- let isLocallyRefreshingToken = true;
486
- (async () => {
487
- while (isLocallyRefreshingToken) {
488
495
  RefreshSession.lock(REFRESH_EXPIRY);
489
- await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE);
490
- }
491
- })();
492
- return Promise.resolve().then(doRefreshSession({ axiosConfig, clientId, refreshToken, tokenUrl })).finally(() => {
493
- isLocallyRefreshingToken = false;
494
- RefreshSession.unlock();
495
- });
496
- };
497
- var doRefreshSession = ({ axiosConfig, clientId, refreshToken, tokenUrl }) => async () => {
498
- if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {
499
- return false;
500
- }
501
- const result = await refreshSession({ axiosConfig, clientId, refreshToken, tokenUrl });
502
- if (result.error) {
503
- return false;
496
+ let isLocallyRefreshingToken = true;
497
+ (async () => {
498
+ while (isLocallyRefreshingToken) {
499
+ RefreshSession.lock(REFRESH_EXPIRY);
500
+ await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE);
501
+ }
502
+ })();
503
+ return Promise.resolve().then(() => this.run()).finally(() => {
504
+ isLocallyRefreshingToken = false;
505
+ RefreshSession.unlock();
506
+ });
507
+ };
508
+ this.run = async () => {
509
+ const { axiosConfig, refreshToken } = this.config;
510
+ if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {
511
+ return false;
512
+ }
513
+ const result = await this.refreshToken();
514
+ if (result.error) {
515
+ return false;
516
+ }
517
+ return result.response.data;
518
+ };
519
+ this.refreshToken = () => {
520
+ const { axiosConfig, refreshToken, clientId, tokenUrl } = this.config;
521
+ const config = {
522
+ ...axiosConfig,
523
+ withCredentials: false,
524
+ headers: {
525
+ "Content-Type": "application/x-www-form-urlencoded",
526
+ Authorization: `Basic ${Buffer.from(`${clientId}:`).toString("base64")}`
527
+ }
528
+ };
529
+ const axios4 = Network.create(config);
530
+ for (const interceptor of this.interceptors) {
531
+ if (interceptor.type === "request") {
532
+ axios4.interceptors.request.use(interceptor == null ? void 0 : interceptor.onRequest, interceptor.onError);
533
+ }
534
+ if (interceptor.type === "response") {
535
+ axios4.interceptors.response.use(interceptor == null ? void 0 : interceptor.onSuccess, interceptor.onError);
536
+ }
537
+ }
538
+ const payload = {
539
+ refresh_token: refreshToken || void 0,
540
+ client_id: clientId,
541
+ grant_type: "refresh_token"
542
+ };
543
+ if (tokenUrl === "/iam/v4/oauth/token" /* GRANT_TOKEN_V4 */) {
544
+ return new OAuth20V4$(axios4).postOauthToken_v4(payload);
545
+ }
546
+ const oauth20 = new OAuth20$(axios4);
547
+ return oauth20.postOauthToken(payload);
548
+ };
549
+ this.config = config;
550
+ this.interceptors = interceptors || [];
504
551
  }
505
- return result.response.data;
506
552
  };
507
- var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig, errorConfig) => {
553
+ var refreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig, errorConfig) => {
508
554
  if (tokenResponse) {
509
555
  const { access_token } = tokenResponse;
510
556
  if (!axiosConfig.withCredentials && access_token) {
511
- return axios2({
557
+ return axios3({
512
558
  ...errorConfig,
513
559
  headers: {
514
560
  ...errorConfig.headers,
@@ -516,7 +562,7 @@ var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig,
516
562
  }
517
563
  });
518
564
  } else {
519
- return axios2(errorConfig);
565
+ return axios3(errorConfig);
520
566
  }
521
567
  }
522
568
  if (onSessionExpired) {
@@ -524,6 +570,49 @@ var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig,
524
570
  }
525
571
  throw error;
526
572
  };
573
+ var createAuthInterceptor = ({
574
+ clientId,
575
+ onSessionExpired,
576
+ onGetUserSession,
577
+ expectedErrorUrls = Object.values({ ...LoginUrls, ...GrantTokenUrls }),
578
+ getRefreshToken,
579
+ tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */
580
+ }) => {
581
+ return {
582
+ type: "response",
583
+ name: "session-expired",
584
+ onError: (e) => {
585
+ const error = e;
586
+ const { config, response } = error;
587
+ if (axios3.isCancel(error)) {
588
+ return Promise.reject(error);
589
+ }
590
+ if (!response) {
591
+ console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config == null ? void 0 : config.baseURL}${config == null ? void 0 : config.url}. ${error.message}
592
+ `);
593
+ }
594
+ if ((response == null ? void 0 : response.status) === 401) {
595
+ const { url } = config || {};
596
+ const axiosConfig = config;
597
+ const refreshToken = getRefreshToken();
598
+ if (!url || url && expectedErrorUrls.includes(url)) {
599
+ return Promise.reject(error);
600
+ }
601
+ const refresh = new RefreshToken({
602
+ config: { axiosConfig, clientId, refreshToken, tokenUrl },
603
+ interceptors: [
604
+ createRefreshSessionInterceptor({ tokenUrl }),
605
+ createGetSessionInterceptor({ onGetUserSession: onGetUserSession || noOp, tokenUrl })
606
+ ]
607
+ });
608
+ return refresh.runWithLock().then((tokenResponse) => {
609
+ return refreshComplete(error, tokenResponse, onSessionExpired, axiosConfig, config || {});
610
+ });
611
+ }
612
+ return Promise.reject(error);
613
+ }
614
+ };
615
+ };
527
616
  var createRefreshSessionInterceptor = (options) => {
528
617
  const { tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */ } = options || {};
529
618
  return {
@@ -557,41 +646,6 @@ var createGetSessionInterceptor = ({
557
646
  return response;
558
647
  }
559
648
  });
560
- var createSessionExpiredInterceptor = ({
561
- clientId,
562
- onSessionExpired,
563
- expectedErrorUrls = Object.values({ ...LoginUrls, ...GrantTokenUrls }),
564
- getRefreshToken,
565
- tokenUrl = "/iam/v3/oauth/token" /* GRANT_TOKEN */
566
- }) => {
567
- return {
568
- type: "response",
569
- name: "session-expired",
570
- onError: (e) => {
571
- const error = e;
572
- const { config, response } = error;
573
- if (axios2.isCancel(error)) {
574
- return Promise.reject(error);
575
- }
576
- if (!response) {
577
- console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config == null ? void 0 : config.baseURL}${config == null ? void 0 : config.url}. ${error.message}
578
- `);
579
- }
580
- if ((response == null ? void 0 : response.status) === 401) {
581
- const { url } = config || {};
582
- const axiosConfig = config;
583
- const refreshToken = getRefreshToken();
584
- if (!url || url && expectedErrorUrls.includes(url)) {
585
- return Promise.reject(error);
586
- }
587
- return refreshWithLock({ axiosConfig, clientId, refreshToken, tokenUrl }).then((tokenResponse) => {
588
- return uponRefreshComplete(error, tokenResponse, onSessionExpired, axiosConfig, config || {});
589
- });
590
- }
591
- return Promise.reject(error);
592
- }
593
- };
594
- };
595
649
 
596
650
  // src/constants/paths.ts
597
651
  var INTERNAL_SERVICES = {
@@ -687,27 +741,6 @@ var ErrorInterceptors = [
687
741
  }
688
742
  ];
689
743
 
690
- // src/utils/ApiUtils.ts
691
- import axios3 from "axios";
692
- var ApiUtils = class {
693
- };
694
- ApiUtils.mergeAxiosConfigs = (config, overrides) => {
695
- return {
696
- ...config,
697
- ...overrides,
698
- headers: {
699
- ...config == null ? void 0 : config.headers,
700
- ...overrides == null ? void 0 : overrides.headers
701
- }
702
- };
703
- };
704
- ApiUtils.is4xxError = (error) => {
705
- if (axios3.isAxiosError(error) && error.response) {
706
- return error.response.status >= 400 && error.response.status <= 499;
707
- }
708
- return false;
709
- };
710
-
711
744
  // src/utils/Type.ts
712
745
  function isType(schema, data) {
713
746
  return schema.safeParse(data).success;
@@ -778,15 +811,14 @@ export {
778
811
  IamErrorCode,
779
812
  Network,
780
813
  RefreshSession,
814
+ RefreshToken,
781
815
  SdkDevice,
782
816
  UrlHelper,
783
817
  Validate,
818
+ createAuthInterceptor,
784
819
  createCustomPathInterceptor,
785
820
  createGetSessionInterceptor,
786
821
  createRefreshSessionInterceptor,
787
- createSessionExpiredInterceptor,
788
- doRefreshSession,
789
- isType,
790
- refreshWithLock
822
+ isType
791
823
  };
792
824
  //# sourceMappingURL=index.node.js.map