diff --git a/packages/next/client/index.tsx b/packages/next/client/index.tsx
index 3e408f1cefe6..08fdab14c86a 100644
--- a/packages/next/client/index.tsx
+++ b/packages/next/client/index.tsx
@@ -702,6 +702,7 @@ if (process.env.__NEXT_RSC) {
writer.write(encoder.encode(val))
})
buffer.length = 0
+ serverDataBuffer.delete(key)
}
serverDataWriter.set(key, writer)
}
diff --git a/test/integration/react-streaming-and-server-components/app/pages/index.server.js b/test/integration/react-streaming-and-server-components/app/pages/index.server.js
index 4874b99a3422..cec07820c64b 100644
--- a/test/integration/react-streaming-and-server-components/app/pages/index.server.js
+++ b/test/integration/react-streaming-and-server-components/app/pages/index.server.js
@@ -1,4 +1,5 @@
import Foo from '../components/foo.client'
+import Link from 'next/link'
const envVar = process.env.ENV_VAR_TEST
const headerKey = 'x-next-test-client'
@@ -13,6 +14,9 @@ export default function Index({ header, router }) {
+
+ refresh
+
)
}
diff --git a/test/integration/react-streaming-and-server-components/test/rsc.js b/test/integration/react-streaming-and-server-components/test/rsc.js
index 2cccad780122..604073c3930f 100644
--- a/test/integration/react-streaming-and-server-components/test/rsc.js
+++ b/test/integration/react-streaming-and-server-components/test/rsc.js
@@ -38,7 +38,7 @@ export default function (context, { runtime, env }) {
page.on('request', (request) => {
requestsCount++
const url = request.url()
- if (/__flight__=1/.test(url)) {
+ if (/\?__flight__=1/.test(url)) {
hasFlightRequest = true
}
})
@@ -95,9 +95,39 @@ export default function (context, { runtime, env }) {
})
}
- // For prod build, the directory contains the build ID so it's not deterministic.
- // Only enable it for dev for now.
+ it('should refresh correctly with next/link', async () => {
+ // Select the button which is not hidden but rendered
+ const selector = '#__next #refresh'
+ let hasFlightRequest = false
+ const browser = await webdriver(context.appPort, '/', {
+ beforePageLoad(page) {
+ page.on('request', (request) => {
+ const url = request.url()
+ if (/\?__flight__=1/.test(url)) {
+ hasFlightRequest = true
+ }
+ })
+ },
+ })
+
+ // wait for hydration
+ await new Promise((res) => setTimeout(res, 1000))
+ if (env === 'dev') {
+ expect(hasFlightRequest).toBe(false)
+ }
+ await browser.elementByCss(selector).click()
+ // wait for re-hydration
+ await new Promise((res) => setTimeout(res, 1000))
+ if (env === 'dev') {
+ expect(hasFlightRequest).toBe(true)
+ }
+ const refreshText = await browser.elementByCss(selector).text()
+ expect(refreshText).toBe('refresh')
+ })
+
if (env === 'dev') {
+ // For prod build, the directory contains the build ID so it's not deterministic.
+ // Only enable it for dev for now.
it('should not bundle external imports into client builds for RSC', async () => {
const html = await renderViaHTTP(context.appPort, '/external-imports')
expect(html).toContain('date:')