From 389df2956a56658ca5612b6a970808d4c7482315 Mon Sep 17 00:00:00 2001 From: Pavel Khudyakov Date: Fri, 25 Apr 2014 15:10:44 +0600 Subject: [PATCH] dip @axlerk @zhigalov --- .../error-formatter/object-error-formatter.js | 11 ++++++ .../error-formatter/string-error-formatter.js | 10 +++++ .../error-handlers/debounce-error-logger.js | 17 +++++++++ .../error-handlers/error-logger.js | 8 ++++ .../error-handlers/full-error-logger.js | 10 +++++ tasks/dip/refactoring/logger.js | 37 +++++++++---------- .../network-adapters/localstorage.js | 16 ++++++++ .../refactoring/network-adapters/yaCouner.js | 13 +++++++ tasks/dip/refactoring/util/browser.js | 10 +++++ 9 files changed, 113 insertions(+), 19 deletions(-) create mode 100644 tasks/dip/refactoring/error-formatter/object-error-formatter.js create mode 100644 tasks/dip/refactoring/error-formatter/string-error-formatter.js create mode 100644 tasks/dip/refactoring/error-handlers/debounce-error-logger.js create mode 100644 tasks/dip/refactoring/error-handlers/error-logger.js create mode 100644 tasks/dip/refactoring/error-handlers/full-error-logger.js create mode 100644 tasks/dip/refactoring/network-adapters/localstorage.js create mode 100644 tasks/dip/refactoring/network-adapters/yaCouner.js create mode 100644 tasks/dip/refactoring/util/browser.js diff --git a/tasks/dip/refactoring/error-formatter/object-error-formatter.js b/tasks/dip/refactoring/error-formatter/object-error-formatter.js new file mode 100644 index 0000000..694e08b --- /dev/null +++ b/tasks/dip/refactoring/error-formatter/object-error-formatter.js @@ -0,0 +1,11 @@ +var browser = require('../util/browser'); + +module.exports = function (options) { + return { + type: 'handle', + hostname: location.hostname, + message: options.message, + location: options.file + ':' + options.line + ':' + (options.column || 0), + browser: browser + } +} \ No newline at end of file diff --git a/tasks/dip/refactoring/error-formatter/string-error-formatter.js b/tasks/dip/refactoring/error-formatter/string-error-formatter.js new file mode 100644 index 0000000..54ac943 --- /dev/null +++ b/tasks/dip/refactoring/error-formatter/string-error-formatter.js @@ -0,0 +1,10 @@ +var browser = require('../util/browser'); + +module.exports = function (options) { + return + 'type: ' + 'handle' + + '; hostname: ' + location.hostname + + '; message: ' + options.message + + '; location: ' + options.file + ':' + options.line + ':' + (options.column || 0) + + '; browser: ' + browser; +} \ No newline at end of file diff --git a/tasks/dip/refactoring/error-handlers/debounce-error-logger.js b/tasks/dip/refactoring/error-handlers/debounce-error-logger.js new file mode 100644 index 0000000..017e002 --- /dev/null +++ b/tasks/dip/refactoring/error-handlers/debounce-error-logger.js @@ -0,0 +1,17 @@ +var ErrorLogger = require('./error-logger'), + _ = require('lodash'), + debounce = require(debounce); + +var DebounceErrorLogger = function (options) { + this._repeatTime = options.repeatTime; + this._needFirst = options.needFirst; + this._adapter = options.adapter; +}; + +_.extend(DebounceErrorLogger.prototype, ErrorLogger.prototype, { + handle: debounce(function (options) { + this._adapter(options); + }, this._repeatTime, this._needFirst) +}); + +module.exports = DebounceErrorLogger; \ No newline at end of file diff --git a/tasks/dip/refactoring/error-handlers/error-logger.js b/tasks/dip/refactoring/error-handlers/error-logger.js new file mode 100644 index 0000000..ef32a17 --- /dev/null +++ b/tasks/dip/refactoring/error-handlers/error-logger.js @@ -0,0 +1,8 @@ +var ErrorLogger = function (options) { +}; + +ErrorLogger.prototype.handle = function (options) { + new Error('Not implemented exception'); +}; + +module.exports = ErrorLogger; \ No newline at end of file diff --git a/tasks/dip/refactoring/error-handlers/full-error-logger.js b/tasks/dip/refactoring/error-handlers/full-error-logger.js new file mode 100644 index 0000000..6f3b2b0 --- /dev/null +++ b/tasks/dip/refactoring/error-handlers/full-error-logger.js @@ -0,0 +1,10 @@ +var ErrorLogger = require('./error-logger'), + _ = require('lodash'); + +var FullErrorLogger = function (options) { + this._adapter = options.adapter; +} + +_.extend(FullErrorLogger.prototype, ErrorLogger.prototype, { handle: adapter }) + +module.exports = FullErrorLogger; diff --git a/tasks/dip/refactoring/logger.js b/tasks/dip/refactoring/logger.js index cfb7418..01f4038 100644 --- a/tasks/dip/refactoring/logger.js +++ b/tasks/dip/refactoring/logger.js @@ -1,22 +1,21 @@ -var debounce = require('debounce'); - -var browser = navigator.userAgent.match(/[a-zA-Z]+\/[0-9.A-F]+/g) - .filter(function (string) { - return !/^(AppleWebKit|WebKit|Safari|Gecko|Mozilla)/.test(string); - }) - .map(function (string) { - return string.replace(/^Version/, 'Safari'); - }) - .join(' '); +var ErrorLogger = require('./error-handlers/debounce-error-logger'), + repeatTime = 1000, + needFirst = true, + formatter = ('./error-formater/object-error-formatter'), + adapter = require('./network-adapters/yaCounter')(yaCounter12208345, formatter); module.exports = function () { - window.onerror = debounce(function (message, file, line, column) { - yaCounter12208345.params( - 'error', - location.hostname, - message, - file + ':' + line + ':' + (column || 0), - browser - ); - }, 1000, true); + var logger = new ErrorLogger({ + repeatTime: repeatTime, + needFirst: needFirst, + adapter: adapter + }); + window.onerror = function (message, file, line, column) { + logger.handle({ + message: message, + file: file, + line: line, + column: column + }); + }; }; diff --git a/tasks/dip/refactoring/network-adapters/localstorage.js b/tasks/dip/refactoring/network-adapters/localstorage.js new file mode 100644 index 0000000..f262bd6 --- /dev/null +++ b/tasks/dip/refactoring/network-adapters/localstorage.js @@ -0,0 +1,16 @@ +function isAvailableLocalStorage() { + try { + return 'localStorage' in window && window['localStorage'] !== null; + } catch (e) { + return false; + } +} + +module.exports = function (formatter) { + var noop = function () { + }; + return isAvailableLocalStorage() ? function (options) { + var data = formatter(options); + localStorage["log" + (+new Date())] = data; + } : noop; +} diff --git a/tasks/dip/refactoring/network-adapters/yaCouner.js b/tasks/dip/refactoring/network-adapters/yaCouner.js new file mode 100644 index 0000000..bec9904 --- /dev/null +++ b/tasks/dip/refactoring/network-adapters/yaCouner.js @@ -0,0 +1,13 @@ +module.exports = function (counter, formatter) { + return function (options) { + var data = formatter(options); + + counter.params( + data.type, + data.hostname, + data.message, + data.location, + data.browser + ); + } +} \ No newline at end of file diff --git a/tasks/dip/refactoring/util/browser.js b/tasks/dip/refactoring/util/browser.js new file mode 100644 index 0000000..b971de2 --- /dev/null +++ b/tasks/dip/refactoring/util/browser.js @@ -0,0 +1,10 @@ +var Browser = navigator.userAgent.match(/[a-zA-Z]+\/[0-9.A-F]+/g) + .filter(function (string) { + return !/^(AppleWebKit|WebKit|Safari|Gecko|Mozilla)/.test(string); + }) + .map(function (string) { + return string.replace(/^Version/, 'Safari'); + }) + .join(' '); + +module.exports = Browser; \ No newline at end of file