c9-core/plugins/c9.preview/preview.js

128 wiersze
3.8 KiB
JavaScript

define(function(require, exports, module) {
"use strict";
main.consumes = [
"session",
"db",
"c9.login",
"preview.handler"
];
main.provides = [];
return main;
function main(options, imports, register) {
var maxVfsAge = options.maxVfsAge || 20 * 1000;
var region = options.region;
var session = imports.session;
var db = imports.db;
var ensureLoggedIn = imports["c9.login"].ensureLoggedIn();
var handler = imports["preview.handler"];
var frontdoor = require("frontdoor");
var error = require("http-error");
var requestTimeout = require("c9/request_timeout");
var api = frontdoor();
var vfsServers;
api.registerType("username", /^[0-9a-z_\-]*$/i);
api.registerType("projectname", /^[0-9a-z\-_]*$/i);
api.use(function(req, res, next) {
res.setHeader("X-Content-Type-Options", "nosniff");
next();
});
session.use(api);
api.get("/:username/:projectname/:path*", {
params: {
username: {
type: "username"
},
projectname: {
type: "projectname"
}
}
}, [
requestTimeout(15*60*1000),
handler.getProjectSession(),
handler.getRole(db),
handler.getProxyUrl(function() {
return vfsServers ? vfsServers[0] : null;
}),
handler.proxyCall()
]);
api.error(function(err, req, res, next) {
if (err instanceof error.Unauthorized) {
req.logout();
delete req.session.token;
return ensureLoggedIn(req, res, next);
}
return next(err);
});
api.get("/:username/:projectname", {
params: {
username: {
type: "username"
},
projectname: {
type: "projectname"
}
}
}, function(req, res, next) {
res.redirect(req.url + "/");
});
function updateVfsServerList(callback) {
db.Vfs.findAllAndPurge(maxVfsAge, function(err, servers) {
if (err)
return callback(err);
if (!servers.length)
return callback(new Error("No VFS server available"));
vfsServers = shuffleServers(servers);
callback();
});
}
function shuffleServers(servers) {
servers = servers.slice();
var isBeta = region == "beta";
servers = servers.filter(function(s) {
return isBeta ? s.region == "beta" : s.region !== "beta";
});
return servers.sort(function(a, b) {
if (a.region == b.region) {
if (a.load < b.load)
return -1;
else
return 1;
}
else if (a.region == region)
return -1;
else if (b.region == region)
return 1;
else
return 0;
});
}
load();
function load() {
updateVfsServerList(function(err) {
if (err)
return setTimeout(load, 20000);
setInterval(updateVfsServerList.bind(null, function(err) {
if (err) console.error("Retrieving VFS server list failed", err);
}), 20 * 1000);
register();
});
}
}
});