// Copyright 2018 The Fuchsia Authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.

namespace p2p_sync;

// Handshake. Gives the host_name of the device. Will be the first message
// once a connection is established.
table Handshake {
  version: ushort;
  host_name: [ubyte];
}

table NamespacePageId {
  namespace_id: [ubyte];
  page_id: [ubyte];
}

// Request that the other side starts sending us new commits.
// There is no guarantee that the other side actually sends data over, or at
// which frequency (for instance, if low on battery).
table WatchStartRequest {}

// Request that the other side stops sending us new commits.
table WatchStopRequest {}

table Data {
  bytes: [ubyte];
}

table CommitId {
  id: [ubyte];
}

// Request commit data.
table CommitRequest {
  commit_ids: [CommitId];
}

enum CommitStatus : ushort {
  OK,
  // No commit by this id is known.
  UNKNOWN_COMMIT,
}

table Commit {
  id: CommitId;
  status: CommitStatus;
  commit: Data;
}

table CommitResponse {
  commits: [Commit];
}

table ObjectId {
  key_index: uint;
  deletion_scope_id: uint;
  digest: [ubyte];
}

// Request some objects.
table ObjectRequest {
  object_ids: [ObjectId];
}

enum ObjectStatus : ushort {
  OK,
  // No object by this id is known.
  UNKNOWN_OBJECT,
}

// Whether an object is known to be synced to the cloud.
enum ObjectSyncStatus : ubyte {
  // The object is not known to be synced to the cloud.
  UNSYNCED,
  // The object is known to be synced to the cloud.
  SYNCED_TO_CLOUD,
}

table Object {
  id: ObjectId;
  status: ObjectStatus;
  data: Data;
  sync_status: ObjectSyncStatus;
}

table ObjectResponse {
  objects: [Object];
}

union RequestMessage {
  WatchStartRequest,
  WatchStopRequest,
  CommitRequest,
  ObjectRequest,
}

table Request {
  namespace_page: NamespacePageId;
  request: RequestMessage;
}

union ResponseMessage {
  CommitResponse,
  ObjectResponse,
}

enum ResponseStatus : ushort {
  OK,
  // No namespace by this name is known. Requesting side should stop sending
  // requests for this namespace.
  UNKNOWN_NAMESPACE,
  // No page by this name is known in this ledger. Requesting side should stop
  // sending requests for this page.
  UNKNOWN_PAGE,
}

table Response {
  status: ResponseStatus;
  namespace_page: NamespacePageId;
  response: ResponseMessage;
}

union MessageUnion {
  Request,
  Response,
}

// Message contains the business-logic messages sent between devices.
table Message {
  message: MessageUnion;
}

root_type Message;
