Skip to content

Commit 3220a25

Browse files
committed
Bring back m.request - it's too useful.
It mostly delegates to `fetch`. Also, kill `m.withProgress` as that only existed because there was no `m.request`.
1 parent 953665e commit 3220a25

File tree

5 files changed

+2080
-97
lines changed

5 files changed

+2080
-97
lines changed

src/entry/mithril.esm.js

+2-2
Original file line numberDiff line numberDiff line change
@@ -4,16 +4,16 @@ import {debouncer, throttler} from "../std/rate-limit.js"
44
import {link, route} from "../std/router.js"
55
import {match, p, query} from "../std/path-query.js"
66
import {tracked, trackedList} from "../std/tracked.js"
7+
import fetch from "../std/fetch.js"
78
import init from "../std/init.js"
89
import lazy from "../std/lazy.js"
9-
import withProgress from "../std/with-progress.js"
1010

1111
m.route = route
1212
m.link = link
1313
m.p = p
1414
m.query = query
1515
m.match = match
16-
m.withProgress = withProgress
16+
m.fetch = fetch
1717
m.lazy = lazy
1818
m.init = init
1919
m.tracked = tracked

src/std/fetch.js

+71
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
/* global fetch */
2+
3+
import {checkCallback} from "../util.js"
4+
5+
var mfetch = async (url, opts = {}) => {
6+
checkCallback(opts.onprogress, true, "opts.onprogress")
7+
checkCallback(opts.extract, true, "opts.extract")
8+
9+
try {
10+
var response = await fetch(url, opts)
11+
12+
if (opts.onprogress && response.body) {
13+
var reader = response.body.getReader()
14+
var rawLength = response.headers.get("content-length") || ""
15+
// This is explicit coercion, but ESLint is frequently too dumb to detect it correctly.
16+
// Another example: https://github.com/eslint/eslint/issues/14623
17+
// eslint-disable-next-line no-implicit-coercion
18+
var total = (/^\d+$/).test(rawLength) ? +rawLength : -1
19+
var current = 0
20+
21+
response = new Response(new ReadableStream({
22+
type: "bytes",
23+
start: (ctrl) => reader || ctrl.close(),
24+
cancel: (reason) => reader.cancel(reason),
25+
async pull(ctrl) {
26+
var result = await reader.read()
27+
if (result.done) {
28+
ctrl.close()
29+
} else {
30+
current += result.value.length
31+
ctrl.enqueue(result.value)
32+
opts.onprogress(current, total)
33+
}
34+
},
35+
}), response)
36+
}
37+
38+
if (response.ok) {
39+
if (opts.extract) {
40+
return await opts.extract(response)
41+
}
42+
43+
switch (opts.responseType || "json") {
44+
case "json": return await response.json()
45+
case "formdata": return await response.formData()
46+
case "arraybuffer": return await response.arrayBuffer()
47+
case "blob": return await response.blob()
48+
case "text": return await response.text()
49+
case "document":
50+
// eslint-disable-next-line no-undef
51+
return new DOMParser()
52+
.parseFromString(await response.text(), response.headers.get("content-type") || "text/html")
53+
default:
54+
throw new TypeError(`Unknown response type: ${opts.responseType}`)
55+
}
56+
}
57+
58+
var message = (await response.text()) || response.statusText
59+
} catch (e) {
60+
var cause = e
61+
var message = e.message
62+
}
63+
64+
var e = new Error(message)
65+
e.status = response ? response.status : 0
66+
e.response = response
67+
e.cause = cause
68+
throw e
69+
}
70+
71+
export {mfetch as default}

src/std/with-progress.js

-28
This file was deleted.

0 commit comments

Comments
 (0)