Guest User

Untitled

a guest
Nov 16th, 2018
107
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 13.42 KB | None | 0 0
  1. //
  2. // Command.swift
  3. // AddaIOS
  4. //
  5. // Created by Alif on 9/11/18.
  6. // Copyright © 2018 Alif. All rights reserved.
  7. //
  8.  
  9. import Foundation
  10.  
  11. public protocol CommandDelegate: class {
  12. func receive(strData:String)
  13. func getSendData() -> String
  14. }
  15.  
  16. public class BaseCommand: CommandDelegate {
  17. var time: TimeInterval
  18. var transaction: String
  19. weak var delegate: RTCVideoServer!
  20. var handleID: Int64
  21. var preData: Codable?
  22.  
  23. public init(delegate: RTCVideoServer, handleID: Int64, data: Codable? = nil) {
  24. self.transaction = UUID.init().uuidString
  25. self.delegate = delegate
  26. self.handleID = handleID
  27. self.preData = data
  28. self.time = Date().timeIntervalSince1970
  29. }
  30.  
  31. final public func getSendData() -> String {
  32. var sendData = ""
  33. do {
  34. let jsonData = try JSONSerialization.data(withJSONObject: getDataObject() as Any, options: .prettyPrinted)
  35. sendData = String(data: jsonData, encoding: String.Encoding.utf8)!
  36.  
  37. } catch let error {
  38. print("error converting to json: \(error)")
  39. }
  40. return sendData
  41. }
  42.  
  43. func getDataObject() -> [String: Any]? { return [:] }
  44.  
  45. public func receive(strData str: String) {}
  46. }
  47.  
  48. class CreateCommand: BaseCommand {
  49.  
  50. override func receive(strData: String) {
  51.  
  52. guard let data = CreateData.decode(json: strData, using: .utf8) else {
  53. print("missing CreateData data 53")
  54. return
  55. }
  56.  
  57. delegate.setSessionId( data.data.id)
  58. delegate.sendCommand(command: AttachCommand(delegate: delegate, handleID: 0))
  59.  
  60. }
  61.  
  62. override func getDataObject() -> [String : Any] {
  63. return ["janus": "create", "transaction": transaction] as [String : Any]
  64. }
  65. }
  66.  
  67. class AttachCommand: BaseCommand {
  68. override func receive(strData: String) {
  69.  
  70. guard let data = AttachData.decode(json: strData, using: .utf8) else {
  71. print("missing AttachData data 71")
  72. return
  73. }
  74.  
  75. handleID = data.data.id
  76.  
  77. if delegate.type == .listParticipants {
  78. delegate.sendCommand(command: ListparticipantsCommand(delegate: delegate, handleID: handleID))
  79. } else {
  80. if preData == nil {
  81. delegate.sendCommand(command: JoinForPublisherCommand(delegate: delegate, handleID: handleID))
  82. } else {
  83. delegate.sendCommand(command: JoinForSubscriberCommand(delegate: delegate, handleID: handleID, data: preData))
  84. }
  85. }
  86.  
  87. }
  88.  
  89. override func getDataObject() -> [String : Any] {
  90. return [
  91. "janus": "attach",
  92. "transaction": transaction,
  93. "session_id": delegate.sessionID,
  94. "plugin": "janus.plugin.videoroom",
  95. "opaque_id": "videoroomtest-"
  96. ] as [String : Any]
  97. }
  98. }
  99.  
  100. class JoinForPublisherCommand: BaseCommand {
  101.  
  102. override func receive(strData: String) {
  103.  
  104. if strData.contains("event") {
  105.  
  106. guard let data = JoinData.decode(json: strData, using: .utf8) else {
  107. print("missing JoinData data 106")
  108. return
  109. }
  110.  
  111. let id = String(data.plugindata.data.id ?? 0)
  112.  
  113. delegate.myJanusId = id
  114. delegate.janusIdToHandle[delegate.myJanusId] = handleID
  115.  
  116. if delegate.initPublish {
  117. delegate.client?.startConnection(id, localStream: true)
  118. delegate.client?.makeOffer(id)
  119. }
  120.  
  121. delegate.privateID = data.plugindata.data.privateId!
  122. var index = 0
  123. for publisher in data.plugindata.data.publishers {
  124.  
  125. if index == delegate.maxViewer {
  126. return
  127. }
  128.  
  129. delegate.infoFromJanusId[publisher.id] = publisher
  130. delegate.sendCommand(command: AttachCommand(delegate: delegate, handleID: handleID, data:AttachId(id: publisher.id)))
  131. index += 1
  132. }
  133. }
  134. }
  135.  
  136. override func getDataObject() -> [String : Any] {
  137.  
  138. let body = [
  139. "display": delegate.display,
  140. "ptype": "publisher",
  141. "request": "join",
  142. "room": delegate.roomID
  143. ] as [String: Any]
  144.  
  145. return [
  146. "janus": "message",
  147. "transaction": transaction,
  148. "session_id": delegate.sessionID,
  149. "handle_id": handleID,
  150. "body": body
  151. ] as [String : Any]
  152. }
  153. }
  154.  
  155. class JoinForSubscriberCommand: BaseCommand {
  156. override func receive(strData: String) {
  157. if strData.contains("event") {
  158.  
  159. guard let data = JoinOfferData.decode(json: strData, using: .utf8) else {
  160. print("missing JoinOfferData data 158")
  161. return
  162. }
  163. let id = String(data.plugindata.data.id)
  164.  
  165. delegate.client?.startConnection(id, localStream: false)
  166. delegate.client?.createAnswerForOfferReceived(id, withRemoteSDP: data.jsep.sdp)
  167. }
  168. }
  169.  
  170. override func getDataObject() -> [String: Any]? {
  171.  
  172. guard let pData: AttachId = preData as? AttachId else {
  173. print("missing AttachId")
  174. return nil
  175. }
  176.  
  177. delegate.janusIdToHandle[String(pData.id)] = handleID
  178.  
  179. let body = [
  180. "display": "subscriber",
  181. "feed": pData.id,
  182. "private_id": delegate.privateID,
  183. "ptype": "subscriber",
  184. "request": "join",
  185. "room": delegate.roomID
  186. ] as [String: Any]
  187.  
  188. return [
  189. "janus": "message",
  190. "transaction": transaction,
  191. "session_id": delegate.sessionID,
  192. "handle_id": handleID,
  193. "body": body
  194. ] as [String : Any]
  195. }
  196. }
  197.  
  198. class NewJoinActiveCommand:BaseCommand {
  199.  
  200. override func receive(strData: String) {
  201. if strData.contains("event") {
  202.  
  203. guard let data = JoinData.decode(json: strData, using: .utf8) else {
  204. print("missing JoinData data 202")
  205. return
  206. }
  207.  
  208. let id = data.plugindata.data.publishers[0].id
  209. delegate.infoFromJanusId[id] = data.plugindata.data.publishers[0]
  210. delegate.sendCommand(command: AttachCommand(
  211. delegate: delegate,
  212. handleID: 0,
  213. data: AttachId(id: id)))
  214. }
  215. }
  216.  
  217. }
  218.  
  219. class ReceiveUnpublishCommand:BaseCommand {
  220.  
  221. override func receive(strData: String) {
  222. if strData.contains("event") {
  223.  
  224. guard let data = UnpublishData.decode(json: strData, using: .utf8) else {
  225. print("missing UnpublishData data 223")
  226. return
  227. }
  228. delegate.disconnectMeetingById(id: String(data.plugindata.data.unpublished))
  229. }
  230. }
  231.  
  232. }
  233.  
  234. public class UnpublishCommand: BaseCommand {
  235.  
  236. override public func receive(strData: String) {
  237. if strData.contains("event"), let janusId = delegate.getJanusIdFromHandId(id: handleID) {
  238. delegate.disconnectMeetingById(id: janusId )
  239. }
  240. }
  241.  
  242. override func getDataObject() -> [String : Any] {
  243. return [
  244. "janus": " message",
  245. "transaction": transaction,
  246. "session_id": delegate.sessionID,
  247. "handle_id": handleID,
  248. "body": ["request": "unpublish"]
  249. ] as [String : Any]
  250. }
  251. }
  252.  
  253. //---------------------------------------------------------
  254.  
  255. class ListparticipantsCommand: BaseCommand {
  256.  
  257. override func receive(strData: String) {
  258.  
  259. guard let data = JoinParticipantsData.decode(json: strData, using: .utf8) else {
  260. print("missing JoinParticipantsData data 258")
  261. return
  262. }
  263. delegate.sendCommand(command: JoinParticipantCommand(delegate: delegate, handleID: handleID, data:data))
  264.  
  265. }
  266.  
  267. override func getDataObject() -> [String : Any] {
  268. return [
  269. "janus": "message",
  270. "transaction": transaction,
  271. "session_id": delegate.sessionID,
  272. "handle_id": handleID,
  273. "body": ["request": "listparticipants", "room": delegate.roomID] as [String: Any]
  274. ] as [String : Any]
  275. }
  276. }
  277.  
  278. class JoinParticipantCommand: BaseCommand {
  279.  
  280. override func receive(strData: String) {
  281.  
  282. if strData.contains("event") {
  283.  
  284. guard let data = JoinOfferData.decode(json: strData, using: .utf8) else {
  285. print("missing JoinOfferData data 283")
  286. return
  287. }
  288.  
  289. let id = String(data.plugindata.data.id)
  290. var iceServers = [RTCIceServer]()
  291. // iceServers.append(RTCIceServer(urlStrings: iceServerdata.urls, username: iceServerdata.username, credential: iceServerdata.credential))
  292. iceServers.append(RTCIceServer(urlStrings:["stun:stun.l.google.com:19302"] ))
  293. delegate.client?.setIceServer(id, iceServers: iceServers)
  294. delegate.client?.startConnection(id, localStream: false)
  295. delegate.client?.createAnswerForOfferReceived(String(data.plugindata.data.id), withRemoteSDP: data.jsep.sdp)
  296. }
  297. }
  298.  
  299. override func getDataObject() -> [String : Any]? {
  300.  
  301. guard var pData: JoinParticipantsData = preData as? JoinParticipantsData else {
  302. print("missing JoinParticipantsData 300")
  303. return nil
  304. }
  305.  
  306. let viewID = pData.plugindata.data.participants[0].id
  307.  
  308. delegate.janusIdToHandle[String(viewID)] = handleID
  309.  
  310. let body = [
  311. "feed": viewID,
  312. "private_id": 0,
  313. "ptype": "subscriber",
  314. "request": "join",
  315. "room": delegate.roomID
  316. ] as [String: Any]
  317.  
  318. return [
  319. "janus": "message",
  320. "transaction": transaction,
  321. "session_id": delegate.sessionID,
  322. "handle_id": handleID,
  323. "body": body
  324. ] as [String : Any]
  325. }
  326. }
  327.  
  328. import WebRTC
  329.  
  330. class SendOfferCommand: BaseCommand {
  331.  
  332. override func receive(strData: String) {
  333.  
  334. if strData.contains("event") {
  335.  
  336. guard let data = OfferReturnData.decode(json: strData, using: .utf8) else {
  337. print("missing OfferReturnData data 335")
  338. return
  339. }
  340.  
  341. if let id = delegate.getJanusIdFromHandId(id: data.sender) {
  342. delegate.client?.handleAnswerReceived(id, withRemoteSDP: data.jsep.sdp)
  343. }
  344. }
  345.  
  346. }
  347.  
  348. override func getDataObject() -> [String : Any]? {
  349.  
  350. guard let pData: JsepData = preData as? JsepData else {
  351. print("missin JsepData line 349")
  352. return nil
  353. }
  354.  
  355. let body = [
  356. "request": "configure",
  357. "audio": true,
  358. "video": true
  359. ] as [String: Any]
  360.  
  361. let jsep = ["type": pData.type, "sdp": pData.sdp] as [String: Any]
  362.  
  363. return [
  364. "janus": "message",
  365. "transaction": transaction,
  366. "session_id": delegate.sessionID,
  367. "handle_id": handleID,
  368. "body": body,
  369. "jsep": jsep
  370. ] as [String : Any]
  371. }
  372. }
  373.  
  374. class SendAnswerCommand: BaseCommand {
  375.  
  376. override func getDataObject() -> [String : Any]? {
  377. guard let pData: JsepData = preData as? JsepData else {
  378. print("missin JsepData line 349")
  379. return nil
  380. }
  381.  
  382. let body = [ "request": "start", "room": delegate.roomID ] as [String : Any]
  383. let jsep = ["type": "answer", "sdp": pData.sdp] as [String : Any]
  384.  
  385. return [
  386. "janus": "message",
  387. "transaction": transaction,
  388. "session_id": delegate.sessionID,
  389. "handle_id": handleID,
  390. "body": body,
  391. "jsep": jsep
  392. ] as [String : Any]
  393. }
  394. }
  395.  
  396. class SendCandidateCommand: BaseCommand {
  397.  
  398. override func getDataObject() -> [String : Any]? {
  399.  
  400. guard let pData: CandidateData = preData as? CandidateData else {
  401. print("missin CandidateData line 399")
  402. return nil
  403. }
  404.  
  405. let candidate = [
  406. "candidate": pData.candidate,
  407. "sdpMLineIndex": pData.lineIndex,
  408. "sdpMid": pData.sdpMid
  409. ] as [String : Any]
  410.  
  411. return [
  412. "janus": "trickle",
  413. "transaction": transaction,
  414. "session_id": delegate.sessionID,
  415. "handle_id": handleID,
  416. "candidate": candidate
  417. ] as [String : Any]
  418. }
  419. }
  420.  
  421. class SendCandidateEndCommand: BaseCommand {
  422.  
  423. override func getDataObject() -> [String : Any] {
  424. return [
  425. "janus": "trickle",
  426. "transaction": transaction,
  427. "session_id": delegate.sessionID,
  428. "handle_id": handleID,
  429. "candidate": ["completed":true]
  430. ] as [String : Any]
  431. }
  432. }
  433.  
  434. class KeepAliveCommand: BaseCommand {
  435.  
  436. override func getDataObject() -> [String : Any] {
  437. return [
  438. "janus": "keepalive",
  439. "transaction": transaction,
  440. "session_id": delegate.sessionID
  441. ] as [String : Any]
  442. }
  443. }
Add Comment
Please, Sign In to add comment