Skip to main content

src/http_server_mock_js.gleam

import gleam/dynamic.{type Dynamic}
import http_server_mock/server_adapter.{type ServerAdapter, ServerAdapter}

/// Returns the JavaScript/Node.js server adapter.
///
/// Pass this to `http_server_mock.new/1` to create a mock server backed by a
/// Node.js Worker thread:
///
/// ```gleam
/// let server =
///   http_server_mock.new(http_server_mock_js.server())
///   |> http_server_mock.start()
/// ```
pub fn server() -> ServerAdapter {
  ServerAdapter(
    start: do_start,
    stop: do_stop,
    add_stub: do_add_stub,
    remove_stub: do_remove_stub,
    clear_stubs: do_clear_stubs,
    get_stubs: do_get_stubs,
    get_requests: do_get_requests,
    clear_requests: do_clear_requests,
  )
}

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "startServer")
fn do_start(port: Int) -> Result(#(Int, Dynamic), String)

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "stopServer")
fn do_stop(handle: Dynamic) -> Nil

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "addStub")
fn do_add_stub(handle: Dynamic, stub_json: String) -> Result(String, String)

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "removeStub")
fn do_remove_stub(handle: Dynamic, id: String) -> Nil

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "clearStubs")
fn do_clear_stubs(handle: Dynamic) -> Nil

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "getStubs")
fn do_get_stubs(handle: Dynamic) -> String

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "getRequests")
fn do_get_requests(handle: Dynamic) -> String

@external(javascript, "./http_server_mock/internal/server_ffi.mjs", "clearRequests")
fn do_clear_requests(handle: Dynamic) -> Nil