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