Source file versioned_intf.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
open Types
module Staged = struct
type ('req, 'resp) request =
{ encode_req : 'req -> Call.t
; decode_resp : Csexp.t -> ('resp, Response.Error.t) result
}
type 'payload notification = { encode : 'payload -> Call.t }
end
module type S = sig
type 'a fiber
module Handler : sig
type 'state t
val handle_request : 'state t -> 'state -> Request.t -> Response.t fiber
val handle_notification
: 'state t
-> 'state
-> Call.t
-> (unit, Response.Error.t) result fiber
val prepare_request
: 'a t
-> ('req, 'resp) Decl.Request.witness
-> (('req, 'resp) Staged.request, Version_error.t) result
val prepare_notification
: 'a t
-> 'payload Decl.Notification.witness
-> ('payload Staged.notification, Version_error.t) result
end
module Builder : sig
type 'state t
val to_handler
: 'state t
-> session_version:('state -> Version.t)
-> menu:Menu.t
-> 'state Handler.t
val create : unit -> 'state t
val registered_procedures : 'a t -> (Method.Name.t * Method.Version.t list) list
(** A *declaration* of a procedure is a claim that this side of the session
is able to *initiate* that procedure. Correspondingly, *implementing* a
procedure enables you to *receive* that procedure (and probably do
something in response).
Currently, attempting to both implement and declare the same procedure
in the same builder will raise. While there is nothing fundamentally
wrong with allowing this, it is simpler for the initial version
negotiation to treat all method names uniformly, rather than specifying
whether a given (set of) generation(s) is implemented or declared.
Finally, attempting to declare or implement the same generation twice
will also raise. *)
val declare_notification : 'state t -> 'payload Decl.notification -> unit
val declare_request : 'state t -> ('req, 'resp) Decl.request -> unit
val implement_notification
: 'state t
-> 'payload Decl.notification
-> ('state -> 'payload -> unit fiber)
-> unit
val implement_request
: 'state t
-> ('req, 'resp) Decl.request
-> ('state -> 'req -> 'resp fiber)
-> unit
end
end