diff options
author | Clombrong <cromblong@egregore.fun> | 2025-08-14 23:01:59 +0200 |
---|---|---|
committer | Clombrong <cromblong@egregore.fun> | 2025-08-15 00:14:28 +0200 |
commit | 5d31409b2e1a3624b23e894b606c1412546fc5ee (patch) | |
tree | e5829642358bec175685e23c5e0b77b9f1c101c6 | |
parent | cbdbb587236f8d747ae5baf4b4f92e9458dff4f1 (diff) |
feat!: use new opaque domain type in code
-rw-r--r-- | lib/jid.ml | 7 | ||||
-rw-r--r-- | lib/session.ml | 4 | ||||
-rw-r--r-- | lib/stream.ml | 2 |
3 files changed, 7 insertions, 6 deletions
@@ -1,7 +1,7 @@ (** An XMPP JID. If there is no localpart or resourcepart, they're [None]. *) type t = { localpart : string option; - domainpart : string; + domainpart : Portal.domain; resourcepart : string option; } @@ -65,6 +65,7 @@ let of_string (jid : string) : t = begin let b = (value ~default:0 domain_begin) in sub jid b ((value ~default:(length jid) domain_end) - b) + |> Portal.domain_of_string end; resourcepart = map (fun i -> sub jid (i + 1) (length jid - i - 1)) domain_end; } @@ -72,7 +73,7 @@ let of_string (jid : string) : t = let to_string ({ localpart; domainpart; resourcepart } : t) = let local = Option.fold ~none:"" ~some:(fun l -> l ^ "@") localpart and resource = Option.fold ~none:"" ~some:(fun r -> "/" ^ r) resourcepart - in local ^ domainpart ^ resource + in local ^ (Portal.domain_to_string domainpart) ^ resource let show ({ localpart; domainpart; resourcepart } : t) = let show_opt = Option.fold ~none:"None" ~some:(Format.sprintf {|Some "%s"|}) @@ -80,7 +81,7 @@ let show ({ localpart; domainpart; resourcepart } : t) = {|{ localpart = %s; domainpart = "%s"; resourcepart = %s }|} - (show_opt localpart) domainpart (show_opt resourcepart) + (show_opt localpart) (Portal.domain_to_string domainpart) (show_opt resourcepart) (* RFC7622 3.5 examples *) diff --git a/lib/session.ml b/lib/session.ml index f4d5f94..421c01e 100644 --- a/lib/session.ml +++ b/lib/session.ml @@ -10,7 +10,7 @@ type step = type state = | Disconnected - | Connecting of string + | Connecting of Portal.domain (* TCP/WebSocket connected, not connected in XMPP-land *) | Connected of Portal.t * step @@ -27,7 +27,7 @@ type t = { Basically, it conforms to {{: https://datatracker.ietf.org/doc/html/rfc6120#section-4.3 }}, and gets the Portal in a "ready" state. *) -let create (domain : string) (config : config) : t Lwt.t = +let create (domain : Portal.domain) (config : config) : t Lwt.t = let needs_restart = function | Feature.Mechanisms _ | STARTTLS -> true | _ -> false diff --git a/lib/stream.ml b/lib/stream.ml index b4d5833..23aac34 100644 --- a/lib/stream.ml +++ b/lib/stream.ml @@ -65,7 +65,7 @@ let parse_features (stanza : Xml.element) : features = (** [start domain portal] is a promise to features that starts a stream negotiation with the XMPP server [portal]. *) -let start (domain : string) (portal : Portal.t) : features Lwt.t = +let start (domain : Portal.domain) (portal : Portal.t) : features Lwt.t = let* _id = Portal.header domain portal in Wire.get portal.stream >|= parse_features |