Home Manual Reference Source Test

src/view/download.js

  1. /**
  2. * Triggers a browser file download from a Blob or a Base64-encoded string.
  3. * @param {Blob|string} data - Blob or Base64 encoded binary (treated as audio/midi).
  4. * @param {string} [filename] - Output name; defaults to UTC-timestamp .mid.
  5. * @return {string} Filename stem (without extension).
  6. * @example
  7. * downloadBlob(blob); // "2026-05-09T14-23-07" (default UTC timestamp)
  8. * downloadBlob(b64String, "song.mid"); // "song" (custom filename, returns stem)
  9. */
  10. export function downloadBlob(
  11. data,
  12. filename = `${new Date().toISOString().replace(/[:.]/g, "-").slice(0, -5)}.mid`,
  13. ) {
  14. const blob =
  15. typeof data === "string"
  16. ? new Blob([Uint8Array.from(atob(data), (c) => c.charCodeAt(0))], {
  17. type: "audio/midi",
  18. })
  19. : data;
  20. const url = URL.createObjectURL(blob);
  21. const a = document.createElement("a");
  22. a.href = url;
  23. a.download = filename;
  24. document.body.appendChild(a);
  25. a.click();
  26. URL.revokeObjectURL(url);
  27. a.remove();
  28. return filename.replace(/\.[^.]+$/, "");
  29. }