rhodecode-app.html
195 lines
| 8.7 KiB
| text/html
|
HtmlLexer
r787 | <link rel="import" href="../../../../../../bower_components/polymer/polymer.html"> | |||
<link rel="import" href="../channelstream-connection/channelstream-connection.html"> | ||||
r882 | <link rel="import" href="../rhodecode-toast/rhodecode-toast.html"> | |||
<link rel="import" href="../rhodecode-favicon/rhodecode-favicon.html"> | ||||
r787 | ||||
<dom-module id="rhodecode-app"> | ||||
<template> | ||||
<channelstream-connection | ||||
id="channelstream-connection" | ||||
on-channelstream-listen-message="receivedMessage" | ||||
on-channelstream-connected="handleConnected" | ||||
on-channelstream-subscribed="handleSubscribed"> | ||||
</channelstream-connection> | ||||
r983 | <rhodecode-favicon></rhodecode-favicon> | |||
r787 | </template> | |||
r3149 | <script> | |||
r3171 | var ccLog = Logger.get('RhodeCodeApp'); | |||
r3149 | ccLog.setLevel(Logger.OFF); | |||
r3172 | class RhodecodeApp extends Polymer.Element { | |||
static get is() { | ||||
return 'rhodecode-app'; | ||||
} | ||||
connectedCallback() { | ||||
super.connectedCallback(); | ||||
r3149 | ccLog.debug('rhodeCodeApp created'); | |||
$.Topic('/notifications').subscribe(this.handleNotifications.bind(this)); | ||||
$.Topic('/favicon/update').subscribe(this.faviconUpdate.bind(this)); | ||||
$.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({}); | ||||
for (var i = 0; i < alertMessagePayloads.length; i++) { | ||||
$.Topic('/notifications').publish(alertMessagePayloads[i]); | ||||
} | ||||
this.initPlugins(); | ||||
// after rest of application loads and topics get fired, launch connection | ||||
$(document).ready(function () { | ||||
this.kickoffChannelstreamPlugin(); | ||||
}.bind(this)); | ||||
r3172 | } | |||
r3149 | ||||
r3172 | initPlugins() { | |||
r3149 | for (var i = 0; i < window.APPLICATION_PLUGINS.length; i++) { | |||
var pluginDef = window.APPLICATION_PLUGINS[i]; | ||||
r3172 | if (pluginDef.component) { | |||
r3149 | var pluginElem = document.createElement(pluginDef.component); | |||
this.shadowRoot.appendChild(pluginElem); | ||||
r3172 | if (typeof pluginElem.init !== 'undefined') { | |||
r3149 | pluginElem.init(); | |||
} | ||||
} | ||||
} | ||||
r3172 | } | |||
r3149 | /** proxy to channelstream connection */ | |||
r3172 | getChannelStreamConnection() { | |||
r3149 | return this.$['channelstream-connection']; | |||
r3172 | } | |||
r3149 | ||||
r3172 | handleNotifications(data) { | |||
r3149 | var elem = document.getElementById('notifications'); | |||
r3172 | if (elem) { | |||
r3149 | elem.handleNotification(data); | |||
} | ||||
r3172 | } | |||
r3149 | ||||
r3172 | faviconUpdate(data) { | |||
r3149 | this.shadowRoot.querySelector('rhodecode-favicon').counter = data.count; | |||
r3172 | } | |||
r3149 | ||||
/** opens connection to ws server */ | ||||
r3172 | kickoffChannelstreamPlugin(data) { | |||
r3149 | ccLog.debug('kickoffChannelstreamPlugin'); | |||
var channels = ['broadcast']; | ||||
var addChannels = this.checkViewChannels(); | ||||
for (var i = 0; i < addChannels.length; i++) { | ||||
channels.push(addChannels[i]); | ||||
} | ||||
r3172 | if (window.CHANNELSTREAM_SETTINGS && CHANNELSTREAM_SETTINGS.enabled) { | |||
r3149 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
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(); | ||||
} | ||||
r3172 | } | |||
r3149 | ||||
r3172 | checkViewChannels() { | |||
r3149 | // subscribe to different channels data is sent. | |||
var channels = []; | ||||
// 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); | ||||
} | ||||
if (templateContext.commit_data.commit_id) { | ||||
var channelName = '/repo$' + templateContext.repo_name + '$/commit/' + | ||||
String(templateContext.commit_data.commit_id); | ||||
channels.push(channelName); | ||||
} | ||||
return channels; | ||||
r3172 | } | |||
r3149 | ||||
/** subscribes users from channels in channelstream */ | ||||
r3172 | subscribeToChannelTopic(channels) { | |||
r3149 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
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]); | ||||
} | ||||
} | ||||
} | ||||
r3172 | } | |||
r3149 | ||||
/** publish received messages into correct topic */ | ||||
r3172 | receivedMessage(event) { | |||
r3149 | 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); | ||||
} | ||||
r3172 | else if (message.type === 'presence') { | |||
r3149 | $.Topic('/connection_controller/presence').publish(message); | |||
} | ||||
else { | ||||
ccLog.warn('unhandled message', message); | ||||
} | ||||
} | ||||
r3172 | } | |||
r3149 | ||||
r3172 | handleConnected(event) { | |||
r3149 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
channelstreamConnection.set('channelsState', | ||||
event.detail.channels_info); | ||||
channelstreamConnection.set('userState', event.detail.state); | ||||
channelstreamConnection.set('channels', event.detail.channels); | ||||
this.propagageChannelsState(); | ||||
r3172 | } | |||
handleSubscribed(event) { | ||||
r3149 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
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(); | ||||
r3172 | } | |||
r3149 | /** propagates channel states on topics */ | |||
r3172 | propagageChannelsState(event) { | |||
r3149 | var channelstreamConnection = this.getChannelStreamConnection(); | |||
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]} | ||||
); | ||||
} | ||||
} | ||||
r3172 | } | |||
customElements.define(RhodecodeApp.is, RhodecodeApp); | ||||
r3149 | </script> | |||
r787 | </dom-module> | |||