@oyna360/lobby-sdk 0.1.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.
Files changed (211) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +123 -0
  3. package/dist/avatar-accessories.d.ts +16 -0
  4. package/dist/avatar-accessories.d.ts.map +1 -0
  5. package/dist/avatar-accessories.js +214 -0
  6. package/dist/avatar-accessories.js.map +1 -0
  7. package/dist/avatar-asset-manager.d.ts +54 -0
  8. package/dist/avatar-asset-manager.d.ts.map +1 -0
  9. package/dist/avatar-asset-manager.js +215 -0
  10. package/dist/avatar-asset-manager.js.map +1 -0
  11. package/dist/avatar-clips.d.ts +17 -0
  12. package/dist/avatar-clips.d.ts.map +1 -0
  13. package/dist/avatar-clips.js +47 -0
  14. package/dist/avatar-clips.js.map +1 -0
  15. package/dist/avatar-config.d.ts +4 -0
  16. package/dist/avatar-config.d.ts.map +1 -0
  17. package/dist/avatar-config.js +9 -0
  18. package/dist/avatar-config.js.map +1 -0
  19. package/dist/avatar-factory.d.ts +64 -0
  20. package/dist/avatar-factory.d.ts.map +1 -0
  21. package/dist/avatar-factory.js +464 -0
  22. package/dist/avatar-factory.js.map +1 -0
  23. package/dist/avatar-instance.d.ts +31 -0
  24. package/dist/avatar-instance.d.ts.map +1 -0
  25. package/dist/avatar-instance.js +56 -0
  26. package/dist/avatar-instance.js.map +1 -0
  27. package/dist/avatar-material-pipeline.d.ts +34 -0
  28. package/dist/avatar-material-pipeline.d.ts.map +1 -0
  29. package/dist/avatar-material-pipeline.js +580 -0
  30. package/dist/avatar-material-pipeline.js.map +1 -0
  31. package/dist/avatar-rig-builder.d.ts +74 -0
  32. package/dist/avatar-rig-builder.d.ts.map +1 -0
  33. package/dist/avatar-rig-builder.js +347 -0
  34. package/dist/avatar-rig-builder.js.map +1 -0
  35. package/dist/draco.d.ts +7 -0
  36. package/dist/draco.d.ts.map +1 -0
  37. package/dist/draco.js +82 -0
  38. package/dist/draco.js.map +1 -0
  39. package/dist/humanoid-animator.d.ts +35 -0
  40. package/dist/humanoid-animator.d.ts.map +1 -0
  41. package/dist/humanoid-animator.js +191 -0
  42. package/dist/humanoid-animator.js.map +1 -0
  43. package/dist/humanoid-bone-names.d.ts +35 -0
  44. package/dist/humanoid-bone-names.d.ts.map +1 -0
  45. package/dist/humanoid-bone-names.js +126 -0
  46. package/dist/humanoid-bone-names.js.map +1 -0
  47. package/dist/humanoid-locomotion.d.ts +101 -0
  48. package/dist/humanoid-locomotion.d.ts.map +1 -0
  49. package/dist/humanoid-locomotion.js +300 -0
  50. package/dist/humanoid-locomotion.js.map +1 -0
  51. package/dist/humanoid-rig.d.ts +51 -0
  52. package/dist/humanoid-rig.d.ts.map +1 -0
  53. package/dist/humanoid-rig.js +304 -0
  54. package/dist/humanoid-rig.js.map +1 -0
  55. package/dist/index.d.ts +60 -0
  56. package/dist/index.d.ts.map +1 -0
  57. package/dist/index.js +42 -0
  58. package/dist/index.js.map +1 -0
  59. package/dist/lobby-chat-ui.d.ts +3 -0
  60. package/dist/lobby-chat-ui.d.ts.map +1 -0
  61. package/dist/lobby-chat-ui.js +258 -0
  62. package/dist/lobby-chat-ui.js.map +1 -0
  63. package/dist/lobby-colliders.d.ts +10 -0
  64. package/dist/lobby-colliders.d.ts.map +1 -0
  65. package/dist/lobby-colliders.js +225 -0
  66. package/dist/lobby-colliders.js.map +1 -0
  67. package/dist/lobby-connection-ui.d.ts +8 -0
  68. package/dist/lobby-connection-ui.d.ts.map +1 -0
  69. package/dist/lobby-connection-ui.js +68 -0
  70. package/dist/lobby-connection-ui.js.map +1 -0
  71. package/dist/lobby-debug.d.ts +50 -0
  72. package/dist/lobby-debug.d.ts.map +1 -0
  73. package/dist/lobby-debug.js +132 -0
  74. package/dist/lobby-debug.js.map +1 -0
  75. package/dist/lobby-font.d.ts +5 -0
  76. package/dist/lobby-font.d.ts.map +1 -0
  77. package/dist/lobby-font.js +35 -0
  78. package/dist/lobby-font.js.map +1 -0
  79. package/dist/lobby-music.d.ts +40 -0
  80. package/dist/lobby-music.d.ts.map +1 -0
  81. package/dist/lobby-music.js +250 -0
  82. package/dist/lobby-music.js.map +1 -0
  83. package/dist/lobby-orientation-ui.d.ts +10 -0
  84. package/dist/lobby-orientation-ui.d.ts.map +1 -0
  85. package/dist/lobby-orientation-ui.js +64 -0
  86. package/dist/lobby-orientation-ui.js.map +1 -0
  87. package/dist/lobby-perf-diag.d.ts +254 -0
  88. package/dist/lobby-perf-diag.d.ts.map +1 -0
  89. package/dist/lobby-perf-diag.js +775 -0
  90. package/dist/lobby-perf-diag.js.map +1 -0
  91. package/dist/lobby-plaza-diag.d.ts +103 -0
  92. package/dist/lobby-plaza-diag.d.ts.map +1 -0
  93. package/dist/lobby-plaza-diag.js +534 -0
  94. package/dist/lobby-plaza-diag.js.map +1 -0
  95. package/dist/lobby-presence-ui.d.ts +4 -0
  96. package/dist/lobby-presence-ui.d.ts.map +1 -0
  97. package/dist/lobby-presence-ui.js +89 -0
  98. package/dist/lobby-presence-ui.js.map +1 -0
  99. package/dist/lobby-real-device-diag.d.ts +119 -0
  100. package/dist/lobby-real-device-diag.d.ts.map +1 -0
  101. package/dist/lobby-real-device-diag.js +468 -0
  102. package/dist/lobby-real-device-diag.js.map +1 -0
  103. package/dist/lobby-spawn.d.ts +15 -0
  104. package/dist/lobby-spawn.d.ts.map +1 -0
  105. package/dist/lobby-spawn.js +18 -0
  106. package/dist/lobby-spawn.js.map +1 -0
  107. package/dist/lobby-ui-i18n.d.ts +11 -0
  108. package/dist/lobby-ui-i18n.d.ts.map +1 -0
  109. package/dist/lobby-ui-i18n.js +21 -0
  110. package/dist/lobby-ui-i18n.js.map +1 -0
  111. package/dist/lobby-voice-ui.d.ts +3 -0
  112. package/dist/lobby-voice-ui.d.ts.map +1 -0
  113. package/dist/lobby-voice-ui.js +105 -0
  114. package/dist/lobby-voice-ui.js.map +1 -0
  115. package/dist/local-player-controller.d.ts +80 -0
  116. package/dist/local-player-controller.d.ts.map +1 -0
  117. package/dist/local-player-controller.js +422 -0
  118. package/dist/local-player-controller.js.map +1 -0
  119. package/dist/name-tag.d.ts +3 -0
  120. package/dist/name-tag.d.ts.map +1 -0
  121. package/dist/name-tag.js +59 -0
  122. package/dist/name-tag.js.map +1 -0
  123. package/dist/network-client.d.ts +87 -0
  124. package/dist/network-client.d.ts.map +1 -0
  125. package/dist/network-client.js +182 -0
  126. package/dist/network-client.js.map +1 -0
  127. package/dist/platform-bridge.d.ts +17 -0
  128. package/dist/platform-bridge.d.ts.map +1 -0
  129. package/dist/platform-bridge.js +90 -0
  130. package/dist/platform-bridge.js.map +1 -0
  131. package/dist/platform-lobby.d.ts +176 -0
  132. package/dist/platform-lobby.d.ts.map +1 -0
  133. package/dist/platform-lobby.js +679 -0
  134. package/dist/platform-lobby.js.map +1 -0
  135. package/dist/platform-types.d.ts +56 -0
  136. package/dist/platform-types.d.ts.map +1 -0
  137. package/dist/platform-types.js +3 -0
  138. package/dist/platform-types.js.map +1 -0
  139. package/dist/player-label.d.ts +9 -0
  140. package/dist/player-label.d.ts.map +1 -0
  141. package/dist/player-label.js +14 -0
  142. package/dist/player-label.js.map +1 -0
  143. package/dist/playground/playground-layout.d.ts +14 -0
  144. package/dist/playground/playground-layout.d.ts.map +1 -0
  145. package/dist/playground/playground-layout.js +320 -0
  146. package/dist/playground/playground-layout.js.map +1 -0
  147. package/dist/playground/playground-system.d.ts +30 -0
  148. package/dist/playground/playground-system.d.ts.map +1 -0
  149. package/dist/playground/playground-system.js +202 -0
  150. package/dist/playground/playground-system.js.map +1 -0
  151. package/dist/plaza-layout.d.ts +30 -0
  152. package/dist/plaza-layout.d.ts.map +1 -0
  153. package/dist/plaza-layout.js +527 -0
  154. package/dist/plaza-layout.js.map +1 -0
  155. package/dist/plugins.d.ts +5 -0
  156. package/dist/plugins.d.ts.map +1 -0
  157. package/dist/plugins.js +26 -0
  158. package/dist/plugins.js.map +1 -0
  159. package/dist/protocol.d.ts +276 -0
  160. package/dist/protocol.d.ts.map +1 -0
  161. package/dist/protocol.js +107 -0
  162. package/dist/protocol.js.map +1 -0
  163. package/dist/quality.d.ts +39 -0
  164. package/dist/quality.d.ts.map +1 -0
  165. package/dist/quality.js +95 -0
  166. package/dist/quality.js.map +1 -0
  167. package/dist/remote-player-manager.d.ts +48 -0
  168. package/dist/remote-player-manager.d.ts.map +1 -0
  169. package/dist/remote-player-manager.js +339 -0
  170. package/dist/remote-player-manager.js.map +1 -0
  171. package/dist/scene-manager.d.ts +26 -0
  172. package/dist/scene-manager.d.ts.map +1 -0
  173. package/dist/scene-manager.js +169 -0
  174. package/dist/scene-manager.js.map +1 -0
  175. package/dist/spawn-utils.d.ts +8 -0
  176. package/dist/spawn-utils.d.ts.map +1 -0
  177. package/dist/spawn-utils.js +29 -0
  178. package/dist/spawn-utils.js.map +1 -0
  179. package/dist/starter-layout.d.ts +17 -0
  180. package/dist/starter-layout.d.ts.map +1 -0
  181. package/dist/starter-layout.js +102 -0
  182. package/dist/starter-layout.js.map +1 -0
  183. package/dist/third-person-camera.d.ts +35 -0
  184. package/dist/third-person-camera.d.ts.map +1 -0
  185. package/dist/third-person-camera.js +181 -0
  186. package/dist/third-person-camera.js.map +1 -0
  187. package/dist/types.d.ts +164 -0
  188. package/dist/types.d.ts.map +1 -0
  189. package/dist/types.js +2 -0
  190. package/dist/types.js.map +1 -0
  191. package/dist/voice-chat.d.ts +78 -0
  192. package/dist/voice-chat.d.ts.map +1 -0
  193. package/dist/voice-chat.js +321 -0
  194. package/dist/voice-chat.js.map +1 -0
  195. package/dist/yield-to-render.d.ts +3 -0
  196. package/dist/yield-to-render.d.ts.map +1 -0
  197. package/dist/yield-to-render.js +11 -0
  198. package/dist/yield-to-render.js.map +1 -0
  199. package/dist/zones.d.ts +36 -0
  200. package/dist/zones.d.ts.map +1 -0
  201. package/dist/zones.js +68 -0
  202. package/dist/zones.js.map +1 -0
  203. package/docs/00-overview.md +47 -0
  204. package/docs/01-connect.md +85 -0
  205. package/docs/02-github.md +43 -0
  206. package/docs/03-modes.md +70 -0
  207. package/docs/04-api.md +106 -0
  208. package/docs/05-features.md +55 -0
  209. package/docs/06-controls.md +34 -0
  210. package/docs/07-troubleshooting.md +39 -0
  211. package/package.json +65 -0
@@ -0,0 +1,321 @@
1
+ const ICE_SERVERS = [
2
+ { urls: 'stun:stun.l.google.com:19302' },
3
+ { urls: 'stun:stun1.l.google.com:19302' },
4
+ ];
5
+ /** Default mesh cap — keep in sync with server LOBBY_VOICE_PEER_CAP (roadmap 3.4). */
6
+ export const DEFAULT_VOICE_PEER_CAP = 6;
7
+ export class LobbyVoiceChat {
8
+ signaling;
9
+ localStream = null;
10
+ peers = new Map();
11
+ remoteAudio = new Map();
12
+ voicePeers = new Map();
13
+ /** Peers we created an offer toward (vs inbound-only). */
14
+ offerInitiated = new Set();
15
+ active = false;
16
+ mode = 'friends';
17
+ micMuted = false;
18
+ selfUserId = '';
19
+ friendIds = new Set();
20
+ listeners = new Set();
21
+ disposed = false;
22
+ peerCap = DEFAULT_VOICE_PEER_CAP;
23
+ getPosition = null;
24
+ lastMeshRefreshMs = 0;
25
+ constructor(signaling) {
26
+ this.signaling = signaling;
27
+ }
28
+ onStateChange(listener) {
29
+ this.listeners.add(listener);
30
+ listener(this.snapshot());
31
+ return () => this.listeners.delete(listener);
32
+ }
33
+ setContext(selfUserId, friendUserIds) {
34
+ this.selfUserId = selfUserId;
35
+ this.friendIds = new Set(friendUserIds);
36
+ }
37
+ /** Optional world positions for nearest-N mesh selection. */
38
+ setPositionProvider(fn) {
39
+ this.getPosition = fn;
40
+ }
41
+ setPeerCap(cap) {
42
+ this.peerCap = Math.max(1, Math.floor(cap));
43
+ }
44
+ getState() {
45
+ return this.snapshot();
46
+ }
47
+ /**
48
+ * Re-evaluate nearest peers (e.g. after movement). Throttled to ~2Hz by default.
49
+ */
50
+ refreshMesh(force = false) {
51
+ if (!this.active || this.disposed)
52
+ return;
53
+ const now = performance.now();
54
+ if (!force && now - this.lastMeshRefreshMs < 500)
55
+ return;
56
+ this.lastMeshRefreshMs = now;
57
+ void this.syncPeerConnections(true);
58
+ }
59
+ async enable(mode) {
60
+ if (this.disposed || this.active)
61
+ return;
62
+ if (!navigator.mediaDevices?.getUserMedia) {
63
+ throw new Error('Microphone is not supported in this browser');
64
+ }
65
+ this.mode = mode;
66
+ this.localStream = await navigator.mediaDevices.getUserMedia({
67
+ audio: {
68
+ echoCancellation: true,
69
+ noiseSuppression: true,
70
+ autoGainControl: true,
71
+ },
72
+ video: false,
73
+ });
74
+ this.applyMicTrackState();
75
+ this.active = true;
76
+ this.emitState();
77
+ this.signaling.sendJoin(mode);
78
+ }
79
+ async disable() {
80
+ if (!this.active)
81
+ return;
82
+ this.signaling.sendLeave();
83
+ this.teardownPeers();
84
+ this.stopLocalStream();
85
+ this.active = false;
86
+ this.voicePeers.clear();
87
+ this.emitState();
88
+ }
89
+ async setMode(mode) {
90
+ if (!this.active) {
91
+ this.mode = mode;
92
+ this.emitState();
93
+ return;
94
+ }
95
+ if (mode === this.mode)
96
+ return;
97
+ await this.disable();
98
+ await this.enable(mode);
99
+ }
100
+ setMicMuted(muted) {
101
+ this.micMuted = muted;
102
+ this.applyMicTrackState();
103
+ if (this.active)
104
+ this.signaling.sendMute(muted);
105
+ this.emitState();
106
+ }
107
+ toggleMicMuted() {
108
+ this.setMicMuted(!this.micMuted);
109
+ }
110
+ handleVoiceState(peers, friendUserIds) {
111
+ this.friendIds = new Set(friendUserIds);
112
+ this.voicePeers.clear();
113
+ for (const peer of peers) {
114
+ if (peer.userId === this.selfUserId)
115
+ continue;
116
+ this.voicePeers.set(peer.userId, peer);
117
+ }
118
+ if (!this.active)
119
+ return;
120
+ void this.syncPeerConnections(true);
121
+ this.emitState();
122
+ }
123
+ handleVoiceJoined(peer) {
124
+ if (peer.userId === this.selfUserId)
125
+ return;
126
+ this.voicePeers.set(peer.userId, peer);
127
+ if (!this.active)
128
+ return;
129
+ // Existing participants wait for offers from the joiner.
130
+ this.emitState();
131
+ }
132
+ handleVoiceLeft(userId) {
133
+ this.voicePeers.delete(userId);
134
+ this.closePeer(userId);
135
+ this.emitState();
136
+ }
137
+ handleVoiceMute(userId, muted) {
138
+ const peer = this.voicePeers.get(userId);
139
+ if (!peer)
140
+ return;
141
+ peer.muted = muted;
142
+ const audio = this.remoteAudio.get(userId);
143
+ if (audio)
144
+ audio.muted = muted;
145
+ }
146
+ async handleOffer(fromUserId, sdp) {
147
+ if (!this.active || fromUserId === this.selfUserId)
148
+ return;
149
+ const peerState = this.voicePeers.get(fromUserId);
150
+ // Mode gate only — accept inbound offers outside nearest-N (asymmetric mesh).
151
+ if (!peerState || !this.canConnectTo(peerState))
152
+ return;
153
+ const pc = await this.ensurePeer(fromUserId);
154
+ await pc.setRemoteDescription(sdp);
155
+ const answer = await pc.createAnswer();
156
+ await pc.setLocalDescription(answer);
157
+ if (pc.localDescription) {
158
+ this.signaling.sendAnswer(fromUserId, pc.localDescription);
159
+ }
160
+ }
161
+ async handleAnswer(fromUserId, sdp) {
162
+ const pc = this.peers.get(fromUserId);
163
+ if (!pc)
164
+ return;
165
+ await pc.setRemoteDescription(sdp);
166
+ }
167
+ async handleIce(fromUserId, candidate) {
168
+ const pc = this.peers.get(fromUserId);
169
+ if (!pc || !candidate.candidate)
170
+ return;
171
+ try {
172
+ await pc.addIceCandidate(candidate);
173
+ }
174
+ catch {
175
+ // Ignore late ICE after close.
176
+ }
177
+ }
178
+ dispose() {
179
+ if (this.disposed)
180
+ return;
181
+ this.disposed = true;
182
+ void this.disable();
183
+ this.listeners.clear();
184
+ }
185
+ async syncPeerConnections(asOfferer) {
186
+ const meshIds = this.nearestEligiblePeerIds();
187
+ for (const userId of [...this.peers.keys()]) {
188
+ const peer = this.voicePeers.get(userId);
189
+ if (!peer || !this.canConnectTo(peer)) {
190
+ this.closePeer(userId);
191
+ continue;
192
+ }
193
+ // Drop outbound links that fell outside nearest-N; keep inbound replies.
194
+ if (!meshIds.has(userId) && this.offerInitiated.has(userId)) {
195
+ this.closePeer(userId);
196
+ }
197
+ }
198
+ for (const peer of this.voicePeers.values()) {
199
+ if (!meshIds.has(peer.userId))
200
+ continue;
201
+ if (asOfferer && !this.peers.has(peer.userId)) {
202
+ await this.createOffer(peer.userId);
203
+ }
204
+ }
205
+ }
206
+ canConnectTo(peer) {
207
+ if (peer.userId === this.selfUserId)
208
+ return false;
209
+ const iAllow = this.mode === 'all' || this.friendIds.has(peer.userId);
210
+ const theyAllow = peer.mode === 'all' || this.friendIds.has(this.selfUserId);
211
+ return iAllow && theyAllow;
212
+ }
213
+ nearestEligiblePeerIds() {
214
+ const eligible = [...this.voicePeers.values()].filter((p) => this.canConnectTo(p));
215
+ if (eligible.length <= this.peerCap) {
216
+ return new Set(eligible.map((p) => p.userId));
217
+ }
218
+ const selfPos = this.getPosition?.(this.selfUserId) ?? null;
219
+ const ranked = eligible.map((peer) => {
220
+ const pos = this.getPosition?.(peer.userId);
221
+ let dist = Number.POSITIVE_INFINITY;
222
+ if (selfPos && pos) {
223
+ const dx = pos.x - selfPos.x;
224
+ const dz = pos.z - selfPos.z;
225
+ dist = Math.hypot(dx, dz);
226
+ }
227
+ return { userId: peer.userId, dist };
228
+ });
229
+ ranked.sort((a, b) => a.dist - b.dist || a.userId.localeCompare(b.userId));
230
+ return new Set(ranked.slice(0, this.peerCap).map((r) => r.userId));
231
+ }
232
+ async createOffer(userId) {
233
+ this.offerInitiated.add(userId);
234
+ const pc = await this.ensurePeer(userId);
235
+ const offer = await pc.createOffer();
236
+ await pc.setLocalDescription(offer);
237
+ if (pc.localDescription) {
238
+ this.signaling.sendOffer(userId, pc.localDescription);
239
+ }
240
+ }
241
+ async ensurePeer(userId) {
242
+ const existing = this.peers.get(userId);
243
+ if (existing)
244
+ return existing;
245
+ const pc = new RTCPeerConnection({ iceServers: ICE_SERVERS });
246
+ this.peers.set(userId, pc);
247
+ pc.onicecandidate = (event) => {
248
+ if (event.candidate) {
249
+ this.signaling.sendIce(userId, event.candidate.toJSON());
250
+ }
251
+ };
252
+ pc.ontrack = (event) => {
253
+ const [stream] = event.streams;
254
+ if (!stream)
255
+ return;
256
+ let audio = this.remoteAudio.get(userId);
257
+ if (!audio) {
258
+ audio = document.createElement('audio');
259
+ audio.autoplay = true;
260
+ audio.setAttribute('playsinline', 'true');
261
+ audio.style.display = 'none';
262
+ document.body.append(audio);
263
+ this.remoteAudio.set(userId, audio);
264
+ }
265
+ audio.srcObject = stream;
266
+ const peer = this.voicePeers.get(userId);
267
+ if (peer)
268
+ audio.muted = peer.muted;
269
+ };
270
+ pc.onconnectionstatechange = () => {
271
+ if (pc.connectionState === 'failed' || pc.connectionState === 'closed') {
272
+ this.closePeer(userId);
273
+ }
274
+ };
275
+ if (this.localStream) {
276
+ for (const track of this.localStream.getTracks()) {
277
+ pc.addTrack(track, this.localStream);
278
+ }
279
+ }
280
+ return pc;
281
+ }
282
+ closePeer(userId) {
283
+ this.peers.get(userId)?.close();
284
+ this.peers.delete(userId);
285
+ this.offerInitiated.delete(userId);
286
+ const audio = this.remoteAudio.get(userId);
287
+ if (audio) {
288
+ audio.srcObject = null;
289
+ audio.remove();
290
+ }
291
+ this.remoteAudio.delete(userId);
292
+ }
293
+ teardownPeers() {
294
+ for (const userId of [...this.peers.keys()])
295
+ this.closePeer(userId);
296
+ }
297
+ stopLocalStream() {
298
+ for (const track of this.localStream?.getTracks() ?? [])
299
+ track.stop();
300
+ this.localStream = null;
301
+ }
302
+ applyMicTrackState() {
303
+ for (const track of this.localStream?.getAudioTracks() ?? []) {
304
+ track.enabled = !this.micMuted;
305
+ }
306
+ }
307
+ snapshot() {
308
+ return {
309
+ active: this.active,
310
+ mode: this.mode,
311
+ muted: this.micMuted,
312
+ peerCount: this.peers.size,
313
+ };
314
+ }
315
+ emitState() {
316
+ const state = this.snapshot();
317
+ for (const listener of this.listeners)
318
+ listener(state);
319
+ }
320
+ }
321
+ //# sourceMappingURL=voice-chat.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"voice-chat.js","sourceRoot":"","sources":["../src/voice-chat.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,3 @@
1
+ /** Yield so the Babylon render loop can paint (placeholder / prior frame) before heavy sync work. */
2
+ export declare function yieldToRenderLoop(): Promise<void>;
3
+ //# sourceMappingURL=yield-to-render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yield-to-render.d.ts","sourceRoot":"","sources":["../src/yield-to-render.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,wBAAgB,iBAAiB,IAAI,OAAO,CAAC,IAAI,CAAC,CAQjD"}
@@ -0,0 +1,11 @@
1
+ /** Yield so the Babylon render loop can paint (placeholder / prior frame) before heavy sync work. */
2
+ export function yieldToRenderLoop() {
3
+ return new Promise((resolve) => {
4
+ if (typeof requestAnimationFrame === 'function') {
5
+ requestAnimationFrame(() => requestAnimationFrame(() => resolve()));
6
+ return;
7
+ }
8
+ setTimeout(resolve, 0);
9
+ });
10
+ }
11
+ //# sourceMappingURL=yield-to-render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"yield-to-render.js","sourceRoot":"","sources":["../src/yield-to-render.ts"],"names":[],"mappings":"AAAA,qGAAqG;AACrG,MAAM,UAAU,iBAAiB;IAC/B,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;QAC7B,IAAI,OAAO,qBAAqB,KAAK,UAAU,EAAE,CAAC;YAChD,qBAAqB,CAAC,GAAG,EAAE,CAAC,qBAAqB,CAAC,GAAG,EAAE,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;YACpE,OAAO;QACT,CAAC;QACD,UAAU,CAAC,OAAO,EAAE,CAAC,CAAC,CAAC;IACzB,CAAC,CAAC,CAAC;AACL,CAAC"}
@@ -0,0 +1,36 @@
1
+ import type { Vector3 } from './types';
2
+ export declare class ZoneManager {
3
+ private readonly zones;
4
+ addZone(options: {
5
+ id: string;
6
+ bounds: {
7
+ min: Vector3;
8
+ max: Vector3;
9
+ };
10
+ onEnter?: (playerId: string) => void;
11
+ onExit?: (playerId: string) => void;
12
+ }): void;
13
+ updatePlayer(playerId: string, position: Vector3): void;
14
+ private isInside;
15
+ clear(): void;
16
+ }
17
+ export declare class PortalManager {
18
+ private readonly portals;
19
+ /** Registers a portal. Hits fire `onTrigger` only — no browser navigation. */
20
+ addPortal(options: {
21
+ id: string;
22
+ position: Vector3;
23
+ radius?: number;
24
+ toGameSlug?: string;
25
+ toScene?: string;
26
+ onTrigger?: () => void;
27
+ }): void;
28
+ updatePlayer(playerId: string, position: Vector3): Array<{
29
+ portalId: string;
30
+ toGameSlug?: string;
31
+ toScene?: string;
32
+ onTrigger?: () => void;
33
+ }>;
34
+ clear(): void;
35
+ }
36
+ //# sourceMappingURL=zones.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zones.d.ts","sourceRoot":"","sources":["../src/zones.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,SAAS,CAAC;AAEvC,qBAAa,WAAW;IACtB,OAAO,CAAC,QAAQ,CAAC,KAAK,CAMd;IAER,OAAO,CAAC,OAAO,EAAE;QACf,EAAE,EAAE,MAAM,CAAC;QACX,MAAM,EAAE;YAAE,GAAG,EAAE,OAAO,CAAC;YAAC,GAAG,EAAE,OAAO,CAAA;SAAE,CAAC;QACvC,OAAO,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;QACrC,MAAM,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,IAAI,CAAC;KACrC;IAID,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO;IAehD,OAAO,CAAC,QAAQ;IAWhB,KAAK;CAGN;AAED,qBAAa,aAAa;IACxB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAQhB;IAER,8EAA8E;IAC9E,SAAS,CAAC,OAAO,EAAE;QACjB,EAAE,EAAE,MAAM,CAAC;QACX,QAAQ,EAAE,OAAO,CAAC;QAClB,MAAM,CAAC,EAAE,MAAM,CAAC;QAChB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;KACxB;IAQD,YAAY,CAAC,QAAQ,EAAE,MAAM,EAAE,QAAQ,EAAE,OAAO,GAAG,KAAK,CAAC;QACvD,QAAQ,EAAE,MAAM,CAAC;QACjB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,OAAO,CAAC,EAAE,MAAM,CAAC;QACjB,SAAS,CAAC,EAAE,MAAM,IAAI,CAAC;KACxB,CAAC;IA8BF,KAAK;CAGN"}
package/dist/zones.js ADDED
@@ -0,0 +1,68 @@
1
+ export class ZoneManager {
2
+ zones = [];
3
+ addZone(options) {
4
+ this.zones.push({ ...options, inside: new Set() });
5
+ }
6
+ updatePlayer(playerId, position) {
7
+ for (const zone of this.zones) {
8
+ const inside = this.isInside(position, zone.bounds);
9
+ const wasInside = zone.inside.has(playerId);
10
+ if (inside && !wasInside) {
11
+ zone.inside.add(playerId);
12
+ zone.onEnter?.(playerId);
13
+ }
14
+ else if (!inside && wasInside) {
15
+ zone.inside.delete(playerId);
16
+ zone.onExit?.(playerId);
17
+ }
18
+ }
19
+ }
20
+ isInside(pos, bounds) {
21
+ return (pos.x >= bounds.min.x &&
22
+ pos.x <= bounds.max.x &&
23
+ pos.y >= bounds.min.y &&
24
+ pos.y <= bounds.max.y &&
25
+ pos.z >= bounds.min.z &&
26
+ pos.z <= bounds.max.z);
27
+ }
28
+ clear() {
29
+ this.zones.length = 0;
30
+ }
31
+ }
32
+ export class PortalManager {
33
+ portals = [];
34
+ /** Registers a portal. Hits fire `onTrigger` only — no browser navigation. */
35
+ addPortal(options) {
36
+ this.portals.push({
37
+ ...options,
38
+ radius: options.radius ?? 1.5,
39
+ triggered: new Set(),
40
+ });
41
+ }
42
+ updatePlayer(playerId, position) {
43
+ const hits = [];
44
+ for (const portal of this.portals) {
45
+ const dx = position.x - portal.position.x;
46
+ const dz = position.z - portal.position.z;
47
+ const dist = Math.hypot(dx, dz);
48
+ const inside = dist <= portal.radius;
49
+ if (inside && !portal.triggered.has(playerId)) {
50
+ portal.triggered.add(playerId);
51
+ hits.push({
52
+ portalId: portal.id,
53
+ toGameSlug: portal.toGameSlug,
54
+ toScene: portal.toScene,
55
+ onTrigger: portal.onTrigger,
56
+ });
57
+ }
58
+ else if (!inside) {
59
+ portal.triggered.delete(playerId);
60
+ }
61
+ }
62
+ return hits;
63
+ }
64
+ clear() {
65
+ this.portals.length = 0;
66
+ }
67
+ }
68
+ //# sourceMappingURL=zones.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"zones.js","sourceRoot":"","sources":["../src/zones.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,47 @@
1
+ # نمای کلی — `@oyna360/lobby-sdk`
2
+
3
+ برای بازی‌سازی که می‌خواهد **لابی ۳D مشترک** قبل از مسابقه داشته باشد.
4
+
5
+ ---
6
+
7
+ ## مسئولیت‌ها
8
+
9
+ | این SDK | پلتفرم / game-sdk | بازی شما |
10
+ |---------|-------------------|----------|
11
+ | رندر لابی، آواتار، حرکت | هویت، سشن، `platform:init` / Direct Auth | تم، پورتال، قوانین شروع مسابقه |
12
+ | WebSocket `/lobby` | ساخت اتاق و اعتبار سشن | سرور گیم‌پلی بعد از `destroy()` |
13
+ | چت / voice لابی | فلگ‌ها و moderation سمت سرور | UI اختصاصی مسابقه |
14
+
15
+ **لاگین و Authorize کار lobby-sdk نیست.** همیشه Context را از game-sdk یا parent پلتفرم بگیرید.
16
+
17
+ ---
18
+
19
+ ## وابستگی‌ها
20
+
21
+ - peer: `@babylonjs/core` ^7
22
+ - همراه پکیج: `socket.io-client`, `@babylonjs/loaders`
23
+ - پروتکل پیام‌ها داخل `dist` bundle شده
24
+
25
+ ---
26
+
27
+ ## جریان کلی
28
+
29
+ ```text
30
+ PlatformSDK.init() → SdkInitPayload (user, session, avatar, lobby)
31
+
32
+ PlatformLobby.create({ platformInit, wsUrl, roomId })
33
+
34
+ بازیکن در لابی حرکت / چت می‌کند
35
+
36
+ پورتال یا شمارش اتاق → callback شما
37
+
38
+ lobby.destroy() → گیم‌پلی خودتان
39
+ ```
40
+
41
+ ---
42
+
43
+ ## چه چیزهایی export می‌شود؟
44
+
45
+ علاوه بر `PlatformLobby`: کارخانه آواتار، انیماتور، دوربین، collider، pluginهای نمونه، ابزار diag — برای سفارشی‌سازی پیشرفته. برای اکثر بازی‌ها همان `PlatformLobby` کافی است.
46
+
47
+ بعدی: [01-connect.md](./01-connect.md)
@@ -0,0 +1,85 @@
1
+ # وصل کردن لابی به بازی
2
+
3
+ ## قرارداد
4
+
5
+ | پلتفرم می‌دهد | شما می‌سازید |
6
+ |---------------|--------------|
7
+ | `user`, `session`, `avatar` | صحنه / تم / پورتال |
8
+ | `lobby.wsUrl`, `lobby.roomId` | منطق «شروع مسابقه» |
9
+ | همگام‌سازی بازیکنان روی سوکت | گیم‌پلی بعد از خروج از لابی |
10
+
11
+ SDK صفحه را عوض نمی‌کند و چت را ذخیره نمی‌کند.
12
+
13
+ ---
14
+
15
+ ## پیش‌نیاز
16
+
17
+ 1. `@oyna360/lobby-sdk` + `@babylonjs/core`
18
+ 2. ترجیحاً `@oyna360/game-sdk` برای گرفتن Context
19
+ 3. بازی در ادمین: `slug`, `entryUrl`, `allowedOrigins`
20
+ 4. یک `<canvas>` اختصاصی لابی (اگر موتور دیگری دارید، canvas جدا)
21
+
22
+ ---
23
+
24
+ ## الگوی توصیه‌شده
25
+
26
+ ```ts
27
+ import { PlatformSDK } from '@oyna360/game-sdk';
28
+ import { PlatformLobby } from '@oyna360/lobby-sdk';
29
+
30
+ const init = await PlatformSDK.init(/* Production: خالی | Direct: urls + slug */);
31
+
32
+ const lobby = await PlatformLobby.create({
33
+ canvas,
34
+ platformInit: init,
35
+ roomId: init.lobby!.roomId,
36
+ wsUrl: init.lobby!.wsUrl,
37
+ config: {
38
+ enableChat: true,
39
+ enableVoice: true,
40
+ locale: 'fa',
41
+ },
42
+ });
43
+
44
+ lobby.applyPlazaLayout({
45
+ onRoomStart: (room) => {
46
+ lobby.destroy();
47
+ startMatch(room.id);
48
+ },
49
+ });
50
+ ```
51
+
52
+ ### جایگزین: `createFromPlatform`
53
+
54
+ فقط وقتی Context از قبل روی window/`platform:init` آمده (مثلاً بعد از `PlatformSDK.init()` یا parent iframe):
55
+
56
+ ```ts
57
+ const lobby = await PlatformLobby.createFromPlatform(canvas, {
58
+ spawnPoint: { x: 0, y: 0, z: 3 },
59
+ });
60
+ ```
61
+
62
+ اگر نه iframe هستید و نه `init` زده‌اید، این متد timeout می‌دهد.
63
+
64
+ ---
65
+
66
+ ## ثبت در ادمین
67
+
68
+ | فیلد | Development | Production |
69
+ |------|-------------|------------|
70
+ | entryUrl | مثلاً `http://localhost:5180` | `https://games.example.com/` |
71
+ | allowedOrigins | همان origin کامل | همان |
72
+
73
+ برای Direct Development، origin را در `DEV_GAME_ORIGINS` / `allowedOrigins` هم مجاز کنید. جزئیات در مستندات game-sdk.
74
+
75
+ ---
76
+
77
+ ## اشتباهات تکراری
78
+
79
+ - هاردکد `http://localhost:3001/lobby`
80
+ - صدا زدن تابع export به نام `applyPlazaLayout` به‌جای **متد** `lobby.applyPlazaLayout`
81
+ - فراموش کردن `destroy()` قبل از گیم‌پلی سنگین
82
+ - استفاده از `createDev()` به‌جای اتصال واقعی
83
+ - نصب جداگانه `lobby-protocol` و shim دستی
84
+
85
+ بعدی: [03-modes.md](./03-modes.md)
@@ -0,0 +1,43 @@
1
+ # نصب از GitHub
2
+
3
+ پکیج برای بازی‌سازان از ریپوی عمومی منتشر می‌شود:
4
+
5
+ `https://github.com/mamadjavadrasti/oyna360-lobby-sdk`
6
+
7
+ ## نصب پایدار
8
+
9
+ ```bash
10
+ npm install github:mamadjavadrasti/oyna360-lobby-sdk#master
11
+ # بهتر: تگ نسخه وقتی توسط تیم پلتفرم زده شد
12
+ npm install github:mamadjavadrasti/oyna360-lobby-sdk#v0.x.x
13
+ ```
14
+
15
+ همیشه `@babylonjs/core` را جدا نصب کنید.
16
+
17
+ ## بررسی سلامت `dist`
18
+
19
+ بعد از نصب، در `node_modules/@oyna360/lobby-sdk/dist/index.js`:
20
+
21
+ - نباید `from '@platform/lobby-protocol'` دیده شود
22
+ - باید فایل‌هایی مثل `platform-lobby.js`, `protocol.js`, `avatar-factory.js` وجود داشته باشد
23
+
24
+ ## به‌روزرسانی
25
+
26
+ ```bash
27
+ npm install github:mamadjavadrasti/oyna360-lobby-sdk#master --force
28
+ # کش Vite را پاک کنید
29
+ rm -rf node_modules/.vite
30
+ ```
31
+
32
+ یا کپی دستی `dist` از maintainer (pack) داخل `node_modules/@oyna360/lobby-sdk`.
33
+
34
+ ## ارتباط با game-sdk
35
+
36
+ lobby-sdk وابسته به game-sdk نیست؛ ولی در عمل برای Context واقعی هر دو را نصب کنید:
37
+
38
+ ```bash
39
+ npm install github:mamadjavadrasti/oyna360-game-sdk#v0.5.1
40
+ npm install github:mamadjavadrasti/oyna360-lobby-sdk#master @babylonjs/core
41
+ ```
42
+
43
+ نام پکیج‌ها: `@oyna360/game-sdk` و `@oyna360/lobby-sdk`.