···1010 val size : file -> int64
1111 val read : ?off:int64 -> ?len:int64 -> file -> string
1212 val write : ?off:int64 -> ?len:int64 -> file -> string -> unit
1313+1414+ (* FIXME: not totally sure if that should be here *)
1515+ val share : file -> Uri.t
1316end
14171518module type Sigs = sig
+10-11
mvp/ocaml/client/client.ml
···88 Capnp_rpc_unix.with_cap_exn client f
991010let pp_name ppf name = Fmt.pf ppf "%a" Fmt.(styled `Bold string) name
1111-1212-let pp_entry ppf { Storage.name; file } =
1313- Fmt.pf ppf "%a:%a" pp_name name Capability.pp file
1111+let pp_uri ppf id = Fmt.pf ppf "%a" Fmt.(styled `Yellow Uri.pp) id
1212+let pp_entry ppf { Storage.name; _ } = Fmt.pf ppf "%a" pp_name name
14131514let ls net () uri =
1615 connect net uri @@ fun dir ->
···2524 Storage.write file data;
2625 Fmt.pr "%a is created.\n%!" pp_name name
27262828-let open_file net () uri name =
2727+let share net () uri name =
2928 connect net uri @@ fun dir ->
3030- let _file = Storage.open_ dir name in
3131- Fmt.pr "%a: <raw>.\n%!" pp_name name
2929+ Capability.with_ref (Storage.open_ dir name) @@ fun file ->
3030+ let uri = Storage.share file in
3131+ Fmt.pr "%a\n%!" pp_uri uri
32323333let delete net () uri name =
3434 connect net uri @@ fun dir ->
···110110 Term.(
111111 const (create env#net) $ setup_log $ connect_addr $ name_arg $ data_arg)
112112113113-let open_cmd env =
113113+let share_cmd env =
114114 let doc = "Open an existing file and show its ID" in
115115- let info = Cmd.info "open" ~doc in
116116- Cmd.v info
117117- Term.(const (open_file env#net) $ setup_log $ connect_addr $ name_arg)
115115+ let info = Cmd.info "share" ~doc in
116116+ Cmd.v info Term.(const (share env#net) $ setup_log $ connect_addr $ name_arg)
118117119118let delete_cmd env =
120119 let doc = "Delete a file" in
···149148 [
150149 ls_cmd env;
151150 create_cmd env;
152152- open_cmd env;
151151+ share_cmd env;
153152 delete_cmd env;
154153 size_cmd env;
155154 read_cmd env;
+7-2
mvp/ocaml/client/storage.ml
···3535 let open API.Client.Directory.Delete in
3636 let request, params = Capability.Request.create Params.init_pointer in
3737 Params.name_set params name;
3838- let _ = Capability.call_for_value_exn t method_id request in
3939- ()
3838+ Capability.call_for_unit_exn t method_id request
40394140let size t =
4241 let open API.Client.File.Size in
4342 let request = Capability.Request.create_no_args () in
4443 let results = Capability.call_for_value_exn t method_id request in
4544 Stdint.Int64.of_uint64 (Results.size_get results)
4545+4646+let share t =
4747+ let open API.Client.File.Share in
4848+ let request = Capability.Request.create_no_args () in
4949+ let results = Capability.call_for_value_exn t method_id request in
5050+ Uri.of_string (Results.uri_get results)
46514752let opt_set f params = function
4853 | None -> ()
+2-2
mvp/ocaml/server/directory.ml
···11open Capnp_rpc.Std
22module API = Schema.Storage.MakeRPC (Capnp_rpc)
3344-let local sr dir =
44+let local dir =
55 let module Directory = API.Service.Directory in
66- Capnp_rpc.Persistence.with_sturdy_ref sr Directory.local
66+ Directory.local
77 @@ object
88 inherit Directory.service
99
···11-open Capnp_rpc.Std
21open Bellairs
22+open Capnp_rpc.Std
3344let int64_of_uint64 n =
55 match Stdint.Int64.of_uint64 n with -1L -> None | i -> Some i
···77let local file =
88 let module File = API.Service.File in
99 File.local
1010- @@ object
1010+ @@ object (self)
1111 inherit File.service
1212+1313+ method share_impl _params release_param_caps =
1414+ let open File.Share in
1515+ release_param_caps ();
1616+ let response, results = Service.Response.create Results.init_pointer in
1717+ let uri = Capnp_rpc.Persistence.save_exn (File.local self) in
1818+ Results.uri_set results (Uri.to_string uri);
1919+ Service.return response
12201321 method read_impl params release_param_caps =
1422 let open File.Read in
···22 in-memory database *)
3344type file = { mutable content : string }
55-type dir = (string, file) Hashtbl.t
55+type dir = { files : (string, file) Hashtbl.t }
66type entry = { name : string; file : file }
7788-let create files name =
88+let create { files } name =
99 let file = { content = "" } in
1010 Hashtbl.add files name file;
1111 file
12121313-let root () =
1414- let tbl = Hashtbl.create 10 in
1515- let _ = create tbl "foo" in
1616- let _ = create tbl "bar" in
1717- tbl
1818-1919-let open_ (files : dir) name = Hashtbl.find files name
2020-let delete files name = Hashtbl.remove files name
1313+let root () = { files = Hashtbl.create 10 }
1414+let open_ dir name = Hashtbl.find dir.files name
1515+let delete dir name = Hashtbl.remove dir.files name
21162217let read ?(off = 0L) ?len file =
2318 let content_len = String.length file.content in
···47424843let size file = Int64.of_int (String.length file.content)
49445050-let list files =
5151- Hashtbl.fold (fun name file acc -> { name; file } :: acc) files []
4545+let list dir =
4646+ Hashtbl.fold (fun name file acc -> { name; file } :: acc) dir.files []
4747+4848+(* this is done in another layer *)
4949+let share _ = assert false
+1-4
mvp/ocaml/server/server.ml
···99 let services = Restorer.Table.create ~sw make_sturdy in
1010 let restore = Restorer.of_table services in
1111 let root_id = Capnp_rpc_unix.Vat_config.derived_id config "root" in
1212- let root =
1313- let sr = Capnp_rpc_net.Restorer.Table.sturdy_ref services root_id in
1414- Directory.local sr (Impl.root ())
1515- in
1212+ let root = Directory.local (Impl.root ()) in
1613 Restorer.Table.add services root_id root;
1714 let vat = Capnp_rpc_unix.serve ~sw ~restore config in
1815 match Capnp_rpc_unix.Cap_file.save_service vat root_id cap_file with
+6-4
mvp/schema/storage.capnp
···2424interface File {
2525 # Represents a file in the filesystem
26262727- size @0 () -> (size :UInt64);
2828- # Returns the size of the file in bytes
2929-3030- read @1 (off :UInt64 = 0, len :UInt64 = 0xffffffffffffffff) -> (data :Data);
2727+ read @0 (off :UInt64 = 0, len :UInt64 = 0xffffffffffffffff) -> (data :Data);
3128 # Reads data from the file, optionally starting at offset and reading up to len bytes
3229 # Default is to read the entire file
33303131+ size @1 () -> (size :UInt64);
3232+ # Returns the size of the file in bytes
3333+3434 write @2 (off :UInt64 = 0, len :UInt64 = 0xffffffffffffffff, data :Data) -> ();
3535 # Write data to the file, optionally starting at offset and reading up to len bytes
3636 # Default is to write the entire file
3737+3838+ share @3 () -> (uri: Text);
3739}