1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | var express = require("express");
|
4 | var session = require("express-session");
|
5 |
|
6 | var fs = require("fs");
|
7 | var path = require("path");
|
8 | var jsRoute = require("./routes/js");
|
9 | var gameRoute = require("./routes/game");
|
10 | var testRoute = require("./routes/test");
|
11 | var sandboxConfigRoute = require("./routes/sandboxConfig");
|
12 | function 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 | }
|
19 | function 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 | }
|
26 | module.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 |
|
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 |
|
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 |
|
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 |
|
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 |
|
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 | };
|