chamesu
Version:
This package contains all packages of the chat application.
66 lines (53 loc) • 1.94 kB
text/typescript
/*
* Copyright (c) 2022.
* Author Peter Placzek (tada5hi)
* For the full copyright and license information,
* view the LICENSE file that was distributed with this source code.
*/
import {Namespace, Server, Socket} from "socket.io";
import {HttpServerInterface} from "../../config/http/server";
import {Environment} from "../../env";
import {createAdapter} from "@socket.io/redis-adapter";
import {MemorySocketEventMessage, subscribeEventsForSocketServer} from "../memory-event-bus/socket";
import {Config} from "../../config";
import {AuthUser} from "@chamesu/common/domains/auth/user";
export interface SocketInterface extends Socket {
user?: AuthUser,
userId?: number,
userToken?: string,
chatRooms: string[]
}
export interface ServerInterface extends Server {
}
export interface NamespaceInterface extends Namespace {
}
type SocketIoContext = {
env: Environment,
httpServer: HttpServerInterface,
config: Config
}
function createSocketServer({ httpServer, config } : SocketIoContext) {
const socketServer = new Server({
cors: {
credentials: true
},
transports: ['websocket', 'polling'],
serveClient: true
});
socketServer.adapter(createAdapter(config.redisPub, config.redisSub));
socketServer.attach(httpServer);
subscribeEventsForSocketServer(socketServer, (memoryEventMessage: MemorySocketEventMessage) => {
if(typeof memoryEventMessage.room === 'undefined') {
socketServer
.of(memoryEventMessage.namespace ?? '/')
.emit(memoryEventMessage.event, memoryEventMessage.payload);
} else {
socketServer
.of(memoryEventMessage.namespace ?? '/')
.in(memoryEventMessage.room)
.emit(memoryEventMessage.event, memoryEventMessage.payload);
}
});
return socketServer;
}
export default createSocketServer;