Observable Rooms

Observable rooms act like regular rooms but provide additional functionality for keeping track of connected members and linking messages to members.

Subscribing

Subscribing to an observable room works like subscribing to a regular room, simply prefix the room name with observable-.

var room = drone.subscribe('observable-room');
room.on('open', function(error) {
  if (error) {
    return console.error(error);
  }
  // Connected to room
});

Events

Members event

Emits an array of members that have joined the room. This event is only triggered once, right after the user has successfully connected to the observable room.

room.on('members', function(members) {
  // List of members as an array
});

Members array will also contain yourself. You can find yourself from the array like so.

var me = members.find(function(member) {
  return member.id === drone.clientId;
});

Member join event

Member join event is emitted when a new member joins the room.

room.on('member_join', function(member) {
  // Member object
});

Member leave event

Member leave event is emitted when a member leaves the room.

room.on('member_leave', function(member) {
  // Member object
});

Data event

Data event works just like in a normal room would but offers a second additional argument that defines which user sent the message. When the member argument is empty the message was sent using the REST API.

room.on('message', function(message) {
  const member = message.member;
  // Message sent by that member
});

Member object

Key Optional Type Description
id string Unique ID of the member
authData object Data set by the JWT
clientData object Data set by the JS client

Example member object

{
  id: 'jkawkaf:djkdd21',
  authData: { serverId: 312 }, // Undefined if not set
  clientData: { color: 'Orange' } // Undefined if not set
}

Adding custom data to a member

Custom data can be added to a member using the JavaScript API or JWT Authentication. All sensitive data should be set via the JWT Authentication so a connecting client cannot tamper with it. The data has to be set as a JavaScript object.

Custom member data using JavaScript

Setting data

var drone = new ScaleDrone('channel_id', {
  data: {
    name: 'yellow_tree',
    color: '#fe21f1',
  }
});

Reading data

room.on('member_join', function(member) {
  console.log(member.clientData.name); //yellow_tree
  console.log(member.clientData.color); //#fe21f1
});

Custom member data using JWT Authentication

Setting data

Add a JSON data claim to the JWT.

{
  "client": "client_id_sent_from_javascript_client",
  "channel": "channel_id",
  "permissions": {
    ".*": {
      "publish": true,
      "subscribe": true
    }
  },
  "exp": 1408639878,
  "data": {
    "name": "green_sun",
    "color": "#00ff00"
  }
}

Reading data

room.on('member_join', function(member) {
  console.log(member.authData.name); //green_sun
  console.log(member.authData.color); //#00ff00
});