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.
- package/git-revision.txt +1 -1
- package/lib/client.d.ts +8 -2
- package/lib/client.d.ts.map +1 -1
- package/lib/client.js +11 -3
- package/lib/client.js.map +1 -1
- package/lib/common-crypto/CryptoBackend.d.ts +8 -0
- package/lib/common-crypto/CryptoBackend.d.ts.map +1 -1
- package/lib/common-crypto/CryptoBackend.js.map +1 -1
- package/lib/http-api/errors.d.ts +8 -0
- package/lib/http-api/errors.d.ts.map +1 -1
- package/lib/http-api/errors.js +14 -0
- package/lib/http-api/errors.js.map +1 -1
- package/lib/http-api/fetch.d.ts.map +1 -1
- package/lib/http-api/fetch.js +3 -3
- package/lib/http-api/fetch.js.map +1 -1
- package/lib/matrixrtc/LegacyMembershipManager.d.ts +9 -1
- package/lib/matrixrtc/LegacyMembershipManager.d.ts.map +1 -1
- package/lib/matrixrtc/LegacyMembershipManager.js +20 -0
- package/lib/matrixrtc/LegacyMembershipManager.js.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.d.ts.map +1 -1
- package/lib/matrixrtc/MatrixRTCSession.js.map +1 -1
- package/lib/matrixrtc/NewMembershipManager.d.ts +7 -58
- package/lib/matrixrtc/NewMembershipManager.d.ts.map +1 -1
- package/lib/matrixrtc/NewMembershipManager.js +130 -137
- package/lib/matrixrtc/NewMembershipManager.js.map +1 -1
- package/lib/matrixrtc/NewMembershipManagerActionScheduler.js +3 -3
- package/lib/matrixrtc/NewMembershipManagerActionScheduler.js.map +1 -1
- package/lib/matrixrtc/index.d.ts +1 -0
- package/lib/matrixrtc/index.d.ts.map +1 -1
- package/lib/matrixrtc/index.js +1 -0
- package/lib/matrixrtc/index.js.map +1 -1
- package/lib/matrixrtc/types.d.ts +77 -1
- package/lib/matrixrtc/types.d.ts.map +1 -1
- package/lib/matrixrtc/types.js +40 -1
- package/lib/matrixrtc/types.js.map +1 -1
- package/lib/models/room-summary.d.ts +30 -0
- package/lib/models/room-summary.d.ts.map +1 -1
- package/lib/models/room-summary.js +11 -0
- package/lib/models/room-summary.js.map +1 -1
- package/lib/models/room.d.ts +37 -1
- package/lib/models/room.d.ts.map +1 -1
- package/lib/models/room.js +133 -28
- package/lib/models/room.js.map +1 -1
- package/lib/oidc/tokenRefresher.d.ts.map +1 -1
- package/lib/oidc/tokenRefresher.js +8 -1
- package/lib/oidc/tokenRefresher.js.map +1 -1
- package/lib/pushprocessor.d.ts +10 -1
- package/lib/pushprocessor.d.ts.map +1 -1
- package/lib/pushprocessor.js +24 -9
- package/lib/pushprocessor.js.map +1 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.d.ts.map +1 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.js +6 -1
- package/lib/rust-crypto/OutgoingRequestProcessor.js.map +1 -1
- package/lib/rust-crypto/rust-crypto.d.ts +4 -1
- package/lib/rust-crypto/rust-crypto.d.ts.map +1 -1
- package/lib/rust-crypto/rust-crypto.js +55 -46
- package/lib/rust-crypto/rust-crypto.js.map +1 -1
- package/lib/sliding-sync-sdk.d.ts.map +1 -1
- package/lib/sliding-sync-sdk.js +86 -75
- package/lib/sliding-sync-sdk.js.map +1 -1
- package/lib/sliding-sync.d.ts +23 -60
- package/lib/sliding-sync.d.ts.map +1 -1
- package/lib/sliding-sync.js +62 -321
- package/lib/sliding-sync.js.map +1 -1
- package/package.json +6 -6
- package/src/client.ts +12 -5
- package/src/common-crypto/CryptoBackend.ts +9 -0
- package/src/http-api/errors.ts +14 -0
- package/src/http-api/fetch.ts +3 -4
- package/src/matrixrtc/LegacyMembershipManager.ts +27 -1
- package/src/matrixrtc/MatrixRTCSession.ts +2 -1
- package/src/matrixrtc/NewMembershipManager.ts +120 -165
- package/src/matrixrtc/NewMembershipManagerActionScheduler.ts +3 -3
- package/src/matrixrtc/index.ts +1 -0
- package/src/matrixrtc/types.ts +84 -1
- package/src/models/room-summary.ts +31 -0
- package/src/models/room.ts +133 -23
- package/src/oidc/tokenRefresher.ts +8 -2
- package/src/pushprocessor.ts +25 -16
- package/src/rust-crypto/OutgoingRequestProcessor.ts +6 -0
- package/src/rust-crypto/rust-crypto.ts +7 -1
- package/src/sliding-sync-sdk.ts +28 -28
- 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
|
-
|
|
42
|
-
|
|
43
|
-
|
|
44
|
-
|
|
45
|
-
|
|
46
|
-
|
|
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│
|
|
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["
|
|
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
|
-
|
|
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
|
-
|
|
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().
|
|
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
|
-
})
|
|
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.
|
|
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
|
-
//
|
|
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.
|
|
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.
|
|
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
|
|
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(
|
|
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
|
-
|
|
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.
|
|
382
|
-
_this3.state.networkErrorRetries.set(MembershipActionType.SendFirstDelayedEvent, 0);
|
|
384
|
+
_this3.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
|
|
383
385
|
_this3.state.delayId = response.delay_id;
|
|
384
|
-
|
|
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.
|
|
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
|
-
|
|
394
|
-
|
|
395
|
-
|
|
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
|
-
|
|
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.
|
|
411
|
-
return createReplaceActionUpdate(MembershipActionType.
|
|
428
|
+
_this4.resetRateLimitCounter(MembershipActionType.SendDelayedEvent);
|
|
429
|
+
return createReplaceActionUpdate(MembershipActionType.SendDelayedEvent);
|
|
412
430
|
}).catch(e => {
|
|
413
|
-
var repeatActionType = MembershipActionType.
|
|
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.
|
|
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
|
|
478
|
+
var _this6 = this;
|
|
485
479
|
return _asyncToGenerator(function* () {
|
|
486
|
-
return yield
|
|
487
|
-
|
|
488
|
-
|
|
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 (
|
|
495
|
-
if (
|
|
496
|
-
|
|
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 =
|
|
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
|
|
503
|
+
var _this7 = this;
|
|
510
504
|
return _asyncToGenerator(function* () {
|
|
511
|
-
return yield
|
|
512
|
-
|
|
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
|
-
|
|
515
|
-
|
|
516
|
-
|
|
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:
|
|
516
|
+
ts: _this7.computeNextExpiryActionTs(_this7.state.expireUpdateIterations),
|
|
523
517
|
type: MembershipActionType.UpdateExpiry
|
|
524
518
|
}]
|
|
525
519
|
};
|
|
526
520
|
}).catch(e => {
|
|
527
|
-
var update =
|
|
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
|
|
528
|
+
var _this8 = this;
|
|
535
529
|
return _asyncToGenerator(function* () {
|
|
536
|
-
var nextExpireUpdateIteration =
|
|
537
|
-
return yield
|
|
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
|
-
|
|
540
|
-
|
|
533
|
+
_this8.resetRateLimitCounter(MembershipActionType.UpdateExpiry);
|
|
534
|
+
_this8.state.expireUpdateIterations = nextExpireUpdateIteration;
|
|
541
535
|
return {
|
|
542
536
|
insert: [{
|
|
543
|
-
ts:
|
|
537
|
+
ts: _this8.computeNextExpiryActionTs(nextExpireUpdateIteration),
|
|
544
538
|
type: MembershipActionType.UpdateExpiry
|
|
545
539
|
}]
|
|
546
540
|
};
|
|
547
541
|
}).catch(e => {
|
|
548
|
-
var update =
|
|
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
|
|
549
|
+
var _this9 = this;
|
|
556
550
|
return _asyncToGenerator(function* () {
|
|
557
|
-
return yield
|
|
558
|
-
|
|
559
|
-
|
|
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 =
|
|
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.
|
|
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.
|
|
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) {
|