@edgeone/opennextjs-pages 0.1.4 → 0.1.5

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.
@@ -3650,6 +3650,22 @@ async function executeMiddleware({request}) {
3650
3650
  }
3651
3651
  } catch (e) {}
3652
3652
  }
3653
+
3654
+ // \u4ECE EdgeOne request.eo \u83B7\u53D6 geo \u548C ip \u4FE1\u606F
3655
+ const eoData = request.eo || {};
3656
+ const eoGeo = eoData.geo || {};
3657
+
3658
+ // \u5C06 EdgeOne geo \u683C\u5F0F\u8F6C\u6362\u4E3A Next.js geo \u683C\u5F0F
3659
+ // EdgeOne: { countryCodeAlpha2, regionCode, cityName, latitude, longitude, ... }
3660
+ // Next.js: { country, region, city, latitude, longitude }
3661
+ const nextGeo = {
3662
+ country: eoGeo.countryCodeAlpha2 || undefined,
3663
+ region: eoGeo.regionCode || undefined,
3664
+ city: eoGeo.cityName || undefined,
3665
+ latitude: eoGeo.latitude !== undefined ? String(eoGeo.latitude) : undefined,
3666
+ longitude: eoGeo.longitude !== undefined ? String(eoGeo.longitude) : undefined,
3667
+ };
3668
+ const clientIp = eoData.clientIp || request.headers.get('x-forwarded-for') || '';
3653
3669
 
3654
3670
  // \u6784\u9020\u8BF7\u6C42\u5BF9\u8C61
3655
3671
  let nextRequest;
@@ -3659,7 +3675,9 @@ async function executeMiddleware({request}) {
3659
3675
  // NextRequest \u6784\u9020\u51FD\u6570\u7B7E\u540D: new NextRequest(input, init?)
3660
3676
  // input \u53EF\u4EE5\u662F URL \u5B57\u7B26\u4E32\u6216 Request \u5BF9\u8C61
3661
3677
  nextRequest = new NextRequestClass(request, {
3662
- nextConfig: {}
3678
+ nextConfig: {},
3679
+ geo: nextGeo,
3680
+ ip: clientIp
3663
3681
  });
3664
3682
  } catch (e) {
3665
3683
  nextRequest = null;
@@ -3713,9 +3731,9 @@ async function executeMiddleware({request}) {
3713
3731
  delete: () => {}
3714
3732
  };
3715
3733
 
3716
- // \u6DFB\u52A0 geo \u548C ip
3717
- nextRequest.geo = {};
3718
- nextRequest.ip = request.headers.get('x-forwarded-for') || '';
3734
+ // \u6DFB\u52A0 geo \u548C ip\uFF08\u4F7F\u7528\u4ECE EdgeOne \u8F6C\u6362\u540E\u7684\u6570\u636E\uFF09
3735
+ nextRequest.geo = nextGeo;
3736
+ nextRequest.ip = clientIp;
3719
3737
  }
3720
3738
 
3721
3739
  // \u8BBE\u7F6E\u5168\u5C40 NextResponse\uFF08\u5982\u679C\u53EF\u7528\uFF09
@@ -3738,6 +3756,11 @@ async function executeMiddleware({request}) {
3738
3756
  headersObj[key] = value;
3739
3757
  });
3740
3758
 
3759
+ // \u6CE8\u5165 geo \u548C clientIp \u5230 headers \u4E2D
3760
+ // Next.js 15+ \u79FB\u9664\u4E86 request.geo \u548C request.ip\uFF0C\u7528\u6237\u9700\u8981\u4ECE headers \u4E2D\u8BFB\u53D6
3761
+ headersObj['geo'] = JSON.stringify(nextGeo);
3762
+ headersObj['clientIp'] = clientIp;
3763
+
3741
3764
  // \u521B\u5EFA\u4E00\u4E2A\u53EF\u5199\u7684 request \u5305\u88C5\u5BF9\u8C61
3742
3765
  const requestWrapper = {
3743
3766
  url: request.url,
@@ -3747,6 +3770,8 @@ async function executeMiddleware({request}) {
3747
3770
  bodyUsed: request.bodyUsed,
3748
3771
  signal: request.signal,
3749
3772
  nextConfig: {}, // NextURL \u6784\u9020\u51FD\u6570\u9700\u8981\u8FD9\u4E2A
3773
+ geo: nextGeo, // EdgeOne geo \u8F6C\u6362\u4E3A Next.js \u683C\u5F0F\uFF08\u517C\u5BB9 Next.js 14 \u53CA\u4EE5\u4E0B\uFF09
3774
+ ip: clientIp, // \u5BA2\u6237\u7AEF IP\uFF08\u517C\u5BB9 Next.js 14 \u53CA\u4EE5\u4E0B\uFF09
3750
3775
  // \u4FDD\u6301\u539F\u59CB Request \u7684\u65B9\u6CD5\u53EF\u7528
3751
3776
  clone: () => request.clone(),
3752
3777
  arrayBuffer: () => request.arrayBuffer(),
@@ -21,6 +21,24 @@ function getEdgeOneWrapperCode(options = {}) {
21
21
  // Middleware Runner (Raw Source Mode)
22
22
  // ============================================================
23
23
 
24
+ /**
25
+ * \u5C06 EdgeOne geo \u683C\u5F0F\u8F6C\u6362\u4E3A Next.js geo \u683C\u5F0F
26
+ * EdgeOne: { countryCodeAlpha2, regionCode, cityName, latitude, longitude, ... }
27
+ * Next.js: { country, region, city, latitude, longitude }
28
+ */
29
+ function convertEoGeoToNextGeo(eoGeo) {
30
+ if (!eoGeo || typeof eoGeo !== 'object') {
31
+ return {};
32
+ }
33
+ return {
34
+ country: eoGeo.countryCodeAlpha2 || undefined,
35
+ region: eoGeo.regionCode || undefined,
36
+ city: eoGeo.cityName || undefined,
37
+ latitude: eoGeo.latitude !== undefined ? String(eoGeo.latitude) : undefined,
38
+ longitude: eoGeo.longitude !== undefined ? String(eoGeo.longitude) : undefined,
39
+ };
40
+ }
41
+
24
42
  /**
25
43
  * \u8FD0\u884C\u4E2D\u95F4\u4EF6\u7684\u4E3B\u51FD\u6570
26
44
  * @param {Request} request - \u539F\u59CB\u8BF7\u6C42\u5BF9\u8C61
@@ -77,66 +95,80 @@ async function executeMiddleware({request}) {
77
95
  }
78
96
  }
79
97
 
98
+ // \u4ECE EdgeOne request.eo \u83B7\u53D6 geo \u548C ip \u4FE1\u606F
99
+ const eoData = request.eo || {};
100
+ const nextGeo = convertEoGeoToNextGeo(eoData.geo);
101
+ const clientIp = eoData.clientIp || request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || '';
102
+
103
+ // \u521B\u5EFA\u65B0\u7684 Headers\uFF0C\u6CE8\u5165 geo \u548C clientIp
104
+ // Next.js 15+ \u79FB\u9664\u4E86 request.geo \u548C request.ip\uFF0C\u7528\u6237\u9700\u8981\u4ECE headers \u4E2D\u8BFB\u53D6
105
+ const newHeaders = new Headers(request.headers);
106
+ newHeaders.set('geo', JSON.stringify(nextGeo));
107
+ newHeaders.set('clientIp', clientIp);
108
+
109
+ // \u521B\u5EFA\u5E26\u6709\u65B0 headers \u7684 request
110
+ const newRequest = new Request(request.url, {
111
+ method: request.method,
112
+ headers: newHeaders,
113
+ body: request.body,
114
+ });
115
+
80
116
  // \u4E3A request \u6DFB\u52A0 nextUrl \u5C5E\u6027
81
- if (!request.nextUrl) {
82
- Object.defineProperty(request, 'nextUrl', {
83
- value: {
84
- pathname: pathname,
85
- search: url.search,
86
- searchParams: url.searchParams,
87
- hash: url.hash,
88
- host: url.host,
89
- hostname: url.hostname,
90
- port: url.port,
91
- protocol: url.protocol,
92
- href: url.href,
93
- origin: url.origin,
94
- basePath: '',
95
- locale: '',
96
- defaultLocale: '',
97
- toString: () => url.href,
98
- clone: () => new URL(url.href)
99
- },
100
- writable: true,
101
- enumerable: true
102
- });
103
- }
117
+ Object.defineProperty(newRequest, 'nextUrl', {
118
+ value: {
119
+ pathname: pathname,
120
+ search: url.search,
121
+ searchParams: url.searchParams,
122
+ hash: url.hash,
123
+ host: url.host,
124
+ hostname: url.hostname,
125
+ port: url.port,
126
+ protocol: url.protocol,
127
+ href: url.href,
128
+ origin: url.origin,
129
+ basePath: '',
130
+ locale: '',
131
+ defaultLocale: '',
132
+ toString: () => url.href,
133
+ clone: () => new URL(url.href)
134
+ },
135
+ writable: true,
136
+ enumerable: true
137
+ });
104
138
 
105
139
  // \u4E3A request \u6DFB\u52A0 cookies \u5C5E\u6027
106
- if (!request.cookies) {
107
- const cookieHeader = request.headers.get('cookie') || '';
108
- const cookieMap = new Map();
109
-
110
- if (cookieHeader) {
111
- cookieHeader.split(';').forEach(cookie => {
112
- const [name, ...valueParts] = cookie.trim().split('=');
113
- if (name) {
114
- cookieMap.set(name.trim(), {
115
- name: name.trim(),
116
- value: valueParts.join('=') || ''
117
- });
118
- }
119
- });
120
- }
121
-
122
- Object.defineProperty(request, 'cookies', {
123
- value: {
124
- get: (name) => cookieMap.get(name),
125
- has: (name) => cookieMap.has(name),
126
- getAll: () => Array.from(cookieMap.values()),
127
- set: () => {},
128
- delete: () => {},
129
- clear: () => {},
130
- [Symbol.iterator]: () => cookieMap.values(),
131
- size: cookieMap.size
132
- },
133
- writable: true,
134
- enumerable: true
140
+ const cookieHeader = newRequest.headers.get('cookie') || '';
141
+ const cookieMap = new Map();
142
+
143
+ if (cookieHeader) {
144
+ cookieHeader.split(';').forEach(cookie => {
145
+ const [name, ...valueParts] = cookie.trim().split('=');
146
+ if (name) {
147
+ cookieMap.set(name.trim(), {
148
+ name: name.trim(),
149
+ value: valueParts.join('=') || ''
150
+ });
151
+ }
135
152
  });
136
153
  }
154
+
155
+ Object.defineProperty(newRequest, 'cookies', {
156
+ value: {
157
+ get: (name) => cookieMap.get(name),
158
+ has: (name) => cookieMap.has(name),
159
+ getAll: () => Array.from(cookieMap.values()),
160
+ set: () => {},
161
+ delete: () => {},
162
+ clear: () => {},
163
+ [Symbol.iterator]: () => cookieMap.values(),
164
+ size: cookieMap.size
165
+ },
166
+ writable: true,
167
+ enumerable: true
168
+ });
137
169
 
138
170
  // \u8C03\u7528 middleware \u51FD\u6570
139
- const result = await middleware(request);
171
+ const result = await middleware(newRequest);
140
172
 
141
173
  return result;
142
174
  }
@@ -274,6 +306,24 @@ function matchesPath(pathname, matcher) {
274
306
  return false;
275
307
  }
276
308
 
309
+ /**
310
+ * \u5C06 EdgeOne geo \u683C\u5F0F\u8F6C\u6362\u4E3A Next.js geo \u683C\u5F0F
311
+ * EdgeOne: { countryCodeAlpha2, regionCode, cityName, latitude, longitude, ... }
312
+ * Next.js: { country, region, city, latitude, longitude }
313
+ */
314
+ function convertEoGeoToNextGeo(eoGeo) {
315
+ if (!eoGeo || typeof eoGeo !== 'object') {
316
+ return {};
317
+ }
318
+ return {
319
+ country: eoGeo.countryCodeAlpha2 || undefined,
320
+ region: eoGeo.regionCode || undefined,
321
+ city: eoGeo.cityName || undefined,
322
+ latitude: eoGeo.latitude !== undefined ? String(eoGeo.latitude) : undefined,
323
+ longitude: eoGeo.longitude !== undefined ? String(eoGeo.longitude) : undefined,
324
+ };
325
+ }
326
+
277
327
  /**
278
328
  * \u8FD0\u884C\u4E2D\u95F4\u4EF6\u7684\u4E3B\u51FD\u6570
279
329
  * @param {Request} request - \u539F\u59CB\u8BF7\u6C42\u5BF9\u8C61
@@ -298,6 +348,17 @@ async function executeMiddleware({request}) {
298
348
  request.headers.forEach((value, key) => {
299
349
  headersObject[key] = value;
300
350
  });
351
+
352
+ // \u4ECE EdgeOne request.eo \u83B7\u53D6 geo \u548C ip \u4FE1\u606F
353
+ const eoData = request.eo || {};
354
+ const nextGeo = convertEoGeoToNextGeo(eoData.geo);
355
+ const clientIp = eoData.clientIp || request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || '';
356
+
357
+ // \u6CE8\u5165 geo \u548C clientIp \u5230 headers \u4E2D
358
+ // Next.js 15+ \u79FB\u9664\u4E86 request.geo \u548C request.ip\uFF0C\u7528\u6237\u9700\u8981\u4ECE headers \u4E2D\u8BFB\u53D6
359
+ // \u4F7F\u7528 'geo' (JSON \u5B57\u7B26\u4E32) \u548C 'clientIp' \u4F5C\u4E3A header \u540D\u79F0
360
+ headersObject['geo'] = JSON.stringify(nextGeo);
361
+ headersObject['clientIp'] = clientIp;
301
362
 
302
363
  // \u6784\u9020 Next.js middleware adapter \u671F\u671B\u7684\u53C2\u6570\u683C\u5F0F
303
364
  // \u53C2\u8003 Next.js \u6E90\u7801\u4E2D\u7684 adapter \u51FD\u6570
@@ -312,8 +373,8 @@ async function executeMiddleware({request}) {
312
373
  i18n: null,
313
374
  trailingSlash: false
314
375
  },
315
- geo: {},
316
- ip: request.headers.get('x-forwarded-for') || request.headers.get('x-real-ip') || '',
376
+ geo: nextGeo,
377
+ ip: clientIp,
317
378
  signal: request.signal || null
318
379
  },
319
380
  page: '/',
@@ -28,7 +28,7 @@ module.exports = __toCommonJS(tags_handler_exports);
28
28
 
29
29
  // package.json
30
30
  var name = "@edgeone/opennextjs-pages";
31
- var version = "0.1.4";
31
+ var version = "0.1.5";
32
32
 
33
33
  // src/run/handlers/tags-handler.cts
34
34
  var import_request_context = require("./request-context.cjs");
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@edgeone/opennextjs-pages",
3
- "version": "0.1.4",
3
+ "version": "0.1.5",
4
4
  "description": "",
5
5
  "main": "./dist/index.js",
6
6
  "type": "module",