lightweight-socket
Version:
lightweight socket
1 lines • 19.3 kB
Source Map (JSON)
{"version":3,"sources":["../src/server.ts","../src/event.ts","../src/client-server.ts","../src/adapter.ts","../src/namespace.ts","../src/room.ts"],"sourcesContent":["import * as http from 'http';\r\nimport { WebSocket, WebSocketServer } from 'ws';\r\nimport { Namespace } from './namespace';\r\nimport { ServerSideClient } from './client-server';\r\nimport { Room } from './room';\r\n\r\ninterface ServerOptionInterface {\r\n port: number;\r\n}\r\n\r\nexport class Server {\r\n\r\n private server: http.Server;\r\n\r\n public ws: WebSocketServer;\r\n\r\n public clients: Map<string, ServerSideClient> = new Map();\r\n\r\n private port: number;\r\n\r\n public namespaces: Map<string, Namespace> = new Map();\r\n\r\n public static isInitialized: boolean = false;\r\n\r\n constructor(options: ServerOptionInterface | number) {\r\n if (typeof options === 'number') {\r\n options = { port: options};\r\n }\r\n this.port = options.port;\r\n this.server = http.createServer((req, res) => res.writeHead(200, { 'Content-Type': 'text/plain' })).listen(this.port);\r\n this.server.on('upgrade', this.upgrade.bind(this));\r\n const namespace = this.getNamespace('/');\r\n this.namespaces.set('/', namespace);\r\n }\r\n\r\n private upgrade(req: http.IncomingMessage, socket: any, head: Buffer) {\r\n const [namespacePath, query] = req.url.split('?');\r\n const namespace = this.getNamespace(namespacePath);\r\n const wss = namespace.ws;\r\n\r\n wss.handleUpgrade(req, socket, head, (socket) => this.handler(namespace, socket, namespacePath));\r\n }\r\n\r\n private handler(namespace: Namespace, socket: WebSocket, namespacePath: string) {\r\n const client = new ServerSideClient(namespacePath, socket, this);\r\n this.clients.set(client.id, client);\r\n namespace.rooms.set(client.id, client);\r\n \r\n client.on('close', () => this.clients.delete(client.id));\r\n client.on('join-room', (name) => {\r\n var room = null;\r\n if (!namespace.rooms.has(name)) {\r\n room = new Room(name);\r\n namespace.rooms.set(name, room)\r\n namespace.emit('create-room', room);\r\n }\r\n room = namespace.rooms.get(name) as Room;\r\n room.add(client);\r\n client.rooms.set(name, room);\r\n namespace.emit('join-room', room, client.id);\r\n });\r\n client.on('leave-room', (name) => {\r\n if (!namespace.rooms.has(name)) {\r\n return;\r\n }\r\n const room = namespace.rooms.get(name) as Room;\r\n room.remove(client);\r\n namespace.emit('leave-room', room, client.id);\r\n if (room.clients.size === 0) {\r\n namespace.emit('delete-room', room);\r\n namespace.rooms.delete(name);\r\n }\r\n });\r\n\r\n client.emit('connect', client.id);\r\n namespace.emit('connection', client);\r\n }\r\n\r\n public getNamespace(namespacePath: string): Namespace {\r\n if (this.namespaces.has(namespacePath)) return this.namespaces.get(namespacePath) as Namespace;\r\n\r\n const wss = new WebSocketServer({ noServer: true });\r\n wss.setMaxListeners(0);\r\n const namespace = new Namespace(namespacePath, this, wss);\r\n this.namespaces.set(namespacePath, namespace);\r\n return namespace;\r\n }\r\n\r\n public emit(name: string, ...args: any[]) {\r\n this.namespaces.forEach(namespace => {\r\n var adapter = namespace.adapter();\r\n namespace.rooms.forEach(room => adapter = adapter.to(room.id));\r\n adapter.emit(name, ...args);\r\n });\r\n }\r\n\r\n public close() {\r\n this.clients.forEach(client => client.close());\r\n this.server.close();\r\n }\r\n\r\n public on(event: string, listener: any) {\r\n this.namespaces.forEach(namespace => namespace.on(event, listener));\r\n }\r\n\r\n public of(namespace: string): Namespace {\r\n return this.getNamespace(namespace);\r\n }\r\n}","export interface EventInterface {\r\n name: string;\r\n payload: Array<string | number | [] | {}>;\r\n}\r\n\r\nexport class Event implements EventInterface {\r\n\r\n public name: EventInterface['name']\r\n\r\n public payload: EventInterface['payload']\r\n\r\n constructor(name: string, payload: EventInterface['payload']) {\r\n this.name = name;\r\n this.payload = payload;\r\n }\r\n\r\n toString() {\r\n return JSON.stringify({ name: this.name, payload: this.payload });\r\n }\r\n}\r\n\r\nexport class Emitter {\r\n\r\n protected listeners: { [event: string]: Function[] } = {};\r\n\r\n public on(event: string, listener: Function) {\r\n if (!this.listeners[event]) {\r\n this.listeners[event] = [];\r\n }\r\n this.listeners[event].push(listener);\r\n }\r\n\r\n public once(event: string, listener: Function) {\r\n const onceListener = (...args: any[]) => {\r\n this.off(event, onceListener);\r\n listener.apply(this, args);\r\n };\r\n this.on(event, onceListener);\r\n }\r\n\r\n public off(event: string, listener: Function) {\r\n if (!this.listeners[event]) return;\r\n this.listeners[event] = this.listeners[event].filter(l => l !== listener);\r\n }\r\n\r\n}\r\n","import { Event, EventInterface } from './event';\r\nimport { WebSocket } from 'ws';\r\nimport { Adapter } from './adapter';\r\nimport { Room } from './room';\r\nimport { Server } from './server';\r\nimport { Emitter } from './event';\r\n\r\nexport class AbstractClient extends Emitter{\r\n\r\n protected url: string;\r\n\r\n public socket: WebSocket;\r\n\r\n public id: string;\r\n\r\n public emit(name: string, ...args: any[]) {\r\n if (name === 'message') return;\r\n const event = new Event(name, args);\r\n const message = event.toString();\r\n this.socket.send(message);\r\n }\r\n\r\n public close() {\r\n this.socket.close();\r\n }\r\n\r\n protected receive(data: string | Buffer) {\r\n \r\n if (Buffer.isBuffer(data)) {\r\n data = data.toString();\r\n }\r\n\r\n const parsedEvent = JSON.parse(data) as EventInterface;\r\n if (this.listeners[parsedEvent.name]) {\r\n this.listeners[parsedEvent.name].forEach(listener => listener(...parsedEvent.payload));\r\n }\r\n }\r\n\r\n protected init() {\r\n this.socket.on('message', this.receive.bind(this));\r\n }\r\n}\r\n\r\nexport class Client extends AbstractClient {\r\n constructor(url: string) {\r\n super();\r\n this.url = url;\r\n this.socket = new WebSocket(`${url}`);\r\n this.init();\r\n this.socket.on('connect', (id) => this.id = id);\r\n }\r\n}\r\n\r\nexport class ServerSideClient extends AbstractClient {\r\n\r\n public rooms: Map<string, Room | ServerSideClient> = new Map();\r\n\r\n constructor(url: string, socket: WebSocket, private server: Server) {\r\n super();\r\n this.socket = socket;\r\n this.url = url;\r\n this.id = Math.random().toString(36).substr(2, 12);\r\n this.init();\r\n this.rooms.set(this.id, this);\r\n }\r\n\r\n public join(room: string) {\r\n this.emit('join-room', room);\r\n }\r\n\r\n public leave(room: string) {\r\n this.emit('leave-room', room);\r\n }\r\n\r\n public to(room: string) {\r\n const adapter = new Adapter(this.server);\r\n return adapter.of(this.url).to(room);\r\n }\r\n\r\n public in(room: string) {\r\n return this.to(room);\r\n }\r\n\r\n public except(room: string) {\r\n const adapter = new Adapter(this.server);\r\n return adapter.of(this.url).except(room);\r\n }\r\n\r\n public emit(name: string, ...args: any[]) {\r\n if (name === 'join-room' || name === 'leave-room') {\r\n if (this.listeners[name]) {\r\n this.listeners[name].forEach(listener => listener(...args));\r\n }\r\n return\r\n }\r\n const adapter = new Adapter(this.server);\r\n return adapter.of(this.url).to(this.id).emit(name, ...args);\r\n }\r\n}","import { Server } from './server';\r\nimport { Event } from './event';\r\nimport { ServerSideClient } from './client-server';\r\nimport { Room } from './room';\r\n\r\nexport class Adapter {\r\n\r\n private server: Server;\r\n private rooms: Set<string>;\r\n private exceptions: Set<string>;\r\n private namespace: string | null;\r\n\r\n constructor(server: Server) {\r\n this.server = server;\r\n this.rooms = new Set();\r\n this.exceptions = new Set();\r\n this.namespace = null;\r\n }\r\n\r\n to(room: string) {\r\n this.rooms.add(room);\r\n return this;\r\n }\r\n\r\n except(clientId: string) {\r\n this.exceptions.add(clientId);\r\n return this;\r\n }\r\n\r\n in(room: string) {\r\n return this.to(room);\r\n }\r\n\r\n of(namespace: string) {\r\n this.namespace = namespace;\r\n return this;\r\n }\r\n\r\n emit(name: string, ...args: any[]) {\r\n const event = new Event(name, args);\r\n const message = event.toString();\r\n const namespace = this.server.namespaces.get(this.namespace ?? '/');\r\n \r\n if (!namespace) return;\r\n \r\n this.rooms.forEach(room => {\r\n if (!namespace.rooms.has(room)) {\r\n return;\r\n }\r\n\r\n const clients = namespace.rooms.get(room) instanceof ServerSideClient ? [namespace.rooms.get(room) as ServerSideClient] : (namespace.rooms.get(room) as Room).clients;\r\n \r\n clients.forEach(client => {\r\n if (this.exceptions.has(client.id)) return;\r\n client.socket.send(message);\r\n });\r\n });\r\n\r\n this.rooms.clear();\r\n this.exceptions.clear();\r\n this.namespace = null;\r\n }\r\n}","import { Server } from './server';\r\nimport { Room } from './room';\r\nimport { Adapter } from './adapter';\r\nimport { Emitter } from './event';\r\nimport { WebSocketServer } from 'ws';\r\nimport { ServerSideClient } from './client-server';\r\n\r\nexport class Namespace extends Emitter {\r\n public server: Server;\r\n\r\n public ws: WebSocketServer;\r\n\r\n public rooms: Map<string, Room | ServerSideClient> = new Map();\r\n\r\n constructor(public namespace: string, server: Server, ws: WebSocketServer) {\r\n super();\r\n this.server = server;\r\n this.ws = ws;\r\n }\r\n\r\n public except(room: string) {\r\n const adapter = new Adapter(this.server);\r\n return adapter.of(this.namespace).except(room);\r\n }\r\n\r\n public emit(name: string, ...args: any[]) {\r\n if (name === 'create-room' || name === 'join-room' || name === 'leave-room' || name === 'delete-room' || name === 'connection' || name === 'close') {\r\n if (this.listeners[name]) {\r\n this.listeners[name].forEach(listener => listener(...args));\r\n }\r\n return\r\n }\r\n const adapter = new Adapter(this.server);\r\n return adapter.of(this.namespace).emit(name, ...args);\r\n }\r\n\r\n public adapter() {\r\n return new Adapter(this.server);\r\n }\r\n\r\n public to(room: string) {\r\n const adapter = new Adapter(this.server);\r\n return adapter.of(this.namespace).to(room);\r\n }\r\n\r\n public in(room: string) {\r\n return this.to(room);\r\n }\r\n}","import { ServerSideClient } from './client-server';\r\n\r\nexport class Room {\r\n\r\n public clients: Map<string, ServerSideClient> = new Map();\r\n\r\n public id: string;\r\n\r\n constructor(name: string) {\r\n this.id = name;\r\n }\r\n\r\n public add(client: ServerSideClient) {\r\n const clientId = client.id;\r\n this.clients.set(clientId, client);\r\n client.on('close', () => this.clients.delete(clientId));\r\n }\r\n\r\n public remove(client: ServerSideClient) {\r\n const clientId = client.id;\r\n this.clients.delete(clientId);\r\n }\r\n}"],"mappings":"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","names":["socket"]}