feat: some of the server
This commit is contained in:
commit
6c135bf91a
19 changed files with 247 additions and 0 deletions
0
client/OUTLINE.md
Normal file
0
client/OUTLINE.md
Normal file
2
server/.gitignore
vendored
Normal file
2
server/.gitignore
vendored
Normal file
|
@ -0,0 +1,2 @@
|
|||
package-lock.json
|
||||
node_modules/
|
0
server/OUTLINE.md
Normal file
0
server/OUTLINE.md
Normal file
15
server/package.json
Normal file
15
server/package.json
Normal file
|
@ -0,0 +1,15 @@
|
|||
{
|
||||
"name": "server",
|
||||
"version": "1.0.0",
|
||||
"description": "",
|
||||
"main": "index.js",
|
||||
"scripts": {
|
||||
"test": "echo \"Error: no test specified\" && exit 1"
|
||||
},
|
||||
"keywords": [],
|
||||
"author": "",
|
||||
"license": "ISC",
|
||||
"dependencies": {
|
||||
"socket.io": "^4.5.4"
|
||||
}
|
||||
}
|
12
server/src/IRC.ts
Normal file
12
server/src/IRC.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { PacketManager } from "./packets/PacketManager";
|
||||
import { RoomManager } from "./rooms/RoomManager";
|
||||
|
||||
export class IRC {
|
||||
public readonly _packetManager: PacketManager = new PacketManager();
|
||||
public readonly _roomManager: RoomManager = new RoomManager();
|
||||
static _packetManager: any;
|
||||
|
||||
public constructor() {
|
||||
this._packetManager = this._packetManager;
|
||||
}
|
||||
}
|
14
server/src/base/Message.ts
Normal file
14
server/src/base/Message.ts
Normal file
|
@ -0,0 +1,14 @@
|
|||
/**
|
||||
* @description A base Message
|
||||
*/
|
||||
export class Message {
|
||||
public messageId: number;
|
||||
public message: string;
|
||||
public sentBy: number; // The id of the user who sent the message
|
||||
|
||||
public constructor(messageId: number, message: string, sentBy: number) {
|
||||
this.messageId = messageId;
|
||||
this.message = message;
|
||||
this.sentBy = sentBy;
|
||||
}
|
||||
}
|
21
server/src/base/Packet.ts
Normal file
21
server/src/base/Packet.ts
Normal file
|
@ -0,0 +1,21 @@
|
|||
import { PacketType } from "../types/PacketType";
|
||||
|
||||
/**
|
||||
* @description The base packet a server will send and recieve
|
||||
*/
|
||||
export class Packet {
|
||||
public id: number;
|
||||
public data: any;
|
||||
public cancelled: boolean = false;
|
||||
public type: PacketType;
|
||||
|
||||
public constructor(id: number, data: any, type: PacketType) {
|
||||
this.id = id;
|
||||
this.data = data;
|
||||
this.type = type;
|
||||
}
|
||||
|
||||
set cancel(cancel: boolean) {
|
||||
this.cancelled = cancel;
|
||||
}
|
||||
}
|
17
server/src/base/Room.ts
Normal file
17
server/src/base/Room.ts
Normal file
|
@ -0,0 +1,17 @@
|
|||
import { Message } from "./Message";
|
||||
import { User } from "./User";
|
||||
|
||||
/**
|
||||
* @description The base room for all rooms
|
||||
*/
|
||||
export class Room {
|
||||
public id: number;
|
||||
public name: string;
|
||||
public connected: User[] = [];
|
||||
public messages: Message[] = [];
|
||||
|
||||
public constructor(id: number, name: string) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
}
|
14
server/src/base/User.ts
Normal file
14
server/src/base/User.ts
Normal file
|
@ -0,0 +1,14 @@
|
|||
import { Room } from "./Room";
|
||||
|
||||
/**
|
||||
* @description A user in a room
|
||||
*/
|
||||
export class User {
|
||||
public id: number;
|
||||
public name: string;
|
||||
|
||||
public constructor(id: number, name: string) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
}
|
11
server/src/index.ts
Normal file
11
server/src/index.ts
Normal file
|
@ -0,0 +1,11 @@
|
|||
import { Server } from "socket.io";
|
||||
import { IRC } from "./IRC";
|
||||
|
||||
const io: Server = new Server();
|
||||
const irc: IRC = new IRC();
|
||||
|
||||
io.on("connection", (socket) => {
|
||||
IRC._packetManager.handleConnection(socket);
|
||||
});
|
||||
|
||||
io.listen(3000);
|
27
server/src/packets/PacketManager.ts
Normal file
27
server/src/packets/PacketManager.ts
Normal file
|
@ -0,0 +1,27 @@
|
|||
import { Packet } from "../base/Packet";
|
||||
import { User } from "../base/User";
|
||||
|
||||
/**
|
||||
* @description This handles all ingoing/outgoing packets in a event based system
|
||||
*/
|
||||
export class PacketManager {
|
||||
public static packetMap: Map<number, Packet> = new Map();
|
||||
public static packetMapOut: Map<number, Packet> = new Map();
|
||||
public static packetMapServer: Map<User, Packet> = new Map();
|
||||
|
||||
public static registerPacket(packet: Packet): void {
|
||||
this.packetMap.set(packet.id, packet);
|
||||
}
|
||||
|
||||
public static registerPacketOut(packet: Packet): void {
|
||||
this.packetMapOut.set(packet.id, packet);
|
||||
}
|
||||
|
||||
public static getPacket(id: number): Packet | undefined {
|
||||
return this.packetMap.get(id);
|
||||
}
|
||||
|
||||
public static registerServerPacket(packet: Packet, to: User): void {
|
||||
this.packetMapServer.set(to, packet);
|
||||
}
|
||||
};
|
26
server/src/packets/client/C01InitialConnectPacket.ts
Normal file
26
server/src/packets/client/C01InitialConnectPacket.ts
Normal file
|
@ -0,0 +1,26 @@
|
|||
import { Packet } from "../../base/Packet";
|
||||
import { Room } from "../../base/Room";
|
||||
import { User } from "../../base/User";
|
||||
|
||||
/**
|
||||
* @description The packet sent by the client to signify an initial connection
|
||||
* @notice If the packet is not sent within 1 second of the connection, the connection will be closed
|
||||
* This also starts the keep alive timer
|
||||
*/
|
||||
export class C01InitialConnectPacket extends Packet {
|
||||
public constructor(user: User, room: Room) {
|
||||
super(1, null, 0);
|
||||
/*
|
||||
Expected data:
|
||||
{
|
||||
user: {
|
||||
name: string,
|
||||
},
|
||||
room: {
|
||||
name: string, // The expected room name to join
|
||||
}
|
||||
}
|
||||
*/
|
||||
this.data = { user, room };
|
||||
}
|
||||
}
|
10
server/src/packets/client/C02KeepAlivePacket.ts
Normal file
10
server/src/packets/client/C02KeepAlivePacket.ts
Normal file
|
@ -0,0 +1,10 @@
|
|||
import { Packet } from "../../base/Packet";
|
||||
|
||||
/**
|
||||
* @description The packet sent by the client to keep the connection alive
|
||||
*/
|
||||
export class C02KeepAlivePacket extends Packet {
|
||||
public constructor() {
|
||||
super(2, null, 0);
|
||||
}
|
||||
}
|
10
server/src/packets/client/C03JoinRoomPacket.ts
Normal file
10
server/src/packets/client/C03JoinRoomPacket.ts
Normal file
|
@ -0,0 +1,10 @@
|
|||
import { Packet } from "../../base/Packet";
|
||||
|
||||
/**
|
||||
* @description The packet sent by the client to join a room
|
||||
*/
|
||||
export class C03JoinRoomPacket extends Packet {
|
||||
public constructor() {
|
||||
super(3, null, 0);
|
||||
}
|
||||
}
|
11
server/src/packets/server/S01BroadcastMessagePacket.ts
Normal file
11
server/src/packets/server/S01BroadcastMessagePacket.ts
Normal file
|
@ -0,0 +1,11 @@
|
|||
import { Packet } from "../../base/Packet";
|
||||
|
||||
/**
|
||||
* @description The packet sent by the server to broadcast a message to all clients
|
||||
*/
|
||||
export class S01BroadcastMessagePacket extends Packet {
|
||||
public constructor(message: string) {
|
||||
super(1, null, 1);
|
||||
this.data = message;
|
||||
}
|
||||
}
|
11
server/src/packets/server/S02ErrPacket.ts
Normal file
11
server/src/packets/server/S02ErrPacket.ts
Normal file
|
@ -0,0 +1,11 @@
|
|||
import { Packet } from "../../base/Packet";
|
||||
|
||||
/**
|
||||
* @description The packet sent by the server to send a error message
|
||||
*/
|
||||
export class S02ErrPacket extends Packet {
|
||||
public constructor(message: string) {
|
||||
super(2, null, 1);
|
||||
this.data = message;
|
||||
}
|
||||
}
|
12
server/src/packets/server/S03ConnectionAcceptedPacket.ts
Normal file
12
server/src/packets/server/S03ConnectionAcceptedPacket.ts
Normal file
|
@ -0,0 +1,12 @@
|
|||
import { Packet } from "../../base/Packet";
|
||||
import { User } from "../../base/User";
|
||||
|
||||
/**
|
||||
* @description The packet sent by the server signify the connection was accepted
|
||||
*/
|
||||
export class S03ConnectionAcceptedPacket extends Packet {
|
||||
public constructor(user: User) {
|
||||
super(3, null, 1);
|
||||
this.data = user;
|
||||
}
|
||||
}
|
30
server/src/rooms/RoomManager.ts
Normal file
30
server/src/rooms/RoomManager.ts
Normal file
|
@ -0,0 +1,30 @@
|
|||
import { Room } from "../base/Room";
|
||||
import { User } from "../base/User";
|
||||
import { IRC } from "../IRC";
|
||||
import { S01BroadcastMessagePacket } from "../packets/server/S01BroadcastMessagePacket";
|
||||
import { S02ErrPacket } from "../packets/server/S02ErrPacket";
|
||||
|
||||
export class RoomManager {
|
||||
private rooms: Room[] = [];
|
||||
|
||||
public addRoom(room: Room): void {
|
||||
this.rooms.push(room);
|
||||
}
|
||||
|
||||
public handleJoin(joined: Room, user: User) {
|
||||
this.rooms.forEach(room => {
|
||||
if(room.id === joined.id) {
|
||||
room.connected.push(user);
|
||||
IRC._packetManager.registerServerPacket(user, new S01BroadcastMessagePacket(`${user.name} joined the room`));
|
||||
room.connected.forEach(user => {
|
||||
IRC._packetManager.registerServerPacket(user, new S01BroadcastMessagePacket(`${user.name} joined the room`));
|
||||
});
|
||||
|
||||
return;
|
||||
}
|
||||
});
|
||||
|
||||
IRC._packetManager.registerServerPacket(user, new S02ErrPacket(`Failed joining that room.`));
|
||||
return;
|
||||
}
|
||||
}
|
4
server/src/types/PacketType.ts
Normal file
4
server/src/types/PacketType.ts
Normal file
|
@ -0,0 +1,4 @@
|
|||
export enum PacketType {
|
||||
CLIENT = 0,
|
||||
SERVER = 1
|
||||
}
|
Loading…
Reference in a new issue