unblocker
Version:
Web proxy for evading internet censorship & general-purpose library for rewriting remote websites.
62 lines (56 loc) • 1.53 kB
JavaScript
var path = require("path");
var Transform = require("stream").Transform;
var send = require("send");
var contentTypes = require("./content-types");
module.exports = function ({ prefix }) {
const clientDir = "client";
const clientScriptPathWeb = prefix + clientDir + "/unblocker-client.js";
const clientScriptPathFs = path.join(
__dirname,
clientDir,
"unblocker-client.js"
);
const isProduction = process.env.NODE_ENV === "production";
const sendOpts = {
acceptRanges: false,
immutable: isProduction,
index: false,
maxAge: "10m",
};
function server(req, res, next) {
if (req.url === clientScriptPathWeb) {
send(req, clientScriptPathFs, sendOpts).pipe(res);
return;
}
next();
}
function injector(data) {
if (contentTypes.html.includes(data.contentType)) {
data.stream = data.stream.pipe(
new Transform({
decodeStrings: false,
transform: function (chunk, encoding, next) {
// todo: only inject once (maybe make an "injects into head" helper)
var updated = chunk.toString().replace(
/(<head[^>]*>)/i,
`$1
<script src="${clientScriptPathWeb}"></script>
<script>unblockerInit(${JSON.stringify({
prefix,
url: data.url,
})}, window);</script>
`
);
this.push(updated, "utf8");
next();
},
})
);
}
}
return {
server,
injector,
};
};
;