diff options
Diffstat (limited to 'ui/src')
-rw-r--r-- | ui/src/JsTemplates.scala | 3 | ||||
-rw-r--r-- | ui/src/Main.scala (renamed from ui/src/main/scala/Main.scala) | 0 | ||||
-rw-r--r-- | ui/src/http/XhrBackend.scala | 51 | ||||
-rw-r--r-- | ui/src/http/package.scala | 3 |
4 files changed, 57 insertions, 0 deletions
diff --git a/ui/src/JsTemplates.scala b/ui/src/JsTemplates.scala new file mode 100644 index 0000000..bbb29c5 --- /dev/null +++ b/ui/src/JsTemplates.scala @@ -0,0 +1,3 @@ +package triad + +object JsTemplates extends Templates(scalatags.JsDom) diff --git a/ui/src/main/scala/Main.scala b/ui/src/Main.scala index 3621b4a..3621b4a 100644 --- a/ui/src/main/scala/Main.scala +++ b/ui/src/Main.scala diff --git a/ui/src/http/XhrBackend.scala b/ui/src/http/XhrBackend.scala new file mode 100644 index 0000000..3a791c1 --- /dev/null +++ b/ui/src/http/XhrBackend.scala @@ -0,0 +1,51 @@ +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 + } + +} diff --git a/ui/src/http/package.scala b/ui/src/http/package.scala new file mode 100644 index 0000000..7b680eb --- /dev/null +++ b/ui/src/http/package.scala @@ -0,0 +1,3 @@ +package triad + +package object http extends XhrBackend |