NCSignalingMessage.m 44 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283848586878889909192939495969798991001011021031041051061071081091101111121131141151161171181191201211221231241251261271281291301311321331341351361371381391401411421431441451461471481491501511521531541551561571581591601611621631641651661671681691701711721731741751761771781791801811821831841851861871881891901911921931941951961971981992002012022032042052062072082092102112122132142152162172182192202212222232242252262272282292302312322332342352362372382392402412422432442452462472482492502512522532542552562572582592602612622632642652662672682692702712722732742752762772782792802812822832842852862872882892902912922932942952962972982993003013023033043053063073083093103113123133143153163173183193203213223233243253263273283293303313323333343353363373383393403413423433443453463473483493503513523533543553563573583593603613623633643653663673683693703713723733743753763773783793803813823833843853863873883893903913923933943953963973983994004014024034044054064074084094104114124134144154164174184194204214224234244254264274284294304314324334344354364374384394404414424434444454464474484494504514524534544554564574584594604614624634644654664674684694704714724734744754764774784794804814824834844854864874884894904914924934944954964974984995005015025035045055065075085095105115125135145155165175185195205215225235245255265275285295305315325335345355365375385395405415425435445455465475485495505515525535545555565575585595605615625635645655665675685695705715725735745755765775785795805815825835845855865875885895905915925935945955965975985996006016026036046056066076086096106116126136146156166176186196206216226236246256266276286296306316326336346356366376386396406416426436446456466476486496506516526536546556566576586596606616626636646656666676686696706716726736746756766776786796806816826836846856866876886896906916926936946956966976986997007017027037047057067077087097107117127137147157167177187197207217227237247257267277287297307317327337347357367377387397407417427437447457467477487497507517527537547557567577587597607617627637647657667677687697707717727737747757767777787797807817827837847857867877887897907917927937947957967977987998008018028038048058068078088098108118128138148158168178188198208218228238248258268278288298308318328338348358368378388398408418428438448458468478488498508518528538548558568578588598608618628638648658668678688698708718728738748758768778788798808818828838848858868878888898908918928938948958968978988999009019029039049059069079089099109119129139149159169179189199209219229239249259269279289299309319329339349359369379389399409419429439449459469479489499509519529539549559569579589599609619629639649659669679689699709719729739749759769779789799809819829839849859869879889899909919929939949959969979989991000100110021003100410051006100710081009101010111012101310141015101610171018101910201021102210231024102510261027102810291030103110321033103410351036103710381039104010411042104310441045104610471048104910501051105210531054105510561057105810591060106110621063106410651066106710681069107010711072107310741075107610771078107910801081108210831084108510861087108810891090109110921093109410951096109710981099110011011102110311041105110611071108110911101111111211131114111511161117111811191120112111221123112411251126112711281129113011311132113311341135113611371138113911401141114211431144114511461147114811491150115111521153115411551156115711581159116011611162116311641165116611671168116911701171117211731174117511761177117811791180
  1. /**
  2. * SPDX-FileCopyrightText: 2020 Nextcloud GmbH and Nextcloud contributors
  3. * SPDX-License-Identifier: GPL-3.0-or-later
  4. */
  5. #import "NCSignalingMessage.h"
  6. #import "WebRTC/RTCLogging.h"
  7. #import "ARDUtilities.h"
  8. #import "RTCIceCandidate+JSON.h"
  9. #import "RTCSessionDescription+JSON.h"
  10. static NSString * const kNCSignalingMessageEventKey = @"ev";
  11. static NSString * const kNCSignalingMessageFunctionKey = @"fn";
  12. static NSString * const kNCSignalingMessageSessionIdKey = @"sessionId";
  13. static NSString * const kNCSignalingMessageKey = @"message";
  14. static NSString * const kNCExternalSignalingMessageDataKey = @"data";
  15. static NSString * const kNCExternalSignalingMessageSenderKey = @"sender";
  16. static NSString * const kNCExternalSignalingMessageTypeSessionKey = @"session";
  17. static NSString * const kNCExternalSignalingMessageTypeRoomKey = @"room";
  18. static NSString * const kNCExternalSignalingMessageSessionIdKey = @"sessionid";
  19. static NSString * const kNCSignalingMessageFromKey = @"from";
  20. static NSString * const kNCSignalingMessageToKey = @"to";
  21. static NSString * const kNCSignalingMessageSidKey = @"sid";
  22. static NSString * const kNCSignalingMessageTypeKey = @"type";
  23. static NSString * const kNCSignalingMessageActionKey = @"action";
  24. static NSString * const kNCSignalingMessagePayloadKey = @"payload";
  25. static NSString * const kNCSignalingMessageRoomTypeKey = @"roomType";
  26. static NSString * const kNCSignalingMessageNickKey = @"nick";
  27. static NSString * const kNCSignalingMessageStatusKey = @"status";
  28. static NSString * const kNCSignalingMessageNameKey = @"name";
  29. static NSString * const kNCSignalingMessageBroadcasterKey = @"broadcaster";
  30. static NSString * const kNCSignalingMessageTypeOfferKey = @"offer";
  31. static NSString * const kNCSignalingMessageTypeAnswerKey = @"answer";
  32. static NSString * const kNCSignalingMessageTypeCandidateKey = @"candidate";
  33. static NSString * const kNCSignalingMessageTypeUnshareScreenKey = @"unshareScreen";
  34. static NSString * const kNCSignalingMessageTypeRemoveCandidatesKey = @"remove-candidates";
  35. static NSString * const kNCSignalingMessageTypeControlKey = @"control";
  36. static NSString * const kNCSignalingMessageTypeForceMuteKey = @"forceMute";
  37. static NSString * const kNCSignalingMessageTypeMuteKey = @"mute";
  38. static NSString * const kNCSignalingMessageTypeUnmuteKey = @"unmute";
  39. static NSString * const kNCSignalingMessageTypeNickChangedKey = @"nickChanged";
  40. static NSString * const kNCSignalingMessageTypeRaiseHandKey = @"raiseHand";
  41. static NSString * const kNCSignalingMessageTypeRecordingKey = @"recording";
  42. static NSString * const kNCSignalingMessageTypeReactionKey = @"reaction";
  43. static NSString * const kNCSignalingMessageTypeStartedTypingKey = @"startedTyping";
  44. static NSString * const kNCSignalingMessageTypeStoppedTypingKey = @"stoppedTyping";
  45. static NSString * const kNCSignalingMessageSdpKey = @"sdp";
  46. NSString *const kRoomTypeVideo = @"video";
  47. NSString *const kRoomTypeScreen = @"screen";
  48. @implementation NCSignalingMessage
  49. @synthesize from = _from;
  50. @synthesize to = _to;
  51. @synthesize type = _type;
  52. @synthesize payload = _payload;
  53. @synthesize roomType = _roomType;
  54. @synthesize sid = _sid;
  55. @synthesize broadcaster = _broadcaster;
  56. - (instancetype)initWithFrom:(NSString *)from
  57. to:(NSString *)to
  58. sid:(NSString *)sid
  59. type:(NSString *)type
  60. payload:(NSDictionary *)payload
  61. roomType:(NSString *)roomType
  62. broadcaster:(NSString *)broadcaster
  63. {
  64. if (self = [super init]) {
  65. _from = from;
  66. _to = to;
  67. _sid = sid;
  68. _type = type;
  69. _payload = payload;
  70. _roomType = roomType;
  71. _broadcaster = broadcaster;
  72. }
  73. return self;
  74. }
  75. - (NSString *)description {
  76. return [[NSString alloc] initWithData:[self JSONData]
  77. encoding:NSUTF8StringEncoding];
  78. }
  79. + (NCSignalingMessage *)messageFromJSONString:(NSString *)jsonString {
  80. NSDictionary *values = [NSDictionary dictionaryWithJSONString:jsonString];
  81. if (!values) {
  82. RTCLogError(@"Error parsing signaling message JSON.");
  83. return nil;
  84. }
  85. return [self messageFromJSONDictionary:values];
  86. }
  87. + (NCSignalingMessage *)messageFromJSONDictionary:(NSDictionary *)jsonDict {
  88. NSString *typeString = [jsonDict objectForKey:kNCSignalingMessageTypeKey];
  89. NCSignalingMessage *message = nil;
  90. if ([typeString isEqualToString:kNCSignalingMessageTypeCandidateKey]) {
  91. message = [[NCICECandidateMessage alloc] initWithValues:jsonDict];
  92. } else if ([typeString isEqualToString:kNCSignalingMessageTypeOfferKey] ||
  93. [typeString isEqualToString:kNCSignalingMessageTypeAnswerKey]) {
  94. message = [[NCSessionDescriptionMessage alloc] initWithValues:jsonDict];
  95. } else if ([typeString isEqualToString:kNCSignalingMessageTypeUnshareScreenKey]) {
  96. message = [[NCUnshareScreenMessage alloc] initWithValues:jsonDict];
  97. } else if ([typeString isEqualToString:kNCSignalingMessageTypeControlKey]) {
  98. message = [[NCControlMessage alloc] initWithValues:jsonDict];
  99. } else if ([typeString isEqualToString:kNCSignalingMessageTypeMuteKey]) {
  100. message = [[NCMuteMessage alloc] initWithValues:jsonDict];
  101. } else if ([typeString isEqualToString:kNCSignalingMessageTypeUnmuteKey]) {
  102. message = [[NCUnmuteMessage alloc] initWithValues:jsonDict];
  103. } else if ([typeString isEqualToString:kNCSignalingMessageTypeNickChangedKey]) {
  104. message = [[NCNickChangedMessage alloc] initWithValues:jsonDict];
  105. } else if ([typeString isEqualToString:kNCSignalingMessageTypeRaiseHandKey]) {
  106. message = [[NCRaiseHandMessage alloc] initWithValues:jsonDict];
  107. } else if ([typeString isEqualToString:kNCSignalingMessageTypeReactionKey]) {
  108. message = [[NCReactionMessage alloc] initWithValues:jsonDict];
  109. } else {
  110. NSLog(@"Unexpected type: %@", typeString);
  111. }
  112. return message;
  113. }
  114. + (NCSignalingMessage *)messageFromExternalSignalingJSONDictionary:(NSDictionary *)jsonDict {
  115. NSDictionary *data = [jsonDict objectForKey:kNCExternalSignalingMessageDataKey];
  116. NSString *dataType = [data objectForKey:kNCSignalingMessageTypeKey];
  117. if ([dataType isEqualToString:kNCSignalingMessageTypeUnshareScreenKey]) {
  118. return [[NCUnshareScreenMessage alloc] initWithValues:jsonDict];
  119. } else if ([dataType isEqualToString:kNCSignalingMessageTypeMuteKey]) {
  120. return [[NCMuteMessage alloc] initWithValues:jsonDict];
  121. } else if ([dataType isEqualToString:kNCSignalingMessageTypeUnmuteKey]) {
  122. return [[NCUnmuteMessage alloc] initWithValues:jsonDict];
  123. } else if ([dataType isEqualToString:kNCSignalingMessageTypeNickChangedKey]) {
  124. return [[NCNickChangedMessage alloc] initWithValues:jsonDict];
  125. } else if ([dataType isEqualToString:kNCSignalingMessageTypeRaiseHandKey]) {
  126. return [[NCRaiseHandMessage alloc] initWithValues:jsonDict];
  127. } else if ([dataType isEqualToString:kNCSignalingMessageTypeRecordingKey]) {
  128. return [[NCRecordingMessage alloc] initWithValues:jsonDict];
  129. } else if ([dataType isEqualToString:kNCSignalingMessageTypeReactionKey]) {
  130. return [[NCReactionMessage alloc] initWithValues:jsonDict];
  131. }
  132. NSString *dataAction = [data objectForKey:kNCSignalingMessageActionKey];
  133. if ([dataAction isEqualToString:kNCSignalingMessageTypeForceMuteKey]) {
  134. return [[NCControlMessage alloc] initWithValues:jsonDict];
  135. }
  136. NSDictionary *sender = [jsonDict objectForKey:kNCExternalSignalingMessageSenderKey];
  137. NSString *messageType = [sender objectForKey:kNCSignalingMessageTypeKey];
  138. if ([messageType isEqualToString:kNCExternalSignalingMessageTypeSessionKey]) {
  139. NSString *type = [data objectForKey:kNCSignalingMessageTypeKey];
  140. if ([type isEqualToString:kNCSignalingMessageTypeCandidateKey]) {
  141. return [[NCICECandidateMessage alloc] initWithValues:jsonDict];
  142. } else if ([type isEqualToString:kNCSignalingMessageTypeOfferKey] ||
  143. [type isEqualToString:kNCSignalingMessageTypeAnswerKey]) {
  144. return [[NCSessionDescriptionMessage alloc] initWithValues:jsonDict];
  145. }
  146. }
  147. NSLog(@"Unexpected external signaling message: %@", jsonDict);
  148. return nil;
  149. }
  150. - (NSData *)JSONData {
  151. return nil;
  152. }
  153. - (NSDictionary *)messageDict {
  154. return @{};
  155. }
  156. - (NSDictionary *)functionDict {
  157. return @{};
  158. }
  159. - (NCSignalingMessageType)messageType {
  160. return kNCSignalingMessageTypeUnknown;
  161. }
  162. + (NSString *)getMessageSid {
  163. NSTimeInterval timeStamp = [[NSDate date] timeIntervalSince1970];
  164. return [[NSNumber numberWithDouble: timeStamp] stringValue];
  165. }
  166. @end
  167. @implementation NCICECandidateMessage
  168. @synthesize candidate = _candidate;
  169. - (instancetype)initWithValues:(NSDictionary *)values {
  170. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  171. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  172. // Get 'from' value from 'sender' using External Signaling
  173. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  174. if (sender) {
  175. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  176. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  177. }
  178. RTCIceCandidate *candidate = [RTCIceCandidate candidateFromJSONDictionary:[[dataDict objectForKey:kNCSignalingMessagePayloadKey] objectForKey:kNCSignalingMessageTypeCandidateKey]];
  179. return [self initWithCandidate:candidate
  180. from:from
  181. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  182. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  183. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  184. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  185. }
  186. - (NSData *)JSONData {
  187. NSError *error = nil;
  188. NSData *data =
  189. [NSJSONSerialization dataWithJSONObject:[self functionDict]
  190. options:NSJSONWritingPrettyPrinted
  191. error:&error];
  192. if (error) {
  193. RTCLogError(@"Error serializing JSON: %@", error);
  194. return nil;
  195. }
  196. return data;
  197. }
  198. - (NSString *)functionJSONSerialization
  199. {
  200. NSError *error;
  201. NSString *jsonString = nil;
  202. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  203. options:0
  204. error:&error];
  205. if (! jsonData) {
  206. NSLog(@"Error serializing JSON: %@", error);
  207. } else {
  208. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  209. }
  210. return jsonString;
  211. }
  212. - (NSDictionary *)messageDict {
  213. return @{
  214. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  215. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  216. kNCSignalingMessageSessionIdKey: self.from
  217. };
  218. }
  219. - (NSDictionary *)functionDict {
  220. return @{
  221. kNCSignalingMessageToKey: self.to,
  222. kNCSignalingMessageRoomTypeKey: self.roomType,
  223. kNCSignalingMessageTypeKey: self.type,
  224. kNCSignalingMessageSidKey: self.sid,
  225. kNCSignalingMessagePayloadKey: @{
  226. kNCSignalingMessageTypeKey: self.type,
  227. kNCSignalingMessageTypeCandidateKey: [self.candidate JSONDictionary]
  228. },
  229. };
  230. }
  231. - (NCSignalingMessageType)messageType {
  232. return kNCSignalingMessageTypeCandidate;
  233. }
  234. - (instancetype)initWithCandidate:(RTCIceCandidate *)candidate
  235. from:(NSString *)from
  236. to:(NSString *)to
  237. sid:(NSString *)sid
  238. roomType:(NSString *)roomType
  239. broadcaster:(NSString *)broadcaster
  240. {
  241. NSDictionary *payload = [[NSDictionary alloc] init];
  242. self = [super initWithFrom:from
  243. to:to
  244. sid:sid
  245. type:kNCSignalingMessageTypeCandidateKey
  246. payload:payload
  247. roomType:roomType
  248. broadcaster:broadcaster];
  249. if (!self) {
  250. return nil;
  251. }
  252. _candidate = candidate;
  253. return self;
  254. }
  255. @end
  256. @implementation NCSessionDescriptionMessage
  257. @synthesize sessionDescription = _sessionDescription;
  258. @synthesize nick = _nick;
  259. - (instancetype)initWithValues:(NSDictionary *)values {
  260. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  261. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  262. // Get 'from' value from 'sender' using External Signaling
  263. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  264. if (sender) {
  265. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  266. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  267. }
  268. RTCSessionDescription *description = [RTCSessionDescription descriptionFromJSONDictionary:[dataDict objectForKey:kNCSignalingMessagePayloadKey]];
  269. NSString *nick = [[dataDict objectForKey:kNCSignalingMessagePayloadKey] objectForKey:kNCSignalingMessageNickKey];
  270. return [self initWithSessionDescription:description
  271. from:from
  272. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  273. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  274. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  275. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]
  276. nick:nick];
  277. }
  278. - (NSData *)JSONData {
  279. NSError *error = nil;
  280. NSData *data =
  281. [NSJSONSerialization dataWithJSONObject:[self messageDict]
  282. options:0
  283. error:&error];
  284. if (error) {
  285. RTCLogError(@"Error serializing JSON: %@", error);
  286. return nil;
  287. }
  288. return data;
  289. }
  290. - (NSString *)functionJSONSerialization
  291. {
  292. NSError *error;
  293. NSString *jsonString = nil;
  294. NSMutableDictionary *functionData = [[NSMutableDictionary alloc] initWithDictionary:[self functionDict]];
  295. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:functionData
  296. options:0
  297. error:&error];
  298. if (! jsonData) {
  299. NSLog(@"Error serializing JSON: %@", error);
  300. } else {
  301. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  302. }
  303. return jsonString;
  304. }
  305. - (NSDictionary *)messageDict {
  306. return @{
  307. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  308. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  309. kNCSignalingMessageSessionIdKey: self.from
  310. };
  311. }
  312. - (NSDictionary *)functionDict {
  313. return @{
  314. kNCSignalingMessageToKey: self.to,
  315. kNCSignalingMessageRoomTypeKey: self.roomType,
  316. kNCSignalingMessageTypeKey: self.type,
  317. kNCSignalingMessageSidKey: self.sid,
  318. kNCSignalingMessageBroadcasterKey: self.broadcaster ? self.broadcaster : @"",
  319. kNCSignalingMessagePayloadKey: @{
  320. kNCSignalingMessageTypeKey: self.type,
  321. kNCSignalingMessageSdpKey: self.sessionDescription.sdp,
  322. kNCSignalingMessageNickKey: self.nick
  323. },
  324. };
  325. }
  326. - (NCSignalingMessageType)messageType {
  327. if ([self.type isEqualToString:kNCSignalingMessageTypeOfferKey]) {
  328. return kNCSignalingMessageTypeOffer;
  329. }
  330. return kNCSignalingMessageTypeAnswer;
  331. }
  332. - (instancetype)initWithSessionDescription:(RTCSessionDescription *)sessionDescription
  333. from:(NSString *)from
  334. to:(NSString *)to
  335. sid:(NSString *)sid
  336. roomType:(NSString *)roomType
  337. broadcaster:(NSString *)broadcaster
  338. nick:(NSString *)nick
  339. {
  340. RTCSdpType sdpType = sessionDescription.type;
  341. NSString *type = @"";
  342. switch (sdpType) {
  343. case RTCSdpTypeOffer:
  344. type = kNCSignalingMessageTypeOfferKey;
  345. break;
  346. case RTCSdpTypeAnswer:
  347. type = kNCSignalingMessageTypeAnswerKey;
  348. break;
  349. case RTCSdpTypePrAnswer:
  350. NSAssert(NO, @"Unexpected type: %@",
  351. [RTCSessionDescription stringForType:sdpType]);
  352. break;
  353. }
  354. NSMutableDictionary *payload = [[NSMutableDictionary alloc] init];
  355. [payload setObject:type forKey:kNCSignalingMessageTypeKey];
  356. [payload setObject:sessionDescription.sdp forKey:kNCSignalingMessageSdpKey];
  357. self = [super initWithFrom:from
  358. to:to
  359. sid:sid
  360. type:type
  361. payload:payload
  362. roomType:roomType
  363. broadcaster:broadcaster];
  364. if (!self) {
  365. return nil;
  366. }
  367. _sessionDescription = sessionDescription;
  368. _nick = nick;
  369. return self;
  370. }
  371. @end
  372. @implementation NCUnshareScreenMessage
  373. - (instancetype)initWithFrom:(NSString *)from to:(NSString *)to sid:(NSString *)sid roomType:(NSString *)roomType payload:(NSDictionary *)payload {
  374. return [super initWithFrom:from
  375. to:to
  376. sid:sid
  377. type:kNCSignalingMessageTypeUnshareScreenKey
  378. payload:payload
  379. roomType:roomType
  380. broadcaster:nil];
  381. }
  382. - (instancetype)initWithValues:(NSDictionary *)values {
  383. NSDictionary *payload = [[NSDictionary alloc] init];
  384. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  385. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  386. // Get 'from' value from 'sender' using External Signaling
  387. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  388. if (sender) {
  389. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  390. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  391. }
  392. return [super initWithFrom:from
  393. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  394. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  395. type:kNCSignalingMessageTypeUnshareScreenKey
  396. payload:payload
  397. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  398. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  399. }
  400. - (NSString *)functionJSONSerialization
  401. {
  402. NSError *error;
  403. NSString *jsonString = nil;
  404. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  405. options:0
  406. error:&error];
  407. if (! jsonData) {
  408. NSLog(@"Error serializing JSON: %@", error);
  409. } else {
  410. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  411. }
  412. return jsonString;
  413. }
  414. - (NSDictionary *)messageDict {
  415. return @{
  416. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  417. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  418. kNCSignalingMessageSessionIdKey: self.from
  419. };
  420. }
  421. - (NSDictionary *)functionDict {
  422. return @{
  423. kNCSignalingMessageToKey: self.to,
  424. kNCSignalingMessageRoomTypeKey: self.roomType,
  425. kNCSignalingMessageTypeKey: self.type,
  426. kNCSignalingMessageSidKey: self.sid,
  427. kNCSignalingMessagePayloadKey: self.payload,
  428. };
  429. }
  430. - (NCSignalingMessageType)messageType {
  431. return kNCSignalingMessageTypeUnshareScreen;
  432. }
  433. @end
  434. @implementation NCControlMessage
  435. - (instancetype)initWithValues:(NSDictionary *)values {
  436. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  437. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  438. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  439. // Get 'from' value from 'sender' using External Signaling
  440. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  441. if (sender) {
  442. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  443. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  444. payload = dataDict;
  445. }
  446. return [super initWithFrom:from
  447. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  448. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  449. type:kNCSignalingMessageTypeControlKey
  450. payload:payload
  451. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  452. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  453. }
  454. - (NCSignalingMessageType)messageType {
  455. return kNCSignalingMessageTypeControl;
  456. }
  457. @end
  458. @implementation NCMuteMessage
  459. - (instancetype)initWithFrom:(NSString *)from to:(NSString *)to sid:(NSString *)sid roomType:(NSString *)roomType payload:(NSDictionary *)payload {
  460. return [super initWithFrom:from
  461. to:to
  462. sid:sid
  463. type:kNCSignalingMessageTypeMuteKey
  464. payload:payload
  465. roomType:roomType
  466. broadcaster:nil];
  467. }
  468. - (instancetype)initWithValues:(NSDictionary *)values {
  469. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  470. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  471. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  472. // Get 'from' value from 'sender' using External Signaling
  473. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  474. if (sender) {
  475. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  476. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  477. payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  478. }
  479. return [super initWithFrom:from
  480. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  481. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  482. type:kNCSignalingMessageTypeMuteKey
  483. payload:payload
  484. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  485. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  486. }
  487. - (NSData *)JSONData {
  488. NSError *error = nil;
  489. NSData *data =
  490. [NSJSONSerialization dataWithJSONObject:[self functionDict]
  491. options:NSJSONWritingPrettyPrinted
  492. error:&error];
  493. if (error) {
  494. RTCLogError(@"Error serializing JSON: %@", error);
  495. return nil;
  496. }
  497. return data;
  498. }
  499. - (NSString *)functionJSONSerialization
  500. {
  501. NSError *error;
  502. NSString *jsonString = nil;
  503. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  504. options:0
  505. error:&error];
  506. if (! jsonData) {
  507. NSLog(@"Error serializing JSON: %@", error);
  508. } else {
  509. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  510. }
  511. return jsonString;
  512. }
  513. - (NSDictionary *)messageDict {
  514. return @{
  515. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  516. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  517. kNCSignalingMessageSessionIdKey: self.from
  518. };
  519. }
  520. - (NSDictionary *)functionDict {
  521. return @{
  522. kNCSignalingMessageToKey: self.to,
  523. kNCSignalingMessageRoomTypeKey: self.roomType,
  524. kNCSignalingMessageTypeKey: self.type,
  525. kNCSignalingMessageSidKey: self.sid,
  526. kNCSignalingMessagePayloadKey: self.payload,
  527. };
  528. }
  529. - (NCSignalingMessageType)messageType {
  530. return kNCSignalingMessageTypeMute;
  531. }
  532. @end
  533. @implementation NCUnmuteMessage
  534. - (instancetype)initWithFrom:(NSString *)from to:(NSString *)to sid:(NSString *)sid roomType:(NSString *)roomType payload:(NSDictionary *)payload {
  535. return [super initWithFrom:from
  536. to:to
  537. sid:sid
  538. type:kNCSignalingMessageTypeUnmuteKey
  539. payload:payload
  540. roomType:roomType
  541. broadcaster:nil];
  542. }
  543. - (instancetype)initWithValues:(NSDictionary *)values {
  544. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  545. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  546. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  547. // Get 'from' value from 'sender' using External Signaling
  548. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  549. if (sender) {
  550. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  551. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  552. payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  553. }
  554. return [super initWithFrom:from
  555. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  556. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  557. type:kNCSignalingMessageTypeUnmuteKey
  558. payload:payload
  559. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  560. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  561. }
  562. - (NSData *)JSONData {
  563. NSError *error = nil;
  564. NSData *data =
  565. [NSJSONSerialization dataWithJSONObject:[self functionDict]
  566. options:NSJSONWritingPrettyPrinted
  567. error:&error];
  568. if (error) {
  569. RTCLogError(@"Error serializing JSON: %@", error);
  570. return nil;
  571. }
  572. return data;
  573. }
  574. - (NSString *)functionJSONSerialization
  575. {
  576. NSError *error;
  577. NSString *jsonString = nil;
  578. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  579. options:0
  580. error:&error];
  581. if (! jsonData) {
  582. NSLog(@"Error serializing JSON: %@", error);
  583. } else {
  584. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  585. }
  586. return jsonString;
  587. }
  588. - (NSDictionary *)messageDict {
  589. return @{
  590. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  591. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  592. kNCSignalingMessageSessionIdKey: self.from
  593. };
  594. }
  595. - (NSDictionary *)functionDict {
  596. return @{
  597. kNCSignalingMessageToKey: self.to,
  598. kNCSignalingMessageRoomTypeKey: self.roomType,
  599. kNCSignalingMessageTypeKey: self.type,
  600. kNCSignalingMessageSidKey: self.sid,
  601. kNCSignalingMessagePayloadKey: self.payload,
  602. };
  603. }
  604. - (NCSignalingMessageType)messageType {
  605. return kNCSignalingMessageTypeUnmute;
  606. }
  607. @end
  608. @implementation NCNickChangedMessage
  609. - (instancetype)initWithFrom:(NSString *)from to:(NSString *)to sid:(NSString *)sid roomType:(NSString *)roomType payload:(NSDictionary *)payload {
  610. return [super initWithFrom:from
  611. to:to
  612. sid:sid
  613. type:kNCSignalingMessageTypeNickChangedKey
  614. payload:payload
  615. roomType:roomType
  616. broadcaster:nil];
  617. }
  618. - (instancetype)initWithValues:(NSDictionary *)values {
  619. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  620. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  621. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  622. // Get 'from' value from 'sender' using External Signaling
  623. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  624. if (sender) {
  625. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  626. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  627. payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  628. }
  629. return [super initWithFrom:from
  630. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  631. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  632. type:kNCSignalingMessageTypeNickChangedKey
  633. payload:payload
  634. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  635. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  636. }
  637. - (NSData *)JSONData {
  638. NSError *error = nil;
  639. NSData *data =
  640. [NSJSONSerialization dataWithJSONObject:[self functionDict]
  641. options:NSJSONWritingPrettyPrinted
  642. error:&error];
  643. if (error) {
  644. RTCLogError(@"Error serializing JSON: %@", error);
  645. return nil;
  646. }
  647. return data;
  648. }
  649. - (NSString *)functionJSONSerialization
  650. {
  651. NSError *error;
  652. NSString *jsonString = nil;
  653. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  654. options:0
  655. error:&error];
  656. if (! jsonData) {
  657. NSLog(@"Error serializing JSON: %@", error);
  658. } else {
  659. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  660. }
  661. return jsonString;
  662. }
  663. - (NSDictionary *)messageDict {
  664. return @{
  665. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  666. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  667. kNCSignalingMessageSessionIdKey: self.from
  668. };
  669. }
  670. - (NSDictionary *)functionDict {
  671. return @{
  672. kNCSignalingMessageToKey: self.to,
  673. kNCSignalingMessageRoomTypeKey: self.roomType,
  674. kNCSignalingMessageTypeKey: self.type,
  675. kNCSignalingMessageSidKey: self.sid,
  676. kNCSignalingMessagePayloadKey: self.payload,
  677. };
  678. }
  679. - (NCSignalingMessageType)messageType {
  680. return kNCSignalingMessageTypeNickChanged;
  681. }
  682. @end
  683. @implementation NCRaiseHandMessage
  684. - (instancetype)initWithFrom:(NSString *)from to:(NSString *)to sid:(NSString *)sid roomType:(NSString *)roomType payload:(NSDictionary *)payload {
  685. return [super initWithFrom:from
  686. to:to
  687. sid:sid
  688. type:kNCSignalingMessageTypeRaiseHandKey
  689. payload:payload
  690. roomType:roomType
  691. broadcaster:nil];
  692. }
  693. - (instancetype)initWithValues:(NSDictionary *)values {
  694. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  695. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  696. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  697. // Get 'from' value from 'sender' using External Signaling
  698. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  699. if (sender) {
  700. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  701. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  702. payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  703. }
  704. return [super initWithFrom:from
  705. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  706. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  707. type:kNCSignalingMessageTypeRaiseHandKey
  708. payload:payload
  709. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  710. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  711. }
  712. - (NSData *)JSONData {
  713. NSError *error = nil;
  714. NSData *data =
  715. [NSJSONSerialization dataWithJSONObject:[self messageDict]
  716. options:0
  717. error:&error];
  718. if (error) {
  719. RTCLogError(@"Error serializing JSON: %@", error);
  720. return nil;
  721. }
  722. return data;
  723. }
  724. - (NSString *)functionJSONSerialization
  725. {
  726. NSError *error;
  727. NSString *jsonString = nil;
  728. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  729. options:0
  730. error:&error];
  731. if (! jsonData) {
  732. NSLog(@"Error serializing JSON: %@", error);
  733. } else {
  734. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  735. }
  736. return jsonString;
  737. }
  738. - (NSDictionary *)messageDict {
  739. return @{
  740. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  741. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  742. kNCSignalingMessageSessionIdKey: self.from
  743. };
  744. }
  745. - (NSDictionary *)functionDict {
  746. return @{
  747. kNCSignalingMessageToKey: self.to,
  748. kNCSignalingMessageRoomTypeKey: self.roomType,
  749. kNCSignalingMessageTypeKey: self.type,
  750. kNCSignalingMessageSidKey: self.sid,
  751. kNCSignalingMessagePayloadKey: self.payload,
  752. };
  753. }
  754. - (NCSignalingMessageType)messageType {
  755. return kNCSignalingMessageTypeRaiseHand;
  756. }
  757. @end
  758. @implementation NCRecordingMessage
  759. @synthesize status = _status;
  760. - (instancetype)initWithValues:(NSDictionary *)values {
  761. NSDictionary *valuesDict = [[NSDictionary alloc] initWithDictionary:values];
  762. NSDictionary *dataDict = [valuesDict objectForKey:kNCExternalSignalingMessageDataKey];
  763. NSDictionary *recordingDict = [dataDict objectForKey:kNCSignalingMessageTypeRecordingKey];
  764. self = [super initWithFrom:nil
  765. to:nil
  766. sid:nil
  767. type:kNCSignalingMessageTypeRecordingKey
  768. payload:recordingDict
  769. roomType:nil
  770. broadcaster:nil];
  771. if (self) {
  772. _status = [[recordingDict objectForKey:kNCSignalingMessageStatusKey] integerValue];
  773. }
  774. return self;
  775. }
  776. - (NCSignalingMessageType)messageType {
  777. return kNCSignalingMessageTypeRecording;
  778. }
  779. @end
  780. @implementation NCReactionMessage
  781. - (instancetype)initWithFrom:(NSString *)from to:(NSString *)to sid:(NSString *)sid roomType:(NSString *)roomType payload:(NSDictionary *)payload {
  782. return [super initWithFrom:from
  783. to:to
  784. sid:sid
  785. type:kNCSignalingMessageTypeReactionKey
  786. payload:payload
  787. roomType:roomType
  788. broadcaster:nil];
  789. }
  790. - (instancetype)initWithValues:(NSDictionary *)values {
  791. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  792. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  793. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  794. // Get 'from' value from 'sender' using External Signaling
  795. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  796. if (sender) {
  797. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  798. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  799. payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  800. }
  801. return [super initWithFrom:from
  802. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  803. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  804. type:kNCSignalingMessageTypeReactionKey
  805. payload:payload
  806. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  807. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  808. }
  809. - (NSData *)JSONData {
  810. NSError *error = nil;
  811. NSData *data =
  812. [NSJSONSerialization dataWithJSONObject:[self messageDict]
  813. options:0
  814. error:&error];
  815. if (error) {
  816. RTCLogError(@"Error serializing JSON: %@", error);
  817. return nil;
  818. }
  819. return data;
  820. }
  821. - (NSString *)functionJSONSerialization
  822. {
  823. NSError *error;
  824. NSString *jsonString = nil;
  825. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  826. options:0
  827. error:&error];
  828. if (! jsonData) {
  829. NSLog(@"Error serializing JSON: %@", error);
  830. } else {
  831. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  832. }
  833. return jsonString;
  834. }
  835. - (NSDictionary *)messageDict {
  836. return @{
  837. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  838. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  839. kNCSignalingMessageSessionIdKey: self.from
  840. };
  841. }
  842. - (NSDictionary *)functionDict {
  843. return @{
  844. kNCSignalingMessageToKey: self.to,
  845. kNCSignalingMessageRoomTypeKey: self.roomType,
  846. kNCSignalingMessageTypeKey: self.type,
  847. kNCSignalingMessageSidKey: self.sid,
  848. kNCSignalingMessagePayloadKey: self.payload,
  849. };
  850. }
  851. - (NCSignalingMessageType)messageType {
  852. return kNCSignalingMessageTypeReaction;
  853. }
  854. @end
  855. @implementation NCStartedTypingMessage
  856. - (instancetype)initWithFrom:(NSString *)from sendTo:(NSString *)to withPayload:(NSDictionary *)payload forRoomType:(NSString *)roomType {
  857. return [super initWithFrom:from
  858. to:to
  859. sid:[NCSignalingMessage getMessageSid]
  860. type:kNCSignalingMessageTypeStartedTypingKey
  861. payload:payload
  862. roomType:roomType
  863. broadcaster:nil];
  864. }
  865. - (instancetype)initWithValues:(NSDictionary *)values {
  866. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  867. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  868. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  869. // Get 'from' value from 'sender' using External Signaling
  870. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  871. if (sender) {
  872. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  873. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  874. payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  875. }
  876. return [super initWithFrom:from
  877. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  878. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  879. type:kNCSignalingMessageTypeStartedTypingKey
  880. payload:payload
  881. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  882. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  883. }
  884. - (NSData *)JSONData {
  885. NSError *error = nil;
  886. NSData *data =
  887. [NSJSONSerialization dataWithJSONObject:[self messageDict]
  888. options:0
  889. error:&error];
  890. if (error) {
  891. RTCLogError(@"Error serializing JSON: %@", error);
  892. return nil;
  893. }
  894. return data;
  895. }
  896. - (NSString *)functionJSONSerialization
  897. {
  898. NSError *error;
  899. NSString *jsonString = nil;
  900. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  901. options:0
  902. error:&error];
  903. if (! jsonData) {
  904. NSLog(@"Error serializing JSON: %@", error);
  905. } else {
  906. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  907. }
  908. return jsonString;
  909. }
  910. - (NSDictionary *)messageDict {
  911. return @{
  912. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  913. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  914. kNCSignalingMessageSessionIdKey: self.from
  915. };
  916. }
  917. - (NSDictionary *)functionDict {
  918. return @{
  919. kNCSignalingMessageToKey: self.to,
  920. kNCSignalingMessageRoomTypeKey: self.roomType,
  921. kNCSignalingMessageTypeKey: self.type,
  922. kNCSignalingMessagePayloadKey: self.payload,
  923. };
  924. }
  925. - (NCSignalingMessageType)messageType {
  926. return kNCSignalingMessageTypeStartedTyping;
  927. }
  928. @end
  929. @implementation NCStoppedTypingMessage
  930. - (instancetype)initWithFrom:(NSString *)from sendTo:(NSString *)to withPayload:(NSDictionary *)payload forRoomType:(NSString *)roomType {
  931. return [super initWithFrom:from
  932. to:to
  933. sid:[NCSignalingMessage getMessageSid]
  934. type:kNCSignalingMessageTypeStoppedTypingKey
  935. payload:payload
  936. roomType:roomType
  937. broadcaster:nil];
  938. }
  939. - (instancetype)initWithValues:(NSDictionary *)values {
  940. NSDictionary *dataDict = [[NSDictionary alloc] initWithDictionary:values];
  941. NSDictionary *payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  942. NSString *from = [values objectForKey:kNCSignalingMessageFromKey];
  943. // Get 'from' value from 'sender' using External Signaling
  944. NSDictionary *sender = [values objectForKey:kNCExternalSignalingMessageSenderKey];
  945. if (sender) {
  946. from = [sender objectForKey:kNCExternalSignalingMessageSessionIdKey];
  947. dataDict = [values objectForKey:kNCExternalSignalingMessageDataKey];
  948. payload = [dataDict objectForKey:kNCSignalingMessagePayloadKey];
  949. }
  950. return [super initWithFrom:from
  951. to:[dataDict objectForKey:kNCSignalingMessageToKey]
  952. sid:[dataDict objectForKey:kNCSignalingMessageSidKey]
  953. type:kNCSignalingMessageTypeStoppedTypingKey
  954. payload:payload
  955. roomType:[dataDict objectForKey:kNCSignalingMessageRoomTypeKey]
  956. broadcaster:[dataDict objectForKey:kNCSignalingMessageBroadcasterKey]];
  957. }
  958. - (NSData *)JSONData {
  959. NSError *error = nil;
  960. NSData *data =
  961. [NSJSONSerialization dataWithJSONObject:[self messageDict]
  962. options:0
  963. error:&error];
  964. if (error) {
  965. RTCLogError(@"Error serializing JSON: %@", error);
  966. return nil;
  967. }
  968. return data;
  969. }
  970. - (NSString *)functionJSONSerialization
  971. {
  972. NSError *error;
  973. NSString *jsonString = nil;
  974. NSData *jsonData = [NSJSONSerialization dataWithJSONObject:[self functionDict]
  975. options:0
  976. error:&error];
  977. if (! jsonData) {
  978. NSLog(@"Error serializing JSON: %@", error);
  979. } else {
  980. jsonString = [[NSString alloc] initWithData:jsonData encoding:NSUTF8StringEncoding];
  981. }
  982. return jsonString;
  983. }
  984. - (NSDictionary *)messageDict {
  985. return @{
  986. kNCSignalingMessageEventKey: kNCSignalingMessageKey,
  987. kNCSignalingMessageFunctionKey: [self functionJSONSerialization],
  988. kNCSignalingMessageSessionIdKey: self.from
  989. };
  990. }
  991. - (NSDictionary *)functionDict {
  992. return @{
  993. kNCSignalingMessageToKey: self.to,
  994. kNCSignalingMessageRoomTypeKey: self.roomType,
  995. kNCSignalingMessageTypeKey: self.type,
  996. kNCSignalingMessagePayloadKey: self.payload,
  997. };
  998. }
  999. - (NCSignalingMessageType)messageType {
  1000. return kNCSignalingMessageTypeStoppedTyping;
  1001. }
  1002. @end