kopia lustrzana https://github.com/c9/core
116 wiersze
3.4 KiB
JavaScript
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
|
|
});
|
|
}
|
|
});
|