CoolFace
Apppublic

TrinetraLabs/Placebo_AI

sourceHugging Faceupdated 2mo agoView on Hugging Face
0likes
FileSaver.js248 linesDownload Raw Back to vendor
1/*! FileSaver.js2 *  A saveAs() FileSaver implementation.3 *  2014-01-244 *5 *  By Eli Grey, http://eligrey.com6 *  License: X11/MIT7 *    See LICENSE.md8 */9 10/*global self */11/*jslint bitwise: true, indent: 4, laxbreak: true, laxcomma: true, smarttabs: true, plusplus: true */12 13/*! @source http://purl.eligrey.com/github/FileSaver.js/blob/main/FileSaver.js */14 15var saveAs = saveAs16  // IE 10+ (native saveAs)17  || (typeof navigator !== "undefined" &&18      navigator.msSaveOrOpenBlob && navigator.msSaveOrOpenBlob.bind(navigator))19  // Everyone else20  || (function(view) {21	"use strict";22	// IE <10 is explicitly unsupported23	if (typeof navigator !== "undefined" &&24	    /MSIE [1-9]\./.test(navigator.userAgent)) {25		return;26	}27	var28		  doc = view.document29		  // only get URL when necessary in case BlobBuilder.js hasn't overridden it yet30		, get_URL = function() {31			return view.URL || view.webkitURL || view;32		}33		, URL = view.URL || view.webkitURL || view34		, save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a")35		, can_use_save_link = !view.externalHost && "download" in save_link36		, click = function(node) {37			var event = doc.createEvent("MouseEvents");38			event.initMouseEvent(39				"click", true, false, view, 0, 0, 0, 0, 040				, false, false, false, false, 0, null41			);42			node.dispatchEvent(event);43		}44		, webkit_req_fs = view.webkitRequestFileSystem45		, req_fs = view.requestFileSystem || webkit_req_fs || view.mozRequestFileSystem46		, throw_outside = function(ex) {47			(view.setImmediate || view.setTimeout)(function() {48				throw ex;49			}, 0);50		}51		, force_saveable_type = "application/octet-stream"52		, fs_min_size = 053		, deletion_queue = []54		, process_deletion_queue = function() {55			var i = deletion_queue.length;56			while (i--) {57				var file = deletion_queue[i];58				if (typeof file === "string") { // file is an object URL59					URL.revokeObjectURL(file);60				} else { // file is a File61					file.remove();62				}63			}64			deletion_queue.length = 0; // clear queue65		}66		, dispatch = function(filesaver, event_types, event) {67			event_types = [].concat(event_types);68			var i = event_types.length;69			while (i--) {70				var listener = filesaver["on" + event_types[i]];71				if (typeof listener === "function") {72					try {73						listener.call(filesaver, event || filesaver);74					} catch (ex) {75						throw_outside(ex);76					}77				}78			}79		}80		, FileSaver = function(blob, name) {81			// First try a.download, then web filesystem, then object URLs82			var83				  filesaver = this84				, type = blob.type85				, blob_changed = false86				, object_url87				, target_view88				, get_object_url = function() {89					var object_url = get_URL().createObjectURL(blob);90					deletion_queue.push(object_url);91					return object_url;92				}93				, dispatch_all = function() {94					dispatch(filesaver, "writestart progress write writeend".split(" "));95				}96				// on any filesys errors revert to saving with object URLs97				, fs_error = function() {98					// don't create more object URLs than needed99					if (blob_changed || !object_url) {100						object_url = get_object_url(blob);101					}102					if (target_view) {103						target_view.location.href = object_url;104					} else {105						window.open(object_url, "_blank");106					}107					filesaver.readyState = filesaver.DONE;108					dispatch_all();109				}110				, abortable = function(func) {111					return function() {112						if (filesaver.readyState !== filesaver.DONE) {113							return func.apply(this, arguments);114						}115					};116				}117				, create_if_not_found = {create: true, exclusive: false}118				, slice119			;120			filesaver.readyState = filesaver.INIT;121			if (!name) {122				name = "download";123			}124			if (can_use_save_link) {125				object_url = get_object_url(blob);126				// FF for Android has a nasty garbage collection mechanism127				// that turns all objects that are not pure javascript into 'deadObject'128				// this means `doc` and `save_link` are unusable and need to be recreated129				// `view` is usable though:130				doc = view.document;131				save_link = doc.createElementNS("http://www.w3.org/1999/xhtml", "a");132				save_link.href = object_url;133				save_link.download = name;134				var event = doc.createEvent("MouseEvents");135				event.initMouseEvent(136					"click", true, false, view, 0, 0, 0, 0, 0137					, false, false, false, false, 0, null138				);139				save_link.dispatchEvent(event);140				filesaver.readyState = filesaver.DONE;141				dispatch_all();142				return;143			}144			// Object and web filesystem URLs have a problem saving in Google Chrome when145			// viewed in a tab, so I force save with application/octet-stream146			// http://code.google.com/p/chromium/issues/detail?id=91158147			if (view.chrome && type && type !== force_saveable_type) {148				slice = blob.slice || blob.webkitSlice;149				blob = slice.call(blob, 0, blob.size, force_saveable_type);150				blob_changed = true;151			}152			// Since I can't be sure that the guessed media type will trigger a download153			// in WebKit, I append .download to the filename.154			// https://bugs.webkit.org/show_bug.cgi?id=65440155			if (webkit_req_fs && name !== "download") {156				name += ".download";157			}158			if (type === force_saveable_type || webkit_req_fs) {159				target_view = view;160			}161			if (!req_fs) {162				fs_error();163				return;164			}165			fs_min_size += blob.size;166			req_fs(view.TEMPORARY, fs_min_size, abortable(function(fs) {167				fs.root.getDirectory("saved", create_if_not_found, abortable(function(dir) {168					var save = function() {169						dir.getFile(name, create_if_not_found, abortable(function(file) {170							file.createWriter(abortable(function(writer) {171								writer.onwriteend = function(event) {172									target_view.location.href = file.toURL();173									deletion_queue.push(file);174									filesaver.readyState = filesaver.DONE;175									dispatch(filesaver, "writeend", event);176								};177								writer.onerror = function() {178									var error = writer.error;179									if (error.code !== error.ABORT_ERR) {180										fs_error();181									}182								};183								"writestart progress write abort".split(" ").forEach(function(event) {184									writer["on" + event] = filesaver["on" + event];185								});186								writer.write(blob);187								filesaver.abort = function() {188									writer.abort();189									filesaver.readyState = filesaver.DONE;190								};191								filesaver.readyState = filesaver.WRITING;192							}), fs_error);193						}), fs_error);194					};195					dir.getFile(name, {create: false}, abortable(function(file) {196						// delete file if it already exists197						file.remove();198						save();199					}), abortable(function(ex) {200						if (ex.code === ex.NOT_FOUND_ERR) {201							save();202						} else {203							fs_error();204						}205					}));206				}), fs_error);207			}), fs_error);208		}209		, FS_proto = FileSaver.prototype210		, saveAs = function(blob, name) {211			return new FileSaver(blob, name);212		}213	;214	FS_proto.abort = function() {215		var filesaver = this;216		filesaver.readyState = filesaver.DONE;217		dispatch(filesaver, "abort");218	};219	FS_proto.readyState = FS_proto.INIT = 0;220	FS_proto.WRITING = 1;221	FS_proto.DONE = 2;222 223	FS_proto.error =224	FS_proto.onwritestart =225	FS_proto.onprogress =226	FS_proto.onwrite =227	FS_proto.onabort =228	FS_proto.onerror =229	FS_proto.onwriteend =230		null;231 232	view.addEventListener("unload", process_deletion_queue, false);233	saveAs.unload = function() {234		process_deletion_queue();235		view.removeEventListener("unload", process_deletion_queue, false);236	};237	return saveAs;238}(239	   typeof self !== "undefined" && self240	|| typeof window !== "undefined" && window241	|| this.content242));243// `self` is undefined in Firefox for Android content script context244// while `this` is nsIContentFrameMessageManager245// with an attribute `content` that corresponds to the window246 247if (typeof module !== "undefined") module.exports = saveAs;248