inspector: return Error objects on error

The inspector communicates errors via POJOs. This commit
wraps the error information in an actual Error object.

PR-URL: https://github.com/nodejs/node/pull/26255
Reviewed-By: Anna Henningsen <anna@addaleax.net>
Reviewed-By: Eugene Ostroukhov <eostroukhov@google.com>
Reviewed-By: Ruben Bridgewater <ruben@bridgewater.de>
This commit is contained in:
cjihrig 2019-02-21 16:27:46 -05:00
parent d7a3c3cecc
commit e3d4a7d999
No known key found for this signature in database
GPG Key ID: 7434390BDBE9B9C5
2 changed files with 20 additions and 8 deletions

View File

@ -3,6 +3,7 @@
const { const {
ERR_INSPECTOR_ALREADY_CONNECTED, ERR_INSPECTOR_ALREADY_CONNECTED,
ERR_INSPECTOR_CLOSED, ERR_INSPECTOR_CLOSED,
ERR_INSPECTOR_COMMAND,
ERR_INSPECTOR_NOT_AVAILABLE, ERR_INSPECTOR_NOT_AVAILABLE,
ERR_INSPECTOR_NOT_CONNECTED, ERR_INSPECTOR_NOT_CONNECTED,
ERR_INVALID_ARG_TYPE, ERR_INVALID_ARG_TYPE,
@ -48,8 +49,14 @@ class Session extends EventEmitter {
if (parsed.id) { if (parsed.id) {
const callback = this[messageCallbacksSymbol].get(parsed.id); const callback = this[messageCallbacksSymbol].get(parsed.id);
this[messageCallbacksSymbol].delete(parsed.id); this[messageCallbacksSymbol].delete(parsed.id);
if (callback) if (callback) {
callback(parsed.error || null, parsed.result || null); if (parsed.error) {
return callback(new ERR_INSPECTOR_COMMAND(parsed.error.code,
parsed.error.message));
}
callback(null, parsed.result);
}
} else { } else {
this.emit(parsed.method, parsed); this.emit(parsed.method, parsed);
this.emit('inspectorNotification', parsed); this.emit('inspectorNotification', parsed);

View File

@ -5,17 +5,22 @@ const common = require('../common');
common.skipIfInspectorDisabled(); common.skipIfInspectorDisabled();
(async function test() { (async function test() {
const { strictEqual } = require('assert'); const assert = require('assert');
const { Session } = require('inspector'); const { Session } = require('inspector');
const { promisify } = require('util'); const { promisify } = require('util');
const session = new Session(); const session = new Session();
session.connect(); session.connect();
session.post = promisify(session.post); session.post = promisify(session.post);
const result = await session.post('Runtime.evaluate', { await assert.rejects(
expression: 'for(;;);', session.post('Runtime.evaluate', {
timeout: 0 expression: 'for(;;);',
}).catch((e) => e); timeout: 0
strictEqual(result.message, 'Execution was terminated'); }),
{
code: 'ERR_INSPECTOR_COMMAND',
message: 'Inspector error -32000: Execution was terminated'
}
);
session.disconnect(); session.disconnect();
})(); })();