sales-frontend-api 0.0.19 → 0.0.21

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.js CHANGED
@@ -4,102 +4,126 @@ var __defProp = Object.defineProperty;
4
4
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
5
5
  var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
6
6
 
7
- // src/http-client/abstract-http-client.ts
8
- var AbstractHttpClient = class {
7
+ // src/http-client/cookie/cookie-client.ts
8
+ var cookieClient = {
9
+ getCookie(name) {
10
+ if (typeof document === "undefined") {
11
+ return "";
12
+ }
13
+ const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));
14
+ return match ? decodeURIComponent(match[2] || "") : "";
15
+ },
16
+ setCookie(name, value, options = {}) {
17
+ if (typeof document === "undefined") {
18
+ return;
19
+ }
20
+ let cookieString = `${name}=${encodeURIComponent(value)}`;
21
+ if (options.expires) {
22
+ let expiresDate;
23
+ if (typeof options.expires === "number") {
24
+ expiresDate = /* @__PURE__ */ new Date();
25
+ expiresDate.setDate(expiresDate.getDate() + options.expires);
26
+ } else {
27
+ expiresDate = options.expires;
28
+ }
29
+ cookieString += `; expires=${expiresDate.toUTCString()}`;
30
+ }
31
+ cookieString += `; path=${options.path || "/"}`;
32
+ if (options.domain) {
33
+ cookieString += `; domain=${options.domain}`;
34
+ }
35
+ if (options.secure) {
36
+ cookieString += "; secure";
37
+ }
38
+ document.cookie = cookieString;
39
+ },
40
+ deleteCookie(name, options = {}) {
41
+ cookieClient.setCookie(name, "", { ...options, expires: -1 });
42
+ }
43
+ };
44
+
45
+ // src/http-client/header/header.types.ts
46
+ var customHeaderNames = [
47
+ "Accept-Language",
48
+ "DeviceId",
49
+ "LoginType",
50
+ "PlatformName",
51
+ "PlatformVersion",
52
+ "AppVersion",
53
+ "DeviceModel",
54
+ "FormFactor",
55
+ "LoginChannel"
56
+ ];
57
+ var AT = "AT";
58
+
59
+ // src/http-client/header/header-manager.ts
60
+ var HeaderManager = class {
61
+ constructor(getter, setter) {
62
+ __publicField(this, "getter");
63
+ __publicField(this, "setter");
64
+ this.getter = getter;
65
+ this.setter = setter;
66
+ }
67
+ /**
68
+ * 커스텀 헤더를 동기적으로 설정합니다.
69
+ */
70
+ setCustomHeaders() {
71
+ customHeaderNames.forEach((headerName) => {
72
+ const customHeaderKey = `X-Channel-${headerName}`;
73
+ const headerValue = this.getter(customHeaderKey);
74
+ if (headerValue) {
75
+ this.setter(customHeaderKey, headerValue);
76
+ }
77
+ });
78
+ }
79
+ /**
80
+ * 인증 토큰을 동기적으로 설정합니다.
81
+ */
82
+ setAuthToken() {
83
+ const token = this.getter(AT);
84
+ if (token) {
85
+ this.setter("Authorization", `Bearer ${token}`);
86
+ }
87
+ }
88
+ /**
89
+ * 모든 헤더를 동기적으로 설정합니다.
90
+ */
91
+ setAllHeaders() {
92
+ this.setCustomHeaders();
93
+ this.setAuthToken();
94
+ }
9
95
  };
10
96
 
11
97
  // src/http-client/axios/http-client-axios.ts
12
- var HttpClientAxios = class extends AbstractHttpClient {
13
- constructor(config) {
14
- super();
15
- /**
16
- * API연동 실패시, 공통 에러 핸들러
17
- * extends된 런타임 동작환경에 맞는 SSR,CSR 방식으로 에러핸들링처리
18
- */
19
- __publicField(this, "errorHandler");
20
- /**
21
- * AxiosRequestConfig 를 확장한 interface
22
- * axios create시 기본설정값 및 기타 필요한 정보들을 추가 가능
23
- */
98
+ var isRefreshed = true;
99
+ var axiosQueue = [];
100
+ var HttpClientAxios = class {
101
+ constructor(config = {}) {
24
102
  __publicField(this, "config");
103
+ __publicField(this, "headerManager");
25
104
  /**
26
105
  * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
27
106
  */
28
- __publicField(this, "headers");
107
+ __publicField(this, "headers", {});
29
108
  /**
30
109
  * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
31
110
  * 현재 버전에서는 axios를 사용하여 구현됨.
32
111
  */
33
112
  __publicField(this, "api");
34
- if (!this.headers) {
35
- this.headers = {};
36
- }
37
113
  this.config = config;
38
- this.errorHandler = null;
114
+ const getter = (key) => {
115
+ return cookieClient.getCookie(key);
116
+ };
117
+ const setter = (key, value) => {
118
+ if (config?.headers) {
119
+ config.headers[key] = value;
120
+ }
121
+ };
122
+ this.headerManager = new HeaderManager(getter, setter);
39
123
  this.api = axios.create({
40
- baseURL: "\uC804\uCCB4\uACF5\uD1B5URL\uC774 \uC788\uC73C\uBA74 \uC14B\uD305",
41
124
  withCredentials: true,
42
125
  ...config
43
126
  });
44
- this.api.interceptors.request.use(async (config2) => {
45
- const headerEntries = Object.entries(this.headers);
46
- headerEntries.forEach(([key, value]) => {
47
- config2.headers.set(key, value);
48
- });
49
- return config2;
50
- });
51
- }
52
- async put(url, data, config) {
53
- try {
54
- const res = await this.api.put(url, data, config);
55
- return res;
56
- } catch (e) {
57
- throw this.errorHandler && this.errorHandler(e);
58
- }
59
- }
60
- async get(url, config) {
61
- try {
62
- const res = await this.api.get(url, config);
63
- return res;
64
- } catch (e) {
65
- throw this.errorHandler && this.errorHandler(e);
66
- }
67
- }
68
- async delete(url, config) {
69
- try {
70
- const res = await this.api.delete(url, config);
71
- return res;
72
- } catch (e) {
73
- throw this.errorHandler && this.errorHandler(e);
74
- }
75
- }
76
- async post(url, data, config) {
77
- try {
78
- const res = await this.api.post(url, data, config);
79
- return res;
80
- } catch (e) {
81
- throw this.errorHandler && this.errorHandler(e);
82
- }
83
- }
84
- setHeader(key, value) {
85
- this.headers[key] = value;
86
- }
87
- };
88
-
89
- // src/http-client/axios/csr-http-client-axios.ts
90
- var isRefreshed = true;
91
- var axiosQueue = [];
92
- var initConfig = {
93
- baseURL: "",
94
- dialog: true
95
- };
96
- var CsrHttpClientAxios = class extends HttpClientAxios {
97
- constructor(config) {
98
- super({
99
- ...initConfig,
100
- ...config
101
- });
102
- __publicField(this, "csrErrorHandler", null);
103
127
  this.api.interceptors.request.use(
104
128
  async (config2) => {
105
129
  const authClient = new AuthClient();
@@ -107,6 +131,11 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
107
131
  if (accessToken) {
108
132
  config2.headers.Authorization = `Bearer ${accessToken}`;
109
133
  }
134
+ this.headerManager.setCustomHeaders();
135
+ const headerEntries = Object.entries(this.headers);
136
+ headerEntries.forEach(([key, value]) => {
137
+ config2.headers.set(key, value);
138
+ });
110
139
  if (!isRefreshed) {
111
140
  return new Promise((resolve, reject) => {
112
141
  axiosQueue.push({ resolve, reject, config: config2 });
@@ -120,6 +149,9 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
120
149
  );
121
150
  this.api.interceptors.response.use(
122
151
  (response) => {
152
+ if (response.data.isSuccess === false) {
153
+ return Promise.reject(response);
154
+ }
123
155
  return response;
124
156
  },
125
157
  async (error) => {
@@ -135,27 +167,25 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
135
167
  this.api(p.config).then((response) => p.resolve(response)).catch((err) => p.reject(err));
136
168
  }
137
169
  }
170
+ }).catch((error2) => {
171
+ return Promise.reject(error2);
138
172
  });
139
173
  return new Promise((resolve, reject) => {
140
- originalRequest && axiosQueue.push({ resolve, reject, config: originalRequest });
174
+ if (originalRequest) {
175
+ axiosQueue.push({ resolve, reject, config: originalRequest });
176
+ }
141
177
  });
142
178
  } else {
143
- throw this.csrErrorHandler?.do(error, this.config);
179
+ return Promise.reject(error);
144
180
  }
145
181
  }
146
182
  );
147
183
  }
148
- setCsrErrorHandler(csrErrorHandler) {
149
- this.csrErrorHandler = csrErrorHandler;
150
- this.errorHandler = csrErrorHandler.errorHandler;
151
- }
152
- /**
153
- * API 연동 실패시, 에러핸들러 셋팅 (특정페이지에서만 동작하는 개별 핸들러)
154
- * @param handler csrErrorHandler
155
- */
156
- setLocalErrorHandler(handler, global = false) {
157
- this.csrErrorHandler?.setLocalHandler(handler);
158
- this.csrErrorHandler?.setGlobalCheck(global);
184
+ setHeaders(headers) {
185
+ this.headers = {
186
+ ...this.headers,
187
+ ...headers
188
+ };
159
189
  }
160
190
  };
161
191
 
@@ -187,15 +217,13 @@ var AuthClient = class {
187
217
  if (this.isApp()) {
188
218
  return await bridge.callToNative("", "", "refreshToken", {});
189
219
  } else {
190
- const csrHttpClient = new CsrHttpClientAxios({
191
- baseURL: ""
192
- });
193
- const res = await csrHttpClient.get("/internal/api/auth/refresh");
220
+ const httpclient = new HttpClientAxios({});
221
+ const res = await httpclient.api.get("/internal/api/auth/refresh");
194
222
  return res?.data.accessToken;
195
223
  }
196
224
  }
197
225
  };
198
226
 
199
- export { AuthClient, CsrHttpClientAxios };
227
+ export { AuthClient, HttpClientAxios };
200
228
  //# sourceMappingURL=client.js.map
201
229
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/http-client/abstract-http-client.ts","../src/http-client/axios/http-client-axios.ts","../src/http-client/axios/csr-http-client-axios.ts","../src/http-client/auth/auth-client.ts"],"names":["config"],"mappings":"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","file":"client.js","sourcesContent":["/**\n * HttpClientFetch, HttpClientAxios 에서 공통\n */\nexport abstract class AbstractHttpClient<configType, InstanceType, errorType> {\n protected abstract config: configType;\n protected abstract headers: Record<string, string>;\n protected abstract api: InstanceType;\n protected abstract errorHandler: null | ((e: errorType) => void);\n\n abstract put<dataType>(url: string, data?: any, config?: configType): Promise<dataType | undefined>;\n abstract get<dataType>(url: string, config?: configType): Promise<dataType | undefined>;\n abstract post<dataType>(url: string, data?: any, config?: configType): Promise<dataType | undefined>;\n abstract delete<dataType>(url: string, config?: configType): Promise<dataType | undefined>;\n abstract setHeader(key: string, value: string): void;\n}\n","import axios, { AxiosRequestConfig, AxiosResponse, type AxiosInstance } from 'axios';\n\nimport { AbstractHttpClient } from '../abstract-http-client';\n\nimport type { customConfig } from './types';\n\nexport class HttpClientAxios<errorType extends Error> extends AbstractHttpClient<\n customConfig,\n AxiosInstance,\n errorType\n> {\n /**\n * API연동 실패시, 공통 에러 핸들러\n * extends된 런타임 동작환경에 맞는 SSR,CSR 방식으로 에러핸들링처리\n */\n protected errorHandler: null | ((e: errorType) => void);\n\n /**\n * AxiosRequestConfig 를 확장한 interface\n * axios create시 기본설정값 및 기타 필요한 정보들을 추가 가능\n */\n protected config: customConfig;\n\n /**\n * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value\n */\n protected headers!: Record<string, string>;\n\n /**\n * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)\n * 현재 버전에서는 axios를 사용하여 구현됨.\n */\n protected api: AxiosInstance;\n constructor(config: customConfig) {\n super();\n if (!this.headers) {\n this.headers = {};\n }\n\n this.config = config;\n this.errorHandler = null;\n\n /**\n * api수행객체 최초 생성,\n * 공통으로 적용할 설정값이 있는경우 셋팅\n * @todo baseURL process.env.BaseURL ?\n */\n this.api = axios.create({\n baseURL: '전체공통URL이 있으면 셋팅',\n withCredentials: true,\n ...config\n });\n\n /**\n * @todo 이 부분도 추후 api스펙에따라 부분 셋팅필요.\n * request 헤더,token처리 interceptor 등록\n */\n this.api.interceptors.request.use(async (config) => {\n /**\n * @todo\n * x-channel-[] 공통헤더 추가\n */\n // this.setHeader('x-channel-adfaf', '');\n // this.setHeader('x-channel-adfaf', '');\n // this.setHeader('x-channel-adfaf', '');\n\n /**\n * this.headers설정된 값을 config headers에 주입\n */\n const headerEntries = Object.entries(this.headers);\n headerEntries.forEach(([key, value]) => {\n config.headers.set(key, value);\n });\n\n return config;\n });\n }\n\n async put<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.put<T, R, D>(url, data, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n async get<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.get<T, R, D>(url, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n async delete<T = any, R = AxiosResponse<T>, D = any>(url: string, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.delete<T, R, D>(url, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n async post<T = any, R = AxiosResponse<T>, D = any>(url: string, data?: D, config?: AxiosRequestConfig<D>) {\n try {\n const res = await this.api.post<T, R, D>(url, data, config);\n\n return res;\n } catch (e: any) {\n throw this.errorHandler && this.errorHandler(e);\n }\n }\n\n setHeader(key: string, value: string) {\n this.headers[key] = value;\n }\n}\n","import { AuthClient } from '../auth/auth-client';\n\nimport { HttpClientAxios } from './http-client-axios';\n\nimport type { ErrorHandler, errorHandler } from './error-handler';\nimport type { CustomError } from '../custom-error';\nimport type { customConfig } from './types';\nimport type { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\n\nlet isRefreshed = true;\nconst axiosQueue: {\n resolve: (value?: unknown) => void;\n reject: (reason?: unknown) => void;\n config: InternalAxiosRequestConfig;\n}[] = [];\n/**\n * @todo 추후 env. baseUrl 또는 getBaseUrl() 등으로 치환\n */\nconst initConfig: customConfig = {\n baseURL: '',\n dialog: true\n};\n\nexport class CsrHttpClientAxios extends HttpClientAxios<CustomError> {\n private csrErrorHandler: ErrorHandler | null = null;\n constructor(config?: customConfig) {\n super({\n ...initConfig,\n ...config\n });\n\n /**\n * 401에러 Queue처리 Request interceptor 등록\n */\n this.api.interceptors.request.use(\n async (config) => {\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const accessToken = await authClient.getAT();\n if (accessToken) {\n config.headers.Authorization = `Bearer ${accessToken}`;\n }\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n */\n if (!isRefreshed) {\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n /**\n * 401에러 Queue처리 Response interceptor 등록\n */\n this.api.interceptors.response.use(\n (response: AxiosResponse) => {\n return response;\n },\n async (error: AxiosError) => {\n const originalRequest = error.config;\n\n // 401 에러가 발생한 경우 처리\n if (error.response?.status === 401) {\n isRefreshed = false;\n const client = new AuthClient();\n client.refreshToken().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 this.api(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n });\n\n return new Promise((resolve, reject) => {\n originalRequest && axiosQueue.push({ resolve, reject, config: originalRequest });\n });\n } else {\n /**\n * api 연동 에러시 처리영역\n */\n throw this.csrErrorHandler?.do(error, this.config);\n }\n }\n );\n }\n\n setCsrErrorHandler(csrErrorHandler: ErrorHandler) {\n this.csrErrorHandler = csrErrorHandler;\n /**\n * csr global errorhandler 주입\n */\n this.errorHandler = csrErrorHandler.errorHandler;\n }\n\n /**\n * API 연동 실패시, 에러핸들러 셋팅 (특정페이지에서만 동작하는 개별 핸들러)\n * @param handler csrErrorHandler\n */\n setLocalErrorHandler(handler: errorHandler, global = false) {\n this.csrErrorHandler?.setLocalHandler(handler);\n this.csrErrorHandler?.setGlobalCheck(global);\n }\n}\n","// import { bridge } from '@/app/responsive/bridge/tmp-bridge';\nimport { CsrHttpClientAxios } from '../axios/csr-http-client-axios';\n\nexport class AuthClient {\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n const {userAgent} = navigator;\n\n /**\n * @todo utils package에서 추후 임포트\n */\n // return isUserAgentMobile(userAgent);\n return true;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // return await bridge.callToNative('', '', 'getAT', {});\n return '';\n } else {\n /**\n * pc인 경우는, middleware.ts 에서 요청헤더에 주입\n */\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n * @returns Promise<string> 액세스토큰\n */\n async refreshToken(): Promise<string> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // @ts-ignore\n return await bridge.callToNative('', '', 'refreshToken', {});\n } else {\n /**\n * @todo : 내부api호출\n */\n const csrHttpClient = new CsrHttpClientAxios({\n baseURL: ''\n });\n const res = await csrHttpClient.get('/internal/api/auth/refresh');\n\n return res?.data.accessToken;\n }\n }\n}\n//\n"]}
1
+ {"version":3,"sources":["../src/http-client/cookie/cookie-client.ts","../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"],"mappings":"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","file":"client.js","sourcesContent":["/**\n * 클라이언트용 쿠키 함수\n */\nexport const cookieClient = {\n getCookie(name: string): string {\n if (typeof document === 'undefined') {\n return '';\n }\n const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));\n\n return match ? decodeURIComponent(match[2] || '') : '';\n },\n\n setCookie(\n name: string,\n value: string,\n options: {\n expires?: number | Date; // number of days\n path?: string;\n domain?: string;\n secure?: boolean;\n } = {}\n ): void {\n if (typeof document === 'undefined') {\n return;\n }\n\n let cookieString = `${name}=${encodeURIComponent(value)}`;\n\n if (options.expires) {\n let expiresDate: Date;\n if (typeof options.expires === 'number') {\n expiresDate = new Date();\n expiresDate.setDate(expiresDate.getDate() + options.expires);\n } else {\n expiresDate = options.expires;\n }\n cookieString += `; expires=${expiresDate.toUTCString()}`;\n }\n\n cookieString += `; path=${options.path || '/'}`;\n\n if (options.domain) {\n cookieString += `; domain=${options.domain}`;\n }\n\n if (options.secure) {\n cookieString += '; secure';\n }\n\n document.cookie = cookieString;\n },\n deleteCookie(name: string, options: { path?: string; domain?: string } = {}): void {\n cookieClient.setCookie(name, '', { ...options, expires: -1 });\n }\n};\n","/**\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';\n\nimport { AuthClient } from '../auth/auth-client';\nimport { cookieClient } from '../cookie/cookie-client';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType } from './types';\nimport type { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\nlet isRefreshed = true;\n\nconst axiosQueue: AxiosQueueType[] = [];\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 cookieClient.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: true,\n ...config\n });\n\n /**\n * 인터셉터 요청 처리\n */\n this.api.interceptors.request.use(\n async (config) => {\n /**\n * AT토큰 주입\n */\n const authClient = new AuthClient();\n const accessToken = await authClient.getAT();\n if (accessToken) {\n config.headers.Authorization = `Bearer ${accessToken}`;\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 config.headers.set(key, value);\n });\n\n /**\n * isRefreshed가 false이면(= 에러발생하여 token재발행중을 의미)\n * 새로운 요청들을 처리하지 않고,큐에 저장\n * 401에러 Queue처리 Request interceptor 등록\n */\n if (!isRefreshed) {\n return new Promise((resolve, reject) => {\n axiosQueue.push({ resolve, reject, config });\n }).then(() => config);\n }\n\n return config;\n },\n (error) => {\n return Promise.reject(error);\n }\n );\n\n /**\n * 인터셉터 응답 처리\n */\n this.api.interceptors.response.use(\n (response: AxiosResponse) => {\n if (response.data.isSuccess === false) {\n /**\n * 200 응답이라도 , isSuccess === false인 경우 에러로 reject\n */\n return Promise.reject(response);\n }\n\n return response;\n },\n async (error: AxiosError) => {\n const originalRequest = error.config;\n\n /**\n * 401에러 Queue처리\n */\n if (error.response?.status === 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 this.api(p.config)\n .then((response) => p.resolve(response))\n .catch((err) => p.reject(err));\n }\n }\n })\n .catch((error) => {\n /**\n * 토큰 재발행중 에러 발생한 경우 처리\n * @todo 로그인페이지 이동(?)\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 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 '@/app/responsive/bridge/tmp-bridge';\n// import { CsrHttpClientAxios } from '../axios/csr-http-client-axios';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\n\nexport class AuthClient {\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n const { userAgent } = navigator;\n\n /**\n * @todo utils package에서 추후 임포트\n */\n // return isUserAgentMobile(userAgent);\n return true;\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n */\n async getAT(): Promise<string | undefined> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // return await bridge.callToNative('', '', 'getAT', {});\n return '';\n } else {\n /**\n * pc인 경우는, middleware.ts 에서 요청헤더에 주입\n */\n }\n }\n\n /**\n * RT를 이용하여 신규 AT/RT발행\n * 기존토큰은 무효화처리\n * 쿠키에 저장.\n * @returns Promise<string> 액세스토큰\n */\n async refreshToken(): Promise<string> {\n if (this.isApp()) {\n /**\n * @todo : 브릿지 함수 호출 스펙에 맞게 수정필요\n */\n // @ts-ignore\n return await bridge.callToNative('', '', 'refreshToken', {});\n } else {\n /**\n * @todo : 내부api호출\n */\n const httpclient = new HttpClientAxios({});\n const res = await httpclient.api.get('/internal/api/auth/refresh');\n\n return res?.data.accessToken;\n }\n }\n}\n//\n"]}
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @see https://loop.cloud.microsoft/p/eyJ3Ijp7InUiOiJodHRwczovL2hhbndoYWxpZmVtMzY1LnNoYXJlcG9pbnQuY29tLz9uYXY9Y3owbE1rWW1aRDFpSVVVd1FXdDJSbGhSV0VWUE1tUkNYMWhUZW5KWVVFdFBSVXByYWs1b1NrSlBjRk4wYm5wNmNsWmpMVUZ5YjI1UlJWOVdSREpUV25aeWVUUTJTV2swUlZrbVpqMHdNVk5OVGtkR1JsTkJXVE0xVVZaQ1ZrRkVRa1ZaVEVoRVNUSTBXRXhVVlZoV0ptTTlKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwicCI6eyJ1IjoiaHR0cHM6Ly9oYW53aGFsaWZlbTM2NS5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYmMyNDQwMTMtZDA1NS00MzVjLWI2NzQtMWZkNzRiM2FkNzNjLyVFQiVBQyVCOCVFQyU4NCU5QyUyMCVFQiU5RCVCQyVFQyU5RCVCNCVFQiVCOCU4QyVFQiU5RiVBQyVFQiVBNiVBQy9Mb29wQXBwRGF0YS8wOS0yLiUyMEJyaWRnZSUyMFNwZWMlMjAxLmxvb3A%2FbmF2PWN6MGxNa1pqYjI1MFpXNTBjM1J2Y21GblpTVXlSa05UVUY5aVl6STBOREF4TXkxa01EVTFMVFF6TldNdFlqWTNOQzB4Wm1RM05HSXpZV1EzTTJNbVpEMWlJVVV3UVd0MlJsaFJXRVZQTW1SQ1gxaFRlbkpZVUV0UFJVcHJhazVvU2tKUGNGTjBibnA2Y2xaakxVRnliMjVSUlY5V1JESlRXblp5ZVRRMlNXazBSVmttWmowd01WTk5Ua2RHUmxGRlYxTlFOelpMUWtsTFdrWkpXVUUzU1ZkWldGTklWa0ZUSm1NOUpUSkdKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwiaSI6eyJpIjoiNTdkZmVhM2QtZDA2Yi00YWRlLWIxZjEtYjE4NDA4MmNlN2VjIn19
3
+ */
4
+ declare const customHeaderNames: string[];
5
+ declare const AT = "AT";
6
+ type GetterSync = (keyName: string) => string;
7
+ type SetterSync = (keyName: string, value: string) => void;
8
+ type GetterAsync = (keyName: string) => Promise<string> | string;
9
+ type SetterAsync = (keyName: string, value: string) => Promise<void> | void;
10
+
11
+ export { AT as A, type GetterSync as G, type SetterSync as S, type GetterAsync as a, type SetterAsync as b, customHeaderNames as c };
@@ -0,0 +1,11 @@
1
+ /**
2
+ * @see https://loop.cloud.microsoft/p/eyJ3Ijp7InUiOiJodHRwczovL2hhbndoYWxpZmVtMzY1LnNoYXJlcG9pbnQuY29tLz9uYXY9Y3owbE1rWW1aRDFpSVVVd1FXdDJSbGhSV0VWUE1tUkNYMWhUZW5KWVVFdFBSVXByYWs1b1NrSlBjRk4wYm5wNmNsWmpMVUZ5YjI1UlJWOVdSREpUV25aeWVUUTJTV2swUlZrbVpqMHdNVk5OVGtkR1JsTkJXVE0xVVZaQ1ZrRkVRa1ZaVEVoRVNUSTBXRXhVVlZoV0ptTTlKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwicCI6eyJ1IjoiaHR0cHM6Ly9oYW53aGFsaWZlbTM2NS5zaGFyZXBvaW50LmNvbS9jb250ZW50c3RvcmFnZS9DU1BfYmMyNDQwMTMtZDA1NS00MzVjLWI2NzQtMWZkNzRiM2FkNzNjLyVFQiVBQyVCOCVFQyU4NCU5QyUyMCVFQiU5RCVCQyVFQyU5RCVCNCVFQiVCOCU4QyVFQiU5RiVBQyVFQiVBNiVBQy9Mb29wQXBwRGF0YS8wOS0yLiUyMEJyaWRnZSUyMFNwZWMlMjAxLmxvb3A%2FbmF2PWN6MGxNa1pqYjI1MFpXNTBjM1J2Y21GblpTVXlSa05UVUY5aVl6STBOREF4TXkxa01EVTFMVFF6TldNdFlqWTNOQzB4Wm1RM05HSXpZV1EzTTJNbVpEMWlJVVV3UVd0MlJsaFJXRVZQTW1SQ1gxaFRlbkpZVUV0UFJVcHJhazVvU2tKUGNGTjBibnA2Y2xaakxVRnliMjVSUlY5V1JESlRXblp5ZVRRMlNXazBSVmttWmowd01WTk5Ua2RHUmxGRlYxTlFOelpMUWtsTFdrWkpXVUUzU1ZkWldGTklWa0ZUSm1NOUpUSkdKbVpzZFdsa1BURSUzRCIsInIiOmZhbHNlfSwiaSI6eyJpIjoiNTdkZmVhM2QtZDA2Yi00YWRlLWIxZjEtYjE4NDA4MmNlN2VjIn19
3
+ */
4
+ declare const customHeaderNames: string[];
5
+ declare const AT = "AT";
6
+ type GetterSync = (keyName: string) => string;
7
+ type SetterSync = (keyName: string, value: string) => void;
8
+ type GetterAsync = (keyName: string) => Promise<string> | string;
9
+ type SetterAsync = (keyName: string, value: string) => Promise<void> | void;
10
+
11
+ export { AT as A, type GetterSync as G, type SetterSync as S, type GetterAsync as a, type SetterAsync as b, customHeaderNames as c };
@@ -0,0 +1,43 @@
1
+ import { G as GetterSync, S as SetterSync } from './header.types-duHbFvO0.cjs';
2
+ import { AxiosRequestConfig, AxiosInstance } from 'axios';
3
+
4
+ declare class HeaderManager {
5
+ private getter;
6
+ private setter;
7
+ constructor(getter: GetterSync, setter: SetterSync);
8
+ /**
9
+ * 커스텀 헤더를 동기적으로 설정합니다.
10
+ */
11
+ setCustomHeaders(): void;
12
+ /**
13
+ * 인증 토큰을 동기적으로 설정합니다.
14
+ */
15
+ setAuthToken(): void;
16
+ /**
17
+ * 모든 헤더를 동기적으로 설정합니다.
18
+ */
19
+ setAllHeaders(): void;
20
+ }
21
+
22
+ /**
23
+ * 전자청약
24
+ * CSR용 http-client 입니다.
25
+ * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.
26
+ */
27
+ declare class HttpClientAxios {
28
+ config: AxiosRequestConfig;
29
+ headerManager: HeaderManager;
30
+ /**
31
+ * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
32
+ */
33
+ headers: Record<string, string>;
34
+ /**
35
+ * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
36
+ * 현재 버전에서는 axios를 사용하여 구현됨.
37
+ */
38
+ api: AxiosInstance;
39
+ constructor(config?: AxiosRequestConfig);
40
+ setHeaders(headers: Record<string, string>): void;
41
+ }
42
+
43
+ export { HttpClientAxios as H };
@@ -0,0 +1,43 @@
1
+ import { G as GetterSync, S as SetterSync } from './header.types-duHbFvO0.js';
2
+ import { AxiosRequestConfig, AxiosInstance } from 'axios';
3
+
4
+ declare class HeaderManager {
5
+ private getter;
6
+ private setter;
7
+ constructor(getter: GetterSync, setter: SetterSync);
8
+ /**
9
+ * 커스텀 헤더를 동기적으로 설정합니다.
10
+ */
11
+ setCustomHeaders(): void;
12
+ /**
13
+ * 인증 토큰을 동기적으로 설정합니다.
14
+ */
15
+ setAuthToken(): void;
16
+ /**
17
+ * 모든 헤더를 동기적으로 설정합니다.
18
+ */
19
+ setAllHeaders(): void;
20
+ }
21
+
22
+ /**
23
+ * 전자청약
24
+ * CSR용 http-client 입니다.
25
+ * cookie , redirect , tokem 처리 방식은 CSR 환경에 맞게 구현됩니다.
26
+ */
27
+ declare class HttpClientAxios {
28
+ config: AxiosRequestConfig;
29
+ headerManager: HeaderManager;
30
+ /**
31
+ * axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
32
+ */
33
+ headers: Record<string, string>;
34
+ /**
35
+ * api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
36
+ * 현재 버전에서는 axios를 사용하여 구현됨.
37
+ */
38
+ api: AxiosInstance;
39
+ constructor(config?: AxiosRequestConfig);
40
+ setHeaders(headers: Record<string, string>): void;
41
+ }
42
+
43
+ export { HttpClientAxios as H };