matrix-react-sdk
Version:
SDK for matrix.org using React
171 lines (167 loc) • 29.8 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.LegacyCallEventGrouperEvent = void 0;
exports.buildLegacyCallEventGroupers = buildLegacyCallEventGroupers;
exports.isCallEvent = exports.default = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _call = require("matrix-js-sdk/src/webrtc/call");
var _events = require("events");
var _LegacyCallHandler = _interopRequireWildcard(require("../../LegacyCallHandler"));
var _MatrixClientPeg = require("../../MatrixClientPeg");
function _getRequireWildcardCache(e) { if ("function" != typeof WeakMap) return null; var r = new WeakMap(), t = new WeakMap(); return (_getRequireWildcardCache = function (e) { return e ? t : r; })(e); }
function _interopRequireWildcard(e, r) { if (!r && e && e.__esModule) return e; if (null === e || "object" != typeof e && "function" != typeof e) return { default: e }; var t = _getRequireWildcardCache(r); if (t && t.has(e)) return t.get(e); var n = { __proto__: null }, a = Object.defineProperty && Object.getOwnPropertyDescriptor; for (var u in e) if ("default" !== u && {}.hasOwnProperty.call(e, u)) { var i = a ? Object.getOwnPropertyDescriptor(e, u) : null; i && (i.get || i.set) ? Object.defineProperty(n, u, i) : n[u] = e[u]; } return n.default = e, t && t.set(e, n), n; }
/*
Copyright 2024 New Vector Ltd.
Copyright 2021 Šimon Brandner <simon.bra.ag@gmail.com>
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
let LegacyCallEventGrouperEvent = exports.LegacyCallEventGrouperEvent = /*#__PURE__*/function (LegacyCallEventGrouperEvent) {
LegacyCallEventGrouperEvent["StateChanged"] = "state_changed";
LegacyCallEventGrouperEvent["SilencedChanged"] = "silenced_changed";
LegacyCallEventGrouperEvent["LengthChanged"] = "length_changed";
return LegacyCallEventGrouperEvent;
}({});
const CONNECTING_STATES = [_call.CallState.Connecting, _call.CallState.WaitLocalMedia, _call.CallState.CreateOffer, _call.CallState.CreateAnswer];
const SUPPORTED_STATES = [_call.CallState.Connected, _call.CallState.Ringing, _call.CallState.Ended];
const isCallEventType = eventType => eventType.startsWith("m.call.") || eventType.startsWith("org.matrix.call.");
const isCallEvent = event => isCallEventType(event.getType());
exports.isCallEvent = isCallEvent;
function buildLegacyCallEventGroupers(callEventGroupers, events) {
const newCallEventGroupers = new Map();
events?.forEach(ev => {
if (!isCallEvent(ev)) {
return;
}
const callId = ev.getContent().call_id;
if (!newCallEventGroupers.has(callId)) {
if (callEventGroupers.has(callId)) {
// reuse the LegacyCallEventGrouper object where possible
newCallEventGroupers.set(callId, callEventGroupers.get(callId));
} else {
newCallEventGroupers.set(callId, new LegacyCallEventGrouper());
}
}
newCallEventGroupers.get(callId).add(ev);
});
return newCallEventGroupers;
}
class LegacyCallEventGrouper extends _events.EventEmitter {
constructor() {
super();
(0, _defineProperty2.default)(this, "events", new Set());
(0, _defineProperty2.default)(this, "call", null);
(0, _defineProperty2.default)(this, "state", void 0);
(0, _defineProperty2.default)(this, "onSilencedCallsChanged", () => {
const newState = _LegacyCallHandler.default.instance.isCallSilenced(this.callId);
this.emit(LegacyCallEventGrouperEvent.SilencedChanged, newState);
});
(0, _defineProperty2.default)(this, "onLengthChanged", length => {
this.emit(LegacyCallEventGrouperEvent.LengthChanged, length);
});
(0, _defineProperty2.default)(this, "answerCall", () => {
const roomId = this.roomId;
if (!roomId) return;
_LegacyCallHandler.default.instance.answerCall(roomId);
});
(0, _defineProperty2.default)(this, "rejectCall", () => {
const roomId = this.roomId;
if (!roomId) return;
_LegacyCallHandler.default.instance.hangupOrReject(roomId, true);
});
(0, _defineProperty2.default)(this, "callBack", () => {
const roomId = this.roomId;
if (!roomId) return;
_LegacyCallHandler.default.instance.placeCall(roomId, this.isVoice ? _call.CallType.Voice : _call.CallType.Video);
});
(0, _defineProperty2.default)(this, "toggleSilenced", () => {
const silenced = _LegacyCallHandler.default.instance.isCallSilenced(this.callId);
silenced ? _LegacyCallHandler.default.instance.unSilenceCall(this.callId) : _LegacyCallHandler.default.instance.silenceCall(this.callId);
});
(0, _defineProperty2.default)(this, "setState", () => {
if (this.call && CONNECTING_STATES.includes(this.call.state)) {
this.state = _call.CallState.Connecting;
} else if (this.call && SUPPORTED_STATES.includes(this.call.state)) {
this.state = this.call.state;
} else {
if (this.reject) {
this.state = _call.CallState.Ended;
} else if (this.hangup) {
this.state = _call.CallState.Ended;
} else if (this.invite && this.call) {
this.state = _call.CallState.Connecting;
}
}
this.emit(LegacyCallEventGrouperEvent.StateChanged, this.state);
});
(0, _defineProperty2.default)(this, "setCall", () => {
const callId = this.callId;
if (!callId || this.call) return;
this.call = _LegacyCallHandler.default.instance.getCallById(callId);
this.setCallListeners();
this.setState();
});
_LegacyCallHandler.default.instance.addListener(_LegacyCallHandler.LegacyCallHandlerEvent.CallsChanged, this.setCall);
_LegacyCallHandler.default.instance.addListener(_LegacyCallHandler.LegacyCallHandlerEvent.SilencedCallsChanged, this.onSilencedCallsChanged);
}
get invite() {
return [...this.events].find(event => event.getType() === _matrix.EventType.CallInvite);
}
get hangup() {
return [...this.events].find(event => event.getType() === _matrix.EventType.CallHangup);
}
get reject() {
return [...this.events].find(event => event.getType() === _matrix.EventType.CallReject);
}
get selectAnswer() {
return [...this.events].find(event => event.getType() === _matrix.EventType.CallSelectAnswer);
}
get isVoice() {
const invite = this.invite;
if (!invite) return undefined;
// FIXME: Find a better way to determine this from the event?
if (invite.getContent()?.offer?.sdp?.indexOf("m=video") !== -1) return false;
return true;
}
get hangupReason() {
return this.call?.hangupReason ?? this.hangup?.getContent()?.reason ?? null;
}
get rejectParty() {
return this.reject?.getSender();
}
get gotRejected() {
return Boolean(this.reject);
}
get duration() {
if (!this.hangup?.getDate() || !this.selectAnswer?.getDate()) return null;
return this.hangup.getDate().getTime() - this.selectAnswer.getDate().getTime();
}
/**
* Returns true if there are only events from the other side - we missed the call
*/
get callWasMissed() {
return this.state === _call.CallState.Ended && ![...this.events].some(event => event.sender?.userId === _MatrixClientPeg.MatrixClientPeg.safeGet().getUserId());
}
get callId() {
return [...this.events][0]?.getContent()?.call_id;
}
get roomId() {
return [...this.events][0]?.getRoomId();
}
setCallListeners() {
if (!this.call) return;
this.call.addListener(_call.CallEvent.State, this.setState);
this.call.addListener(_call.CallEvent.LengthChanged, this.onLengthChanged);
}
add(event) {
if (this.events.has(event)) return; // nothing to do
this.events.add(event);
this.setCall();
}
}
exports.default = LegacyCallEventGrouper;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9jYWxsIiwiX2V2ZW50cyIsIl9MZWdhY3lDYWxsSGFuZGxlciIsIl9pbnRlcm9wUmVxdWlyZVdpbGRjYXJkIiwiX01hdHJpeENsaWVudFBlZyIsIl9nZXRSZXF1aXJlV2lsZGNhcmRDYWNoZSIsImUiLCJXZWFrTWFwIiwiciIsInQiLCJfX2VzTW9kdWxlIiwiZGVmYXVsdCIsImhhcyIsImdldCIsIm4iLCJfX3Byb3RvX18iLCJhIiwiT2JqZWN0IiwiZGVmaW5lUHJvcGVydHkiLCJnZXRPd25Qcm9wZXJ0eURlc2NyaXB0b3IiLCJ1IiwiaGFzT3duUHJvcGVydHkiLCJjYWxsIiwiaSIsInNldCIsIkxlZ2FjeUNhbGxFdmVudEdyb3VwZXJFdmVudCIsImV4cG9ydHMiLCJDT05ORUNUSU5HX1NUQVRFUyIsIkNhbGxTdGF0ZSIsIkNvbm5lY3RpbmciLCJXYWl0TG9jYWxNZWRpYSIsIkNyZWF0ZU9mZmVyIiwiQ3JlYXRlQW5zd2VyIiwiU1VQUE9SVEVEX1NUQVRFUyIsIkNvbm5lY3RlZCIsIlJpbmdpbmciLCJFbmRlZCIsImlzQ2FsbEV2ZW50VHlwZSIsImV2ZW50VHlwZSIsInN0YXJ0c1dpdGgiLCJpc0NhbGxFdmVudCIsImV2ZW50IiwiZ2V0VHlwZSIsImJ1aWxkTGVnYWN5Q2FsbEV2ZW50R3JvdXBlcnMiLCJjYWxsRXZlbnRHcm91cGVycyIsImV2ZW50cyIsIm5ld0NhbGxFdmVudEdyb3VwZXJzIiwiTWFwIiwiZm9yRWFjaCIsImV2IiwiY2FsbElkIiwiZ2V0Q29udGVudCIsImNhbGxfaWQiLCJMZWdhY3lDYWxsRXZlbnRHcm91cGVyIiwiYWRkIiwiRXZlbnRFbWl0dGVyIiwiY29uc3RydWN0b3IiLCJfZGVmaW5lUHJvcGVydHkyIiwiU2V0IiwibmV3U3RhdGUiLCJMZWdhY3lDYWxsSGFuZGxlciIsImluc3RhbmNlIiwiaXNDYWxsU2lsZW5jZWQiLCJlbWl0IiwiU2lsZW5jZWRDaGFuZ2VkIiwibGVuZ3RoIiwiTGVuZ3RoQ2hhbmdlZCIsInJvb21JZCIsImFuc3dlckNhbGwiLCJoYW5ndXBPclJlamVjdCIsInBsYWNlQ2FsbCIsImlzVm9pY2UiLCJDYWxsVHlwZSIsIlZvaWNlIiwiVmlkZW8iLCJzaWxlbmNlZCIsInVuU2lsZW5jZUNhbGwiLCJzaWxlbmNlQ2FsbCIsImluY2x1ZGVzIiwic3RhdGUiLCJyZWplY3QiLCJoYW5ndXAiLCJpbnZpdGUiLCJTdGF0ZUNoYW5nZWQiLCJnZXRDYWxsQnlJZCIsInNldENhbGxMaXN0ZW5lcnMiLCJzZXRTdGF0ZSIsImFkZExpc3RlbmVyIiwiTGVnYWN5Q2FsbEhhbmRsZXJFdmVudCIsIkNhbGxzQ2hhbmdlZCIsInNldENhbGwiLCJTaWxlbmNlZENhbGxzQ2hhbmdlZCIsIm9uU2lsZW5jZWRDYWxsc0NoYW5nZWQiLCJmaW5kIiwiRXZlbnRUeXBlIiwiQ2FsbEludml0ZSIsIkNhbGxIYW5ndXAiLCJDYWxsUmVqZWN0Iiwic2VsZWN0QW5zd2VyIiwiQ2FsbFNlbGVjdEFuc3dlciIsInVuZGVmaW5lZCIsIm9mZmVyIiwic2RwIiwiaW5kZXhPZiIsImhhbmd1cFJlYXNvbiIsInJlYXNvbiIsInJlamVjdFBhcnR5IiwiZ2V0U2VuZGVyIiwiZ290UmVqZWN0ZWQiLCJCb29sZWFuIiwiZHVyYXRpb24iLCJnZXREYXRlIiwiZ2V0VGltZSIsImNhbGxXYXNNaXNzZWQiLCJzb21lIiwic2VuZGVyIiwidXNlcklkIiwiTWF0cml4Q2xpZW50UGVnIiwic2FmZUdldCIsImdldFVzZXJJZCIsImdldFJvb21JZCIsIkNhbGxFdmVudCIsIlN0YXRlIiwib25MZW5ndGhDaGFuZ2VkIl0sInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL2NvbXBvbmVudHMvc3RydWN0dXJlcy9MZWdhY3lDYWxsRXZlbnRHcm91cGVyLnRzIl0sInNvdXJjZXNDb250ZW50IjpbIi8qXG5Db3B5cmlnaHQgMjAyNCBOZXcgVmVjdG9yIEx0ZC5cbkNvcHlyaWdodCAyMDIxIMWgaW1vbiBCcmFuZG5lciA8c2ltb24uYnJhLmFnQGdtYWlsLmNvbT5cblxuU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEFHUEwtMy4wLW9ubHkgT1IgR1BMLTMuMC1vbmx5XG5QbGVhc2Ugc2VlIExJQ0VOU0UgZmlsZXMgaW4gdGhlIHJlcG9zaXRvcnkgcm9vdCBmb3IgZnVsbCBkZXRhaWxzLlxuKi9cblxuaW1wb3J0IHsgRXZlbnRUeXBlLCBNYXRyaXhFdmVudCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9tYXRyaXhcIjtcbmltcG9ydCB7IENhbGxFdmVudCwgQ2FsbFN0YXRlLCBDYWxsVHlwZSwgTWF0cml4Q2FsbCB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy93ZWJydGMvY2FsbFwiO1xuaW1wb3J0IHsgRXZlbnRFbWl0dGVyIH0gZnJvbSBcImV2ZW50c1wiO1xuXG5pbXBvcnQgTGVnYWN5Q2FsbEhhbmRsZXIsIHsgTGVnYWN5Q2FsbEhhbmRsZXJFdmVudCB9IGZyb20gXCIuLi8uLi9MZWdhY3lDYWxsSGFuZGxlclwiO1xuaW1wb3J0IHsgTWF0cml4Q2xpZW50UGVnIH0gZnJvbSBcIi4uLy4uL01hdHJpeENsaWVudFBlZ1wiO1xuXG5leHBvcnQgZW51bSBMZWdhY3lDYWxsRXZlbnRHcm91cGVyRXZlbnQge1xuICAgIFN0YXRlQ2hhbmdlZCA9IFwic3RhdGVfY2hhbmdlZFwiLFxuICAgIFNpbGVuY2VkQ2hhbmdlZCA9IFwic2lsZW5jZWRfY2hhbmdlZFwiLFxuICAgIExlbmd0aENoYW5nZWQgPSBcImxlbmd0aF9jaGFuZ2VkXCIsXG59XG5cbmNvbnN0IENPTk5FQ1RJTkdfU1RBVEVTID0gW1xuICAgIENhbGxTdGF0ZS5Db25uZWN0aW5nLFxuICAgIENhbGxTdGF0ZS5XYWl0TG9jYWxNZWRpYSxcbiAgICBDYWxsU3RhdGUuQ3JlYXRlT2ZmZXIsXG4gICAgQ2FsbFN0YXRlLkNyZWF0ZUFuc3dlcixcbl07XG5cbmNvbnN0IFNVUFBPUlRFRF9TVEFURVMgPSBbQ2FsbFN0YXRlLkNvbm5lY3RlZCwgQ2FsbFN0YXRlLlJpbmdpbmcsIENhbGxTdGF0ZS5FbmRlZF07XG5cbmNvbnN0IGlzQ2FsbEV2ZW50VHlwZSA9IChldmVudFR5cGU6IHN0cmluZyk6IGJvb2xlYW4gPT5cbiAgICBldmVudFR5cGUuc3RhcnRzV2l0aChcIm0uY2FsbC5cIikgfHwgZXZlbnRUeXBlLnN0YXJ0c1dpdGgoXCJvcmcubWF0cml4LmNhbGwuXCIpO1xuXG5leHBvcnQgY29uc3QgaXNDYWxsRXZlbnQgPSAoZXZlbnQ6IE1hdHJpeEV2ZW50KTogYm9vbGVhbiA9PiBpc0NhbGxFdmVudFR5cGUoZXZlbnQuZ2V0VHlwZSgpKTtcblxuZXhwb3J0IGZ1bmN0aW9uIGJ1aWxkTGVnYWN5Q2FsbEV2ZW50R3JvdXBlcnMoXG4gICAgY2FsbEV2ZW50R3JvdXBlcnM6IE1hcDxzdHJpbmcsIExlZ2FjeUNhbGxFdmVudEdyb3VwZXI+LFxuICAgIGV2ZW50cz86IE1hdHJpeEV2ZW50W10sXG4pOiBNYXA8c3RyaW5nLCBMZWdhY3lDYWxsRXZlbnRHcm91cGVyPiB7XG4gICAgY29uc3QgbmV3Q2FsbEV2ZW50R3JvdXBlcnMgPSBuZXcgTWFwKCk7XG4gICAgZXZlbnRzPy5mb3JFYWNoKChldikgPT4ge1xuICAgICAgICBpZiAoIWlzQ2FsbEV2ZW50KGV2KSkge1xuICAgICAgICAgICAgcmV0dXJuO1xuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgY2FsbElkID0gZXYuZ2V0Q29udGVudCgpLmNhbGxfaWQ7XG4gICAgICAgIGlmICghbmV3Q2FsbEV2ZW50R3JvdXBlcnMuaGFzKGNhbGxJZCkpIHtcbiAgICAgICAgICAgIGlmIChjYWxsRXZlbnRHcm91cGVycy5oYXMoY2FsbElkKSkge1xuICAgICAgICAgICAgICAgIC8vIHJldXNlIHRoZSBMZWdhY3lDYWxsRXZlbnRHcm91cGVyIG9iamVjdCB3aGVyZSBwb3NzaWJsZVxuICAgICAgICAgICAgICAgIG5ld0NhbGxFdmVudEdyb3VwZXJzLnNldChjYWxsSWQsIGNhbGxFdmVudEdyb3VwZXJzLmdldChjYWxsSWQpKTtcbiAgICAgICAgICAgIH0gZWxzZSB7XG4gICAgICAgICAgICAgICAgbmV3Q2FsbEV2ZW50R3JvdXBlcnMuc2V0KGNhbGxJZCwgbmV3IExlZ2FjeUNhbGxFdmVudEdyb3VwZXIoKSk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cbiAgICAgICAgbmV3Q2FsbEV2ZW50R3JvdXBlcnMuZ2V0KGNhbGxJZCkuYWRkKGV2KTtcbiAgICB9KTtcbiAgICByZXR1cm4gbmV3Q2FsbEV2ZW50R3JvdXBlcnM7XG59XG5cbmV4cG9ydCBkZWZhdWx0IGNsYXNzIExlZ2FjeUNhbGxFdmVudEdyb3VwZXIgZXh0ZW5kcyBFdmVudEVtaXR0ZXIge1xuICAgIHByaXZhdGUgZXZlbnRzOiBTZXQ8TWF0cml4RXZlbnQ+ID0gbmV3IFNldDxNYXRyaXhFdmVudD4oKTtcbiAgICBwcml2YXRlIGNhbGw6IE1hdHJpeENhbGwgfCBudWxsID0gbnVsbDtcbiAgICBwdWJsaWMgc3RhdGU/OiBDYWxsU3RhdGU7XG5cbiAgICBwdWJsaWMgY29uc3RydWN0b3IoKSB7XG4gICAgICAgIHN1cGVyKCk7XG5cbiAgICAgICAgTGVnYWN5Q2FsbEhhbmRsZXIuaW5zdGFuY2UuYWRkTGlzdGVuZXIoTGVnYWN5Q2FsbEhhbmRsZXJFdmVudC5DYWxsc0NoYW5nZWQsIHRoaXMuc2V0Q2FsbCk7XG4gICAgICAgIExlZ2FjeUNhbGxIYW5kbGVyLmluc3RhbmNlLmFkZExpc3RlbmVyKFxuICAgICAgICAgICAgTGVnYWN5Q2FsbEhhbmRsZXJFdmVudC5TaWxlbmNlZENhbGxzQ2hhbmdlZCxcbiAgICAgICAgICAgIHRoaXMub25TaWxlbmNlZENhbGxzQ2hhbmdlZCxcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBpbnZpdGUoKTogTWF0cml4RXZlbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuZXZlbnRzXS5maW5kKChldmVudCkgPT4gZXZlbnQuZ2V0VHlwZSgpID09PSBFdmVudFR5cGUuQ2FsbEludml0ZSk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBnZXQgaGFuZ3VwKCk6IE1hdHJpeEV2ZW50IHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmV2ZW50c10uZmluZCgoZXZlbnQpID0+IGV2ZW50LmdldFR5cGUoKSA9PT0gRXZlbnRUeXBlLkNhbGxIYW5ndXApO1xuICAgIH1cblxuICAgIHByaXZhdGUgZ2V0IHJlamVjdCgpOiBNYXRyaXhFdmVudCB8IHVuZGVmaW5lZCB7XG4gICAgICAgIHJldHVybiBbLi4udGhpcy5ldmVudHNdLmZpbmQoKGV2ZW50KSA9PiBldmVudC5nZXRUeXBlKCkgPT09IEV2ZW50VHlwZS5DYWxsUmVqZWN0KTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBzZWxlY3RBbnN3ZXIoKTogTWF0cml4RXZlbnQgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gWy4uLnRoaXMuZXZlbnRzXS5maW5kKChldmVudCkgPT4gZXZlbnQuZ2V0VHlwZSgpID09PSBFdmVudFR5cGUuQ2FsbFNlbGVjdEFuc3dlcik7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBpc1ZvaWNlKCk6IGJvb2xlYW4gfCB1bmRlZmluZWQge1xuICAgICAgICBjb25zdCBpbnZpdGUgPSB0aGlzLmludml0ZTtcbiAgICAgICAgaWYgKCFpbnZpdGUpIHJldHVybiB1bmRlZmluZWQ7XG5cbiAgICAgICAgLy8gRklYTUU6IEZpbmQgYSBiZXR0ZXIgd2F5IHRvIGRldGVybWluZSB0aGlzIGZyb20gdGhlIGV2ZW50P1xuICAgICAgICBpZiAoaW52aXRlLmdldENvbnRlbnQoKT8ub2ZmZXI/LnNkcD8uaW5kZXhPZihcIm09dmlkZW9cIikgIT09IC0xKSByZXR1cm4gZmFsc2U7XG4gICAgICAgIHJldHVybiB0cnVlO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgaGFuZ3VwUmVhc29uKCk6IHN0cmluZyB8IG51bGwge1xuICAgICAgICByZXR1cm4gdGhpcy5jYWxsPy5oYW5ndXBSZWFzb24gPz8gdGhpcy5oYW5ndXA/LmdldENvbnRlbnQoKT8ucmVhc29uID8/IG51bGw7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCByZWplY3RQYXJ0eSgpOiBzdHJpbmcgfCB1bmRlZmluZWQge1xuICAgICAgICByZXR1cm4gdGhpcy5yZWplY3Q/LmdldFNlbmRlcigpO1xuICAgIH1cblxuICAgIHB1YmxpYyBnZXQgZ290UmVqZWN0ZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiBCb29sZWFuKHRoaXMucmVqZWN0KTtcbiAgICB9XG5cbiAgICBwdWJsaWMgZ2V0IGR1cmF0aW9uKCk6IG51bWJlciB8IG51bGwge1xuICAgICAgICBpZiAoIXRoaXMuaGFuZ3VwPy5nZXREYXRlKCkgfHwgIXRoaXMuc2VsZWN0QW5zd2VyPy5nZXREYXRlKCkpIHJldHVybiBudWxsO1xuICAgICAgICByZXR1cm4gdGhpcy5oYW5ndXAuZ2V0RGF0ZSgpIS5nZXRUaW1lKCkgLSB0aGlzLnNlbGVjdEFuc3dlci5nZXREYXRlKCkhLmdldFRpbWUoKTtcbiAgICB9XG5cbiAgICAvKipcbiAgICAgKiBSZXR1cm5zIHRydWUgaWYgdGhlcmUgYXJlIG9ubHkgZXZlbnRzIGZyb20gdGhlIG90aGVyIHNpZGUgLSB3ZSBtaXNzZWQgdGhlIGNhbGxcbiAgICAgKi9cbiAgICBwdWJsaWMgZ2V0IGNhbGxXYXNNaXNzZWQoKTogYm9vbGVhbiB7XG4gICAgICAgIHJldHVybiAoXG4gICAgICAgICAgICB0aGlzLnN0YXRlID09PSBDYWxsU3RhdGUuRW5kZWQgJiZcbiAgICAgICAgICAgICFbLi4udGhpcy5ldmVudHNdLnNvbWUoKGV2ZW50KSA9PiBldmVudC5zZW5kZXI/LnVzZXJJZCA9PT0gTWF0cml4Q2xpZW50UGVnLnNhZmVHZXQoKS5nZXRVc2VySWQoKSlcbiAgICAgICAgKTtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCBjYWxsSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmV2ZW50c11bMF0/LmdldENvbnRlbnQoKT8uY2FsbF9pZDtcbiAgICB9XG5cbiAgICBwcml2YXRlIGdldCByb29tSWQoKTogc3RyaW5nIHwgdW5kZWZpbmVkIHtcbiAgICAgICAgcmV0dXJuIFsuLi50aGlzLmV2ZW50c11bMF0/LmdldFJvb21JZCgpO1xuICAgIH1cblxuICAgIHByaXZhdGUgb25TaWxlbmNlZENhbGxzQ2hhbmdlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3QgbmV3U3RhdGUgPSBMZWdhY3lDYWxsSGFuZGxlci5pbnN0YW5jZS5pc0NhbGxTaWxlbmNlZCh0aGlzLmNhbGxJZCk7XG4gICAgICAgIHRoaXMuZW1pdChMZWdhY3lDYWxsRXZlbnRHcm91cGVyRXZlbnQuU2lsZW5jZWRDaGFuZ2VkLCBuZXdTdGF0ZSk7XG4gICAgfTtcblxuICAgIHByaXZhdGUgb25MZW5ndGhDaGFuZ2VkID0gKGxlbmd0aDogbnVtYmVyKTogdm9pZCA9PiB7XG4gICAgICAgIHRoaXMuZW1pdChMZWdhY3lDYWxsRXZlbnRHcm91cGVyRXZlbnQuTGVuZ3RoQ2hhbmdlZCwgbGVuZ3RoKTtcbiAgICB9O1xuXG4gICAgcHVibGljIGFuc3dlckNhbGwgPSAoKTogdm9pZCA9PiB7XG4gICAgICAgIGNvbnN0IHJvb21JZCA9IHRoaXMucm9vbUlkO1xuICAgICAgICBpZiAoIXJvb21JZCkgcmV0dXJuO1xuICAgICAgICBMZWdhY3lDYWxsSGFuZGxlci5pbnN0YW5jZS5hbnN3ZXJDYWxsKHJvb21JZCk7XG4gICAgfTtcblxuICAgIHB1YmxpYyByZWplY3RDYWxsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCByb29tSWQgPSB0aGlzLnJvb21JZDtcbiAgICAgICAgaWYgKCFyb29tSWQpIHJldHVybjtcbiAgICAgICAgTGVnYWN5Q2FsbEhhbmRsZXIuaW5zdGFuY2UuaGFuZ3VwT3JSZWplY3Qocm9vbUlkLCB0cnVlKTtcbiAgICB9O1xuXG4gICAgcHVibGljIGNhbGxCYWNrID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCByb29tSWQgPSB0aGlzLnJvb21JZDtcbiAgICAgICAgaWYgKCFyb29tSWQpIHJldHVybjtcbiAgICAgICAgTGVnYWN5Q2FsbEhhbmRsZXIuaW5zdGFuY2UucGxhY2VDYWxsKHJvb21JZCwgdGhpcy5pc1ZvaWNlID8gQ2FsbFR5cGUuVm9pY2UgOiBDYWxsVHlwZS5WaWRlbyk7XG4gICAgfTtcblxuICAgIHB1YmxpYyB0b2dnbGVTaWxlbmNlZCA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgY29uc3Qgc2lsZW5jZWQgPSBMZWdhY3lDYWxsSGFuZGxlci5pbnN0YW5jZS5pc0NhbGxTaWxlbmNlZCh0aGlzLmNhbGxJZCk7XG4gICAgICAgIHNpbGVuY2VkXG4gICAgICAgICAgICA/IExlZ2FjeUNhbGxIYW5kbGVyLmluc3RhbmNlLnVuU2lsZW5jZUNhbGwodGhpcy5jYWxsSWQpXG4gICAgICAgICAgICA6IExlZ2FjeUNhbGxIYW5kbGVyLmluc3RhbmNlLnNpbGVuY2VDYWxsKHRoaXMuY2FsbElkKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRDYWxsTGlzdGVuZXJzKCk6IHZvaWQge1xuICAgICAgICBpZiAoIXRoaXMuY2FsbCkgcmV0dXJuO1xuICAgICAgICB0aGlzLmNhbGwuYWRkTGlzdGVuZXIoQ2FsbEV2ZW50LlN0YXRlLCB0aGlzLnNldFN0YXRlKTtcbiAgICAgICAgdGhpcy5jYWxsLmFkZExpc3RlbmVyKENhbGxFdmVudC5MZW5ndGhDaGFuZ2VkLCB0aGlzLm9uTGVuZ3RoQ2hhbmdlZCk7XG4gICAgfVxuXG4gICAgcHJpdmF0ZSBzZXRTdGF0ZSA9ICgpOiB2b2lkID0+IHtcbiAgICAgICAgaWYgKHRoaXMuY2FsbCAmJiBDT05ORUNUSU5HX1NUQVRFUy5pbmNsdWRlcyh0aGlzLmNhbGwuc3RhdGUpKSB7XG4gICAgICAgICAgICB0aGlzLnN0YXRlID0gQ2FsbFN0YXRlLkNvbm5lY3Rpbmc7XG4gICAgICAgIH0gZWxzZSBpZiAodGhpcy5jYWxsICYmIFNVUFBPUlRFRF9TVEFURVMuaW5jbHVkZXModGhpcy5jYWxsLnN0YXRlKSkge1xuICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IHRoaXMuY2FsbC5zdGF0ZTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIGlmICh0aGlzLnJlamVjdCkge1xuICAgICAgICAgICAgICAgIHRoaXMuc3RhdGUgPSBDYWxsU3RhdGUuRW5kZWQ7XG4gICAgICAgICAgICB9IGVsc2UgaWYgKHRoaXMuaGFuZ3VwKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENhbGxTdGF0ZS5FbmRlZDtcbiAgICAgICAgICAgIH0gZWxzZSBpZiAodGhpcy5pbnZpdGUgJiYgdGhpcy5jYWxsKSB7XG4gICAgICAgICAgICAgICAgdGhpcy5zdGF0ZSA9IENhbGxTdGF0ZS5Db25uZWN0aW5nO1xuICAgICAgICAgICAgfVxuICAgICAgICB9XG4gICAgICAgIHRoaXMuZW1pdChMZWdhY3lDYWxsRXZlbnRHcm91cGVyRXZlbnQuU3RhdGVDaGFuZ2VkLCB0aGlzLnN0YXRlKTtcbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBzZXRDYWxsID0gKCk6IHZvaWQgPT4ge1xuICAgICAgICBjb25zdCBjYWxsSWQgPSB0aGlzLmNhbGxJZDtcbiAgICAgICAgaWYgKCFjYWxsSWQgfHwgdGhpcy5jYWxsKSByZXR1cm47XG5cbiAgICAgICAgdGhpcy5jYWxsID0gTGVnYWN5Q2FsbEhhbmRsZXIuaW5zdGFuY2UuZ2V0Q2FsbEJ5SWQoY2FsbElkKTtcbiAgICAgICAgdGhpcy5zZXRDYWxsTGlzdGVuZXJzKCk7XG4gICAgICAgIHRoaXMuc2V0U3RhdGUoKTtcbiAgICB9O1xuXG4gICAgcHVibGljIGFkZChldmVudDogTWF0cml4RXZlbnQpOiB2b2lkIHtcbiAgICAgICAgaWYgKHRoaXMuZXZlbnRzLmhhcyhldmVudCkpIHJldHVybjsgLy8gbm90aGluZyB0byBkb1xuICAgICAgICB0aGlzLmV2ZW50cy5hZGQoZXZlbnQpO1xuICAgICAgICB0aGlzLnNldENhbGwoKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFRQSxJQUFBQSxP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