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.
63 lines
2.4 KiB
63 lines
2.4 KiB
"use strict";
|
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
exports.initMiddleware = void 0;
|
|
const apiv2_1 = require("../apiv2");
|
|
const logger_1 = require("../logger");
|
|
const utils = require("../utils");
|
|
const SDK_PATH_REGEXP = /^\/__\/firebase\/([^/]+)\/([^/]+)$/;
|
|
function initMiddleware(init) {
|
|
return (req, res, next) => {
|
|
const parsedUrl = new URL(req.url || "", `http://${req.headers.host}`);
|
|
const match = RegExp(SDK_PATH_REGEXP).exec(parsedUrl.pathname);
|
|
if (match) {
|
|
const version = match[1];
|
|
const sdkName = match[2];
|
|
const u = new URL(`https://www.gstatic.com/firebasejs/${version}/${sdkName}`);
|
|
const c = new apiv2_1.Client({ urlPrefix: u.origin, auth: false });
|
|
const headers = {};
|
|
const acceptEncoding = req.headers["accept-encoding"];
|
|
if (typeof acceptEncoding === "string" && acceptEncoding) {
|
|
headers["accept-encoding"] = acceptEncoding;
|
|
}
|
|
c.request({
|
|
method: "GET",
|
|
path: u.pathname,
|
|
headers,
|
|
responseType: "stream",
|
|
resolveOnHTTPError: true,
|
|
compress: false,
|
|
})
|
|
.then((sdkRes) => {
|
|
if (sdkRes.status === 404) {
|
|
return next();
|
|
}
|
|
for (const [key, value] of Object.entries(sdkRes.response.headers.raw())) {
|
|
res.setHeader(key, value);
|
|
}
|
|
sdkRes.body.pipe(res);
|
|
})
|
|
.catch((e) => {
|
|
utils.logLabeledWarning("hosting", `Could not load Firebase SDK ${sdkName} v${version}, check your internet connection.`);
|
|
logger_1.logger.debug(e);
|
|
});
|
|
}
|
|
else if (parsedUrl.pathname === "/__/firebase/init.js") {
|
|
const query = parsedUrl.searchParams;
|
|
res.setHeader("Content-Type", "application/javascript");
|
|
if (query.get("useEmulator") === "true") {
|
|
res.end(init.emulatorsJs);
|
|
}
|
|
else {
|
|
res.end(init.js);
|
|
}
|
|
}
|
|
else if (parsedUrl.pathname === "/__/firebase/init.json") {
|
|
res.setHeader("Content-Type", "application/json");
|
|
res.end(init.json);
|
|
}
|
|
else {
|
|
next();
|
|
}
|
|
};
|
|
}
|
|
exports.initMiddleware = initMiddleware;
|