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.cjs +125 -97
- package/dist/client.cjs.map +1 -1
- package/dist/client.d.cts +10 -4
- package/dist/client.d.ts +10 -4
- package/dist/client.js +125 -97
- package/dist/client.js.map +1 -1
- package/dist/header.types-duHbFvO0.d.cts +11 -0
- package/dist/header.types-duHbFvO0.d.ts +11 -0
- package/dist/http-client-axios-Cz6Oo35g.d.cts +43 -0
- package/dist/http-client-axios-D4Ub9Xlb.d.ts +43 -0
- package/dist/method.cjs +130 -104
- package/dist/method.cjs.map +1 -1
- package/dist/method.d.cts +13 -11
- package/dist/method.d.ts +13 -11
- package/dist/method.js +130 -104
- package/dist/method.js.map +1 -1
- package/dist/server.cjs +4533 -489
- package/dist/server.cjs.map +1 -1
- package/dist/server.d.cts +121 -73
- package/dist/server.d.ts +121 -73
- package/dist/server.js +4527 -484
- package/dist/server.js.map +1 -1
- package/package.json +11 -31
- package/dist/common.cjs +0 -209
- package/dist/common.cjs.map +0 -1
- package/dist/common.d.cts +0 -34
- package/dist/common.d.ts +0 -34
- package/dist/common.js +0 -200
- package/dist/common.js.map +0 -1
- package/dist/csr-http-client-axios-DleS1Lqf.d.cts +0 -14
- package/dist/csr-http-client-axios-c1CKhjCe.d.ts +0 -14
- package/dist/error-handler-DCenPKx5.d.cts +0 -133
- package/dist/error-handler-DCenPKx5.d.ts +0 -133
package/dist/client.cjs
CHANGED
|
@@ -10,102 +10,126 @@ var __defProp = Object.defineProperty;
|
|
|
10
10
|
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
11
11
|
var __publicField = (obj, key, value) => __defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
12
12
|
|
|
13
|
-
// src/http-client/
|
|
14
|
-
var
|
|
13
|
+
// src/http-client/cookie/cookie-client.ts
|
|
14
|
+
var cookieClient = {
|
|
15
|
+
getCookie(name) {
|
|
16
|
+
if (typeof document === "undefined") {
|
|
17
|
+
return "";
|
|
18
|
+
}
|
|
19
|
+
const match = document.cookie.match(new RegExp(`(^|; *)${name}=([^;]*)`));
|
|
20
|
+
return match ? decodeURIComponent(match[2] || "") : "";
|
|
21
|
+
},
|
|
22
|
+
setCookie(name, value, options = {}) {
|
|
23
|
+
if (typeof document === "undefined") {
|
|
24
|
+
return;
|
|
25
|
+
}
|
|
26
|
+
let cookieString = `${name}=${encodeURIComponent(value)}`;
|
|
27
|
+
if (options.expires) {
|
|
28
|
+
let expiresDate;
|
|
29
|
+
if (typeof options.expires === "number") {
|
|
30
|
+
expiresDate = /* @__PURE__ */ new Date();
|
|
31
|
+
expiresDate.setDate(expiresDate.getDate() + options.expires);
|
|
32
|
+
} else {
|
|
33
|
+
expiresDate = options.expires;
|
|
34
|
+
}
|
|
35
|
+
cookieString += `; expires=${expiresDate.toUTCString()}`;
|
|
36
|
+
}
|
|
37
|
+
cookieString += `; path=${options.path || "/"}`;
|
|
38
|
+
if (options.domain) {
|
|
39
|
+
cookieString += `; domain=${options.domain}`;
|
|
40
|
+
}
|
|
41
|
+
if (options.secure) {
|
|
42
|
+
cookieString += "; secure";
|
|
43
|
+
}
|
|
44
|
+
document.cookie = cookieString;
|
|
45
|
+
},
|
|
46
|
+
deleteCookie(name, options = {}) {
|
|
47
|
+
cookieClient.setCookie(name, "", { ...options, expires: -1 });
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
|
|
51
|
+
// src/http-client/header/header.types.ts
|
|
52
|
+
var customHeaderNames = [
|
|
53
|
+
"Accept-Language",
|
|
54
|
+
"DeviceId",
|
|
55
|
+
"LoginType",
|
|
56
|
+
"PlatformName",
|
|
57
|
+
"PlatformVersion",
|
|
58
|
+
"AppVersion",
|
|
59
|
+
"DeviceModel",
|
|
60
|
+
"FormFactor",
|
|
61
|
+
"LoginChannel"
|
|
62
|
+
];
|
|
63
|
+
var AT = "AT";
|
|
64
|
+
|
|
65
|
+
// src/http-client/header/header-manager.ts
|
|
66
|
+
var HeaderManager = class {
|
|
67
|
+
constructor(getter, setter) {
|
|
68
|
+
__publicField(this, "getter");
|
|
69
|
+
__publicField(this, "setter");
|
|
70
|
+
this.getter = getter;
|
|
71
|
+
this.setter = setter;
|
|
72
|
+
}
|
|
73
|
+
/**
|
|
74
|
+
* 커스텀 헤더를 동기적으로 설정합니다.
|
|
75
|
+
*/
|
|
76
|
+
setCustomHeaders() {
|
|
77
|
+
customHeaderNames.forEach((headerName) => {
|
|
78
|
+
const customHeaderKey = `X-Channel-${headerName}`;
|
|
79
|
+
const headerValue = this.getter(customHeaderKey);
|
|
80
|
+
if (headerValue) {
|
|
81
|
+
this.setter(customHeaderKey, headerValue);
|
|
82
|
+
}
|
|
83
|
+
});
|
|
84
|
+
}
|
|
85
|
+
/**
|
|
86
|
+
* 인증 토큰을 동기적으로 설정합니다.
|
|
87
|
+
*/
|
|
88
|
+
setAuthToken() {
|
|
89
|
+
const token = this.getter(AT);
|
|
90
|
+
if (token) {
|
|
91
|
+
this.setter("Authorization", `Bearer ${token}`);
|
|
92
|
+
}
|
|
93
|
+
}
|
|
94
|
+
/**
|
|
95
|
+
* 모든 헤더를 동기적으로 설정합니다.
|
|
96
|
+
*/
|
|
97
|
+
setAllHeaders() {
|
|
98
|
+
this.setCustomHeaders();
|
|
99
|
+
this.setAuthToken();
|
|
100
|
+
}
|
|
15
101
|
};
|
|
16
102
|
|
|
17
103
|
// src/http-client/axios/http-client-axios.ts
|
|
18
|
-
var
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
* API연동 실패시, 공통 에러 핸들러
|
|
23
|
-
* extends된 런타임 동작환경에 맞는 SSR,CSR 방식으로 에러핸들링처리
|
|
24
|
-
*/
|
|
25
|
-
__publicField(this, "errorHandler");
|
|
26
|
-
/**
|
|
27
|
-
* AxiosRequestConfig 를 확장한 interface
|
|
28
|
-
* axios create시 기본설정값 및 기타 필요한 정보들을 추가 가능
|
|
29
|
-
*/
|
|
104
|
+
var isRefreshed = true;
|
|
105
|
+
var axiosQueue = [];
|
|
106
|
+
var HttpClientAxios = class {
|
|
107
|
+
constructor(config = {}) {
|
|
30
108
|
__publicField(this, "config");
|
|
109
|
+
__publicField(this, "headerManager");
|
|
31
110
|
/**
|
|
32
111
|
* axios의 request interceptor 동작시, 헤더에 주입될 헤더의 key,value
|
|
33
112
|
*/
|
|
34
|
-
__publicField(this, "headers");
|
|
113
|
+
__publicField(this, "headers", {});
|
|
35
114
|
/**
|
|
36
115
|
* api연동을 수행할 실제 객체(axios, fetch 등의 다른 라이브러리로 교체가능한 영역)
|
|
37
116
|
* 현재 버전에서는 axios를 사용하여 구현됨.
|
|
38
117
|
*/
|
|
39
118
|
__publicField(this, "api");
|
|
40
|
-
if (!this.headers) {
|
|
41
|
-
this.headers = {};
|
|
42
|
-
}
|
|
43
119
|
this.config = config;
|
|
44
|
-
|
|
120
|
+
const getter = (key) => {
|
|
121
|
+
return cookieClient.getCookie(key);
|
|
122
|
+
};
|
|
123
|
+
const setter = (key, value) => {
|
|
124
|
+
if (config?.headers) {
|
|
125
|
+
config.headers[key] = value;
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
this.headerManager = new HeaderManager(getter, setter);
|
|
45
129
|
this.api = axios__default.default.create({
|
|
46
|
-
baseURL: "\uC804\uCCB4\uACF5\uD1B5URL\uC774 \uC788\uC73C\uBA74 \uC14B\uD305",
|
|
47
130
|
withCredentials: true,
|
|
48
131
|
...config
|
|
49
132
|
});
|
|
50
|
-
this.api.interceptors.request.use(async (config2) => {
|
|
51
|
-
const headerEntries = Object.entries(this.headers);
|
|
52
|
-
headerEntries.forEach(([key, value]) => {
|
|
53
|
-
config2.headers.set(key, value);
|
|
54
|
-
});
|
|
55
|
-
return config2;
|
|
56
|
-
});
|
|
57
|
-
}
|
|
58
|
-
async put(url, data, config) {
|
|
59
|
-
try {
|
|
60
|
-
const res = await this.api.put(url, data, config);
|
|
61
|
-
return res;
|
|
62
|
-
} catch (e) {
|
|
63
|
-
throw this.errorHandler && this.errorHandler(e);
|
|
64
|
-
}
|
|
65
|
-
}
|
|
66
|
-
async get(url, config) {
|
|
67
|
-
try {
|
|
68
|
-
const res = await this.api.get(url, config);
|
|
69
|
-
return res;
|
|
70
|
-
} catch (e) {
|
|
71
|
-
throw this.errorHandler && this.errorHandler(e);
|
|
72
|
-
}
|
|
73
|
-
}
|
|
74
|
-
async delete(url, config) {
|
|
75
|
-
try {
|
|
76
|
-
const res = await this.api.delete(url, config);
|
|
77
|
-
return res;
|
|
78
|
-
} catch (e) {
|
|
79
|
-
throw this.errorHandler && this.errorHandler(e);
|
|
80
|
-
}
|
|
81
|
-
}
|
|
82
|
-
async post(url, data, config) {
|
|
83
|
-
try {
|
|
84
|
-
const res = await this.api.post(url, data, config);
|
|
85
|
-
return res;
|
|
86
|
-
} catch (e) {
|
|
87
|
-
throw this.errorHandler && this.errorHandler(e);
|
|
88
|
-
}
|
|
89
|
-
}
|
|
90
|
-
setHeader(key, value) {
|
|
91
|
-
this.headers[key] = value;
|
|
92
|
-
}
|
|
93
|
-
};
|
|
94
|
-
|
|
95
|
-
// src/http-client/axios/csr-http-client-axios.ts
|
|
96
|
-
var isRefreshed = true;
|
|
97
|
-
var axiosQueue = [];
|
|
98
|
-
var initConfig = {
|
|
99
|
-
baseURL: "",
|
|
100
|
-
dialog: true
|
|
101
|
-
};
|
|
102
|
-
var CsrHttpClientAxios = class extends HttpClientAxios {
|
|
103
|
-
constructor(config) {
|
|
104
|
-
super({
|
|
105
|
-
...initConfig,
|
|
106
|
-
...config
|
|
107
|
-
});
|
|
108
|
-
__publicField(this, "csrErrorHandler", null);
|
|
109
133
|
this.api.interceptors.request.use(
|
|
110
134
|
async (config2) => {
|
|
111
135
|
const authClient = new AuthClient();
|
|
@@ -113,6 +137,11 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
|
|
|
113
137
|
if (accessToken) {
|
|
114
138
|
config2.headers.Authorization = `Bearer ${accessToken}`;
|
|
115
139
|
}
|
|
140
|
+
this.headerManager.setCustomHeaders();
|
|
141
|
+
const headerEntries = Object.entries(this.headers);
|
|
142
|
+
headerEntries.forEach(([key, value]) => {
|
|
143
|
+
config2.headers.set(key, value);
|
|
144
|
+
});
|
|
116
145
|
if (!isRefreshed) {
|
|
117
146
|
return new Promise((resolve, reject) => {
|
|
118
147
|
axiosQueue.push({ resolve, reject, config: config2 });
|
|
@@ -126,6 +155,9 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
|
|
|
126
155
|
);
|
|
127
156
|
this.api.interceptors.response.use(
|
|
128
157
|
(response) => {
|
|
158
|
+
if (response.data.isSuccess === false) {
|
|
159
|
+
return Promise.reject(response);
|
|
160
|
+
}
|
|
129
161
|
return response;
|
|
130
162
|
},
|
|
131
163
|
async (error) => {
|
|
@@ -141,27 +173,25 @@ var CsrHttpClientAxios = class extends HttpClientAxios {
|
|
|
141
173
|
this.api(p.config).then((response) => p.resolve(response)).catch((err) => p.reject(err));
|
|
142
174
|
}
|
|
143
175
|
}
|
|
176
|
+
}).catch((error2) => {
|
|
177
|
+
return Promise.reject(error2);
|
|
144
178
|
});
|
|
145
179
|
return new Promise((resolve, reject) => {
|
|
146
|
-
|
|
180
|
+
if (originalRequest) {
|
|
181
|
+
axiosQueue.push({ resolve, reject, config: originalRequest });
|
|
182
|
+
}
|
|
147
183
|
});
|
|
148
184
|
} else {
|
|
149
|
-
|
|
185
|
+
return Promise.reject(error);
|
|
150
186
|
}
|
|
151
187
|
}
|
|
152
188
|
);
|
|
153
189
|
}
|
|
154
|
-
|
|
155
|
-
this.
|
|
156
|
-
|
|
157
|
-
|
|
158
|
-
|
|
159
|
-
* API 연동 실패시, 에러핸들러 셋팅 (특정페이지에서만 동작하는 개별 핸들러)
|
|
160
|
-
* @param handler csrErrorHandler
|
|
161
|
-
*/
|
|
162
|
-
setLocalErrorHandler(handler, global = false) {
|
|
163
|
-
this.csrErrorHandler?.setLocalHandler(handler);
|
|
164
|
-
this.csrErrorHandler?.setGlobalCheck(global);
|
|
190
|
+
setHeaders(headers) {
|
|
191
|
+
this.headers = {
|
|
192
|
+
...this.headers,
|
|
193
|
+
...headers
|
|
194
|
+
};
|
|
165
195
|
}
|
|
166
196
|
};
|
|
167
197
|
|
|
@@ -193,16 +223,14 @@ var AuthClient = class {
|
|
|
193
223
|
if (this.isApp()) {
|
|
194
224
|
return await bridge.callToNative("", "", "refreshToken", {});
|
|
195
225
|
} else {
|
|
196
|
-
const
|
|
197
|
-
|
|
198
|
-
});
|
|
199
|
-
const res = await csrHttpClient.get("/internal/api/auth/refresh");
|
|
226
|
+
const httpclient = new HttpClientAxios({});
|
|
227
|
+
const res = await httpclient.api.get("/internal/api/auth/refresh");
|
|
200
228
|
return res?.data.accessToken;
|
|
201
229
|
}
|
|
202
230
|
}
|
|
203
231
|
};
|
|
204
232
|
|
|
205
233
|
exports.AuthClient = AuthClient;
|
|
206
|
-
exports.
|
|
234
|
+
exports.HttpClientAxios = HttpClientAxios;
|
|
207
235
|
//# sourceMappingURL=client.cjs.map
|
|
208
236
|
//# sourceMappingURL=client.cjs.map
|
package/dist/client.cjs.map
CHANGED
|
@@ -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":["axios","config"],"mappings":";;;;;;;;;;;;;AAGO,IAAe,qBAAf,MAAuE;AAW9E,CAAA;;;ACRO,IAAM,eAAA,GAAN,cAAuD,kBAI5D,CAAA;AAAA,EAuBA,YAAY,MAAsB,EAAA;AAChC,IAAM,KAAA,EAAA;AAnBR;AAAA;AAAA;AAAA;AAAA,IAAU,aAAA,CAAA,IAAA,EAAA,cAAA,CAAA;AAMV;AAAA;AAAA;AAAA;AAAA,IAAU,aAAA,CAAA,IAAA,EAAA,QAAA,CAAA;AAKV;AAAA;AAAA;AAAA,IAAU,aAAA,CAAA,IAAA,EAAA,SAAA,CAAA;AAMV;AAAA;AAAA;AAAA;AAAA,IAAU,aAAA,CAAA,IAAA,EAAA,KAAA,CAAA;AAGR,IAAI,IAAA,CAAC,KAAK,OAAS,EAAA;AACjB,MAAA,IAAA,CAAK,UAAU,EAAC;AAAA;AAGlB,IAAA,IAAA,CAAK,MAAS,GAAA,MAAA;AACd,IAAA,IAAA,CAAK,YAAe,GAAA,IAAA;AAOpB,IAAK,IAAA,CAAA,GAAA,GAAMA,uBAAM,MAAO,CAAA;AAAA,MACtB,OAAS,EAAA,mEAAA;AAAA,MACT,eAAiB,EAAA,IAAA;AAAA,MACjB,GAAG;AAAA,KACJ,CAAA;AAMD,IAAA,IAAA,CAAK,GAAI,CAAA,YAAA,CAAa,OAAQ,CAAA,GAAA,CAAI,OAAOC,OAAW,KAAA;AAYlD,MAAA,MAAM,aAAgB,GAAA,MAAA,CAAO,OAAQ,CAAA,IAAA,CAAK,OAAO,CAAA;AACjD,MAAA,aAAA,CAAc,OAAQ,CAAA,CAAC,CAAC,GAAA,EAAK,KAAK,CAAM,KAAA;AACtC,QAAAA,OAAO,CAAA,OAAA,CAAQ,GAAI,CAAA,GAAA,EAAK,KAAK,CAAA;AAAA,OAC9B,CAAA;AAED,MAAOA,OAAAA,OAAAA;AAAA,KACR,CAAA;AAAA;AACH,EAEA,MAAM,GAAA,CAA4C,GAAa,EAAA,IAAA,EAAU,MAAgC,EAAA;AACvG,IAAI,IAAA;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,IAAI,GAAa,CAAA,GAAA,EAAK,MAAM,MAAM,CAAA;AAEzD,MAAO,OAAA,GAAA;AAAA,aACA,CAAQ,EAAA;AACf,MAAA,MAAM,IAAK,CAAA,YAAA,IAAgB,IAAK,CAAA,YAAA,CAAa,CAAC,CAAA;AAAA;AAChD;AACF,EAEA,MAAM,GAA4C,CAAA,GAAA,EAAa,MAAgC,EAAA;AAC7F,IAAI,IAAA;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,GAAI,CAAA,GAAA,CAAa,KAAK,MAAM,CAAA;AAEnD,MAAO,OAAA,GAAA;AAAA,aACA,CAAQ,EAAA;AACf,MAAA,MAAM,IAAK,CAAA,YAAA,IAAgB,IAAK,CAAA,YAAA,CAAa,CAAC,CAAA;AAAA;AAChD;AACF,EAEA,MAAM,MAA+C,CAAA,GAAA,EAAa,MAAgC,EAAA;AAChG,IAAI,IAAA;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,GAAI,CAAA,MAAA,CAAgB,KAAK,MAAM,CAAA;AAEtD,MAAO,OAAA,GAAA;AAAA,aACA,CAAQ,EAAA;AACf,MAAA,MAAM,IAAK,CAAA,YAAA,IAAgB,IAAK,CAAA,YAAA,CAAa,CAAC,CAAA;AAAA;AAChD;AACF,EAEA,MAAM,IAAA,CAA6C,GAAa,EAAA,IAAA,EAAU,MAAgC,EAAA;AACxG,IAAI,IAAA;AACF,MAAA,MAAM,MAAM,MAAM,IAAA,CAAK,IAAI,IAAc,CAAA,GAAA,EAAK,MAAM,MAAM,CAAA;AAE1D,MAAO,OAAA,GAAA;AAAA,aACA,CAAQ,EAAA;AACf,MAAA,MAAM,IAAK,CAAA,YAAA,IAAgB,IAAK,CAAA,YAAA,CAAa,CAAC,CAAA;AAAA;AAChD;AACF,EAEA,SAAA,CAAU,KAAa,KAAe,EAAA;AACpC,IAAK,IAAA,CAAA,OAAA,CAAQ,GAAG,CAAI,GAAA,KAAA;AAAA;AAExB,CAAA;;;AChHA,IAAI,WAAc,GAAA,IAAA;AAClB,IAAM,aAIA,EAAC;AAIP,IAAM,UAA2B,GAAA;AAAA,EAC/B,OAAS,EAAA,EAAA;AAAA,EACT,MAAQ,EAAA;AACV,CAAA;AAEa,IAAA,kBAAA,GAAN,cAAiC,eAA6B,CAAA;AAAA,EAEnE,YAAY,MAAuB,EAAA;AACjC,IAAM,KAAA,CAAA;AAAA,MACJ,GAAG,UAAA;AAAA,MACH,GAAG;AAAA,KACJ,CAAA;AALH,IAAA,aAAA,CAAA,IAAA,EAAQ,iBAAuC,EAAA,IAAA,CAAA;AAU7C,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;AAOtD,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,QAAO,OAAA,QAAA;AAAA,OACT;AAAA,MACA,OAAO,KAAsB,KAAA;AAC3B,QAAA,MAAM,kBAAkB,KAAM,CAAA,MAAA;AAG9B,QAAI,IAAA,KAAA,CAAM,QAAU,EAAA,MAAA,KAAW,GAAK,EAAA;AAClC,UAAc,WAAA,GAAA,KAAA;AACd,UAAM,MAAA,MAAA,GAAS,IAAI,UAAW,EAAA;AAC9B,UAAO,MAAA,CAAA,YAAA,EAAe,CAAA,IAAA,CAAK,MAAM;AAI/B,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;AAED,UAAA,OAAO,IAAI,OAAA,CAAQ,CAAC,OAAA,EAAS,MAAW,KAAA;AACtC,YAAA,eAAA,IAAmB,WAAW,IAAK,CAAA,EAAE,SAAS,MAAQ,EAAA,MAAA,EAAQ,iBAAiB,CAAA;AAAA,WAChF,CAAA;AAAA,SACI,MAAA;AAIL,UAAA,MAAM,IAAK,CAAA,eAAA,EAAiB,EAAG,CAAA,KAAA,EAAO,KAAK,MAAM,CAAA;AAAA;AACnD;AACF,KACF;AAAA;AACF,EAEA,mBAAmB,eAA+B,EAAA;AAChD,IAAA,IAAA,CAAK,eAAkB,GAAA,eAAA;AAIvB,IAAA,IAAA,CAAK,eAAe,eAAgB,CAAA,YAAA;AAAA;AACtC;AAAA;AAAA;AAAA;AAAA,EAMA,oBAAA,CAAqB,OAAuB,EAAA,MAAA,GAAS,KAAO,EAAA;AAC1D,IAAK,IAAA,CAAA,eAAA,EAAiB,gBAAgB,OAAO,CAAA;AAC7C,IAAK,IAAA,CAAA,eAAA,EAAiB,eAAe,MAAM,CAAA;AAAA;AAE/C;;;AC9HO,IAAM,aAAN,MAAiB;AAAA;AAAA;AAAA;AAAA;AAAA,EAKtB,KAAQ,GAAA;AAON,IAAO,OAAA,IAAA;AAAA;AACT;AAAA;AAAA;AAAA;AAAA,EAMA,MAAM,KAAqC,GAAA;AACzC,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,MAAM,MAAA,aAAA,GAAgB,IAAI,kBAAmB,CAAA;AAAA,QAC3C,OAAS,EAAA;AAAA,OACV,CAAA;AACD,MAAA,MAAM,GAAM,GAAA,MAAM,aAAc,CAAA,GAAA,CAAI,4BAA4B,CAAA;AAEhE,MAAA,OAAO,KAAK,IAAK,CAAA,WAAA;AAAA;AACnB;AAEJ","file":"client.cjs","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":["axios","config","error"],"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 * @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"]}
|
package/dist/client.d.cts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import '
|
|
1
|
+
import { InternalAxiosRequestConfig } from 'axios';
|
|
2
|
+
export { H as HttpClientAxios } from './http-client-axios-Cz6Oo35g.cjs';
|
|
3
|
+
import './header.types-duHbFvO0.cjs';
|
|
4
4
|
|
|
5
5
|
declare class AuthClient {
|
|
6
6
|
/**
|
|
@@ -22,4 +22,10 @@ declare class AuthClient {
|
|
|
22
22
|
refreshToken(): Promise<string>;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
interface AxiosQueueType {
|
|
26
|
+
resolve: (value?: unknown) => void;
|
|
27
|
+
reject: (reason?: unknown) => void;
|
|
28
|
+
config: InternalAxiosRequestConfig;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { AuthClient, type AxiosQueueType };
|
package/dist/client.d.ts
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
|
|
2
|
-
|
|
3
|
-
import '
|
|
1
|
+
import { InternalAxiosRequestConfig } from 'axios';
|
|
2
|
+
export { H as HttpClientAxios } from './http-client-axios-D4Ub9Xlb.js';
|
|
3
|
+
import './header.types-duHbFvO0.js';
|
|
4
4
|
|
|
5
5
|
declare class AuthClient {
|
|
6
6
|
/**
|
|
@@ -22,4 +22,10 @@ declare class AuthClient {
|
|
|
22
22
|
refreshToken(): Promise<string>;
|
|
23
23
|
}
|
|
24
24
|
|
|
25
|
-
|
|
25
|
+
interface AxiosQueueType {
|
|
26
|
+
resolve: (value?: unknown) => void;
|
|
27
|
+
reject: (reason?: unknown) => void;
|
|
28
|
+
config: InternalAxiosRequestConfig;
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
export { AuthClient, type AxiosQueueType };
|