Skip to content

Class: RTUInterface

Provides an abstraction layer beween the socket.io server and the Adonis IoC container.

Methods

except()

ts
except(room: string | string[]): BroadcastOperator<DecorateAcknowledgementsWithMultipleResponses<RTUServerToClientEvents>, SocketData>;

Excludes a room when emitting.

Parameters

ParameterTypeDescription
roomstring | string[]a room, or an array of rooms

Returns

BroadcastOperator<DecorateAcknowledgementsWithMultipleResponses<RTUServerToClientEvents>, SocketData>

a new BroadcastOperator instance for chaining

Example

ts
// the "foo" event will be broadcast to all connected clients, except the ones that are in the "room-101" room
rtu.except("room-101").emit("foo", "bar");

// with an array of rooms
rtu.except(["room-101", "room-102"]).emit("foo", "bar");

// with multiple chained calls
rtu.except("room-101").except("room-102").emit("foo", "bar");

fetchSockets()

ts
fetchSockets(): Promise<RemoteSocket<RTUClientToServerEvents, SocketData>[]>;

Returns the matching socket instances.

Note: this method also works within a cluster of multiple Socket.IO servers, with a compatible Adapter.

Returns

Promise<RemoteSocket<RTUClientToServerEvents, SocketData>[]>

Example

ts
// return all Socket instances
const sockets = await rtu.fetchSockets();

// return all Socket instances in the "room1" room
const sockets = await rtu.in("room1").fetchSockets();

for (const socket of sockets) {
  console.log(socket.id);
  console.log(socket.handshake);
  console.log(socket.rooms);
  console.log(socket.data);

  socket.emit("hello");
  socket.join("room1");
  socket.leave("room2");
  socket.disconnect();
}

in()

ts
in(room: string | string[]): BroadcastOperator<DecorateAcknowledgementsWithMultipleResponses<RTUServerToClientEvents>, SocketData>;

Targets a room when emitting. Similar to to(), but might feel clearer in some cases:

Parameters

ParameterTypeDescription
roomstring | string[]a room, or an array of rooms

Returns

BroadcastOperator<DecorateAcknowledgementsWithMultipleResponses<RTUServerToClientEvents>, SocketData>

a new BroadcastOperator instance for chaining

Example

ts
// disconnect all clients in the "room-101" room
rtu.in("room-101").disconnectSockets();

of()

ts
of(name:
  | string
  | RegExp
| ParentNspNameMatchFn, fn?: (socket: RTUSocket<RTUServerToClientEvents, RTUClientToServerEvents, RTUInterServerEvents, RTUSocketData>) => void): Namespace<RTUServerToClientEvents, RTUClientToServerEvents, RTUInterServerEvents, RTUSocketData>;

Looks up a namespace.

Parameters

ParameterTypeDescription
name| string | RegExp | ParentNspNameMatchFnnsp name
fn?(socket: RTUSocket<RTUServerToClientEvents, RTUClientToServerEvents, RTUInterServerEvents, RTUSocketData>) => voidoptional, nsp connection ev handler

Returns

Namespace<RTUServerToClientEvents, RTUClientToServerEvents, RTUInterServerEvents, RTUSocketData>

Example

ts
// with a simple string
const myNamespace = rtu.of("/my-namespace");

// with a regex
const dynamicNsp = rtu.of(/^/dynamic-\d+$/).on("connection", (socket) => {
  const namespace = socket.nsp; // newNamespace.name === "/dynamic-101"

  // broadcast to all clients in the given sub-namespace
  namespace.emit("hello");
});

send()

ts
send(...args: unknown[]): this;

Sends a message event to all clients.

This method mimics the WebSocket.send() method.

Parameters

ParameterType
...argsunknown[]

Returns

this

self

See

https://developer.mozilla.org/en-US/docs/Web/API/WebSocket/send

Example

ts
rtu.send("hello");

// this is equivalent to
rtu.emit("message", "hello");

serverSideEmit()

ts
serverSideEmit<Ev>(ev: Ev, ...args: EventParams<DecorateAcknowledgementsWithTimeoutAndMultipleResponses<RTUInterServerEvents>, Ev>): boolean;

Sends a message to the other Socket.IO servers of the cluster.

Type Parameters

Type Parameter
Ev extends string

Parameters

ParameterTypeDescription
evEvthe event name
...argsEventParams<DecorateAcknowledgementsWithTimeoutAndMultipleResponses<RTUInterServerEvents>, Ev>an array of arguments, which may include an acknowledgement callback at the end

Returns

boolean

Example

ts
rtu.serverSideEmit("hello", "world");

rtu.on("hello", (arg1) => {
  console.log(arg1); // prints "world"
});

// acknowledgements (without binary content) are supported too:
rtu.serverSideEmit("ping", (err, responses) => {
  if (err) {
    // some servers did not acknowledge the event in the given delay
  } else {
    console.log(responses); // one response per server (except the current one)
  }
});

rtu.on("ping", (cb) => {
  cb("pong");
});

serverSideEmitWithAck()

ts
serverSideEmitWithAck<Ev>(ev: Ev, ...args: AllButLast<EventParams<RTUInterServerEvents, Ev>>): Promise<FirstNonErrorArg<Last<EventParams<RTUInterServerEvents, Ev>>>[]>;

Sends a message and expect an acknowledgement from the other Socket.IO servers of the cluster.

Type Parameters

Type Parameter
Ev extends string

Parameters

ParameterTypeDescription
evEvthe event name
...argsAllButLast<EventParams<RTUInterServerEvents, Ev>>an array of arguments

Returns

Promise<FirstNonErrorArg<Last<EventParams<RTUInterServerEvents, Ev>>>[]>

a Promise that will be fulfilled when all servers have acknowledged the event

Example

ts
try {
  const responses = await rtu.serverSideEmitWithAck("ping");
  console.log(responses); // one response per server (except the current one)
} catch (e) {
  // some servers did not acknowledge the event in the given delay
}

to()

ts
to(room: string | string[]): BroadcastOperator<DecorateAcknowledgementsWithMultipleResponses<RTUServerToClientEvents>, SocketData>;

Targets a room when emitting.

Parameters

ParameterTypeDescription
roomstring | string[]a room, or an array of rooms

Returns

BroadcastOperator<DecorateAcknowledgementsWithMultipleResponses<RTUServerToClientEvents>, SocketData>

a new BroadcastOperator instance for chaining

Example

ts
// the “foo” event will be broadcast to all connected clients in the “room-101” room
rtu.to("room-101").emit("foo", "bar");

// with an array of rooms (a client will be notified at most once)
rtu.to(["room-101", "room-102"]).emit("foo", "bar");

// with multiple chained calls
rtu.to("room-101").to("room-102").emit("foo", "bar");

use()

ts
use(fn: (socket: RTUSocket<RTUServerToClientEvents, RTUClientToServerEvents, RTUInterServerEvents, RTUSocketData>, next: (err?: ExtendedError) => void) => void): this;

Registers a middleware, which is a function that gets executed for every incoming Socket.

Parameters

ParameterTypeDescription
fn(socket: RTUSocket<RTUServerToClientEvents, RTUClientToServerEvents, RTUInterServerEvents, RTUSocketData>, next: (err?: ExtendedError) => void) => voidthe middleware function

Returns

this

Example

ts
rtu.use((socket, next) => {
  // ...
  next();
});

write()

ts
write(...args: unknown[]): this;

Sends a message event to all clients. Alias of send.

Parameters

ParameterType
...argsunknown[]

Returns

this

self