@@ -2,7 +2,6 @@ import * as React from "rehackt";
2
2
3
3
import type { Render , BaseRender } from "./Render.js" ;
4
4
import { RenderInstance } from "./Render.js" ;
5
- import { applyStackTrace , captureStackTrace } from "./traces.js" ;
6
5
import type { RenderStreamContextValue } from "./context.js" ;
7
6
import {
8
7
RenderStreamContextProvider ,
@@ -16,12 +15,8 @@ export type ValidSnapshot =
16
15
| void
17
16
| ( object & { /* not a function */ call ?: never } ) ;
18
17
19
- /** only used for passing around data internally */
20
- const _stackTrace = Symbol ( ) ;
21
-
22
18
export interface NextRenderOptions {
23
19
timeout ?: number ;
24
- [ _stackTrace ] ?: string ;
25
20
}
26
21
27
22
interface ReplaceSnapshot < Snapshot > {
@@ -263,10 +258,9 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
263
258
264
259
return render ;
265
260
}
266
- return stream . waitForNextRender ( {
267
- [ _stackTrace ] : captureStackTrace ( stream . peekRender ) ,
268
- ...options ,
269
- } ) ;
261
+ return stream
262
+ . waitForNextRender ( options )
263
+ . catch ( rethrowWithCapturedStackTrace ( stream . peekRender ) ) ;
270
264
} ,
271
265
takeRender : markAssertable ( async function takeRender (
272
266
options : NextRenderOptions = { }
@@ -280,10 +274,12 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
280
274
281
275
try {
282
276
return await stream . peekRender ( {
283
- [ _stackTrace ] : captureStackTrace ( stream . takeRender ) ,
284
277
...options ,
285
278
} ) ;
286
279
} catch ( e ) {
280
+ if ( e instanceof Object ) {
281
+ Error . captureStackTrace ( e , stream . takeRender ) ;
282
+ }
287
283
error = e ;
288
284
throw e ;
289
285
} finally {
@@ -313,11 +309,7 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
313
309
}
314
310
return render ;
315
311
} ,
316
- waitForNextRender ( {
317
- timeout = 1000 ,
318
- // capture the stack trace here so its stack trace is as close to the calling code as possible
319
- [ _stackTrace ] : stackTrace = captureStackTrace ( stream . waitForNextRender ) ,
320
- } : NextRenderOptions = { } ) {
312
+ waitForNextRender ( { timeout = 1000 } : NextRenderOptions = { } ) {
321
313
if ( ! nextRender ) {
322
314
nextRender = Promise . race < Render < Snapshot > > ( [
323
315
new Promise < Render < Snapshot > > ( ( resolve , reject ) => {
@@ -326,9 +318,9 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
326
318
} ) ,
327
319
new Promise < Render < Snapshot > > ( ( _ , reject ) =>
328
320
setTimeout ( ( ) => {
329
- reject (
330
- applyStackTrace ( new WaitForRenderTimeoutError ( ) , stackTrace )
331
- ) ;
321
+ const error = new WaitForRenderTimeoutError ( ) ;
322
+ Error . captureStackTrace ( error , stream . waitForNextRender ) ;
323
+ reject ( error ) ;
332
324
resetNextRender ( ) ;
333
325
} , timeout )
334
326
) ,
@@ -344,6 +336,7 @@ export function createRenderStream<Snapshot extends ValidSnapshot = void>({
344
336
export class WaitForRenderTimeoutError extends Error {
345
337
constructor ( ) {
346
338
super ( "Exceeded timeout waiting for next render." ) ;
339
+ this . name = "WaitForRenderTimeoutError" ;
347
340
Object . setPrototypeOf ( this , new . target . prototype ) ;
348
341
}
349
342
}
@@ -381,3 +374,12 @@ export function useTrackRenders({ name }: { name?: string } = {}) {
381
374
ctx . renderedComponents . unshift ( component ) ;
382
375
} ) ;
383
376
}
377
+
378
+ function rethrowWithCapturedStackTrace ( constructorOpt : Function | undefined ) {
379
+ return function ( error : unknown ) {
380
+ if ( error instanceof Object ) {
381
+ Error . captureStackTrace ( error , constructorOpt ) ;
382
+ }
383
+ throw error ;
384
+ } ;
385
+ }
0 commit comments