Skip to content
This repository was archived by the owner on Mar 4, 2022. It is now read-only.
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 3 additions & 0 deletions lib/constants.js
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,8 @@ var AGGREGATE_TIME_LEVELS = [
"3600000"
];

var MILLISECONDS_PER_SECOND = 1000;

// this array object is used to reduce ms to its highest human-readable form
// see lib/providers/metrics-provider.js::getTimeIndexLabel
var TIME_SCALES = [
Expand All @@ -49,5 +51,6 @@ var TIME_SCALES = [

module.exports = {
AGGREGATE_TIME_LEVELS: AGGREGATE_TIME_LEVELS,
MILLISECONDS_PER_SECOND: MILLISECONDS_PER_SECOND,
TIME_SCALES: TIME_SCALES
};
100 changes: 100 additions & 0 deletions lib/layout-config-schema.json
Original file line number Diff line number Diff line change
Expand Up @@ -27,6 +27,16 @@
"$ref": "#/definitions/lineGraphView"
}, {
"$ref": "#/definitions/customView"
}, {
"$ref": "#/definitions/cpuDetailsView"
}, {
"$ref": "#/definitions/envDetailsView"
}, {
"$ref": "#/definitions/nodeDetailsView"
}, {
"$ref": "#/definitions/systemDetailsView"
}, {
"$ref": "#/definitions/userDetailsView"
}]
}
}
Expand Down Expand Up @@ -125,6 +135,96 @@
},
"required": ["module"]
},
"cpuDetailsView": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"borderColor": {
"type": "string"
},
"type": {
"enum": ["cpuDetails"]
},
"position": {
"$ref": "#/definitions/position"
}
},
"required": ["type"]
},
"envDetailsView": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"borderColor": {
"type": "string"
},
"type": {
"enum": ["envDetails"]
},
"position": {
"$ref": "#/definitions/position"
}
},
"required": ["type"]
},
"nodeDetailsView": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"borderColor": {
"type": "string"
},
"type": {
"enum": ["nodeDetails"]
},
"position": {
"$ref": "#/definitions/position"
}
},
"required": ["type"]
},
"systemDetailsView": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"borderColor": {
"type": "string"
},
"type": {
"enum": ["systemDetails"]
},
"position": {
"$ref": "#/definitions/position"
}
},
"required": ["type"]
},
"userDetailsView": {
"type": "object",
"properties": {
"title": {
"type": "string"
},
"borderColor": {
"type": "string"
},
"type": {
"enum": ["userDetails"]
},
"position": {
"$ref": "#/definitions/position"
}
},
"required": ["type"]
},
"position": {
"oneOf": [{
"type": "object",
Expand Down
54 changes: 54 additions & 0 deletions lib/views/base-details-view.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,54 @@
"use strict";

var blessed = require("blessed");
var _ = require("lodash");
var BaseView = require("./base-view");

var BaseDetailsView = function BaseDetailsView(options) {
BaseView.call(this, options);

this.screen = options.parent.screen;
this.node = blessed.box(this.layoutConfig);
this.parent.append(this.node);

this.refreshContent();
this.recalculatePosition();
};

BaseDetailsView.prototype = Object.create(BaseView.prototype);

BaseDetailsView.prototype.refreshContent = function () {
this.node.setContent(this._getBoxContent(this.getDetails()));
this.screen.render();
};

BaseDetailsView.prototype.getDetails = function () {
return [];
};

/**
* Given data and optional filters, return the content for a box.
*
* @param {Object[]} data
* This is the array of label/data objects that define each data
* point for the box.
*
* @returns {String}
* The content string for the box is returned.
*/
BaseDetailsView.prototype._getBoxContent = function (data) {
var longestLabel = _.reduce(data, function (prev, detail) {
return Math.max(prev, detail.label.length);
}, 0);

var getFormattedContent = function (prev, details) {
prev += "{cyan-fg}{bold}" + details.label + "{/}"
+ _.repeat(" ", longestLabel - details.label.length + 1)
+ "{green-fg}" + details.data + "{/}\n";
return prev;
};

return _.trimEnd(_.reduce(data, getFormattedContent, ""), "\n");
};

module.exports = BaseDetailsView;
37 changes: 37 additions & 0 deletions lib/views/cpu-details-view.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,37 @@
"use strict";

var os = require("os");
var _ = require("lodash");
var BaseDetailsView = require("./base-details-view");

var CpuDetailsView = function CpuDetailsView(options) {
BaseDetailsView.call(this, options);
};

CpuDetailsView.prototype = Object.create(BaseDetailsView.prototype);

CpuDetailsView.prototype.getDetails = function () {
var cpuInfo = os.cpus();

return _.map(cpuInfo, function (info, index) {
return {
label: "[" + index + "]",
data: info.model + " " + info.speed
};
});
};

CpuDetailsView.prototype.getDefaultLayoutConfig = function () {
return {
label: " CPU(s) ",
border: "line",
tags: true,
style: {
border: {
fg: "white"
}
}
};
};

module.exports = CpuDetailsView;
47 changes: 47 additions & 0 deletions lib/views/env-details-view.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
"use strict";

var _ = require("lodash");
var BaseDetailsView = require("./base-details-view");

var EnvDetailsView = function EnvDetailsView(options) {
BaseDetailsView.call(this, options);
};

EnvDetailsView.prototype = Object.create(BaseDetailsView.prototype);

EnvDetailsView.prototype.getDefaultLayoutConfig = function () {
return {
label: " Environment Variables ",
border: "line",
style: {
border: {
fg: "white"
}
},
tags: true,
scrollable: true,
keys: true,
input: true,
scrollbar: {
style: {
fg: "white",
inverse: true
},
track: {
ch: ":",
fg: "cyan"
}
}
};
};

EnvDetailsView.prototype.getDetails = function () {
return _.map(process.env, function (value, key) {
return {
label: key,
data: value
};
});
};

module.exports = EnvDetailsView;
11 changes: 11 additions & 0 deletions lib/views/index.js
Original file line number Diff line number Diff line change
Expand Up @@ -6,8 +6,18 @@ var MemoryGaugeView = require("./memory-gauge-view");
var MemoryGraphView = require("./memory-graph-view");
var CpuView = require("./cpu-view");
var BaseView = require("./base-view");
var CpuDetailsView = require("./cpu-details-view");
var EnvDetailsView = require("./env-details-view");
var NodeDetailsView = require("./node-details-view");
var SystemDetailsView = require("./system-details-view");
var UserDetailsView = require("./user-details-view");

var VIEW_MAP = {
cpuDetails: CpuDetailsView,
envDetails: EnvDetailsView,
nodeDetails: NodeDetailsView,
systemDetails: SystemDetailsView,
userDetails: UserDetailsView,
log: StreamView,
cpu: CpuView,
memory: MemoryGaugeView,
Expand All @@ -16,6 +26,7 @@ var VIEW_MAP = {
};

var getConstructor = function (options) {
options = options || {};
if (VIEW_MAP[options.type]) {
return VIEW_MAP[options.type];
} else if (options.module) {
Expand Down
59 changes: 59 additions & 0 deletions lib/views/node-details-view.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,59 @@
"use strict";

var BaseDetailsView = require("./base-details-view");
var time = require("../time");
var MILLISECONDS_PER_SECOND = require("../constants").MILLISECONDS_PER_SECOND;
var UPTIME_INTERVAL_MS = MILLISECONDS_PER_SECOND;

var NodeDetailsView = function NodeDetailsView(options) {
BaseDetailsView.call(this, options);

this.setupdate();
this.node.on("attach", this.setupdate.bind(this));

this.node.on("detach", function () {
if (this.uptimeInterval) {
clearInterval(this.uptimeInterval);
delete this.uptimeInterval;
}
}.bind(this));
};

NodeDetailsView.prototype = Object.create(BaseDetailsView.prototype);

NodeDetailsView.prototype.setupdate = function () {
this.uptimeInterval = this.uptimeInterval || setInterval(function () {
this.refreshContent();
}.bind(this), UPTIME_INTERVAL_MS);
};

NodeDetailsView.prototype.getDetails = function () {
return [
{
label: "Version",
data: process.version
}, {
label: "LTS",
data: process.release.lts
}, {
label: "Uptime",
data: time.getLabel(process.uptime() * MILLISECONDS_PER_SECOND)
}
];
};

NodeDetailsView.prototype.getDefaultLayoutConfig = function () {
return {
label: " Node ",
border: "line",
tags: true,
height: "shrink",
style: {
border: {
fg: "white"
}
}
};
};

module.exports = NodeDetailsView;
Loading