@magicworks/client-party-game 0.1.0-rc.4 → 0.1.0-rc.6

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.
Files changed (52) hide show
  1. package/README.md +18 -3
  2. package/dist/client.d.ts +37 -39
  3. package/dist/client.d.ts.map +1 -1
  4. package/dist/client.js +160 -183
  5. package/dist/client.js.map +1 -1
  6. package/dist/connection.d.ts +158 -0
  7. package/dist/connection.d.ts.map +1 -0
  8. package/dist/connection.js +375 -0
  9. package/dist/connection.js.map +1 -0
  10. package/dist/protocol/codes.d.ts +29 -0
  11. package/dist/protocol/codes.d.ts.map +1 -0
  12. package/dist/protocol/codes.js +56 -0
  13. package/dist/protocol/codes.js.map +1 -0
  14. package/dist/protocol/events.d.ts +129 -0
  15. package/dist/protocol/events.d.ts.map +1 -0
  16. package/dist/protocol/events.js +131 -0
  17. package/dist/protocol/events.js.map +1 -0
  18. package/dist/protocol/index.d.ts +25 -0
  19. package/dist/protocol/index.d.ts.map +1 -0
  20. package/dist/protocol/index.js +41 -0
  21. package/dist/protocol/index.js.map +1 -0
  22. package/dist/protocol/limits.d.ts +40 -0
  23. package/dist/protocol/limits.d.ts.map +1 -0
  24. package/dist/protocol/limits.js +43 -0
  25. package/dist/protocol/limits.js.map +1 -0
  26. package/dist/protocol/messages.d.ts +294 -0
  27. package/dist/protocol/messages.d.ts.map +1 -0
  28. package/dist/protocol/messages.js +3 -0
  29. package/dist/protocol/messages.js.map +1 -0
  30. package/dist/protocol/placement.d.ts +63 -0
  31. package/dist/protocol/placement.d.ts.map +1 -0
  32. package/dist/protocol/placement.js +82 -0
  33. package/dist/protocol/placement.js.map +1 -0
  34. package/dist/protocol/routing.d.ts +26 -0
  35. package/dist/protocol/routing.d.ts.map +1 -0
  36. package/dist/protocol/routing.js +19 -0
  37. package/dist/protocol/routing.js.map +1 -0
  38. package/dist/protocol/scoring.d.ts +7 -0
  39. package/dist/protocol/scoring.d.ts.map +1 -0
  40. package/dist/protocol/scoring.js +13 -0
  41. package/dist/protocol/scoring.js.map +1 -0
  42. package/dist/protocol/speedtest.d.ts +9 -0
  43. package/dist/protocol/speedtest.d.ts.map +1 -0
  44. package/dist/protocol/speedtest.js +22 -0
  45. package/dist/protocol/speedtest.js.map +1 -0
  46. package/dist/socket.d.ts +4 -2
  47. package/dist/socket.d.ts.map +1 -1
  48. package/package.json +1 -1
  49. package/dist/protocol.d.ts +0 -509
  50. package/dist/protocol.d.ts.map +0 -1
  51. package/dist/protocol.js +0 -262
  52. package/dist/protocol.js.map +0 -1
package/README.md CHANGED
@@ -10,8 +10,10 @@ Host TV client and wire protocol for the multiplayer party games (Name the Artis
10
10
 
11
11
  - Opens, reopens and re-attaches to rooms, remembering the last room code so *Play again* within 20 minutes keeps the same phones
12
12
  - Reaches a room in its own region: codes say which region holds them (`PARTY_REGIONS`), and with `regionUrls` the client connects for a code to that region's servers. Only opening a new room goes to the global, latency-routed `url`
13
- - Routes by room: every connection made for a room carries its code in the `c` query parameter, which the load balancer uses to reach the server holding the room. A connection made before a room exists reconnects with the code once it has one, during the lobby, where the reconnect costs nothing
14
- - Retries on another server when one is draining for a deploy (`host:create` refused with `reason: 'draining'`)
13
+ - Asks where to connect before every socket (`GET /party/placement`, with the global `fetch` or the `fetch` option): for the room's code, which reaches the room's server, or for a new room, which reaches any server taking parties. The socket then carries that server's prefix in the `c` query parameter, so the load balancer sends every request of it to that server
14
+ - Starts on long polling and upgrades to WebSocket where the network allows, so it works on networks that block WebSockets
15
+ - Reconnects itself, asking where again each time. A room's server that stops answering is tried again 1s, 3s, 5s, 10s and 15s after the connection dropped (`roomRetryMs`, ±10%), each try allowed 4s (`placementTimeoutMs`). Another server is asked alongside the last try, and if the room's server still fails, the TV opens a new room on that server: about 15s after the drop if the room's server's requests fail fast, about 21s if they hang. If no server answers, it's this TV that is offline, and it keeps waiting for the room
16
+ - Retries on another server when one is draining for a deploy or refuses a placement, sending the servers it failed to reach so placement avoids them
15
17
  - Holds host calls while a reconnect re-attaches, so nothing reaches the server from a socket it doesn't know the room of
16
18
  - Measures the clock offset to the server NTP-style (fastest of 5 pings, every 60s), for starting rounds at an agreed moment
17
19
  - Follows its room between servers: when a draining server asks (`room:move`), the client takes the room to a server still taking parties and opens it there under a new code. The phones follow on their own, and host calls made meanwhile wait and are sent to the new server. It also follows `movedTo` when it asks for a room by an old code
@@ -19,6 +21,16 @@ Host TV client and wire protocol for the multiplayer party games (Name the Artis
19
21
  - `restart()` on a server past its drain deadline opens a fresh room elsewhere; the phones have to scan the new code
20
22
  - Plays `namethesong`, `nametheartist` or `namethesongandartist` (`PartyGameType`). A round's options can carry a `detail` under their `label`: the artist, in Name the Song and Artist
21
23
 
24
+ ## Source
25
+
26
+ | File | What it does |
27
+ |------|--------------|
28
+ | `src/client.ts` | `PartyGameClient`: the session, the game's calls and the room's messages |
29
+ | `src/connection.ts` | `PartyConnection`: placing each socket, reconnecting, and holding host calls until the room is attached |
30
+ | `src/protocol/` | The wire protocol, shared with the server and the phone page: codes, events, messages, placement, limits, scoring |
31
+ | `src/socket.ts` | The little of a socket.io client socket the client uses |
32
+ | `test/` | Tests, mirroring `src/` |
33
+
22
34
  ## Reference
23
35
 
24
36
  | Type | Function | Arguments | Returns | Description |
@@ -87,9 +99,12 @@ const results = await client.endRound();
87
99
  |--------|------|----------|-------------|
88
100
  | url | string | Yes | The party servers' global, latency-routed URL (`party-ws.<stage>.cat.roxi.tv`), not the phone page's: where a new room opens |
89
101
  | regionUrls | Record\<string, string\> | No | Each region's own URL. A room is reached at its code's region (`PARTY_REGIONS`), so a TV that latency routing sends to another region still finds its room. Without it, everything goes to `url` |
102
+ | fetch | `PartyFetch` | No | How placement is asked. The global `fetch` by default |
90
103
  | io | PartySocketFactory | Yes | socket.io-client's `io`, either major version |
91
104
  | hostId | string | No | Identifies this TV across its connections; one per process by default |
92
105
  | roomMemory | RoomMemory | No | Where the last room code is kept; in memory by default |
93
106
  | logger | PartyLogger | No | `debug` and `warn`; `console` by default |
94
- | ackTimeoutMs | number | No | How long to wait for any answer from the server (8000) |
107
+ | ackTimeoutMs | number | No | How long to wait for any answer from the server but placement (8000) |
108
+ | placementTimeoutMs | number | No | How long a placement request has (4000) |
109
+ | roomRetryMs | number[] | No | When a lost room's server is tried again, in ms since the loss (`[1000, 3000, 5000, 10000, 15000]`); then the room is given up on if another server answers |
95
110
  | clockSyncIntervalMs | number | No | How often the clock offset is measured again (60000) |
package/dist/client.d.ts CHANGED
@@ -1,5 +1,7 @@
1
- import { type HostRestoreRequest, type PartyGameType, type PartyHostSession, type PartyPlayer, type PartyRoundConfig, type PartyRoundGo, type PartyRoundResults } from './protocol';
1
+ import { type PartyLogger } from './connection';
2
+ import { type HostRestoreRequest, type PartyFetch, type PartyGameType, type PartyHostSession, type PartyPlayer, type PartyRoundConfig, type PartyRoundGo, type PartyRoundResults } from './protocol';
2
3
  import type { PartySocketFactory } from './socket';
4
+ export type { PartyLogger } from './connection';
3
5
  /**
4
6
  * Where the last room this app hosted is remembered, past one client being
5
7
  * closed and the next one made.
@@ -15,10 +17,6 @@ export interface RoomMemory {
15
17
  get(): string | null;
16
18
  set(code: string): void;
17
19
  }
18
- export interface PartyLogger {
19
- debug(...args: unknown[]): void;
20
- warn(...args: unknown[]): void;
21
- }
22
20
  export interface PartyGameClientOptions {
23
21
  /**
24
22
  * The party servers' global name, e.g. `https://party-ws.prod.cat.roxi.tv`:
@@ -28,11 +26,18 @@ export interface PartyGameClientOptions {
28
26
  /**
29
27
  * Each region's own name, e.g. `{ 'eu-west-1': 'https://party-ws.prod-eu-west-1.cat.roxi.tv' }`.
30
28
  * A room is reached at its code's region (see PARTY_REGIONS) wherever the
31
- * global name would send this TV now. Without it, everything goes to `url`.
29
+ * global name would send this TV now. The servers say where each region is
30
+ * when a room opens (PartyRouting), which takes over from this: it is only
31
+ * for servers from before they did. Without either, everything goes to `url`.
32
32
  */
33
33
  regionUrls?: Record<string, string>;
34
34
  /** socket.io-client's `io`: see `PartySocketFactory`. */
35
35
  io: PartySocketFactory;
36
+ /**
37
+ * How placement is asked (see PLACEMENT_PATH): the global `fetch` by
38
+ * default, which React Native and the browsers have.
39
+ */
40
+ fetch?: PartyFetch;
36
41
  /**
37
42
  * Which TV this is. The server will not hand a room to another TV while its
38
43
  * host is connected, and a connection closed on the way into the next lobby
@@ -43,10 +48,26 @@ export interface PartyGameClientOptions {
43
48
  /** In memory, for as long as this module is loaded, by default. */
44
49
  roomMemory?: RoomMemory;
45
50
  logger?: PartyLogger;
46
- /** How long to wait on the server's answer to anything. */
51
+ /** How long to wait on the server's answer to anything but placement. */
47
52
  ackTimeoutMs?: number;
53
+ /**
54
+ * How long a placement request has (see PLACEMENT_PATH): 4s by default. A
55
+ * tiny GET, answered in a few hundred ms; this much allows for a cold HTTPS
56
+ * connection on a poor link. Short, so a room's server that has gone - whose
57
+ * requests hang rather than fail - is found out in time to keep to
58
+ * `roomRetryMs`.
59
+ */
60
+ placementTimeoutMs?: number;
48
61
  /** How often the clock offset to the server is measured again. */
49
62
  clockSyncIntervalMs?: number;
63
+ /**
64
+ * When a room's server is tried again once the connection to it is lost:
65
+ * ms since the loss, 1s, 3s, 5s, 10s and 15s by default. Once every try has
66
+ * failed the client gives up on the room and opens a new one elsewhere - if
67
+ * another server answers, so a TV that is offline itself keeps its room.
68
+ * See PartyConnection.placeFor.
69
+ */
70
+ roomRetryMs?: readonly number[];
50
71
  }
51
72
  type PlayersListener = (players: PartyPlayer[]) => void;
52
73
  type AllAnsweredListener = (round: number) => void;
@@ -61,32 +82,18 @@ type SessionListener = (session: PartyHostSession) => void;
61
82
  * so navigating from the lobby into the first round keeps the same room and
62
83
  * the same players.
63
84
  *
64
- * Rooms live in the memory of one server of several, and the load balancer
65
- * finds it by the room code: every connection made for a room carries its
66
- * code (ROUTING_QUERY_KEY). A connection made before there is a room goes to
67
- * any server, so once that server has opened one the client connects again
68
- * with its code - in the lobby, where a moment's reconnect costs nothing,
69
- * rather than leaving the game on a route the load balancer can take away.
85
+ * Rooms live in the memory of one server of several. Reaching the room's -
86
+ * placing each socket, and placing it again when it drops - is the
87
+ * connection's job: see PartyConnection.
70
88
  */
71
89
  export declare class PartyGameClient {
72
- private readonly url;
73
- private readonly regionUrls;
74
- private readonly io;
90
+ private readonly connection;
75
91
  private readonly hostId;
76
92
  private readonly roomMemory;
77
93
  private readonly logger;
78
- private readonly ackTimeoutMs;
79
94
  private readonly clockSyncIntervalMs;
80
- private socket;
81
- /** The room code the current socket was routed by, if any. */
82
- private routedCode;
83
- /**
84
- * Whether the current connection is attached to the session's room. Host
85
- * calls wait for it: sent while a reconnect is still re-attaching, they
86
- * would reach the server from a socket it does not know the room of.
87
- */
88
- private attached;
89
- private attachedWaiters;
95
+ /** Roster changes for a room this TV is about to be handed: see adopt. */
96
+ private earlyFlags;
90
97
  private session;
91
98
  /** Where the session's room is now, when a server has said it moved. */
92
99
  private redirectCode;
@@ -120,16 +127,9 @@ export declare class PartyGameClient {
120
127
  url: string;
121
128
  bytes: number;
122
129
  } | null;
123
- /** The socket for `code`'s room (or for no room), connecting a new one if need be. */
124
- private socketFor;
125
- private currentSocket;
126
- private setAttached;
127
- private whenAttached;
128
- /** Where `code`'s room is: its region's servers, or for no room, the nearest. */
129
- private urlFor;
130
- /** A socket routed by `code`, to `url` (by default, where `code`'s room is). */
131
- private connectTo;
132
- private openSocket;
130
+ /** Listens for the room's messages on a socket the connection has opened. */
131
+ private listen;
132
+ private setPlayers;
133
133
  /**
134
134
  * Back on the room we were already hosting, so a dropped connection
135
135
  * mid-party does not lose the players or their scores. If the room is gone
@@ -138,7 +138,6 @@ export declare class PartyGameClient {
138
138
  private reattach;
139
139
  /** Takes on a session the server has handed back, rerouting by its code if need be. */
140
140
  private adopt;
141
- private send;
142
141
  private emit;
143
142
  private moveRoom;
144
143
  /**
@@ -232,5 +231,4 @@ export declare class PartyGameClient {
232
231
  /** Leaves the room entirely - the next `host()` opens a fresh one. */
233
232
  close(): void;
234
233
  }
235
- export {};
236
234
  //# sourceMappingURL=client.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"client.d.ts","sourceRoot":"","sources":["../src/client.ts"],"names":[],"mappings":"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"}