Hive.Pubsub.Make

hive · API reference

Build a t capability from a transport module.

This functor is the extension point for users who bring their own pubsub transport while keeping servers value-oriented:

ocaml]
module Bus = Hive.Pubsub.Make (My_transport)

let pubsub = Bus.pubsub my_transport
let server = Counter.start ~sw ~clock ~pubsub spec

A tiny test transport can be only a table of callbacks:

ocaml]
module Test_transport = struct
  type t = (string, (payload:string -> unit) list) Hashtbl.t

  let publish t ~topic ~payload =
    Hashtbl.find_opt t topic
    |> Option.iter (List.iter (fun callback -> callback ~payload))

  let subscribe t ~topic callback =
    let callbacks = Option.value ~default:[] (Hashtbl.find_opt t topic) in
    Hashtbl.replace t topic (callback :: callbacks);
    fun () -> Hashtbl.remove t topic
end

module Test_pubsub = Hive.Pubsub.Make (Test_transport)

A production adapter can hide richer resources behind its transport handle and still expose only the capability to Hive:

ocaml]
module Valkey_pubsub = Hive.Pubsub.Make (Hive_pubsub_valkey.Transport)

let transport =
  Hive_pubsub_valkey.create ~sw ~net ~clock ~host:"127.0.0.1" ~port:6379 ()

let pubsub = Valkey_pubsub.pubsub transport

Parameters

module T : TRANSPORT

Signature

val pubsub : T.t -> t

pubsub transport adapts transport to the standard Hive capability.