Socket.io Client ================ .. note:: We recommend using Feathers and the ``@feathersjs/socketio-client`` module on the client if possible. If however, you want to use a direct Socket.io connection without using Feathers on the client, see the `Direct connection <#direct-connection>`_ section. @feathersjs/socketio-client --------------------------- |GitHub stars| |npm version| |Changelog| .. code-block:: sh $ npm install @feathersjs/socketio-client --save The ``@feathersjs/socketio-client`` module allows to connect to services exposed through the :doc:`socketio` via a Socket.io socket. .. important:: Socket.io is also used to *call* service methods. Using sockets for both calling methods and receiving real-time events is generally faster than using :doc:`../express`. There is therefore no need to use both REST and Socket.io in the same client application. socketio(socket) ~~~~~~~~~~~~~~~~ Initialize the Socket.io client using a given socket and the default options. .. code-block:: js const feathers = require(‘@feathersjs/feathers’); const socketio = require(‘@feathersjs/socketio-client’); const io = require(‘socket.io-client’); const socket = io(‘http://api.feathersjs.com’); const app = feathers(); // Set up Socket.io client with the socket app.configure(socketio(socket)); // Receive real-time events through Socket.io app.service(‘messages’) .on(‘created’, message => console.log(‘New message created’, message)); // Call the ``messages`` service app.service(‘messages’).create({ text: ‘A message from a REST client’ }); {%- language name=“@feathersjs/client”, type=“html” -%} .. raw:: html socketio(socket, options) ~~~~~~~~~~~~~~~~~~~~~~~~~ Initialize the Socket.io client with the specified socket and options. Options can be: - ``timeout`` (default: 5000ms) - The time after which a method call fails and times out. This usually happens when calling a service or service method that does not exist. .. code:: js const feathers = require('@feathersjs/feathers'); const socketio = require('@feathersjs/socketio-client'); const io = require('socket.io-client'); const socket = io('http://api.feathersjs.com'); const app = feathers(); // Set up Socket.io client with the socket // And a timeout of 2 seconds app.configure(socketio(socket, { timeout: 2000 })); To set a service specific timeout you can use: .. code:: javascript app.service('messages').timeout = 3000; Direct connection ----------------- Feathers sets up a normal Socket.io server that you can connect to with any Socket.io compatible client, usually the `Socket.io client `_ either by loading the ``socket.io-client`` module or ``/socket.io/socket.io.js`` from the server. Unlike HTTP calls, websockets do not have an inherent cross-origin restriction in the browser so it is possible to connect to any Feathers server. .. tip:: The socket connection URL has to point to the server root which is where Feathers will set up Socket.io. .. code:: html Service methods can be called by emitting a ```` event followed by the service path and method parameters. The service path is the name the service has been registered with (in ``app.use``), without leading or trailing slashes. An optional callback following the ``function(error, data)`` Node convention will be called with the result of the method call or any errors that might have occurred. ``params`` will be set as ``params.query`` in the service method call. Other service parameters can be set through a :doc:`../socketio`. If the service path or method does not exist, an appropriate Feathers error will be returned. Authentication ~~~~~~~~~~~~~~ Sockets can be authenticated by sending the ``authenticate`` event with the ``strategy`` and the payload. For specific examples, see the “Direct Connection” section in the :doc:`../authentication/jwt` authentication chapters. .. code:: js const io = require('socket.io-client'); const socket = io('http://localhost:3030'); socket.emit('authenticate', { strategy: 'strategyname', ... otherData }, function(message, data) { console.log(message); // message will be null console.log(data); // data will be {"accessToken": "your token"} // You can now send authenticated messages to the server }); find ~~~~ Retrieves a list of all matching resources from the service .. code:: js socket.emit('find', 'messages', { status: 'read', user: 10 }, (error, data) => { console.log('Found all messages', data); }); Will call ``app.service('messages').find({ query: { status: 'read', user: 10 } })`` on the server. get ~~~ Retrieve a single resource from the service. .. code:: js socket.emit('get', 'messages', 1, (error, message) => { console.log('Found message', message); }); Will call ``app.service('messages').get(1, {})`` on the server. .. code:: js socket.emit('get', 'messages', 1, { fetch: 'all' }, (error, message) => { console.log('Found message', message); }); Will call ``app.service('messages').get(1, { query: { fetch: 'all' } })`` on the server. ``create`` ~~~~~~~~~~ Create a new resource with ``data`` which may also be an array. .. code:: js socket.emit('create', 'messages', { text: 'I really have to iron' }, (error, message) => { console.log('Todo created', message); }); Will call ``app.service('messages').create({ text: 'I really have to iron' }, {})`` on the server. .. code:: js socket.emit('create', 'messages', [ { text: 'I really have to iron' }, { text: 'Do laundry' } ]); Will call ``app.service('messages').create`` with the array. update ~~~~~~ Completely replace a single or multiple resources. .. code:: js socket.emit('update', 'messages', 2, { text: 'I really have to do laundry' }, (error, message) => { console.log('Todo updated', message); }); Will call ``app.service('messages').update(2, { text: 'I really have to do laundry' }, {})`` on the server. The ``id`` can also be ``null`` to update multiple resources: .. code:: js socket.emit('update', 'messages', null, { complete: true }, { complete: false }); Will call ``app.service('messages').update(null, { complete: true }, { query: { complete: 'false' } })`` on the server. .. tip:: ``update`` is normally expected to replace an entire resource, which is why the database adapters only support ``patch`` for multiple records. patch ~~~~~ Merge the existing data of a single or multiple resources with the new ``data``. .. code:: js socket.emit('patch', 'messages', 2, { read: true }, (error, message) => { console.log('Patched message', message); }); Will call ``app.service('messages').patch(2, { read: true }, {})`` on the server. The ``id`` can also be ``null`` to update multiple resources: .. code:: js socket.emit('patch', 'messages', null, { complete: true }, { complete: false }, (error, message) => { console.log('Patched message', message); }); Will call ``app.service('messages').patch(null, { complete: true }, { query: { complete: false } })`` on the server, to change the status for all read app.service(‘messages’). This is supported out of the box by the Feathers :doc:`../readme` remove ~~~~~~ Remove a single or multiple resources: .. code:: js socket.emit('remove', 'messages', 2, { cascade: true }, (error, message) => { console.log('Removed a message', message); }); Will call ``app.service('messages').remove(2, { query: { cascade: true } })`` on the server. The ``id`` can also be ``null`` to remove multiple resources: .. code:: js socket.emit('remove', 'messages', null, { read: true }); Will call ``app.service('messages').remove(null, { query: { read: 'true' } })`` on the server to delete all read app.service(‘messages’). .. _client_socketio_listening-to-events: Listening to events ~~~~~~~~~~~~~~~~~~~ Listening to service events allows real-time behaviour in an application. :doc:`events` are sent to the socket in the form of ``servicepath eventname``. created ^^^^^^^ The ``created`` event will be published with the callback data, when a service ``create`` returns successfully. .. code:: js var socket = io('http://localhost:3030/'); socket.on('messages created', function(message) { console.log('Got a new Todo!', message); }); updated, patched ^^^^^^^^^^^^^^^^ The ``updated`` and ``patched`` events will be published with the callback data, when a service ``update`` or ``patch`` method calls back successfully. .. code:: js var socket = io('http://localhost:3030/'); socket.on('my/messages updated', function(message) { console.log('Got an updated Todo!', message); }); socket.emit('update', 'my/messages', 1, { text: 'Updated text' }, {}, function(error, callback) { // Do something here }); removed ^^^^^^^ The ``removed`` event will be published with the callback data, when a service ``remove`` calls back successfully. .. code:: js var socket = io('http://localhost:3030/'); socket.on('messages removed', function(message) { // Remove element showing the Todo from the page $('#message-' + message.id).remove(); }); .. |GitHub stars| image:: https://img.shields.io/github/stars/feathersjs/socketio-client.png?style=social&label=Star :target: https://github.com/feathersjs/socketio-client/ .. |npm version| image:: https://img.shields.io/npm/v/@feathersjs/socketio-client.png?style=flat-square :target: https://www.npmjs.com/package/@feathersjs/socketio-client .. |Changelog| image:: https://img.shields.io/badge/changelog-.md-blue.png?style=flat-square :target: https://github.com/feathersjs/socketio-client/blob/master/CHANGELOG.md