Factor out common joinProject logic to provide and HTTP end point for the real-time API