@stream-io/video-client 0.2.3 → 0.3.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 (51) hide show
  1. package/CHANGELOG.md +11 -0
  2. package/dist/index.browser.es.js +320 -419
  3. package/dist/index.browser.es.js.map +1 -1
  4. package/dist/index.cjs.js +320 -419
  5. package/dist/index.cjs.js.map +1 -1
  6. package/dist/index.es.js +320 -419
  7. package/dist/index.es.js.map +1 -1
  8. package/dist/src/Call.d.ts +3 -8
  9. package/dist/src/StreamVideoClient.d.ts +3 -1
  10. package/dist/src/events/call-permissions.d.ts +0 -5
  11. package/dist/src/events/call.d.ts +0 -6
  12. package/dist/src/events/index.d.ts +0 -6
  13. package/dist/src/rtc/Dispatcher.d.ts +2 -2
  14. package/dist/src/rtc/Publisher.d.ts +0 -1
  15. package/dist/src/store/CallState.d.ts +164 -89
  16. package/dist/src/types.d.ts +1 -7
  17. package/dist/version.d.ts +1 -1
  18. package/package.json +1 -1
  19. package/src/Call.ts +30 -41
  20. package/src/StreamVideoClient.ts +14 -17
  21. package/src/events/__tests__/call-permissions.test.ts +1 -61
  22. package/src/events/__tests__/call.test.ts +5 -50
  23. package/src/events/call-permissions.ts +0 -14
  24. package/src/events/call.ts +5 -16
  25. package/src/events/callEventHandlers.ts +2 -57
  26. package/src/events/index.ts +0 -6
  27. package/src/rtc/Dispatcher.ts +2 -2
  28. package/src/rtc/Publisher.ts +4 -6
  29. package/src/store/CallState.ts +475 -119
  30. package/src/store/__tests__/CallState.test.ts +447 -1
  31. package/src/types.ts +0 -8
  32. package/dist/src/events/__tests__/backstage.test.d.ts +0 -1
  33. package/dist/src/events/__tests__/members.test.d.ts +0 -1
  34. package/dist/src/events/__tests__/recording.test.d.ts +0 -1
  35. package/dist/src/events/__tests__/sessions.test.d.ts +0 -1
  36. package/dist/src/events/backstage.d.ts +0 -6
  37. package/dist/src/events/members.d.ts +0 -18
  38. package/dist/src/events/moderation.d.ts +0 -14
  39. package/dist/src/events/reactions.d.ts +0 -8
  40. package/dist/src/events/recording.d.ts +0 -18
  41. package/dist/src/events/sessions.d.ts +0 -26
  42. package/src/events/__tests__/backstage.test.ts +0 -15
  43. package/src/events/__tests__/members.test.ts +0 -135
  44. package/src/events/__tests__/recording.test.ts +0 -65
  45. package/src/events/__tests__/sessions.test.ts +0 -135
  46. package/src/events/backstage.ts +0 -15
  47. package/src/events/members.ts +0 -62
  48. package/src/events/moderation.ts +0 -35
  49. package/src/events/reactions.ts +0 -30
  50. package/src/events/recording.ts +0 -64
  51. package/src/events/sessions.ts +0 -102
@@ -6520,8 +6520,8 @@ class Publisher {
6520
6520
  track.removeEventListener('ended', handleTrackEnded);
6521
6521
  });
6522
6522
  if (!transceiver) {
6523
- const metadata = this.state.metadata;
6524
- const targetResolution = metadata === null || metadata === void 0 ? void 0 : metadata.settings.video.target_resolution;
6523
+ const { settings } = this.state;
6524
+ const targetResolution = settings === null || settings === void 0 ? void 0 : settings.video.target_resolution;
6525
6525
  const videoEncodings = trackType === TrackType.VIDEO
6526
6526
  ? findOptimalVideoLayers(track, targetResolution)
6527
6527
  : undefined;
@@ -6799,8 +6799,8 @@ class Publisher {
6799
6799
  }
6800
6800
  return String(media.mid);
6801
6801
  };
6802
- const metadata = this.state.metadata;
6803
- const targetResolution = metadata === null || metadata === void 0 ? void 0 : metadata.settings.video.target_resolution;
6802
+ const { settings } = this.state;
6803
+ const targetResolution = settings === null || settings === void 0 ? void 0 : settings.video.target_resolution;
6804
6804
  return this.pc
6805
6805
  .getTransceivers()
6806
6806
  .filter((t) => t.direction === 'sendonly' && t.sender.track)
@@ -6893,7 +6893,6 @@ class Publisher {
6893
6893
  this.pc = this.createPeerConnection(connectionConfig);
6894
6894
  this.sfuClient = sfuClient;
6895
6895
  this.state = state;
6896
- this.dispatcher = dispatcher;
6897
6896
  this.isDtxEnabled = isDtxEnabled;
6898
6897
  this.isRedEnabled = isRedEnabled;
6899
6898
  this.preferredVideoCodec = preferredVideoCodec;
@@ -7521,17 +7520,6 @@ const retryable = (rpc, logger) => __awaiter(void 0, void 0, void 0, function* (
7521
7520
  return rpcCallResult;
7522
7521
  });
7523
7522
 
7524
- /**
7525
- * Watches for `call.live_started` events.
7526
- */
7527
- const watchCallLiveStarted = (state) => {
7528
- return function onCallLiveStarted(event) {
7529
- if (event.type !== 'call.live_started')
7530
- return;
7531
- state.setMetadata((metadata) => (Object.assign(Object.assign({}, metadata), { backstage: false })));
7532
- };
7533
- };
7534
-
7535
7523
  /**
7536
7524
  * Gets the current value of an observable, or undefined if the observable has
7537
7525
  * not emitted a value yet.
@@ -7974,71 +7962,29 @@ class CallState {
7974
7962
  *
7975
7963
  */
7976
7964
  constructor() {
7977
- /**
7978
- * The raw call metadata object, as defined on the backend.
7979
- *
7980
- * @internal
7981
- */
7982
- this.metadataSubject = new BehaviorSubject(undefined);
7983
- /**
7984
- * The list of members of the current call.
7985
- *
7986
- * @internal
7987
- */
7965
+ this.backstageSubject = new BehaviorSubject(false);
7966
+ this.blockedUserIdsSubject = new BehaviorSubject([]);
7967
+ this.createdAtSubject = new BehaviorSubject(new Date());
7968
+ this.endedAtSubject = new BehaviorSubject(undefined);
7969
+ this.startsAtSubject = new BehaviorSubject(undefined);
7970
+ this.updatedAtSubject = new BehaviorSubject(new Date());
7971
+ this.createdBySubject = new BehaviorSubject(undefined);
7972
+ this.customSubject = new BehaviorSubject({});
7973
+ this.egressSubject = new BehaviorSubject(undefined);
7974
+ this.ingressSubject = new BehaviorSubject(undefined);
7975
+ this.recordingSubject = new BehaviorSubject(false);
7976
+ this.sessionSubject = new BehaviorSubject(undefined);
7977
+ this.settingsSubject = new BehaviorSubject(undefined);
7978
+ this.transcribingSubject = new BehaviorSubject(false);
7979
+ this.endedBySubject = new BehaviorSubject(undefined);
7988
7980
  this.membersSubject = new BehaviorSubject([]);
7989
- /**
7990
- * The list of capabilities of the current user.
7991
- *
7992
- * @private
7993
- */
7994
7981
  this.ownCapabilitiesSubject = new BehaviorSubject([]);
7995
- /**
7996
- * The calling state.
7997
- *
7998
- * @internal
7999
- */
8000
7982
  this.callingStateSubject = new BehaviorSubject(CallingState.UNKNOWN);
8001
- /**
8002
- * The time the call session actually started.
8003
- *
8004
- * @internal
8005
- */
8006
7983
  this.startedAtSubject = new BehaviorSubject(undefined);
8007
- /**
8008
- * The server-side counted number of participants connected to the current call.
8009
- * This number includes the anonymous participants as well.
8010
- *
8011
- * @internal
8012
- */
8013
7984
  this.participantCountSubject = new BehaviorSubject(0);
8014
- /**
8015
- * The server-side counted number of anonymous participants connected to the current call.
8016
- * This number excludes the regular participants.
8017
- *
8018
- * @internal
8019
- */
8020
7985
  this.anonymousParticipantCountSubject = new BehaviorSubject(0);
8021
- /**
8022
- * All participants of the current call (including the logged-in user).
8023
- *
8024
- * @internal
8025
- */
8026
7986
  this.participantsSubject = new BehaviorSubject([]);
8027
- /**
8028
- * The latest stats report of the current call.
8029
- * When stats gathering is enabled, this observable will emit a new value
8030
- * at a regular (configurable) interval.
8031
- *
8032
- * Consumers of this observable can implement their own batching logic
8033
- * in case they want to show historical stat data.
8034
- *
8035
- * @internal
8036
- */
8037
7987
  this.callStatsReportSubject = new BehaviorSubject(undefined);
8038
- /**
8039
- * Emits a list of details about recordings performed for the current call.
8040
- */
8041
- this.callRecordingListSubject = new BehaviorSubject([]);
8042
7988
  /**
8043
7989
  * A list of comparators that are used to sort the participants.
8044
7990
  *
@@ -8121,15 +8067,6 @@ class CallState {
8121
8067
  this.setCallingState = (state) => {
8122
8068
  return this.setCurrentValue(this.callingStateSubject, state);
8123
8069
  };
8124
- /**
8125
- * Sets the list of call recordings.
8126
- *
8127
- * @internal
8128
- * @param recordings the list of call recordings.
8129
- */
8130
- this.setCallRecordingsList = (recordings) => {
8131
- return this.setCurrentValue(this.callRecordingListSubject, recordings);
8132
- };
8133
8070
  /**
8134
8071
  * Sets the call stats report.
8135
8072
  *
@@ -8139,16 +8076,6 @@ class CallState {
8139
8076
  this.setCallStatsReport = (report) => {
8140
8077
  return this.setCurrentValue(this.callStatsReportSubject, report);
8141
8078
  };
8142
- /**
8143
- * Sets the metadata of the current call.
8144
- *
8145
- * @internal
8146
- *
8147
- * @param metadata the metadata to set.
8148
- */
8149
- this.setMetadata = (metadata) => {
8150
- return this.setCurrentValue(this.metadataSubject, metadata);
8151
- };
8152
8079
  /**
8153
8080
  * Sets the members of the current call.
8154
8081
  *
@@ -8247,6 +8174,19 @@ class CallState {
8247
8174
  return p;
8248
8175
  }));
8249
8176
  };
8177
+ /**
8178
+ * Updates the call state with the data received from the server.
8179
+ *
8180
+ * @internal
8181
+ *
8182
+ * @param event the video event that our backend sent us.
8183
+ */
8184
+ this.updateFromEvent = (event) => {
8185
+ const update = this.eventHandlers[event.type];
8186
+ if (update) {
8187
+ update(event);
8188
+ }
8189
+ };
8250
8190
  /**
8251
8191
  * Updates the participant pinned state with server side pinning data.
8252
8192
  *
@@ -8275,25 +8215,174 @@ class CallState {
8275
8215
  return participant;
8276
8216
  }));
8277
8217
  };
8278
- this.logger = getLogger(['call-state']);
8218
+ /**
8219
+ * Updates the call state with the data received from the server.
8220
+ *
8221
+ * @internal
8222
+ *
8223
+ * @param call the call response from the server.
8224
+ */
8225
+ this.updateFromCallResponse = (call) => {
8226
+ this.setCurrentValue(this.backstageSubject, call.backstage);
8227
+ this.setCurrentValue(this.blockedUserIdsSubject, call.blocked_user_ids);
8228
+ this.setCurrentValue(this.createdAtSubject, new Date(call.created_at));
8229
+ this.setCurrentValue(this.updatedAtSubject, new Date(call.updated_at));
8230
+ this.setCurrentValue(this.startsAtSubject, call.starts_at ? new Date(call.starts_at) : undefined);
8231
+ this.setCurrentValue(this.endedAtSubject, call.ended_at ? new Date(call.ended_at) : undefined);
8232
+ this.setCurrentValue(this.createdBySubject, call.created_by);
8233
+ this.setCurrentValue(this.customSubject, call.custom);
8234
+ this.setCurrentValue(this.egressSubject, call.egress);
8235
+ this.setCurrentValue(this.ingressSubject, call.ingress);
8236
+ this.setCurrentValue(this.recordingSubject, call.recording);
8237
+ this.setCurrentValue(this.sessionSubject, call.session);
8238
+ this.setCurrentValue(this.settingsSubject, call.settings);
8239
+ this.setCurrentValue(this.transcribingSubject, call.transcribing);
8240
+ };
8241
+ this.updateFromMemberRemoved = (event) => {
8242
+ this.setCurrentValue(this.membersSubject, (members) => members.filter((m) => event.members.indexOf(m.user_id) === -1));
8243
+ };
8244
+ this.updateFromMemberAdded = (event) => {
8245
+ this.setCurrentValue(this.membersSubject, (members) => [
8246
+ ...members,
8247
+ ...event.members,
8248
+ ]);
8249
+ };
8250
+ this.updateFromBroadcastStopped = () => {
8251
+ this.setCurrentValue(this.egressSubject, (egress) => (Object.assign(Object.assign({}, egress), { broadcasting: false })));
8252
+ };
8253
+ this.updateFromBroadcastStarted = (event) => {
8254
+ this.setCurrentValue(this.egressSubject, (egress) => (Object.assign(Object.assign({}, egress), { broadcasting: true, hls: Object.assign(Object.assign({}, egress.hls), { playlist_url: event.hls_playlist_url }) })));
8255
+ };
8256
+ this.updateFromSessionParticipantLeft = (event) => {
8257
+ this.setCurrentValue(this.sessionSubject, (session) => {
8258
+ if (!session) {
8259
+ this.logger('warn', `Received call.session_participant_left event but no session is available.`, event);
8260
+ return session;
8261
+ }
8262
+ const { participants, participants_count_by_role } = session;
8263
+ const { user, user_session_id } = event.participant;
8264
+ return Object.assign(Object.assign({}, session), { participants: participants.filter((p) => p.user_session_id !== user_session_id), participants_count_by_role: Object.assign(Object.assign({}, participants_count_by_role), { [user.role]: Math.max(0, (participants_count_by_role[user.role] || 0) - 1) }) });
8265
+ });
8266
+ };
8267
+ this.updateFromSessionParticipantJoined = (event) => {
8268
+ this.setCurrentValue(this.sessionSubject, (session) => {
8269
+ if (!session) {
8270
+ this.logger('warn', `Received call.session_participant_joined event but no session is available.`, event);
8271
+ return session;
8272
+ }
8273
+ const { participants, participants_count_by_role } = session;
8274
+ const { user } = event.participant;
8275
+ return Object.assign(Object.assign({}, session), { participants: [...participants, event.participant], participants_count_by_role: Object.assign(Object.assign({}, participants_count_by_role), { [user.role]: (participants_count_by_role[user.role] || 0) + 1 }) });
8276
+ });
8277
+ };
8278
+ this.updateMembers = (event) => {
8279
+ this.setCurrentValue(this.membersSubject, (members) => members.map((member) => {
8280
+ const memberUpdate = event.members.find((m) => m.user_id === member.user_id);
8281
+ return memberUpdate ? memberUpdate : member;
8282
+ }));
8283
+ };
8284
+ this.updateParticipantReaction = (event) => {
8285
+ const { user, custom, type, emoji_code } = event.reaction;
8286
+ this.setParticipants((participants) => {
8287
+ return participants.map((p) => {
8288
+ // skip if the reaction is not for this participant
8289
+ if (p.userId !== user.id)
8290
+ return p;
8291
+ // update the participant with the new reaction
8292
+ return Object.assign(Object.assign({}, p), { reaction: {
8293
+ type,
8294
+ emoji_code,
8295
+ custom,
8296
+ } });
8297
+ });
8298
+ });
8299
+ };
8300
+ this.unblockUser = (event) => {
8301
+ this.setCurrentValue(this.blockedUserIdsSubject, (current) => {
8302
+ if (!current)
8303
+ return current;
8304
+ return current.filter((id) => id !== event.user.id);
8305
+ });
8306
+ };
8307
+ this.blockUser = (event) => {
8308
+ this.setCurrentValue(this.blockedUserIdsSubject, (current) => [
8309
+ ...(current || []),
8310
+ event.user.id,
8311
+ ]);
8312
+ };
8313
+ this.updateOwnCapabilities = (event) => {
8314
+ var _a;
8315
+ if (event.user.id === ((_a = this.localParticipant) === null || _a === void 0 ? void 0 : _a.userId)) {
8316
+ this.setCurrentValue(this.ownCapabilitiesSubject, event.own_capabilities);
8317
+ }
8318
+ };
8319
+ this.logger = getLogger(['CallState']);
8279
8320
  this.participants$ = this.participantsSubject.pipe(map$1((ps) => ps.sort(this.sortParticipantsBy)));
8280
8321
  this.localParticipant$ = this.participants$.pipe(map$1((participants) => participants.find(isStreamVideoLocalParticipant)));
8281
8322
  this.remoteParticipants$ = this.participants$.pipe(map$1((participants) => participants.filter((p) => !p.isLocalParticipant)));
8282
8323
  this.pinnedParticipants$ = this.participants$.pipe(map$1((participants) => participants.filter((p) => !!p.pin)));
8283
8324
  this.dominantSpeaker$ = this.participants$.pipe(map$1((participants) => participants.find((p) => p.isDominantSpeaker)));
8284
- this.hasOngoingScreenShare$ = this.participants$.pipe(map$1((participants) => {
8285
- return participants.some((p) => p.publishedTracks.includes(TrackType.SCREEN_SHARE));
8286
- }), distinctUntilChanged());
8325
+ this.hasOngoingScreenShare$ = this.participants$.pipe(map$1((participants) => participants.some((p) => p.publishedTracks.includes(TrackType.SCREEN_SHARE))), distinctUntilChanged());
8287
8326
  this.startedAt$ = this.startedAtSubject.asObservable();
8288
8327
  this.participantCount$ = this.participantCountSubject.asObservable();
8289
8328
  this.anonymousParticipantCount$ =
8290
8329
  this.anonymousParticipantCountSubject.asObservable();
8291
8330
  this.callStatsReport$ = this.callStatsReportSubject.asObservable();
8292
- this.callRecordingList$ = this.callRecordingListSubject.asObservable();
8293
- this.metadata$ = this.metadataSubject.asObservable();
8294
8331
  this.members$ = this.membersSubject.asObservable();
8295
8332
  this.ownCapabilities$ = this.ownCapabilitiesSubject.asObservable();
8296
8333
  this.callingState$ = this.callingStateSubject.asObservable();
8334
+ this.backstage$ = this.backstageSubject.asObservable();
8335
+ this.blockedUserIds$ = this.blockedUserIdsSubject.asObservable();
8336
+ this.createdAt$ = this.createdAtSubject.asObservable();
8337
+ this.endedAt$ = this.endedAtSubject.asObservable();
8338
+ this.startsAt$ = this.startsAtSubject.asObservable();
8339
+ this.updatedAt$ = this.updatedAtSubject.asObservable();
8340
+ this.createdBy$ = this.createdBySubject.asObservable();
8341
+ this.custom$ = this.customSubject.asObservable();
8342
+ this.egress$ = this.egressSubject.asObservable();
8343
+ this.ingress$ = this.ingressSubject.asObservable();
8344
+ this.recording$ = this.recordingSubject.asObservable();
8345
+ this.session$ = this.sessionSubject.asObservable();
8346
+ this.settings$ = this.settingsSubject.asObservable();
8347
+ this.transcribing$ = this.transcribingSubject.asObservable();
8348
+ this.endedBy$ = this.endedBySubject.asObservable();
8349
+ this.eventHandlers = {
8350
+ // these events are not updating the call state:
8351
+ 'call.permission_request': undefined,
8352
+ 'call.user_muted': undefined,
8353
+ 'connection.error': undefined,
8354
+ 'connection.ok': undefined,
8355
+ 'health.check': undefined,
8356
+ custom: undefined,
8357
+ // events that update call state:
8358
+ 'call.accepted': (e) => this.updateFromCallResponse(e.call),
8359
+ 'call.created': (e) => this.updateFromCallResponse(e.call),
8360
+ 'call.notification': (e) => this.updateFromCallResponse(e.call),
8361
+ 'call.rejected': (e) => this.updateFromCallResponse(e.call),
8362
+ 'call.ring': (e) => this.updateFromCallResponse(e.call),
8363
+ 'call.live_started': (e) => this.updateFromCallResponse(e.call),
8364
+ 'call.updated': (e) => this.updateFromCallResponse(e.call),
8365
+ 'call.session_started': (e) => this.updateFromCallResponse(e.call),
8366
+ 'call.session_ended': (e) => this.updateFromCallResponse(e.call),
8367
+ 'call.ended': (e) => {
8368
+ this.updateFromCallResponse(e.call);
8369
+ this.setCurrentValue(this.endedBySubject, e.user);
8370
+ },
8371
+ 'call.recording_started': () => this.setCurrentValue(this.recordingSubject, true),
8372
+ 'call.recording_stopped': () => this.setCurrentValue(this.recordingSubject, false),
8373
+ 'call.broadcasting_started': this.updateFromBroadcastStarted,
8374
+ 'call.broadcasting_stopped': this.updateFromBroadcastStopped,
8375
+ 'call.session_participant_joined': this.updateFromSessionParticipantJoined,
8376
+ 'call.session_participant_left': this.updateFromSessionParticipantLeft,
8377
+ 'call.blocked_user': this.blockUser,
8378
+ 'call.unblocked_user': this.unblockUser,
8379
+ 'call.permissions_updated': this.updateOwnCapabilities,
8380
+ 'call.member_added': this.updateFromMemberAdded,
8381
+ 'call.member_removed': this.updateFromMemberRemoved,
8382
+ 'call.member_updated': this.updateMembers,
8383
+ 'call.member_updated_permission': this.updateMembers,
8384
+ 'call.reaction_new': this.updateParticipantReaction,
8385
+ };
8297
8386
  }
8298
8387
  /**
8299
8388
  * The server-side counted number of participants connected to the current call.
@@ -8358,24 +8447,12 @@ class CallState {
8358
8447
  get callingState() {
8359
8448
  return this.getCurrentValue(this.callingState$);
8360
8449
  }
8361
- /**
8362
- * The list of call recordings.
8363
- */
8364
- get callRecordingsList() {
8365
- return this.getCurrentValue(this.callRecordingList$);
8366
- }
8367
8450
  /**
8368
8451
  * The call stats report.
8369
8452
  */
8370
8453
  get callStatsReport() {
8371
8454
  return this.getCurrentValue(this.callStatsReport$);
8372
8455
  }
8373
- /**
8374
- * The metadata of the current call.
8375
- */
8376
- get metadata() {
8377
- return this.getCurrentValue(this.metadata$);
8378
- }
8379
8456
  /**
8380
8457
  * The members of the current call.
8381
8458
  */
@@ -8388,6 +8465,96 @@ class CallState {
8388
8465
  get ownCapabilities() {
8389
8466
  return this.getCurrentValue(this.ownCapabilities$);
8390
8467
  }
8468
+ /**
8469
+ * The backstage state.
8470
+ */
8471
+ get backstage() {
8472
+ return this.getCurrentValue(this.backstage$);
8473
+ }
8474
+ /**
8475
+ * Will provide the list of blocked user IDs.
8476
+ */
8477
+ get blockedUserIds() {
8478
+ return this.getCurrentValue(this.blockedUserIds$);
8479
+ }
8480
+ /**
8481
+ * Will provide the time when this call has been created.
8482
+ */
8483
+ get createdAt() {
8484
+ return this.getCurrentValue(this.createdAt$);
8485
+ }
8486
+ /**
8487
+ * Will provide the time when this call has been ended.
8488
+ */
8489
+ get endedAt() {
8490
+ return this.getCurrentValue(this.endedAt$);
8491
+ }
8492
+ /**
8493
+ * Will provide the time when this call has been scheduled to start.
8494
+ */
8495
+ get startsAt() {
8496
+ return this.getCurrentValue(this.startsAt$);
8497
+ }
8498
+ /**
8499
+ * Will provide the time when this call has been updated.
8500
+ */
8501
+ get updatedAt() {
8502
+ return this.getCurrentValue(this.updatedAt$);
8503
+ }
8504
+ /**
8505
+ * Will provide the user who created this call.
8506
+ */
8507
+ get createdBy() {
8508
+ return this.getCurrentValue(this.createdBy$);
8509
+ }
8510
+ /**
8511
+ * Will provide the custom data of this call.
8512
+ */
8513
+ get custom() {
8514
+ return this.getCurrentValue(this.custom$);
8515
+ }
8516
+ /**
8517
+ * Will provide the egress data of this call.
8518
+ */
8519
+ get egress() {
8520
+ return this.getCurrentValue(this.egress$);
8521
+ }
8522
+ /**
8523
+ * Will provide the ingress data of this call.
8524
+ */
8525
+ get ingress() {
8526
+ return this.getCurrentValue(this.ingress$);
8527
+ }
8528
+ /**
8529
+ * Will provide the recording state of this call.
8530
+ */
8531
+ get recording() {
8532
+ return this.getCurrentValue(this.recording$);
8533
+ }
8534
+ /**
8535
+ * Will provide the session data of this call.
8536
+ */
8537
+ get session() {
8538
+ return this.getCurrentValue(this.session$);
8539
+ }
8540
+ /**
8541
+ * Will provide the settings of this call.
8542
+ */
8543
+ get settings() {
8544
+ return this.getCurrentValue(this.settings$);
8545
+ }
8546
+ /**
8547
+ * Will provide the transcribing state of this call.
8548
+ */
8549
+ get transcribing() {
8550
+ return this.getCurrentValue(this.transcribing$);
8551
+ }
8552
+ /**
8553
+ * Will provide the user who ended this call.
8554
+ */
8555
+ get endedBy() {
8556
+ return this.getCurrentValue(this.endedBy$);
8557
+ }
8391
8558
  }
8392
8559
 
8393
8560
  /**
@@ -8459,40 +8626,16 @@ const watchCallEnded = (call) => {
8459
8626
  return __awaiter(this, void 0, void 0, function* () {
8460
8627
  if (event.type !== 'call.ended')
8461
8628
  return;
8462
- if (call.state.callingState === CallingState.RINGING ||
8463
- call.state.callingState === CallingState.JOINED ||
8464
- call.state.callingState === CallingState.JOINING) {
8465
- call.state.setMetadata(event.call);
8629
+ const { callingState } = call.state;
8630
+ if (callingState === CallingState.RINGING ||
8631
+ callingState === CallingState.JOINED ||
8632
+ callingState === CallingState.JOINING) {
8466
8633
  yield call.leave();
8467
8634
  }
8468
8635
  });
8469
8636
  };
8470
8637
  };
8471
- /**
8472
- * An event handler which listens to `call.updated` events
8473
- * and updates the given call state accordingly.
8474
- */
8475
- const watchCallUpdated = (state) => {
8476
- return function onCallUpdated(event) {
8477
- if (event.type !== 'call.updated')
8478
- return;
8479
- state.setMetadata(event.call);
8480
- };
8481
- };
8482
8638
 
8483
- /**
8484
- * Event handler that watches for `call.permissions_updated` events
8485
- */
8486
- const watchCallPermissionsUpdated = (state) => {
8487
- return function onCallPermissionsUpdated(event) {
8488
- if (event.type !== 'call.permissions_updated')
8489
- return;
8490
- const { localParticipant } = state;
8491
- if (event.user.id === (localParticipant === null || localParticipant === void 0 ? void 0 : localParticipant.userId)) {
8492
- state.setOwnCapabilities(event.own_capabilities);
8493
- }
8494
- };
8495
- };
8496
8639
  /**
8497
8640
  * Event handler that watches for `callGrantsUpdated` events.
8498
8641
  *
@@ -8606,57 +8749,6 @@ const watchPinsUpdated = (state) => {
8606
8749
  };
8607
8750
  };
8608
8751
 
8609
- /**
8610
- * Watches for `call.member_added` events.
8611
- */
8612
- const watchCallMemberAdded = (state) => {
8613
- return function onCallMemberAdded(event) {
8614
- if (event.type !== 'call.member_added')
8615
- return;
8616
- state.setMembers((members) => [...members, ...event.members]);
8617
- };
8618
- };
8619
- /**
8620
- * Watches for `call.member_removed` events.
8621
- */
8622
- const watchCallMemberRemoved = (state) => {
8623
- return function onCallMemberRemoved(event) {
8624
- if (event.type !== 'call.member_removed')
8625
- return;
8626
- state.setMembers((members) => members.filter((m) => event.members.indexOf(m.user_id) === -1));
8627
- };
8628
- };
8629
- /**
8630
- * Watches for `call.member_updated_permission` events.
8631
- */
8632
- const watchCallMemberUpdatedPermission = (state) => {
8633
- return function onCallMemberUpdated(event) {
8634
- if (event.type !== 'call.member_updated_permission')
8635
- return;
8636
- state.setMembers((members) => members.map((member) => {
8637
- const memberUpdate = event.members.find((m) => m.user_id === member.user_id);
8638
- if (memberUpdate) {
8639
- member.user.role = memberUpdate.role;
8640
- member = Object.assign({}, member);
8641
- }
8642
- return member;
8643
- }));
8644
- };
8645
- };
8646
- /**
8647
- * Watches for `call.member_updated` events.
8648
- */
8649
- const watchCallMemberUpdated = (state) => {
8650
- return function onCallMemberUpdated(event) {
8651
- if (event.type !== 'call.member_updated')
8652
- return;
8653
- state.setMembers((members) => members.map((member) => {
8654
- const memberUpdate = event.members.find((m) => m.user_id === member.user_id);
8655
- return memberUpdate ? memberUpdate : member;
8656
- }));
8657
- };
8658
- };
8659
-
8660
8752
  /**
8661
8753
  * An event responder which handles the `participantJoined` event.
8662
8754
  */
@@ -8738,74 +8830,6 @@ const watchTrackUnpublished = (state) => {
8738
8830
  };
8739
8831
  const unique = (v, i, arr) => arr.indexOf(v) === i;
8740
8832
 
8741
- /**
8742
- * Watches the delivery of CallReactionEvent.
8743
- *
8744
- * @param state the state store to update.
8745
- */
8746
- const watchNewReactions = (state) => {
8747
- return function onNewReactions(event) {
8748
- if (event.type !== 'call.reaction_new')
8749
- return;
8750
- const { reaction } = event;
8751
- const { user, custom, type, emoji_code } = reaction;
8752
- state.setParticipants((participants) => {
8753
- return participants.map((p) => {
8754
- // skip if the reaction is not for this participant
8755
- if (p.userId !== user.id)
8756
- return p;
8757
- // update the participant with the new reaction
8758
- return Object.assign(Object.assign({}, p), { reaction: {
8759
- type,
8760
- emoji_code,
8761
- custom,
8762
- } });
8763
- });
8764
- });
8765
- };
8766
- };
8767
-
8768
- /**
8769
- * Watches for `call.recording_started` events.
8770
- */
8771
- const watchCallRecordingStarted = (state) => {
8772
- return function onCallRecordingStarted(event) {
8773
- if (event.type !== 'call.recording_started')
8774
- return;
8775
- state.setMetadata((metadata) => (Object.assign(Object.assign({}, metadata), { recording: true })));
8776
- };
8777
- };
8778
- /**
8779
- * Watches for `call.recording_stopped` events.
8780
- */
8781
- const watchCallRecordingStopped = (state) => {
8782
- return function onCallRecordingStopped(event) {
8783
- if (event.type !== 'call.recording_stopped')
8784
- return;
8785
- state.setMetadata((metadata) => (Object.assign(Object.assign({}, metadata), { recording: false })));
8786
- };
8787
- };
8788
- /**
8789
- * Watches for `call.broadcasting_started` events.
8790
- */
8791
- const watchCallBroadcastingStarted = (state) => {
8792
- return function onCallBroadcastingStarted(event) {
8793
- if (event.type !== 'call.broadcasting_started')
8794
- return;
8795
- state.setMetadata((metadata) => (Object.assign(Object.assign({}, metadata), { egress: Object.assign(Object.assign({}, metadata.egress), { broadcasting: true, hls: Object.assign(Object.assign({}, metadata.egress.hls), { playlist_url: event.hls_playlist_url }) }) })));
8796
- };
8797
- };
8798
- /**
8799
- * Watches for `call.broadcasting_stopped` events.
8800
- */
8801
- const watchCallBroadcastingStopped = (state) => {
8802
- return function onCallBroadcastingStopped(event) {
8803
- if (event.type !== 'call.broadcasting_stopped')
8804
- return;
8805
- state.setMetadata((metadata) => (Object.assign(Object.assign({}, metadata), { egress: Object.assign(Object.assign({}, metadata.egress), { broadcasting: false }) })));
8806
- };
8807
- };
8808
-
8809
8833
  /**
8810
8834
  * Watches for `dominantSpeakerChanged` events.
8811
8835
  */
@@ -8848,98 +8872,6 @@ const watchAudioLevelChanged = (dispatcher, state) => {
8848
8872
  });
8849
8873
  };
8850
8874
 
8851
- /**
8852
- * Watch for call.session_started events and update the call metadata.
8853
- *
8854
- * @param state the call state.
8855
- */
8856
- const watchCallSessionStarted = (state) => {
8857
- return function onCallSessionStarted(event) {
8858
- if (event.type !== 'call.session_started')
8859
- return;
8860
- state.setMetadata(event.call);
8861
- };
8862
- };
8863
- /**
8864
- * Watch for call.session_ended events and update the call metadata.
8865
- *
8866
- * @param state the call state.
8867
- */
8868
- const watchCallSessionEnded = (state) => {
8869
- return function onCallSessionEnded(event) {
8870
- if (event.type !== 'call.session_ended')
8871
- return;
8872
- state.setMetadata(event.call);
8873
- };
8874
- };
8875
- /**
8876
- * Watch for call.session_participant_joined events and update the call metadata.
8877
- *
8878
- * @param state the call state.
8879
- */
8880
- const watchCallSessionParticipantJoined = (state) => {
8881
- return function onCallParticipantJoined(event) {
8882
- if (event.type !== 'call.session_participant_joined')
8883
- return;
8884
- const { participant } = event;
8885
- state.setMetadata((metadata) => {
8886
- if (!metadata || !metadata.session) {
8887
- state.logger('warn', `Received call.session_participant_joined event but the metadata structure is invalid.`, event);
8888
- return metadata;
8889
- }
8890
- const { session } = metadata;
8891
- const { participants, participants_count_by_role } = session;
8892
- const { user } = participant;
8893
- return Object.assign(Object.assign({}, metadata), { session: Object.assign(Object.assign({}, session), { participants: [...participants, participant], participants_count_by_role: Object.assign(Object.assign({}, participants_count_by_role), { [user.role]: (participants_count_by_role[user.role] || 0) + 1 }) }) });
8894
- });
8895
- };
8896
- };
8897
- /**
8898
- * Watch for call.session_participant_left events and update the call metadata.
8899
- *
8900
- * @param state the call state.
8901
- */
8902
- const watchCallSessionParticipantLeft = (state) => {
8903
- return function onCallParticipantLeft(event) {
8904
- if (event.type !== 'call.session_participant_left')
8905
- return;
8906
- const { user, user_session_id } = event.participant;
8907
- state.setMetadata((metadata) => {
8908
- if (!metadata || !metadata.session) {
8909
- state.logger('warn', `Received call.session_participant_left event but the metadata structure is invalid.`, event);
8910
- return metadata;
8911
- }
8912
- const { session } = metadata;
8913
- const { participants, participants_count_by_role } = session;
8914
- return Object.assign(Object.assign({}, metadata), { session: Object.assign(Object.assign({}, session), { participants: participants.filter((p) => p.user_session_id !== user_session_id), participants_count_by_role: Object.assign(Object.assign({}, participants_count_by_role), { [user.role]: Math.max(0, (participants_count_by_role[user.role] || 0) - 1) }) }) });
8915
- });
8916
- };
8917
- };
8918
-
8919
- /**
8920
- * Event handler that watches for `call.blocked_user` events,
8921
- * updates the call store `blocked_user_ids` property by adding
8922
- * `event.user_id` to the list
8923
- */
8924
- const watchBlockedUser = (state) => (event) => {
8925
- if (event.type !== 'call.blocked_user')
8926
- return;
8927
- state.setMetadata((metadata) => (Object.assign(Object.assign({}, metadata), { blocked_user_ids: [...((metadata === null || metadata === void 0 ? void 0 : metadata.blocked_user_ids) || []), event.user.id] })));
8928
- };
8929
- /**
8930
- * Event handler that watches for `call.unblocked_user` events,
8931
- * updates the call store `blocked_user_ids` property by
8932
- * removing `event.user_id` from the list
8933
- */
8934
- const watchUnblockedUser = (state) => (event) => {
8935
- if (event.type !== 'call.unblocked_user')
8936
- return;
8937
- state.setMetadata((metadata) => {
8938
- const blocked_user_ids = ((metadata === null || metadata === void 0 ? void 0 : metadata.blocked_user_ids) || []).filter((userId) => event.user.id !== userId);
8939
- return Object.assign(Object.assign({}, metadata), { blocked_user_ids });
8940
- });
8941
- };
8942
-
8943
8875
  /**
8944
8876
  * Registers the default event handlers for a call during its lifecycle.
8945
8877
  *
@@ -8948,29 +8880,8 @@ const watchUnblockedUser = (state) => (event) => {
8948
8880
  * @param dispatcher the dispatcher.
8949
8881
  */
8950
8882
  const registerEventHandlers = (call, state, dispatcher) => {
8951
- const coordinatorEvents = {
8952
- 'call.blocked_user': watchBlockedUser(state),
8953
- 'call.broadcasting_started': watchCallBroadcastingStarted(state),
8954
- 'call.broadcasting_stopped': watchCallBroadcastingStopped(state),
8955
- 'call.ended': watchCallEnded(call),
8956
- 'call.live_started': watchCallLiveStarted(state),
8957
- 'call.member_added': watchCallMemberAdded(state),
8958
- 'call.member_removed': watchCallMemberRemoved(state),
8959
- 'call.member_updated': watchCallMemberUpdated(state),
8960
- 'call.member_updated_permission': watchCallMemberUpdatedPermission(state),
8961
- 'call.permissions_updated': watchCallPermissionsUpdated(state),
8962
- 'call.reaction_new': watchNewReactions(state),
8963
- 'call.recording_started': watchCallRecordingStarted(state),
8964
- 'call.recording_stopped': watchCallRecordingStopped(state),
8965
- 'call.session_started': watchCallSessionStarted(state),
8966
- 'call.session_ended': watchCallSessionEnded(state),
8967
- 'call.session_participant_joined': watchCallSessionParticipantJoined(state),
8968
- 'call.session_participant_left': watchCallSessionParticipantLeft(state),
8969
- 'call.unblocked_user': watchUnblockedUser(state),
8970
- 'call.updated': watchCallUpdated(state),
8971
- 'call.user_muted': () => console.log('call.user_muted received'),
8972
- };
8973
8883
  const eventHandlers = [
8884
+ call.on('call.ended', watchCallEnded(call)),
8974
8885
  watchLiveEnded(dispatcher, call),
8975
8886
  watchSfuErrorReports(dispatcher),
8976
8887
  watchChangePublishQuality(dispatcher, call),
@@ -8985,10 +8896,6 @@ const registerEventHandlers = (call, state, dispatcher) => {
8985
8896
  call.on('callGrantsUpdated', watchCallGrantsUpdated(state)),
8986
8897
  call.on('pinsUpdated', watchPinsUpdated(state)),
8987
8898
  ];
8988
- Object.keys(coordinatorEvents).forEach((event) => {
8989
- const eventName = event;
8990
- eventHandlers.push(call.on(eventName, coordinatorEvents[eventName]));
8991
- });
8992
8899
  if (call.ringing) {
8993
8900
  // these events are only relevant when the call is ringing
8994
8901
  eventHandlers.push(registerRingingCallEventHandlers(call));
@@ -9618,7 +9525,7 @@ class Call {
9618
9525
  * Use the [`StreamVideoClient.call`](./StreamVideoClient.md/#call)
9619
9526
  * method to construct a `Call` instance.
9620
9527
  */
9621
- constructor({ type, id, streamClient, metadata, members, ownCapabilities, sortParticipantsBy, clientStore, ringing = false, watching = false, }) {
9528
+ constructor({ type, id, streamClient, members, ownCapabilities, sortParticipantsBy, clientStore, ringing = false, watching = false, }) {
9622
9529
  /**
9623
9530
  * ViewportTracker instance
9624
9531
  */
@@ -9697,7 +9604,7 @@ class Call {
9697
9604
  if ((params === null || params === void 0 ? void 0 : params.ring) && !this.ringing) {
9698
9605
  this.ringingSubject.next(true);
9699
9606
  }
9700
- this.state.setMetadata(response.call);
9607
+ this.state.updateFromCallResponse(response.call);
9701
9608
  this.state.setMembers(response.members);
9702
9609
  this.state.setOwnCapabilities(response.own_capabilities);
9703
9610
  if (this.streamClient._hasConnectionID()) {
@@ -9716,7 +9623,7 @@ class Call {
9716
9623
  if ((data === null || data === void 0 ? void 0 : data.ring) && !this.ringing) {
9717
9624
  this.ringingSubject.next(true);
9718
9625
  }
9719
- this.state.setMetadata(response.call);
9626
+ this.state.updateFromCallResponse(response.call);
9720
9627
  this.state.setMembers(response.members);
9721
9628
  this.state.setOwnCapabilities(response.own_capabilities);
9722
9629
  if (this.streamClient._hasConnectionID()) {
@@ -9797,7 +9704,7 @@ class Call {
9797
9704
  let connectionConfig;
9798
9705
  try {
9799
9706
  const call = yield join(this.streamClient, this.type, this.id, data);
9800
- this.state.setMetadata(call.metadata);
9707
+ this.state.updateFromCallResponse(call.metadata);
9801
9708
  this.state.setMembers(call.members);
9802
9709
  this.state.setOwnCapabilities(call.ownCapabilities);
9803
9710
  connectionConfig = call.connectionConfig;
@@ -9962,7 +9869,7 @@ class Call {
9962
9869
  connectionConfig,
9963
9870
  });
9964
9871
  }
9965
- const audioSettings = (_f = this.data) === null || _f === void 0 ? void 0 : _f.settings.audio;
9872
+ const audioSettings = (_f = this.state.settings) === null || _f === void 0 ? void 0 : _f.audio;
9966
9873
  const isDtxEnabled = !!(audioSettings === null || audioSettings === void 0 ? void 0 : audioSettings.opus_dtx_enabled);
9967
9874
  const isRedEnabled = !!(audioSettings === null || audioSettings === void 0 ? void 0 : audioSettings.redundant_coding_enabled);
9968
9875
  if (!this.publisher) {
@@ -10509,7 +10416,7 @@ class Call {
10509
10416
  this.update = (updates) => __awaiter(this, void 0, void 0, function* () {
10510
10417
  const response = yield this.streamClient.patch(`${this.streamClientBasePath}`, updates);
10511
10418
  const { call, members, own_capabilities } = response;
10512
- this.state.setMetadata(call);
10419
+ this.state.updateFromCallResponse(call);
10513
10420
  this.state.setMembers(members);
10514
10421
  this.state.setOwnCapabilities(own_capabilities);
10515
10422
  return response;
@@ -10582,19 +10489,20 @@ class Call {
10582
10489
  this.scheduleAutoDrop = () => {
10583
10490
  if (this.dropTimeout)
10584
10491
  clearTimeout(this.dropTimeout);
10585
- const subscription = this.state.metadata$
10586
- .pipe(pairwise(), tap(([prevMeta, currentMeta]) => {
10587
- if (!(currentMeta && this.clientStore.connectedUser))
10492
+ const subscription = this.state.settings$
10493
+ .pipe(pairwise(), tap(([prevSettings, currentSettings]) => {
10494
+ var _a;
10495
+ if (!currentSettings || !this.clientStore.connectedUser)
10588
10496
  return;
10589
- const isOutgoingCall = this.currentUserId === currentMeta.created_by.id;
10497
+ const isOutgoingCall = this.currentUserId === ((_a = this.state.createdBy) === null || _a === void 0 ? void 0 : _a.id);
10590
10498
  const [prevTimeoutMs, timeoutMs] = isOutgoingCall
10591
10499
  ? [
10592
- prevMeta === null || prevMeta === void 0 ? void 0 : prevMeta.settings.ring.auto_cancel_timeout_ms,
10593
- currentMeta.settings.ring.auto_cancel_timeout_ms,
10500
+ prevSettings === null || prevSettings === void 0 ? void 0 : prevSettings.ring.auto_cancel_timeout_ms,
10501
+ currentSettings.ring.auto_cancel_timeout_ms,
10594
10502
  ]
10595
10503
  : [
10596
- prevMeta === null || prevMeta === void 0 ? void 0 : prevMeta.settings.ring.incoming_call_timeout_ms,
10597
- currentMeta.settings.ring.incoming_call_timeout_ms,
10504
+ prevSettings === null || prevSettings === void 0 ? void 0 : prevSettings.ring.incoming_call_timeout_ms,
10505
+ currentSettings.ring.incoming_call_timeout_ms,
10598
10506
  ];
10599
10507
  if (typeof timeoutMs === 'undefined' ||
10600
10508
  timeoutMs === prevTimeoutMs ||
@@ -10611,7 +10519,6 @@ class Call {
10611
10519
  };
10612
10520
  /**
10613
10521
  * Retrieves the list of recordings for the current call or call session.
10614
- * Updates the call state with the returned array of CallRecording objects.
10615
10522
  *
10616
10523
  * If `callSessionId` is provided, it will return the recordings for that call session.
10617
10524
  * Otherwise, all recordings for the current call will be returned.
@@ -10623,9 +10530,7 @@ class Call {
10623
10530
  if (callSessionId) {
10624
10531
  endpoint = `${endpoint}/${callSessionId}`;
10625
10532
  }
10626
- const response = yield this.streamClient.get(`${endpoint}/recordings`);
10627
- this.state.setCallRecordingsList(response.recordings);
10628
- return response;
10533
+ return this.streamClient.get(`${endpoint}/recordings`);
10629
10534
  });
10630
10535
  /**
10631
10536
  * Sends a custom event to all call participants.
@@ -10649,21 +10554,24 @@ class Call {
10649
10554
  if (participantSorter) {
10650
10555
  this.state.setSortParticipantsBy(participantSorter);
10651
10556
  }
10652
- this.state.setMetadata(metadata);
10653
10557
  this.state.setMembers(members || []);
10654
10558
  this.state.setOwnCapabilities(ownCapabilities || []);
10655
10559
  this.state.setCallingState(ringing ? CallingState.RINGING : CallingState.IDLE);
10560
+ this.on('all', (event) => {
10561
+ // update state with the latest event data
10562
+ this.state.updateFromEvent(event);
10563
+ });
10656
10564
  this.leaveCallHooks.push(registerEventHandlers(this, this.state, this.dispatcher));
10657
10565
  this.registerEffects();
10658
10566
  this.leaveCallHooks.push(createSubscription(this.trackSubscriptionsSubject.pipe(debounce((v) => timer(v.type)), map$2((v) => v.data)), (subscriptions) => { var _a; return (_a = this.sfuClient) === null || _a === void 0 ? void 0 : _a.updateSubscriptions(subscriptions); }));
10659
10567
  }
10660
10568
  registerEffects() {
10661
10569
  this.leaveCallHooks.push(
10662
- // handles updating the permissions context when the metadata changes.
10663
- createSubscription(this.state.metadata$, (metadata) => {
10664
- if (!metadata)
10570
+ // handles updating the permissions context when the settings change.
10571
+ createSubscription(this.state.settings$, (settings) => {
10572
+ if (!settings)
10665
10573
  return;
10666
- this.permissionsContext.setCallSettings(metadata.settings);
10574
+ this.permissionsContext.setCallSettings(settings);
10667
10575
  }),
10668
10576
  // handle the case when the user permissions are modified.
10669
10577
  createSubscription(this.state.ownCapabilities$, (ownCapabilities) => {
@@ -10687,12 +10595,11 @@ class Call {
10687
10595
  }
10688
10596
  }),
10689
10597
  // handles the case when the user is blocked by the call owner.
10690
- createSubscription(this.state.metadata$, (metadata) => __awaiter(this, void 0, void 0, function* () {
10691
- if (!metadata)
10598
+ createSubscription(this.state.blockedUserIds$, (blockedUserIds) => __awaiter(this, void 0, void 0, function* () {
10599
+ if (!blockedUserIds)
10692
10600
  return;
10693
10601
  const currentUserId = this.currentUserId;
10694
- if (currentUserId &&
10695
- metadata.blocked_user_ids.includes(currentUserId)) {
10602
+ if (currentUserId && blockedUserIds.includes(currentUserId)) {
10696
10603
  this.logger('info', 'Leaving call because of being blocked');
10697
10604
  yield this.leave();
10698
10605
  }
@@ -10744,12 +10651,6 @@ class Call {
10744
10651
  }
10745
10652
  }
10746
10653
  }
10747
- /**
10748
- * A getter for the call metadata.
10749
- */
10750
- get data() {
10751
- return this.state.metadata;
10752
- }
10753
10654
  /**
10754
10655
  * A flag indicating whether the call is "ringing" type of call.
10755
10656
  */
@@ -10768,7 +10669,7 @@ class Call {
10768
10669
  */
10769
10670
  get isCreatedByMe() {
10770
10671
  var _a;
10771
- return ((_a = this.state.metadata) === null || _a === void 0 ? void 0 : _a.created_by.id) === this.currentUserId;
10672
+ return ((_a = this.state.createdBy) === null || _a === void 0 ? void 0 : _a.id) === this.currentUserId;
10772
10673
  }
10773
10674
  }
10774
10675
 
@@ -11880,7 +11781,7 @@ class WSConnectionFallback {
11880
11781
  }
11881
11782
  }
11882
11783
 
11883
- const version = '0.2.3';
11784
+ const version = '0.3.0';
11884
11785
 
11885
11786
  const logger = getLogger(['location']);
11886
11787
  const HINT_URL = `https://hint.stream-io-video.com/`;
@@ -12574,12 +12475,12 @@ class StreamVideoClient {
12574
12475
  streamClient: this.streamClient,
12575
12476
  id: c.call.id,
12576
12477
  type: c.call.type,
12577
- metadata: c.call,
12578
12478
  members: c.members,
12579
12479
  ownCapabilities: c.own_capabilities,
12580
12480
  watching: data.watch,
12581
12481
  clientStore: this.writeableStateStore,
12582
12482
  });
12483
+ call.state.updateFromCallResponse(c.call);
12583
12484
  if (data.watch) {
12584
12485
  this.writeableStateStore.registerCall(call);
12585
12486
  }
@@ -12587,9 +12488,9 @@ class StreamVideoClient {
12587
12488
  });
12588
12489
  return Object.assign(Object.assign({}, response), { calls: calls });
12589
12490
  });
12590
- this.queryUsers = () => __awaiter(this, void 0, void 0, function* () {
12591
- console.log('Querying users is not implemented yet.');
12592
- });
12491
+ /**
12492
+ * Returns a list of available data centers available for hosting calls.
12493
+ */
12593
12494
  this.edges = () => __awaiter(this, void 0, void 0, function* () {
12594
12495
  return this.streamClient.get(`/edges`);
12595
12496
  });
@@ -12764,14 +12665,15 @@ class StreamVideoClient {
12764
12665
  return;
12765
12666
  }
12766
12667
  this.logger('info', `New call created and registered: ${call.cid}`);
12767
- this.writeableStateStore.registerCall(new Call({
12668
+ const newCall = new Call({
12768
12669
  streamClient: this.streamClient,
12769
12670
  type: call.type,
12770
12671
  id: call.id,
12771
- metadata: call,
12772
12672
  members,
12773
12673
  clientStore: this.writeableStateStore,
12774
- }));
12674
+ });
12675
+ newCall.state.updateFromCallResponse(call);
12676
+ this.writeableStateStore.registerCall(newCall);
12775
12677
  }));
12776
12678
  this.eventHandlersToUnregister.push(this.on('call.ring', (event) => __awaiter(this, void 0, void 0, function* () {
12777
12679
  if (event.type !== 'call.ring')
@@ -12785,7 +12687,6 @@ class StreamVideoClient {
12785
12687
  // if `call.created` was received before `call.ring`.
12786
12688
  // In that case, we cleanup the already tracked call.
12787
12689
  const prevCall = this.writeableStateStore.findCall(call.type, call.id);
12788
- const prevMetadata = prevCall === null || prevCall === void 0 ? void 0 : prevCall.state.metadata;
12789
12690
  yield (prevCall === null || prevCall === void 0 ? void 0 : prevCall.leave());
12790
12691
  // we create a new call
12791
12692
  const theCall = new Call({
@@ -12795,8 +12696,8 @@ class StreamVideoClient {
12795
12696
  members,
12796
12697
  clientStore: this.writeableStateStore,
12797
12698
  ringing: true,
12798
- metadata: prevMetadata,
12799
12699
  });
12700
+ theCall.state.updateFromCallResponse(call);
12800
12701
  // we fetch the latest metadata for the call from the server
12801
12702
  yield theCall.get();
12802
12703
  this.writeableStateStore.registerCall(theCall);