@100mslive/react-native-hms 1.1.0 → 1.2.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (101) hide show
  1. package/README.md +145 -340
  2. package/android/build.gradle +2 -2
  3. package/android/src/main/java/com/reactnativehmssdk/HMSDecoder.kt +205 -75
  4. package/android/src/main/java/com/reactnativehmssdk/HMSHelper.kt +127 -127
  5. package/android/src/main/java/com/reactnativehmssdk/HMSManager.kt +153 -115
  6. package/android/src/main/java/com/reactnativehmssdk/HMSRNSDK.kt +147 -17
  7. package/android/src/main/java/com/reactnativehmssdk/HMSSDKViewManager.kt +7 -7
  8. package/ios/HMSDecoder.swift +205 -129
  9. package/ios/HMSHelper.swift +3 -3
  10. package/ios/HMSManager.m +3 -0
  11. package/ios/HMSManager.swift +22 -1
  12. package/ios/HMSRNSDK.swift +228 -79
  13. package/ios/HMSView.m +2 -0
  14. package/ios/HMSView.swift +35 -3
  15. package/ios/Hmssdk.xcodeproj/project.xcworkspace/xcuserdata/yogesh.xcuserdatad/UserInterfaceState.xcuserstate +0 -0
  16. package/lib/commonjs/classes/HMSBrowserRecordingState.js.map +1 -1
  17. package/lib/commonjs/classes/HMSChangeTrackStateRequest.js.map +1 -1
  18. package/lib/commonjs/classes/HMSEncoder.js +133 -84
  19. package/lib/commonjs/classes/HMSEncoder.js.map +1 -1
  20. package/lib/commonjs/classes/HMSHLSStreamingState.js.map +1 -1
  21. package/lib/commonjs/classes/HMSLocalVideoTrack.js +0 -2
  22. package/lib/commonjs/classes/HMSLocalVideoTrack.js.map +1 -1
  23. package/lib/commonjs/classes/HMSMessageRecipient.js +1 -1
  24. package/lib/commonjs/classes/HMSMessageRecipient.js.map +1 -1
  25. package/lib/commonjs/classes/HMSNativeEventEmitter.js +106 -0
  26. package/lib/commonjs/classes/HMSNativeEventEmitter.js.map +1 -0
  27. package/lib/commonjs/classes/HMSPeer.js +4 -0
  28. package/lib/commonjs/classes/HMSPeer.js.map +1 -1
  29. package/lib/commonjs/classes/HMSPublishSettings.js +0 -6
  30. package/lib/commonjs/classes/HMSPublishSettings.js.map +1 -1
  31. package/lib/commonjs/classes/HMSRole.js +0 -6
  32. package/lib/commonjs/classes/HMSRole.js.map +1 -1
  33. package/lib/commonjs/classes/HMSRoleChangeRequest.js +3 -1
  34. package/lib/commonjs/classes/HMSRoleChangeRequest.js.map +1 -1
  35. package/lib/commonjs/classes/HMSRtmpStreamingState.js.map +1 -1
  36. package/lib/commonjs/classes/HMSSDK.js +465 -137
  37. package/lib/commonjs/classes/HMSSDK.js.map +1 -1
  38. package/lib/commonjs/classes/HMSServerRecordingState.js.map +1 -1
  39. package/lib/commonjs/classes/HMSSubscribeSettings.js +0 -2
  40. package/lib/commonjs/classes/HMSSubscribeSettings.js.map +1 -1
  41. package/lib/commonjs/index.js.map +1 -1
  42. package/lib/module/classes/HMSBrowserRecordingState.js.map +1 -1
  43. package/lib/module/classes/HMSChangeTrackStateRequest.js.map +1 -1
  44. package/lib/module/classes/HMSEncoder.js +133 -84
  45. package/lib/module/classes/HMSEncoder.js.map +1 -1
  46. package/lib/module/classes/HMSHLSStreamingState.js.map +1 -1
  47. package/lib/module/classes/HMSLocalVideoTrack.js +0 -2
  48. package/lib/module/classes/HMSLocalVideoTrack.js.map +1 -1
  49. package/lib/module/classes/HMSMessageRecipient.js +1 -1
  50. package/lib/module/classes/HMSMessageRecipient.js.map +1 -1
  51. package/lib/module/classes/HMSNativeEventEmitter.js +99 -0
  52. package/lib/module/classes/HMSNativeEventEmitter.js.map +1 -0
  53. package/lib/module/classes/HMSPeer.js +4 -0
  54. package/lib/module/classes/HMSPeer.js.map +1 -1
  55. package/lib/module/classes/HMSPublishSettings.js +0 -6
  56. package/lib/module/classes/HMSPublishSettings.js.map +1 -1
  57. package/lib/module/classes/HMSRole.js +0 -6
  58. package/lib/module/classes/HMSRole.js.map +1 -1
  59. package/lib/module/classes/HMSRoleChangeRequest.js +3 -1
  60. package/lib/module/classes/HMSRoleChangeRequest.js.map +1 -1
  61. package/lib/module/classes/HMSRtmpStreamingState.js.map +1 -1
  62. package/lib/module/classes/HMSSDK.js +466 -138
  63. package/lib/module/classes/HMSSDK.js.map +1 -1
  64. package/lib/module/classes/HMSServerRecordingState.js.map +1 -1
  65. package/lib/module/classes/HMSSubscribeSettings.js +0 -2
  66. package/lib/module/classes/HMSSubscribeSettings.js.map +1 -1
  67. package/lib/module/index.js.map +1 -1
  68. package/lib/typescript/classes/HMSBrowserRecordingState.d.ts +4 -4
  69. package/lib/typescript/classes/HMSChangeTrackStateRequest.d.ts +2 -2
  70. package/lib/typescript/classes/HMSEncoder.d.ts +3 -0
  71. package/lib/typescript/classes/HMSHLSStreamingState.d.ts +2 -2
  72. package/lib/typescript/classes/HMSLocalVideoTrack.d.ts +0 -2
  73. package/lib/typescript/classes/HMSMessageRecipient.d.ts +2 -2
  74. package/lib/typescript/classes/HMSNativeEventEmitter.d.ts +13 -0
  75. package/lib/typescript/classes/HMSPublishSettings.d.ts +8 -15
  76. package/lib/typescript/classes/HMSRole.d.ts +0 -6
  77. package/lib/typescript/classes/HMSRoleChangeRequest.d.ts +2 -2
  78. package/lib/typescript/classes/HMSRtmpStreamingState.d.ts +4 -4
  79. package/lib/typescript/classes/HMSSDK.d.ts +2 -12
  80. package/lib/typescript/classes/HMSServerRecordingState.d.ts +2 -2
  81. package/lib/typescript/classes/HMSSubscribeSettings.d.ts +0 -2
  82. package/lib/typescript/index.d.ts +1 -0
  83. package/package.json +6 -4
  84. package/react-native-hms.podspec +1 -1
  85. package/sdk-versions.json +5 -0
  86. package/src/classes/HMSBrowserRecordingState.ts +4 -4
  87. package/src/classes/HMSChangeTrackStateRequest.ts +2 -2
  88. package/src/classes/HMSEncoder.ts +186 -99
  89. package/src/classes/HMSHLSStreamingState.ts +2 -2
  90. package/src/classes/HMSLocalVideoTrack.ts +0 -2
  91. package/src/classes/HMSMessageRecipient.ts +3 -3
  92. package/src/classes/HMSNativeEventEmitter.ts +86 -0
  93. package/src/classes/HMSPeer.ts +4 -0
  94. package/src/classes/HMSPublishSettings.ts +8 -18
  95. package/src/classes/HMSRole.ts +0 -9
  96. package/src/classes/HMSRoleChangeRequest.ts +5 -3
  97. package/src/classes/HMSRtmpStreamingState.ts +4 -4
  98. package/src/classes/HMSSDK.tsx +629 -269
  99. package/src/classes/HMSServerRecordingState.ts +2 -2
  100. package/src/classes/HMSSubscribeSettings.ts +1 -7
  101. package/src/index.ts +1 -0
@@ -1,3 +1,5 @@
1
+ import { NativeModules } from 'react-native';
2
+
1
3
  import { HMSTrack } from './HMSTrack';
2
4
  import { HMSAudioTrack } from './HMSAudioTrack';
3
5
  import { HMSVideoTrack } from './HMSVideoTrack';
@@ -29,7 +31,19 @@ import { HMSMessage } from './HMSMessage';
29
31
  import { HMSMessageRecipient } from './HMSMessageRecipient';
30
32
  import { HMSException } from './HMSException';
31
33
 
34
+ const { HMSManager } = NativeModules;
35
+
36
+ interface InitialData {
37
+ roles: Record<string, HMSRole>;
38
+ }
39
+
32
40
  export class HMSEncoder {
41
+ private static data: InitialData = { roles: {} };
42
+
43
+ static clearData() {
44
+ this.data = { roles: {} };
45
+ }
46
+
33
47
  static encodeHmsRoom(room: HMSRoom, id: string) {
34
48
  const encodedObj = {
35
49
  id: room?.id,
@@ -71,19 +85,24 @@ export class HMSEncoder {
71
85
  static encodeHmsPeer(peer: any, id: string) {
72
86
  const encodedObj = {
73
87
  peerID: peer?.peerID,
74
- name: peer?.name,
88
+ name: peer?.name || '',
75
89
  isLocal: peer?.isLocal,
76
90
  customerUserID: peer?.customerUserID,
77
- customerDescription: peer?.customerDescription,
91
+ customerDescription: peer?.customerDescription || undefined,
78
92
  metadata: peer?.metadata,
79
93
  role: HMSEncoder.encodeHmsRole(peer?.role),
80
- networkQuality: HMSEncoder.encodeHMSNetworkQuality(peer?.networkQuality),
81
- audioTrack: HMSEncoder.encodeHmsAudioTrack(peer?.audioTrack, id),
82
- videoTrack: HMSEncoder.encodeHmsVideoTrack(peer?.videoTrack, id),
83
- auxiliaryTracks: HMSEncoder.encodeHmsAuxiliaryTracks(
84
- peer?.auxiliaryTracks,
85
- id
86
- ),
94
+ networkQuality: peer?.networkQuality
95
+ ? HMSEncoder.encodeHMSNetworkQuality(peer?.networkQuality)
96
+ : undefined,
97
+ audioTrack: peer?.audioTrack
98
+ ? HMSEncoder.encodeHmsAudioTrack(peer?.audioTrack, id)
99
+ : undefined,
100
+ videoTrack: peer?.videoTrack
101
+ ? HMSEncoder.encodeHmsVideoTrack(peer?.videoTrack, id)
102
+ : undefined,
103
+ auxiliaryTracks: Array.isArray(peer?.auxiliaryTracks)
104
+ ? HMSEncoder.encodeHmsAuxiliaryTracks(peer?.auxiliaryTracks, id)
105
+ : undefined,
87
106
  };
88
107
 
89
108
  return new HMSPeer(encodedObj);
@@ -139,42 +158,55 @@ export class HMSEncoder {
139
158
 
140
159
  static encodeHmsLocalPeer(peer: any, id: string) {
141
160
  const encodedObj = {
142
- peerID: peer.peerID,
143
- name: peer.name,
144
- isLocal: peer.isLocal,
145
- customerUserID: peer.customerUserID,
146
- customerDescription: peer.customerDescription,
147
- metadata: peer.metadata,
161
+ peerID: peer?.peerID,
162
+ name: peer?.name,
163
+ isLocal: true,
164
+ customerUserID: peer?.customerUserID,
165
+ customerDescription: peer?.customerDescription || undefined,
166
+ metadata: peer?.metadata || undefined,
148
167
  role: HMSEncoder.encodeHmsRole(peer?.role),
149
- networkQuality: HMSEncoder.encodeHMSNetworkQuality(peer?.networkQuality),
150
- audioTrack: HMSEncoder.encodeHmsAudioTrack(peer.audioTrack, id),
151
- videoTrack: HMSEncoder.encodeHmsVideoTrack(peer.videoTrack, id),
152
- auxiliaryTracks: HMSEncoder.encodeHmsAuxiliaryTracks(
153
- peer.auxiliaryTracks,
154
- id
155
- ),
156
- localAudioTrackData: {
157
- id: id,
158
- trackId: peer?.localAudioTrackData?.trackId,
159
- source: peer?.localAudioTrackData?.source,
160
- trackDescription: peer?.localAudioTrackData?.trackDescription,
161
- isMute: peer?.localAudioTrackData?.isMute,
162
- settings: HMSEncoder.encodeHmsAudioTrackSettings(
163
- peer?.localAudioTrackData?.settings
164
- ),
165
- type: peer?.localAudioTrackData?.type,
166
- },
167
- localVideoTrackData: {
168
- id: id,
169
- trackId: peer?.localVideoTrackData?.trackId,
170
- source: peer?.localVideoTrackData?.source,
171
- trackDescription: peer?.localVideoTrackData?.trackDescription,
172
- isMute: peer?.localVideoTrackData?.isMute,
173
- settings: HMSEncoder.encodeHmsVideoTrackSettings(
174
- peer?.localVideoTrackData?.settings
175
- ),
176
- type: peer?.localVideoTrackData?.type,
177
- },
168
+ networkQuality: peer?.networkQuality
169
+ ? HMSEncoder.encodeHMSNetworkQuality(peer?.networkQuality)
170
+ : undefined,
171
+ audioTrack: peer?.audioTrack
172
+ ? HMSEncoder.encodeHmsAudioTrack(peer?.audioTrack, id)
173
+ : undefined,
174
+ videoTrack: peer?.videoTrack
175
+ ? HMSEncoder.encodeHmsVideoTrack(peer?.videoTrack, id)
176
+ : undefined,
177
+ auxiliaryTracks: Array.isArray(peer?.auxiliaryTracks)
178
+ ? HMSEncoder.encodeHmsAuxiliaryTracks(peer?.auxiliaryTracks, id)
179
+ : undefined,
180
+ localAudioTrackData: peer?.localAudioTrackData?.trackId
181
+ ? {
182
+ id: id,
183
+ trackId: peer?.localAudioTrackData?.trackId,
184
+ source: peer?.localAudioTrackData?.source,
185
+ trackDescription: peer?.localAudioTrackData?.trackDescription,
186
+ isMute: peer?.localAudioTrackData?.isMute,
187
+ settings: peer?.localAudioTrackData?.settings
188
+ ? HMSEncoder.encodeHmsAudioTrackSettings(
189
+ peer?.localAudioTrackData?.settings
190
+ )
191
+ : undefined,
192
+ type: peer?.localAudioTrackData?.type,
193
+ }
194
+ : undefined,
195
+ localVideoTrackData: peer?.localVideoTrackData?.trackId
196
+ ? {
197
+ id: id,
198
+ trackId: peer?.localVideoTrackData?.trackId,
199
+ source: peer?.localVideoTrackData?.source,
200
+ trackDescription: peer?.localVideoTrackData?.trackDescription,
201
+ isMute: peer?.localVideoTrackData?.isMute,
202
+ settings: peer?.localVideoTrackData?.settings
203
+ ? HMSEncoder.encodeHmsVideoTrackSettings(
204
+ peer?.localVideoTrackData?.settings
205
+ )
206
+ : undefined,
207
+ type: peer?.localVideoTrackData?.type,
208
+ }
209
+ : undefined,
178
210
  };
179
211
 
180
212
  return new HMSLocalPeer(encodedObj);
@@ -217,7 +249,9 @@ export class HMSEncoder {
217
249
  source: track?.source,
218
250
  trackDescription: track?.trackDescription,
219
251
  isMute: track?.isMute,
220
- settings: HMSEncoder.encodeHmsAudioTrackSettings(track?.settings),
252
+ settings: track?.settings
253
+ ? HMSEncoder.encodeHmsAudioTrackSettings(track?.settings)
254
+ : undefined,
221
255
  type: track?.type,
222
256
  };
223
257
 
@@ -231,7 +265,9 @@ export class HMSEncoder {
231
265
  source: track?.source,
232
266
  trackDescription: track?.trackDescription,
233
267
  isMute: track?.isMute,
234
- settings: HMSEncoder.encodeHmsVideoTrackSettings(track?.settings),
268
+ settings: track?.settings
269
+ ? HMSEncoder.encodeHmsVideoTrackSettings(track?.settings)
270
+ : undefined,
235
271
  type: track?.type,
236
272
  };
237
273
 
@@ -252,37 +288,46 @@ export class HMSEncoder {
252
288
 
253
289
  static encodeHmsRemotePeer(peer: any, id: string) {
254
290
  const encodedObj = {
255
- peerID: peer.peerID,
256
- name: peer.name,
257
- isLocal: peer.isLocal,
258
- customerUserID: peer.customerUserID,
291
+ peerID: peer?.peerID,
292
+ name: peer?.name,
293
+ isLocal: false,
294
+ customerUserID: peer?.customerUserID,
259
295
  customerDescription: peer.customerDescription,
260
296
  metadata: peer.metadata,
261
297
  role: HMSEncoder.encodeHmsRole(peer?.role),
262
- networkQuality: HMSEncoder.encodeHMSNetworkQuality(peer?.networkQuality),
263
- audioTrack: HMSEncoder.encodeHmsAudioTrack(peer.audioTrack, id),
264
- videoTrack: HMSEncoder.encodeHmsVideoTrack(peer.videoTrack, id),
265
- auxiliaryTracks: HMSEncoder.encodeHmsAuxiliaryTracks(
266
- peer.auxiliaryTracks,
267
- id
268
- ),
269
- remoteAudioTrackData: {
270
- id: id,
271
- trackId: peer?.remoteAudioTrackData?.trackId,
272
- source: peer?.remoteAudioTrackData?.source,
273
- trackDescription: peer?.remoteAudioTrackData?.trackDescription,
274
- isMute: peer?.remoteAudioTrackData?.isMute,
275
- playbackAllowed: peer?.remoteAudioTrackData?.playbackAllowed,
276
- },
277
- remoteVideoTrackData: {
278
- id: id,
279
- trackId: peer?.remoteVideoTrackData?.trackId,
280
- source: peer?.remoteVideoTrackData?.source,
281
- trackDescription: peer?.remoteVideoTrackData?.trackDescription,
282
- layer: peer?.remoteVideoTrackData?.layer,
283
- isMute: peer?.remoteVideoTrackData?.isMute,
284
- playbackAllowed: peer?.remoteVideoTrackData?.playbackAllowed,
285
- },
298
+ networkQuality: peer?.networkQuality
299
+ ? HMSEncoder.encodeHMSNetworkQuality(peer?.networkQuality)
300
+ : undefined,
301
+ audioTrack: peer?.audioTrack
302
+ ? HMSEncoder.encodeHmsAudioTrack(peer?.audioTrack, id)
303
+ : undefined,
304
+ videoTrack: peer?.videoTrack
305
+ ? HMSEncoder.encodeHmsVideoTrack(peer.videoTrack, id)
306
+ : undefined,
307
+ auxiliaryTracks: Array.isArray(peer?.auxiliaryTracks)
308
+ ? HMSEncoder.encodeHmsAuxiliaryTracks(peer?.auxiliaryTracks, id)
309
+ : undefined,
310
+ remoteAudioTrackData: peer?.remoteAudioTrackData?.trackId
311
+ ? {
312
+ id: id,
313
+ trackId: peer?.remoteAudioTrackData?.trackId,
314
+ source: peer?.remoteAudioTrackData?.source,
315
+ trackDescription: peer?.remoteAudioTrackData?.trackDescription,
316
+ isMute: peer?.remoteAudioTrackData?.isMute,
317
+ playbackAllowed: peer?.remoteAudioTrackData?.playbackAllowed,
318
+ }
319
+ : undefined,
320
+ remoteVideoTrackData: peer?.remoteVideoTrackData?.trackId
321
+ ? {
322
+ id: id,
323
+ trackId: peer?.remoteVideoTrackData?.trackId,
324
+ source: peer?.remoteVideoTrackData?.source,
325
+ trackDescription: peer?.remoteVideoTrackData?.trackDescription,
326
+ layer: peer?.remoteVideoTrackData?.layer,
327
+ isMute: peer?.remoteVideoTrackData?.isMute,
328
+ playbackAllowed: peer?.remoteVideoTrackData?.playbackAllowed,
329
+ }
330
+ : undefined,
286
331
  };
287
332
 
288
333
  return new HMSRemotePeer(encodedObj);
@@ -332,14 +377,37 @@ export class HMSEncoder {
332
377
  }
333
378
 
334
379
  static encodeHmsRole(role: any) {
335
- const hmsRole = new HMSRole(role);
380
+ if (!role) {
381
+ return new HMSRole(role);
382
+ }
383
+
384
+ const rolesCache = this.data.roles;
385
+
386
+ const cachedRole = rolesCache[role.name];
387
+
388
+ // create new HMSRole instance, if cached role does not exist OR `role.publishSettings?.allowed` does not exist
389
+ if (!cachedRole || !cachedRole.publishSettings?.allowed) {
390
+ // Creating HMSRole object with data
391
+ const hmsRole = new HMSRole(role);
392
+
393
+ // saving the created HMSRole object into cache
394
+ rolesCache[role.name] = hmsRole;
336
395
 
337
- return hmsRole;
396
+ // If the created HMSRole object is complete,
397
+ // sending notification to Native Side to stop sending data for this role
398
+ if (hmsRole.publishSettings?.allowed) {
399
+ HMSManager.restrictData({ id: "12345", roleName: hmsRole.name });
400
+ }
401
+ }
402
+
403
+ return rolesCache[role.name];
338
404
  }
339
405
 
340
406
  static encodeHmsRoleChangeRequest(data: any, id: string) {
341
407
  const encodedRoleChangeRequest = {
342
- requestedBy: HMSEncoder.encodeHmsPeer(data.requestedBy, id),
408
+ requestedBy: data.requestedBy
409
+ ? HMSEncoder.encodeHmsPeer(data.requestedBy, id)
410
+ : undefined,
343
411
  suggestedRole: HMSEncoder.encodeHmsRole(data.suggestedRole),
344
412
  };
345
413
 
@@ -351,7 +419,9 @@ export class HMSEncoder {
351
419
  id: string
352
420
  ) {
353
421
  const encodedChangeTrackStateRequest = {
354
- requestedBy: HMSEncoder.encodeHmsPeer(data.requestedBy, id),
422
+ requestedBy: data?.requestedBy
423
+ ? HMSEncoder.encodeHmsPeer(data?.requestedBy, id)
424
+ : undefined,
355
425
  trackType: data.trackType,
356
426
  mute: data.mute,
357
427
  };
@@ -399,44 +469,57 @@ export class HMSEncoder {
399
469
 
400
470
  static encodeBrowserRecordingState(data: any) {
401
471
  return new HMSBrowserRecordingState({
402
- running: data?.running,
403
- startedAt: new Date(parseInt(data?.startedAt)),
404
- stoppedAt: new Date(parseInt(data?.stoppedAt)),
405
- error: data?.error,
472
+ running: data?.running || false,
473
+ startedAt: HMSEncoder.encodeDate(data?.startedAt),
474
+ stoppedAt: HMSEncoder.encodeDate(data?.stoppedAt),
475
+ error: data?.error || undefined,
406
476
  });
407
477
  }
408
478
 
409
479
  static encodeServerRecordingState(data: any) {
410
480
  return new HMSServerRecordingState({
411
- running: data?.running,
412
- error: data?.error,
413
- startedAt: new Date(parseInt(data?.startedAt)),
481
+ running: data?.running || false,
482
+ error: data?.error || undefined,
483
+ startedAt: HMSEncoder.encodeDate(data?.startedAt),
414
484
  });
415
485
  }
416
486
 
417
487
  static encodeRTMPStreamingState(data: any) {
418
488
  return new HMSRtmpStreamingState({
419
- running: data?.running,
420
- startedAt: new Date(parseInt(data?.startedAt)),
421
- stoppedAt: new Date(parseInt(data?.stoppedAt)),
422
- error: data?.error,
489
+ running: data?.running || false,
490
+ startedAt: HMSEncoder.encodeDate(data?.startedAt),
491
+ stoppedAt: HMSEncoder.encodeDate(data?.stoppedAt),
492
+ error: data?.error || undefined,
423
493
  });
424
494
  }
425
495
 
496
+ static encodeDate(dateData: any) {
497
+ if (!dateData) {
498
+ return undefined;
499
+ }
500
+ const dateNum = parseInt(dateData);
501
+ if (isNaN(dateNum)) {
502
+ return undefined;
503
+ }
504
+ return new Date(dateNum);
505
+ }
506
+
426
507
  static encodeHLSStreamingState(data: any) {
427
508
  return new HMSHLSStreamingState({
428
- running: data?.running,
429
- variants: this.encodeHLSVariants(data?.variants),
509
+ running: data?.running || false,
510
+ variants: Array.isArray(data?.variants)
511
+ ? this.encodeHLSVariants(data?.variants)
512
+ : undefined,
430
513
  });
431
514
  }
432
515
 
433
516
  static encodeHLSRecordingState(data: any) {
434
517
  if (data) {
435
518
  return new HMSHLSRecordingState({
436
- running: data?.running,
437
- startedAt: new Date(parseInt(data?.startedAt)),
438
- singleFilePerLayer: data?.singleFilePerLayer,
439
- videoOnDemand: data?.videoOnDemand,
519
+ running: data?.running || false,
520
+ startedAt: HMSEncoder.encodeDate(data?.startedAt),
521
+ singleFilePerLayer: data?.singleFilePerLayer || false,
522
+ videoOnDemand: data?.videoOnDemand || false,
440
523
  });
441
524
  } else {
442
525
  return undefined;
@@ -450,8 +533,8 @@ export class HMSEncoder {
450
533
  let variant = new HMSHLSVariant({
451
534
  hlsStreamUrl: item.hlsStreamUrl,
452
535
  meetingUrl: item.meetingUrl,
453
- metadata: item?.metadata,
454
- startedAt: new Date(parseInt(item?.startedAt)),
536
+ metadata: item?.metaData ? item?.metadata : undefined,
537
+ startedAt: HMSEncoder.encodeDate(item?.startedAt),
455
538
  });
456
539
  variants.push(variant);
457
540
  });
@@ -486,8 +569,12 @@ export class HMSEncoder {
486
569
  static encodeHMSMessageRecipient(data: any, id: string) {
487
570
  return new HMSMessageRecipient({
488
571
  recipientType: data?.recipientType,
489
- recipientPeer: this.encodeHmsPeer(data?.recipientPeer, id),
490
- recipientRoles: this.encodeHmsRoles(data?.recipientRoles),
572
+ recipientPeer: data?.recipientPeer
573
+ ? this.encodeHmsPeer(data.recipientPeer, id)
574
+ : undefined,
575
+ recipientRoles: Array.isArray(data?.recipientRoles)
576
+ ? this.encodeHmsRoles(data.recipientRoles)
577
+ : [],
491
578
  });
492
579
  }
493
580
 
@@ -2,9 +2,9 @@ import type { HMSHLSVariant } from './HMSHLSVariant';
2
2
 
3
3
  export class HMSHLSStreamingState {
4
4
  running: boolean;
5
- variants: Array<HMSHLSVariant>;
5
+ variants?: Array<HMSHLSVariant>;
6
6
 
7
- constructor(params: { running: boolean; variants: Array<HMSHLSVariant> }) {
7
+ constructor(params: { running: boolean; variants?: Array<HMSHLSVariant> }) {
8
8
  this.running = params.running;
9
9
  this.variants = params.variants;
10
10
  }
@@ -13,8 +13,6 @@ const {
13
13
 
14
14
  export class HMSLocalVideoTrack extends HMSVideoTrack {
15
15
  settings?: HMSVideoTrackSettings;
16
- startCapturing?: Function;
17
- stopCapturing?: Function;
18
16
  id: string;
19
17
 
20
18
  /**
@@ -3,9 +3,9 @@ import type { HMSPeer } from './HMSPeer';
3
3
  import type { HMSRole } from './HMSRole';
4
4
 
5
5
  export class HMSMessageRecipient {
6
- public recipientType?: HMSMessageRecipientType;
6
+ public recipientType: HMSMessageRecipientType;
7
7
  public recipientPeer?: HMSPeer;
8
- public recipientRoles?: HMSRole[];
8
+ public recipientRoles: HMSRole[];
9
9
 
10
10
  constructor(params: {
11
11
  recipientType: HMSMessageRecipientType;
@@ -14,6 +14,6 @@ export class HMSMessageRecipient {
14
14
  }) {
15
15
  this.recipientType = params.recipientType;
16
16
  this.recipientPeer = params.recipientPeer;
17
- this.recipientRoles = params.recipientRoles;
17
+ this.recipientRoles = params.recipientRoles || [];
18
18
  }
19
19
  }
@@ -0,0 +1,86 @@
1
+ import { EventSubscription, NativeEventEmitter } from "react-native";
2
+ import { logger } from './HMSLogger';
3
+
4
+ export type HMSEventSubscription = {
5
+ remove(): void;
6
+ };
7
+
8
+ export class HMSNativeEventEmitter {
9
+ private _nativeEventEmitter: NativeEventEmitter;
10
+ private _nativeModule: any;
11
+
12
+ constructor(nativeModule: any) {
13
+ this._nativeModule = nativeModule;
14
+ this._nativeEventEmitter = new NativeEventEmitter(nativeModule);
15
+ }
16
+
17
+ listenerCount(eventType: string): number {
18
+ // For RN version < v0.64, listenerCount method is not available
19
+ // @ts-ignore - typescript is giving error because we are running it with RN types version >= 0.64
20
+ if (typeof this._nativeEventEmitter.listeners === 'function') {
21
+ // @ts-ignore - typescript is giving error because we are running it with RN types version >= 0.64
22
+ const count = this._nativeEventEmitter.listeners(eventType).length;
23
+
24
+ logger?.verbose('#Function HMSNativeEventEmitter.listenerCount', { eventType, count });
25
+ return count;
26
+ }
27
+
28
+ // For RN version >= v0.64
29
+ const count = this._nativeEventEmitter.listenerCount(eventType);
30
+
31
+ logger?.verbose('#Function HMSNativeEventEmitter.listenerCount', { eventType, count });
32
+ return count;
33
+ }
34
+
35
+ addListener(id: string, eventType: string, listener: (...args: any[]) => any): HMSEventSubscription {
36
+ logger?.verbose('#Function HMSNativeEventEmitter.addListener', { id, eventType, listener });
37
+
38
+ // enable `eventType` on `HMSSDK`, if no listeners were added before
39
+ // if some listeners were added before, then `eventType` on `HMSSDK` should already be enabled
40
+ if (this.listenerCount(eventType) <= 0) {
41
+ this.enableHMSEventType(id, eventType);
42
+ }
43
+
44
+ let subscription: EventSubscription | null = this._nativeEventEmitter.addListener(eventType, listener);
45
+
46
+ return {
47
+ remove: () => {
48
+ console.log('#Function EventSubscription.remove', { id, eventType, listener });
49
+ if (
50
+ subscription &&
51
+ Object.getOwnPropertyNames(subscription).includes('remove') &&
52
+ typeof subscription.remove === 'function'
53
+ ) {
54
+ subscription.remove();
55
+ subscription = null;
56
+ } else {
57
+ this._nativeEventEmitter.removeListener(eventType, listener);
58
+ }
59
+
60
+ // disable `eventType` on `HMSSDK`, if all listeners has been removed
61
+ if (this.listenerCount(eventType) <= 0) {
62
+ this.disableHMSEventType(id, eventType);
63
+ }
64
+ }
65
+ };
66
+ }
67
+
68
+ removeAllListeners(id: string, eventType: string) {
69
+ logger?.verbose('#Function HMSNativeEventEmitter.removeAllListeners', { id, eventType });
70
+
71
+ // disable `eventType` on `HMSSDK`
72
+ this.disableHMSEventType(id, eventType);
73
+
74
+ return this._nativeEventEmitter.removeAllListeners(eventType);
75
+ }
76
+
77
+ private enableHMSEventType(id: string, eventType: string) {
78
+ logger?.verbose('#Function HMSNativeEventEmitter.enableHMSEventType', { id, eventType });
79
+ this._nativeModule.enableEvent({ id, eventType });
80
+ }
81
+
82
+ private disableHMSEventType(id: string, eventType: string) {
83
+ logger?.verbose('#Function HMSNativeEventEmitter.disableHMSEventType', { id, eventType });
84
+ this._nativeModule.disableEvent({ id, eventType });
85
+ }
86
+ }
@@ -9,6 +9,10 @@ export class HMSPeer {
9
9
  name: string;
10
10
  isLocal?: boolean;
11
11
  customerUserID?: string;
12
+
13
+ /*
14
+ * @deprecated customerDescription has been deprecated in favor of metadata
15
+ */
12
16
  customerDescription?: string;
13
17
  metadata?: string;
14
18
  role?: HMSRole;
@@ -1,31 +1,21 @@
1
1
  import type { HMSAudioSettings } from './HMSAudioSettings';
2
- import type { HMSSimulcastSettings } from './HMSSimulcastSettings';
3
2
  import type { HMSVideoSettings } from './HMSVideoSettings';
4
3
 
5
4
  export class HMSPublishSettings {
6
- audio: HMSAudioSettings;
7
- video: HMSVideoSettings;
8
- screen: HMSVideoSettings;
9
- audioSimulcast?: HMSSimulcastSettings;
10
- videoSimulcast?: HMSSimulcastSettings;
11
- screenSimulcast?: HMSSimulcastSettings;
12
- allowed?: [string];
5
+ audio?: HMSAudioSettings;
6
+ video?: HMSVideoSettings;
7
+ screen?: HMSVideoSettings;
8
+ allowed?: string[];
13
9
 
14
10
  constructor(params: {
15
- audio: HMSAudioSettings;
16
- video: HMSVideoSettings;
17
- screen: HMSVideoSettings;
18
- audioSimulcast?: HMSSimulcastSettings;
19
- videoSimulcast?: HMSSimulcastSettings;
20
- screenSimulcast?: HMSSimulcastSettings;
21
- allowed?: [string];
11
+ audio?: HMSAudioSettings;
12
+ video?: HMSVideoSettings;
13
+ screen?: HMSVideoSettings;
14
+ allowed?: string[];
22
15
  }) {
23
16
  this.audio = params.audio;
24
17
  this.video = params.video;
25
18
  this.screen = params.screen;
26
- this.audioSimulcast = params.audioSimulcast;
27
- this.videoSimulcast = params.videoSimulcast;
28
- this.screenSimulcast = params.screenSimulcast;
29
19
  this.allowed = params.allowed;
30
20
  }
31
21
  }
@@ -8,9 +8,6 @@ export class HMSRole {
8
8
  subscribeSettings?: HMSSubscribeSettings;
9
9
  permissions?: HMSPermissions;
10
10
  priority?: number;
11
- generalPermissions?: any;
12
- internalPlugins?: any;
13
- externalPlugins?: any;
14
11
 
15
12
  constructor(params?: {
16
13
  name?: string;
@@ -18,9 +15,6 @@ export class HMSRole {
18
15
  permissions?: HMSPermissions;
19
16
  publishSettings?: HMSPublishSettings;
20
17
  subscribeSettings?: HMSSubscribeSettings;
21
- generalPermissions?: any;
22
- internalPlugins?: any;
23
- externalPlugins?: any;
24
18
  }) {
25
19
  if (params) {
26
20
  this.name = params.name;
@@ -28,9 +22,6 @@ export class HMSRole {
28
22
  this.permissions = params.permissions;
29
23
  this.publishSettings = params.publishSettings;
30
24
  this.subscribeSettings = params.subscribeSettings;
31
- this.generalPermissions = params.generalPermissions;
32
- this.internalPlugins = params.internalPlugins;
33
- this.externalPlugins = params.externalPlugins;
34
25
  }
35
26
  }
36
27
  }
@@ -2,11 +2,13 @@ import type { HMSRole } from './HMSRole';
2
2
  import type { HMSPeer } from './HMSPeer';
3
3
 
4
4
  export class HMSRoleChangeRequest {
5
- requestedBy: HMSPeer;
5
+ requestedBy?: HMSPeer;
6
6
  suggestedRole: HMSRole;
7
7
 
8
- constructor(params: { requestedBy: HMSPeer; suggestedRole: HMSRole }) {
9
- this.requestedBy = params.requestedBy;
8
+ constructor(params: { requestedBy?: HMSPeer; suggestedRole: HMSRole }) {
9
+ if (params.requestedBy) {
10
+ this.requestedBy = params.requestedBy;
11
+ }
10
12
  this.suggestedRole = params.suggestedRole;
11
13
  }
12
14
  }
@@ -3,14 +3,14 @@ import type { HMSException } from './HMSException';
3
3
  export class HMSRtmpStreamingState {
4
4
  running: boolean;
5
5
  error?: HMSException;
6
- startedAt: Date;
7
- stoppedAt: Date;
6
+ startedAt?: Date;
7
+ stoppedAt?: Date;
8
8
 
9
9
  constructor(params: {
10
10
  running: boolean;
11
11
  error?: HMSException;
12
- startedAt: Date;
13
- stoppedAt: Date;
12
+ startedAt?: Date;
13
+ stoppedAt?: Date;
14
14
  }) {
15
15
  this.running = params.running;
16
16
  this.error = params.error;