rhodecode-app.js
166 lines
| 6.7 KiB
| application/javascript
|
JavascriptLexer
r787 | ccLog = Logger.get('RhodeCodeApp'); | |||
ccLog.setLevel(Logger.OFF); | ||||
var rhodeCodeApp = Polymer({ | ||||
is: 'rhodecode-app', | ||||
r822 | attached: function () { | |||
r787 | ccLog.debug('rhodeCodeApp created'); | |||
$.Topic('/notifications').subscribe(this.handleNotifications.bind(this)); | ||||
r882 | $.Topic('/favicon/update').subscribe(this.faviconUpdate.bind(this)); | |||
r880 | $.Topic('/connection_controller/subscribe').subscribe( | |||
this.subscribeToChannelTopic.bind(this)); | ||||
// this event can be used to coordinate plugins to do their | ||||
// initialization before channelstream is kicked off | ||||
$.Topic('/__MAIN_APP__').publish({}); | ||||
r787 | ||||
r822 | for (var i = 0; i < alertMessagePayloads.length; i++) { | |||
$.Topic('/notifications').publish(alertMessagePayloads[i]); | ||||
} | ||||
r2917 | this.initPlugins(); | |||
// after rest of application loads and topics get fired, launch connection | ||||
$(document).ready(function () { | ||||
this.kickoffChannelstreamPlugin(); | ||||
}.bind(this)); | ||||
r787 | }, | |||
r2917 | initPlugins: function(){ | |||
for (var i = 0; i < window.APPLICATION_PLUGINS.length; i++) { | ||||
var pluginDef = window.APPLICATION_PLUGINS[i]; | ||||
if (pluginDef.component){ | ||||
var pluginElem = document.createElement(pluginDef.component); | ||||
this.shadowRoot.appendChild(pluginElem); | ||||
if (typeof pluginElem.init !== 'undefined'){ | ||||
pluginElem.init(); | ||||
} | ||||
} | ||||
} | ||||
}, | ||||
r787 | /** proxy to channelstream connection */ | |||
getChannelStreamConnection: function () { | ||||
return this.$['channelstream-connection']; | ||||
}, | ||||
handleNotifications: function (data) { | ||||
r1483 | var elem = document.getElementById('notifications'); | |||
if(elem){ | ||||
elem.handleNotification(data); | ||||
} | ||||
r787 | }, | |||
r882 | faviconUpdate: function (data) { | |||
r2915 | this.shadowRoot.querySelector('rhodecode-favicon').counter = data.count; | |||
r882 | }, | |||
r787 | /** opens connection to ws server */ | |||
kickoffChannelstreamPlugin: function (data) { | ||||
ccLog.debug('kickoffChannelstreamPlugin'); | ||||
var channels = ['broadcast']; | ||||
var addChannels = this.checkViewChannels(); | ||||
for (var i = 0; i < addChannels.length; i++) { | ||||
channels.push(addChannels[i]); | ||||
} | ||||
r798 | if (window.CHANNELSTREAM_SETTINGS && CHANNELSTREAM_SETTINGS.enabled){ | |||
r880 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
r798 | channelstreamConnection.connectUrl = CHANNELSTREAM_URLS.connect; | |||
channelstreamConnection.subscribeUrl = CHANNELSTREAM_URLS.subscribe; | ||||
channelstreamConnection.websocketUrl = CHANNELSTREAM_URLS.ws + '/ws'; | ||||
channelstreamConnection.longPollUrl = CHANNELSTREAM_URLS.longpoll + '/listen'; | ||||
// some channels might already be registered by topic | ||||
for (var i = 0; i < channels.length; i++) { | ||||
channelstreamConnection.push('channels', channels[i]); | ||||
} | ||||
// append any additional channels registered in other plugins | ||||
$.Topic('/connection_controller/subscribe').processPrepared(); | ||||
channelstreamConnection.connect(); | ||||
r787 | } | |||
}, | ||||
checkViewChannels: function () { | ||||
r1970 | // subscribe to different channels data is sent. | |||
var channels = []; | ||||
r787 | // subscribe to PR repo channel for PR's' | |||
if (templateContext.pull_request_data.pull_request_id) { | ||||
var channelName = '/repo$' + templateContext.repo_name + '$/pr/' + | ||||
String(templateContext.pull_request_data.pull_request_id); | ||||
channels.push(channelName); | ||||
} | ||||
r1970 | ||||
if (templateContext.commit_data.commit_id) { | ||||
var channelName = '/repo$' + templateContext.repo_name + '$/commit/' + | ||||
String(templateContext.commit_data.commit_id); | ||||
channels.push(channelName); | ||||
} | ||||
r787 | return channels; | |||
}, | ||||
/** subscribes users from channels in channelstream */ | ||||
subscribeToChannelTopic: function (channels) { | ||||
r983 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
r787 | var toSubscribe = channelstreamConnection.calculateSubscribe(channels); | |||
ccLog.debug('subscribeToChannelTopic', toSubscribe); | ||||
if (toSubscribe.length > 0) { | ||||
// if we are connected then subscribe | ||||
if (channelstreamConnection.connected) { | ||||
channelstreamConnection.subscribe(toSubscribe); | ||||
} | ||||
// not connected? just push channels onto the stack | ||||
else { | ||||
for (var i = 0; i < toSubscribe.length; i++) { | ||||
channelstreamConnection.push('channels', toSubscribe[i]); | ||||
} | ||||
} | ||||
} | ||||
}, | ||||
/** publish received messages into correct topic */ | ||||
receivedMessage: function (event) { | ||||
for (var i = 0; i < event.detail.length; i++) { | ||||
var message = event.detail[i]; | ||||
if (message.message.topic) { | ||||
ccLog.debug('publishing', message.message.topic); | ||||
$.Topic(message.message.topic).publish(message); | ||||
} | ||||
else if (message.type === 'presence'){ | ||||
$.Topic('/connection_controller/presence').publish(message); | ||||
} | ||||
else { | ||||
ccLog.warn('unhandled message', message); | ||||
} | ||||
} | ||||
}, | ||||
handleConnected: function (event) { | ||||
r983 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
r787 | channelstreamConnection.set('channelsState', | |||
event.detail.channels_info); | ||||
channelstreamConnection.set('userState', event.detail.state); | ||||
channelstreamConnection.set('channels', event.detail.channels); | ||||
this.propagageChannelsState(); | ||||
}, | ||||
handleSubscribed: function (event) { | ||||
r983 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
r787 | var channelInfo = event.detail.channels_info; | |||
var channelKeys = Object.keys(event.detail.channels_info); | ||||
for (var i = 0; i < channelKeys.length; i++) { | ||||
var key = channelKeys[i]; | ||||
channelstreamConnection.set(['channelsState', key], channelInfo[key]); | ||||
} | ||||
channelstreamConnection.set('channels', event.detail.channels); | ||||
this.propagageChannelsState(); | ||||
}, | ||||
/** propagates channel states on topics */ | ||||
propagageChannelsState: function (event) { | ||||
r983 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
r787 | var channel_data = channelstreamConnection.channelsState; | |||
var channels = channelstreamConnection.channels; | ||||
for (var i = 0; i < channels.length; i++) { | ||||
var key = channels[i]; | ||||
$.Topic('/connection_controller/channel_update').publish( | ||||
{channel: key, state: channel_data[key]} | ||||
); | ||||
} | ||||
} | ||||
}); | ||||