var monitor_clientId = (new Date()).getTime();
var monitor_serviceDS = openConsole.RestDataSource.create({
ID:"monitor_serviceDS",
fields:[
{name:"itemId", title:"ID", primaryKey:true},
{name:"itemName", title:"Name"},
{name:"parentId", title:"Parent", foreignKey:"itemId"}
],
dataURL:"/update_services"
});
var monitor_serviceListPane = openConsole.TreeGrid.create({
ID: "monitor_serviceTree",
height: "65%",
dataSource: "monitor_serviceDS",
nodeIcon: "/public/images/service_topic.png",
folderIcon: "/public/images/service.png",
emptyMessage: "No services found on fabric.",
fields: [
{name: "itemName", title: "Services"}
],
rowDoubleClick: function (record) {
if(record.parentId === null)
{
var w = openConsole.Window.create({
title: "Service Details",
items: [
openConsole.DetailViewer.create({
data:record,
fields:[
{name:"itemId", title:"ID", primaryKey:true},
{name:"serviceType", title:"Service Type", type: "string"},
{name:"brokerGuid", title:"Broker ID", type: "string"},
{name:"clientGuid", title:"Client ID", type: "string"},
{name:"managed", title:"Managed", type: "string"},
{name:"registrationTime", title:"Registration Time", type: "string"},
{name:"ttlMins", title:"TTL(min)", type: "string"},
{name:"requestTopics", title:"Request Topics", type: "string"},
{name:"unauthorizedTopics", title:"Unauthorized Topics", type: "string"},
{name:"certificates", title:"Certificates", type: "string"},
{name:"metaData", title:"META Data", type: "string"}
],
formatCellValue: function formatCellValue(value, record, field) {
if(value != null) {
if(field.name === "requestTopics" || field.name === "certificates") {
return value.join(",
");
} else if(field.name === "unauthorizedTopics") {
return "" + value.join(",
") + "";
} else if(field.name === "registrationTime") {
var registrationDate = new Date(value * 1000);
return registrationDate.toLocaleString();
}
}
return value;
}
})
]
});
openConsole.Window.show(w);
return false;
}
},
rowClick: function (record) {
if(record.parentId != null) {
monitor_sendMessageForm.getField('type').setValue('Request');
monitor_sendMessageForm.getField('topic').setValue(record.itemName);
monitor_sendMessageForm.getField('payload').setValue('');
}
return false;
}
/*
getCellCSSText : function( record, rowNum, colNum ) {
style = "";
if( record.received != null ) {
var delta = new Date().getTime() - record.received.getTime();
var blinkPeriod = 2000;
if (delta < blinkPeriod) {
var grid = this;
isc.Timer.setTimeout(function () {
grid.refreshCell( rowNum, colNum );
}, 100);
var changeValue = record.changeValue;
var ratio = (blinkPeriod-delta)/blinkPeriod;
var red = 255 - Math.round(119*ratio);
var green = 255 - Math.round(45*ratio);
var blue = 255 - Math.round(0*ratio);
style += ";background-color:#"+red.toString(16)+green.toString(16)+blue.toString(16);
} else {
record.received = null;
}
}
return style;
}
*/
});
openConsole.RestDataSource.create({
ID:"monitor_subscriptionDS",
fields:[
{name:"topic", title:"Topic", primaryKey:true}
],
operationBindings : [
{operationType:"fetch", dataProtocol:"getParams"},
{operationType:"add", dataProtocol:"getParams"},
{operationType:"remove", dataProtocol:"getParams"}
],
dataURL:"/subscriptions",
transformRequest : function (dsRequest) {
dsRequest.data.clientId = monitor_clientId;
return this.Super("transformRequest", arguments);
}
});
var monitor_subscriptionList = openConsole.ListGrid.create({
ID:"monitor_subscriptionList",
dataSource: "monitor_subscriptionDS",
emptyMessage: "No subscriptions have been added.",
showHeader: false,
canRemoveRecords: true,
editEvent: "none",
modalEditing: true,
fields:[
{ name:"topic", title:"Subscriptions", required: true, }
]
});
var monitor_messagesDS = openConsole.RestDataSource.create({
ID:"monitor_messagesDS",
fields:[
{ name:"topic", title:"Topic" },
{ name:"id", title:"ID", type: "string", primaryKey: true },
{ name:"type", title:"Type", type: "string" },
{ name:"payload", title:"Payload", type: "string" },
{ name:"sourceBroker", title:"Source Broker", type: "string" },
{ name:"sourceClient", title:"Source Client", type: "string" },
{ name:"otherFields", title:"Other Fields", type: "string" },
{ name:"received", title:"Date", type: "datetime" },
{ name:"originalPayload", title:"Payload", type: "string" }
],
dataURL:"/messages",
transformRequest : function (dsRequest) {
if(dsRequest.data)
dsRequest.data.clientId = monitor_clientId;
return this.Super("transformRequest", arguments);
}
});
var monitor_messagesGrid = openConsole.ListGrid.create({
ID: "monitor_messagesGrid",
dataSource: "monitor_messagesDS",
canRemoveRecords: false,
sortField: 3,
emptyMessage: "No messages have been received.",
sortDirection: "descending",
canHover: true,
fields:[
{ name:"type", title:"Type", width: 100 },
{ name:"topic", title:"Topic" },
{ name:"originalPayload", title:"Payload", type: "string" },
{ name:"received", title:"Date", type: "datetime", width: 150, format: "MMM d, yyyy HH:mm:ss" }
],
getCellCSSText : function( record, rowNum, colNum ) {
var style = "";
if( record.type == "Error Response" ) {
style += "color:red";
}
if( record.received != null) {
var delta = new Date().getTime() - record.received.getTime();
var blinkPeriod = 2000;
if (delta < blinkPeriod) {
var grid = this;
isc.Timer.setTimeout(function () {
grid.refreshCell( rowNum, colNum );
}, 100);
var changeValue = record.changeValue;
var ratio = (blinkPeriod-delta)/blinkPeriod;
var red = 255 - Math.round(119*ratio);
var green = 255 - Math.round(45*ratio);
var blue = 255 - Math.round(0*ratio);
style += ";background-color:#"+red.toString(16)+green.toString(16)+blue.toString(16);
}
}
return style;
},
getValueIcon : function(field, value, record) {
if( field.name == "type" )
{
if( record.type == "Error Response" ) {
return "/public/images/error_message.png";
} else if( record.type == "Response" ) {
return "/public/images/response.png";
} else if( record.type == "Event" ) {
return "/public/images/event.png";
}
}
return "";
},
cellHoverHTML : function(record, rowNum, colNum) {
var field = this.fields[colNum];
return (field.name == "originalPayload" ? record["payload"] : record[field.name]);
},
cellDoubleClick: function (record) {
var w = openConsole.Window.create({
title: "Message Details",
items: [
openConsole.DetailViewer.create({
data:record,
fields:[
{ name:"id", title:"ID", type: "string", primaryKey: true },
{ name:"topic", title:"Topic" },
{ name:"type", title:"Type", type: "string" },
{ name:"payload", title:"Payload", type: "string" },
{ name:"sourceBroker", title:"Source Broker", type: "string" },
{ name:"sourceClient", title:"Source Client", type: "string" },
{ name:"otherFields", title:"Other Fields", type: "string" },
{ name:"received", title:"Date", type: "datetime" }
]
}) ]
});
openConsole.Window.show(w);
}
});
var monitor_hiddenRecords = [];
function monitor_filterMessage(messages) {
var filters = []
if( monitor_filterEvents.isSelected() )
filters.add('Event');
if( monitor_filterResponses.isSelected() ) {
filters.add('Response');
}
if( monitor_filterErrors.isSelected() ) {
filters.add('Error Response');
}
for( var i = messages.length - 1; i >= 0; i-- ) {
var rec = messages[i];
if( filters.indexOf( rec['type'] ) == -1 ) {
monitor_hiddenRecords.add( rec );
messages.remove( rec );
}
}
for( var i = monitor_hiddenRecords.length - 1; i >= 0; i-- ) {
var rec = monitor_hiddenRecords[i];
if( filters.indexOf( rec['type'] ) != -1 ) {
messages.add( rec );
monitor_hiddenRecords.remove( rec );
}
}
return messages;
}
function monitor_updateMessageFilters() {
var gridData = monitor_messagesGrid.getOriginalData();
var filteredData = monitor_filterMessage( gridData );
monitor_messagesGrid.setData( gridData );
monitor_messagesGrid.resort();
}
var monitor_sendMessageForm = openConsole.DynamicForm.create({
ID: "monitor_sendMessageForm",
fields: [
{ name: "type",
title: "Type",
type: "select",
required: true,
value: "Event",
valueMap: ["Request", "Event"],
changed: "monitor_serviceListPane.setSelectedState(null)"
},
{ name: "topic",
type: "text",
width: 400,
title: "Topic",
required: true,
changed: "monitor_serviceListPane.setSelectedState(null)"
},
{ name: "payload", type: "textArea", width: 400, height: 150, wrap: "OFF", title: "Payload" },
{ name: "clientId", type: "hidden", value: monitor_clientId }
],
doSubmit : function () {
messageStatusResponse.setContents("");
openConsole.RPCManager.sendRequest({
data: JSON.stringify(this.getValues()),
callback: 'messageStatusResponse.setContents(data)',
actionURL: "/send_message"
})
}
});
openConsole.Form.VLayout.create({
ID: "monitor_sendMessageFormLayout",
members: [
"monitor_sendMessageForm",
openConsole.Form.HLayout.create({
members: [
openConsole.IButton.create({
title: "Send Message",
width: 150,
click : function () { monitor_sendMessageForm.submit(); }
}),
openConsole.Form.StatusHTMLFlow.create({
ID: "messageStatusResponse"
})
]
})
]
});
monitor_filterEvents = openConsole.CheckboxToolStripButton.create({
ID: "monitor_filterEvents",
selected: true,
title: "Events",
icon: "/public/images/event.png",
click: "monitor_updateMessageFilters()"
});
monitor_filterResponses = openConsole.CheckboxToolStripButton.create({
ID: "monitor_filterResponses",
selected: true,
title: "Responses",
icon: "/public/images/response.png",
click: "monitor_updateMessageFilters()"
});
monitor_filterErrors = openConsole.CheckboxToolStripButton.create({
ID: "monitor_filterErrors",
selected: true,
title: "Errors",
icon: "/public/images/error_message.png",
click: "monitor_updateMessageFilters()"
});
openConsole.HLayout.create({
ID: "monitor_content_layout",
members: [
openConsole.SectionStack.create({
width: 325,
sections: [
{title: "Services", expanded: true, showHeader: false, items: [ "monitor_serviceTree" ]},
{title: "Subscriptions", expanded: true, items: [
openConsole.ToolStrip.create({
members: [
openConsole.ToolStripButton.create({
icon: "/public/images/add.png",
title: "Add",
click: "monitor_subscriptionList.startEditingNew()"
}),
isc.ToolStripSpacer.create(),
]
}),
"monitor_subscriptionList"
]}
]
}),
openConsole.SectionStack.create({
showResizeBar: false,
sections: [
{title: "Send Message", expanded: true, items: [
isc.VLayout.create({
height: "300",
members: [
"monitor_sendMessageFormLayout"
]
})
]},
{title: "Received Messages", expanded: true, items: [
openConsole.ToolStrip.create({
members: [
openConsole.Label.create({
width: 1,
wrap: false,
contents: "Filter by Type:"
}),
"monitor_filterEvents",
"monitor_filterResponses",
"monitor_filterErrors",
isc.ToolStripSpacer.create(),
]
}),
"monitor_messagesGrid"
]}
]
})
]
});
openConsole.ModuleWindow.create({
ID:"monitor_layout",
title: "Fabric Monitor",
items: [ "monitor_content_layout" ]
});
monitor_subscriptionList.fetchData();
function monitor_fetch_new_messages()
{
monitor_messagesDS.fetchData( { clientId: monitor_clientId },
function( dsResponse, data ) {
var gridData = monitor_messagesGrid.getOriginalData();
for( var i = 0; i < data.length; i++ ) {
var rec = data[i];
rec.received = new Date();
gridData.add( rec )
}
monitor_messagesGrid.setData( monitor_filterMessage(gridData) );
monitor_messagesGrid.resort();
}, { showPrompt: false }
);
}
monitor_serviceListPane.fetchData();
function monitor_fetch_service_data()
{
monitor_serviceDS.fetchData( null,
function( dsResponse, data ) {
var openState = monitor_serviceListPane.getOpenState();
var selectedPaths = monitor_serviceListPane.getSelectedState();
var gridData = monitor_serviceListPane.getData();
gridData.reportCollisions = false;
for( var i = 0; i < data.length; i++ ) {
var rec = data[i];
if( typeof rec.parentId === "undefined" ) {
rec.received = new Date();
}
}
Object.keys(gridData.nodeIndex).forEach(function(key) {
if( !gridData.nodeIndex.hasOwnProperty(key) )
return;
var found = false;
for( var i = 0; i < data.length; i++ ) {
if( data[i].itemId === gridData.nodeIndex[key].itemId ) {
data[i].received = null;
found = true;
break;
}
}
if( !found ) {
gridData.remove(gridData.nodeIndex[key]);
}
});
gridData.linkNodes(data);
monitor_serviceListPane.setOpenState(openState);
monitor_serviceListPane.setSelectedState(selectedPaths);
monitor_serviceListPane.resort();
}, { showPrompt: false }
);
}
monitor_fetch_service_data();
monitor_fetch_new_messages();
var monitor_ws = null;
$(document).ready(function() {
connectWebSocket();
});
function connectWebSocket()
{
monitor_ws = new WebSocket("wss://" + location.host + "/websocket?id=" + monitor_clientId);
monitor_ws.onmessage = function(e) {
if(e.data.includes("messagesPending"))
monitor_fetch_new_messages();
else if(e.data.includes("serviceUpdates"))
monitor_fetch_service_data();
};
monitor_ws.onclose = function() {
isc.Window.create({
ID: "disconnectedWindow",
title: "Client Disconnected",
autoSize: true,
width: 500,
autoCenter: true,
isModal: true,
showModalMask: true,
autoDraw: true,
showCloseButton: false,
showMinimizeButton: false,
canDragReposition: false,
canDragResize: false,
items: [
isc.HTMLFlow.create({
ID: "disconnectedMessage",
contents: "The DXL Console has been disconnected from the server. Please refresh the console to continue.",
width: "100%",
height: 200,
padding:5
}),
]
});
};
}
// Function to send a keep-alive over the web socket
function clientKeepAlive()
{
monitor_ws.send("still alive");
}
// Send a keep-alive every minute
setInterval(clientKeepAlive, 60000);
Offline.goOnline();