From 1f2c9879bda05e7ee7a6683167513c6e349342c7 Mon Sep 17 00:00:00 2001 From: Nick O'Leary Date: Wed, 2 Nov 2016 00:16:36 +0000 Subject: [PATCH] Handle big arrays/buffers better in debug sidebar --- nodes/core/core/58-debug.js | 71 +-- nodes/core/core/lib/debug/debug-utils.js | 521 ++++++++++++++++------- nodes/core/core/lib/debug/style.css | 8 +- 3 files changed, 419 insertions(+), 181 deletions(-) diff --git a/nodes/core/core/58-debug.js b/nodes/core/core/58-debug.js index ced507652..5bc97da4a 100644 --- a/nodes/core/core/58-debug.js +++ b/nodes/core/core/58-debug.js @@ -92,32 +92,52 @@ module.exports = function(RED) { } catch(err) { msg.format = "Object"; } - var isArray = util.isArray(msg.msg); - if (isArray) { - msg.format = "array["+msg.msg.length+"]"; - } - if (isArray || (msg.format === "Object")) { - msg.msg = JSON.stringify(msg.msg, function(key, value) { - if (key[0] === '_' && key !== "_msgid") { - return undefined; - } - if (key === '_req' || key === '_res') { - return "[internal]" - } - if (typeof value === 'object' && value !== null) { - if (seen.indexOf(value) !== -1) { return "[circular]"; } - seen.push(value); - } - if (typeof value === 'string') { - if (value.length > debuglength) { - return value.substring(0,debuglength)+"..."; - } - } - return value; - }," "); + if (/error/i.test(msg.format)) { + msg.msg = JSON.stringify({ + name: msg.msg.name, + message: msg.msg.message + }); } else { - try { msg.msg = msg.msg.toString(); } - catch(e) { msg.msg = "[Type not printable]"; } + var isArray = util.isArray(msg.msg); + if (isArray) { + msg.format = "array["+msg.msg.length+"]"; + if (msg.msg.length > debuglength) { + msg.msg = msg.msg.slice(0,debuglength); + } + } + if (isArray || (msg.format === "Object")) { + msg.msg = JSON.stringify(msg.msg, function(key, value) { + if (key[0] === '_' && key !== "_msgid") { + return undefined; + } + if (key === '_req' || key === '_res') { + return "[internal]" + } + if (value instanceof Error) { + return value.toString() + } + if (util.isArray(value) && value.length > debuglength) { + value = { + type: "array", + data: value.slice(0,debuglength), + length: value.length + } + } + if (typeof value === 'object' && value !== null) { + if (seen.indexOf(value) !== -1) { return "[circular]"; } + seen.push(value); + } + if (typeof value === 'string') { + if (value.length > debuglength) { + return value.substring(0,debuglength)+"..."; + } + } + return value; + }," "); + } else { + try { msg.msg = msg.msg.toString(); } + catch(e) { msg.msg = "[Type not printable]"; } + } } seen = null; } else if (typeof msg.msg === "boolean") { @@ -138,7 +158,6 @@ module.exports = function(RED) { msg.msg = msg.msg.substring(0,debuglength)+"..."; } } - // if (msg.msg.length > debuglength) { // msg.msg = msg.msg.substr(0,debuglength) +" ...."; // } diff --git a/nodes/core/core/lib/debug/debug-utils.js b/nodes/core/core/lib/debug/debug-utils.js index db2c4753d..3141ccba2 100644 --- a/nodes/core/core/lib/debug/debug-utils.js +++ b/nodes/core/core/lib/debug/debug-utils.js @@ -132,7 +132,6 @@ RED.debug = (function() { activeWorkspace = _activeWorkspace; } $(".debug-message").each(function() { - console.log() $(this).toggleClass('hide',filter&&!$(this).hasClass('debug-message-flow-'+activeWorkspace)); }); } @@ -170,182 +169,398 @@ RED.debug = (function() { return str.replace(/\n/g,"↵").replace(/\t/g,"→"); } + function buildMessageSummaryValue(value) { + var result; + if (Array.isArray(value)) { + result = $('').html('array['+value.length+']'); + } else if (value === null) { + result = $('null'); + } else if (typeof value === 'object') { + if (value.hasOwnProperty('type') && value.type === 'Buffer' && value.hasOwnProperty('data')) { + result = $('').html('buffer['+value.data.length+']'); + } else if (value.hasOwnProperty('type') && value.type === 'array' && value.hasOwnProperty('data')) { + result = $('').html('array['+value.length+']'); + } else { + result = $('object'); + } + } else if (typeof value === 'string') { + subvalue = value; + if (subvalue.length > 50) { + subvalue = subvalue.substring(0,50)+"…"; + } + result = $('').html('"'+formatString(subvalue)+'"'); + } else { + result = $('').text(""+value); + } + return result; + } + function makeExpandable(el,onexpand) { + el.addClass("debug-message-expandable"); + el.click(function(e) { + var parent = $(this).parent(); + if (parent.hasClass('collapsed')) { + if (onexpand && !parent.hasClass('built')) { + onexpand(); + parent.addClass('built'); + } + parent.removeClass('collapsed'); + } else { + parent.addClass('collapsed'); + } + e.preventDefault(); + }); + } - function buildMessageElement(obj,topLevel,typeHint) { + function buildMessageElement(obj,key,typeHint,hideKey) { var i; var e; var entryObj; var header; var headerHead; var value,subvalue; - var element = $('').toggleClass('collapsed',topLevel); - if (Array.isArray(obj)) { - var length = Math.min(obj.length,10); - if (!topLevel) { - header = $('').html(typeHint||('array['+obj.length+']')).appendTo(element); - } else { - header = $('').appendTo(element); - if (length > 0) { - $(' ').prependTo(header); - header.addClass("debug-message-expandable"); - header.click(function(e) { - $(this).parent().toggleClass('collapsed'); - //e.stopPropagation(); - e.preventDefault(); - }); + var element = $(''); + if (!key) { + element.addClass("debug-message-top-level"); + } + + header = $('').appendTo(element); + + if (key && !hideKey) { + $('').text(key).appendTo(header); + $(': ').appendTo(header); + } + entryObj = $('').appendTo(header); + + var isArray = Array.isArray(obj); + var isArrayObject = false; + if (obj && typeof obj === 'object' && obj.hasOwnProperty('type') && obj.hasOwnProperty('data')) { + isArray = true; + isArrayObject = true; + } + + if (obj === null || obj === undefined) { + $(''+obj+'').appendTo(entryObj); + } else if (typeof obj === 'string') { + $('').html('"'+formatString(obj)+'"').appendTo(entryObj); + } else if (typeof obj === 'number') { + e = $('').text(""+obj).appendTo(entryObj); + e.click(function(evt) { + var format = $(this).data('format'); + if (format === 'hex') { + $(this).text(""+obj).data('format','dec'); + } else { + $(this).text("0x"+(obj).toString(16)).data('format','hex'); + } + evt.preventDefault(); + }); + } else if (isArray) { + element.addClass('collapsed'); + + var originalLength = obj.length; + if (typeHint) { + var m = /\[(\d+)\]/.exec(typeHint); + if (m) { + originalLength = parseInt(m[1]); } - $('').html(typeHint||('array['+obj.length+']')).appendTo(header); - headerHead = $('').appendTo(header); - $('[ ').appendTo(headerHead); } - for (i=0;i').html('array['+value.length+']').appendTo(headerHead); - } else if (value === null) { - $('null').appendTo(headerHead); - } else if (typeof value === 'object') { - if (value.hasOwnProperty('type') && value.type === 'Buffer' && value.hasOwnProperty('data')) { - $('').html('buffer['+value.data.length+']').appendTo(headerHead); - } else { - $('object').appendTo(headerHead); - } - } else if (typeof value === 'string') { - subvalue = value; - if (subvalue.length > 50) { - subvalue = subvalue.substring(0,50)+"..."; - } - $('').html('"'+formatString(subvalue)+'"').appendTo(headerHead); - } else { - $('').text(""+value).appendTo(headerHead); + var data = obj; + var type = 'array'; + if (isArrayObject) { + data = obj.data; + if (originalLength === undefined) { + originalLength = data.length; + } + type = obj.type.toLowerCase(); + } + var fullLength = data.length; + + if (originalLength > 0) { + $(' ').prependTo(header); + makeExpandable(header,function() { + if (!key) { + $('').html(typeHint||(type+'['+originalLength+']')).appendTo(header); } - if (i < length -1) { + var row; + if (fullLength <= 10) { + for (i=0;i