html-to-image
Version:
Generates an image from a DOM node using HTML5 canvas and SVG.
86 lines • 3.34 kB
JavaScript
/* tslint:disable:max-line-length */
Object.defineProperty(exports, "__esModule", { value: true });
exports.getBlobFromURL = void 0;
var util_1 = require("./util");
// KNOWN ISSUE
// -----------
// Can not handle redirect-url, such as when access 'http://something.com/avatar.png'
// will redirect to 'http://something.com/65fc2ffcc8aea7ba65a1d1feda173540'
var TIMEOUT = 30000;
var cache = [];
function getBlobFromURL(url, options) {
var root = url.split('?')[0];
var found = cache.find(function (item) { return item.url === root; });
if (found) {
return found.promise;
}
// cache bypass so we dont have CORS issues with cached images
// ref: https://developer.mozilla.org/en/docs/Web/API/XMLHttpRequest/Using_XMLHttpRequest#Bypassing_the_cache
if (options.cacheBust) {
// tslint:disable-next-line
url += (/\?/.test(url) ? '&' : '?') + new Date().getTime();
}
var failed = function (reason) {
var placeholder = '';
if (options.imagePlaceholder) {
var parts = options.imagePlaceholder.split(/,/);
if (parts && parts[1]) {
placeholder = parts[1];
}
}
var msg = "Failed to fetch resource: " + url;
if (reason) {
msg = typeof reason === 'string' ? reason : reason.message;
}
if (msg) {
console.error(msg);
}
return placeholder;
};
var deferred = window.fetch
? window
.fetch(url)
.then(function (response) { return response.blob(); })
.then(function (blob) {
return new Promise(function (resolve, reject) {
var reader = new FileReader();
reader.onloadend = function () { return resolve(reader.result); };
reader.onerror = reject;
reader.readAsDataURL(blob);
});
})
.then(util_1.getDataURLContent)
.catch(function () { return new Promise(function (resolve, reject) { return reject(); }); })
: new Promise(function (resolve, reject) {
var req = new XMLHttpRequest();
var timeout = function () {
reject(new Error("Timeout of " + TIMEOUT + "ms occured while fetching resource: " + url));
};
var done = function () {
if (req.readyState !== 4) {
return;
}
if (req.status !== 200) {
reject(new Error("Failed to fetch resource: " + url + ", status: " + req.status));
return;
}
var encoder = new FileReader();
encoder.onloadend = function () {
resolve(util_1.getDataURLContent(encoder.result));
};
encoder.readAsDataURL(req.response);
};
req.onreadystatechange = done;
req.ontimeout = timeout;
req.responseType = 'blob';
req.timeout = TIMEOUT;
req.open('GET', url, true);
req.send();
});
var promise = deferred.catch(failed);
cache.push({ promise: promise, url: root });
return promise;
}
exports.getBlobFromURL = getBlobFromURL;
//# sourceMappingURL=getBlobFromURL.js.map
;