@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,182 @@
|
|
|
1
|
+
import { io } from 'socket.io-client';
|
|
2
|
+
import { LOBBY_PROTOCOL_VERSION } from './protocol';
|
|
3
|
+
export class NetworkClient {
|
|
4
|
+
wsUrl;
|
|
5
|
+
roomId;
|
|
6
|
+
sessionToken;
|
|
7
|
+
handlers;
|
|
8
|
+
connectOptions;
|
|
9
|
+
socket = null;
|
|
10
|
+
moveSeq = 0;
|
|
11
|
+
reconnectAttempts = 0;
|
|
12
|
+
maxReconnectAttempts = 8;
|
|
13
|
+
constructor(wsUrl, roomId, sessionToken, handlers = {}, connectOptions = {}) {
|
|
14
|
+
this.wsUrl = wsUrl;
|
|
15
|
+
this.roomId = roomId;
|
|
16
|
+
this.sessionToken = sessionToken;
|
|
17
|
+
this.handlers = handlers;
|
|
18
|
+
this.connectOptions = connectOptions;
|
|
19
|
+
}
|
|
20
|
+
connect() {
|
|
21
|
+
const url = this.wsUrl.replace(/\/lobby\/?$/, '');
|
|
22
|
+
this.socket = io(`${url}/lobby`, {
|
|
23
|
+
transports: ['websocket'],
|
|
24
|
+
query: {
|
|
25
|
+
sessionToken: this.sessionToken,
|
|
26
|
+
roomId: this.roomId,
|
|
27
|
+
protocolVersion: LOBBY_PROTOCOL_VERSION,
|
|
28
|
+
...(this.connectOptions.strictRoom ? { strictRoom: '1' } : {}),
|
|
29
|
+
},
|
|
30
|
+
reconnection: true,
|
|
31
|
+
reconnectionAttempts: this.maxReconnectAttempts,
|
|
32
|
+
reconnectionDelay: 1000,
|
|
33
|
+
reconnectionDelayMax: 8000,
|
|
34
|
+
});
|
|
35
|
+
this.socket.on('connect', () => {
|
|
36
|
+
this.reconnectAttempts = 0;
|
|
37
|
+
this.handlers.onConnected?.();
|
|
38
|
+
});
|
|
39
|
+
this.socket.on('disconnect', () => {
|
|
40
|
+
this.handlers.onDisconnected?.();
|
|
41
|
+
});
|
|
42
|
+
this.socket.on('message', (msg) => this.handleServerMessage(msg));
|
|
43
|
+
this.socket.io.on('reconnect_attempt', (attempt) => {
|
|
44
|
+
this.reconnectAttempts = attempt;
|
|
45
|
+
this.handlers.onReconnecting?.(attempt);
|
|
46
|
+
});
|
|
47
|
+
this.socket.io.on('reconnect_failed', () => {
|
|
48
|
+
this.handlers.onReconnectFailed?.();
|
|
49
|
+
});
|
|
50
|
+
}
|
|
51
|
+
handleServerMessage(msg) {
|
|
52
|
+
switch (msg.type) {
|
|
53
|
+
case 'lobby:welcome':
|
|
54
|
+
this.handlers.onWelcome?.(msg.self, msg.players, {
|
|
55
|
+
friendUserIds: msg.friendUserIds,
|
|
56
|
+
voicePeers: msg.voicePeers,
|
|
57
|
+
lobbyFeatures: msg.lobbyFeatures,
|
|
58
|
+
});
|
|
59
|
+
break;
|
|
60
|
+
case 'lobby:player:joined':
|
|
61
|
+
this.handlers.onPlayerJoined?.(msg.player);
|
|
62
|
+
break;
|
|
63
|
+
case 'lobby:player:left':
|
|
64
|
+
this.handlers.onPlayerLeft?.({
|
|
65
|
+
userId: msg.userId,
|
|
66
|
+
username: msg.username,
|
|
67
|
+
displayName: msg.displayName,
|
|
68
|
+
});
|
|
69
|
+
break;
|
|
70
|
+
case 'lobby:player:moved':
|
|
71
|
+
this.handlers.onPlayerMoved?.(msg);
|
|
72
|
+
break;
|
|
73
|
+
case 'lobby:players:moved':
|
|
74
|
+
this.handlers.onPlayersMoved?.(msg.moves, msg.serverTime);
|
|
75
|
+
break;
|
|
76
|
+
case 'lobby:player:emote':
|
|
77
|
+
this.handlers.onPlayerEmote?.(msg.userId, msg.emote);
|
|
78
|
+
break;
|
|
79
|
+
case 'lobby:chat':
|
|
80
|
+
this.handlers.onChat?.(msg);
|
|
81
|
+
break;
|
|
82
|
+
case 'lobby:data':
|
|
83
|
+
this.handlers.onData?.(msg);
|
|
84
|
+
break;
|
|
85
|
+
case 'lobby:voice:state':
|
|
86
|
+
this.handlers.onVoiceState?.(msg.peers, msg.friendUserIds);
|
|
87
|
+
break;
|
|
88
|
+
case 'lobby:voice:joined':
|
|
89
|
+
this.handlers.onVoiceJoined?.(msg.peer);
|
|
90
|
+
break;
|
|
91
|
+
case 'lobby:voice:left':
|
|
92
|
+
this.handlers.onVoiceLeft?.(msg.userId);
|
|
93
|
+
break;
|
|
94
|
+
case 'lobby:voice:mute':
|
|
95
|
+
this.handlers.onVoiceMute?.(msg.userId, msg.muted);
|
|
96
|
+
break;
|
|
97
|
+
case 'lobby:voice:offer':
|
|
98
|
+
this.handlers.onVoiceOffer?.(msg.fromUserId, msg.sdp);
|
|
99
|
+
break;
|
|
100
|
+
case 'lobby:voice:answer':
|
|
101
|
+
this.handlers.onVoiceAnswer?.(msg.fromUserId, msg.sdp);
|
|
102
|
+
break;
|
|
103
|
+
case 'lobby:voice:ice':
|
|
104
|
+
this.handlers.onVoiceIce?.(msg.fromUserId, msg.candidate);
|
|
105
|
+
break;
|
|
106
|
+
case 'lobby:error':
|
|
107
|
+
this.handlers.onError?.(msg.code, msg.message);
|
|
108
|
+
break;
|
|
109
|
+
default:
|
|
110
|
+
break;
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
sendMove(payload) {
|
|
114
|
+
if (!this.socket?.connected)
|
|
115
|
+
return;
|
|
116
|
+
this.moveSeq += 1;
|
|
117
|
+
const msg = {
|
|
118
|
+
type: 'lobby:move',
|
|
119
|
+
...payload,
|
|
120
|
+
seq: this.moveSeq,
|
|
121
|
+
};
|
|
122
|
+
this.socket.emit('message', msg);
|
|
123
|
+
}
|
|
124
|
+
sendEmote(emote) {
|
|
125
|
+
if (!this.socket?.connected)
|
|
126
|
+
return;
|
|
127
|
+
this.socket.emit('message', { type: 'lobby:emote', emote });
|
|
128
|
+
}
|
|
129
|
+
sendChat(text) {
|
|
130
|
+
if (!this.socket?.connected)
|
|
131
|
+
return;
|
|
132
|
+
this.socket.emit('message', { type: 'lobby:chat', text });
|
|
133
|
+
}
|
|
134
|
+
sendData(channel, payload) {
|
|
135
|
+
if (!this.socket?.connected)
|
|
136
|
+
return;
|
|
137
|
+
this.socket.emit('message', { type: 'lobby:data', channel, payload });
|
|
138
|
+
}
|
|
139
|
+
sendVoiceJoin(mode) {
|
|
140
|
+
if (!this.socket?.connected)
|
|
141
|
+
return;
|
|
142
|
+
this.socket.emit('message', { type: 'lobby:voice:join', mode });
|
|
143
|
+
}
|
|
144
|
+
sendVoiceLeave() {
|
|
145
|
+
if (!this.socket?.connected)
|
|
146
|
+
return;
|
|
147
|
+
this.socket.emit('message', { type: 'lobby:voice:leave' });
|
|
148
|
+
}
|
|
149
|
+
sendVoiceMute(muted) {
|
|
150
|
+
if (!this.socket?.connected)
|
|
151
|
+
return;
|
|
152
|
+
this.socket.emit('message', { type: 'lobby:voice:mute', muted });
|
|
153
|
+
}
|
|
154
|
+
sendVoiceOffer(toUserId, sdp) {
|
|
155
|
+
if (!this.socket?.connected)
|
|
156
|
+
return;
|
|
157
|
+
this.socket.emit('message', { type: 'lobby:voice:offer', toUserId, sdp });
|
|
158
|
+
}
|
|
159
|
+
sendVoiceAnswer(toUserId, sdp) {
|
|
160
|
+
if (!this.socket?.connected)
|
|
161
|
+
return;
|
|
162
|
+
this.socket.emit('message', { type: 'lobby:voice:answer', toUserId, sdp });
|
|
163
|
+
}
|
|
164
|
+
sendVoiceIce(toUserId, candidate) {
|
|
165
|
+
if (!this.socket?.connected)
|
|
166
|
+
return;
|
|
167
|
+
this.socket.emit('message', { type: 'lobby:voice:ice', toUserId, candidate });
|
|
168
|
+
}
|
|
169
|
+
ping() {
|
|
170
|
+
if (!this.socket?.connected)
|
|
171
|
+
return;
|
|
172
|
+
this.socket.emit('message', { type: 'lobby:ping' });
|
|
173
|
+
}
|
|
174
|
+
disconnect() {
|
|
175
|
+
this.socket?.disconnect();
|
|
176
|
+
this.socket = null;
|
|
177
|
+
}
|
|
178
|
+
isConnected() {
|
|
179
|
+
return Boolean(this.socket?.connected);
|
|
180
|
+
}
|
|
181
|
+
}
|
|
182
|
+
//# sourceMappingURL=network-client.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"network-client.js","sourceRoot":"","sources":["../src/network-client.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { PlatformInitMessage, SdkInitPayload } from './platform-types';
|
|
2
|
+
declare global {
|
|
3
|
+
interface Window {
|
|
4
|
+
__OYNA360_PLATFORM_INIT__?: PlatformInitMessage;
|
|
5
|
+
}
|
|
6
|
+
}
|
|
7
|
+
export declare class PlatformBridge {
|
|
8
|
+
static waitForInit(timeoutMs?: number): Promise<PlatformInitMessage>;
|
|
9
|
+
static fromInit(init: SdkInitPayload | PlatformInitMessage): SdkInitPayload;
|
|
10
|
+
static createDevInit(options: {
|
|
11
|
+
mockUser?: Partial<SdkInitPayload['user']>;
|
|
12
|
+
mockAvatar?: Partial<SdkInitPayload['avatar']>;
|
|
13
|
+
gameSlug?: string;
|
|
14
|
+
gameName?: string;
|
|
15
|
+
}): SdkInitPayload;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=platform-bridge.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-bridge.d.ts","sourceRoot":"","sources":["../src/platform-bridge.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,mBAAmB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAI5E,OAAO,CAAC,MAAM,CAAC;IACb,UAAU,MAAM;QACd,yBAAyB,CAAC,EAAE,mBAAmB,CAAC;KACjD;CACF;AAYD,qBAAa,cAAc;IACzB,MAAM,CAAC,WAAW,CAAC,SAAS,SAAkB,GAAG,OAAO,CAAC,mBAAmB,CAAC;IA4C7E,MAAM,CAAC,QAAQ,CAAC,IAAI,EAAE,cAAc,GAAG,mBAAmB,GAAG,cAAc;IAc3E,MAAM,CAAC,aAAa,CAAC,OAAO,EAAE;QAC5B,QAAQ,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,MAAM,CAAC,CAAC,CAAC;QAC3C,UAAU,CAAC,EAAE,OAAO,CAAC,cAAc,CAAC,QAAQ,CAAC,CAAC,CAAC;QAC/C,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;KACnB,GAAG,cAAc;CA0BnB"}
|
|
@@ -0,0 +1,90 @@
|
|
|
1
|
+
const INIT_TIMEOUT_MS = 15000;
|
|
2
|
+
if (typeof window !== 'undefined') {
|
|
3
|
+
window.addEventListener('message', (event) => {
|
|
4
|
+
const data = event.data;
|
|
5
|
+
if (!data || typeof data !== 'object')
|
|
6
|
+
return;
|
|
7
|
+
if (data.type === 'platform:init') {
|
|
8
|
+
window.__OYNA360_PLATFORM_INIT__ = data;
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
}
|
|
12
|
+
export class PlatformBridge {
|
|
13
|
+
static waitForInit(timeoutMs = INIT_TIMEOUT_MS) {
|
|
14
|
+
return new Promise((resolve, reject) => {
|
|
15
|
+
// Direct Development: game-sdk may have already published platform:init on this window.
|
|
16
|
+
if (window.__OYNA360_PLATFORM_INIT__) {
|
|
17
|
+
resolve(window.__OYNA360_PLATFORM_INIT__);
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const inIframe = (() => {
|
|
21
|
+
try {
|
|
22
|
+
return window.parent !== window;
|
|
23
|
+
}
|
|
24
|
+
catch {
|
|
25
|
+
return true;
|
|
26
|
+
}
|
|
27
|
+
})();
|
|
28
|
+
const timer = setTimeout(() => {
|
|
29
|
+
window.removeEventListener('message', onMessage);
|
|
30
|
+
reject(new Error(inIframe
|
|
31
|
+
? 'Timed out waiting for platform:init'
|
|
32
|
+
: 'Timed out waiting for platform:init — call PlatformSDK.init() first (Direct Development Mode)'));
|
|
33
|
+
}, timeoutMs);
|
|
34
|
+
const onMessage = (event) => {
|
|
35
|
+
const data = event.data;
|
|
36
|
+
if (!data || typeof data !== 'object')
|
|
37
|
+
return;
|
|
38
|
+
if (data.type !== 'platform:init')
|
|
39
|
+
return;
|
|
40
|
+
clearTimeout(timer);
|
|
41
|
+
window.removeEventListener('message', onMessage);
|
|
42
|
+
resolve(data);
|
|
43
|
+
};
|
|
44
|
+
window.addEventListener('message', onMessage);
|
|
45
|
+
if (inIframe) {
|
|
46
|
+
window.parent.postMessage({ type: 'platform:lobby:ready' }, '*');
|
|
47
|
+
}
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
static fromInit(init) {
|
|
51
|
+
if ('type' in init && init.type === 'platform:init') {
|
|
52
|
+
return {
|
|
53
|
+
session: init.session,
|
|
54
|
+
user: init.user,
|
|
55
|
+
game: init.game,
|
|
56
|
+
avatar: init.avatar,
|
|
57
|
+
avatarBases: init.avatarBases,
|
|
58
|
+
lobby: init.lobby,
|
|
59
|
+
};
|
|
60
|
+
}
|
|
61
|
+
return init;
|
|
62
|
+
}
|
|
63
|
+
static createDevInit(options) {
|
|
64
|
+
return {
|
|
65
|
+
session: { id: 'dev-session', token: 'dev-token' },
|
|
66
|
+
user: {
|
|
67
|
+
id: 'dev-user',
|
|
68
|
+
username: 'dev_player',
|
|
69
|
+
displayName: 'Dev Player',
|
|
70
|
+
avatarUrl: null,
|
|
71
|
+
...options.mockUser,
|
|
72
|
+
},
|
|
73
|
+
game: {
|
|
74
|
+
slug: options.gameSlug ?? 'dev-game',
|
|
75
|
+
name: options.gameName ?? 'Dev Game',
|
|
76
|
+
},
|
|
77
|
+
avatar: {
|
|
78
|
+
presetId: 'dev-preset',
|
|
79
|
+
presetKey: options.mockAvatar?.presetKey ?? 'default-1',
|
|
80
|
+
presetKind: options.mockAvatar?.presetKind ?? 'procedural',
|
|
81
|
+
customConfig: options.mockAvatar?.customConfig ?? { bodyColor: '#6366f1' },
|
|
82
|
+
},
|
|
83
|
+
lobby: {
|
|
84
|
+
wsUrl: 'http://localhost:3001/lobby',
|
|
85
|
+
roomId: `game:${options.gameSlug ?? 'dev-game'}`,
|
|
86
|
+
},
|
|
87
|
+
};
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
//# sourceMappingURL=platform-bridge.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-bridge.js","sourceRoot":"","sources":["../src/platform-bridge.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,176 @@
|
|
|
1
|
+
import '@babylonjs/loaders/glTF';
|
|
2
|
+
import type { SdkInitPayload } from './platform-types';
|
|
3
|
+
import { type LobbyEmoteKind, type LobbyPlayerState, type LobbyFeatureFlags } from './protocol';
|
|
4
|
+
import { type AvatarBaseDef } from './avatar-asset-manager';
|
|
5
|
+
import { LocalPlayerController } from './local-player-controller';
|
|
6
|
+
import type { LobbyPlugin } from './types';
|
|
7
|
+
import { type StarterLayoutConfig } from './starter-layout';
|
|
8
|
+
import { type PlazaLayoutConfig } from './plaza-layout';
|
|
9
|
+
import { LobbyVoiceChat } from './voice-chat';
|
|
10
|
+
import type { LobbyEventMap, LobbyEventName, LobbyPortalOptions, LobbyZoneOptions, PlatformLobbyConfig, PlatformLobbyCreateOptions, PlatformLobbyDevOptions, Vector3 } from './types';
|
|
11
|
+
export declare class PlatformLobby {
|
|
12
|
+
private readonly canvas;
|
|
13
|
+
private readonly strictRoom;
|
|
14
|
+
private readonly init;
|
|
15
|
+
private readonly config;
|
|
16
|
+
private readonly roomId;
|
|
17
|
+
private readonly wsUrl;
|
|
18
|
+
private sceneManager;
|
|
19
|
+
private localAvatar;
|
|
20
|
+
private localController;
|
|
21
|
+
private remotePlayers;
|
|
22
|
+
private network;
|
|
23
|
+
private zoneManager;
|
|
24
|
+
private portalManager;
|
|
25
|
+
private plugins;
|
|
26
|
+
private overlayHandlers;
|
|
27
|
+
private listeners;
|
|
28
|
+
private lastNetworkSend;
|
|
29
|
+
private destroyed;
|
|
30
|
+
private ready;
|
|
31
|
+
private playground;
|
|
32
|
+
private music;
|
|
33
|
+
private chatDispose;
|
|
34
|
+
private presenceDispose;
|
|
35
|
+
private voiceDispose;
|
|
36
|
+
private connectionDispose;
|
|
37
|
+
private orientationDispose;
|
|
38
|
+
private voiceChat;
|
|
39
|
+
private lobbyFeatures;
|
|
40
|
+
private resizeHandler;
|
|
41
|
+
private constructor();
|
|
42
|
+
static create(options: PlatformLobbyCreateOptions): Promise<PlatformLobby>;
|
|
43
|
+
static createFromPlatform(canvas: HTMLCanvasElement, config?: PlatformLobbyConfig): Promise<PlatformLobby>;
|
|
44
|
+
static createDev(options: PlatformLobbyDevOptions): Promise<PlatformLobby>;
|
|
45
|
+
private bootstrap;
|
|
46
|
+
/**
|
|
47
|
+
* DIAG ONLY: upsert a synthetic remote player for performance measurement.
|
|
48
|
+
* Does not change multiplayer protocol behavior.
|
|
49
|
+
*/
|
|
50
|
+
diagUpsertRemote(player: LobbyPlayerState): void;
|
|
51
|
+
/** DIAG ONLY: remove a synthetic/remote player used for measurement. */
|
|
52
|
+
diagRemoveRemote(userId: string): void;
|
|
53
|
+
/** DIAG ONLY: wait until a remote userId appears in the remote list (or timeout). */
|
|
54
|
+
diagWaitRemote(userId: string, timeoutMs?: number): Promise<boolean>;
|
|
55
|
+
/** DIAG ONLY: wait until remote GLB/placeholder swap finished. */
|
|
56
|
+
diagWaitRemoteReady(userId: string, timeoutMs?: number): Promise<boolean>;
|
|
57
|
+
/** Register shared base avatar GLBs (catalog). Does not load until preload/spawn. */
|
|
58
|
+
registerAvatarBases(defs: readonly AvatarBaseDef[]): void;
|
|
59
|
+
registerAvatarBase(def: AvatarBaseDef): void;
|
|
60
|
+
listAvatarBases(): AvatarBaseDef[];
|
|
61
|
+
isAvatarBaseCached(id: string): boolean;
|
|
62
|
+
/**
|
|
63
|
+
* Warm container cache for one base. Non-throwing; returns null on failure.
|
|
64
|
+
* Safe to call after bootstrap — does not block the render loop by itself.
|
|
65
|
+
*/
|
|
66
|
+
preloadAvatarBase(id: string): Promise<import("@babylonjs/core").AssetContainer | null>;
|
|
67
|
+
/**
|
|
68
|
+
* Warm container cache for bases (all registered if ids omitted).
|
|
69
|
+
* Failures are per-id; lobby continues on the normal async spawn path.
|
|
70
|
+
*/
|
|
71
|
+
preloadAvatarBases(ids?: readonly string[]): Promise<{
|
|
72
|
+
id: string;
|
|
73
|
+
ok: boolean;
|
|
74
|
+
}[]>;
|
|
75
|
+
/** Apply config.avatarBases + init.avatarBases + optional fire-and-forget preload (non-blocking). */
|
|
76
|
+
private applyConfiguredAvatarBases;
|
|
77
|
+
/** DIAG ONLY: update synthetic remote move/animation targets (no network). */
|
|
78
|
+
diagApplyRemoteMove(payload: {
|
|
79
|
+
userId: string;
|
|
80
|
+
position?: LobbyPlayerState['position'];
|
|
81
|
+
rotationY?: number;
|
|
82
|
+
animation?: import('./protocol').LobbyAnimationState;
|
|
83
|
+
}): void;
|
|
84
|
+
private connectNetwork;
|
|
85
|
+
on<E extends LobbyEventName>(event: E, handler: (payload: LobbyEventMap[E]) => void): () => void;
|
|
86
|
+
off<E extends LobbyEventName>(event: E, handler: (payload: LobbyEventMap[E]) => void): void;
|
|
87
|
+
private emit;
|
|
88
|
+
use(plugin: LobbyPlugin): this;
|
|
89
|
+
/** Optional starter-plaza template. Appearance and start routing stay in the game. */
|
|
90
|
+
applyPlazaLayout(config?: PlazaLayoutConfig): this;
|
|
91
|
+
applyStarterLayout(config?: StarterLayoutConfig): this;
|
|
92
|
+
attachDebug(win?: Window): import("./lobby-debug").LobbyDebugHandle;
|
|
93
|
+
getDebugReport(): import("./lobby-debug").LobbyDebugReport;
|
|
94
|
+
addZone(options: LobbyZoneOptions): void;
|
|
95
|
+
/**
|
|
96
|
+
* Game-owned portal. The SDK only detects the player and fires `onTrigger` / `portalTrigger`.
|
|
97
|
+
* It never navigates the browser — the game starts its own gameplay.
|
|
98
|
+
*/
|
|
99
|
+
addPortal(options: LobbyPortalOptions): void;
|
|
100
|
+
/** Platform identity: user, avatar, session, room. */
|
|
101
|
+
getSession(): import("./platform-types").SdkSession;
|
|
102
|
+
getUser(): import("./platform-types").SdkUser;
|
|
103
|
+
getAvatar(): import("./platform-types").SdkLobbyAvatar;
|
|
104
|
+
/** Other players currently synced in this lobby room. */
|
|
105
|
+
getPlayers(): {
|
|
106
|
+
userId: string;
|
|
107
|
+
displayName: string;
|
|
108
|
+
avatar: import("./protocol").SdkLobbyAvatar;
|
|
109
|
+
position: {
|
|
110
|
+
x: number;
|
|
111
|
+
y: number;
|
|
112
|
+
z: number;
|
|
113
|
+
};
|
|
114
|
+
rotationY: number;
|
|
115
|
+
animation: import("./protocol").LobbyAnimationState;
|
|
116
|
+
ready: boolean;
|
|
117
|
+
lifecycle: import("./avatar-instance").RemoteAvatarLifecycle;
|
|
118
|
+
}[];
|
|
119
|
+
loadGLB(url: string, name?: string): Promise<import("@babylonjs/core").AbstractMesh>;
|
|
120
|
+
onOverlay(id: string, handler: (payload: unknown) => void): void;
|
|
121
|
+
emitOverlay(id: string, payload: unknown): void;
|
|
122
|
+
playEmote(emote: LobbyEmoteKind): void;
|
|
123
|
+
/** Live lobby chat. Not saved. Always echoes locally so the sender sees the line. */
|
|
124
|
+
sendChat(text: string): boolean;
|
|
125
|
+
/**
|
|
126
|
+
* Ephemeral game data for this lobby room (matchmaking, pad sync, …).
|
|
127
|
+
* Independent of chat — works when chat is disabled/banned.
|
|
128
|
+
* Local-echoes so the sender sees the same `data` event as peers.
|
|
129
|
+
* Prefer namespaced channels: `{gameSlug}.{feature}` (e.g. `fc.pad-room`).
|
|
130
|
+
*/
|
|
131
|
+
sendData(channel: string, payload: string): boolean;
|
|
132
|
+
attachChat(): this;
|
|
133
|
+
attachVoice(): this;
|
|
134
|
+
getVoiceChat(): LobbyVoiceChat | null;
|
|
135
|
+
getLobbyFeatures(): LobbyFeatureFlags;
|
|
136
|
+
canUseChat(): boolean;
|
|
137
|
+
/** Game data channel — defaults on when flags are omitted. */
|
|
138
|
+
canUseData(): boolean;
|
|
139
|
+
canUseVoice(): boolean;
|
|
140
|
+
/** Virtual joystick / on-screen pad. x = strafe, z = forward (-1..1). */
|
|
141
|
+
setMoveStick(x: number, z: number): void;
|
|
142
|
+
setLookStick(x: number, y: number): void;
|
|
143
|
+
addLookDelta(dx: number, dy: number): void;
|
|
144
|
+
/** Game-side camera distance (third-person orbit radius). */
|
|
145
|
+
setCameraOrbit(radius: number, limits?: {
|
|
146
|
+
lower?: number;
|
|
147
|
+
upper?: number;
|
|
148
|
+
}): void;
|
|
149
|
+
tryPlaygroundInteract(): boolean;
|
|
150
|
+
getLocalController(): LocalPlayerController;
|
|
151
|
+
noteMusicToggle(): void;
|
|
152
|
+
toggleMusic(): boolean;
|
|
153
|
+
setMusicMuted(muted: boolean): void;
|
|
154
|
+
isMusicMuted(): boolean;
|
|
155
|
+
jump(): void;
|
|
156
|
+
setJumpHeld(on: boolean): void;
|
|
157
|
+
setSprint(on: boolean): void;
|
|
158
|
+
/** Ask the hub to close this lobby iframe and return home. Never navigates itself. */
|
|
159
|
+
requestExit(): void;
|
|
160
|
+
getInitPayload(): SdkInitPayload;
|
|
161
|
+
getLocalPose(): {
|
|
162
|
+
position: {
|
|
163
|
+
x: number;
|
|
164
|
+
y: number;
|
|
165
|
+
z: number;
|
|
166
|
+
};
|
|
167
|
+
rotationY: number;
|
|
168
|
+
animation: import("./protocol").LobbyAnimationState;
|
|
169
|
+
};
|
|
170
|
+
getScene(): import("@babylonjs/core").Scene;
|
|
171
|
+
getUiLocale(): "fa" | "en";
|
|
172
|
+
getEngine(): import("@babylonjs/core").Engine;
|
|
173
|
+
addMeshAt(position: Vector3, size?: number): import("@babylonjs/core").Mesh;
|
|
174
|
+
destroy(): void;
|
|
175
|
+
}
|
|
176
|
+
//# sourceMappingURL=platform-lobby.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"platform-lobby.d.ts","sourceRoot":"","sources":["../src/platform-lobby.ts"],"names":[],"mappings":"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"}
|