beepbot-sails-io-js

Javascript SDK for communicating w/ a Sails server via WebSockets/socket.io.

Usage no npm install needed!

<script type="module">
  import beepbotSailsIoJs from 'https://cdn.skypack.dev/beepbot-sails-io-js';
</script>

README

icon of a life preserver - the emblem of the sails client SDK Sails JavaScript Client SDK

Bower version NPM version     Build Status

JavaScript SDK for communicating w/ Sails via sockets from Node.js or the browser.

========================================

Contents

Jump to...
I Browser
II Node.js
III Version Notes
IV License

========================================

For the Browser

Installation

The sails.io.js client comes automatically installed in new Sails projects, but there is nothing project-specific about the client SDK. You can just as easily copy and paste it yourself, get it from Bower, or just link a script tag directly to a hosted CDN.

Using Bower
$ bower install sails.io.js

Always use the version of sails.io.js that is compatible with your version of Sails. This repository (and Bower) will always include the version of sails.io.js that is compatible with the latest Sails version. If you have an older install, use the copy that is included in the assets/js/dependencies folder of your Sails app.

Basic Usage

    <!-- .... -->
  </body>
  <script type="text/javascript" src="./path/to/bower_components/sails.io.js"></script>
  <script type="text/javascript">
  
    // `io` is available as a global.
    // `io.socket` will connect automatically, but at this point in the DOM, it is not ready yet
    // (think of $(document).ready() from jQuery)
    // 
    // Fortunately, this library provides an abstraction to avoid this issue.
    // Requests you make before `io` is ready will be queued and replayed automatically when the socket connects.
    // To disable this behavior or configure other things, you can set properties on `io.sails`.
    // You have one cycle of the event loop to set `io.sails.autoConnect` to false before the auto-connection
    // behavior starts.
    
    io.socket.get('/hello', function serverResponded (body, JWR) {

      // JWR ==> "JSON WebSocket Response"
      console.log('Sails responded with: ', body);
      console.log('with headers: ', JWR.headers);
      console.log('and with status code: ', JWR.statusCode);

      // first argument `body` === `JWR.body`
      // (just for convenience, and to maintain familiar usage, a la `JQuery.get()`)
    });
  </script>
</html>

Advanced Usage

Cross-domain

Connect to a server other than the one that served ths project (i.e. on a different domain/subdomain):

<script type="text/javascript" src="./path/to/bower_components/sails.io.js"></script>
<script type="text/javascript">
io.sails.url = 'https://api.mysite.com';
</script>

Note that in order for req.session on a cross-domain server to work, there is a bit of pregaming that sails.io.js does behind the scenes. This is because it relies on cookies, and browsers (thankfully) do not let us access cross-origin cookies. This JavaScript SDK circumvents that issue by (1) detecting a cross-origin scenario by examining window.location (if available) and comparing it with the connection base URL, then (2) sending a JSONP request to the cross-origin server in order to gain access to a cookie. In order for that to work, the cross-origin sails server must have CORS enabled for http://yourdomain.com so that 3rd-party cookies are granted with the JSONP request. Fortunately, Sails supports this behavior out of the box.

For example, imagine the sails.io.js client is being used on a webpage served from a Sails server (or any other kind of server, like nginx) at http://yourdomain.com, but you need to connect a WebSocket to a different Sails server at http://api.your-other-domain.com. First, sails.io.js will send a JSONP request to the configured "cookie route" (i.e. /__getcookie by default). That particular "cookie route" comes with CORS enabled out of the box, which means it will grant cookies to 3rd party domains. In your config/sockets.js file, you can restrict cross-domain cookie access to particular domains (i.e. http://yourdomain.com, in this example)

Disable autoConnect and/or connect sockets manually

Disable io.socket and its auto-connecting behavior and/or connect 1 or more sockets manually:

<script type="text/javascript" src="./path/to/bower_components/sails.io.js"></script>
<script type="text/javascript">
io.sails.autoConnect = false;

// e.g. at some point later, connect 3 sockets, using default settings
setTimeout(function (){

  // socket0 and socket1 will use default settings from `io.sails`
  var socket0 = io.sails.connect();
  var socket1 = io.sails.connect();

  // but socket2's `url` option will be overridden as specified:
  var socket2 = io.sails.connect({
    url: 'https://api.mysite.com'
  });
}, 1000);
</script>

Note that the io.sails config functions as the default for all connected sockets, but it can be overridden on a socket-by-socket basis by passing in an object to io.sails.connect(opts)

Change the transports used to connect to the server

In some cases you may want to change the transorts that the socket client uses to connect to the server, and vice versa. For instance, some server environments--notably Heroku--do not support "sticky load balancing", causing the "polling" transport to fail. In these cases, you should first change the transports listed in the config/sockets.js file in your Sails app. Then change the transports in the client by setting io.sails.transports:

<script type="text/javascript" src="./path/to/bower_components/sails.io.js"></script>
<script type="text/javascript">
  io.sails.transports = ['websocket'];
</script>

========================================

For Node.js

Why would I use this from a Node script?

Most commonly, this SDK is useful on the backend when writing tests. However, any time you'd want to use a WebSocket or Socket.io client from Node to talk to a Sails server, you can use this module to allow for the ordinary usage you're familiar with in the browser-- namely using the socket interpreter to simulate HTTP over WebSockets.

Installation

$ npm install socket.io-client
$ npm install sails.io.js

Basic Usage

var socketIOClient = require('socket.io-client');
var sailsIOClient = require('sails.io.js');

// Instantiate the socket client (`io`)
// (for now, you must explicitly pass in the socket.io client when using this library from Node.js)
var io = sailsIOClient(socketIOClient);

// Set some options:
// (you have to specify the host and port of the Sails backend when using this library from Node.js)
io.sails.url = 'http://localhost:1337';
// ...

// Send a GET request to `http://localhost:1337/hello`:
io.socket.get('/hello', function serverResponded (body, JWR) {
  // body === JWR.body
  console.log('Sails responded with: ', body);
  console.log('with headers: ', JWR.headers);
  console.log('and with status code: ', JWR.statusCode);
  
  // When you are finished with `io.socket`, or any other sockets you connect manually,
  // you should make sure and disconnect them, e.g.:
  io.socket.disconnect();
  
  // (note that there is no callback argument to the `.disconnect` method)
});

See the tests in this repository for more examples.

========================================

Version

This repository holds the socket client SDK for Sails versions 0.10.0 and up. If you're looking for the SDK for the v0.9.x releases of Sails, the source is located here.

========================================

License

MIT © 2014- Mike McNeil, Balderdash & contributors

This module is part of the Sails framework, and is free and open-source under the MIT License.

image_squidhome@2x.png

githalytics.com alpha