2087 lines
97 KiB
JavaScript
2087 lines
97 KiB
JavaScript
"use strict";
|
|
|
|
Object.defineProperty(exports, "__esModule", {
|
|
value: true
|
|
});
|
|
exports.ClientWidgetApi = void 0;
|
|
var _events = require("events");
|
|
var _PostmessageTransport = require("./transport/PostmessageTransport");
|
|
var _WidgetApiDirection = require("./interfaces/WidgetApiDirection");
|
|
var _WidgetApiAction = require("./interfaces/WidgetApiAction");
|
|
var _Capabilities = require("./interfaces/Capabilities");
|
|
var _ApiVersion = require("./interfaces/ApiVersion");
|
|
var _WidgetEventCapability = require("./models/WidgetEventCapability");
|
|
var _GetOpenIDAction = require("./interfaces/GetOpenIDAction");
|
|
var _SimpleObservable = require("./util/SimpleObservable");
|
|
var _Symbols = require("./Symbols");
|
|
var _UpdateDelayedEventAction = require("./interfaces/UpdateDelayedEventAction");
|
|
function _typeof(o) { "@babel/helpers - typeof"; return _typeof = "function" == typeof Symbol && "symbol" == typeof Symbol.iterator ? function (o) { return typeof o; } : function (o) { return o && "function" == typeof Symbol && o.constructor === Symbol && o !== Symbol.prototype ? "symbol" : typeof o; }, _typeof(o); }
|
|
function ownKeys(e, r) { var t = Object.keys(e); if (Object.getOwnPropertySymbols) { var o = Object.getOwnPropertySymbols(e); r && (o = o.filter(function (r) { return Object.getOwnPropertyDescriptor(e, r).enumerable; })), t.push.apply(t, o); } return t; }
|
|
function _objectSpread(e) { for (var r = 1; r < arguments.length; r++) { var t = null != arguments[r] ? arguments[r] : {}; r % 2 ? ownKeys(Object(t), !0).forEach(function (r) { _defineProperty(e, r, t[r]); }) : Object.getOwnPropertyDescriptors ? Object.defineProperties(e, Object.getOwnPropertyDescriptors(t)) : ownKeys(Object(t)).forEach(function (r) { Object.defineProperty(e, r, Object.getOwnPropertyDescriptor(t, r)); }); } return e; }
|
|
function _createForOfIteratorHelper(r, e) { var t = "undefined" != typeof Symbol && r[Symbol.iterator] || r["@@iterator"]; if (!t) { if (Array.isArray(r) || (t = _unsupportedIterableToArray(r)) || e && r && "number" == typeof r.length) { t && (r = t); var _n = 0, F = function F() {}; return { s: F, n: function n() { return _n >= r.length ? { done: !0 } : { done: !1, value: r[_n++] }; }, e: function e(r) { throw r; }, f: F }; } throw new TypeError("Invalid attempt to iterate non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); } var o, a = !0, u = !1; return { s: function s() { t = t.call(r); }, n: function n() { var r = t.next(); return a = r.done, r; }, e: function e(r) { u = !0, o = r; }, f: function f() { try { a || null == t["return"] || t["return"](); } finally { if (u) throw o; } } }; }
|
|
function _toConsumableArray(r) { return _arrayWithoutHoles(r) || _iterableToArray(r) || _unsupportedIterableToArray(r) || _nonIterableSpread(); }
|
|
function _nonIterableSpread() { throw new TypeError("Invalid attempt to spread non-iterable instance.\nIn order to be iterable, non-array objects must have a [Symbol.iterator]() method."); }
|
|
function _unsupportedIterableToArray(r, a) { if (r) { if ("string" == typeof r) return _arrayLikeToArray(r, a); var t = {}.toString.call(r).slice(8, -1); return "Object" === t && r.constructor && (t = r.constructor.name), "Map" === t || "Set" === t ? Array.from(r) : "Arguments" === t || /^(?:Ui|I)nt(?:8|16|32)(?:Clamped)?Array$/.test(t) ? _arrayLikeToArray(r, a) : void 0; } }
|
|
function _iterableToArray(r) { if ("undefined" != typeof Symbol && null != r[Symbol.iterator] || null != r["@@iterator"]) return Array.from(r); }
|
|
function _arrayWithoutHoles(r) { if (Array.isArray(r)) return _arrayLikeToArray(r); }
|
|
function _arrayLikeToArray(r, a) { (null == a || a > r.length) && (a = r.length); for (var e = 0, n = Array(a); e < a; e++) n[e] = r[e]; return n; }
|
|
function _regeneratorRuntime() { "use strict"; var r = _regenerator(), e = r.m(_regeneratorRuntime), t = (Object.getPrototypeOf ? Object.getPrototypeOf(e) : e.__proto__).constructor; function n(r) { var e = "function" == typeof r && r.constructor; return !!e && (e === t || "GeneratorFunction" === (e.displayName || e.name)); } var o = { "throw": 1, "return": 2, "break": 3, "continue": 3 }; function a(r) { var e, t; return function (n) { e || (e = { stop: function stop() { return t(n.a, 2); }, "catch": function _catch() { return n.v; }, abrupt: function abrupt(r, e) { return t(n.a, o[r], e); }, delegateYield: function delegateYield(r, o, a) { return e.resultName = o, t(n.d, _regeneratorValues(r), a); }, finish: function finish(r) { return t(n.f, r); } }, t = function t(r, _t, o) { n.p = e.prev, n.n = e.next; try { return r(_t, o); } finally { e.next = n.n; } }), e.resultName && (e[e.resultName] = n.v, e.resultName = void 0), e.sent = n.v, e.next = n.n; try { return r.call(this, e); } finally { n.p = e.prev, n.n = e.next; } }; } return (_regeneratorRuntime = function _regeneratorRuntime() { return { wrap: function wrap(e, t, n, o) { return r.w(a(e), t, n, o && o.reverse()); }, isGeneratorFunction: n, mark: r.m, awrap: function awrap(r, e) { return new _OverloadYield(r, e); }, AsyncIterator: _regeneratorAsyncIterator, async: function async(r, e, t, o, u) { return (n(e) ? _regeneratorAsyncGen : _regeneratorAsync)(a(r), e, t, o, u); }, keys: _regeneratorKeys, values: _regeneratorValues }; })(); }
|
|
function _regeneratorValues(e) { if (null != e) { var t = e["function" == typeof Symbol && Symbol.iterator || "@@iterator"], r = 0; if (t) return t.call(e); if ("function" == typeof e.next) return e; if (!isNaN(e.length)) return { next: function next() { return e && r >= e.length && (e = void 0), { value: e && e[r++], done: !e }; } }; } throw new TypeError(_typeof(e) + " is not iterable"); }
|
|
function _regeneratorKeys(e) { var n = Object(e), r = []; for (var t in n) r.unshift(t); return function e() { for (; r.length;) if ((t = r.pop()) in n) return e.value = t, e.done = !1, e; return e.done = !0, e; }; }
|
|
function _regeneratorAsync(n, e, r, t, o) { var a = _regeneratorAsyncGen(n, e, r, t, o); return a.next().then(function (n) { return n.done ? n.value : a.next(); }); }
|
|
function _regeneratorAsyncGen(r, e, t, o, n) { return new _regeneratorAsyncIterator(_regenerator().w(r, e, t, o), n || Promise); }
|
|
function _regeneratorAsyncIterator(t, e) { function n(r, o, i, f) { try { var c = t[r](o), u = c.value; return u instanceof _OverloadYield ? e.resolve(u.v).then(function (t) { n("next", t, i, f); }, function (t) { n("throw", t, i, f); }) : e.resolve(u).then(function (t) { c.value = t, i(c); }, function (t) { return n("throw", t, i, f); }); } catch (t) { f(t); } } var r; this.next || (_regeneratorDefine2(_regeneratorAsyncIterator.prototype), _regeneratorDefine2(_regeneratorAsyncIterator.prototype, "function" == typeof Symbol && Symbol.asyncIterator || "@asyncIterator", function () { return this; })), _regeneratorDefine2(this, "_invoke", function (t, o, i) { function f() { return new e(function (e, r) { n(t, i, e, r); }); } return r = r ? r.then(f, f) : f(); }, !0); }
|
|
function _regenerator() { /*! regenerator-runtime -- Copyright (c) 2014-present, Facebook, Inc. -- license (MIT): https://github.com/babel/babel/blob/main/packages/babel-helpers/LICENSE */ var e, t, r = "function" == typeof Symbol ? Symbol : {}, n = r.iterator || "@@iterator", o = r.toStringTag || "@@toStringTag"; function i(r, n, o, i) { var c = n && n.prototype instanceof Generator ? n : Generator, u = Object.create(c.prototype); return _regeneratorDefine2(u, "_invoke", function (r, n, o) { var i, c, u, f = 0, p = o || [], y = !1, G = { p: 0, n: 0, v: e, a: d, f: d.bind(e, 4), d: function d(t, r) { return i = t, c = 0, u = e, G.n = r, a; } }; function d(r, n) { for (c = r, u = n, t = 0; !y && f && !o && t < p.length; t++) { var o, i = p[t], d = G.p, l = i[2]; r > 3 ? (o = l === n) && (u = i[(c = i[4]) ? 5 : (c = 3, 3)], i[4] = i[5] = e) : i[0] <= d && ((o = r < 2 && d < i[1]) ? (c = 0, G.v = n, G.n = i[1]) : d < l && (o = r < 3 || i[0] > n || n > l) && (i[4] = r, i[5] = n, G.n = l, c = 0)); } if (o || r > 1) return a; throw y = !0, n; } return function (o, p, l) { if (f > 1) throw TypeError("Generator is already running"); for (y && 1 === p && d(p, l), c = p, u = l; (t = c < 2 ? e : u) || !y;) { i || (c ? c < 3 ? (c > 1 && (G.n = -1), d(c, u)) : G.n = u : G.v = u); try { if (f = 2, i) { if (c || (o = "next"), t = i[o]) { if (!(t = t.call(i, u))) throw TypeError("iterator result is not an object"); if (!t.done) return t; u = t.value, c < 2 && (c = 0); } else 1 === c && (t = i["return"]) && t.call(i), c < 2 && (u = TypeError("The iterator does not provide a '" + o + "' method"), c = 1); i = e; } else if ((t = (y = G.n < 0) ? u : r.call(n, G)) !== a) break; } catch (t) { i = e, c = 1, u = t; } finally { f = 1; } } return { value: t, done: y }; }; }(r, o, i), !0), u; } var a = {}; function Generator() {} function GeneratorFunction() {} function GeneratorFunctionPrototype() {} t = Object.getPrototypeOf; var c = [][n] ? t(t([][n]())) : (_regeneratorDefine2(t = {}, n, function () { return this; }), t), u = GeneratorFunctionPrototype.prototype = Generator.prototype = Object.create(c); function f(e) { return Object.setPrototypeOf ? Object.setPrototypeOf(e, GeneratorFunctionPrototype) : (e.__proto__ = GeneratorFunctionPrototype, _regeneratorDefine2(e, o, "GeneratorFunction")), e.prototype = Object.create(u), e; } return GeneratorFunction.prototype = GeneratorFunctionPrototype, _regeneratorDefine2(u, "constructor", GeneratorFunctionPrototype), _regeneratorDefine2(GeneratorFunctionPrototype, "constructor", GeneratorFunction), GeneratorFunction.displayName = "GeneratorFunction", _regeneratorDefine2(GeneratorFunctionPrototype, o, "GeneratorFunction"), _regeneratorDefine2(u), _regeneratorDefine2(u, o, "Generator"), _regeneratorDefine2(u, n, function () { return this; }), _regeneratorDefine2(u, "toString", function () { return "[object Generator]"; }), (_regenerator = function _regenerator() { return { w: i, m: f }; })(); }
|
|
function _regeneratorDefine2(e, r, n, t) { var i = Object.defineProperty; try { i({}, "", {}); } catch (e) { i = 0; } _regeneratorDefine2 = function _regeneratorDefine(e, r, n, t) { function o(r, n) { _regeneratorDefine2(e, r, function (e) { return this._invoke(r, n, e); }); } r ? i ? i(e, r, { value: n, enumerable: !t, configurable: !t, writable: !t }) : e[r] = n : (o("next", 0), o("throw", 1), o("return", 2)); }, _regeneratorDefine2(e, r, n, t); }
|
|
function _OverloadYield(e, d) { this.v = e, this.k = d; }
|
|
function asyncGeneratorStep(n, t, e, r, o, a, c) { try { var i = n[a](c), u = i.value; } catch (n) { return void e(n); } i.done ? t(u) : Promise.resolve(u).then(r, o); }
|
|
function _asyncToGenerator(n) { return function () { var t = this, e = arguments; return new Promise(function (r, o) { var a = n.apply(t, e); function _next(n) { asyncGeneratorStep(a, r, o, _next, _throw, "next", n); } function _throw(n) { asyncGeneratorStep(a, r, o, _next, _throw, "throw", n); } _next(void 0); }); }; }
|
|
function _classCallCheck(a, n) { if (!(a instanceof n)) throw new TypeError("Cannot call a class as a function"); }
|
|
function _defineProperties(e, r) { for (var t = 0; t < r.length; t++) { var o = r[t]; o.enumerable = o.enumerable || !1, o.configurable = !0, "value" in o && (o.writable = !0), Object.defineProperty(e, _toPropertyKey(o.key), o); } }
|
|
function _createClass(e, r, t) { return r && _defineProperties(e.prototype, r), t && _defineProperties(e, t), Object.defineProperty(e, "prototype", { writable: !1 }), e; }
|
|
function _inherits(t, e) { if ("function" != typeof e && null !== e) throw new TypeError("Super expression must either be null or a function"); t.prototype = Object.create(e && e.prototype, { constructor: { value: t, writable: !0, configurable: !0 } }), Object.defineProperty(t, "prototype", { writable: !1 }), e && _setPrototypeOf(t, e); }
|
|
function _setPrototypeOf(t, e) { return _setPrototypeOf = Object.setPrototypeOf ? Object.setPrototypeOf.bind() : function (t, e) { return t.__proto__ = e, t; }, _setPrototypeOf(t, e); }
|
|
function _createSuper(t) { var r = _isNativeReflectConstruct(); return function () { var e, o = _getPrototypeOf(t); if (r) { var s = _getPrototypeOf(this).constructor; e = Reflect.construct(o, arguments, s); } else e = o.apply(this, arguments); return _possibleConstructorReturn(this, e); }; }
|
|
function _possibleConstructorReturn(t, e) { if (e && ("object" == _typeof(e) || "function" == typeof e)) return e; if (void 0 !== e) throw new TypeError("Derived constructors may only return object or undefined"); return _assertThisInitialized(t); }
|
|
function _assertThisInitialized(e) { if (void 0 === e) throw new ReferenceError("this hasn't been initialised - super() hasn't been called"); return e; }
|
|
function _isNativeReflectConstruct() { try { var t = !Boolean.prototype.valueOf.call(Reflect.construct(Boolean, [], function () {})); } catch (t) {} return (_isNativeReflectConstruct = function _isNativeReflectConstruct() { return !!t; })(); }
|
|
function _getPrototypeOf(t) { return _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf.bind() : function (t) { return t.__proto__ || Object.getPrototypeOf(t); }, _getPrototypeOf(t); }
|
|
function _defineProperty(e, r, t) { return (r = _toPropertyKey(r)) in e ? Object.defineProperty(e, r, { value: t, enumerable: !0, configurable: !0, writable: !0 }) : e[r] = t, e; }
|
|
function _toPropertyKey(t) { var i = _toPrimitive(t, "string"); return "symbol" == _typeof(i) ? i : i + ""; }
|
|
function _toPrimitive(t, r) { if ("object" != _typeof(t) || !t) return t; var e = t[Symbol.toPrimitive]; if (void 0 !== e) { var i = e.call(t, r || "default"); if ("object" != _typeof(i)) return i; throw new TypeError("@@toPrimitive must return a primitive value."); } return ("string" === r ? String : Number)(t); }
|
|
function _asyncIterator(r) { var n, t, o, e = 2; for ("undefined" != typeof Symbol && (t = Symbol.asyncIterator, o = Symbol.iterator); e--;) { if (t && null != (n = r[t])) return n.call(r); if (o && null != (n = r[o])) return new AsyncFromSyncIterator(n.call(r)); t = "@@asyncIterator", o = "@@iterator"; } throw new TypeError("Object is not async iterable"); }
|
|
function AsyncFromSyncIterator(r) { function AsyncFromSyncIteratorContinuation(r) { if (Object(r) !== r) return Promise.reject(new TypeError(r + " is not an object.")); var n = r.done; return Promise.resolve(r.value).then(function (r) { return { value: r, done: n }; }); } return AsyncFromSyncIterator = function AsyncFromSyncIterator(r) { this.s = r, this.n = r.next; }, AsyncFromSyncIterator.prototype = { s: null, n: null, next: function next() { return AsyncFromSyncIteratorContinuation(this.n.apply(this.s, arguments)); }, "return": function _return(r) { var n = this.s["return"]; return void 0 === n ? Promise.resolve({ value: r, done: !0 }) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); }, "throw": function _throw(r) { var n = this.s["return"]; return void 0 === n ? Promise.reject(r) : AsyncFromSyncIteratorContinuation(n.apply(this.s, arguments)); } }, new AsyncFromSyncIterator(r); } /*
|
|
* Copyright 2020 - 2024 The Matrix.org Foundation C.I.C.
|
|
*
|
|
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
* you may not use this file except in compliance with the License.
|
|
* You may obtain a copy of the License at
|
|
*
|
|
* http://www.apache.org/licenses/LICENSE-2.0
|
|
*
|
|
* Unless required by applicable law or agreed to in writing, software
|
|
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
* See the License for the specific language governing permissions and
|
|
* limitations under the License.
|
|
*/
|
|
/**
|
|
* API handler for the client side of widgets. This raises events
|
|
* for each action received as `action:${action}` (eg: "action:screenshot").
|
|
* Default handling can be prevented by using preventDefault() on the
|
|
* raised event. The default handling varies for each action: ones
|
|
* which the SDK can handle safely are acknowledged appropriately and
|
|
* ones which are unhandled (custom or require the client to do something)
|
|
* are rejected with an error.
|
|
*
|
|
* Events which are preventDefault()ed must reply using the transport.
|
|
* The events raised will have a default of an IWidgetApiRequest
|
|
* interface.
|
|
*
|
|
* When the ClientWidgetApi is ready to start sending requests, it will
|
|
* raise a "ready" CustomEvent. After the ready event fires, actions can
|
|
* be sent and the transport will be ready.
|
|
*
|
|
* When the widget has indicated it has loaded, this class raises a
|
|
* "preparing" CustomEvent. The preparing event does not indicate that
|
|
* the widget is ready to receive communications - that is signified by
|
|
* the ready event exclusively.
|
|
*
|
|
* This class only handles one widget at a time.
|
|
*/
|
|
var ClientWidgetApi = /*#__PURE__*/function (_EventEmitter) {
|
|
_inherits(ClientWidgetApi, _EventEmitter);
|
|
var _super = _createSuper(ClientWidgetApi);
|
|
/**
|
|
* Creates a new client widget API. This will instantiate the transport
|
|
* and start everything. When the iframe is loaded under the widget's
|
|
* conditions, a "ready" event will be raised.
|
|
* @param {Widget} widget The widget to communicate with.
|
|
* @param {HTMLIFrameElement} iframe The iframe the widget is in.
|
|
* @param {WidgetDriver} driver The driver for this widget/client.
|
|
*/
|
|
function ClientWidgetApi(widget, iframe, driver) {
|
|
var _this;
|
|
_classCallCheck(this, ClientWidgetApi);
|
|
_this = _super.call(this);
|
|
_this.widget = widget;
|
|
_this.driver = driver;
|
|
_defineProperty(_assertThisInitialized(_this), "transport", void 0);
|
|
_defineProperty(_assertThisInitialized(_this), "cachedWidgetVersions", null);
|
|
// contentLoadedActionSent is used to check that only one ContentLoaded request is send.
|
|
_defineProperty(_assertThisInitialized(_this), "contentLoadedActionSent", false);
|
|
_defineProperty(_assertThisInitialized(_this), "allowedCapabilities", new Set());
|
|
_defineProperty(_assertThisInitialized(_this), "allowedEvents", []);
|
|
_defineProperty(_assertThisInitialized(_this), "isStopped", false);
|
|
_defineProperty(_assertThisInitialized(_this), "turnServers", null);
|
|
_defineProperty(_assertThisInitialized(_this), "contentLoadedWaitTimer", void 0);
|
|
// Stores pending requests to push a room's state to the widget
|
|
_defineProperty(_assertThisInitialized(_this), "pushRoomStateTasks", new Set());
|
|
// Room ID → event type → state key → events to be pushed
|
|
_defineProperty(_assertThisInitialized(_this), "pushRoomStateResult", new Map());
|
|
_defineProperty(_assertThisInitialized(_this), "flushRoomStateTask", null);
|
|
_defineProperty(_assertThisInitialized(_this), "viewedRoomId", null);
|
|
if (!(iframe !== null && iframe !== void 0 && iframe.contentWindow)) {
|
|
throw new Error("No iframe supplied");
|
|
}
|
|
if (!widget) {
|
|
throw new Error("Invalid widget");
|
|
}
|
|
if (!driver) {
|
|
throw new Error("Invalid driver");
|
|
}
|
|
_this.transport = new _PostmessageTransport.PostmessageTransport(_WidgetApiDirection.WidgetApiDirection.ToWidget, widget.id, iframe.contentWindow, globalThis);
|
|
_this.transport.targetOrigin = widget.origin;
|
|
_this.transport.on("message", _this.handleMessage.bind(_assertThisInitialized(_this)));
|
|
iframe.addEventListener("load", _this.onIframeLoad.bind(_assertThisInitialized(_this)));
|
|
_this.transport.start();
|
|
return _this;
|
|
}
|
|
_createClass(ClientWidgetApi, [{
|
|
key: "hasCapability",
|
|
value: function hasCapability(capability) {
|
|
return this.allowedCapabilities.has(capability);
|
|
}
|
|
}, {
|
|
key: "canUseRoomTimeline",
|
|
value: function canUseRoomTimeline(roomId) {
|
|
return this.hasCapability("org.matrix.msc2762.timeline:".concat(_Symbols.Symbols.AnyRoom)) || this.hasCapability("org.matrix.msc2762.timeline:".concat(roomId));
|
|
}
|
|
}, {
|
|
key: "canSendRoomEvent",
|
|
value: function canSendRoomEvent(eventType) {
|
|
var msgtype = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
return this.allowedEvents.some(function (e) {
|
|
return e.matchesAsRoomEvent(_WidgetEventCapability.EventDirection.Send, eventType, msgtype);
|
|
});
|
|
}
|
|
}, {
|
|
key: "canSendStateEvent",
|
|
value: function canSendStateEvent(eventType, stateKey) {
|
|
return this.allowedEvents.some(function (e) {
|
|
return e.matchesAsStateEvent(_WidgetEventCapability.EventDirection.Send, eventType, stateKey);
|
|
});
|
|
}
|
|
}, {
|
|
key: "canSendToDeviceEvent",
|
|
value: function canSendToDeviceEvent(eventType) {
|
|
return this.allowedEvents.some(function (e) {
|
|
return e.matchesAsToDeviceEvent(_WidgetEventCapability.EventDirection.Send, eventType);
|
|
});
|
|
}
|
|
}, {
|
|
key: "canReceiveRoomEvent",
|
|
value: function canReceiveRoomEvent(eventType) {
|
|
var msgtype = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : null;
|
|
return this.allowedEvents.some(function (e) {
|
|
return e.matchesAsRoomEvent(_WidgetEventCapability.EventDirection.Receive, eventType, msgtype);
|
|
});
|
|
}
|
|
}, {
|
|
key: "canReceiveStateEvent",
|
|
value: function canReceiveStateEvent(eventType, stateKey) {
|
|
return this.allowedEvents.some(function (e) {
|
|
return e.matchesAsStateEvent(_WidgetEventCapability.EventDirection.Receive, eventType, stateKey);
|
|
});
|
|
}
|
|
}, {
|
|
key: "canReceiveToDeviceEvent",
|
|
value: function canReceiveToDeviceEvent(eventType) {
|
|
return this.allowedEvents.some(function (e) {
|
|
return e.matchesAsToDeviceEvent(_WidgetEventCapability.EventDirection.Receive, eventType);
|
|
});
|
|
}
|
|
}, {
|
|
key: "canReceiveRoomAccountData",
|
|
value: function canReceiveRoomAccountData(eventType) {
|
|
return this.allowedEvents.some(function (e) {
|
|
return e.matchesAsRoomAccountData(_WidgetEventCapability.EventDirection.Receive, eventType);
|
|
});
|
|
}
|
|
}, {
|
|
key: "stop",
|
|
value: function stop() {
|
|
this.isStopped = true;
|
|
this.transport.stop();
|
|
}
|
|
}, {
|
|
key: "getWidgetVersions",
|
|
value: function () {
|
|
var _getWidgetVersions = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee() {
|
|
var r;
|
|
return _regeneratorRuntime().wrap(function _callee$(_context) {
|
|
while (1) switch (_context.prev = _context.next) {
|
|
case 0:
|
|
if (!Array.isArray(this.cachedWidgetVersions)) {
|
|
_context.next = 2;
|
|
break;
|
|
}
|
|
return _context.abrupt("return", this.cachedWidgetVersions);
|
|
case 2:
|
|
_context.prev = 2;
|
|
_context.next = 5;
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SupportedApiVersions, {});
|
|
case 5:
|
|
r = _context.sent;
|
|
this.cachedWidgetVersions = r.supported_versions;
|
|
return _context.abrupt("return", r.supported_versions);
|
|
case 10:
|
|
_context.prev = 10;
|
|
_context.t0 = _context["catch"](2);
|
|
console.warn("non-fatal error getting supported widget versions: ", _context.t0);
|
|
return _context.abrupt("return", []);
|
|
case 14:
|
|
case "end":
|
|
return _context.stop();
|
|
}
|
|
}, _callee, this, [[2, 10]]);
|
|
}));
|
|
function getWidgetVersions() {
|
|
return _getWidgetVersions.apply(this, arguments);
|
|
}
|
|
return getWidgetVersions;
|
|
}()
|
|
}, {
|
|
key: "beginCapabilities",
|
|
value: function beginCapabilities() {
|
|
var _this2 = this;
|
|
// widget has loaded - tell all the listeners that
|
|
this.emit("preparing");
|
|
var requestedCaps;
|
|
this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.Capabilities, {}).then(function (caps) {
|
|
requestedCaps = caps.capabilities;
|
|
return _this2.driver.validateCapabilities(new Set(caps.capabilities));
|
|
}).then(function (allowedCaps) {
|
|
_this2.allowCapabilities(_toConsumableArray(allowedCaps), requestedCaps);
|
|
_this2.emit("ready");
|
|
})["catch"](function (e) {
|
|
_this2.emit("error:preparing", e);
|
|
});
|
|
}
|
|
}, {
|
|
key: "allowCapabilities",
|
|
value: function allowCapabilities(allowed, requested) {
|
|
var _this$allowedEvents,
|
|
_this3 = this;
|
|
console.log("Widget ".concat(this.widget.id, " is allowed capabilities:"), allowed);
|
|
var _iterator2 = _createForOfIteratorHelper(allowed),
|
|
_step2;
|
|
try {
|
|
for (_iterator2.s(); !(_step2 = _iterator2.n()).done;) {
|
|
var c = _step2.value;
|
|
this.allowedCapabilities.add(c);
|
|
}
|
|
} catch (err) {
|
|
_iterator2.e(err);
|
|
} finally {
|
|
_iterator2.f();
|
|
}
|
|
var allowedEvents = _WidgetEventCapability.WidgetEventCapability.findEventCapabilities(allowed);
|
|
(_this$allowedEvents = this.allowedEvents).push.apply(_this$allowedEvents, _toConsumableArray(allowedEvents));
|
|
this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.NotifyCapabilities, {
|
|
requested: requested,
|
|
approved: Array.from(this.allowedCapabilities)
|
|
})["catch"](function (e) {
|
|
console.warn("non-fatal error notifying widget of approved capabilities:", e);
|
|
}).then(function () {
|
|
_this3.emit("capabilitiesNotified");
|
|
});
|
|
|
|
// Push the initial room state for all rooms with a timeline capability
|
|
var _iterator3 = _createForOfIteratorHelper(allowed),
|
|
_step3;
|
|
try {
|
|
for (_iterator3.s(); !(_step3 = _iterator3.n()).done;) {
|
|
var _c = _step3.value;
|
|
if ((0, _Capabilities.isTimelineCapability)(_c)) {
|
|
var roomId = (0, _Capabilities.getTimelineRoomIDFromCapability)(_c);
|
|
if (roomId === _Symbols.Symbols.AnyRoom) {
|
|
var _iterator5 = _createForOfIteratorHelper(this.driver.getKnownRooms()),
|
|
_step5;
|
|
try {
|
|
for (_iterator5.s(); !(_step5 = _iterator5.n()).done;) {
|
|
var _roomId = _step5.value;
|
|
this.pushRoomState(_roomId);
|
|
}
|
|
} catch (err) {
|
|
_iterator5.e(err);
|
|
} finally {
|
|
_iterator5.f();
|
|
}
|
|
} else {
|
|
this.pushRoomState(roomId);
|
|
}
|
|
}
|
|
}
|
|
} catch (err) {
|
|
_iterator3.e(err);
|
|
} finally {
|
|
_iterator3.f();
|
|
}
|
|
if (allowed.includes(_Capabilities.MatrixCapabilities.MSC4407ReceiveStickyEvent)) {
|
|
console.debug("Widget ".concat(this.widget.id, " is allowed to receive sticky events, check current sticky state."));
|
|
// If the widget can receive sticky events, push all sticky events in known rooms now.
|
|
// Sticky events are like a state, and passed history is needed to get the full state.
|
|
var roomIds = allowed.filter(function (capability) {
|
|
return (0, _Capabilities.isTimelineCapability)(capability);
|
|
}).map(function (timelineCapability) {
|
|
return (0, _Capabilities.getTimelineRoomIDFromCapability)(timelineCapability);
|
|
}).flatMap(function (roomIdOrWildcard) {
|
|
if (roomIdOrWildcard === _Symbols.Symbols.AnyRoom) {
|
|
// Do we support getting sticky state for any room?
|
|
return _this3.driver.getKnownRooms();
|
|
} else {
|
|
return roomIdOrWildcard;
|
|
}
|
|
});
|
|
console.debug("Widget ".concat(this.widget.id, " is allowed to receive sticky events in rooms:"), roomIds);
|
|
var _iterator4 = _createForOfIteratorHelper(roomIds),
|
|
_step4;
|
|
try {
|
|
var _loop = function _loop() {
|
|
var roomId = _step4.value;
|
|
_this3.pushStickyState(roomId)["catch"](function (err) {
|
|
console.error("Failed to push sticky events to widget ".concat(_this3.widget.id, " for room ").concat(roomId, ":"), err);
|
|
});
|
|
};
|
|
for (_iterator4.s(); !(_step4 = _iterator4.n()).done;) {
|
|
_loop();
|
|
}
|
|
} catch (err) {
|
|
_iterator4.e(err);
|
|
} finally {
|
|
_iterator4.f();
|
|
}
|
|
}
|
|
|
|
// If new events are allowed and the currently viewed room isn't covered
|
|
// by a timeline capability, then we know that there could be some state
|
|
// in the viewed room that the widget hasn't learned about yet- push it.
|
|
if (allowedEvents.length > 0 && this.viewedRoomId !== null && !this.canUseRoomTimeline(this.viewedRoomId)) {
|
|
this.pushRoomState(this.viewedRoomId);
|
|
}
|
|
}
|
|
}, {
|
|
key: "onIframeLoad",
|
|
value: function onIframeLoad(ev) {
|
|
if (this.widget.waitForIframeLoad) {
|
|
// If the widget is set to waitForIframeLoad the capabilities immediately get setup after load.
|
|
// The client does not wait for the ContentLoaded action.
|
|
this.beginCapabilities();
|
|
} else {
|
|
// Reaching this means, that the Iframe got reloaded/loaded and
|
|
// the clientApi is awaiting the FIRST ContentLoaded action.
|
|
console.log("waitForIframeLoad is false: waiting for widget to send contentLoaded");
|
|
this.contentLoadedWaitTimer = setTimeout(function () {
|
|
console.error("Widget specified waitForIframeLoad=false but timed out waiting for contentLoaded event!");
|
|
}, 10000);
|
|
this.contentLoadedActionSent = false;
|
|
}
|
|
}
|
|
}, {
|
|
key: "handleContentLoadedAction",
|
|
value: function handleContentLoadedAction(action) {
|
|
if (this.contentLoadedWaitTimer !== undefined) {
|
|
clearTimeout(this.contentLoadedWaitTimer);
|
|
this.contentLoadedWaitTimer = undefined;
|
|
}
|
|
if (this.contentLoadedActionSent) {
|
|
throw new Error("Improper sequence: ContentLoaded Action can only be sent once after the widget loaded " + "and should only be used if waitForIframeLoad is false (default=true)");
|
|
}
|
|
if (this.widget.waitForIframeLoad) {
|
|
this.transport.reply(action, {
|
|
error: {
|
|
message: "Improper sequence: not expecting ContentLoaded event if " + "waitForIframeLoad is true (default=true)"
|
|
}
|
|
});
|
|
} else {
|
|
this.transport.reply(action, {});
|
|
this.beginCapabilities();
|
|
}
|
|
this.contentLoadedActionSent = true;
|
|
}
|
|
}, {
|
|
key: "replyVersions",
|
|
value: function replyVersions(request) {
|
|
this.transport.reply(request, {
|
|
supported_versions: _ApiVersion.CurrentApiVersions
|
|
});
|
|
}
|
|
}, {
|
|
key: "supportsUpdateState",
|
|
value: function () {
|
|
var _supportsUpdateState = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee2() {
|
|
return _regeneratorRuntime().wrap(function _callee2$(_context2) {
|
|
while (1) switch (_context2.prev = _context2.next) {
|
|
case 0:
|
|
_context2.next = 2;
|
|
return this.getWidgetVersions();
|
|
case 2:
|
|
return _context2.abrupt("return", _context2.sent.includes(_ApiVersion.UnstableApiVersion.MSC2762_UPDATE_STATE));
|
|
case 3:
|
|
case "end":
|
|
return _context2.stop();
|
|
}
|
|
}, _callee2, this);
|
|
}));
|
|
function supportsUpdateState() {
|
|
return _supportsUpdateState.apply(this, arguments);
|
|
}
|
|
return supportsUpdateState;
|
|
}()
|
|
}, {
|
|
key: "handleCapabilitiesRenegotiate",
|
|
value: function handleCapabilitiesRenegotiate(request) {
|
|
var _request$data,
|
|
_this4 = this;
|
|
// acknowledge first
|
|
this.transport.reply(request, {});
|
|
var requested = ((_request$data = request.data) === null || _request$data === void 0 ? void 0 : _request$data.capabilities) || [];
|
|
var newlyRequested = new Set(requested.filter(function (r) {
|
|
return !_this4.hasCapability(r);
|
|
}));
|
|
if (newlyRequested.size === 0) {
|
|
// Nothing to do - skip validation
|
|
this.allowCapabilities([], []);
|
|
}
|
|
this.driver.validateCapabilities(newlyRequested).then(function (allowed) {
|
|
return _this4.allowCapabilities(_toConsumableArray(allowed), _toConsumableArray(newlyRequested));
|
|
});
|
|
}
|
|
}, {
|
|
key: "handleNavigate",
|
|
value: function handleNavigate(request) {
|
|
var _request$data2,
|
|
_this5 = this;
|
|
if (!this.hasCapability(_Capabilities.MatrixCapabilities.MSC2931Navigate)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
});
|
|
}
|
|
if (!((_request$data2 = request.data) !== null && _request$data2 !== void 0 && _request$data2.uri.startsWith("https://matrix.to/#"))) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid matrix.to URI"
|
|
}
|
|
});
|
|
}
|
|
var onErr = function onErr(e) {
|
|
console.error("[ClientWidgetApi] Failed to handle navigation: ", e);
|
|
_this5.handleDriverError(e, request, "Error handling navigation");
|
|
};
|
|
try {
|
|
this.driver.navigate(request.data.uri.toString())["catch"](function (e) {
|
|
return onErr(e);
|
|
}).then(function () {
|
|
return _this5.transport.reply(request, {});
|
|
});
|
|
} catch (e) {
|
|
return onErr(e);
|
|
}
|
|
}
|
|
}, {
|
|
key: "handleOIDC",
|
|
value: function handleOIDC(request) {
|
|
var _this6 = this;
|
|
var phase = 1; // 1 = initial request, 2 = after user manual confirmation
|
|
|
|
var replyState = function replyState(state, credential) {
|
|
credential = credential || {};
|
|
if (phase > 1) {
|
|
return _this6.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.OpenIDCredentials, _objectSpread({
|
|
state: state,
|
|
original_request_id: request.requestId
|
|
}, credential));
|
|
} else {
|
|
return _this6.transport.reply(request, _objectSpread({
|
|
state: state
|
|
}, credential));
|
|
}
|
|
};
|
|
var replyError = function replyError(msg) {
|
|
console.error("[ClientWidgetApi] Failed to handle OIDC: ", msg);
|
|
if (phase > 1) {
|
|
// We don't have a way to indicate that a random error happened in this flow, so
|
|
// just block the attempt.
|
|
return replyState(_GetOpenIDAction.OpenIDRequestState.Blocked);
|
|
} else {
|
|
return _this6.transport.reply(request, {
|
|
error: {
|
|
message: msg
|
|
}
|
|
});
|
|
}
|
|
};
|
|
var observer = new _SimpleObservable.SimpleObservable(function (update) {
|
|
if (update.state === _GetOpenIDAction.OpenIDRequestState.PendingUserConfirmation && phase > 1) {
|
|
observer.close();
|
|
return replyError("client provided out-of-phase response to OIDC flow");
|
|
}
|
|
if (update.state === _GetOpenIDAction.OpenIDRequestState.PendingUserConfirmation) {
|
|
replyState(update.state);
|
|
phase++;
|
|
return;
|
|
}
|
|
if (update.state === _GetOpenIDAction.OpenIDRequestState.Allowed && !update.token) {
|
|
return replyError("client provided invalid OIDC token for an allowed request");
|
|
}
|
|
if (update.state === _GetOpenIDAction.OpenIDRequestState.Blocked) {
|
|
update.token = undefined; // just in case the client did something weird
|
|
}
|
|
observer.close();
|
|
return replyState(update.state, update.token);
|
|
});
|
|
this.driver.askOpenID(observer);
|
|
}
|
|
}, {
|
|
key: "handleReadRoomAccountData",
|
|
value: function handleReadRoomAccountData(request) {
|
|
var _this7 = this;
|
|
var events = this.driver.readRoomAccountData(request.data.type);
|
|
if (!this.canReceiveRoomAccountData(request.data.type)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Cannot read room account data of this type"
|
|
}
|
|
});
|
|
}
|
|
return events.then(function (evs) {
|
|
_this7.transport.reply(request, {
|
|
events: evs
|
|
});
|
|
});
|
|
}
|
|
}, {
|
|
key: "handleReadEvents",
|
|
value: function () {
|
|
var _handleReadEvents = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee3(request) {
|
|
var _this8 = this;
|
|
var askRoomIds, _iterator6, _step6, roomId, limit, since, stateKey, msgtype, _stateKey, events;
|
|
return _regeneratorRuntime().wrap(function _callee3$(_context3) {
|
|
while (1) switch (_context3.prev = _context3.next) {
|
|
case 0:
|
|
if (request.data.type) {
|
|
_context3.next = 2;
|
|
break;
|
|
}
|
|
return _context3.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing event type"
|
|
}
|
|
}));
|
|
case 2:
|
|
if (!(request.data.limit !== undefined && (!request.data.limit || request.data.limit < 0))) {
|
|
_context3.next = 4;
|
|
break;
|
|
}
|
|
return _context3.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - limit out of range"
|
|
}
|
|
}));
|
|
case 4:
|
|
if (!(request.data.room_ids === undefined)) {
|
|
_context3.next = 8;
|
|
break;
|
|
}
|
|
askRoomIds = this.viewedRoomId === null ? [] : [this.viewedRoomId];
|
|
_context3.next = 30;
|
|
break;
|
|
case 8:
|
|
if (!(request.data.room_ids === _Symbols.Symbols.AnyRoom)) {
|
|
_context3.next = 12;
|
|
break;
|
|
}
|
|
askRoomIds = this.driver.getKnownRooms().filter(function (roomId) {
|
|
return _this8.canUseRoomTimeline(roomId);
|
|
});
|
|
_context3.next = 30;
|
|
break;
|
|
case 12:
|
|
askRoomIds = request.data.room_ids;
|
|
_iterator6 = _createForOfIteratorHelper(askRoomIds);
|
|
_context3.prev = 14;
|
|
_iterator6.s();
|
|
case 16:
|
|
if ((_step6 = _iterator6.n()).done) {
|
|
_context3.next = 22;
|
|
break;
|
|
}
|
|
roomId = _step6.value;
|
|
if (this.canUseRoomTimeline(roomId)) {
|
|
_context3.next = 20;
|
|
break;
|
|
}
|
|
return _context3.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Unable to access room timeline: ".concat(roomId)
|
|
}
|
|
}));
|
|
case 20:
|
|
_context3.next = 16;
|
|
break;
|
|
case 22:
|
|
_context3.next = 27;
|
|
break;
|
|
case 24:
|
|
_context3.prev = 24;
|
|
_context3.t0 = _context3["catch"](14);
|
|
_iterator6.e(_context3.t0);
|
|
case 27:
|
|
_context3.prev = 27;
|
|
_iterator6.f();
|
|
return _context3.finish(27);
|
|
case 30:
|
|
limit = request.data.limit || 0;
|
|
since = request.data.since;
|
|
stateKey = undefined;
|
|
msgtype = undefined;
|
|
if (!(request.data.state_key !== undefined)) {
|
|
_context3.next = 40;
|
|
break;
|
|
}
|
|
stateKey = request.data.state_key === true ? undefined : request.data.state_key.toString();
|
|
if (this.canReceiveStateEvent(request.data.type, (_stateKey = stateKey) !== null && _stateKey !== void 0 ? _stateKey : null)) {
|
|
_context3.next = 38;
|
|
break;
|
|
}
|
|
return _context3.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Cannot read state events of this type"
|
|
}
|
|
}));
|
|
case 38:
|
|
_context3.next = 43;
|
|
break;
|
|
case 40:
|
|
msgtype = request.data.msgtype;
|
|
if (this.canReceiveRoomEvent(request.data.type, msgtype)) {
|
|
_context3.next = 43;
|
|
break;
|
|
}
|
|
return _context3.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Cannot read room events of this type"
|
|
}
|
|
}));
|
|
case 43:
|
|
if (!(request.data.room_ids === undefined && askRoomIds.length === 0)) {
|
|
_context3.next = 50;
|
|
break;
|
|
}
|
|
// For backwards compatibility we still call the deprecated
|
|
// readRoomEvents and readStateEvents methods in case the client isn't
|
|
// letting us know the currently viewed room via setViewedRoomId
|
|
//
|
|
// This can be considered as a deprecated implementation.
|
|
// A driver should call `setViewedRoomId` on the widget messaging and implement the new readRoomState and readRoomTimeline
|
|
// Methods.
|
|
// This block makes sure that it is also possible to not use setViewedRoomId.
|
|
// readRoomTimeline and readRoomState are required however! Otherwise widget requests that include
|
|
// `room_ids` will fail.
|
|
console.warn("The widgetDriver uses deprecated behaviour:\n It does not set the viewedRoomId using `setViewedRoomId`");
|
|
_context3.next = 47;
|
|
return (
|
|
// This returns [] with the current driver of Element Web.
|
|
// Add default implementations of the `readRoomEvents` and `readStateEvents`
|
|
// methods to use `readRoomTimeline` and `readRoomState` if they are not overwritten.
|
|
request.data.state_key === undefined ? this.driver.readRoomEvents(request.data.type, msgtype, limit, null, since) : this.driver.readStateEvents(request.data.type, stateKey, limit, null)
|
|
);
|
|
case 47:
|
|
events = _context3.sent;
|
|
_context3.next = 68;
|
|
break;
|
|
case 50:
|
|
_context3.next = 52;
|
|
return this.supportsUpdateState();
|
|
case 52:
|
|
if (!_context3.sent) {
|
|
_context3.next = 58;
|
|
break;
|
|
}
|
|
_context3.next = 55;
|
|
return Promise.all(askRoomIds.map(function (roomId) {
|
|
return _this8.driver.readRoomTimeline(roomId, request.data.type, msgtype, stateKey, limit, since);
|
|
}));
|
|
case 55:
|
|
events = _context3.sent.flat(1);
|
|
_context3.next = 68;
|
|
break;
|
|
case 58:
|
|
if (!(request.data.state_key === undefined)) {
|
|
_context3.next = 64;
|
|
break;
|
|
}
|
|
_context3.next = 61;
|
|
return Promise.all(askRoomIds.map(function (roomId) {
|
|
return _this8.driver.readRoomTimeline(roomId, request.data.type, msgtype, stateKey, limit, since);
|
|
}));
|
|
case 61:
|
|
_context3.t1 = _context3.sent;
|
|
_context3.next = 67;
|
|
break;
|
|
case 64:
|
|
_context3.next = 66;
|
|
return Promise.all(askRoomIds.map(function (roomId) {
|
|
return _this8.driver.readRoomState(roomId, request.data.type, stateKey);
|
|
}));
|
|
case 66:
|
|
_context3.t1 = _context3.sent;
|
|
case 67:
|
|
events = _context3.t1.flat(1);
|
|
case 68:
|
|
this.transport.reply(request, {
|
|
events: events
|
|
});
|
|
case 69:
|
|
case "end":
|
|
return _context3.stop();
|
|
}
|
|
}, _callee3, this, [[14, 24, 27, 30]]);
|
|
}));
|
|
function handleReadEvents(_x) {
|
|
return _handleReadEvents.apply(this, arguments);
|
|
}
|
|
return handleReadEvents;
|
|
}()
|
|
}, {
|
|
key: "handleSendEvent",
|
|
value: function handleSendEvent(request) {
|
|
var _this9 = this;
|
|
if (!request.data.type) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing event type"
|
|
}
|
|
});
|
|
}
|
|
if (!!request.data.room_id && !this.canUseRoomTimeline(request.data.room_id)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Unable to access room timeline: ".concat(request.data.room_id)
|
|
}
|
|
});
|
|
}
|
|
if (request.data.parent_delay_id !== undefined) {
|
|
console.warn("Data includes parent_delay_id, but the widgetDriver ignores it");
|
|
}
|
|
var delay = request.data.delay;
|
|
if (delay !== undefined && !this.hasCapability(_Capabilities.MatrixCapabilities.MSC4157SendDelayedEvent)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability for ".concat(_Capabilities.MatrixCapabilities.MSC4157SendDelayedEvent)
|
|
}
|
|
});
|
|
}
|
|
var isStickyEvent = request.data.sticky_duration_ms !== undefined;
|
|
if (isStickyEvent && !this.hasCapability(_Capabilities.MatrixCapabilities.MSC4407SendStickyEvent)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability for ".concat(_Capabilities.MatrixCapabilities.MSC4407SendStickyEvent)
|
|
}
|
|
});
|
|
}
|
|
var sendEventPromise;
|
|
if (request.data.state_key !== undefined) {
|
|
if (!this.canSendStateEvent(request.data.type, request.data.state_key)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Cannot send state events of this type"
|
|
}
|
|
});
|
|
}
|
|
if (isStickyEvent) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Cannot send a state event with a sticky duration"
|
|
}
|
|
});
|
|
}
|
|
if (delay !== undefined) {
|
|
sendEventPromise = this.driver.sendDelayedEvent(delay, request.data.type, request.data.content || {}, request.data.state_key, request.data.room_id);
|
|
} else {
|
|
sendEventPromise = this.driver.sendEvent(request.data.type, request.data.content || {}, request.data.state_key, request.data.room_id);
|
|
}
|
|
} else {
|
|
var content = request.data.content || {};
|
|
var msgtype = content["msgtype"];
|
|
if (!this.canSendRoomEvent(request.data.type, msgtype)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Cannot send room events of this type"
|
|
}
|
|
});
|
|
}
|
|
|
|
// Events can be sticky, delayed, both, or neither. The following
|
|
// section of code takes the common parameters and uses the correct
|
|
// function depending on the request type.
|
|
|
|
var params = [request.data.type, content, null,
|
|
// not sending a state event
|
|
request.data.room_id];
|
|
if (delay !== undefined && request.data.sticky_duration_ms) {
|
|
sendEventPromise = this.driver.sendDelayedStickyEvent(delay, request.data.sticky_duration_ms, request.data.type, content, request.data.room_id);
|
|
} else if (delay !== undefined) {
|
|
var _this$driver;
|
|
sendEventPromise = (_this$driver = this.driver).sendDelayedEvent.apply(_this$driver, [delay].concat(params));
|
|
} else if (request.data.sticky_duration_ms) {
|
|
sendEventPromise = this.driver.sendStickyEvent(request.data.sticky_duration_ms, request.data.type, content, request.data.room_id);
|
|
} else {
|
|
var _this$driver2;
|
|
sendEventPromise = (_this$driver2 = this.driver).sendEvent.apply(_this$driver2, params);
|
|
}
|
|
}
|
|
sendEventPromise.then(function (sentEvent) {
|
|
return _this9.transport.reply(request, _objectSpread({
|
|
room_id: sentEvent.roomId
|
|
}, "eventId" in sentEvent ? {
|
|
event_id: sentEvent.eventId
|
|
} : {
|
|
delay_id: sentEvent.delayId
|
|
}));
|
|
})["catch"](function (e) {
|
|
console.error("error sending event: ", e);
|
|
_this9.handleDriverError(e, request, "Error sending event");
|
|
});
|
|
}
|
|
}, {
|
|
key: "handleUpdateDelayedEvent",
|
|
value: function handleUpdateDelayedEvent(request) {
|
|
var _this0 = this;
|
|
if (!request.data.delay_id) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing delay_id"
|
|
}
|
|
});
|
|
}
|
|
if (!this.hasCapability(_Capabilities.MatrixCapabilities.MSC4157UpdateDelayedEvent)) {
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
});
|
|
}
|
|
var updateDelayedEvent;
|
|
switch (request.data.action) {
|
|
case _UpdateDelayedEventAction.UpdateDelayedEventAction.Cancel:
|
|
updateDelayedEvent = this.driver.cancelScheduledDelayedEvent;
|
|
break;
|
|
case _UpdateDelayedEventAction.UpdateDelayedEventAction.Restart:
|
|
updateDelayedEvent = this.driver.restartScheduledDelayedEvent;
|
|
break;
|
|
case _UpdateDelayedEventAction.UpdateDelayedEventAction.Send:
|
|
updateDelayedEvent = this.driver.sendScheduledDelayedEvent;
|
|
break;
|
|
default:
|
|
return this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - unsupported action"
|
|
}
|
|
});
|
|
}
|
|
updateDelayedEvent.call(this.driver, request.data.delay_id).then(function () {
|
|
return _this0.transport.reply(request, {});
|
|
})["catch"](function (e) {
|
|
console.error("error updating delayed event: ", e);
|
|
_this0.handleDriverError(e, request, "Error updating delayed event");
|
|
});
|
|
}
|
|
}, {
|
|
key: "handleSendToDevice",
|
|
value: function () {
|
|
var _handleSendToDevice = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee4(request) {
|
|
return _regeneratorRuntime().wrap(function _callee4$(_context4) {
|
|
while (1) switch (_context4.prev = _context4.next) {
|
|
case 0:
|
|
if (request.data.type) {
|
|
_context4.next = 4;
|
|
break;
|
|
}
|
|
this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing event type"
|
|
}
|
|
});
|
|
_context4.next = 26;
|
|
break;
|
|
case 4:
|
|
if (request.data.messages) {
|
|
_context4.next = 8;
|
|
break;
|
|
}
|
|
this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing event contents"
|
|
}
|
|
});
|
|
_context4.next = 26;
|
|
break;
|
|
case 8:
|
|
if (!(typeof request.data.encrypted !== "boolean")) {
|
|
_context4.next = 12;
|
|
break;
|
|
}
|
|
this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing encryption flag"
|
|
}
|
|
});
|
|
_context4.next = 26;
|
|
break;
|
|
case 12:
|
|
if (this.canSendToDeviceEvent(request.data.type)) {
|
|
_context4.next = 16;
|
|
break;
|
|
}
|
|
this.transport.reply(request, {
|
|
error: {
|
|
message: "Cannot send to-device events of this type"
|
|
}
|
|
});
|
|
_context4.next = 26;
|
|
break;
|
|
case 16:
|
|
_context4.prev = 16;
|
|
_context4.next = 19;
|
|
return this.driver.sendToDevice(request.data.type, request.data.encrypted, request.data.messages);
|
|
case 19:
|
|
this.transport.reply(request, {});
|
|
_context4.next = 26;
|
|
break;
|
|
case 22:
|
|
_context4.prev = 22;
|
|
_context4.t0 = _context4["catch"](16);
|
|
console.error("error sending to-device event", _context4.t0);
|
|
this.handleDriverError(_context4.t0, request, "Error sending event");
|
|
case 26:
|
|
case "end":
|
|
return _context4.stop();
|
|
}
|
|
}, _callee4, this, [[16, 22]]);
|
|
}));
|
|
function handleSendToDevice(_x2) {
|
|
return _handleSendToDevice.apply(this, arguments);
|
|
}
|
|
return handleSendToDevice;
|
|
}()
|
|
}, {
|
|
key: "pollTurnServers",
|
|
value: function () {
|
|
var _pollTurnServers = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee5(turnServers, initialServer) {
|
|
var _iteratorAbruptCompletion, _didIteratorError, _iteratorError, _iterator, _step, server;
|
|
return _regeneratorRuntime().wrap(function _callee5$(_context5) {
|
|
while (1) switch (_context5.prev = _context5.next) {
|
|
case 0:
|
|
_context5.prev = 0;
|
|
_context5.next = 3;
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateTurnServers, initialServer // it's compatible, but missing the index signature
|
|
);
|
|
case 3:
|
|
// Pick the generator up where we left off
|
|
_iteratorAbruptCompletion = false;
|
|
_didIteratorError = false;
|
|
_context5.prev = 5;
|
|
_iterator = _asyncIterator(turnServers);
|
|
case 7:
|
|
_context5.next = 9;
|
|
return _iterator.next();
|
|
case 9:
|
|
if (!(_iteratorAbruptCompletion = !(_step = _context5.sent).done)) {
|
|
_context5.next = 16;
|
|
break;
|
|
}
|
|
server = _step.value;
|
|
_context5.next = 13;
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateTurnServers, server // it's compatible, but missing the index signature
|
|
);
|
|
case 13:
|
|
_iteratorAbruptCompletion = false;
|
|
_context5.next = 7;
|
|
break;
|
|
case 16:
|
|
_context5.next = 22;
|
|
break;
|
|
case 18:
|
|
_context5.prev = 18;
|
|
_context5.t0 = _context5["catch"](5);
|
|
_didIteratorError = true;
|
|
_iteratorError = _context5.t0;
|
|
case 22:
|
|
_context5.prev = 22;
|
|
_context5.prev = 23;
|
|
if (!(_iteratorAbruptCompletion && _iterator["return"] != null)) {
|
|
_context5.next = 27;
|
|
break;
|
|
}
|
|
_context5.next = 27;
|
|
return _iterator["return"]();
|
|
case 27:
|
|
_context5.prev = 27;
|
|
if (!_didIteratorError) {
|
|
_context5.next = 30;
|
|
break;
|
|
}
|
|
throw _iteratorError;
|
|
case 30:
|
|
return _context5.finish(27);
|
|
case 31:
|
|
return _context5.finish(22);
|
|
case 32:
|
|
_context5.next = 37;
|
|
break;
|
|
case 34:
|
|
_context5.prev = 34;
|
|
_context5.t1 = _context5["catch"](0);
|
|
console.error("error polling for TURN servers", _context5.t1);
|
|
case 37:
|
|
case "end":
|
|
return _context5.stop();
|
|
}
|
|
}, _callee5, this, [[0, 34], [5, 18, 22, 32], [23,, 27, 31]]);
|
|
}));
|
|
function pollTurnServers(_x3, _x4) {
|
|
return _pollTurnServers.apply(this, arguments);
|
|
}
|
|
return pollTurnServers;
|
|
}()
|
|
}, {
|
|
key: "handleWatchTurnServers",
|
|
value: function () {
|
|
var _handleWatchTurnServers = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee6(request) {
|
|
var turnServers, _yield$turnServers$ne, done, value;
|
|
return _regeneratorRuntime().wrap(function _callee6$(_context6) {
|
|
while (1) switch (_context6.prev = _context6.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC3846TurnServers)) {
|
|
_context6.next = 4;
|
|
break;
|
|
}
|
|
this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
});
|
|
_context6.next = 26;
|
|
break;
|
|
case 4:
|
|
if (!this.turnServers) {
|
|
_context6.next = 8;
|
|
break;
|
|
}
|
|
// We're already polling, so this is a no-op
|
|
this.transport.reply(request, {});
|
|
_context6.next = 26;
|
|
break;
|
|
case 8:
|
|
_context6.prev = 8;
|
|
turnServers = this.driver.getTurnServers(); // Peek at the first result, so we can at least verify that the
|
|
// client isn't banned from getting TURN servers entirely
|
|
_context6.next = 12;
|
|
return turnServers.next();
|
|
case 12:
|
|
_yield$turnServers$ne = _context6.sent;
|
|
done = _yield$turnServers$ne.done;
|
|
value = _yield$turnServers$ne.value;
|
|
if (!done) {
|
|
_context6.next = 17;
|
|
break;
|
|
}
|
|
throw new Error("Client refuses to provide any TURN servers");
|
|
case 17:
|
|
this.transport.reply(request, {});
|
|
|
|
// Start the poll loop, sending the widget the initial result
|
|
this.pollTurnServers(turnServers, value);
|
|
this.turnServers = turnServers;
|
|
_context6.next = 26;
|
|
break;
|
|
case 22:
|
|
_context6.prev = 22;
|
|
_context6.t0 = _context6["catch"](8);
|
|
console.error("error getting first TURN server results", _context6.t0);
|
|
this.transport.reply(request, {
|
|
error: {
|
|
message: "TURN servers not available"
|
|
}
|
|
});
|
|
case 26:
|
|
case "end":
|
|
return _context6.stop();
|
|
}
|
|
}, _callee6, this, [[8, 22]]);
|
|
}));
|
|
function handleWatchTurnServers(_x5) {
|
|
return _handleWatchTurnServers.apply(this, arguments);
|
|
}
|
|
return handleWatchTurnServers;
|
|
}()
|
|
}, {
|
|
key: "handleUnwatchTurnServers",
|
|
value: function () {
|
|
var _handleUnwatchTurnServers = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee7(request) {
|
|
return _regeneratorRuntime().wrap(function _callee7$(_context7) {
|
|
while (1) switch (_context7.prev = _context7.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC3846TurnServers)) {
|
|
_context7.next = 4;
|
|
break;
|
|
}
|
|
this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
});
|
|
_context7.next = 12;
|
|
break;
|
|
case 4:
|
|
if (this.turnServers) {
|
|
_context7.next = 8;
|
|
break;
|
|
}
|
|
// We weren't polling anyways, so this is a no-op
|
|
this.transport.reply(request, {});
|
|
_context7.next = 12;
|
|
break;
|
|
case 8:
|
|
_context7.next = 10;
|
|
return this.turnServers["return"](undefined);
|
|
case 10:
|
|
this.turnServers = null;
|
|
this.transport.reply(request, {});
|
|
case 12:
|
|
case "end":
|
|
return _context7.stop();
|
|
}
|
|
}, _callee7, this);
|
|
}));
|
|
function handleUnwatchTurnServers(_x6) {
|
|
return _handleUnwatchTurnServers.apply(this, arguments);
|
|
}
|
|
return handleUnwatchTurnServers;
|
|
}()
|
|
}, {
|
|
key: "handleReadRelations",
|
|
value: function () {
|
|
var _handleReadRelations = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee8(request) {
|
|
var _this1 = this;
|
|
var result, chunk;
|
|
return _regeneratorRuntime().wrap(function _callee8$(_context8) {
|
|
while (1) switch (_context8.prev = _context8.next) {
|
|
case 0:
|
|
if (request.data.event_id) {
|
|
_context8.next = 2;
|
|
break;
|
|
}
|
|
return _context8.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing event ID"
|
|
}
|
|
}));
|
|
case 2:
|
|
if (!(request.data.limit !== undefined && request.data.limit < 0)) {
|
|
_context8.next = 4;
|
|
break;
|
|
}
|
|
return _context8.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - limit out of range"
|
|
}
|
|
}));
|
|
case 4:
|
|
if (!(request.data.room_id !== undefined && !this.canUseRoomTimeline(request.data.room_id))) {
|
|
_context8.next = 6;
|
|
break;
|
|
}
|
|
return _context8.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Unable to access room timeline: ".concat(request.data.room_id)
|
|
}
|
|
}));
|
|
case 6:
|
|
_context8.prev = 6;
|
|
_context8.next = 9;
|
|
return this.driver.readEventRelations(request.data.event_id, request.data.room_id, request.data.rel_type, request.data.event_type, request.data.from, request.data.to, request.data.limit, request.data.direction);
|
|
case 9:
|
|
result = _context8.sent;
|
|
// only return events that the user has the permission to receive
|
|
chunk = result.chunk.filter(function (e) {
|
|
if (e.state_key !== undefined) {
|
|
return _this1.canReceiveStateEvent(e.type, e.state_key);
|
|
} else {
|
|
return _this1.canReceiveRoomEvent(e.type, e.content["msgtype"]);
|
|
}
|
|
});
|
|
return _context8.abrupt("return", this.transport.reply(request, {
|
|
chunk: chunk,
|
|
prev_batch: result.prevBatch,
|
|
next_batch: result.nextBatch
|
|
}));
|
|
case 14:
|
|
_context8.prev = 14;
|
|
_context8.t0 = _context8["catch"](6);
|
|
console.error("error getting the relations", _context8.t0);
|
|
this.handleDriverError(_context8.t0, request, "Unexpected error while reading relations");
|
|
case 18:
|
|
case "end":
|
|
return _context8.stop();
|
|
}
|
|
}, _callee8, this, [[6, 14]]);
|
|
}));
|
|
function handleReadRelations(_x7) {
|
|
return _handleReadRelations.apply(this, arguments);
|
|
}
|
|
return handleReadRelations;
|
|
}()
|
|
}, {
|
|
key: "handleUserDirectorySearch",
|
|
value: function () {
|
|
var _handleUserDirectorySearch = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee9(request) {
|
|
var result;
|
|
return _regeneratorRuntime().wrap(function _callee9$(_context9) {
|
|
while (1) switch (_context9.prev = _context9.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC3973UserDirectorySearch)) {
|
|
_context9.next = 2;
|
|
break;
|
|
}
|
|
return _context9.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
}));
|
|
case 2:
|
|
if (!(typeof request.data.search_term !== "string")) {
|
|
_context9.next = 4;
|
|
break;
|
|
}
|
|
return _context9.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - missing search term"
|
|
}
|
|
}));
|
|
case 4:
|
|
if (!(request.data.limit !== undefined && request.data.limit < 0)) {
|
|
_context9.next = 6;
|
|
break;
|
|
}
|
|
return _context9.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Invalid request - limit out of range"
|
|
}
|
|
}));
|
|
case 6:
|
|
_context9.prev = 6;
|
|
_context9.next = 9;
|
|
return this.driver.searchUserDirectory(request.data.search_term, request.data.limit);
|
|
case 9:
|
|
result = _context9.sent;
|
|
return _context9.abrupt("return", this.transport.reply(request, {
|
|
limited: result.limited,
|
|
results: result.results.map(function (r) {
|
|
return {
|
|
user_id: r.userId,
|
|
display_name: r.displayName,
|
|
avatar_url: r.avatarUrl
|
|
};
|
|
})
|
|
}));
|
|
case 13:
|
|
_context9.prev = 13;
|
|
_context9.t0 = _context9["catch"](6);
|
|
console.error("error searching in the user directory", _context9.t0);
|
|
this.handleDriverError(_context9.t0, request, "Unexpected error while searching in the user directory");
|
|
case 17:
|
|
case "end":
|
|
return _context9.stop();
|
|
}
|
|
}, _callee9, this, [[6, 13]]);
|
|
}));
|
|
function handleUserDirectorySearch(_x8) {
|
|
return _handleUserDirectorySearch.apply(this, arguments);
|
|
}
|
|
return handleUserDirectorySearch;
|
|
}()
|
|
}, {
|
|
key: "handleGetMediaConfig",
|
|
value: function () {
|
|
var _handleGetMediaConfig = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee0(request) {
|
|
var result;
|
|
return _regeneratorRuntime().wrap(function _callee0$(_context0) {
|
|
while (1) switch (_context0.prev = _context0.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4039UploadFile)) {
|
|
_context0.next = 2;
|
|
break;
|
|
}
|
|
return _context0.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
}));
|
|
case 2:
|
|
_context0.prev = 2;
|
|
_context0.next = 5;
|
|
return this.driver.getMediaConfig();
|
|
case 5:
|
|
result = _context0.sent;
|
|
return _context0.abrupt("return", this.transport.reply(request, result));
|
|
case 9:
|
|
_context0.prev = 9;
|
|
_context0.t0 = _context0["catch"](2);
|
|
console.error("error while getting the media configuration", _context0.t0);
|
|
this.handleDriverError(_context0.t0, request, "Unexpected error while getting the media configuration");
|
|
case 13:
|
|
case "end":
|
|
return _context0.stop();
|
|
}
|
|
}, _callee0, this, [[2, 9]]);
|
|
}));
|
|
function handleGetMediaConfig(_x9) {
|
|
return _handleGetMediaConfig.apply(this, arguments);
|
|
}
|
|
return handleGetMediaConfig;
|
|
}()
|
|
}, {
|
|
key: "handleRtcTransports",
|
|
value: function () {
|
|
var _handleRtcTransports = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee1(request) {
|
|
var result;
|
|
return _regeneratorRuntime().wrap(function _callee1$(_context1) {
|
|
while (1) switch (_context1.prev = _context1.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4515RtcTransports)) {
|
|
_context1.next = 2;
|
|
break;
|
|
}
|
|
return _context1.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
}));
|
|
case 2:
|
|
_context1.prev = 2;
|
|
_context1.next = 5;
|
|
return this.driver.getRtcTransports();
|
|
case 5:
|
|
result = _context1.sent;
|
|
return _context1.abrupt("return", this.transport.reply(request, {
|
|
rtc_transports: result.rtc_transports
|
|
}));
|
|
case 9:
|
|
_context1.prev = 9;
|
|
_context1.t0 = _context1["catch"](2);
|
|
console.error("error while getting the RTC transports", _context1.t0);
|
|
this.handleDriverError(_context1.t0, request, "Unexpected error while getting the RTC transports");
|
|
case 13:
|
|
case "end":
|
|
return _context1.stop();
|
|
}
|
|
}, _callee1, this, [[2, 9]]);
|
|
}));
|
|
function handleRtcTransports(_x0) {
|
|
return _handleRtcTransports.apply(this, arguments);
|
|
}
|
|
return handleRtcTransports;
|
|
}()
|
|
}, {
|
|
key: "handleUploadFile",
|
|
value: function () {
|
|
var _handleUploadFile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee10(request) {
|
|
var result;
|
|
return _regeneratorRuntime().wrap(function _callee10$(_context10) {
|
|
while (1) switch (_context10.prev = _context10.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4039UploadFile)) {
|
|
_context10.next = 2;
|
|
break;
|
|
}
|
|
return _context10.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
}));
|
|
case 2:
|
|
_context10.prev = 2;
|
|
_context10.next = 5;
|
|
return this.driver.uploadFile(request.data.file);
|
|
case 5:
|
|
result = _context10.sent;
|
|
return _context10.abrupt("return", this.transport.reply(request, {
|
|
content_uri: result.contentUri
|
|
}));
|
|
case 9:
|
|
_context10.prev = 9;
|
|
_context10.t0 = _context10["catch"](2);
|
|
console.error("error while uploading a file", _context10.t0);
|
|
this.handleDriverError(_context10.t0, request, "Unexpected error while uploading a file");
|
|
case 13:
|
|
case "end":
|
|
return _context10.stop();
|
|
}
|
|
}, _callee10, this, [[2, 9]]);
|
|
}));
|
|
function handleUploadFile(_x1) {
|
|
return _handleUploadFile.apply(this, arguments);
|
|
}
|
|
return handleUploadFile;
|
|
}()
|
|
}, {
|
|
key: "handleDownloadFile",
|
|
value: function () {
|
|
var _handleDownloadFile = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee11(request) {
|
|
var result;
|
|
return _regeneratorRuntime().wrap(function _callee11$(_context11) {
|
|
while (1) switch (_context11.prev = _context11.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4039DownloadFile)) {
|
|
_context11.next = 2;
|
|
break;
|
|
}
|
|
return _context11.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
}));
|
|
case 2:
|
|
_context11.prev = 2;
|
|
_context11.next = 5;
|
|
return this.driver.downloadFile(request.data.content_uri);
|
|
case 5:
|
|
result = _context11.sent;
|
|
return _context11.abrupt("return", this.transport.reply(request, {
|
|
file: result.file
|
|
}));
|
|
case 9:
|
|
_context11.prev = 9;
|
|
_context11.t0 = _context11["catch"](2);
|
|
console.error("error while downloading a file", _context11.t0);
|
|
this.handleDriverError(_context11.t0, request, "Unexpected error while downloading a file");
|
|
case 13:
|
|
case "end":
|
|
return _context11.stop();
|
|
}
|
|
}, _callee11, this, [[2, 9]]);
|
|
}));
|
|
function handleDownloadFile(_x10) {
|
|
return _handleDownloadFile.apply(this, arguments);
|
|
}
|
|
return handleDownloadFile;
|
|
}()
|
|
}, {
|
|
key: "handleRtcLivekitGetToken",
|
|
value: function () {
|
|
var _handleRtcLivekitGetToken = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee12(request) {
|
|
var result;
|
|
return _regeneratorRuntime().wrap(function _callee12$(_context12) {
|
|
while (1) switch (_context12.prev = _context12.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4533RtcLivekitGetToken)) {
|
|
_context12.next = 2;
|
|
break;
|
|
}
|
|
return _context12.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
}));
|
|
case 2:
|
|
_context12.prev = 2;
|
|
_context12.next = 5;
|
|
return this.driver.getRtcLivekitToken(request.data);
|
|
case 5:
|
|
result = _context12.sent;
|
|
return _context12.abrupt("return", this.transport.reply(request, result));
|
|
case 9:
|
|
_context12.prev = 9;
|
|
_context12.t0 = _context12["catch"](2);
|
|
console.error("error while getting a LiveKit token", _context12.t0);
|
|
this.handleDriverError(_context12.t0, request, "Unexpected error while getting a LiveKit token");
|
|
case 13:
|
|
case "end":
|
|
return _context12.stop();
|
|
}
|
|
}, _callee12, this, [[2, 9]]);
|
|
}));
|
|
function handleRtcLivekitGetToken(_x11) {
|
|
return _handleRtcLivekitGetToken.apply(this, arguments);
|
|
}
|
|
return handleRtcLivekitGetToken;
|
|
}()
|
|
}, {
|
|
key: "handleRtcLivekitDelegateDelayedLeave",
|
|
value: function () {
|
|
var _handleRtcLivekitDelegateDelayedLeave = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee13(request) {
|
|
var result;
|
|
return _regeneratorRuntime().wrap(function _callee13$(_context13) {
|
|
while (1) switch (_context13.prev = _context13.next) {
|
|
case 0:
|
|
if (this.hasCapability(_Capabilities.MatrixCapabilities.MSC4533RtcLivekitDelegateDelayedLeave)) {
|
|
_context13.next = 2;
|
|
break;
|
|
}
|
|
return _context13.abrupt("return", this.transport.reply(request, {
|
|
error: {
|
|
message: "Missing capability"
|
|
}
|
|
}));
|
|
case 2:
|
|
_context13.prev = 2;
|
|
_context13.next = 5;
|
|
return this.driver.delegateRtcLivekitDelayedLeave(request.data);
|
|
case 5:
|
|
result = _context13.sent;
|
|
return _context13.abrupt("return", this.transport.reply(request, result));
|
|
case 9:
|
|
_context13.prev = 9;
|
|
_context13.t0 = _context13["catch"](2);
|
|
console.error("error while delegating a LiveKit delayed leave", _context13.t0);
|
|
this.handleDriverError(_context13.t0, request, "Unexpected error while delegating a LiveKit delayed leave");
|
|
case 13:
|
|
case "end":
|
|
return _context13.stop();
|
|
}
|
|
}, _callee13, this, [[2, 9]]);
|
|
}));
|
|
function handleRtcLivekitDelegateDelayedLeave(_x12) {
|
|
return _handleRtcLivekitDelegateDelayedLeave.apply(this, arguments);
|
|
}
|
|
return handleRtcLivekitDelegateDelayedLeave;
|
|
}()
|
|
}, {
|
|
key: "handleDriverError",
|
|
value: function handleDriverError(e, request, message) {
|
|
var data = this.driver.processError(e);
|
|
this.transport.reply(request, {
|
|
error: _objectSpread({
|
|
message: message
|
|
}, data)
|
|
});
|
|
}
|
|
}, {
|
|
key: "handleMessage",
|
|
value: function handleMessage(ev) {
|
|
if (this.isStopped) return;
|
|
var actionEv = new CustomEvent("action:".concat(ev.detail.action), {
|
|
detail: ev.detail,
|
|
cancelable: true
|
|
});
|
|
this.emit("action:".concat(ev.detail.action), actionEv);
|
|
if (!actionEv.defaultPrevented) {
|
|
switch (ev.detail.action) {
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.ContentLoaded:
|
|
return this.handleContentLoadedAction(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.SupportedApiVersions:
|
|
return this.replyVersions(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.SendEvent:
|
|
return this.handleSendEvent(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.SendToDevice:
|
|
return this.handleSendToDevice(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.GetOpenIDCredentials:
|
|
return this.handleOIDC(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC2931Navigate:
|
|
return this.handleNavigate(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC2974RenegotiateCapabilities:
|
|
return this.handleCapabilitiesRenegotiate(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC2876ReadEvents:
|
|
return this.handleReadEvents(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.WatchTurnServers:
|
|
return this.handleWatchTurnServers(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.UnwatchTurnServers:
|
|
return this.handleUnwatchTurnServers(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC3869ReadRelations:
|
|
return this.handleReadRelations(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC3973UserDirectorySearch:
|
|
return this.handleUserDirectorySearch(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.BeeperReadRoomAccountData:
|
|
return this.handleReadRoomAccountData(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4039GetMediaConfigAction:
|
|
return this.handleGetMediaConfig(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4515GetRtcTransports:
|
|
return this.handleRtcTransports(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4039UploadFileAction:
|
|
return this.handleUploadFile(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4039DownloadFileAction:
|
|
return this.handleDownloadFile(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4157UpdateDelayedEvent:
|
|
return this.handleUpdateDelayedEvent(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4533RtcLivekitGetToken:
|
|
return this.handleRtcLivekitGetToken(ev.detail);
|
|
case _WidgetApiAction.WidgetApiFromWidgetAction.MSC4533RtcLivekitDelegateDelayedLeave:
|
|
return this.handleRtcLivekitDelegateDelayedLeave(ev.detail);
|
|
default:
|
|
return this.transport.reply(ev.detail, {
|
|
error: {
|
|
message: "Unknown or unsupported from-widget action: " + ev.detail.action
|
|
}
|
|
});
|
|
}
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Informs the widget that the client's theme has changed.
|
|
* @param theme The theme data, as an object with arbitrary contents.
|
|
*/
|
|
}, {
|
|
key: "updateTheme",
|
|
value: function updateTheme(theme) {
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.ThemeChange, theme);
|
|
}
|
|
|
|
/**
|
|
* Informs the widget that the client's language has changed.
|
|
* @param lang The BCP 47 identifier representing the client's current language.
|
|
*/
|
|
}, {
|
|
key: "updateLanguage",
|
|
value: function updateLanguage(lang) {
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.LanguageChange, {
|
|
lang: lang
|
|
});
|
|
}
|
|
|
|
/**
|
|
* Takes a screenshot of the widget.
|
|
* @returns Resolves to the widget's screenshot.
|
|
* @throws Throws if there is a problem.
|
|
*/
|
|
}, {
|
|
key: "takeScreenshot",
|
|
value: function takeScreenshot() {
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.TakeScreenshot, {});
|
|
}
|
|
|
|
/**
|
|
* Alerts the widget to whether or not it is currently visible.
|
|
* @param {boolean} isVisible Whether the widget is visible or not.
|
|
* @returns {Promise<IWidgetApiResponseData>} Resolves when the widget acknowledges the update.
|
|
*/
|
|
}, {
|
|
key: "updateVisibility",
|
|
value: function updateVisibility(isVisible) {
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateVisibility, {
|
|
visible: isVisible
|
|
});
|
|
}
|
|
}, {
|
|
key: "sendWidgetConfig",
|
|
value: function sendWidgetConfig(data) {
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.WidgetConfig, data).then();
|
|
}
|
|
}, {
|
|
key: "notifyModalWidgetButtonClicked",
|
|
value: function notifyModalWidgetButtonClicked(id) {
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.ButtonClicked, {
|
|
id: id
|
|
}).then();
|
|
}
|
|
}, {
|
|
key: "notifyModalWidgetClose",
|
|
value: function notifyModalWidgetClose(data) {
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.CloseModalWidget, data).then();
|
|
}
|
|
|
|
/**
|
|
* Feeds an event to the widget. As a client you are expected to call this
|
|
* for every new event in every room to which you are joined or invited.
|
|
* @param {IRoomEvent} rawEvent The event to (try to) send to the widget.
|
|
* @param {string} currentViewedRoomId The room ID the user is currently
|
|
* interacting with. Not the room ID of the event.
|
|
* @returns {Promise<void>} Resolves when delivered or if the widget is not
|
|
* able to read the event due to permissions, rejects if the widget failed
|
|
* to handle the event.
|
|
* @deprecated It is recommended to communicate the viewed room ID by calling
|
|
* {@link ClientWidgetApi.setViewedRoomId} rather than passing it to this
|
|
* method.
|
|
*/
|
|
}, {
|
|
key: "feedEvent",
|
|
value: function () {
|
|
var _feedEvent = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee14(rawEvent, currentViewedRoomId) {
|
|
var _rawEvent$content;
|
|
return _regeneratorRuntime().wrap(function _callee14$(_context14) {
|
|
while (1) switch (_context14.prev = _context14.next) {
|
|
case 0:
|
|
if (currentViewedRoomId !== undefined) this.setViewedRoomId(currentViewedRoomId);
|
|
if (!(rawEvent.room_id !== this.viewedRoomId && !this.canUseRoomTimeline(rawEvent.room_id))) {
|
|
_context14.next = 3;
|
|
break;
|
|
}
|
|
return _context14.abrupt("return");
|
|
case 3:
|
|
if (!(rawEvent.state_key !== undefined && rawEvent.state_key !== null)) {
|
|
_context14.next = 8;
|
|
break;
|
|
}
|
|
if (this.canReceiveStateEvent(rawEvent.type, rawEvent.state_key)) {
|
|
_context14.next = 6;
|
|
break;
|
|
}
|
|
return _context14.abrupt("return");
|
|
case 6:
|
|
_context14.next = 10;
|
|
break;
|
|
case 8:
|
|
if (this.canReceiveRoomEvent(rawEvent.type, (_rawEvent$content = rawEvent.content) === null || _rawEvent$content === void 0 ? void 0 : _rawEvent$content["msgtype"])) {
|
|
_context14.next = 10;
|
|
break;
|
|
}
|
|
return _context14.abrupt("return");
|
|
case 10:
|
|
_context14.next = 12;
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SendEvent,
|
|
// it's compatible, but missing the index signature
|
|
rawEvent);
|
|
case 12:
|
|
case "end":
|
|
return _context14.stop();
|
|
}
|
|
}, _callee14, this);
|
|
}));
|
|
function feedEvent(_x13, _x14) {
|
|
return _feedEvent.apply(this, arguments);
|
|
}
|
|
return feedEvent;
|
|
}()
|
|
/**
|
|
* Feeds a to-device event to the widget. As a client you are expected to
|
|
* call this for every to-device event you receive.
|
|
* @param {IRoomEvent} rawEvent The event to (try to) send to the widget.
|
|
* @param {boolean} encrypted Whether the event contents were encrypted.
|
|
* @returns {Promise<void>} Resolves when delivered or if the widget is not
|
|
* able to receive the event due to permissions, rejects if the widget
|
|
* failed to handle the event.
|
|
*/
|
|
}, {
|
|
key: "feedToDevice",
|
|
value: (function () {
|
|
var _feedToDevice = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee15(message, encrypted) {
|
|
return _regeneratorRuntime().wrap(function _callee15$(_context15) {
|
|
while (1) switch (_context15.prev = _context15.next) {
|
|
case 0:
|
|
if (!this.canReceiveToDeviceEvent(message.type)) {
|
|
_context15.next = 3;
|
|
break;
|
|
}
|
|
_context15.next = 3;
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SendToDevice, _objectSpread(_objectSpread({}, message), {}, {
|
|
encrypted: encrypted
|
|
}));
|
|
case 3:
|
|
case "end":
|
|
return _context15.stop();
|
|
}
|
|
}, _callee15, this);
|
|
}));
|
|
function feedToDevice(_x15, _x16) {
|
|
return _feedToDevice.apply(this, arguments);
|
|
}
|
|
return feedToDevice;
|
|
}())
|
|
}, {
|
|
key: "setViewedRoomId",
|
|
value:
|
|
/**
|
|
* Indicate that a room is being viewed (making it possible for the widget
|
|
* to interact with it).
|
|
*/
|
|
function setViewedRoomId(roomId) {
|
|
this.viewedRoomId = roomId;
|
|
// If the widget doesn't have timeline permissions for the room then
|
|
// this is its opportunity to learn the room state. We push the entire
|
|
// room state, which could be redundant if this room had been viewed
|
|
// once before, but it's easier than selectively pushing just the bits
|
|
// of state that changed while the room was in the background.
|
|
if (roomId !== null && !this.canUseRoomTimeline(roomId)) this.pushRoomState(roomId);
|
|
}
|
|
}, {
|
|
key: "flushRoomState",
|
|
value: function () {
|
|
var _flushRoomState = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee16() {
|
|
var events, _iterator7, _step7, eventTypeMap, _iterator8, _step8, stateKeyMap;
|
|
return _regeneratorRuntime().wrap(function _callee16$(_context16) {
|
|
while (1) switch (_context16.prev = _context16.next) {
|
|
case 0:
|
|
_context16.prev = 0;
|
|
case 1:
|
|
_context16.next = 3;
|
|
return Promise.all(this.pushRoomStateTasks);
|
|
case 3:
|
|
if (this.pushRoomStateTasks.size > 0) {
|
|
_context16.next = 1;
|
|
break;
|
|
}
|
|
case 4:
|
|
events = [];
|
|
_iterator7 = _createForOfIteratorHelper(this.pushRoomStateResult.values());
|
|
try {
|
|
for (_iterator7.s(); !(_step7 = _iterator7.n()).done;) {
|
|
eventTypeMap = _step7.value;
|
|
_iterator8 = _createForOfIteratorHelper(eventTypeMap.values());
|
|
try {
|
|
for (_iterator8.s(); !(_step8 = _iterator8.n()).done;) {
|
|
stateKeyMap = _step8.value;
|
|
events.push.apply(events, _toConsumableArray(stateKeyMap.values()));
|
|
}
|
|
} catch (err) {
|
|
_iterator8.e(err);
|
|
} finally {
|
|
_iterator8.f();
|
|
}
|
|
}
|
|
} catch (err) {
|
|
_iterator7.e(err);
|
|
} finally {
|
|
_iterator7.f();
|
|
}
|
|
_context16.next = 9;
|
|
return this.getWidgetVersions();
|
|
case 9:
|
|
if (!_context16.sent.includes(_ApiVersion.UnstableApiVersion.MSC2762_UPDATE_STATE)) {
|
|
_context16.next = 12;
|
|
break;
|
|
}
|
|
_context16.next = 12;
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateState, {
|
|
state: events
|
|
});
|
|
case 12:
|
|
_context16.prev = 12;
|
|
this.flushRoomStateTask = null;
|
|
return _context16.finish(12);
|
|
case 15:
|
|
case "end":
|
|
return _context16.stop();
|
|
}
|
|
}, _callee16, this, [[0,, 12, 15]]);
|
|
}));
|
|
function flushRoomState() {
|
|
return _flushRoomState.apply(this, arguments);
|
|
}
|
|
return flushRoomState;
|
|
}()
|
|
/**
|
|
* Reads the current sticky state of the room and pushes it to the widget.
|
|
*
|
|
* It will only push events that the widget is allowed to receive.
|
|
* @param roomId
|
|
* @private
|
|
*/
|
|
}, {
|
|
key: "pushStickyState",
|
|
value: (function () {
|
|
var _pushStickyState = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee18(roomId) {
|
|
var _this10 = this;
|
|
return _regeneratorRuntime().wrap(function _callee18$(_context18) {
|
|
while (1) switch (_context18.prev = _context18.next) {
|
|
case 0:
|
|
console.debug("Pushing sticky state to widget for room", roomId);
|
|
return _context18.abrupt("return", this.driver.readStickyEvents(roomId).then(function (events) {
|
|
// filter to the allowed sticky events
|
|
var filtered = events.filter(function (e) {
|
|
var _e$content;
|
|
return _this10.canReceiveRoomEvent(e.type, typeof ((_e$content = e.content) === null || _e$content === void 0 ? void 0 : _e$content.msgtype) === "string" ? e.content.msgtype : null);
|
|
});
|
|
return {
|
|
roomId: roomId,
|
|
stickyEvents: filtered
|
|
};
|
|
}).then(/*#__PURE__*/function () {
|
|
var _ref2 = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee17(_ref) {
|
|
var roomId, stickyEvents, promises;
|
|
return _regeneratorRuntime().wrap(function _callee17$(_context17) {
|
|
while (1) switch (_context17.prev = _context17.next) {
|
|
case 0:
|
|
roomId = _ref.roomId, stickyEvents = _ref.stickyEvents;
|
|
console.debug("Pushing", stickyEvents.length, "sticky events to widget for room", roomId);
|
|
promises = stickyEvents.map(function (rawEvent) {
|
|
return _this10.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.SendEvent,
|
|
// copied from feedEvent; it's compatible, but missing the index signature
|
|
rawEvent);
|
|
});
|
|
_context17.next = 5;
|
|
return Promise.all(promises);
|
|
case 5:
|
|
case "end":
|
|
return _context17.stop();
|
|
}
|
|
}, _callee17);
|
|
}));
|
|
return function (_x18) {
|
|
return _ref2.apply(this, arguments);
|
|
};
|
|
}()));
|
|
case 2:
|
|
case "end":
|
|
return _context18.stop();
|
|
}
|
|
}, _callee18, this);
|
|
}));
|
|
function pushStickyState(_x17) {
|
|
return _pushStickyState.apply(this, arguments);
|
|
}
|
|
return pushStickyState;
|
|
}()
|
|
/**
|
|
* Read the room's state and push all entries that the widget is allowed to
|
|
* read through to the widget.
|
|
*/
|
|
)
|
|
}, {
|
|
key: "pushRoomState",
|
|
value: function pushRoomState(roomId) {
|
|
var _this11 = this;
|
|
var _iterator9 = _createForOfIteratorHelper(this.allowedEvents),
|
|
_step9;
|
|
try {
|
|
var _loop2 = function _loop2() {
|
|
var cap = _step9.value;
|
|
if (cap.kind === _WidgetEventCapability.EventKind.State && cap.direction === _WidgetEventCapability.EventDirection.Receive) {
|
|
var _cap$keyStr, _this11$flushRoomStat;
|
|
// Initiate the task
|
|
var events = _this11.driver.readRoomState(roomId, cap.eventType, (_cap$keyStr = cap.keyStr) !== null && _cap$keyStr !== void 0 ? _cap$keyStr : undefined);
|
|
var task = events.then(function (events) {
|
|
// When complete, queue the resulting events to be
|
|
// pushed to the widget
|
|
var _iterator0 = _createForOfIteratorHelper(events),
|
|
_step0;
|
|
try {
|
|
for (_iterator0.s(); !(_step0 = _iterator0.n()).done;) {
|
|
var event = _step0.value;
|
|
var eventTypeMap = _this11.pushRoomStateResult.get(roomId);
|
|
if (eventTypeMap === undefined) {
|
|
eventTypeMap = new Map();
|
|
_this11.pushRoomStateResult.set(roomId, eventTypeMap);
|
|
}
|
|
var stateKeyMap = eventTypeMap.get(cap.eventType);
|
|
if (stateKeyMap === undefined) {
|
|
stateKeyMap = new Map();
|
|
eventTypeMap.set(cap.eventType, stateKeyMap);
|
|
}
|
|
if (!stateKeyMap.has(event.state_key)) stateKeyMap.set(event.state_key, event);
|
|
}
|
|
} catch (err) {
|
|
_iterator0.e(err);
|
|
} finally {
|
|
_iterator0.f();
|
|
}
|
|
}, function (e) {
|
|
return console.error("Failed to read room state for ".concat(roomId, " (").concat(cap.eventType, ", ").concat(cap.keyStr, ")"), e);
|
|
}).then(function () {
|
|
// Mark request as no longer pending
|
|
_this11.pushRoomStateTasks["delete"](task);
|
|
});
|
|
|
|
// Mark task as pending
|
|
_this11.pushRoomStateTasks.add(task);
|
|
// Assuming no other tasks are already happening concurrently,
|
|
// schedule the widget action that actually pushes the events
|
|
(_this11$flushRoomStat = _this11.flushRoomStateTask) !== null && _this11$flushRoomStat !== void 0 ? _this11$flushRoomStat : _this11.flushRoomStateTask = _this11.flushRoomState();
|
|
_this11.flushRoomStateTask["catch"](function (e) {
|
|
return console.error("Failed to push room state", e);
|
|
});
|
|
}
|
|
};
|
|
for (_iterator9.s(); !(_step9 = _iterator9.n()).done;) {
|
|
_loop2();
|
|
}
|
|
} catch (err) {
|
|
_iterator9.e(err);
|
|
} finally {
|
|
_iterator9.f();
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Feeds a room state update to the widget. As a client you are expected to
|
|
* call this for every state update in every room to which you are joined or
|
|
* invited.
|
|
* @param {IRoomEvent} rawEvent The state event corresponding to the updated
|
|
* room state entry.
|
|
* @returns {Promise<void>} Resolves when delivered or if the widget is not
|
|
* able to receive the room state due to permissions, rejects if the
|
|
* widget failed to handle the update.
|
|
*/
|
|
}, {
|
|
key: "feedStateUpdate",
|
|
value: (function () {
|
|
var _feedStateUpdate = _asyncToGenerator(/*#__PURE__*/_regeneratorRuntime().mark(function _callee19(rawEvent) {
|
|
var eventTypeMap, stateKeyMap;
|
|
return _regeneratorRuntime().wrap(function _callee19$(_context19) {
|
|
while (1) switch (_context19.prev = _context19.next) {
|
|
case 0:
|
|
if (!(rawEvent.state_key === undefined)) {
|
|
_context19.next = 2;
|
|
break;
|
|
}
|
|
throw new Error("Not a state event");
|
|
case 2:
|
|
if (!((rawEvent.room_id === this.viewedRoomId || this.canUseRoomTimeline(rawEvent.room_id)) && this.canReceiveStateEvent(rawEvent.type, rawEvent.state_key))) {
|
|
_context19.next = 21;
|
|
break;
|
|
}
|
|
if (!(this.pushRoomStateTasks.size === 0)) {
|
|
_context19.next = 11;
|
|
break;
|
|
}
|
|
_context19.next = 6;
|
|
return this.getWidgetVersions();
|
|
case 6:
|
|
if (!_context19.sent.includes(_ApiVersion.UnstableApiVersion.MSC2762_UPDATE_STATE)) {
|
|
_context19.next = 9;
|
|
break;
|
|
}
|
|
_context19.next = 9;
|
|
return this.transport.send(_WidgetApiAction.WidgetApiToWidgetAction.UpdateState, {
|
|
state: [rawEvent]
|
|
});
|
|
case 9:
|
|
_context19.next = 21;
|
|
break;
|
|
case 11:
|
|
// Lump the update in with whatever data will be sent in the
|
|
// initial push later. Even if we set it to an "outdated" entry
|
|
// here, we can count on any newer entries being passed to this
|
|
// same method eventually; this won't cause stuck state.
|
|
eventTypeMap = this.pushRoomStateResult.get(rawEvent.room_id);
|
|
if (eventTypeMap === undefined) {
|
|
eventTypeMap = new Map();
|
|
this.pushRoomStateResult.set(rawEvent.room_id, eventTypeMap);
|
|
}
|
|
stateKeyMap = eventTypeMap.get(rawEvent.type);
|
|
if (stateKeyMap === undefined) {
|
|
stateKeyMap = new Map();
|
|
eventTypeMap.set(rawEvent.type, stateKeyMap);
|
|
}
|
|
if (!stateKeyMap.has(rawEvent.type)) stateKeyMap.set(rawEvent.state_key, rawEvent);
|
|
case 16:
|
|
_context19.next = 18;
|
|
return Promise.all(this.pushRoomStateTasks);
|
|
case 18:
|
|
if (this.pushRoomStateTasks.size > 0) {
|
|
_context19.next = 16;
|
|
break;
|
|
}
|
|
case 19:
|
|
_context19.next = 21;
|
|
return this.flushRoomStateTask;
|
|
case 21:
|
|
case "end":
|
|
return _context19.stop();
|
|
}
|
|
}, _callee19, this);
|
|
}));
|
|
function feedStateUpdate(_x19) {
|
|
return _feedStateUpdate.apply(this, arguments);
|
|
}
|
|
return feedStateUpdate;
|
|
}())
|
|
}]);
|
|
return ClientWidgetApi;
|
|
}(_events.EventEmitter);
|
|
exports.ClientWidgetApi = ClientWidgetApi;
|
|
//# sourceMappingURL=ClientWidgetApi.js.map
|