228 lines
6.7 KiB
JavaScript
228 lines
6.7 KiB
JavaScript
import ENV from 'travis/config/environment';
|
|
import Ember from 'ember';
|
|
|
|
var TravisPusher = function(config, ajaxService) {
|
|
this.init(config, ajaxService);
|
|
TravisPusher.ajaxService = ajaxService;
|
|
return this;
|
|
};
|
|
|
|
TravisPusher.prototype.active_channels = [];
|
|
|
|
TravisPusher.prototype.init = function(config, ajaxService) {
|
|
this.ajaxService = ajaxService;
|
|
Pusher.warn = this.warn.bind(this);
|
|
if (config.host) {
|
|
Pusher.host = config.host;
|
|
}
|
|
return this.pusher = new Pusher(config.key, {
|
|
encrypted: config.encrypted,
|
|
disableStats: true
|
|
});
|
|
};
|
|
|
|
TravisPusher.prototype.subscribeAll = function(channels) {
|
|
var channel, i, len, results;
|
|
results = [];
|
|
for (i = 0, len = channels.length; i < len; i++) {
|
|
channel = channels[i];
|
|
results.push(this.subscribe(channel));
|
|
}
|
|
return results;
|
|
};
|
|
|
|
TravisPusher.prototype.unsubscribeAll = function(channels) {
|
|
var channel, i, len, results;
|
|
results = [];
|
|
for (i = 0, len = channels.length; i < len; i++) {
|
|
channel = channels[i];
|
|
results.push(this.unsubscribe(channel));
|
|
}
|
|
return results;
|
|
};
|
|
|
|
TravisPusher.prototype.subscribe = function(channel) {
|
|
var ref;
|
|
if (!channel) {
|
|
return;
|
|
}
|
|
channel = this.prefix(channel);
|
|
if (!((ref = this.pusher) != null ? ref.channel(channel) : void 0)) {
|
|
return this.pusher.subscribe(channel).bind_all((function(_this) {
|
|
return function(event, data) {
|
|
return _this.receive(event, data);
|
|
};
|
|
})(this));
|
|
}
|
|
};
|
|
|
|
TravisPusher.prototype.unsubscribe = function(channel) {
|
|
var ref;
|
|
if (!channel) {
|
|
return;
|
|
}
|
|
channel = this.prefix(channel);
|
|
console.log("unsubscribing from " + channel);
|
|
if ((ref = this.pusher) != null ? ref.channel(channel) : void 0) {
|
|
return this.pusher.unsubscribe(channel);
|
|
}
|
|
};
|
|
|
|
TravisPusher.prototype.prefix = function(channel) {
|
|
var prefix;
|
|
prefix = ENV.pusher.channelPrefix || '';
|
|
if (channel.indexOf(prefix) !== 0) {
|
|
return "" + prefix + channel;
|
|
} else {
|
|
return channel;
|
|
}
|
|
};
|
|
|
|
TravisPusher.prototype.receive = function(event, data) {
|
|
var job;
|
|
if (event.substr(0, 6) === 'pusher') {
|
|
return;
|
|
}
|
|
if (data.id) {
|
|
data = this.normalize(event, data);
|
|
}
|
|
|
|
// TODO remove job:requeued, once sf-restart-event has been merged
|
|
// TODO this also needs to clear logs on build:created if matrix jobs are already loaded
|
|
if (event === 'job:created' || event === 'job:requeued') {
|
|
if (job = this.store.peekRecord('job', data.job.id)) {
|
|
job.clearLog();
|
|
}
|
|
}
|
|
return Ember.run.next((function(_this) {
|
|
return function() {
|
|
return _this.store.receivePusherEvent(event, data);
|
|
};
|
|
})(this));
|
|
};
|
|
|
|
TravisPusher.prototype.normalize = function(event, data) {
|
|
switch (event) {
|
|
case 'build:started':
|
|
case 'build:finished':
|
|
return data;
|
|
case 'job:created':
|
|
case 'job:queued':
|
|
case 'job:received':
|
|
case 'job:started':
|
|
case 'job:requeued':
|
|
case 'job:finished':
|
|
case 'job:log':
|
|
case 'job:canceled':
|
|
if (data.queue) {
|
|
data.queue = data.queue.replace('builds.', '');
|
|
}
|
|
return {
|
|
job: data
|
|
};
|
|
case 'worker:added':
|
|
case 'worker:updated':
|
|
case 'worker:removed':
|
|
return {
|
|
worker: data
|
|
};
|
|
case 'annotation:created':
|
|
case 'annotation:updated':
|
|
return {
|
|
annotation: data
|
|
};
|
|
}
|
|
};
|
|
|
|
TravisPusher.prototype.warn = function(type, object) {
|
|
if (!this.ignoreWarning(type, object.error)) {
|
|
return console.warn(type, object.error);
|
|
}
|
|
};
|
|
|
|
TravisPusher.prototype.ignoreWarning = function(type, error) {
|
|
var code, message, ref, ref1;
|
|
code = (error != null ? (ref = error.data) != null ? ref.code : void 0 : void 0) || 0;
|
|
message = (error != null ? (ref1 = error.data) != null ? ref1.message : void 0 : void 0) || '';
|
|
return this.ignoreCode(code) || this.ignoreMessage(message);
|
|
};
|
|
|
|
TravisPusher.prototype.ignoreCode = function(code) {
|
|
return code === 1006;
|
|
};
|
|
|
|
TravisPusher.prototype.ignoreMessage = function(message) {
|
|
return message.indexOf('Existing subscription') === 0 || message.indexOf('No current subscription') === 0;
|
|
};
|
|
|
|
Pusher.SockJSTransport.isSupported = function() {
|
|
if (ENV.pusher.host !== 'ws.pusherapp.com') {
|
|
return false;
|
|
}
|
|
};
|
|
|
|
if (ENV.pro) {
|
|
Pusher.channel_auth_transport = 'bulk_ajax';
|
|
Pusher.authorizers.bulk_ajax = function(socketId, _callback) {
|
|
var channels, name, names;
|
|
channels = Travis.pusher.pusher.channels;
|
|
channels.callbacks = channels.callbacks || [];
|
|
name = this.channel.name;
|
|
names = Object.keys(channels.channels);
|
|
channels.callbacks.push(function(auths) {
|
|
return _callback(false, {
|
|
auth: auths[name]
|
|
});
|
|
});
|
|
if (!channels.fetching) {
|
|
channels.fetching = true;
|
|
return TravisPusher.ajaxService.post(Pusher.channel_auth_endpoint, {
|
|
socket_id: socketId,
|
|
channels: names
|
|
}, function(data) {
|
|
var callback, i, len, ref, results;
|
|
channels.fetching = false;
|
|
ref = channels.callbacks;
|
|
results = [];
|
|
for (i = 0, len = ref.length; i < len; i++) {
|
|
callback = ref[i];
|
|
results.push(callback(data.channels));
|
|
}
|
|
return results;
|
|
});
|
|
}
|
|
};
|
|
Pusher.getDefaultStrategy = function(config) {
|
|
return [
|
|
[
|
|
":def", "ws_options", {
|
|
hostUnencrypted: config.wsHost + ":" + config.wsPort + (ENV.pusher.path && ("/" + config.pusher.path) || ''),
|
|
hostEncrypted: config.wsHost + ":" + config.wssPort + (ENV.pusher.path && ("/" + config.pusher.path) || ''),
|
|
path: config.path
|
|
}
|
|
], [
|
|
":def", "sockjs_options", {
|
|
hostUnencrypted: config.httpHost + ":" + config.httpPort,
|
|
hostEncrypted: config.httpHost + ":" + config.httpsPort
|
|
}
|
|
], [
|
|
":def", "timeouts", {
|
|
loop: true,
|
|
timeout: 15000,
|
|
timeoutLimit: 60000
|
|
}
|
|
], [
|
|
":def", "ws_manager", [
|
|
":transport_manager", {
|
|
lives: 2,
|
|
minPingDelay: 10000,
|
|
maxPingDelay: config.activity_timeout
|
|
}
|
|
]
|
|
], [":def_transport", "ws", "ws", 3, ":ws_options", ":ws_manager"], [":def_transport", "flash", "flash", 2, ":ws_options", ":ws_manager"], [":def_transport", "sockjs", "sockjs", 1, ":sockjs_options"], [":def", "ws_loop", [":sequential", ":timeouts", ":ws"]], [":def", "flash_loop", [":sequential", ":timeouts", ":flash"]], [":def", "sockjs_loop", [":sequential", ":timeouts", ":sockjs"]], [":def", "strategy", [":cached", 1800000, [":first_connected", [":if", [":is_supported", ":ws"], [":best_connected_ever", ":ws_loop", [":delayed", 2000, [":sockjs_loop"]]], [":if", [":is_supported", ":flash"], [":best_connected_ever", ":flash_loop", [":delayed", 2000, [":sockjs_loop"]]], [":sockjs_loop"]]]]]]
|
|
];
|
|
};
|
|
}
|
|
|
|
export default TravisPusher;
|