syntax = "proto3"; package protocol; option optimize_for = SPEED; option go_package = "go.miragespace.co/specter/spec/protocol"; import "google/protobuf/duration.proto"; service KVService { rpc Put(SimpleRequest) returns (SimpleResponse); rpc Get(SimpleRequest) returns (SimpleResponse); rpc Delete(SimpleRequest) returns (SimpleResponse); rpc Append(PrefixRequest) returns (PrefixResponse); rpc List(PrefixRequest) returns (PrefixResponse); rpc Contains(PrefixRequest) returns (PrefixResponse); rpc Remove(PrefixRequest) returns (PrefixResponse); rpc Acquire(LeaseRequest) returns (LeaseResponse); rpc Renew(LeaseRequest) returns (LeaseResponse); rpc Release(LeaseRequest) returns (LeaseResponse); rpc Import(ImportRequest) returns (ImportResponse); rpc ListKeys(ListKeysRequest) returns (ListKeysResponse); } message SimpleRequest { bytes key = 1; bytes value = 2; } message SimpleResponse { bytes value = 1; } message PrefixRequest { bytes prefix = 1; bytes child = 2; } message PrefixResponse { repeated bytes children = 1; bool exists = 2; } message LeaseRequest { bytes lease = 1; uint64 new_token = 2; uint64 prev_token = 3; google.protobuf.Duration ttl = 5; } message LeaseResponse { uint64 token = 1; } message KVTransfer { // Presence distinguishes an empty simple value from no simple value, even // when a prefix or lease shares the key. Keep tag 1 for legacy readers. optional bytes simple_value = 1; repeated bytes prefix_children = 2; uint64 lease_token = 3; } message ImportRequest { repeated bytes keys = 1; repeated KVTransfer values = 2; } message ImportResponse {} message ListKeysRequest { bytes prefix = 1; } message KeyComposite { enum Type { UNKNOWN = 0; SIMPLE = 1; PREFIX = 2; LEASE = 3; } bytes key = 1; Type type = 2; } message ListKeysResponse { repeated KeyComposite keys = 1; }