1.1.0 • Published 7 years ago

socket.io-controllers v1.1.0

Weekly downloads
4
License
MIT
Repository
github
Last release
7 years ago

socket.io-controllers

Description

Use ES6 Class with Socket.IO

Installation

$ npm install socket.io-controllers --save

Usage

Let's say that our application will be using Koa and Socket.IO.

  • app.js
const http = require('http');
const path = require('path');
const Koa = require('koa');
const SocketIO = require('socket.io');
const { setupSocketIOControllers } = require('socket.io-controllers');

const app = new Koa();
const server = http.createServer(app.callback());

app.context.io = setupSocketIOControllers({
	server,
	controllers: {
		dir: path.resolve(__dirname, 'socket-controllers')
		// suffix: '.sc.js' // Default: .socket-controller.
	}
});

server.listen(3000, () => console.log('Server running on port 3000'));

Create a socket-controllers folder (inside we will define our Socket Controller Classes)

  • socket-controllers/default.socket-controller.js
const { SocketController } = require('socket.io-controllers');

class DefaultSocketController extends SocketController {
	/**
	 * The "use" function will be our socket middleware.
	 * 
	 * Call this.next() anytime to continue.
	 * 
	 * Or call this.next(new Error('some error')) to deny access.
	 */
	use() {
		const { socket, next } = this;
		const { authToken } = socket.handshake.query;

		// Here we can do some check with the token
		if (authToken === '123456') {
			this.next();
		} else {
			this.next(new Error('Authentication Failed.'));
		}
	}

	/**
	 * We define our socket event handler like the following.
	 * 
	 * On client side for example:
	 * 
	 * socket.emit('SomeCustomEvent', payload)
	 * 
	 * or with acknowledgement
	 * 
	 * socket.emit('SomeCustomEvent', payload, ack => console.log(ack))
	 *
	 * You have access to socket.io server (io) and current socket (socket)
	 */
	onSomeCustomEvent(payload) {
		const { io, socket } = this;
	}

	onSomeCustomEvent2(payload, fn) {}
}

exports.DefaultSocketController = DefaultSocketController;

What about namespacing?

class DefaultSocketController extends SocketController {} // io.of('/')

class AuthSocketController extends SocketController {} // io.of('/auth')

class ChatSocketController extends SocketController {} // io.of('/chat')

LICENSE

MIT