const fs = require( 'fs' ) const path = require( 'path' ) const Koa = require( 'koa' ) const IO = require( '../' ) const co = require( 'co' ) const app = new Koa() const io = new IO() const chat = new IO( 'chat' ) io.attach( app ) chat.attach( app ) /** * Koa Middlewares */ app.use( co.wrap( function *( ctx, next ) { const start = new Date yield next() const ms = new Date - start console.log( `${ ctx.method } ${ ctx.url } - ${ ms }ms` ) })) /** * App handlers */ app.use( ctx => { ctx.type = 'text/html' ctx.body = fs.createReadStream( path.join( __dirname, 'index.html' ) ) }) /** * Socket middlewares */ io.use( co.wrap( function *( ctx, next ) { console.log( 'Socket middleware' ) const start = new Date yield next() const ms = new Date - start console.log( `WS ${ ms }ms` ) })) io.use( co.wrap( function *( ctx, next ) { ctx.teststring = 'test' yield next() })) /** * Socket handlers */ io.on( 'connection', ctx => { console.log( 'Join event', ctx.socket.id ) io.broadcast( 'connections', { numConnections: io.connections.size }) // app.io.broadcast( 'connections', { // numConnections: socket.connections.size // }) }) io.on( 'disconnect', ctx => { console.log( 'leave event', ctx.socket.id ) io.broadcast( 'connections', { numConnections: io.connections.size }) }) io.on( 'data', ( ctx, data ) => { console.log( 'data event', data ) console.log( 'ctx:', ctx.event, ctx.data, ctx.socket.id ) console.log( 'ctx.teststring:', ctx.teststring ) ctx.socket.emit( 'response', { message: 'response from server' }) }) io.on( 'ack', ( ctx, data ) => { console.log( 'data event with acknowledgement', data ) ctx.acknowledge( 'received' ) }) io.on( 'numConnections', packet => { console.log( `Number of connections: ${ io.connections.size }` ) }) /** * Chat handlers */ chat.on( 'connection', ctx => { console.log( 'Joining chat namespace', ctx.socket.id ) }) chat.on( 'message', ctx => { console.log( 'chat message received', ctx.data ) // Broadcasts to everybody, including this connection app.chat.broadcast( 'message', 'yo connections, lets chat' ) // Broadcasts to all other connections ctx.socket.broadcast( 'message', 'ok connections:chat:broadcast' ) // Emits to just this socket ctx.socket.emit( 'message', 'ok connections:chat:emit' ) }) const PORT = 3000 app.listen( 3000, () => { console.log( `Listening on ${ PORT }` ) } )