robin*

서브스레드 작성과 브로드캐스팅 구현

1 const sio = require('socket.io'); 1 const sio = require('socket.io');
2 const db = require('./db'); 2 const db = require('./db');
3 +const hash = require('./hash');
3 4
4 let io; 5 let io;
5 module.exports = { 6 module.exports = {
6 init(http) { 7 init(http) {
7 io = sio(http); 8 io = sio(http);
8 io.on('connection', (socket) => { 9 io.on('connection', (socket) => {
9 - socket.on('init', (id) => { 10 + socket.on('init', async(id) => {
11 + let thread = await db.get('thread').findOne(id);
12 + if(!thread) {
13 + socket.close();
14 + return;
15 + }
10 console.log(`init ${id}`); 16 console.log(`init ${id}`);
11 - db.get('subthread').find({parent: id}, {sort: '+_id'}).each((thread, _) => { 17 + db.get('subthread').find({parent: thread._id}, {sort: '+_id'}).each((thread, _) => {
12 socket.emit('thread', thread); 18 socket.emit('thread', thread);
19 + }).then(() => {
20 + socket.join(`thread-${thread._id}`);
21 + console.log(`join thread-${thread._id}`);
22 + });
23 + socket.on('write', async(content) => {
24 + console.log(`write ${content}`);
25 + let subthread = await db.get('subthread').insert({parent: thread._id, writer: hash(thread._id, socket.handshake.address), content, no: ++thread.count});
26 + db.get('thread').update(thread._id, {$set: {count: thread.count, lastUpdated: Date.now()}});
27 + io.to(`thread-${thread._id}`).emit('thread', subthread);
28 + console.log(`broadcast thread-${thread._id}`);
13 }); 29 });
14 }); 30 });
15 }); 31 });
......