Skip to content

Commit 32c62e5

Browse files
committed
Basic dashboard done
1 parent a76b310 commit 32c62e5

File tree

5 files changed

+117
-56
lines changed

5 files changed

+117
-56
lines changed

env.example

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,3 @@
1+
SIGNALWIRE_PROJECT_KEY=YOUR-PROJECT-KEY
2+
SIGNALWIRE_TOKEN=YOUR-TOKEN
3+
SIGNALWIRE_SPACE=YOURSPACE.signalwire.com

index.js

Lines changed: 43 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -15,42 +15,10 @@ var cors = require('cors')
1515
app.use(cors());
1616
const axios = require('axios');
1717

18-
// SSE for alerts
19-
var SSE = require('express-sse');
20-
var sse = new SSE(['SignalWire SSE started']);
21-
app.get('/stream', (req, res, next) => {
22-
res.flush = () => {};
23-
next();
24-
}, sse.init);
25-
26-
// SignalWire real time events
27-
const createClient = require('@signalwire/realtime-api').createClient;
28-
createClient({
29-
project: process.env.SIGNALWIRE_PROJECT_KEY,
30-
token: process.env.SIGNALWIRE_TOKEN
31-
}).then(async (client) => {
32-
client.video.on('room.started', async (roomSession) => {
33-
console.log("Room started", await roomSession.getMembers())
34-
await sse.send("Room started");
35-
36-
roomSession.on('member.joined', async (member) => {
37-
console.log('Joined', member.id, member.name)
38-
})
39-
40-
roomSession.on('member.left', async (member) => {
41-
console.log('Left', member.id, member.name)
42-
})
43-
44-
await roomSession.subscribe()
45-
});
46-
47-
client.connect()
48-
});
49-
50-
51-
18+
// Utility methods
5219
async function apiRequest(path, data = {}, method = 'post') {
5320
var url = `https://${process.env.SIGNALWIRE_SPACE}${path}`
21+
console.log(url)
5422
const res = await axios({
5523
method,
5624
url,
@@ -115,6 +83,46 @@ async function getActiveRooms() {
11583
return output;
11684
}
11785

86+
// SSE for alerts
87+
var SSE = require('express-sse');
88+
var sse = new SSE(['SignalWire SSE started']);
89+
app.get('/stream', (req, res, next) => {
90+
res.flush = () => {};
91+
next();
92+
}, sse.init);
93+
94+
async function sendEvent(payload) {
95+
console.log(payload);
96+
await sse.send(payload);
97+
}
98+
99+
// SignalWire real time events
100+
const createClient = require('@signalwire/realtime-api').createClient;
101+
createClient({
102+
project: process.env.SIGNALWIRE_PROJECT_KEY,
103+
token: process.env.SIGNALWIRE_TOKEN
104+
}).then(async (client) => {
105+
client.video.on('room.started', async (roomSession) => {
106+
sendEvent(await getActiveRooms());
107+
108+
roomSession.on('member.joined', async (member) => {
109+
sendEvent(await getActiveRooms());
110+
})
111+
112+
roomSession.on('member.left', async (member) => {
113+
sendEvent(await getActiveRooms());
114+
})
115+
116+
await roomSession.subscribe()
117+
});
118+
119+
client.video.on('room.ended', async (roomSession) => {
120+
sendEvent(await getActiveRooms());
121+
});
122+
123+
client.connect()
124+
});
125+
118126
app.get('/', async (req, res) => {
119127
var room = req.query.room || `room${getRandomInt(1000)}`;
120128
var user = req.query.user || `user${getRandomInt(1000)}`;
@@ -124,7 +132,7 @@ app.get('/', async (req, res) => {
124132

125133
app.get('/dashboard', async (req, res) => {
126134
var rooms = await getActiveRooms();
127-
console.log(rooms);
135+
console.log(rooms)
128136
res.render('dashboard', { rooms })
129137
});
130138

public/dashboard.js

Lines changed: 46 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,46 @@
1+
function Room(props) {
2+
return (
3+
<div className="card w-25 float-start">
4+
<div className="card-body">
5+
<h5 className="card-title">{props.room.display_name}</h5>
6+
<ul className="list-group list-group-flush">
7+
{props.room.members.map((member) => (
8+
<li key={props.room.id + member} className="list-group-item">{member}</li>
9+
))}
10+
</ul>
11+
<p className="text-end">
12+
<a href="/?room={room.id}" className="btn btn-primary btn-sm" target="_blank">Join</a>
13+
</p>
14+
</div>
15+
</div>
16+
);
17+
}
18+
19+
const RoomList = React.forwardRef((props, ref) => {
20+
const [data, setData] = React.useState(_mainList);
21+
22+
React.useImperativeHandle(ref, () => ({
23+
updateList: (newList) => {
24+
setData(newList)
25+
}
26+
}));
27+
28+
return (
29+
<div className="rooms">
30+
{data.map((room) => (
31+
<Room room={room} key={room.id}></Room>
32+
))}
33+
</div>
34+
);
35+
});
36+
37+
function App(){
38+
return (
39+
<RoomList ref={RoomList => { window.RoomList = RoomList }}/>
40+
)
41+
}
42+
43+
ReactDOM.render(
44+
<App />,
45+
document.getElementById('root')
46+
);

views/dashboard.ejs

Lines changed: 20 additions & 21 deletions
Original file line numberDiff line numberDiff line change
@@ -1,26 +1,25 @@
1-
<% rooms.forEach(function(room) { %>
2-
<div class="card w-25 float-start">
3-
<div class="card-body">
4-
<h5 class="card-title"><%= room.display_name %></h5>
5-
<ul class="list-group list-group-flush">
6-
<% room.members.forEach(function(member) { %>
7-
<li class="list-group-item"><%= member %></li>
8-
<% }); %>
9-
</ul>
10-
<p class="text-end">
11-
<a href="/?room=<%= room.id %>" class="btn btn-primary btn-sm" target="_blank">Join</a>
12-
</p>
13-
</div>
14-
</div>
15-
<% }); %>
1+
<div id="root"></div>
162

3+
<script src="https://unpkg.com/@babel/standalone/babel.min.js"></script>
4+
<script crossorigin src="https://unpkg.com/react@17/umd/react.development.js"></script>
5+
<script crossorigin src="https://unpkg.com/react-dom@17/umd/react-dom.development.js"></script>
176
<script src="/utility.js"></script>
187

198
<script>
20-
window.ready(function () {
21-
var es = new EventSource('/stream');
22-
es.onmessage = function (event) {
23-
console.log('EVENT SENT', event);
24-
};
25-
})
9+
var _mainList = <%- JSON.stringify(rooms) %>;
10+
11+
window.ready(function () {
12+
13+
var es = new EventSource('/stream');
14+
es.onmessage = function (event) {
15+
const data = JSON.parse(event.data);
16+
console.log(data);
17+
if (Array.isArray(data)) {
18+
RoomList.updateList(data);
19+
}
20+
};
21+
})
22+
</script>
23+
24+
<script type="text/babel" src="/dashboard.js">
2625
</script>

views/index.ejs

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,11 @@
44
</div>
55
</div>
66

7+
<div class="row">
8+
<div class="col"><a href="/?room=<%= room %>" target="_blank">Link to room <%= room %></a>
9+
</div>
10+
</div>
11+
712
<div class="row">
813
<div class="col">
914
<h5>Participants</h5>

0 commit comments

Comments
 (0)