input events have their own goroutine