Skip to content

Commit 447f59d

Browse files
author
Tim Mendoza
committed
Update token server to use create_room parameter
1 parent d72acd9 commit 447f59d

File tree

2 files changed

+66
-17
lines changed

2 files changed

+66
-17
lines changed

src/video-token-server.js

Lines changed: 29 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -16,12 +16,23 @@ module.exports.handler = async (context, event, callback) => {
1616
ROOM_TYPE,
1717
} = context;
1818

19-
const { user_identity, room_name, passcode } = event;
19+
const { user_identity, room_name, passcode, create_room = true } = event;
2020
const [, appID, serverlessID] = DOMAIN_NAME.match(/-?(\d*)-(\d+)(?:-\w+)?.twil.io$/);
2121

2222
let response = new Twilio.Response();
2323
response.appendHeader('Content-Type', 'application/json');
2424

25+
if (typeof create_room !== 'boolean') {
26+
response.setStatusCode(400);
27+
response.setBody({
28+
error: {
29+
message: 'invalid parameter',
30+
explanation: 'A boolean value must be provided for the create_room parameter',
31+
},
32+
});
33+
return callback(null, response);
34+
}
35+
2536
if (Date.now() > API_PASSCODE_EXPIRY) {
2637
response.setStatusCode(401);
2738
response.setBody({
@@ -56,21 +67,23 @@ module.exports.handler = async (context, event, callback) => {
5667
return callback(null, response);
5768
}
5869

59-
const client = context.getTwilioClient();
70+
if (create_room) {
71+
const client = context.getTwilioClient();
6072

61-
try {
62-
await client.video.rooms.create({ uniqueName: room_name, type: ROOM_TYPE });
63-
} catch (e) {
64-
// Ignore 53113 error (room already exists). See: https://www.twilio.com/docs/api/errors/53113
65-
if (e.code !== 53113) {
66-
response.setStatusCode(500);
67-
response.setBody({
68-
error: {
69-
message: 'error creating room',
70-
explanation: 'Something went wrong when creating a room.',
71-
},
72-
});
73-
return callback(null, response);
73+
try {
74+
await client.video.rooms.create({ uniqueName: room_name, type: ROOM_TYPE });
75+
} catch (e) {
76+
// Ignore 53113 error (room already exists). See: https://www.twilio.com/docs/api/errors/53113
77+
if (e.code !== 53113) {
78+
response.setStatusCode(500);
79+
response.setBody({
80+
error: {
81+
message: 'error creating room',
82+
explanation: 'Something went wrong when creating a room.',
83+
},
84+
});
85+
return callback(null, response);
86+
}
7487
}
7588
}
7689

@@ -81,6 +94,6 @@ module.exports.handler = async (context, event, callback) => {
8194
const videoGrant = new VideoGrant({ room: room_name });
8295
token.addGrant(videoGrant);
8396
response.setStatusCode(200);
84-
response.setBody({ token: token.toJwt(), room_type: ROOM_TYPE });
97+
response.setBody({ token: token.toJwt(), room_type: create_room ? ROOM_TYPE : null });
8598
return callback(null, response);
8699
};

test/video-token-server.test.js

Lines changed: 37 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,27 @@ describe('the video-token-server', () => {
5858
});
5959
});
6060

61+
it('should return an "invalid parameter" error when the create_room parameter is not a boolean', async () => {
62+
Date.now = () => 5;
63+
64+
await handler(
65+
mockContext,
66+
{ passcode: '12345612345678', user_identity: 'test identity', create_room: 'no thanks' },
67+
callback
68+
);
69+
70+
expect(callback).toHaveBeenCalledWith(null, {
71+
body: {
72+
error: {
73+
message: 'invalid parameter',
74+
explanation: 'A boolean value must be provided for the create_room parameter',
75+
},
76+
},
77+
headers: { 'Content-Type': 'application/json' },
78+
statusCode: 400,
79+
});
80+
});
81+
6182
it('should return a "missing user_identity" error when the "user_identity" parameter is not supplied', () => {
6283
handler(mockContext, { passcode: '12345612345678' }, callback);
6384

@@ -140,7 +161,7 @@ describe('the video-token-server', () => {
140161
expect(jwt.verify(callback.mock.calls[0][1].body.token, 'api_secret')).toBeTruthy();
141162
});
142163

143-
it('should create a new room and return a valid token when passcode', async () => {
164+
it('should create a new room and return a valid token', async () => {
144165
await handler(
145166
mockContext,
146167
{ passcode: '12345612345678', room_name: 'test-room', user_identity: 'test-user' },
@@ -155,6 +176,21 @@ describe('the video-token-server', () => {
155176
});
156177
});
157178

179+
it('should return a valid token without creating a room when "create_room" is false', async () => {
180+
await handler(
181+
mockContext,
182+
{ passcode: '12345612345678', room_name: 'test-room', user_identity: 'test-user', create_room: false },
183+
callback
184+
);
185+
186+
expect(mockCreateFunction).not.toHaveBeenCalled();
187+
expect(callback).toHaveBeenCalledWith(null, {
188+
body: { token: expect.any(String), room_type: null },
189+
headers: { 'Content-Type': 'application/json' },
190+
statusCode: 200,
191+
});
192+
});
193+
158194
it('should return a valid token when passcode when the room already exists', async () => {
159195
mockCreateFunction.mockImplementation(() => Promise.reject({ code: 53113 }));
160196

0 commit comments

Comments
 (0)