Merge remote-tracking branch 'origin/master' into preview-perf

pull/9/merge
Fabian Jakobs 2015-02-13 10:06:49 +00:00
commit 92e3ba7187
20 zmienionych plików z 333 dodań i 204 usunięć

Wyświetl plik

@ -21,11 +21,10 @@ We have several documentation resources for you:
<tr><th>SDK documentation</th><td>http://cloud9-sdk.readme.io/v0.1/docs</td></tr>
<tr><th>API documentation</th><td>http://docs.c9.io/api</td></tr>
<tr><th>User documentation</th><td>http://docs.c9.io</td></tr>
<tr><th>User docs repo</th><td>https://github.com/c9/docs.c9.io</td></tr>
</table>
Please joing the mailinglist to get support or give support to the growing community of plugin developers:
https://groups.google.com/forum/#!forum/cloud9-plugin-development
https://groups.google.com/forum/#!forum/cloud9-sdk
#### Installation ####

Wyświetl plik

@ -1,8 +1,9 @@
"no use strict";
;(function(window) {
if (typeof window.window != "undefined" && window.document) {
if (typeof window.window != "undefined" && window.document)
return;
if (window.require && window.define)
return;
}
window.console = function() {
var msgs = Array.prototype.slice.call(arguments, 0);
@ -38,7 +39,7 @@ window.normalizeModule = function(parentId, moduleName) {
var base = parentId.split("/").slice(0, -1).join("/");
moduleName = (base ? base + "/" : "") + moduleName;
while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
while (moduleName.indexOf(".") !== -1 && previous != moduleName) {
var previous = moduleName;
moduleName = moduleName.replace(/^\.\//, "").replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
}
@ -73,6 +74,7 @@ window.require = function(parentId, id) {
var path = chunks.join("/") + ".js";
window.require.id = id;
window.require.modules[id] = {}; // prevent infinite loop on broken modules
importScripts(path);
return window.require(parentId, id);
};
@ -101,9 +103,9 @@ window.define = function(id, deps, factory) {
}
if (!deps.length)
// If there is no dependencies, we inject 'require', 'exports' and
// 'module' as dependencies, to provide CommonJS compatibility.
deps = ['require', 'exports', 'module'];
// If there is no dependencies, we inject "require", "exports" and
// "module" as dependencies, to provide CommonJS compatibility.
deps = ["require", "exports", "module"];
var req = function(childId) {
return window.require(id, childId);
@ -114,16 +116,16 @@ window.define = function(id, deps, factory) {
factory: function() {
var module = this;
var returnExports = factory.apply(this, deps.map(function(dep) {
switch(dep) {
// Because 'require', 'exports' and 'module' aren't actual
// dependencies, we must handle them seperately.
case 'require': return req;
case 'exports': return module.exports;
case 'module': return module;
// But for all other dependencies, we can just go ahead and
// require them.
default: return req(dep);
}
switch (dep) {
// Because "require", "exports" and "module" aren't actual
// dependencies, we must handle them seperately.
case "require": return req;
case "exports": return module.exports;
case "module": return module;
// But for all other dependencies, we can just go ahead and
// require them.
default: return req(dep);
}
}));
if (returnExports)
module.exports = returnExports;
@ -186,7 +188,7 @@ window.onmessage = function(e) {
sender = window.sender = initSender();
var clazz = require(msg.module)[msg.classname];
main = window.main = new clazz(sender);
}
}
else if (msg.event && sender) {
sender._signal(msg.event, msg.data);
}

Wyświetl plik

@ -143,9 +143,9 @@ function DefaultHandlers(mouseHandler) {
editor.selection.toggleSelect(node);
}
} else if (ev.getAccelKey()) {
if (isMultiSelect && inSelection)
if (inSelection && isMultiSelect)
this.delayedSelect = "toggle";
else
else if (!inSelection || isMultiSelect)
editor.selection.toggleSelect(node);
} else if (ev.getShiftKey()) {
editor.selection.expandSelection(node);

Wyświetl plik

@ -1,91 +1,175 @@
(function() {
var ACE_NAMESPACE = "";
var MODULE_LOAD_URL = "/load/module";
var global = (function() { return this; })();
if (!global && typeof window != "undefined") global = window; // can happen in strict mode
var commentRegExp = /(\/\*([\s\S]*?)\*\/|([^:]|^)\/\/(.*)$)/mg;
var cjsRequireRegExp = /[^.]\s*require\s*\(\s*["']([^'"\s]+)["']\s*\)/g;
if (!ACE_NAMESPACE && typeof requirejs !== "undefined")
return;
var _define = function(module, deps, payload) {
if (typeof module !== 'string') {
if (_define.original)
_define.original.apply(window, arguments);
else {
console.error('dropping module because define wasn\'t a string.');
console.trace();
}
return;
function getInlineDeps(fn) {
var deps = [];
if (fn.length) {
fn.toString().replace(commentRegExp, "")
.replace(cjsRequireRegExp, function (match, dep) {
deps.push(dep);
});
deps = ["require", "exports", "module"].concat(deps);
}
return deps;
}
if (arguments.length == 2)
payload = deps;
_define.amd = true;
if (!_define.modules) {
_define.modules = {};
_define.payloads = {};
var define = function(name, deps, callback) {
// Allow for anonymous modules
if (typeof name !== "string") {
callback = deps;
deps = name;
name = null;
}
if (_define.modules[module])
// This module may not have dependencies
if (deps && !Array.isArray(deps)) {
callback = deps;
deps = null;
}
if (!name)
return defQueue.push([deps, callback]);
if (define.loaded[name])
return;
_define.payloads[module] = payload;
_define.modules[module] = null;
if (!deps && typeof callback == "function")
deps = getInlineDeps(callback);
define.loaded[name] = {
id: name,
deps: normalizeNames(name, deps),
factory: callback,
exports: {},
packaged: true
};
};
var defQueue = [];
var addToLoadQueue = function(missing, deps, callback) {
define.queue.push(function() { _require('', deps, callback); });
for (var i = 0; i < missing.length; ++i)
require.load(missing[i]);
};
/**
* Get at functionality define()ed using the function above
*/
var _require = function(parentId, module, callback) {
if (Object.prototype.toString.call(module) === "[object Array]") {
var params = [];
for (var i = 0, l = module.length; i < l; ++i) {
var moduleName = normalizeModule(parentId, module[i]);
var dep = lookup(parentId, moduleName);
if (!dep && _require.load) {
return _require.load(moduleName, function() {
if (lookup(parentId, moduleName))
_require(parentId, module, callback);
});
var processLoadQueue = function(err, id) {
if (defQueue.length) {
if (err)
throw err;
if (defQueue.length > 1)
throw new Error("more than one module in defqueue");
define(id, defQueue[0][0], defQueue[0][1]);
defQueue.length = 0;
}
var queue = define.queue;
define.queue = [];
queue.forEach(function(f) { f(); });
};
define.amd = true;
define.queue = [];
define.loaded = {};
define.modules = { require: 1, exports: 1, module: 1 };
define.fetchedUrls = {};
var activateModule = function(name) {
var module = define.loaded[name];
var exports = module.exports;
if (typeof module.factory !== "function") {
exports = module.factory;
} else {
var req = function(path, callback) {
return _require(name, path, callback);
};
req.toUrl = require.toUrl;
var modules = define.modules;
var missing = checkMissing(module.deps);
if (missing.length)
return missing;
modules.require = req;
modules.exports = exports;
modules.module = module;
define.modules[name] = exports;
var args = module.deps.slice(0, module.factory.length);
var returnValue = args.length
? module.factory.apply(module, args.map(lookup))
: module.factory(req, exports, module);
exports = returnValue || module.exports;
}
delete define.loaded[name];
define.modules[name] = exports;
};
var checkMissing = function(deps, seen, missing) {
missing = missing || {};
seen = seen || {};
for (var i = 0; i < deps.length; ++i) {
var depName = deps[i];
if (!define.modules[depName]) {
var dep = define.loaded[depName];
if (!dep)
missing[depName] = 1;
else if (!missing[depName] && !seen[depName]) {
seen[depName] = 1;
checkMissing(dep.deps, seen, missing);
}
params.push(dep);
}
if (callback) {
callback.apply(null, params);
}
}
else if (typeof module === 'string') {
var payload = lookup(parentId, module);
if (!payload && _require.original)
return _require.original.apply(this, arguments);
if (callback) {
callback();
}
return payload;
}
else {
if (_require.original)
return _require.original.apply(this, arguments);
}
return Object.keys(missing);
};
var normalizeModule = function(parentId, moduleName) {
var lookup = function(moduleName) {
var mod = define.modules[moduleName];
if (mod === undefined && define.loaded[moduleName]) {
activateModule(moduleName);
mod = define.modules[moduleName];
}
return mod;
};
var _require = function(parentId, moduleName, callback) {
if (typeof moduleName === "string") {
var depName = normalizeName(parentId, moduleName);
var module = lookup(depName);
if (module !== undefined) {
callback && callback(module);
return module;
}
} else if (Array.isArray(moduleName)) {
var deps = normalizeNames(parentId, moduleName);
var missing = checkMissing(deps);
if (!missing.length) {
var args = moduleName.map(lookup);
return callback && callback.apply(null, args);
} else {
return addToLoadQueue(missing, deps, callback);
}
}
if (_require.original)
return _require.original.apply(this, arguments);
};
var normalizeName = function(parentId, moduleName) {
// normalize plugin requires
if (moduleName.indexOf("!") !== -1) {
var chunks = moduleName.split("!");
return normalizeModule(parentId, chunks[0]) + "!" + normalizeModule(parentId, chunks[1]);
return normalizeName(parentId, chunks[0]) + "!" + normalizeName(parentId, chunks[1]);
}
// normalize relative requires
if (moduleName.charAt(0) == ".") {
var base = parentId.split("/").slice(0, -1).join("/");
moduleName = (base || parentId) + "/" + moduleName;
while(moduleName.indexOf(".") !== -1 && previous != moduleName) {
while (moduleName.indexOf(".") !== -1 && previous != moduleName) {
var previous = moduleName;
moduleName = moduleName.replace(/\/\.\//, "/").replace(/[^\/]+\/\.\.\//, "");
}
@ -94,117 +178,80 @@ var normalizeModule = function(parentId, moduleName) {
return moduleName;
};
/**
* Internal function to lookup moduleNames and resolve them by calling the
* definition function if needed.
*/
var lookup = function(parentId, moduleName) {
moduleName = normalizeModule(parentId, moduleName);
var module = _define.modules[moduleName];
if (!module) {
module = _define.payloads[moduleName];
var exports = {};
if (typeof module === 'function') {
var mod = {
id: moduleName,
uri: '',
exports: exports,
packaged: true
};
var req = function(module, callback) {
return _require(moduleName, module, callback);
};
req.toUrl = require.toUrl;
_define.modules[moduleName] = exports;
var returnValue = module(req, exports, mod);
exports = returnValue || mod.exports;
_define.modules[moduleName] = exports;
delete _define.payloads[moduleName];
} else {
exports = module;
}
module = _define.modules[moduleName] = exports;
}
return module;
var normalizeNames = function(parentId, moduleNames) {
return moduleNames.map(function(name) {
return normalizeName(parentId, name);
});
};
function exportAce(ns) {
var root = global;
if (ns) {
if (!global[ns])
global[ns] = {};
root = global[ns];
}
if (!root.define || !root.define.packaged) {
_define.original = root.define;
root.define = _define;
root.define.packaged = true;
}
if (!root.require || !root.require.packaged) {
// _require.original = root.require || _require.original;
root.require = require;
root.require.packaged = true;
}
root.miniRequire = require;
}
var require = function(module, callback) {
return _require("", module, callback);
};
require.MODULE_LOAD_URL = MODULE_LOAD_URL;
require.toUrl = function(url) {
var root = "/static";
var urlMap = require.urlMap || {};
var parts = url.split("/");
var top = parts[0];
parts.shift();
return [root, urlMap[top] || top].concat(parts).join("/");
require.undef = function(module, callback) {
module = normalizeName("", module);
var path = require.toUrl(module);
delete define.loaded[module];
delete define.modules[module];
delete define.fetchedUrls[path];
};
var loadScript = function(path, callback) {
var head = document.head || document.documentElement;
var s = document.createElement('script');
require.MODULE_LOAD_URL = MODULE_LOAD_URL;
require.toUrl = function(module, ext) {
var path = module;
if (!/https?:\/\//.test(path))
path = require.MODULE_LOAD_URL + "/" + path + (ext || "");
return path;
};
var loadScript = function(path, id, callback) {
var head = document.head || document.documentElement;
var s = document.createElement("script");
s.src = path;
s.charset = 'utf-8';
s.async = true;
head.appendChild(s);
s.onload = s.onreadystatechange = function(_, isAbort) {
if (isAbort || !s.readyState || s.readyState == "loaded" || s.readyState == "complete") {
s = s.onload = s.onreadystatechange = null;
if (!isAbort)
callback();
callback(null, id);
}
};
};
_require.load = function(module, callback) {
require.load = function(module) {
var i = module.indexOf("!") + 1;
if (i) {
var plugin = module.substring(0, i);
module = module.substr(i);
if (require[plugin]) {
require[plugin](module, callback);
require[plugin](module, processLoadQueue);
} else {
console.error("require plugin " + plugin + "missing");
}
} else {
loadScript(require.MODULE_LOAD_URL + "/" + module + ".js", callback);
var url = require.toUrl(module, ".js");
if (define.fetchedUrls[url] & 1)
return false;
define.fetchedUrls[url] |= 1;
loadScript(url, module, processLoadQueue);
}
};
/*** plugins ***/
require["text!"] = function(module, callback) {
var url = require.toUrl(module);
if (define.fetchedUrls[url] & 2)
return false;
define.fetchedUrls[url] |= 2;
var cb = function(e, val) {
if (e) console.error("Couldn't load module " + module, e);
_define.modules["text!" + module] = val;
define("text!" + module, [], val);
callback();
};
var url = require.MODULE_LOAD_URL + "/" + module;
var xhr = new window.XMLHttpRequest();
xhr.open("GET", url + "?access_token=fake_token", true);
xhr.setRequestHeader("Content-Type", "application/x-www-form-urlencoded; charset=UTF-8");
@ -213,6 +260,18 @@ require["text!"] = function(module, callback) {
xhr.send("");
};
exportAce(ACE_NAMESPACE);
/*** add global define ***/
if (!global.define || !global.define.packaged) {
define.original = global.define;
global.define = define;
global.define.packaged = true;
}
if (!global.require || !global.require.packaged) {
global.require = require;
global.require.packaged = true;
}
global.miniRequire = require;
})();

Wyświetl plik

@ -58,12 +58,12 @@
"c9.ide.language.javascript.tern": "#3d678a103a",
"c9.ide.language.javascript.infer": "#1ae097af44",
"c9.ide.language.jsonalyzer": "#45a20496be",
"c9.ide.collab": "#fabc22dda7",
"c9.ide.collab": "#9b7f85fc89",
"c9.ide.local": "#d5c324ee5b",
"c9.ide.find": "#be3bca94b7",
"c9.ide.find.infiles": "#462928475c",
"c9.ide.find.replace": "#fe41fa768d",
"c9.ide.run.debug": "#b734a2a47f",
"c9.ide.run.debug": "#9a05fadc55",
"c9.ide.ace.emmet": "#e5f1a92ac3",
"c9.ide.ace.gotoline": "#4d1a93172c",
"c9.ide.ace.keymaps": "#422e83553b",
@ -88,11 +88,11 @@
"c9.ide.preview": "#3c4dded23f",
"c9.ide.preview.browser": "#be197b0464",
"c9.ide.preview.markdown": "#bf952685f6",
"c9.ide.pubsub": "#e6526a20f7",
"c9.ide.pubsub": "#7dd0a37571",
"c9.ide.readonly": "#f6f07bbe42",
"c9.ide.recentfiles": "#7c099abf40",
"c9.ide.remote": "#37773d905b",
"c9.ide.run": "#9bf773dd1b",
"c9.ide.run": "#63341edc5d",
"c9.ide.run.build": "#2ba0107f97",
"c9.ide.save": "#4cf2ae332c",
"c9.ide.terminal.monitor": "#8e025b3ae1",

Wyświetl plik

@ -37,7 +37,7 @@ define(function(require, module, exports) {
if (!skipProps[prop])
plugin[prop] = options[prop];
}
var totalLoadTime;
var totalLoadTime, startLoadTime;
function load() {
if (loaded) return false;
@ -279,6 +279,11 @@ define(function(require, module, exports) {
*/
get totalLoadTime(){ return totalLoadTime; },
set totalLoadTime(v){ totalLoadTime = v; },
/**
*
*/
get startLoadTime(){ return startLoadTime; },
set startLoadTime(v){ startLoadTime = v; },
_events: [
/**

Wyświetl plik

@ -562,7 +562,7 @@ define(function(require, exports, module) {
function setAPIKey(apikey){
// Validate Key
if (!apikey || !apikey.match(/\w{28}=/))
if (!apikey || !apikey.match(/[\w+]{27}=/))
throw new Error("Invalid API key");
return {

Wyświetl plik

@ -357,7 +357,7 @@ define(function(require, exports, module) {
},
/**
* Spawns a child process in a TMUX and returns a stream object.
* Spawns a child process in a TMUX session and returns a stream object.
* Use this method if the process you wish to start requires a
* terminal (for instance VI).
*

Wyświetl plik

@ -50,6 +50,11 @@ define(function(require, exports, module) {
showDisconnect(e);
});
});
vfs.on("away", function(){
});
vfs.on("back", function(){
hideDisconnect();
});
vfs.on("connect", function(){
hideDisconnect();
});

Wyświetl plik

@ -26,7 +26,7 @@ define(function(require, module, exports) {
var meta = {};
var hasValue = options && (typeof options.value === "string");
var tab, lastState, title, tooltip, editor, recentValue;
var tab, lastState, title, tooltip, editor, recentValue, ready;
plugin.on("newListener", function(type, listener) {
if (type == "state.set" && lastState) {
@ -332,6 +332,15 @@ define(function(require, module, exports) {
editor = v;
emit("setEditor", {editor: v});
},
/**
* Whether the document is fully loaded
* @property {Boolean} ready
*/
get ready(){ return ready; },
set ready(v) {
if (!ready) emit.sticky("ready");
ready = true;
},
/**
* The tooltip displayed when hovering over the tab button
* @property {String} tooltip

Wyświetl plik

@ -1113,6 +1113,7 @@ define(function(require, module, exports) {
if (!doc.meta.timestamp)
doc.meta.timestamp = Date.now() - settings.timeOffset;
doc.ready = true;
emit("open", { tab: tab, options: options });
callback && callback(null, tab);
}
@ -1123,7 +1124,7 @@ define(function(require, module, exports) {
// Hooks for plugins that want to override value and state loading
var event = {
options: options,
options: options,
tab: tab,
loadFromDisk: loadFromDisk,
setLoading: setLoading,
@ -1161,7 +1162,10 @@ define(function(require, module, exports) {
});
}
else {
done(null, null);
// done has to be called asynchronously
setTimeout(function() {
done(null, null);
});
}
return tab;

Wyświetl plik

@ -247,20 +247,22 @@ require(["lib/architect/architect", "lib/chai/chai"],
it('should rename a directory - change tab path', function(done) {
var vpath = "/dir/stuff.json";
tabs.openFile(vpath, function(err, tab) {
expect(tab.path).to.equal(vpath);
expect(tab.title).to.equal("stuff.json");
fs.rename("/dir", "/dir2", function(err) {
if (err)
throw err;
expect(tab.path).to.equal("/dir2/stuff.json");
fs.rmdir("/dir2", { recursive: true }, function(){
tabs.openFile(vpath, function(err, tab) {
expect(tab.path).to.equal(vpath);
expect(tab.title).to.equal("stuff.json");
tab.unload();
fs.rename("/dir2", "/dir", function (err) {
fs.rename("/dir", "/dir2", function(err) {
if (err)
throw err;
done();
expect(tab.path).to.equal("/dir2/stuff.json");
expect(tab.title).to.equal("stuff.json");
tab.unload();
fs.rename("/dir2", "/dir", function (err) {
if (err)
throw err;
done();
});
});
});
});

Wyświetl plik

@ -74,7 +74,7 @@ define(function(require, exports, module) {
list.forEach(function(stat){
var name = stat.name;
// If the plugin doesn't exist
if (names.indexOf(name) == -1 && name.charAt(0) != "." && name != "_")
if (names.indexOf(name) == -1 && name.charAt(0) != "." && name.charAt(0) != "_")
toLoad.push(name);
});
@ -139,10 +139,12 @@ define(function(require, exports, module) {
watch("~/.c9/plugins/" + pluginPath);
var cfg = options.plugins[path];
cfg.packagePath = join(vfs.baseUrl, c9.projectId, "plugins",
auth.accessToken, pluginPath.replace(/^plugins\//, ""));
cfg.staticPrefix = join(vfs.baseUrl, c9.projectId, "plugins",
auth.accessToken, name);
var host = vfs.baseUrl + "/";
var base = join(String(c9.projectId),
"plugins", auth.accessToken);
cfg.packagePath = host + join(base, pluginPath.replace(/^plugins\//, ""));
cfg.staticPrefix = host + join(base, name);
cfg.apikey = "0000000000000000000000000000=";
config.push(cfg);

Wyświetl plik

@ -76,15 +76,19 @@ define(function(require, exports, module) {
else return;
queue.push({ name: item.packageName, version: item.version });
if (installing)
installing.push(item);
});
if (installing) return;
installing = true;
installing = config;
var i = 0;
function next(){
function next(err){
if (err) console.log(err);
if (!queue[i]) {
config = queue;
installing = false; queue = [];
architect.loadAdditionalPlugins(config, callback);
return;
@ -98,17 +102,16 @@ define(function(require, exports, module) {
}
function installPlugin(name, version, callback){
proc.spawn("c9", {
args: ["install", "--local", "--force", "--accessToken=" + auth.accessToken, name + "@" + version]
proc.spawn("bash", {
args: ["-c", ["c9", "install", "--local", "--force", "--accessToken=" + auth.accessToken, name + "@" + version].join(" ")]
}, function(err, process){
if (err) return callback(err);
var res = null;
process.stdout.on("data", function(c){
res = c.toString("utf8");
console.log(c);
});
process.stderr.on("data", function(c){
err = c.toString("utf8");
console.error(c);
});
process.on("exit", function(code){
@ -117,7 +120,7 @@ define(function(require, exports, module) {
error.code = code;
return callback(error);
}
callback(null, res);
callback();
});
});
}

Wyświetl plik

@ -66,15 +66,17 @@ define(function(require, exports, module) {
names.push(name);
var path = options.packagePath + ".js";
var base = join(vfs.baseUrl, c9.projectId, "plugins", auth.accessToken);
options.packagePath = join(base, path.replace(/^plugins\//, ""));
options.staticPrefix = join(base, name);
var host = vfs.baseUrl + "/";
var base = join(String(c9.projectId), "plugins", auth.accessToken);
options.packagePath = host + join(base, path.replace(/^plugins\//, ""));
options.staticPrefix = host + join(base, name);
if (!options.setup) {
wait++;
var install = [];
fs.exists(path, function(exists){
fs.exists("~/.c9/" + path, function(exists){
if (!exists) {
install.push(options);
names.remove(name);

Wyświetl plik

@ -529,7 +529,7 @@ define(function(require, exports, module) {
if (!template)
template = "c9.ide.default";
var url = join(staticPrefix, "templates", template + ".tar.gz");
var url = staticPrefix + "/" + join("templates", template + ".tar.gz");
if (!url.match(/^http/))
url = location.origin + url;
@ -551,20 +551,21 @@ define(function(require, exports, module) {
if (err)
return handleError(err);
// Download tar file with template for plugin
var pluginsDir = join("~", ".c9/plugins/_/");
var pluginsDirAbsolute = pluginsDir.replace(/^~/, c9.home);
var tarPath = join(pluginsDir, template + ".tar.gz");
var tarPathAbsolute = tarPath.replace(/^~/, c9.home);
proc.execFile("curl", {
args: ["-L", url, "--create-dirs", "-o", tarPathAbsolute]
// Download tar file with template for plugin
proc.execFile("bash", {
args: ["-c", ["curl", "-L", url, "--create-dirs", "-o", tarPathAbsolute].join(" ")]
}, function(err, stderr, stdout){
if (err)
return handleError(err);
// Untar tar file
proc.execFile("tar", {
args: ["-zxvf", tarPath, "-C", pluginsDirAbsolute]
proc.execFile("bash", {
args: ["-c", ["tar", "-zxvf", tarPath, "-C", pluginsDirAbsolute].join(" ")]
}, function(err, stderr, stdout){
if (err)
return handleError(err);
@ -579,7 +580,7 @@ define(function(require, exports, module) {
fs.unlink(tarPath, function(){
// Add plugin to favorites
favs.addFavorite(pluginsDir, "plugins");
favs.addFavorite(dirname(pluginsDir), "plugins");
// Select and expand the folder of the plugin
tree.expandAndSelect(path);

Wyświetl plik

@ -223,7 +223,8 @@ define(function(require, exports, module) {
eioOptions = {
path: parsedSocket.path,
host: parsedSocket.host,
port: parsedSocket.port || "443",
port: parsedSocket.port
|| parsedSocket.protocol == "https:" ? "443" : null,
secure: parsedSocket.protocol
? parsedSocket.protocol == "https:" : true
};

Wyświetl plik

@ -19,9 +19,11 @@ function Vfs(vfs, master, options) {
this.vfs = vfs;
this.master = master;
this.debug = options.debug || false;
this.logger = options.logger || {log: function(){}};
this.readonly = options.readonly || false;
this.public = options.public || false;
this.vfsOptions = options.vfsOptions || {};
this.pid = this.vfsOptions.pid;
var extendToken = options.extendToken;
this.homeDir = options.homeDir;
@ -152,6 +154,7 @@ Vfs.prototype._createEngine = function(vfs, options) {
});
this.keepAliveTimer = null;
var listeningForEIOSocketClose = false;
this.workers = 0;
@ -167,6 +170,35 @@ Vfs.prototype._createEngine = function(vfs, options) {
that.socket.disconnect();
that.socket = socket;
/* - socket is the reliablesocket,
- socket.socket is the reconnectsocket,
- socket.socket.socket is engineio's socket */
if (socket.socket) {
/* Add listener to core Engine.io socket used for user communication
to track and log all reasons causing it to close so when users
complain about disconnects we can investigate what's causing them */
var listenForEIOSocketClose = function (eioSocket) {
if (!eioSocket || listeningForEIOSocketClose) return;
eioSocket.once("close", function (reason, description) {
var logMetadata = {message: "Socket closed", collab: options.collab, reason: reason, description: description, id: that.id, sid: socket.id, pid: that.pid};
console.log(logMetadata);
that.logger.log(logMetadata);
listeningForEIOSocketClose = false;
});
listeningForEIOSocketClose = true;
};
socket.socket.once('away', function() {
listenForEIOSocketClose(socket.socket.socket);
});
socket.socket.once('back', function() {
listenForEIOSocketClose(socket.socket.socket);
});
}
socket.on('disconnect', function (err) {
var logMetadata = {message: "Socket disconnected", collab: options.collab, err: err, id: that.id, sid: socket.id, pid: that.pid};
console.log(logMetadata);
that.logger.log(logMetadata);
});
var transport = new smith.EngineIoTransport(socket, true);
var worker = new VfsWorker(vfs);
@ -185,7 +217,10 @@ Vfs.prototype._createEngine = function(vfs, options) {
}
worker.on("disconnect", function() {
console.log("VFS socket disconnect:", options.collab, that.id, socket.id);
var logMetadata = {collab: options.collab, id: that.id, sid: socket.id, pid: that.pid};
console.log("VFS socket disconnect:", logMetadata);
logMetadata.message = "VFS socket disconnect";
that.logger.log(logMetadata);
if (options.collab) {
if (collabApi)
return disposeCollabClient();