1// Copyright (C) 2018 The Android Open Source Project 2// 3// Licensed under the Apache License, Version 2.0 (the "License"); 4// you may not use this file except in compliance with the License. 5// You may obtain a copy of the License at 6// 7// http://www.apache.org/licenses/LICENSE-2.0 8// 9// Unless required by applicable law or agreed to in writing, software 10// distributed under the License is distributed on an "AS IS" BASIS, 11// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. 12// See the License for the specific language governing permissions and 13// limitations under the License. 14 15export type ErrorHandler = (err: string) => void; 16 17let errorHandler: ErrorHandler = (_: string) => {}; 18 19export function assertExists<A>(value: A | null | undefined): A { 20 if (value === null || value === undefined) { 21 throw new Error('Value doesn\'t exist'); 22 } 23 return value; 24} 25 26export function assertTrue(value: boolean, optMsg?: string) { 27 if (value !== true) { 28 throw new Error(optMsg ? optMsg : 'Failed assertion'); 29 } 30} 31 32export function assertFalse(value: boolean, optMsg?: string) { 33 assertTrue(!value, optMsg); 34} 35 36export function setErrorHandler(handler: ErrorHandler) { 37 errorHandler = handler; 38} 39 40export function reportError(err: ErrorEvent|PromiseRejectionEvent|{}) { 41 let errLog = ''; 42 let errorObj = undefined; 43 44 if (err instanceof ErrorEvent) { 45 errLog = err.message; 46 errorObj = err.error; 47 } else if (err instanceof PromiseRejectionEvent) { 48 errLog = `${err.reason}`; 49 errorObj = err.reason; 50 } else { 51 errLog = `${err}`; 52 } 53 if (errorObj !== undefined) { 54 const errStack = (errorObj as {stack?: string}).stack; 55 errLog += '\n'; 56 errLog += errStack !== undefined ? errStack : JSON.stringify(errorObj); 57 } 58 errLog += `\n\nUA: ${navigator.userAgent}\n`; 59 60 console.error(errLog, err); 61 errorHandler(errLog); 62}