matchmaker-redis
Version:
A module that helps users join some kind of social event such as a multiplayer game.
120 lines (85 loc) • 3.26 kB
Markdown
A Node.js module that helps users create, find, and join "events" such as a
multiplayer game. You may think of this as a matchmaking lobby backend.
## Concepts
- Events are created by users.
- Users *join* events.
- Events have a required *capacity*.
- Events *start* when the event is at capacity.
- Events have a *whitelist* and a *blacklist* of users.
- If there's a whitelist, only users on the whitelist may join the event.
- If there's a blacklist, any user on the blacklist may not join the event.
- No user may join an event after the event has started.
- A user may fetch events with which they are somehow involved (created, whitelisted, joined)
- The creator of an event may *cancel* a pending event.
- Active/started events may not be canceled.
- The system *auto-cancels* or *expires* events that fail to start after some time.
- The larger the capacity, the more time the event has to start before auto-cancellation.
- A user may *autojoin* a compatible, pending event.
- Same desired *capacity* and event parameters
- An event's *params* is encoded as a string and can contain anything.
- This might encode a desired rules-of-play for a game for instance.
## Runtime Dependencies
A running Redis instance.
## Installation
npm i --save matchmaker-redis
## Usage
const Redis = require('ioredis')
const redis = new Redis(process.env.REDIS_URL)
const matchmaker = require('matchmaker-redis')(redis)
matchmaker.createEvent(...)
## API
An event looks like this:
event = {
id: string,
capacity: int,
params: string,
userIds: [string],
userAliases: [string],
startedAt: int
}
Create an event and wait for others to join it.
createEvent({
userId: string,
userAlias: string,
capacity: int,
params: string,
perUserTimeoutSec: int,
whitelist: [string],
blacklist: [string],
}) -> Promise(event)
Find a pending event with the given params and user count and join it.
autojoinEvent({
userId: string,
userAlias: string,
capacity: int,
params: string,
}) -> Promise(event)
The creator may cancel an event before it auto-expires.
cancelEvent(userId, eventId) -> Promise(true)
Get the pending and active events the user has created, joined,
or been whitelisted on.
getEventsFor(userId) -> Promise({
active: [event],
pending: [event]
})
Join a specific event. Usually in response to a user seeing that
they are on a whitelist.
joinEvent(userId, userAlias, eventId) -> Promise(event)
## PUBSUB Side Effects
When a user joins an event, a JSON message is published to channel `events/${event.id}`.
{ "type": "join",
"userId": string,
"userAlias": string }
When an event is canceled, a message is published to channel `events/${event.id}`.
{ "type": "cancel" }
## Notes
Uses Redis for event coordination and storage but is not associated with any particular
transport (HTTP, WebSockets, etc).
## Running Tests
Note that the `TEST_DB_NO` (default: 1) database will be cleared/flushed.
$ git clone ...
$ npm i
$ redis-server &
$ REDIS_URL=redis://127.0.0.1:6379 \
TEST_DB_NO=1 \
DEBUG=tests npm test