smc-hub
Version:
CoCalc: Backend webserver component
59 lines (51 loc) • 1.77 kB
text/typescript
import { database } from "./database";
import { getLogger } from "../logger";
const { connect_to_project } = require("../local_hub_connection");
import { BaseProject } from "smc-hub/project-control/base";
import singleUser from "smc-hub/project-control/single-user";
import multiUser from "smc-hub/project-control/multi-user";
import kucalc from "smc-hub/project-control/kucalc";
import kubernetes from "smc-hub/project-control/kubernetes";
export const COCALC_MODES = [
"single-user",
"multi-user",
"kucalc",
"kubernetes",
];
export type ProjectControlFunction = (project_id: string) => BaseProject;
export default function init(program): ProjectControlFunction {
const winston = getLogger("project-control");
winston.info("creating project control client");
let getProject;
switch (program.mode) {
case "single-user":
getProject = singleUser;
break;
case "multi-user":
getProject = multiUser;
break;
case "kucalc":
getProject = kucalc;
break;
case "kubernetes":
getProject = kubernetes;
break;
default:
throw Error(`invalid mode "${program.mode}"`);
}
winston.info(`project controller created with mode ${program.mode}`);
database.compute_server = getProject;
// This is used by the database when handling certain writes to make sure
// that the there is a connection to the corresponding project, so that
// the project can respond. // TODO: obviously, this is ugly!
database.ensure_connection_to_project = (
project_id: string,
cb: Function
): void => {
winston.debug(
`database.ensure_connection_to_project -- project_id=${project_id}`
);
connect_to_project(project_id, database, getProject, cb);
};
return getProject;
}