matrix-react-sdk
Version:
SDK for matrix.org using React
104 lines (99 loc) • 16.3 kB
JavaScript
"use strict";
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.MediaEventHelper = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
var _matrix = require("matrix-js-sdk/src/matrix");
var _logger = require("matrix-js-sdk/src/logger");
var _LazyValue = require("./LazyValue");
var _Media = require("../customisations/Media");
var _DecryptFile = require("./DecryptFile");
/*
Copyright 2024 New Vector Ltd.
Copyright 2021 The Matrix.org Foundation C.I.C.
SPDX-License-Identifier: AGPL-3.0-only OR GPL-3.0-only
Please see LICENSE files in the repository root for full details.
*/
// TODO: We should consider caching the blobs. https://github.com/vector-im/element-web/issues/17192
class MediaEventHelper {
constructor(event) {
// Either an HTTP or Object URL (when encrypted) to the media.
(0, _defineProperty2.default)(this, "sourceUrl", void 0);
(0, _defineProperty2.default)(this, "thumbnailUrl", void 0);
// Either the raw or decrypted (when encrypted) contents of the file.
(0, _defineProperty2.default)(this, "sourceBlob", void 0);
(0, _defineProperty2.default)(this, "thumbnailBlob", void 0);
(0, _defineProperty2.default)(this, "media", void 0);
(0, _defineProperty2.default)(this, "prepareSourceUrl", async () => {
if (this.media.isEncrypted) {
const blob = await this.sourceBlob.value;
return URL.createObjectURL(blob);
} else {
return this.media.srcHttp;
}
});
(0, _defineProperty2.default)(this, "prepareThumbnailUrl", async () => {
if (this.media.isEncrypted) {
const blob = await this.thumbnailBlob.value;
if (blob === null) return null;
return URL.createObjectURL(blob);
} else {
return this.media.thumbnailHttp;
}
});
(0, _defineProperty2.default)(this, "fetchSource", () => {
if (this.media.isEncrypted) {
const content = this.event.getContent();
return (0, _DecryptFile.decryptFile)(content.file, content.info);
}
return this.media.downloadSource().then(r => r.blob());
});
(0, _defineProperty2.default)(this, "fetchThumbnail", () => {
if (!this.media.hasThumbnail) return Promise.resolve(null);
if (this.media.isEncrypted) {
const content = this.event.getContent();
if (content.info?.thumbnail_file) {
return (0, _DecryptFile.decryptFile)(content.info.thumbnail_file, content.info.thumbnail_info);
} else {
// "Should never happen"
_logger.logger.warn("Media claims to have thumbnail and is encrypted, but no thumbnail_file found");
return Promise.resolve(null);
}
}
const thumbnailHttp = this.media.thumbnailHttp;
if (!thumbnailHttp) return Promise.resolve(null);
return fetch(thumbnailHttp).then(r => r.blob());
});
this.event = event;
this.sourceUrl = new _LazyValue.LazyValue(this.prepareSourceUrl);
this.thumbnailUrl = new _LazyValue.LazyValue(this.prepareThumbnailUrl);
this.sourceBlob = new _LazyValue.LazyValue(this.fetchSource);
this.thumbnailBlob = new _LazyValue.LazyValue(this.fetchThumbnail);
this.media = (0, _Media.mediaFromContent)(this.event.getContent());
}
get fileName() {
return this.event.getContent().filename || this.event.getContent().body || "download";
}
destroy() {
if (this.media.isEncrypted) {
if (this.sourceUrl.cachedValue) URL.revokeObjectURL(this.sourceUrl.cachedValue);
if (this.thumbnailUrl.cachedValue) URL.revokeObjectURL(this.thumbnailUrl.cachedValue);
}
}
static isEligible(event) {
if (!event) return false;
if (event.isRedacted()) return false;
if (event.getType() === _matrix.EventType.Sticker) return true;
if (event.getType() !== _matrix.EventType.RoomMessage) return false;
const content = event.getContent();
const mediaMsgTypes = [_matrix.MsgType.Video, _matrix.MsgType.Audio, _matrix.MsgType.Image, _matrix.MsgType.File];
if (mediaMsgTypes.includes(content.msgtype)) return true;
if (typeof content.url === "string") return true;
// Finally, it's probably not media
return false;
}
}
exports.MediaEventHelper = MediaEventHelper;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJfbWF0cml4IiwicmVxdWlyZSIsIl9sb2dnZXIiLCJfTGF6eVZhbHVlIiwiX01lZGlhIiwiX0RlY3J5cHRGaWxlIiwiTWVkaWFFdmVudEhlbHBlciIsImNvbnN0cnVjdG9yIiwiZXZlbnQiLCJfZGVmaW5lUHJvcGVydHkyIiwiZGVmYXVsdCIsIm1lZGlhIiwiaXNFbmNyeXB0ZWQiLCJibG9iIiwic291cmNlQmxvYiIsInZhbHVlIiwiVVJMIiwiY3JlYXRlT2JqZWN0VVJMIiwic3JjSHR0cCIsInRodW1ibmFpbEJsb2IiLCJ0aHVtYm5haWxIdHRwIiwiY29udGVudCIsImdldENvbnRlbnQiLCJkZWNyeXB0RmlsZSIsImZpbGUiLCJpbmZvIiwiZG93bmxvYWRTb3VyY2UiLCJ0aGVuIiwiciIsImhhc1RodW1ibmFpbCIsIlByb21pc2UiLCJyZXNvbHZlIiwidGh1bWJuYWlsX2ZpbGUiLCJ0aHVtYm5haWxfaW5mbyIsImxvZ2dlciIsIndhcm4iLCJmZXRjaCIsInNvdXJjZVVybCIsIkxhenlWYWx1ZSIsInByZXBhcmVTb3VyY2VVcmwiLCJ0aHVtYm5haWxVcmwiLCJwcmVwYXJlVGh1bWJuYWlsVXJsIiwiZmV0Y2hTb3VyY2UiLCJmZXRjaFRodW1ibmFpbCIsIm1lZGlhRnJvbUNvbnRlbnQiLCJmaWxlTmFtZSIsImZpbGVuYW1lIiwiYm9keSIsImRlc3Ryb3kiLCJjYWNoZWRWYWx1ZSIsInJldm9rZU9iamVjdFVSTCIsImlzRWxpZ2libGUiLCJpc1JlZGFjdGVkIiwiZ2V0VHlwZSIsIkV2ZW50VHlwZSIsIlN0aWNrZXIiLCJSb29tTWVzc2FnZSIsIm1lZGlhTXNnVHlwZXMiLCJNc2dUeXBlIiwiVmlkZW8iLCJBdWRpbyIsIkltYWdlIiwiRmlsZSIsImluY2x1ZGVzIiwibXNndHlwZSIsInVybCIsImV4cG9ydHMiXSwic291cmNlcyI6WyIuLi8uLi9zcmMvdXRpbHMvTWVkaWFFdmVudEhlbHBlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5pbXBvcnQgeyBNYXRyaXhFdmVudCwgRXZlbnRUeXBlLCBNc2dUeXBlIH0gZnJvbSBcIm1hdHJpeC1qcy1zZGsvc3JjL21hdHJpeFwiO1xuaW1wb3J0IHsgRmlsZUNvbnRlbnQsIEltYWdlQ29udGVudCwgTWVkaWFFdmVudENvbnRlbnQgfSBmcm9tIFwibWF0cml4LWpzLXNkay9zcmMvdHlwZXNcIjtcbmltcG9ydCB7IGxvZ2dlciB9IGZyb20gXCJtYXRyaXgtanMtc2RrL3NyYy9sb2dnZXJcIjtcblxuaW1wb3J0IHsgTGF6eVZhbHVlIH0gZnJvbSBcIi4vTGF6eVZhbHVlXCI7XG5pbXBvcnQgeyBNZWRpYSwgbWVkaWFGcm9tQ29udGVudCB9IGZyb20gXCIuLi9jdXN0b21pc2F0aW9ucy9NZWRpYVwiO1xuaW1wb3J0IHsgZGVjcnlwdEZpbGUgfSBmcm9tIFwiLi9EZWNyeXB0RmlsZVwiO1xuaW1wb3J0IHsgSURlc3Ryb3lhYmxlIH0gZnJvbSBcIi4vSURlc3Ryb3lhYmxlXCI7XG5cbi8vIFRPRE86IFdlIHNob3VsZCBjb25zaWRlciBjYWNoaW5nIHRoZSBibG9icy4gaHR0cHM6Ly9naXRodWIuY29tL3ZlY3Rvci1pbS9lbGVtZW50LXdlYi9pc3N1ZXMvMTcxOTJcblxuZXhwb3J0IGNsYXNzIE1lZGlhRXZlbnRIZWxwZXIgaW1wbGVtZW50cyBJRGVzdHJveWFibGUge1xuICAgIC8vIEVpdGhlciBhbiBIVFRQIG9yIE9iamVjdCBVUkwgKHdoZW4gZW5jcnlwdGVkKSB0byB0aGUgbWVkaWEuXG4gICAgcHVibGljIHJlYWRvbmx5IHNvdXJjZVVybDogTGF6eVZhbHVlPHN0cmluZyB8IG51bGw+O1xuICAgIHB1YmxpYyByZWFkb25seSB0aHVtYm5haWxVcmw6IExhenlWYWx1ZTxzdHJpbmcgfCBudWxsPjtcblxuICAgIC8vIEVpdGhlciB0aGUgcmF3IG9yIGRlY3J5cHRlZCAod2hlbiBlbmNyeXB0ZWQpIGNvbnRlbnRzIG9mIHRoZSBmaWxlLlxuICAgIHB1YmxpYyByZWFkb25seSBzb3VyY2VCbG9iOiBMYXp5VmFsdWU8QmxvYj47XG4gICAgcHVibGljIHJlYWRvbmx5IHRodW1ibmFpbEJsb2I6IExhenlWYWx1ZTxCbG9iIHwgbnVsbD47XG5cbiAgICBwdWJsaWMgcmVhZG9ubHkgbWVkaWE6IE1lZGlhO1xuXG4gICAgcHVibGljIGNvbnN0cnVjdG9yKHByaXZhdGUgZXZlbnQ6IE1hdHJpeEV2ZW50KSB7XG4gICAgICAgIHRoaXMuc291cmNlVXJsID0gbmV3IExhenlWYWx1ZSh0aGlzLnByZXBhcmVTb3VyY2VVcmwpO1xuICAgICAgICB0aGlzLnRodW1ibmFpbFVybCA9IG5ldyBMYXp5VmFsdWUodGhpcy5wcmVwYXJlVGh1bWJuYWlsVXJsKTtcbiAgICAgICAgdGhpcy5zb3VyY2VCbG9iID0gbmV3IExhenlWYWx1ZSh0aGlzLmZldGNoU291cmNlKTtcbiAgICAgICAgdGhpcy50aHVtYm5haWxCbG9iID0gbmV3IExhenlWYWx1ZSh0aGlzLmZldGNoVGh1bWJuYWlsKTtcblxuICAgICAgICB0aGlzLm1lZGlhID0gbWVkaWFGcm9tQ29udGVudCh0aGlzLmV2ZW50LmdldENvbnRlbnQoKSk7XG4gICAgfVxuXG4gICAgcHVibGljIGdldCBmaWxlTmFtZSgpOiBzdHJpbmcge1xuICAgICAgICByZXR1cm4gKFxuICAgICAgICAgICAgdGhpcy5ldmVudC5nZXRDb250ZW50PEZpbGVDb250ZW50PigpLmZpbGVuYW1lIHx8XG4gICAgICAgICAgICB0aGlzLmV2ZW50LmdldENvbnRlbnQ8TWVkaWFFdmVudENvbnRlbnQ+KCkuYm9keSB8fFxuICAgICAgICAgICAgXCJkb3dubG9hZFwiXG4gICAgICAgICk7XG4gICAgfVxuXG4gICAgcHVibGljIGRlc3Ryb3koKTogdm9pZCB7XG4gICAgICAgIGlmICh0aGlzLm1lZGlhLmlzRW5jcnlwdGVkKSB7XG4gICAgICAgICAgICBpZiAodGhpcy5zb3VyY2VVcmwuY2FjaGVkVmFsdWUpIFVSTC5yZXZva2VPYmplY3RVUkwodGhpcy5zb3VyY2VVcmwuY2FjaGVkVmFsdWUpO1xuICAgICAgICAgICAgaWYgKHRoaXMudGh1bWJuYWlsVXJsLmNhY2hlZFZhbHVlKSBVUkwucmV2b2tlT2JqZWN0VVJMKHRoaXMudGh1bWJuYWlsVXJsLmNhY2hlZFZhbHVlKTtcbiAgICAgICAgfVxuICAgIH1cblxuICAgIHByaXZhdGUgcHJlcGFyZVNvdXJjZVVybCA9IGFzeW5jICgpOiBQcm9taXNlPHN0cmluZyB8IG51bGw+ID0+IHtcbiAgICAgICAgaWYgKHRoaXMubWVkaWEuaXNFbmNyeXB0ZWQpIHtcbiAgICAgICAgICAgIGNvbnN0IGJsb2IgPSBhd2FpdCB0aGlzLnNvdXJjZUJsb2IudmFsdWU7XG4gICAgICAgICAgICByZXR1cm4gVVJMLmNyZWF0ZU9iamVjdFVSTChibG9iKTtcbiAgICAgICAgfSBlbHNlIHtcbiAgICAgICAgICAgIHJldHVybiB0aGlzLm1lZGlhLnNyY0h0dHA7XG4gICAgICAgIH1cbiAgICB9O1xuXG4gICAgcHJpdmF0ZSBwcmVwYXJlVGh1bWJuYWlsVXJsID0gYXN5bmMgKCk6IFByb21pc2U8c3RyaW5nIHwgbnVsbD4gPT4ge1xuICAgICAgICBpZiAodGhpcy5tZWRpYS5pc0VuY3J5cHRlZCkge1xuICAgICAgICAgICAgY29uc3QgYmxvYiA9IGF3YWl0IHRoaXMudGh1bWJuYWlsQmxvYi52YWx1ZTtcbiAgICAgICAgICAgIGlmIChibG9iID09PSBudWxsKSByZXR1cm4gbnVsbDtcbiAgICAgICAgICAgIHJldHVybiBVUkwuY3JlYXRlT2JqZWN0VVJMKGJsb2IpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgcmV0dXJuIHRoaXMubWVkaWEudGh1bWJuYWlsSHR0cDtcbiAgICAgICAgfVxuICAgIH07XG5cbiAgICBwcml2YXRlIGZldGNoU291cmNlID0gKCk6IFByb21pc2U8QmxvYj4gPT4ge1xuICAgICAgICBpZiAodGhpcy5tZWRpYS5pc0VuY3J5cHRlZCkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZXZlbnQuZ2V0Q29udGVudDxNZWRpYUV2ZW50Q29udGVudD4oKTtcbiAgICAgICAgICAgIHJldHVybiBkZWNyeXB0RmlsZShjb250ZW50LmZpbGUhLCBjb250ZW50LmluZm8pO1xuICAgICAgICB9XG4gICAgICAgIHJldHVybiB0aGlzLm1lZGlhLmRvd25sb2FkU291cmNlKCkudGhlbigocikgPT4gci5ibG9iKCkpO1xuICAgIH07XG5cbiAgICBwcml2YXRlIGZldGNoVGh1bWJuYWlsID0gKCk6IFByb21pc2U8QmxvYiB8IG51bGw+ID0+IHtcbiAgICAgICAgaWYgKCF0aGlzLm1lZGlhLmhhc1RodW1ibmFpbCkgcmV0dXJuIFByb21pc2UucmVzb2x2ZShudWxsKTtcblxuICAgICAgICBpZiAodGhpcy5tZWRpYS5pc0VuY3J5cHRlZCkge1xuICAgICAgICAgICAgY29uc3QgY29udGVudCA9IHRoaXMuZXZlbnQuZ2V0Q29udGVudDxJbWFnZUNvbnRlbnQ+KCk7XG4gICAgICAgICAgICBpZiAoY29udGVudC5pbmZvPy50aHVtYm5haWxfZmlsZSkge1xuICAgICAgICAgICAgICAgIHJldHVybiBkZWNyeXB0RmlsZShjb250ZW50LmluZm8udGh1bWJuYWlsX2ZpbGUsIGNvbnRlbnQuaW5mby50aHVtYm5haWxfaW5mbyk7XG4gICAgICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgICAgICAgIC8vIFwiU2hvdWxkIG5ldmVyIGhhcHBlblwiXG4gICAgICAgICAgICAgICAgbG9nZ2VyLndhcm4oXCJNZWRpYSBjbGFpbXMgdG8gaGF2ZSB0aHVtYm5haWwgYW5kIGlzIGVuY3J5cHRlZCwgYnV0IG5vIHRodW1ibmFpbF9maWxlIGZvdW5kXCIpO1xuICAgICAgICAgICAgICAgIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG4gICAgICAgICAgICB9XG4gICAgICAgIH1cblxuICAgICAgICBjb25zdCB0aHVtYm5haWxIdHRwID0gdGhpcy5tZWRpYS50aHVtYm5haWxIdHRwO1xuICAgICAgICBpZiAoIXRodW1ibmFpbEh0dHApIHJldHVybiBQcm9taXNlLnJlc29sdmUobnVsbCk7XG5cbiAgICAgICAgcmV0dXJuIGZldGNoKHRodW1ibmFpbEh0dHApLnRoZW4oKHIpID0+IHIuYmxvYigpKTtcbiAgICB9O1xuXG4gICAgcHVibGljIHN0YXRpYyBpc0VsaWdpYmxlKGV2ZW50OiBNYXRyaXhFdmVudCk6IGJvb2xlYW4ge1xuICAgICAgICBpZiAoIWV2ZW50KSByZXR1cm4gZmFsc2U7XG4gICAgICAgIGlmIChldmVudC5pc1JlZGFjdGVkKCkpIHJldHVybiBmYWxzZTtcbiAgICAgICAgaWYgKGV2ZW50LmdldFR5cGUoKSA9PT0gRXZlbnRUeXBlLlN0aWNrZXIpIHJldHVybiB0cnVlO1xuICAgICAgICBpZiAoZXZlbnQuZ2V0VHlwZSgpICE9PSBFdmVudFR5cGUuUm9vbU1lc3NhZ2UpIHJldHVybiBmYWxzZTtcblxuICAgICAgICBjb25zdCBjb250ZW50ID0gZXZlbnQuZ2V0Q29udGVudCgpO1xuICAgICAgICBjb25zdCBtZWRpYU1zZ1R5cGVzOiBzdHJpbmdbXSA9IFtNc2dUeXBlLlZpZGVvLCBNc2dUeXBlLkF1ZGlvLCBNc2dUeXBlLkltYWdlLCBNc2dUeXBlLkZpbGVdO1xuICAgICAgICBpZiAobWVkaWFNc2dUeXBlcy5pbmNsdWRlcyhjb250ZW50Lm1zZ3R5cGUhKSkgcmV0dXJuIHRydWU7XG4gICAgICAgIGlmICh0eXBlb2YgY29udGVudC51cmwgPT09IFwic3RyaW5nXCIpIHJldHVybiB0cnVlO1xuXG4gICAgICAgIC8vIEZpbmFsbHksIGl0J3MgcHJvYmFibHkgbm90IG1lZGlhXG4gICAgICAgIHJl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