Skip to content

Commit

Permalink
feat(error): Make rx access Error.stack lazily
Browse files Browse the repository at this point in the history
Error.stack can potentially trigger expensive prepareStackTrace calls,
Observable.timeout would crate a TimeoutError on use, before the actual
error occurs. This eases tracing the location of the timeout, but with
the current implementation, slows down the application when using many
.timeout operators throughout the code.
  • Loading branch information
hermanbanken committed Aug 4, 2017
1 parent d2a32f9 commit dfcf919
Show file tree
Hide file tree
Showing 4 changed files with 42 additions and 18 deletions.
8 changes: 7 additions & 1 deletion src/util/ArgumentOutOfRangeError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,16 @@
* @class ArgumentOutOfRangeError
*/
export class ArgumentOutOfRangeError extends Error {
private err: Error;

constructor() {
const err: any = super('argument out of range');
this.err = err;
(<any> this).name = err.name = 'ArgumentOutOfRangeError';
(<any> this).stack = err.stack;
(<any> this).message = err.message;
}

get stack() {
return this.err.stack;
}
}
8 changes: 7 additions & 1 deletion src/util/EmptyError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -9,10 +9,16 @@
* @class EmptyError
*/
export class EmptyError extends Error {
private err: Error;

constructor() {
const err: any = super('no elements in sequence');
this.err = err;
(<any> this).name = err.name = 'EmptyError';
(<any> this).stack = err.stack;
(<any> this).message = err.message;
}

get stack() {
return this.err.stack;
}
}
8 changes: 7 additions & 1 deletion src/util/ObjectUnsubscribedError.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,16 @@
* @class ObjectUnsubscribedError
*/
export class ObjectUnsubscribedError extends Error {
private err: Error;

constructor() {
const err: any = super('object unsubscribed');
this.err = err;
(<any> this).name = err.name = 'ObjectUnsubscribedError';
(<any> this).stack = err.stack;
(<any> this).message = err.message;
}

get stack() {
return this.err.stack;
}
}
36 changes: 21 additions & 15 deletions src/util/TimeoutError.ts
Original file line number Diff line number Diff line change
@@ -1,15 +1,21 @@
/**
* An error thrown when duetime elapses.
*
* @see {@link timeout}
*
* @class TimeoutError
*/
export class TimeoutError extends Error {
constructor() {
const err: any = super('Timeout has occurred');
(<any> this).name = err.name = 'TimeoutError';
(<any> this).stack = err.stack;
(<any> this).message = err.message;
}
}
/**
* An error thrown when duetime elapses.
*
* @see {@link timeout}
*
* @class TimeoutError
*/
export class TimeoutError extends Error {
private err: Error;

constructor() {
const err: any = super('Timeout has occurred');
this.err = err;
(<any> this).name = err.name = 'TimeoutError';
(<any> this).message = err.message;
}

get stack() {
return this.err.stack;
}
}

0 comments on commit dfcf919

Please sign in to comment.