hop-2012/subscription.ml

51 lines
1.1 KiB
OCaml
Raw Normal View History

2012-01-08 17:41:04 +00:00
open Datastructures
type t = {
mutable live: bool;
uuid: Uuid.t;
filter: Sexp.t;
sink: string;
name: Sexp.t
}
type set_t = t StringMap.t ref
let new_set () = ref StringMap.empty
2012-03-05 21:56:28 +00:00
let create subs filter sink name reply_sink reply_name =
2012-01-08 17:41:04 +00:00
let uuid = Uuid.create () in
let sub = {
live = true;
uuid = uuid;
filter = filter;
sink = sink;
name = name
} in
subs := StringMap.add uuid sub !subs;
Node.post_ignore reply_sink reply_name (Message.subscribe_ok (Sexp.Str uuid)) (Sexp.Str "");
sub
2012-03-05 21:56:28 +00:00
let delete subs uuid =
try
let sub = StringMap.find uuid !subs in
sub.live <- false;
subs := StringMap.remove uuid !subs;
Some sub
with Not_found ->
None
2012-01-08 17:41:04 +00:00
let lookup subs uuid =
try Some (StringMap.find uuid !subs)
with Not_found -> None
2012-03-05 21:56:28 +00:00
let send_to_subscription' sub body delete_action =
2012-01-08 17:41:04 +00:00
if not sub.live
then false
else
if Node.post sub.sink sub.name body (Sexp.Str sub.uuid)
then true
else (delete_action sub.uuid; false)
2012-03-05 21:56:28 +00:00
let send_to_subscription subs sub body =
send_to_subscription' sub body (fun (uuid) -> delete subs uuid)