11
11
*/
12
12
13
13
const NEWLINE = '\n' ;
14
- const SEP = ' ------------- ' ;
15
- const IGNORE_FRAMES : string [ ] = [ ] ;
14
+ const IGNORE_FRAMES : { [ k : string ] : true } = { } ;
16
15
const creationTrace = '__creationTrace__' ;
16
+ const ERROR_TAG = 'STACKTRACE TRACKING' ;
17
+ const SEP_TAG = '__SEP_TAG__' ;
18
+ let sepTemplate = '' ;
17
19
18
20
class LongStackTrace {
19
21
error : Error = getStacktrace ( ) ;
20
22
timestamp : Date = new Date ( ) ;
21
23
}
22
24
23
25
function getStacktraceWithUncaughtError ( ) : Error {
24
- return new Error ( 'STACKTRACE TRACKING' ) ;
26
+ return new Error ( ERROR_TAG ) ;
25
27
}
26
28
27
29
function getStacktraceWithCaughtError ( ) : Error {
@@ -49,22 +51,24 @@ function addErrorStack(lines: string[], error: Error): void {
49
51
for ( let i = 0 ; i < trace . length ; i ++ ) {
50
52
const frame = trace [ i ] ;
51
53
// Filter out the Frames which are part of stack capturing.
52
- if ( ! ( i < IGNORE_FRAMES . length && IGNORE_FRAMES [ i ] === frame ) ) {
54
+ if ( ! IGNORE_FRAMES . hasOwnProperty ( frame ) ) {
53
55
lines . push ( trace [ i ] ) ;
54
56
}
55
57
}
56
58
}
57
59
58
60
function renderLongStackTrace ( frames : LongStackTrace [ ] , stack : string ) : string {
59
- const longTrace : string [ ] = [ stack ] ;
61
+ const longTrace : string [ ] = [ stack . trim ( ) ] ;
60
62
61
63
if ( frames ) {
62
64
let timestamp = new Date ( ) . getTime ( ) ;
63
65
for ( let i = 0 ; i < frames . length ; i ++ ) {
64
66
const traceFrames : LongStackTrace = frames [ i ] ;
65
67
const lastTime = traceFrames . timestamp ;
66
- longTrace . push (
67
- `${ SEP } Elapsed: ${ timestamp - lastTime . getTime ( ) } ms; At: ${ lastTime } ${ SEP } ` ) ;
68
+ let separator =
69
+ `____________________Elapsed ${ timestamp - lastTime . getTime ( ) } ms; At: ${ lastTime } ` ;
70
+ separator = separator . replace ( / [ ^ \w \d ] / g, '_' ) ;
71
+ longTrace . push ( sepTemplate . replace ( SEP_TAG , separator ) ) ;
68
72
addErrorStack ( longTrace , traceFrames . error ) ;
69
73
70
74
timestamp = lastTime . getTime ( ) ;
@@ -105,42 +109,15 @@ function renderLongStackTrace(frames: LongStackTrace[], stack: string): string {
105
109
} ,
106
110
107
111
onHandleError : function (
108
- parentZoneDelegate : ZoneDelegate , currentZone : Zone , targetZone : Zone , error : any ) : any {
112
+ parentZoneDelegate : ZoneDelegate , currentZone : Zone , targetZone : Zone , error : any ) : boolean {
109
113
const parentTask = Zone . currentTask || error . task ;
110
114
if ( error instanceof Error && parentTask ) {
111
- let stackSetSucceeded : string | boolean = null ;
115
+ const longStack =
116
+ renderLongStackTrace ( parentTask . data && parentTask . data [ creationTrace ] , error . stack ) ;
112
117
try {
113
- let descriptor = Object . getOwnPropertyDescriptor ( error , 'stack' ) ;
114
- if ( descriptor && descriptor . configurable ) {
115
- const delegateGet = descriptor . get ;
116
- const value = descriptor . value ;
117
- descriptor = {
118
- get : function ( ) {
119
- return renderLongStackTrace (
120
- parentTask . data && parentTask . data [ creationTrace ] ,
121
- delegateGet ? delegateGet . apply ( this ) : value ) ;
122
- }
123
- } ;
124
- Object . defineProperty ( error , 'stack' , descriptor ) ;
125
- stackSetSucceeded = true ;
126
- }
118
+ error . stack = ( error as any ) . longStack = longStack ;
127
119
} catch ( err ) {
128
120
}
129
- const longStack : string = stackSetSucceeded ?
130
- null :
131
- renderLongStackTrace ( parentTask . data && parentTask . data [ creationTrace ] , error . stack ) ;
132
- if ( ! stackSetSucceeded ) {
133
- try {
134
- stackSetSucceeded = error . stack = longStack ;
135
- } catch ( err ) {
136
- }
137
- }
138
- if ( ! stackSetSucceeded ) {
139
- try {
140
- stackSetSucceeded = ( error as any ) . longStack = longStack ;
141
- } catch ( err ) {
142
- }
143
- }
144
121
}
145
122
return parentZoneDelegate . handleError ( targetZone , error ) ;
146
123
}
@@ -161,11 +138,19 @@ function computeIgnoreFrames() {
161
138
for ( let i = 0 ; i < frames1 . length ; i ++ ) {
162
139
const frame1 = frames1 [ i ] ;
163
140
const frame2 = frames2 [ i ] ;
141
+ if ( ! sepTemplate && frame1 . indexOf ( ERROR_TAG ) == - 1 ) {
142
+ sepTemplate = frame1 . replace ( / ^ ( \s * ( a t ) ? \s * ) ( [ \w \/ \< ] + ) / , '$1' + SEP_TAG ) ;
143
+ }
164
144
if ( frame1 === frame2 ) {
165
- IGNORE_FRAMES . push ( frame1 ) ;
145
+ IGNORE_FRAMES [ frame1 ] = true ;
166
146
} else {
167
147
break ;
168
148
}
149
+ console . log ( '>>>>>>' , sepTemplate , frame1 ) ;
150
+ }
151
+ if ( ! sepTemplate ) {
152
+ // If we could not find it default to this text.
153
+ sepTemplate = SEP_TAG + '@[native code]' ;
169
154
}
170
155
}
171
156
computeIgnoreFrames ( ) ;
0 commit comments