Browse Source

MT#56447 support unpublish method

Change-Id: I00692cfa5e276f11efca7bd11781d82063e27e3a
pull/1642/head
Richard Fuchs 3 years ago
parent
commit
6d771f65e0
2 changed files with 117 additions and 0 deletions
  1. +59
    -0
      daemon/janus.c
  2. +58
    -0
      t/auto-daemon-tests-websocket.py

+ 59
- 0
daemon/janus.c View File

@ -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 // global janus_lock is held
// TODO: more granular locking // TODO: more granular locking
static const char *janus_videoroom(struct websocket_message *wm, struct janus_session *session, 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); &retcode, room_id);
break; break;
case CSH_LOOKUP("unpublish"):
err = janus_videoroom_unpublish(wm, session, transaction,
handle, builder, successp,
&retcode);
break;
default: default:
retcode = 423; retcode = 423;
err = "Unknown videoroom request"; err = "Unknown videoroom request";


+ 58
- 0
t/auto-daemon-tests-websocket.py View File

@ -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_1.close()
pub_sock_2.close() pub_sock_2.close()
self.destroyVideoroom(token, session_1, control_handle, room) self.destroyVideoroom(token, session_1, control_handle, room)


Loading…
Cancel
Save