UNPKG

8.5 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3var express = require("express");
4var session = require("express-session");
5// import favicon = require("serve-favicon");
6var fs = require("fs");
7var path = require("path");
8var jsRoute = require("./routes/js");
9var gameRoute = require("./routes/game");
10var testRoute = require("./routes/test");
11var sandboxConfigRoute = require("./routes/sandboxConfig");
12function result2csv(results) {
13 var csv = "";
14 for (var i = 0; i < results.length; i++) {
15 csv += results[i].name + "," + results[i].elapse + "\n";
16 }
17 return csv;
18}
19function getContentModuleEnvironment(gameJsonPath) {
20 if (fs.existsSync(gameJsonPath)) {
21 var configuration = JSON.parse(fs.readFileSync(gameJsonPath, "utf8"));
22 return configuration.environment;
23 }
24 return null;
25}
26module.exports = function (options) {
27 if (options === void 0) { options = {}; }
28 var appBase = path.join(__dirname, "..");
29 var gameBase = options.gameBase ? options.gameBase : process.cwd();
30 var cascadeBases = options.cascadeBases || [];
31 var jsBase = options.jsBase ? options.jsBase : path.join(appBase, "js");
32 var cssBase = options.cssBase ? options.cssBase : path.join(appBase, "css");
33 var thridpartyBase = options.thirdpartyBase ? options.thirdpartyBase : path.join(appBase, "thirdparty");
34 var app = express();
35 var isDev = app.get("env") === "development";
36 var gameJsonPath = path.join(gameBase, "game.json");
37 var environment = getContentModuleEnvironment(gameJsonPath);
38 var version = environment && environment["sandbox-runtime"] ? environment["sandbox-runtime"] : "1";
39 if (!/^(1|2|3)$/.test(version)) {
40 // sandbox-runtime の値が "1", "2", "3" 以外の場合エラーとする
41 throw new Error("sandbox-runtime value is invalid. Please set the environment. sandbox-runtime value of game.json to 1, 2, or 3.");
42 }
43 // see https://github.com/expressjs/session#secret
44 app.use(session({
45 resave: false,
46 saveUninitialized: false,
47 secret: "to eat or no to eat"
48 }));
49 app.use(function (req, res, next) {
50 res.header("Access-Control-Allow-Origin", "*");
51 res.locals.environment = environment;
52 next();
53 });
54 app.gameBase = gameBase;
55 app.cascadeBases = cascadeBases;
56 // TODO: change to middleware
57 app.use("/game/*.js$", function (req, res, next) {
58 req.baseDir = app.gameBase;
59 next();
60 });
61 app.use("/raw_game/*.js$", function (req, res, next) {
62 req.baseDir = app.gameBase;
63 req.useRawScript = true;
64 next();
65 });
66 app.use("/cascade/:index/*.js$", function (req, res, next) {
67 req.baseDir = app.cascadeBases[Number(req.params.index)];
68 next();
69 });
70 app.use("/raw_cascade/:index/*.js$", function (req, res, next) {
71 req.baseDir = app.cascadeBases[Number(req.params.index)];
72 req.useRawScript = true;
73 next();
74 });
75 app.set("views", path.join(__dirname, "..", "views"));
76 app.set("view engine", "ejs");
77 app.use("^\/$", function (req, res, next) {
78 res.redirect("/game/");
79 });
80 app.use("^\/game$", function (req, res, next) {
81 res.redirect("/game/");
82 });
83 // /js/ /css/ /thirdparty/ を静的ファイルとして参照できるようにする
84 app.use("/js/", express.static(jsBase));
85 app.use("/css/", express.static(cssBase));
86 app.use("/thirdparty/", express.static(thridpartyBase));
87 app.use("/sandboxconfig/", function (req, res, next) {
88 req.baseDir = app.gameBase;
89 next();
90 }, sandboxConfigRoute);
91 // /game/ は sandbox をブラウザで開く場合に利用、/raw_game/ は /engine のエンジン設定ファイルを使う場合に利用
92 app.use("/game", jsRoute);
93 app.use("/game", gameRoute);
94 app.use("/game/", express.static(app.gameBase));
95 app.use("/raw_game", jsRoute);
96 app.use("/raw_game/", express.static(app.gameBase));
97 app.use("/cascade/:index", jsRoute);
98 app.use("/raw_cascade/:index", jsRoute);
99 for (var i = 0; i < app.cascadeBases.length; ++i) {
100 app.use("/cascade/" + i + "/", express.static(app.cascadeBases[i]));
101 app.use("/raw_cascade/" + i + "/", express.static(app.cascadeBases[i]));
102 }
103 app.use("/configuration/", function (req, res, next) {
104 var prefix = req.query.raw ? "/raw_" : "/";
105 if (app.cascadeBases.length === 0) {
106 res.redirect(prefix + "game/game.json");
107 return;
108 }
109 var defs = [prefix + "game/game.json"];
110 for (var i = 0; i < app.cascadeBases.length; ++i)
111 defs.push(prefix + "cascade/" + i + "/game.json");
112 res.json({ definitions: defs });
113 });
114 app.use("/basepath/", function (req, res, next) {
115 res.send(app.gameBase);
116 });
117 app.use("/engine", function (req, res, next) {
118 var host = req.protocol + "://" + req.get("host");
119 res.type("application/json");
120 var externals = req.query.externals ? req.query.externals : ["audio", "xhr", "websocket"];
121 externals = Array.isArray(externals) ? externals : [externals];
122 if (typeof externals[0] !== "string" && externals[0] != null)
123 throw new Error("Invalid externals type");
124 var versionsJson = require("./engineFilesVersion.json");
125 res.render("engine", {
126 host: host,
127 version: version,
128 externals: JSON.stringify(externals),
129 engineFilesVariable: versionsJson["v" + version].variable
130 });
131 });
132 app.use("^\/test$", function (req, res, next) {
133 res.redirect("/test/");
134 });
135 app.use("/test/*.js$", function (req, res, next) {
136 var ssn = req.session;
137 req.baseDir = app.scenario.benchmarks[ssn.cntr].target;
138 next();
139 });
140 app.use("/start/", function (req, res, next) {
141 var scenarioJSONString = fs.readFileSync(app.settings.scenarioPath).toString();
142 app.scenario = JSON.parse(scenarioJSONString);
143 var ssn = req.session;
144 ssn.cntr = 0;
145 ssn.results = [];
146 res.redirect("/test/");
147 });
148 app.use("/next/", function (req, res, next) {
149 var ssn = req.session;
150 var elapse = Number(req.query.elapse);
151 ssn.results.push({
152 "name": app.scenario.benchmarks[ssn.cntr].name,
153 "elapse": elapse
154 });
155 ssn.cntr++;
156 if (ssn.cntr < app.scenario.benchmarks.length) {
157 res.redirect("/test/");
158 }
159 else {
160 res.redirect("/finish/");
161 }
162 });
163 app.use("/finish/", function (req, res, next) {
164 var ssn = req.session;
165 console.log("you arrived at 'finish'");
166 res.render("finish", {
167 "resultjson": JSON.stringify(ssn.results),
168 "resultcsv": result2csv(ssn.results),
169 "title": "finish"
170 });
171 });
172 app.use("/test", jsRoute);
173 app.use("/test", function (req, res, next) {
174 var ssn = req.session;
175 res.locals.maxAge = app.scenario.benchmarks[ssn.cntr].maxAge;
176 res.locals.renderPerFrame = app.scenario.benchmarks[ssn.cntr].renderPerFrame;
177 res.locals.renderPerFrame = (res.locals.renderPerFrame === undefined) ? "undefined" : res.locals.renderPerFrame;
178 res.locals.loopCount = app.scenario.benchmarks[ssn.cntr].loopCount;
179 res.locals.loopCount = (res.locals.loopCount === undefined) ? "undefined" : res.locals.loopCount;
180 testRoute(req, res, next);
181 });
182 app.use("/test/", function (req, res, next) {
183 var ssn = req.session;
184 express.static(app.scenario.benchmarks[ssn.cntr].target)(req, res, next);
185 });
186 app.use(function (req, res, next) {
187 var err = new Error("Not Found");
188 err.status = 404;
189 next(err);
190 });
191 var errorHandler;
192 if (isDev) {
193 errorHandler = function (err, req, res, next) {
194 res.status(err.status || 500);
195 res.render("error", {
196 title: "error",
197 message: err.message,
198 error: err
199 });
200 };
201 }
202 else {
203 errorHandler = function (err, req, res, next) {
204 res.status(err.status || 500);
205 res.render("error", {
206 title: "error",
207 message: err.message,
208 error: {}
209 });
210 };
211 }
212 app.use(errorHandler);
213 return app;
214};