sales-frontend-api 0.0.165 → 0.0.166

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
@@ -4,6 +4,7 @@ var salesFrontendBridge = require('sales-frontend-bridge');
4
4
  var salesFrontendDebug = require('sales-frontend-debug');
5
5
  var salesFrontendUtils = require('sales-frontend-utils');
6
6
  var axios = require('axios');
7
+ var salesFrontendSentry = require('sales-frontend-sentry');
7
8
  var salesFrontendStores = require('sales-frontend-stores');
8
9
 
9
10
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
@@ -81,9 +82,10 @@ var authErrorHandler = () => {
81
82
  console.error("Authentication error occurred.");
82
83
  };
83
84
  var HttpClientAxios = class {
84
- constructor(config = {}) {
85
+ constructor(config = {}, options) {
85
86
  __publicField(this, "config");
86
87
  __publicField(this, "headerManager");
88
+ __publicField(this, "options");
87
89
  /**
88
90
  * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
89
91
  */
@@ -93,7 +95,10 @@ var HttpClientAxios = class {
93
95
  * 현재 버전에서는 axios를 사용하여 구현됨.
94
96
  */
95
97
  __publicField(this, "api");
98
+ __publicField(this, "sentryLogger");
96
99
  this.config = config;
100
+ this.options = options;
101
+ this.sentryLogger = new salesFrontendSentry.SentryLogController(options?.sentryConfig);
97
102
  const getter = (key) => {
98
103
  return salesFrontendUtils.getCookie(key);
99
104
  };
@@ -169,6 +174,12 @@ var HttpClientAxios = class {
169
174
  async (error) => {
170
175
  await salesFrontendDebug.addErrorLog(error);
171
176
  console.log("request error");
177
+ this.sentryLogging({
178
+ logType: "error",
179
+ error
180
+ }, {
181
+ error
182
+ });
172
183
  return Promise.reject(error);
173
184
  }
174
185
  );
@@ -182,6 +193,15 @@ var HttpClientAxios = class {
182
193
  axiosError.message = response.data.message;
183
194
  axiosError.code = response.status.toString();
184
195
  axiosError.request = response.request;
196
+ this.sentryLogging({
197
+ logType: "error",
198
+ error: axiosError,
199
+ extraData: {
200
+ axiosResponse: response
201
+ }
202
+ }, {
203
+ response
204
+ });
185
205
  return Promise.reject(axiosError);
186
206
  }
187
207
  return response;
@@ -219,6 +239,12 @@ var HttpClientAxios = class {
219
239
  if (salesFrontendUtils.isDspApp()) ; else {
220
240
  authErrorHandler();
221
241
  }
242
+ this.sentryLogging({
243
+ logType: "error",
244
+ error: error2
245
+ }, {
246
+ error: error2
247
+ });
222
248
  return Promise.reject(error2);
223
249
  });
224
250
  return new Promise((resolve, reject) => {
@@ -228,11 +254,35 @@ var HttpClientAxios = class {
228
254
  });
229
255
  } else {
230
256
  console.log("error 401 \uD050\uCC98\uB9AC \uC5C6\uC74C");
257
+ this.sentryLogging({
258
+ logType: "error",
259
+ error
260
+ }, {
261
+ error
262
+ });
231
263
  return Promise.reject(error);
232
264
  }
233
265
  }
234
266
  );
235
267
  }
268
+ sentryLogging(params, handlerParams) {
269
+ if (this.options?.useSentry === false) {
270
+ return;
271
+ }
272
+ if (typeof this.options?.handler !== "function") {
273
+ return this.sentryLogger.postSentry(params);
274
+ }
275
+ if (typeof this.options?.handler === "function" && !handlerParams) {
276
+ console.warn("[HttpClientAxios] handlerParams is required when handler is provided");
277
+ return;
278
+ }
279
+ if (typeof this.options?.handler === "function" && handlerParams) {
280
+ const isSendSentry = this.options?.handler(handlerParams);
281
+ if (isSendSentry) {
282
+ return this.sentryLogger.postSentry(params);
283
+ }
284
+ }
285
+ }
236
286
  setHeaders(headers) {
237
287
  this.headers = {
238
288
  ...this.headers,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http-client/header/header.types.ts","../src/http-client/header/header-manager.ts","../src/http-client/axios/http-client-axios.ts","../src/http-client/auth/auth-client.ts"],"names":["getCookie","setCookie","axios","config","addRequestLog","useClientSessionStore","getDspExecutionEnvironment","Bridge","addErrorLog","addResponseLog","AxiosError","error","isDspApp","isDebugByFilterName","getServicePath"],"mappings":"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","file":"client.cjs","sourcesContent":["/**\n * @see https://loop.cloud.microsoft/p/eyJ3Ijp7InUiOiJodHRwczovL2hhbndoYWxpZmVtMzY1LnNoYXJlcG9pbnQuY29tLz9uYXY9Y3owbE1rWW1aRDFpSVVVd1FXdDJSbGhSV0VWUE1tUkNYMWhUZW5KWVVFdFBSVXByYWs1b1NrSlBjRk4wYm5wNmNsWmpMVUZ5YjI1UlJWOVdSREpUV25aeWVUUTJTV2swUlZrbVpqMHdNVk5OVGtkR1JsTkJXVE0xVVZaQ1ZrRkVRa1ZaVEVoRVNUSTBXRXhVVlZoV0ptTTlKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwicCI6eyJ1IjoiaHR0cHM6Ly9oYW53aGFsaWZlbTM2NS5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYmMyNDQwMTMtZDA1NS00MzVjLWI2NzQtMWZkNzRiM2FkNzNjLyVFQiVBQyVCOCVFQyU4NCU5QyUyMCVFQiU5RCVCQyVFQyU5RCVCNCVFQiVCOCU4QyVFQiU5RiVBQyVFQiVBNiVBQy9Mb29wQXBwRGF0YS8wOS0yLiUyMEJyaWRnZSUyMFNwZWMlMjAxLmxvb3A%2FbmF2PWN6MGxNa1pqYjI1MFpXNTBjM1J2Y21GblpTVXlSa05UVUY5aVl6STBOREF4TXkxa01EVTFMVFF6TldNdFlqWTNOQzB4Wm1RM05HSXpZV1EzTTJNbVpEMWlJVVV3UVd0MlJsaFJXRVZQTW1SQ1gxaFRlbkpZVUV0UFJVcHJhazVvU2tKUGNGTjBibnA2Y2xaakxVRnliMjVSUlY5V1JESlRXblp5ZVRRMlNXazBSVmttWmowd01WTk5Ua2RHUmxGRlYxTlFOelpMUWtsTFdrWkpXVUUzU1ZkWldGTklWa0ZUSm1NOUpUSkdKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwiaSI6eyJpIjoiNTdkZmVhM2QtZDA2Yi00YWRlLWIxZjEtYjE4NDA4MmNlN2VjIn19\n */\nexport const customHeaderNames = [\n 'Accept-Language',\n 'DeviceId',\n 'LoginType',\n 'PlatformName',\n 'PlatformVersion',\n 'AppVersion',\n 'DeviceModel',\n 'FormFactor',\n 'LoginChannel'\n];\n\nexport const AT = 'AT';\nexport type GetterSync = (keyName: string) => string;\nexport type SetterSync = (keyName: string, value: string) => void;\n\nexport type GetterAsync = (keyName: string) => Promise<string> | string;\nexport type SetterAsync = (keyName: string, value: string) => Promise<void> | void;\n","import { AT, customHeaderNames, GetterSync, SetterSync } from './header.types';\n\nexport class HeaderManager {\n private getter: GetterSync;\n private setter: SetterSync;\n\n constructor(getter: GetterSync, setter: SetterSync) {\n this.getter = getter;\n this.setter = setter;\n }\n\n /**\n * 커스텀 헤더를 동기적으로 설정합니다.\n */\n setCustomHeaders(): void {\n customHeaderNames.forEach((headerName) => {\n const customHeaderKey = `X-Channel-${headerName}`;\n const headerValue = this.getter(customHeaderKey);\n if (headerValue) {\n this.setter(customHeaderKey, headerValue);\n }\n });\n }\n\n /**\n * 인증 토큰을 동기적으로 설정합니다.\n */\n setAuthToken(): void {\n const token = this.getter(AT);\n if (token) {\n this.setter('Authorization', `Bearer ${token}`);\n }\n }\n\n /**\n * 모든 헤더를 동기적으로 설정합니다.\n */\n setAllHeaders(): void {\n this.setCustomHeaders();\n this.setAuthToken();\n }\n}\n","import axios from 'axios';\nimport { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\nimport { Bridge } from 'sales-frontend-bridge';\nimport { addErrorLog, addRequestLog, addResponseLog } from 'sales-frontend-debug';\nimport { useClientSessionStore } from 'sales-frontend-stores';\nimport { getCookie, getDspExecutionEnvironment, isDspApp, setCookie } from 'sales-frontend-utils';\n\nimport { AuthClient } from '../auth/auth-client';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType } from './types';\n\nlet isRefreshed = true;\nconst axiosQueue: AxiosQueueType[] = [];\n\n/**\n * 쿠키에서 값을 가져오고, 없으면 기본값을 쿠키에 설정 후 반환하는 헬퍼 함수\n * @param key 쿠키 키\n * @param defaultValue 쿠키 값이 없을 때 사용할 기본값\n * @returns 쿠키 값 또는 기본값\n */\nconst getOrSetCookie = (key: string, defaultValue: string): string => {\n let value = getCookie(key);\n if (!value) {\n value = defaultValue;\n setCookie(key, value, { path: '/' });\n }\n\n return value;\n};\n\nconst authErrorHandler = () => {\n console.error('Authentication error occurred.');\n};\n\n/**\n * 전자청약\n * CSR용 http-client 입니다.\n * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.\n */\nexport class HttpClientAxios {\n config: AxiosRequestConfig;\n headerManager: HeaderManager;\n\n /**\n * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value\n */\n headers: Record<string, string> = {};\n\n /**\n * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)\n * 현재 버전에서는 axios를 사용하여 구현됨.\n */\n api: AxiosInstance;\n constructor(config: AxiosRequestConfig = {}) {\n this.config = config;\n\n /**\n * 헤더매니저 셋팅\n */\n const getter: HeaderManager['getter'] = (key) => {\n return getCookie(key);\n };\n const setter: HeaderManager['setter'] = (key, value) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n };\n this.headerManager = new HeaderManager(getter, setter);\n\n /**\n * api수행객체 최초 생성,\n * 공통으로 적용할 설정값이 있는경우 셋팅\n */\n this.api = axios.create({\n withCredentials: false,\n ...config\n });\n\n /**\n * 인터셉터 요청 처리\n */\n this.api.interceptors.request.use(\n async (config) => {\n console.log('config url', config.url);\n const debugMode = getCookie('dsp-debug-mode') === 'on';\n\n /** 디버깅용 로그 */\n await addRequestLog(config);\n\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n if (debugRefreshQueueOff) {\n isRefreshed = true;\n }\n\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const authorization = await authClient.getAT();\n if (authorization) {\n config.headers['Authorization'] = authorization;\n }\n\n if (debugMode) {\n console.log('debugMode header setting!');\n /**\n * 주소가 debugMode 경우 테스트용 헤더 삽입\n */\n config.headers['x-channel-appversion'] = getOrSetCookie('x-channel-appversion', '3.1');\n config.headers['x-channel-deviceid'] = getOrSetCookie('x-channel-deviceid', 'deviceid');\n config.headers['x-channel-devicemodel'] = getOrSetCookie('x-channel-devicemodel', 'iPHONE13');\n config.headers['x-channel-formfactor'] = getOrSetCookie('x-channel-formfactor', 'Phone');\n config.headers['x-channel-loginchannel'] = getOrSetCookie('x-channel-loginchannel', 'DSP');\n config.headers['x-channel-logintype'] = getOrSetCookie('x-channel-logintype', 'ONPA_PIN');\n config.headers['x-channel-platformname'] = getOrSetCookie('x-channel-platformname', 'IOS');\n config.headers['x-channel-platformversion'] = getOrSetCookie('x-channel-platformversion', '15.4.1');\n config.headers['x-channel-screenid'] = getOrSetCookie('x-channel-screenid', location.pathname);\n config.headers['x-channel-business-work-division-code'] = getOrSetCookie(\n 'x-channel-business-work-division-code',\n 'DEA'\n );\n } else {\n const session = useClientSessionStore.getState().clientSession;\n\n config.headers['x-channel-appversion'] = session.appVersion;\n config.headers['x-channel-deviceid'] = session.deviceId;\n config.headers['x-channel-devicemodel'] = session.deviceModel;\n config.headers['x-channel-formfactor'] = session.formFactor;\n config.headers['x-channel-loginchannel'] = session.loginChannel;\n config.headers['x-channel-logintype'] = session.loginType;\n config.headers['x-channel-platformname'] = session.platformName;\n config.headers['x-channel-platformversion'] = session.platformVersion;\n config.headers['x-channel-screenid'] = location.pathname;\n config.headers['x-channel-business-work-division-code'] = session.businessWorkDivisionCode;\n }\n\n /**\n * 커스텀헤더 주입\n */\n // this.headerManager.setCustomHeaders();\n /**\n *\n * this.headers설정된 값을 config headers에 주입\n */\n const headerEntries = Object.entries(this.headers);\n headerEntries.forEach(([key, value]) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n });\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n * 401에러 Queue처리 Request interceptor 등록\n */\n if (!isRefreshed && !config.url?.includes('internal/api/auth/refresh')) {\n console.log('request 401 큐처리');\n\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n // 세션 연장(for 영업포털 세션)\n if (getDspExecutionEnvironment() === 'iframe') {\n Bridge.iframe.dspKeepCallerSession();\n }\n\n return config;\n },\n async (error) => {\n /** 디버깅용 로그 */\n await addErrorLog(error);\n console.log('request error');\n\n return Promise.reject(error);\n }\n );\n\n /**\n * 인터셉터 응답 처리\n */\n this.api.interceptors.response.use(\n async (response: AxiosResponse) => {\n /** 디버깅용 로그 */\n await addResponseLog(response);\n if (response.data.isSuccess === false) {\n /**\n * 200 응답이라도 , isSuccess === false인 경우 에러로 reject\n */\n const axiosError = new AxiosError();\n axiosError.response = response;\n axiosError.config = response.config;\n axiosError.message = response.data.message;\n axiosError.code = response.status.toString();\n axiosError.request = response.request;\n\n return Promise.reject(axiosError);\n }\n\n return response;\n },\n async (error: AxiosError) => {\n console.log('error');\n /** 디버깅용 로그 */\n await addErrorLog(error);\n\n const originalRequest = error.config;\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n const retry_request = originalRequest?.params?.retry_request === 'true';\n console.log('retry_request', retry_request);\n /**\n * 401에러 Queue처리\n */\n if (\n error.response?.status === 401 &&\n !debugRefreshQueueOff &&\n !retry_request &&\n !originalRequest?.url?.includes('internal/api/auth/refresh')\n ) {\n console.log('error 401 큐처리');\n isRefreshed = false;\n const client = new AuthClient();\n client\n .refreshToken()\n .then(() => {\n /**\n * 토큰 갱신 성공, 플래그를 true로 설정\n */\n isRefreshed = true;\n\n /**\n * 큐에 쌓여있던 모든 요청 재시도\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n /**\n * api 인스턴스를 통해 요청을 재시도합니다. 따라서 재요청들은 다시 인터셉터를 타게 됩니다.\n * 신규토큰을 주입받고 정상처리\n * @todo 재시도후 reject시에는 로그인페이지로 보내는 브릿지 함수를 호출하도록 처리가 필요해보임.\n *\n * @note 11/07 : 무한루프이슈 해결을 위해 , 새로운 인스턴스를 사용하도록 수정\n */\n // add param 'retry_request' to prevent infinite loop\n p.config.params = {\n ...p.config.params,\n retry_request: 'true'\n };\n\n this.api\n .request(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n })\n .catch((error) => {\n /**\n * 토큰 재발행중 에러 발생한 경우 처리\n * 큐에 쌓여있던 모든 요청 reject처리\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n p.reject(error);\n }\n }\n\n if (isDspApp()) {\n //native 브릿지함수 호출\n // * 별도의 함수 호출 없이 앱에서 처리\n } else {\n //각 도메인 환경에 맞는 핸들러 주입필요\n authErrorHandler();\n }\n\n return Promise.reject(error);\n });\n\n return new Promise((resolve, reject) => {\n if (originalRequest) {\n axiosQueue.push({ resolve, reject, config: originalRequest });\n }\n });\n } else {\n console.log('error 401 큐처리 없음');\n\n return Promise.reject(error);\n }\n }\n );\n }\n\n setHeaders(headers: Record<string, string>) {\n this.headers = {\n ...this.headers,\n ...headers\n };\n }\n}\n","import { Bridge } from 'sales-frontend-bridge';\nimport { isDebugByFilterName } from 'sales-frontend-debug';\nimport { getCookie, getServicePath, isDspApp } from 'sales-frontend-utils';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\n\nexport class AuthClient {\n defaultTokenType = 'Bearer';\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n return isDspApp();\n }\n\n getAuthorizationFromCookie() {\n const accessToken = getCookie('accessToken');\n\n return accessToken ? `${this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n async getAuthorizationFromBridge() {\n const { tokenType, accessToken } = await Bridge.native.getAccessToken();\n\n return accessToken ? `${tokenType || this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n const debugModeAuthTokenFromCookie = isDebugByFilterName('auth-token');\n\n /**\n * debugMode 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (debugModeAuthTokenFromCookie) {\n console.log('debugMode token setting!');\n\n return this.getAuthorizationFromCookie();\n }\n\n if (this.isApp()) {\n return await this.getAuthorizationFromBridge();\n } else {\n /**\n * DSP 앱 외에는 쿠키 참조\n */\n return this.getAuthorizationFromCookie();\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n */\n async refreshToken(): Promise<void> {\n if (this.isApp()) {\n // 영업지원 앱인 경우 브릿지를 통해 토큰 갱신\n await Bridge.native.refreshAccessToken();\n } else {\n // 신규 앱(FP플래너, 영업포털, 순수 웹) 외에는 내부 api 호출로 토큰 갱신\n const httpClient = new HttpClientAxios();\n\n await httpClient.api.post(`${getServicePath()}/internal/api/auth/refresh`);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/http-client/header/header.types.ts","../src/http-client/header/header-manager.ts","../src/http-client/axios/http-client-axios.ts","../src/http-client/auth/auth-client.ts"],"names":["getCookie","setCookie","SentryLogController","axios","config","addRequestLog","useClientSessionStore","getDspExecutionEnvironment","Bridge","addErrorLog","addResponseLog","AxiosError","error","isDspApp","isDebugByFilterName","getServicePath"],"mappings":"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","file":"client.cjs","sourcesContent":["/**\n * @see https://loop.cloud.microsoft/p/eyJ3Ijp7InUiOiJodHRwczovL2hhbndoYWxpZmVtMzY1LnNoYXJlcG9pbnQuY29tLz9uYXY9Y3owbE1rWW1aRDFpSVVVd1FXdDJSbGhSV0VWUE1tUkNYMWhUZW5KWVVFdFBSVXByYWs1b1NrSlBjRk4wYm5wNmNsWmpMVUZ5YjI1UlJWOVdSREpUV25aeWVUUTJTV2swUlZrbVpqMHdNVk5OVGtkR1JsTkJXVE0xVVZaQ1ZrRkVRa1ZaVEVoRVNUSTBXRXhVVlZoV0ptTTlKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwicCI6eyJ1IjoiaHR0cHM6Ly9oYW53aGFsaWZlbTM2NS5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYmMyNDQwMTMtZDA1NS00MzVjLWI2NzQtMWZkNzRiM2FkNzNjLyVFQiVBQyVCOCVFQyU4NCU5QyUyMCVFQiU5RCVCQyVFQyU5RCVCNCVFQiVCOCU4QyVFQiU5RiVBQyVFQiVBNiVBQy9Mb29wQXBwRGF0YS8wOS0yLiUyMEJyaWRnZSUyMFNwZWMlMjAxLmxvb3A%2FbmF2PWN6MGxNa1pqYjI1MFpXNTBjM1J2Y21GblpTVXlSa05UVUY5aVl6STBOREF4TXkxa01EVTFMVFF6TldNdFlqWTNOQzB4Wm1RM05HSXpZV1EzTTJNbVpEMWlJVVV3UVd0MlJsaFJXRVZQTW1SQ1gxaFRlbkpZVUV0UFJVcHJhazVvU2tKUGNGTjBibnA2Y2xaakxVRnliMjVSUlY5V1JESlRXblp5ZVRRMlNXazBSVmttWmowd01WTk5Ua2RHUmxGRlYxTlFOelpMUWtsTFdrWkpXVUUzU1ZkWldGTklWa0ZUSm1NOUpUSkdKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwiaSI6eyJpIjoiNTdkZmVhM2QtZDA2Yi00YWRlLWIxZjEtYjE4NDA4MmNlN2VjIn19\n */\nexport const customHeaderNames = [\n 'Accept-Language',\n 'DeviceId',\n 'LoginType',\n 'PlatformName',\n 'PlatformVersion',\n 'AppVersion',\n 'DeviceModel',\n 'FormFactor',\n 'LoginChannel'\n];\n\nexport const AT = 'AT';\nexport type GetterSync = (keyName: string) => string;\nexport type SetterSync = (keyName: string, value: string) => void;\n\nexport type GetterAsync = (keyName: string) => Promise<string> | string;\nexport type SetterAsync = (keyName: string, value: string) => Promise<void> | void;\n","import { AT, customHeaderNames, GetterSync, SetterSync } from './header.types';\n\nexport class HeaderManager {\n private getter: GetterSync;\n private setter: SetterSync;\n\n constructor(getter: GetterSync, setter: SetterSync) {\n this.getter = getter;\n this.setter = setter;\n }\n\n /**\n * 커스텀 헤더를 동기적으로 설정합니다.\n */\n setCustomHeaders(): void {\n customHeaderNames.forEach((headerName) => {\n const customHeaderKey = `X-Channel-${headerName}`;\n const headerValue = this.getter(customHeaderKey);\n if (headerValue) {\n this.setter(customHeaderKey, headerValue);\n }\n });\n }\n\n /**\n * 인증 토큰을 동기적으로 설정합니다.\n */\n setAuthToken(): void {\n const token = this.getter(AT);\n if (token) {\n this.setter('Authorization', `Bearer ${token}`);\n }\n }\n\n /**\n * 모든 헤더를 동기적으로 설정합니다.\n */\n setAllHeaders(): void {\n this.setCustomHeaders();\n this.setAuthToken();\n }\n}\n","import axios from 'axios';\nimport { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\nimport { Bridge } from 'sales-frontend-bridge';\nimport { addErrorLog, addRequestLog, addResponseLog } from 'sales-frontend-debug';\nimport { PostSentryParams, SentryLogController } from 'sales-frontend-sentry';\nimport { useClientSessionStore } from 'sales-frontend-stores';\nimport { getCookie, getDspExecutionEnvironment, isDspApp, setCookie } from 'sales-frontend-utils';\n\nimport { AuthClient } from '../auth/auth-client';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType, HttpClientHandlerParams, HttpClientOptions } from './types';\n\nlet isRefreshed = true;\nconst axiosQueue: AxiosQueueType[] = [];\n\n/**\n * 쿠키에서 값을 가져오고, 없으면 기본값을 쿠키에 설정 후 반환하는 헬퍼 함수\n * @param key 쿠키 키\n * @param defaultValue 쿠키 값이 없을 때 사용할 기본값\n * @returns 쿠키 값 또는 기본값\n */\nconst getOrSetCookie = (key: string, defaultValue: string): string => {\n let value = getCookie(key);\n if (!value) {\n value = defaultValue;\n setCookie(key, value, { path: '/' });\n }\n\n return value;\n};\n\nconst authErrorHandler = () => {\n console.error('Authentication error occurred.');\n};\n\n/**\n * 전자청약\n * CSR용 http-client 입니다.\n * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.\n */\nexport class HttpClientAxios {\n config: AxiosRequestConfig;\n headerManager: HeaderManager;\n options?: HttpClientOptions;\n\n\n /**\n * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value\n */\n headers: Record<string, string> = {};\n\n /**\n * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)\n * 현재 버전에서는 axios를 사용하여 구현됨.\n */\n api: AxiosInstance;\n sentryLogger: SentryLogController;\n\n constructor(config: AxiosRequestConfig = {}, options?: HttpClientOptions) {\n this.config = config;\n this.options = options;\n this.sentryLogger = new SentryLogController(options?.sentryConfig);\n\n /**\n * 헤더매니저 셋팅\n */\n const getter: HeaderManager['getter'] = (key) => {\n return getCookie(key);\n };\n const setter: HeaderManager['setter'] = (key, value) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n };\n this.headerManager = new HeaderManager(getter, setter);\n\n /**\n * api수행객체 최초 생성,\n * 공통으로 적용할 설정값이 있는경우 셋팅\n */\n this.api = axios.create({\n withCredentials: false,\n ...config\n });\n\n /**\n * 인터셉터 요청 처리\n */\n this.api.interceptors.request.use(\n async (config) => {\n console.log('config url', config.url);\n const debugMode = getCookie('dsp-debug-mode') === 'on';\n\n /** 디버깅용 로그 */\n await addRequestLog(config);\n\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n if (debugRefreshQueueOff) {\n isRefreshed = true;\n }\n\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const authorization = await authClient.getAT();\n if (authorization) {\n config.headers['Authorization'] = authorization;\n }\n\n if (debugMode) {\n console.log('debugMode header setting!');\n /**\n * 주소가 debugMode 경우 테스트용 헤더 삽입\n */\n config.headers['x-channel-appversion'] = getOrSetCookie('x-channel-appversion', '3.1');\n config.headers['x-channel-deviceid'] = getOrSetCookie('x-channel-deviceid', 'deviceid');\n config.headers['x-channel-devicemodel'] = getOrSetCookie('x-channel-devicemodel', 'iPHONE13');\n config.headers['x-channel-formfactor'] = getOrSetCookie('x-channel-formfactor', 'Phone');\n config.headers['x-channel-loginchannel'] = getOrSetCookie('x-channel-loginchannel', 'DSP');\n config.headers['x-channel-logintype'] = getOrSetCookie('x-channel-logintype', 'ONPA_PIN');\n config.headers['x-channel-platformname'] = getOrSetCookie('x-channel-platformname', 'IOS');\n config.headers['x-channel-platformversion'] = getOrSetCookie('x-channel-platformversion', '15.4.1');\n config.headers['x-channel-screenid'] = getOrSetCookie('x-channel-screenid', location.pathname);\n config.headers['x-channel-business-work-division-code'] = getOrSetCookie(\n 'x-channel-business-work-division-code',\n 'DEA'\n );\n } else {\n const session = useClientSessionStore.getState().clientSession;\n\n config.headers['x-channel-appversion'] = session.appVersion;\n config.headers['x-channel-deviceid'] = session.deviceId;\n config.headers['x-channel-devicemodel'] = session.deviceModel;\n config.headers['x-channel-formfactor'] = session.formFactor;\n config.headers['x-channel-loginchannel'] = session.loginChannel;\n config.headers['x-channel-logintype'] = session.loginType;\n config.headers['x-channel-platformname'] = session.platformName;\n config.headers['x-channel-platformversion'] = session.platformVersion;\n config.headers['x-channel-screenid'] = location.pathname;\n config.headers['x-channel-business-work-division-code'] = session.businessWorkDivisionCode;\n }\n\n /**\n * 커스텀헤더 주입\n */\n // this.headerManager.setCustomHeaders();\n /**\n *\n * this.headers설정된 값을 config headers에 주입\n */\n const headerEntries = Object.entries(this.headers);\n headerEntries.forEach(([key, value]) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n });\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n * 401에러 Queue처리 Request interceptor 등록\n */\n if (!isRefreshed && !config.url?.includes('internal/api/auth/refresh')) {\n console.log('request 401 큐처리');\n\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n // 세션 연장(for 영업포털 세션)\n if (getDspExecutionEnvironment() === 'iframe') {\n Bridge.iframe.dspKeepCallerSession();\n }\n\n return config;\n },\n async (error) => {\n /** 디버깅용 로그 */\n await addErrorLog(error);\n console.log('request error');\n this.sentryLogging({\n logType: 'error',\n error\n }, {\n error,\n });\n\n return Promise.reject(error);\n }\n );\n\n /**\n * 인터셉터 응답 처리\n */\n this.api.interceptors.response.use(\n async (response: AxiosResponse) => {\n /** 디버깅용 로그 */\n await addResponseLog(response);\n if (response.data.isSuccess === false) {\n /**\n * 200 응답이라도 , isSuccess === false인 경우 에러로 reject\n */\n const axiosError = new AxiosError();\n axiosError.response = response;\n axiosError.config = response.config;\n axiosError.message = response.data.message;\n axiosError.code = response.status.toString();\n axiosError.request = response.request;\n this.sentryLogging({\n logType: 'error',\n error: axiosError,\n extraData: {\n axiosResponse: response\n }\n }, {\n response,\n });\n\n return Promise.reject(axiosError);\n }\n\n return response;\n },\n async (error: AxiosError) => {\n console.log('error');\n /** 디버깅용 로그 */\n await addErrorLog(error);\n\n const originalRequest = error.config;\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n const retry_request = originalRequest?.params?.retry_request === 'true';\n console.log('retry_request', retry_request);\n /**\n * 401에러 Queue처리\n */\n if (\n error.response?.status === 401 &&\n !debugRefreshQueueOff &&\n !retry_request &&\n !originalRequest?.url?.includes('internal/api/auth/refresh')\n ) {\n console.log('error 401 큐처리');\n isRefreshed = false;\n const client = new AuthClient();\n client\n .refreshToken()\n .then(() => {\n /**\n * 토큰 갱신 성공, 플래그를 true로 설정\n */\n isRefreshed = true;\n\n /**\n * 큐에 쌓여있던 모든 요청 재시도\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n /**\n * api 인스턴스를 통해 요청을 재시도합니다. 따라서 재요청들은 다시 인터셉터를 타게 됩니다.\n * 신규토큰을 주입받고 정상처리\n * @todo 재시도후 reject시에는 로그인페이지로 보내는 브릿지 함수를 호출하도록 처리가 필요해보임.\n *\n * @note 11/07 : 무한루프이슈 해결을 위해 , 새로운 인스턴스를 사용하도록 수정\n */\n // add param 'retry_request' to prevent infinite loop\n p.config.params = {\n ...p.config.params,\n retry_request: 'true'\n };\n\n this.api\n .request(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n })\n .catch((error) => {\n /**\n * 토큰 재발행중 에러 발생한 경우 처리\n * 큐에 쌓여있던 모든 요청 reject처리\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n p.reject(error);\n }\n }\n\n if (isDspApp()) {\n //native 브릿지함수 호출\n // * 별도의 함수 호출 없이 앱에서 처리\n } else {\n //각 도메인 환경에 맞는 핸들러 주입필요\n authErrorHandler();\n }\n\n this.sentryLogging({\n logType: 'error',\n error\n }, {\n error,\n });\n\n return Promise.reject(error);\n });\n\n return new Promise((resolve, reject) => {\n if (originalRequest) {\n axiosQueue.push({ resolve, reject, config: originalRequest });\n }\n });\n } else {\n console.log('error 401 큐처리 없음');\n this.sentryLogging({\n logType: 'error',\n error\n }, {\n error,\n });\n\n\n return Promise.reject(error);\n }\n }\n );\n }\n\n sentryLogging(params: PostSentryParams, handlerParams?: HttpClientHandlerParams) {\n /**\n * @description 센트리 사용여부\n */\n if (this.options?.useSentry === false) {\n return;\n }\n\n /**\n * @description 핸들러가 없으면 센트리로 로그 바로전송\n */\n if (typeof this.options?.handler !== 'function') {\n return this.sentryLogger.postSentry(params);\n }\n\n\n\n /**\n * 핸들러는 있는데, handlerParams가 없는 경우, 콘솔 경고\n */\n if (typeof this.options?.handler === 'function' && !handlerParams) {\n console.warn('[HttpClientAxios] handlerParams is required when handler is provided');\n\n return;\n }\n\n /**\n * 핸들러가 있고, handlerParams가 있는 경우, 핸들러 실행결과에 따라 센트리전송\n */\n if (typeof this.options?.handler === 'function' && handlerParams) {\n const isSendSentry = this.options?.handler(handlerParams);\n\n /**\n * @description 핸들러가 true를 반환하면 센트리로 로그 전송\n */\n if (isSendSentry) {\n return this.sentryLogger.postSentry(params);\n }\n }\n }\n\n setHeaders(headers: Record<string, string>) {\n this.headers = {\n ...this.headers,\n ...headers\n };\n }\n}\n","import { Bridge } from 'sales-frontend-bridge';\nimport { isDebugByFilterName } from 'sales-frontend-debug';\nimport { getCookie, getServicePath, isDspApp } from 'sales-frontend-utils';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\n\nexport class AuthClient {\n defaultTokenType = 'Bearer';\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n return isDspApp();\n }\n\n getAuthorizationFromCookie() {\n const accessToken = getCookie('accessToken');\n\n return accessToken ? `${this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n async getAuthorizationFromBridge() {\n const { tokenType, accessToken } = await Bridge.native.getAccessToken();\n\n return accessToken ? `${tokenType || this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n const debugModeAuthTokenFromCookie = isDebugByFilterName('auth-token');\n\n /**\n * debugMode 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (debugModeAuthTokenFromCookie) {\n console.log('debugMode token setting!');\n\n return this.getAuthorizationFromCookie();\n }\n\n if (this.isApp()) {\n return await this.getAuthorizationFromBridge();\n } else {\n /**\n * DSP 앱 외에는 쿠키 참조\n */\n return this.getAuthorizationFromCookie();\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n */\n async refreshToken(): Promise<void> {\n if (this.isApp()) {\n // 영업지원 앱인 경우 브릿지를 통해 토큰 갱신\n await Bridge.native.refreshAccessToken();\n } else {\n // 신규 앱(FP플래너, 영업포털, 순수 웹) 외에는 내부 api 호출로 토큰 갱신\n const httpClient = new HttpClientAxios();\n\n await httpClient.api.post(`${getServicePath()}/internal/api/auth/refresh`);\n }\n }\n}\n"]}
package/dist/client.d.cts CHANGED
@@ -1,5 +1,6 @@
1
- import { InternalAxiosRequestConfig } from 'axios';
2
- export { H as HttpClientAxios } from './http-client-axios-BpXKjpBu.cjs';
1
+ export { A as AxiosQueueType, b as HttpClientAxios, a as HttpClientHandlerParams, H as HttpClientOptions } from './http-client-axios-CyzrvIED.cjs';
2
+ import 'axios';
3
+ import 'sales-frontend-sentry';
3
4
  import './header.types-duHbFvO0.cjs';
4
5
 
5
6
  declare class AuthClient {
@@ -24,10 +25,4 @@ declare class AuthClient {
24
25
  refreshToken(): Promise<void>;
25
26
  }
26
27
 
27
- interface AxiosQueueType {
28
- resolve: (value?: unknown) => void;
29
- reject: (reason?: unknown) => void;
30
- config: InternalAxiosRequestConfig;
31
- }
32
-
33
- export { AuthClient, type AxiosQueueType };
28
+ export { AuthClient };
package/dist/client.d.ts CHANGED
@@ -1,5 +1,6 @@
1
- import { InternalAxiosRequestConfig } from 'axios';
2
- export { H as HttpClientAxios } from './http-client-axios-BpIbE8ql.js';
1
+ export { A as AxiosQueueType, b as HttpClientAxios, a as HttpClientHandlerParams, H as HttpClientOptions } from './http-client-axios-CsGe23I5.js';
2
+ import 'axios';
3
+ import 'sales-frontend-sentry';
3
4
  import './header.types-duHbFvO0.js';
4
5
 
5
6
  declare class AuthClient {
@@ -24,10 +25,4 @@ declare class AuthClient {
24
25
  refreshToken(): Promise<void>;
25
26
  }
26
27
 
27
- interface AxiosQueueType {
28
- resolve: (value?: unknown) => void;
29
- reject: (reason?: unknown) => void;
30
- config: InternalAxiosRequestConfig;
31
- }
32
-
33
- export { AuthClient, type AxiosQueueType };
28
+ export { AuthClient };
package/dist/client.js CHANGED
@@ -2,6 +2,7 @@ import { Bridge } from 'sales-frontend-bridge';
2
2
  import { addRequestLog, addErrorLog, addResponseLog, isDebugByFilterName } from 'sales-frontend-debug';
3
3
  import { getCookie, getDspExecutionEnvironment, isDspApp, getServicePath, setCookie } from 'sales-frontend-utils';
4
4
  import axios, { AxiosError } from 'axios';
5
+ import { SentryLogController } from 'sales-frontend-sentry';
5
6
  import { useClientSessionStore } from 'sales-frontend-stores';
6
7
 
7
8
  var __defProp = Object.defineProperty;
@@ -75,9 +76,10 @@ var authErrorHandler = () => {
75
76
  console.error("Authentication error occurred.");
76
77
  };
77
78
  var HttpClientAxios = class {
78
- constructor(config = {}) {
79
+ constructor(config = {}, options) {
79
80
  __publicField(this, "config");
80
81
  __publicField(this, "headerManager");
82
+ __publicField(this, "options");
81
83
  /**
82
84
  * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
83
85
  */
@@ -87,7 +89,10 @@ var HttpClientAxios = class {
87
89
  * 현재 버전에서는 axios를 사용하여 구현됨.
88
90
  */
89
91
  __publicField(this, "api");
92
+ __publicField(this, "sentryLogger");
90
93
  this.config = config;
94
+ this.options = options;
95
+ this.sentryLogger = new SentryLogController(options?.sentryConfig);
91
96
  const getter = (key) => {
92
97
  return getCookie(key);
93
98
  };
@@ -163,6 +168,12 @@ var HttpClientAxios = class {
163
168
  async (error) => {
164
169
  await addErrorLog(error);
165
170
  console.log("request error");
171
+ this.sentryLogging({
172
+ logType: "error",
173
+ error
174
+ }, {
175
+ error
176
+ });
166
177
  return Promise.reject(error);
167
178
  }
168
179
  );
@@ -176,6 +187,15 @@ var HttpClientAxios = class {
176
187
  axiosError.message = response.data.message;
177
188
  axiosError.code = response.status.toString();
178
189
  axiosError.request = response.request;
190
+ this.sentryLogging({
191
+ logType: "error",
192
+ error: axiosError,
193
+ extraData: {
194
+ axiosResponse: response
195
+ }
196
+ }, {
197
+ response
198
+ });
179
199
  return Promise.reject(axiosError);
180
200
  }
181
201
  return response;
@@ -213,6 +233,12 @@ var HttpClientAxios = class {
213
233
  if (isDspApp()) ; else {
214
234
  authErrorHandler();
215
235
  }
236
+ this.sentryLogging({
237
+ logType: "error",
238
+ error: error2
239
+ }, {
240
+ error: error2
241
+ });
216
242
  return Promise.reject(error2);
217
243
  });
218
244
  return new Promise((resolve, reject) => {
@@ -222,11 +248,35 @@ var HttpClientAxios = class {
222
248
  });
223
249
  } else {
224
250
  console.log("error 401 \uD050\uCC98\uB9AC \uC5C6\uC74C");
251
+ this.sentryLogging({
252
+ logType: "error",
253
+ error
254
+ }, {
255
+ error
256
+ });
225
257
  return Promise.reject(error);
226
258
  }
227
259
  }
228
260
  );
229
261
  }
262
+ sentryLogging(params, handlerParams) {
263
+ if (this.options?.useSentry === false) {
264
+ return;
265
+ }
266
+ if (typeof this.options?.handler !== "function") {
267
+ return this.sentryLogger.postSentry(params);
268
+ }
269
+ if (typeof this.options?.handler === "function" && !handlerParams) {
270
+ console.warn("[HttpClientAxios] handlerParams is required when handler is provided");
271
+ return;
272
+ }
273
+ if (typeof this.options?.handler === "function" && handlerParams) {
274
+ const isSendSentry = this.options?.handler(handlerParams);
275
+ if (isSendSentry) {
276
+ return this.sentryLogger.postSentry(params);
277
+ }
278
+ }
279
+ }
230
280
  setHeaders(headers) {
231
281
  this.headers = {
232
282
  ...this.headers,
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http-client/header/header.types.ts","../src/http-client/header/header-manager.ts","../src/http-client/axios/http-client-axios.ts","../src/http-client/auth/auth-client.ts"],"names":["config","error","isDspApp","getCookie","Bridge"],"mappings":"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","file":"client.js","sourcesContent":["/**\n * @see https://loop.cloud.microsoft/p/eyJ3Ijp7InUiOiJodHRwczovL2hhbndoYWxpZmVtMzY1LnNoYXJlcG9pbnQuY29tLz9uYXY9Y3owbE1rWW1aRDFpSVVVd1FXdDJSbGhSV0VWUE1tUkNYMWhUZW5KWVVFdFBSVXByYWs1b1NrSlBjRk4wYm5wNmNsWmpMVUZ5YjI1UlJWOVdSREpUV25aeWVUUTJTV2swUlZrbVpqMHdNVk5OVGtkR1JsTkJXVE0xVVZaQ1ZrRkVRa1ZaVEVoRVNUSTBXRXhVVlZoV0ptTTlKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwicCI6eyJ1IjoiaHR0cHM6Ly9oYW53aGFsaWZlbTM2NS5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYmMyNDQwMTMtZDA1NS00MzVjLWI2NzQtMWZkNzRiM2FkNzNjLyVFQiVBQyVCOCVFQyU4NCU5QyUyMCVFQiU5RCVCQyVFQyU5RCVCNCVFQiVCOCU4QyVFQiU5RiVBQyVFQiVBNiVBQy9Mb29wQXBwRGF0YS8wOS0yLiUyMEJyaWRnZSUyMFNwZWMlMjAxLmxvb3A%2FbmF2PWN6MGxNa1pqYjI1MFpXNTBjM1J2Y21GblpTVXlSa05UVUY5aVl6STBOREF4TXkxa01EVTFMVFF6TldNdFlqWTNOQzB4Wm1RM05HSXpZV1EzTTJNbVpEMWlJVVV3UVd0MlJsaFJXRVZQTW1SQ1gxaFRlbkpZVUV0UFJVcHJhazVvU2tKUGNGTjBibnA2Y2xaakxVRnliMjVSUlY5V1JESlRXblp5ZVRRMlNXazBSVmttWmowd01WTk5Ua2RHUmxGRlYxTlFOelpMUWtsTFdrWkpXVUUzU1ZkWldGTklWa0ZUSm1NOUpUSkdKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwiaSI6eyJpIjoiNTdkZmVhM2QtZDA2Yi00YWRlLWIxZjEtYjE4NDA4MmNlN2VjIn19\n */\nexport const customHeaderNames = [\n 'Accept-Language',\n 'DeviceId',\n 'LoginType',\n 'PlatformName',\n 'PlatformVersion',\n 'AppVersion',\n 'DeviceModel',\n 'FormFactor',\n 'LoginChannel'\n];\n\nexport const AT = 'AT';\nexport type GetterSync = (keyName: string) => string;\nexport type SetterSync = (keyName: string, value: string) => void;\n\nexport type GetterAsync = (keyName: string) => Promise<string> | string;\nexport type SetterAsync = (keyName: string, value: string) => Promise<void> | void;\n","import { AT, customHeaderNames, GetterSync, SetterSync } from './header.types';\n\nexport class HeaderManager {\n private getter: GetterSync;\n private setter: SetterSync;\n\n constructor(getter: GetterSync, setter: SetterSync) {\n this.getter = getter;\n this.setter = setter;\n }\n\n /**\n * 커스텀 헤더를 동기적으로 설정합니다.\n */\n setCustomHeaders(): void {\n customHeaderNames.forEach((headerName) => {\n const customHeaderKey = `X-Channel-${headerName}`;\n const headerValue = this.getter(customHeaderKey);\n if (headerValue) {\n this.setter(customHeaderKey, headerValue);\n }\n });\n }\n\n /**\n * 인증 토큰을 동기적으로 설정합니다.\n */\n setAuthToken(): void {\n const token = this.getter(AT);\n if (token) {\n this.setter('Authorization', `Bearer ${token}`);\n }\n }\n\n /**\n * 모든 헤더를 동기적으로 설정합니다.\n */\n setAllHeaders(): void {\n this.setCustomHeaders();\n this.setAuthToken();\n }\n}\n","import axios from 'axios';\nimport { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\nimport { Bridge } from 'sales-frontend-bridge';\nimport { addErrorLog, addRequestLog, addResponseLog } from 'sales-frontend-debug';\nimport { useClientSessionStore } from 'sales-frontend-stores';\nimport { getCookie, getDspExecutionEnvironment, isDspApp, setCookie } from 'sales-frontend-utils';\n\nimport { AuthClient } from '../auth/auth-client';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType } from './types';\n\nlet isRefreshed = true;\nconst axiosQueue: AxiosQueueType[] = [];\n\n/**\n * 쿠키에서 값을 가져오고, 없으면 기본값을 쿠키에 설정 후 반환하는 헬퍼 함수\n * @param key 쿠키 키\n * @param defaultValue 쿠키 값이 없을 때 사용할 기본값\n * @returns 쿠키 값 또는 기본값\n */\nconst getOrSetCookie = (key: string, defaultValue: string): string => {\n let value = getCookie(key);\n if (!value) {\n value = defaultValue;\n setCookie(key, value, { path: '/' });\n }\n\n return value;\n};\n\nconst authErrorHandler = () => {\n console.error('Authentication error occurred.');\n};\n\n/**\n * 전자청약\n * CSR용 http-client 입니다.\n * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.\n */\nexport class HttpClientAxios {\n config: AxiosRequestConfig;\n headerManager: HeaderManager;\n\n /**\n * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value\n */\n headers: Record<string, string> = {};\n\n /**\n * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)\n * 현재 버전에서는 axios를 사용하여 구현됨.\n */\n api: AxiosInstance;\n constructor(config: AxiosRequestConfig = {}) {\n this.config = config;\n\n /**\n * 헤더매니저 셋팅\n */\n const getter: HeaderManager['getter'] = (key) => {\n return getCookie(key);\n };\n const setter: HeaderManager['setter'] = (key, value) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n };\n this.headerManager = new HeaderManager(getter, setter);\n\n /**\n * api수행객체 최초 생성,\n * 공통으로 적용할 설정값이 있는경우 셋팅\n */\n this.api = axios.create({\n withCredentials: false,\n ...config\n });\n\n /**\n * 인터셉터 요청 처리\n */\n this.api.interceptors.request.use(\n async (config) => {\n console.log('config url', config.url);\n const debugMode = getCookie('dsp-debug-mode') === 'on';\n\n /** 디버깅용 로그 */\n await addRequestLog(config);\n\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n if (debugRefreshQueueOff) {\n isRefreshed = true;\n }\n\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const authorization = await authClient.getAT();\n if (authorization) {\n config.headers['Authorization'] = authorization;\n }\n\n if (debugMode) {\n console.log('debugMode header setting!');\n /**\n * 주소가 debugMode 경우 테스트용 헤더 삽입\n */\n config.headers['x-channel-appversion'] = getOrSetCookie('x-channel-appversion', '3.1');\n config.headers['x-channel-deviceid'] = getOrSetCookie('x-channel-deviceid', 'deviceid');\n config.headers['x-channel-devicemodel'] = getOrSetCookie('x-channel-devicemodel', 'iPHONE13');\n config.headers['x-channel-formfactor'] = getOrSetCookie('x-channel-formfactor', 'Phone');\n config.headers['x-channel-loginchannel'] = getOrSetCookie('x-channel-loginchannel', 'DSP');\n config.headers['x-channel-logintype'] = getOrSetCookie('x-channel-logintype', 'ONPA_PIN');\n config.headers['x-channel-platformname'] = getOrSetCookie('x-channel-platformname', 'IOS');\n config.headers['x-channel-platformversion'] = getOrSetCookie('x-channel-platformversion', '15.4.1');\n config.headers['x-channel-screenid'] = getOrSetCookie('x-channel-screenid', location.pathname);\n config.headers['x-channel-business-work-division-code'] = getOrSetCookie(\n 'x-channel-business-work-division-code',\n 'DEA'\n );\n } else {\n const session = useClientSessionStore.getState().clientSession;\n\n config.headers['x-channel-appversion'] = session.appVersion;\n config.headers['x-channel-deviceid'] = session.deviceId;\n config.headers['x-channel-devicemodel'] = session.deviceModel;\n config.headers['x-channel-formfactor'] = session.formFactor;\n config.headers['x-channel-loginchannel'] = session.loginChannel;\n config.headers['x-channel-logintype'] = session.loginType;\n config.headers['x-channel-platformname'] = session.platformName;\n config.headers['x-channel-platformversion'] = session.platformVersion;\n config.headers['x-channel-screenid'] = location.pathname;\n config.headers['x-channel-business-work-division-code'] = session.businessWorkDivisionCode;\n }\n\n /**\n * 커스텀헤더 주입\n */\n // this.headerManager.setCustomHeaders();\n /**\n *\n * this.headers설정된 값을 config headers에 주입\n */\n const headerEntries = Object.entries(this.headers);\n headerEntries.forEach(([key, value]) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n });\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n * 401에러 Queue처리 Request interceptor 등록\n */\n if (!isRefreshed && !config.url?.includes('internal/api/auth/refresh')) {\n console.log('request 401 큐처리');\n\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n // 세션 연장(for 영업포털 세션)\n if (getDspExecutionEnvironment() === 'iframe') {\n Bridge.iframe.dspKeepCallerSession();\n }\n\n return config;\n },\n async (error) => {\n /** 디버깅용 로그 */\n await addErrorLog(error);\n console.log('request error');\n\n return Promise.reject(error);\n }\n );\n\n /**\n * 인터셉터 응답 처리\n */\n this.api.interceptors.response.use(\n async (response: AxiosResponse) => {\n /** 디버깅용 로그 */\n await addResponseLog(response);\n if (response.data.isSuccess === false) {\n /**\n * 200 응답이라도 , isSuccess === false인 경우 에러로 reject\n */\n const axiosError = new AxiosError();\n axiosError.response = response;\n axiosError.config = response.config;\n axiosError.message = response.data.message;\n axiosError.code = response.status.toString();\n axiosError.request = response.request;\n\n return Promise.reject(axiosError);\n }\n\n return response;\n },\n async (error: AxiosError) => {\n console.log('error');\n /** 디버깅용 로그 */\n await addErrorLog(error);\n\n const originalRequest = error.config;\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n const retry_request = originalRequest?.params?.retry_request === 'true';\n console.log('retry_request', retry_request);\n /**\n * 401에러 Queue처리\n */\n if (\n error.response?.status === 401 &&\n !debugRefreshQueueOff &&\n !retry_request &&\n !originalRequest?.url?.includes('internal/api/auth/refresh')\n ) {\n console.log('error 401 큐처리');\n isRefreshed = false;\n const client = new AuthClient();\n client\n .refreshToken()\n .then(() => {\n /**\n * 토큰 갱신 성공, 플래그를 true로 설정\n */\n isRefreshed = true;\n\n /**\n * 큐에 쌓여있던 모든 요청 재시도\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n /**\n * api 인스턴스를 통해 요청을 재시도합니다. 따라서 재요청들은 다시 인터셉터를 타게 됩니다.\n * 신규토큰을 주입받고 정상처리\n * @todo 재시도후 reject시에는 로그인페이지로 보내는 브릿지 함수를 호출하도록 처리가 필요해보임.\n *\n * @note 11/07 : 무한루프이슈 해결을 위해 , 새로운 인스턴스를 사용하도록 수정\n */\n // add param 'retry_request' to prevent infinite loop\n p.config.params = {\n ...p.config.params,\n retry_request: 'true'\n };\n\n this.api\n .request(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n })\n .catch((error) => {\n /**\n * 토큰 재발행중 에러 발생한 경우 처리\n * 큐에 쌓여있던 모든 요청 reject처리\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n p.reject(error);\n }\n }\n\n if (isDspApp()) {\n //native 브릿지함수 호출\n // * 별도의 함수 호출 없이 앱에서 처리\n } else {\n //각 도메인 환경에 맞는 핸들러 주입필요\n authErrorHandler();\n }\n\n return Promise.reject(error);\n });\n\n return new Promise((resolve, reject) => {\n if (originalRequest) {\n axiosQueue.push({ resolve, reject, config: originalRequest });\n }\n });\n } else {\n console.log('error 401 큐처리 없음');\n\n return Promise.reject(error);\n }\n }\n );\n }\n\n setHeaders(headers: Record<string, string>) {\n this.headers = {\n ...this.headers,\n ...headers\n };\n }\n}\n","import { Bridge } from 'sales-frontend-bridge';\nimport { isDebugByFilterName } from 'sales-frontend-debug';\nimport { getCookie, getServicePath, isDspApp } from 'sales-frontend-utils';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\n\nexport class AuthClient {\n defaultTokenType = 'Bearer';\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n return isDspApp();\n }\n\n getAuthorizationFromCookie() {\n const accessToken = getCookie('accessToken');\n\n return accessToken ? `${this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n async getAuthorizationFromBridge() {\n const { tokenType, accessToken } = await Bridge.native.getAccessToken();\n\n return accessToken ? `${tokenType || this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n const debugModeAuthTokenFromCookie = isDebugByFilterName('auth-token');\n\n /**\n * debugMode 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (debugModeAuthTokenFromCookie) {\n console.log('debugMode token setting!');\n\n return this.getAuthorizationFromCookie();\n }\n\n if (this.isApp()) {\n return await this.getAuthorizationFromBridge();\n } else {\n /**\n * DSP 앱 외에는 쿠키 참조\n */\n return this.getAuthorizationFromCookie();\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n */\n async refreshToken(): Promise<void> {\n if (this.isApp()) {\n // 영업지원 앱인 경우 브릿지를 통해 토큰 갱신\n await Bridge.native.refreshAccessToken();\n } else {\n // 신규 앱(FP플래너, 영업포털, 순수 웹) 외에는 내부 api 호출로 토큰 갱신\n const httpClient = new HttpClientAxios();\n\n await httpClient.api.post(`${getServicePath()}/internal/api/auth/refresh`);\n }\n }\n}\n"]}
1
+ {"version":3,"sources":["../src/http-client/header/header.types.ts","../src/http-client/header/header-manager.ts","../src/http-client/axios/http-client-axios.ts","../src/http-client/auth/auth-client.ts"],"names":["config","error","isDspApp","getCookie","Bridge"],"mappings":"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","file":"client.js","sourcesContent":["/**\n * @see https://loop.cloud.microsoft/p/eyJ3Ijp7InUiOiJodHRwczovL2hhbndoYWxpZmVtMzY1LnNoYXJlcG9pbnQuY29tLz9uYXY9Y3owbE1rWW1aRDFpSVVVd1FXdDJSbGhSV0VWUE1tUkNYMWhUZW5KWVVFdFBSVXByYWs1b1NrSlBjRk4wYm5wNmNsWmpMVUZ5YjI1UlJWOVdSREpUV25aeWVUUTJTV2swUlZrbVpqMHdNVk5OVGtkR1JsTkJXVE0xVVZaQ1ZrRkVRa1ZaVEVoRVNUSTBXRXhVVlZoV0ptTTlKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwicCI6eyJ1IjoiaHR0cHM6Ly9oYW53aGFsaWZlbTM2NS5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYmMyNDQwMTMtZDA1NS00MzVjLWI2NzQtMWZkNzRiM2FkNzNjLyVFQiVBQyVCOCVFQyU4NCU5QyUyMCVFQiU5RCVCQyVFQyU5RCVCNCVFQiVCOCU4QyVFQiU5RiVBQyVFQiVBNiVBQy9Mb29wQXBwRGF0YS8wOS0yLiUyMEJyaWRnZSUyMFNwZWMlMjAxLmxvb3A%2FbmF2PWN6MGxNa1pqYjI1MFpXNTBjM1J2Y21GblpTVXlSa05UVUY5aVl6STBOREF4TXkxa01EVTFMVFF6TldNdFlqWTNOQzB4Wm1RM05HSXpZV1EzTTJNbVpEMWlJVVV3UVd0MlJsaFJXRVZQTW1SQ1gxaFRlbkpZVUV0UFJVcHJhazVvU2tKUGNGTjBibnA2Y2xaakxVRnliMjVSUlY5V1JESlRXblp5ZVRRMlNXazBSVmttWmowd01WTk5Ua2RHUmxGRlYxTlFOelpMUWtsTFdrWkpXVUUzU1ZkWldGTklWa0ZUSm1NOUpUSkdKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwiaSI6eyJpIjoiNTdkZmVhM2QtZDA2Yi00YWRlLWIxZjEtYjE4NDA4MmNlN2VjIn19\n */\nexport const customHeaderNames = [\n 'Accept-Language',\n 'DeviceId',\n 'LoginType',\n 'PlatformName',\n 'PlatformVersion',\n 'AppVersion',\n 'DeviceModel',\n 'FormFactor',\n 'LoginChannel'\n];\n\nexport const AT = 'AT';\nexport type GetterSync = (keyName: string) => string;\nexport type SetterSync = (keyName: string, value: string) => void;\n\nexport type GetterAsync = (keyName: string) => Promise<string> | string;\nexport type SetterAsync = (keyName: string, value: string) => Promise<void> | void;\n","import { AT, customHeaderNames, GetterSync, SetterSync } from './header.types';\n\nexport class HeaderManager {\n private getter: GetterSync;\n private setter: SetterSync;\n\n constructor(getter: GetterSync, setter: SetterSync) {\n this.getter = getter;\n this.setter = setter;\n }\n\n /**\n * 커스텀 헤더를 동기적으로 설정합니다.\n */\n setCustomHeaders(): void {\n customHeaderNames.forEach((headerName) => {\n const customHeaderKey = `X-Channel-${headerName}`;\n const headerValue = this.getter(customHeaderKey);\n if (headerValue) {\n this.setter(customHeaderKey, headerValue);\n }\n });\n }\n\n /**\n * 인증 토큰을 동기적으로 설정합니다.\n */\n setAuthToken(): void {\n const token = this.getter(AT);\n if (token) {\n this.setter('Authorization', `Bearer ${token}`);\n }\n }\n\n /**\n * 모든 헤더를 동기적으로 설정합니다.\n */\n setAllHeaders(): void {\n this.setCustomHeaders();\n this.setAuthToken();\n }\n}\n","import axios from 'axios';\nimport { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\nimport { Bridge } from 'sales-frontend-bridge';\nimport { addErrorLog, addRequestLog, addResponseLog } from 'sales-frontend-debug';\nimport { PostSentryParams, SentryLogController } from 'sales-frontend-sentry';\nimport { useClientSessionStore } from 'sales-frontend-stores';\nimport { getCookie, getDspExecutionEnvironment, isDspApp, setCookie } from 'sales-frontend-utils';\n\nimport { AuthClient } from '../auth/auth-client';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType, HttpClientHandlerParams, HttpClientOptions } from './types';\n\nlet isRefreshed = true;\nconst axiosQueue: AxiosQueueType[] = [];\n\n/**\n * 쿠키에서 값을 가져오고, 없으면 기본값을 쿠키에 설정 후 반환하는 헬퍼 함수\n * @param key 쿠키 키\n * @param defaultValue 쿠키 값이 없을 때 사용할 기본값\n * @returns 쿠키 값 또는 기본값\n */\nconst getOrSetCookie = (key: string, defaultValue: string): string => {\n let value = getCookie(key);\n if (!value) {\n value = defaultValue;\n setCookie(key, value, { path: '/' });\n }\n\n return value;\n};\n\nconst authErrorHandler = () => {\n console.error('Authentication error occurred.');\n};\n\n/**\n * 전자청약\n * CSR용 http-client 입니다.\n * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.\n */\nexport class HttpClientAxios {\n config: AxiosRequestConfig;\n headerManager: HeaderManager;\n options?: HttpClientOptions;\n\n\n /**\n * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value\n */\n headers: Record<string, string> = {};\n\n /**\n * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)\n * 현재 버전에서는 axios를 사용하여 구현됨.\n */\n api: AxiosInstance;\n sentryLogger: SentryLogController;\n\n constructor(config: AxiosRequestConfig = {}, options?: HttpClientOptions) {\n this.config = config;\n this.options = options;\n this.sentryLogger = new SentryLogController(options?.sentryConfig);\n\n /**\n * 헤더매니저 셋팅\n */\n const getter: HeaderManager['getter'] = (key) => {\n return getCookie(key);\n };\n const setter: HeaderManager['setter'] = (key, value) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n };\n this.headerManager = new HeaderManager(getter, setter);\n\n /**\n * api수행객체 최초 생성,\n * 공통으로 적용할 설정값이 있는경우 셋팅\n */\n this.api = axios.create({\n withCredentials: false,\n ...config\n });\n\n /**\n * 인터셉터 요청 처리\n */\n this.api.interceptors.request.use(\n async (config) => {\n console.log('config url', config.url);\n const debugMode = getCookie('dsp-debug-mode') === 'on';\n\n /** 디버깅용 로그 */\n await addRequestLog(config);\n\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n if (debugRefreshQueueOff) {\n isRefreshed = true;\n }\n\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const authorization = await authClient.getAT();\n if (authorization) {\n config.headers['Authorization'] = authorization;\n }\n\n if (debugMode) {\n console.log('debugMode header setting!');\n /**\n * 주소가 debugMode 경우 테스트용 헤더 삽입\n */\n config.headers['x-channel-appversion'] = getOrSetCookie('x-channel-appversion', '3.1');\n config.headers['x-channel-deviceid'] = getOrSetCookie('x-channel-deviceid', 'deviceid');\n config.headers['x-channel-devicemodel'] = getOrSetCookie('x-channel-devicemodel', 'iPHONE13');\n config.headers['x-channel-formfactor'] = getOrSetCookie('x-channel-formfactor', 'Phone');\n config.headers['x-channel-loginchannel'] = getOrSetCookie('x-channel-loginchannel', 'DSP');\n config.headers['x-channel-logintype'] = getOrSetCookie('x-channel-logintype', 'ONPA_PIN');\n config.headers['x-channel-platformname'] = getOrSetCookie('x-channel-platformname', 'IOS');\n config.headers['x-channel-platformversion'] = getOrSetCookie('x-channel-platformversion', '15.4.1');\n config.headers['x-channel-screenid'] = getOrSetCookie('x-channel-screenid', location.pathname);\n config.headers['x-channel-business-work-division-code'] = getOrSetCookie(\n 'x-channel-business-work-division-code',\n 'DEA'\n );\n } else {\n const session = useClientSessionStore.getState().clientSession;\n\n config.headers['x-channel-appversion'] = session.appVersion;\n config.headers['x-channel-deviceid'] = session.deviceId;\n config.headers['x-channel-devicemodel'] = session.deviceModel;\n config.headers['x-channel-formfactor'] = session.formFactor;\n config.headers['x-channel-loginchannel'] = session.loginChannel;\n config.headers['x-channel-logintype'] = session.loginType;\n config.headers['x-channel-platformname'] = session.platformName;\n config.headers['x-channel-platformversion'] = session.platformVersion;\n config.headers['x-channel-screenid'] = location.pathname;\n config.headers['x-channel-business-work-division-code'] = session.businessWorkDivisionCode;\n }\n\n /**\n * 커스텀헤더 주입\n */\n // this.headerManager.setCustomHeaders();\n /**\n *\n * this.headers설정된 값을 config headers에 주입\n */\n const headerEntries = Object.entries(this.headers);\n headerEntries.forEach(([key, value]) => {\n if (config?.headers) {\n config.headers[key] = value;\n }\n });\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n * 401에러 Queue처리 Request interceptor 등록\n */\n if (!isRefreshed && !config.url?.includes('internal/api/auth/refresh')) {\n console.log('request 401 큐처리');\n\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n // 세션 연장(for 영업포털 세션)\n if (getDspExecutionEnvironment() === 'iframe') {\n Bridge.iframe.dspKeepCallerSession();\n }\n\n return config;\n },\n async (error) => {\n /** 디버깅용 로그 */\n await addErrorLog(error);\n console.log('request error');\n this.sentryLogging({\n logType: 'error',\n error\n }, {\n error,\n });\n\n return Promise.reject(error);\n }\n );\n\n /**\n * 인터셉터 응답 처리\n */\n this.api.interceptors.response.use(\n async (response: AxiosResponse) => {\n /** 디버깅용 로그 */\n await addResponseLog(response);\n if (response.data.isSuccess === false) {\n /**\n * 200 응답이라도 , isSuccess === false인 경우 에러로 reject\n */\n const axiosError = new AxiosError();\n axiosError.response = response;\n axiosError.config = response.config;\n axiosError.message = response.data.message;\n axiosError.code = response.status.toString();\n axiosError.request = response.request;\n this.sentryLogging({\n logType: 'error',\n error: axiosError,\n extraData: {\n axiosResponse: response\n }\n }, {\n response,\n });\n\n return Promise.reject(axiosError);\n }\n\n return response;\n },\n async (error: AxiosError) => {\n console.log('error');\n /** 디버깅용 로그 */\n await addErrorLog(error);\n\n const originalRequest = error.config;\n const debugRefreshQueueOff = config.headers?.['Debug-Refresh-Queue-Off'] === 'true';\n const retry_request = originalRequest?.params?.retry_request === 'true';\n console.log('retry_request', retry_request);\n /**\n * 401에러 Queue처리\n */\n if (\n error.response?.status === 401 &&\n !debugRefreshQueueOff &&\n !retry_request &&\n !originalRequest?.url?.includes('internal/api/auth/refresh')\n ) {\n console.log('error 401 큐처리');\n isRefreshed = false;\n const client = new AuthClient();\n client\n .refreshToken()\n .then(() => {\n /**\n * 토큰 갱신 성공, 플래그를 true로 설정\n */\n isRefreshed = true;\n\n /**\n * 큐에 쌓여있던 모든 요청 재시도\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n /**\n * api 인스턴스를 통해 요청을 재시도합니다. 따라서 재요청들은 다시 인터셉터를 타게 됩니다.\n * 신규토큰을 주입받고 정상처리\n * @todo 재시도후 reject시에는 로그인페이지로 보내는 브릿지 함수를 호출하도록 처리가 필요해보임.\n *\n * @note 11/07 : 무한루프이슈 해결을 위해 , 새로운 인스턴스를 사용하도록 수정\n */\n // add param 'retry_request' to prevent infinite loop\n p.config.params = {\n ...p.config.params,\n retry_request: 'true'\n };\n\n this.api\n .request(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n })\n .catch((error) => {\n /**\n * 토큰 재발행중 에러 발생한 경우 처리\n * 큐에 쌓여있던 모든 요청 reject처리\n */\n while (axiosQueue.length > 0) {\n const p = axiosQueue.shift(); // axiosQueue에서 첫 번째 요소를 제거하고 반환합니다.\n if (p) {\n p.reject(error);\n }\n }\n\n if (isDspApp()) {\n //native 브릿지함수 호출\n // * 별도의 함수 호출 없이 앱에서 처리\n } else {\n //각 도메인 환경에 맞는 핸들러 주입필요\n authErrorHandler();\n }\n\n this.sentryLogging({\n logType: 'error',\n error\n }, {\n error,\n });\n\n return Promise.reject(error);\n });\n\n return new Promise((resolve, reject) => {\n if (originalRequest) {\n axiosQueue.push({ resolve, reject, config: originalRequest });\n }\n });\n } else {\n console.log('error 401 큐처리 없음');\n this.sentryLogging({\n logType: 'error',\n error\n }, {\n error,\n });\n\n\n return Promise.reject(error);\n }\n }\n );\n }\n\n sentryLogging(params: PostSentryParams, handlerParams?: HttpClientHandlerParams) {\n /**\n * @description 센트리 사용여부\n */\n if (this.options?.useSentry === false) {\n return;\n }\n\n /**\n * @description 핸들러가 없으면 센트리로 로그 바로전송\n */\n if (typeof this.options?.handler !== 'function') {\n return this.sentryLogger.postSentry(params);\n }\n\n\n\n /**\n * 핸들러는 있는데, handlerParams가 없는 경우, 콘솔 경고\n */\n if (typeof this.options?.handler === 'function' && !handlerParams) {\n console.warn('[HttpClientAxios] handlerParams is required when handler is provided');\n\n return;\n }\n\n /**\n * 핸들러가 있고, handlerParams가 있는 경우, 핸들러 실행결과에 따라 센트리전송\n */\n if (typeof this.options?.handler === 'function' && handlerParams) {\n const isSendSentry = this.options?.handler(handlerParams);\n\n /**\n * @description 핸들러가 true를 반환하면 센트리로 로그 전송\n */\n if (isSendSentry) {\n return this.sentryLogger.postSentry(params);\n }\n }\n }\n\n setHeaders(headers: Record<string, string>) {\n this.headers = {\n ...this.headers,\n ...headers\n };\n }\n}\n","import { Bridge } from 'sales-frontend-bridge';\nimport { isDebugByFilterName } from 'sales-frontend-debug';\nimport { getCookie, getServicePath, isDspApp } from 'sales-frontend-utils';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\n\nexport class AuthClient {\n defaultTokenType = 'Bearer';\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n return isDspApp();\n }\n\n getAuthorizationFromCookie() {\n const accessToken = getCookie('accessToken');\n\n return accessToken ? `${this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n async getAuthorizationFromBridge() {\n const { tokenType, accessToken } = await Bridge.native.getAccessToken();\n\n return accessToken ? `${tokenType || this.defaultTokenType} ${accessToken}` : undefined;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n const debugModeAuthTokenFromCookie = isDebugByFilterName('auth-token');\n\n /**\n * debugMode 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (debugModeAuthTokenFromCookie) {\n console.log('debugMode token setting!');\n\n return this.getAuthorizationFromCookie();\n }\n\n if (this.isApp()) {\n return await this.getAuthorizationFromBridge();\n } else {\n /**\n * DSP 앱 외에는 쿠키 참조\n */\n return this.getAuthorizationFromCookie();\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n */\n async refreshToken(): Promise<void> {\n if (this.isApp()) {\n // 영업지원 앱인 경우 브릿지를 통해 토큰 갱신\n await Bridge.native.refreshAccessToken();\n } else {\n // 신규 앱(FP플래너, 영업포털, 순수 웹) 외에는 내부 api 호출로 토큰 갱신\n const httpClient = new HttpClientAxios();\n\n await httpClient.api.post(`${getServicePath()}/internal/api/auth/refresh`);\n }\n }\n}\n"]}
@@ -0,0 +1,78 @@
1
+ import { InternalAxiosRequestConfig, AxiosResponse, AxiosError, AxiosRequestConfig, AxiosInstance } from 'axios';
2
+ import { SentryConfig, SentryLogController, PostSentryParams } from 'sales-frontend-sentry';
3
+ import { G as GetterSync, S as SetterSync } from './header.types-duHbFvO0.js';
4
+
5
+ interface AxiosQueueType {
6
+ resolve: (value?: unknown) => void;
7
+ reject: (reason?: unknown) => void;
8
+ config: InternalAxiosRequestConfig;
9
+ }
10
+ /**
11
+ * @description HttpClientOptions
12
+ */
13
+ interface HttpClientOptions {
14
+ /**
15
+ * @description 센트리 설정
16
+ */
17
+ sentryConfig?: SentryConfig;
18
+ /**
19
+ * @description 센트리 사용여부
20
+ * @default true
21
+ */
22
+ useSentry?: boolean;
23
+ /**
24
+ * @description 에러 발생시 핸들러를 등록하여 에러를 처리할 수 있음.
25
+ * @param responseOrError 응답 또는 에러
26
+ * @returns true : 에러를 처리함, false : 에러를 처리하지 않음
27
+ */
28
+ handler?: ({ response, error, axiosError }: HttpClientHandlerParams) => boolean;
29
+ }
30
+ interface HttpClientHandlerParams {
31
+ response?: AxiosResponse;
32
+ error?: Error;
33
+ axiosError?: AxiosError;
34
+ }
35
+
36
+ declare class HeaderManager {
37
+ private getter;
38
+ private setter;
39
+ constructor(getter: GetterSync, setter: SetterSync);
40
+ /**
41
+ * 커스텀 헤더를 동기적으로 설정합니다.
42
+ */
43
+ setCustomHeaders(): void;
44
+ /**
45
+ * 인증 토큰을 동기적으로 설정합니다.
46
+ */
47
+ setAuthToken(): void;
48
+ /**
49
+ * 모든 헤더를 동기적으로 설정합니다.
50
+ */
51
+ setAllHeaders(): void;
52
+ }
53
+
54
+ /**
55
+ * 전자청약
56
+ * CSR용 http-client 입니다.
57
+ * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.
58
+ */
59
+ declare class HttpClientAxios {
60
+ config: AxiosRequestConfig;
61
+ headerManager: HeaderManager;
62
+ options?: HttpClientOptions;
63
+ /**
64
+ * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
65
+ */
66
+ headers: Record<string, string>;
67
+ /**
68
+ * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
69
+ * 현재 버전에서는 axios를 사용하여 구현됨.
70
+ */
71
+ api: AxiosInstance;
72
+ sentryLogger: SentryLogController;
73
+ constructor(config?: AxiosRequestConfig, options?: HttpClientOptions);
74
+ sentryLogging(params: PostSentryParams, handlerParams?: HttpClientHandlerParams): string | undefined;
75
+ setHeaders(headers: Record<string, string>): void;
76
+ }
77
+
78
+ export { type AxiosQueueType as A, type HttpClientOptions as H, type HttpClientHandlerParams as a, HttpClientAxios as b };