fetch-and-create-url.html (2295B)
1 <!doctype html> 2 <meta charset="utf-8"> 3 <title>Fetch and create Blob</title> 4 <script> 5 async function responseToBlob(response) { 6 let blob; 7 try { 8 blob = await response.blob(); 9 } catch (e) { 10 return { error: `blob error: ${e.name}` }; 11 } 12 13 return { url: URL.createObjectURL(blob) }; 14 } 15 16 async function responseToData(response) { 17 const mimeType = response.headers.get("content-type"); 18 19 let text; 20 try { 21 text = await response.text(); 22 } catch(e) { 23 return { error: `text error: ${e.name}` }; 24 } 25 26 return { url: `data:${mimeType},${encodeURIComponent(text)}` }; 27 } 28 29 async function responseToFilesystem(response) { 30 if (!window.webkitRequestFileSystem) { 31 return { error: "unimplemented" }; 32 } 33 34 let blob; 35 try { 36 blob = await response.blob(); 37 } catch (e) { 38 return { error: `blob error: ${e.name}` }; 39 } 40 41 const fs = await new Promise(resolve => { 42 window.webkitRequestFileSystem(window.TEMPORARY, 1024*1024, resolve); 43 }); 44 45 const file = await new Promise(resolve => { 46 fs.root.getFile('fetch-and-create-url', { create: true }, resolve); 47 }); 48 49 const writer = await new Promise(resolve => file.createWriter(resolve)); 50 51 try { 52 await new Promise((resolve, reject) => { 53 writer.onwriteend = resolve; 54 writer.onerror = reject; 55 writer.write(blob); 56 }); 57 } catch (e) { 58 return { error: `file write error: ${e.name}` }; 59 } 60 61 return { url: file.toURL() }; 62 } 63 64 async function responseToScheme(response, scheme) { 65 switch (scheme) { 66 case "blob": 67 return responseToBlob(response); 68 case "data": 69 return responseToData(response); 70 case "filesystem": 71 return responseToFilesystem(response); 72 default: 73 return { error: `unknown scheme: ${scheme}` }; 74 } 75 } 76 77 async function fetchToScheme(url, scheme) { 78 let response; 79 try { 80 response = await fetch(url); 81 } catch (e) { 82 return { error: `fetch error: ${e.name}` }; 83 } 84 85 return responseToScheme(response, scheme); 86 } 87 88 const params = new URL(window.location).searchParams; 89 fetchToScheme(params.get("url"), params.get("scheme")) 90 .then((message) => { parent.postMessage(message, "*"); }); 91 </script>