pubsub/app/pubsub.js (65 lines of code) (raw):

'use strict'; var pubsub = pubsub || angular.module('pubsub', []); /** * PubsubController. * * @NgInject */ pubsub.PubsubController = function($http, $log, $timeout) { this.promise = null; this.logger = $log; this.http = $http; this.isAutoUpdating = true; this.failCount = 0; this.hasAttemptedToCreateTopicAndSubscription = false; this.messages = []; this.fetchMessages(); }; pubsub.PubsubController.MAX_FAILURE_COUNT = 3; pubsub.PubsubController.TIMEOUT_MULTIPLIER = 1000; /** * Toggles the auto update flag. */ pubsub.PubsubController.prototype.toggleAutoUpdate = function() { this.isAutoUpdating = !this.isAutoUpdating; if (this.isAutoUpdating) { this.logger.info('Start fetching.'); this.fetchMessages(); } }; /** * Sends a message * * @param {string} message */ pubsub.PubsubController.prototype.sendMessage = function(message) { var self = this; self.http({ method: 'POST', url: '/send_message', data: 'message=' + encodeURIComponent(message), headers: {'Content-Type': 'application/x-www-form-urlencoded'} }).success(function(data, status) { self.message = null; }).error(function(data, status) { self.logger.error('Failed to send the message. Status: ' + status + '.'); if (!self.hasAttemptedToCreateTopicAndSubscription) { // Try to create the topic and subscription once. self.hasAttemptedToCreateTopicAndSubscription = true; self.logger.info('Trying to create the topic and subscription...'); self.http({ method: 'POST', url: '/create_topic_and_subscription' }).success(function(data, status) { // Try one more time to send the message. self.sendMessage(message); }).error(function(data, status) { self.logger.error('Failed to create the topic and subscription. ' + 'Status: ' + status + '.'); }); } }); }; /** * Continuously fetches messages from the server. */ pubsub.PubsubController.prototype.fetchMessages = function() { if (!this.isAutoUpdating) { return; } var self = this; self.http.get('/fetch_messages') .success(function(data, status) { self.messages.push.apply(self.messages, data); self.failCount = 0; self.fetchMessages(); }) .error(function(data, status) { self.logger.error('Failed to receive the messages. Status: ' + status + '.'); self.failCount += 1; self.fetchMessages(); }); };