From 6d771f65e06df2e5489a0721ecf4639ac09d2c5e Mon Sep 17 00:00:00 2001 From: Richard Fuchs Date: Fri, 24 Mar 2023 13:35:16 -0400 Subject: [PATCH] MT#56447 support unpublish method Change-Id: I00692cfa5e276f11efca7bd11781d82063e27e3a --- daemon/janus.c | 59 ++++++++++++++++++++++++++++++++ t/auto-daemon-tests-websocket.py | 58 +++++++++++++++++++++++++++++++ 2 files changed, 117 insertions(+) diff --git a/daemon/janus.c b/daemon/janus.c index e23b668e8..fa17af725 100644 --- a/daemon/janus.c +++ b/daemon/janus.c @@ -996,6 +996,59 @@ static const char *janus_videoroom_start(struct websocket_message *wm, struct ja } +// global janus_lock is held +static const char *janus_videoroom_unpublish(struct websocket_message *wm, struct janus_session *session, + const char *transaction, + struct janus_handle *handle, JsonBuilder *builder, const char **successp, + int *retcode) +{ + janus_send_ack(wm, transaction, session); + + // get all our info + + uint64_t room_id = handle->room; + *retcode = 512; + if (!room_id) + return "Not in any room"; + + struct janus_room *room = NULL; + if (room_id) + room = g_hash_table_lookup(janus_rooms, &room_id); + *retcode = 426; + if (!room) + return "No such room"; + + AUTO_CLEANUP_NULL(struct call *call, call_unlock_release); + call = call_get(&room->call_id); + if (!call) + return "No such room"; + + uint64_t *feed_id = g_hash_table_lookup(room->publishers, &handle->id); + *retcode = 512; + if (!feed_id) + return "Not a publisher"; + + // all is ok + + // notify other publishers + janus_notify_publishers(room_id, handle->id, NULL, *feed_id, janus_notify_publishers_unpublished); + + struct call_monologue *ml = janus_get_monologue(handle->id, call, call_get_monologue); + if (ml) + monologue_destroy(ml); + + *successp = "event"; + json_builder_set_member_name(builder, "videoroom"); + json_builder_add_string_value(builder, "event"); + json_builder_set_member_name(builder, "room"); + json_builder_add_int_value(builder, room_id); + json_builder_set_member_name(builder, "unpublished"); + json_builder_add_string_value(builder, "ok"); + + return NULL; +} + + // global janus_lock is held // TODO: more granular locking static const char *janus_videoroom(struct websocket_message *wm, struct janus_session *session, @@ -1051,6 +1104,12 @@ static const char *janus_videoroom(struct websocket_message *wm, struct janus_se &retcode, room_id); break; + case CSH_LOOKUP("unpublish"): + err = janus_videoroom_unpublish(wm, session, transaction, + handle, builder, successp, + &retcode); + break; + default: retcode = 423; err = "Unknown videoroom request"; diff --git a/t/auto-daemon-tests-websocket.py b/t/auto-daemon-tests-websocket.py index 6efd1f271..7ffecea71 100644 --- a/t/auto-daemon-tests-websocket.py +++ b/t/auto-daemon-tests-websocket.py @@ -2773,6 +2773,64 @@ class TestVideoroom(unittest.TestCase): }, ) + # unpublish + eventloop.run_until_complete( + testIOJanus( + self, + { + "janus": "message", + "body": { + "request": "unpublish", + }, + "handle_id": pub_handle_1, + "session_id": session_2, + "token": token, + }, + 1, + ) + ) + # ack is received first + self.assertEqual(self._res, {"janus": "ack", "session_id": session_2}) + # followed by the event notification + eventloop.run_until_complete(testIJanus(self, 1)) + + self.assertEqual( + self._res, + { + "janus": "event", + "session_id": session_2, + "sender": pub_handle_1, + "plugindata": { + "plugin": "janus.plugin.videoroom", + "data": { + "videoroom": "event", + "room": room, + "unpublished": "ok", + }, + }, + }, + ) + + # followed by event in the other session + eventloop.run_until_complete(testIJson(self, 2)) + + self.assertEqual( + self._res, + { + "janus": "event", + "session_id": session_3, + "sender": pub_handle_2, + "plugindata": { + "plugin": "janus.plugin.videoroom", + "data": { + "videoroom": "event", + "room": room, + "unpublished": feed_1, + }, + }, + }, + ) + pub_sock_1.close() pub_sock_2.close() self.destroyVideoroom(token, session_1, control_handle, room)