jam-cloud/web/app/assets/javascripts/react-components/stores/VideoLiveStreamStore.js.coffee

265 lines
7.5 KiB
CoffeeScript

context = window
logger = context.JK.logger
rest = context.JK.Rest()
EVENTS = context.JK.EVENTS
NAMED_MESSAGES = context.JK.NAMED_MESSAGES
VideoLiveStreamActions = @VideoLiveStreamActions
@VideoLiveStreamStore = Reflux.createStore(
{
listenables: VideoLiveStreamActions
logger: context.JK.logger
creatingBroadcast: false
init: ->
this.listenTo(context.AppStore, this.onAppInit)
onAppInit: (@app) ->
onPopupClosed: () ->
if @childWindow?
@childWindow = null
logger.debug("Popup closed")
context.jamClient.StopLiveStreaming()
@streaming = false
@onRefresh()
onRefresh: () ->
@state = {
creatingBroadcast: @creatingBroadcast,
createdStream: @createdStream,
createStreamError: @createStreamError,
waitingForReady: @waitingForReady,
waitingOnTesting: @waitingOnTesting,
waitingOnLive: @waitingOnLive,
transitioningTesting: @transitioningTesting,
streaming: @streaming,
errorMessage: @errorMessage,
broadcast: @broadcast
}
this.trigger(@state)
onStartLiveStream: () ->
@creatingBroadcast = false
@createdStream = false
@createStreamError = false
@transitioningTesting = false
@waitingForReady = false
@waitingOnLive = false
@waitingOnTesting = false
@errorMessage = null
@streaming = false
@logger.debug("onStartLiveStream")
@onRefresh()
if @childWindow?
logger.debug("show live stream popup being closed automatically")
@childWindow.close()
@childWindow = null
@childWindow = window.open("/popups/video/stream/" + context.SessionStore.id(), 'Video Live Stream', 'scrollbars=yes,toolbar=no,status=no,height=155,width=350')
startLiveStreaming: () ->
@logger.debug("user requests live stream")
@createLiveStream()
# do not use; here until can remove
startGoogleLogin: (e) ->
@logger.debug("Starting google login")
window._oauth_win = window.open("/auth/google_login", "Log In to Google", "height=700,width=500,menubar=no,resizable=no,status=no");
window._oauth_callback = @oauthCallback
oauthCallback: () ->
@creatingBroadcast = true
@logger.debug("oauthCallback... checking auth")
window._oauth_win.close()
@checkAuth()
checkAuth:() ->
rest.getGoogleAuth()
.done((auth) =>
@logger.debug("check Auth is done", auth)
if auth.auth?
@createLiveStream()
else
@creatingBroadcast = false
@onRefresh()
# alert to user
)
.fail(() =>
@creatingBroadcast = false
@onRefresh()
# lert to user
)
loadBroadcast: (sessionId) ->
@broadcast = null
@onRefresh()
@fetchBroadcast(sessionId)
fetchBroadcast: (sessionId) ->
rest.getLiveStream(sessionId)
.done((broadcast) =>
@broadcast = broadcast
@onRefresh()
)
.fail((jqXHR) =>
logger.error("unabe to fetch broadcast", jqXHR.responseText)
@onRefresh()
)
createLiveStream: () ->
@creatingBroadcast = true
rest.createLiveStream(context.SessionStore.id())
.done((broadcast) =>
@creatingBroadcast = false
@onRefresh()
success = context.jamClient.StartLiveStreaming(broadcast.stream_name)
if success
@createdStream = true
@waitingForReady = true
@transitionTimeout = new Date().getTime() + 10000 # die in 10 seconds
@onRefresh()
setTimeout(() =>
@waitForReady()
, 1000)
else
@createStreamError = true
@onRefresh()
)
.fail(() =>
@creatingBroadcast = false
@onRefresh()
)
waitForReady: () ->
rest.getLiveStream(context.SessionStore.id())
.done((broadcast) =>
if broadcast.broadcast_status == 'ready'
@waitingForReady = false
@transitionTesting()
else
if new Date().getTime() > @transitionTimeout
# uh oh. waited fo ra while; stream never became ready
@errorMessage = 'YouTube never indicated stream is ready for testing'
@waitingForReady = false
@onRefresh()
else
setTimeout(() =>
@waitForReady()
, 1000)
)
.fail(() =>
@waitingForReady = false
@errorMessage = 'Could not check status of YouTube broadcast'
context.jamClient.StopLiveStreaming()
@streaming = false
@onRefresh()
)
transitionTesting: () ->
@transitioningTesting = true
@onRefresh()
rest.liveStreamTransition(context.SessionStore.id(), 'testing')
.done((broadcast) =>
@transitioningTesting = false
@waitingOnTesting = true
@transitionTimeout = new Date().getTime() + 20000 # die in 20 seconds
setTimeout(() =>
@waitForTesting()
, 1000)
)
.fail(() =>
@transitioningTesting = false
@errorMessage = 'Could not transition live stream to "testing"'
context.jamClient.StopLiveStreaming()
@streaming = false
@onRefresh()
)
transitionLive: () ->
@transitioningLive = true
@onRefresh()
rest.liveStreamTransition(context.SessionStore.id(), 'live')
.done((broadcast) =>
@transitioningLive = false
@waitingOnLive = true
@transitionTimeout = new Date().getTime() + 20000 # die in 20 seconds
setTimeout(() =>
@waitForLive()
, 1000)
)
.fail(() =>
@transitioningLive = false
@errorMessage = 'Could not transition live stream to "live"'
context.jamClient.StopLiveStreaming()
@streaming = false
@onRefresh()
)
waitForTesting: () ->
rest.getBroadcast(context.SessionStore.id())
.done((broadcast) =>
if broadcast.broadcast_status == 'testing'
@waitingOnTesting = false
@transitionLive()
else
if new Date().getTime() > @transitionTimeout
# uh oh. waited fo ra while; stream never became ready
@errorMessage = 'YouTube never indicated stream converted to testing'
@waitingOnTesting = false
@onRefresh()
else
setTimeout(() =>
@waitForTesting()
, 1000)
)
.fail(() =>
@waitingForTesting = false
@errorMessage = 'Could not check status of YouTube broadcast'
context.jamClient.StopLiveStreaming()
@streaming = false
@onRefresh()
)
waitForLive: () ->
rest.getBroadcast(context.SessionStore.id())
.done((broadcast) =>
if broadcast.broadcast_status == 'live'
@waitingOnLive = false
@streaming = true
console.log("BROADCAST TIME", broadcast)
@onRefresh()
else
if new Date().getTime() > @transitionTimeout
# uh oh. waited fo ra while; stream never became ready
@errorMessage = 'YouTube never indicated stream converted to live'
@waitingOnLive = false
@onRefresh()
else
setTimeout(() =>
@waitForLive()
, 1000)
)
.fail(() =>
@waitingForLive = false
@errorMessage = 'Could not check status of YouTube broadcast'
context.jamClient.StopLiveStreaming()
@streaming = false
@onRefresh()
)
}
)