@@ -3,6 +3,7 @@ import { generateUUID } from "./request_response";
33import { createProxy , expose , wrap } from "./async_task" ;
44import { FakeMessageChannel } from "./fake_message_channel" ;
55import { ProxyMarked , proxyMarker } from "./types" ;
6+ import * as ErrorStackParser from "error-stack-parser" ;
67
78export const throwMarker = Symbol ( "Synclink.thrown" ) ;
89
@@ -103,6 +104,47 @@ type SerializedThrownValue =
103104 | { isError : true ; value : Error }
104105 | { isError : false ; value : unknown } ;
105106
107+ const CHROME_IE_STACK_REGEXP = / ^ \s * a t .* ( \S + : \d + | \( n a t i v e \) ) / m;
108+
109+ function renderChromeStack ( s : ErrorStackParser . StackFrame ) : string {
110+ const locationInfo = [ s . fileName , s . lineNumber , s . columnNumber ] . join ( ":" ) ;
111+ if ( s . functionName ) {
112+ return ` at ${ s . functionName } (${ locationInfo } )` ;
113+ } else {
114+ return ` at ${ locationInfo } ` ;
115+ }
116+ }
117+
118+ function renderFirefoxStack ( s : ErrorStackParser . StackFrame ) : string {
119+ const locationInfo = [ s . fileName , s . lineNumber , s . columnNumber ] . join ( ":" ) ;
120+ return `${ s . functionName || "" } @${ locationInfo } ` ;
121+ }
122+
123+ function fixStackTrace ( origError : Error ) : Error {
124+ const e = new Error ( origError . message ) ;
125+ e . name = origError . name ;
126+ const isChromeStack = origError . stack ?. match ( CHROME_IE_STACK_REGEXP ) ;
127+ const stackList = ErrorStackParser . parse ( origError )
128+ . concat ( ErrorStackParser . parse ( e ) )
129+ . filter ( ( s ) => {
130+ const fileName = s . getFileName ( ) ;
131+ const funcName = s . getFunctionName ( ) ;
132+ return (
133+ ! fileName ||
134+ ! / s y n c l i n k \. m ? j s $ / . test ( fileName ) ||
135+ funcName ?. startsWith ( "SynclinkTask." ) ||
136+ funcName ?. startsWith ( "then" )
137+ ) ;
138+ } )
139+ . map ( isChromeStack ? renderChromeStack : renderFirefoxStack ) ;
140+ if ( isChromeStack ) {
141+ stackList . unshift ( e . stack ! . split ( "\n" , 2 ) [ 0 ] ) ;
142+ }
143+ const stack = stackList . join ( "\n" ) ;
144+ e . stack = stack ;
145+ return e ;
146+ }
147+
106148/**
107149 * Internal transfer handler to handle thrown exceptions.
108150 */
@@ -130,10 +172,7 @@ export const throwTransferHandler: TransferHandler<
130172 } ,
131173 deserialize ( serialized ) {
132174 if ( serialized . isError ) {
133- throw Object . assign (
134- new Error ( serialized . value . message ) ,
135- serialized . value ,
136- ) ;
175+ throw fixStackTrace ( serialized . value ) ;
137176 }
138177 throw serialized . value ;
139178 } ,
0 commit comments