Skip to content
This repository was archived by the owner on Apr 20, 2018. It is now read-only.

Commit 7aa3b80

Browse files
Adding partial long stack support
1 parent 31c671d commit 7aa3b80

27 files changed

+849
-48
lines changed

Gruntfile.js

Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -47,6 +47,11 @@ var browsers = [{
4747
'src/core/license.js',
4848
'src/core/intro.js',
4949
'src/core/basicheader-modern.js',
50+
51+
// Stack trace start
52+
'src/core/longstackbegin.js',
53+
'src/core/longstacktraces.js',
54+
5055
'src/core/enumeratorheader.js',
5156

5257
'src/core/deprecate.js',
@@ -312,6 +317,10 @@ var browsers = [{
312317
'src/core/subjects/asyncsubject.js',
313318
'src/core/subjects/anonymoussubject.js',
314319
'src/core/exports.js',
320+
321+
// Long stacktrace end
322+
'src/core/longstackend.js',
323+
315324
'src/core/outro.js'
316325
],
317326
dest: 'dist/rx.all.js'
@@ -321,6 +330,11 @@ var browsers = [{
321330
'src/core/license.js',
322331
'src/core/intro.js',
323332
'src/core/basicheader.js',
333+
334+
// Stack trace start
335+
'src/core/longstackbegin.js',
336+
'src/core/longstacktraces.js',
337+
324338
'src/core/enumeratorheader.js',
325339

326340
'src/core/deprecate.js',
@@ -586,6 +600,10 @@ var browsers = [{
586600
'src/core/subjects/asyncsubject.js',
587601
'src/core/subjects/anonymoussubject.js',
588602
'src/core/exports.js',
603+
604+
// End long stack traces
605+
'src/core/longstackend.js',
606+
589607
'src/core/outro.js'
590608
],
591609
dest: 'dist/rx.all.compat.js'
@@ -595,6 +613,11 @@ var browsers = [{
595613
'src/core/license.js',
596614
'src/core/intro.js',
597615
'src/core/basicheader.js',
616+
617+
// Stack trace start
618+
'src/core/longstackbegin.js',
619+
'src/core/longstacktraces.js',
620+
598621
'src/core/enumeratorheader.js',
599622

600623
'src/core/deprecate.js',
@@ -717,6 +740,9 @@ var browsers = [{
717740
'src/core/subjects/asyncsubject.js',
718741
'src/core/subjects/anonymoussubject.js',
719742
'src/core/exports.js',
743+
744+
'src/core/longstackend.js',
745+
720746
'src/core/outro.js'
721747
],
722748
dest: 'dist/rx.compat.js'
@@ -726,6 +752,11 @@ var browsers = [{
726752
'src/core/license.js',
727753
'src/core/intro.js',
728754
'src/core/basicheader-modern.js',
755+
756+
// Stack trace start
757+
'src/core/longstackbegin.js',
758+
'src/core/longstacktraces.js',
759+
729760
'src/core/enumeratorheader.js',
730761

731762
'src/core/deprecate.js',
@@ -848,6 +879,10 @@ var browsers = [{
848879
'src/core/subjects/asyncsubject.js',
849880
'src/core/subjects/anonymoussubject.js',
850881
'src/core/exports.js',
882+
883+
// Long stack trace end
884+
'src/core/longstackend.js',
885+
851886
'src/core/outro.js'
852887
],
853888
dest: 'dist/rx.js'
@@ -857,6 +892,11 @@ var browsers = [{
857892
'src/core/license.js',
858893
'src/core/intro.js',
859894
'src/core/liteheader.js',
895+
896+
// Stack trace start
897+
'src/core/longstackbegin.js',
898+
'src/core/longstacktraces.js',
899+
860900
'src/core/enumeratorheader.js',
861901

862902
'src/core/deprecate.js',
@@ -1001,6 +1041,10 @@ var browsers = [{
10011041
'src/core/subjects/replaysubject.js',
10021042

10031043
'src/core/exports.js',
1044+
1045+
// End long stack traces
1046+
'src/core/longstackend.js',
1047+
10041048
'src/core/outro.js'
10051049
],
10061050
dest: 'dist/rx.lite.js'
@@ -1010,6 +1054,11 @@ var browsers = [{
10101054
'src/core/license.js',
10111055
'src/core/intro.js',
10121056
'src/core/liteheader-compat.js',
1057+
1058+
// Stack trace start
1059+
'src/core/longstackbegin.js',
1060+
'src/core/longstacktraces.js',
1061+
10131062
'src/core/enumeratorheader.js',
10141063

10151064
'src/core/deprecate.js',
@@ -1153,6 +1202,10 @@ var browsers = [{
11531202
'src/core/subjects/replaysubject.js',
11541203

11551204
'src/core/exports.js',
1205+
1206+
// End long stack traces
1207+
'src/core/longstackend.js',
1208+
11561209
'src/core/outro.js'
11571210
],
11581211
dest: 'dist/rx.lite.compat.js'

bower.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "rxjs",
3-
"version": "2.3.18",
3+
"version": "2.3.19",
44
"main": [
55
"dist/rx.all.js",
66
"dist/rx.all.map",

dist/rx.all.compat.js

Lines changed: 121 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -24,7 +24,7 @@
2424
var Rx = {
2525
internals: {},
2626
config: {
27-
Promise: root.Promise // Detect if promise exists
27+
Promise: root.Promise,
2828
},
2929
helpers: { }
3030
};
@@ -66,6 +66,104 @@
6666
var objectDisposed = 'Object has been disposed';
6767
function checkDisposed() { if (this.isDisposed) { throw new Error(objectDisposed); } }
6868

69+
Rx.config.longStackSupport = false;
70+
var hasStacks = false;
71+
try {
72+
throw new Error();
73+
} catch (e) {
74+
hasStacks = !!e.stack;
75+
}
76+
77+
// All code after this point will be filtered from stack traces reported by RxJS
78+
var rStartingLine = captureLine(), rFileName;
79+
80+
var STACK_JUMP_SEPARATOR = "From previous event:";
81+
82+
function makeStackTraceLong(error, observable) {
83+
// If possible, transform the error stack trace by removing Node and RxJS
84+
// cruft, then concatenating with the stack trace of `observable`.
85+
if (hasStacks &&
86+
observable.stack &&
87+
typeof error === "object" &&
88+
error !== null &&
89+
error.stack &&
90+
error.stack.indexOf(STACK_JUMP_SEPARATOR) === -1
91+
) {
92+
var stacks = [];
93+
for (var o = observer; !!o; o = o.source) {
94+
if (o.stack) {
95+
stacks.unshift(o.stack);
96+
}
97+
}
98+
stacks.unshift(error.stack);
99+
100+
var concatedStacks = stacks.join("\n" + STACK_JUMP_SEPARATOR + "\n");
101+
error.stack = filterStackString(concatedStacks);
102+
}
103+
}
104+
105+
function filterStackString(stackString) {
106+
var lines = stackString.split("\n"),
107+
desiredLines = [];
108+
for (var i = 0, len = lines.length; i < len; i++) {
109+
var line = lines[i];
110+
111+
if (!isInternalFrame(line) && !isNodeFrame(line) && line) {
112+
desiredLines.push(line);
113+
}
114+
}
115+
return desiredLines.join("\n");
116+
}
117+
118+
function isInternalFrame(stackLine) {
119+
var fileNameAndLineNumber = getFileNameAndLineNumber(stackLine);
120+
if (!fileNameAndLineNumber) {
121+
return false;
122+
}
123+
var fileName = fileNameAndLineNumber[0], lineNumber = fileNameAndLineNumber[1];
124+
125+
console.log(rFileName, rStartingLine, rEndingLine);
126+
127+
return fileName === rFileName &&
128+
lineNumber >= rStartingLine &&
129+
lineNumber <= rEndingLine;
130+
}
131+
132+
function isNodeFrame(stackLine) {
133+
return stackLine.indexOf("(module.js:") !== -1 ||
134+
stackLine.indexOf("(node.js:") !== -1;
135+
}
136+
137+
function captureLine() {
138+
if (!hasStacks) { return; }
139+
140+
try {
141+
throw new Error();
142+
} catch (e) {
143+
var lines = e.stack.split("\n");
144+
var firstLine = lines[0].indexOf("@") > 0 ? lines[1] : lines[2];
145+
var fileNameAndLineNumber = getFileNameAndLineNumber(firstLine);
146+
if (!fileNameAndLineNumber) { return; }
147+
148+
rFileName = fileNameAndLineNumber[0];
149+
return fileNameAndLineNumber[1];
150+
}
151+
}
152+
153+
function getFileNameAndLineNumber(stackLine) {
154+
// Named functions: "at functionName (filename:lineNumber:columnNumber)"
155+
var attempt1 = /at .+ \((.+):(\d+):(?:\d+)\)$/.exec(stackLine);
156+
if (attempt1) { return [attempt1[1], Number(attempt1[2])]; }
157+
158+
// Anonymous functions: "at filename:lineNumber:columnNumber"
159+
var attempt2 = /at ([^ ]+):(\d+):(?:\d+)$/.exec(stackLine);
160+
if (attempt2) { return [attempt2[1], Number(attempt2[2])]; }
161+
162+
// Firefox style: "function@filename:lineNumber or @filename:lineNumber"
163+
var attempt3 = /.*@(.+):(\d+)$/.exec(stackLine);
164+
if (attempt3) { return [attempt3[1], Number(attempt3[2])]; }
165+
}
166+
69167
// Shim in iterator support
70168
var $iterator$ = (typeof Symbol === 'function' && Symbol.iterator) ||
71169
'_es6shim_iterator_';
@@ -1327,7 +1425,7 @@ if (!Array.prototype.forEach) {
13271425
tasks = {},
13281426
taskId = 0;
13291427

1330-
function onGlobalPostMessage(event) {
1428+
var onGlobalPostMessage = function (event) {
13311429
// Only if we're a match to avoid any other global events
13321430
if (typeof event.data === 'string' && event.data.substring(0, MSG_PREFIX.length) === MSG_PREFIX) {
13331431
var handleId = event.data.substring(MSG_PREFIX.length),
@@ -2084,6 +2182,24 @@ if (!Array.prototype.forEach) {
20842182
var Observable = Rx.Observable = (function () {
20852183

20862184
function Observable(subscribe) {
2185+
if (Rx.config.longStackSupport && hasStacks) {
2186+
try {
2187+
throw new Error();
2188+
} catch (e) {
2189+
this.stack = e.stack.substring(e.stack.indexOf("\n") + 1);
2190+
}
2191+
2192+
var self = this;
2193+
this._subscribe = function (observer) {
2194+
observer.onError = function (err) {
2195+
makeStackTraceLong(self, err);
2196+
observer.onError(err);
2197+
};
2198+
2199+
subscribe(observer);
2200+
};
2201+
}
2202+
20872203
this._subscribe = subscribe;
20882204
}
20892205

@@ -9588,4 +9704,7 @@ if (!Array.prototype.forEach) {
95889704
root.Rx = Rx;
95899705
}
95909706

9707+
// All code before this point will be filtered from stack traces.
9708+
var rEndingLine = captureLine();
9709+
95919710
}.call(this));

dist/rx.all.compat.map

Lines changed: 1 addition & 1 deletion
Large diffs are not rendered by default.

dist/rx.all.compat.min.js

Lines changed: 3 additions & 3 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

0 commit comments

Comments
 (0)