Skip to content

Commit e320e20

Browse files
committed
adding errors flows
perf improvements, now only displays max 200 points
1 parent e4edb02 commit e320e20

9 files changed

Lines changed: 157 additions & 80 deletions

File tree

package.json

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,10 +1,10 @@
11
{
22
"name": "esp-js-devtools",
3-
"version": "0.0.7",
3+
"version": "0.0.8",
44
"description": "Evented State Processor (ESP) dev tools",
55
"main": "dist/esp-js-devtools.js",
66
"scripts": {
7-
"start": "npm run build",
7+
"start": "npm run build:dev",
88
"build:dev": "webpack --config webpack.dev.config.js",
99
"dev": "webpack --progress --watch --colors --hot --debug --display-chunks --config webpack.dev.config.js"
1010
},
@@ -13,7 +13,7 @@
1313
"repository": "https://github.com/esp/esp-js",
1414
"dependencies": {
1515
"babel-plugin-transform-runtime": "^6.4.3",
16-
"esp-js": "^0.5.14",
16+
"esp-js": "^0.5.15",
1717
"install": "^0.4.2",
1818
"jquery": "^2.2.0",
1919
"jquery-ui": "^1.10.5",

src/model/analyticsMonitor.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ export default class AnalyticsMonitor {
5050
}
5151
halted(modelIds, err) {
5252
if(modelIds.indexOf(DebugToolsModel.modelId) >=0 ) return;
53-
this._router.publishEvent('halted', {modelIds: modelIds, err: err});
53+
this._router.publishEvent('routerHalted', {modelIds: modelIds, err: err});
5454
}
5555
registerMonitor(devToolsDiagnosticMonitor) {
5656

src/model/dataPoint.js

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
import DataPointType from './dataPointType';
2+
let dataPointId = 1;
3+
4+
export default class DataPoint {
5+
constructor(publishedTime, data, modelId, pointType) {
6+
this._pointId = dataPointId++;
7+
this._data = data;
8+
this._publishedTime = publishedTime;
9+
this._modelId = modelId;
10+
this._pointType = pointType;
11+
}
12+
get pointId() {
13+
return this._pointId;
14+
}
15+
get data() {
16+
return this._data;
17+
}
18+
get publishedTime() {
19+
return this._publishedTime;
20+
}
21+
get modelId() {
22+
return this._modelId;
23+
}
24+
get pointType() {
25+
return this._pointType;
26+
}
27+
}

src/model/dataPointType.js

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,4 @@
1+
export default class DataPointType {
2+
static get eventPublished() { return 'eventPublished'; };
3+
static get routerHalted() { return 'routerHalted'; };
4+
}

src/model/devToolsModel.js

Lines changed: 64 additions & 26 deletions
Original file line numberDiff line numberDiff line change
@@ -3,23 +3,28 @@ import _ from 'lodash';
33
import moment from 'moment';
44
import UpdateType from './updateType';
55
import RegisteredModel from './registeredModel';
6+
import DataPoint from './dataPoint';
67
import { unregisterDevTools } from '../devtoolsHooks';
8+
import DataPointType from './dataPointType';
79

810
export default class DevToolsModel extends esp.model.DisposableBase {
911
constructor(router) {
1012
super();
1113
this._router = router;
1214
this._registeredModels = {};
13-
this._eventsByNumber = {};
14-
this._lastEvent = null;
15-
this._selectedEvent = null;
16-
this._updateType = UpdateType.none;
17-
this._eventCounter = 0;
15+
this._dataPointsById = {};
16+
this._dataPoints = [];
17+
this._newDataPoints = [];
18+
this._dataPointsIdsToRemove = [];
19+
this._selectedDataPoint = null;
20+
this._updateType = [];
21+
this._processedDataPointCount = 0;
1822
this._timerSubscription = null;
1923
this._now = moment();
2024
this._shouldAutoScroll = true;
2125
this._shouldCaptureEvents = true;
2226
this._shouldLogToConsole = false;
27+
this._eventBufferSize = 200;
2328
}
2429
static get modelId() {
2530
return 'esp-debugTools';
@@ -30,27 +35,31 @@ export default class DevToolsModel extends esp.model.DisposableBase {
3035
get registeredModels() {
3136
return _.values(this._registeredModels);
3237
}
33-
get lastEvent() {
34-
return this._lastEvent;
38+
get newDataPoints() {
39+
return this._newDataPoints;
3540
}
36-
get selectedEvent() {
37-
return this._selectedEvent;
41+
get selectedDataPoint() {
42+
return this._selectedDataPoint;
3843
}
3944
get now() {
4045
return this._now;
4146
}
4247
get shouldAutoScroll() {
4348
return this._shouldAutoScroll;
4449
}
45-
get totalEventCount() {
46-
return this._eventCounter;
50+
get dataPointsIdsToRemove() {
51+
return this._dataPointsIdsToRemove;
52+
}
53+
get processedDataPointCount() {
54+
return this._processedDataPointCount;
4755
}
4856
observeEvents() {
4957
this.addDisposable(this._router.observeEventsOn(this));
5058
}
5159
preProcess() {
52-
this._updateType = UpdateType.none;
53-
this._lastEvent = null;
60+
this._updateType = [];
61+
this._newDataPoints = [];
62+
this._dataPointsIdsToRemove = [];
5463
}
5564
@esp.observeEvent('modelAdded', esp.ObservationStage.preview)
5665
@esp.observeEvent('modelRemoved', esp.ObservationStage.preview)
@@ -66,30 +75,44 @@ export default class DevToolsModel extends esp.model.DisposableBase {
6675
}
6776
@esp.observeEvent('modelAdded')
6877
_onModelAdded(event) {
69-
this._updateType = UpdateType.modelsChanged;
78+
this._updateType.push(UpdateType.modelsChanged);
7079
this._addModel(event.modelId);
7180
}
7281
@esp.observeEvent('modelRemoved')
7382
_onModelRemoved(event) {
74-
this._updateType = UpdateType.modelsChanged;
83+
this._updateType.push(UpdateType.modelsChanged);
7584
delete this._registeredModels[event.modelId];
7685
}
7786
@esp.observeEvent('eventPublished')
7887
_onEventPublished(event) {
79-
this._updateType = UpdateType.eventsChanged;
88+
this._updateType.push(UpdateType.eventsChanged);
8089
let registeredModel = this._registeredModels[event.modelId];
8190
if (!registeredModel) {
82-
registeredModel = this._addModel(event.modelId);
91+
this._addModel(event.modelId);
8392
}
84-
this._eventCounter++;
85-
this._lastEvent = registeredModel.eventPublished(this._eventCounter, event.modelId, event.eventType);
86-
this._eventsByNumber[this._eventCounter] = this._lastEvent;
93+
var dataPoint = new DataPoint(moment(), event.eventType, event.modelId, DataPointType.eventPublished);
94+
this._addDataPoint(dataPoint);
8795
if(this._shouldLogToConsole) {
8896
console.log(`[ESP-Event] ModelId:[${event.modelId}] EventType:[${event.eventType}]`, event.event);
8997
}
9098
}
99+
@esp.observeEvent('routerHalted')
100+
_onRouterHalted(event) {
101+
for (var i = 0; i < event.modelIds.length; i++) {
102+
var modelId = event.modelIds[i];
103+
let registeredModel = this._registeredModels[modelId];
104+
if(registeredModel) {
105+
var dataPoint = new DataPoint(moment(), event.err, modelId, DataPointType.routerHalted);
106+
registeredModel.haltingError = event.err;
107+
registeredModel.isHalted = true;
108+
this._addDataPoint(dataPoint);
109+
}
110+
}
111+
this._updateType.push(UpdateType.modelsChanged);
112+
this._updateType.push(UpdateType.eventsChanged);
113+
}
91114
_addModel(modelId) {
92-
this._updateType = UpdateType.modelsChanged;
115+
this._updateType.push(UpdateType.modelsChanged);
93116
let registeredModel = this._registeredModels[modelId];
94117
if(registeredModel) {
95118
throw new Error(`model with id ${modelId} already registered`);
@@ -98,10 +121,25 @@ export default class DevToolsModel extends esp.model.DisposableBase {
98121
this._registeredModels[modelId] = registeredModel;
99122
return registeredModel;
100123
}
101-
@esp.observeEvent('eventSelected')
102-
_onEventSelected(event) {
124+
_addDataPoint(dataPoint) {
125+
this._dataPointsById[dataPoint.pointId] = dataPoint;
126+
this._dataPoints.push(dataPoint);
127+
this._newDataPoints.push(dataPoint);
128+
this._processedDataPointCount++;
129+
if(this._processedDataPointCount > this._eventBufferSize) {
130+
let numberToRemove = this._dataPoints.length - this._eventBufferSize;
131+
let removedItems = this._dataPoints.splice(0, numberToRemove);
132+
for (let i = 0; i < removedItems.length; i++) {
133+
let dataPointToRemove = removedItems[i];
134+
this._dataPointsIdsToRemove.push(dataPointToRemove.pointId);
135+
delete this._dataPointsById[dataPointToRemove.pointId];
136+
}
137+
}
138+
}
139+
@esp.observeEvent('pointSelected')
140+
_onPointSelected(event) {
103141
this._shouldAutoScroll = false;
104-
this._selectedEvent = this._eventsByNumber[event.eventNumber];
142+
this._selectedDataPoint = this._dataPointsById[event.pointId];
105143
}
106144
@esp.observeEvent('disableAutoScroll')
107145
_onDisableAutoScroll(event) {
@@ -135,13 +173,13 @@ export default class DevToolsModel extends esp.model.DisposableBase {
135173
// start a timer so we can keep moving the chart forward
136174
this._timerSubscription = setInterval(() => {
137175
this._router.runAction(() => {
138-
this._updateType = UpdateType.timeChanged;
176+
this._updateType.push(UpdateType.timeChanged);
139177
this._now = moment();
140178
});
141179
}, 1000);
142180
}
143181
_reset() {
144-
this._updateType = UpdateType.reset;
182+
this._updateType.push(UpdateType.reset);
145183
this._registeredModels = {};
146184
}
147185
_stopTimer() {

src/model/eventRecord.js

Lines changed: 0 additions & 20 deletions
This file was deleted.

src/model/registeredModel.js

Lines changed: 21 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1,20 +1,33 @@
11
import moment from 'moment';
2-
import EventRecord from './eventRecord';
2+
import DataPoint from './dataPoint';
33

44
export default class RegisteredModel {
55
constructor(modelId) {
66
this._modelId = modelId;
7-
this._events = [];
7+
this._isHalted = false;
8+
this._haltingError = null;
89
}
910
get modelId() {
1011
return this._modelId;
1112
}
12-
get events() {
13-
return this._events;
13+
get isHalted() {
14+
return this._isHalted;
1415
}
15-
eventPublished(eventNumber, modelId, eventType) {
16-
var eventRecord = new EventRecord(eventNumber, moment(), eventType, modelId);
17-
this._events.push(eventRecord);
18-
return eventRecord;
16+
set isHalted(isHalted) {
17+
this._isHalted = isHalted;
1918
}
19+
get haltingError() {
20+
return this._haltingError;
21+
}
22+
set haltingError(err) {
23+
this._haltingError = err;
24+
}
25+
//createEventPublishedDataPoint(eventNumber, modelId, eventType) {
26+
// var dataPoint = new DataPoint(eventNumber, moment(), eventType, modelId);
27+
// this._events.push(dataPoint);
28+
// return eventRecord;
29+
//}
30+
//halted(eventNumber, modelId, eventType) {
31+
//
32+
//}
2033
}

src/views/devToolsView.js

Lines changed: 34 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@ import 'vis/dist/vis.css';
88
import './devToolsView.less'
99
import UpdateType from '../model/updateType';
1010
import template from './devToolsView.template.html';
11+
import DataPointType from '../model/dataPointType';
1112

1213
export default class DevToolsView extends esp.model.DisposableBase {
1314

@@ -31,26 +32,41 @@ export default class DevToolsView extends esp.model.DisposableBase {
3132
this.addDisposable(
3233
this._router.getModelObservable()
3334
.observe(model => {
34-
if (model.updateType === UpdateType.modelsChanged) {
35-
for (var i = 0; i < model.registeredModels.length; i++) {
36-
var registeredModel = model.registeredModels[i];
35+
if (model.updateType.indexOf(UpdateType.modelsChanged) >= 0) {
36+
for (let i = 0; i < model.registeredModels.length; i++) {
37+
let registeredModel = model.registeredModels[i];
38+
let groupStyle = registeredModel.isHalted
39+
? 'background:red'
40+
: '';
3741
this._timelineGroups.update({
3842
id: registeredModel.modelId,
39-
content: registeredModel.modelId
43+
content: registeredModel.modelId,
44+
style:groupStyle
4045
});
4146
}
42-
} else if (model.updateType === UpdateType.eventsChanged) {
43-
this._timelineData.add({
44-
id: model.lastEvent.eventNumber,
45-
group: model.lastEvent.modelId,
46-
title: model.lastEvent.eventType,
47-
start: model.lastEvent.publishedTime
48-
});
49-
} else if (model.updateType === UpdateType.reset) {
47+
}
48+
if (model.updateType.indexOf(UpdateType.eventsChanged) >= 0) {
49+
for (var i = 0; i < model.newDataPoints.length; i++) {
50+
var dataPoint = model.newDataPoints[i];
51+
let pointStyle = dataPoint.pointType == DataPointType.routerHalted
52+
? 'background:red'
53+
: '';
54+
this._timelineData.add({
55+
id: dataPoint.pointId,
56+
group: dataPoint.modelId,
57+
title: dataPoint.data,
58+
start: dataPoint.publishedTime,
59+
style: pointStyle
60+
});
61+
}
62+
if(model.dataPointsIdsToRemove.length > 0) {
63+
this._timelineData.remove(model.dataPointsIdsToRemove);
64+
}
65+
}
66+
if (model.updateType.indexOf(UpdateType.reset) >= 0) {
5067
this._timelineGroups.clear();
5168
this._timelineData.clear();
5269
}
53-
5470
if (this._timeline) {
5571
this._timeline.setOptions({max: moment().add(2, 'm')})
5672
if (model.shouldAutoScroll) {
@@ -59,11 +75,10 @@ export default class DevToolsView extends esp.model.DisposableBase {
5975
if (this._autoscrollCheckbox.prop('checked') !== model.shouldAutoScroll) {
6076
this._autoscrollCheckbox.prop('checked', model.shouldAutoScroll);
6177
}
62-
63-
if (this._eventDetailsDescriptionP && model.selectedEvent) {
64-
this._eventDetailsDescriptionP.html(JSON.stringify(model.selectedEvent));
78+
if (this._eventDetailsDescriptionP && model.selectedDataPoint) {
79+
this._eventDetailsDescriptionP.html(JSON.stringify(model.selectedDataPoint));
6580
}
66-
this._footer.html(`Total events: ${model.totalEventCount}`);
81+
this._footer.html(`Total events: ${model.processedDataPointCount}`);
6782
}
6883
})
6984
);
@@ -143,8 +158,8 @@ export default class DevToolsView extends esp.model.DisposableBase {
143158
timeline.on('select', properties => {
144159
let pointId = properties.items[0];
145160
this._router.publishEvent(
146-
'eventSelected', {
147-
eventNumber: pointId
161+
'pointSelected', {
162+
pointId: pointId
148163
}
149164
);
150165
});

0 commit comments

Comments
 (0)