Add module jsfetch (#12531)
* Add module jsfetch for fetch support for JavaScript target https://developer.mozilla.org/docs/Web/API/Fetch_API * Update lib/std/jsheaders.nim * Update lib/std/jsformdata.nim * Update lib/std/jsfetch.nim Co-authored-by: Timothee Cour <timothee.cour2@gmail.com> Co-authored-by: flywind <xzsflywind@gmail.com>
This commit is contained in:
parent
07df4fe560
commit
b8c04bdb92
5 changed files with 351 additions and 1 deletions
83
lib/std/jsheaders.nim
Normal file
83
lib/std/jsheaders.nim
Normal file
|
|
@ -0,0 +1,83 @@
|
|||
## - HTTP Headers for the JavaScript target: https://developer.mozilla.org/en-US/docs/Web/API/Headers
|
||||
when not defined(js):
|
||||
{.fatal: "Module jsheaders is designed to be used with the JavaScript backend.".}
|
||||
|
||||
type Headers* = ref object of JsRoot ## HTTP Headers API.
|
||||
|
||||
func newHeaders*(): Headers {.importjs: "new Headers()".}
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers
|
||||
|
||||
func add*(self: Headers; key: cstring; value: cstring) {.importjs: "#.append(#, #)".}
|
||||
## Allows duplicated keys.
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/append
|
||||
|
||||
func delete*(self: Headers; key: cstring) {.importjs: "#.$1(#)".}
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/delete
|
||||
##
|
||||
## .. Warning:: Delete *all* items with `key` from the headers, including duplicated keys.
|
||||
|
||||
func hasKey*(self: Headers; key: cstring): bool {.importjs: "#.has(#)".}
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/has
|
||||
|
||||
func keys*(self: Headers): seq[cstring] {.importjs: "Array.from(#.$1())".}
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/keys
|
||||
|
||||
func values*(self: Headers): seq[cstring] {.importjs: "Array.from(#.$1())".}
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/values
|
||||
|
||||
func entries*(self: Headers): seq[tuple[key, value: cstring]] {.importjs: "Array.from(#.$1())".}
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/entries
|
||||
|
||||
func `[]`*(self: Headers; key: cstring): cstring {.importjs: "#.get(#)".}
|
||||
## Get *all* items with `key` from the headers, including duplicated values.
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/get
|
||||
|
||||
func `[]=`*(self: Headers; key: cstring; value: cstring) {.importjs: "#.set(#, #)".}
|
||||
## Do *not* allow duplicated keys, overwrites duplicated keys.
|
||||
## https://developer.mozilla.org/en-US/docs/Web/API/Headers/set
|
||||
|
||||
func clear*(self: Headers) {.importjs:
|
||||
"(() => { const header = #; Array.from(header.keys()).forEach((key) => header.delete(key)) })()".}
|
||||
## Convenience func to delete all items from `Headers`.
|
||||
|
||||
func toCstring*(self: Headers): cstring {.importjs: "JSON.stringify(Array.from(#.entries()))".}
|
||||
## Returns a `cstring` representation of `Headers`.
|
||||
|
||||
func `$`*(self: Headers): string = $toCstring(self)
|
||||
|
||||
func len*(self: Headers): int {.importjs: "Array.from(#.entries()).length".}
|
||||
|
||||
|
||||
runnableExamples("-r:off"):
|
||||
|
||||
block:
|
||||
let header: Headers = newHeaders()
|
||||
header.add("key", "value")
|
||||
assert header.hasKey("key")
|
||||
assert header.keys() == @["key".cstring]
|
||||
assert header.values() == @["value".cstring]
|
||||
assert header["key"] == "value".cstring
|
||||
header["other"] = "another".cstring
|
||||
assert header["other"] == "another".cstring
|
||||
assert header.entries() == @[("key".cstring, "value".cstring), ("other".cstring, "another".cstring)]
|
||||
assert header.toCstring() == """[["key","value"],["other","another"]]""".cstring
|
||||
header.delete("other")
|
||||
assert header.entries() == @[("key".cstring, "value".cstring)]
|
||||
header.clear()
|
||||
assert header.entries() == @[]
|
||||
assert header.len == 0
|
||||
|
||||
block:
|
||||
let header: Headers = newHeaders()
|
||||
header.add("key", "a")
|
||||
header.add("key", "b") ## Duplicated.
|
||||
header.add("key", "c") ## Duplicated.
|
||||
assert header["key"] == "a, b, c".cstring
|
||||
header["key"] = "value".cstring
|
||||
assert header["key"] == "value".cstring
|
||||
|
||||
block:
|
||||
let header: Headers = newHeaders()
|
||||
header["key"] = "a"
|
||||
header["key"] = "b" ## Overwrites.
|
||||
assert header["key"] == "b".cstring
|
||||
Loading…
Add table
Add a link
Reference in a new issue