@dotrino/lobby 0.1.5 → 0.3.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/README.md CHANGED
@@ -1,5 +1,7 @@
1
1
  # @dotrino/lobby
2
2
 
3
+ > **Parte del ecosistema [Dotrino](https://dotrino.com).** Dotrino es un ecosistema de aplicaciones centradas en la privacidad de los datos: tu información es tuya, y las decisiones sobre ella también — qué compartes, con quién, cuándo y por qué. Sin anuncios, sin cookies, sin rastreo de datos, sin vender tu identidad a nadie.
4
+
3
5
  **Lobby + matchmaking reciclable para cualquier juego del ecosistema Dotrino.**
4
6
 
5
7
  Resuelve, una sola vez y para todos los juegos, lo que el ajedrez, el chat y
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@dotrino/lobby",
3
- "version": "0.1.5",
3
+ "version": "0.3.0",
4
4
  "description": "Lobby + matchmaking reciclable para juegos del ecosistema Dotrino: salas, asientos, espectadores, motor de turnos autoritativo, reputación y contactos sobre el proxy/identity/reputation compartidos",
5
5
  "type": "module",
6
6
  "main": "src/index.js",
@@ -36,7 +36,9 @@
36
36
  "@dotrino/reputation": ">=0.3.0"
37
37
  },
38
38
  "peerDependenciesMeta": {
39
- "@dotrino/reputation": { "optional": true }
39
+ "@dotrino/reputation": {
40
+ "optional": true
41
+ }
40
42
  },
41
43
  "author": "seyacat",
42
44
  "license": "MIT",
package/src/index.js CHANGED
@@ -11,5 +11,5 @@ export {
11
11
  createRepGate, rankRooms, ratePlayer,
12
12
  receiptPayload, signReceiptHalf
13
13
  } from './reputation.js'
14
- export { K, discoveryChannel, roomChannel, envelope, parseEnvelope } from './protocol.js'
14
+ export { K, discoveryChannel, roomChannel, setLobbyHomeNode, envelope, parseEnvelope } from './protocol.js'
15
15
  export { Emitter, mulberry32, hashSeed, shuffle, normalizeSeats, samePubkey } from './util.js'
package/src/protocol.js CHANGED
@@ -46,10 +46,51 @@ export const K = {
46
46
  PONG: 'pong' // { ts }
47
47
  }
48
48
 
49
- /** Canal de descubrimiento de salas de un juego (lista tokens de hosts). */
50
- export const discoveryChannel = (gameId) => `cclobby/${gameId}`
51
- /** Canal de presencia de una sala concreta (host + guests publican aquí). */
52
- export const roomChannel = (gameId, roomId) => `ccroom/${gameId}/${roomId}`
49
+ /**
50
+ * NODO DUEÑO DE LOS CANALES.
51
+ *
52
+ * Un canal del proxio puede llevar delante el prefijo del nodo que lo hospeda
53
+ * (`<id de 12>/loquesea`). Ese nodo guarda la membresía y los demás le pasan las
54
+ * operaciones. Sin prefijo, cada proxio tiene su propia copia del canal — que es
55
+ * lo que hacía que dos personas en proxios distintos NO se vieran en la misma
56
+ * lista de salas, aunque los mensajes entre ellas sí cruzaran.
57
+ *
58
+ * El **canal de descubrimiento** es uno solo para todo el ecosistema, así que
59
+ * tiene que vivir en un nodo fijo: si cada quien lo publicara en el suyo,
60
+ * habría tantas listas de salas como proxios. Se fija con `setLobbyHomeNode()`
61
+ * pasándole el id del proxio elegido (se lee de `client.node`). Mientras no se
62
+ * fije, el descubrimiento es local a cada proxio.
63
+ */
64
+ const NODE_ID_LEN = 12
65
+ const isNodeId = (s) => new RegExp(`^[1-9A-Z]{${NODE_ID_LEN}}$`).test(String(s || ''))
66
+
67
+ // Sin valor por defecto: el id de un proxio se DERIVA de su llave, así que no
68
+ // hay ninguno que se pueda escribir aquí de antemano. Mientras no se fije, el
69
+ // canal de descubrimiento es local a cada proxio (comportamiento de siempre).
70
+ let LOBBY_HOME_NODE = null
71
+
72
+ /** Fija en qué proxio vive el canal de descubrimiento de salas. */
73
+ export function setLobbyHomeNode (nodeId) {
74
+ LOBBY_HOME_NODE = isNodeId(nodeId) ? nodeId : null
75
+ }
76
+
77
+ const withNode = (prefix, name) => (prefix ? `${prefix}/${name}` : name)
78
+
79
+ /** Canal de descubrimiento de salas de un juego (lista instancias de hosts). */
80
+ export const discoveryChannel = (gameId) => withNode(LOBBY_HOME_NODE, `cclobby/${gameId}`)
81
+
82
+ /**
83
+ * Canal de presencia de una sala concreta (host + guests publican aquí).
84
+ *
85
+ * Vive en el proxio DEL HOST, que se lee del propio `roomId`: el roomId es la
86
+ * instancia del host y las instancias llevan delante el prefijo de su nodo. Así
87
+ * la sala se hospeda donde está quien la abrió, sin que nadie tenga que
88
+ * declararlo ni acordarlo.
89
+ */
90
+ export const roomChannel = (gameId, roomId) => {
91
+ const id = String(roomId || '').slice(0, NODE_ID_LEN)
92
+ return withNode(isNodeId(id) ? id : null, `ccroom/${gameId}/${roomId}`)
93
+ }
53
94
 
54
95
  /**
55
96
  * Construye un sobre.