202 lines
4.6 KiB
JavaScript
202 lines
4.6 KiB
JavaScript
|
var url = require("url");
|
||
|
var Immutable = require("immutable");
|
||
|
var path = require("path");
|
||
|
|
||
|
var weinreApp;
|
||
|
|
||
|
const WEINRE_NAME = "weinre-debug";
|
||
|
const WEINRE_ID = "#browsersync";
|
||
|
const WEINRE_ELEM_ID = "__browser-sync-weinre__";
|
||
|
|
||
|
var weinreTargetUrl = {
|
||
|
protocol: "http:",
|
||
|
pathname: "/target/target-script-min.js",
|
||
|
hash: WEINRE_ID
|
||
|
};
|
||
|
|
||
|
var weinreClientUrl = {
|
||
|
protocol: "http:",
|
||
|
pathname: "/client/",
|
||
|
hash: WEINRE_ID
|
||
|
};
|
||
|
|
||
|
/**
|
||
|
* Prepare weinre for later possible use.
|
||
|
* @param ui
|
||
|
*/
|
||
|
function init (ui) {
|
||
|
|
||
|
var hostUrl = getHostUrl(ui, ui.bs);
|
||
|
var weinrePort = ui.getOptionIn(["weinre", "port"]);
|
||
|
|
||
|
weinreTargetUrl.hostname = hostUrl.hostname;
|
||
|
weinreClientUrl.hostname = hostUrl.hostname;
|
||
|
weinreClientUrl.port = weinrePort;
|
||
|
weinreTargetUrl.port = weinrePort;
|
||
|
|
||
|
ui.setOption(WEINRE_NAME, Immutable.fromJS({
|
||
|
name: WEINRE_NAME,
|
||
|
active: false,
|
||
|
url: false,
|
||
|
targetUrl: url.format(weinreTargetUrl),
|
||
|
clientUrl: url.format(weinreClientUrl),
|
||
|
port: weinrePort
|
||
|
}));
|
||
|
|
||
|
setWeinreClientUrl(ui, url.format(weinreClientUrl));
|
||
|
|
||
|
var methods = {
|
||
|
toggle: function (data) {
|
||
|
toggleWeinre(ui.socket, ui.clients, ui, ui.bs, data);
|
||
|
},
|
||
|
event: function (event) {
|
||
|
methods[event.event](event.data);
|
||
|
}
|
||
|
};
|
||
|
|
||
|
return methods;
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Get a suitable host URL for weinre
|
||
|
* @param ui
|
||
|
* @param bs
|
||
|
* @returns {*}
|
||
|
*/
|
||
|
function getHostUrl(ui, bs) {
|
||
|
|
||
|
var url = bs.getOptionIn(["urls", "external"]);
|
||
|
|
||
|
if (!url) {
|
||
|
url = bs.getOptionIn(["urls", "local"]);
|
||
|
}
|
||
|
|
||
|
return require("url").parse(url);
|
||
|
}
|
||
|
|
||
|
|
||
|
/**
|
||
|
* @param ui
|
||
|
* @param weinreClientUrl
|
||
|
*/
|
||
|
function setWeinreClientUrl(ui, weinreClientUrl) {
|
||
|
var weinre = ui.options.getIn(["clientFiles", "weinre"]).toJS();
|
||
|
ui.setMany(function (item) {
|
||
|
item.setIn(["clientFiles", "weinre", "hidden"], weinre.hidden.replace("%s", weinreClientUrl));
|
||
|
return item;
|
||
|
});
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param socket
|
||
|
* @param clients
|
||
|
* @param ui
|
||
|
* @param bs
|
||
|
* @param value
|
||
|
*/
|
||
|
function toggleWeinre (socket, clients, ui, bs, value) {
|
||
|
|
||
|
if (value !== true) {
|
||
|
value = false;
|
||
|
}
|
||
|
|
||
|
if (value) {
|
||
|
|
||
|
var _debugger = enableWeinre(ui, bs);
|
||
|
|
||
|
// set the state of weinre
|
||
|
ui.setMany(function (item) {
|
||
|
item.setIn([WEINRE_NAME, "active"], true);
|
||
|
item.setIn([WEINRE_NAME, "url"], _debugger.url);
|
||
|
item.setIn([WEINRE_NAME, "active"], true);
|
||
|
item.setIn(["clientFiles", "weinre", "active"], true);
|
||
|
}, {silent: true});
|
||
|
|
||
|
|
||
|
// Let the UI know about it
|
||
|
socket.emit("ui:weinre:enabled", _debugger);
|
||
|
|
||
|
var fileitem = {
|
||
|
type: "js",
|
||
|
src: ui.getOptionIn([WEINRE_NAME, "targetUrl"]),
|
||
|
id: WEINRE_ELEM_ID
|
||
|
};
|
||
|
|
||
|
// Add the element to all clients
|
||
|
ui.addElement(clients, fileitem);
|
||
|
|
||
|
// Save for page refreshes
|
||
|
//clientScripts = clientScripts.set("weinre", fileitem);
|
||
|
|
||
|
} else {
|
||
|
|
||
|
// Stop it
|
||
|
disableWeinre(ui, bs);
|
||
|
|
||
|
//clientScripts = clientScripts.remove("weinre");
|
||
|
|
||
|
// Reset the state
|
||
|
ui.setOptionIn([WEINRE_NAME, "active"], false, {silent: false}); // Force a reload here
|
||
|
ui.setOptionIn(["clientFiles", "weinre", "active"], false); // Force a reload here
|
||
|
|
||
|
// Let the UI know
|
||
|
socket.emit("ui:weinre:disabled");
|
||
|
|
||
|
// Reload all browsers to remove weinre elements/JS
|
||
|
clients.emit("browser:reload");
|
||
|
|
||
|
}
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* Enable the debugger
|
||
|
* @param ui
|
||
|
* @param bs
|
||
|
* @returns {{url: string, port: number}}
|
||
|
*/
|
||
|
function enableWeinre (ui, bs) {
|
||
|
|
||
|
if (weinreApp && typeof weinreApp.destroy === "function") {
|
||
|
weinreApp.destroy();
|
||
|
weinreApp = undefined;
|
||
|
}
|
||
|
|
||
|
var port = ui.getOptionIn([WEINRE_NAME, "port"]);
|
||
|
|
||
|
var logger = require(path.join(path.dirname(require.resolve("weinre")), "utils.js"));
|
||
|
|
||
|
logger.log = function (message) {
|
||
|
ui.logger.debug("[weinre]: %s", message);
|
||
|
};
|
||
|
|
||
|
var weinre = require("weinre");
|
||
|
var external = getHostUrl(ui, bs);
|
||
|
|
||
|
weinreApp = weinre.run({
|
||
|
httpPort: port,
|
||
|
boundHost: external.hostname,
|
||
|
verbose: false,
|
||
|
debug: false,
|
||
|
readTimeout: 5,
|
||
|
deathTimeout: 15 });
|
||
|
|
||
|
require("server-destroy")(weinreApp);
|
||
|
|
||
|
return ui.options.get(WEINRE_NAME).toJS();
|
||
|
}
|
||
|
|
||
|
/**
|
||
|
* @param ui
|
||
|
* @returns {any|*}
|
||
|
*/
|
||
|
function disableWeinre (ui) {
|
||
|
if (weinreApp) {
|
||
|
weinreApp.close();
|
||
|
weinreApp = false;
|
||
|
}
|
||
|
return ui.options.get(WEINRE_NAME).toJS();
|
||
|
}
|
||
|
|
||
|
module.exports.init = init;
|
||
|
module.exports.toggleWeinre = toggleWeinre;
|