tempest.games 0.3.8 → 0.3.10

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/app/index.html CHANGED
@@ -10,7 +10,7 @@
10
10
  />
11
11
  <meta name="apple-mobile-web-app-capable" content="yes" />
12
12
  <title>TEMPEST</title>
13
- <script type="module" crossorigin src="/assets/index-BW3Efm0c.js"></script>
13
+ <script type="module" crossorigin src="/assets/index-BXPTVkti.js"></script>
14
14
  <link rel="stylesheet" crossorigin href="/assets/index-oxk15HrU.css">
15
15
  </head>
16
16
  <body>
@@ -4365,12 +4365,14 @@ function destroyRoom({
4365
4365
  };
4366
4366
  }
4367
4367
  function provideRooms({
4368
- store = IMPLICIT.STORE,
4369
- socket,
4370
4368
  resolveRoomScript,
4369
+ roomAdminsToken,
4371
4370
  roomNames,
4371
+ socket,
4372
+ store = IMPLICIT.STORE,
4372
4373
  userKey
4373
4374
  }) {
4375
+ const isAdmin = getFromStore(store, roomAdminsToken, userKey);
4374
4376
  const roomSocket = guardSocket(socket, createRoomSocketGuard(roomNames));
4375
4377
  const exposeMutable = realtimeMutableProvider({
4376
4378
  socket,
@@ -4400,8 +4402,10 @@ function provideRooms({
4400
4402
  enterRoom(userRoomKey);
4401
4403
  break;
4402
4404
  }
4403
- roomSocket.on(`createRoom`, spawnRoom({ store, socket, userKey, resolveRoomScript }));
4404
- roomSocket.on(`deleteRoom`, destroyRoom({ store, socket, userKey }));
4405
+ if (isAdmin) {
4406
+ roomSocket.on(`createRoom`, spawnRoom({ store, socket, userKey, resolveRoomScript }));
4407
+ roomSocket.on(`deleteRoom`, destroyRoom({ store, socket, userKey }));
4408
+ }
4405
4409
  return () => {
4406
4410
  unsubFromRoomKeys();
4407
4411
  unsubFromUsersInRooms();
@@ -23595,7 +23599,7 @@ var init_traversal = __esm(() => {
23595
23599
  });
23596
23600
 
23597
23601
  // ../../node_modules/.pnpm/@ark+schema@0.56.0/node_modules/@ark/schema/out/node.js
23598
- var BaseNode, NodeSelector, writeSelectAssertionMessage = (from, selector2) => `${from} had no references matching ${printable(selector2)}.`, typePathToPropString = (path2) => stringifyPath(path2, {
23602
+ var BaseNode, NodeSelector, writeSelectAssertionMessage = (from, selector3) => `${from} had no references matching ${printable(selector3)}.`, typePathToPropString = (path2) => stringifyPath(path2, {
23599
23603
  stringifyNonKey: (node) => node.expression
23600
23604
  }), referenceMatcher, compileMeta = (metaJson) => JSON.stringify(metaJson).replace(referenceMatcher, "$1"), flatRef = (path2, node) => ({
23601
23605
  path: path2,
@@ -23818,17 +23822,17 @@ var init_node = __esm(() => {
23818
23822
  get nestableExpression() {
23819
23823
  return this.expression;
23820
23824
  }
23821
- select(selector2) {
23822
- const normalized = NodeSelector.normalize(selector2);
23825
+ select(selector3) {
23826
+ const normalized = NodeSelector.normalize(selector3);
23823
23827
  return this._select(normalized);
23824
23828
  }
23825
- _select(selector2) {
23826
- let nodes = NodeSelector.applyBoundary[selector2.boundary ?? "references"](this);
23827
- if (selector2.kind)
23828
- nodes = nodes.filter((n2) => n2.kind === selector2.kind);
23829
- if (selector2.where)
23830
- nodes = nodes.filter(selector2.where);
23831
- return NodeSelector.applyMethod[selector2.method ?? "filter"](nodes, this, selector2);
23829
+ _select(selector3) {
23830
+ let nodes = NodeSelector.applyBoundary[selector3.boundary ?? "references"](this);
23831
+ if (selector3.kind)
23832
+ nodes = nodes.filter((n2) => n2.kind === selector3.kind);
23833
+ if (selector3.where)
23834
+ nodes = nodes.filter(selector3.where);
23835
+ return NodeSelector.applyMethod[selector3.method ?? "filter"](nodes, this, selector3);
23832
23836
  }
23833
23837
  transform(mapper, opts) {
23834
23838
  return this._transform(mapper, this._createTransformContext(opts));
@@ -23897,8 +23901,8 @@ var init_node = __esm(() => {
23897
23901
  }
23898
23902
  return transformedNode = $2.node(this.kind, transformedInner, ctx.parseOptions);
23899
23903
  }
23900
- configureReferences(meta, selector2 = "references") {
23901
- const normalized = NodeSelector.normalize(selector2);
23904
+ configureReferences(meta, selector3 = "references") {
23905
+ const normalized = NodeSelector.normalize(selector3);
23902
23906
  const mapper = typeof meta === "string" ? (kind, inner) => ({
23903
23907
  ...inner,
23904
23908
  meta: { ...inner.meta, description: meta }
@@ -23927,19 +23931,19 @@ var init_node = __esm(() => {
23927
23931
  },
23928
23932
  applyMethod: {
23929
23933
  filter: (nodes) => nodes,
23930
- assertFilter: (nodes, from, selector2) => {
23934
+ assertFilter: (nodes, from, selector3) => {
23931
23935
  if (nodes.length === 0)
23932
- throwError(writeSelectAssertionMessage(from, selector2));
23936
+ throwError(writeSelectAssertionMessage(from, selector3));
23933
23937
  return nodes;
23934
23938
  },
23935
23939
  find: (nodes) => nodes[0],
23936
- assertFind: (nodes, from, selector2) => {
23940
+ assertFind: (nodes, from, selector3) => {
23937
23941
  if (nodes.length === 0)
23938
- throwError(writeSelectAssertionMessage(from, selector2));
23942
+ throwError(writeSelectAssertionMessage(from, selector3));
23939
23943
  return nodes[0];
23940
23944
  }
23941
23945
  },
23942
- normalize: (selector2) => typeof selector2 === "function" ? { boundary: "references", method: "filter", where: selector2 } : typeof selector2 === "string" ? isKeyOf(selector2, NodeSelector.applyBoundary) ? { method: "filter", boundary: selector2 } : { boundary: "references", method: "filter", kind: selector2 } : { boundary: "references", method: "filter", ...selector2 }
23946
+ normalize: (selector3) => typeof selector3 === "function" ? { boundary: "references", method: "filter", where: selector3 } : typeof selector3 === "string" ? isKeyOf(selector3, NodeSelector.applyBoundary) ? { method: "filter", boundary: selector3 } : { boundary: "references", method: "filter", kind: selector3 } : { boundary: "references", method: "filter", ...selector3 }
23943
23947
  };
23944
23948
  referenceMatcher = /"(\$ark\.[^"]+)"/g;
23945
23949
  });
@@ -25511,11 +25515,11 @@ var init_root = __esm(() => {
25511
25515
  const rNode = this.$.parseDefinition(r2);
25512
25516
  return rNode.extends(this);
25513
25517
  }
25514
- configure(meta, selector2 = "shallow") {
25515
- return this.configureReferences(meta, selector2);
25518
+ configure(meta, selector3 = "shallow") {
25519
+ return this.configureReferences(meta, selector3);
25516
25520
  }
25517
- describe(description, selector2 = "shallow") {
25518
- return this.configure({ description }, selector2);
25521
+ describe(description, selector3 = "shallow") {
25522
+ return this.configure({ description }, selector3);
25519
25523
  }
25520
25524
  optional() {
25521
25525
  return [this, "?"];
@@ -30750,6 +30754,7 @@ var init_env = __esm(() => {
30750
30754
  env2 = createEnv({
30751
30755
  isServer: IS_SERVER,
30752
30756
  server: {
30757
+ ROOT_USERNAME: str,
30753
30758
  CI: type(`string | undefined`).pipe(Boolean),
30754
30759
  POSTGRES_USER: str,
30755
30760
  POSTGRES_PASSWORD: str,
@@ -51669,27 +51674,27 @@ ${"".padEnd(offset)}${"^".repeat(len)}`;
51669
51674
  function parse1(str2) {
51670
51675
  return parse_(complexSelector_, str2);
51671
51676
  }
51672
- function serialize2(selector2) {
51673
- if (!selector2.type) {
51677
+ function serialize2(selector3) {
51678
+ if (!selector3.type) {
51674
51679
  throw new Error("This is not an AST node.");
51675
51680
  }
51676
- switch (selector2.type) {
51681
+ switch (selector3.type) {
51677
51682
  case "universal":
51678
- return _serNs(selector2.namespace) + "*";
51683
+ return _serNs(selector3.namespace) + "*";
51679
51684
  case "tag":
51680
- return _serNs(selector2.namespace) + _serIdent(selector2.name);
51685
+ return _serNs(selector3.namespace) + _serIdent(selector3.name);
51681
51686
  case "class":
51682
- return "." + _serIdent(selector2.name);
51687
+ return "." + _serIdent(selector3.name);
51683
51688
  case "id":
51684
- return "#" + _serIdent(selector2.name);
51689
+ return "#" + _serIdent(selector3.name);
51685
51690
  case "attrPresence":
51686
- return `[${_serNs(selector2.namespace)}${_serIdent(selector2.name)}]`;
51691
+ return `[${_serNs(selector3.namespace)}${_serIdent(selector3.name)}]`;
51687
51692
  case "attrValue":
51688
- return `[${_serNs(selector2.namespace)}${_serIdent(selector2.name)}${selector2.matcher}"${_serStr(selector2.value)}"${selector2.modifier ? selector2.modifier : ""}]`;
51693
+ return `[${_serNs(selector3.namespace)}${_serIdent(selector3.name)}${selector3.matcher}"${_serStr(selector3.value)}"${selector3.modifier ? selector3.modifier : ""}]`;
51689
51694
  case "combinator":
51690
- return serialize2(selector2.left) + selector2.combinator;
51695
+ return serialize2(selector3.left) + selector3.combinator;
51691
51696
  case "compound":
51692
- return selector2.list.reduce((acc, node4) => {
51697
+ return selector3.list.reduce((acc, node4) => {
51693
51698
  if (node4.type === "combinator") {
51694
51699
  return serialize2(node4) + acc;
51695
51700
  } else {
@@ -51697,7 +51702,7 @@ function serialize2(selector2) {
51697
51702
  }
51698
51703
  }, "");
51699
51704
  case "list":
51700
- return selector2.list.map(serialize2).join(",");
51705
+ return selector3.list.map(serialize2).join(",");
51701
51706
  }
51702
51707
  }
51703
51708
  function _serNs(ns2) {
@@ -51712,30 +51717,30 @@ function _serIdent(str2) {
51712
51717
  function _serStr(str2) {
51713
51718
  return str2.replace(/(")|(\\)|(\x00)|([\x01-\x1f]|\x7f)/g, (m2, dq, bs2, nl3, ctrl) => dq ? "\\\"" : bs2 ? "\\\\" : nl3 ? "\uFFFD" : _codePoint(ctrl));
51714
51719
  }
51715
- function normalize2(selector2) {
51716
- if (!selector2.type) {
51720
+ function normalize2(selector3) {
51721
+ if (!selector3.type) {
51717
51722
  throw new Error("This is not an AST node.");
51718
51723
  }
51719
- switch (selector2.type) {
51724
+ switch (selector3.type) {
51720
51725
  case "compound": {
51721
- selector2.list.forEach(normalize2);
51722
- selector2.list.sort((a2, b5) => _compareArrays(_getSelectorPriority(a2), _getSelectorPriority(b5)));
51726
+ selector3.list.forEach(normalize2);
51727
+ selector3.list.sort((a2, b5) => _compareArrays(_getSelectorPriority(a2), _getSelectorPriority(b5)));
51723
51728
  break;
51724
51729
  }
51725
51730
  case "combinator": {
51726
- normalize2(selector2.left);
51731
+ normalize2(selector3.left);
51727
51732
  break;
51728
51733
  }
51729
51734
  case "list": {
51730
- selector2.list.forEach(normalize2);
51731
- selector2.list.sort((a2, b5) => serialize2(a2) < serialize2(b5) ? -1 : 1);
51735
+ selector3.list.forEach(normalize2);
51736
+ selector3.list.sort((a2, b5) => serialize2(a2) < serialize2(b5) ? -1 : 1);
51732
51737
  break;
51733
51738
  }
51734
51739
  }
51735
- return selector2;
51740
+ return selector3;
51736
51741
  }
51737
- function _getSelectorPriority(selector2) {
51738
- switch (selector2.type) {
51742
+ function _getSelectorPriority(selector3) {
51743
+ switch (selector3.type) {
51739
51744
  case "universal":
51740
51745
  return [1];
51741
51746
  case "tag":
@@ -51743,13 +51748,13 @@ function _getSelectorPriority(selector2) {
51743
51748
  case "id":
51744
51749
  return [2];
51745
51750
  case "class":
51746
- return [3, selector2.name];
51751
+ return [3, selector3.name];
51747
51752
  case "attrPresence":
51748
- return [4, serialize2(selector2)];
51753
+ return [4, serialize2(selector3)];
51749
51754
  case "attrValue":
51750
- return [5, serialize2(selector2)];
51755
+ return [5, serialize2(selector3)];
51751
51756
  case "combinator":
51752
- return [15, serialize2(selector2)];
51757
+ return [15, serialize2(selector3)];
51753
51758
  }
51754
51759
  }
51755
51760
  function compareSpecificity(a2, b5) {
@@ -55218,11 +55223,11 @@ function getOrderedListIndexFunction(olType = "1") {
55218
55223
  function splitClassesAndIds(selectors) {
55219
55224
  const classes = [];
55220
55225
  const ids = [];
55221
- for (const selector2 of selectors) {
55222
- if (selector2.startsWith(".")) {
55223
- classes.push(selector2.substring(1));
55224
- } else if (selector2.startsWith("#")) {
55225
- ids.push(selector2.substring(1));
55226
+ for (const selector3 of selectors) {
55227
+ if (selector3.startsWith(".")) {
55228
+ classes.push(selector3.substring(1));
55229
+ } else if (selector3.startsWith("#")) {
55230
+ ids.push(selector3.substring(1));
55226
55231
  }
55227
55232
  }
55228
55233
  return { classes, ids };
@@ -55316,7 +55321,7 @@ function convert(html, options = {}, metadata = undefined) {
55316
55321
  }
55317
55322
  function handleDeprecatedOptions(options) {
55318
55323
  if (options.tags) {
55319
- const tagDefinitions = Object.entries(options.tags).map(([selector2, definition]) => ({ ...definition, selector: selector2 || "*" }));
55324
+ const tagDefinitions = Object.entries(options.tags).map(([selector3, definition]) => ({ ...definition, selector: selector3 || "*" }));
55320
55325
  options.selectors.push(...tagDefinitions);
55321
55326
  options.selectors = mergeDuplicatesPreferLast(options.selectors, (s3) => s3.selector);
55322
55327
  }
@@ -70862,6 +70867,15 @@ class AtomIOLogger2 {
70862
70867
  };
70863
70868
  }
70864
70869
 
70870
+ // ../../packages/atom.io/src/main/selector.ts
70871
+ init_internal();
70872
+ function selector2(options) {
70873
+ return createStandaloneSelector(IMPLICIT.STORE, options);
70874
+ }
70875
+ function selectorFamily2(options) {
70876
+ return createSelectorFamily(IMPLICIT.STORE, options);
70877
+ }
70878
+
70865
70879
  // ../../packages/atom.io/src/main/set-state.ts
70866
70880
  init_internal();
70867
70881
  function setState(...params) {
@@ -88150,6 +88164,7 @@ function resolveRoomScript(name2) {
88150
88164
 
88151
88165
  // src/backend/websockets.ts
88152
88166
  init_tempest_db_schema();
88167
+ init_env();
88153
88168
 
88154
88169
  // src/library/room-names.ts
88155
88170
  var roomNames = [
@@ -88185,6 +88200,10 @@ var cpuCountAtom = atom2({
88185
88200
  }
88186
88201
  ]
88187
88202
  });
88203
+ var isAdminAtom = atom2({
88204
+ key: `isAdmin`,
88205
+ default: false
88206
+ });
88188
88207
 
88189
88208
  // src/library/username-state.ts
88190
88209
  init_drizzle_orm();
@@ -88248,6 +88267,15 @@ var sessionMiddleware = async (handshake) => {
88248
88267
  }
88249
88268
  return `user::${user.id}`;
88250
88269
  };
88270
+ var roomAdminsSelectors = selectorFamily2({
88271
+ key: `roomAdmins`,
88272
+ get: (userKey) => ({ get: get2 }) => {
88273
+ const userName = get2(usernameAtoms, userKey);
88274
+ if (userName === env2.ROOT_USERNAME)
88275
+ return true;
88276
+ return false;
88277
+ }
88278
+ });
88251
88279
  var serveSocket = (config3) => {
88252
88280
  const { socket, consumer } = config3;
88253
88281
  socket.onAny((event, ...args2) => {
@@ -88260,6 +88288,7 @@ var serveSocket = (config3) => {
88260
88288
  const provideFamily = realtimeAtomFamilyProvider(config3);
88261
88289
  const mutualsSelector = findState(mutualUsersSelector2, consumer);
88262
88290
  const unsubFunctions = [
88291
+ provideState(isAdminAtom, findState(roomAdminsSelectors, consumer)),
88263
88292
  provideState(cpuCountAtom),
88264
88293
  provideFamily(usernameAtoms, mutualsSelector),
88265
88294
  provideRooms({
@@ -88267,7 +88296,8 @@ var serveSocket = (config3) => {
88267
88296
  userKey: consumer,
88268
88297
  store: IMPLICIT.STORE,
88269
88298
  roomNames,
88270
- resolveRoomScript
88299
+ resolveRoomScript,
88300
+ roomAdminsToken: roomAdminsSelectors
88271
88301
  })
88272
88302
  ];
88273
88303
  const rawUserId = consumer.replace(/^user::/, ``);
@@ -13042,12 +13042,14 @@ function destroyRoom({
13042
13042
  };
13043
13043
  }
13044
13044
  function provideRooms({
13045
- store = IMPLICIT.STORE,
13046
- socket,
13047
13045
  resolveRoomScript,
13046
+ roomAdminsToken,
13048
13047
  roomNames,
13048
+ socket,
13049
+ store = IMPLICIT.STORE,
13049
13050
  userKey
13050
13051
  }) {
13052
+ const isAdmin = getFromStore(store, roomAdminsToken, userKey);
13051
13053
  const roomSocket = guardSocket2(socket, createRoomSocketGuard(roomNames));
13052
13054
  const exposeMutable = realtimeMutableProvider({
13053
13055
  socket,
@@ -13077,8 +13079,10 @@ function provideRooms({
13077
13079
  enterRoom(userRoomKey);
13078
13080
  break;
13079
13081
  }
13080
- roomSocket.on(`createRoom`, spawnRoom({ store, socket, userKey, resolveRoomScript }));
13081
- roomSocket.on(`deleteRoom`, destroyRoom({ store, socket, userKey }));
13082
+ if (isAdmin) {
13083
+ roomSocket.on(`createRoom`, spawnRoom({ store, socket, userKey, resolveRoomScript }));
13084
+ roomSocket.on(`deleteRoom`, destroyRoom({ store, socket, userKey }));
13085
+ }
13082
13086
  return () => {
13083
13087
  unsubFromRoomKeys();
13084
13088
  unsubFromUsersInRooms();
@@ -15280,6 +15284,7 @@ var init_env = __esm(() => {
15280
15284
  env2 = createEnv({
15281
15285
  isServer: IS_SERVER,
15282
15286
  server: {
15287
+ ROOT_USERNAME: str,
15283
15288
  CI: type(`string | undefined`).pipe(Boolean),
15284
15289
  POSTGRES_USER: str,
15285
15290
  POSTGRES_PASSWORD: str,
@@ -13021,12 +13021,14 @@ function destroyRoom({
13021
13021
  };
13022
13022
  }
13023
13023
  function provideRooms({
13024
- store = IMPLICIT.STORE,
13025
- socket,
13026
13024
  resolveRoomScript,
13025
+ roomAdminsToken,
13027
13026
  roomNames,
13027
+ socket,
13028
+ store = IMPLICIT.STORE,
13028
13029
  userKey
13029
13030
  }) {
13031
+ const isAdmin = getFromStore(store, roomAdminsToken, userKey);
13030
13032
  const roomSocket = guardSocket(socket, createRoomSocketGuard(roomNames));
13031
13033
  const exposeMutable = realtimeMutableProvider({
13032
13034
  socket,
@@ -13056,8 +13058,10 @@ function provideRooms({
13056
13058
  enterRoom(userRoomKey);
13057
13059
  break;
13058
13060
  }
13059
- roomSocket.on(`createRoom`, spawnRoom({ store, socket, userKey, resolveRoomScript }));
13060
- roomSocket.on(`deleteRoom`, destroyRoom({ store, socket, userKey }));
13061
+ if (isAdmin) {
13062
+ roomSocket.on(`createRoom`, spawnRoom({ store, socket, userKey, resolveRoomScript }));
13063
+ roomSocket.on(`deleteRoom`, destroyRoom({ store, socket, userKey }));
13064
+ }
13061
13065
  return () => {
13062
13066
  unsubFromRoomKeys();
13063
13067
  unsubFromUsersInRooms();
@@ -13557,6 +13561,7 @@ var init_env = __esm(() => {
13557
13561
  env2 = createEnv({
13558
13562
  isServer: IS_SERVER,
13559
13563
  server: {
13564
+ ROOT_USERNAME: str,
13560
13565
  CI: type(`string | undefined`).pipe(Boolean),
13561
13566
  POSTGRES_USER: str,
13562
13567
  POSTGRES_PASSWORD: str,
@@ -13905,6 +13905,7 @@ var optionalBool = type(`"true" | "false" | undefined`).pipe((s) => s === `true`
13905
13905
  var env2 = createEnv({
13906
13906
  isServer: IS_SERVER,
13907
13907
  server: {
13908
+ ROOT_USERNAME: str,
13908
13909
  CI: type(`string | undefined`).pipe(Boolean),
13909
13910
  POSTGRES_USER: str,
13910
13911
  POSTGRES_PASSWORD: str,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "tempest.games",
3
- "version": "0.3.8",
3
+ "version": "0.3.10",
4
4
  "publishConfig": {
5
5
  "access": "public"
6
6
  },
@@ -50,7 +50,7 @@
50
50
  "socket.io-client": "4.8.3",
51
51
  "three": "0.182.0",
52
52
  "three-stdlib": "2.36.1",
53
- "atom.io": "0.46.15",
53
+ "atom.io": "0.46.16",
54
54
  "safedeposit": "0.1.2",
55
55
  "treetrunks": "0.1.5"
56
56
  },
@@ -76,8 +76,8 @@
76
76
  "vite": "7.3.0",
77
77
  "vite-tsconfig-paths": "6.0.3",
78
78
  "vitest": "4.0.16",
79
- "flightdeck": "0.3.35",
80
- "varmint": "0.5.11"
79
+ "varmint": "0.5.11",
80
+ "flightdeck": "0.3.36"
81
81
  },
82
82
  "scripts": {
83
83
  "dev": "bun run env:dev && concurrently \"bun:dev:*\"",