Skip to content

Commit 9bb6e96

Browse files
committed
next.js: fix compatibility with >=14.2.7
1 parent c8ab3e4 commit 9bb6e96

File tree

3 files changed

+19
-8
lines changed

3 files changed

+19
-8
lines changed

.github/workflows/appsec.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -209,7 +209,7 @@ jobs:
209209
version:
210210
- 18
211211
- latest
212-
range: ['9.5.0', '11.1.4', '13.2.0', '14.2.6']
212+
range: ['9.5.0', '11.1.4', '13.2.0', '14.2.6', '14.2.7']
213213
runs-on: ubuntu-latest
214214
env:
215215
PLUGINS: next

.github/workflows/plugins.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -746,7 +746,7 @@ jobs:
746746
version:
747747
- 18
748748
- latest
749-
range: ['9.5.0', '11.1.4', '13.2.0', '14.2.6']
749+
range: ['9.5.0', '11.1.4', '13.2.0', '14.2.6', '14.2.7']
750750
runs-on: ubuntu-latest
751751
env:
752752
PLUGINS: next

packages/datadog-instrumentations/src/next.js

+17-6
Original file line numberDiff line numberDiff line change
@@ -14,7 +14,12 @@ const queryParsedChannel = channel('apm:next:query-parsed')
1414
const requests = new WeakSet()
1515
const nodeNextRequestsToNextRequests = new WeakMap()
1616

17+
// Next.js <= 14.2.6
1718
const MIDDLEWARE_HEADER = 'x-middleware-invoke'
19+
// Next.js >= 14.2.7
20+
const NEXT_REQUEST_META = Symbol.for('NextInternalRequestMeta')
21+
const META_IS_MIDDLEWARE = 'middlewareInvoke'
22+
1823

1924
function wrapHandleRequest (handleRequest) {
2025
return function (req, res, pathname, query) {
@@ -111,6 +116,12 @@ function getPageFromPath (page, dynamicRoutes = []) {
111116
return getPagePath(page)
112117
}
113118

119+
// https://github.com/vercel/next.js/blob/09ab728499b7a502de36a8397ef85ff30f5e4f6e/packages/next/src/server/request-meta.ts#L161
120+
function getRequestMeta(req, key) {
121+
const meta = req[NEXT_REQUEST_META] || {}
122+
return typeof key === 'string' ? meta[key] : meta
123+
}
124+
114125
function instrument (req, res, error, handler) {
115126
if (typeof error === 'function') {
116127
handler = error
@@ -121,7 +132,7 @@ function instrument (req, res, error, handler) {
121132
res = res.originalResponse || res
122133

123134
// TODO support middleware properly in the future?
124-
const isMiddleware = req.headers[MIDDLEWARE_HEADER]
135+
const isMiddleware = req.headers[MIDDLEWARE_HEADER] || req[NEXT_REQUEST_META]?.[META_IS_MIDDLEWARE]
125136
if (isMiddleware || requests.has(req)) {
126137
if (error) {
127138
errorChannel.publish({ error })
@@ -188,7 +199,7 @@ function finish (ctx, result, err) {
188199
// however, it is not provided as a class function or exported property
189200
addHook({
190201
name: 'next',
191-
versions: ['>=13.3.0 <14.2.7'],
202+
versions: ['>=13.3.0 <=14.2.7'],
192203
file: 'dist/server/web/spec-extension/adapters/next-request.js'
193204
}, NextRequestAdapter => {
194205
shimmer.wrap(NextRequestAdapter.NextRequestAdapter, 'fromNodeNextRequest', fromNodeNextRequest => {
@@ -203,7 +214,7 @@ addHook({
203214

204215
addHook({
205216
name: 'next',
206-
versions: ['>=11.1 <14.2.7'],
217+
versions: ['>=11.1 <=14.2.7'],
207218
file: 'dist/server/serve-static.js'
208219
}, serveStatic => shimmer.wrap(serveStatic, 'serveStatic', wrapServeStatic))
209220

@@ -213,7 +224,7 @@ addHook({
213224
file: 'dist/next-server/server/serve-static.js'
214225
}, serveStatic => shimmer.wrap(serveStatic, 'serveStatic', wrapServeStatic))
215226

216-
addHook({ name: 'next', versions: ['>=11.1 <14.2.7'], file: 'dist/server/next-server.js' }, nextServer => {
227+
addHook({ name: 'next', versions: ['>=11.1 <=14.2.7'], file: 'dist/server/next-server.js' }, nextServer => {
217228
const Server = nextServer.default
218229

219230
shimmer.wrap(Server.prototype, 'handleRequest', wrapHandleRequest)
@@ -230,7 +241,7 @@ addHook({ name: 'next', versions: ['>=11.1 <14.2.7'], file: 'dist/server/next-se
230241
})
231242

232243
// `handleApiRequest` changes parameters/implementation at 13.2.0
233-
addHook({ name: 'next', versions: ['>=13.2 <14.2.7'], file: 'dist/server/next-server.js' }, nextServer => {
244+
addHook({ name: 'next', versions: ['>=13.2 <=14.2.7'], file: 'dist/server/next-server.js' }, nextServer => {
234245
const Server = nextServer.default
235246
shimmer.wrap(Server.prototype, 'handleApiRequest', wrapHandleApiRequestWithMatch)
236247
return nextServer
@@ -264,7 +275,7 @@ addHook({
264275

265276
addHook({
266277
name: 'next',
267-
versions: ['>=13 <14.2.7'],
278+
versions: ['>=13 <=14.2.7'],
268279
file: 'dist/server/web/spec-extension/request.js'
269280
}, request => {
270281
const nextUrlDescriptor = Object.getOwnPropertyDescriptor(request.NextRequest.prototype, 'nextUrl')

0 commit comments

Comments
 (0)