sales-frontend-server-side-helper 0.0.8 → 0.0.10
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/api-route/index.cjs +150 -4
- package/dist/api-route/index.cjs.map +1 -1
- package/dist/api-route/index.d.cts +39 -1
- package/dist/api-route/index.d.ts +39 -1
- package/dist/api-route/index.js +149 -4
- package/dist/api-route/index.js.map +1 -1
- package/dist/config/index.cjs +16 -0
- package/dist/config/index.cjs.map +1 -0
- package/dist/config/index.d.cts +5 -0
- package/dist/config/index.d.ts +5 -0
- package/dist/config/index.js +14 -0
- package/dist/config/index.js.map +1 -0
- package/dist/middleware/index.cjs +247 -4
- package/dist/middleware/index.cjs.map +1 -1
- package/dist/middleware/index.d.cts +61 -2
- package/dist/middleware/index.d.ts +61 -2
- package/dist/middleware/index.js +241 -4
- package/dist/middleware/index.js.map +1 -1
- package/dist/server-side-helper.types-Cp3VfyqT.d.cts +52 -0
- package/dist/server-side-helper.types-Cp3VfyqT.d.ts +52 -0
- package/dist/utils/index.cjs +144 -0
- package/dist/utils/index.cjs.map +1 -0
- package/dist/utils/index.d.cts +60 -0
- package/dist/utils/index.d.ts +60 -0
- package/dist/utils/index.js +135 -0
- package/dist/utils/index.js.map +1 -0
- package/package.json +20 -10
- package/dist/api-route/something.cjs +0 -10
- package/dist/api-route/something.cjs.map +0 -1
- package/dist/api-route/something.d.cts +0 -3
- package/dist/api-route/something.d.ts +0 -3
- package/dist/api-route/something.js +0 -8
- package/dist/api-route/something.js.map +0 -1
- package/dist/common/cookie.cjs +0 -11
- package/dist/common/cookie.cjs.map +0 -1
- package/dist/common/cookie.d.cts +0 -9
- package/dist/common/cookie.d.ts +0 -9
- package/dist/common/cookie.js +0 -9
- package/dist/common/cookie.js.map +0 -1
- package/dist/common/index.cjs +0 -11
- package/dist/common/index.cjs.map +0 -1
- package/dist/common/index.d.cts +0 -2
- package/dist/common/index.d.ts +0 -2
- package/dist/common/index.js +0 -9
- package/dist/common/index.js.map +0 -1
- package/dist/middleware/sample.cjs +0 -13
- package/dist/middleware/sample.cjs.map +0 -1
- package/dist/middleware/sample.d.cts +0 -5
- package/dist/middleware/sample.d.ts +0 -5
- package/dist/middleware/sample.js +0 -11
- package/dist/middleware/sample.js.map +0 -1
|
@@ -1,13 +1,256 @@
|
|
|
1
1
|
'use strict';
|
|
2
2
|
|
|
3
3
|
var server = require('next/server');
|
|
4
|
+
var salesFrontendUtils = require('sales-frontend-utils');
|
|
4
5
|
|
|
5
|
-
// src/middleware/
|
|
6
|
-
|
|
7
|
-
|
|
6
|
+
// src/middleware/dsp-middleware.ts
|
|
7
|
+
|
|
8
|
+
// src/utils/parse-utils.ts
|
|
9
|
+
var parseRequestHeaders = (request) => {
|
|
10
|
+
return {
|
|
11
|
+
formFactor: request.headers.get("FormFactor")
|
|
12
|
+
};
|
|
13
|
+
};
|
|
14
|
+
var parseQueryParameters = (request) => {
|
|
15
|
+
const { searchParams } = request.nextUrl;
|
|
16
|
+
return {
|
|
17
|
+
tempToken: searchParams.get("tempToken")
|
|
18
|
+
};
|
|
19
|
+
};
|
|
20
|
+
var parseCookies = (request) => {
|
|
21
|
+
return {
|
|
22
|
+
formFactor: request.cookies.get("formFactor")?.value,
|
|
23
|
+
accessToken: request.cookies.get("accessToken")?.value
|
|
24
|
+
};
|
|
25
|
+
};
|
|
26
|
+
|
|
27
|
+
// src/utils/middleware-utils.ts
|
|
28
|
+
var convertAdaptiveTargetPath = (pathname, formFactor) => {
|
|
29
|
+
switch (formFactor) {
|
|
30
|
+
case "tablet":
|
|
31
|
+
return `/tablet${pathname}`;
|
|
32
|
+
case "phone":
|
|
33
|
+
case "smartphone":
|
|
34
|
+
return `/mobile${pathname}`;
|
|
35
|
+
case "desktop":
|
|
36
|
+
default:
|
|
37
|
+
return `/pc${pathname}`;
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
var getFormFactor = (request) => {
|
|
41
|
+
const userAgent = request.headers.get("user-agent") || "";
|
|
42
|
+
const headerValue = parseRequestHeaders(request).formFactor;
|
|
43
|
+
if (headerValue) {
|
|
44
|
+
return headerValue;
|
|
45
|
+
}
|
|
46
|
+
const cookieValue = parseCookies(request).formFactor;
|
|
47
|
+
if (cookieValue) {
|
|
48
|
+
return cookieValue;
|
|
49
|
+
}
|
|
50
|
+
return salesFrontendUtils.getFormFactorFromUserAgent(userAgent);
|
|
51
|
+
};
|
|
52
|
+
var isResponsivePath = (pathname, responsivePaths = []) => {
|
|
53
|
+
return responsivePaths.some((path) => pathname.startsWith(path));
|
|
54
|
+
};
|
|
55
|
+
var getTokensFromServer = async (request, tempToken) => {
|
|
56
|
+
const { accessToken } = parseCookies(request);
|
|
57
|
+
if (accessToken || !tempToken) {
|
|
58
|
+
return null;
|
|
59
|
+
}
|
|
60
|
+
console.log(`[DSP Middleware] \uC784\uC2DC \uD1A0\uD070 \uCC98\uB9AC:: ${tempToken ? "\uC788\uC74C" : "\uC5C6\uC74C"}`);
|
|
61
|
+
return Promise.resolve({
|
|
62
|
+
isSuccess: true,
|
|
63
|
+
code: "string",
|
|
64
|
+
message: "string",
|
|
65
|
+
data: {
|
|
66
|
+
tokenType: "Bearer",
|
|
67
|
+
accessToken: "accessToken-string1234",
|
|
68
|
+
refreshToken: "refreshToken-string1234",
|
|
69
|
+
expiresIn: 0
|
|
70
|
+
}
|
|
71
|
+
});
|
|
72
|
+
};
|
|
73
|
+
|
|
74
|
+
// src/config/cookie-config.ts
|
|
75
|
+
var COOKIE_DEFAULT_CONFIG = {
|
|
76
|
+
httpOnly: true,
|
|
77
|
+
maxAge: 60 * 60 * 24,
|
|
78
|
+
sameSite: "strict",
|
|
79
|
+
secure: true
|
|
80
|
+
};
|
|
81
|
+
|
|
82
|
+
// src/utils/cookie-utils.ts
|
|
83
|
+
var createResponseWithCookies = (response, request, cookieData) => {
|
|
84
|
+
const { hostname } = new URL(request.url);
|
|
85
|
+
if (cookieData?.tokens?.tokenType) {
|
|
86
|
+
response.cookies.set({
|
|
87
|
+
name: "tokenType",
|
|
88
|
+
value: cookieData.tokens.tokenType,
|
|
89
|
+
...getDefaultCookieConfig(hostname)
|
|
90
|
+
});
|
|
91
|
+
}
|
|
92
|
+
if (cookieData?.tokens?.expiresIn) {
|
|
93
|
+
response.cookies.set({
|
|
94
|
+
name: "expiresIn",
|
|
95
|
+
value: String(cookieData.tokens.expiresIn),
|
|
96
|
+
...getDefaultCookieConfig(hostname)
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
if (cookieData?.tokens?.accessToken) {
|
|
100
|
+
response.cookies.set({
|
|
101
|
+
name: "accessToken",
|
|
102
|
+
value: cookieData.tokens.accessToken,
|
|
103
|
+
...getDefaultCookieConfig(hostname)
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
if (cookieData?.tokens?.refreshToken) {
|
|
107
|
+
response.cookies.set({
|
|
108
|
+
name: "refreshToken",
|
|
109
|
+
value: cookieData.tokens.refreshToken,
|
|
110
|
+
...getDefaultCookieConfig(hostname)
|
|
111
|
+
});
|
|
112
|
+
}
|
|
113
|
+
if (cookieData?.formFactor) {
|
|
114
|
+
response.cookies.set({
|
|
115
|
+
name: "formFactor",
|
|
116
|
+
value: cookieData.formFactor,
|
|
117
|
+
...getDefaultCookieConfig(hostname),
|
|
118
|
+
maxAge: 0
|
|
119
|
+
});
|
|
120
|
+
}
|
|
8
121
|
return response;
|
|
9
122
|
};
|
|
123
|
+
var getDefaultCookieConfig = (hostname) => {
|
|
124
|
+
const environment = salesFrontendUtils.getEnvironmentFromHostname(hostname);
|
|
125
|
+
if (environment === "local" || environment === "dev") {
|
|
126
|
+
return {
|
|
127
|
+
...COOKIE_DEFAULT_CONFIG,
|
|
128
|
+
httpOnly: false,
|
|
129
|
+
secure: false
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
return COOKIE_DEFAULT_CONFIG;
|
|
133
|
+
};
|
|
134
|
+
|
|
135
|
+
// src/middleware/handlers/handleAdaptiveProcessing.ts
|
|
136
|
+
var handleAdaptiveProcessing = (request, config) => {
|
|
137
|
+
const { nextUrl } = request;
|
|
138
|
+
const formFactor = getFormFactor(request);
|
|
139
|
+
const rewrittenUrl = nextUrl.clone();
|
|
140
|
+
rewrittenUrl.pathname = convertAdaptiveTargetPath(nextUrl.pathname, formFactor);
|
|
141
|
+
return createResponseWithCookies(server.NextResponse.rewrite(rewrittenUrl), request, {
|
|
142
|
+
formFactor,
|
|
143
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
var handleApiRequest = (request) => {
|
|
147
|
+
const { pathname } = request.nextUrl;
|
|
148
|
+
if (!pathname.startsWith("/api/")) {
|
|
149
|
+
return null;
|
|
150
|
+
}
|
|
151
|
+
const { accessToken } = parseCookies(request);
|
|
152
|
+
const requestHeaders = new Headers(request.headers);
|
|
153
|
+
if (accessToken) {
|
|
154
|
+
requestHeaders.set("Authorization", `Bearer ${accessToken}`);
|
|
155
|
+
}
|
|
156
|
+
return server.NextResponse.next({
|
|
157
|
+
request: {
|
|
158
|
+
headers: requestHeaders
|
|
159
|
+
}
|
|
160
|
+
});
|
|
161
|
+
};
|
|
162
|
+
var handleDirectUrlAccess = (request, config) => {
|
|
163
|
+
const { pathname } = request.nextUrl;
|
|
164
|
+
const directPaths = ["/tablet/", "/mobile/", "/pc/", "/responsive/"];
|
|
165
|
+
if (directPaths.some((path) => pathname.startsWith(path))) {
|
|
166
|
+
return createResponseWithCookies(server.NextResponse.next(), request, {
|
|
167
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
168
|
+
});
|
|
169
|
+
}
|
|
170
|
+
return null;
|
|
171
|
+
};
|
|
172
|
+
var handleExternalInternalPaths = (request, config) => {
|
|
173
|
+
const { pathname } = request.nextUrl;
|
|
174
|
+
if (pathname.startsWith("/external") || pathname.startsWith("/internal")) {
|
|
175
|
+
return createResponseWithCookies(server.NextResponse.next(), request, {
|
|
176
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
177
|
+
});
|
|
178
|
+
}
|
|
179
|
+
return null;
|
|
180
|
+
};
|
|
181
|
+
var handleResponsivePaths = (request, config) => {
|
|
182
|
+
const { nextUrl } = request;
|
|
183
|
+
const { pathname } = nextUrl;
|
|
184
|
+
if (!isResponsivePath(pathname, config?.responsivePaths)) {
|
|
185
|
+
return null;
|
|
186
|
+
}
|
|
187
|
+
const rewrittenUrl = nextUrl.clone();
|
|
188
|
+
rewrittenUrl.pathname = `/responsive${pathname}`;
|
|
189
|
+
return createResponseWithCookies(server.NextResponse.rewrite(rewrittenUrl), request, {
|
|
190
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
191
|
+
});
|
|
192
|
+
};
|
|
193
|
+
|
|
194
|
+
// src/middleware/dsp-middleware.ts
|
|
195
|
+
var processDspMiddleware = async (request, config) => {
|
|
196
|
+
const { pathname } = request.nextUrl;
|
|
197
|
+
console.log(`[DSP Middleware] \uCC98\uB9AC \uC2DC\uC791:: ${pathname}`);
|
|
198
|
+
let tokens;
|
|
199
|
+
try {
|
|
200
|
+
const tokensResponse = await getTokensFromServer(request, parseQueryParameters(request).tempToken);
|
|
201
|
+
tokens = tokensResponse?.data;
|
|
202
|
+
} catch (error) {
|
|
203
|
+
console.error(`[DSP Middleware] \uD1A0\uD070 \uD68D\uB4DD \uC2E4\uD328:: ${pathname}`, error);
|
|
204
|
+
tokens = null;
|
|
205
|
+
}
|
|
206
|
+
const apiResponse = handleApiRequest(request);
|
|
207
|
+
if (apiResponse) {
|
|
208
|
+
console.log(`[DSP Middleware] API \uC694\uCCAD:: ${pathname}`);
|
|
209
|
+
return apiResponse;
|
|
210
|
+
}
|
|
211
|
+
const externalInternalResponse = handleExternalInternalPaths(request, { cookieData: { tokens } });
|
|
212
|
+
if (externalInternalResponse) {
|
|
213
|
+
console.log(`[DSP Middleware] External/Internal \uACBD\uB85C\uB85C \uCC98\uB9AC:: ${pathname}`);
|
|
214
|
+
return externalInternalResponse;
|
|
215
|
+
}
|
|
216
|
+
const directUrlResponse = handleDirectUrlAccess(request, { cookieData: { tokens } });
|
|
217
|
+
if (directUrlResponse) {
|
|
218
|
+
console.log(`[DSP Middleware] \uC9C1\uC811 URL \uC811\uADFC\uC73C\uB85C \uCC98\uB9AC:: ${pathname}`);
|
|
219
|
+
return directUrlResponse;
|
|
220
|
+
}
|
|
221
|
+
const responsivePathResponse = handleResponsivePaths(request, {
|
|
222
|
+
cookieData: { tokens },
|
|
223
|
+
responsivePaths: config?.responsivePaths
|
|
224
|
+
});
|
|
225
|
+
if (responsivePathResponse) {
|
|
226
|
+
console.log(`[DSP Middleware] \uBC18\uC751\uD615 \uACBD\uB85C\uB85C \uCC98\uB9AC:: ${pathname}`);
|
|
227
|
+
return responsivePathResponse;
|
|
228
|
+
}
|
|
229
|
+
const adaptiveResponse = handleAdaptiveProcessing(request, { cookieData: { tokens } });
|
|
230
|
+
if (adaptiveResponse) {
|
|
231
|
+
return adaptiveResponse;
|
|
232
|
+
}
|
|
233
|
+
return server.NextResponse.next();
|
|
234
|
+
};
|
|
235
|
+
var createMiddleware = (handlers, config) => {
|
|
236
|
+
return (request) => {
|
|
237
|
+
for (const handler of handlers) {
|
|
238
|
+
const result = handler(request, config);
|
|
239
|
+
if (result) {
|
|
240
|
+
return result;
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
return server.NextResponse.next();
|
|
244
|
+
};
|
|
245
|
+
};
|
|
246
|
+
//! test
|
|
10
247
|
|
|
11
|
-
exports.
|
|
248
|
+
exports.createMiddleware = createMiddleware;
|
|
249
|
+
exports.handleAdaptiveProcessing = handleAdaptiveProcessing;
|
|
250
|
+
exports.handleApiRequest = handleApiRequest;
|
|
251
|
+
exports.handleDirectUrlAccess = handleDirectUrlAccess;
|
|
252
|
+
exports.handleExternalInternalPaths = handleExternalInternalPaths;
|
|
253
|
+
exports.handleResponsivePaths = handleResponsivePaths;
|
|
254
|
+
exports.processDspMiddleware = processDspMiddleware;
|
|
12
255
|
//# sourceMappingURL=index.cjs.map
|
|
13
256
|
//# sourceMappingURL=index.cjs.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/middleware/sample.ts"],"names":["NextResponse"],"mappings":";;;;;AAEO,IAAM,WAAW,MAAM;AAC5B,EAAM,MAAA,QAAA,GAAWA,oBAAa,IAAK,EAAA;AAEnC,EAAO,OAAA,QAAA;AACT","file":"index.cjs","sourcesContent":["import { NextResponse } from 'next/server';\n\nexport const doSample = () => {\n const response = NextResponse.next();\n\n return response;\n};\n"]}
|
|
1
|
+
{"version":3,"sources":["../../src/utils/parse-utils.ts","../../src/utils/middleware-utils.ts","../../src/config/cookie-config.ts","../../src/utils/cookie-utils.ts","../../src/middleware/handlers/handleAdaptiveProcessing.ts","../../src/middleware/handlers/handleApiRequest.ts","../../src/middleware/handlers/handleDirectUrlAccess.ts","../../src/middleware/handlers/handleExternalInternalPaths.ts","../../src/middleware/handlers/handleResponsivePaths.ts","../../src/middleware/dsp-middleware.ts","../../src/middleware/handlers/createMiddleware.ts"],"names":["getFormFactorFromUserAgent","getEnvironmentFromHostname","NextResponse"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NextRequest } from 'next/server';\n\n/**\n * 요청 헤더에 값 파싱\n * @param request\n * @returns\n */\nexport const parseRequestHeaders = (request: NextRequest) => {\n return {\n formFactor: request.headers.get('FormFactor')\n };\n};\n\n/**\n * 쿼리 스트링 값 파싱\n * @param request\n * @returns\n */\nexport const parseQueryParameters = (request: NextRequest) => {\n const { searchParams } = request.nextUrl;\n\n return {\n tempToken: searchParams.get('tempToken')\n };\n};\n\n/**\n * 요청 쿠키에 값 파싱\n * @param request\n * @returns\n */\nexport const parseCookies = (request: NextRequest) => {\n return {\n formFactor: request.cookies.get('formFactor')?.value,\n accessToken: request.cookies.get('accessToken')?.value\n };\n};\n","import { NextRequest } from 'next/server';\n\nimport { getFormFactorFromUserAgent } from 'sales-frontend-utils';\n\nimport { DspResponseDspTokenResponseDto } from '../server-side-helper.types';\n\nimport { parseCookies, parseRequestHeaders } from './parse-utils';\n\n/**\n * FormFactor에 따른 적응형 경로 변환\n * @param pathname\n * @param formFactor\n * @returns\n */\nexport const convertAdaptiveTargetPath = (pathname: string, formFactor: string) => {\n switch (formFactor) {\n case 'tablet':\n return `/tablet${pathname}`;\n case 'phone':\n case 'smartphone':\n return `/mobile${pathname}`;\n case 'desktop':\n default:\n return `/pc${pathname}`;\n }\n};\n\n/**\n * FormFactor 구하기\n * @param request\n * @returns\n */\nexport const getFormFactor = (request: NextRequest) => {\n const userAgent = request.headers.get('user-agent') || '';\n\n // 1순위: Custom Header\n const headerValue = parseRequestHeaders(request).formFactor;\n if (headerValue) {\n return headerValue;\n }\n\n // 2순위: Cookie\n const cookieValue = parseCookies(request).formFactor;\n if (cookieValue) {\n return cookieValue;\n }\n\n // 3순위: User-Agent 판단\n return getFormFactorFromUserAgent(userAgent);\n};\n\n/**\n * 반응형 전용 pathname 판단\n * @param pathname\n * @param responsivePaths\n * @returns\n */\nexport const isResponsivePath = (pathname: string, responsivePaths: string[] = []): boolean => {\n return responsivePaths.some((path) => pathname.startsWith(path));\n};\n\n////////////\n//! test\n////////////\nexport const getTokensFromServer = async (\n request: NextRequest,\n tempToken: string | null\n): Promise<DspResponseDspTokenResponseDto | null> => {\n const { accessToken } = parseCookies(request);\n\n if (accessToken || !tempToken) {\n return null;\n }\n\n console.log(`[DSP Middleware] 임시 토큰 처리:: ${tempToken ? '있음' : '없음'}`);\n\n return Promise.resolve({\n isSuccess: true,\n code: 'string',\n message: 'string',\n data: {\n tokenType: 'Bearer',\n accessToken: 'accessToken-string1234',\n refreshToken: 'refreshToken-string1234',\n expiresIn: 0\n }\n });\n};\n","export const COOKIE_DEFAULT_CONFIG = {\n httpOnly: true,\n maxAge: 60 * 60 * 24,\n sameSite: 'strict' as const,\n secure: true\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { getEnvironmentFromHostname } from 'sales-frontend-utils';\n\nimport { COOKIE_DEFAULT_CONFIG } from '../config/cookie-config';\nimport { CookieData } from '../server-side-helper.types';\n\n/**\n * 쿠키 생성\n * @param response\n * @param cookieData\n * @returns\n */\nexport const createResponseWithCookies = (\n response: NextResponse,\n request: NextRequest,\n cookieData?: CookieData\n): NextResponse => {\n const { hostname } = new URL(request.url);\n\n // 토큰타입\n if (cookieData?.tokens?.tokenType) {\n response.cookies.set({\n name: 'tokenType',\n value: cookieData.tokens.tokenType,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // expiresIn\n if (cookieData?.tokens?.expiresIn) {\n response.cookies.set({\n name: 'expiresIn',\n value: String(cookieData.tokens.expiresIn),\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 액세스 토큰 쿠키\n if (cookieData?.tokens?.accessToken) {\n response.cookies.set({\n name: 'accessToken',\n value: cookieData.tokens.accessToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // 리프레시 토큰 쿠키\n if (cookieData?.tokens?.refreshToken) {\n response.cookies.set({\n name: 'refreshToken',\n value: cookieData.tokens.refreshToken,\n ...getDefaultCookieConfig(hostname)\n });\n }\n\n // FormFactor 쿠키\n if (cookieData?.formFactor) {\n response.cookies.set({\n name: 'formFactor',\n value: cookieData.formFactor,\n ...getDefaultCookieConfig(hostname),\n maxAge: 0\n });\n }\n\n return response;\n};\n\n/**\n * 환경에 따른 기본 쿠키 설정값 반환\n * @param hostname\n * @returns\n */\nconst getDefaultCookieConfig = (hostname: string) => {\n const environment = getEnvironmentFromHostname(hostname);\n\n if (environment === 'local' || environment === 'dev') {\n return {\n ...COOKIE_DEFAULT_CONFIG,\n httpOnly: false,\n secure: false\n };\n }\n\n return COOKIE_DEFAULT_CONFIG;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\nimport { getFormFactor, convertAdaptiveTargetPath } from '../../utils/middleware-utils';\n\n/**\n * 적응형 경로 처리(rewrite 처리)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleAdaptiveProcessing: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { nextUrl } = request;\n const formFactor = getFormFactor(request);\n\n const rewrittenUrl = nextUrl.clone();\n rewrittenUrl.pathname = convertAdaptiveTargetPath(nextUrl.pathname, formFactor);\n\n return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {\n formFactor,\n tokens: config?.cookieData?.tokens ?? null\n });\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler } from '../../server-side-helper.types';\nimport { parseCookies } from '../../utils/parse-utils';\n\n/**\n * API 요청 처리\n * Cookie에 AccessToken이 있으면 Authorization 헤더에 셋팅을 담당하는 함수\n * Only api 요청만 처리\n * @param request\n * @returns\n */\nexport const handleApiRequest: MiddlewareHandler = (request: NextRequest) => {\n const { pathname } = request.nextUrl;\n\n if (!pathname.startsWith('/api/')) {\n // 처리하지 않음 (온니 api 요청만 처리)\n return null;\n }\n\n const { accessToken } = parseCookies(request);\n const requestHeaders = new Headers(request.headers);\n\n if (accessToken) {\n requestHeaders.set('Authorization', `Bearer ${accessToken}`);\n }\n\n return NextResponse.next({\n request: {\n headers: requestHeaders\n }\n });\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\n\n/**\n * 직접 URL 접근 처리\n * 직접 URL 입력한 경우 그대로 통과\n * 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleDirectUrlAccess: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { pathname } = request.nextUrl;\n\n const directPaths = ['/tablet/', '/mobile/', '/pc/', '/responsive/'];\n\n if (directPaths.some((path) => pathname.startsWith(path))) {\n return createResponseWithCookies(NextResponse.next(), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n }\n\n return null;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\n\n/**\n * External/Internal 경로 처리\n * 컨텍스트를 벗어난 페이지 처리(아무런 간섭을 받지 않음)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleExternalInternalPaths: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { pathname } = request.nextUrl;\n\n if (pathname.startsWith('/external') || pathname.startsWith('/internal')) {\n return createResponseWithCookies(NextResponse.next(), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n }\n\n return null;\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\nimport { createResponseWithCookies } from '../../utils/cookie-utils';\nimport { isResponsivePath } from '../../utils/middleware-utils';\n\n/**\n * 반응형 경로 처리(rewrite 처리)\n * 단, 쿠키를 넘겨주면 쿠키 생성을 해줌\n * @param request\n * @param config\n * @returns\n */\nexport const handleResponsivePaths: MiddlewareHandler = (request: NextRequest, config?: MiddlewareConfig) => {\n const { nextUrl } = request;\n const { pathname } = nextUrl;\n\n if (!isResponsivePath(pathname, config?.responsivePaths)) {\n return null;\n }\n\n const rewrittenUrl = nextUrl.clone();\n rewrittenUrl.pathname = `/responsive${pathname}`;\n\n return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {\n tokens: config?.cookieData?.tokens ?? null\n });\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareConfig } from '../server-side-helper.types';\nimport { getTokensFromServer } from '../utils/middleware-utils';\nimport { parseQueryParameters } from '../utils/parse-utils';\n\nimport { handleAdaptiveProcessing } from './handlers/handleAdaptiveProcessing';\nimport { handleApiRequest } from './handlers/handleApiRequest';\nimport { handleDirectUrlAccess } from './handlers/handleDirectUrlAccess';\nimport { handleExternalInternalPaths } from './handlers/handleExternalInternalPaths';\nimport { handleResponsivePaths } from './handlers/handleResponsivePaths';\n\nexport const processDspMiddleware = async (request: NextRequest, config?: MiddlewareConfig): Promise<NextResponse> => {\n const { pathname } = request.nextUrl;\n console.log(`[DSP Middleware] 처리 시작:: ${pathname}`);\n\n // 0. 토큰 받기 (임시토큰만 있으면)\n let tokens;\n try {\n const tokensResponse = await getTokensFromServer(request, parseQueryParameters(request).tempToken);\n tokens = tokensResponse?.data;\n } catch (error) {\n // 토큰 없이 계속 진행\n console.error(`[DSP Middleware] 토큰 획득 실패:: ${pathname}`, error);\n tokens = null;\n }\n\n // 1. API 요청 처리\n const apiResponse = handleApiRequest(request);\n if (apiResponse) {\n console.log(`[DSP Middleware] API 요청:: ${pathname}`);\n\n return apiResponse;\n }\n\n // 2. 외부/내부 경로 처리\n const externalInternalResponse = handleExternalInternalPaths(request, { cookieData: { tokens } });\n if (externalInternalResponse) {\n console.log(`[DSP Middleware] External/Internal 경로로 처리:: ${pathname}`);\n\n return externalInternalResponse;\n }\n\n // 3. 직접 적응형 URL 접근 처리\n const directUrlResponse = handleDirectUrlAccess(request, { cookieData: { tokens } });\n if (directUrlResponse) {\n console.log(`[DSP Middleware] 직접 URL 접근으로 처리:: ${pathname}`);\n\n return directUrlResponse;\n }\n\n // 4. 반응형 전용 경로 처리\n const responsivePathResponse = handleResponsivePaths(request, {\n cookieData: { tokens },\n responsivePaths: config?.responsivePaths\n });\n if (responsivePathResponse) {\n console.log(`[DSP Middleware] 반응형 경로로 처리:: ${pathname}`);\n\n return responsivePathResponse;\n }\n\n // 5. 적응형 경로 처리\n const adaptiveResponse = handleAdaptiveProcessing(request, { cookieData: { tokens } });\n if (adaptiveResponse) {\n return adaptiveResponse;\n }\n\n // 모든 핸들러가 null을 반환하면 기본 처리\n return NextResponse.next();\n};\n","import { NextRequest, NextResponse } from 'next/server';\n\nimport { MiddlewareHandler, MiddlewareConfig } from '../../server-side-helper.types';\n\n/**\n * 미들웨어 조립 함수\n * @param handlers\n * @param config\n * @returns\n */\nexport const createMiddleware = (handlers: MiddlewareHandler[], config?: MiddlewareConfig) => {\n return (request: NextRequest): NextResponse => {\n // 핸들러들을 순서대로 실행\n for (const handler of handlers) {\n const result = handler(request, config);\n if (result) {\n return result; // 첫 번째로 처리된 결과 반환\n }\n }\n\n // 모든 핸들러가 null을 반환하면 기본 처리\n return NextResponse.next();\n };\n};\n"]}
|
|
@@ -1,2 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { M as MiddlewareConfig, a as MiddlewareHandler } from '../server-side-helper.types-Cp3VfyqT.cjs';
|
|
3
|
+
|
|
4
|
+
declare const processDspMiddleware: (request: NextRequest, config?: MiddlewareConfig) => Promise<NextResponse>;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 미들웨어 조립 함수
|
|
8
|
+
* @param handlers
|
|
9
|
+
* @param config
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
declare const createMiddleware: (handlers: MiddlewareHandler[], config?: MiddlewareConfig) => (request: NextRequest) => NextResponse;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 적응형 경로 처리(rewrite 처리)
|
|
16
|
+
* 단, 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
17
|
+
* @param request
|
|
18
|
+
* @param config
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
declare const handleAdaptiveProcessing: MiddlewareHandler;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* API 요청 처리
|
|
25
|
+
* Cookie에 AccessToken이 있으면 Authorization 헤더에 셋팅을 담당하는 함수
|
|
26
|
+
* Only api 요청만 처리
|
|
27
|
+
* @param request
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
30
|
+
declare const handleApiRequest: MiddlewareHandler;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 직접 URL 접근 처리
|
|
34
|
+
* 직접 URL 입력한 경우 그대로 통과
|
|
35
|
+
* 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
36
|
+
* @param request
|
|
37
|
+
* @param config
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
declare const handleDirectUrlAccess: MiddlewareHandler;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* External/Internal 경로 처리
|
|
44
|
+
* 컨텍스트를 벗어난 페이지 처리(아무런 간섭을 받지 않음)
|
|
45
|
+
* 단, 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
46
|
+
* @param request
|
|
47
|
+
* @param config
|
|
48
|
+
* @returns
|
|
49
|
+
*/
|
|
50
|
+
declare const handleExternalInternalPaths: MiddlewareHandler;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 반응형 경로 처리(rewrite 처리)
|
|
54
|
+
* 단, 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
55
|
+
* @param request
|
|
56
|
+
* @param config
|
|
57
|
+
* @returns
|
|
58
|
+
*/
|
|
59
|
+
declare const handleResponsivePaths: MiddlewareHandler;
|
|
60
|
+
|
|
61
|
+
export { createMiddleware, handleAdaptiveProcessing, handleApiRequest, handleDirectUrlAccess, handleExternalInternalPaths, handleResponsivePaths, processDspMiddleware };
|
|
@@ -1,2 +1,61 @@
|
|
|
1
|
-
|
|
2
|
-
import '
|
|
1
|
+
import { NextRequest, NextResponse } from 'next/server';
|
|
2
|
+
import { M as MiddlewareConfig, a as MiddlewareHandler } from '../server-side-helper.types-Cp3VfyqT.js';
|
|
3
|
+
|
|
4
|
+
declare const processDspMiddleware: (request: NextRequest, config?: MiddlewareConfig) => Promise<NextResponse>;
|
|
5
|
+
|
|
6
|
+
/**
|
|
7
|
+
* 미들웨어 조립 함수
|
|
8
|
+
* @param handlers
|
|
9
|
+
* @param config
|
|
10
|
+
* @returns
|
|
11
|
+
*/
|
|
12
|
+
declare const createMiddleware: (handlers: MiddlewareHandler[], config?: MiddlewareConfig) => (request: NextRequest) => NextResponse;
|
|
13
|
+
|
|
14
|
+
/**
|
|
15
|
+
* 적응형 경로 처리(rewrite 처리)
|
|
16
|
+
* 단, 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
17
|
+
* @param request
|
|
18
|
+
* @param config
|
|
19
|
+
* @returns
|
|
20
|
+
*/
|
|
21
|
+
declare const handleAdaptiveProcessing: MiddlewareHandler;
|
|
22
|
+
|
|
23
|
+
/**
|
|
24
|
+
* API 요청 처리
|
|
25
|
+
* Cookie에 AccessToken이 있으면 Authorization 헤더에 셋팅을 담당하는 함수
|
|
26
|
+
* Only api 요청만 처리
|
|
27
|
+
* @param request
|
|
28
|
+
* @returns
|
|
29
|
+
*/
|
|
30
|
+
declare const handleApiRequest: MiddlewareHandler;
|
|
31
|
+
|
|
32
|
+
/**
|
|
33
|
+
* 직접 URL 접근 처리
|
|
34
|
+
* 직접 URL 입력한 경우 그대로 통과
|
|
35
|
+
* 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
36
|
+
* @param request
|
|
37
|
+
* @param config
|
|
38
|
+
* @returns
|
|
39
|
+
*/
|
|
40
|
+
declare const handleDirectUrlAccess: MiddlewareHandler;
|
|
41
|
+
|
|
42
|
+
/**
|
|
43
|
+
* External/Internal 경로 처리
|
|
44
|
+
* 컨텍스트를 벗어난 페이지 처리(아무런 간섭을 받지 않음)
|
|
45
|
+
* 단, 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
46
|
+
* @param request
|
|
47
|
+
* @param config
|
|
48
|
+
* @returns
|
|
49
|
+
*/
|
|
50
|
+
declare const handleExternalInternalPaths: MiddlewareHandler;
|
|
51
|
+
|
|
52
|
+
/**
|
|
53
|
+
* 반응형 경로 처리(rewrite 처리)
|
|
54
|
+
* 단, 쿠키를 넘겨주면 쿠키 생성을 해줌
|
|
55
|
+
* @param request
|
|
56
|
+
* @param config
|
|
57
|
+
* @returns
|
|
58
|
+
*/
|
|
59
|
+
declare const handleResponsivePaths: MiddlewareHandler;
|
|
60
|
+
|
|
61
|
+
export { createMiddleware, handleAdaptiveProcessing, handleApiRequest, handleDirectUrlAccess, handleExternalInternalPaths, handleResponsivePaths, processDspMiddleware };
|
package/dist/middleware/index.js
CHANGED
|
@@ -1,11 +1,248 @@
|
|
|
1
1
|
import { NextResponse } from 'next/server';
|
|
2
|
+
import { getFormFactorFromUserAgent, getEnvironmentFromHostname } from 'sales-frontend-utils';
|
|
2
3
|
|
|
3
|
-
// src/middleware/
|
|
4
|
-
|
|
5
|
-
|
|
4
|
+
// src/middleware/dsp-middleware.ts
|
|
5
|
+
|
|
6
|
+
// src/utils/parse-utils.ts
|
|
7
|
+
var parseRequestHeaders = (request) => {
|
|
8
|
+
return {
|
|
9
|
+
formFactor: request.headers.get("FormFactor")
|
|
10
|
+
};
|
|
11
|
+
};
|
|
12
|
+
var parseQueryParameters = (request) => {
|
|
13
|
+
const { searchParams } = request.nextUrl;
|
|
14
|
+
return {
|
|
15
|
+
tempToken: searchParams.get("tempToken")
|
|
16
|
+
};
|
|
17
|
+
};
|
|
18
|
+
var parseCookies = (request) => {
|
|
19
|
+
return {
|
|
20
|
+
formFactor: request.cookies.get("formFactor")?.value,
|
|
21
|
+
accessToken: request.cookies.get("accessToken")?.value
|
|
22
|
+
};
|
|
23
|
+
};
|
|
24
|
+
|
|
25
|
+
// src/utils/middleware-utils.ts
|
|
26
|
+
var convertAdaptiveTargetPath = (pathname, formFactor) => {
|
|
27
|
+
switch (formFactor) {
|
|
28
|
+
case "tablet":
|
|
29
|
+
return `/tablet${pathname}`;
|
|
30
|
+
case "phone":
|
|
31
|
+
case "smartphone":
|
|
32
|
+
return `/mobile${pathname}`;
|
|
33
|
+
case "desktop":
|
|
34
|
+
default:
|
|
35
|
+
return `/pc${pathname}`;
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
var getFormFactor = (request) => {
|
|
39
|
+
const userAgent = request.headers.get("user-agent") || "";
|
|
40
|
+
const headerValue = parseRequestHeaders(request).formFactor;
|
|
41
|
+
if (headerValue) {
|
|
42
|
+
return headerValue;
|
|
43
|
+
}
|
|
44
|
+
const cookieValue = parseCookies(request).formFactor;
|
|
45
|
+
if (cookieValue) {
|
|
46
|
+
return cookieValue;
|
|
47
|
+
}
|
|
48
|
+
return getFormFactorFromUserAgent(userAgent);
|
|
49
|
+
};
|
|
50
|
+
var isResponsivePath = (pathname, responsivePaths = []) => {
|
|
51
|
+
return responsivePaths.some((path) => pathname.startsWith(path));
|
|
52
|
+
};
|
|
53
|
+
var getTokensFromServer = async (request, tempToken) => {
|
|
54
|
+
const { accessToken } = parseCookies(request);
|
|
55
|
+
if (accessToken || !tempToken) {
|
|
56
|
+
return null;
|
|
57
|
+
}
|
|
58
|
+
console.log(`[DSP Middleware] \uC784\uC2DC \uD1A0\uD070 \uCC98\uB9AC:: ${tempToken ? "\uC788\uC74C" : "\uC5C6\uC74C"}`);
|
|
59
|
+
return Promise.resolve({
|
|
60
|
+
isSuccess: true,
|
|
61
|
+
code: "string",
|
|
62
|
+
message: "string",
|
|
63
|
+
data: {
|
|
64
|
+
tokenType: "Bearer",
|
|
65
|
+
accessToken: "accessToken-string1234",
|
|
66
|
+
refreshToken: "refreshToken-string1234",
|
|
67
|
+
expiresIn: 0
|
|
68
|
+
}
|
|
69
|
+
});
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
// src/config/cookie-config.ts
|
|
73
|
+
var COOKIE_DEFAULT_CONFIG = {
|
|
74
|
+
httpOnly: true,
|
|
75
|
+
maxAge: 60 * 60 * 24,
|
|
76
|
+
sameSite: "strict",
|
|
77
|
+
secure: true
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
// src/utils/cookie-utils.ts
|
|
81
|
+
var createResponseWithCookies = (response, request, cookieData) => {
|
|
82
|
+
const { hostname } = new URL(request.url);
|
|
83
|
+
if (cookieData?.tokens?.tokenType) {
|
|
84
|
+
response.cookies.set({
|
|
85
|
+
name: "tokenType",
|
|
86
|
+
value: cookieData.tokens.tokenType,
|
|
87
|
+
...getDefaultCookieConfig(hostname)
|
|
88
|
+
});
|
|
89
|
+
}
|
|
90
|
+
if (cookieData?.tokens?.expiresIn) {
|
|
91
|
+
response.cookies.set({
|
|
92
|
+
name: "expiresIn",
|
|
93
|
+
value: String(cookieData.tokens.expiresIn),
|
|
94
|
+
...getDefaultCookieConfig(hostname)
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (cookieData?.tokens?.accessToken) {
|
|
98
|
+
response.cookies.set({
|
|
99
|
+
name: "accessToken",
|
|
100
|
+
value: cookieData.tokens.accessToken,
|
|
101
|
+
...getDefaultCookieConfig(hostname)
|
|
102
|
+
});
|
|
103
|
+
}
|
|
104
|
+
if (cookieData?.tokens?.refreshToken) {
|
|
105
|
+
response.cookies.set({
|
|
106
|
+
name: "refreshToken",
|
|
107
|
+
value: cookieData.tokens.refreshToken,
|
|
108
|
+
...getDefaultCookieConfig(hostname)
|
|
109
|
+
});
|
|
110
|
+
}
|
|
111
|
+
if (cookieData?.formFactor) {
|
|
112
|
+
response.cookies.set({
|
|
113
|
+
name: "formFactor",
|
|
114
|
+
value: cookieData.formFactor,
|
|
115
|
+
...getDefaultCookieConfig(hostname),
|
|
116
|
+
maxAge: 0
|
|
117
|
+
});
|
|
118
|
+
}
|
|
6
119
|
return response;
|
|
7
120
|
};
|
|
121
|
+
var getDefaultCookieConfig = (hostname) => {
|
|
122
|
+
const environment = getEnvironmentFromHostname(hostname);
|
|
123
|
+
if (environment === "local" || environment === "dev") {
|
|
124
|
+
return {
|
|
125
|
+
...COOKIE_DEFAULT_CONFIG,
|
|
126
|
+
httpOnly: false,
|
|
127
|
+
secure: false
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
return COOKIE_DEFAULT_CONFIG;
|
|
131
|
+
};
|
|
132
|
+
|
|
133
|
+
// src/middleware/handlers/handleAdaptiveProcessing.ts
|
|
134
|
+
var handleAdaptiveProcessing = (request, config) => {
|
|
135
|
+
const { nextUrl } = request;
|
|
136
|
+
const formFactor = getFormFactor(request);
|
|
137
|
+
const rewrittenUrl = nextUrl.clone();
|
|
138
|
+
rewrittenUrl.pathname = convertAdaptiveTargetPath(nextUrl.pathname, formFactor);
|
|
139
|
+
return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {
|
|
140
|
+
formFactor,
|
|
141
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
142
|
+
});
|
|
143
|
+
};
|
|
144
|
+
var handleApiRequest = (request) => {
|
|
145
|
+
const { pathname } = request.nextUrl;
|
|
146
|
+
if (!pathname.startsWith("/api/")) {
|
|
147
|
+
return null;
|
|
148
|
+
}
|
|
149
|
+
const { accessToken } = parseCookies(request);
|
|
150
|
+
const requestHeaders = new Headers(request.headers);
|
|
151
|
+
if (accessToken) {
|
|
152
|
+
requestHeaders.set("Authorization", `Bearer ${accessToken}`);
|
|
153
|
+
}
|
|
154
|
+
return NextResponse.next({
|
|
155
|
+
request: {
|
|
156
|
+
headers: requestHeaders
|
|
157
|
+
}
|
|
158
|
+
});
|
|
159
|
+
};
|
|
160
|
+
var handleDirectUrlAccess = (request, config) => {
|
|
161
|
+
const { pathname } = request.nextUrl;
|
|
162
|
+
const directPaths = ["/tablet/", "/mobile/", "/pc/", "/responsive/"];
|
|
163
|
+
if (directPaths.some((path) => pathname.startsWith(path))) {
|
|
164
|
+
return createResponseWithCookies(NextResponse.next(), request, {
|
|
165
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
166
|
+
});
|
|
167
|
+
}
|
|
168
|
+
return null;
|
|
169
|
+
};
|
|
170
|
+
var handleExternalInternalPaths = (request, config) => {
|
|
171
|
+
const { pathname } = request.nextUrl;
|
|
172
|
+
if (pathname.startsWith("/external") || pathname.startsWith("/internal")) {
|
|
173
|
+
return createResponseWithCookies(NextResponse.next(), request, {
|
|
174
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
175
|
+
});
|
|
176
|
+
}
|
|
177
|
+
return null;
|
|
178
|
+
};
|
|
179
|
+
var handleResponsivePaths = (request, config) => {
|
|
180
|
+
const { nextUrl } = request;
|
|
181
|
+
const { pathname } = nextUrl;
|
|
182
|
+
if (!isResponsivePath(pathname, config?.responsivePaths)) {
|
|
183
|
+
return null;
|
|
184
|
+
}
|
|
185
|
+
const rewrittenUrl = nextUrl.clone();
|
|
186
|
+
rewrittenUrl.pathname = `/responsive${pathname}`;
|
|
187
|
+
return createResponseWithCookies(NextResponse.rewrite(rewrittenUrl), request, {
|
|
188
|
+
tokens: config?.cookieData?.tokens ?? null
|
|
189
|
+
});
|
|
190
|
+
};
|
|
191
|
+
|
|
192
|
+
// src/middleware/dsp-middleware.ts
|
|
193
|
+
var processDspMiddleware = async (request, config) => {
|
|
194
|
+
const { pathname } = request.nextUrl;
|
|
195
|
+
console.log(`[DSP Middleware] \uCC98\uB9AC \uC2DC\uC791:: ${pathname}`);
|
|
196
|
+
let tokens;
|
|
197
|
+
try {
|
|
198
|
+
const tokensResponse = await getTokensFromServer(request, parseQueryParameters(request).tempToken);
|
|
199
|
+
tokens = tokensResponse?.data;
|
|
200
|
+
} catch (error) {
|
|
201
|
+
console.error(`[DSP Middleware] \uD1A0\uD070 \uD68D\uB4DD \uC2E4\uD328:: ${pathname}`, error);
|
|
202
|
+
tokens = null;
|
|
203
|
+
}
|
|
204
|
+
const apiResponse = handleApiRequest(request);
|
|
205
|
+
if (apiResponse) {
|
|
206
|
+
console.log(`[DSP Middleware] API \uC694\uCCAD:: ${pathname}`);
|
|
207
|
+
return apiResponse;
|
|
208
|
+
}
|
|
209
|
+
const externalInternalResponse = handleExternalInternalPaths(request, { cookieData: { tokens } });
|
|
210
|
+
if (externalInternalResponse) {
|
|
211
|
+
console.log(`[DSP Middleware] External/Internal \uACBD\uB85C\uB85C \uCC98\uB9AC:: ${pathname}`);
|
|
212
|
+
return externalInternalResponse;
|
|
213
|
+
}
|
|
214
|
+
const directUrlResponse = handleDirectUrlAccess(request, { cookieData: { tokens } });
|
|
215
|
+
if (directUrlResponse) {
|
|
216
|
+
console.log(`[DSP Middleware] \uC9C1\uC811 URL \uC811\uADFC\uC73C\uB85C \uCC98\uB9AC:: ${pathname}`);
|
|
217
|
+
return directUrlResponse;
|
|
218
|
+
}
|
|
219
|
+
const responsivePathResponse = handleResponsivePaths(request, {
|
|
220
|
+
cookieData: { tokens },
|
|
221
|
+
responsivePaths: config?.responsivePaths
|
|
222
|
+
});
|
|
223
|
+
if (responsivePathResponse) {
|
|
224
|
+
console.log(`[DSP Middleware] \uBC18\uC751\uD615 \uACBD\uB85C\uB85C \uCC98\uB9AC:: ${pathname}`);
|
|
225
|
+
return responsivePathResponse;
|
|
226
|
+
}
|
|
227
|
+
const adaptiveResponse = handleAdaptiveProcessing(request, { cookieData: { tokens } });
|
|
228
|
+
if (adaptiveResponse) {
|
|
229
|
+
return adaptiveResponse;
|
|
230
|
+
}
|
|
231
|
+
return NextResponse.next();
|
|
232
|
+
};
|
|
233
|
+
var createMiddleware = (handlers, config) => {
|
|
234
|
+
return (request) => {
|
|
235
|
+
for (const handler of handlers) {
|
|
236
|
+
const result = handler(request, config);
|
|
237
|
+
if (result) {
|
|
238
|
+
return result;
|
|
239
|
+
}
|
|
240
|
+
}
|
|
241
|
+
return NextResponse.next();
|
|
242
|
+
};
|
|
243
|
+
};
|
|
244
|
+
//! test
|
|
8
245
|
|
|
9
|
-
export {
|
|
246
|
+
export { createMiddleware, handleAdaptiveProcessing, handleApiRequest, handleDirectUrlAccess, handleExternalInternalPaths, handleResponsivePaths, processDspMiddleware };
|
|
10
247
|
//# sourceMappingURL=index.js.map
|
|
11
248
|
//# sourceMappingURL=index.js.map
|