0 | module HTTP.API.Client.FFI
  1 |
  2 | import Data.Buffer
  3 | import Data.Buffer.Core
  4 | import Data.ByteString
  5 | import Data.Linear.Token
  6 | import HTTP.Method
  7 | import HTTP.URI
  8 | import Web.Internal.Types
  9 |
 10 | %default total
 11 |
 12 | %foreign "javascript:lambda:x=>x.length"
 13 | prim__buflen : Buffer -> Bits32
 14 |
 15 | %foreign "browser:lambda:(x,a,b,w)=>x.append(a,b)"
 16 | prim__append : FormData -> String -> String -> PrimIO ()
 17 |
 18 | %foreign "browser:lambda:(x,a,b,w)=>x.append(a,b)"
 19 | prim__appendBlob : FormData -> String -> Blob -> PrimIO ()
 20 |
 21 | %foreign "browser:lambda:(x,a,b,w)=>x.append(a,b)"
 22 | prim__appendFile : FormData -> String -> File -> PrimIO ()
 23 |
 24 | %foreign "browser:lambda:(x,a,b,w)=>x.append(a,new Blob(b))"
 25 | prim__appendBuffer : FormData -> String -> Buffer -> PrimIO ()
 26 |
 27 | %foreign "browser:lambda:(x,w)=>x.responseText"
 28 | prim__responseText : XMLHttpRequest -> PrimIO String
 29 |
 30 | %foreign "browser:lambda:(x,w)=>x.status"
 31 | prim__status : XMLHttpRequest -> PrimIO Bits16
 32 |
 33 | %foreign "browser:lambda:(x,w)=>x.send()"
 34 | prim__send : XMLHttpRequest -> PrimIO ()
 35 |
 36 | %foreign "browser:lambda:(x,s,w)=>x.send(s)"
 37 | prim__sendTxt : XMLHttpRequest -> String -> PrimIO ()
 38 |
 39 | %foreign "browser:lambda:(x,s,w)=>x.send(s)"
 40 | prim__sendBuf : XMLHttpRequest -> Buffer -> PrimIO ()
 41 |
 42 | %foreign "browser:lambda:(w)=> new FormData()"
 43 | prim__newFD : PrimIO FormData
 44 |
 45 | %foreign "browser:lambda:(x,s,w)=>x.send(s)"
 46 | prim__sendFD : XMLHttpRequest -> FormData -> PrimIO ()
 47 |
 48 | %foreign "browser:lambda:(w)=> new XMLHttpRequest()"
 49 | prim__request : PrimIO XMLHttpRequest
 50 |
 51 | %foreign "browser:lambda:(x,w)=>x.readyState"
 52 | prim__readyState : XMLHttpRequest -> PrimIO Bits16
 53 |
 54 | %foreign "browser:lambda:(x,v,w)=>{x.timeout = v}"
 55 | prim__setTimeout : XMLHttpRequest -> Bits32 -> PrimIO ()
 56 |
 57 | %foreign "browser:lambda:(x,w)=>x.abort()"
 58 | prim__abort : XMLHttpRequest -> PrimIO ()
 59 |
 60 | %foreign "browser:lambda:(x,me,url,w)=>x.open(me,url)"
 61 | prim__open : XMLHttpRequest -> String -> String -> PrimIO ()
 62 |
 63 | %foreign "browser:lambda:(x,a,b,w)=>x.setRequestHeader(a,b)"
 64 | prim__setRequestHeader : XMLHttpRequest -> (h,v : String) -> PrimIO ()
 65 |
 66 | export
 67 | %foreign "browser:lambda:x=>x.bubbles?1:0"
 68 | bubbles : Event -> Bool
 69 |
 70 | export
 71 | %foreign "browser:lambda:x=>x.cancelable?1:0"
 72 | cancelable : Event -> Bool
 73 |
 74 | %foreign "browser:lambda:(x,s,f,w)=>x.addEventListener(s,\e => f(e)(w))"
 75 | prim__addlistener : EventTarget -> String -> (Event -> PrimIO ()) -> PrimIO ()
 76 |
 77 | %foreign "browser:lambda:(x,w)=>x.preventDefault()"
 78 | prim__preventDefault : Event -> PrimIO ()
 79 |
 80 | %foreign "browser:lambda:(x,w)=>x.stopPropagation()"
 81 | prim__stopPropagation : Event -> PrimIO ()
 82 |
 83 | --------------------------------------------------------------------------------
 84 | -- API
 85 | --------------------------------------------------------------------------------
 86 |
 87 | export %inline
 88 | xmlhttpRequest : IO1 XMLHttpRequest
 89 | xmlhttpRequest = ffi prim__request
 90 |
 91 | export %inline
 92 | status : XMLHttpRequest -> IO1 Bits16
 93 | status x = ffi $ prim__status x
 94 |
 95 | export %inline
 96 | abort : XMLHttpRequest -> IO1 ()
 97 | abort x = ffi $ prim__abort x
 98 |
 99 | export %inline
100 | opn : XMLHttpRequest -> Method -> URI -> IO1 ()
101 | opn x m u = ffi $ prim__open x (show m) "\{u}"
102 |
103 | export %inline
104 | send : XMLHttpRequest -> IO1 ()
105 | send x = ffi $ prim__send x
106 |
107 | export %inline
108 | sendTxt : XMLHttpRequest -> String -> IO1 ()
109 | sendTxt x s = ffi $ prim__sendTxt x s
110 |
111 | export %inline
112 | sendBuffer : XMLHttpRequest -> Buffer -> IO1 ()
113 | sendBuffer x s = ffi $ prim__sendBuf x s
114 |
115 | export %inline
116 | sendFD : XMLHttpRequest -> FormData -> IO1 ()
117 | sendFD x s = ffi $ prim__sendFD x s
118 |
119 | export %inline
120 | setRequestHeader : XMLHttpRequest -> String -> ByteString -> IO1 ()
121 | setRequestHeader x n v = ffi $ prim__setRequestHeader x n (toString v)
122 |
123 | export %inline
124 | setRequestHeaderP : XMLHttpRequest -> (String, ByteString) -> IO1 ()
125 | setRequestHeaderP x (n,v) = setRequestHeader x n v
126 |
127 | export
128 | responseBytes : XMLHttpRequest -> IO1 ByteString
129 | responseBytes x t =
130 |   let str # t := ffi (prim__responseText x) t in fromString str # t
131 |
132 | export %inline
133 | newFD : IO1 FormData
134 | newFD = ffi prim__newFD
135 |
136 | export %inline
137 | appendTxt : FormData -> (name,value : String) -> IO1 ()
138 | appendTxt fd n v = ffi $ prim__append fd n v
139 |
140 | export %inline
141 | appendBlob : FormData -> (name : String) -> Blob -> IO1 ()
142 | appendBlob fd n v = ffi $ prim__appendBlob fd n v
143 |
144 | export %inline
145 | appendFile : FormData -> (name : String) -> File -> IO1 ()
146 | appendFile fd n v = ffi $ prim__appendFile fd n v
147 |
148 | export
149 | appendBytes : FormData -> (name : String) -> ByteString -> IO1 ()
150 | appendBytes x n bs t =
151 |  let buf # t := ioToF1 (toBuffer bs) t
152 |   in ffi (prim__appendBuffer x n buf) t
153 |
154 | export %inline
155 | addEventListener : EventTarget -> String -> (Event -> IO1 ()) -> IO1 ()
156 | addEventListener et ev cb = ffi $ prim__addlistener et ev (primRun . cb)
157 |
158 | export %inline
159 | preventDefault : Event -> IO1 ()
160 | preventDefault ev = ffi $ prim__preventDefault ev
161 |
162 | export %inline
163 | stopPropagation : Event -> IO1 ()
164 | stopPropagation ev = ffi $ prim__stopPropagation ev
165 |