Package Exports
- websocket-as-promised
- websocket-as-promised/src/index.js
This package does not declare an exports field, so the exports above have been automatically detected and optimized by JSPM instead. If any package subpath is missing, it is recommended to post an issue to the original package (websocket-as-promised) to support the "exports" field. If that is not possible, create a JSPM override to customize the exports field for this package.
Readme
websocket-as-promised
 
A WebSocket client library with Promise-based API for browser and Node.js.
Example
import WebSocketAsPromised from 'websocket-as-promised';
// create instance of WebSocket connection
const wsp = new WebSocketAsPromised('ws://example.com');
// wait for WebSocket connection to open
await wsp.open();
// send some data
wsp.send('data');
// wait for connection to close
await wsp.close();Contents
Requirements
- global Promiseconstructor
Installation
npm i websocket-as-promised --saveUsage in browser
import WebSocketAsPromised from 'websocket-as-promised';
const wsp = new WebSocketAsPromised('ws://example.com');
wsp.open()
  .then(() => wsp.send('message'))
  .then(() => wsp.close())
  .catch(e => console.error(e));Or with ES7 async / await:
import WebSocketAsPromised from 'websocket-as-promised';
const wsp = new WebSocketAsPromised('ws://example.com');
(async () => {
  try {
    await wsp.open();
    wsp.send('message');
  } catch(e) {
    console.error(e);
  } finally {
    await wsp.close();
  }
})();Usage in Node.js
As there is no built-in WebSocket client in Node.js, you should use a third-party WebSocket npm package.
Usage with websocket
Here you should use W3C compatible client - W3CWebSocket:
const WebSocketAsPromised = require('websocket-as-promised');
const W3CWebSocket = require('websocket').w3cwebsocket;
const wsp = new WebSocketAsPromised('ws://example.com', {
  createWebSocket: url => new W3CWebSocket(url)
});
wsp.open()
  .then(() => wsp.send('message'))
  .then(() => wsp.close())
  .catch(e => console.error(e));Usage with ws
Here it is important to define extractMessageData option as event data are passed directly to onmessage handler, 
not as event.data by spec:
const WebSocketAsPromised = require('websocket-as-promised');
const WebSocket = require('ws');
const wsp = new WebSocketAsPromised('ws://example.com', {
  createWebSocket: url => new WebSocket(url),
  extractMessageData: event => event, // <- this is important
});
wsp.open()
  .then(() => wsp.send('message'))
  .then(() => wsp.close())
  .catch(e => console.error(e));Sending raw data
To send raw data use .send() method:
wsp.send('foo');To handle raw data from server use .onMessage channel:
wsp.onMessage.addListener(data => console.log(data));Sending JSON
To send JSON you should define packMessage / unpackMessage options:
const wsp = new WebSocketAsPromised(wsUrl, {
  packMessage: data => JSON.stringify(data),
  unpackMessage: data => JSON.parse(data)
});To send data use .sendPacked() method passing json as parameter:
wsp.sendPacked({foo: 'bar'});To read unpacked data from received message you can subscribe to onUnpackedMessage channel:
wsp.onUnpackedMessage.addListener(data => console.log(data.status));Sending binary
Example of sending Uint8Array:
const wsp = new WebSocketAsPromised(wsUrl, {
    packMessage: data => (new Uint8Array(data)).buffer,
    unpackMessage: data => new Uint8Array(data),
});
wsp.open()
  .then(() => wsp.sendPacked([1, 2, 3]))
  .then(() => wsp.close())
  .catch(e => console.error(e));Sending requests
websocket-as-promised provides simple request-response mechanism (JSON RPC). 
Method .sendRequest() sends message with unique requestId and returns promise. 
That promise get resolved when response message with the same requestId comes. 
For reading/setting requestId from/to message there are two functions defined in options attachRequestId / extractRequestId:
const wsp = new WebSocketAsPromised(wsUrl, {
  packMessage: data => JSON.stringify(data),
  unpackMessage: data => JSON.parse(data),
  attachRequestId: (data, requestId) => Object.assign({id: requestId}, data), // attach requestId to message as `id` field
  extractRequestId: data => data && data.id,                                  // read requestId from message `id` field
});
wsp.open()
 .then(() => wsp.sendRequest({foo: 'bar'})) // actually sends {foo: 'bar', id: 'xxx'}, because `attachRequestId` defined above
 .then(response => console.log(response));  // waits server message with corresponding requestId: {id: 'xxx', ...}By default requestId value is auto-generated, but you can set it manually:
wsp.sendRequest({foo: 'bar'}, {requestId: 42});Note: you should implement yourself attaching
requestIdon server side.
API
Classes
- WebSocketAsPromised
Typedefs
- Options : Object
WebSocketAsPromised
Kind: global class
- WebSocketAsPromised- new WebSocketAsPromised(url, [options])
- .ws ⇒ WebSocket
- .url ⇒ String
- .isOpening ⇒ Boolean
- .isOpened ⇒ Boolean
- .isClosing ⇒ Boolean
- .isClosed ⇒ Boolean
- .onOpen ⇒ Channel
- .onSend ⇒ Channel
- .onMessage ⇒ Channel
- .onUnpackedMessage ⇒ Channel
- .onResponse ⇒ Channel
- .onClose ⇒ Channel
- .onError ⇒ Channel
- .open() ⇒ Promise.<Event>
- .sendRequest(data, [options]) ⇒ Promise
- .sendPacked(data)
- .send(data)
- .waitUnpackedMessage(predicate, [options]) ⇒ Promise
- .close([code], [reason]) ⇒ Promise.<Event>
- .removeAllListeners()
 
new WebSocketAsPromised(url, [options])
Constructor. Unlike original WebSocket it does not immediately open connection.
Please call open() method to connect.
| Param | Type | Description | 
|---|---|---|
| url | String | WebSocket URL | 
| [options] | Options | 
wsp.ws ⇒ WebSocket
Returns original WebSocket instance created by options.createWebSocket.
Kind: instance property of WebSocketAsPromised
wsp.url ⇒ String
Returns WebSocket url.
Kind: instance property of WebSocketAsPromised
wsp.isOpening ⇒ Boolean
Is WebSocket connection in opening state.
Kind: instance property of WebSocketAsPromised
wsp.isOpened ⇒ Boolean
Is WebSocket connection opened.
Kind: instance property of WebSocketAsPromised
wsp.isClosing ⇒ Boolean
Is WebSocket connection in closing state.
Kind: instance property of WebSocketAsPromised
wsp.isClosed ⇒ Boolean
Is WebSocket connection closed.
Kind: instance property of WebSocketAsPromised
wsp.onOpen ⇒ Channel
Event channel triggered when connection is opened.
Kind: instance property of WebSocketAsPromised
See: https://vitalets.github.io/chnl/#channel
Example  
wsp.onOpen.addListener(() => console.log('Connection opened'));wsp.onSend ⇒ Channel
Event channel triggered every time when message is sent to server.
Kind: instance property of WebSocketAsPromised
See: https://vitalets.github.io/chnl/#channel
Example  
wsp.onSend.addListener(data => console.log('Message sent', data));wsp.onMessage ⇒ Channel
Event channel triggered every time when message received from server.
Kind: instance property of WebSocketAsPromised
See: https://vitalets.github.io/chnl/#channel
Example  
wsp.onMessage.addListener(message => console.log(message));wsp.onUnpackedMessage ⇒ Channel
Event channel triggered every time when received message is successfully unpacked. For example, if you are using JSON transport, the listener will receive already JSON parsed data.
Kind: instance property of WebSocketAsPromised
See: https://vitalets.github.io/chnl/#channel
Example  
wsp.onUnpackedMessage.addListener(data => console.log(data.foo));wsp.onResponse ⇒ Channel
Event channel triggered every time when response to some request comes. Received message considered a response if requestId is found in it.
Kind: instance property of WebSocketAsPromised
See: https://vitalets.github.io/chnl/#channel
Example  
wsp.onResponse.addListener(data => console.log(data));wsp.onClose ⇒ Channel
Event channel triggered when connection closed.
Listener accepts single argument {code, reason}.
Kind: instance property of WebSocketAsPromised
See: https://vitalets.github.io/chnl/#channel
Example  
wsp.onClose.addListener(event => console.log(`Connections closed: ${event.reason}`));wsp.onError ⇒ Channel
Event channel triggered when by Websocket 'error' event.
Kind: instance property of WebSocketAsPromised
See: https://vitalets.github.io/chnl/#channel
Example  
wsp.onError.addListener(event => console.error(event));wsp.open() ⇒ Promise.<Event>
Opens WebSocket connection. If connection already opened, promise will be resolved with "open event".
Kind: instance method of WebSocketAsPromised
wsp.sendRequest(data, [options]) ⇒ Promise
Performs request and waits for response.
Kind: instance method of WebSocketAsPromised  
| Param | Type | Default | 
|---|---|---|
| data | * | |
| [options] | Object | |
| [options.requestId] | String|Number | <auto-generated> | 
| [options.timeout] | Number | 0 | 
wsp.sendPacked(data)
Packs data with options.packMessage and sends to the server.
Kind: instance method of WebSocketAsPromised  
| Param | Type | 
|---|---|
| data | * | 
wsp.send(data)
Sends data without packing.
Kind: instance method of WebSocketAsPromised  
| Param | Type | 
|---|---|
| data | String|Blob|ArrayBuffer | 
wsp.waitUnpackedMessage(predicate, [options]) ⇒ Promise
Waits for particular message to come.
Kind: instance method of WebSocketAsPromised  
| Param | Type | Default | Description | 
|---|---|---|---|
| predicate | function | function to check incoming message. | |
| [options] | Object | ||
| [options.timeout] | Number | 0 | |
| [options.timeoutError] | Error | 
Example
const response = await wsp.waitUnpackedMessage(data => data && data.foo === 'bar');wsp.close([code], [reason]) ⇒ Promise.<Event>
Closes WebSocket connection. If connection already closed, promise will be resolved with "close event".
Kind: instance method of WebSocketAsPromised  
| Param | Type | Default | Description | 
|---|---|---|---|
| [code] | number | 1000 | A numeric value indicating the status code. | 
| [reason] | string | A human-readable reason for closing connection. | 
wsp.removeAllListeners()
Removes all listeners from WSP instance. Useful for cleanup.
Kind: instance method of WebSocketAsPromised
Options : Object
Kind: global typedef
Defaults: please see options.js
Properties
| Name | Type | Default | Description | 
|---|---|---|---|
| [createWebSocket] | function | url => new WebSocket(url) | custom function for WebSocket construction. | 
| [packMessage] | function | noop | packs message for sending. For example, data => JSON.stringify(data). | 
| [unpackMessage] | function | noop | unpacks received message. For example, data => JSON.parse(data). | 
| [attachRequestId] | function | noop | injects request id into data. For example, (data, requestId) => Object.assign({requestId}, data). | 
| [extractRequestId] | function | noop | extracts request id from received data. For example, data => data.requestId. | 
| [extractMessageData] | function | event => event.data | extracts data from event object. | 
| timeout | Number | 0 | timeout for opening connection and sending messages. | 
| connectionTimeout | Number | 0 | special timeout for opening connection, by default equals to timeout. | 
Changelog
Please see CHANGELOG.md.
License
MIT @ Vitaliy Potapov
If you love ❤️ JavaScript and would like to track new trending repositories,
have a look on vitalets/github-trending-repos.