From 30471bab743becca2c07addd7f277f4fb6498887 Mon Sep 17 00:00:00 2001 From: Stein Magnus Jodal Date: Sun, 15 Jun 2014 22:51:12 +0200 Subject: [PATCH] js: Add ServerError and ConnectionError types --- docs/changelog.rst | 7 +++++++ js/README.md | 4 +++- js/src/mopidy.js | 27 ++++++++++++++++++++++----- js/test/mopidy-test.js | 5 +++++ 4 files changed, 37 insertions(+), 6 deletions(-) diff --git a/docs/changelog.rst b/docs/changelog.rst index e0baee0f..dd57d8ef 100644 --- a/docs/changelog.rst +++ b/docs/changelog.rst @@ -85,6 +85,13 @@ Feature release. `_. This version has been released to npm as Mopidy.js v0.3.0. +- All of Mopidy.js' promise rejection values are now of the Error type. This + ensures that all JavaScript VMs will show a useful stack trace if a rejected + promise's value is used to throw an exception. To allow catch clauses to + handle different errors differently, server side errors are of the type + ``Mopidy.ServerError``, and connection related errors are of the type + ``Mopidy.ConnectionError``. + **MPD frontend** - Proper command tokenization for MPD requests. This replaces the old regex diff --git a/js/README.md b/js/README.md index dcaa57ac..966e9b2e 100644 --- a/js/README.md +++ b/js/README.md @@ -90,7 +90,9 @@ Changelog - All promise rejection values are now of the Error type. This ensures that all JavaScript VMs will show a useful stack trace if a rejected promise's value - is used to throw an exception. + is used to throw an exception. To allow catch clauses to handle different + errors differently, server side errors are of the type `Mopidy.ServerError`, + and connection related errors are of the type `Mopidy.ConnectionError`. ### 0.2.0 (2014-01-04) diff --git a/js/src/mopidy.js b/js/src/mopidy.js index 473d81a5..ff0a64ee 100644 --- a/js/src/mopidy.js +++ b/js/src/mopidy.js @@ -24,6 +24,20 @@ function Mopidy(settings) { } } +Mopidy.ConnectionError = function (message) { + this.name = "ConnectionError"; + this.message = message; +}; +Mopidy.ConnectionError.prototype = new Error(); +Mopidy.ConnectionError.prototype.constructor = Mopidy.ConnectionError; + +Mopidy.ServerError = function (message) { + this.name = "ServerError"; + this.message = message; +}; +Mopidy.ServerError.prototype = new Error(); +Mopidy.ServerError.prototype.constructor = Mopidy.ServerError; + Mopidy.WebSocket = websocket.Client; Mopidy.prototype._configure = function (settings) { @@ -102,7 +116,7 @@ Mopidy.prototype._cleanup = function (closeEvent) { Object.keys(this._pendingRequests).forEach(function (requestId) { var resolver = this._pendingRequests[requestId]; delete this._pendingRequests[requestId]; - var error = new Error("WebSocket closed"); + var error = new Mopidy.ConnectionError("WebSocket closed"); error.closeEvent = closeEvent; resolver.reject(error); }.bind(this)); @@ -142,11 +156,14 @@ Mopidy.prototype._handleWebSocketError = function (error) { Mopidy.prototype._send = function (message) { switch (this._webSocket.readyState) { case Mopidy.WebSocket.CONNECTING: - return when.reject(new Error("WebSocket is still connecting")); + return when.reject( + new Mopidy.ConnectionError("WebSocket is still connecting")); case Mopidy.WebSocket.CLOSING: - return when.reject(new Error("WebSocket is closing")); + return when.reject( + new Mopidy.ConnectionError("WebSocket is closing")); case Mopidy.WebSocket.CLOSED: - return when.reject(new Error("WebSocket is closed")); + return when.reject( + new Mopidy.ConnectionError("WebSocket is closed")); default: var deferred = when.defer(); message.jsonrpc = "2.0"; @@ -203,7 +220,7 @@ Mopidy.prototype._handleResponse = function (responseMessage) { if (responseMessage.hasOwnProperty("result")) { resolver.resolve(responseMessage.result); } else if (responseMessage.hasOwnProperty("error")) { - error = new Error(responseMessage.error.message); + error = new Mopidy.ServerError(responseMessage.error.message); error.code = responseMessage.error.code; error.data = responseMessage.error.data; resolver.reject(error); diff --git a/js/test/mopidy-test.js b/js/test/mopidy-test.js index 97525ba7..4b4a9f60 100644 --- a/js/test/mopidy-test.js +++ b/js/test/mopidy-test.js @@ -175,6 +175,7 @@ buster.testCase("Mopidy", { }), done(function (error) { assert(error instanceof Error); + assert(error instanceof Mopidy.ConnectionError); assert.equals(error.message, "WebSocket closed"); assert.same(error.closeEvent, closeEvent); }) @@ -398,6 +399,7 @@ buster.testCase("Mopidy", { }), done(function (error) { assert(error instanceof Error); + assert(error instanceof Mopidy.ConnectionError); assert.equals( error.message, "WebSocket is still connecting"); }) @@ -416,6 +418,7 @@ buster.testCase("Mopidy", { }), done(function (error) { assert(error instanceof Error); + assert(error instanceof Mopidy.ConnectionError); assert.equals(error.message, "WebSocket is closing"); }) ); @@ -433,6 +436,7 @@ buster.testCase("Mopidy", { }), done(function (error) { assert(error instanceof Error); + assert(error instanceof Mopidy.ConnectionError); assert.equals(error.message, "WebSocket is closed"); }) ); @@ -610,6 +614,7 @@ buster.testCase("Mopidy", { }), done(function (error) { assert(error instanceof Error); + assert(error instanceof Mopidy.ServerError); assert.equals(error.code, responseError.code); assert.equals(error.message, responseError.message); refute.defined(error.data);