sales-frontend-api 0.0.26 → 0.0.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/client.cjs CHANGED
@@ -1,6 +1,8 @@
1
1
  'use strict';
2
2
 
3
+ var salesFrontendUtils = require('sales-frontend-utils');
3
4
  var axios = require('axios');
5
+ var zustand = require('zustand');
4
6
 
5
7
  function _interopDefault (e) { return e && e.__esModule ? e : { default: e }; }
6
8
 
@@ -47,6 +49,68 @@ var cookieClient = {
47
49
  cookieClient.setCookie(name, "", { ...options, expires: -1 });
48
50
  }
49
51
  };
52
+ var useDebugStore = zustand.create()((set) => ({
53
+ requests: [],
54
+ responses: [],
55
+ errors: [],
56
+ addRequest: (request) => set((state) => ({ requests: [...state.requests, request] })),
57
+ addResponse: (response) => set((state) => ({ responses: [...state.responses, response] })),
58
+ addError: (error) => set((state) => ({ errors: [...state.errors, error] })),
59
+ clear: () => set({ requests: [], responses: [], errors: [] })
60
+ }));
61
+
62
+ // src/http-client/debug/interceptor-function.ts
63
+ function addRequestLog(config) {
64
+ const env = salesFrontendUtils.getEnvironmentFromHostname(location.hostname);
65
+ if (env !== "prd") {
66
+ const { addRequest } = useDebugStore.getState();
67
+ const startTime = Date.now();
68
+ addRequest({
69
+ url: config.url || "",
70
+ method: config.method || "",
71
+ headers: config.headers,
72
+ params: config.params,
73
+ data: config.data,
74
+ startTime
75
+ });
76
+ }
77
+ }
78
+ function addResponseLog(response) {
79
+ const env = salesFrontendUtils.getEnvironmentFromHostname(location.hostname);
80
+ if (env !== "prd") {
81
+ const { addResponse } = useDebugStore.getState();
82
+ const { config } = response;
83
+ addResponse({
84
+ url: config.url || "",
85
+ method: config.method || "",
86
+ status: response.status,
87
+ statusText: response.statusText,
88
+ headers: response.headers,
89
+ data: response.data
90
+ });
91
+ }
92
+ }
93
+ function addErrorLog(error) {
94
+ const env = salesFrontendUtils.getEnvironmentFromHostname(location.hostname);
95
+ if (env !== "prd") {
96
+ const { addError } = useDebugStore.getState();
97
+ const { config } = error;
98
+ addError({
99
+ url: config?.url || "",
100
+ method: config?.method || "",
101
+ message: error.message,
102
+ config: error.config,
103
+ response: error.response ? {
104
+ url: error.response.config?.url || "",
105
+ method: error.response.config?.method || "",
106
+ status: error.response.status,
107
+ statusText: error.response.statusText,
108
+ headers: error.response.headers,
109
+ data: error.response.data
110
+ } : void 0
111
+ });
112
+ }
113
+ }
50
114
 
51
115
  // src/http-client/header/header.types.ts
52
116
  var customHeaderNames = [
@@ -140,6 +204,7 @@ var HttpClientAxios = class {
140
204
  });
141
205
  this.api.interceptors.request.use(
142
206
  async (config2) => {
207
+ addRequestLog(config2);
143
208
  const authClient = new AuthClient();
144
209
  const accessToken = await authClient.getAT();
145
210
  if (accessToken) {
@@ -175,12 +240,14 @@ var HttpClientAxios = class {
175
240
  );
176
241
  this.api.interceptors.response.use(
177
242
  (response) => {
243
+ addResponseLog(response);
178
244
  if (response.data.isSuccess === false) {
179
245
  return Promise.reject(response);
180
246
  }
181
247
  return response;
182
248
  },
183
249
  async (error) => {
250
+ addErrorLog(error);
184
251
  const originalRequest = error.config;
185
252
  if (error.response?.status === 401) {
186
253
  isRefreshed = false;
@@ -222,7 +289,7 @@ var AuthClient = class {
222
289
  * @returns boolean
223
290
  */
224
291
  isApp() {
225
- return true;
292
+ return salesFrontendUtils.isDspWebview();
226
293
  }
227
294
  /**
228
295
  *
@@ -257,5 +324,6 @@ var AuthClient = class {
257
324
 
258
325
  exports.AuthClient = AuthClient;
259
326
  exports.HttpClientAxios = HttpClientAxios;
327
+ exports.useDebugStore = useDebugStore;
260
328
  //# sourceMappingURL=client.cjs.map
261
329
  //# sourceMappingURL=client.cjs.map
@@ -1 +1 @@
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":["axios","config","error"],"mappings":";;;;;;;;;;;;;AAGO,IAAM,YAAe,GAAA;AAAA,EAC1B,UAAU,IAAsB,EAAA;AAC9B,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAO,OAAA,EAAA;AAAA;AAET,IAAM,MAAA,KAAA,GAAQ,SAAS,MAAO,CAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAExE,IAAA,OAAO,QAAQ,kBAAmB,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAI,GAAA,EAAA;AAAA,GACtD;AAAA,EAEA,SACE,CAAA,IAAA,EACA,KACA,EAAA,OAAA,GAKI,EACE,EAAA;AACN,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAA;AAAA;AAGF,IAAA,IAAI,eAAe,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAI,IAAA,WAAA;AACJ,MAAI,IAAA,OAAO,OAAQ,CAAA,OAAA,KAAY,QAAU,EAAA;AACvC,QAAA,WAAA,uBAAkB,IAAK,EAAA;AACvB,QAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,OACtD,MAAA;AACL,QAAA,WAAA,GAAc,OAAQ,CAAA,OAAA;AAAA;AAExB,MAAgB,YAAA,IAAA,CAAA,UAAA,EAAa,WAAY,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA;AAGxD,IAAgB,YAAA,IAAA,CAAA,OAAA,EAAU,OAAQ,CAAA,IAAA,IAAQ,GAAG,CAAA,CAAA;AAE7C,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAgB,YAAA,IAAA,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA;AAG5C,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAgB,YAAA,IAAA,UAAA;AAAA;AAGlB,IAAA,QAAA,CAAS,MAAS,GAAA,YAAA;AAAA,GACpB;AAAA,EACA,YAAa,CAAA,IAAA,EAAc,OAA8C,GAAA,EAAU,EAAA;AACjF,IAAa,YAAA,CAAA,SAAA,CAAU,MAAM,EAAI,EAAA,EAAE,GAAG,OAAS,EAAA,OAAA,EAAS,IAAI,CAAA;AAAA;AAEhE,CAAA;;;ACpDO,IAAM,iBAAoB,GAAA;AAAA,EAC/B,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,EAAK,GAAA,IAAA;;;ACbX,IAAM,gBAAN,MAAoB;AAAA,EAIzB,WAAA,CAAY,QAAoB,MAAoB,EAAA;AAHpD,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAGN,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAAA;AAChB;AAAA;AAAA;AAAA,EAKA,gBAAyB,GAAA;AACvB,IAAkB,iBAAA,CAAA,OAAA,CAAQ,CAAC,UAAe,KAAA;AACxC,MAAM,MAAA,eAAA,GAAkB,aAAa,UAAU,CAAA,CAAA;AAC/C,MAAM,MAAA,WAAA,GAAc,IAAK,CAAA,MAAA,CAAO,eAAe,CAAA;AAC/C,MAAA,IAAI,WAAa,EAAA;AACf,QAAK,IAAA,CAAA,MAAA,CAAO,iBAAiB,WAAW,CAAA;AAAA;AAC1C,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKA,YAAqB,GAAA;AACnB,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,EAAE,CAAA;AAC5B,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,MAAO,CAAA,eAAA,EAAiB,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAChD;AACF;AAAA;AAAA;AAAA,EAKA,aAAsB,GAAA;AACpB,IAAA,IAAA,CAAK,gBAAiB,EAAA;AACtB,IAAA,IAAA,CAAK,YAAa,EAAA;AAAA;AAEtB,CAAA;;;ACjCA,IAAI,WAAc,GAAA,IAAA;AAElB,IAAM,aAA+B,EAAC;AAQtC,IAAM,cAAA,GAAiB,CAAC,GAAA,EAAa,YAAiC,KAAA;AACpE,EAAI,IAAA,KAAA,GAAQ,YAAa,CAAA,SAAA,CAAU,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAQ,KAAA,GAAA,YAAA;AACR,IAAA,YAAA,CAAa,UAAU,GAAK,EAAA,KAAA,EAAO,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA;AAGlD,EAAO,OAAA,KAAA;AACT,CAAA;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAc3B,WAAA,CAAY,MAA6B,GAAA,EAAI,EAAA;AAb7C,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAKA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAkC,EAAC,CAAA;AAMnC;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AAEE,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAKd,IAAM,MAAA,MAAA,GAAkC,CAAC,GAAQ,KAAA;AAC/C,MAAO,OAAA,YAAA,CAAa,UAAU,GAAG,CAAA;AAAA,KACnC;AACA,IAAM,MAAA,MAAA,GAAkC,CAAC,GAAA,EAAK,KAAU,KAAA;AACtD,MAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,QAAO,MAAA,CAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,KAAA;AAAA;AACxB,KACF;AACA,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAI,aAAc,CAAA,MAAA,EAAQ,MAAM,CAAA;AAMrD,IAAK,IAAA,CAAA,GAAA,GAAMA,uBAAM,MAAO,CAAA;AAAA,MACtB,eAAiB,EAAA,IAAA;AAAA,MACjB,GAAG;AAAA,KACJ,CAAA;AAKD,IAAK,IAAA,CAAA,GAAA,CAAI,aAAa,OAAQ,CAAA,GAAA;AAAA,MAC5B,OAAOC,OAAW,KAAA;AAIhB,QAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA;AAClC,QAAM,MAAA,WAAA,GAAc,MAAM,UAAA,CAAW,KAAM,EAAA;AAC3C,QAAA,IAAI,WAAa,EAAA;AACf,UAAAA,OAAO,CAAA,OAAA,CAAQ,aAAgB,GAAA,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA;AAGtD,QAAA,IAAI,OAAO,MAAW,KAAA,WAAA,IAAe,MAAO,CAAA,QAAA,CAAS,aAAa,WAAa,EAAA;AAC7E,UAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAIvC,UAAAA,QAAO,OAAQ,CAAA,sBAAsB,CAAI,GAAA,cAAA,CAAe,wBAAwB,KAAK,CAAA;AACrF,UAAAA,QAAO,OAAQ,CAAA,oBAAoB,CAAI,GAAA,cAAA,CAAe,sBAAsB,UAAU,CAAA;AACtF,UAAAA,QAAO,OAAQ,CAAA,uBAAuB,CAAI,GAAA,cAAA,CAAe,yBAAyB,UAAU,CAAA;AAC5F,UAAAA,QAAO,OAAQ,CAAA,sBAAsB,CAAI,GAAA,cAAA,CAAe,wBAAwB,OAAO,CAAA;AACvF,UAAAA,QAAO,OAAQ,CAAA,wBAAwB,CAAI,GAAA,cAAA,CAAe,0BAA0B,KAAK,CAAA;AACzF,UAAAA,QAAO,OAAQ,CAAA,qBAAqB,CAAI,GAAA,cAAA,CAAe,uBAAuB,UAAU,CAAA;AACxF,UAAAA,QAAO,OAAQ,CAAA,wBAAwB,CAAI,GAAA,cAAA,CAAe,0BAA0B,KAAK,CAAA;AACzF,UAAAA,QAAO,OAAQ,CAAA,2BAA2B,CAAI,GAAA,cAAA,CAAe,6BAA6B,QAAQ,CAAA;AAClG,UAAAA,QAAO,OAAQ,CAAA,oBAAoB,CAAI,GAAA,cAAA,CAAe,sBAAsB,UAAU,CAAA;AAAA;AAMxF,QAAA,IAAA,CAAK,cAAc,gBAAiB,EAAA;AAKpC,QAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AACjD,QAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACtC,UAAAA,OAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAAA,SAC9B,CAAA;AAOD,QAAA,IAAI,CAAC,WAAa,EAAA;AAChB,UAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,YAAA,UAAA,CAAW,KAAK,EAAE,OAAA,EAAS,MAAQ,EAAA,MAAA,EAAAA,SAAQ,CAAA;AAAA,WAC5C,CAAA,CAAE,IAAK,CAAA,MAAMA,OAAM,CAAA;AAAA;AAGtB,QAAOA,OAAAA,OAAAA;AAAA,OACT;AAAA,MACA,CAAC,KAAU,KAAA;AACT,QAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA;AAC7B,KACF;AAKA,IAAK,IAAA,CAAA,GAAA,CAAI,aAAa,QAAS,CAAA,GAAA;AAAA,MAC7B,CAAC,QAA4B,KAAA;AAC3B,QAAI,IAAA,QAAA,CAAS,IAAK,CAAA,SAAA,KAAc,KAAO,EAAA;AAIrC,UAAO,OAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA;AAGhC,QAAO,OAAA,QAAA;AAAA,OACT;AAAA,MACA,OAAO,KAAsB,KAAA;AAC3B,QAAA,MAAM,kBAAkB,KAAM,CAAA,MAAA;AAK9B,QAAI,IAAA,KAAA,CAAM,QAAU,EAAA,MAAA,KAAW,GAAK,EAAA;AAClC,UAAc,WAAA,GAAA,KAAA;AACd,UAAM,MAAA,MAAA,GAAS,IAAI,UAAW,EAAA;AAC9B,UACG,MAAA,CAAA,YAAA,EACA,CAAA,IAAA,CAAK,MAAM;AAIV,YAAc,WAAA,GAAA,IAAA;AAKd,YAAO,OAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AAC5B,cAAM,MAAA,CAAA,GAAI,WAAW,KAAM,EAAA;AAC3B,cAAA,IAAI,CAAG,EAAA;AAML,gBAAA,IAAA,CAAK,IAAI,CAAE,CAAA,MAAM,EACd,IAAK,CAAA,CAAC,aAAa,CAAE,CAAA,OAAA,CAAQ,QAAQ,CAAC,EACtC,KAAM,CAAA,CAAC,QAAQ,CAAE,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACjC;AACF,WACD,CAAA,CACA,KAAM,CAAA,CAACC,MAAU,KAAA;AAKhB,YAAO,OAAA,OAAA,CAAQ,OAAOA,MAAK,CAAA;AAAA,WAC5B,CAAA;AAEH,UAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,YAAA,IAAI,eAAiB,EAAA;AACnB,cAAA,UAAA,CAAW,KAAK,EAAE,OAAA,EAAS,MAAQ,EAAA,MAAA,EAAQ,iBAAiB,CAAA;AAAA;AAC9D,WACD,CAAA;AAAA,SACI,MAAA;AACL,UAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA;AAC7B;AACF,KACF;AAAA;AACF,EAEA,WAAW,OAAiC,EAAA;AAC1C,IAAA,IAAA,CAAK,OAAU,GAAA;AAAA,MACb,GAAG,IAAK,CAAA,OAAA;AAAA,MACR,GAAG;AAAA,KACL;AAAA;AAEJ;;;ACzMO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,KAAQ,GAAA;AAON,IAAO,OAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAqC,GAAA;AAIzC,IAAA,IAAI,OAAO,MAAW,KAAA,WAAA,IAAe,MAAO,CAAA,QAAA,CAAS,aAAa,WAAa,EAAA;AAC7E,MAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AAEtC,MAAO,OAAA,YAAA,CAAa,UAAU,IAAI,CAAA;AAAA;AAGpC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA;AAKhB,MAAO,OAAA,EAAA;AAAA;AAKT;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAgC,GAAA;AACpC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA;AAKhB,MAAA,OAAO,MAAM,MAAO,CAAA,YAAA,CAAa,IAAI,EAAI,EAAA,cAAA,EAAgB,EAAE,CAAA;AAAA,KACtD,MAAA;AAIL,MAAA,MAAM,UAAa,GAAA,IAAI,eAAgB,CAAA,EAAE,CAAA;AACzC,MAAA,MAAM,GAAM,GAAA,MAAM,UAAW,CAAA,GAAA,CAAI,IAAI,4BAA4B,CAAA;AAEjE,MAAA,OAAO,KAAK,IAAK,CAAA,WAAA;AAAA;AACnB;AAEJ","file":"client.cjs","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 * @param key 쿠키 키\n * @param defaultValue 쿠키 값이 없을 때 사용할 기본값\n * @returns 쿠키 값 또는 기본값\n */\nconst getOrSetCookie = (key: string, defaultValue: string): string => {\n let value = cookieClient.getCookie(key);\n if (!value) {\n value = defaultValue;\n cookieClient.setCookie(key, value, { path: '/' });\n }\n\n return value;\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 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 if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost header setting!');\n /**\n * 주소가 localhost인 경우 테스트용 헤더 삽입\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', 'ScreenId');\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';\nimport { cookieClient } from '../cookie/cookie-client';\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 * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n async getAT(): Promise<string | undefined> {\n /**\n * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost token setting!');\n\n return cookieClient.getCookie('at');\n }\n\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"]}
1
+ {"version":3,"sources":["../src/http-client/cookie/cookie-client.ts","../src/http-client/debug/index.ts","../src/http-client/debug/interceptor-function.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":["create","getEnvironmentFromHostname","axios","config","error","isDspWebview"],"mappings":"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","file":"client.cjs","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 * create zustand store to save axios request and response( success , error )\n */\n\nimport { create } from 'zustand';\n\n// Define the types for the store\nexport interface RequestInfo {\n url: string;\n method: string;\n headers: any;\n params: any;\n data: any;\n startTime: number;\n}\n\nexport interface ResponseInfo {\n url: string;\n method: string;\n status: number;\n statusText: string;\n headers: any;\n data: any;\n}\n\nexport interface ErrorInfo {\n url: string;\n method: string;\n message: string;\n config: any;\n response?: ResponseInfo;\n}\n\nexport interface DebugState {\n requests: RequestInfo[];\n responses: ResponseInfo[];\n errors: ErrorInfo[];\n}\n\nexport interface DebugActions {\n addRequest: (request: RequestInfo) => void;\n addResponse: (response: ResponseInfo) => void;\n addError: (error: ErrorInfo) => void;\n clear: () => void;\n}\n\nexport type DebugStore = DebugState & DebugActions;\n\n// Create the store\nexport const useDebugStore = create<DebugStore>()((set) => ({\n requests: [],\n responses: [],\n errors: [],\n addRequest: (request) => set((state) => ({ requests: [...state.requests, request] })),\n addResponse: (response) => set((state) => ({ responses: [...state.responses, response] })),\n addError: (error) => set((state) => ({ errors: [...state.errors, error] })),\n clear: () => set({ requests: [], responses: [], errors: [] })\n}));\n","import { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { useDebugStore } from '.';\n\n/** debug-tool 에서 사용될 로그 저장 */\nexport function addRequestLog(config: InternalAxiosRequestConfig) {\n const env = getEnvironmentFromHostname(location.hostname);\n\n /**\n * 운영환경이 아닐때만 저장\n */\n if (env !== 'prd') {\n const { addRequest } = useDebugStore.getState();\n const startTime = Date.now();\n\n addRequest({\n url: config.url || '',\n method: config.method || '',\n headers: config.headers,\n params: config.params,\n data: config.data,\n startTime\n });\n }\n}\n\n/** debug-tool 에서 사용될 로그 저장 */\nexport function addResponseLog(response: AxiosResponse) {\n const env = getEnvironmentFromHostname(location.hostname);\n\n /**\n * 운영환경이 아닐때만 저장\n */\n if (env !== 'prd') {\n const { addResponse } = useDebugStore.getState();\n const { config } = response;\n addResponse({\n url: config.url || '',\n method: config.method || '',\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n data: response.data\n });\n }\n}\n\nexport function addErrorLog(error: AxiosError) {\n const env = getEnvironmentFromHostname(location.hostname);\n\n /**\n * 운영환경이 아닐때만 저장\n */\n if (env !== 'prd') {\n const { addError } = useDebugStore.getState();\n const { config } = error;\n addError({\n url: config?.url || '',\n method: config?.method || '',\n message: error.message,\n config: error.config,\n response: error.response\n ? {\n url: error.response.config?.url || '',\n method: error.response.config?.method || '',\n status: error.response.status,\n statusText: error.response.statusText,\n headers: error.response.headers,\n data: error.response.data\n }\n : undefined\n });\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 { addErrorLog, addRequestLog, addResponseLog } from '../debug/interceptor-function';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType } from './types';\nimport type { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\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 = cookieClient.getCookie(key);\n if (!value) {\n value = defaultValue;\n cookieClient.setCookie(key, value, { path: '/' });\n }\n\n return value;\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 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 addRequestLog(config);\n\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 if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost header setting!');\n /**\n * 주소가 localhost인 경우 테스트용 헤더 삽입\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', 'ScreenId');\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 /** 디버깅용 로그 */\n addResponseLog(response);\n\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 /** 디버깅용 로그 */\n addErrorLog(error);\n\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 { isDspWebview } from 'sales-frontend-utils';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\nimport { cookieClient } from '../cookie/cookie-client';\n\nexport class AuthClient {\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n return isDspWebview();\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n async getAT(): Promise<string | undefined> {\n /**\n * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost token setting!');\n\n return cookieClient.getCookie('at');\n }\n\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"]}
package/dist/client.d.cts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { InternalAxiosRequestConfig } from 'axios';
2
2
  export { H as HttpClientAxios } from './http-client-axios-Cz6Oo35g.cjs';
3
+ import * as zustand from 'zustand';
3
4
  import './header.types-duHbFvO0.cjs';
4
5
 
5
6
  declare class AuthClient {
@@ -29,4 +30,44 @@ interface AxiosQueueType {
29
30
  config: InternalAxiosRequestConfig;
30
31
  }
31
32
 
32
- export { AuthClient, type AxiosQueueType };
33
+ /**
34
+ * create zustand store to save axios request and response( success , error )
35
+ */
36
+ interface RequestInfo {
37
+ url: string;
38
+ method: string;
39
+ headers: any;
40
+ params: any;
41
+ data: any;
42
+ startTime: number;
43
+ }
44
+ interface ResponseInfo {
45
+ url: string;
46
+ method: string;
47
+ status: number;
48
+ statusText: string;
49
+ headers: any;
50
+ data: any;
51
+ }
52
+ interface ErrorInfo {
53
+ url: string;
54
+ method: string;
55
+ message: string;
56
+ config: any;
57
+ response?: ResponseInfo;
58
+ }
59
+ interface DebugState {
60
+ requests: RequestInfo[];
61
+ responses: ResponseInfo[];
62
+ errors: ErrorInfo[];
63
+ }
64
+ interface DebugActions {
65
+ addRequest: (request: RequestInfo) => void;
66
+ addResponse: (response: ResponseInfo) => void;
67
+ addError: (error: ErrorInfo) => void;
68
+ clear: () => void;
69
+ }
70
+ type DebugStore = DebugState & DebugActions;
71
+ declare const useDebugStore: zustand.UseBoundStore<zustand.StoreApi<DebugStore>>;
72
+
73
+ export { AuthClient, type AxiosQueueType, type DebugActions, type DebugState, type DebugStore, type ErrorInfo, type RequestInfo, type ResponseInfo, useDebugStore };
package/dist/client.d.ts CHANGED
@@ -1,5 +1,6 @@
1
1
  import { InternalAxiosRequestConfig } from 'axios';
2
2
  export { H as HttpClientAxios } from './http-client-axios-D4Ub9Xlb.js';
3
+ import * as zustand from 'zustand';
3
4
  import './header.types-duHbFvO0.js';
4
5
 
5
6
  declare class AuthClient {
@@ -29,4 +30,44 @@ interface AxiosQueueType {
29
30
  config: InternalAxiosRequestConfig;
30
31
  }
31
32
 
32
- export { AuthClient, type AxiosQueueType };
33
+ /**
34
+ * create zustand store to save axios request and response( success , error )
35
+ */
36
+ interface RequestInfo {
37
+ url: string;
38
+ method: string;
39
+ headers: any;
40
+ params: any;
41
+ data: any;
42
+ startTime: number;
43
+ }
44
+ interface ResponseInfo {
45
+ url: string;
46
+ method: string;
47
+ status: number;
48
+ statusText: string;
49
+ headers: any;
50
+ data: any;
51
+ }
52
+ interface ErrorInfo {
53
+ url: string;
54
+ method: string;
55
+ message: string;
56
+ config: any;
57
+ response?: ResponseInfo;
58
+ }
59
+ interface DebugState {
60
+ requests: RequestInfo[];
61
+ responses: ResponseInfo[];
62
+ errors: ErrorInfo[];
63
+ }
64
+ interface DebugActions {
65
+ addRequest: (request: RequestInfo) => void;
66
+ addResponse: (response: ResponseInfo) => void;
67
+ addError: (error: ErrorInfo) => void;
68
+ clear: () => void;
69
+ }
70
+ type DebugStore = DebugState & DebugActions;
71
+ declare const useDebugStore: zustand.UseBoundStore<zustand.StoreApi<DebugStore>>;
72
+
73
+ export { AuthClient, type AxiosQueueType, type DebugActions, type DebugState, type DebugStore, type ErrorInfo, type RequestInfo, type ResponseInfo, useDebugStore };
package/dist/client.js CHANGED
@@ -1,4 +1,6 @@
1
+ import { isDspWebview, getEnvironmentFromHostname } from 'sales-frontend-utils';
1
2
  import axios from 'axios';
3
+ import { create } from 'zustand';
2
4
 
3
5
  var __defProp = Object.defineProperty;
4
6
  var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
@@ -41,6 +43,68 @@ var cookieClient = {
41
43
  cookieClient.setCookie(name, "", { ...options, expires: -1 });
42
44
  }
43
45
  };
46
+ var useDebugStore = create()((set) => ({
47
+ requests: [],
48
+ responses: [],
49
+ errors: [],
50
+ addRequest: (request) => set((state) => ({ requests: [...state.requests, request] })),
51
+ addResponse: (response) => set((state) => ({ responses: [...state.responses, response] })),
52
+ addError: (error) => set((state) => ({ errors: [...state.errors, error] })),
53
+ clear: () => set({ requests: [], responses: [], errors: [] })
54
+ }));
55
+
56
+ // src/http-client/debug/interceptor-function.ts
57
+ function addRequestLog(config) {
58
+ const env = getEnvironmentFromHostname(location.hostname);
59
+ if (env !== "prd") {
60
+ const { addRequest } = useDebugStore.getState();
61
+ const startTime = Date.now();
62
+ addRequest({
63
+ url: config.url || "",
64
+ method: config.method || "",
65
+ headers: config.headers,
66
+ params: config.params,
67
+ data: config.data,
68
+ startTime
69
+ });
70
+ }
71
+ }
72
+ function addResponseLog(response) {
73
+ const env = getEnvironmentFromHostname(location.hostname);
74
+ if (env !== "prd") {
75
+ const { addResponse } = useDebugStore.getState();
76
+ const { config } = response;
77
+ addResponse({
78
+ url: config.url || "",
79
+ method: config.method || "",
80
+ status: response.status,
81
+ statusText: response.statusText,
82
+ headers: response.headers,
83
+ data: response.data
84
+ });
85
+ }
86
+ }
87
+ function addErrorLog(error) {
88
+ const env = getEnvironmentFromHostname(location.hostname);
89
+ if (env !== "prd") {
90
+ const { addError } = useDebugStore.getState();
91
+ const { config } = error;
92
+ addError({
93
+ url: config?.url || "",
94
+ method: config?.method || "",
95
+ message: error.message,
96
+ config: error.config,
97
+ response: error.response ? {
98
+ url: error.response.config?.url || "",
99
+ method: error.response.config?.method || "",
100
+ status: error.response.status,
101
+ statusText: error.response.statusText,
102
+ headers: error.response.headers,
103
+ data: error.response.data
104
+ } : void 0
105
+ });
106
+ }
107
+ }
44
108
 
45
109
  // src/http-client/header/header.types.ts
46
110
  var customHeaderNames = [
@@ -134,6 +198,7 @@ var HttpClientAxios = class {
134
198
  });
135
199
  this.api.interceptors.request.use(
136
200
  async (config2) => {
201
+ addRequestLog(config2);
137
202
  const authClient = new AuthClient();
138
203
  const accessToken = await authClient.getAT();
139
204
  if (accessToken) {
@@ -169,12 +234,14 @@ var HttpClientAxios = class {
169
234
  );
170
235
  this.api.interceptors.response.use(
171
236
  (response) => {
237
+ addResponseLog(response);
172
238
  if (response.data.isSuccess === false) {
173
239
  return Promise.reject(response);
174
240
  }
175
241
  return response;
176
242
  },
177
243
  async (error) => {
244
+ addErrorLog(error);
178
245
  const originalRequest = error.config;
179
246
  if (error.response?.status === 401) {
180
247
  isRefreshed = false;
@@ -216,7 +283,7 @@ var AuthClient = class {
216
283
  * @returns boolean
217
284
  */
218
285
  isApp() {
219
- return true;
286
+ return isDspWebview();
220
287
  }
221
288
  /**
222
289
  *
@@ -249,6 +316,6 @@ var AuthClient = class {
249
316
  }
250
317
  };
251
318
 
252
- export { AuthClient, HttpClientAxios };
319
+ export { AuthClient, HttpClientAxios, useDebugStore };
253
320
  //# sourceMappingURL=client.js.map
254
321
  //# sourceMappingURL=client.js.map
@@ -1 +1 @@
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":";;;;;;;AAGO,IAAM,YAAe,GAAA;AAAA,EAC1B,UAAU,IAAsB,EAAA;AAC9B,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAO,OAAA,EAAA;AAAA;AAET,IAAM,MAAA,KAAA,GAAQ,SAAS,MAAO,CAAA,KAAA,CAAM,IAAI,MAAO,CAAA,CAAA,OAAA,EAAU,IAAI,CAAA,QAAA,CAAU,CAAC,CAAA;AAExE,IAAA,OAAO,QAAQ,kBAAmB,CAAA,KAAA,CAAM,CAAC,CAAA,IAAK,EAAE,CAAI,GAAA,EAAA;AAAA,GACtD;AAAA,EAEA,SACE,CAAA,IAAA,EACA,KACA,EAAA,OAAA,GAKI,EACE,EAAA;AACN,IAAI,IAAA,OAAO,aAAa,WAAa,EAAA;AACnC,MAAA;AAAA;AAGF,IAAA,IAAI,eAAe,CAAG,EAAA,IAAI,CAAI,CAAA,EAAA,kBAAA,CAAmB,KAAK,CAAC,CAAA,CAAA;AAEvD,IAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,MAAI,IAAA,WAAA;AACJ,MAAI,IAAA,OAAO,OAAQ,CAAA,OAAA,KAAY,QAAU,EAAA;AACvC,QAAA,WAAA,uBAAkB,IAAK,EAAA;AACvB,QAAA,WAAA,CAAY,OAAQ,CAAA,WAAA,CAAY,OAAQ,EAAA,GAAI,QAAQ,OAAO,CAAA;AAAA,OACtD,MAAA;AACL,QAAA,WAAA,GAAc,OAAQ,CAAA,OAAA;AAAA;AAExB,MAAgB,YAAA,IAAA,CAAA,UAAA,EAAa,WAAY,CAAA,WAAA,EAAa,CAAA,CAAA;AAAA;AAGxD,IAAgB,YAAA,IAAA,CAAA,OAAA,EAAU,OAAQ,CAAA,IAAA,IAAQ,GAAG,CAAA,CAAA;AAE7C,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAgB,YAAA,IAAA,CAAA,SAAA,EAAY,QAAQ,MAAM,CAAA,CAAA;AAAA;AAG5C,IAAA,IAAI,QAAQ,MAAQ,EAAA;AAClB,MAAgB,YAAA,IAAA,UAAA;AAAA;AAGlB,IAAA,QAAA,CAAS,MAAS,GAAA,YAAA;AAAA,GACpB;AAAA,EACA,YAAa,CAAA,IAAA,EAAc,OAA8C,GAAA,EAAU,EAAA;AACjF,IAAa,YAAA,CAAA,SAAA,CAAU,MAAM,EAAI,EAAA,EAAE,GAAG,OAAS,EAAA,OAAA,EAAS,IAAI,CAAA;AAAA;AAEhE,CAAA;;;ACpDO,IAAM,iBAAoB,GAAA;AAAA,EAC/B,iBAAA;AAAA,EACA,UAAA;AAAA,EACA,WAAA;AAAA,EACA,cAAA;AAAA,EACA,iBAAA;AAAA,EACA,YAAA;AAAA,EACA,aAAA;AAAA,EACA,YAAA;AAAA,EACA;AACF,CAAA;AAEO,IAAM,EAAK,GAAA,IAAA;;;ACbX,IAAM,gBAAN,MAAoB;AAAA,EAIzB,WAAA,CAAY,QAAoB,MAAoB,EAAA;AAHpD,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACR,IAAQ,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAGN,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAAA;AAChB;AAAA;AAAA;AAAA,EAKA,gBAAyB,GAAA;AACvB,IAAkB,iBAAA,CAAA,OAAA,CAAQ,CAAC,UAAe,KAAA;AACxC,MAAM,MAAA,eAAA,GAAkB,aAAa,UAAU,CAAA,CAAA;AAC/C,MAAM,MAAA,WAAA,GAAc,IAAK,CAAA,MAAA,CAAO,eAAe,CAAA;AAC/C,MAAA,IAAI,WAAa,EAAA;AACf,QAAK,IAAA,CAAA,MAAA,CAAO,iBAAiB,WAAW,CAAA;AAAA;AAC1C,KACD,CAAA;AAAA;AACH;AAAA;AAAA;AAAA,EAKA,YAAqB,GAAA;AACnB,IAAM,MAAA,KAAA,GAAQ,IAAK,CAAA,MAAA,CAAO,EAAE,CAAA;AAC5B,IAAA,IAAI,KAAO,EAAA;AACT,MAAA,IAAA,CAAK,MAAO,CAAA,eAAA,EAAiB,CAAU,OAAA,EAAA,KAAK,CAAE,CAAA,CAAA;AAAA;AAChD;AACF;AAAA;AAAA;AAAA,EAKA,aAAsB,GAAA;AACpB,IAAA,IAAA,CAAK,gBAAiB,EAAA;AACtB,IAAA,IAAA,CAAK,YAAa,EAAA;AAAA;AAEtB,CAAA;;;ACjCA,IAAI,WAAc,GAAA,IAAA;AAElB,IAAM,aAA+B,EAAC;AAQtC,IAAM,cAAA,GAAiB,CAAC,GAAA,EAAa,YAAiC,KAAA;AACpE,EAAI,IAAA,KAAA,GAAQ,YAAa,CAAA,SAAA,CAAU,GAAG,CAAA;AACtC,EAAA,IAAI,CAAC,KAAO,EAAA;AACV,IAAQ,KAAA,GAAA,YAAA;AACR,IAAA,YAAA,CAAa,UAAU,GAAK,EAAA,KAAA,EAAO,EAAE,IAAA,EAAM,KAAK,CAAA;AAAA;AAGlD,EAAO,OAAA,KAAA;AACT,CAAA;AAOO,IAAM,kBAAN,MAAsB;AAAA,EAc3B,WAAA,CAAY,MAA6B,GAAA,EAAI,EAAA;AAb7C,IAAA,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AACA,IAAA,aAAA,CAAA,IAAA,EAAA,eAAA,CAAA;AAKA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,SAAA,EAAkC,EAAC,CAAA;AAMnC;AAAA;AAAA;AAAA;AAAA,IAAA,aAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AAEE,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AAKd,IAAM,MAAA,MAAA,GAAkC,CAAC,GAAQ,KAAA;AAC/C,MAAO,OAAA,YAAA,CAAa,UAAU,GAAG,CAAA;AAAA,KACnC;AACA,IAAM,MAAA,MAAA,GAAkC,CAAC,GAAA,EAAK,KAAU,KAAA;AACtD,MAAA,IAAI,QAAQ,OAAS,EAAA;AACnB,QAAO,MAAA,CAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,KAAA;AAAA;AACxB,KACF;AACA,IAAA,IAAA,CAAK,aAAgB,GAAA,IAAI,aAAc,CAAA,MAAA,EAAQ,MAAM,CAAA;AAMrD,IAAK,IAAA,CAAA,GAAA,GAAM,MAAM,MAAO,CAAA;AAAA,MACtB,eAAiB,EAAA,IAAA;AAAA,MACjB,GAAG;AAAA,KACJ,CAAA;AAKD,IAAK,IAAA,CAAA,GAAA,CAAI,aAAa,OAAQ,CAAA,GAAA;AAAA,MAC5B,OAAOA,OAAW,KAAA;AAIhB,QAAM,MAAA,UAAA,GAAa,IAAI,UAAW,EAAA;AAClC,QAAM,MAAA,WAAA,GAAc,MAAM,UAAA,CAAW,KAAM,EAAA;AAC3C,QAAA,IAAI,WAAa,EAAA;AACf,UAAAA,OAAO,CAAA,OAAA,CAAQ,aAAgB,GAAA,CAAA,OAAA,EAAU,WAAW,CAAA,CAAA;AAAA;AAGtD,QAAA,IAAI,OAAO,MAAW,KAAA,WAAA,IAAe,MAAO,CAAA,QAAA,CAAS,aAAa,WAAa,EAAA;AAC7E,UAAA,OAAA,CAAQ,IAAI,2BAA2B,CAAA;AAIvC,UAAAA,QAAO,OAAQ,CAAA,sBAAsB,CAAI,GAAA,cAAA,CAAe,wBAAwB,KAAK,CAAA;AACrF,UAAAA,QAAO,OAAQ,CAAA,oBAAoB,CAAI,GAAA,cAAA,CAAe,sBAAsB,UAAU,CAAA;AACtF,UAAAA,QAAO,OAAQ,CAAA,uBAAuB,CAAI,GAAA,cAAA,CAAe,yBAAyB,UAAU,CAAA;AAC5F,UAAAA,QAAO,OAAQ,CAAA,sBAAsB,CAAI,GAAA,cAAA,CAAe,wBAAwB,OAAO,CAAA;AACvF,UAAAA,QAAO,OAAQ,CAAA,wBAAwB,CAAI,GAAA,cAAA,CAAe,0BAA0B,KAAK,CAAA;AACzF,UAAAA,QAAO,OAAQ,CAAA,qBAAqB,CAAI,GAAA,cAAA,CAAe,uBAAuB,UAAU,CAAA;AACxF,UAAAA,QAAO,OAAQ,CAAA,wBAAwB,CAAI,GAAA,cAAA,CAAe,0BAA0B,KAAK,CAAA;AACzF,UAAAA,QAAO,OAAQ,CAAA,2BAA2B,CAAI,GAAA,cAAA,CAAe,6BAA6B,QAAQ,CAAA;AAClG,UAAAA,QAAO,OAAQ,CAAA,oBAAoB,CAAI,GAAA,cAAA,CAAe,sBAAsB,UAAU,CAAA;AAAA;AAMxF,QAAA,IAAA,CAAK,cAAc,gBAAiB,EAAA;AAKpC,QAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AACjD,QAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACtC,UAAAA,OAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAAA,SAC9B,CAAA;AAOD,QAAA,IAAI,CAAC,WAAa,EAAA;AAChB,UAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,YAAA,UAAA,CAAW,KAAK,EAAE,OAAA,EAAS,MAAQ,EAAA,MAAA,EAAAA,SAAQ,CAAA;AAAA,WAC5C,CAAA,CAAE,IAAK,CAAA,MAAMA,OAAM,CAAA;AAAA;AAGtB,QAAOA,OAAAA,OAAAA;AAAA,OACT;AAAA,MACA,CAAC,KAAU,KAAA;AACT,QAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA;AAC7B,KACF;AAKA,IAAK,IAAA,CAAA,GAAA,CAAI,aAAa,QAAS,CAAA,GAAA;AAAA,MAC7B,CAAC,QAA4B,KAAA;AAC3B,QAAI,IAAA,QAAA,CAAS,IAAK,CAAA,SAAA,KAAc,KAAO,EAAA;AAIrC,UAAO,OAAA,OAAA,CAAQ,OAAO,QAAQ,CAAA;AAAA;AAGhC,QAAO,OAAA,QAAA;AAAA,OACT;AAAA,MACA,OAAO,KAAsB,KAAA;AAC3B,QAAA,MAAM,kBAAkB,KAAM,CAAA,MAAA;AAK9B,QAAI,IAAA,KAAA,CAAM,QAAU,EAAA,MAAA,KAAW,GAAK,EAAA;AAClC,UAAc,WAAA,GAAA,KAAA;AACd,UAAM,MAAA,MAAA,GAAS,IAAI,UAAW,EAAA;AAC9B,UACG,MAAA,CAAA,YAAA,EACA,CAAA,IAAA,CAAK,MAAM;AAIV,YAAc,WAAA,GAAA,IAAA;AAKd,YAAO,OAAA,UAAA,CAAW,SAAS,CAAG,EAAA;AAC5B,cAAM,MAAA,CAAA,GAAI,WAAW,KAAM,EAAA;AAC3B,cAAA,IAAI,CAAG,EAAA;AAML,gBAAA,IAAA,CAAK,IAAI,CAAE,CAAA,MAAM,EACd,IAAK,CAAA,CAAC,aAAa,CAAE,CAAA,OAAA,CAAQ,QAAQ,CAAC,EACtC,KAAM,CAAA,CAAC,QAAQ,CAAE,CAAA,MAAA,CAAO,GAAG,CAAC,CAAA;AAAA;AACjC;AACF,WACD,CAAA,CACA,KAAM,CAAA,CAACC,MAAU,KAAA;AAKhB,YAAO,OAAA,OAAA,CAAQ,OAAOA,MAAK,CAAA;AAAA,WAC5B,CAAA;AAEH,UAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,YAAA,IAAI,eAAiB,EAAA;AACnB,cAAA,UAAA,CAAW,KAAK,EAAE,OAAA,EAAS,MAAQ,EAAA,MAAA,EAAQ,iBAAiB,CAAA;AAAA;AAC9D,WACD,CAAA;AAAA,SACI,MAAA;AACL,UAAO,OAAA,OAAA,CAAQ,OAAO,KAAK,CAAA;AAAA;AAC7B;AACF,KACF;AAAA;AACF,EAEA,WAAW,OAAiC,EAAA;AAC1C,IAAA,IAAA,CAAK,OAAU,GAAA;AAAA,MACb,GAAG,IAAK,CAAA,OAAA;AAAA,MACR,GAAG;AAAA,KACL;AAAA;AAEJ;;;ACzMO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,KAAQ,GAAA;AAON,IAAO,OAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,MAAM,KAAqC,GAAA;AAIzC,IAAA,IAAI,OAAO,MAAW,KAAA,WAAA,IAAe,MAAO,CAAA,QAAA,CAAS,aAAa,WAAa,EAAA;AAC7E,MAAA,OAAA,CAAQ,IAAI,0BAA0B,CAAA;AAEtC,MAAO,OAAA,YAAA,CAAa,UAAU,IAAI,CAAA;AAAA;AAGpC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA;AAKhB,MAAO,OAAA,EAAA;AAAA;AAKT;AACF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,MAAM,YAAgC,GAAA;AACpC,IAAI,IAAA,IAAA,CAAK,OAAS,EAAA;AAKhB,MAAA,OAAO,MAAM,MAAO,CAAA,YAAA,CAAa,IAAI,EAAI,EAAA,cAAA,EAAgB,EAAE,CAAA;AAAA,KACtD,MAAA;AAIL,MAAA,MAAM,UAAa,GAAA,IAAI,eAAgB,CAAA,EAAE,CAAA;AACzC,MAAA,MAAM,GAAM,GAAA,MAAM,UAAW,CAAA,GAAA,CAAI,IAAI,4BAA4B,CAAA;AAEjE,MAAA,OAAO,KAAK,IAAK,CAAA,WAAA;AAAA;AACnB;AAEJ","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 * @param key 쿠키 키\n * @param defaultValue 쿠키 값이 없을 때 사용할 기본값\n * @returns 쿠키 값 또는 기본값\n */\nconst getOrSetCookie = (key: string, defaultValue: string): string => {\n let value = cookieClient.getCookie(key);\n if (!value) {\n value = defaultValue;\n cookieClient.setCookie(key, value, { path: '/' });\n }\n\n return value;\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 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 if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost header setting!');\n /**\n * 주소가 localhost인 경우 테스트용 헤더 삽입\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', 'ScreenId');\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';\nimport { cookieClient } from '../cookie/cookie-client';\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 * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n async getAT(): Promise<string | undefined> {\n /**\n * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost token setting!');\n\n return cookieClient.getCookie('at');\n }\n\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"]}
1
+ {"version":3,"sources":["../src/http-client/cookie/cookie-client.ts","../src/http-client/debug/index.ts","../src/http-client/debug/interceptor-function.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 * create zustand store to save axios request and response( success , error )\n */\n\nimport { create } from 'zustand';\n\n// Define the types for the store\nexport interface RequestInfo {\n url: string;\n method: string;\n headers: any;\n params: any;\n data: any;\n startTime: number;\n}\n\nexport interface ResponseInfo {\n url: string;\n method: string;\n status: number;\n statusText: string;\n headers: any;\n data: any;\n}\n\nexport interface ErrorInfo {\n url: string;\n method: string;\n message: string;\n config: any;\n response?: ResponseInfo;\n}\n\nexport interface DebugState {\n requests: RequestInfo[];\n responses: ResponseInfo[];\n errors: ErrorInfo[];\n}\n\nexport interface DebugActions {\n addRequest: (request: RequestInfo) => void;\n addResponse: (response: ResponseInfo) => void;\n addError: (error: ErrorInfo) => void;\n clear: () => void;\n}\n\nexport type DebugStore = DebugState & DebugActions;\n\n// Create the store\nexport const useDebugStore = create<DebugStore>()((set) => ({\n requests: [],\n responses: [],\n errors: [],\n addRequest: (request) => set((state) => ({ requests: [...state.requests, request] })),\n addResponse: (response) => set((state) => ({ responses: [...state.responses, response] })),\n addError: (error) => set((state) => ({ errors: [...state.errors, error] })),\n clear: () => set({ requests: [], responses: [], errors: [] })\n}));\n","import { AxiosError, AxiosResponse, InternalAxiosRequestConfig } from 'axios';\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { useDebugStore } from '.';\n\n/** debug-tool 에서 사용될 로그 저장 */\nexport function addRequestLog(config: InternalAxiosRequestConfig) {\n const env = getEnvironmentFromHostname(location.hostname);\n\n /**\n * 운영환경이 아닐때만 저장\n */\n if (env !== 'prd') {\n const { addRequest } = useDebugStore.getState();\n const startTime = Date.now();\n\n addRequest({\n url: config.url || '',\n method: config.method || '',\n headers: config.headers,\n params: config.params,\n data: config.data,\n startTime\n });\n }\n}\n\n/** debug-tool 에서 사용될 로그 저장 */\nexport function addResponseLog(response: AxiosResponse) {\n const env = getEnvironmentFromHostname(location.hostname);\n\n /**\n * 운영환경이 아닐때만 저장\n */\n if (env !== 'prd') {\n const { addResponse } = useDebugStore.getState();\n const { config } = response;\n addResponse({\n url: config.url || '',\n method: config.method || '',\n status: response.status,\n statusText: response.statusText,\n headers: response.headers,\n data: response.data\n });\n }\n}\n\nexport function addErrorLog(error: AxiosError) {\n const env = getEnvironmentFromHostname(location.hostname);\n\n /**\n * 운영환경이 아닐때만 저장\n */\n if (env !== 'prd') {\n const { addError } = useDebugStore.getState();\n const { config } = error;\n addError({\n url: config?.url || '',\n method: config?.method || '',\n message: error.message,\n config: error.config,\n response: error.response\n ? {\n url: error.response.config?.url || '',\n method: error.response.config?.method || '',\n status: error.response.status,\n statusText: error.response.statusText,\n headers: error.response.headers,\n data: error.response.data\n }\n : undefined\n });\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 { addErrorLog, addRequestLog, addResponseLog } from '../debug/interceptor-function';\nimport { HeaderManager } from '../header/header-manager';\n\nimport type { AxiosQueueType } from './types';\nimport type { AxiosError, AxiosResponse, AxiosInstance, AxiosRequestConfig } from 'axios';\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 = cookieClient.getCookie(key);\n if (!value) {\n value = defaultValue;\n cookieClient.setCookie(key, value, { path: '/' });\n }\n\n return value;\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 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 addRequestLog(config);\n\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 if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost header setting!');\n /**\n * 주소가 localhost인 경우 테스트용 헤더 삽입\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', 'ScreenId');\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 /** 디버깅용 로그 */\n addResponseLog(response);\n\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 /** 디버깅용 로그 */\n addErrorLog(error);\n\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 { isDspWebview } from 'sales-frontend-utils';\n\nimport { HttpClientAxios } from '../axios/http-client-axios';\nimport { cookieClient } from '../cookie/cookie-client';\n\nexport class AuthClient {\n /**\n * App인지 확인\n * @returns boolean\n */\n isApp() {\n return isDspWebview();\n }\n\n /**\n *\n * @returns Promise<string | undefined>\n * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n async getAT(): Promise<string | undefined> {\n /**\n * 주소가 localhost인 경우 cookie에서 'AT' 를 읽어온다.\n */\n if (typeof window !== 'undefined' && window.location.hostname === 'localhost') {\n console.log('localhost token setting!');\n\n return cookieClient.getCookie('at');\n }\n\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"]}