-
Notifications
You must be signed in to change notification settings - Fork 21
/
Copy pathecho.ml
98 lines (83 loc) · 2.85 KB
/
echo.ml
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
module Api = Echo_api.MakeRPC(Capnp_rpc)
open Eio.Std
open Capnp_rpc.Std
module Callback = struct
let local fn =
let module Callback = Api.Service.Callback in
Callback.local @@ object
inherit Callback.service
method log_impl params release_param_caps =
let open Callback.Log in
let msg = Params.msg_get params in
release_param_caps ();
fn msg;
Service.return_empty ()
end
module Callback = Api.Client.Callback
let log t msg =
let open Callback.Log in
let request, params = Capability.Request.create Params.init_pointer in
Params.msg_set params msg;
Capability.call_for_unit t method_id request
end
let notify ~delay msg callback =
let rec loop = function
| 0 ->
Service.return_empty ()
| i ->
match Callback.log callback msg with
| Error (`Capnp e) -> Service.error e
| Ok () ->
Eio.Time.Timeout.sleep delay;
loop (i - 1)
in
loop 3
let service_logger =
Callback.local (traceln "[server] Received %S")
let local ~delay =
let module Echo = Api.Service.Echo in
Echo.local @@ object
inherit Echo.service
method ping_impl params release_param_caps =
let open Echo.Ping in
let msg = Params.msg_get params in
release_param_caps ();
let response, results = Service.Response.create Results.init_pointer in
Results.reply_set results ("echo:" ^ msg);
Service.return response
method heartbeat_impl params release_params =
let open Echo.Heartbeat in
let msg = Params.msg_get params in
let callback = Params.callback_get params in
release_params ();
match callback with
| None -> Service.fail "No callback parameter!"
| Some callback ->
Capability.with_ref callback (notify ~delay msg)
(* $MDX part-begin=server-get-logger *)
method get_logger_impl _ release_params =
let open Echo.GetLogger in
release_params ();
let response, results = Service.Response.create Results.init_pointer in
Results.callback_set results (Some service_logger);
Service.return response
(* $MDX part-end *)
end
module Echo = Api.Client.Echo
let ping t msg =
let open Echo.Ping in
let request, params = Capability.Request.create Params.init_pointer in
Params.msg_set params msg;
Capability.call_for_value_exn t method_id request |> Results.reply_get
let heartbeat t msg callback =
let open Echo.Heartbeat in
let request, params = Capability.Request.create Params.init_pointer in
Params.msg_set params msg;
Params.callback_set params (Some callback);
Capability.call_for_unit_exn t method_id request
(* $MDX part-begin=client-get-logger *)
let get_logger t =
let open Echo.GetLogger in
let request = Capability.Request.create_no_args () in
Capability.call_for_caps t method_id request Results.callback_get_pipelined
(* $MDX part-end *)