Skip to content

Commit c78fc25

Browse files
fix: cleanup references (#5965)
1 parent 3696aa6 commit c78fc25

File tree

2 files changed

+44
-30
lines changed

2 files changed

+44
-30
lines changed

packages/router-core/src/ssr/transformStreamWithRouter.ts

Lines changed: 37 additions & 27 deletions
Original file line numberDiff line numberDiff line change
@@ -104,7 +104,10 @@ export function transformStreamWithRouter(
104104
let timeoutHandle: NodeJS.Timeout
105105

106106
const finalPassThrough = createPassthrough(() => {
107-
stopListeningToInjectedHtml?.()
107+
if (stopListeningToInjectedHtml) {
108+
stopListeningToInjectedHtml()
109+
stopListeningToInjectedHtml = undefined
110+
}
108111
clearTimeout(timeoutHandle)
109112
})
110113
const textDecoder = new TextDecoder()
@@ -134,34 +137,36 @@ export function transformStreamWithRouter(
134137
let processingCount = 0
135138

136139
// Process any already-injected HTML
137-
router.serverSsr!.injectedHtml.forEach((promise) => {
138-
handleInjectedHtml(promise)
139-
})
140+
handleInjectedHtml()
140141

141142
// Listen for any new injected HTML
142-
stopListeningToInjectedHtml = router.subscribe('onInjectedHtml', (e) => {
143-
handleInjectedHtml(e.promise)
144-
})
145-
146-
function handleInjectedHtml(promise: Promise<string>) {
147-
processingCount++
148-
149-
promise
150-
.then((html) => {
151-
if (isAppRendering) {
152-
routerStreamBuffer += html
153-
} else {
154-
finalPassThrough.write(html)
155-
}
156-
})
157-
.catch(injectedHtmlDonePromise.reject)
158-
.finally(() => {
159-
processingCount--
143+
stopListeningToInjectedHtml = router.subscribe(
144+
'onInjectedHtml',
145+
handleInjectedHtml,
146+
)
160147

161-
if (!isAppRendering && processingCount === 0) {
162-
injectedHtmlDonePromise.resolve()
163-
}
164-
})
148+
function handleInjectedHtml() {
149+
router.serverSsr!.injectedHtml.forEach((promise) => {
150+
processingCount++
151+
152+
promise
153+
.then((html) => {
154+
if (isAppRendering) {
155+
routerStreamBuffer += html
156+
} else {
157+
finalPassThrough.write(html)
158+
}
159+
})
160+
.catch(injectedHtmlDonePromise.reject)
161+
.finally(() => {
162+
processingCount--
163+
164+
if (!isAppRendering && processingCount === 0) {
165+
injectedHtmlDonePromise.resolve()
166+
}
167+
})
168+
})
169+
router.serverSsr!.injectedHtml = []
165170
}
166171

167172
injectedHtmlDonePromise
@@ -176,7 +181,12 @@ export function transformStreamWithRouter(
176181
console.error('Error reading routerStream:', err)
177182
finalPassThrough.destroy(err)
178183
})
179-
.finally(() => stopListeningToInjectedHtml?.())
184+
.finally(() => {
185+
if (stopListeningToInjectedHtml) {
186+
stopListeningToInjectedHtml()
187+
stopListeningToInjectedHtml = undefined
188+
}
189+
})
180190

181191
// Transform the appStream
182192
readStream(appStream, {

packages/router-ssr-query-core/src/index.ts

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -38,10 +38,14 @@ export function setupCoreRouterSsrQueryIntegration<TRouter extends AnyRouter>({
3838
if (router.isServer) {
3939
const sentQueries = new Set<string>()
4040
const queryStream = createPushableStream()
41-
41+
let unsubscribe: (() => void) | undefined = undefined
4242
router.options.dehydrate =
4343
async (): Promise<DehydratedRouterQueryState> => {
44-
router.serverSsr!.onRenderFinished(() => queryStream.close())
44+
router.serverSsr!.onRenderFinished(() => {
45+
queryStream.close()
46+
unsubscribe?.()
47+
unsubscribe = undefined
48+
})
4549
const ogDehydrated = await ogDehydrate?.()
4650

4751
const dehydratedRouter = {
@@ -70,7 +74,7 @@ export function setupCoreRouterSsrQueryIntegration<TRouter extends AnyRouter>({
7074
},
7175
})
7276

73-
queryClient.getQueryCache().subscribe((event) => {
77+
unsubscribe = queryClient.getQueryCache().subscribe((event) => {
7478
// before rendering starts, we do not stream individual queries
7579
// instead we dehydrate the entire query client in router's dehydrate()
7680
// if attachRouterServerSsrUtils() has not been called yet, `router.serverSsr` will be undefined and we also do not stream

0 commit comments

Comments
 (0)