matrix-react-sdk
Version:
SDK for matrix.org using React
102 lines (93 loc) • 11.1 kB
JavaScript
;
var _interopRequireDefault = require("@babel/runtime/helpers/interopRequireDefault");
Object.defineProperty(exports, "__esModule", {
value: true
});
exports.FileDownloader = exports.DEFAULT_STYLES = void 0;
var _defineProperty2 = _interopRequireDefault(require("@babel/runtime/helpers/defineProperty"));
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) { (0, _defineProperty2.default)(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; }
/*
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.
*/
const DEFAULT_STYLES = exports.DEFAULT_STYLES = {
imgSrc: "",
imgStyle: null,
// css props
style: "",
textContent: ""
};
// set up the iframe as a singleton so we don't have to figure out destruction of it down the line.
let managedIframe;
let onLoadPromise;
function getManagedIframe() {
if (managedIframe) return {
iframe: managedIframe,
onLoadPromise
};
managedIframe = document.createElement("iframe");
// Need to append the iframe in order for the browser to load it.
document.body.appendChild(managedIframe);
// Dev note: the reassignment warnings are entirely incorrect here.
managedIframe.style.display = "none";
// @ts-ignore
// noinspection JSConstantReassignment
managedIframe.sandbox = "allow-scripts allow-downloads";
onLoadPromise = new Promise(resolve => {
managedIframe.onload = () => {
resolve();
};
managedIframe.src = "usercontent/"; // XXX: Should come from the skin
});
return {
iframe: managedIframe,
onLoadPromise
};
}
// TODO: If we decide to keep the download link behaviour, we should bring the style management into here.
/**
* Helper to handle safe file downloads. This operates off an iframe for reasons described
* by the blob helpers. By default, this will use a hidden iframe to manage the download
* through a user content wrapper, but can be given an iframe reference if the caller needs
* additional control over the styling/position of the iframe itself.
*/
class FileDownloader {
/**
* Creates a new file downloader
* @param iframeFn Function to get a pre-configured iframe. Set to null to have the downloader
* use a generic, hidden, iframe.
*/
constructor(iframeFn) {
(0, _defineProperty2.default)(this, "onLoadPromise", void 0);
this.iframeFn = iframeFn;
}
get iframe() {
const iframe = this.iframeFn?.();
if (!iframe) {
const managed = getManagedIframe();
this.onLoadPromise = managed.onLoadPromise;
return managed.iframe;
}
this.onLoadPromise = undefined;
return iframe;
}
async download({
blob,
name,
autoDownload = true,
opts = DEFAULT_STYLES
}) {
const iframe = this.iframe; // get the iframe first just in case we need to await onload
if (this.onLoadPromise) await this.onLoadPromise;
iframe.contentWindow?.postMessage(_objectSpread(_objectSpread({}, opts), {}, {
blob: blob,
download: name,
auto: autoDownload
}), "*");
}
}
exports.FileDownloader = FileDownloader;
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJERUZBVUxUX1NUWUxFUyIsImV4cG9ydHMiLCJpbWdTcmMiLCJpbWdTdHlsZSIsInN0eWxlIiwidGV4dENvbnRlbnQiLCJtYW5hZ2VkSWZyYW1lIiwib25Mb2FkUHJvbWlzZSIsImdldE1hbmFnZWRJZnJhbWUiLCJpZnJhbWUiLCJkb2N1bWVudCIsImNyZWF0ZUVsZW1lbnQiLCJib2R5IiwiYXBwZW5kQ2hpbGQiLCJkaXNwbGF5Iiwic2FuZGJveCIsIlByb21pc2UiLCJyZXNvbHZlIiwib25sb2FkIiwic3JjIiwiRmlsZURvd25sb2FkZXIiLCJjb25zdHJ1Y3RvciIsImlmcmFtZUZuIiwiX2RlZmluZVByb3BlcnR5MiIsImRlZmF1bHQiLCJtYW5hZ2VkIiwidW5kZWZpbmVkIiwiZG93bmxvYWQiLCJibG9iIiwibmFtZSIsImF1dG9Eb3dubG9hZCIsIm9wdHMiLCJjb250ZW50V2luZG93IiwicG9zdE1lc3NhZ2UiLCJfb2JqZWN0U3ByZWFkIiwiYXV0byJdLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy91dGlscy9GaWxlRG93bmxvYWRlci50cyJdLCJzb3VyY2VzQ29udGVudCI6WyIvKlxuQ29weXJpZ2h0IDIwMjQgTmV3IFZlY3RvciBMdGQuXG5Db3B5cmlnaHQgMjAyMSBUaGUgTWF0cml4Lm9yZyBGb3VuZGF0aW9uIEMuSS5DLlxuXG5TUERYLUxpY2Vuc2UtSWRlbnRpZmllcjogQUdQTC0zLjAtb25seSBPUiBHUEwtMy4wLW9ubHlcblBsZWFzZSBzZWUgTElDRU5TRSBmaWxlcyBpbiB0aGUgcmVwb3NpdG9yeSByb290IGZvciBmdWxsIGRldGFpbHMuXG4qL1xuXG5leHBvcnQgdHlwZSBHZXRJZnJhbWVGbiA9ICgpID0+IEhUTUxJRnJhbWVFbGVtZW50IHwgbnVsbDtcblxuZXhwb3J0IGNvbnN0IERFRkFVTFRfU1RZTEVTID0ge1xuICAgIGltZ1NyYzogXCJcIixcbiAgICBpbWdTdHlsZTogbnVsbCBhcyBzdHJpbmcgfCBudWxsLCAvLyBjc3MgcHJvcHNcbiAgICBzdHlsZTogXCJcIixcbiAgICB0ZXh0Q29udGVudDogXCJcIixcbn07XG5cbnR5cGUgRG93bmxvYWRPcHRpb25zID0ge1xuICAgIGJsb2I6IEJsb2I7XG4gICAgbmFtZTogc3RyaW5nO1xuICAgIGF1dG9Eb3dubG9hZD86IGJvb2xlYW47XG4gICAgb3B0cz86IHR5cGVvZiBERUZBVUxUX1NUWUxFUztcbn07XG5cbi8vIHNldCB1cCB0aGUgaWZyYW1lIGFzIGEgc2luZ2xldG9uIHNvIHdlIGRvbid0IGhhdmUgdG8gZmlndXJlIG91dCBkZXN0cnVjdGlvbiBvZiBpdCBkb3duIHRoZSBsaW5lLlxubGV0IG1hbmFnZWRJZnJhbWU6IEhUTUxJRnJhbWVFbGVtZW50O1xubGV0IG9uTG9hZFByb21pc2U6IFByb21pc2U8dm9pZD47XG5mdW5jdGlvbiBnZXRNYW5hZ2VkSWZyYW1lKCk6IHsgaWZyYW1lOiBIVE1MSUZyYW1lRWxlbWVudDsgb25Mb2FkUHJvbWlzZTogUHJvbWlzZTx2b2lkPiB9IHtcbiAgICBpZiAobWFuYWdlZElmcmFtZSkgcmV0dXJuIHsgaWZyYW1lOiBtYW5hZ2VkSWZyYW1lLCBvbkxvYWRQcm9taXNlIH07XG5cbiAgICBtYW5hZ2VkSWZyYW1lID0gZG9jdW1lbnQuY3JlYXRlRWxlbWVudChcImlmcmFtZVwiKTtcblxuICAgIC8vIE5lZWQgdG8gYXBwZW5kIHRoZSBpZnJhbWUgaW4gb3JkZXIgZm9yIHRoZSBicm93c2VyIHRvIGxvYWQgaXQuXG4gICAgZG9jdW1lbnQuYm9keS5hcHBlbmRDaGlsZChtYW5hZ2VkSWZyYW1lKTtcblxuICAgIC8vIERldiBub3RlOiB0aGUgcmVhc3NpZ25tZW50IHdhcm5pbmdzIGFyZSBlbnRpcmVseSBpbmNvcnJlY3QgaGVyZS5cblxuICAgIG1hbmFnZWRJZnJhbWUuc3R5bGUuZGlzcGxheSA9IFwibm9uZVwiO1xuXG4gICAgLy8gQHRzLWlnbm9yZVxuICAgIC8vIG5vaW5zcGVjdGlvbiBKU0NvbnN0YW50UmVhc3NpZ25tZW50XG4gICAgbWFuYWdlZElmcmFtZS5zYW5kYm94ID0gXCJhbGxvdy1zY3JpcHRzIGFsbG93LWRvd25sb2Fkc1wiO1xuXG4gICAgb25Mb2FkUHJvbWlzZSA9IG5ldyBQcm9taXNlKChyZXNvbHZlKSA9PiB7XG4gICAgICAgIG1hbmFnZWRJZnJhbWUub25sb2FkID0gKCkgPT4ge1xuICAgICAgICAgICAgcmVzb2x2ZSgpO1xuICAgICAgICB9O1xuICAgICAgICBtYW5hZ2VkSWZyYW1lLnNyYyA9IFwidXNlcmNvbnRlbnQvXCI7IC8vIFhYWDogU2hvdWxkIGNvbWUgZnJvbSB0aGUgc2tpblxuICAgIH0pO1xuXG4gICAgcmV0dXJuIHsgaWZyYW1lOiBtYW5hZ2VkSWZyYW1lLCBvbkxvYWRQcm9taXNlIH07XG59XG5cbi8vIFRPRE86IElmIHdlIGRlY2lkZSB0byBrZWVwIHRoZSBkb3dubG9hZCBsaW5rIGJlaGF2aW91ciwgd2Ugc2hvdWxkIGJyaW5nIHRoZSBzdHlsZSBtYW5hZ2VtZW50IGludG8gaGVyZS5cblxuLyoqXG4gKiBIZWxwZXIgdG8gaGFuZGxlIHNhZmUgZmlsZSBkb3dubG9hZHMuIFRoaXMgb3BlcmF0ZXMgb2ZmIGFuIGlmcmFtZSBmb3IgcmVhc29ucyBkZXNjcmliZWRcbiAqIGJ5IHRoZSBibG9iIGhlbHBlcnMuIEJ5IGRlZmF1bHQsIHRoaXMgd2lsbCB1c2UgYSBoaWRkZW4gaWZyYW1lIHRvIG1hbmFnZSB0aGUgZG93bmxvYWRcbiAqIHRocm91Z2ggYSB1c2VyIGNvbnRlbnQgd3JhcHBlciwgYnV0IGNhbiBiZSBnaXZlbiBhbiBpZnJhbWUgcmVmZXJlbmNlIGlmIHRoZSBjYWxsZXIgbmVlZHNcbiAqIGFkZGl0aW9uYWwgY29udHJvbCBvdmVyIHRoZSBzdHlsaW5nL3Bvc2l0aW9uIG9mIHRoZSBpZnJhbWUgaXRzZWxmLlxuICovXG5leHBvcnQgY2xhc3MgRmlsZURvd25sb2FkZXIge1xuICAgIHByaXZhdGUgb25Mb2FkUHJvbWlzZT86IFByb21pc2U8dm9pZD47XG5cbiAgICAvKipcbiAgICAgKiBDcmVhdGVzIGEgbmV3IGZpbGUgZG93bmxvYWRlclxuICAgICAqIEBwYXJhbSBpZnJhbWVGbiBGdW5jdGlvbiB0byBnZXQgYSBwcmUtY29uZmlndXJlZCBpZnJhbWUuIFNldCB0byBudWxsIHRvIGhhdmUgdGhlIGRvd25sb2FkZXJcbiAgICAgKiB1c2UgYSBnZW5lcmljLCBoaWRkZW4sIGlmcmFtZS5cbiAgICAgKi9cbiAgICBwdWJsaWMgY29uc3RydWN0b3IocHJpdmF0ZSBpZnJhbWVGbj86IEdldElmcmFtZUZuKSB7fVxuXG4gICAgcHJpdmF0ZSBnZXQgaWZyYW1lKCk6IEhUTUxJRnJhbWVFbGVtZW50IHtcbiAgICAgICAgY29uc3QgaWZyYW1lID0gdGhpcy5pZnJhbWVGbj8uKCk7XG4gICAgICAgIGlmICghaWZyYW1lKSB7XG4gICAgICAgICAgICBjb25zdCBtYW5hZ2VkID0gZ2V0TWFuYWdlZElmcmFtZSgpO1xuICAgICAgICAgICAgdGhpcy5vbkxvYWRQcm9taXNlID0gbWFuYWdlZC5vbkxvYWRQcm9taXNlO1xuICAgICAgICAgICAgcmV0dXJuIG1hbmFnZWQuaWZyYW1lO1xuICAgICAgICB9XG4gICAgICAgIHRoaXMub25Mb2FkUHJvbWlzZSA9IHVuZGVmaW5lZDtcbiAgICAgICAgcmV0dXJuIGlmcmFtZTtcbiAgICB9XG5cbiAgICBwdWJsaWMgYXN5bmMgZG93bmxvYWQoeyBibG9iLCBuYW1lLCBhdXRvRG93bmxvYWQgPSB0cnVlLCBvcHRzID0gREVGQVVMVF9TVFlMRVMgfTogRG93bmxvYWRPcHRpb25zKTogUHJvbWlzZTx2b2lkPiB7XG4gICAgICAgIGNvbnN0IGlmcmFtZSA9IHRoaXMuaWZyYW1lOyAvLyBnZXQgdGhlIGlmcmFtZSBmaXJzdCBqdXN0IGluIGNhc2Ugd2UgbmVlZCB0byBhd2FpdCBvbmxvYWRcbiAgICAgICAgaWYgKHRoaXMub25Mb2FkUHJvbWlzZSkgYXdhaXQgdGhpcy5vbkxvYWRQcm9taXNlO1xuICAgICAgICBpZnJhbWUuY29udGVudFdpbmRvdz8ucG9zdE1lc3NhZ2UoXG4gICAgICAgICAgICB7XG4gICAgICAgICAgICAgICAgLi4ub3B0cyxcbiAgICAgICAgICAgICAgICBibG9iOiBibG9iLFxuICAgICAgICAgICAgICAgIGRvd25sb2FkOiBuYW1lLFxuICAgICAgICAgICAgICAgIGF1dG86IGF1dG9Eb3dubG9hZCxcbiAgICAgICAgICAgIH0sXG4gICAgICAgICAgICBcIipcIixcbiAgICAgICAgKTtcbiAgICB9XG59XG4iXSwibWFwcGluZ3MiOiI7Ozs7Ozs7Ozs7QUFBQTtBQUNBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTs7QUFJTyxNQUFNQSxjQUFjLEdBQUFDLE9BQUEsQ0FBQUQsY0FBQSxHQUFHO0VBQzFCRSxNQUFNLEVBQUUsRUFBRTtFQUNWQyxRQUFRLEVBQUUsSUFBcUI7RUFBRTtFQUNqQ0MsS0FBSyxFQUFFLEVBQUU7RUFDVEMsV0FBVyxFQUFFO0FBQ2pCLENBQUM7QUFTRDtBQUNBLElBQUlDLGFBQWdDO0FBQ3BDLElBQUlDLGFBQTRCO0FBQ2hDLFNBQVNDLGdCQUFnQkEsQ0FBQSxFQUFnRTtFQUNyRixJQUFJRixhQUFhLEVBQUUsT0FBTztJQUFFRyxNQUFNLEVBQUVILGFBQWE7SUFBRUM7RUFBYyxDQUFDO0VBRWxFRCxhQUFhLEdBQUdJLFFBQVEsQ0FBQ0MsYUFBYSxDQUFDLFFBQVEsQ0FBQzs7RUFFaEQ7RUFDQUQsUUFBUSxDQUFDRSxJQUFJLENBQUNDLFdBQVcsQ0FBQ1AsYUFBYSxDQUFDOztFQUV4Qzs7RUFFQUEsYUFBYSxDQUFDRixLQUFLLENBQUNVLE9BQU8sR0FBRyxNQUFNOztFQUVwQztFQUNBO0VBQ0FSLGFBQWEsQ0FBQ1MsT0FBTyxHQUFHLCtCQUErQjtFQUV2RFIsYUFBYSxHQUFHLElBQUlTLE9BQU8sQ0FBRUMsT0FBTyxJQUFLO0lBQ3JDWCxhQUFhLENBQUNZLE1BQU0sR0FBRyxNQUFNO01BQ3pCRCxPQUFPLENBQUMsQ0FBQztJQUNiLENBQUM7SUFDRFgsYUFBYSxDQUFDYSxHQUFHLEdBQUcsY0FBYyxDQUFDLENBQUM7RUFDeEMsQ0FBQyxDQUFDO0VBRUYsT0FBTztJQUFFVixNQUFNLEVBQUVILGFBQWE7SUFBRUM7RUFBYyxDQUFDO0FBQ25EOztBQUVBOztBQUVBO0FBQ0E7QUFDQTtBQUNBO0FBQ0E7QUFDQTtBQUNPLE1BQU1hLGNBQWMsQ0FBQztFQUd4QjtBQUNKO0FBQ0E7QUFDQTtBQUNBO0VBQ1dDLFdBQVdBLENBQVNDLFFBQXNCLEVBQUU7SUFBQSxJQUFBQyxnQkFBQSxDQUFBQyxPQUFBO0lBQUEsS0FBeEJGLFFBQXNCLEdBQXRCQSxRQUFzQjtFQUFHO0VBRXBELElBQVliLE1BQU1BLENBQUEsRUFBc0I7SUFDcEMsTUFBTUEsTUFBTSxHQUFHLElBQUksQ0FBQ2EsUUFBUSxHQUFHLENBQUM7SUFDaEMsSUFBSSxDQUFDYixNQUFNLEVBQUU7TUFDVCxNQUFNZ0IsT0FBTyxHQUFHakIsZ0JBQWdCLENBQUMsQ0FBQztNQUNsQyxJQUFJLENBQUNELGFBQWEsR0FBR2tCLE9BQU8sQ0FBQ2xCLGFBQWE7TUFDMUMsT0FBT2tCLE9BQU8sQ0FBQ2hCLE1BQU07SUFDekI7SUFDQSxJQUFJLENBQUNGLGFBQWEsR0FBR21CLFNBQVM7SUFDOUIsT0FBT2pCLE1BQU07RUFDakI7RUFFQSxNQUFha0IsUUFBUUEsQ0FBQztJQUFFQyxJQUFJO0lBQUVDLElBQUk7SUFBRUMsWUFBWSxHQUFHLElBQUk7SUFBRUMsSUFBSSxHQUFHL0I7RUFBZ0MsQ0FBQyxFQUFpQjtJQUM5RyxNQUFNUyxNQUFNLEdBQUcsSUFBSSxDQUFDQSxNQUFNLENBQUMsQ0FBQztJQUM1QixJQUFJLElBQUksQ0FBQ0YsYUFBYSxFQUFFLE1BQU0sSUFBSSxDQUFDQSxhQUFhO0lBQ2hERSxNQUFNLENBQUN1QixhQUFhLEVBQUVDLFdBQVcsQ0FBQUMsYUFBQSxDQUFBQSxhQUFBLEtBRXRCSCxJQUFJO01BQ1BILElBQUksRUFBRUEsSUFBSTtNQUNWRCxRQUFRLEVBQUVFLElBQUk7TUFDZE0sSUFBSSxFQUFFTDtJQUFZLElBRXRCLEdBQ0osQ0FBQztFQUNMO0FBQ0o7QUFBQzdCLE9BQUEsQ0FBQW1CLGNBQUEsR0FBQUEsY0FBQSIsImlnbm9yZUxpc3QiOltdfQ==