tickcli-js 0.0.0-stage → 0.1.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +15 -0
- package/LICENSE +21 -0
- package/README.md +360 -2
- package/client/game.js +982 -0
- package/client/game3d.js +109 -0
- package/client/relay.js +196 -0
- package/client/room.js +632 -0
- package/dist/cli.d.ts +11 -0
- package/dist/cli.js +82 -0
- package/dist/cli.js.map +1 -0
- package/dist/hub.d.ts +619 -0
- package/dist/hub.js +1777 -0
- package/dist/hub.js.map +1 -0
- package/dist/node.d.ts +106 -0
- package/dist/node.js +301 -0
- package/dist/node.js.map +1 -0
- package/dist/remote.d.ts +75 -0
- package/dist/remote.js +214 -0
- package/dist/remote.js.map +1 -0
- package/dist/serve.d.ts +42 -0
- package/dist/serve.js +231 -0
- package/dist/serve.js.map +1 -0
- package/examples/games/arena.html +108 -0
- package/examples/games/arena3d.html +110 -0
- package/examples/games/chess.html +132 -0
- package/examples/games/cup.html +52 -0
- package/examples/games/delve.html +137 -0
- package/examples/games/dungeon.html +110 -0
- package/examples/games/neon-paint.html +79 -0
- package/examples/games/own-engine.html +41 -0
- package/examples/games/race.html +83 -0
- package/examples/games/shooter.html +95 -0
- package/examples/games/sky-duel.html +136 -0
- package/examples/games/space-squad.html +3627 -0
- package/examples/games/tag.html +51 -0
- package/examples/games/tictactoe.html +53 -0
- package/package.json +101 -4
- package/src/cli.ts +59 -0
- package/src/hub.ts +1521 -0
- package/src/node.ts +245 -0
- package/src/remote.ts +236 -0
- package/src/serve.ts +224 -0
package/dist/cli.js
ADDED
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
#!/usr/bin/env node
|
|
2
|
+
// npx tickcli-js [folder] [--port 8080] [--host 0.0.0.0] [--saves folder] [--title "My games"]
|
|
3
|
+
// Serves every .html game in the folder with live rooms. TICKCLI_SECRET (any long random text) keeps players' seats across restarts.
|
|
4
|
+
import { realpathSync } from "node:fs";
|
|
5
|
+
import { fileURLToPath } from "node:url";
|
|
6
|
+
import { createGameServer } from "./serve.js";
|
|
7
|
+
const HELP = `tickcli: live rooms for the .html games in a folder
|
|
8
|
+
|
|
9
|
+
npx tickcli-js [folder] [options]
|
|
10
|
+
|
|
11
|
+
folder games to serve, one .html file each (default: this folder)
|
|
12
|
+
--port <n> port to listen on (default 8080, or $PORT)
|
|
13
|
+
--host <addr> address to listen on (default: all)
|
|
14
|
+
--saves <folder> keep saved profiles and worlds there (default: none)
|
|
15
|
+
--title <text> heading of the game list
|
|
16
|
+
--behind-proxy an https proxy on this machine or network (Caddy, nginx) is in front: count players by the address it saw, and
|
|
17
|
+
mark the pass cookie Secure
|
|
18
|
+
-h, --help this text
|
|
19
|
+
|
|
20
|
+
TICKCLI_SECRET set it to keep players' seats and saves across restarts
|
|
21
|
+
`;
|
|
22
|
+
/** The command line as options; throws a message for anything it does not understand. */
|
|
23
|
+
export function parseArgs(argv, env = {}) {
|
|
24
|
+
const o = { games: ".", port: Number(env.PORT) || 8080, help: false };
|
|
25
|
+
let folder = false;
|
|
26
|
+
for (let i = 0; i < argv.length; i++) {
|
|
27
|
+
const a = argv[i];
|
|
28
|
+
const val = () => { const v = argv[++i]; if (v === undefined || v.startsWith("--"))
|
|
29
|
+
throw new Error(`${a} needs a value`); return v; };
|
|
30
|
+
if (a === "-h" || a === "--help")
|
|
31
|
+
o.help = true;
|
|
32
|
+
else if (a === "--port") {
|
|
33
|
+
o.port = Number(val());
|
|
34
|
+
if (!Number.isInteger(o.port) || o.port < 0 || o.port > 65535)
|
|
35
|
+
throw new Error("--port is a number from 0 to 65535");
|
|
36
|
+
}
|
|
37
|
+
else if (a === "--host")
|
|
38
|
+
o.host = val();
|
|
39
|
+
else if (a === "--saves")
|
|
40
|
+
o.saves = val();
|
|
41
|
+
else if (a === "--title")
|
|
42
|
+
o.title = val();
|
|
43
|
+
else if (a === "--behind-proxy")
|
|
44
|
+
o.proxy = true;
|
|
45
|
+
else if (a.startsWith("-"))
|
|
46
|
+
throw new Error(`unknown option ${a}`);
|
|
47
|
+
else if (!folder) {
|
|
48
|
+
o.games = a;
|
|
49
|
+
folder = true;
|
|
50
|
+
}
|
|
51
|
+
else
|
|
52
|
+
throw new Error(`one folder only (got ${o.games} and ${a})`);
|
|
53
|
+
}
|
|
54
|
+
return o;
|
|
55
|
+
}
|
|
56
|
+
async function main() {
|
|
57
|
+
let o;
|
|
58
|
+
try {
|
|
59
|
+
o = parseArgs(process.argv.slice(2), process.env);
|
|
60
|
+
}
|
|
61
|
+
catch (e) {
|
|
62
|
+
console.error(`tickcli: ${e.message}\n\n${HELP}`);
|
|
63
|
+
process.exit(2);
|
|
64
|
+
}
|
|
65
|
+
if (o.help) {
|
|
66
|
+
console.log(HELP);
|
|
67
|
+
return;
|
|
68
|
+
}
|
|
69
|
+
const app = createGameServer({ games: o.games, saves: o.saves, title: o.title, secret: process.env.TICKCLI_SECRET || undefined, trustProxy: !!o.proxy, secure: !!o.proxy });
|
|
70
|
+
const url = await app.listen(o.port, o.host);
|
|
71
|
+
console.log(`tickcli: serving ${o.games} on ${url}`);
|
|
72
|
+
if (!process.env.TICKCLI_SECRET)
|
|
73
|
+
console.log("tickcli: no TICKCLI_SECRET set, so players get new seats after a restart");
|
|
74
|
+
const stop = () => { void app.close().then(() => process.exit(0)); };
|
|
75
|
+
process.once("SIGINT", stop);
|
|
76
|
+
process.once("SIGTERM", stop);
|
|
77
|
+
}
|
|
78
|
+
// run when started as a program (node src/cli.ts, the npx bin), not when imported by a test
|
|
79
|
+
const self = fileURLToPath(import.meta.url);
|
|
80
|
+
if (process.argv[1] && realpathSync(process.argv[1]) === realpathSync(self))
|
|
81
|
+
void main().catch((e) => { console.error(`tickcli: ${e.message}`); process.exit(1); });
|
|
82
|
+
//# sourceMappingURL=cli.js.map
|
package/dist/cli.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"cli.js","sourceRoot":"","sources":["../src/cli.ts"],"names":[],"mappings":"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"}
|