import { IError } from '../models/IError'; import { IErrorParser } from 'IErrorParser'; import { IStackFrame } from '../models/IStackFrame'; import { EventPluginContext } from '../plugins/EventPluginContext'; export class WebErrorParser implements IErrorParser { public parse(context:EventPluginContext, exception:Error): Promise { return StackTrace.fromError(exception).then( (stackFrames: StackTrace.StackFrame[]) => this.processError(context, exception, stackFrames), () => this.onParseError(context) ); } private processError(context:EventPluginContext, exception:Error, stackFrames: StackTrace.StackFrame[]): Promise { var error:IError = { message: exception.message, stack_trace: this.getStackFrames(context, stackFrames || []) }; context.event.data['@error'] = error; return Promise.resolve(); } private onParseError(context:EventPluginContext): Promise { context.cancel = true; return Promise.reject(new Error('Unable to parse the exceptions stack trace. This exception will be discarded.')) } private getStackFrames(context:EventPluginContext, stackFrames:StackTrace.StackFrame[]): IStackFrame[] { var frames:IStackFrame[] = []; for (var index = 0; index < stackFrames.length; index++) { frames.push({ name: stackFrames[index].functionName, parameters: stackFrames[index].args, // TODO: need to verify arguments. file_name: stackFrames[index].fileName, line_number: stackFrames[index].lineNumber, column: stackFrames[index].columnNumber }); } return frames; } }