@dotrino/lobby 0.1.5 → 0.2.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.2.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,44 @@ 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
+ * (`P1/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 puede cambiar con
61
+ * `setLobbyHomeNode()` para una malla propia.
62
+ */
63
+ let LOBBY_HOME_NODE = 'P1'
64
+
65
+ /** Fija en qué proxio vive el canal de descubrimiento de salas. */
66
+ export function setLobbyHomeNode (prefix) {
67
+ LOBBY_HOME_NODE = /^[1-9A-Z]{2}$/.test(String(prefix || '')) ? prefix : null
68
+ }
69
+
70
+ const withNode = (prefix, name) => (prefix ? `${prefix}/${name}` : name)
71
+
72
+ /** Canal de descubrimiento de salas de un juego (lista instancias de hosts). */
73
+ export const discoveryChannel = (gameId) => withNode(LOBBY_HOME_NODE, `cclobby/${gameId}`)
74
+
75
+ /**
76
+ * Canal de presencia de una sala concreta (host + guests publican aquí).
77
+ *
78
+ * Vive en el proxio DEL HOST, que se lee del propio `roomId`: el roomId es la
79
+ * instancia del host y las instancias llevan delante el prefijo de su nodo. Así
80
+ * la sala se hospeda donde está quien la abrió, sin que nadie tenga que
81
+ * declararlo ni acordarlo.
82
+ */
83
+ export const roomChannel = (gameId, roomId) => {
84
+ const prefix = /^[1-9A-Z]{2}/.test(String(roomId || '')) ? String(roomId).slice(0, 2) : null
85
+ return withNode(prefix, `ccroom/${gameId}/${roomId}`)
86
+ }
53
87
 
54
88
  /**
55
89
  * Construye un sobre.