Skip to content

Commit 23ecc22

Browse files
committed
Replace When.js with ES6 Promise
This shaves the minified browser build down from 42 kB to 12 kB.
1 parent 4d8fa63 commit 23ecc22

5 files changed

Lines changed: 30 additions & 37 deletions

File tree

README.md

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -86,8 +86,13 @@ yarn build
8686
const Mopidy = new Mopidy(...);
8787
```
8888

89+
- **Backwards incompatible:** The `Mopidy` class no longer reexports When.js
90+
as `Mopidy.when()`. To upgrade existing code, either migrate to standard
91+
ES6 `Promise` or add When.js as a dependency to your project.
92+
8993
- Modernized dependencies:
9094

95+
- The `Promise` object standardized in ES6 has replaced When.js.
9196
- `isomorphic-ws` and `ws` has replaced our own wrapper around the browser's
9297
`WebSocket` API and `faye-websocket` on Node.
9398

__tests__/mopidy.test.js

Lines changed: 11 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
const when = require("when");
21
const Mopidy = require("../src/mopidy");
32

43
const warn = jest.spyOn(global.console, "warn").mockImplementation(() => {});
@@ -192,16 +191,16 @@ describe("._cleanup", () => {
192191
this.mopidy._cleanup(closeEvent);
193192

194193
expect(Object.keys(this.mopidy._pendingRequests).length).toBe(0);
195-
when
196-
.settle([promise1, promise2])
197-
.then(descriptors => {
198-
expect(descriptors.length).toBe(2);
199-
descriptors.forEach(d => {
200-
expect(d.state).toBe("rejected");
201-
expect(d.reason).toBeInstanceOf(Error);
202-
expect(d.reason).toBeInstanceOf(Mopidy.ConnectionError);
203-
expect(d.reason.message).toBe("WebSocket closed");
204-
expect(d.reason.closeEvent).toBe(closeEvent);
194+
Promise.all([
195+
promise1.catch(error => error),
196+
promise2.catch(error => error),
197+
])
198+
.then(errors => {
199+
errors.forEach(error => {
200+
expect(error).toBeInstanceOf(Error);
201+
expect(error).toBeInstanceOf(Mopidy.ConnectionError);
202+
expect(error.message).toBe("WebSocket closed");
203+
expect(error.closeEvent).toBe(closeEvent);
205204
});
206205
})
207206
.then(done);
@@ -697,7 +696,7 @@ describe("._getApiSpec", () => {
697696
const methods = {};
698697
const sendStub = jest
699698
.spyOn(this.mopidy, "_send")
700-
.mockReturnValue(when.resolve(methods));
699+
.mockReturnValue(Promise.resolve(methods));
701700
const createApiStub = jest
702701
.spyOn(this.mopidy, "_createApi")
703702
.mockImplementation(() => {});
@@ -910,9 +909,3 @@ describe("._createApi", () => {
910909
});
911910
});
912911
});
913-
914-
describe("Reexports", () => {
915-
test("Reexports When.js", () => {
916-
expect(Mopidy.when()).toEqual(when());
917-
});
918-
});

package.json

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
"dependencies": {
4141
"bane": "~1.1.0",
4242
"isomorphic-ws": "^4.0.1",
43-
"when": "~3.7.2",
4443
"ws": "^6.1.0"
4544
},
4645
"devDependencies": {

src/mopidy.js

Lines changed: 14 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,4 @@
11
const bane = require("bane");
2-
const when = require("when");
32
const WebSocket = require("isomorphic-ws");
43

54
class Mopidy {
@@ -130,25 +129,29 @@ class Mopidy {
130129
_send(message) {
131130
switch (this._webSocket.readyState) {
132131
case Mopidy.WebSocket.CONNECTING:
133-
return when.reject(
132+
return Promise.reject(
134133
new Mopidy.ConnectionError("WebSocket is still connecting")
135134
);
136135
case Mopidy.WebSocket.CLOSING:
137-
return when.reject(new Mopidy.ConnectionError("WebSocket is closing"));
136+
return Promise.reject(
137+
new Mopidy.ConnectionError("WebSocket is closing")
138+
);
138139
case Mopidy.WebSocket.CLOSED:
139-
return when.reject(new Mopidy.ConnectionError("WebSocket is closed"));
140+
return Promise.reject(
141+
new Mopidy.ConnectionError("WebSocket is closed")
142+
);
140143
default:
141144
}
142145
const jsonRpcMessage = {
143146
...message,
144147
jsonrpc: "2.0",
145148
id: this._nextRequestId(),
146149
};
147-
const deferred = when.defer();
148-
this._pendingRequests[jsonRpcMessage.id] = deferred.resolver;
149-
this._webSocket.send(JSON.stringify(jsonRpcMessage));
150-
this.emit("websocket:outgoingMessage", jsonRpcMessage);
151-
return deferred.promise;
150+
return new Promise((resolve, reject) => {
151+
this._pendingRequests[jsonRpcMessage.id] = { resolve, reject };
152+
this._webSocket.send(JSON.stringify(jsonRpcMessage));
153+
this.emit("websocket:outgoingMessage", jsonRpcMessage);
154+
});
152155
}
153156

154157
_handleMessage(message) {
@@ -233,14 +236,14 @@ class Mopidy {
233236
return this._send(message);
234237
}
235238
if (args.length > 1) {
236-
return when.reject(
239+
return Promise.reject(
237240
new Error(
238241
"Expected zero arguments, a single array, or a single object."
239242
)
240243
);
241244
}
242245
if (!Array.isArray(args[0]) && args[0] !== Object(args[0])) {
243-
return when.reject(new TypeError("Expected an array or an object."));
246+
return Promise.reject(new TypeError("Expected an array or an object."));
244247
}
245248
[message.params] = args;
246249
return this._send(message);
@@ -314,8 +317,6 @@ Mopidy.ServerError = ServerError;
314317

315318
Mopidy.WebSocket = WebSocket;
316319

317-
Mopidy.when = when;
318-
319320
Mopidy.prototype._nextRequestId = (() => {
320321
let lastUsed = -1;
321322
return () => {

yarn.lock

Lines changed: 0 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -7334,11 +7334,6 @@ whatwg-url@^7.0.0:
73347334
tr46 "^1.0.1"
73357335
webidl-conversions "^4.0.2"
73367336

7337-
when@~3.7.2:
7338-
version "3.7.8"
7339-
resolved "https://registry.yarnpkg.com/when/-/when-3.7.8.tgz#c7130b6a7ea04693e842cdc9e7a1f2aa39a39f82"
7340-
integrity sha1-xxMLan6gRpPoQs3J56Hyqjmjn4I=
7341-
73427337
whet.extend@~0.9.9:
73437338
version "0.9.9"
73447339
resolved "https://registry.yarnpkg.com/whet.extend/-/whet.extend-0.9.9.tgz#f877d5bf648c97e5aa542fadc16d6a259b9c11a1"

0 commit comments

Comments
 (0)