c9-core/plugins/c9.ide.pubsub/pubsub-client.js

116 wiersze
3.4 KiB
JavaScript

/**
* PubSub module for the Cloud9 that's used to publish events to the client IDE
*
* @copyright 2013, Ajax.org B.V.
*/
define(function(require, exports, module) {
main.consumes = ["c9", "Plugin", "ext"];
main.provides = ["pubsub"];
return main;
function main(options, imports, register) {
var Plugin = imports.Plugin;
var c9 = imports.c9;
var ext = imports.ext;
/***** Initialization *****/
var plugin = new Plugin("Ajax.org", main.consumes);
var emit = plugin.getEmitter();
var stream, api;
var loaded = false;
var oldVfs = false;
function load(oldVfs) {
if (loaded && !oldVfs) return;
loaded = true;
ext.loadRemotePlugin("pubsub", {
file: oldVfs ? undefined : "c9.ide.pubsub/pubsub-service.js",
code: oldVfs ? require("text!./pubsub-service.js") : undefined
}, function(err, remote) {
if (!remote && !oldVfs)
return load(true);
if (!remote)
return console.error(err);
api = remote;
api.subscribe(function(err, meta) {
console.log("PubSub connected");
emit.sticky("connected");
if (err) {
loaded = false;
console.error(err);
return;
}
stream = meta.stream;
stream.on("data", function(chunk) {
var message;
try { message = JSON.parse(chunk); }
catch (e) {
return setTimeout(function() {
loaded = false;
load();
}, 5000);
}
console.log("PubSub message:", message);
emit("message", message);
});
stream.on("close", function() {
loaded = false;
});
});
});
}
function unload() {
console.warn("PubSub disconnected");
api = stream = null;
loaded = false;
}
/***** Methods *****/
plugin.on("load", function() {
c9.on("connect", load, plugin);
c9.on("disconnect", unload, plugin);
});
/***** Register and define API *****/
/**
* Bridge To Communicate from CLI to IDE
**/
plugin.freezePublicAPI({
_events: [
/**
* Fires when a message is published to this user on this workspace.
* @event error
* @param {Object} msg
* @param {String} msg.channel
* @param {String} msg.type
* @param {String} msg.action
* @param {Object} msg.body
*/
"message",
/**
* Fires when the client is connected
*/
"connected"
],
get connected() { return loaded && !!stream; },
});
register(null, {
pubsub: plugin
});
}
});