From 13e0df6c157fa136fb095464160d2be4e0c83172 Mon Sep 17 00:00:00 2001 From: gugaobai <18721182863@163.com> Date: Sat, 22 Apr 2017 10:45:44 +0800 Subject: [PATCH] add rtc --- examples/RTCExample.java | 62 ++++++++ src/main/java/com/qiniu/pili/Client.java | 4 + src/main/java/com/qiniu/pili/Config.java | 1 + src/main/java/com/qiniu/pili/Mac.java | 8 + src/main/java/com/qiniu/pili/Meeting.java | 147 ++++++++++++++++++ src/main/java/com/qiniu/pili/RPC.java | 18 +++ src/test/java/com/qiniu/pili/MeetingTest.java | 133 ++++++++++++++++ 7 files changed, 373 insertions(+) create mode 100644 examples/RTCExample.java create mode 100644 src/main/java/com/qiniu/pili/Meeting.java create mode 100644 src/test/java/com/qiniu/pili/MeetingTest.java diff --git a/examples/RTCExample.java b/examples/RTCExample.java new file mode 100644 index 0000000..bed79be --- /dev/null +++ b/examples/RTCExample.java @@ -0,0 +1,62 @@ + +import java.util.Date; + +public class RTCExample { + public static void main(String[] args) { + + //init + String accessKey = "DWQOcIddmtTCrnPp1ogwgdasdaAHBdIK1mIFrnmtnXb-66-"; + String secretKey = "cJFhYsuaaq7Vo35e1XDFUasdasG8Rm8C2VjkpmXO0aGkJGM"; + Client cli = new Client(accessKey, secretKey); + Meeting meeting = cli.newMeeting(); + + //create room + try { + String res = meeting.createRoom("123"); + System.out.println(res); + } catch (PiliException e) { + e.printStackTrace(); + } + + try { + String res = meeting.createRoom("1234", "test"); + System.out.println(res); + } catch (PiliException e) { + e.printStackTrace(); + } + + try { + String res = meeting.createRoom("12345", "testtest", 5); + System.out.println(res); + } catch (PiliException e) { + e.printStackTrace(); + } + + //get room info + try { + Meeting.Room room = meeting.getRoom("testtest"); + System.out.println(room.name); + System.out.println(room.status); + System.out.println(room.ownerId); + System.out.println(room.userMax); + + } catch (PiliException e) { + e.printStackTrace(); + } + + //delete room + try { + meeting.deleteRoom("testtest"); + } catch (PiliException e) { + e.printStackTrace(); + } + + //get roomToken + try { + String token = meeting.roomToken("test", "123456", "admin", new Date(System.currentTimeMillis() + 3600)); + System.out.println(token); + } catch (Exception e) { + e.printStackTrace(); + } + } +} \ No newline at end of file diff --git a/src/main/java/com/qiniu/pili/Client.java b/src/main/java/com/qiniu/pili/Client.java index 76fc553..229933b 100644 --- a/src/main/java/com/qiniu/pili/Client.java +++ b/src/main/java/com/qiniu/pili/Client.java @@ -55,6 +55,10 @@ public String SnapshotPlayURL(String domain, String hub, String streamKey) { public Hub newHub(String hub) { return new Hub(this.cli, hub); } + + public Meeting newMeeting() { + return new Meeting(this.cli); + } } diff --git a/src/main/java/com/qiniu/pili/Config.java b/src/main/java/com/qiniu/pili/Config.java index cb55cc3..492305f 100644 --- a/src/main/java/com/qiniu/pili/Config.java +++ b/src/main/java/com/qiniu/pili/Config.java @@ -5,4 +5,5 @@ public final class Config { public static String VERSION = "2.1.0"; static final String APIUserAgent = String.format("pili-sdk-java/%s %s %s/%s", VERSION, System.getProperty("java.version"), System.getProperty("os.name"), System.getProperty("os.arch")); public static String APIHost = "pili.qiniuapi.com"; + public static String RTCAPIHost = "rtc.qiniuapi.com"; } diff --git a/src/main/java/com/qiniu/pili/Mac.java b/src/main/java/com/qiniu/pili/Mac.java index 1cd739c..facf269 100644 --- a/src/main/java/com/qiniu/pili/Mac.java +++ b/src/main/java/com/qiniu/pili/Mac.java @@ -56,4 +56,12 @@ private boolean incBody(byte[] body, String contentType) { return typeOK && lengthOK; } + public String signRoomToken(String roomAccess) throws Exception { + String encodedRoomAcc = UrlSafeBase64.encodeToString(roomAccess); + byte[] sign = HMac.HmacSHA1Encrypt(encodedRoomAcc, this.secretKey); + String encodedSign = UrlSafeBase64.encodeToString(sign); + return this.accessKey + ":" + encodedSign+":"+encodedRoomAcc; + } + + } diff --git a/src/main/java/com/qiniu/pili/Meeting.java b/src/main/java/com/qiniu/pili/Meeting.java new file mode 100644 index 0000000..7cad37b --- /dev/null +++ b/src/main/java/com/qiniu/pili/Meeting.java @@ -0,0 +1,147 @@ +package com.qiniu.pili; + +import com.google.gson.Gson; +import com.google.gson.annotations.SerializedName; + +import java.util.Date; + +public class Meeting { + private String baseUrl; + private Gson gson; + private RPC cli; + + Meeting(RPC cli ) { + this.baseUrl = Config.APIHTTPScheme + Config.RTCAPIHost + "/v1"; + this.cli = cli; + this.gson = new Gson(); + } + + public String createRoom(String ownerId, String roomName, int userMax) throws PiliException { + CreateArgs args = new CreateArgs(ownerId, roomName, userMax); + return createRoom(args); + } + + public String createRoom(String ownerId ,String roomName) throws PiliException { + CreateArgs args = new CreateArgs(ownerId, roomName); + return createRoom(args); + } + + public String createRoom(String ownerId) throws PiliException { + CreateArgs args = new CreateArgs(ownerId); + return createRoom(args); + } + + private String createRoom(CreateArgs args) throws PiliException { + String path = this.baseUrl + "/rooms"; + String json = gson.toJson(args); + + try { + String resp = cli.callWithJson(path, json); + RoomName ret = gson.fromJson(resp, RoomName.class); + return ret.roomName; + }catch (PiliException e){ + throw e; + }catch (Exception e) { + e.printStackTrace(); + throw new PiliException(e); + } + } + + public Room getRoom(String roomName) throws PiliException { + String path = this.baseUrl+ "/rooms/" + roomName; + try { + String resp = cli.callWithGet(path); + Room room = gson.fromJson(resp, Room.class); + return room; + }catch (PiliException e){ + throw e; + }catch (Exception e) { + e.printStackTrace(); + throw new PiliException(e); + } + } + + public void deleteRoom(String room) throws PiliException { + String path = this.baseUrl + "/rooms/"+room; + try { + cli.callWithDelete(path); + }catch (PiliException e){ + throw e; + }catch (Exception e) { + e.printStackTrace(); + throw new PiliException(e); + } + } + + public String roomToken(String roomName, String userId, String perm, Date expireAt) throws Exception { + RoomAccess access = new RoomAccess(roomName, userId, perm, expireAt); + String json = gson.toJson(access); + return this.cli.getMac().signRoomToken(json); + } + + private class RoomAccess{ + @SerializedName("room_name") + String roomName; + @SerializedName("user_id") + String userId; + @SerializedName("perm") + String perm; + @SerializedName("expire_at") + long expireAt; + + RoomAccess(String roomName, String userId, String perm, Date expireAt){ + this.roomName = roomName; + this.userId = userId; + this.perm = perm; + this.expireAt = expireAt.getTime() / 1000;// seconds + } + } + + /** + * + */ + public enum Status { + @SerializedName("0") + NEW, + @SerializedName("1") + MEETING, + @SerializedName("2") + FINISHED, + } + + public class Room { + @SerializedName("room_name") public String name; + @SerializedName("room_status") public Status status; + @SerializedName("owner_id") public String ownerId; + @SerializedName("user_max") public int userMax; + } + + /** + * + */ + private class RoomName { + @SerializedName("room_name") String roomName; + } + + private class CreateArgs { + @SerializedName("owner_id") String ownerId; + @SerializedName("room_name") String room; + @SerializedName("user_max") int user_max; + + public CreateArgs(String ownerId, String room, int user_max) { + this.ownerId = ownerId; + this.room = room; + this.user_max = user_max; + } + + public CreateArgs(String ownerId, String room) { + this.ownerId = ownerId; + this.room = room; + } + + public CreateArgs(String ownerId){ + this.ownerId = ownerId; + } + } + +} diff --git a/src/main/java/com/qiniu/pili/RPC.java b/src/main/java/com/qiniu/pili/RPC.java index e78023d..d6198db 100644 --- a/src/main/java/com/qiniu/pili/RPC.java +++ b/src/main/java/com/qiniu/pili/RPC.java @@ -60,4 +60,22 @@ public String callWithGet(String urlStr) throws Exception { throw new PiliException(response); } } + + public String callWithDelete(String urlStr) throws Exception{ + URL url = new URL(urlStr); + String macToken = mac.signRequest(url, "DELETE", null,null); + Request request = new Request.Builder() + .url(url) + .delete() + .header("User-Agent", Config.APIUserAgent) + .addHeader("Authorization", "Qiniu " + macToken) + .build(); + + Response response = okHttpClient.newCall(request).execute(); + if (response.isSuccessful()) { + return response.body().string(); + } else { + throw new PiliException(response); + } + } } diff --git a/src/test/java/com/qiniu/pili/MeetingTest.java b/src/test/java/com/qiniu/pili/MeetingTest.java new file mode 100644 index 0000000..6385c0d --- /dev/null +++ b/src/test/java/com/qiniu/pili/MeetingTest.java @@ -0,0 +1,133 @@ +package com.qiniu.pili; + +import org.junit.Assume; +import org.junit.Before; +import org.junit.Test; +import static org.junit.Assert.*; + +import java.util.Date; + +import static org.junit.Assert.assertTrue; +import static org.junit.Assert.fail; + +public class MeetingTest { + String accessKey; + String secretKey; + Client cli; + Meeting meeting; + + + + @Before + public void prepare() { + // local test environment +// Config.APIHost = "10.200.20.28:7778"; + + accessKey = "7O7hf7Ld1RrC_fpZdFvU8aCgOPuhw2K4eapYOdII"; + secretKey = "6Rq7rMSUHHqOgo0DJjh15tHsGUBEH9QhWqqyj4ka"; + + cli = new Client(accessKey, secretKey); + meeting = cli.newMeeting(); + } + + private boolean skip() { + return Config.RTCAPIHost != "rtc.qiniuapi.com"; + } + + @Test + public void testRoom() { + Assume.assumeTrue(skip()); + + String roomName = String.valueOf(new Date().getTime()); + //get un-existed room + try { + meeting.getRoom(roomName); + fail("should not exist"); + } catch (PiliException e) { + assertTrue(e.isNotFound()); + } + + // create room with name + try { + String r1 = meeting.createRoom("123",roomName); + assertEquals(roomName,r1); + + Meeting.Room room = meeting.getRoom(roomName); + assertEquals(roomName, room.name); + assertEquals("123",room.ownerId); + assertEquals(Meeting.Status.NEW,room.status); + + } catch (PiliException e){ + fail(); + } + + // recreate room with the same name + try { + String r1 = meeting.createRoom("123",roomName); + fail(); + }catch (PiliException e){ + assertEquals(611,e.code()); + } + + // create room without name + try { + String r2 = meeting.createRoom("123"); + + Meeting.Room room = meeting.getRoom(r2); + assertEquals(r2, room.name); + assertEquals("123",room.ownerId); + assertEquals(Meeting.Status.NEW,room.status); + }catch (PiliException e){ + fail(); + } + + //delete room + try{ + meeting.deleteRoom(roomName); + }catch (PiliException e){ + e.printStackTrace(); + fail(); + } + try { + meeting.getRoom(roomName); + fail("should not exist"); + } catch (PiliException e) { + assertTrue(e.isNotFound()); + } + + // delete un-existed room + try { + meeting.getRoom(roomName); + fail("should not exist"); + } catch (PiliException e) { + assertTrue(e.isNotFound()); + } + + } + + @Test + public void testRoomToken(){ +// String roomName = "room1"; + // create room with name +// try { +// String r1 = meeting.createRoom("123",roomName); +// assertEquals(roomName,r1); +// +// Meeting.Room room = meeting.getRoom(roomName); +// assertEquals(roomName, room.name); +// assertEquals("123",room.ownerId); +// assertEquals(Meeting.Status.NEW,room.status); +// +// } catch (PiliException e){ +// fail(); +// } + + try { + String token = meeting.roomToken("room1", "123", "admin", new Date(1785600000000L)); + assertEquals("7O7hf7Ld1RrC_fpZdFvU8aCgOPuhw2K4eapYOdII:jltpX6P42j2fH3ErOp7Zj7RyaeE=:eyJyb29tX25hbWUiOiJyb29tMSIsInVzZXJfaWQiOiIxMjMiLCJwZXJtIjoiYWRtaW4iLCJleHBpcmVfYXQiOjE3ODU2MDAwMDB9", + token); + } catch (Exception e) { + fail(); + } + } +}