@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 +2 -0
- package/package.json +4 -2
- package/src/index.js +1 -1
- package/src/protocol.js +45 -4
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.
|
|
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": {
|
|
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
|
-
/**
|
|
50
|
-
|
|
51
|
-
|
|
52
|
-
|
|
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.
|