On a quest for agency in Bellairs

create works + try to make the file capability persistent

Changed files
+26 -30
mvp
+3 -1
mvp/ocaml/client/client.ml
···
Capnp_rpc_unix.with_cap_exn client f
let pp_name ppf name = Fmt.pf ppf "%a" Fmt.(styled `Bold string) name
-
let pp_entry ppf entry = pp_name ppf entry.Storage.name
+
+
let pp_entry ppf { Storage.name; file } =
+
Fmt.pf ppf "%a:%a" pp_name name Capability.pp file
let ls net () uri =
connect net uri @@ fun dir ->
+9 -24
mvp/ocaml/client/storage.ml
···
let open API.Client.Directory.Create in
let request, params = Capability.Request.create Params.init_pointer in
Params.name_set params name;
-
let results = Capability.call_for_value_exn t method_id request in
-
match Results.file_get results with
-
| Some file -> file
-
| None -> failwith "Storage.create: no file returned"
+
Capability.call_for_caps t method_id request Results.file_get_pipelined
let open_ t name =
let open API.Client.Directory.Open in
···
let results = Capability.call_for_value_exn t method_id request in
Stdint.Int64.of_uint64 (Results.size_get results)
+
let opt_set f params = function
+
| None -> ()
+
| Some n -> f params (Stdint.Int64.to_uint64 n)
+
let read ?off ?len t =
let open API.Client.File.Read in
let request, params = Capability.Request.create Params.init_pointer in
-
let () =
-
match off with
-
| None -> ()
-
| Some off -> Params.off_set params (Stdint.Int64.to_uint64 off)
-
in
-
let () =
-
match len with
-
| None -> ()
-
| Some len -> Params.len_set params (Stdint.Int64.to_uint64 len)
-
in
+
opt_set Params.off_set params off;
+
opt_set Params.len_set params len;
let results = Capability.call_for_value_exn t method_id request in
Results.data_get results
let write ?off ?len t d =
let open API.Client.File.Write in
let request, params = Capability.Request.create Params.init_pointer in
-
let () =
-
match off with
-
| None -> ()
-
| Some off -> Params.off_set params (Stdint.Int64.to_uint64 off)
-
in
-
let () =
-
match len with
-
| None -> ()
-
| Some len -> Params.len_set params (Stdint.Int64.to_uint64 len)
-
in
+
opt_set Params.off_set params off;
+
opt_set Params.len_set params len;
Params.data_set params d;
Capability.call_for_unit_exn t method_id request
+2 -2
mvp/ocaml/server/directory.ml
···
open Capnp_rpc.Std
module API = Schema.Storage.MakeRPC (Capnp_rpc)
-
let local dir =
+
let local sr dir =
let module Directory = API.Service.Directory in
-
Directory.local
+
Capnp_rpc.Persistence.with_sturdy_ref sr Directory.local
@@ object
inherit Directory.service
+4 -1
mvp/ocaml/server/directory.mli
···
open Capnp_rpc
open Bellairs
-
val local : Impl.dir -> API.Service.Directory.t Capability.t
+
val local :
+
API.Service.Directory.t Sturdy_ref.t ->
+
Impl.dir ->
+
API.Service.Directory.t Capability.t
+8 -2
mvp/ocaml/server/server.ml
···
let serve () config =
Switch.run @@ fun sw ->
+
let make_sturdy = Capnp_rpc_unix.Vat_config.sturdy_uri config in
+
let services = Restorer.Table.create ~sw make_sturdy in
+
let restore = Restorer.of_table services in
let root_id = Capnp_rpc_unix.Vat_config.derived_id config "root" in
-
let root = Impl.root () in
-
let restore = Restorer.single root_id (Directory.local root) in
+
let root =
+
let sr = Capnp_rpc_net.Restorer.Table.sturdy_ref services root_id in
+
Directory.local sr (Impl.root ())
+
in
+
Restorer.Table.add services root_id root;
let vat = Capnp_rpc_unix.serve ~sw ~restore config in
match Capnp_rpc_unix.Cap_file.save_service vat root_id cap_file with
| Error (`Msg m) -> failwith m