diff --git a/lib/Logger.js b/lib/Logger.js index a89a2c1..a477415 100644 --- a/lib/Logger.js +++ b/lib/Logger.js @@ -102,17 +102,18 @@ var Logger = function () { } var self = this; this._oldOnerrorHandler = window.error; - window.onerror = function handleGlobalError() { + window.onerror = function handleGlobalError(errorMsg, url, lineNumber, column, errorObj) { + self.error('Error: ' + errorMsg + ' Script: ' + url + ' Line: ' + lineNumber + ' Column: ' + column + ' StackTrace: ' + errorObj); self.flush(); if (self._oldOnerrorHandler) { - for (var _len = arguments.length, args = Array(_len), _key = 0; _key < _len; _key++) { - args[_key] = arguments[_key]; - } - - return self._oldOnerrorHandler.apply(this, args); + // eslint-disable-next-line + return self._oldOnerrorHandler.apply(this, arguments); } return false; }; + window.addEventListener('unhandledRejection', function (event) { + self.error('Unhandled promise rejection: ' + event.reason); + }); this._onErrorHandlerInstalled = true; } } diff --git a/lib/Logger.js.map b/lib/Logger.js.map index a8a26ec..934f078 100644 --- a/lib/Logger.js.map +++ b/lib/Logger.js.map @@ -1 +1 @@ -{"version":3,"sources":["../src/Logger.js"],"names":["Logger","url","maxBufferLength","automaticFlush","overwriteBuffer","fetchConfig","sessionIdRequired","__send__","fireOnGlobalErrors","interval","Error","extraParams","flush","bind","_onErrorHandlerInstalled","buffer","hooks","timer","registerErrorHandler","log","state","level","extra","isFull","shift","push","timestamp","Date","now","action","window","self","_oldOnerrorHandler","error","onerror","handleGlobalError","args","apply","_bufferUp","start","id","sessionId","undefined","key","value","message","method","body","JSON","stringify","headers","hook","forEach","getBuffer","logs","length","Promise","resolve","config","getFetchConfig","runHooks","report"],"mappings":";;;;;;;;;;AAAA;;;;AAEA;;;;AACA;;;;;;;;IAGMA,M;AACF,0BAUG;AAAA,YATCC,GASD,QATCA,GASD;AAAA,wCARCC,eAQD;AAAA,YARCA,eAQD,wCARmB,GAQnB;AAAA,uCAPCC,cAOD;AAAA,YAPCA,cAOD,uCAPkB,IAOlB;AAAA,wCANCC,eAMD;AAAA,YANCA,eAMD,wCANmB,IAMnB;AAAA,oCALCC,WAKD;AAAA,YALCA,WAKD,oCALe,EAKf;AAAA,yCAJCC,iBAID;AAAA,YAJCA,iBAID,yCAJqB,IAIrB;AAAA,YAHCC,QAGD,QAHCA,QAGD;AAAA,yCAFCC,kBAED;AAAA,YAFCA,kBAED,yCAFsB,IAEtB;AAAA,YADCC,QACD,QADCA,QACD;;AAAA;;AACC,YAAI,EAAE,gBAAgBT,MAAlB,CAAJ,EAA+B;AAC3B,mBAAO,IAAIA,MAAJ,CAAW,EAAX,CAAP;AACH;AACD,YAAI,OAAOC,GAAP,KAAe,WAAf,IAA8B,OAAOM,QAAP,KAAoB,WAAtD,EAAmE;AAC/D,kBAAM,IAAIG,KAAJ,CAAU,4BAAV,CAAN;AACH;;AAED,aAAKR,eAAL,GAAuBA,eAAvB;AACA,aAAKC,cAAL,GAAsBA,cAAtB;AACA,aAAKC,eAAL,GAAuBA,eAAvB;AACA,aAAKK,QAAL,GAAgBA,QAAhB;AACA,aAAKJ,WAAL,GAAmBA,WAAnB;AACA,aAAKJ,GAAL,GAAWA,GAAX;AACA,aAAKK,iBAAL,GAAyBA,iBAAzB;AACA,aAAKK,WAAL,GAAmB,EAAnB;AACA,aAAKC,KAAL,GAAa,KAAKA,KAAL,CAAWC,IAAX,CAAgB,IAAhB,CAAb;AACA,aAAKC,wBAAL,GAAgC,KAAhC;;AAEA;AACA,aAAKC,MAAL,GAAc,qBAAWb,eAAX,CAAd;AACA,aAAKc,KAAL,GAAa,EAAb;AACA,aAAKC,KAAL,GAAa,oBAAU,KAAKL,KAAf,EAAsBH,QAAtB,CAAb;;AAEA,YAAID,kBAAJ,EAAwB,KAAKU,oBAAL;AACxB,YAAIX,YAAY,OAAOA,QAAP,KAAoB,UAApC,EAAgD,KAAKA,QAAL,GAAgBA,QAAhB;AACnD;;;;kCAESY,G,EAAKC,K,EAAOC,K,EAAOC,K,EAAO;AAAA,gBAE5BP,MAF4B,GAI5B,IAJ4B,CAE5BA,MAF4B;AAAA,gBAG5BX,eAH4B,GAI5B,IAJ4B,CAG5BA,eAH4B;;;AAMhC,gBAAIW,OAAOQ,MAAP,EAAJ,EAAqB;AACjB;AACA,oBAAInB,eAAJ,EAAqBW,OAAOS,KAAP;AACxB;;AAED,gBAAIL,GAAJ,EAAS;AACLJ,uBAAOU,IAAP,CAAY;AACRC,+BAAWC,KAAKC,GAAL,EADH;AAERR,gCAFQ;AAGRE,gCAHQ;AAIRD,gCAJQ;AAKRQ,4BAAQV;AALA,iBAAZ;AAOH;AACJ;;;+CAEsB;AACnB,gBAAI,OAAOW,MAAP,KAAkB,WAAtB,EAAmC;AAC/B,oBAAI,KAAKhB,wBAAT,EAAmC;AAC/B;AACH;AACD,oBAAMiB,OAAO,IAAb;AACA,qBAAKC,kBAAL,GAA0BF,OAAOG,KAAjC;AACAH,uBAAOI,OAAP,GAAiB,SAASC,iBAAT,GAAoC;AACjDJ,yBAAKnB,KAAL;AACA,wBAAImB,KAAKC,kBAAT,EAA6B;AAAA,0DAFcI,IAEd;AAFcA,gCAEd;AAAA;;AACzB,+BAAOL,KAAKC,kBAAL,CAAwBK,KAAxB,CAA8B,IAA9B,EAAoCD,IAApC,CAAP;AACH;AACD,2BAAO,KAAP;AACH,iBAND;AAOA,qBAAKtB,wBAAL,GAAgC,IAAhC;AACH;AACJ;;;+BAEMO,K,EAAOF,G,EAAKC,K,EAAO;AAAA,gBAElBjB,cAFkB,GAMlB,IANkB,CAElBA,cAFkB;AAAA,gBAGlBM,QAHkB,GAMlB,IANkB,CAGlBA,QAHkB;AAAA,gBAIlBM,MAJkB,GAMlB,IANkB,CAIlBA,MAJkB;AAAA,gBAKlBJ,WALkB,GAMlB,IANkB,CAKlBA,WALkB;;AAOtB,iBAAK2B,SAAL,CAAenB,GAAf,EAAoBC,KAApB,EAA2BC,KAA3B,EAAkCV,WAAlC;AACA,gBAAIR,cAAJ,EAAoB;AAChB,oBAAIY,OAAOQ,MAAP,EAAJ,EAAqB;AACjB,yBAAKX,KAAL;AACH,iBAFD,MAEO,IAAIH,QAAJ,EAAc;AACjB,yBAAKQ,KAAL,CAAWsB,KAAX;AACH;AACJ;AACJ;;;qCAEYC,E,EAAI;AACb,iBAAKC,SAAL,GAAiBD,EAAjB;AACA,mBAAO,IAAP;AACH;;;yCAEgB;AACb,iBAAKC,SAAL,GAAiBC,SAAjB;AACH;;;uCAEcC,G,EAAKC,K,EAAO;AACvB,gBAAI,CAACD,GAAL,EAAU,MAAM,IAAIjC,KAAJ,CAAU,kBAAV,CAAN;AACV,iBAAKC,WAAL,CAAiBgC,GAAjB,IAAwBC,KAAxB;AACH;;;uCAEcC,O,EAAS;AACpB;AACIC,wBAAQ,MADZ;AAEIC,sBAAMC,KAAKC,SAAL,CAAe;AACjBJ,oCADiB;AAEjBJ,+BAAW,KAAKA;AAFC,iBAAf,CAFV;AAMIS,yBAAS;AACL,oCAAgB;AADX;AANb,eASO,KAAK7C,WATZ;AAWH;AACD;;;;gCACQ8C,I,EAAM;AACV,gBAAI,OAAOA,IAAP,KAAgB,UAApB,EAAgC,MAAM,IAAIzC,KAAJ,CAAU,cAAV,CAAN;AAChC,iBAAKM,KAAL,CAAWS,IAAX,CAAgB0B,IAAhB;AACA,mBAAO,IAAP;AACH;;;mCAEU;AAAA;;AACP,iBAAKnC,KAAL,CAAWoC,OAAX,CAAmB;AAAA,uBAAQD,KAAK,MAAKpC,MAAL,CAAYsC,SAAZ,EAAL,EAA8B,MAAKZ,SAAnC,CAAR;AAAA,aAAnB;AACH;;;gCAEO;AACJ,gBAAI,CAAC,KAAKnC,iBAAN,IAA2B,KAAKmC,SAApC,EAA+C;AAC3C,oBAAMa,OAAO,KAAKvC,MAAL,CAAYsC,SAAZ,EAAb;AACA,oBAAIC,KAAKC,MAAL,KAAgB,CAApB,EAAuB,OAAOC,QAAQC,OAAR,CAAgB,iBAAhB,CAAP;AACvB,oBAAMC,SAAS,KAAKC,cAAL,CAAoBL,IAApB,CAAf;AACA,qBAAKM,QAAL;AACA,qBAAK7C,MAAL,CAAYH,KAAZ;AACA,oBAAI,KAAKL,QAAT,EAAmB,OAAOiD,QAAQC,OAAR,CAAgB,KAAKlD,QAAL,CAAc+C,IAAd,EAAoB,KAAKb,SAAzB,CAAhB,CAAP;AACnB,uBAAO,+BAAM,KAAKxC,GAAX,EAAgByD,MAAhB,CAAP;AACH;AACD,mBAAOF,QAAQC,OAAR,CAAgB,4BAAhB,CAAP;AACH;;;6BAEItC,G,EAAKC,K,EAAO;AACb,iBAAKyC,MAAL,CAAY,MAAZ,EAAoB1C,GAApB,EAAyBC,KAAzB;AACH;;;6BACID,G,EAAKC,K,EAAO;AACb,iBAAKyC,MAAL,CAAY,MAAZ,EAAoB1C,GAApB,EAAyBC,KAAzB;AACH;;;8BACKD,G,EAAKC,K,EAAO;AACd,iBAAKyC,MAAL,CAAY,OAAZ,EAAqB1C,GAArB,EAA0BC,KAA1B;AACH;;;8BACKD,G,EAAKC,K,EAAO;AACd,iBAAKyC,MAAL,CAAY,OAAZ,EAAqB1C,GAArB,EAA0BC,KAA1B;AACH;;;8BACKD,G,EAAKC,K,EAAO;AACd,iBAAKyC,MAAL,CAAY,OAAZ,EAAqB1C,GAArB,EAA0BC,KAA1B;AACH;;;;;;kBAGUpB,M","file":"Logger.js","sourcesContent":["import fetch from 'isomorphic-fetch';\n\nimport Buffer from './Buffer';\nimport Timer from './Timer';\n\n\nclass Logger {\n constructor({\n url,\n maxBufferLength = 100,\n automaticFlush = true,\n overwriteBuffer = true,\n fetchConfig = {},\n sessionIdRequired = true,\n __send__,\n fireOnGlobalErrors = true,\n interval, // if interval is not set ( ), timer will not start\n }) {\n if (!(this instanceof Logger)) {\n return new Logger({});\n }\n if (typeof url === 'undefined' && typeof __send__ === 'undefined') {\n throw new Error('either set url or __send__');\n }\n\n this.maxBufferLength = maxBufferLength;\n this.automaticFlush = automaticFlush;\n this.overwriteBuffer = overwriteBuffer;\n this.interval = interval;\n this.fetchConfig = fetchConfig;\n this.url = url;\n this.sessionIdRequired = sessionIdRequired;\n this.extraParams = {};\n this.flush = this.flush.bind(this);\n this._onErrorHandlerInstalled = false;\n\n // eslint-disable-next-line no-buffer-constructor\n this.buffer = new Buffer(maxBufferLength);\n this.hooks = [];\n this.timer = new Timer(this.flush, interval);\n\n if (fireOnGlobalErrors) this.registerErrorHandler();\n if (__send__ && typeof __send__ === 'function') this.__send__ = __send__;\n }\n\n _bufferUp(log, state, level, extra) {\n const {\n buffer,\n overwriteBuffer,\n } = this;\n\n if (buffer.isFull()) {\n // if overwriteBuffer set to false, silently drop all new logs\n if (overwriteBuffer) buffer.shift();\n }\n\n if (log) {\n buffer.push({\n timestamp: Date.now(),\n state,\n extra,\n level,\n action: log,\n });\n }\n }\n\n registerErrorHandler() {\n if (typeof window !== 'undefined') {\n if (this._onErrorHandlerInstalled) {\n return;\n }\n const self = this;\n this._oldOnerrorHandler = window.error;\n window.onerror = function handleGlobalError(...args) {\n self.flush();\n if (self._oldOnerrorHandler) {\n return self._oldOnerrorHandler.apply(this, args);\n }\n return false;\n };\n this._onErrorHandlerInstalled = true;\n }\n }\n\n report(level, log, state) {\n const {\n automaticFlush,\n interval,\n buffer,\n extraParams,\n } = this;\n this._bufferUp(log, state, level, extraParams);\n if (automaticFlush) {\n if (buffer.isFull()) {\n this.flush();\n } else if (interval) {\n this.timer.start();\n }\n }\n }\n\n setSessionId(id) {\n this.sessionId = id;\n return this;\n }\n\n unsetSessionId() {\n this.sessionId = undefined;\n }\n\n setExtraParams(key, value) {\n if (!key) throw new Error('Key is undefined');\n this.extraParams[key] = value;\n }\n\n getFetchConfig(message) {\n return {\n method: 'POST',\n body: JSON.stringify({\n message,\n sessionId: this.sessionId,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n ...this.fetchConfig,\n };\n }\n // these will be called before sending logs\n addHook(hook) {\n if (typeof hook !== 'function') throw new Error('Invalid Hook');\n this.hooks.push(hook);\n return this;\n }\n\n runHooks() {\n this.hooks.forEach(hook => hook(this.buffer.getBuffer(), this.sessionId));\n }\n\n flush() {\n if (!this.sessionIdRequired || this.sessionId) {\n const logs = this.buffer.getBuffer();\n if (logs.length === 0) return Promise.resolve('No logs to send');\n const config = this.getFetchConfig(logs);\n this.runHooks();\n this.buffer.flush();\n if (this.__send__) return Promise.resolve(this.__send__(logs, this.sessionId));\n return fetch(this.url, config);\n }\n return Promise.resolve('Required sessionId not set');\n }\n\n info(log, state) {\n this.report('info', log, state);\n }\n warn(log, state) {\n this.report('warn', log, state);\n }\n error(log, state) {\n this.report('error', log, state);\n }\n debug(log, state) {\n this.report('debug', log, state);\n }\n emerg(log, state) {\n this.report('emerg', log, state);\n }\n}\n\nexport default Logger;\n"]} \ No newline at end of file +{"version":3,"sources":["../src/Logger.js"],"names":["Logger","url","maxBufferLength","automaticFlush","overwriteBuffer","fetchConfig","sessionIdRequired","__send__","fireOnGlobalErrors","interval","Error","extraParams","flush","bind","_onErrorHandlerInstalled","buffer","hooks","timer","registerErrorHandler","log","state","level","extra","isFull","shift","push","timestamp","Date","now","action","window","self","_oldOnerrorHandler","error","onerror","handleGlobalError","errorMsg","lineNumber","column","errorObj","apply","arguments","addEventListener","event","reason","_bufferUp","start","id","sessionId","undefined","key","value","message","method","body","JSON","stringify","headers","hook","forEach","getBuffer","logs","length","Promise","resolve","config","getFetchConfig","runHooks","report"],"mappings":"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","file":"Logger.js","sourcesContent":["import fetch from 'isomorphic-fetch';\n\nimport Buffer from './Buffer';\nimport Timer from './Timer';\n\n\nclass Logger {\n constructor({\n url,\n maxBufferLength = 100,\n automaticFlush = true,\n overwriteBuffer = true,\n fetchConfig = {},\n sessionIdRequired = true,\n __send__,\n fireOnGlobalErrors = true,\n interval, // if interval is not set ( ), timer will not start\n }) {\n if (!(this instanceof Logger)) {\n return new Logger({});\n }\n if (typeof url === 'undefined' && typeof __send__ === 'undefined') {\n throw new Error('either set url or __send__');\n }\n\n this.maxBufferLength = maxBufferLength;\n this.automaticFlush = automaticFlush;\n this.overwriteBuffer = overwriteBuffer;\n this.interval = interval;\n this.fetchConfig = fetchConfig;\n this.url = url;\n this.sessionIdRequired = sessionIdRequired;\n this.extraParams = {};\n this.flush = this.flush.bind(this);\n this._onErrorHandlerInstalled = false;\n\n // eslint-disable-next-line no-buffer-constructor\n this.buffer = new Buffer(maxBufferLength);\n this.hooks = [];\n this.timer = new Timer(this.flush, interval);\n\n if (fireOnGlobalErrors) this.registerErrorHandler();\n if (__send__ && typeof __send__ === 'function') this.__send__ = __send__;\n }\n\n _bufferUp(log, state, level, extra) {\n const {\n buffer,\n overwriteBuffer,\n } = this;\n\n if (buffer.isFull()) {\n // if overwriteBuffer set to false, silently drop all new logs\n if (overwriteBuffer) buffer.shift();\n }\n\n if (log) {\n buffer.push({\n timestamp: Date.now(),\n state,\n extra,\n level,\n action: log,\n });\n }\n }\n\n registerErrorHandler() {\n if (typeof window !== 'undefined') {\n if (this._onErrorHandlerInstalled) {\n return;\n }\n const self = this;\n this._oldOnerrorHandler = window.error;\n window.onerror = function handleGlobalError(errorMsg, url, lineNumber, column, errorObj) {\n self.error(`Error: ${errorMsg} Script: ${url} Line: ${lineNumber} Column: ${column} StackTrace: ${errorObj}`);\n self.flush();\n if (self._oldOnerrorHandler) {\n // eslint-disable-next-line\n return self._oldOnerrorHandler.apply(this, arguments);\n }\n return false;\n };\n window.addEventListener('unhandledRejection', (event) => {\n self.error(`Unhandled promise rejection: ${event.reason}`);\n });\n this._onErrorHandlerInstalled = true;\n }\n }\n\n report(level, log, state) {\n const {\n automaticFlush,\n interval,\n buffer,\n extraParams,\n } = this;\n this._bufferUp(log, state, level, extraParams);\n if (automaticFlush) {\n if (buffer.isFull()) {\n this.flush();\n } else if (interval) {\n this.timer.start();\n }\n }\n }\n\n setSessionId(id) {\n this.sessionId = id;\n return this;\n }\n\n unsetSessionId() {\n this.sessionId = undefined;\n }\n\n setExtraParams(key, value) {\n if (!key) throw new Error('Key is undefined');\n this.extraParams[key] = value;\n }\n\n getFetchConfig(message) {\n return {\n method: 'POST',\n body: JSON.stringify({\n message,\n sessionId: this.sessionId,\n }),\n headers: {\n 'Content-Type': 'application/json',\n },\n ...this.fetchConfig,\n };\n }\n // these will be called before sending logs\n addHook(hook) {\n if (typeof hook !== 'function') throw new Error('Invalid Hook');\n this.hooks.push(hook);\n return this;\n }\n\n runHooks() {\n this.hooks.forEach(hook => hook(this.buffer.getBuffer(), this.sessionId));\n }\n\n flush() {\n if (!this.sessionIdRequired || this.sessionId) {\n const logs = this.buffer.getBuffer();\n if (logs.length === 0) return Promise.resolve('No logs to send');\n const config = this.getFetchConfig(logs);\n this.runHooks();\n this.buffer.flush();\n if (this.__send__) return Promise.resolve(this.__send__(logs, this.sessionId));\n return fetch(this.url, config);\n }\n return Promise.resolve('Required sessionId not set');\n }\n\n info(log, state) { this.report('info', log, state); }\n warn(log, state) { this.report('warn', log, state); }\n error(log, state) { this.report('error', log, state); }\n debug(log, state) { this.report('debug', log, state); }\n emerg(log, state) { this.report('emerg', log, state); }\n}\n\nexport default Logger;\n"]} \ No newline at end of file diff --git a/src/Logger.js b/src/Logger.js index 01fb66c..9677996 100644 --- a/src/Logger.js +++ b/src/Logger.js @@ -72,13 +72,18 @@ class Logger { } const self = this; this._oldOnerrorHandler = window.error; - window.onerror = function handleGlobalError(...args) { + window.onerror = function handleGlobalError(errorMsg, url, lineNumber, column, errorObj) { + self.error(`Error: ${errorMsg} Script: ${url} Line: ${lineNumber} Column: ${column} StackTrace: ${errorObj}`); self.flush(); if (self._oldOnerrorHandler) { - return self._oldOnerrorHandler.apply(this, args); + // eslint-disable-next-line + return self._oldOnerrorHandler.apply(this, arguments); } return false; }; + window.addEventListener('unhandledRejection', (event) => { + self.error(`Unhandled promise rejection: ${event.reason}`); + }); this._onErrorHandlerInstalled = true; } }