replace broadcast
with dispatch
in the gateway code
This commit is contained in:
parent
dcb4983302
commit
701f6ae1ac
3 changed files with 21 additions and 20 deletions
|
@ -10,50 +10,50 @@ import { GatewayPayloadType } from "./gatewaypayloadtype";
|
||||||
const GATEWAY_BATCH_INTERVAL = 25000 || process.env.GATEWAY_BATCH_INTERVAL;
|
const GATEWAY_BATCH_INTERVAL = 25000 || process.env.GATEWAY_BATCH_INTERVAL;
|
||||||
const GATEWAY_PING_INTERVAL = 20000 || process.env.GATEWAY_PING_INTERVAL;
|
const GATEWAY_PING_INTERVAL = 20000 || process.env.GATEWAY_PING_INTERVAL;
|
||||||
|
|
||||||
// mapping between a broadcast id and a websocket client
|
// mapping between a dispatch id and a websocket client
|
||||||
const broadcastChannels = new Map<string, Set<WebSocket>>();
|
const dispatchChannels = new Map<string, Set<WebSocket>>();
|
||||||
|
|
||||||
function clientSubscribe(ws: WebSocket, broadcastChannel: string) {
|
function clientSubscribe(ws: WebSocket, dispatchChannel: string) {
|
||||||
ws.state.broadcastChannels.add(broadcastChannel);
|
ws.state.dispatchChannels.add(dispatchChannel);
|
||||||
if (!broadcastChannels.get(broadcastChannel)) {
|
if (!dispatchChannels.get(dispatchChannel)) {
|
||||||
broadcastChannels.set(broadcastChannel, new Set());
|
dispatchChannels.set(dispatchChannel, new Set());
|
||||||
}
|
}
|
||||||
|
|
||||||
broadcastChannels.get(broadcastChannel)?.add(ws);
|
dispatchChannels.get(dispatchChannel)?.add(ws);
|
||||||
}
|
}
|
||||||
|
|
||||||
function clientUnsubscribe(ws: WebSocket, broadcastChannel: string) {
|
function clientUnsubscribe(ws: WebSocket, dispatchChannel: string) {
|
||||||
if (!ws.state) return;
|
if (!ws.state) return;
|
||||||
|
|
||||||
ws.state.broadcastChannels.delete(broadcastChannel);
|
ws.state.dispatchChannels.delete(dispatchChannel);
|
||||||
|
|
||||||
const set = broadcastChannels.get(broadcastChannel);
|
const set = dispatchChannels.get(dispatchChannel);
|
||||||
if (!set) return;
|
if (!set) return;
|
||||||
|
|
||||||
set.delete(ws);
|
set.delete(ws);
|
||||||
if (set.size < 1) {
|
if (set.size < 1) {
|
||||||
broadcastChannels.delete(broadcastChannel);
|
dispatchChannels.delete(dispatchChannel);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function clientUnsubscribeAll(ws: WebSocket) {
|
function clientUnsubscribeAll(ws: WebSocket) {
|
||||||
if (!ws.state) return;
|
if (!ws.state) return;
|
||||||
|
|
||||||
ws.state.broadcastChannels.forEach(e => {
|
ws.state.dispatchChannels.forEach(e => {
|
||||||
const set = broadcastChannels.get(e);
|
const set = dispatchChannels.get(e);
|
||||||
if (!set) return;
|
if (!set) return;
|
||||||
|
|
||||||
set.delete(ws);
|
set.delete(ws);
|
||||||
if (set && set.size < 1) {
|
if (set && set.size < 1) {
|
||||||
broadcastChannels.delete(e);
|
dispatchChannels.delete(e);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
ws.state.broadcastChannels = new Set();
|
ws.state.dispatchChannels = new Set();
|
||||||
}
|
}
|
||||||
|
|
||||||
export function broadcast(channel: string, message: GatewayPayload) {
|
export function dispatch(channel: string, message: GatewayPayload) {
|
||||||
const members = broadcastChannels.get(channel);
|
const members = dispatchChannels.get(channel);
|
||||||
if (!members) return;
|
if (!members) return;
|
||||||
|
|
||||||
members.forEach(e => e.send(JSON.stringify(message)));
|
members.forEach(e => e.send(JSON.stringify(message)));
|
||||||
|
@ -133,7 +133,7 @@ export default function(server: Server) {
|
||||||
alive: false,
|
alive: false,
|
||||||
ready: false,
|
ready: false,
|
||||||
lastAliveCheck: performance.now(),
|
lastAliveCheck: performance.now(),
|
||||||
broadcastChannels: new Set()
|
dispatchChannels: new Set()
|
||||||
};
|
};
|
||||||
|
|
||||||
sendPayload(ws, {
|
sendPayload(ws, {
|
||||||
|
@ -145,7 +145,6 @@ export default function(server: Server) {
|
||||||
|
|
||||||
ws.on("close", () => {
|
ws.on("close", () => {
|
||||||
clientUnsubscribeAll(ws);
|
clientUnsubscribeAll(ws);
|
||||||
console.log(broadcastChannels);
|
|
||||||
});
|
});
|
||||||
|
|
||||||
ws.on("message", async (rawData, isBinary) => {
|
ws.on("message", async (rawData, isBinary) => {
|
||||||
|
@ -171,6 +170,7 @@ export default function(server: Server) {
|
||||||
// each user should have their own list of channels that they join
|
// each user should have their own list of channels that they join
|
||||||
const channels = await query("SELECT id, name, owner_id FROM channels");
|
const channels = await query("SELECT id, name, owner_id FROM channels");
|
||||||
|
|
||||||
|
clientSubscribe(ws, "*");
|
||||||
channels.rows.forEach(c => {
|
channels.rows.forEach(c => {
|
||||||
clientSubscribe(ws, `channel:${c.id}`);
|
clientSubscribe(ws, `channel:${c.id}`);
|
||||||
});
|
});
|
||||||
|
|
|
@ -3,6 +3,7 @@ import { body, param, validationResult } from "express-validator";
|
||||||
import { authenticateRoute } from "../../../auth";
|
import { authenticateRoute } from "../../../auth";
|
||||||
import { query } from "../../../database";
|
import { query } from "../../../database";
|
||||||
import { errors } from "../../../errors";
|
import { errors } from "../../../errors";
|
||||||
|
import { dispatch } from "../../../gateway";
|
||||||
|
|
||||||
const router = express.Router();
|
const router = express.Router();
|
||||||
|
|
||||||
|
|
2
src/types/gatewayclientstate.d.ts
vendored
2
src/types/gatewayclientstate.d.ts
vendored
|
@ -3,5 +3,5 @@ interface GatewayClientState {
|
||||||
ready: boolean,
|
ready: boolean,
|
||||||
alive: boolean,
|
alive: boolean,
|
||||||
lastAliveCheck: number,
|
lastAliveCheck: number,
|
||||||
broadcastChannels: Set<string>
|
dispatchChannels: Set<string>
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue