sales-frontend-api 0.0.176 → 0.0.178

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/client.cjs CHANGED
@@ -349,6 +349,261 @@ var AuthClient = class {
349
349
  }
350
350
  }
351
351
  };
352
+ var AUTH_REFRESH_PATH = "internal/api/auth/refresh";
353
+ var refreshPromise = null;
354
+ var axiosQueue2 = [];
355
+ var getOrSetCookie2 = (key, defaultValue) => {
356
+ let value = salesFrontendUtils.getCookie(key);
357
+ if (!value) {
358
+ value = defaultValue;
359
+ salesFrontendUtils.setCookie(key, value, { path: "/" });
360
+ }
361
+ return value;
362
+ };
363
+ var authErrorHandler2 = () => {
364
+ console.error("Authentication error occurred.");
365
+ };
366
+ var isRefreshQueueDisabled = (requestConfig) => {
367
+ const headerValue = requestConfig?.headers?.["Debug-Refresh-Queue-Off"];
368
+ return headerValue === "true";
369
+ };
370
+ var isRefreshRequest = (url) => {
371
+ return url?.includes(AUTH_REFRESH_PATH) ?? false;
372
+ };
373
+ var enqueueRetryRequest = (config, execute) => {
374
+ return new Promise((resolve, reject) => {
375
+ axiosQueue2.push({ resolve, reject, config, execute });
376
+ });
377
+ };
378
+ var retryQueuedRequests = () => {
379
+ while (axiosQueue2.length > 0) {
380
+ const queuedRequest = axiosQueue2.shift();
381
+ if (!queuedRequest) {
382
+ continue;
383
+ }
384
+ queuedRequest.config.params = {
385
+ ...queuedRequest.config.params,
386
+ retry_request: "true"
387
+ };
388
+ queuedRequest.execute().then(queuedRequest.resolve).catch(queuedRequest.reject);
389
+ }
390
+ };
391
+ var rejectQueuedRequests = (error) => {
392
+ while (axiosQueue2.length > 0) {
393
+ const queuedRequest = axiosQueue2.shift();
394
+ if (!queuedRequest) {
395
+ continue;
396
+ }
397
+ queuedRequest.reject(error);
398
+ }
399
+ };
400
+ var HttpClientAxiosV2 = class {
401
+ constructor(config = {}, options) {
402
+ __publicField(this, "config");
403
+ __publicField(this, "headerManager");
404
+ __publicField(this, "options");
405
+ /**
406
+ * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
407
+ */
408
+ __publicField(this, "headers", {});
409
+ /**
410
+ * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
411
+ * 현재 버전에서는 axios를 사용하여 구현됨.
412
+ */
413
+ __publicField(this, "api");
414
+ __publicField(this, "sentryLogger");
415
+ this.config = config;
416
+ this.options = options;
417
+ if (options?.useSentry && options?.sentryConfig) {
418
+ this.sentryLogger = new salesFrontendSentry.SentryLogController(options.sentryConfig);
419
+ } else if (options?.useSentry && !options?.sentryConfig) {
420
+ console.warn("[HttpClientAxiosV2] sentryConfig is required when useSentry is true");
421
+ }
422
+ const getter = (key) => {
423
+ return salesFrontendUtils.getCookie(key);
424
+ };
425
+ const setter = (key, value) => {
426
+ if (config?.headers) {
427
+ config.headers[key] = value;
428
+ }
429
+ };
430
+ this.headerManager = new HeaderManager(getter, setter);
431
+ this.api = axios__default.default.create({
432
+ withCredentials: false,
433
+ ...config
434
+ });
435
+ this.api.interceptors.request.use(
436
+ async (config2) => {
437
+ console.log("config url", config2.url);
438
+ const debugMode = salesFrontendUtils.getCookie("dsp-debug-mode") === "on";
439
+ const debugRefreshQueueOff = isRefreshQueueDisabled(config2);
440
+ const retryRequest = config2.params?.retry_request === "true";
441
+ await salesFrontendDebug.addRequestLog(config2);
442
+ const currentRefreshPromise = refreshPromise;
443
+ if (!debugRefreshQueueOff && currentRefreshPromise && !isRefreshRequest(config2.url) && !retryRequest) {
444
+ console.log("request refresh \uB300\uAE30");
445
+ await currentRefreshPromise;
446
+ }
447
+ const authClient = new AuthClient();
448
+ const authorization = await authClient.getAT();
449
+ if (authorization) {
450
+ config2.headers["Authorization"] = authorization;
451
+ }
452
+ if (debugMode) {
453
+ console.log("debugMode header setting!");
454
+ config2.headers["x-channel-appversion"] = getOrSetCookie2("x-channel-appversion", "3.1");
455
+ config2.headers["x-channel-deviceid"] = getOrSetCookie2("x-channel-deviceid", "deviceid");
456
+ config2.headers["x-channel-devicemodel"] = getOrSetCookie2("x-channel-devicemodel", "iPHONE13");
457
+ config2.headers["x-channel-formfactor"] = getOrSetCookie2("x-channel-formfactor", "Phone");
458
+ config2.headers["x-channel-loginchannel"] = getOrSetCookie2("x-channel-loginchannel", "DSP");
459
+ config2.headers["x-channel-logintype"] = getOrSetCookie2("x-channel-logintype", "ONPA_PIN");
460
+ config2.headers["x-channel-platformname"] = getOrSetCookie2("x-channel-platformname", "IOS");
461
+ config2.headers["x-channel-platformversion"] = getOrSetCookie2("x-channel-platformversion", "15.4.1");
462
+ config2.headers["x-channel-screenid"] = getOrSetCookie2("x-channel-screenid", location.pathname);
463
+ config2.headers["x-channel-business-work-division-code"] = getOrSetCookie2(
464
+ "x-channel-business-work-division-code",
465
+ "DEA"
466
+ );
467
+ } else {
468
+ const session = salesFrontendStores.useClientSessionStore.getState().clientSession;
469
+ config2.headers["x-channel-appversion"] = session.appVersion;
470
+ config2.headers["x-channel-deviceid"] = session.deviceId;
471
+ config2.headers["x-channel-devicemodel"] = session.deviceModel;
472
+ config2.headers["x-channel-formfactor"] = session.formFactor;
473
+ config2.headers["x-channel-loginchannel"] = session.loginChannel;
474
+ config2.headers["x-channel-logintype"] = session.loginType;
475
+ config2.headers["x-channel-platformname"] = session.platformName;
476
+ config2.headers["x-channel-platformversion"] = session.platformVersion;
477
+ config2.headers["x-channel-screenid"] = location.pathname;
478
+ config2.headers["x-channel-business-work-division-code"] = session.businessWorkDivisionCode;
479
+ }
480
+ const headerEntries = Object.entries(this.headers);
481
+ headerEntries.forEach(([key, value]) => {
482
+ if (config2?.headers) {
483
+ config2.headers[key] = value;
484
+ }
485
+ });
486
+ if (salesFrontendUtils.getDspExecutionEnvironment() === "iframe") {
487
+ salesFrontendBridge.Bridge.iframe.dspKeepCallerSession();
488
+ }
489
+ return config2;
490
+ },
491
+ async (error) => {
492
+ await salesFrontendDebug.addErrorLog(error);
493
+ console.log("request error");
494
+ this.sentryLogging({
495
+ logType: "error",
496
+ error
497
+ }, {
498
+ error
499
+ });
500
+ return Promise.reject(error);
501
+ }
502
+ );
503
+ this.api.interceptors.response.use(
504
+ async (response) => {
505
+ await salesFrontendDebug.addResponseLog(response);
506
+ if (response.data.isSuccess === false) {
507
+ const axiosError = new axios.AxiosError();
508
+ axiosError.response = response;
509
+ axiosError.config = response.config;
510
+ axiosError.message = response.data.message;
511
+ axiosError.code = response.status.toString();
512
+ axiosError.request = response.request;
513
+ this.sentryLogging({
514
+ logType: "error",
515
+ error: axiosError,
516
+ extraData: {
517
+ axiosResponse: response
518
+ }
519
+ }, {
520
+ response
521
+ });
522
+ return Promise.reject(axiosError);
523
+ }
524
+ return response;
525
+ },
526
+ async (error) => {
527
+ console.log("error");
528
+ await salesFrontendDebug.addErrorLog(error);
529
+ const originalRequest = error.config;
530
+ const debugRefreshQueueOff = isRefreshQueueDisabled(originalRequest);
531
+ const retryRequest = originalRequest?.params?.retry_request === "true";
532
+ console.log("retry_request", retryRequest);
533
+ if (error.response?.status === 401 && !debugRefreshQueueOff && !retryRequest && !isRefreshRequest(originalRequest?.url)) {
534
+ console.log("error 401 \uD050\uCC98\uB9AC");
535
+ if (!originalRequest) {
536
+ return Promise.reject(error);
537
+ }
538
+ const queuedRequest = enqueueRetryRequest(originalRequest, () => {
539
+ return this.api.request(originalRequest);
540
+ });
541
+ if (!refreshPromise) {
542
+ const client = new AuthClient();
543
+ const nextRefreshPromise = client.refreshToken().then(() => {
544
+ retryQueuedRequests();
545
+ }).catch((refreshError) => {
546
+ rejectQueuedRequests(refreshError);
547
+ if (salesFrontendUtils.isDspApp()) ; else {
548
+ authErrorHandler2();
549
+ }
550
+ this.sentryLogging({
551
+ logType: "error",
552
+ error: refreshError
553
+ }, {
554
+ error: refreshError instanceof Error ? refreshError : error
555
+ });
556
+ return Promise.reject(refreshError);
557
+ }).finally(() => {
558
+ refreshPromise = null;
559
+ });
560
+ void nextRefreshPromise.catch(() => void 0);
561
+ refreshPromise = nextRefreshPromise;
562
+ }
563
+ return queuedRequest;
564
+ } else {
565
+ console.log("error 401 \uD050\uCC98\uB9AC \uC5C6\uC74C");
566
+ this.sentryLogging({
567
+ logType: "error",
568
+ error
569
+ }, {
570
+ error
571
+ });
572
+ return Promise.reject(error);
573
+ }
574
+ }
575
+ );
576
+ }
577
+ sentryLogging(params, handlerParams) {
578
+ if (this.options?.useSentry === false) {
579
+ return;
580
+ }
581
+ if (!this.sentryLogger) {
582
+ console.warn("[HttpClientAxiosV2] sentryLogger is not initialized");
583
+ return;
584
+ }
585
+ if (typeof this.options?.handler !== "function") {
586
+ return this.sentryLogger.postSentry(params);
587
+ }
588
+ if (typeof this.options?.handler === "function" && !handlerParams) {
589
+ console.warn("[HttpClientAxiosV2] handlerParams is required when handler is provided");
590
+ return;
591
+ }
592
+ if (typeof this.options?.handler === "function" && handlerParams) {
593
+ const isSendSentry = this.options?.handler(handlerParams);
594
+ if (isSendSentry) {
595
+ return this.sentryLogger.postSentry(params);
596
+ }
597
+ }
598
+ }
599
+ setHeaders(headers) {
600
+ this.headers = {
601
+ ...this.headers,
602
+ ...headers
603
+ };
604
+ }
605
+ };
352
606
 
353
607
  exports.AuthClient = AuthClient;
354
608
  exports.HttpClientAxios = HttpClientAxios;
609
+ exports.HttpClientAxiosV2 = HttpClientAxiosV2;
package/dist/client.d.cts CHANGED
@@ -1,6 +1,7 @@
1
- export { A as AxiosQueueType, b as HttpClientAxios, a as HttpClientHandlerParams, H as HttpClientOptions } from './http-client-axios-C7C8Puos.cjs';
2
- import 'axios';
3
- import 'sales-frontend-sentry';
1
+ import { H as HeaderManager, a as HttpClientOptions, b as HttpClientHandlerParams } from './http-client-axios-DA9IICue.cjs';
2
+ export { A as AxiosQueueType, c as AxiosQueueTypeV2, d as HttpClientAxios } from './http-client-axios-DA9IICue.cjs';
3
+ import { AxiosRequestConfig, AxiosInstance } from 'axios';
4
+ import { SentryLogController, PostSentryParams } from 'sales-frontend-sentry';
4
5
  import './header.types-duHbFvO0.cjs';
5
6
 
6
7
  declare class AuthClient {
@@ -25,4 +26,36 @@ declare class AuthClient {
25
26
  refreshToken(): Promise<void>;
26
27
  }
27
28
 
28
- export { AuthClient };
29
+ /**
30
+ * 전자청약
31
+ * CSR용 http-client V2 입니다.
32
+ * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.
33
+ *
34
+ * V2 변경사항:
35
+ * - 동시 401 요청 발생 시 refreshPromise 공유 방식으로 토큰 갱신 흐름 안정화
36
+ * - request interceptor에서 refresh 진행 중 신규 요청 대기 처리
37
+ * - queue 기반 재시도 로직을 별도 함수로 분리
38
+ */
39
+ declare class HttpClientAxiosV2 {
40
+ config: AxiosRequestConfig;
41
+ headerManager: HeaderManager;
42
+ options?: HttpClientOptions;
43
+ /**
44
+ * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
45
+ */
46
+ headers: Record<string, string>;
47
+ /**
48
+ * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
49
+ * 현재 버전에서는 axios를 사용하여 구현됨.
50
+ */
51
+ api: AxiosInstance;
52
+ sentryLogger?: SentryLogController;
53
+ constructor(config?: AxiosRequestConfig, options?: HttpClientOptions);
54
+ sentryLogging(params: PostSentryParams, handlerParams?: HttpClientHandlerParams): {
55
+ eventId: string;
56
+ convertedEventId: string;
57
+ } | undefined;
58
+ setHeaders(headers: Record<string, string>): void;
59
+ }
60
+
61
+ export { AuthClient, HttpClientAxiosV2, HttpClientHandlerParams, HttpClientOptions };
package/dist/client.d.ts CHANGED
@@ -1,6 +1,7 @@
1
- export { A as AxiosQueueType, b as HttpClientAxios, a as HttpClientHandlerParams, H as HttpClientOptions } from './http-client-axios-DHnzwaPY.js';
2
- import 'axios';
3
- import 'sales-frontend-sentry';
1
+ import { H as HeaderManager, a as HttpClientOptions, b as HttpClientHandlerParams } from './http-client-axios-BftcvJtd.js';
2
+ export { A as AxiosQueueType, c as AxiosQueueTypeV2, d as HttpClientAxios } from './http-client-axios-BftcvJtd.js';
3
+ import { AxiosRequestConfig, AxiosInstance } from 'axios';
4
+ import { SentryLogController, PostSentryParams } from 'sales-frontend-sentry';
4
5
  import './header.types-duHbFvO0.js';
5
6
 
6
7
  declare class AuthClient {
@@ -25,4 +26,36 @@ declare class AuthClient {
25
26
  refreshToken(): Promise<void>;
26
27
  }
27
28
 
28
- export { AuthClient };
29
+ /**
30
+ * 전자청약
31
+ * CSR용 http-client V2 입니다.
32
+ * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.
33
+ *
34
+ * V2 변경사항:
35
+ * - 동시 401 요청 발생 시 refreshPromise 공유 방식으로 토큰 갱신 흐름 안정화
36
+ * - request interceptor에서 refresh 진행 중 신규 요청 대기 처리
37
+ * - queue 기반 재시도 로직을 별도 함수로 분리
38
+ */
39
+ declare class HttpClientAxiosV2 {
40
+ config: AxiosRequestConfig;
41
+ headerManager: HeaderManager;
42
+ options?: HttpClientOptions;
43
+ /**
44
+ * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
45
+ */
46
+ headers: Record<string, string>;
47
+ /**
48
+ * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
49
+ * 현재 버전에서는 axios를 사용하여 구현됨.
50
+ */
51
+ api: AxiosInstance;
52
+ sentryLogger?: SentryLogController;
53
+ constructor(config?: AxiosRequestConfig, options?: HttpClientOptions);
54
+ sentryLogging(params: PostSentryParams, handlerParams?: HttpClientHandlerParams): {
55
+ eventId: string;
56
+ convertedEventId: string;
57
+ } | undefined;
58
+ setHeaders(headers: Record<string, string>): void;
59
+ }
60
+
61
+ export { AuthClient, HttpClientAxiosV2, HttpClientHandlerParams, HttpClientOptions };
package/dist/client.js CHANGED
@@ -343,5 +343,259 @@ var AuthClient = class {
343
343
  }
344
344
  }
345
345
  };
346
+ var AUTH_REFRESH_PATH = "internal/api/auth/refresh";
347
+ var refreshPromise = null;
348
+ var axiosQueue2 = [];
349
+ var getOrSetCookie2 = (key, defaultValue) => {
350
+ let value = getCookie(key);
351
+ if (!value) {
352
+ value = defaultValue;
353
+ setCookie(key, value, { path: "/" });
354
+ }
355
+ return value;
356
+ };
357
+ var authErrorHandler2 = () => {
358
+ console.error("Authentication error occurred.");
359
+ };
360
+ var isRefreshQueueDisabled = (requestConfig) => {
361
+ const headerValue = requestConfig?.headers?.["Debug-Refresh-Queue-Off"];
362
+ return headerValue === "true";
363
+ };
364
+ var isRefreshRequest = (url) => {
365
+ return url?.includes(AUTH_REFRESH_PATH) ?? false;
366
+ };
367
+ var enqueueRetryRequest = (config, execute) => {
368
+ return new Promise((resolve, reject) => {
369
+ axiosQueue2.push({ resolve, reject, config, execute });
370
+ });
371
+ };
372
+ var retryQueuedRequests = () => {
373
+ while (axiosQueue2.length > 0) {
374
+ const queuedRequest = axiosQueue2.shift();
375
+ if (!queuedRequest) {
376
+ continue;
377
+ }
378
+ queuedRequest.config.params = {
379
+ ...queuedRequest.config.params,
380
+ retry_request: "true"
381
+ };
382
+ queuedRequest.execute().then(queuedRequest.resolve).catch(queuedRequest.reject);
383
+ }
384
+ };
385
+ var rejectQueuedRequests = (error) => {
386
+ while (axiosQueue2.length > 0) {
387
+ const queuedRequest = axiosQueue2.shift();
388
+ if (!queuedRequest) {
389
+ continue;
390
+ }
391
+ queuedRequest.reject(error);
392
+ }
393
+ };
394
+ var HttpClientAxiosV2 = class {
395
+ constructor(config = {}, options) {
396
+ __publicField(this, "config");
397
+ __publicField(this, "headerManager");
398
+ __publicField(this, "options");
399
+ /**
400
+ * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
401
+ */
402
+ __publicField(this, "headers", {});
403
+ /**
404
+ * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
405
+ * 현재 버전에서는 axios를 사용하여 구현됨.
406
+ */
407
+ __publicField(this, "api");
408
+ __publicField(this, "sentryLogger");
409
+ this.config = config;
410
+ this.options = options;
411
+ if (options?.useSentry && options?.sentryConfig) {
412
+ this.sentryLogger = new SentryLogController(options.sentryConfig);
413
+ } else if (options?.useSentry && !options?.sentryConfig) {
414
+ console.warn("[HttpClientAxiosV2] sentryConfig is required when useSentry is true");
415
+ }
416
+ const getter = (key) => {
417
+ return getCookie(key);
418
+ };
419
+ const setter = (key, value) => {
420
+ if (config?.headers) {
421
+ config.headers[key] = value;
422
+ }
423
+ };
424
+ this.headerManager = new HeaderManager(getter, setter);
425
+ this.api = axios.create({
426
+ withCredentials: false,
427
+ ...config
428
+ });
429
+ this.api.interceptors.request.use(
430
+ async (config2) => {
431
+ console.log("config url", config2.url);
432
+ const debugMode = getCookie("dsp-debug-mode") === "on";
433
+ const debugRefreshQueueOff = isRefreshQueueDisabled(config2);
434
+ const retryRequest = config2.params?.retry_request === "true";
435
+ await addRequestLog(config2);
436
+ const currentRefreshPromise = refreshPromise;
437
+ if (!debugRefreshQueueOff && currentRefreshPromise && !isRefreshRequest(config2.url) && !retryRequest) {
438
+ console.log("request refresh \uB300\uAE30");
439
+ await currentRefreshPromise;
440
+ }
441
+ const authClient = new AuthClient();
442
+ const authorization = await authClient.getAT();
443
+ if (authorization) {
444
+ config2.headers["Authorization"] = authorization;
445
+ }
446
+ if (debugMode) {
447
+ console.log("debugMode header setting!");
448
+ config2.headers["x-channel-appversion"] = getOrSetCookie2("x-channel-appversion", "3.1");
449
+ config2.headers["x-channel-deviceid"] = getOrSetCookie2("x-channel-deviceid", "deviceid");
450
+ config2.headers["x-channel-devicemodel"] = getOrSetCookie2("x-channel-devicemodel", "iPHONE13");
451
+ config2.headers["x-channel-formfactor"] = getOrSetCookie2("x-channel-formfactor", "Phone");
452
+ config2.headers["x-channel-loginchannel"] = getOrSetCookie2("x-channel-loginchannel", "DSP");
453
+ config2.headers["x-channel-logintype"] = getOrSetCookie2("x-channel-logintype", "ONPA_PIN");
454
+ config2.headers["x-channel-platformname"] = getOrSetCookie2("x-channel-platformname", "IOS");
455
+ config2.headers["x-channel-platformversion"] = getOrSetCookie2("x-channel-platformversion", "15.4.1");
456
+ config2.headers["x-channel-screenid"] = getOrSetCookie2("x-channel-screenid", location.pathname);
457
+ config2.headers["x-channel-business-work-division-code"] = getOrSetCookie2(
458
+ "x-channel-business-work-division-code",
459
+ "DEA"
460
+ );
461
+ } else {
462
+ const session = useClientSessionStore.getState().clientSession;
463
+ config2.headers["x-channel-appversion"] = session.appVersion;
464
+ config2.headers["x-channel-deviceid"] = session.deviceId;
465
+ config2.headers["x-channel-devicemodel"] = session.deviceModel;
466
+ config2.headers["x-channel-formfactor"] = session.formFactor;
467
+ config2.headers["x-channel-loginchannel"] = session.loginChannel;
468
+ config2.headers["x-channel-logintype"] = session.loginType;
469
+ config2.headers["x-channel-platformname"] = session.platformName;
470
+ config2.headers["x-channel-platformversion"] = session.platformVersion;
471
+ config2.headers["x-channel-screenid"] = location.pathname;
472
+ config2.headers["x-channel-business-work-division-code"] = session.businessWorkDivisionCode;
473
+ }
474
+ const headerEntries = Object.entries(this.headers);
475
+ headerEntries.forEach(([key, value]) => {
476
+ if (config2?.headers) {
477
+ config2.headers[key] = value;
478
+ }
479
+ });
480
+ if (getDspExecutionEnvironment() === "iframe") {
481
+ Bridge.iframe.dspKeepCallerSession();
482
+ }
483
+ return config2;
484
+ },
485
+ async (error) => {
486
+ await addErrorLog(error);
487
+ console.log("request error");
488
+ this.sentryLogging({
489
+ logType: "error",
490
+ error
491
+ }, {
492
+ error
493
+ });
494
+ return Promise.reject(error);
495
+ }
496
+ );
497
+ this.api.interceptors.response.use(
498
+ async (response) => {
499
+ await addResponseLog(response);
500
+ if (response.data.isSuccess === false) {
501
+ const axiosError = new AxiosError();
502
+ axiosError.response = response;
503
+ axiosError.config = response.config;
504
+ axiosError.message = response.data.message;
505
+ axiosError.code = response.status.toString();
506
+ axiosError.request = response.request;
507
+ this.sentryLogging({
508
+ logType: "error",
509
+ error: axiosError,
510
+ extraData: {
511
+ axiosResponse: response
512
+ }
513
+ }, {
514
+ response
515
+ });
516
+ return Promise.reject(axiosError);
517
+ }
518
+ return response;
519
+ },
520
+ async (error) => {
521
+ console.log("error");
522
+ await addErrorLog(error);
523
+ const originalRequest = error.config;
524
+ const debugRefreshQueueOff = isRefreshQueueDisabled(originalRequest);
525
+ const retryRequest = originalRequest?.params?.retry_request === "true";
526
+ console.log("retry_request", retryRequest);
527
+ if (error.response?.status === 401 && !debugRefreshQueueOff && !retryRequest && !isRefreshRequest(originalRequest?.url)) {
528
+ console.log("error 401 \uD050\uCC98\uB9AC");
529
+ if (!originalRequest) {
530
+ return Promise.reject(error);
531
+ }
532
+ const queuedRequest = enqueueRetryRequest(originalRequest, () => {
533
+ return this.api.request(originalRequest);
534
+ });
535
+ if (!refreshPromise) {
536
+ const client = new AuthClient();
537
+ const nextRefreshPromise = client.refreshToken().then(() => {
538
+ retryQueuedRequests();
539
+ }).catch((refreshError) => {
540
+ rejectQueuedRequests(refreshError);
541
+ if (isDspApp()) ; else {
542
+ authErrorHandler2();
543
+ }
544
+ this.sentryLogging({
545
+ logType: "error",
546
+ error: refreshError
547
+ }, {
548
+ error: refreshError instanceof Error ? refreshError : error
549
+ });
550
+ return Promise.reject(refreshError);
551
+ }).finally(() => {
552
+ refreshPromise = null;
553
+ });
554
+ void nextRefreshPromise.catch(() => void 0);
555
+ refreshPromise = nextRefreshPromise;
556
+ }
557
+ return queuedRequest;
558
+ } else {
559
+ console.log("error 401 \uD050\uCC98\uB9AC \uC5C6\uC74C");
560
+ this.sentryLogging({
561
+ logType: "error",
562
+ error
563
+ }, {
564
+ error
565
+ });
566
+ return Promise.reject(error);
567
+ }
568
+ }
569
+ );
570
+ }
571
+ sentryLogging(params, handlerParams) {
572
+ if (this.options?.useSentry === false) {
573
+ return;
574
+ }
575
+ if (!this.sentryLogger) {
576
+ console.warn("[HttpClientAxiosV2] sentryLogger is not initialized");
577
+ return;
578
+ }
579
+ if (typeof this.options?.handler !== "function") {
580
+ return this.sentryLogger.postSentry(params);
581
+ }
582
+ if (typeof this.options?.handler === "function" && !handlerParams) {
583
+ console.warn("[HttpClientAxiosV2] handlerParams is required when handler is provided");
584
+ return;
585
+ }
586
+ if (typeof this.options?.handler === "function" && handlerParams) {
587
+ const isSendSentry = this.options?.handler(handlerParams);
588
+ if (isSendSentry) {
589
+ return this.sentryLogger.postSentry(params);
590
+ }
591
+ }
592
+ }
593
+ setHeaders(headers) {
594
+ this.headers = {
595
+ ...this.headers,
596
+ ...headers
597
+ };
598
+ }
599
+ };
346
600
 
347
- export { AuthClient, HttpClientAxios };
601
+ export { AuthClient, HttpClientAxios, HttpClientAxiosV2 };
@@ -2,11 +2,23 @@ import { InternalAxiosRequestConfig, AxiosResponse, AxiosError, AxiosRequestConf
2
2
  import { SentryConfig, SentryLogController, PostSentryParams } from 'sales-frontend-sentry';
3
3
  import { G as GetterSync, S as SetterSync } from './header.types-duHbFvO0.js';
4
4
 
5
+ /**
6
+ * @description 401 에러 발생 시 재시도할 요청 정보를 저장하는 큐 아이템 (v1)
7
+ */
5
8
  interface AxiosQueueType {
6
9
  resolve: (value?: unknown) => void;
7
10
  reject: (reason?: unknown) => void;
8
11
  config: InternalAxiosRequestConfig;
9
12
  }
13
+ /**
14
+ * @description refresh 완료 후 재시도할 요청 정보를 저장하는 큐 아이템 (v2)
15
+ */
16
+ interface AxiosQueueTypeV2 {
17
+ resolve: (value: AxiosResponse) => void;
18
+ reject: (reason?: unknown) => void;
19
+ config: InternalAxiosRequestConfig;
20
+ execute: () => Promise<AxiosResponse>;
21
+ }
10
22
  /**
11
23
  * @description HttpClientOptions
12
24
  */
@@ -78,4 +90,4 @@ declare class HttpClientAxios {
78
90
  setHeaders(headers: Record<string, string>): void;
79
91
  }
80
92
 
81
- export { type AxiosQueueType as A, type HttpClientOptions as H, type HttpClientHandlerParams as a, HttpClientAxios as b };
93
+ export { type AxiosQueueType as A, HeaderManager as H, type HttpClientOptions as a, type HttpClientHandlerParams as b, type AxiosQueueTypeV2 as c, HttpClientAxios as d };
@@ -2,11 +2,23 @@ import { InternalAxiosRequestConfig, AxiosResponse, AxiosError, AxiosRequestConf
2
2
  import { SentryConfig, SentryLogController, PostSentryParams } from 'sales-frontend-sentry';
3
3
  import { G as GetterSync, S as SetterSync } from './header.types-duHbFvO0.cjs';
4
4
 
5
+ /**
6
+ * @description 401 에러 발생 시 재시도할 요청 정보를 저장하는 큐 아이템 (v1)
7
+ */
5
8
  interface AxiosQueueType {
6
9
  resolve: (value?: unknown) => void;
7
10
  reject: (reason?: unknown) => void;
8
11
  config: InternalAxiosRequestConfig;
9
12
  }
13
+ /**
14
+ * @description refresh 완료 후 재시도할 요청 정보를 저장하는 큐 아이템 (v2)
15
+ */
16
+ interface AxiosQueueTypeV2 {
17
+ resolve: (value: AxiosResponse) => void;
18
+ reject: (reason?: unknown) => void;
19
+ config: InternalAxiosRequestConfig;
20
+ execute: () => Promise<AxiosResponse>;
21
+ }
10
22
  /**
11
23
  * @description HttpClientOptions
12
24
  */
@@ -78,4 +90,4 @@ declare class HttpClientAxios {
78
90
  setHeaders(headers: Record<string, string>): void;
79
91
  }
80
92
 
81
- export { type AxiosQueueType as A, type HttpClientOptions as H, type HttpClientHandlerParams as a, HttpClientAxios as b };
93
+ export { type AxiosQueueType as A, HeaderManager as H, type HttpClientOptions as a, type HttpClientHandlerParams as b, type AxiosQueueTypeV2 as c, HttpClientAxios as d };