blob: 3a791c1c3956994be63fbe3ae2b50a158cb796e7 (
plain) (
tree)
|
|
package triad
package http
import org.scalajs.dom.{ErrorEvent, Event, XMLHttpRequest}
import scala.concurrent.{Future, Promise, TimeoutException}
import scala.scalajs.js
import scala.scalajs.js.typedarray.{ArrayBuffer, Int8Array}
trait XhrBackend extends Backend {
def send(request: Request): Future[Response] = {
val promise = Promise[Response]
val xhr = new XMLHttpRequest()
xhr.open(request.method, request.url)
xhr.responseType = "arraybuffer"
for ((name, value) <- request.headers) {
xhr.setRequestHeader(name, value)
}
xhr.send(js.Array(request.body: _*))
xhr.onload = (e: Event) => {
val body: Array[Byte] = if (!js.isUndefined(xhr.response)) {
val buffer = new Int8Array(xhr.response.asInstanceOf[ArrayBuffer])
buffer.toArray
} else {
Array.empty[Byte]
}
val response = Response(
xhr.status,
Map.empty,
body
)
promise.success(response)
}
xhr.onerror = (e: ErrorEvent) => {
promise.failure(new RuntimeException(s"XHR error: ${e.message}"))
}
xhr.ontimeout = (e: Event) => {
promise.failure(
new TimeoutException(s"Request timed out: ${xhr.statusText}"))
}
promise.future
}
}
|