/** * @author [Tristan Valcke]{@link https://github.com/Itee} */ import { isDefined, isNotDefined, isObject, isString } from 'itee-validators' import { WebAPIMessage } from './WebAPIMessage' class WebAPIMessageError extends WebAPIMessage { static isWebAPIMessageError = true // Utils static isError ( value ) { return value instanceof Error || isObject( value ) && ( isDefined( value.name ) || isDefined( value.message ) || isDefined( value.stack ) ) } /** * * @param error */ constructor ( error ) { super( '_error' ) /** * The internal error to send * @type {{stack: string, name: string, message: string}} */ this.error = error } get error () { return this._error } set error ( value ) { if ( isNotDefined( value ) ) { throw new ReferenceError( `Expect a string, or Error like. But got value of '${ typeof value }' type: ${ JSON.stringify( value, null, 4 ) }` ) } if ( isString( value ) ) { this._error = { name: 'UnknownError', message: value } } else if ( WebAPIMessageError.isError( value ) ) { this._error = { name: value.name, message: value.message, stack: value.stack } } else { throw new TypeError( `Expect a string, or Error like. But got value of '${ typeof value }' type: ${ JSON.stringify( value, null, 4 ) }` ) } } // Serialization /** * * @returns {{id: String, type: String, name: String, stack: String, message: String}} */ toJSON () { return { ...super.toJSON(), ...{ error: this.error } } } } export { WebAPIMessageError }