janusweb 1.5.51 → 1.5.52

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/css/janusweb.css CHANGED
@@ -309,3 +309,10 @@ fireboxroom room,
309
309
  fireboxroom assets {
310
310
  display: none;
311
311
  }
312
+ janus-ui-main ui-panel {
313
+ opacity: 1;
314
+ }
315
+ janus-ui-main.fadeout ui-panel {
316
+ opacity: 0;
317
+ transition: opacity 2s ease-out;
318
+ }
@@ -67,7 +67,7 @@ elation.elements.define('janus-avatar-picker', class extends elation.elements.ba
67
67
  <ui-list name="avatar" selectable="1" collection="avatarlist" itemcomponent="janus-avatar-picker-item"></ui-list>
68
68
  </ui-tab>
69
69
  <ui-tab label="Ready Player Me">
70
- <iframe data-src="https://demo.readyplayer.me/avatar" allow="camera"></iframe>
70
+ <iframe data-src="https://demo.readyplayer.me/avatar?frameApi" allow="camera"></iframe>
71
71
  </ui-tab>
72
72
  </ui-tabs>
73
73
  `;
@@ -226,20 +226,54 @@ this.appendChild(this.previewwindow);
226
226
  }
227
227
  handleWindowMessage(ev) {
228
228
  if (ev.origin.match(/https:\/\/.*\.readyplayer\.me/)) {
229
- let avatarurl = ev.data;
230
- let avatarstr = `
231
- <FireBoxRoom>
232
- <assets>
233
- <assetobject id="body" src="${avatarurl}" />
234
- <assetobject id="avatar_animations" src="https://assets.metacade.com/james/readyplayerme/animations.glb" />
235
- </assets>
236
- <room>
237
- <ghost body_id="body" bone_head="Head" morphtarget_mouth="mouthOpen" morphtarget_eyes="eyesClosed" />
238
- </room>
239
- </FireBoxRoom>
240
- `;
241
- player.setAvatar(avatarstr);
242
- this.handleAvatarSelect({data: { url: 'data:text/plain,' + avatarstr } });
229
+ if (ev.data.indexOf('https:') == 0) {
230
+ // raw URL
231
+ let avatarurl = ev.data;
232
+ let avatarstr = `
233
+ <FireBoxRoom>
234
+ <assets>
235
+ <assetobject id="body" src="${avatarurl}" />
236
+ <assetobject id="avatar_animations" src="https://assets.metacade.com/james/readyplayerme/animations.glb" />
237
+ </assets>
238
+ <room>
239
+ <ghost body_id="body" bone_head="Head" morphtarget_mouth="mouthOpen" morphtarget_eyes="eyesClosed" />
240
+ </room>
241
+ </FireBoxRoom>
242
+ `;
243
+ player.setAvatar(avatarstr);
244
+ this.handleAvatarSelect({data: { url: 'data:text/plain,' + avatarstr } });
245
+ } else if (ev.data[0] == '{') {
246
+ // frame API
247
+ let apimsg = JSON.parse(ev.data);
248
+ let frame = this.querySelector('iframe'); // FIXME - hacky
249
+ if (apimsg.eventName == 'v1.frame.ready' && frame && frame.contentWindow) {
250
+ frame.contentWindow.postMessage(JSON.stringify({
251
+ target: 'readyplayerme',
252
+ type: 'subscribe',
253
+ eventName: 'v2.**'
254
+ }), '*');
255
+ } else if (apimsg.eventName == 'v2.avatar.exported') {
256
+ let avatarurl = apimsg.data.url;
257
+ let animurl = 'https://assets.metacade.com/james/readyplayerme/animations.glb';
258
+ if (apimsg.data.metadata.gender == 'female') {
259
+ animurl = 'https://assets.metacade.com/james/readyplayerme/animations-rpm-female.glb';
260
+ }
261
+ // TODO - select avatar pack based on metadata.gender
262
+ let avatarstr = `
263
+ <FireBoxRoom>
264
+ <assets>
265
+ <assetobject id="body" src="${avatarurl}" />
266
+ <assetobject id="avatar_animations" src="${animurl}" />
267
+ </assets>
268
+ <room>
269
+ <ghost body_id="body" bone_head="Head" morphtarget_mouth="mouthOpen" morphtarget_eyes="eyesClosed" />
270
+ </room>
271
+ </FireBoxRoom>
272
+ `;
273
+ player.setAvatar(avatarstr);
274
+ this.handleAvatarSelect({data: { url: 'data:text/plain,' + avatarstr } });
275
+ }
276
+ }
243
277
  }
244
278
  }
245
279
  });
@@ -30,6 +30,7 @@ elation.elements.define('janus-comms-status', class extends elation.elements.bas
30
30
  }
31
31
  create() {
32
32
  this.player = player;
33
+ this.userid = player.getNetworkUsername();
33
34
  if (typeof room != 'undefined') {
34
35
  this.room = room;
35
36
  }
@@ -100,6 +101,7 @@ elation.elements.define('janus-comms-userlist', class extends elation.elements.u
100
101
  this.usermarkers = {};
101
102
 
102
103
  elation.events.add(this.janusweb, 'room_load_start', (ev) => { this.updateRoom(ev.data || ev.element); });
104
+ elation.events.add(this.janusweb, 'room_change', (ev) => { let newroom = this.janusweb.rooms[this.janusweb.getRoomId(ev.data)]; if (newroom) this.updateRoom(newroom); });
103
105
  elation.events.add(this.janusweb.network, 'janusweb_user_joined,janusweb_user_left,janusweb_user_disconnected', (ev) => this.updateUsers());
104
106
  setTimeout(() => {
105
107
  //this.updateUsers();
@@ -132,10 +134,16 @@ elation.elements.define('janus-comms-userlist', class extends elation.elements.u
132
134
  this.elements.userlist_details.open = true;
133
135
  }
134
136
  this.updateUsers();
137
+ elation.events.add(this.room, 'join', ev => {
138
+ setTimeout(() => {
139
+ this.updateUsers();
140
+ }, 1000);
141
+ });
142
+ elation.events.add(this.room, 'room_active', ev => { this.updateUsers(); });
135
143
  }
136
144
  updateUsers() {
137
145
  if (!janus.network) return;
138
- var remoteplayers = janus.network.remoteplayers;
146
+ var remoteplayers = this.room.players;
139
147
  var users = Object.keys(remoteplayers);
140
148
  //users.unshift(player.userid);
141
149
 
@@ -213,6 +221,9 @@ elation.elements.define('janus-comms-chat', class extends elation.elements.base
213
221
  // FIXME - first element with the current design is a <detail> element, but this is fragile if that changes
214
222
  this.elements[0].addEventListener('toggle', (ev) => this.elements.chatinput.focus());
215
223
  this.updateRoom(room);
224
+ if (window.innerWidth < 760) {
225
+ this.elements.toggle.open = false;
226
+ }
216
227
  }
217
228
  scrollToBottom() {
218
229
  setTimeout(() => {
@@ -150,7 +150,7 @@ console.log('occupants received', Object.keys(occupantList), Object.keys(this.co
150
150
  'credential': 'turn',
151
151
  'realm': 'turn',
152
152
  'urls': [
153
- 'turns:stream.janusxr.org:3478',
153
+ 'turns:voip.janusxr.org:3478',
154
154
  ]
155
155
  },
156
156
  ]
@@ -166,6 +166,11 @@ console.log('occupants received', Object.keys(occupantList), Object.keys(this.co
166
166
  }
167
167
  }
168
168
  setRoom(roomId) {
169
- this.adapter.setRoom(roomId);
169
+ this.connectedClients = {};
170
+ //this.adapter.disconnect();
171
+ if (roomId != this.adapter.room) {
172
+ this.adapter.setRoom(roomId);
173
+ this.adapter.reconnect();
174
+ }
170
175
  }
171
176
  }
@@ -10,10 +10,10 @@
10
10
  <span class="statuslabel">Disconnecting...</span>
11
11
  {/eq}
12
12
  {@eq key=state value="connecting"}
13
- <span class="statuslabel">Connecting</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{player.userid}</strong>
13
+ <span class="statuslabel">Connecting</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{userid}</strong>
14
14
  {/eq}
15
15
  {@eq key=state value="connected"}
16
- <span class="statuslabel">Connected</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{player.userid}</strong>
16
+ <span class="statuslabel">Connected</span> <!-- to <strong name="serverlabel">{server._host}</strong>--> as <strong name="useridlabel">{userid}</strong>
17
17
  {/eq}
18
18
 
19
19
  </span>
@@ -1,5 +1,4 @@
1
1
  janus-voip-client {
2
- border: 1px solid black;
3
2
  position: relative;
4
3
  max-width: 75vh;
5
4
  flex-wrap: wrap;
@@ -11,29 +10,55 @@ janus-voip-client-janus {
11
10
  janus-voip-localuser {
12
11
  display: block;
13
12
  bottom: 0px;
14
- border: 2px solid black;
15
13
  padding: 0px;
16
- box-shadow: 0 0 5px black;
17
14
  z-index: 10;
18
15
  }
16
+ janus-voip-localuser:empty {
17
+ border: none;
18
+ box-shadow: none;
19
+ }
19
20
  janus-voip-localuser video {
20
21
  max-width: 128px;
21
22
  height: 128px;
22
23
  display: block;
23
24
  margin: 1px 0 0 1px;
25
+ border: 1px solid #aaa;
26
+ border-radius: 50%;
27
+ box-shadow: 0 0 2px 2px white;
24
28
  }
25
29
  janus-voip-remoteuser {
26
30
  xdisplay: inline-block;
27
- border: 2px solid black;
28
31
  position: relative;
29
32
  font-family: monospace;
30
33
  transition: transform 250ms ease;
31
34
  transform: scale(0, 0);
32
35
  min-width: 5em;
36
+ min-width: 32px;
37
+ min-height: 32px;
38
+ text-align: center;
39
+ }
40
+ janus-voip-remoteuser audio {
41
+ display: inline-block;
33
42
  }
34
43
  janus-voip-remoteuser video {
35
- display: none;
36
- max-width: 128px;
44
+ width: 32px;
45
+ height: 32px;
46
+ border: 1px solid #aaa;
47
+ border-radius: 50%;
48
+ box-shadow: 0 0 2px 2px white;
49
+ display: inline-block;
50
+ background: url(images/mic-disabled.png);
51
+ background-size: contain;
52
+ background-position: center center;
53
+ transition: all 200ms ease-out;
54
+ }
55
+ janus-voip-remoteuser[hasaudio] video {
56
+ background: url(images/mic-enabled.png);
57
+ background-size: contain;
58
+ background-position: center center;
59
+ }
60
+ janus-voip-remoteuser[hasvideo] video {
61
+ width: 128px;
37
62
  height: 128px;
38
63
  }
39
64
  janus-voip-remoteuser video.active {
@@ -55,12 +80,13 @@ janus-voip-remoteuser h2 {
55
80
  text-shadow: 0 0 5px black;
56
81
  color: white;
57
82
  font-size: .8em;
83
+ margin-bottom: .5em;
58
84
  }
59
85
  janus-voip-remoteuser {
60
86
  }
61
87
  janus-voip-localuser[speaking],
62
88
  janus-voip-remoteuser[speaking] {
63
- border: 2px solid #0f0;
89
+ xborder: 2px solid #0f0;
64
90
  }
65
91
  janus-voip-localuser ui-button {
66
92
  position: absolute;
@@ -76,7 +102,7 @@ janus-voip-localuser ui-button {
76
102
  janus-voip-remoteuser ui-button {
77
103
  font-size: 0;
78
104
  width: auto;
79
- opacity: .5;
105
+ opacity: 0;
80
106
  }
81
107
  janus-voip-localuser ui-button:before,
82
108
  janus-voip-remoteuser ui-button:before {
@@ -200,3 +226,22 @@ janus-voip-client-incomingcall ui-button[action="reject"] {
200
226
  janus-voip-client-incomingcall ui-button[action="reject"]:hover {
201
227
  background: #a00;
202
228
  }
229
+ ui-panel[top]:not([left]):not([right]):has(janus-voip-client[spatialized]) {
230
+ top: 0;
231
+ left: 0;
232
+ }
233
+ ui-panel[top]:has(janus-voip-client[spatialized])::after {
234
+ position: absolute;
235
+ width: 80vh;
236
+ height: 80vh;
237
+ display: block;
238
+ content: '';
239
+ left: calc(50vw - 40vh);
240
+ top: 10vh;
241
+ border: 2px solid rgba(128,128,128,.5);
242
+ border-radius: 50%;
243
+ pointer-events: none;
244
+ }
245
+ janus-voip-remoteuser[spatialized] {
246
+ position: absolute;
247
+ }