1 | {EventEmitter} = require 'events'
|
2 | engineServer = require 'engine.io'
|
3 |
|
4 | class Server extends EventEmitter
|
5 | constructor: (@httpServer, @options={}) ->
|
6 | @options.path ?= "/holla"
|
7 | @options.destroyUpgrade ?= false
|
8 | @server = engineServer.attach @httpServer, @options
|
9 | @server.httpServer = @httpServer
|
10 | @server.on 'connection', @handleConnection
|
11 |
|
12 | presence: (user, presence, users) ->
|
13 | for id in users
|
14 | @server.clients[id]?.send JSON.stringify
|
15 | type: "presence"
|
16 | args:
|
17 | name: user
|
18 | online: presence.online
|
19 | return
|
20 |
|
21 | handleConnection: (socket) =>
|
22 | socket.on 'message', (msg) =>
|
23 | console.log socket.id, msg
|
24 | try
|
25 | msg = JSON.parse msg
|
26 | catch e
|
27 | return
|
28 | return unless msg.type and typeof msg.type is "string"
|
29 | return if msg.args and typeof msg.args isnt "object"
|
30 |
|
31 | if msg.type is "identify"
|
32 | return unless msg.args
|
33 | return unless msg.args.name
|
34 | req =
|
35 | name: msg.args.name
|
36 | socket: socket
|
37 | @identify req, (res=true) ->
|
38 | socket.identity ?= msg.args.name if res is true
|
39 | socket.send JSON.stringify
|
40 | type: "identify"
|
41 | args:
|
42 | result: res
|
43 |
|
44 | else if msg.type is "offer"
|
45 | return unless msg.to
|
46 | return unless socket.identity
|
47 | @getId msg.to, (id) =>
|
48 | @server.clients[id]?.send JSON.stringify
|
49 | type: "offer"
|
50 | from: socket.identity
|
51 |
|
52 | else if msg.type is "hangup"
|
53 | return unless msg.to
|
54 | return unless socket.identity
|
55 | @getId msg.to, (id) =>
|
56 | @server.clients[id]?.send JSON.stringify
|
57 | type: "hangup"
|
58 | from: socket.identity
|
59 |
|
60 | else if msg.type is "answer"
|
61 | return unless msg.to
|
62 | return unless msg.args
|
63 | return unless msg.args.accepted?
|
64 | return unless socket.identity
|
65 | @getId msg.to, (id) =>
|
66 | @server.clients[id]?.send JSON.stringify
|
67 | type: "answer"
|
68 | from: socket.identity
|
69 | args:
|
70 | accepted: msg.args.accepted
|
71 |
|
72 | else if msg.type is "candidate"
|
73 | return unless msg.to
|
74 | return unless msg.args
|
75 | return unless msg.args.candidate
|
76 | return unless socket.identity
|
77 | @getId msg.to, (id) =>
|
78 | @server.clients[id]?.send JSON.stringify
|
79 | type: "candidate"
|
80 | from: socket.identity
|
81 | args:
|
82 | candidate: msg.args.candidate
|
83 |
|
84 | else if msg.type is "sdp"
|
85 | return unless msg.to
|
86 | return unless msg.args
|
87 | return unless msg.args.sdp
|
88 | return unless msg.args.type
|
89 | return unless socket.identity
|
90 | @getId msg.to, (id) =>
|
91 | @server.clients[id]?.send JSON.stringify
|
92 | type: "sdp"
|
93 | from: socket.identity
|
94 | args:
|
95 | sdp: msg.args.sdp
|
96 | type: msg.args.type
|
97 |
|
98 | else if msg.type is "chat"
|
99 | return unless msg.to
|
100 | return unless msg.args
|
101 | return unless msg.args.message
|
102 | return unless socket.identity
|
103 | @getId msg.to, (id) =>
|
104 | @server.clients[id]?.send JSON.stringify
|
105 | type: "chat"
|
106 | from: socket.identity
|
107 | args:
|
108 | message: msg.args.message
|
109 |
|
110 |
|
111 |
|
112 | socket.on 'error', (err) =>
|
113 | req =
|
114 | name: socket.identity
|
115 | reason: err
|
116 | socket: socket
|
117 | @error? req
|
118 |
|
119 | socket.on 'close', (reason) =>
|
120 | req =
|
121 | name: socket.identity
|
122 | reason: reason
|
123 | socket: socket
|
124 |
|
125 | @close? req
|
126 |
|
127 | module.exports = Server
|