Skip to content

Commit

Permalink
implement remaining integrations for midas in the browser
Browse files Browse the repository at this point in the history
  • Loading branch information
CrowdHailer committed Aug 24, 2024
1 parent df23917 commit eba0720
Show file tree
Hide file tree
Showing 2 changed files with 56 additions and 8 deletions.
63 changes: 55 additions & 8 deletions eyg/src/midas/browserx.gleam
Original file line number Diff line number Diff line change
@@ -1,7 +1,11 @@
import gleam/fetch
import gleam/io
import gleam/javascript/promise
import gleam/uri
import midas/task as t
import platforms/browser/windows
import plinth/browser/window
import spotless/repl/capabilities/zip

// can't be part of main midas reliance on node stuff. would need to be sub package
pub fn run(task) {
Expand All @@ -13,23 +17,66 @@ pub fn run(task) {
use return <- promise.await(do_fetch(request))
run(resume(return))
}
t.Follow(url, resume) -> {
use return <- promise.await(do_follow(url))
run(resume(uri.parse(return)))
}
t.Log(message, resume) -> {
io.println(message)
run(resume(Ok(Nil)))
}
_ -> panic as "unsupported effect in run"
t.Zip(files, resume) -> {
use zipped <- promise.await(zip.zip(files))
run(resume(Ok(zipped)))
}
_ -> {
io.debug(task)
panic as "unsupported effect in run"
}
}
}

pub fn do_fetch(request) {
use response <- promise.await(fetch.send_bits(request))
let assert Ok(response) = response
use response <- promise.await(fetch.read_bytes_body(response))
let response = case response {
Ok(response) -> Ok(response)
Error(fetch.NetworkError(s)) -> Error(t.NetworkError(s))
Error(fetch.UnableToReadBody) -> Error(t.UnableToReadBody)
case response {
Ok(response) -> {
use response <- promise.await(fetch.read_bytes_body(response))
let response = case response {
Ok(response) -> Ok(response)
Error(fetch.NetworkError(s)) -> Error(t.NetworkError(s))
Error(fetch.UnableToReadBody) -> Error(t.UnableToReadBody)
Error(fetch.InvalidJsonBody) -> panic
}
promise.resolve(response)
}
Error(fetch.NetworkError(s)) -> promise.resolve(Error(t.NetworkError(s)))
Error(fetch.UnableToReadBody) -> promise.resolve(Error(t.UnableToReadBody))
Error(fetch.InvalidJsonBody) -> panic
}
promise.resolve(response)
}

fn do_follow(url) {
let frame = #(600, 700)
let assert Ok(popup) = windows.open(url, frame)
receive_redirect(popup, 100)
}

pub fn receive_redirect(popup, wait) {
use Nil <- promise.await(do_wait(wait))
case window.location_of(popup) {
Ok("http" <> _ as location) -> {
window.close(popup)
promise.resolve(location)
}
_ -> receive_redirect(popup, wait)
}
}

import plinth/javascript/global

pub fn do_wait(delay) {
promise.new(fn(resolve) {
let timer = global.set_timeout(delay, fn() { resolve(Nil) })
Nil
})
}
1 change: 1 addition & 0 deletions eyg/vendor/zip.min.js

Large diffs are not rendered by default.

0 comments on commit eba0720

Please sign in to comment.