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 +51 -1
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +4 -9
- package/dist/client.d.ts +4 -9
- package/dist/client.js +51 -1
- package/dist/client.js.map +1 -1
- package/dist/http-client-axios-CsGe23I5.d.ts +78 -0
- package/dist/http-client-axios-CyzrvIED.d.cts +78 -0
- package/dist/method.cjs +51 -1
- package/dist/method.cjs.map +1 -1
- package/dist/method.d.cts +2 -1
- package/dist/method.d.ts +2 -1
- package/dist/method.js +51 -1
- package/dist/method.js.map +1 -1
- package/package.json +5 -4
- package/dist/http-client-axios-BpIbE8ql.d.ts +0 -43
- package/dist/http-client-axios-BpXKjpBu.d.cts +0 -43
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,
|
package/dist/client.cjs.map
CHANGED
|
@@ -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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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
|
-
|
|
2
|
-
|
|
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
|
-
|
|
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,
|
package/dist/client.js.map
CHANGED
|
@@ -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 };
|