matrix-js-sdk 37.2.0 → 37.3.0-rc.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 (83) hide show
  1. package/git-revision.txt +1 -1
  2. package/lib/client.d.ts +8 -2
  3. package/lib/client.d.ts.map +1 -1
  4. package/lib/client.js +11 -3
  5. package/lib/client.js.map +1 -1
  6. package/lib/common-crypto/CryptoBackend.d.ts +8 -0
  7. package/lib/common-crypto/CryptoBackend.d.ts.map +1 -1
  8. package/lib/common-crypto/CryptoBackend.js.map +1 -1
  9. package/lib/http-api/errors.d.ts +8 -0
  10. package/lib/http-api/errors.d.ts.map +1 -1
  11. package/lib/http-api/errors.js +14 -0
  12. package/lib/http-api/errors.js.map +1 -1
  13. package/lib/http-api/fetch.d.ts.map +1 -1
  14. package/lib/http-api/fetch.js +3 -3
  15. package/lib/http-api/fetch.js.map +1 -1
  16. package/lib/matrixrtc/LegacyMembershipManager.d.ts +9 -1
  17. package/lib/matrixrtc/LegacyMembershipManager.d.ts.map +1 -1
  18. package/lib/matrixrtc/LegacyMembershipManager.js +20 -0
  19. package/lib/matrixrtc/LegacyMembershipManager.js.map +1 -1
  20. package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
  21. package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
  22. package/lib/matrixrtc/NewMembershipManager.d.ts +7 -58
  23. package/lib/matrixrtc/NewMembershipManager.d.ts.map +1 -1
  24. package/lib/matrixrtc/NewMembershipManager.js +130 -137
  25. package/lib/matrixrtc/NewMembershipManager.js.map +1 -1
  26. package/lib/matrixrtc/NewMembershipManagerActionScheduler.js +3 -3
  27. package/lib/matrixrtc/NewMembershipManagerActionScheduler.js.map +1 -1
  28. package/lib/matrixrtc/index.d.ts +1 -0
  29. package/lib/matrixrtc/index.d.ts.map +1 -1
  30. package/lib/matrixrtc/index.js +1 -0
  31. package/lib/matrixrtc/index.js.map +1 -1
  32. package/lib/matrixrtc/types.d.ts +77 -1
  33. package/lib/matrixrtc/types.d.ts.map +1 -1
  34. package/lib/matrixrtc/types.js +40 -1
  35. package/lib/matrixrtc/types.js.map +1 -1
  36. package/lib/models/room-summary.d.ts +30 -0
  37. package/lib/models/room-summary.d.ts.map +1 -1
  38. package/lib/models/room-summary.js +11 -0
  39. package/lib/models/room-summary.js.map +1 -1
  40. package/lib/models/room.d.ts +37 -1
  41. package/lib/models/room.d.ts.map +1 -1
  42. package/lib/models/room.js +133 -28
  43. package/lib/models/room.js.map +1 -1
  44. package/lib/oidc/tokenRefresher.d.ts.map +1 -1
  45. package/lib/oidc/tokenRefresher.js +8 -1
  46. package/lib/oidc/tokenRefresher.js.map +1 -1
  47. package/lib/pushprocessor.d.ts +10 -1
  48. package/lib/pushprocessor.d.ts.map +1 -1
  49. package/lib/pushprocessor.js +24 -9
  50. package/lib/pushprocessor.js.map +1 -1
  51. package/lib/rust-crypto/OutgoingRequestProcessor.d.ts.map +1 -1
  52. package/lib/rust-crypto/OutgoingRequestProcessor.js +6 -1
  53. package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
  54. package/lib/rust-crypto/rust-crypto.d.ts +4 -1
  55. package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
  56. package/lib/rust-crypto/rust-crypto.js +55 -46
  57. package/lib/rust-crypto/rust-crypto.js.map +1 -1
  58. package/lib/sliding-sync-sdk.d.ts.map +1 -1
  59. package/lib/sliding-sync-sdk.js +86 -75
  60. package/lib/sliding-sync-sdk.js.map +1 -1
  61. package/lib/sliding-sync.d.ts +23 -60
  62. package/lib/sliding-sync.d.ts.map +1 -1
  63. package/lib/sliding-sync.js +62 -321
  64. package/lib/sliding-sync.js.map +1 -1
  65. package/package.json +6 -6
  66. package/src/client.ts +12 -5
  67. package/src/common-crypto/CryptoBackend.ts +9 -0
  68. package/src/http-api/errors.ts +14 -0
  69. package/src/http-api/fetch.ts +3 -4
  70. package/src/matrixrtc/LegacyMembershipManager.ts +27 -1
  71. package/src/matrixrtc/MatrixRTCSession.ts +2 -1
  72. package/src/matrixrtc/NewMembershipManager.ts +120 -165
  73. package/src/matrixrtc/NewMembershipManagerActionScheduler.ts +3 -3
  74. package/src/matrixrtc/index.ts +1 -0
  75. package/src/matrixrtc/types.ts +84 -1
  76. package/src/models/room-summary.ts +31 -0
  77. package/src/models/room.ts +133 -23
  78. package/src/oidc/tokenRefresher.ts +8 -2
  79. package/src/pushprocessor.ts +25 -16
  80. package/src/rust-crypto/OutgoingRequestProcessor.ts +6 -0
  81. package/src/rust-crypto/rust-crypto.ts +7 -1
  82. package/src/sliding-sync-sdk.ts +28 -28
  83. package/src/sliding-sync.ts +38 -329
@@ -23,63 +23,63 @@ import { ConnectionError, HTTPError, MatrixError } from "../http-api/errors.js";
23
23
  import { logger as rootLogger } from "../logger.js";
24
24
  import { defer } from "../utils.js";
25
25
  import { DEFAULT_EXPIRE_DURATION } from "./CallMembership.js";
26
+ import { MembershipManagerEvent, Status } from "./types.js";
26
27
  import { isLivekitFocusActive } from "./LivekitFocus.js";
27
28
  import { ActionScheduler } from "./NewMembershipManagerActionScheduler.js";
29
+ import { TypedEventEmitter } from "../models/typed-event-emitter.js";
28
30
  var logger = rootLogger.getChild("MatrixRTCSession");
29
31
 
30
- /**
31
- * This interface defines what a MembershipManager uses and exposes.
32
- * This interface is what we use to write tests and allows changing the actual implementation
33
- * without breaking tests because of some internal method renaming.
34
- *
35
- * @internal
36
- */
37
-
38
32
  /* MembershipActionTypes:
39
-
40
- ┌─────────────────────┐
41
- SendFirstDelayedEvent│
42
- └─────────────────────┘
43
-
44
-
45
- ┌─────────────┐
46
- ┌────────────│SendJoinEvent│────────────┐
47
- └─────────────┘
48
- ┌─────┐ ┌──────┐ ┌──────┐
49
- ▼ ▼ ▼ │
33
+
34
+ On Join: ───────────────┐ ┌───────────────(1)───────────┐
35
+ ▼ ▼
36
+ ┌────────────────┐ │
37
+ SendDelayedEvent│ ──────(2)───┐ │
38
+ └────────────────┘ │ │
39
+ │(3) │ │
40
+ ▼ │ │
41
+ ┌─────────────┐
42
+ ┌──────(4)───│SendJoinEvent│────(4)─────┐
43
+ │ └─────────────┘ │
44
+ │ ┌─────┐ ┌──────┐ │ │ │
45
+ ▼ ▼ │ │ ▼ ▼ ▼ │
50
46
  ┌────────────┐ │ │ ┌───────────────────┐ │
51
- │UpdateExpiry│ │ │ RestartDelayedEvent│ │
47
+ │UpdateExpiry│ (s) (s)|RestartDelayedEvent│ │
52
48
  └────────────┘ │ │ └───────────────────┘ │
53
- │ │ │ │
54
- └─────┘ └──────┘ │ │
55
- │ │
56
- ┌────────────────────┐ │ │
57
- │SendMainDelayedEvent│◄───────┘ │
58
- └───────────────────┬┘ │
59
- │ │
60
- └─────────────────────┘
61
- STOP ALL ABOVE
49
+ │ │ │ │
50
+ └─────┘ └──────┘ └───────┘
51
+
52
+ On Leave: ───────── STOP ALL ABOVE
62
53
 
63
- ┌───────────────────────────────┐
64
- │ SendScheduledDelayedLeaveEvent│
65
- └───────────────────────────────┘
66
-
54
+ ┌────────────────────────────────┐
55
+ │ SendScheduledDelayedLeaveEvent
56
+ └────────────────────────────────┘
57
+ (5)
67
58
 
68
59
  ┌──────────────┐
69
60
  │SendLeaveEvent│
70
61
  └──────────────┘
71
-
62
+ (1) [Not found error] results in resending the delayed event
63
+ (2) [hasMemberEvent = true] Sending the delayed event if we
64
+ already have a call member event results jumping to the
65
+ RestartDelayedEvent loop directly
66
+ (3) [hasMemberEvent = false] if there is not call member event
67
+ sending it is the next step
68
+ (4) Both (UpdateExpiry and RestartDelayedEvent) actions are
69
+ scheduled when successfully sending the state event
70
+ (5) Only if delayed event sending failed (fallback)
71
+ (s) Successful restart/resend
72
72
  */
73
+
73
74
  /**
74
75
  * The different types of actions the MembershipManager can take.
75
76
  * @internal
76
77
  */
77
78
  export var MembershipActionType = /*#__PURE__*/function (MembershipActionType) {
78
- MembershipActionType["SendFirstDelayedEvent"] = "SendFirstDelayedEvent";
79
+ MembershipActionType["SendDelayedEvent"] = "SendDelayedEvent";
79
80
  MembershipActionType["SendJoinEvent"] = "SendJoinEvent";
80
81
  MembershipActionType["RestartDelayedEvent"] = "RestartDelayedEvent";
81
82
  MembershipActionType["UpdateExpiry"] = "UpdateExpiry";
82
- MembershipActionType["SendMainDelayedEvent"] = "SendMainDelayedEvent";
83
83
  MembershipActionType["SendScheduledDelayedLeaveEvent"] = "SendScheduledDelayedLeaveEvent";
84
84
  MembershipActionType["SendLeaveEvent"] = "SendLeaveEvent";
85
85
  return MembershipActionType;
@@ -88,17 +88,7 @@ export var MembershipActionType = /*#__PURE__*/function (MembershipActionType) {
88
88
  /**
89
89
  * @internal
90
90
  */
91
- var Status = /*#__PURE__*/function (Status) {
92
- Status["Disconnected"] = "Disconnected";
93
- Status["Connecting"] = "Connecting";
94
- Status["ConnectingFailed"] = "ConnectingFailed";
95
- Status["Connected"] = "Connected";
96
- Status["Reconnecting"] = "Reconnecting";
97
- Status["Disconnecting"] = "Disconnecting";
98
- Status["Stuck"] = "Stuck";
99
- Status["Unknown"] = "Unknown";
100
- return Status;
101
- }(Status || {});
91
+
102
92
  /**
103
93
  * This class is responsible for sending all events relating to the own membership of a matrixRTC call.
104
94
  * It has the following tasks:
@@ -112,10 +102,14 @@ var Status = /*#__PURE__*/function (Status) {
112
102
  * - Stop the timer for the delay refresh
113
103
  * - Stop the timer for updating the state event
114
104
  */
115
- export class MembershipManager {
116
- isJoined() {
105
+ export class MembershipManager extends TypedEventEmitter {
106
+ isActivated() {
117
107
  return this.activated;
118
108
  }
109
+ // DEPRECATED use isActivated
110
+ isJoined() {
111
+ return this.isActivated();
112
+ }
119
113
 
120
114
  /**
121
115
  * Puts the MembershipManager in a state where it tries to be joined.
@@ -134,19 +128,24 @@ export class MembershipManager {
134
128
  this.focusActive = focusActive;
135
129
  this.leavePromiseDefer = undefined;
136
130
  this.activated = true;
131
+ this.oldStatus = this.status;
137
132
  this.state = MembershipManager.defaultState;
138
- this.scheduler.startWithJoin().then(() => {
133
+ this.scheduler.startWithJoin().catch(e => {
134
+ logger.error("MembershipManager stopped because: ", e);
135
+ onError === null || onError === void 0 || onError(e);
136
+ }).finally(() => {
137
+ // Should already be set to false when calling `leave` in non error cases.
138
+ this.activated = false;
139
+ // Here the scheduler is not running anymore so we the `membershipLoopHandler` is not called to emit.
140
+ if (this.oldStatus && this.oldStatus !== this.status) {
141
+ this.emit(MembershipManagerEvent.StatusChanged, this.oldStatus, this.status);
142
+ }
139
143
  if (!this.scheduler.running) {
140
144
  var _this$leavePromiseDef;
141
145
  (_this$leavePromiseDef = this.leavePromiseDefer) === null || _this$leavePromiseDef === void 0 || _this$leavePromiseDef.resolve(true);
142
146
  this.leavePromiseDefer = undefined;
143
147
  }
144
- }).catch(e => {
145
- logger.error("MembershipManager stopped because: ", e);
146
- onError === null || onError === void 0 || onError(e);
147
- })
148
- // Should already be set to false when calling `leave` in non error cases.
149
- .finally(() => this.activated = false);
148
+ });
150
149
  }
151
150
 
152
151
  /**
@@ -181,7 +180,7 @@ export class MembershipManager {
181
180
  if (_this.isJoined() && !memberships.some(isMyMembership)) {
182
181
  // If one of these actions are scheduled or are getting inserted in the next iteration, we should already
183
182
  // take care of our missing membership.
184
- var sendingMembershipActions = [MembershipActionType.SendFirstDelayedEvent, MembershipActionType.SendJoinEvent];
183
+ var sendingMembershipActions = [MembershipActionType.SendDelayedEvent, MembershipActionType.SendJoinEvent];
185
184
  logger.warn("Missing own membership: force re-join");
186
185
  if (_this.scheduler.actions.find(a => sendingMembershipActions.includes(a.type))) {
187
186
  logger.error("NewMembershipManger tried adding another `SendFirstDelayedEvent` actions even though we already have one in the Queue\nActionQueueOnMemberUpdate:", _this.scheduler.actions);
@@ -221,6 +220,7 @@ export class MembershipManager {
221
220
  * @param getOldestMembership
222
221
  */
223
222
  constructor(joinConfig, room, client, getOldestMembership) {
223
+ super();
224
224
  this.joinConfig = joinConfig;
225
225
  this.room = room;
226
226
  this.client = client;
@@ -240,9 +240,13 @@ export class MembershipManager {
240
240
  _defineProperty(this, "oldStatus", void 0);
241
241
  _defineProperty(this, "scheduler", new ActionScheduler(type => {
242
242
  if (this.oldStatus) {
243
- // we put this at the beginning of the actions scheduler loop handle callback since it is a loop this
243
+ // we put this at the beginning of the actions scheduler loop handle callback since it is a loop this
244
244
  // is equivalent to running it at the end of the loop. (just after applying the status/action list changes)
245
+ // This order is required because this method needs to return the action updates.
245
246
  logger.debug("MembershipManager applied action changes. Status: ".concat(this.oldStatus, " -> ").concat(this.status));
247
+ if (this.oldStatus !== this.status) {
248
+ this.emit(MembershipManagerEvent.StatusChanged, this.oldStatus, this.status);
249
+ }
246
250
  }
247
251
  this.oldStatus = this.status;
248
252
  logger.debug("MembershipManager before processing action. status=".concat(this.oldStatus));
@@ -300,18 +304,17 @@ export class MembershipManager {
300
304
  membershipLoopHandler(type) {
301
305
  var _this2 = this;
302
306
  return _asyncToGenerator(function* () {
303
- _this2.oldStatus = _this2.status;
304
307
  switch (type) {
305
- case MembershipActionType.SendFirstDelayedEvent:
308
+ case MembershipActionType.SendDelayedEvent:
306
309
  {
307
310
  // Before we start we check if we come from a state where we have a delay id.
308
311
  if (!_this2.state.delayId) {
309
- return _this2.sendFirstDelayedLeaveEvent(); // Normal case without any previous delayed id.
312
+ return _this2.sendOrResendDelayedLeaveEvent(); // Normal case without any previous delayed id.
310
313
  } else {
311
314
  // This can happen if someone else (or another client) removes our own membership event.
312
315
  // It will trigger `onRTCSessionMemberUpdate` queue `MembershipActionType.SendFirstDelayedEvent`.
313
316
  // We might still have our delayed event from the previous participation and dependent on the server this might not
314
- // get automatically removed if the state changes. Hence It would remove our membership unexpectedly shortly after the rejoin.
317
+ // get removed automatically if the state changes. Hence, it would remove our membership unexpectedly shortly after the rejoin.
315
318
  //
316
319
  // In this block we will try to cancel this delayed event before setting up a new one.
317
320
 
@@ -322,14 +325,10 @@ export class MembershipManager {
322
325
  {
323
326
  if (!_this2.state.delayId) {
324
327
  // Delay id got reset. This action was used to check if the hs canceled the delayed event when the join state got sent.
325
- return createInsertActionUpdate(_this2.state.hasMemberStateEvent ? MembershipActionType.SendMainDelayedEvent : MembershipActionType.SendFirstDelayedEvent);
328
+ return createInsertActionUpdate(MembershipActionType.SendDelayedEvent);
326
329
  }
327
330
  return _this2.restartDelayedEvent(_this2.state.delayId);
328
331
  }
329
- case MembershipActionType.SendMainDelayedEvent:
330
- {
331
- return _this2.sendMainDelayedEvent();
332
- }
333
332
  case MembershipActionType.SendScheduledDelayedLeaveEvent:
334
333
  {
335
334
  // We are already good
@@ -369,35 +368,54 @@ export class MembershipManager {
369
368
  }
370
369
 
371
370
  // HANDLERS (used in the membershipLoopHandler)
372
- sendFirstDelayedLeaveEvent() {
371
+ sendOrResendDelayedLeaveEvent() {
373
372
  var _this3 = this;
374
373
  return _asyncToGenerator(function* () {
374
+ // We can reach this at the start of a call (where we do not yet have a membership: state.hasMemberStateEvent=false)
375
+ // or during a call if the state event canceled our delayed event or caused by an unexpected error that removed our delayed event.
376
+ // (Another client could have canceled it, the homeserver might have removed/lost it due to a restart, ...)
377
+ // In the `then` and `catch` block we treat both cases differently. "if (this.state.hasMemberStateEvent) {} else {}"
375
378
  return yield _this3.client._unstable_sendDelayedStateEvent(_this3.room.roomId, {
376
379
  delay: _this3.membershipServerSideExpiryTimeout
377
380
  }, EventType.GroupCallMemberPrefix, {},
378
381
  // leave event
379
382
  _this3.stateKey).then(response => {
380
383
  // On success we reset retries and set delayId.
381
- _this3.state.rateLimitRetries.set(MembershipActionType.SendFirstDelayedEvent, 0);
382
- _this3.state.networkErrorRetries.set(MembershipActionType.SendFirstDelayedEvent, 0);
384
+ _this3.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
383
385
  _this3.state.delayId = response.delay_id;
384
- return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
386
+ if (_this3.state.hasMemberStateEvent) {
387
+ // This action was scheduled because the previous delayed event was cancelled
388
+ // due to lack of https://github.com/element-hq/synapse/pull/17810
389
+ return createInsertActionUpdate(MembershipActionType.RestartDelayedEvent, _this3.membershipKeepAlivePeriod);
390
+ } else {
391
+ // This action was scheduled because we are in the process of joining
392
+ return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
393
+ }
385
394
  }).catch(e => {
386
- var repeatActionType = MembershipActionType.SendFirstDelayedEvent;
395
+ var repeatActionType = MembershipActionType.SendDelayedEvent;
387
396
  if (_this3.manageMaxDelayExceededSituation(e)) {
388
397
  return createInsertActionUpdate(repeatActionType);
389
398
  }
390
399
  var update = _this3.actionUpdateFromErrors(e, repeatActionType, "sendDelayedStateEvent");
391
400
  if (update) return update;
401
+ if (_this3.state.hasMemberStateEvent) {
402
+ // This action was scheduled because the previous delayed event was cancelled
403
+ // due to lack of https://github.com/element-hq/synapse/pull/17810
392
404
 
393
- // log and fall through
394
- if (_this3.isUnsupportedDelayedEndpoint(e)) {
395
- logger.info("Not using delayed event because the endpoint is not supported");
405
+ // Don't do any other delayed event work if its not supported.
406
+ if (_this3.isUnsupportedDelayedEndpoint(e)) return {};
407
+ throw Error("Could not send delayed event, even though delayed events are supported. " + e);
396
408
  } else {
397
- logger.info("Not using delayed event because: " + e);
409
+ // This action was scheduled because we are in the process of joining
410
+ // log and fall through
411
+ if (_this3.isUnsupportedDelayedEndpoint(e)) {
412
+ logger.info("Not using delayed event because the endpoint is not supported");
413
+ } else {
414
+ logger.info("Not using delayed event because: " + e);
415
+ }
416
+ // On any other error we fall back to not using delayed events and send the join state event immediately
417
+ return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
398
418
  }
399
- // On any other error we fall back to not using delayed events and send the join state event immediately
400
- return createInsertActionUpdate(MembershipActionType.SendJoinEvent);
401
419
  });
402
420
  })();
403
421
  }
@@ -407,10 +425,10 @@ export class MembershipManager {
407
425
  // Remove all running updates and restarts
408
426
  return yield _this4.client._unstable_updateDelayedEvent(delayId, UpdateDelayedEventAction.Cancel).then(() => {
409
427
  _this4.state.delayId = undefined;
410
- _this4.resetRateLimitCounter(MembershipActionType.SendFirstDelayedEvent);
411
- return createReplaceActionUpdate(MembershipActionType.SendFirstDelayedEvent);
428
+ _this4.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
429
+ return createReplaceActionUpdate(MembershipActionType.SendDelayedEvent);
412
430
  }).catch(e => {
413
- var repeatActionType = MembershipActionType.SendFirstDelayedEvent;
431
+ var repeatActionType = MembershipActionType.SendDelayedEvent;
414
432
  var update = _this4.actionUpdateFromErrors(e, repeatActionType, "updateDelayedEvent");
415
433
  if (update) return update;
416
434
  if (_this4.isNotFoundError(e)) {
@@ -442,7 +460,7 @@ export class MembershipManager {
442
460
  var repeatActionType = MembershipActionType.RestartDelayedEvent;
443
461
  if (_this5.isNotFoundError(e)) {
444
462
  _this5.state.delayId = undefined;
445
- return createInsertActionUpdate(MembershipActionType.SendMainDelayedEvent);
463
+ return createInsertActionUpdate(MembershipActionType.SendDelayedEvent);
446
464
  }
447
465
  // If the HS does not support delayed events we wont reschedule.
448
466
  if (_this5.isUnsupportedDelayedEndpoint(e)) return {};
@@ -456,47 +474,23 @@ export class MembershipManager {
456
474
  });
457
475
  })();
458
476
  }
459
- sendMainDelayedEvent() {
460
- var _this6 = this;
461
- return _asyncToGenerator(function* () {
462
- return yield _this6.client._unstable_sendDelayedStateEvent(_this6.room.roomId, {
463
- delay: _this6.membershipServerSideExpiryTimeout
464
- }, EventType.GroupCallMemberPrefix, {},
465
- // leave event
466
- _this6.stateKey).then(response => {
467
- _this6.state.delayId = response.delay_id;
468
- _this6.resetRateLimitCounter(MembershipActionType.SendMainDelayedEvent);
469
- return createInsertActionUpdate(MembershipActionType.RestartDelayedEvent, _this6.membershipKeepAlivePeriod);
470
- }).catch(e => {
471
- var repeatActionType = MembershipActionType.SendMainDelayedEvent;
472
- // Don't do any other delayed event work if its not supported.
473
- if (_this6.isUnsupportedDelayedEndpoint(e)) return {};
474
- if (_this6.manageMaxDelayExceededSituation(e)) {
475
- return createInsertActionUpdate(repeatActionType);
476
- }
477
- var update = _this6.actionUpdateFromErrors(e, repeatActionType, "updateDelayedEvent");
478
- if (update) return update;
479
- throw Error("Could not send delayed event, even though delayed events are supported. " + e);
480
- });
481
- })();
482
- }
483
477
  sendScheduledDelayedLeaveEventOrFallbackToSendLeaveEvent(delayId) {
484
- var _this7 = this;
478
+ var _this6 = this;
485
479
  return _asyncToGenerator(function* () {
486
- return yield _this7.client._unstable_updateDelayedEvent(delayId, UpdateDelayedEventAction.Send).then(() => {
487
- _this7.state.hasMemberStateEvent = false;
488
- _this7.resetRateLimitCounter(MembershipActionType.SendScheduledDelayedLeaveEvent);
480
+ return yield _this6.client._unstable_updateDelayedEvent(delayId, UpdateDelayedEventAction.Send).then(() => {
481
+ _this6.state.hasMemberStateEvent = false;
482
+ _this6.resetRateLimitCounter(MembershipActionType.SendScheduledDelayedLeaveEvent);
489
483
  return {
490
484
  replace: []
491
485
  };
492
486
  }).catch(e => {
493
487
  var repeatActionType = MembershipActionType.SendLeaveEvent;
494
- if (_this7.isUnsupportedDelayedEndpoint(e)) return {};
495
- if (_this7.isNotFoundError(e)) {
496
- _this7.state.delayId = undefined;
488
+ if (_this6.isUnsupportedDelayedEndpoint(e)) return {};
489
+ if (_this6.isNotFoundError(e)) {
490
+ _this6.state.delayId = undefined;
497
491
  return createInsertActionUpdate(repeatActionType);
498
492
  }
499
- var update = _this7.actionUpdateFromErrors(e, repeatActionType, "updateDelayedEvent");
493
+ var update = _this6.actionUpdateFromErrors(e, repeatActionType, "updateDelayedEvent");
500
494
  if (update) return update;
501
495
 
502
496
  // On any other error we fall back to SendLeaveEvent (this includes hard errors from rate limiting)
@@ -506,62 +500,62 @@ export class MembershipManager {
506
500
  })();
507
501
  }
508
502
  sendJoinEvent() {
509
- var _this8 = this;
503
+ var _this7 = this;
510
504
  return _asyncToGenerator(function* () {
511
- return yield _this8.client.sendStateEvent(_this8.room.roomId, EventType.GroupCallMemberPrefix, _this8.makeMyMembership(_this8.membershipEventExpiryTimeout), _this8.stateKey).then(() => {
512
- _this8.state.startTime = Date.now();
505
+ return yield _this7.client.sendStateEvent(_this7.room.roomId, EventType.GroupCallMemberPrefix, _this7.makeMyMembership(_this7.membershipEventExpiryTimeout), _this7.stateKey).then(() => {
506
+ _this7.state.startTime = Date.now();
513
507
  // The next update should already use twice the membershipEventExpiryTimeout
514
- _this8.state.expireUpdateIterations = 1;
515
- _this8.state.hasMemberStateEvent = true;
516
- _this8.resetRateLimitCounter(MembershipActionType.SendJoinEvent);
508
+ _this7.state.expireUpdateIterations = 1;
509
+ _this7.state.hasMemberStateEvent = true;
510
+ _this7.resetRateLimitCounter(MembershipActionType.SendJoinEvent);
517
511
  return {
518
512
  insert: [{
519
513
  ts: Date.now(),
520
514
  type: MembershipActionType.RestartDelayedEvent
521
515
  }, {
522
- ts: _this8.computeNextExpiryActionTs(_this8.state.expireUpdateIterations),
516
+ ts: _this7.computeNextExpiryActionTs(_this7.state.expireUpdateIterations),
523
517
  type: MembershipActionType.UpdateExpiry
524
518
  }]
525
519
  };
526
520
  }).catch(e => {
527
- var update = _this8.actionUpdateFromErrors(e, MembershipActionType.SendJoinEvent, "sendStateEvent");
521
+ var update = _this7.actionUpdateFromErrors(e, MembershipActionType.SendJoinEvent, "sendStateEvent");
528
522
  if (update) return update;
529
523
  throw e;
530
524
  });
531
525
  })();
532
526
  }
533
527
  updateExpiryOnJoinedEvent() {
534
- var _this9 = this;
528
+ var _this8 = this;
535
529
  return _asyncToGenerator(function* () {
536
- var nextExpireUpdateIteration = _this9.state.expireUpdateIterations + 1;
537
- return yield _this9.client.sendStateEvent(_this9.room.roomId, EventType.GroupCallMemberPrefix, _this9.makeMyMembership(_this9.membershipEventExpiryTimeout * nextExpireUpdateIteration), _this9.stateKey).then(() => {
530
+ var nextExpireUpdateIteration = _this8.state.expireUpdateIterations + 1;
531
+ return yield _this8.client.sendStateEvent(_this8.room.roomId, EventType.GroupCallMemberPrefix, _this8.makeMyMembership(_this8.membershipEventExpiryTimeout * nextExpireUpdateIteration), _this8.stateKey).then(() => {
538
532
  // Success, we reset retries and schedule update.
539
- _this9.resetRateLimitCounter(MembershipActionType.UpdateExpiry);
540
- _this9.state.expireUpdateIterations = nextExpireUpdateIteration;
533
+ _this8.resetRateLimitCounter(MembershipActionType.UpdateExpiry);
534
+ _this8.state.expireUpdateIterations = nextExpireUpdateIteration;
541
535
  return {
542
536
  insert: [{
543
- ts: _this9.computeNextExpiryActionTs(nextExpireUpdateIteration),
537
+ ts: _this8.computeNextExpiryActionTs(nextExpireUpdateIteration),
544
538
  type: MembershipActionType.UpdateExpiry
545
539
  }]
546
540
  };
547
541
  }).catch(e => {
548
- var update = _this9.actionUpdateFromErrors(e, MembershipActionType.UpdateExpiry, "sendStateEvent");
542
+ var update = _this8.actionUpdateFromErrors(e, MembershipActionType.UpdateExpiry, "sendStateEvent");
549
543
  if (update) return update;
550
544
  throw e;
551
545
  });
552
546
  })();
553
547
  }
554
548
  sendFallbackLeaveEvent() {
555
- var _this10 = this;
549
+ var _this9 = this;
556
550
  return _asyncToGenerator(function* () {
557
- return yield _this10.client.sendStateEvent(_this10.room.roomId, EventType.GroupCallMemberPrefix, {}, _this10.stateKey).then(() => {
558
- _this10.resetRateLimitCounter(MembershipActionType.SendLeaveEvent);
559
- _this10.state.hasMemberStateEvent = false;
551
+ return yield _this9.client.sendStateEvent(_this9.room.roomId, EventType.GroupCallMemberPrefix, {}, _this9.stateKey).then(() => {
552
+ _this9.resetRateLimitCounter(MembershipActionType.SendLeaveEvent);
553
+ _this9.state.hasMemberStateEvent = false;
560
554
  return {
561
555
  replace: []
562
556
  };
563
557
  }).catch(e => {
564
- var update = _this10.actionUpdateFromErrors(e, MembershipActionType.SendLeaveEvent, "sendStateEvent");
558
+ var update = _this9.actionUpdateFromErrors(e, MembershipActionType.SendLeaveEvent, "sendStateEvent");
565
559
  if (update) return update;
566
560
  throw e;
567
561
  });
@@ -731,9 +725,8 @@ export class MembershipManager {
731
725
  type
732
726
  } = actions[0];
733
727
  switch (type) {
734
- case MembershipActionType.SendFirstDelayedEvent:
728
+ case MembershipActionType.SendDelayedEvent:
735
729
  case MembershipActionType.SendJoinEvent:
736
- case MembershipActionType.SendMainDelayedEvent:
737
730
  return Status.Connecting;
738
731
  case MembershipActionType.UpdateExpiry:
739
732
  // where no delayed events
@@ -747,7 +740,7 @@ export class MembershipManager {
747
740
  } else if (actions.length === 2) {
748
741
  var types = actions.map(a => a.type);
749
742
  // normal state for connected with delayed events
750
- if ((types.includes(MembershipActionType.RestartDelayedEvent) || types.includes(MembershipActionType.SendMainDelayedEvent)) && types.includes(MembershipActionType.UpdateExpiry)) {
743
+ if ((types.includes(MembershipActionType.RestartDelayedEvent) || types.includes(MembershipActionType.SendDelayedEvent) && this.state.hasMemberStateEvent) && types.includes(MembershipActionType.UpdateExpiry)) {
751
744
  return Status.Connected;
752
745
  }
753
746
  } else if (actions.length === 3) {