A web framework for MoonBit.
Dependencies
async fn main {
let app = @mocket.new()
app.get("/", _ => "Hello, Mocket!")
app.listen(":80")
}moon run src/example --target jsmoon run src/example --target native
impl BodyReader for Stringimpl BodyReader for FixedArray[Byte]impl BodyReader for Bytesimpl BodyReader for Array[Byte]impl BodyReader for Jsonpub(open) trait Responder {
fn options(Self, res : HttpResponse) -> Unit
fn output(Self, buf : Buffer) -> Unit
}pub(open) trait ServeStaticProvider {
async fn get_meta(Self, id : StringView) -> StaticAssetMeta?
async fn get_contents(Self, id : StringView) -> &Responder
fn get_type(Self, ext : String) -> String?
fn get_encodings(Self) -> Map[String, String]
fn get_index_names(Self) -> Array[String]
fn get_fallthrough(Self) -> Bool
}pub(all) struct CookieItem {
name : String
value : String
max_age : Int?
path : String?
domain : String?
secure : Bool?
http_only : Bool?
same_site : SameSiteOption?
} derive(Eq)impl Show for CookieItemtype Htmlpub(all) struct HttpRequest {
http_method : String
url : String
query : String
headers : Map[CaseInsensitiveString, StringView]
raw_body : Bytes
}pub(all) struct HttpResponse {
status_code : StatusCode
headers : Map[CaseInsensitiveString, StringView]
cookies : Map[String, CookieItem]
raw_body : Bytes
}impl Responder for HttpResponsefn HttpResponse::new(status_code : StatusCode, headers? : Map[CaseInsensitiveString, StringView], cookies? : Map[String, CookieItem], raw_body? : Bytes) -> HttpResponsefn HttpResponse::set_cookie(self : HttpResponse, name : String, value : String, max_age? : Int, path? : String, domain? : String, secure? : Bool, http_only? : Bool, same_site? : SameSiteOption) -> Unit#alias(T)
pub(all) struct Mocket {
base_path : String
mappings : Map[(String, String), async (MocketEvent) -> &Responder]
middlewares : Array[(String, async (MocketEvent, async () -> &Responder) -> &Responder)]
static_routes : Map[String, Map[String, async (MocketEvent) -> &Responder]]
dynamic_routes : Map[String, Array[(String, async (MocketEvent) -> &Responder)]]
ws_static_routes : Map[String, (WebSocketEvent) -> Unit]
ws_dynamic_routes : Array[(String, (WebSocketEvent) -> Unit)]
ws_clients : Map[String, Unit]
ws_channels : Map[String, Map[String, Unit]]
ws_client_port : Map[String, Int]
max_body_size : Int
error_handler : (MocketEvent, Error) -> &Responder
// private fields
}fn Mocket::checkin(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::checkout(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::connect(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::delete(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::mkactivity(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::mkcalendar(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::mkredirectref(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::mkworkspace(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::on(self : Mocket, event : String, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::options(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::orderpatch(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::propfind(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::proppatch(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::rebind(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::report(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::search(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::unbind(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::uncheckout(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::unlink(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::unlock(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::update(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::updateredirectref(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitfn Mocket::use_middleware(self : Mocket, middleware : async (MocketEvent, async () -> &Responder) -> &Responder, base_path? : String) -> Unitfn Mocket::version_control(self : Mocket, path : String, handler : async (MocketEvent) -> &Responder) -> Unitpub(all) struct MocketEvent {
req : HttpRequest
res : HttpResponse
params : Map[String, StringView]
}pub(all) struct MultipartFormValue {
filename : String?
content_type : String?
data : BytesView
}pub(all) struct StaticAssetMeta {
asset_type : String?
etag : String?
mtime : Int64?
path : String?
size : Int64?
encoding : String?
}fn StaticAssetMeta::new(asset_type? : String, etag? : String, mtime? : Int64, path? : String, size? : Int64, encoding? : String) -> StaticAssetMetapub(all) enum StatusCode {
Continue
SwitchingProtocols
Processing
EarlyHints
OK
Created
Accepted
NonAuthoritativeInfo
NoContent
ResetContent
PartialContent
MultiStatus
AlreadyReported
IMUsed
MultipleChoices
MovedPermanently
Found
SeeOther
NotModified
UseProxy
TemporaryRedirect
PermanentRedirect
BadRequest
Unauthorized
PaymentRequired
Forbidden
NotFound
MethodNotAllowed
NotAcceptable
ProxyAuthRequired
RequestTimeout
Conflict
Gone
LengthRequired
PreconditionFailed
RequestEntityTooLarge
RequestUriTooLong
UnsupportedMediaType
RequestedRangeNotSatisfiable
ExpectationFailed
Teapot
MisdirectedRequest
UnprocessableEntity
Locked
FailedDependency
TooEarly
UpgradeRequired
PreconditionRequired
TooManyRequests
RequestHeaderFieldsTooLarge
UnavailableForLegalReasons
InternalServerError
NotImplemented
BadGateway
ServiceUnavailable
GatewayTimeout
HttpVersionNotSupported
VariantAlsoNegotiates
InsufficientStorage
LoopDetected
NotExtended
NetworkAuthenticationRequired
Custom(Int)
} derive(Eq, ToJson)pub(all) enum WebSocketAggregatedMessage {
Text(String)
Binary(Bytes)
Ping
}pub(all) enum WebSocketEvent {
Open(WebSocketPeer)
Message(WebSocketPeer, WebSocketAggregatedMessage)
Close(WebSocketPeer)
}async fn dispatch_http(mocket : Mocket, http_method : String, url : String, headers : Map[CaseInsensitiveString, StringView], raw_body : Bytes) -> HttpResponsefn dispatch_ws_event(handler : (WebSocketEvent) -> Unit, peer : WebSocketPeer, event_type : String, payload : Bytes) -> Unitasync fn execute_middlewares(middlewares : Array[(String, async (MocketEvent, async () -> &Responder) -> &Responder)], event : MocketEvent, final_handler : async (MocketEvent) -> &Responder) -> &Responderfn register_ws_connection(connection_id : String, text_sender : (String) -> Unit, binary_sender : (Bytes) -> Unit, pong_sender : () -> Unit) -> Unitasync fn[T, E : Error] suspend(f : ((T) -> Unit, (E) -> Unit) -> Unit) -> T raise EInstall
Download zipA web framework for MoonBit.
Dependencies