From c65fe952d180c093f80ce846983ff8f384b11038 Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Sat, 16 Jan 2016 14:31:18 +0100 Subject: [PATCH 01/17] Added support for wallaby --- src/queue/DefaultEventQueue-spec.ts | 23 ++++++++++++++++------- wallaby.js | 26 ++++++++++++++++++++++++++ 2 files changed, 42 insertions(+), 7 deletions(-) create mode 100644 wallaby.js diff --git a/src/queue/DefaultEventQueue-spec.ts b/src/queue/DefaultEventQueue-spec.ts index 6ec9d212..3bd8fded 100644 --- a/src/queue/DefaultEventQueue-spec.ts +++ b/src/queue/DefaultEventQueue-spec.ts @@ -3,25 +3,36 @@ import { IEvent } from '../models/IEvent'; import { expect } from 'chai'; describe('DefaultEventQueue', () => { + + let config: Configuration; + + beforeEach(() => { + config = getConfiguration(); + }); + + afterEach(() => { + let queue = config.queue; + clearInterval(queue._queueTimer); + config = null; + }); + function getConfiguration(): Configuration { - let config: Configuration = new Configuration({ + let result: Configuration = new Configuration({ apiKey: 'LhhP1C9gijpSKCslHHCvwdSIz298twx271n1l6xw', serverUrl: 'http://localhost:50000' }); - expect(config.storage.getList().length).to.equal(0); - return config; + expect(result.storage.getList().length).to.equal(0); + return result; } it('should enqueue event', () => { - let config: Configuration = getConfiguration(); let event: IEvent = { type: 'log', reference_id: '123454321' }; config.queue.enqueue(event); expect(config.storage.getList().length).to.equal(1); }); it('should process queue', () => { - let config: Configuration = getConfiguration(); let event: IEvent = { type: 'log', reference_id: '123454321' }; config.queue.enqueue(event); expect(config.storage.getList().length).to.equal(1); @@ -35,7 +46,6 @@ describe('DefaultEventQueue', () => { }); it('should discard event submission', () => { - let config: Configuration = getConfiguration(); config.queue.suspendProcessing(1, true); let event: IEvent = { type: 'log', reference_id: '123454321' }; @@ -44,7 +54,6 @@ describe('DefaultEventQueue', () => { }); it('should suspend processing', (done) => { - let config: Configuration = getConfiguration(); config.queue.suspendProcessing(.0001); let event: IEvent = { type: 'log', reference_id: '123454321' }; diff --git a/wallaby.js b/wallaby.js new file mode 100644 index 00000000..a55fbf67 --- /dev/null +++ b/wallaby.js @@ -0,0 +1,26 @@ +module.exports = function (wallaby) { + + return { + files: [ + 'src/**/*.ts', + { + pattern: 'src/**/*-spec.ts', + ignore: true + } + ], + + testFramework: 'mocha', + + tests: [ + 'src/**/*-spec.ts' + ], + + env: { + type: 'node' + }, + + compilers: { + 'src/**/*.ts': wallaby.compilers.typeScript({ module: true }) + } + }; +}; From 726194329c87999b536e35316891a1fe8308ff7c Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Sat, 16 Jan 2016 19:23:27 +0100 Subject: [PATCH 02/17] Changed IStorage to non-generic Content type is not enforced, and we use one common storage for heterogeneous data (events and configuration data). --- src/configuration/Configuration.ts | 4 ++-- src/configuration/IConfigurationSettings.ts | 2 +- src/storage/IStorage.ts | 8 ++++---- src/storage/IStorageItem.ts | 4 ++-- src/storage/InMemoryStorage-spec.ts | 20 ++++++++++---------- src/storage/InMemoryStorage.ts | 14 +++++++------- 6 files changed, 26 insertions(+), 26 deletions(-) diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts index 9efd52fa..baed0595 100644 --- a/src/configuration/Configuration.ts +++ b/src/configuration/Configuration.ts @@ -76,7 +76,7 @@ export class Configuration implements IConfigurationSettings { */ public settings: Object = {}; - public storage: IStorage; + public storage: IStorage; public queue: IEventQueue; @@ -106,7 +106,7 @@ export class Configuration implements IConfigurationSettings { this.submissionBatchSize = inject(configSettings.submissionBatchSize) || 50; this.submissionAdapter = inject(configSettings.submissionAdapter); this.submissionClient = inject(configSettings.submissionClient) || new DefaultSubmissionClient(); - this.storage = inject(configSettings.storage) || new InMemoryStorage(); + this.storage = inject(configSettings.storage) || new InMemoryStorage(); this.queue = inject(configSettings.queue) || new DefaultEventQueue(this); SettingsManager.applySavedServerSettings(this); diff --git a/src/configuration/IConfigurationSettings.ts b/src/configuration/IConfigurationSettings.ts index 71a7a3e2..4f5dffcb 100644 --- a/src/configuration/IConfigurationSettings.ts +++ b/src/configuration/IConfigurationSettings.ts @@ -21,6 +21,6 @@ export interface IConfigurationSettings { submissionBatchSize?: number; submissionClient?: ISubmissionClient; submissionAdapter?: ISubmissionAdapter; - storage?: IStorage; + storage?: IStorage; queue?: IEventQueue; } diff --git a/src/storage/IStorage.ts b/src/storage/IStorage.ts index 397456af..71adeb48 100644 --- a/src/storage/IStorage.ts +++ b/src/storage/IStorage.ts @@ -1,8 +1,8 @@ import { IStorageItem } from './IStorageItem'; -export interface IStorage { - save(path: string, value: T): boolean; - get(path: string): T; - getList(searchPattern?: string, limit?: number): IStorageItem[]; +export interface IStorage { + save(path: string, value: any): boolean; + get(path: string): any; + getList(searchPattern?: string, limit?: number): IStorageItem[]; remove(path: string): void; } diff --git a/src/storage/IStorageItem.ts b/src/storage/IStorageItem.ts index c80de13a..b99457fa 100644 --- a/src/storage/IStorageItem.ts +++ b/src/storage/IStorageItem.ts @@ -1,5 +1,5 @@ -export interface IStorageItem { +export interface IStorageItem { created: number; path: string; - value: T; + value: any; } diff --git a/src/storage/InMemoryStorage-spec.ts b/src/storage/InMemoryStorage-spec.ts index 92e93d6a..e9db8dba 100644 --- a/src/storage/InMemoryStorage-spec.ts +++ b/src/storage/InMemoryStorage-spec.ts @@ -5,7 +5,7 @@ import { expect } from 'chai'; describe('InMemoryStorage', () => { it('should save events', () => { - let storage = new InMemoryStorage(); + let storage = new InMemoryStorage(); let key = 'ex-q-'; let event1: IEvent = { type: 'log', reference_id: key + '123454321' }; let event2: IEvent = { type: 'log', reference_id: key + '098765432' }; @@ -20,7 +20,7 @@ describe('InMemoryStorage', () => { }); it('should save once', () => { - let storage = new InMemoryStorage(); + let storage = new InMemoryStorage(); storage.save('one', 1); expect(storage.getList().length).to.equal(1); storage.save('one', 1); @@ -28,7 +28,7 @@ describe('InMemoryStorage', () => { }); it('should get by key', () => { - let storage = new InMemoryStorage(); + let storage = new InMemoryStorage(); storage.save('ex-server-settings.json-version', 1); storage.save('ex-server-settings.json', { exist: true }); expect(storage.getList().length).to.equal(2); @@ -37,7 +37,7 @@ describe('InMemoryStorage', () => { }); it('should get saved events', () => { - let storage = new InMemoryStorage(); + let storage = new InMemoryStorage(); let key = 'ex-q-'; let event1: IEvent = { type: 'log', reference_id: key + '11' }; let event2: IEvent = { type: 'log', reference_id: key + '12' }; @@ -81,7 +81,7 @@ describe('InMemoryStorage', () => { }); it('should clear all events', () => { - let storage = new InMemoryStorage(); + let storage = new InMemoryStorage(); let key = 'ex-q-'; let event1: IEvent = { type: 'log', reference_id: key + '11' }; let event2: IEvent = { type: 'log', reference_id: key + '12' }; @@ -111,7 +111,7 @@ describe('InMemoryStorage', () => { }); it('should get with limit', () => { - let storage = new InMemoryStorage(250); + let storage = new InMemoryStorage(250); for (let index: number = 0; index < 260; index++) { storage.save('ex-q-' + index, { type: 'log', reference_id: index.toString() }); } @@ -127,7 +127,7 @@ describe('InMemoryStorage', () => { } const DATE: Date = new Date(); - let storage = new InMemoryStorage(); + let storage = new InMemoryStorage(); for (let index: number = 0; index < 10; index++) { storage.save('ex-q-' + index, { date: getDate(DATE, index), @@ -139,7 +139,7 @@ describe('InMemoryStorage', () => { } let offset: number = 0; - let events: IStorageItem[] = storage.getList('ex-q-', 2); + let events: IStorageItem[] = storage.getList('ex-q-', 2); while (events && events.length > 0) { expect(2).to.equal(events.length); for (let ei = 0; ei < 2; ei++) { @@ -152,12 +152,12 @@ describe('InMemoryStorage', () => { }); it('should respect max items limit', () => { - let storage = new InMemoryStorage(5); + let storage = new InMemoryStorage(5); for (let index: number = 0; index < 5; index++) { storage.save('ex-q-' + index, { type: 'log', reference_id: index.toString() }); } - let events: IStorageItem[] = storage.getList(); + let events: IStorageItem[] = storage.getList(); expect(events.length).to.equal(5); expect(events[0].path).to.equal('ex-q-0'); storage.save('ex-q-6', { type: 'log', reference_id: '6' }); diff --git a/src/storage/InMemoryStorage.ts b/src/storage/InMemoryStorage.ts index cd89e43f..67ba971c 100644 --- a/src/storage/InMemoryStorage.ts +++ b/src/storage/InMemoryStorage.ts @@ -1,15 +1,15 @@ import { IStorage } from './IStorage'; import { IStorageItem } from './IStorageItem'; -export class InMemoryStorage implements IStorage { - private _items: IStorageItem[] = []; +export class InMemoryStorage implements IStorage { + private _items: IStorageItem[] = []; private _maxItems: number; constructor(maxItems?: number) { this._maxItems = maxItems > 0 ? maxItems : 250; } - public save(path: string, value: T): boolean { + public save(path: string, value: any): boolean { if (!path || !value) { return false; } @@ -22,19 +22,19 @@ export class InMemoryStorage implements IStorage { return true; } - public get(path: string): T { - let item: IStorageItem = path ? this.getList(`^${path}$`, 1)[0] : null; + public get(path: string): any { + let item: IStorageItem = path ? this.getList(`^${path}$`, 1)[0] : null; return item ? item.value : null; } - public getList(searchPattern?: string, limit?: number): IStorageItem[] { + public getList(searchPattern?: string, limit?: number): IStorageItem[] { let items = this._items; // Optimization for minifier if (!searchPattern) { return items.slice(0, limit); } let regex = new RegExp(searchPattern); - let results: IStorageItem[] = []; + let results: IStorageItem[] = []; for (let index = 0; index < items.length; index++) { if (regex.test(items[index].path)) { results.push(items[index]); From 87e2ca24a5638f381866eaadb096cf623c22bb3e Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Tue, 26 Jan 2016 00:58:44 +0100 Subject: [PATCH 03/17] NodeFileStorage: Initial commit - Added NodeFileStorage - Added DevDependency: mock-fs (https://github.com/tschaub/mock-fs) - Modified InMemoryStorage specs to work for both kinds of storage implementations --- package.json | 1 + src/storage/InMemoryStorage-spec.ts | 169 ------------------- src/storage/NodeFileStorage.ts | 160 ++++++++++++++++++ src/storage/Storage-spec.ts | 243 ++++++++++++++++++++++++++++ tsd.json | 5 +- 5 files changed, 408 insertions(+), 170 deletions(-) delete mode 100644 src/storage/InMemoryStorage-spec.ts create mode 100644 src/storage/NodeFileStorage.ts create mode 100644 src/storage/Storage-spec.ts diff --git a/package.json b/package.json index 3ba4b52f..ece40fab 100644 --- a/package.json +++ b/package.json @@ -41,6 +41,7 @@ "gulp-wrap-umd": "0.2.1", "rimraf": "2.5.1", "source-map-support": "0.4.0", + "mock-fs": "3.6.0", "tracekit": "0.3.1", "tslint": "3.3.0", "tsproject": "1.2.0-rc.4", diff --git a/src/storage/InMemoryStorage-spec.ts b/src/storage/InMemoryStorage-spec.ts deleted file mode 100644 index e9db8dba..00000000 --- a/src/storage/InMemoryStorage-spec.ts +++ /dev/null @@ -1,169 +0,0 @@ -import { IEvent } from '../models/IEvent'; -import { InMemoryStorage } from './InMemoryStorage'; -import { IStorageItem } from './IStorageItem'; -import { expect } from 'chai'; - -describe('InMemoryStorage', () => { - it('should save events', () => { - let storage = new InMemoryStorage(); - let key = 'ex-q-'; - let event1: IEvent = { type: 'log', reference_id: key + '123454321' }; - let event2: IEvent = { type: 'log', reference_id: key + '098765432' }; - expect(storage.getList().length).to.equal(0); - storage.save(event1.reference_id, event1); - expect(storage.getList().length).to.equal(1); - expect(storage.getList(key).length).to.equal(1); - storage.save(event2.reference_id, event2); - expect(storage.getList().length).to.equal(2); - expect(storage.getList(key).length).to.equal(2); - expect(storage.getList(key + '1').length).to.equal(1); - }); - - it('should save once', () => { - let storage = new InMemoryStorage(); - storage.save('one', 1); - expect(storage.getList().length).to.equal(1); - storage.save('one', 1); - expect(storage.getList().length).to.equal(1); - }); - - it('should get by key', () => { - let storage = new InMemoryStorage(); - storage.save('ex-server-settings.json-version', 1); - storage.save('ex-server-settings.json', { exist: true }); - expect(storage.getList().length).to.equal(2); - expect(storage.get('ex-server-settings.json-version')).to.equal(1); - expect(storage.get('ex-server-settings.json')).to.eql({ exist: true }); - }); - - it('should get saved events', () => { - let storage = new InMemoryStorage(); - let key = 'ex-q-'; - let event1: IEvent = { type: 'log', reference_id: key + '11' }; - let event2: IEvent = { type: 'log', reference_id: key + '12' }; - let event3: IEvent = { type: 'log', reference_id: key + '13' }; - let event4: IEvent = { type: 'log', reference_id: key + '14' }; - let event5: IEvent = { type: 'log', reference_id: key + '15' }; - let event6: IEvent = { type: 'log', reference_id: key + '16' }; - expect(storage.getList().length).to.equal(0); - - storage.save(event1.reference_id, event1); - storage.save(event2.reference_id, event2); - storage.save(event3.reference_id, event3); - storage.save(event4.reference_id, event4); - storage.save(event5.reference_id, event5); - storage.save(event6.reference_id, event6); - expect(storage.getList().length).to.equal(6); - - let ev = storage.get(event1.reference_id); - expect(ev).to.equal(event1); - expect(ev).to.equal(storage.getList(event1.reference_id, 1)[0].value); - expect(storage.getList().length).to.equal(6); - storage.remove(event1.reference_id); - expect(storage.get(event1.reference_id)).to.equal(null); - expect(storage.getList().length).to.equal(5); - - ev = storage.getList(event2.reference_id, 1)[0].value; - expect(ev).to.equal(event2); - storage.remove(event2.reference_id); - expect(storage.getList().length).to.equal(4); - - let events = storage.getList(key, 2); - expect(events.length).to.equal(2); - expect(events[0].value).not.to.equal(events[1].value); - storage.remove(events[0].path); - storage.remove(events[1].path); - expect(storage.getList().length).to.equal(2); - - events = storage.getList(key); - expect(events.length).to.equal(2); - expect(events[0].value).not.to.equal(events[1].value); - }); - - it('should clear all events', () => { - let storage = new InMemoryStorage(); - let key = 'ex-q-'; - let event1: IEvent = { type: 'log', reference_id: key + '11' }; - let event2: IEvent = { type: 'log', reference_id: key + '12' }; - let event3: IEvent = { type: 'log', reference_id: key + '13' }; - let event4: IEvent = { type: 'log', reference_id: key + '14' }; - let event5: IEvent = { type: 'log', reference_id: key + '15' }; - let event6: IEvent = { type: 'log', reference_id: key + '16' }; - expect(storage.getList().length).to.equal(0); - - storage.save(event1.reference_id, event1); - storage.save(event2.reference_id, event2); - storage.save(event3.reference_id, event3); - storage.save(event4.reference_id, event4); - storage.save(event5.reference_id, event5); - storage.save(event6.reference_id, event6); - expect(storage.getList().length).to.equal(6); - - storage.remove(event1.reference_id); - expect(storage.getList().length).to.equal(5); - - let events = storage.getList(); - for (let index = 0; index < events.length; index++) { - storage.remove(events[index].path); - } - - expect(storage.getList().length).to.equal(0); - }); - - it('should get with limit', () => { - let storage = new InMemoryStorage(250); - for (let index: number = 0; index < 260; index++) { - storage.save('ex-q-' + index, { type: 'log', reference_id: index.toString() }); - } - - expect(storage.getList().length).to.equal(250); - expect(storage.getList(null).length).to.equal(250); - expect(storage.getList(null, 1).length).to.equal(1); - }); - - it('should get the oldest events', () => { - function getDate(baseDate: Date, offset: number) { - return new Date(baseDate.getTime() + (offset * 60000)); - } - - const DATE: Date = new Date(); - let storage = new InMemoryStorage(); - for (let index: number = 0; index < 10; index++) { - storage.save('ex-q-' + index, { - date: getDate(DATE, index), - type: 'log', - reference_id: index.toString() - }); - - expect(storage.getList().length).to.equal(index + 1); - } - - let offset: number = 0; - let events: IStorageItem[] = storage.getList('ex-q-', 2); - while (events && events.length > 0) { - expect(2).to.equal(events.length); - for (let ei = 0; ei < 2; ei++) { - expect(getDate(DATE, offset++)).to.eql(events[ei].value.date); - storage.remove(events[ei].path); - } - - events = storage.getList('ex-q-', 2); - } - }); - - it('should respect max items limit', () => { - let storage = new InMemoryStorage(5); - for (let index: number = 0; index < 5; index++) { - storage.save('ex-q-' + index, { type: 'log', reference_id: index.toString() }); - } - - let events: IStorageItem[] = storage.getList(); - expect(events.length).to.equal(5); - expect(events[0].path).to.equal('ex-q-0'); - storage.save('ex-q-6', { type: 'log', reference_id: '6' }); - - events = storage.getList(); - expect(events.length).to.equal(5); - expect(events[0].path).to.equal('ex-q-1'); - }); -}); diff --git a/src/storage/NodeFileStorage.ts b/src/storage/NodeFileStorage.ts new file mode 100644 index 00000000..e8351f1f --- /dev/null +++ b/src/storage/NodeFileStorage.ts @@ -0,0 +1,160 @@ +import { IStorage } from './IStorage'; +import { IStorageItem } from './IStorageItem'; + +import * as Fs from 'fs'; +import * as Path from 'path'; + +interface IndexEntry { + name: string; + timestamp: number; +} + +export class NodeFileStorage implements IStorage { + private directory: string; + private maxItems: number; + private timestamp: number; + private index: IndexEntry[]; + private fs: any; + + constructor(folder: string, maxItems: number = 20, fs?: any) { + this.directory = Path.resolve(folder); + this.maxItems = maxItems; + this.fs = fs ? fs : Fs; + + mkdirParent(this.directory); + this.index = this.createIndex(this.directory); + this.timestamp = this.index.length > 0 + ? this.index[this.index.length - 1].timestamp + : 0; + } + + save(path: string, value: any): boolean { + if (!path || !value) { + return false; + } + + this.remove(path); + let entry = { name: path, timestamp: ++this.timestamp }; + this.index.push(entry); + let fullPath = this.getFullPath(entry); + let json = JSON.stringify(value); + this.fs.writeFileSync(fullPath, json); + + return true; + } + + get(path: string): any { + try { + let entry = this.findEntry(path); + if (!entry) { + return null; + } + + let fullPath = this.getFullPath(entry); + let json = this.fs.readFileSync(fullPath, 'utf8'); + return JSON.parse(json, parseDate); + } catch (e) { + return null; + } + } + + getList(searchPattern?: string, limit?: number): IStorageItem[] { + let entries = this.index; + + if (searchPattern) { + let regex = new RegExp(searchPattern); + entries = entries.filter(entry => regex.test(entry.name)); + } + + if (entries.length > this.maxItems) { + entries = entries.slice(entries.length - this.maxItems); + } + + if (entries.length > limit) { + entries = entries.slice(0, limit); + } + + let items = entries.map(e => this.loadEntry(e)); + return items; + } + + remove(path: string): void { + try { + let entry = this.findEntry(path); + if (!entry) { + return null; + } + + let fullPath = this.getFullPath(entry); + this.fs.unlinkSync(fullPath); + this.removeEntry(entry); + } catch (e) { } + } + + private loadEntry(entry: IndexEntry) { + let fullPath = this.getFullPath(entry); + let created = this.fs.statSync(fullPath).birthtime.getTime(); + let json = this.fs.readFileSync(fullPath, 'utf8'); + let value = JSON.parse(json, parseDate); + return { + created: created, + path: entry.name, + value + }; + } + + private findEntry(path: string) { + for (let i = this.index.length - 1; i >= 0; i--) { + if (this.index[i].name === path) { + return this.index[i]; + } + } + return null; + } + + private removeEntry(entry: IndexEntry) { + let i = this.index.indexOf(entry); + if (i > -1) { + this.index.splice(i, 1); + } + } + + private getFullPath(entry: IndexEntry) { + let filename = entry.name + '__' + entry.timestamp; + return Path.join(this.directory, filename); + } + + private createIndex(path: string) { + let files = this.fs.readdirSync(path); + return files + .map(file => { + let parts = file.split('__'); + return { + name: parts[0], + timestamp: parseInt(parts[1], 10) + }; + }).sort((a, b) => a.timestamp - b.timestamp); + } +} + +function parseDate(key, value) { + let dateRegx = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g; + if (typeof value === 'string') { + let a = dateRegx.exec(value); + if (a) { + return new Date(value); + } + } + return value; +}; + +function mkdirParent(dirPath) { + try { + this.fs.mkdirSync(dirPath); + } catch (e) { + if (e.errno === 34) { + mkdirParent(Path.dirname(dirPath)); + mkdirParent(dirPath); + } + } +} diff --git a/src/storage/Storage-spec.ts b/src/storage/Storage-spec.ts new file mode 100644 index 00000000..7c558444 --- /dev/null +++ b/src/storage/Storage-spec.ts @@ -0,0 +1,243 @@ +import { IEvent } from '../models/IEvent'; +import { IStorage } from './IStorage'; +import { IStorageItem } from './IStorageItem'; + +import { InMemoryStorage } from './InMemoryStorage'; +import { NodeFileStorage } from './NodeFileStorage'; + +import { expect } from 'chai'; +import * as mockFs from 'mock-fs'; + +let mockedFs; + +let nodeFileStorageFactory = (maxItems?) => { + return new NodeFileStorage('./fileStorage', maxItems, mockedFs); +}; + +let nodeFileStorageInitializer = () => { + mockedFs = mockFs.fs({ + 'fileStorage': {} + }); +}; + +describeStorage('NodeFileStorage', + nodeFileStorageFactory, + nodeFileStorageInitializer, + true +); + +describeStorage('InMemoryStorage', (maxItems?) => { + return new InMemoryStorage(maxItems); +}); + +function describeStorage(name: string, + storageFactory: (maxItems?: number) => IStorage, + beforeEachCallback?: () => void, + recreateStorage: boolean = false) { + + describe(name, () => { + + if (beforeEachCallback) { + beforeEach(beforeEachCallback); + } + + it('should save events', () => { + let storage = storageFactory(); + let key = 'ex-q-'; + let event1: IEvent = { type: 'log', reference_id: key + '123454321' }; + let event2: IEvent = { type: 'log', reference_id: key + '098765432' }; + expect(storage.getList().length).to.equal(0); + storage.save(event1.reference_id, event1); + expect(storage.getList().length).to.equal(1); + expect(storage.getList(key).length).to.equal(1); + + if (recreateStorage) { + storage = storageFactory(); + } + + storage.save(event2.reference_id, event2); + expect(storage.getList().length).to.equal(2); + expect(storage.getList(key).length).to.equal(2); + expect(storage.getList(key + '1').length).to.equal(1); + }); + + it('should save once', () => { + let storage = storageFactory(); + storage.save('one', 1); + expect(storage.getList().length).to.equal(1); + + if (recreateStorage) { + storage = storageFactory(); + } + + storage.save('one', 1); + expect(storage.getList().length).to.equal(1); + }); + + it('should get by key', () => { + let storage = storageFactory(); + storage.save('ex-server-settings.json-version', 1); + storage.save('ex-server-settings.json', { exist: true }); + + if (recreateStorage) { + storage = storageFactory(); + } + + expect(storage.getList().length).to.equal(2); + expect(storage.get('ex-server-settings.json-version')).to.equal(1); + expect(storage.get('ex-server-settings.json')).to.eql({ exist: true }); + }); + + it('should get saved events', () => { + let storage = storageFactory(); + let key = 'ex-q-'; + let event1: IEvent = { type: 'log', reference_id: key + '11' }; + let event2: IEvent = { type: 'log', reference_id: key + '12' }; + let event3: IEvent = { type: 'log', reference_id: key + '13' }; + let event4: IEvent = { type: 'log', reference_id: key + '14' }; + let event5: IEvent = { type: 'log', reference_id: key + '15' }; + let event6: IEvent = { type: 'log', reference_id: key + '16' }; + expect(storage.getList().length).to.equal(0); + + storage.save(event1.reference_id, event1); + storage.save(event2.reference_id, event2); + storage.save(event3.reference_id, event3); + storage.save(event4.reference_id, event4); + storage.save(event5.reference_id, event5); + storage.save(event6.reference_id, event6); + expect(storage.getList().length).to.equal(6); + + if (recreateStorage) { + storage = storageFactory(); + } + + let ev = storage.get(event1.reference_id); + expect(ev).to.eql(event1); + expect(ev).to.eql(storage.getList(event1.reference_id, 1)[0].value); + expect(storage.getList().length).to.equal(6); + storage.remove(event1.reference_id); + expect(storage.get(event1.reference_id)).to.equal(null); + expect(storage.getList().length).to.equal(5); + + ev = storage.getList(event2.reference_id, 1)[0].value; + expect(ev).to.eql(event2); + storage.remove(event2.reference_id); + expect(storage.getList().length).to.equal(4); + + let events = storage.getList(key, 2); + expect(events.length).to.equal(2); + expect(events[0].value).not.to.equal(events[1].value); + storage.remove(events[0].path); + storage.remove(events[1].path); + expect(storage.getList().length).to.equal(2); + + events = storage.getList(key); + expect(events.length).to.equal(2); + expect(events[0].value).not.to.equal(events[1].value); + }); + + it('should clear all events', () => { + let storage = storageFactory(); + let key = 'ex-q-'; + let event1: IEvent = { type: 'log', reference_id: key + '11' }; + let event2: IEvent = { type: 'log', reference_id: key + '12' }; + let event3: IEvent = { type: 'log', reference_id: key + '13' }; + let event4: IEvent = { type: 'log', reference_id: key + '14' }; + let event5: IEvent = { type: 'log', reference_id: key + '15' }; + let event6: IEvent = { type: 'log', reference_id: key + '16' }; + expect(storage.getList().length).to.equal(0); + + storage.save(event1.reference_id, event1); + storage.save(event2.reference_id, event2); + storage.save(event3.reference_id, event3); + storage.save(event4.reference_id, event4); + storage.save(event5.reference_id, event5); + storage.save(event6.reference_id, event6); + expect(storage.getList().length).to.equal(6); + + if (recreateStorage) { + storage = storageFactory(); + } + + storage.remove(event1.reference_id); + expect(storage.getList().length).to.equal(5); + + let events = storage.getList(); + for (let index = 0; index < events.length; index++) { + storage.remove(events[index].path); + } + + expect(storage.getList().length).to.equal(0); + }); + + it('should get with limit', () => { + let storage = storageFactory(250); + for (let index: number = 0; index < 260; index++) { + storage.save('ex-q-' + index, { type: 'log', reference_id: index.toString() }); + } + + if (recreateStorage) { + storage = storageFactory(250); + } + + expect(storage.getList().length).to.equal(250); + expect(storage.getList(null).length).to.equal(250); + expect(storage.getList(null, 1).length).to.equal(1); + }); + + it('should get the oldest events', () => { + function getDate(baseDate: Date, offset: number) { + return new Date(baseDate.getTime() + (offset * 60000)); + } + + const DATE: Date = new Date(); + let storage = storageFactory(); + for (let index: number = 0; index < 10; index++) { + storage.save('ex-q-' + index, { + date: getDate(DATE, index), + type: 'log', + reference_id: index.toString() + }); + + expect(storage.getList().length).to.equal(index + 1); + } + + if (recreateStorage) { + storage = storageFactory(); + } + + let offset: number = 0; + let events: IStorageItem[] = storage.getList('ex-q-', 2); + while (events && events.length > 0) { + expect(2).to.equal(events.length); + for (let ei = 0; ei < 2; ei++) { + expect(getDate(DATE, offset++)).to.eql(events[ei].value.date); + storage.remove(events[ei].path); + } + + events = storage.getList('ex-q-', 2); + } + }); + + it('should respect max items limit', () => { + let storage = storageFactory(5); + for (let index: number = 0; index < 5; index++) { + storage.save('ex-q-' + index, { type: 'log', reference_id: index.toString() }); + } + + let events: IStorageItem[] = storage.getList(); + expect(events.length).to.equal(5); + expect(events[0].path).to.equal('ex-q-0'); + storage.save('ex-q-6', { type: 'log', reference_id: '6' }); + + if (recreateStorage) { + storage = storageFactory(5); + } + + events = storage.getList(); + expect(events.length).to.equal(5); + expect(events[0].path).to.equal('ex-q-1'); + }); + + }); +} diff --git a/tsd.json b/tsd.json index f1242e1c..4d1b3229 100644 --- a/tsd.json +++ b/tsd.json @@ -6,7 +6,7 @@ "bundle": "src/typings/tsd.d.ts", "installed": { "node/node.d.ts": { - "commit": "d1f6bde13f2209be42e86c3686761e8bfcbb50a5" + "commit": "70bf7e2bfeb0d5b1b651ef3219bcc65c8eec117e" }, "angularjs/angular.d.ts": { "commit": "d1f6bde13f2209be42e86c3686761e8bfcbb50a5" @@ -25,6 +25,9 @@ }, "chai/chai.d.ts": { "commit": "d1f6bde13f2209be42e86c3686761e8bfcbb50a5" + }, + "mock-fs/mock-fs.d.ts": { + "commit": "70bf7e2bfeb0d5b1b651ef3219bcc65c8eec117e" } } } From 7c78a702442edd387c809767e8049cd04b158e1f Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Sat, 30 Jan 2016 12:54:54 +0100 Subject: [PATCH 04/17] Code Style / Formatting --- src/configuration/Configuration.ts | 2 +- src/configuration/SettingsManager.ts | 2 +- src/queue/DefaultEventQueue.ts | 2 +- src/services/NodeRequestInfoCollector.ts | 6 +++--- src/submission/DefaultSubmissionAdapter.ts | 2 +- src/submission/DefaultSubmissionClient.ts | 2 +- 6 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts index baed0595..9aeab78f 100644 --- a/src/configuration/Configuration.ts +++ b/src/configuration/Configuration.ts @@ -322,7 +322,7 @@ export class Configuration implements IConfigurationSettings { /** * Automatically send a heartbeat to keep the session alive. */ - public useSessions(sendHeartbeats:boolean = true): void { + public useSessions(sendHeartbeats: boolean = true): void { if (sendHeartbeats) { this.addPlugin(new HeartbeatPlugin()); } diff --git a/src/configuration/SettingsManager.ts b/src/configuration/SettingsManager.ts index 84247d8a..4b96ff12 100644 --- a/src/configuration/SettingsManager.ts +++ b/src/configuration/SettingsManager.ts @@ -31,7 +31,7 @@ export class SettingsManager { if (version) { let savedConfigVersion = parseInt(config.storage.get(`${this._configPath}-version`), 10); if (isNaN(savedConfigVersion) || version > savedConfigVersion) { - config.log.info(`Updating settings from v${(!isNaN(savedConfigVersion) ? savedConfigVersion : 0) } to v${version}`); + config.log.info(`Updating settings from v${(!isNaN(savedConfigVersion) ? savedConfigVersion : 0)} to v${version}`); this.updateSettings(config); } } diff --git a/src/queue/DefaultEventQueue.ts b/src/queue/DefaultEventQueue.ts index 9b55c357..a367fca0 100644 --- a/src/queue/DefaultEventQueue.ts +++ b/src/queue/DefaultEventQueue.ts @@ -54,7 +54,7 @@ export class DefaultEventQueue implements IEventQueue { return; } - let key = `ex-q-${new Date().toJSON() }-${Utils.randomNumber() }`; + let key = `ex-q-${new Date().toJSON()}-${Utils.randomNumber()}`; config.log.info(`Enqueuing event: ${key} type=${event.type} ${!!event.reference_id ? 'refid=' + event.reference_id : ''}`); config.storage.save(key, event); } diff --git a/src/services/NodeRequestInfoCollector.ts b/src/services/NodeRequestInfoCollector.ts index 6cfd42f9..333dc091 100644 --- a/src/services/NodeRequestInfoCollector.ts +++ b/src/services/NodeRequestInfoCollector.ts @@ -5,7 +5,7 @@ import { Utils } from '../Utils'; export class NodeRequestInfoCollector implements IRequestInfoCollector { getRequestInfo(context: EventPluginContext): IRequestInfo { - const REQUEST_KEY:string = '@request'; // optimization for minifier. + const REQUEST_KEY: string = '@request'; // optimization for minifier. if (!context.contextData[REQUEST_KEY]) { return null; } @@ -14,7 +14,7 @@ export class NodeRequestInfoCollector implements IRequestInfoCollector { // TODO: include referrer let request = context.contextData[REQUEST_KEY]; - let requestInfo:IRequestInfo = { + let requestInfo: IRequestInfo = { client_ip_address: request.ip, user_agent: request.headers['user-agent'], is_secure: request.secure, @@ -27,7 +27,7 @@ export class NodeRequestInfoCollector implements IRequestInfoCollector { }; let host = request.headers.host; - let port:number = host && parseInt(host.slice(host.indexOf(':') + 1), 10); + let port: number = host && parseInt(host.slice(host.indexOf(':') + 1), 10); if (port > 0) { requestInfo.port = port; } diff --git a/src/submission/DefaultSubmissionAdapter.ts b/src/submission/DefaultSubmissionAdapter.ts index a46cf7af..9709fb49 100644 --- a/src/submission/DefaultSubmissionAdapter.ts +++ b/src/submission/DefaultSubmissionAdapter.ts @@ -89,7 +89,7 @@ export class DefaultSubmissionAdapter implements ISubmissionAdapter { return xhr; } - let url = `${request.serverUrl}${request.path}?access_token=${encodeURIComponent(request.apiKey) }`; + let url = `${request.serverUrl}${request.path}?access_token=${encodeURIComponent(request.apiKey)}`; let xhr = createRequest(request.userAgent, request.method || 'POST', url); if (!xhr) { return callback(503, 'CORS not supported.'); diff --git a/src/submission/DefaultSubmissionClient.ts b/src/submission/DefaultSubmissionClient.ts index 18afb4c9..403c1600 100644 --- a/src/submission/DefaultSubmissionClient.ts +++ b/src/submission/DefaultSubmissionClient.ts @@ -22,7 +22,7 @@ export class DefaultSubmissionClient implements ISubmissionClient { } public postUserDescription(referenceId: string, description: IUserDescription, config: Configuration, callback: (response: SubmissionResponse) => void): void { - let path = `/api/v2/events/by-ref/${encodeURIComponent(referenceId) }/user-description`; + let path = `/api/v2/events/by-ref/${encodeURIComponent(referenceId)}/user-description`; let data = JSON.stringify(description); let request = this.createRequest(config, 'POST', path, data); let cb = this.createSubmissionCallback(config, callback); From e781aa1e64e3a94b2efa1eb1d1a3cee05b22fead Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Sun, 31 Jan 2016 00:25:36 +0100 Subject: [PATCH 05/17] Added BrowserStorage --- src/storage/BrowserStorage.ts | 162 ++++++++++++++++++++++++++++++++++ 1 file changed, 162 insertions(+) create mode 100644 src/storage/BrowserStorage.ts diff --git a/src/storage/BrowserStorage.ts b/src/storage/BrowserStorage.ts new file mode 100644 index 00000000..f9fdd163 --- /dev/null +++ b/src/storage/BrowserStorage.ts @@ -0,0 +1,162 @@ +import { IStorage } from './IStorage'; +import { IStorageItem } from './IStorageItem'; + +interface IndexEntry { + name: string; + timestamp: number; +} + +export class BrowserStorage implements IStorage { + private prefix: string; + private maxItems: number; + private timestamp: number; + private index: IndexEntry[]; + + static isAvailable(): boolean { + try { + let storage = window.localStorage, + x = '__storage_test__'; + storage.setItem(x, x); + storage.removeItem(x); + return true; + } catch (e) { + return false; + } + } + + constructor(prefix: string = 'com.exceptionless.', maxItems: number = 20, fs?: any) { + this.prefix = prefix; + this.maxItems = maxItems; + + this.index = this.createIndex(); + this.timestamp = this.index.length > 0 + ? this.index[this.index.length - 1].timestamp + : 0; + } + + save(path: string, value: any): boolean { + if (!path || !value) { + return false; + } + + this.remove(path); + let entry = { name: path, timestamp: ++this.timestamp }; + this.index.push(entry); + let fullPath = this.getFullPath(entry); + let json = JSON.stringify(value); + window.localStorage.setItem(fullPath, json); + + return true; + } + + get(path: string): any { + try { + let entry = this.findEntry(path); + if (!entry) { + return null; + } + + let fullPath = this.getFullPath(entry); + let json = window.localStorage.getItem(fullPath); + return JSON.parse(json, parseDate); + } catch (e) { + return null; + } + } + + getList(searchPattern?: string, limit?: number): IStorageItem[] { + let entries = this.index; + + if (searchPattern) { + let regex = new RegExp(searchPattern); + entries = entries.filter(entry => regex.test(entry.name)); + } + + if (entries.length > this.maxItems) { + entries = entries.slice(entries.length - this.maxItems); + } + + if (entries.length > limit) { + entries = entries.slice(0, limit); + } + + let items = entries.map(e => this.loadEntry(e)); + return items; + } + + remove(path: string): void { + try { + let entry = this.findEntry(path); + if (!entry) { + return null; + } + + let fullPath = this.getFullPath(entry); + window.localStorage.removeItem(fullPath); + this.removeEntry(entry); + } catch (e) { } + } + + private loadEntry(entry: IndexEntry) { + let fullPath = this.getFullPath(entry); + let created = Date.now(); + let json = window.localStorage.getItem(fullPath); + let value = JSON.parse(json, parseDate); + return { + created: created, + path: entry.name, + value + }; + } + + private findEntry(path: string) { + for (let i = this.index.length - 1; i >= 0; i--) { + if (this.index[i].name === path) { + return this.index[i]; + } + } + return null; + } + + private removeEntry(entry: IndexEntry) { + let i = this.index.indexOf(entry); + if (i > -1) { + this.index.splice(i, 1); + } + } + + private getFullPath(entry: IndexEntry) { + let filename = this.prefix + entry.name + '__' + entry.timestamp; + return filename; + } + + private createIndex() { + let regex = new RegExp('^' + regExEscape(this.prefix)); + let files = Object.keys(window.localStorage) + .filter(f => regex.test(f)) + .map(f => f.substr(this.prefix.length)); + return files + .map(file => { + let parts = file.split('__'); + return { + name: parts[0], + timestamp: parseInt(parts[1], 10) + }; + }).sort((a, b) => a.timestamp - b.timestamp); + } +} + +function regExEscape(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'); +} + +function parseDate(key, value) { + let dateRegx = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g; + if (typeof value === 'string') { + let a = dateRegx.exec(value); + if (a) { + return new Date(value); + } + } + return value; +}; From 7b1c26f91f6433c9389af3c54a85398c3526be2a Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Sun, 31 Jan 2016 00:26:00 +0100 Subject: [PATCH 06/17] Added Configuration.useLocalStorage --- src/configuration/Configuration.ts | 4 ++++ src/exceptionless.node.ts | 5 +++++ src/exceptionless.ts | 7 +++++++ 3 files changed, 16 insertions(+) diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts index 9aeab78f..f2ca3f8e 100644 --- a/src/configuration/Configuration.ts +++ b/src/configuration/Configuration.ts @@ -335,6 +335,10 @@ export class Configuration implements IConfigurationSettings { this.addPlugin(new ReferenceIdPlugin()); } + public useLocalStorage(): void { + throw 'Must be overridden.'; + } + // TODO: Support a min log level. public useDebugLogger(): void { this.log = new ConsoleLog(); diff --git a/src/exceptionless.node.ts b/src/exceptionless.node.ts index f2b346b3..df118d64 100644 --- a/src/exceptionless.node.ts +++ b/src/exceptionless.node.ts @@ -4,6 +4,7 @@ import { NodeErrorParser } from './services/NodeErrorParser'; import { NodeModuleCollector } from './services/NodeModuleCollector'; import { NodeRequestInfoCollector } from './services/NodeRequestInfoCollector'; import { NodeSubmissionAdapter } from './submission/NodeSubmissionAdapter'; +import { NodeFileStorage } from './storage/NodeFileStorage'; import { ExceptionlessClient } from './ExceptionlessClient'; const EXIT: string = 'exit'; @@ -18,6 +19,10 @@ defaults.moduleCollector = new NodeModuleCollector(); defaults.requestInfoCollector = new NodeRequestInfoCollector(); defaults.submissionAdapter = new NodeSubmissionAdapter(); +Configuration.prototype.useLocalStorage = function() { + this.storage = new NodeFileStorage('.exceptionless'); +}; + function getListenerCount(emitter, event: string): number { if (emitter.listenerCount) { return emitter.listenerCount(event); diff --git a/src/exceptionless.ts b/src/exceptionless.ts index fec3da3d..f7262e52 100644 --- a/src/exceptionless.ts +++ b/src/exceptionless.ts @@ -4,6 +4,7 @@ import { DefaultErrorParser } from './services/DefaultErrorParser'; import { DefaultModuleCollector } from './services/DefaultModuleCollector'; import { DefaultRequestInfoCollector } from './services/DefaultRequestInfoCollector'; import { DefaultSubmissionAdapter } from './submission/DefaultSubmissionAdapter'; +import { BrowserStorage } from './storage/BrowserStorage'; import { ExceptionlessClient } from './ExceptionlessClient'; import { Utils } from './Utils'; @@ -44,6 +45,12 @@ function processJQueryAjaxError(event, xhr, settings, error:string): void { } */ +Configuration.prototype.useLocalStorage = function() { + if (BrowserStorage.isAvailable()) { + this.storage = new BrowserStorage(); + } +}; + let defaults = Configuration.defaults; let settings = getDefaultsSettingsFromScriptTag(); if (settings && (settings.apiKey || settings.serverUrl)) { From 9f8fc56e77f0c7c12a8d6974f564c5be552585c1 Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Sun, 31 Jan 2016 00:26:20 +0100 Subject: [PATCH 07/17] Fix in NodeFileStorage: mkdir --- src/storage/NodeFileStorage.ts | 28 +++++++++++++++++----------- 1 file changed, 17 insertions(+), 11 deletions(-) diff --git a/src/storage/NodeFileStorage.ts b/src/storage/NodeFileStorage.ts index e8351f1f..df278392 100644 --- a/src/storage/NodeFileStorage.ts +++ b/src/storage/NodeFileStorage.ts @@ -21,7 +21,7 @@ export class NodeFileStorage implements IStorage { this.maxItems = maxItems; this.fs = fs ? fs : Fs; - mkdirParent(this.directory); + this.mkdir(this.directory); this.index = this.createIndex(this.directory); this.timestamp = this.index.length > 0 ? this.index[this.index.length - 1].timestamp @@ -135,6 +135,22 @@ export class NodeFileStorage implements IStorage { }; }).sort((a, b) => a.timestamp - b.timestamp); } + + private mkdir(path) { + let dirs = path.split(Path.sep); + let root = ''; + + while (dirs.length > 0) { + let dir = dirs.shift(); + if (dir === '') { + root = Path.sep; + } + if (!this.fs.existsSync(root + dir)) { + this.fs.mkdirSync(root + dir); + } + root += dir + Path.sep; + } + }; } function parseDate(key, value) { @@ -148,13 +164,3 @@ function parseDate(key, value) { return value; }; -function mkdirParent(dirPath) { - try { - this.fs.mkdirSync(dirPath); - } catch (e) { - if (e.errno === 34) { - mkdirParent(Path.dirname(dirPath)); - mkdirParent(dirPath); - } - } -} From 018a209781dea656403b51fd791096274b307f19 Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Tue, 2 Feb 2016 07:45:23 +0100 Subject: [PATCH 08/17] Removed wallaby.js --- wallaby.js | 26 -------------------------- 1 file changed, 26 deletions(-) delete mode 100644 wallaby.js diff --git a/wallaby.js b/wallaby.js deleted file mode 100644 index a55fbf67..00000000 --- a/wallaby.js +++ /dev/null @@ -1,26 +0,0 @@ -module.exports = function (wallaby) { - - return { - files: [ - 'src/**/*.ts', - { - pattern: 'src/**/*-spec.ts', - ignore: true - } - ], - - testFramework: 'mocha', - - tests: [ - 'src/**/*-spec.ts' - ], - - env: { - type: 'node' - }, - - compilers: { - 'src/**/*.ts': wallaby.compilers.typeScript({ module: true }) - } - }; -}; From 8278b644a55175cfd10d5b489692fe96f0333eb5 Mon Sep 17 00:00:00 2001 From: Frank Ebersoll Date: Sat, 6 Feb 2016 00:50:01 +0100 Subject: [PATCH 09/17] Refactoring: KeyValueStorageBase Put code from BrowserStorage and NodeFileStorage into common base class --- src/storage/BrowserStorage.ts | 143 ++++--------------------- src/storage/KeyValueStorageBase.ts | 164 +++++++++++++++++++++++++++++ src/storage/NodeFileStorage.ts | 137 +++--------------------- 3 files changed, 198 insertions(+), 246 deletions(-) create mode 100644 src/storage/KeyValueStorageBase.ts diff --git a/src/storage/BrowserStorage.ts b/src/storage/BrowserStorage.ts index f9fdd163..497abec6 100644 --- a/src/storage/BrowserStorage.ts +++ b/src/storage/BrowserStorage.ts @@ -1,16 +1,7 @@ -import { IStorage } from './IStorage'; -import { IStorageItem } from './IStorageItem'; +import { KeyValueStorageBase } from './KeyValueStorageBase'; -interface IndexEntry { - name: string; - timestamp: number; -} - -export class BrowserStorage implements IStorage { +export class BrowserStorage extends KeyValueStorageBase { private prefix: string; - private maxItems: number; - private timestamp: number; - private index: IndexEntry[]; static isAvailable(): boolean { try { @@ -25,138 +16,40 @@ export class BrowserStorage implements IStorage { } constructor(prefix: string = 'com.exceptionless.', maxItems: number = 20, fs?: any) { - this.prefix = prefix; - this.maxItems = maxItems; - - this.index = this.createIndex(); - this.timestamp = this.index.length > 0 - ? this.index[this.index.length - 1].timestamp - : 0; - } - - save(path: string, value: any): boolean { - if (!path || !value) { - return false; - } - - this.remove(path); - let entry = { name: path, timestamp: ++this.timestamp }; - this.index.push(entry); - let fullPath = this.getFullPath(entry); - let json = JSON.stringify(value); - window.localStorage.setItem(fullPath, json); - - return true; - } - - get(path: string): any { - try { - let entry = this.findEntry(path); - if (!entry) { - return null; - } - - let fullPath = this.getFullPath(entry); - let json = window.localStorage.getItem(fullPath); - return JSON.parse(json, parseDate); - } catch (e) { - return null; - } - } - - getList(searchPattern?: string, limit?: number): IStorageItem[] { - let entries = this.index; + super(maxItems); - if (searchPattern) { - let regex = new RegExp(searchPattern); - entries = entries.filter(entry => regex.test(entry.name)); - } - - if (entries.length > this.maxItems) { - entries = entries.slice(entries.length - this.maxItems); - } - - if (entries.length > limit) { - entries = entries.slice(0, limit); - } - - let items = entries.map(e => this.loadEntry(e)); - return items; - } - - remove(path: string): void { - try { - let entry = this.findEntry(path); - if (!entry) { - return null; - } - - let fullPath = this.getFullPath(entry); - window.localStorage.removeItem(fullPath); - this.removeEntry(entry); - } catch (e) { } + this.prefix = prefix; } - private loadEntry(entry: IndexEntry) { - let fullPath = this.getFullPath(entry); - let created = Date.now(); - let json = window.localStorage.getItem(fullPath); - let value = JSON.parse(json, parseDate); - return { - created: created, - path: entry.name, - value - }; + write(key: string, value: string) { + window.localStorage.setItem(key, value); } - private findEntry(path: string) { - for (let i = this.index.length - 1; i >= 0; i--) { - if (this.index[i].name === path) { - return this.index[i]; - } - } - return null; + read(key: string) { + return window.localStorage.getItem(key); } - private removeEntry(entry: IndexEntry) { - let i = this.index.indexOf(entry); - if (i > -1) { - this.index.splice(i, 1); - } + readDate(key: string) { + return Date.now(); } - private getFullPath(entry: IndexEntry) { - let filename = this.prefix + entry.name + '__' + entry.timestamp; - return filename; + delete(key: string) { + window.localStorage.removeItem(key); } - private createIndex() { + getEntries() { let regex = new RegExp('^' + regExEscape(this.prefix)); let files = Object.keys(window.localStorage) .filter(f => regex.test(f)) .map(f => f.substr(this.prefix.length)); - return files - .map(file => { - let parts = file.split('__'); - return { - name: parts[0], - timestamp: parseInt(parts[1], 10) - }; - }).sort((a, b) => a.timestamp - b.timestamp); + return files; + } + + getKey(entry) { + return this.prefix + super.getKey(entry); } } function regExEscape(value) { return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'); } - -function parseDate(key, value) { - let dateRegx = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g; - if (typeof value === 'string') { - let a = dateRegx.exec(value); - if (a) { - return new Date(value); - } - } - return value; -}; diff --git a/src/storage/KeyValueStorageBase.ts b/src/storage/KeyValueStorageBase.ts new file mode 100644 index 00000000..4467f032 --- /dev/null +++ b/src/storage/KeyValueStorageBase.ts @@ -0,0 +1,164 @@ +import { IStorage } from './IStorage'; +import { IStorageItem } from './IStorageItem'; + +interface IndexEntry { + name: string; + timestamp: number; +} + +export abstract class KeyValueStorageBase implements IStorage { + private maxItems: number; + private timestamp: number; + private index: IndexEntry[]; + + constructor(maxItems) { + this.maxItems = maxItems; + } + + save(path: string, value: any): boolean { + if (!path || !value) { + return false; + } + + this.ensureIndex(); + + this.remove(path); + let entry = { name: path, timestamp: ++this.timestamp }; + this.index.push(entry); + let key = this.getKey(entry); + let json = JSON.stringify(value); + this.write(key, json); + + return true; + } + + get(path: string): any { + try { + + this.ensureIndex(); + + let entry = this.findEntry(path); + if (!entry) { + return null; + } + + let fullPath = this.getKey(entry); + let json = this.read(fullPath); + return JSON.parse(json, parseDate); + } catch (e) { + return null; + } + } + + getList(searchPattern?: string, limit?: number): IStorageItem[] { + this.ensureIndex(); + let entries = this.index; + + if (searchPattern) { + let regex = new RegExp(searchPattern); + entries = entries.filter(entry => regex.test(entry.name)); + } + + if (entries.length > this.maxItems) { + entries = entries.slice(entries.length - this.maxItems); + } + + if (entries.length > limit) { + entries = entries.slice(0, limit); + } + + let items = entries.map(e => this.loadEntry(e)); + return items; + } + + remove(path: string): void { + try { + this.ensureIndex(); + let entry = this.findEntry(path); + if (!entry) { + return null; + } + + let key = this.getKey(entry); + this.delete(key); + this.removeEntry(entry); + } catch (e) { } + } + + protected abstract write(key: string, value: string): void; + + protected abstract read(key: string): string; + + protected abstract readDate(key: string): number; + + protected abstract delete(key: string); + + protected abstract getEntries(): string[]; + + protected getKey(entry: {name: string, timestamp: number}): string { + return entry.name + '__' + entry.timestamp; + } + + protected getEntry(encodedEntry: string): { name: string, timestamp: number } { + let parts = encodedEntry.split('__'); + return { + name: parts[0], + timestamp: parseInt(parts[1], 10) + }; + } + + private ensureIndex() { + if (!this.index) { + this.index = this.createIndex(); + this.timestamp = this.index.length > 0 + ? this.index[this.index.length - 1].timestamp + : 0; + } + } + + private loadEntry(entry: IndexEntry) { + let key = this.getKey(entry); + let created = this.readDate(key); + let json = this.read(key); + let value = JSON.parse(json, parseDate); + return { + created: created, + path: entry.name, + value + }; + } + + private findEntry(path: string) { + for (let i = this.index.length - 1; i >= 0; i--) { + if (this.index[i].name === path) { + return this.index[i]; + } + } + return null; + } + + private removeEntry(entry: IndexEntry) { + let i = this.index.indexOf(entry); + if (i > -1) { + this.index.splice(i, 1); + } + } + + private createIndex() { + let keys = this.getEntries(); + return keys + .map(key => this.getEntry(key)) + .sort((a, b) => a.timestamp - b.timestamp); + } +} + +function parseDate(key, value) { + let dateRegx = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g; + if (typeof value === 'string') { + let a = dateRegx.exec(value); + if (a) { + return new Date(value); + } + } + return value; +}; diff --git a/src/storage/NodeFileStorage.ts b/src/storage/NodeFileStorage.ts index df278392..e84cd986 100644 --- a/src/storage/NodeFileStorage.ts +++ b/src/storage/NodeFileStorage.ts @@ -1,141 +1,46 @@ -import { IStorage } from './IStorage'; -import { IStorageItem } from './IStorageItem'; +import { KeyValueStorageBase } from './KeyValueStorageBase'; import * as Fs from 'fs'; import * as Path from 'path'; -interface IndexEntry { - name: string; - timestamp: number; -} - -export class NodeFileStorage implements IStorage { +export class NodeFileStorage extends KeyValueStorageBase { private directory: string; - private maxItems: number; - private timestamp: number; - private index: IndexEntry[]; private fs: any; constructor(folder: string, maxItems: number = 20, fs?: any) { + super(maxItems); + this.directory = Path.resolve(folder); - this.maxItems = maxItems; this.fs = fs ? fs : Fs; this.mkdir(this.directory); - this.index = this.createIndex(this.directory); - this.timestamp = this.index.length > 0 - ? this.index[this.index.length - 1].timestamp - : 0; } - save(path: string, value: any): boolean { - if (!path || !value) { - return false; - } - - this.remove(path); - let entry = { name: path, timestamp: ++this.timestamp }; - this.index.push(entry); - let fullPath = this.getFullPath(entry); - let json = JSON.stringify(value); - this.fs.writeFileSync(fullPath, json); - - return true; + write(key: string, value: string) { + this.fs.writeFileSync(key, value); } - get(path: string): any { - try { - let entry = this.findEntry(path); - if (!entry) { - return null; - } - - let fullPath = this.getFullPath(entry); - let json = this.fs.readFileSync(fullPath, 'utf8'); - return JSON.parse(json, parseDate); - } catch (e) { - return null; - } + read(key: string) { + return this.fs.readFileSync(key, 'utf8'); } - getList(searchPattern?: string, limit?: number): IStorageItem[] { - let entries = this.index; - - if (searchPattern) { - let regex = new RegExp(searchPattern); - entries = entries.filter(entry => regex.test(entry.name)); - } - - if (entries.length > this.maxItems) { - entries = entries.slice(entries.length - this.maxItems); - } - - if (entries.length > limit) { - entries = entries.slice(0, limit); - } - - let items = entries.map(e => this.loadEntry(e)); - return items; - } - - remove(path: string): void { - try { - let entry = this.findEntry(path); - if (!entry) { - return null; - } - - let fullPath = this.getFullPath(entry); - this.fs.unlinkSync(fullPath); - this.removeEntry(entry); - } catch (e) { } - } - - private loadEntry(entry: IndexEntry) { - let fullPath = this.getFullPath(entry); - let created = this.fs.statSync(fullPath).birthtime.getTime(); - let json = this.fs.readFileSync(fullPath, 'utf8'); - let value = JSON.parse(json, parseDate); - return { - created: created, - path: entry.name, - value - }; + readDate(key: string) { + return this.fs.statSync(key).birthtime.getTime(); } - private findEntry(path: string) { - for (let i = this.index.length - 1; i >= 0; i--) { - if (this.index[i].name === path) { - return this.index[i]; - } - } - return null; + delete(key: string) { + this.fs.unlinkSync(key); } - private removeEntry(entry: IndexEntry) { - let i = this.index.indexOf(entry); - if (i > -1) { - this.index.splice(i, 1); - } + getEntries() { + return this.fs.readdirSync(this.directory); } - private getFullPath(entry: IndexEntry) { - let filename = entry.name + '__' + entry.timestamp; + getKey(entry) { + let filename = super.getKey(entry); return Path.join(this.directory, filename); } - private createIndex(path: string) { - let files = this.fs.readdirSync(path); - return files - .map(file => { - let parts = file.split('__'); - return { - name: parts[0], - timestamp: parseInt(parts[1], 10) - }; - }).sort((a, b) => a.timestamp - b.timestamp); - } - private mkdir(path) { let dirs = path.split(Path.sep); let root = ''; @@ -153,14 +58,4 @@ export class NodeFileStorage implements IStorage { }; } -function parseDate(key, value) { - let dateRegx = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g; - if (typeof value === 'string') { - let a = dateRegx.exec(value); - if (a) { - return new Date(value); - } - } - return value; -}; From 9b678c2fe775f7f7d8d55765cda7cc48e03e7614 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Thu, 11 Feb 2016 12:53:12 -0600 Subject: [PATCH 10/17] Throw error instead of string error (better stack traces) --- src/configuration/Configuration.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/configuration/Configuration.ts b/src/configuration/Configuration.ts index 2be38e86..a7c0bd7e 100644 --- a/src/configuration/Configuration.ts +++ b/src/configuration/Configuration.ts @@ -366,7 +366,7 @@ export class Configuration implements IConfigurationSettings { } public useLocalStorage(): void { - throw 'Must be overridden.'; + throw new Error('Must be overridden.'); } // TODO: Support a min log level. From fc911693bd7c722a7bc254a7334d19e192759ab2 Mon Sep 17 00:00:00 2001 From: Blake Niemyjski Date: Thu, 11 Feb 2016 15:33:06 -0600 Subject: [PATCH 11/17] Fixed a bug where settings were not being loaded from local storage. --- dist/exceptionless.d.ts | 64 ++++++++-- dist/exceptionless.js | 187 +++++++++++++++++++++++++++++ dist/exceptionless.js.map | 2 +- dist/exceptionless.min.js | 4 +- dist/exceptionless.min.js.map | 2 +- dist/exceptionless.node.js | 185 ++++++++++++++++++++++++++++ dist/exceptionless.node.js.map | 2 +- example/express/app.js | 1 + example/index.html | 1 + src/configuration/Configuration.ts | 2 +- src/exceptionless.node.ts | 2 + src/exceptionless.ts | 2 + 12 files changed, 436 insertions(+), 18 deletions(-) diff --git a/dist/exceptionless.d.ts b/dist/exceptionless.d.ts index ac3f9165..99fcc9b5 100644 --- a/dist/exceptionless.d.ts +++ b/dist/exceptionless.d.ts @@ -36,10 +36,10 @@ export interface IModuleCollector { export interface IRequestInfoCollector { getRequestInfo(context: EventPluginContext): IRequestInfo; } -export interface IStorage { - save(path: string, value: T): boolean; - get(path: string): T; - getList(searchPattern?: string, limit?: number): IStorageItem[]; +export interface IStorage { + save(path: string, value: any): boolean; + get(path: string): any; + getList(searchPattern?: string, limit?: number): IStorageItem[]; remove(path: string): void; } export interface ISubmissionAdapter { @@ -62,7 +62,7 @@ export interface IConfigurationSettings { submissionBatchSize?: number; submissionClient?: ISubmissionClient; submissionAdapter?: ISubmissionAdapter; - storage?: IStorage; + storage?: IStorage; queue?: IEventQueue; } export declare class SettingsManager { @@ -143,13 +143,13 @@ export declare class DefaultEventQueue implements IEventQueue { private processSubmissionResponse(response, events); private removeEvents(events); } -export declare class InMemoryStorage implements IStorage { +export declare class InMemoryStorage implements IStorage { private _items; private _maxItems; constructor(maxItems?: number); - save(path: string, value: T): boolean; - get(path: string): T; - getList(searchPattern?: string, limit?: number): IStorageItem[]; + save(path: string, value: any): boolean; + get(path: string): any; + getList(searchPattern?: string, limit?: number): IStorageItem[]; remove(path: string): void; } export declare class DefaultSubmissionClient implements ISubmissionClient { @@ -188,7 +188,7 @@ export declare class Configuration implements IConfigurationSettings { submissionAdapter: ISubmissionAdapter; submissionClient: ISubmissionClient; settings: Object; - storage: IStorage; + storage: IStorage; queue: IEventQueue; private _plugins; constructor(configSettings?: IConfigurationSettings); @@ -215,6 +215,7 @@ export declare class Configuration implements IConfigurationSettings { userAgent: string; useSessions(sendHeartbeats?: boolean): void; useReferenceIds(): void; + useLocalStorage(): void; useDebugLogger(): void; static defaults: IConfigurationSettings; } @@ -414,10 +415,10 @@ export declare class DuplicateCheckerPlugin implements IEventPlugin { export interface IError extends IInnerError { modules?: IModule[]; } -export interface IStorageItem { +export interface IStorageItem { created: number; path: string; - value: T; + value: any; } export interface SubmissionCallback { (status: number, message: string, data?: string, headers?: Object): void; @@ -442,6 +443,34 @@ export interface IClientConfiguration { settings: Object; version: number; } +export declare abstract class KeyValueStorageBase implements IStorage { + private maxItems; + private timestamp; + private index; + constructor(maxItems: any); + save(path: string, value: any): boolean; + get(path: string): any; + getList(searchPattern?: string, limit?: number): IStorageItem[]; + remove(path: string): void; + protected abstract write(key: string, value: string): void; + protected abstract read(key: string): string; + protected abstract readDate(key: string): number; + protected abstract delete(key: string): any; + protected abstract getEntries(): string[]; + protected getKey(entry: { + name: string; + timestamp: number; + }): string; + protected getEntry(encodedEntry: string): { + name: string; + timestamp: number; + }; + private ensureIndex(); + private loadEntry(entry); + private findEntry(path); + private removeEntry(entry); + private createIndex(); +} export declare class DefaultErrorParser implements IErrorParser { parse(context: EventPluginContext, exception: Error): IError; } @@ -454,3 +483,14 @@ export declare class DefaultRequestInfoCollector implements IRequestInfoCollecto export declare class DefaultSubmissionAdapter implements ISubmissionAdapter { sendRequest(request: SubmissionRequest, callback: SubmissionCallback, isAppExiting?: boolean): void; } +export declare class BrowserStorage extends KeyValueStorageBase { + private prefix; + static isAvailable(): boolean; + constructor(prefix?: string, maxItems?: number, fs?: any); + write(key: string, value: string): void; + read(key: string): any; + readDate(key: string): number; + delete(key: string): void; + getEntries(): string[]; + getKey(entry: any): string; +} diff --git a/dist/exceptionless.js b/dist/exceptionless.js index 1ce83e97..d22e4066 100644 --- a/dist/exceptionless.js +++ b/dist/exceptionless.js @@ -1181,6 +1181,11 @@ if (!exports) { } +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; var SettingsManager = (function () { function SettingsManager() { } @@ -1992,6 +1997,8 @@ var Configuration = (function () { Configuration.prototype.useReferenceIds = function () { this.addPlugin(new ReferenceIdPlugin()); }; + Configuration.prototype.useLocalStorage = function () { + }; Configuration.prototype.useDebugLogger = function () { this.log = new ConsoleLog(); }; @@ -2578,6 +2585,132 @@ var SettingsResponse = (function () { return SettingsResponse; })(); exports.SettingsResponse = SettingsResponse; +var KeyValueStorageBase = (function () { + function KeyValueStorageBase(maxItems) { + this.maxItems = maxItems; + } + KeyValueStorageBase.prototype.save = function (path, value) { + if (!path || !value) { + return false; + } + this.ensureIndex(); + this.remove(path); + var entry = { name: path, timestamp: ++this.timestamp }; + this.index.push(entry); + var key = this.getKey(entry); + var json = JSON.stringify(value); + this.write(key, json); + return true; + }; + KeyValueStorageBase.prototype.get = function (path) { + try { + this.ensureIndex(); + var entry = this.findEntry(path); + if (!entry) { + return null; + } + var fullPath = this.getKey(entry); + var json = this.read(fullPath); + return JSON.parse(json, parseDate); + } + catch (e) { + return null; + } + }; + KeyValueStorageBase.prototype.getList = function (searchPattern, limit) { + var _this = this; + this.ensureIndex(); + var entries = this.index; + if (searchPattern) { + var regex = new RegExp(searchPattern); + entries = entries.filter(function (entry) { return regex.test(entry.name); }); + } + if (entries.length > this.maxItems) { + entries = entries.slice(entries.length - this.maxItems); + } + if (entries.length > limit) { + entries = entries.slice(0, limit); + } + var items = entries.map(function (e) { return _this.loadEntry(e); }); + return items; + }; + KeyValueStorageBase.prototype.remove = function (path) { + try { + this.ensureIndex(); + var entry = this.findEntry(path); + if (!entry) { + return null; + } + var key = this.getKey(entry); + this.delete(key); + this.removeEntry(entry); + } + catch (e) { } + }; + KeyValueStorageBase.prototype.getKey = function (entry) { + return entry.name + '__' + entry.timestamp; + }; + KeyValueStorageBase.prototype.getEntry = function (encodedEntry) { + var parts = encodedEntry.split('__'); + return { + name: parts[0], + timestamp: parseInt(parts[1], 10) + }; + }; + KeyValueStorageBase.prototype.ensureIndex = function () { + if (!this.index) { + this.index = this.createIndex(); + this.timestamp = this.index.length > 0 + ? this.index[this.index.length - 1].timestamp + : 0; + } + }; + KeyValueStorageBase.prototype.loadEntry = function (entry) { + var key = this.getKey(entry); + var created = this.readDate(key); + var json = this.read(key); + var value = JSON.parse(json, parseDate); + return { + created: created, + path: entry.name, + value: value + }; + }; + KeyValueStorageBase.prototype.findEntry = function (path) { + for (var i = this.index.length - 1; i >= 0; i--) { + if (this.index[i].name === path) { + return this.index[i]; + } + } + return null; + }; + KeyValueStorageBase.prototype.removeEntry = function (entry) { + var i = this.index.indexOf(entry); + if (i > -1) { + this.index.splice(i, 1); + } + }; + KeyValueStorageBase.prototype.createIndex = function () { + var _this = this; + var keys = this.getEntries(); + return keys + .map(function (key) { return _this.getEntry(key); }) + .sort(function (a, b) { return a.timestamp - b.timestamp; }); + }; + return KeyValueStorageBase; +})(); +exports.KeyValueStorageBase = KeyValueStorageBase; +function parseDate(key, value) { + var dateRegx = /\d{4}-[01]\d-[0-3]\dT[0-2]\d:[0-5]\d:[0-5]\d\.\d+([+-][0-2]\d:[0-5]\d|Z)/g; + if (typeof value === 'string') { + var a = dateRegx.exec(value); + if (a) { + return new Date(value); + } + } + return value; +} +; var DefaultErrorParser = (function () { function DefaultErrorParser() { } @@ -2782,6 +2915,54 @@ var DefaultSubmissionAdapter = (function () { return DefaultSubmissionAdapter; })(); exports.DefaultSubmissionAdapter = DefaultSubmissionAdapter; +var BrowserStorage = (function (_super) { + __extends(BrowserStorage, _super); + function BrowserStorage(prefix, maxItems, fs) { + if (prefix === void 0) { prefix = 'com.exceptionless.'; } + if (maxItems === void 0) { maxItems = 20; } + _super.call(this, maxItems); + this.prefix = prefix; + } + BrowserStorage.isAvailable = function () { + try { + var storage = window.localStorage, x = '__storage_test__'; + storage.setItem(x, x); + storage.removeItem(x); + return true; + } + catch (e) { + return false; + } + }; + BrowserStorage.prototype.write = function (key, value) { + window.localStorage.setItem(key, value); + }; + BrowserStorage.prototype.read = function (key) { + return window.localStorage.getItem(key); + }; + BrowserStorage.prototype.readDate = function (key) { + return Date.now(); + }; + BrowserStorage.prototype.delete = function (key) { + window.localStorage.removeItem(key); + }; + BrowserStorage.prototype.getEntries = function () { + var _this = this; + var regex = new RegExp('^' + regExEscape(this.prefix)); + var files = Object.keys(window.localStorage) + .filter(function (f) { return regex.test(f); }) + .map(function (f) { return f.substr(_this.prefix.length); }); + return files; + }; + BrowserStorage.prototype.getKey = function (entry) { + return this.prefix + _super.prototype.getKey.call(this, entry); + }; + return BrowserStorage; +})(KeyValueStorageBase); +exports.BrowserStorage = BrowserStorage; +function regExEscape(value) { + return value.replace(/[\-\[\]{}()*+?.,\\\^$|#\s]/g, '\\$&'); +} function getDefaultsSettingsFromScriptTag() { if (!document || !document.getElementsByTagName) { return null; @@ -2799,6 +2980,12 @@ function processUnhandledException(stackTrace, options) { builder.pluginContextData['@@_TraceKit.StackTrace'] = stackTrace; builder.submit(); } +Configuration.prototype.useLocalStorage = function () { + if (BrowserStorage.isAvailable()) { + this.storage = new BrowserStorage(); + SettingsManager.applySavedServerSettings(this); + } +}; var defaults = Configuration.defaults; var settings = getDefaultsSettingsFromScriptTag(); if (settings && (settings.apiKey || settings.serverUrl)) { diff --git a/dist/exceptionless.js.map b/dist/exceptionless.js.map index 40e8f101..0b3d21ec 100644 --- a/dist/exceptionless.js.map +++ b/dist/exceptionless.js.map @@ -1 +1 @@ -{"version":3,"sources":["tracekit.js","/source/exceptionless.ts"],"names":["SettingsManager","SettingsManager.constructor","SettingsManager.onChanged","SettingsManager.applySavedServerSettings","SettingsManager.checkVersion","SettingsManager.updateSettings","SettingsManager.changed","SettingsManager.getSavedServerSettings","DefaultLastReferenceIdManager","DefaultLastReferenceIdManager.constructor","DefaultLastReferenceIdManager.getLast","DefaultLastReferenceIdManager.clearLast","DefaultLastReferenceIdManager.setLast","ConsoleLog","ConsoleLog.constructor","ConsoleLog.info","ConsoleLog.warn","ConsoleLog.error","ConsoleLog.log","NullLog","NullLog.constructor","NullLog.info","NullLog.warn","NullLog.error","EventPluginContext","EventPluginContext.constructor","EventPluginContext.log","EventPluginManager","EventPluginManager.constructor","EventPluginManager.run","EventPluginManager.addDefaultPlugins","HeartbeatPlugin","HeartbeatPlugin.constructor","HeartbeatPlugin.run","ReferenceIdPlugin","ReferenceIdPlugin.constructor","ReferenceIdPlugin.run","DefaultEventQueue","DefaultEventQueue.constructor","DefaultEventQueue.enqueue","DefaultEventQueue.process","DefaultEventQueue.process.getEvents","DefaultEventQueue.suspendProcessing","DefaultEventQueue.areQueuedItemsDiscarded","DefaultEventQueue.ensureQueueTimer","DefaultEventQueue.isQueueProcessingSuspended","DefaultEventQueue.onProcessQueue","DefaultEventQueue.processSubmissionResponse","DefaultEventQueue.removeEvents","InMemoryStorage","InMemoryStorage.constructor","InMemoryStorage.save","InMemoryStorage.get","InMemoryStorage.getList","InMemoryStorage.remove","DefaultSubmissionClient","DefaultSubmissionClient.constructor","DefaultSubmissionClient.postEvents","DefaultSubmissionClient.postUserDescription","DefaultSubmissionClient.getSettings","DefaultSubmissionClient.createRequest","DefaultSubmissionClient.createSubmissionCallback","Utils","Utils.constructor","Utils.addRange","Utils.getHashCode","Utils.getCookies","Utils.guid","Utils.guid.s4","Utils.merge","Utils.parseVersion","Utils.parseQueryString","Utils.randomNumber","Utils.isMatch","Utils.isEmpty","Utils.stringify","Utils.stringify.stringifyImpl","Configuration","Configuration.constructor","Configuration.constructor.inject","Configuration.apiKey","Configuration.isValid","Configuration.serverUrl","Configuration.dataExclusions","Configuration.addDataExclusions","Configuration.userAgentBotPatterns","Configuration.addUserAgentBotPatterns","Configuration.plugins","Configuration.addPlugin","Configuration.removePlugin","Configuration.setVersion","Configuration.setUserIdentity","Configuration.userAgent","Configuration.useSessions","Configuration.useReferenceIds","Configuration.useDebugLogger","Configuration.defaults","EventBuilder","EventBuilder.constructor","EventBuilder.setType","EventBuilder.setSource","EventBuilder.setReferenceId","EventBuilder.setEventReference","EventBuilder.setMessage","EventBuilder.setGeo","EventBuilder.setUserIdentity","EventBuilder.setUserDescription","EventBuilder.setManualStackingKey","EventBuilder.setValue","EventBuilder.addTags","EventBuilder.setProperty","EventBuilder.markAsCritical","EventBuilder.addRequestInfo","EventBuilder.submit","EventBuilder.isValidIdentifier","ContextData","ContextData.constructor","ContextData.setException","ContextData.hasException","ContextData.getException","ContextData.markAsUnhandledError","ContextData.isUnhandledError","ContextData.setSubmissionMethod","ContextData.getSubmissionMethod","SubmissionResponse","SubmissionResponse.constructor","ExceptionlessClient","ExceptionlessClient.constructor","ExceptionlessClient.createException","ExceptionlessClient.submitException","ExceptionlessClient.createUnhandledException","ExceptionlessClient.submitUnhandledException","ExceptionlessClient.createFeatureUsage","ExceptionlessClient.submitFeatureUsage","ExceptionlessClient.createLog","ExceptionlessClient.submitLog","ExceptionlessClient.createNotFound","ExceptionlessClient.submitNotFound","ExceptionlessClient.createSessionStart","ExceptionlessClient.submitSessionStart","ExceptionlessClient.createSessionEnd","ExceptionlessClient.submitSessionEnd","ExceptionlessClient.createSessionHeartbeat","ExceptionlessClient.submitSessionHeartbeat","ExceptionlessClient.createEvent","ExceptionlessClient.submitEvent","ExceptionlessClient.submitEvent.cancelled","ExceptionlessClient.updateUserEmailAndDescription","ExceptionlessClient.getLastReferenceId","ExceptionlessClient.default","ConfigurationDefaultsPlugin","ConfigurationDefaultsPlugin.constructor","ConfigurationDefaultsPlugin.run","ErrorPlugin","ErrorPlugin.constructor","ErrorPlugin.run","ModuleInfoPlugin","ModuleInfoPlugin.constructor","ModuleInfoPlugin.run","RequestInfoPlugin","RequestInfoPlugin.constructor","RequestInfoPlugin.run","EnvironmentInfoPlugin","EnvironmentInfoPlugin.constructor","EnvironmentInfoPlugin.run","SubmissionMethodPlugin","SubmissionMethodPlugin.constructor","SubmissionMethodPlugin.run","DuplicateCheckerPlugin","DuplicateCheckerPlugin.constructor","DuplicateCheckerPlugin.run","DuplicateCheckerPlugin.getNow","DuplicateCheckerPlugin.checkDuplicate","DuplicateCheckerPlugin.checkDuplicate.getHashCodeForError","SettingsResponse","SettingsResponse.constructor","DefaultErrorParser","DefaultErrorParser.constructor","DefaultErrorParser.parse","DefaultErrorParser.parse.getParameters","DefaultErrorParser.parse.getStackFrames","DefaultModuleCollector","DefaultModuleCollector.constructor","DefaultModuleCollector.getModules","DefaultRequestInfoCollector","DefaultRequestInfoCollector.constructor","DefaultRequestInfoCollector.getRequestInfo","DefaultSubmissionAdapter","DefaultSubmissionAdapter.constructor","DefaultSubmissionAdapter.sendRequest","DefaultSubmissionAdapter.sendRequest.complete","DefaultSubmissionAdapter.sendRequest.complete.parseResponseHeaders","DefaultSubmissionAdapter.sendRequest.complete.parseResponseHeaders.trim","DefaultSubmissionAdapter.sendRequest.createRequest","getDefaultsSettingsFromScriptTag","processUnhandledException"],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AACA;AC5iCA;IAAAA;IA8EAC,CAACA;IA/DeD,yBAASA,GAAvBA,UAAwBA,OAAwCA;QAC9DE,CAACA,CAACA,OAAOA,IAAIA,IAAIA,CAACA,SAASA,CAACA,IAAIA,CAACA,OAAOA,CAACA,CAACA;IAC5CA,CAACA;I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;YACXA,OAAOA;YACPA,YAAYA;YACZA,YAAYA;SACbA,CAACA;QAEFA,IAAIA,SAASA,GAAGA,OAAOA,CAACA,WAAWA,CAACA,YAAYA,EAAEA,CAACA;QACnDA,EAAEA,CAACA,CAACA,CAACA,CAACA,SAASA,CAACA,CAACA,CAACA;YAChBA,OAAOA,CAACA,KAAKA,CAACA,IAAIA,GAAGA,OAAOA,CAACA;YAE7BA,EAAEA,CAACA,CAACA,CAACA,OAAOA,CAACA,KAAKA,CAACA,IAAIA,CAACA,SAASA,CAACA,CAACA,CAACA,CAACA;gBACnCA,IAAIA,MAAMA,GAAGA,OAAOA,CAACA,MAAMA,CAACA,MAAMA,CAACA;gBACnCA,IAAIA,MAAMA,GAAGA,MAAMA,CAACA,WAAWA,CAACA;gBAChCA,EAAEA,CAACA,CAACA,CAACA,MAAMA,CAACA,CAACA,CAACA;oBACZA,MAAMA,IAAIA,KAAKA,CAACA,8BAA8BA,CAACA,CAACA;gBAClDA,CAACA;gBAEDA,IAAIA,MAAMA,GAAGA,MAAMA,CAACA,KAAKA,CAACA,OAAOA,EAAEA,SAASA,CAACA,CAACA;gBAC9CA,EAAEA,CAACA,CAACA,CAACA,CAACA,MAAMA,CAACA,CAACA,CAACA;oBACbA,IAAIA,cAAcA,GAAGA,IAAIA,CAACA,KAAKA,CAACA,KAAKA,CAACA,SAASA,CAACA,SAASA,EAAEA,MAAMA,CAACA,cAAcA,CAACA,MAAMA,CAACA,iBAAiBA,CAACA,CAACA,CAACA,CAACA;oBAC7GA,EAAEA,CAACA,CAACA,CAACA,KAAKA,CAACA,OAAOA,CAACA,cAAcA,CAACA,CAACA,CAACA,CAACA;wBACnCA,EAAEA,CAACA,CAACA,CAACA,MAAMA,CAACA,IAAIA,CAACA,CAACA,CAACA;4BACjBA,MAAMA,CAACA,IAAIA,GAAGA,EAAEA,CAACA;wBACnBA,CAACA;wBACDA,MAAMA,CAACA,IAAIA,CAACA,MAAMA,CAACA,GAAGA,cAAcA,CAACA;oBACvCA,CAACA;oBAEDA,OAAOA,CAACA,KAAKA,CAACA,IAAIA,CAACA,SAASA,CAACA,GAA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","file":"exceptionless.js","sourcesContent":["/*\n TraceKit - Cross browser stack traces - github.com/csnover/TraceKit\n MIT license\n*/\n\n(function(window, undefined) {\nif (!window) {\n return;\n}\n\nvar TraceKit = {};\nvar _oldTraceKit = window.TraceKit;\n\n// global reference to slice\nvar _slice = [].slice;\nvar UNKNOWN_FUNCTION = '?';\n\n\n/**\n * _has, a better form of hasOwnProperty\n * Example: _has(MainHostObject, property) === true/false\n *\n * @param {Object} object to check property\n * @param {string} key to check\n */\nfunction _has(object, key) {\n return Object.prototype.hasOwnProperty.call(object, key);\n}\n\nfunction _isUndefined(what) {\n return typeof what === 'undefined';\n}\n\n/**\n * TraceKit.noConflict: Export TraceKit out to another variable\n * Example: var TK = TraceKit.noConflict()\n */\nTraceKit.noConflict = function noConflict() {\n window.TraceKit = _oldTraceKit;\n return TraceKit;\n};\n\n/**\n * TraceKit.wrap: Wrap any function in a TraceKit reporter\n * Example: func = TraceKit.wrap(func);\n *\n * @param {Function} func Function to be wrapped\n * @return {Function} The wrapped func\n */\nTraceKit.wrap = function traceKitWrapper(func) {\n function wrapped() {\n try {\n return func.apply(this, arguments);\n } catch (e) {\n TraceKit.report(e);\n throw e;\n }\n }\n return wrapped;\n};\n\n/**\n * TraceKit.report: cross-browser processing of unhandled exceptions\n *\n * Syntax:\n * TraceKit.report.subscribe(function(stackInfo) { ... })\n * TraceKit.report.unsubscribe(function(stackInfo) { ... })\n * TraceKit.report(exception)\n * try { ...code... } catch(ex) { TraceKit.report(ex); }\n *\n * Supports:\n * - Firefox: full stack trace with line numbers, plus column number\n * on top frame; column number is not guaranteed\n * - Opera: full stack trace with line and column numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n * - IE: line and column number for the top frame only; some frames\n * may be missing, and column number is not guaranteed\n *\n * In theory, TraceKit should work on all of the following versions:\n * - IE5.5+ (only 8.0 tested)\n * - Firefox 0.9+ (only 3.5+ tested)\n * - Opera 7+ (only 10.50 tested; versions 9 and earlier may require\n * Exceptions Have Stacktrace to be enabled in opera:config)\n * - Safari 3+ (only 4+ tested)\n * - Chrome 1+ (only 5+ tested)\n * - Konqueror 3.5+ (untested)\n *\n * Requires TraceKit.computeStackTrace.\n *\n * Tries to catch all unhandled exceptions and report them to the\n * subscribed handlers. Please note that TraceKit.report will rethrow the\n * exception. This is REQUIRED in order to get a useful stack trace in IE.\n * If the exception does not reach the top of the browser, you will only\n * get a stack trace from the point where TraceKit.report was called.\n *\n * Handlers receive a stackInfo object as described in the\n * TraceKit.computeStackTrace docs.\n */\nTraceKit.report = (function reportModuleWrapper() {\n var handlers = [],\n lastArgs = null,\n lastException = null,\n lastExceptionStack = null;\n\n /**\n * Add a crash handler.\n * @param {Function} handler\n */\n function subscribe(handler) {\n installGlobalHandler();\n handlers.push(handler);\n }\n\n /**\n * Remove a crash handler.\n * @param {Function} handler\n */\n function unsubscribe(handler) {\n for (var i = handlers.length - 1; i >= 0; --i) {\n if (handlers[i] === handler) {\n handlers.splice(i, 1);\n }\n }\n }\n\n /**\n * Dispatch stack information to all handlers.\n * @param {Object.} stack\n */\n function notifyHandlers(stack, isWindowError) {\n var exception = null;\n if (isWindowError && !TraceKit.collectWindowErrors) {\n return;\n }\n for (var i in handlers) {\n if (_has(handlers, i)) {\n try {\n handlers[i].apply(null, [stack].concat(_slice.call(arguments, 2)));\n } catch (inner) {\n exception = inner;\n }\n }\n }\n\n if (exception) {\n throw exception;\n }\n }\n\n var _oldOnerrorHandler, _onErrorHandlerInstalled;\n\n /**\n * Ensures all global unhandled exceptions are recorded.\n * Supported by Gecko and IE.\n * @param {string} message Error message.\n * @param {string} url URL of script that generated the exception.\n * @param {(number|string)} lineNo The line number at which the error\n * occurred.\n * @param {?(number|string)} columnNo The column number at which the error\n * occurred.\n * @param {?Error} errorObj The actual Error object.\n */\n function traceKitWindowOnError(message, url, lineNo, columnNo, errorObj) {\n var stack = null;\n\n if (lastExceptionStack) {\n TraceKit.computeStackTrace.augmentStackTraceWithInitialElement(lastExceptionStack, url, lineNo, message);\n \t processLastException();\n\t } else if (errorObj) {\n stack = TraceKit.computeStackTrace(errorObj);\n notifyHandlers(stack, true);\n } else {\n var location = {\n 'url': url,\n 'line': lineNo,\n 'column': columnNo\n };\n location.func = TraceKit.computeStackTrace.guessFunctionName(location.url, location.line);\n location.context = TraceKit.computeStackTrace.gatherContext(location.url, location.line);\n stack = {\n 'mode': 'onerror',\n 'message': message,\n 'stack': [location]\n };\n\n notifyHandlers(stack, true);\n }\n\n if (_oldOnerrorHandler) {\n return _oldOnerrorHandler.apply(this, arguments);\n }\n\n return false;\n }\n\n function installGlobalHandler () {\n if (_onErrorHandlerInstalled === true) {\n return;\n }\n _oldOnerrorHandler = window.onerror;\n window.onerror = traceKitWindowOnError;\n _onErrorHandlerInstalled = true;\n }\n\n function processLastException() {\n var _lastExceptionStack = lastExceptionStack,\n _lastArgs = lastArgs;\n lastArgs = null;\n lastExceptionStack = null;\n lastException = null;\n notifyHandlers.apply(null, [_lastExceptionStack, false].concat(_lastArgs));\n }\n /**\n * Reports an unhandled Error to TraceKit.\n * @param {Error} ex\n */\n function report(ex) {\n if (lastExceptionStack) {\n if (lastException === ex) {\n return; // already caught by an inner catch block, ignore\n } else {\n processLastException();\n }\n }\n\n var stack = TraceKit.computeStackTrace(ex);\n lastExceptionStack = stack;\n lastException = ex;\n lastArgs = _slice.call(arguments, 1);\n\n // If the stack trace is incomplete, wait for 2 seconds for\n // slow slow IE to see if onerror occurs or not before reporting\n // this exception; otherwise, we will end up with an incomplete\n // stack trace\n window.setTimeout(function () {\n if (lastException === ex) {\n processLastException();\n }\n }, (stack.incomplete ? 2000 : 0));\n\n throw ex; // re-throw to propagate to the top level (and cause window.onerror)\n }\n\n report.subscribe = subscribe;\n report.unsubscribe = unsubscribe;\n return report;\n}());\n\n/**\n * TraceKit.computeStackTrace: cross-browser stack traces in JavaScript\n *\n * Syntax:\n * s = TraceKit.computeStackTrace.ofCaller([depth])\n * s = TraceKit.computeStackTrace(exception) // consider using TraceKit.report instead (see below)\n * Returns:\n * s.name - exception name\n * s.message - exception message\n * s.stack[i].url - JavaScript or HTML file URL\n * s.stack[i].func - function name, or empty for anonymous functions (if guessing did not work)\n * s.stack[i].args - arguments passed to the function, if known\n * s.stack[i].line - line number, if known\n * s.stack[i].column - column number, if known\n * s.stack[i].context - an array of source code lines; the middle element corresponds to the correct line#\n * s.mode - 'stack', 'stacktrace', 'multiline', 'callers', 'onerror', or 'failed' -- method used to collect the stack trace\n *\n * Supports:\n * - Firefox: full stack trace with line numbers and unreliable column\n * number on top frame\n * - Opera 10: full stack trace with line and column numbers\n * - Opera 9-: full stack trace with line numbers\n * - Chrome: full stack trace with line and column numbers\n * - Safari: line and column number for the topmost stacktrace element\n * only\n * - IE: no line numbers whatsoever\n *\n * Tries to guess names of anonymous functions by looking for assignments\n * in the source code. In IE and Safari, we have to guess source file names\n * by searching for function bodies inside all page scripts. This will not\n * work for scripts that are loaded cross-domain.\n * Here be dragons: some function names may be guessed incorrectly, and\n * duplicate functions may be mismatched.\n *\n * TraceKit.computeStackTrace should only be used for tracing purposes.\n * Logging of unhandled exceptions should be done with TraceKit.report,\n * which builds on top of TraceKit.computeStackTrace and provides better\n * IE support by utilizing the window.onerror event to retrieve information\n * about the top of the stack.\n *\n * Note: In IE and Safari, no stack trace is recorded on the Error object,\n * so computeStackTrace instead walks its *own* chain of callers.\n * This means that:\n * * in Safari, some methods may be missing from the stack trace;\n * * in IE, the topmost function in the stack trace will always be the\n * caller of computeStackTrace.\n *\n * This is okay for tracing (because you are likely to be calling\n * computeStackTrace from the function you want to be the topmost element\n * of the stack trace anyway), but not okay for logging unhandled\n * exceptions (because your catch block will likely be far away from the\n * inner function that actually caused the exception).\n *\n * Tracing example:\n * function trace(message) {\n * var stackInfo = TraceKit.computeStackTrace.ofCaller();\n * var data = message + \"\\n\";\n * for(var i in stackInfo.stack) {\n * var item = stackInfo.stack[i];\n * data += (item.func || '[anonymous]') + \"() in \" + item.url + \":\" + (item.line || '0') + \"\\n\";\n * }\n * if (window.console)\n * console.info(data);\n * else\n * alert(data);\n * }\n */\nTraceKit.computeStackTrace = (function computeStackTraceWrapper() {\n var debug = false,\n sourceCache = {};\n\n /**\n * Attempts to retrieve source code via XMLHttpRequest, which is used\n * to look up anonymous function names.\n * @param {string} url URL of source code.\n * @return {string} Source contents.\n */\n function loadSource(url) {\n if (!TraceKit.remoteFetching) { //Only attempt request if remoteFetching is on.\n return '';\n }\n try {\n var getXHR = function() {\n try {\n return new window.XMLHttpRequest();\n } catch (e) {\n // explicitly bubble up the exception if not found\n return new window.ActiveXObject('Microsoft.XMLHTTP');\n }\n };\n\n var request = getXHR();\n request.open('GET', url, false);\n request.send('');\n return request.responseText;\n } catch (e) {\n return '';\n }\n }\n\n /**\n * Retrieves source code from the source code cache.\n * @param {string} url URL of source code.\n * @return {Array.} Source contents.\n */\n function getSource(url) {\n if (typeof url !== 'string') {\n return [];\n }\n\n if (!_has(sourceCache, url)) {\n // URL needs to be able to fetched within the acceptable domain. Otherwise,\n // cross-domain errors will be triggered.\n var source = '';\n var domain = '';\n try { domain = document.domain; } catch (e) {}\n var match = /(.*)\\:\\/\\/([^\\/]+)\\/{0,1}([\\s\\S]*)/.exec(url);\n if (match && match[2] === domain) {\n source = loadSource(url);\n }\n sourceCache[url] = source ? source.split('\\n') : [];\n }\n\n return sourceCache[url];\n }\n\n /**\n * Tries to use an externally loaded copy of source code to determine\n * the name of a function by looking at the name of the variable it was\n * assigned to, if any.\n * @param {string} url URL of source code.\n * @param {(string|number)} lineNo Line number in source code.\n * @return {string} The function name, if discoverable.\n */\n function guessFunctionName(url, lineNo) {\n var reFunctionArgNames = /function ([^(]*)\\(([^)]*)\\)/,\n reGuessFunction = /['\"]?([0-9A-Za-z$_]+)['\"]?\\s*[:=]\\s*(function|eval|new Function)/,\n line = '',\n maxLines = 10,\n source = getSource(url),\n m;\n\n if (!source.length) {\n return UNKNOWN_FUNCTION;\n }\n\n // Walk backwards from the first line in the function until we find the line which\n // matches the pattern above, which is the function definition\n for (var i = 0; i < maxLines; ++i) {\n line = source[lineNo - i] + line;\n\n if (!_isUndefined(line)) {\n if ((m = reGuessFunction.exec(line))) {\n return m[1];\n } else if ((m = reFunctionArgNames.exec(line))) {\n return m[1];\n }\n }\n }\n\n return UNKNOWN_FUNCTION;\n }\n\n /**\n * Retrieves the surrounding lines from where an exception occurred.\n * @param {string} url URL of source code.\n * @param {(string|number)} line Line number in source code to centre\n * around for context.\n * @return {?Array.} Lines of source code.\n */\n function gatherContext(url, line) {\n var source = getSource(url);\n\n if (!source.length) {\n return null;\n }\n\n var context = [],\n // linesBefore & linesAfter are inclusive with the offending line.\n // if linesOfContext is even, there will be one extra line\n // *before* the offending line.\n linesBefore = Math.floor(TraceKit.linesOfContext / 2),\n // Add one extra line if linesOfContext is odd\n linesAfter = linesBefore + (TraceKit.linesOfContext % 2),\n start = Math.max(0, line - linesBefore - 1),\n end = Math.min(source.length, line + linesAfter - 1);\n\n line -= 1; // convert to 0-based index\n\n for (var i = start; i < end; ++i) {\n if (!_isUndefined(source[i])) {\n context.push(source[i]);\n }\n }\n\n return context.length > 0 ? context : null;\n }\n\n /**\n * Escapes special characters, except for whitespace, in a string to be\n * used inside a regular expression as a string literal.\n * @param {string} text The string.\n * @return {string} The escaped string literal.\n */\n function escapeRegExp(text) {\n return text.replace(/[\\-\\[\\]{}()*+?.,\\\\\\^$|#]/g, '\\\\$&');\n }\n\n /**\n * Escapes special characters in a string to be used inside a regular\n * expression as a string literal. Also ensures that HTML entities will\n * be matched the same as their literal friends.\n * @param {string} body The string.\n * @return {string} The escaped string.\n */\n function escapeCodeAsRegExpForMatchingInsideHTML(body) {\n return escapeRegExp(body).replace('<', '(?:<|<)').replace('>', '(?:>|>)').replace('&', '(?:&|&)').replace('\"', '(?:\"|")').replace(/\\s+/g, '\\\\s+');\n }\n\n /**\n * Determines where a code fragment occurs in the source code.\n * @param {RegExp} re The function definition.\n * @param {Array.} urls A list of URLs to search.\n * @return {?Object.} An object containing\n * the url, line, and column number of the defined function.\n */\n function findSourceInUrls(re, urls) {\n var source, m;\n for (var i = 0, j = urls.length; i < j; ++i) {\n // console.log('searching', urls[i]);\n if ((source = getSource(urls[i])).length) {\n source = source.join('\\n');\n if ((m = re.exec(source))) {\n // console.log('Found function in ' + urls[i]);\n\n return {\n 'url': urls[i],\n 'line': source.substring(0, m.index).split('\\n').length,\n 'column': m.index - source.lastIndexOf('\\n', m.index) - 1\n };\n }\n }\n }\n\n // console.log('no match');\n\n return null;\n }\n\n /**\n * Determines at which column a code fragment occurs on a line of the\n * source code.\n * @param {string} fragment The code fragment.\n * @param {string} url The URL to search.\n * @param {(string|number)} line The line number to examine.\n * @return {?number} The column number.\n */\n function findSourceInLine(fragment, url, line) {\n var source = getSource(url),\n re = new RegExp('\\\\b' + escapeRegExp(fragment) + '\\\\b'),\n m;\n\n line -= 1;\n\n if (source && source.length > line && (m = re.exec(source[line]))) {\n return m.index;\n }\n\n return null;\n }\n\n /**\n * Determines where a function was defined within the source code.\n * @param {(Function|string)} func A function reference or serialized\n * function definition.\n * @return {?Object.} An object containing\n * the url, line, and column number of the defined function.\n */\n function findSourceByFunctionBody(func) {\n if (_isUndefined(document)) {\n return;\n }\n\n var urls = [window.location.href],\n scripts = document.getElementsByTagName('script'),\n body,\n code = '' + func,\n codeRE = /^function(?:\\s+([\\w$]+))?\\s*\\(([\\w\\s,]*)\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n eventRE = /^function on([\\w$]+)\\s*\\(event\\)\\s*\\{\\s*(\\S[\\s\\S]*\\S)\\s*\\}\\s*$/,\n re,\n parts,\n result;\n\n for (var i = 0; i < scripts.length; ++i) {\n var script = scripts[i];\n if (script.src) {\n urls.push(script.src);\n }\n }\n\n if (!(parts = codeRE.exec(code))) {\n re = new RegExp(escapeRegExp(code).replace(/\\s+/g, '\\\\s+'));\n }\n\n // not sure if this is really necessary, but I don’t have a test\n // corpus large enough to confirm that and it was in the original.\n else {\n var name = parts[1] ? '\\\\s+' + parts[1] : '',\n args = parts[2].split(',').join('\\\\s*,\\\\s*');\n\n body = escapeRegExp(parts[3]).replace(/;$/, ';?'); // semicolon is inserted if the function ends with a comment.replace(/\\s+/g, '\\\\s+');\n re = new RegExp('function' + name + '\\\\s*\\\\(\\\\s*' + args + '\\\\s*\\\\)\\\\s*{\\\\s*' + body + '\\\\s*}');\n }\n\n // look for a normal function definition\n if ((result = findSourceInUrls(re, urls))) {\n return result;\n }\n\n // look for an old-school event handler function\n if ((parts = eventRE.exec(code))) {\n var event = parts[1];\n body = escapeCodeAsRegExpForMatchingInsideHTML(parts[2]);\n\n // look for a function defined in HTML as an onXXX handler\n re = new RegExp('on' + event + '=[\\\\\\'\"]\\\\s*' + body + '\\\\s*[\\\\\\'\"]', 'i');\n\n if ((result = findSourceInUrls(re, urls[0]))) {\n return result;\n }\n\n // look for ???\n re = new RegExp(body);\n\n if ((result = findSourceInUrls(re, urls))) {\n return result;\n }\n }\n\n return null;\n }\n\n // Contents of Exception in various browsers.\n //\n // SAFARI:\n // ex.message = Can't find variable: qq\n // ex.line = 59\n // ex.sourceId = 580238192\n // ex.sourceURL = http://...\n // ex.expressionBeginOffset = 96\n // ex.expressionCaretOffset = 98\n // ex.expressionEndOffset = 98\n // ex.name = ReferenceError\n //\n // FIREFOX:\n // ex.message = qq is not defined\n // ex.fileName = http://...\n // ex.lineNumber = 59\n // ex.columnNumber = 69\n // ex.stack = ...stack trace... (see the example below)\n // ex.name = ReferenceError\n //\n // CHROME:\n // ex.message = qq is not defined\n // ex.name = ReferenceError\n // ex.type = not_defined\n // ex.arguments = ['aa']\n // ex.stack = ...stack trace...\n //\n // INTERNET EXPLORER:\n // ex.message = ...\n // ex.name = ReferenceError\n //\n // OPERA:\n // ex.message = ...message... (see the example below)\n // ex.name = ReferenceError\n // ex.opera#sourceloc = 11 (pretty much useless, duplicates the info in ex.message)\n // ex.stacktrace = n/a; see 'opera:config#UserPrefs|Exceptions Have Stacktrace'\n\n /**\n * Computes stack trace information from the stack property.\n * Chrome and Gecko use this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStackProp(ex) {\n if (!ex.stack) {\n return null;\n }\n\n var chrome = /^\\s*at (.*?) ?\\(((?:file|https?|blob|chrome-extension|native|eval).*?)(?::(\\d+))?(?::(\\d+))?\\)?\\s*$/i,\n gecko = /^\\s*(.*?)(?:\\((.*?)\\))?(?:^|@)((?:file|https?|blob|chrome|\\[).*?)(?::(\\d+))?(?::(\\d+))?\\s*$/i,\n winjs = /^\\s*at (?:((?:\\[object object\\])?.+) )?\\(?((?:ms-appx|https?|blob):.*?):(\\d+)(?::(\\d+))?\\)?\\s*$/i,\n lines = ex.stack.split('\\n'),\n stack = [],\n parts,\n element,\n reference = /^(.*) is undefined$/.exec(ex.message);\n\n for (var i = 0, j = lines.length; i < j; ++i) {\n if ((parts = chrome.exec(lines[i]))) {\n var isNative = parts[2] && parts[2].indexOf('native') !== -1;\n element = {\n 'url': !isNative ? parts[2] : null,\n 'func': parts[1] || UNKNOWN_FUNCTION,\n 'args': isNative ? [parts[2]] : [],\n 'line': parts[3] ? +parts[3] : null,\n 'column': parts[4] ? +parts[4] : null\n };\n } else if ( parts = winjs.exec(lines[i]) ) {\n element = {\n 'url': parts[2],\n 'func': parts[1] || UNKNOWN_FUNCTION,\n 'args': [],\n 'line': +parts[3],\n 'column': parts[4] ? +parts[4] : null\n };\n } else if ((parts = gecko.exec(lines[i]))) {\n element = {\n 'url': parts[3],\n 'func': parts[1] || UNKNOWN_FUNCTION,\n 'args': parts[2] ? parts[2].split(',') : [],\n 'line': parts[4] ? +parts[4] : null,\n 'column': parts[5] ? +parts[5] : null\n };\n } else {\n continue;\n }\n\n if (!element.func && element.line) {\n element.func = guessFunctionName(element.url, element.line);\n }\n\n if (element.line) {\n element.context = gatherContext(element.url, element.line);\n }\n\n stack.push(element);\n }\n\n if (!stack.length) {\n return null;\n }\n\n if (stack[0] && stack[0].line && !stack[0].column && reference) {\n stack[0].column = findSourceInLine(reference[1], stack[0].url, stack[0].line);\n } else if (!stack[0].column && !_isUndefined(ex.columnNumber)) {\n // FireFox uses this awesome columnNumber property for its top frame\n // Also note, Firefox's column number is 0-based and everything else expects 1-based,\n // so adding 1\n stack[0].column = ex.columnNumber + 1;\n }\n\n return {\n 'mode': 'stack',\n 'name': ex.name,\n 'message': ex.message,\n 'stack': stack\n };\n }\n\n /**\n * Computes stack trace information from the stacktrace property.\n * Opera 10+ uses this property.\n * @param {Error} ex\n * @return {?Object.} Stack trace information.\n */\n function computeStackTraceFromStacktraceProp(ex) {\n // Access and store the stacktrace property before doing ANYTHING\n // else to it because Opera is not very good at providing it\n // reliably in other circumstances.\n var stacktrace = ex.stacktrace;\n if (!stacktrace) {\n return;\n }\n\n var opera10Regex = / line (\\d+).*script (?:in )?(\\S+)(?:: in function (\\S+))?$/i,\n opera11Regex = / line (\\d+), column (\\d+)\\s*(?:in (?:]+)>|([^\\)]+))\\((.*)\\))? in (.*):\\s*$/i,\n lines = stacktrace.split('\\n'),\n stack = [],\n parts;\n\n for (var line = 0; line < lines.length; line += 2) {\n var element = null;\n if ((parts = opera10Regex.exec(lines[line]))) {\n element = {\n 'url': parts[2],\n 'line': +parts[1],\n 'column': null,\n 'func': parts[3],\n 'args':[]\n };\n } else if ((parts = opera11Regex.exec(lines[line]))) {\n element = {\n 'url': parts[6],\n 'line': +parts[1],\n 'column': +parts[2],\n 'func': parts[3] || parts[4],\n 'args': parts[5] ? parts[5].split(',') : []\n };\n }\n\n if (element) {\n if (!element.func && element.line) {\n element.func = guessFunctionName(element.url, element.line);\n }\n if (element.line) {\n try {\n element.context = gatherContext(element.url, element.line);\n } catch (exc) {}\n }\n\n if (!element.context) {\n element.context = [lines[line + 1]];\n }\n\n stack.push(element);\n }\n }\n\n if (!stack.length) {\n return null;\n }\n\n return {\n 'mode': 'stacktrace',\n 'name': ex.name,\n 'message': ex.message,\n 'stack': stack\n };\n }\n\n /**\n * NOT TESTED.\n * Computes stack trace information from an error message that includes\n * the stack trace.\n * Opera 9 and earlier use this method if the option to show stack\n * traces is turned on in opera:config.\n * @param {Error} ex\n * @return {?Object.} Stack information.\n */\n function computeStackTraceFromOperaMultiLineMessage(ex) {\n // TODO: Clean this function up\n // Opera includes a stack trace into the exception message. An example is:\n //\n // Statement on line 3: Undefined variable: undefinedFunc\n // Backtrace:\n // Line 3 of linked script file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.js: In function zzz\n // undefinedFunc(a);\n // Line 7 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function yyy\n // zzz(x, y, z);\n // Line 3 of inline#1 script in file://localhost/Users/andreyvit/Projects/TraceKit/javascript-client/sample.html: In function xxx\n // yyy(a, a, a);\n // Line 1 of function script\n // try { xxx('hi'); return false; } catch(ex) { TraceKit.report(ex); }\n // ...\n\n var lines = ex.message.split('\\n');\n if (lines.length < 4) {\n return null;\n }\n\n var lineRE1 = /^\\s*Line (\\d+) of linked script ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n lineRE2 = /^\\s*Line (\\d+) of inline#(\\d+) script in ((?:file|https?|blob)\\S+)(?:: in function (\\S+))?\\s*$/i,\n lineRE3 = /^\\s*Line (\\d+) of function script\\s*$/i,\n stack = [],\n scripts = document.getElementsByTagName('script'),\n inlineScriptBlocks = [],\n parts;\n\n for (var s in scripts) {\n if (_has(scripts, s) && !scripts[s].src) {\n inlineScriptBlocks.push(scripts[s]);\n }\n }\n\n for (var line = 2; line < lines.length; line += 2) {\n var item = null;\n if ((parts = lineRE1.exec(lines[line]))) {\n item = {\n 'url': parts[2],\n 'func': parts[3],\n 'args': [],\n 'line': +parts[1],\n 'column': null\n };\n } else if ((parts = lineRE2.exec(lines[line]))) {\n item = {\n 'url': parts[3],\n 'func': parts[4],\n 'args': [],\n 'line': +parts[1],\n 'column': null // TODO: Check to see if inline#1 (+parts[2]) points to the script number or column number.\n };\n var relativeLine = (+parts[1]); // relative to the start of the