You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
100 lines
3.3 KiB
100 lines
3.3 KiB
"use strict"; |
|
var queryString = require("qs"); |
|
var proto = exports; |
|
var instanceMethods = ["exit", "notify", "pause", "resume"]; |
|
var getBody = require("raw-body"); |
|
const permittedSocketEvents = [ |
|
"file:reload", |
|
"browser:reload", |
|
"browser:notify", |
|
"browser:location", |
|
"options:set" |
|
]; |
|
/** |
|
* Does the requested method expect an instance of BrowserSync |
|
* or raw access to the emitter? |
|
* @param method |
|
* @returns {boolean} |
|
*/ |
|
function methodRequiresInstance(method) { |
|
return instanceMethods.indexOf(method) > -1; |
|
} |
|
/** |
|
* Use BrowserSync options + querystring to create a |
|
* full HTTP/HTTTPS url. |
|
* |
|
* Eg. http://localhost:3000/__browser_sync__?method=reload |
|
* Eg. http://localhost:3000/__browser_sync__?method=reload&args=core.css |
|
* Eg. http://localhost:3000/__browser_sync__?method=reload&args=core.css&args=core.min |
|
* |
|
* @param args |
|
* @param url |
|
* @returns {string} |
|
*/ |
|
proto.getUrl = function (args, url) { |
|
return [ |
|
url, |
|
require("./config").httpProtocol.path, |
|
"?", |
|
queryString.stringify(args) |
|
].join(""); |
|
}; |
|
/** |
|
* Return a middleware for handling the requests |
|
* @param {BrowserSync} bs |
|
* @returns {Function} |
|
*/ |
|
proto.middleware = function (bs) { |
|
return function (req, res) { |
|
if (req.method === "POST") { |
|
return getBody(req, function (err, body) { |
|
if (err) { |
|
const output = ["Error: could not parse JSON."]; |
|
res.writeHead(500, { "Content-Type": "text/plain" }); |
|
return res.end(output.join("\n")); |
|
} |
|
try { |
|
const [name, payload] = JSON.parse(body.toString()); |
|
bs.io.sockets.emit(name, payload); |
|
return res.end(`Browsersync HTTP Protocol received: ${name} ${JSON.stringify(payload)}`); |
|
} |
|
catch (e) { |
|
const output = [`Error: ${e.message}`]; |
|
res.writeHead(500, { "Content-Type": "text/plain" }); |
|
return res.end(output.join("\n")); |
|
} |
|
}); |
|
} |
|
var params = queryString.parse(req.url.replace(/^.*\?/, "")); |
|
var output; |
|
if (!Object.keys(params).length) { |
|
output = [ |
|
"Error: No Parameters were provided.", |
|
"Example: http://localhost:3000/__browser_sync__?method=reload&args=core.css" |
|
]; |
|
res.writeHead(500, { "Content-Type": "text/plain" }); |
|
res.end(output.join("\n")); |
|
return; |
|
} |
|
try { |
|
var bsOrEmitter = methodRequiresInstance(params.method) |
|
? bs |
|
: bs.events; |
|
require("./public/" + params.method)(bsOrEmitter).apply(null, [ |
|
params.args |
|
]); |
|
output = [ |
|
"Called public API method `.%s()`".replace("%s", params.method), |
|
"With args: " + JSON.stringify(params.args) |
|
]; |
|
res.end(output.join("\n")); |
|
} |
|
catch (e) { |
|
res.writeHead(404, { "Content-Type": "text/plain" }); |
|
res.write("Public API method `" + params.method + "` not found."); |
|
res.end(); |
|
return; |
|
} |
|
}; |
|
}; |
|
//# sourceMappingURL=http-protocol.js.map
|