This repository has no description
1(*---------------------------------------------------------------------------
2 Copyright (c) 2025 Anil Madhavapeddy. All rights reserved.
3 SPDX-License-Identifier: ISC
4 ---------------------------------------------------------------------------*)
5
6(** JMAP capability types as defined in RFC 8620 Section 2
7
8 @canonical Jmap.Proto.Capability *)
9
10(** {1 Standard Capability URIs} *)
11
12val core : string
13(** [urn:ietf:params:jmap:core] - Core JMAP capability (RFC 8620) *)
14
15val mail : string
16(** [urn:ietf:params:jmap:mail] - Mail capability (RFC 8621) *)
17
18val submission : string
19(** [urn:ietf:params:jmap:submission] - Email submission capability (RFC 8621) *)
20
21val vacation_response : string
22(** [urn:ietf:params:jmap:vacationresponse] - Vacation response capability (RFC 8621) *)
23
24(** {1 Core Capability Object} *)
25
26(** Core capability limits and configuration per RFC 8620 Section 2. *)
27module Core : sig
28 type t = {
29 max_size_upload : int64;
30 (** Maximum size in octets for a single blob upload. *)
31 max_concurrent_upload : int;
32 (** Maximum number of concurrent upload requests. *)
33 max_size_request : int64;
34 (** Maximum size in octets of a single request. *)
35 max_concurrent_requests : int;
36 (** Maximum number of concurrent requests. *)
37 max_calls_in_request : int;
38 (** Maximum number of method calls in a single request. *)
39 max_objects_in_get : int;
40 (** Maximum number of objects in a single /get request. *)
41 max_objects_in_set : int;
42 (** Maximum number of objects in a single /set request. *)
43 collation_algorithms : string list;
44 (** Supported collation algorithms for sorting. *)
45 }
46
47 val create :
48 max_size_upload:int64 ->
49 max_concurrent_upload:int ->
50 max_size_request:int64 ->
51 max_concurrent_requests:int ->
52 max_calls_in_request:int ->
53 max_objects_in_get:int ->
54 max_objects_in_set:int ->
55 collation_algorithms:string list ->
56 t
57
58 val max_size_upload : t -> int64
59 val max_concurrent_upload : t -> int
60 val max_size_request : t -> int64
61 val max_concurrent_requests : t -> int
62 val max_calls_in_request : t -> int
63 val max_objects_in_get : t -> int
64 val max_objects_in_set : t -> int
65 val collation_algorithms : t -> string list
66
67 val jsont : t Jsont.t
68 (** JSON codec for core capability. *)
69end
70
71(** {1 Mail Capability Object} *)
72
73(** Mail capability configuration per RFC 8621. *)
74module Mail : sig
75 type t = {
76 max_mailboxes_per_email : int64 option;
77 (** Maximum number of mailboxes an email can belong to. *)
78 max_mailbox_depth : int64 option;
79 (** Maximum depth of mailbox hierarchy. *)
80 max_size_mailbox_name : int64;
81 (** Maximum size of a mailbox name in octets. *)
82 max_size_attachments_per_email : int64;
83 (** Maximum total size of attachments per email. *)
84 email_query_sort_options : string list;
85 (** Supported sort options for Email/query. *)
86 may_create_top_level_mailbox : bool;
87 (** Whether the user may create top-level mailboxes. *)
88 }
89
90 val create :
91 ?max_mailboxes_per_email:int64 ->
92 ?max_mailbox_depth:int64 ->
93 max_size_mailbox_name:int64 ->
94 max_size_attachments_per_email:int64 ->
95 email_query_sort_options:string list ->
96 may_create_top_level_mailbox:bool ->
97 unit ->
98 t
99
100 val max_mailboxes_per_email : t -> int64 option
101 val max_mailbox_depth : t -> int64 option
102 val max_size_mailbox_name : t -> int64
103 val max_size_attachments_per_email : t -> int64
104 val email_query_sort_options : t -> string list
105 val may_create_top_level_mailbox : t -> bool
106
107 val jsont : t Jsont.t
108end
109
110(** {1 Submission Capability Object} *)
111
112module Submission : sig
113 type t = {
114 max_delayed_send : int64;
115 (** Maximum delay in seconds for delayed sending (0 = not supported). *)
116 submission_extensions : (string * string list) list;
117 (** SMTP extensions supported. *)
118 }
119
120 val create :
121 max_delayed_send:int64 ->
122 submission_extensions:(string * string list) list ->
123 t
124
125 val max_delayed_send : t -> int64
126 val submission_extensions : t -> (string * string list) list
127
128 val jsont : t Jsont.t
129end
130
131(** {1 Generic Capability Handling} *)
132
133(** A capability value that can be either a known type or unknown JSON. *)
134type capability =
135 | Core of Core.t
136 | Mail of Mail.t
137 | Submission of Submission.t
138 | Vacation_response (* No configuration *)
139 | Unknown of Jsont.json
140
141val capability_of_json : string -> Jsont.json -> capability
142(** [capability_of_json uri json] parses a capability from its URI and JSON value. *)
143
144val capability_to_json : string * capability -> string * Jsont.json
145(** [capability_to_json (uri, cap)] encodes a capability to URI and JSON. *)