// onNewSocket is triggered as soon as a new socket connects. func onNewSocket(s *glue.Socket) { // Create the BitMonster Socket value. socket := &Socket{ socket: s, chanCall: s.Channel(channelCall), chanEvent: s.Channel(channelEvent), values: make(map[interface{}]interface{}), valueTimeouts: make(map[interface{}]*time.Timer), } // Save itself to the glue Value. s.Value = socket // Set the emitter. // Create a new emitter, set the recover function and the max listeners. socket.emitter = emission.NewEmitter(). RecoverWith(recoverEmitter). SetMaxListeners(emitterMaxListeners) // We won't read any data from the socket itself. // Discard the received data! s.DiscardRead() // Set the function which is triggered as soon as the socket is closed. s.OnClose(func() { onCloseSocket(socket) }) // Prepare the call channel. socket.chanCall.OnRead(func(data string) { // Trigger the call request. handleCallRequest(socket, data) }) // Prepare the event channel. socket.chanEvent.OnRead(func(data string) { // Trigger the event request. handleEventRequest(socket, data) }) // Trigger the event. emitter.Emit(emitterOnNewSocket, socket) }