@diffenderfer-games/hub 2.0.0-next.0 → 2.0.0-next.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.
Files changed (293) hide show
  1. package/CHANGELOG.md +163 -0
  2. package/LICENSE +21 -21
  3. package/README.md +203 -139
  4. package/dist/auto.d.ts +8 -8
  5. package/dist/auto.js +3 -3
  6. package/dist/avatar-pixi.d.ts +165 -0
  7. package/dist/avatar-pixi.d.ts.map +1 -0
  8. package/dist/avatar-pixi.js +299 -0
  9. package/dist/avatar-pixi.js.map +1 -0
  10. package/dist/avatar-svg.d.ts +4 -0
  11. package/dist/avatar-svg.js +5 -0
  12. package/dist/avatar-three.d.ts +69 -0
  13. package/dist/avatar-three.d.ts.map +1 -0
  14. package/dist/avatar-three.js +49 -0
  15. package/dist/avatar-three.js.map +1 -0
  16. package/dist/avatar.d.ts +7 -0
  17. package/dist/avatar.js +500 -0
  18. package/dist/avatar.js.map +1 -0
  19. package/dist/daily.d.ts +2 -2
  20. package/dist/doctor/cli.mjs +119 -28
  21. package/dist/doctor/cli.mjs.map +1 -1
  22. package/dist/index.d.ts +8 -8
  23. package/dist/index.js +3 -3
  24. package/dist/input.d.ts +2 -2
  25. package/dist/input.js +2 -2
  26. package/dist/mp.d.ts +3 -3
  27. package/dist/race.d.ts +1 -1
  28. package/dist/rooms.d.ts +3 -3
  29. package/dist/rooms.js +1 -1
  30. package/dist/shared/animator.d.ts +104 -0
  31. package/dist/shared/animator.d.ts.map +1 -0
  32. package/dist/shared/art.js +1946 -0
  33. package/dist/shared/art.js.map +1 -0
  34. package/dist/shared/atlas.d.ts +138 -0
  35. package/dist/shared/atlas.d.ts.map +1 -0
  36. package/dist/shared/avatar.d.ts +123 -0
  37. package/dist/shared/avatar.d.ts.map +1 -0
  38. package/dist/shared/bridge.js +18 -4
  39. package/dist/shared/bridge.js.map +1 -1
  40. package/dist/shared/client-version.gen.js +1 -1
  41. package/dist/shared/daily.d.ts +145 -19
  42. package/dist/shared/daily.d.ts.map +1 -1
  43. package/dist/shared/daily.js +138 -25
  44. package/dist/shared/daily.js.map +1 -1
  45. package/dist/shared/defineProperty.js +39 -0
  46. package/dist/shared/describe.d.ts +32 -0
  47. package/dist/shared/describe.d.ts.map +1 -0
  48. package/dist/shared/describe.js +109 -0
  49. package/dist/shared/describe.js.map +1 -0
  50. package/dist/shared/globals.js +9 -42
  51. package/dist/shared/globals.js.map +1 -1
  52. package/dist/shared/index.d.ts +1122 -46
  53. package/dist/shared/index.d.ts.map +1 -1
  54. package/dist/shared/input.d.ts +74 -14
  55. package/dist/shared/input.d.ts.map +1 -1
  56. package/dist/shared/input.js +179 -25
  57. package/dist/shared/input.js.map +1 -1
  58. package/dist/shared/json-guards.js +48 -0
  59. package/dist/shared/json-guards.js.map +1 -0
  60. package/dist/shared/latest-state.js +1 -1
  61. package/dist/shared/live-canvas.js +62 -0
  62. package/dist/shared/live-canvas.js.map +1 -0
  63. package/dist/shared/mp.js +10 -2
  64. package/dist/shared/mp.js.map +1 -1
  65. package/dist/shared/multiplayer-types.d.ts +15 -2
  66. package/dist/shared/multiplayer-types.d.ts.map +1 -1
  67. package/dist/shared/overlays.js +800 -0
  68. package/dist/shared/overlays.js.map +1 -0
  69. package/dist/shared/page-stack.js +2 -1
  70. package/dist/shared/page-stack.js.map +1 -1
  71. package/dist/shared/pose-key.js +249 -0
  72. package/dist/shared/pose-key.js.map +1 -0
  73. package/dist/shared/race-types.d.ts +1 -1
  74. package/dist/shared/race.js +1 -1
  75. package/dist/shared/room-types.d.ts +28 -3
  76. package/dist/shared/room-types.d.ts.map +1 -1
  77. package/dist/shared/rooms.d.ts.map +1 -1
  78. package/dist/shared/rooms.js +23 -4
  79. package/dist/shared/rooms.js.map +1 -1
  80. package/dist/shared/runtime-opener.js +1 -1
  81. package/dist/shared/scene.d.ts +90 -0
  82. package/dist/shared/scene.d.ts.map +1 -0
  83. package/dist/shared/social.d.ts +90 -9
  84. package/dist/shared/social.d.ts.map +1 -1
  85. package/dist/shared/social.js +6 -1
  86. package/dist/shared/social.js.map +1 -1
  87. package/dist/shared/src.js +4563 -667
  88. package/dist/shared/src.js.map +1 -1
  89. package/dist/shared/svg-markup.js +2354 -0
  90. package/dist/shared/svg-markup.js.map +1 -0
  91. package/dist/shared/svg.js +27 -0
  92. package/dist/shared/svg.js.map +1 -0
  93. package/dist/shared/types.d.ts +174 -0
  94. package/dist/shared/types.d.ts.map +1 -0
  95. package/dist/shared/wire-types.d.ts +6 -2
  96. package/dist/shared/wire-types.d.ts.map +1 -1
  97. package/dist/social.d.ts +5 -5
  98. package/dist/social.js +2 -2
  99. package/dist/turns-rules.d.ts +2 -0
  100. package/dist/turns-rules.js +1 -0
  101. package/dist/turns.d.ts +61 -0
  102. package/dist/turns.d.ts.map +1 -0
  103. package/dist/turns.js +183 -0
  104. package/dist/turns.js.map +1 -0
  105. package/package.json +125 -89
  106. package/src/auto.ts +39 -39
  107. package/src/avatar/adapters/pixi-avatar.ts +73 -0
  108. package/src/avatar/adapters/pixi-crowd.ts +329 -0
  109. package/src/avatar/adapters/pixi-types.ts +84 -0
  110. package/src/avatar/adapters/three.ts +126 -0
  111. package/src/avatar/animator/animator.ts +285 -0
  112. package/src/avatar/animator/reactions.ts +44 -0
  113. package/src/avatar/animator/schedule.ts +73 -0
  114. package/src/avatar/art/beard.ts +49 -0
  115. package/src/avatar/art/glasses.ts +67 -0
  116. package/src/avatar/art/hair.ts +254 -0
  117. package/src/avatar/art/headwear.ts +75 -0
  118. package/src/avatar/art/index.ts +21 -0
  119. package/src/avatar/art/shape.ts +87 -0
  120. package/src/avatar/art-store.ts +36 -0
  121. package/src/avatar/atlas.ts +246 -0
  122. package/src/avatar/catalog-view.ts +14 -0
  123. package/src/avatar/colour.ts +109 -0
  124. package/src/avatar/describe.ts +79 -0
  125. package/src/avatar/face.ts +187 -0
  126. package/src/avatar/geom.ts +173 -0
  127. package/src/avatar/layout.ts +47 -0
  128. package/src/avatar/look-like.ts +52 -0
  129. package/src/avatar/outputs/bitmap.ts +75 -0
  130. package/src/avatar/outputs/canvas-paint.ts +177 -0
  131. package/src/avatar/outputs/canvas.ts +62 -0
  132. package/src/avatar/outputs/custom-element.ts +140 -0
  133. package/src/avatar/outputs/element.ts +58 -0
  134. package/src/avatar/outputs/live-canvas.ts +57 -0
  135. package/src/avatar/outputs/overlay-svg.ts +22 -0
  136. package/src/avatar/outputs/pose-key.ts +30 -0
  137. package/src/avatar/outputs/svg-markup.ts +113 -0
  138. package/src/avatar/outputs/svg.ts +41 -0
  139. package/src/avatar/overlays.ts +128 -0
  140. package/src/avatar/render/body.ts +116 -0
  141. package/src/avatar/render/colours.ts +81 -0
  142. package/src/avatar/render/compose.ts +320 -0
  143. package/src/avatar/render/context.ts +117 -0
  144. package/src/avatar/render/eyes.ts +78 -0
  145. package/src/avatar/render/eyewear.ts +118 -0
  146. package/src/avatar/render/frame.ts +73 -0
  147. package/src/avatar/render/head.ts +81 -0
  148. package/src/avatar/render/mouth.ts +86 -0
  149. package/src/avatar/render/props.ts +91 -0
  150. package/src/avatar/render/types.ts +93 -0
  151. package/src/avatar/render/walker-parts.ts +121 -0
  152. package/src/avatar/render/walker.ts +199 -0
  153. package/src/avatar/scene.ts +119 -0
  154. package/src/avatar-pixi.ts +20 -0
  155. package/src/avatar-svg.ts +21 -0
  156. package/src/avatar-three.ts +18 -0
  157. package/src/avatar.ts +63 -0
  158. package/src/core/avatar/avatar-cache.ts +95 -0
  159. package/src/core/avatar/avatar-ref.ts +34 -0
  160. package/src/core/avatar/avatar-types.ts +43 -0
  161. package/src/core/avatar/hub-avatar.ts +308 -0
  162. package/src/core/connection.ts +408 -299
  163. package/src/core/errors.ts +160 -147
  164. package/src/core/game-data.ts +40 -38
  165. package/src/core/hub-economy.ts +216 -179
  166. package/src/core/hub-progress.ts +269 -205
  167. package/src/core/hub.ts +352 -131
  168. package/src/core/menu-control.ts +61 -61
  169. package/src/core/offline/cloud-saves.ts +62 -0
  170. package/src/core/offline/events.ts +50 -50
  171. package/src/core/offline/favorites.ts +21 -21
  172. package/src/core/offline/hub-kinds/avatar-kind.ts +42 -0
  173. package/src/core/offline/hub-kinds/daily-kind.ts +68 -0
  174. package/src/core/offline/hub-kinds/economy-kinds.ts +86 -0
  175. package/src/core/offline/hub-kinds/game-fields.ts +2 -0
  176. package/src/core/offline/hub-kinds/index.ts +52 -0
  177. package/src/core/offline/hub-kinds/legacy-ops.ts +37 -0
  178. package/src/core/offline/hub-kinds/progress-kinds.ts +165 -0
  179. package/src/core/offline/hub-kinds/resume-kind.ts +108 -0
  180. package/src/core/offline/hub-kinds/saved-kind.ts +93 -0
  181. package/src/core/offline/kind-adapters.ts +48 -0
  182. package/src/core/offline/local-inventory.ts +64 -0
  183. package/src/core/offline/local-store.ts +304 -261
  184. package/src/core/offline/offline-api.ts +65 -0
  185. package/src/core/offline/outbox-entry.ts +59 -0
  186. package/src/core/offline/outbox-kinds.ts +78 -0
  187. package/src/core/offline/outbox-merge.ts +39 -0
  188. package/src/core/offline/outbox-replayer.ts +141 -0
  189. package/src/core/offline/outbox-store.ts +85 -0
  190. package/src/core/offline/outbox.ts +232 -0
  191. package/src/core/offline/queue.ts +126 -171
  192. package/src/core/offline/replay-lease.ts +87 -0
  193. package/src/core/offline/replay-policy.ts +52 -0
  194. package/src/core/page-account.ts +121 -0
  195. package/src/core/page.ts +87 -74
  196. package/src/core/rest/endpoint-types.ts +22 -22
  197. package/src/core/rest/rest-client.ts +163 -152
  198. package/src/core/rest/routes.gen.ts +144 -88
  199. package/src/core/resume/hub-resume.ts +286 -0
  200. package/src/core/resume/local-resume.ts +130 -0
  201. package/src/core/resume/resume-list.ts +65 -0
  202. package/src/core/resume/resume-request.ts +52 -0
  203. package/src/core/resume/resume-types.ts +64 -0
  204. package/src/core/saved/daily-saves.ts +196 -0
  205. package/src/core/saved/daily-seed.ts +16 -0
  206. package/src/core/saved/hub-saved.ts +221 -0
  207. package/src/core/saved/local-saved.ts +122 -0
  208. package/src/core/saved/saved-list.ts +129 -0
  209. package/src/core/saved/saved-open.ts +104 -0
  210. package/src/core/saved/saved-order.ts +49 -0
  211. package/src/core/saved/saved-types.ts +24 -0
  212. package/src/core/storage/json-guards.ts +80 -74
  213. package/src/core/storage/key-value.ts +66 -66
  214. package/src/core/ticket.ts +43 -43
  215. package/src/core/turns/hub-turns.ts +161 -0
  216. package/src/core/turns/turn-game.ts +510 -0
  217. package/src/core/turns/your-turn-buzz.ts +69 -0
  218. package/src/core/types.ts +134 -134
  219. package/src/core/version/client-version.gen.ts +2 -2
  220. package/src/core/version/hub-version.ts +62 -62
  221. package/src/core/version/semver.ts +97 -97
  222. package/src/daily/daily-system.ts +276 -161
  223. package/src/daily/page-daily.ts +36 -36
  224. package/src/daily/types.ts +105 -67
  225. package/src/daily.ts +10 -10
  226. package/src/doctor/checks.ts +86 -76
  227. package/src/doctor/cli.ts +101 -106
  228. package/src/doctor/hub-version-fetch.ts +43 -0
  229. package/src/doctor/tsconfig.json +12 -12
  230. package/src/doctor/world-check.ts +61 -0
  231. package/src/globals.ts +115 -110
  232. package/src/index.ts +68 -50
  233. package/src/input/device-state.ts +146 -146
  234. package/src/input/edges.ts +55 -55
  235. package/src/input/focus-ring.ts +13 -0
  236. package/src/input/gamepad.ts +61 -61
  237. package/src/input/input-events.ts +32 -32
  238. package/src/input/input-registry.ts +171 -164
  239. package/src/input/input-system.ts +406 -393
  240. package/src/input/legacy-controls.ts +64 -64
  241. package/src/input/modality.ts +122 -0
  242. package/src/input/nav-state.ts +200 -191
  243. package/src/input/navigator.ts +182 -171
  244. package/src/input/on-screen-controls.ts +101 -101
  245. package/src/input/page-control.ts +43 -43
  246. package/src/input/page-input.ts +193 -193
  247. package/src/input/player-remaps.ts +77 -77
  248. package/src/input/source-values.ts +116 -116
  249. package/src/input/spatial.ts +47 -47
  250. package/src/input/types.ts +331 -331
  251. package/src/input/zero-config.ts +164 -177
  252. package/src/input.ts +26 -22
  253. package/src/mp.ts +10 -10
  254. package/src/overlay/controls-panel.ts +163 -163
  255. package/src/overlay/dom.ts +46 -46
  256. package/src/overlay/layout-clusters.ts +162 -162
  257. package/src/overlay/layout-geometry.ts +136 -136
  258. package/src/overlay/layout.ts +203 -203
  259. package/src/overlay/listener-scope.ts +23 -23
  260. package/src/overlay/on-screen-keyboard.ts +137 -137
  261. package/src/overlay/overlay.ts +234 -208
  262. package/src/overlay/styles.ts +13 -12
  263. package/src/overlay/virtual-controls.ts +262 -262
  264. package/src/race.ts +10 -10
  265. package/src/realtime/bridge.ts +126 -121
  266. package/src/realtime/cross-bundle.ts +29 -29
  267. package/src/realtime/fallback-notice.ts +48 -48
  268. package/src/realtime/hub-link.ts +65 -65
  269. package/src/realtime/latest-state.ts +33 -33
  270. package/src/realtime/multiplayer-forwarder.ts +40 -28
  271. package/src/realtime/multiplayer-types.ts +66 -52
  272. package/src/realtime/page-runtime.ts +60 -60
  273. package/src/realtime/race-forwarder.ts +59 -59
  274. package/src/realtime/race-types.ts +132 -132
  275. package/src/realtime/room-types.ts +151 -125
  276. package/src/realtime/rooms-forwarder.ts +104 -79
  277. package/src/realtime/runtime-api.ts +74 -49
  278. package/src/realtime/runtime-opener.ts +61 -61
  279. package/src/realtime/social-forwarder.ts +77 -72
  280. package/src/realtime/social-types.ts +86 -78
  281. package/src/realtime/types.ts +54 -53
  282. package/src/realtime/wire-types.ts +79 -72
  283. package/src/realtime/world-types.ts +20 -0
  284. package/src/rooms.ts +10 -10
  285. package/src/social.ts +19 -18
  286. package/src/turns-kit/check-rules.ts +281 -0
  287. package/src/turns-rules.ts +12 -0
  288. package/src/turns.ts +14 -0
  289. package/src/types.ts +13 -13
  290. package/src/uistack/page-stack.ts +45 -45
  291. package/src/uistack/play-suspension.ts +82 -82
  292. package/src/uistack/types.ts +76 -76
  293. package/src/uistack/ui-stack.ts +144 -144
@@ -1,78 +1,86 @@
1
- /**
2
- * Friends, presence and notification shapes as games see them through
3
- * `hub.social`, `hub.presence` and `hub.notify`.
4
- */
5
- import type { ChatMode, FriendEntry, Invite, Party, Presence, PresenceInput } from '@diffenderfer-games/hub-contract';
6
-
7
- /** Online counts as a game sees them. */
8
- export interface SocialCounts {
9
- /** Everyone online on the site. */
10
- online: number;
11
- /** Players in the current game (0 on the catalog page). */
12
- inGame: number;
13
- /** My friends currently online. */
14
- friendsOnline: number;
15
- }
16
-
17
- /** Events `hub.social.on` delivers, name → payload. */
18
- export interface SocialEvents {
19
- /** The friends list changed. */
20
- friends: FriendEntry[];
21
- /** A friend's presence changed (`null` when they went offline). */
22
- presence: { userId: number; p: Presence | null };
23
- /** The online counts changed. */
24
- counts: SocialCounts;
25
- /** An invite arrived. */
26
- invite: Invite;
27
- /** My party changed (`null` when I left it). */
28
- party: Party | null;
29
- }
30
-
31
- /** Who to open a player card for. */
32
- export type PlayerRef = { userId: number } | { username: string };
33
-
34
- /** Options for the invite picker. */
35
- export interface OpenInviteOptions {
36
- /** Preselect this friend. */
37
- userId?: number;
38
- /** The game mode to invite to. */
39
- mode?: string;
40
- }
41
-
42
- /** `hub.presence`: what you're doing, shown to friends (privacy is automatic). */
43
- export interface HubPresenceApi {
44
- /** Report an activity, e.g. `{ kind: 'playing', detail: 'Level 3' }`. Coalesced; safe to call often. */
45
- set(presence: PresenceInput): void;
46
- /** Back to "in the menu". */
47
- clear(): void;
48
- }
49
-
50
- /** `hub.social`: friends and the hub's social dialogs. */
51
- export interface HubSocialApi {
52
- /** Open a player card (add friend, message, invite, block, report). */
53
- openPlayer(ref: PlayerRef): void;
54
- /** Open the hub menu on the Friends section. */
55
- openFriends(): void;
56
- /** Open the chat with a friend. */
57
- openChat(userId: number): void;
58
- /** Open the invite picker (current game by default). */
59
- openInvite(options?: OpenInviteOptions): void;
60
- /** Open the game-suggestion form and board. */
61
- openSuggest(): void;
62
- /** Open notification settings, optionally focused on a game's lobby bell. */
63
- openNotify(options?: { game?: string }): void;
64
- /** Friends with live presence. Rejects with `OfflineError` without the runtime. */
65
- friends(): Promise<FriendEntry[]>;
66
- /** Live counts; all zero until the runtime is up. */
67
- counts(): SocialCounts;
68
- /** The effective chat mode (with these players); `'off'` until the runtime is up. */
69
- chatMode(userIds?: number[]): ChatMode;
70
- /** Subscribe to social events; works before the runtime loads. Returns the unsubscribe function. */
71
- on<Name extends keyof SocialEvents>(event: Name, listener: (payload: SocialEvents[Name]) => void): () => void;
72
- }
73
-
74
- /** `hub.notify`: toast behaviour during intense play. */
75
- export interface HubNotifyApi {
76
- /** Quiet: toasts collapse into the menu badge; invites still show as a small pill. */
77
- setQuiet(isQuiet: boolean): void;
78
- }
1
+ /**
2
+ * Friends, presence and notification shapes as games see them through
3
+ * `hub.social`, `hub.presence` and `hub.notify`.
4
+ */
5
+ import type { ChatMode, FriendEntry, Invite, Party, Presence, PresenceInput } from '@diffenderfer-games/hub-contract';
6
+
7
+ /** Online counts as a game sees them. */
8
+ export interface SocialCounts {
9
+ /** Everyone online on the site. */
10
+ online: number;
11
+ /** Players in the current game (0 on the catalog page). */
12
+ inGame: number;
13
+ /** My friends currently online. */
14
+ friendsOnline: number;
15
+ }
16
+
17
+ /** Events `hub.social.on` delivers, name → payload. */
18
+ export interface SocialEvents {
19
+ /** The friends list changed. */
20
+ friends: FriendEntry[];
21
+ /** A friend's presence changed (`null` when they went offline). */
22
+ presence: { userId: number; p: Presence | null };
23
+ /** The online counts changed. */
24
+ counts: SocialCounts;
25
+ /** An invite arrived. */
26
+ invite: Invite;
27
+ /** My party changed (`null` when I left it). */
28
+ party: Party | null;
29
+ }
30
+
31
+ /** Who to open a player card for. */
32
+ export type PlayerRef = { userId: number } | { username: string };
33
+
34
+ /** Options for the invite picker. */
35
+ export interface OpenInviteOptions {
36
+ /** Preselect this friend. */
37
+ userId?: number;
38
+ /** The game mode to invite to. */
39
+ mode?: string;
40
+ }
41
+
42
+ /** `hub.presence`: what you're doing, shown to friends (privacy is automatic). */
43
+ export interface HubPresenceApi {
44
+ /** Report an activity, e.g. `{ kind: 'playing', detail: 'Level 3' }`. Coalesced; safe to call often. */
45
+ set(presence: PresenceInput): void;
46
+ /** Back to "in the menu". */
47
+ clear(): void;
48
+ }
49
+
50
+ /** `hub.social`: friends and the hub's social dialogs. */
51
+ export interface HubSocialApi {
52
+ /** Open a player card (add friend, message, invite, block, report). */
53
+ openPlayer(ref: PlayerRef): void;
54
+ /** Open the hub menu on the Friends section. */
55
+ openFriends(): void;
56
+ /** Open the chat with a friend. */
57
+ openChat(userId: number): void;
58
+ /** Open the invite picker (current game by default). */
59
+ openInvite(options?: OpenInviteOptions): void;
60
+ /** Open the game-suggestion form and board. */
61
+ openSuggest(): void;
62
+ /** Open notification settings, optionally focused on a game's lobby bell. */
63
+ openNotify(options?: { game?: string }): void;
64
+ /**
65
+ * Open "Play online": games waiting for a player, invites, tournaments and
66
+ * the quick 1v1 (feature version 4; a no-op on older runtimes).
67
+ */
68
+ openPlayOnline(): void;
69
+ /** Friends with live presence. Rejects with `OfflineError` without the runtime. */
70
+ friends(): Promise<FriendEntry[]>;
71
+ /** Live counts; all zero until the runtime is up. */
72
+ counts(): SocialCounts;
73
+ /** The effective chat mode (with these players); `'off'` until the runtime is up. */
74
+ chatMode(userIds?: number[]): ChatMode;
75
+ /** Subscribe to social events; works before the runtime loads. Returns the unsubscribe function. */
76
+ on<Name extends keyof SocialEvents>(event: Name, listener: (payload: SocialEvents[Name]) => void): () => void;
77
+ }
78
+
79
+ /** What feature version 4 added to `hub.social`. */
80
+ export type PlayOnlineMethods = Pick<HubSocialApi, 'openPlayOnline'>;
81
+
82
+ /** `hub.notify`: toast behaviour during intense play. */
83
+ export interface HubNotifyApi {
84
+ /** Quiet: toasts collapse into the menu badge; invites still show as a small pill. */
85
+ setQuiet(isQuiet: boolean): void;
86
+ }
@@ -1,53 +1,54 @@
1
- /**
2
- * Every public realtime type in one place: the realtime API the social
3
- * runtime implements, the shapes `hub.social`, `hub.mp`, `hub.rooms` and
4
- * `hub.race` use, and the contract entities they carry. Types only.
5
- */
6
- export type {
7
- Audience,
8
- ChatMode,
9
- Conversation,
10
- Counts,
11
- ErrorBody,
12
- FriendEntry,
13
- Invite,
14
- JoinInfo,
15
- Launch,
16
- LaunchTicket,
17
- Message,
18
- MessagesPage,
19
- NotifyChange,
20
- NotifyPrefs,
21
- Party,
22
- PlayerCard,
23
- PlayerLite,
24
- Presence,
25
- PresenceInput,
26
- PresenceKind,
27
- RaceOutcome,
28
- RaceParams,
29
- RaceRecord,
30
- RaceResult,
31
- RaceState,
32
- RaceStats,
33
- RaceStatValue,
34
- Racer,
35
- RacerResult,
36
- RacerState,
37
- RecentPlayer,
38
- Relation,
39
- ReportInput,
40
- ReportKind,
41
- ReportReason,
42
- RoomInfo,
43
- SocialConfig,
44
- SocialMe,
45
- Suggestion,
46
- SuggestionStatus,
47
- } from '@diffenderfer-games/hub-contract';
48
- export type * from './wire-types';
49
- export type * from './social-types';
50
- export type * from './multiplayer-types';
51
- export type * from './room-types';
52
- export type * from './race-types';
53
- export type { RealtimeApi } from './runtime-api';
1
+ /**
2
+ * Every public realtime type in one place: the realtime API the social
3
+ * runtime implements, the shapes `hub.social`, `hub.mp`, `hub.rooms` and
4
+ * `hub.race` use, and the contract entities they carry. Types only.
5
+ */
6
+ export type {
7
+ Audience,
8
+ ChatMode,
9
+ Conversation,
10
+ Counts,
11
+ ErrorBody,
12
+ FriendEntry,
13
+ Invite,
14
+ JoinInfo,
15
+ Launch,
16
+ LaunchTicket,
17
+ Message,
18
+ MessagesPage,
19
+ NotifyChange,
20
+ NotifyPrefs,
21
+ Party,
22
+ PlayerCard,
23
+ PlayerLite,
24
+ Presence,
25
+ PresenceInput,
26
+ PresenceKind,
27
+ RaceOutcome,
28
+ RaceParams,
29
+ RaceRecord,
30
+ RaceResult,
31
+ RaceState,
32
+ RaceStats,
33
+ RaceStatValue,
34
+ Racer,
35
+ RacerResult,
36
+ RacerState,
37
+ RecentPlayer,
38
+ Relation,
39
+ ReportInput,
40
+ ReportKind,
41
+ ReportReason,
42
+ RoomInfo,
43
+ SocialConfig,
44
+ SocialMe,
45
+ Suggestion,
46
+ SuggestionStatus,
47
+ } from '@diffenderfer-games/hub-contract';
48
+ export type * from './wire-types';
49
+ export type * from './social-types';
50
+ export type * from './multiplayer-types';
51
+ export type * from './room-types';
52
+ export type * from './race-types';
53
+ export type { RealtimeApi } from './runtime-api';
54
+ export type { RuntimeWorldApi, WorldEventName, WorldOpName } from './world-types';
@@ -1,72 +1,79 @@
1
- /**
2
- * The `/_ws` wire shapes the realtime runtime and the forwarders share,
3
- * derived from the hub contract so they can never drift from what the server
4
- * sends. Types only: nothing here costs a byte at runtime.
5
- */
6
- import type {
7
- EventData,
8
- events,
9
- OpAck,
10
- ops,
11
- InviteCreated as InviteCreatedSchema,
12
- RaceHistory as RaceHistorySchema,
13
- RaceResultPlayer as RaceResultPlayerSchema,
14
- RaceRecordPlayer as RaceRecordPlayerSchema,
15
- RoomSeat as RoomSeatSchema,
16
- } from '@diffenderfer-games/hub-contract';
17
-
18
- /** The parsed (output) type of a contract schema, without importing zod. */
19
- export type SchemaOutput<Schema> = Schema extends { readonly _zod: { readonly output: infer Output } } ? Output : never;
20
-
21
- /** Every server event, name → payload (the contract's `events`). */
22
- export type ServerEvents = { [Name in keyof typeof events]: EventData<(typeof events)[Name]> };
23
-
24
- /** The `hello` ack: everything the Friends drawer needs in one round-trip. */
25
- export type Snapshot = OpAck<(typeof ops)['hello']>;
26
-
27
- /** A generic server notice rendered as a toast (`ev:notice`). */
28
- export type Notice = ServerEvents['notice'];
29
-
30
- /** A seat in a hub room. */
31
- export type RoomSeat = SchemaOutput<typeof RoomSeatSchema>;
32
-
33
- /** One racer's line in a decided race. */
34
- export type RaceResultPlayer = SchemaOutput<typeof RaceResultPlayerSchema>;
35
-
36
- /** A racer in a history record. Suspended opponents are `hidden` (id 0, no name). */
37
- export type RaceRecordPlayer = SchemaOutput<typeof RaceRecordPlayerSchema>;
38
-
39
- /** A page of the player's races, newest first (`GET /race/history`). */
40
- export type RaceHistory = SchemaOutput<typeof RaceHistorySchema>;
41
-
42
- /** `POST /mp/invites`: the invite plus the inviter's own launch. */
43
- export type InviteCreated = SchemaOutput<typeof InviteCreatedSchema>;
44
-
45
- /** A live status line from another racer (`ev:race.status`); `at` is ms since the go on the server clock. */
46
- export type RaceStatusEvent = ServerEvents['race.status'];
47
-
48
- /** A relayed game message (`ev:room.msg`). */
49
- export type RoomMessage = ServerEvents['room.msg'];
50
-
51
- /** A shared-state change (`ev:room.state`); patches are shallow-merged unless `replace`. */
52
- export type RoomStateChange = ServerEvents['room.state'];
53
-
54
- /** A moderated room chat line (`ev:room.chat`). */
55
- export type RoomChatLine = ServerEvents['room.chat'];
56
-
57
- /**
58
- * What a rejected realtime call throws. The runtime is another bundle, so its
59
- * errors are re-created as the game's own `HubError` classes by the forwarders.
60
- */
61
- export interface RealtimeErrorShape extends Error {
62
- /** HTTP status (REST), absent for transport and socket errors. */
63
- status?: number;
64
- /** The machine-readable code from the error body. */
65
- code?: string;
66
- /** Why content was rejected. */
67
- reason?: string;
68
- /** A player-facing hint. */
69
- hint?: string;
70
- /** How long to wait before retrying, when rate limited. */
71
- retryAfterMs?: number;
72
- }
1
+ /**
2
+ * The `/_ws` wire shapes the realtime runtime and the forwarders share,
3
+ * derived from the hub contract so they can never drift from what the server
4
+ * sends. Types only: nothing here costs a byte at runtime.
5
+ */
6
+ import type {
7
+ EventData,
8
+ events,
9
+ OpAck,
10
+ ops,
11
+ InviteCreated as InviteCreatedSchema,
12
+ InviteLink as InviteLinkSchema,
13
+ RaceHistory as RaceHistorySchema,
14
+ RaceResultPlayer as RaceResultPlayerSchema,
15
+ RaceRecordPlayer as RaceRecordPlayerSchema,
16
+ RoomSeat as RoomSeatSchema,
17
+ } from '@diffenderfer-games/hub-contract';
18
+
19
+ /** The parsed (output) type of a contract schema, without importing zod. */
20
+ export type SchemaOutput<Schema> = Schema extends { readonly _zod: { readonly output: infer Output } } ? Output : never;
21
+
22
+ /** Every server event, name → payload (the contract's `events`). */
23
+ export type ServerEvents = { [Name in keyof typeof events]: EventData<(typeof events)[Name]> };
24
+
25
+ /** The `hello` ack: everything the Friends drawer needs in one round-trip. */
26
+ export type Snapshot = OpAck<(typeof ops)['hello']>;
27
+
28
+ /** A generic server notice rendered as a toast (`ev:notice`). */
29
+ export type Notice = ServerEvents['notice'];
30
+
31
+ /** A seat in a hub room. */
32
+ export type RoomSeat = SchemaOutput<typeof RoomSeatSchema>;
33
+
34
+ /** One racer's line in a decided race. */
35
+ export type RaceResultPlayer = SchemaOutput<typeof RaceResultPlayerSchema>;
36
+
37
+ /** A racer in a history record. Suspended opponents are `hidden` (id 0, no name). */
38
+ export type RaceRecordPlayer = SchemaOutput<typeof RaceRecordPlayerSchema>;
39
+
40
+ /** A page of the player's races, newest first (`GET /race/history`). */
41
+ export type RaceHistory = SchemaOutput<typeof RaceHistorySchema>;
42
+
43
+ /** `POST /mp/invites`: the invite plus the inviter's own launch. */
44
+ export type InviteCreated = SchemaOutput<typeof InviteCreatedSchema>;
45
+
46
+ /** A live status line from another racer (`ev:race.status`); `at` is ms since the go on the server clock. */
47
+ export type RaceStatusEvent = ServerEvents['race.status'];
48
+
49
+ /** A relayed game message (`ev:room.msg`). */
50
+ export type RoomMessage = ServerEvents['room.msg'];
51
+
52
+ /** A shared-state change (`ev:room.state`); patches are shallow-merged unless `replace`. */
53
+ export type RoomStateChange = ServerEvents['room.state'];
54
+
55
+ /** A seat went away, came back or is gone (`ev:room.seat`). */
56
+ export type RoomSeatChange = ServerEvents['room.seat'];
57
+
58
+ /** A shareable invite link into a room (`POST /mp/links`). */
59
+ export type InviteLink = SchemaOutput<typeof InviteLinkSchema>;
60
+
61
+ /** A moderated room chat line (`ev:room.chat`). */
62
+ export type RoomChatLine = ServerEvents['room.chat'];
63
+
64
+ /**
65
+ * What a rejected realtime call throws. The runtime is another bundle, so its
66
+ * errors are re-created as the game's own `HubError` classes by the forwarders.
67
+ */
68
+ export interface RealtimeErrorShape extends Error {
69
+ /** HTTP status (REST), absent for transport and socket errors. */
70
+ status?: number;
71
+ /** The machine-readable code from the error body. */
72
+ code?: string;
73
+ /** Why content was rejected. */
74
+ reason?: string;
75
+ /** A player-facing hint. */
76
+ hint?: string;
77
+ /** How long to wait before retrying, when rate limited. */
78
+ retryAfterMs?: number;
79
+ }
@@ -0,0 +1,20 @@
1
+ /**
2
+ * The world over the runtime's socket (docs/plans/world.md §8.3): the
3
+ * `world.*` ops and events, typed from the contract. The hub's world client
4
+ * calls it; games don't need it.
5
+ */
6
+ import type { EventData, EventName, events, OpAck, OpInput, OpName, ops } from '@diffenderfer-games/hub-contract';
7
+
8
+ /** A `world.*` op name. */
9
+ export type WorldOpName = Extract<OpName, `world.${string}`>;
10
+
11
+ /** A `world.*` event name. */
12
+ export type WorldEventName = Extract<EventName, `world.${string}`>;
13
+
14
+ /** `rt.world` (realtime feature version 6 and later). */
15
+ export interface RuntimeWorldApi {
16
+ /** Send a world op on the page's socket; rejects with the hub's refusal. */
17
+ op<Name extends WorldOpName>(name: Name, input: OpInput<(typeof ops)[Name]>): Promise<OpAck<(typeof ops)[Name]>>;
18
+ /** Hear a world event; returns the unsubscribe. */
19
+ on<Name extends WorldEventName>(name: Name, listener: (payload: EventData<(typeof events)[Name]>) => void): () => void;
20
+ }
package/src/rooms.ts CHANGED
@@ -1,10 +1,10 @@
1
- /**
2
- * `@diffenderfer-games/hub/rooms`: the hub relay rooms forwarder (`hub.rooms`),
3
- * for games that want only this namespace.
4
- *
5
- * @packageDocumentation
6
- */
7
- export { roomsForwarder as rooms } from './realtime/rooms-forwarder';
8
- export type * from './realtime/room-types';
9
- export type { RoomChatLine, RoomMessage, RoomSeat, RoomStateChange } from './realtime/wire-types';
10
- export type { RoomInfo } from '@diffenderfer-games/hub-contract';
1
+ /**
2
+ * `@diffenderfer-games/hub/rooms`: the hub relay rooms forwarder (`hub.rooms`),
3
+ * for games that want only this namespace.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ export { roomsForwarder as rooms } from './realtime/rooms-forwarder';
8
+ export type * from './realtime/room-types';
9
+ export type { RoomChatLine, RoomMessage, RoomSeat, RoomSeatChange, RoomStateChange } from './realtime/wire-types';
10
+ export type { RoomInfo } from '@diffenderfer-games/hub-contract';
package/src/social.ts CHANGED
@@ -1,18 +1,19 @@
1
- /**
2
- * `@diffenderfer-games/hub/social`: the social forwarders (`hub.social`,
3
- * `hub.presence`, `hub.notify`), and every realtime type: the API the hub's
4
- * social runtime implements and the shapes it carries.
5
- *
6
- * @packageDocumentation
7
- */
8
- export { notifyForwarder as notify, presenceForwarder as presence, socialForwarder as social } from './realtime/social-forwarder';
9
- export { linkRealtimeToHub } from './realtime/hub-link';
10
- export type { RealtimeHubLink } from './realtime/hub-link';
11
- export { findRealtimeApi, isRealtimeApi } from './realtime/page-runtime';
12
- export {
13
- REALTIME_FAILED_EVENT,
14
- REALTIME_FEATURE_VERSION,
15
- REALTIME_READY_EVENT,
16
- REALTIME_SINGLETON_API,
17
- } from './realtime/runtime-api';
18
- export type * from './realtime/types';
1
+ /**
2
+ * `@diffenderfer-games/hub/social`: the social forwarders (`hub.social`,
3
+ * `hub.presence`, `hub.notify`), and every realtime type: the API the hub's
4
+ * social runtime implements and the shapes it carries.
5
+ *
6
+ * @packageDocumentation
7
+ */
8
+ export { notifyForwarder as notify, presenceForwarder as presence, socialForwarder as social } from './realtime/social-forwarder';
9
+ export { linkRealtimeToHub } from './realtime/hub-link';
10
+ export type { RealtimeHubLink } from './realtime/hub-link';
11
+ export { findRealtimeApi, isRealtimeApi } from './realtime/page-runtime';
12
+ export {
13
+ REALTIME_FAILED_EVENT,
14
+ REALTIME_FEATURE_VERSION,
15
+ REALTIME_READY_EVENT,
16
+ REALTIME_SINGLETON_API,
17
+ SESSION_EVENT,
18
+ } from './realtime/runtime-api';
19
+ export type * from './realtime/types';