diff --git a/proto/buffer.proto b/proto/buffer.proto deleted file mode 100644 index 5e5e719..0000000 --- a/proto/buffer.proto +++ /dev/null @@ -1,75 +0,0 @@ -syntax = "proto3"; - -package buffer; -import "proto/user.proto"; - -// handle buffer changes, keep in sync users -service Buffer { - // attach to a buffer and receive operations - rpc Attach (BufferPayload) returns (stream RawOp); - // send an operation for a specific buffer - rpc Edit (OperationRequest) returns (BufferEditResponse); - // create a new buffer - rpc Create (BufferPayload) returns (BufferCreateResponse); - // get contents of buffer - rpc Sync (BufferPayload) returns (BufferResponse); -} - -message BufferView { - int32 id = 1; - - BufferMetadata metadata = 2; -} - -message BufferMetadata { - string name = 2; - string path = 3; - uint64 created = 4; // unix timestamp - repeated user.UserIdentity attached_users = 5; -} - - -// empty request -message BufferCreateResponse {} - -// empty request -message BufferEditResponse {} - -// raw wire operation sequence event -message RawOp { - // operation seq serialized to json - string opseq = 1; - - // user id that has executed the operation - string user = 2; -} - -// client buffer operation request -message OperationRequest { - // buffer path to operate onto - string path = 1; - - // buffer hash of source state - string hash = 2; - - // raw operation sequence - RawOp op = 3; -} - -// generic buffer operation request -message BufferPayload { - // buffer path to operate onto - string path = 1; - - // user id that is requesting the operation - string user = 2; - - // optional buffer full content for replacing - optional string content = 3; -} - -// response from server with buffer content -message BufferResponse { - // current buffer content - string content = 1; -} diff --git a/proto/buffer_service.proto b/proto/buffer_service.proto new file mode 100644 index 0000000..6b09fd0 --- /dev/null +++ b/proto/buffer_service.proto @@ -0,0 +1,15 @@ +syntax = "proto2"; + +package codemp.buffer_service; + +// handle buffer changes, keep in sync users +service Buffer { + // attach to a buffer and receive operations + rpc Attach (stream Operation) returns (stream Operation); +} + +message Operation { + required bytes data = 1; + optional string user = 2; + optional string path = 3; +} \ No newline at end of file diff --git a/proto/cursor.proto b/proto/cursor.proto deleted file mode 100644 index ec53e17..0000000 --- a/proto/cursor.proto +++ /dev/null @@ -1,44 +0,0 @@ -syntax = "proto3"; - -package cursor; - -// handle cursor events and broadcast to all users -service Cursor { - // send cursor movement to server - rpc Moved (CursorEvent) returns (MovedResponse); - // attach to a workspace and receive cursor events - rpc Listen (UserIdentity) returns (stream CursorEvent); -} - -// empty request -message MovedResponse {} - -// a tuple indicating row and column -message RowCol { - int32 row = 1; - int32 col = 2; -} - -// cursor position object -message CursorPosition { - // path of current buffer this cursor is into - string buffer = 1; - // cursor start position - RowCol start = 2; - // cursor end position - RowCol end = 3; -} - -// cursor event, with user id and cursor position -message CursorEvent { - // user moving the cursor - string user = 1; - // new cursor position - CursorPosition position = 2; -} - -// payload identifying user for cursor attaching -message UserIdentity { - // user identifier - string id = 1; -} diff --git a/proto/cursor_service.proto b/proto/cursor_service.proto new file mode 100644 index 0000000..b0319a8 --- /dev/null +++ b/proto/cursor_service.proto @@ -0,0 +1,13 @@ +syntax = "proto2"; + +package codemp.cursor; +import "proto/model/cursor.proto"; +import "proto/model/user.proto"; + +// handle cursor events and broadcast to all users +service Cursor { + // send cursor movement to server + rpc Moved (cursor.CursorEvent) returns (cursor.MovedResponse); + // attach to a workspace and receive cursor events + rpc Listen (codemp.model.user.UserIdentity) returns (stream cursor.CursorEvent); +} diff --git a/proto/model/cursor.proto b/proto/model/cursor.proto new file mode 100644 index 0000000..d9a4666 --- /dev/null +++ b/proto/model/cursor.proto @@ -0,0 +1,32 @@ +syntax = "proto2"; + +package codemp.model.cursor; + +import "proto/model/user.proto"; + +// empty request +message MovedResponse {} + +// a tuple indicating row and column +message RowCol { + required int32 row = 1; + required int32 col = 2; +} + +// cursor position object +message CursorPosition { + // path of current buffer this cursor is into + required string buffer = 1; + // cursor start position + required RowCol start = 2; + // cursor end position + required RowCol end = 3; +} + +// cursor event, with user id and cursor position +message CursorEvent { + // user moving the cursor + required codemp.model.user.UserIdentity user = 1; + // new cursor position + required CursorPosition position = 2; +} \ No newline at end of file diff --git a/proto/model/files.proto b/proto/model/files.proto new file mode 100644 index 0000000..e69de29 diff --git a/proto/user.proto b/proto/model/user.proto similarity index 57% rename from proto/user.proto rename to proto/model/user.proto index 1697d5d..9c37484 100644 --- a/proto/user.proto +++ b/proto/model/user.proto @@ -1,12 +1,12 @@ -syntax = "proto3"; +syntax = "proto2"; -package user; +package codemp.model.user; // payload identifying user message UserIdentity { // user identifier - string id = 1; + required string id = 1; } service User{ diff --git a/proto/model/workspace.proto b/proto/model/workspace.proto new file mode 100644 index 0000000..e69de29 diff --git a/proto/workspace.proto b/proto/workspace.proto deleted file mode 100644 index 3f0dd42..0000000 --- a/proto/workspace.proto +++ /dev/null @@ -1,158 +0,0 @@ -// Workspace effimero: sta in /tmp o proprio in memoria -// Workspace e` autenticato: come si decide mentre si rifa il server -// Workspace ha id univoco (stringa), usato per connettercisi -// Workspace implementera` access control: -// * accedere al workspace -// * i singoli buffer -// - i metadati maybe???? -// Workspace offre le seguenti features: -// * listare i buffer DONE -// * listare gli user connessi DONE -// * creare buffers DONE REPLACE THE ONE ON buffer.proto -// * NO ATTACH: responsabilita` del buffer service -// * contiene metadata dei buffers: -// * path -// * data creazione -// Buffer id NON E` il path DONE -// BufferService NON ha metadata: -// Workspace tiene traccia di utenti attached (nel futuro) DONE - - - - - - -syntax = "proto3"; - -package workspace; -import "proto/user.proto"; -import "proto/buffer.proto"; - -message Empty {} - -message WorkspaceEvent { - oneof event { - CursorEvent cursor = 1; - FileEvent file = 2; - UserEvent user = 3; - } -} - -message WorkspaceFileTree { - // list of strings may be more efficient but it's a lot more hassle - string payload = 1; // spappolata di json -} - -message WorkspaceUserList { - repeated user.UserIdentity user = 1; -} - -message WorkspaceMessage { - int32 id = 1; -} - - -message TreeRequest {} // empty -message UserRequest {} -message CursorResponse{} -message UserListRequest{} - -service Workspace { - - // - rpc Create (BufferPayload) returns (BufferCreateResponse); - - rpc ListBuffers (BufferListRequest) returns (BufferList); - - rpc ListUsers (UserListRequest) returns (UserList); - - // - rpc Join (user.UserIdentity) returns (stream WorkspaceEvent); - - // - rpc Tree (TreeRequest) returns (WorkspaceFileTree); - - // - rpc Users (UserRequest) returns (WorkspaceUserList); // TODO could be handled by cursor service - - // send cursor movement to server - rpc Cursor (CursorEvent) returns (CursorResponse); -} - -// a tuple indicating row and column -message RowCol { - int32 row = 1; - int32 col = 2; -} - -// cursor position object -message CursorPosition { - // cursor start position - RowCol start = 1; - // cursor end position - RowCol end = 2; -} - -// cursor event, with user id and cursor position -message CursorEvent { - // user moving the cursor - string user = 1; - // path of current buffer this cursor is into - string buffer = 2; - // new cursor position - repeated CursorPosition position = 3; -} - -enum FileEventType { - CREATE = 0; - DELETE = 1; - RENAME = 2; -} - -message FileEvent { - string buffer = 1; - - FileEventType type = 2; -} - -enum UserEventType { - JOIN = 0; - LEAVE = 1; -} - -message UserEvent { - user.UserIdentity user = 1; - - UserEventType type = 2; -} - - - -message BufferPayload { - // buffer path to operate onto - string path = 1; - - // user id that is requesting the operation - user.UserIdentity user = 2; - - // optional buffer full content for replacing - optional string content = 3; -} - -message BufferCreateResponse { - - string status = 1; -} - - -message BufferListRequest{ - -} - -message BufferList{ - repeated buffer.BufferView buffers = 1; -} - -message UserList{ - repeated user.UserIdentity users = 1; -} \ No newline at end of file diff --git a/proto/workspace_service.proto b/proto/workspace_service.proto new file mode 100644 index 0000000..f06a5fa --- /dev/null +++ b/proto/workspace_service.proto @@ -0,0 +1,135 @@ +// Workspace effimero: sta in /tmp o proprio in memoria +// Workspace e` autenticato: come si decide mentre si rifa il server +// Workspace ha id univoco (stringa), usato per connettercisi +// Workspace implementera` access control: +// * accedere al workspace +// * i singoli buffer +// - i metadati maybe???? +// Workspace offre le seguenti features: +// * listare i buffer DONE +// * listare gli user connessi DONE +// * creare buffers DONE REPLACE THE ONE ON buffer.proto +// * NO ATTACH: responsabilita` del buffer service +// * contiene metadata dei buffers: +// * path +// * data creazione +// Buffer id NON E` il path DONE +// BufferService NON ha metadata: +// Workspace tiene traccia di utenti attached (nel futuro) DONE + + + + + + +syntax = "proto2"; + +package codemp.workspace_service; +import "proto/model/cursor.proto"; +import "proto/model/user.proto"; + + +message Empty {} + + +message WorkspaceFileTree { + // list of strings may be more efficient but it's a lot more hassle + required string payload = 1; // spappolata di json +} + +message WorkspaceUserList { + repeated codemp.model.user.UserIdentity user = 1; +} + +message WorkspaceMessage { + required int32 id = 1; +} + + +message TreeRequest {} // empty +message UserRequest {} +message CursorResponse{} +message UserListRequest{} + +service Workspace { + + // + rpc Create (BufferPayload) returns (Empty); + + rpc Attach (AttachRequest) returns (Token); + + rpc ListBuffers (BufferListRequest) returns (Empty); + + rpc ListUsers (UserListRequest) returns (UserList); + + rpc Join (JoinRequest) returns (Token); + +} + + +message JoinRequest{ + required string username=1; + required string password=2; +} + +message AttachRequest{ + required string bufferAttach = 1; +} + + + + +message Token{ + required string token = 1; +} + +enum FileEventType { + CREATE = 0; + DELETE = 1; + RENAME = 2; +} + +message FileEvent { + required string buffer = 1; + + required FileEventType type = 2; +} + +enum UserEventType { + JOIN = 0; + LEAVE = 1; +} + +message UserEvent { + required codemp.model.user.UserIdentity user = 1; + + required UserEventType type = 2; +} + + + +message BufferPayload { + // buffer path to operate onto + required string path = 1; + + // user id that is requesting the operation + required codemp.model.user.UserIdentity user = 2; + +} + + +message BufferListRequest{ + +} + +message BufferNode{ + required string path = 1; +} + +message BufferTree{ + repeated BufferNode buffers = 1; +} + +message UserList{ + repeated codemp.model.user.UserIdentity users = 1; +} \ No newline at end of file