@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.
- package/LICENSE +21 -0
- package/README.md +123 -0
- package/dist/avatar-accessories.d.ts +16 -0
- package/dist/avatar-accessories.d.ts.map +1 -0
- package/dist/avatar-accessories.js +214 -0
- package/dist/avatar-accessories.js.map +1 -0
- package/dist/avatar-asset-manager.d.ts +54 -0
- package/dist/avatar-asset-manager.d.ts.map +1 -0
- package/dist/avatar-asset-manager.js +215 -0
- package/dist/avatar-asset-manager.js.map +1 -0
- package/dist/avatar-clips.d.ts +17 -0
- package/dist/avatar-clips.d.ts.map +1 -0
- package/dist/avatar-clips.js +47 -0
- package/dist/avatar-clips.js.map +1 -0
- package/dist/avatar-config.d.ts +4 -0
- package/dist/avatar-config.d.ts.map +1 -0
- package/dist/avatar-config.js +9 -0
- package/dist/avatar-config.js.map +1 -0
- package/dist/avatar-factory.d.ts +64 -0
- package/dist/avatar-factory.d.ts.map +1 -0
- package/dist/avatar-factory.js +464 -0
- package/dist/avatar-factory.js.map +1 -0
- package/dist/avatar-instance.d.ts +31 -0
- package/dist/avatar-instance.d.ts.map +1 -0
- package/dist/avatar-instance.js +56 -0
- package/dist/avatar-instance.js.map +1 -0
- package/dist/avatar-material-pipeline.d.ts +34 -0
- package/dist/avatar-material-pipeline.d.ts.map +1 -0
- package/dist/avatar-material-pipeline.js +580 -0
- package/dist/avatar-material-pipeline.js.map +1 -0
- package/dist/avatar-rig-builder.d.ts +74 -0
- package/dist/avatar-rig-builder.d.ts.map +1 -0
- package/dist/avatar-rig-builder.js +347 -0
- package/dist/avatar-rig-builder.js.map +1 -0
- package/dist/draco.d.ts +7 -0
- package/dist/draco.d.ts.map +1 -0
- package/dist/draco.js +82 -0
- package/dist/draco.js.map +1 -0
- package/dist/humanoid-animator.d.ts +35 -0
- package/dist/humanoid-animator.d.ts.map +1 -0
- package/dist/humanoid-animator.js +191 -0
- package/dist/humanoid-animator.js.map +1 -0
- package/dist/humanoid-bone-names.d.ts +35 -0
- package/dist/humanoid-bone-names.d.ts.map +1 -0
- package/dist/humanoid-bone-names.js +126 -0
- package/dist/humanoid-bone-names.js.map +1 -0
- package/dist/humanoid-locomotion.d.ts +101 -0
- package/dist/humanoid-locomotion.d.ts.map +1 -0
- package/dist/humanoid-locomotion.js +300 -0
- package/dist/humanoid-locomotion.js.map +1 -0
- package/dist/humanoid-rig.d.ts +51 -0
- package/dist/humanoid-rig.d.ts.map +1 -0
- package/dist/humanoid-rig.js +304 -0
- package/dist/humanoid-rig.js.map +1 -0
- package/dist/index.d.ts +60 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +42 -0
- package/dist/index.js.map +1 -0
- package/dist/lobby-chat-ui.d.ts +3 -0
- package/dist/lobby-chat-ui.d.ts.map +1 -0
- package/dist/lobby-chat-ui.js +258 -0
- package/dist/lobby-chat-ui.js.map +1 -0
- package/dist/lobby-colliders.d.ts +10 -0
- package/dist/lobby-colliders.d.ts.map +1 -0
- package/dist/lobby-colliders.js +225 -0
- package/dist/lobby-colliders.js.map +1 -0
- package/dist/lobby-connection-ui.d.ts +8 -0
- package/dist/lobby-connection-ui.d.ts.map +1 -0
- package/dist/lobby-connection-ui.js +68 -0
- package/dist/lobby-connection-ui.js.map +1 -0
- package/dist/lobby-debug.d.ts +50 -0
- package/dist/lobby-debug.d.ts.map +1 -0
- package/dist/lobby-debug.js +132 -0
- package/dist/lobby-debug.js.map +1 -0
- package/dist/lobby-font.d.ts +5 -0
- package/dist/lobby-font.d.ts.map +1 -0
- package/dist/lobby-font.js +35 -0
- package/dist/lobby-font.js.map +1 -0
- package/dist/lobby-music.d.ts +40 -0
- package/dist/lobby-music.d.ts.map +1 -0
- package/dist/lobby-music.js +250 -0
- package/dist/lobby-music.js.map +1 -0
- package/dist/lobby-orientation-ui.d.ts +10 -0
- package/dist/lobby-orientation-ui.d.ts.map +1 -0
- package/dist/lobby-orientation-ui.js +64 -0
- package/dist/lobby-orientation-ui.js.map +1 -0
- package/dist/lobby-perf-diag.d.ts +254 -0
- package/dist/lobby-perf-diag.d.ts.map +1 -0
- package/dist/lobby-perf-diag.js +775 -0
- package/dist/lobby-perf-diag.js.map +1 -0
- package/dist/lobby-plaza-diag.d.ts +103 -0
- package/dist/lobby-plaza-diag.d.ts.map +1 -0
- package/dist/lobby-plaza-diag.js +534 -0
- package/dist/lobby-plaza-diag.js.map +1 -0
- package/dist/lobby-presence-ui.d.ts +4 -0
- package/dist/lobby-presence-ui.d.ts.map +1 -0
- package/dist/lobby-presence-ui.js +89 -0
- package/dist/lobby-presence-ui.js.map +1 -0
- package/dist/lobby-real-device-diag.d.ts +119 -0
- package/dist/lobby-real-device-diag.d.ts.map +1 -0
- package/dist/lobby-real-device-diag.js +468 -0
- package/dist/lobby-real-device-diag.js.map +1 -0
- package/dist/lobby-spawn.d.ts +15 -0
- package/dist/lobby-spawn.d.ts.map +1 -0
- package/dist/lobby-spawn.js +18 -0
- package/dist/lobby-spawn.js.map +1 -0
- package/dist/lobby-ui-i18n.d.ts +11 -0
- package/dist/lobby-ui-i18n.d.ts.map +1 -0
- package/dist/lobby-ui-i18n.js +21 -0
- package/dist/lobby-ui-i18n.js.map +1 -0
- package/dist/lobby-voice-ui.d.ts +3 -0
- package/dist/lobby-voice-ui.d.ts.map +1 -0
- package/dist/lobby-voice-ui.js +105 -0
- package/dist/lobby-voice-ui.js.map +1 -0
- package/dist/local-player-controller.d.ts +80 -0
- package/dist/local-player-controller.d.ts.map +1 -0
- package/dist/local-player-controller.js +422 -0
- package/dist/local-player-controller.js.map +1 -0
- package/dist/name-tag.d.ts +3 -0
- package/dist/name-tag.d.ts.map +1 -0
- package/dist/name-tag.js +59 -0
- package/dist/name-tag.js.map +1 -0
- package/dist/network-client.d.ts +87 -0
- package/dist/network-client.d.ts.map +1 -0
- package/dist/network-client.js +182 -0
- package/dist/network-client.js.map +1 -0
- package/dist/platform-bridge.d.ts +17 -0
- package/dist/platform-bridge.d.ts.map +1 -0
- package/dist/platform-bridge.js +90 -0
- package/dist/platform-bridge.js.map +1 -0
- package/dist/platform-lobby.d.ts +176 -0
- package/dist/platform-lobby.d.ts.map +1 -0
- package/dist/platform-lobby.js +679 -0
- package/dist/platform-lobby.js.map +1 -0
- package/dist/platform-types.d.ts +56 -0
- package/dist/platform-types.d.ts.map +1 -0
- package/dist/platform-types.js +3 -0
- package/dist/platform-types.js.map +1 -0
- package/dist/player-label.d.ts +9 -0
- package/dist/player-label.d.ts.map +1 -0
- package/dist/player-label.js +14 -0
- package/dist/player-label.js.map +1 -0
- package/dist/playground/playground-layout.d.ts +14 -0
- package/dist/playground/playground-layout.d.ts.map +1 -0
- package/dist/playground/playground-layout.js +320 -0
- package/dist/playground/playground-layout.js.map +1 -0
- package/dist/playground/playground-system.d.ts +30 -0
- package/dist/playground/playground-system.d.ts.map +1 -0
- package/dist/playground/playground-system.js +202 -0
- package/dist/playground/playground-system.js.map +1 -0
- package/dist/plaza-layout.d.ts +30 -0
- package/dist/plaza-layout.d.ts.map +1 -0
- package/dist/plaza-layout.js +527 -0
- package/dist/plaza-layout.js.map +1 -0
- package/dist/plugins.d.ts +5 -0
- package/dist/plugins.d.ts.map +1 -0
- package/dist/plugins.js +26 -0
- package/dist/plugins.js.map +1 -0
- package/dist/protocol.d.ts +276 -0
- package/dist/protocol.d.ts.map +1 -0
- package/dist/protocol.js +107 -0
- package/dist/protocol.js.map +1 -0
- package/dist/quality.d.ts +39 -0
- package/dist/quality.d.ts.map +1 -0
- package/dist/quality.js +95 -0
- package/dist/quality.js.map +1 -0
- package/dist/remote-player-manager.d.ts +48 -0
- package/dist/remote-player-manager.d.ts.map +1 -0
- package/dist/remote-player-manager.js +339 -0
- package/dist/remote-player-manager.js.map +1 -0
- package/dist/scene-manager.d.ts +26 -0
- package/dist/scene-manager.d.ts.map +1 -0
- package/dist/scene-manager.js +169 -0
- package/dist/scene-manager.js.map +1 -0
- package/dist/spawn-utils.d.ts +8 -0
- package/dist/spawn-utils.d.ts.map +1 -0
- package/dist/spawn-utils.js +29 -0
- package/dist/spawn-utils.js.map +1 -0
- package/dist/starter-layout.d.ts +17 -0
- package/dist/starter-layout.d.ts.map +1 -0
- package/dist/starter-layout.js +102 -0
- package/dist/starter-layout.js.map +1 -0
- package/dist/third-person-camera.d.ts +35 -0
- package/dist/third-person-camera.d.ts.map +1 -0
- package/dist/third-person-camera.js +181 -0
- package/dist/third-person-camera.js.map +1 -0
- package/dist/types.d.ts +164 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +2 -0
- package/dist/types.js.map +1 -0
- package/dist/voice-chat.d.ts +78 -0
- package/dist/voice-chat.d.ts.map +1 -0
- package/dist/voice-chat.js +321 -0
- package/dist/voice-chat.js.map +1 -0
- package/dist/yield-to-render.d.ts +3 -0
- package/dist/yield-to-render.d.ts.map +1 -0
- package/dist/yield-to-render.js +11 -0
- package/dist/yield-to-render.js.map +1 -0
- package/dist/zones.d.ts +36 -0
- package/dist/zones.d.ts.map +1 -0
- package/dist/zones.js +68 -0
- package/dist/zones.js.map +1 -0
- package/docs/00-overview.md +47 -0
- package/docs/01-connect.md +85 -0
- package/docs/02-github.md +43 -0
- package/docs/03-modes.md +70 -0
- package/docs/04-api.md +106 -0
- package/docs/05-features.md +55 -0
- package/docs/06-controls.md +34 -0
- package/docs/07-troubleshooting.md +39 -0
- package/package.json +65 -0
|
@@ -0,0 +1,276 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled lobby wire protocol — generated from @platform/lobby-protocol.
|
|
3
|
+
* Do not edit by hand. Run: node scripts/sync-lobby-protocol.mjs
|
|
4
|
+
* (scale roadmap 9.1)
|
|
5
|
+
*/
|
|
6
|
+
/** Lobby SDK protocol version — keep in sync with @oyna360/lobby-sdk */
|
|
7
|
+
export declare const LOBBY_PROTOCOL_VERSION = "0.1.0";
|
|
8
|
+
export type AvatarPresetKind = 'procedural' | 'glb';
|
|
9
|
+
export interface Vector3 {
|
|
10
|
+
x: number;
|
|
11
|
+
y: number;
|
|
12
|
+
z: number;
|
|
13
|
+
}
|
|
14
|
+
export interface LobbyAvatarConfig {
|
|
15
|
+
presetId: string;
|
|
16
|
+
presetKey: string;
|
|
17
|
+
presetKind: AvatarPresetKind;
|
|
18
|
+
presetConfig: Record<string, unknown>;
|
|
19
|
+
customConfig: Record<string, unknown>;
|
|
20
|
+
}
|
|
21
|
+
export interface SdkLobbyAvatar {
|
|
22
|
+
presetId: string;
|
|
23
|
+
presetKey: string;
|
|
24
|
+
presetKind: AvatarPresetKind;
|
|
25
|
+
customConfig: Record<string, unknown>;
|
|
26
|
+
}
|
|
27
|
+
export type LobbyAnimationState = 'idle' | 'walk' | 'run' | 'jump' | 'fall';
|
|
28
|
+
export type LobbyEmoteKind = 'wave' | 'sit' | 'dance' | 'point';
|
|
29
|
+
export interface LobbyPlayerState {
|
|
30
|
+
userId: string;
|
|
31
|
+
username: string;
|
|
32
|
+
displayName: string;
|
|
33
|
+
avatar: SdkLobbyAvatar;
|
|
34
|
+
position: Vector3;
|
|
35
|
+
rotationY: number;
|
|
36
|
+
animation: LobbyAnimationState;
|
|
37
|
+
emote: LobbyEmoteKind | null;
|
|
38
|
+
updatedAt: number;
|
|
39
|
+
}
|
|
40
|
+
/** Client → Server */
|
|
41
|
+
export interface LobbyJoinMessage {
|
|
42
|
+
type: 'lobby:join';
|
|
43
|
+
roomId: string;
|
|
44
|
+
sessionToken: string;
|
|
45
|
+
position?: Vector3;
|
|
46
|
+
rotationY?: number;
|
|
47
|
+
}
|
|
48
|
+
export interface LobbyMoveMessage {
|
|
49
|
+
type: 'lobby:move';
|
|
50
|
+
position: Vector3;
|
|
51
|
+
rotationY: number;
|
|
52
|
+
animation: LobbyAnimationState;
|
|
53
|
+
seq: number;
|
|
54
|
+
}
|
|
55
|
+
export interface LobbyEmoteMessage {
|
|
56
|
+
type: 'lobby:emote';
|
|
57
|
+
emote: LobbyEmoteKind;
|
|
58
|
+
}
|
|
59
|
+
export interface LobbyLeaveMessage {
|
|
60
|
+
type: 'lobby:leave';
|
|
61
|
+
}
|
|
62
|
+
export interface LobbyPingMessage {
|
|
63
|
+
type: 'lobby:ping';
|
|
64
|
+
}
|
|
65
|
+
/** Ephemeral — never persisted. Only players currently in the room see it. */
|
|
66
|
+
export interface LobbyChatMessage {
|
|
67
|
+
type: 'lobby:chat';
|
|
68
|
+
text: string;
|
|
69
|
+
}
|
|
70
|
+
/**
|
|
71
|
+
* Game/app data bus for the lobby room (matchmaking, pad rooms, sync, …).
|
|
72
|
+
* Not chat — never shown in chat UI. Prefer namespaced channels: `{game}.{feature}`.
|
|
73
|
+
*/
|
|
74
|
+
export interface LobbyDataMessage {
|
|
75
|
+
type: 'lobby:data';
|
|
76
|
+
channel: string;
|
|
77
|
+
payload: string;
|
|
78
|
+
}
|
|
79
|
+
export type LobbyVoiceMode = 'friends' | 'all';
|
|
80
|
+
/** Serializable WebRTC session description (browser RTCSessionDescriptionInit). */
|
|
81
|
+
export interface RtcSessionDescription {
|
|
82
|
+
type?: 'offer' | 'answer' | 'pranswer' | 'rollback';
|
|
83
|
+
sdp?: string;
|
|
84
|
+
}
|
|
85
|
+
/** Serializable ICE candidate (browser RTCIceCandidateInit). */
|
|
86
|
+
export interface RtcIceCandidate {
|
|
87
|
+
candidate?: string;
|
|
88
|
+
sdpMid?: string | null;
|
|
89
|
+
sdpMLineIndex?: number | null;
|
|
90
|
+
usernameFragment?: string | null;
|
|
91
|
+
}
|
|
92
|
+
export interface LobbyVoiceJoinMessage {
|
|
93
|
+
type: 'lobby:voice:join';
|
|
94
|
+
mode: LobbyVoiceMode;
|
|
95
|
+
}
|
|
96
|
+
export interface LobbyVoiceLeaveMessage {
|
|
97
|
+
type: 'lobby:voice:leave';
|
|
98
|
+
}
|
|
99
|
+
export interface LobbyVoiceMuteMessage {
|
|
100
|
+
type: 'lobby:voice:mute';
|
|
101
|
+
muted: boolean;
|
|
102
|
+
}
|
|
103
|
+
export interface LobbyVoiceOfferMessage {
|
|
104
|
+
type: 'lobby:voice:offer';
|
|
105
|
+
toUserId: string;
|
|
106
|
+
sdp: RtcSessionDescription;
|
|
107
|
+
}
|
|
108
|
+
export interface LobbyVoiceAnswerMessage {
|
|
109
|
+
type: 'lobby:voice:answer';
|
|
110
|
+
toUserId: string;
|
|
111
|
+
sdp: RtcSessionDescription;
|
|
112
|
+
}
|
|
113
|
+
export interface LobbyVoiceIceMessage {
|
|
114
|
+
type: 'lobby:voice:ice';
|
|
115
|
+
toUserId: string;
|
|
116
|
+
candidate: RtcIceCandidate;
|
|
117
|
+
}
|
|
118
|
+
export declare const LOBBY_CHAT_MAX_LEN = 140;
|
|
119
|
+
/** Max payload bytes for lobby:data (game control / sync). Independent of chat. */
|
|
120
|
+
export declare const LOBBY_DATA_MAX_LEN = 512;
|
|
121
|
+
export declare const LOBBY_DATA_CHANNEL_MAX_LEN = 64;
|
|
122
|
+
export declare function sanitizeLobbyChat(text: unknown): string | null;
|
|
123
|
+
/** Validate data channel id. Does not apply chat sanitization. */
|
|
124
|
+
export declare function sanitizeLobbyDataChannel(channel: unknown): string | null;
|
|
125
|
+
/**
|
|
126
|
+
* Validate data payload. Strips only dangerous control chars; preserves framing spaces.
|
|
127
|
+
* Does not trim or slice like chat.
|
|
128
|
+
*/
|
|
129
|
+
export declare function sanitizeLobbyDataPayload(payload: unknown): string | null;
|
|
130
|
+
export type LobbyClientMessage = LobbyJoinMessage | LobbyMoveMessage | LobbyEmoteMessage | LobbyLeaveMessage | LobbyPingMessage | LobbyChatMessage | LobbyDataMessage | LobbyVoiceJoinMessage | LobbyVoiceLeaveMessage | LobbyVoiceMuteMessage | LobbyVoiceOfferMessage | LobbyVoiceAnswerMessage | LobbyVoiceIceMessage;
|
|
131
|
+
/** Server → Client */
|
|
132
|
+
export interface LobbyVoicePeerState {
|
|
133
|
+
userId: string;
|
|
134
|
+
username?: string;
|
|
135
|
+
mode: LobbyVoiceMode;
|
|
136
|
+
muted: boolean;
|
|
137
|
+
}
|
|
138
|
+
export interface LobbyFeatureFlags {
|
|
139
|
+
chatEnabled: boolean;
|
|
140
|
+
voiceEnabled: boolean;
|
|
141
|
+
chatAllowed: boolean;
|
|
142
|
+
voiceAllowed: boolean;
|
|
143
|
+
/**
|
|
144
|
+
* Game data channel (`lobby:data`). Omitted / undefined ⇒ enabled.
|
|
145
|
+
* Independent of chat — matchmaking must work when chat is banned/disabled.
|
|
146
|
+
*/
|
|
147
|
+
dataEnabled?: boolean;
|
|
148
|
+
dataAllowed?: boolean;
|
|
149
|
+
}
|
|
150
|
+
export interface LobbyWelcomeMessage {
|
|
151
|
+
type: 'lobby:welcome';
|
|
152
|
+
roomId: string;
|
|
153
|
+
self: LobbyPlayerState;
|
|
154
|
+
players: LobbyPlayerState[];
|
|
155
|
+
maxPlayers: number;
|
|
156
|
+
/** Server protocol version (scale roadmap 9.4). */
|
|
157
|
+
protocolVersion: string;
|
|
158
|
+
/** Accepted friend user ids for voice filtering (friends mode). */
|
|
159
|
+
friendUserIds?: string[];
|
|
160
|
+
voicePeers?: LobbyVoicePeerState[];
|
|
161
|
+
lobbyFeatures?: LobbyFeatureFlags;
|
|
162
|
+
}
|
|
163
|
+
export interface LobbyStateMessage {
|
|
164
|
+
type: 'lobby:state';
|
|
165
|
+
players: LobbyPlayerState[];
|
|
166
|
+
}
|
|
167
|
+
export interface LobbyPlayerJoinedMessage {
|
|
168
|
+
type: 'lobby:player:joined';
|
|
169
|
+
player: LobbyPlayerState;
|
|
170
|
+
}
|
|
171
|
+
export interface LobbyPlayerLeftMessage {
|
|
172
|
+
type: 'lobby:player:left';
|
|
173
|
+
userId: string;
|
|
174
|
+
username?: string;
|
|
175
|
+
displayName?: string;
|
|
176
|
+
}
|
|
177
|
+
export interface LobbyPlayerMovedMessage {
|
|
178
|
+
type: 'lobby:player:moved';
|
|
179
|
+
userId: string;
|
|
180
|
+
position: Vector3;
|
|
181
|
+
rotationY: number;
|
|
182
|
+
animation: LobbyAnimationState;
|
|
183
|
+
seq: number;
|
|
184
|
+
serverTime: number;
|
|
185
|
+
}
|
|
186
|
+
/** Batched moves for a room tick (scale roadmap 4.1). Fields may be omitted when unchanged (4.3 delta). */
|
|
187
|
+
export interface LobbyPlayersMovedMessage {
|
|
188
|
+
type: 'lobby:players:moved';
|
|
189
|
+
moves: Array<{
|
|
190
|
+
userId: string;
|
|
191
|
+
position?: Vector3;
|
|
192
|
+
rotationY?: number;
|
|
193
|
+
animation?: LobbyAnimationState;
|
|
194
|
+
seq: number;
|
|
195
|
+
}>;
|
|
196
|
+
serverTime: number;
|
|
197
|
+
}
|
|
198
|
+
export interface LobbyPlayerEmoteMessage {
|
|
199
|
+
type: 'lobby:player:emote';
|
|
200
|
+
userId: string;
|
|
201
|
+
emote: LobbyEmoteKind;
|
|
202
|
+
}
|
|
203
|
+
export interface LobbyErrorMessage {
|
|
204
|
+
type: 'lobby:error';
|
|
205
|
+
code: string;
|
|
206
|
+
message: string;
|
|
207
|
+
}
|
|
208
|
+
export interface LobbyPongMessage {
|
|
209
|
+
type: 'lobby:pong';
|
|
210
|
+
}
|
|
211
|
+
export interface LobbyChatBroadcastMessage {
|
|
212
|
+
type: 'lobby:chat';
|
|
213
|
+
userId: string;
|
|
214
|
+
username?: string;
|
|
215
|
+
displayName: string;
|
|
216
|
+
text: string;
|
|
217
|
+
at: number;
|
|
218
|
+
}
|
|
219
|
+
export interface LobbyDataBroadcastMessage {
|
|
220
|
+
type: 'lobby:data';
|
|
221
|
+
userId: string;
|
|
222
|
+
username?: string;
|
|
223
|
+
displayName?: string;
|
|
224
|
+
channel: string;
|
|
225
|
+
payload: string;
|
|
226
|
+
at: number;
|
|
227
|
+
}
|
|
228
|
+
export interface LobbyVoiceStateMessage {
|
|
229
|
+
type: 'lobby:voice:state';
|
|
230
|
+
peers: LobbyVoicePeerState[];
|
|
231
|
+
friendUserIds: string[];
|
|
232
|
+
}
|
|
233
|
+
export interface LobbyVoiceJoinedMessage {
|
|
234
|
+
type: 'lobby:voice:joined';
|
|
235
|
+
peer: LobbyVoicePeerState;
|
|
236
|
+
}
|
|
237
|
+
export interface LobbyVoiceLeftMessage {
|
|
238
|
+
type: 'lobby:voice:left';
|
|
239
|
+
userId: string;
|
|
240
|
+
}
|
|
241
|
+
export interface LobbyVoiceMuteBroadcastMessage {
|
|
242
|
+
type: 'lobby:voice:mute';
|
|
243
|
+
userId: string;
|
|
244
|
+
muted: boolean;
|
|
245
|
+
}
|
|
246
|
+
export interface LobbyVoiceOfferBroadcastMessage {
|
|
247
|
+
type: 'lobby:voice:offer';
|
|
248
|
+
fromUserId: string;
|
|
249
|
+
sdp: RtcSessionDescription;
|
|
250
|
+
}
|
|
251
|
+
export interface LobbyVoiceAnswerBroadcastMessage {
|
|
252
|
+
type: 'lobby:voice:answer';
|
|
253
|
+
fromUserId: string;
|
|
254
|
+
sdp: RtcSessionDescription;
|
|
255
|
+
}
|
|
256
|
+
export interface LobbyVoiceIceBroadcastMessage {
|
|
257
|
+
type: 'lobby:voice:ice';
|
|
258
|
+
fromUserId: string;
|
|
259
|
+
candidate: RtcIceCandidate;
|
|
260
|
+
}
|
|
261
|
+
export type LobbyServerMessage = LobbyWelcomeMessage | LobbyStateMessage | LobbyPlayerJoinedMessage | LobbyPlayerLeftMessage | LobbyPlayerMovedMessage | LobbyPlayersMovedMessage | LobbyPlayerEmoteMessage | LobbyChatBroadcastMessage | LobbyDataBroadcastMessage | LobbyVoiceStateMessage | LobbyVoiceJoinedMessage | LobbyVoiceLeftMessage | LobbyVoiceMuteBroadcastMessage | LobbyVoiceOfferBroadcastMessage | LobbyVoiceAnswerBroadcastMessage | LobbyVoiceIceBroadcastMessage | LobbyErrorMessage | LobbyPongMessage;
|
|
262
|
+
export declare function parseLobbyClientMessage(data: unknown): LobbyClientMessage | null;
|
|
263
|
+
/** Build per-game room id */
|
|
264
|
+
export declare function gameRoomId(gameSlug: string, instance?: number): string;
|
|
265
|
+
/** Global avatar hub room (phase 7) */
|
|
266
|
+
export declare const GLOBAL_AVATAR_ROOM_ID = "global:avatars";
|
|
267
|
+
export declare function isGlobalAvatarRoom(roomId: string): boolean;
|
|
268
|
+
/**
|
|
269
|
+
* Best-effort slug from a room id. Slugs may contain hyphens (`game:fall-cars-2`),
|
|
270
|
+
* so a trailing `-<digits>` is read as an instance suffix. Ambiguous for slugs that
|
|
271
|
+
* genuinely end in `-<digits>` — prefer `isRoomForGame` when the slug is known.
|
|
272
|
+
*/
|
|
273
|
+
export declare function parseGameSlugFromRoom(roomId: string): string | null;
|
|
274
|
+
/** True when roomId is the base room or a numbered instance of gameSlug. */
|
|
275
|
+
export declare function isRoomForGame(roomId: string, gameSlug: string): boolean;
|
|
276
|
+
//# sourceMappingURL=protocol.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.d.ts","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
package/dist/protocol.js
ADDED
|
@@ -0,0 +1,107 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Bundled lobby wire protocol — generated from @platform/lobby-protocol.
|
|
3
|
+
* Do not edit by hand. Run: node scripts/sync-lobby-protocol.mjs
|
|
4
|
+
* (scale roadmap 9.1)
|
|
5
|
+
*/
|
|
6
|
+
/** Lobby SDK protocol version — keep in sync with @oyna360/lobby-sdk */
|
|
7
|
+
export const LOBBY_PROTOCOL_VERSION = '0.1.0';
|
|
8
|
+
export const LOBBY_CHAT_MAX_LEN = 140;
|
|
9
|
+
/** Max payload bytes for lobby:data (game control / sync). Independent of chat. */
|
|
10
|
+
export const LOBBY_DATA_MAX_LEN = 512;
|
|
11
|
+
export const LOBBY_DATA_CHANNEL_MAX_LEN = 64;
|
|
12
|
+
const LOBBY_DATA_CHANNEL_RE = /^[a-zA-Z0-9._-]+$/;
|
|
13
|
+
export function sanitizeLobbyChat(text) {
|
|
14
|
+
if (typeof text !== 'string')
|
|
15
|
+
return null;
|
|
16
|
+
const cleaned = text.replace(/[\u0000-\u001F\u007F]/g, '').replace(/\s+/g, ' ').trim();
|
|
17
|
+
if (!cleaned)
|
|
18
|
+
return null;
|
|
19
|
+
return cleaned.slice(0, LOBBY_CHAT_MAX_LEN);
|
|
20
|
+
}
|
|
21
|
+
/** Validate data channel id. Does not apply chat sanitization. */
|
|
22
|
+
export function sanitizeLobbyDataChannel(channel) {
|
|
23
|
+
if (typeof channel !== 'string')
|
|
24
|
+
return null;
|
|
25
|
+
const cleaned = channel.trim();
|
|
26
|
+
if (!cleaned || cleaned.length > LOBBY_DATA_CHANNEL_MAX_LEN)
|
|
27
|
+
return null;
|
|
28
|
+
if (!LOBBY_DATA_CHANNEL_RE.test(cleaned))
|
|
29
|
+
return null;
|
|
30
|
+
return cleaned;
|
|
31
|
+
}
|
|
32
|
+
/**
|
|
33
|
+
* Validate data payload. Strips only dangerous control chars; preserves framing spaces.
|
|
34
|
+
* Does not trim or slice like chat.
|
|
35
|
+
*/
|
|
36
|
+
export function sanitizeLobbyDataPayload(payload) {
|
|
37
|
+
if (typeof payload !== 'string')
|
|
38
|
+
return null;
|
|
39
|
+
if (!payload || payload.length > LOBBY_DATA_MAX_LEN)
|
|
40
|
+
return null;
|
|
41
|
+
const cleaned = payload.replace(/[\u0000-\u0008\u000B\u000C\u000E-\u001F\u007F]/g, '');
|
|
42
|
+
if (!cleaned || cleaned.length > LOBBY_DATA_MAX_LEN)
|
|
43
|
+
return null;
|
|
44
|
+
return cleaned;
|
|
45
|
+
}
|
|
46
|
+
export function parseLobbyClientMessage(data) {
|
|
47
|
+
if (!data || typeof data !== 'object')
|
|
48
|
+
return null;
|
|
49
|
+
const type = data.type;
|
|
50
|
+
switch (type) {
|
|
51
|
+
case 'lobby:join':
|
|
52
|
+
case 'lobby:move':
|
|
53
|
+
case 'lobby:emote':
|
|
54
|
+
case 'lobby:leave':
|
|
55
|
+
case 'lobby:ping':
|
|
56
|
+
case 'lobby:chat':
|
|
57
|
+
case 'lobby:data':
|
|
58
|
+
case 'lobby:voice:join':
|
|
59
|
+
case 'lobby:voice:leave':
|
|
60
|
+
case 'lobby:voice:mute':
|
|
61
|
+
case 'lobby:voice:offer':
|
|
62
|
+
case 'lobby:voice:answer':
|
|
63
|
+
case 'lobby:voice:ice':
|
|
64
|
+
return data;
|
|
65
|
+
default:
|
|
66
|
+
return null;
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
/** Build per-game room id */
|
|
70
|
+
export function gameRoomId(gameSlug, instance = 1) {
|
|
71
|
+
return instance <= 1 ? `game:${gameSlug}` : `game:${gameSlug}-${instance}`;
|
|
72
|
+
}
|
|
73
|
+
/** Global avatar hub room (phase 7) */
|
|
74
|
+
export const GLOBAL_AVATAR_ROOM_ID = 'global:avatars';
|
|
75
|
+
export function isGlobalAvatarRoom(roomId) {
|
|
76
|
+
return roomId === GLOBAL_AVATAR_ROOM_ID;
|
|
77
|
+
}
|
|
78
|
+
const GAME_ROOM_PREFIX = 'game:';
|
|
79
|
+
/**
|
|
80
|
+
* Best-effort slug from a room id. Slugs may contain hyphens (`game:fall-cars-2`),
|
|
81
|
+
* so a trailing `-<digits>` is read as an instance suffix. Ambiguous for slugs that
|
|
82
|
+
* genuinely end in `-<digits>` — prefer `isRoomForGame` when the slug is known.
|
|
83
|
+
*/
|
|
84
|
+
export function parseGameSlugFromRoom(roomId) {
|
|
85
|
+
if (roomId === GLOBAL_AVATAR_ROOM_ID)
|
|
86
|
+
return 'avatar-hub';
|
|
87
|
+
if (!roomId.startsWith(GAME_ROOM_PREFIX))
|
|
88
|
+
return null;
|
|
89
|
+
const rest = roomId.slice(GAME_ROOM_PREFIX.length);
|
|
90
|
+
if (!rest)
|
|
91
|
+
return null;
|
|
92
|
+
const instanced = /^(.+)-(\d+)$/.exec(rest);
|
|
93
|
+
return instanced ? instanced[1] : rest;
|
|
94
|
+
}
|
|
95
|
+
/** True when roomId is the base room or a numbered instance of gameSlug. */
|
|
96
|
+
export function isRoomForGame(roomId, gameSlug) {
|
|
97
|
+
if (!gameSlug)
|
|
98
|
+
return false;
|
|
99
|
+
if (roomId === gameRoomId(gameSlug))
|
|
100
|
+
return true;
|
|
101
|
+
const prefix = `${GAME_ROOM_PREFIX}${gameSlug}-`;
|
|
102
|
+
if (!roomId.startsWith(prefix))
|
|
103
|
+
return false;
|
|
104
|
+
const instance = roomId.slice(prefix.length);
|
|
105
|
+
return /^\d+$/.test(instance) && Number(instance) > 1;
|
|
106
|
+
}
|
|
107
|
+
//# sourceMappingURL=protocol.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"protocol.js","sourceRoot":"","sources":["../src/protocol.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
export type LobbyQualityLevel = 'low' | 'medium' | 'high';
|
|
2
|
+
export interface LobbyQualitySettings {
|
|
3
|
+
pixelRatioCap: number;
|
|
4
|
+
antialias: boolean;
|
|
5
|
+
bloom: boolean;
|
|
6
|
+
bloomKernel: number;
|
|
7
|
+
bloomWeight: number;
|
|
8
|
+
fxaa: boolean;
|
|
9
|
+
}
|
|
10
|
+
export declare const LOBBY_QUALITY: Record<LobbyQualityLevel, LobbyQualitySettings>;
|
|
11
|
+
export declare function isTouchDevice(): boolean;
|
|
12
|
+
/** Lobby is lighter than a full match — mobile never starts on the desktop "high" preset. */
|
|
13
|
+
export declare function detectLobbyQuality(): LobbyQualityLevel;
|
|
14
|
+
export declare function resolveLobbyQuality(quality: LobbyQualityLevel | 'auto' | undefined): LobbyQualityLevel;
|
|
15
|
+
export declare function lobbyQualitySettings(quality: LobbyQualityLevel | 'auto' | undefined): LobbyQualitySettings;
|
|
16
|
+
/**
|
|
17
|
+
* Extra PBR maps are ~10MB VRAM each unique body. Phones and crowded rooms
|
|
18
|
+
* cannot hold that for dozens of players — albedo alone is enough at lobby scale.
|
|
19
|
+
*/
|
|
20
|
+
export declare function shouldTrimAvatarDetailMaps(opts: {
|
|
21
|
+
quality: LobbyQualityLevel;
|
|
22
|
+
touch: boolean;
|
|
23
|
+
avatarCount: number;
|
|
24
|
+
}): boolean;
|
|
25
|
+
export declare function shouldDisableLobbyBloom(opts: {
|
|
26
|
+
quality: LobbyQualityLevel;
|
|
27
|
+
touch: boolean;
|
|
28
|
+
avatarCount: number;
|
|
29
|
+
}): boolean;
|
|
30
|
+
/** Distance bands for remote avatar animation cadence (simple, not a LOD system). */
|
|
31
|
+
export declare const LOBBY_AVATAR_ANIM_FULL_DIST = 20;
|
|
32
|
+
export declare const LOBBY_AVATAR_ANIM_HALF_DIST = 34;
|
|
33
|
+
export declare const LOBBY_AVATAR_ANIM_QUARTER_DIST = 48;
|
|
34
|
+
/**
|
|
35
|
+
* How many frames between remote bone/anim updates.
|
|
36
|
+
* Near avatars stay at 1; far ones skip work without changing movement sync.
|
|
37
|
+
*/
|
|
38
|
+
export declare function remoteAvatarAnimStride(distSq: number): number;
|
|
39
|
+
//# sourceMappingURL=quality.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.d.ts","sourceRoot":"","sources":["../src/quality.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,iBAAiB,GAAG,KAAK,GAAG,QAAQ,GAAG,MAAM,CAAC;AAE1D,MAAM,WAAW,oBAAoB;IACnC,aAAa,EAAE,MAAM,CAAC;IACtB,SAAS,EAAE,OAAO,CAAC;IACnB,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;IACpB,WAAW,EAAE,MAAM,CAAC;IACpB,IAAI,EAAE,OAAO,CAAC;CACf;AAED,eAAO,MAAM,aAAa,EAAE,MAAM,CAAC,iBAAiB,EAAE,oBAAoB,CAyBzE,CAAC;AAEF,wBAAgB,aAAa,IAAI,OAAO,CAKvC;AAED,6FAA6F;AAC7F,wBAAgB,kBAAkB,IAAI,iBAAiB,CAUtD;AAED,wBAAgB,mBAAmB,CACjC,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAC9C,iBAAiB,CAGnB;AAED,wBAAgB,oBAAoB,CAClC,OAAO,EAAE,iBAAiB,GAAG,MAAM,GAAG,SAAS,GAC9C,oBAAoB,CAEtB;AAED;;;GAGG;AACH,wBAAgB,0BAA0B,CAAC,IAAI,EAAE;IAC/C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAKV;AAED,wBAAgB,uBAAuB,CAAC,IAAI,EAAE;IAC5C,OAAO,EAAE,iBAAiB,CAAC;IAC3B,KAAK,EAAE,OAAO,CAAC;IACf,WAAW,EAAE,MAAM,CAAC;CACrB,GAAG,OAAO,CAIV;AAED,qFAAqF;AACrF,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,2BAA2B,KAAK,CAAC;AAC9C,eAAO,MAAM,8BAA8B,KAAK,CAAC;AAEjD;;;GAGG;AACH,wBAAgB,sBAAsB,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAK7D"}
|
package/dist/quality.js
ADDED
|
@@ -0,0 +1,95 @@
|
|
|
1
|
+
export const LOBBY_QUALITY = {
|
|
2
|
+
low: {
|
|
3
|
+
pixelRatioCap: 1,
|
|
4
|
+
antialias: false,
|
|
5
|
+
bloom: false,
|
|
6
|
+
bloomKernel: 24,
|
|
7
|
+
bloomWeight: 0.12,
|
|
8
|
+
fxaa: true,
|
|
9
|
+
},
|
|
10
|
+
medium: {
|
|
11
|
+
pixelRatioCap: 1.5,
|
|
12
|
+
antialias: true,
|
|
13
|
+
bloom: true,
|
|
14
|
+
bloomKernel: 28,
|
|
15
|
+
bloomWeight: 0.14,
|
|
16
|
+
fxaa: false,
|
|
17
|
+
},
|
|
18
|
+
high: {
|
|
19
|
+
pixelRatioCap: 2,
|
|
20
|
+
antialias: true,
|
|
21
|
+
bloom: true,
|
|
22
|
+
bloomKernel: 32,
|
|
23
|
+
bloomWeight: 0.18,
|
|
24
|
+
fxaa: false,
|
|
25
|
+
},
|
|
26
|
+
};
|
|
27
|
+
export function isTouchDevice() {
|
|
28
|
+
if (typeof navigator !== 'undefined' && navigator.maxTouchPoints > 0)
|
|
29
|
+
return true;
|
|
30
|
+
if (typeof window !== 'undefined' && 'ontouchstart' in window)
|
|
31
|
+
return true;
|
|
32
|
+
if (typeof window !== 'undefined' && window.matchMedia('(pointer: coarse)').matches)
|
|
33
|
+
return true;
|
|
34
|
+
return false;
|
|
35
|
+
}
|
|
36
|
+
/** Lobby is lighter than a full match — mobile never starts on the desktop "high" preset. */
|
|
37
|
+
export function detectLobbyQuality() {
|
|
38
|
+
if (typeof window === 'undefined')
|
|
39
|
+
return 'medium';
|
|
40
|
+
const cores = navigator.hardwareConcurrency ?? 4;
|
|
41
|
+
const memory = navigator.deviceMemory ?? 4;
|
|
42
|
+
if (isTouchDevice()) {
|
|
43
|
+
if (memory <= 2 || cores <= 4)
|
|
44
|
+
return 'low';
|
|
45
|
+
return 'medium';
|
|
46
|
+
}
|
|
47
|
+
if (cores >= 8 && memory >= 8)
|
|
48
|
+
return 'high';
|
|
49
|
+
return 'medium';
|
|
50
|
+
}
|
|
51
|
+
export function resolveLobbyQuality(quality) {
|
|
52
|
+
if (quality && quality !== 'auto')
|
|
53
|
+
return quality;
|
|
54
|
+
return detectLobbyQuality();
|
|
55
|
+
}
|
|
56
|
+
export function lobbyQualitySettings(quality) {
|
|
57
|
+
return LOBBY_QUALITY[resolveLobbyQuality(quality)];
|
|
58
|
+
}
|
|
59
|
+
/**
|
|
60
|
+
* Extra PBR maps are ~10MB VRAM each unique body. Phones and crowded rooms
|
|
61
|
+
* cannot hold that for dozens of players — albedo alone is enough at lobby scale.
|
|
62
|
+
*/
|
|
63
|
+
export function shouldTrimAvatarDetailMaps(opts) {
|
|
64
|
+
if (opts.quality === 'low')
|
|
65
|
+
return true;
|
|
66
|
+
if (opts.touch)
|
|
67
|
+
return true;
|
|
68
|
+
// Unique Meshy bodies burn VRAM fast once a few different presets show up.
|
|
69
|
+
return opts.avatarCount >= 6;
|
|
70
|
+
}
|
|
71
|
+
export function shouldDisableLobbyBloom(opts) {
|
|
72
|
+
if (opts.quality === 'low')
|
|
73
|
+
return true;
|
|
74
|
+
if (opts.touch && opts.avatarCount >= 4)
|
|
75
|
+
return true;
|
|
76
|
+
return opts.avatarCount >= 10;
|
|
77
|
+
}
|
|
78
|
+
/** Distance bands for remote avatar animation cadence (simple, not a LOD system). */
|
|
79
|
+
export const LOBBY_AVATAR_ANIM_FULL_DIST = 20;
|
|
80
|
+
export const LOBBY_AVATAR_ANIM_HALF_DIST = 34;
|
|
81
|
+
export const LOBBY_AVATAR_ANIM_QUARTER_DIST = 48;
|
|
82
|
+
/**
|
|
83
|
+
* How many frames between remote bone/anim updates.
|
|
84
|
+
* Near avatars stay at 1; far ones skip work without changing movement sync.
|
|
85
|
+
*/
|
|
86
|
+
export function remoteAvatarAnimStride(distSq) {
|
|
87
|
+
if (distSq <= LOBBY_AVATAR_ANIM_FULL_DIST * LOBBY_AVATAR_ANIM_FULL_DIST)
|
|
88
|
+
return 1;
|
|
89
|
+
if (distSq <= LOBBY_AVATAR_ANIM_HALF_DIST * LOBBY_AVATAR_ANIM_HALF_DIST)
|
|
90
|
+
return 2;
|
|
91
|
+
if (distSq <= LOBBY_AVATAR_ANIM_QUARTER_DIST * LOBBY_AVATAR_ANIM_QUARTER_DIST)
|
|
92
|
+
return 3;
|
|
93
|
+
return 4;
|
|
94
|
+
}
|
|
95
|
+
//# sourceMappingURL=quality.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"quality.js","sourceRoot":"","sources":["../src/quality.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import type { Scene } from '@babylonjs/core';
|
|
2
|
+
import type { LobbyAnimationState, LobbyEmoteKind, LobbyPlayerState } from './protocol';
|
|
3
|
+
import { type RemoteAvatarLifecycle } from './avatar-instance';
|
|
4
|
+
export declare class RemotePlayerManager {
|
|
5
|
+
private readonly scene;
|
|
6
|
+
private readonly selfUserId;
|
|
7
|
+
private readonly remotes;
|
|
8
|
+
/** userId → in-flight generation (also used as "loading" flag). */
|
|
9
|
+
private readonly loadingGen;
|
|
10
|
+
private generationSeq;
|
|
11
|
+
constructor(scene: Scene, selfUserId: string);
|
|
12
|
+
upsert(player: LobbyPlayerState): void;
|
|
13
|
+
private spawnRemote;
|
|
14
|
+
private isSpawnCurrent;
|
|
15
|
+
applyMove(payload: {
|
|
16
|
+
userId: string;
|
|
17
|
+
position?: LobbyPlayerState['position'];
|
|
18
|
+
rotationY?: number;
|
|
19
|
+
animation?: LobbyAnimationState;
|
|
20
|
+
}): void;
|
|
21
|
+
applyEmote(userId: string, emote: LobbyEmoteKind): void;
|
|
22
|
+
remove(userId: string): void;
|
|
23
|
+
getIdentity(userId: string): {
|
|
24
|
+
displayName: string;
|
|
25
|
+
username: string;
|
|
26
|
+
} | null;
|
|
27
|
+
isRemoteReady(userId: string): boolean;
|
|
28
|
+
getLifecycle(userId: string): RemoteAvatarLifecycle;
|
|
29
|
+
private setDrawVisible;
|
|
30
|
+
update(dt: number): void;
|
|
31
|
+
getPosition(userId: string): LobbyPlayerState['position'] | null;
|
|
32
|
+
list(): {
|
|
33
|
+
userId: string;
|
|
34
|
+
displayName: string;
|
|
35
|
+
avatar: import("./protocol").SdkLobbyAvatar;
|
|
36
|
+
position: {
|
|
37
|
+
x: number;
|
|
38
|
+
y: number;
|
|
39
|
+
z: number;
|
|
40
|
+
};
|
|
41
|
+
rotationY: number;
|
|
42
|
+
animation: LobbyAnimationState;
|
|
43
|
+
ready: boolean;
|
|
44
|
+
lifecycle: RemoteAvatarLifecycle;
|
|
45
|
+
}[];
|
|
46
|
+
dispose(): void;
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=remote-player-manager.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"remote-player-manager.d.ts","sourceRoot":"","sources":["../src/remote-player-manager.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAU,KAAK,EAAE,MAAM,iBAAiB,CAAC;AACrD,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAGxF,OAAO,EAAkB,KAAK,qBAAqB,EAAE,MAAM,mBAAmB,CAAC;AAkE/E,qBAAa,mBAAmB;IAO5B,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,UAAU;IAP7B,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAkC;IAC1D,mEAAmE;IACnE,OAAO,CAAC,QAAQ,CAAC,UAAU,CAA6B;IACxD,OAAO,CAAC,aAAa,CAAK;gBAGP,KAAK,EAAE,KAAK,EACZ,UAAU,EAAE,MAAM;IAGrC,MAAM,CAAC,MAAM,EAAE,gBAAgB;YAmBjB,WAAW;IA2IzB,OAAO,CAAC,cAAc;IAItB,SAAS,CAAC,OAAO,EAAE;QACjB,MAAM,EAAE,MAAM,CAAC;QACf,QAAQ,CAAC,EAAE,gBAAgB,CAAC,UAAU,CAAC,CAAC;QACxC,SAAS,CAAC,EAAE,MAAM,CAAC;QACnB,SAAS,CAAC,EAAE,mBAAmB,CAAC;KACjC;IASD,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,cAAc;IAMhD,MAAM,CAAC,MAAM,EAAE,MAAM;IAWrB,WAAW,CAAC,MAAM,EAAE,MAAM;;;;IAS1B,aAAa,CAAC,MAAM,EAAE,MAAM;IAK5B,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,qBAAqB;IAInD,OAAO,CAAC,cAAc;IAStB,MAAM,CAAC,EAAE,EAAE,MAAM;IAkEjB,WAAW,CAAC,MAAM,EAAE,MAAM,GAAG,gBAAgB,CAAC,UAAU,CAAC,GAAG,IAAI;IAMhE,IAAI;;;;;;;;;;;;;;IAaJ,OAAO;CASR"}
|