@accelbyte/sdk 0.0.0-dev-20240828032938 → 0.0.0-dev-20240828053809

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.
@@ -0,0 +1,752 @@
1
+ "use strict";
2
+ var __create = Object.create;
3
+ var __defProp = Object.defineProperty;
4
+ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
5
+ var __getOwnPropNames = Object.getOwnPropertyNames;
6
+ var __getProtoOf = Object.getPrototypeOf;
7
+ var __hasOwnProp = Object.prototype.hasOwnProperty;
8
+ var __export = (target, all) => {
9
+ for (var name in all)
10
+ __defProp(target, name, { get: all[name], enumerable: true });
11
+ };
12
+ var __copyProps = (to, from, except, desc) => {
13
+ if (from && typeof from === "object" || typeof from === "function") {
14
+ for (let key of __getOwnPropNames(from))
15
+ if (!__hasOwnProp.call(to, key) && key !== except)
16
+ __defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
17
+ }
18
+ return to;
19
+ };
20
+ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
21
+ // If the importer is in node compatibility mode or this is not an ESM
22
+ // file that has been converted to a CommonJS file using a Babel-
23
+ // compatible transform (i.e. "__esModule" has not been set), then set
24
+ // "default" to the CommonJS "module.exports" for node compatibility.
25
+ isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
26
+ mod
27
+ ));
28
+ var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
29
+
30
+ // src/index.node.ts
31
+ var index_node_exports = {};
32
+ __export(index_node_exports, {
33
+ AccelByte: () => AccelByte,
34
+ AccelByteSDK: () => AccelByteSDK,
35
+ ApiUtils: () => ApiUtils,
36
+ AuthInterceptors: () => AuthInterceptors,
37
+ BrowserHelper: () => BrowserHelper,
38
+ CodeGenUtil: () => CodeGenUtil,
39
+ DecodeError: () => DecodeError,
40
+ DesktopChecker: () => DesktopChecker,
41
+ ERROR_CODE_LINK_DELETION_ACCOUNT: () => ERROR_CODE_LINK_DELETION_ACCOUNT,
42
+ ERROR_CODE_TOKEN_EXPIRED: () => ERROR_CODE_TOKEN_EXPIRED,
43
+ ERROR_LINK_ANOTHER_3RD_PARTY_ACCOUNT: () => ERROR_LINK_ANOTHER_3RD_PARTY_ACCOUNT,
44
+ ERROR_USER_BANNED: () => ERROR_USER_BANNED,
45
+ ErrorInterceptors: () => ErrorInterceptors,
46
+ IamErrorCode: () => IamErrorCode,
47
+ Network: () => Network,
48
+ RefreshSession: () => RefreshSession,
49
+ SdkDevice: () => SdkDevice,
50
+ UrlHelper: () => UrlHelper,
51
+ Validate: () => Validate,
52
+ doRefreshSession: () => doRefreshSession,
53
+ refreshWithLock: () => refreshWithLock
54
+ });
55
+ module.exports = __toCommonJS(index_node_exports);
56
+
57
+ // src/polyfills/node.ts
58
+ var import_crypto = require("crypto");
59
+ if (!global.crypto) {
60
+ global.crypto = import_crypto.webcrypto;
61
+ }
62
+
63
+ // src/utils/Network.ts
64
+ var import_axios = __toESM(require("axios"), 1);
65
+ var import_query_string = __toESM(require("query-string"), 1);
66
+
67
+ // src/utils/SdkDevice.ts
68
+ var uuid = __toESM(require("uuid"), 1);
69
+ var _SdkDevice = class _SdkDevice {
70
+ };
71
+ _SdkDevice.ID_KEY = "deviceId";
72
+ _SdkDevice.TYPE = {
73
+ MOBILE: "mobile",
74
+ DESKTOP: "desktop"
75
+ };
76
+ _SdkDevice.getType = () => {
77
+ return isMobile() ? _SdkDevice.TYPE.MOBILE : _SdkDevice.TYPE.DESKTOP;
78
+ };
79
+ _SdkDevice.generateUUID = () => {
80
+ const deviceIdInUUID = uuid.v4().split("-").join("");
81
+ localStorage.setItem(_SdkDevice.ID_KEY, deviceIdInUUID);
82
+ return deviceIdInUUID;
83
+ };
84
+ _SdkDevice.getDeviceId = () => {
85
+ return localStorage.getItem(_SdkDevice.ID_KEY) || _SdkDevice.generateUUID();
86
+ };
87
+ var SdkDevice = _SdkDevice;
88
+ var mobileRE = /(android|bb\d+|meego).+mobile|armv7l|avantgo|bada\/|blackberry|blazer|compal|elaine|fennec|hiptop|iemobile|ip(hone|od)|iris|kindle|lge |maemo|midp|mmp|mobile.+firefox|netfront|opera m(ob|in)i|palm( os)?|phone|p(ixi|re)\/|plucker|pocket|psp|series[46]0|symbian|treo|up\.(browser|link)|vodafone|wap|windows (ce|phone)|xda|xiino/i;
89
+ var tabletRE = /android|ipad|playbook|silk/i;
90
+ var isMobile = (opts) => {
91
+ if (!opts) opts = {};
92
+ let ua = opts.ua;
93
+ if (!ua && typeof navigator !== "undefined") ua = navigator.userAgent;
94
+ if (ua && ua.headers && typeof ua.headers["user-agent"] === "string") {
95
+ ua = ua.headers["user-agent"];
96
+ }
97
+ if (typeof ua !== "string") return false;
98
+ let result = mobileRE.test(ua) || !!opts.tablet && tabletRE.test(ua);
99
+ if (!result && opts.tablet && opts.featureDetect && navigator && navigator.maxTouchPoints > 1 && ua.indexOf("Macintosh") !== -1 && ua.indexOf("Safari") !== -1) {
100
+ result = true;
101
+ }
102
+ return result;
103
+ };
104
+
105
+ // src/utils/Network.ts
106
+ var _Network = class _Network {
107
+ static create(...configs) {
108
+ const axiosInstance = import_axios.default.create(
109
+ Object.assign(
110
+ {
111
+ paramsSerializer: import_query_string.default.stringify
112
+ },
113
+ ...configs
114
+ )
115
+ );
116
+ return axiosInstance;
117
+ }
118
+ static withBearerToken(accessToken, config) {
119
+ return _Network.create(config || {}, {
120
+ headers: { Authorization: `Bearer ${accessToken}` }
121
+ });
122
+ }
123
+ };
124
+ _Network.setDeviceTokenCookie = () => {
125
+ const deviceId = SdkDevice.getDeviceId();
126
+ document.cookie = `device_token=${deviceId}; path=/;`;
127
+ };
128
+ _Network.removeDeviceTokenCookie = () => {
129
+ document.cookie = `device_token=; expires=${(/* @__PURE__ */ new Date(0)).toUTCString()}`;
130
+ };
131
+ _Network.getFormUrlEncodedData = (data) => {
132
+ const formPayload = new URLSearchParams();
133
+ const formKeys = Object.keys(data);
134
+ formKeys.forEach((key) => {
135
+ if (data[key]) formPayload.append(key, data[key]);
136
+ });
137
+ return formPayload;
138
+ };
139
+ var Network = _Network;
140
+
141
+ // src/AccelByteSDK.ts
142
+ var AccelByte = {
143
+ SDK: (param) => {
144
+ return new AccelByteSDK(param);
145
+ }
146
+ };
147
+ var AccelByteSDK = class _AccelByteSDK {
148
+ constructor({ coreConfig, axiosConfig }) {
149
+ var _a;
150
+ this.coreConfig = {
151
+ ...coreConfig,
152
+ useSchemaValidation: coreConfig.useSchemaValidation ?? true
153
+ };
154
+ this.axiosConfig = {
155
+ /**
156
+ * when user create a variable to store intercepters and passed into sdk
157
+ * the sdk will use the variable as reference value,
158
+ * so when new interceptor added, reference value will also has the new interceptor,
159
+ * to avoid this we create shallow copy for the interceptors
160
+ */
161
+ interceptors: (axiosConfig == null ? void 0 : axiosConfig.interceptors) ? [...axiosConfig.interceptors] : void 0,
162
+ request: {
163
+ timeout: 6e4,
164
+ withCredentials: true,
165
+ ...axiosConfig == null ? void 0 : axiosConfig.request,
166
+ headers: {
167
+ "Content-Type": "application/json",
168
+ ...(_a = axiosConfig == null ? void 0 : axiosConfig.request) == null ? void 0 : _a.headers
169
+ }
170
+ }
171
+ };
172
+ this.axiosInstance = Network.create({ baseURL: coreConfig.baseURL, ...this.axiosConfig.request });
173
+ }
174
+ assembly() {
175
+ return {
176
+ axiosInstance: this.axiosInstance,
177
+ coreConfig: this.coreConfig,
178
+ axiosConfig: this.axiosConfig
179
+ };
180
+ }
181
+ clone(opts) {
182
+ const newConfigs = {
183
+ coreConfig: { ...this.coreConfig },
184
+ axiosConfig: { ...this.axiosConfig }
185
+ };
186
+ if ((opts == null ? void 0 : opts.interceptors) === false) {
187
+ delete newConfigs.axiosConfig.interceptors;
188
+ }
189
+ return new _AccelByteSDK(newConfigs);
190
+ }
191
+ addInterceptors(interceptors) {
192
+ if (!this.axiosConfig.interceptors) {
193
+ this.axiosConfig.interceptors = [];
194
+ }
195
+ this.axiosConfig.interceptors.push(...interceptors);
196
+ return this;
197
+ }
198
+ removeInterceptors(filterCallback) {
199
+ var _a;
200
+ if (!((_a = this.axiosConfig) == null ? void 0 : _a.interceptors)) return this;
201
+ if (!filterCallback) {
202
+ this.axiosConfig.interceptors = void 0;
203
+ return this;
204
+ }
205
+ this.axiosConfig.interceptors = this.axiosConfig.interceptors.filter(filterCallback);
206
+ return this;
207
+ }
208
+ setConfig({ coreConfig, axiosConfig }) {
209
+ this.coreConfig = {
210
+ ...this.coreConfig,
211
+ ...coreConfig
212
+ };
213
+ this.axiosConfig = {
214
+ ...this.axiosConfig,
215
+ ...axiosConfig
216
+ };
217
+ return this;
218
+ }
219
+ };
220
+
221
+ // src/constants/IamErrorCode.ts
222
+ var IamErrorCode = /* @__PURE__ */ ((IamErrorCode2) => {
223
+ IamErrorCode2[IamErrorCode2["InternalServerError"] = 2e4] = "InternalServerError";
224
+ IamErrorCode2[IamErrorCode2["UnauthorizedAccess"] = 20001] = "UnauthorizedAccess";
225
+ IamErrorCode2[IamErrorCode2["ValidationError"] = 20002] = "ValidationError";
226
+ IamErrorCode2[IamErrorCode2["ForbiddenAccess"] = 20003] = "ForbiddenAccess";
227
+ IamErrorCode2[IamErrorCode2["TooManyRequests"] = 20007] = "TooManyRequests";
228
+ IamErrorCode2[IamErrorCode2["UserNotFound"] = 20008] = "UserNotFound";
229
+ IamErrorCode2[IamErrorCode2["TokenIsExpired"] = 20011] = "TokenIsExpired";
230
+ IamErrorCode2[IamErrorCode2["InsufficientPermissions"] = 20013] = "InsufficientPermissions";
231
+ IamErrorCode2[IamErrorCode2["InvalidAudience"] = 20014] = "InvalidAudience";
232
+ IamErrorCode2[IamErrorCode2["InsufficientScope"] = 20015] = "InsufficientScope";
233
+ IamErrorCode2[IamErrorCode2["UnableToParseRequestBody"] = 20019] = "UnableToParseRequestBody";
234
+ IamErrorCode2[IamErrorCode2["InvalidPaginationParameters"] = 20021] = "InvalidPaginationParameters";
235
+ IamErrorCode2[IamErrorCode2["TokenIsNotUserToken"] = 20022] = "TokenIsNotUserToken";
236
+ IamErrorCode2[IamErrorCode2["InvalidRefererHeader"] = 20023] = "InvalidRefererHeader";
237
+ IamErrorCode2[IamErrorCode2["SubdomainMismatch"] = 20030] = "SubdomainMismatch";
238
+ return IamErrorCode2;
239
+ })(IamErrorCode || {});
240
+
241
+ // src/constants/LinkAccount.ts
242
+ var ERROR_LINK_ANOTHER_3RD_PARTY_ACCOUNT = 10200;
243
+ var ERROR_CODE_LINK_DELETION_ACCOUNT = 10135;
244
+ var ERROR_CODE_TOKEN_EXPIRED = 10196;
245
+ var ERROR_USER_BANNED = 10134;
246
+
247
+ // src/interceptors/AuthInterceptors.ts
248
+ var import_axios2 = __toESM(require("axios"), 1);
249
+
250
+ // src/utils/DesktopChecker.ts
251
+ var _DesktopChecker = class _DesktopChecker {
252
+ static isDesktopApp() {
253
+ return _DesktopChecker.desktopApp && !_DesktopChecker.isInIframe();
254
+ }
255
+ static isInIframe() {
256
+ try {
257
+ return window.self !== window.top;
258
+ } catch (error) {
259
+ return true;
260
+ }
261
+ }
262
+ // borrowed from https://github.com/cheton/is-electron
263
+ static isElectron() {
264
+ if (typeof window !== "undefined" && typeof window.process === "object" && window.process.type === "renderer") {
265
+ return true;
266
+ }
267
+ if (typeof process !== "undefined" && typeof process.versions === "object" && !!process.versions.electron) {
268
+ return true;
269
+ }
270
+ if (typeof navigator === "object" && typeof navigator.userAgent === "string" && navigator.userAgent.indexOf("Electron") >= 0) {
271
+ return true;
272
+ }
273
+ return false;
274
+ }
275
+ };
276
+ _DesktopChecker.desktopApp = _DesktopChecker.isElectron();
277
+ var DesktopChecker = _DesktopChecker;
278
+
279
+ // src/utils/BrowserHelper.ts
280
+ var BrowserHelper = class {
281
+ };
282
+ BrowserHelper.isOnBrowser = () => {
283
+ return typeof window !== "undefined" && window.document;
284
+ };
285
+
286
+ // src/utils/RefreshSession.ts
287
+ var _RefreshSession = class _RefreshSession {
288
+ };
289
+ // --
290
+ _RefreshSession.KEY = "RefreshSession.lock";
291
+ _RefreshSession.isLocked = () => {
292
+ if (!BrowserHelper.isOnBrowser()) return false;
293
+ const lockStatus = localStorage.getItem(_RefreshSession.KEY);
294
+ if (!lockStatus) {
295
+ return false;
296
+ }
297
+ const lockExpiry = Number(lockStatus);
298
+ if (isNaN(lockExpiry)) {
299
+ return false;
300
+ }
301
+ return lockExpiry > (/* @__PURE__ */ new Date()).getTime();
302
+ };
303
+ _RefreshSession.lock = (expiry) => {
304
+ if (!BrowserHelper.isOnBrowser()) return;
305
+ localStorage.setItem(_RefreshSession.KEY, `${(/* @__PURE__ */ new Date()).getTime() + expiry}`);
306
+ };
307
+ _RefreshSession.unlock = () => {
308
+ if (!BrowserHelper.isOnBrowser()) return;
309
+ localStorage.removeItem(_RefreshSession.KEY);
310
+ };
311
+ _RefreshSession.sleepAsync = (timeInMs) => new Promise((resolve) => setTimeout(resolve, timeInMs));
312
+ _RefreshSession.isBearerAuth = (config) => {
313
+ var _a, _b;
314
+ if (((_b = (_a = config == null ? void 0 : config.headers) == null ? void 0 : _a.Authorization) == null ? void 0 : _b.toLowerCase().indexOf("bearer")) > -1) {
315
+ return true;
316
+ }
317
+ return false;
318
+ };
319
+ var RefreshSession = _RefreshSession;
320
+
321
+ // ../sdk-iam/src/generated-definitions/TokenWithDeviceCookieResponseV3.ts
322
+ var import_zod4 = require("zod");
323
+
324
+ // ../sdk-iam/src/generated-definitions/JwtBanV3.ts
325
+ var import_zod = require("zod");
326
+ var JwtBanV3 = import_zod.z.object({
327
+ ban: import_zod.z.string(),
328
+ disabledDate: import_zod.z.string().nullish(),
329
+ enabled: import_zod.z.boolean(),
330
+ endDate: import_zod.z.string(),
331
+ targetedNamespace: import_zod.z.string()
332
+ });
333
+
334
+ // ../sdk-iam/src/generated-definitions/NamespaceRole.ts
335
+ var import_zod2 = require("zod");
336
+ var NamespaceRole = import_zod2.z.object({ namespace: import_zod2.z.string(), roleId: import_zod2.z.string() });
337
+
338
+ // ../sdk-iam/src/generated-definitions/PermissionV3.ts
339
+ var import_zod3 = require("zod");
340
+ var PermissionV3 = import_zod3.z.object({
341
+ action: import_zod3.z.number().int(),
342
+ resource: import_zod3.z.string(),
343
+ schedAction: import_zod3.z.number().int().nullish(),
344
+ schedCron: import_zod3.z.string().nullish(),
345
+ schedRange: import_zod3.z.array(import_zod3.z.string()).nullish()
346
+ });
347
+
348
+ // ../sdk-iam/src/generated-definitions/TokenWithDeviceCookieResponseV3.ts
349
+ var TokenWithDeviceCookieResponseV3 = import_zod4.z.object({
350
+ access_token: import_zod4.z.string(),
351
+ auth_trust_id: import_zod4.z.string().nullish(),
352
+ bans: import_zod4.z.array(JwtBanV3).nullish(),
353
+ display_name: import_zod4.z.string().nullish(),
354
+ expires_in: import_zod4.z.number().int(),
355
+ is_comply: import_zod4.z.boolean().nullish(),
356
+ jflgs: import_zod4.z.number().int().nullish(),
357
+ namespace: import_zod4.z.string(),
358
+ namespace_roles: import_zod4.z.array(NamespaceRole).nullish(),
359
+ permissions: import_zod4.z.array(PermissionV3),
360
+ platform_id: import_zod4.z.string().nullish(),
361
+ platform_user_id: import_zod4.z.string().nullish(),
362
+ refresh_expires_in: import_zod4.z.number().int().nullish(),
363
+ refresh_token: import_zod4.z.string().nullish(),
364
+ roles: import_zod4.z.array(import_zod4.z.string()).nullish(),
365
+ scope: import_zod4.z.string(),
366
+ simultaneous_platform_id: import_zod4.z.string().nullish(),
367
+ simultaneous_platform_user_id: import_zod4.z.string().nullish(),
368
+ token_type: import_zod4.z.string(),
369
+ unique_display_name: import_zod4.z.string().nullish(),
370
+ user_id: import_zod4.z.string().nullish(),
371
+ xuid: import_zod4.z.string().nullish()
372
+ });
373
+
374
+ // src/utils/CodeGenUtil.ts
375
+ var CodeGenUtil = class {
376
+ /**
377
+ * Returns a hash code from a string
378
+ * @param {String} str The string to hash.
379
+ * @return {Number} A 32bit integer
380
+ * @see http://werxltd.com/wp/2010/05/13/javascript-implementation-of-javas-string-hashcode-method/
381
+ */
382
+ static hashCode(str) {
383
+ let hash = 0;
384
+ for (let i = 0, len = str.length; i < len; i++) {
385
+ const chr = str.charCodeAt(i);
386
+ hash = (hash << 5) - hash + chr;
387
+ hash |= 0;
388
+ }
389
+ return hash;
390
+ }
391
+ };
392
+ CodeGenUtil.getFormUrlEncodedData = (data) => {
393
+ const formPayload = new URLSearchParams();
394
+ const formKeys = Object.keys(data);
395
+ formKeys.forEach((key) => {
396
+ if (typeof data[key] !== "undefined") formPayload.append(key, data[key]);
397
+ });
398
+ return formPayload;
399
+ };
400
+
401
+ // src/utils/Validate.ts
402
+ var Validate = class _Validate {
403
+ static validateOrReturnResponse(useSchemaValidation, networkCall, Codec, modelName) {
404
+ return useSchemaValidation ? _Validate.responseType(() => networkCall(), Codec, modelName) : _Validate.unsafeResponse(() => networkCall());
405
+ }
406
+ static responseType(networkCall, Codec, modelName) {
407
+ return wrapNetworkCallSafely(async () => {
408
+ const response = await networkCall();
409
+ const decodeResult = Codec.safeParse(response.data);
410
+ if (!decodeResult.success && response.status !== 204) {
411
+ throw new DecodeError({ error: decodeResult.error, response, modelName });
412
+ }
413
+ return response;
414
+ });
415
+ }
416
+ static unsafeResponse(networkCall) {
417
+ return wrapNetworkCallSafely(() => networkCall());
418
+ }
419
+ static safeParse(data, Codec) {
420
+ const result = Codec.safeParse(data);
421
+ if (result.success) {
422
+ return result.data;
423
+ }
424
+ return null;
425
+ }
426
+ };
427
+ async function wrapNetworkCallSafely(networkCallFunction) {
428
+ try {
429
+ const response = await networkCallFunction();
430
+ return { response, error: null };
431
+ } catch (error) {
432
+ return { response: null, error };
433
+ }
434
+ }
435
+ var DecodeError = class extends Error {
436
+ constructor({ error, response, modelName }) {
437
+ const msg = `response from url "${response.config.url}" doesn't match model "${modelName}"`;
438
+ super(msg);
439
+ console.error(msg, error);
440
+ }
441
+ };
442
+
443
+ // src/interceptors/AuthInterceptorDeps.ts
444
+ var OAuth20$ = class {
445
+ // @ts-ignore
446
+ constructor(axiosInstance, namespace) {
447
+ this.axiosInstance = axiosInstance;
448
+ this.namespace = namespace;
449
+ }
450
+ postOauthToken(data) {
451
+ const params = {};
452
+ const url = "/iam/v3/oauth/token";
453
+ const resultPromise = this.axiosInstance.post(url, CodeGenUtil.getFormUrlEncodedData(data), {
454
+ ...params,
455
+ headers: { ...params.headers, "content-type": "application/x-www-form-urlencoded" }
456
+ });
457
+ return Validate.responseType(() => resultPromise, TokenWithDeviceCookieResponseV3, "TokenWithDeviceCookieResponseV3");
458
+ }
459
+ };
460
+
461
+ // src/interceptors/AuthInterceptors.ts
462
+ var REFRESH_EXPIRY = 1e3;
463
+ var REFRESH_EXPIRY_UPDATE_RATE = 500;
464
+ var REFRESH_EXPIRY_CHECK_RATE = 1e3;
465
+ var LoginUrls = /* @__PURE__ */ ((LoginUrls2) => {
466
+ LoginUrls2["GRANT_TOKEN"] = "/iam/v3/oauth/token";
467
+ LoginUrls2["REVOKE"] = "/iam/v3/oauth/revoke";
468
+ return LoginUrls2;
469
+ })(LoginUrls || {});
470
+ var refreshSession = ({ axiosConfig, refreshToken, clientId }) => {
471
+ const config = {
472
+ ...axiosConfig,
473
+ withCredentials: false,
474
+ headers: {
475
+ "Content-Type": "application/x-www-form-urlencoded",
476
+ Authorization: `Basic ${Buffer.from(`${clientId}:`).toString("base64")}`
477
+ }
478
+ };
479
+ const axios4 = Network.create(config);
480
+ const payload = {
481
+ refresh_token: refreshToken || void 0,
482
+ client_id: clientId,
483
+ grant_type: "refresh_token"
484
+ };
485
+ const oauth20 = new OAuth20$(axios4, "NAMESPACE-NOT-REQUIRED");
486
+ return oauth20.postOauthToken(payload);
487
+ };
488
+ var refreshWithLock = ({
489
+ axiosConfig,
490
+ refreshToken,
491
+ clientId
492
+ }) => {
493
+ if (RefreshSession.isLocked()) {
494
+ return Promise.resolve().then(async () => {
495
+ while (RefreshSession.isLocked()) {
496
+ await RefreshSession.sleepAsync(REFRESH_EXPIRY_CHECK_RATE);
497
+ }
498
+ return {};
499
+ });
500
+ }
501
+ RefreshSession.lock(REFRESH_EXPIRY);
502
+ let isLocallyRefreshingToken = true;
503
+ (async () => {
504
+ while (isLocallyRefreshingToken) {
505
+ RefreshSession.lock(REFRESH_EXPIRY);
506
+ await RefreshSession.sleepAsync(REFRESH_EXPIRY_UPDATE_RATE);
507
+ }
508
+ })();
509
+ return Promise.resolve().then(doRefreshSession({ axiosConfig, clientId, refreshToken })).finally(() => {
510
+ isLocallyRefreshingToken = false;
511
+ RefreshSession.unlock();
512
+ });
513
+ };
514
+ var doRefreshSession = ({ axiosConfig, clientId, refreshToken }) => async () => {
515
+ if (DesktopChecker.isDesktopApp() && !axiosConfig.withCredentials && !refreshToken) {
516
+ return false;
517
+ }
518
+ const result = await refreshSession({ axiosConfig, clientId, refreshToken });
519
+ if (result.error) {
520
+ return false;
521
+ }
522
+ return result.response.data;
523
+ };
524
+ var uponRefreshComplete = (error, tokenResponse, onSessionExpired, axiosConfig, errorConfig) => {
525
+ if (tokenResponse) {
526
+ const { access_token } = tokenResponse;
527
+ if (!axiosConfig.withCredentials && access_token) {
528
+ return (0, import_axios2.default)({
529
+ ...errorConfig,
530
+ headers: {
531
+ ...errorConfig.headers,
532
+ Authorization: `Bearer ${access_token}`
533
+ }
534
+ });
535
+ } else {
536
+ return (0, import_axios2.default)(errorConfig);
537
+ }
538
+ }
539
+ if (onSessionExpired) {
540
+ onSessionExpired();
541
+ }
542
+ throw error;
543
+ };
544
+ var AuthInterceptors = [
545
+ {
546
+ type: "request",
547
+ name: "refresh-session",
548
+ onError: (error) => Promise.reject(error),
549
+ onRequest: async (config) => {
550
+ const isRefreshTokenUrl = config.url === "/iam/v3/oauth/token" /* GRANT_TOKEN */;
551
+ while (RefreshSession.isLocked() && !isRefreshTokenUrl) {
552
+ await RefreshSession.sleepAsync(200);
553
+ }
554
+ return config;
555
+ }
556
+ },
557
+ {
558
+ type: "response",
559
+ name: "get-session",
560
+ onError: (error) => Promise.reject(error),
561
+ onSuccess: (response) => {
562
+ const { config, status } = response;
563
+ if (config.url === "/iam/v3/oauth/token" /* GRANT_TOKEN */ && status === 200) {
564
+ const { access_token, refresh_token } = response.data;
565
+ if (access_token) {
566
+ }
567
+ }
568
+ return response;
569
+ }
570
+ },
571
+ {
572
+ type: "response",
573
+ name: "cancelled",
574
+ onError: (e) => {
575
+ const error = e;
576
+ if (import_axios2.default.isCancel(error)) {
577
+ return Promise.reject(error);
578
+ }
579
+ return Promise.reject(error);
580
+ }
581
+ },
582
+ {
583
+ type: "response",
584
+ name: "disconnected",
585
+ onError: (e) => {
586
+ const error = e;
587
+ const { config, response } = error;
588
+ if (!response) {
589
+ console.warn(`sdk:ERR_INTERNET_DISCONNECTED ${config == null ? void 0 : config.baseURL}${config == null ? void 0 : config.url}. ${error.message}
590
+ `);
591
+ }
592
+ return Promise.reject(error);
593
+ }
594
+ },
595
+ {
596
+ type: "response",
597
+ name: "session-expired",
598
+ onError: (e) => {
599
+ const error = e;
600
+ const { config, response } = error;
601
+ if ((response == null ? void 0 : response.status) === 401) {
602
+ const { url } = config || {};
603
+ const clientId = "";
604
+ const axiosConfig = config;
605
+ const refreshToken = void 0;
606
+ if (Object.values(LoginUrls).includes(url)) {
607
+ return Promise.reject(error);
608
+ }
609
+ return refreshWithLock({ axiosConfig, clientId, refreshToken }).then((tokenResponse) => {
610
+ return uponRefreshComplete(
611
+ error,
612
+ tokenResponse,
613
+ () => {
614
+ },
615
+ axiosConfig,
616
+ config || {}
617
+ );
618
+ });
619
+ }
620
+ return Promise.reject(error);
621
+ }
622
+ }
623
+ ];
624
+
625
+ // src/interceptors/ErrorInterceptor.ts
626
+ var ERROR_ELIGIBILITY_CODE = 13130;
627
+ var ErrorInterceptors = [
628
+ {
629
+ type: "response",
630
+ name: "user-eligibilitiy-change",
631
+ onError: (e) => {
632
+ const error = e;
633
+ if (error.response) {
634
+ const { response } = error;
635
+ if ((response == null ? void 0 : response.status) === 403 && (response == null ? void 0 : response.config).url.includes(process.env.BASE_URL) && (response == null ? void 0 : response.config.withCredentials)) {
636
+ if (response.data.errorCode === ERROR_ELIGIBILITY_CODE) {
637
+ }
638
+ }
639
+ }
640
+ return Promise.reject(error);
641
+ }
642
+ },
643
+ {
644
+ type: "response",
645
+ name: "too-many-request",
646
+ onError: (e) => {
647
+ const error = e;
648
+ if (error.response) {
649
+ const { response } = error;
650
+ if ((response == null ? void 0 : response.status) === 429) {
651
+ }
652
+ }
653
+ return Promise.reject(error);
654
+ }
655
+ }
656
+ ];
657
+
658
+ // src/utils/ApiUtils.ts
659
+ var import_axios3 = __toESM(require("axios"), 1);
660
+ var ApiUtils = class {
661
+ };
662
+ ApiUtils.mergeAxiosConfigs = (config, overrides) => {
663
+ return {
664
+ ...config,
665
+ ...overrides,
666
+ headers: {
667
+ ...config == null ? void 0 : config.headers,
668
+ ...overrides == null ? void 0 : overrides.headers
669
+ }
670
+ };
671
+ };
672
+ ApiUtils.is4xxError = (error) => {
673
+ if (import_axios3.default.isAxiosError(error) && error.response) {
674
+ return error.response.status >= 400 && error.response.status <= 499;
675
+ }
676
+ return false;
677
+ };
678
+
679
+ // src/utils/UrlHelper.ts
680
+ var _UrlHelper = class _UrlHelper {
681
+ static trimSlashFromStringEnd(pathString) {
682
+ let newString = pathString;
683
+ while (newString[newString.length - 1] === "/") {
684
+ newString = newString.slice(0, -1);
685
+ }
686
+ return newString;
687
+ }
688
+ static trimSlashFromStringStart(pathString) {
689
+ let newString = pathString;
690
+ while (newString[0] === "/") {
691
+ newString = newString.slice(1);
692
+ }
693
+ return newString;
694
+ }
695
+ static trimSlashFromStringEdges(pathString) {
696
+ return _UrlHelper.trimSlashFromStringStart(this.trimSlashFromStringEnd(pathString));
697
+ }
698
+ static combinePaths(...paths) {
699
+ const completePath = paths.join("/");
700
+ return completePath.replace(/\/{2,}/g, "/");
701
+ }
702
+ static combineURLPaths(urlString, ...paths) {
703
+ const url = new URL(urlString);
704
+ const { origin } = url;
705
+ const pathname = _UrlHelper.trimSlashFromStringEdges(_UrlHelper.combinePaths(url.pathname, ...paths));
706
+ return new URL(pathname, origin).toString();
707
+ }
708
+ static removeQueryParam(fullUrlString, param) {
709
+ const url = new URL(fullUrlString);
710
+ const params = url.searchParams;
711
+ const pathname = this.trimSlashFromStringEnd(url.pathname);
712
+ params.delete(param);
713
+ let newUrlString;
714
+ if (params.toString() === "") newUrlString = `${url.origin}${pathname}${url.hash}`;
715
+ else newUrlString = `${url.origin}${pathname}?${params.toString()}${url.hash}`;
716
+ return newUrlString;
717
+ }
718
+ };
719
+ _UrlHelper.isCompleteURLString = (urlString) => {
720
+ try {
721
+ const url = new URL(urlString);
722
+ return url.hostname !== "";
723
+ } catch (error) {
724
+ }
725
+ return false;
726
+ };
727
+ var UrlHelper = _UrlHelper;
728
+ // Annotate the CommonJS export names for ESM import in node:
729
+ 0 && (module.exports = {
730
+ AccelByte,
731
+ AccelByteSDK,
732
+ ApiUtils,
733
+ AuthInterceptors,
734
+ BrowserHelper,
735
+ CodeGenUtil,
736
+ DecodeError,
737
+ DesktopChecker,
738
+ ERROR_CODE_LINK_DELETION_ACCOUNT,
739
+ ERROR_CODE_TOKEN_EXPIRED,
740
+ ERROR_LINK_ANOTHER_3RD_PARTY_ACCOUNT,
741
+ ERROR_USER_BANNED,
742
+ ErrorInterceptors,
743
+ IamErrorCode,
744
+ Network,
745
+ RefreshSession,
746
+ SdkDevice,
747
+ UrlHelper,
748
+ Validate,
749
+ doRefreshSession,
750
+ refreshWithLock
751
+ });
752
+ //# sourceMappingURL=index.cjs.map