2
import type { HTMLAnchorAttributes } from "svelte/elements";
3
import { createEventDispatcher } from "svelte";
5
interface DownloadLinkAttributes
6
extends Omit<HTMLAnchorAttributes, "target"> {
7
download: NonNullable<HTMLAnchorAttributes["download"]>;
9
type $$Props = DownloadLinkAttributes;
11
import { getWorkerProxyContext } from "./context";
12
import { should_proxy_wasm_src } from "./file-url";
13
import { getHeaderValue } from "../src/http";
15
export let href: DownloadLinkAttributes["href"] = undefined;
16
export let download: DownloadLinkAttributes["download"];
18
const dispatch = createEventDispatcher();
20
let is_downloading = false;
21
const worker_proxy = getWorkerProxyContext();
22
async function wasm_click_handler(): Promise<void> {
30
throw new Error("href is not defined.");
32
if (worker_proxy == null) {
33
throw new Error("Wasm worker proxy is not available.");
36
const url = new URL(href, window.location.href);
37
const path = url.pathname;
39
is_downloading = true;
48
if (response.status !== 200) {
49
throw new Error(`Failed to get file ${path} from the Wasm worker.`);
51
const blob = new Blob([response.body], {
52
type: getHeaderValue(response.headers, "content-type")
54
const blobUrl = URL.createObjectURL(blob);
56
const link = document.createElement("a");
58
link.download = download;
61
URL.revokeObjectURL(blobUrl);
64
is_downloading = false;
69
{#if worker_proxy && should_proxy_wasm_src(href)}
73
<a {...$$restProps} {href} on:click|preventDefault={wasm_click_handler}>
80
target={typeof window !== "undefined" && window.__is_colab__
83
rel="noopener noreferrer"
86
on:click={dispatch.bind(null, "click")}