js: Add ServerError and ConnectionError types

This commit is contained in:
Stein Magnus Jodal 2014-06-15 22:51:12 +02:00
parent 026fdb38a3
commit 30471bab74
4 changed files with 37 additions and 6 deletions

View File

@ -85,6 +85,13 @@ Feature release.
<https://github.com/cujojs/when/blob/master/docs/api.md#debugging-promises>`_.
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

View File

@ -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)

View File

@ -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);

View File

@ -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);