@ayios/rpc
v0.2.1
Published
Ayios RPC system
Downloads
51
Readme
Introduction
There are three classes: RPCExecutor, RPCListener, and RPCMulti (a combination of a listener and executor).
Requires Redis and uses pub/sub under the hood.
RPCMulti opens two Redis connections — one for publishing, one for subscribing.
Op code -1 is reserved for replies. Do not use it as a regular event code.
Basic Usage
import { RPCMulti } from '@ayios/rpc';
import { createClient } from 'redis';
const redisClient = createClient({ url: process.env.REDIS_URL });
await redisClient.connect();
const rpc = new RPCMulti('messages_production', redisClient);
// Listen for an event (opcode 1)
const listenerID = rpc.onEvent<string>(1, (data, reply) => {
console.log('Received:', data);
});
// Remove a specific listener by UUID
rpc.removeListener(listenerID);
// Remove all listeners for opcode 1
rpc.removeListener(1);
// Send an event
const recipients = await rpc.sendEvent(1, 'hello');
// recipients = number of clients that received the messageRequest / Reply
Op code -1 is always a reply. Use sendEventWithReply to send an event and await a response:
// Sender — waits up to 5s for a reply
const reply = await rpc.sendEventWithReply<{ status: string }>(2, { userId: '123' });
console.log(reply.status); // 'ok'
// Receiver — the second argument `reply` is non-null when the sender expects a response
rpc.onEvent<{ userId: string }>(2, async (data, reply) => {
const result = await lookupUser(data.userId);
if (reply) await reply({ status: 'ok', user: result });
});If no reply arrives within the timeout, sendEventWithReply rejects with a timeout error.
The default timeout is 5000ms and can be overridden as the third argument.
Separate Executor / Listener
import { RPCExecutor, RPCListener } from '@ayios/rpc';
// Publisher client (regular connected client)
const pub = createClient({ url: process.env.REDIS_URL });
await pub.connect();
// Subscriber client (must be a separate connection)
const sub = pub.duplicate() as RedisClientType;
await sub.connect();
const executor = new RPCExecutor('my_channel', pub);
const listener = new RPCListener('my_channel', sub, pub); // third arg = publisher for replies
listener.onEvent<string>(1, (data, reply) => {
console.log(data);
});
executor.sendEvent(1, 'ping');License
All code within this repository created by Ayios is under MIT license. Other code within this repository, if present, is under its own respective license which will be displayed within their respective files.
