ws_revision.rs 3.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133
  1. use bytes::Bytes;
  2. use revision_model::{Revision, RevisionRange};
  3. use serde::{Deserialize, Serialize};
  4. use serde_repr::*;
  5. #[derive(Debug, Clone, Serialize_repr, Deserialize_repr, Eq, PartialEq, Hash)]
  6. #[repr(u8)]
  7. pub enum ClientRevisionWSDataType {
  8. ClientPushRev = 0,
  9. ClientPing = 1,
  10. }
  11. impl Default for ClientRevisionWSDataType {
  12. fn default() -> Self {
  13. ClientRevisionWSDataType::ClientPushRev
  14. }
  15. }
  16. #[derive(Serialize, Deserialize, Default, Debug, Clone)]
  17. pub struct ClientRevisionWSData {
  18. pub object_id: String,
  19. pub ty: ClientRevisionWSDataType,
  20. pub revisions: Vec<Revision>,
  21. pub rev_id: i64,
  22. }
  23. impl ClientRevisionWSData {
  24. pub fn from_revisions(object_id: &str, revisions: Vec<Revision>) -> Self {
  25. let rev_id = match revisions.first() {
  26. None => 0,
  27. Some(revision) => revision.rev_id,
  28. };
  29. Self {
  30. object_id: object_id.to_owned(),
  31. ty: ClientRevisionWSDataType::ClientPushRev,
  32. revisions,
  33. rev_id,
  34. }
  35. }
  36. pub fn ping(object_id: &str, rev_id: i64) -> Self {
  37. Self {
  38. object_id: object_id.to_owned(),
  39. ty: ClientRevisionWSDataType::ClientPing,
  40. revisions: vec![],
  41. rev_id,
  42. }
  43. }
  44. }
  45. impl std::convert::TryFrom<bytes::Bytes> for ClientRevisionWSData {
  46. type Error = serde_json::Error;
  47. fn try_from(bytes: Bytes) -> Result<Self, Self::Error> {
  48. serde_json::from_slice(&bytes)
  49. }
  50. }
  51. impl std::convert::TryFrom<ClientRevisionWSData> for Bytes {
  52. type Error = serde_json::Error;
  53. fn try_from(bytes: ClientRevisionWSData) -> Result<Self, Self::Error> {
  54. serde_json::to_vec(&bytes).map(Bytes::from)
  55. }
  56. }
  57. #[derive(Debug, Clone, Serialize, Deserialize)]
  58. pub enum WSRevisionPayload {
  59. ServerAck { rev_id: i64 },
  60. ServerPushRev { revisions: Vec<Revision> },
  61. ServerPullRev { range: RevisionRange },
  62. UserConnect { user: NewDocumentUser },
  63. }
  64. #[derive(Serialize, Deserialize, Debug, Clone)]
  65. pub struct ServerRevisionWSData {
  66. pub object_id: String,
  67. pub payload: WSRevisionPayload,
  68. }
  69. impl std::convert::TryFrom<Bytes> for ServerRevisionWSData {
  70. type Error = serde_json::Error;
  71. fn try_from(bytes: Bytes) -> Result<Self, Self::Error> {
  72. serde_json::from_slice(&bytes)
  73. }
  74. }
  75. impl std::convert::TryFrom<ServerRevisionWSData> for Bytes {
  76. type Error = serde_json::Error;
  77. fn try_from(bytes: ServerRevisionWSData) -> Result<Self, Self::Error> {
  78. serde_json::to_vec(&bytes).map(Bytes::from)
  79. }
  80. }
  81. impl ServerRevisionWSData {
  82. pub fn to_bytes(&self) -> Vec<u8> {
  83. serde_json::to_vec(&self).unwrap_or_default()
  84. }
  85. }
  86. pub struct ServerRevisionWSDataBuilder();
  87. impl ServerRevisionWSDataBuilder {
  88. pub fn build_push_message(object_id: &str, revisions: Vec<Revision>) -> ServerRevisionWSData {
  89. ServerRevisionWSData {
  90. object_id: object_id.to_string(),
  91. payload: WSRevisionPayload::ServerPushRev { revisions },
  92. }
  93. }
  94. pub fn build_pull_message(object_id: &str, range: RevisionRange) -> ServerRevisionWSData {
  95. ServerRevisionWSData {
  96. object_id: object_id.to_string(),
  97. payload: WSRevisionPayload::ServerPullRev { range },
  98. }
  99. }
  100. pub fn build_ack_message(object_id: &str, rev_id: i64) -> ServerRevisionWSData {
  101. ServerRevisionWSData {
  102. object_id: object_id.to_string(),
  103. payload: WSRevisionPayload::ServerAck { rev_id },
  104. }
  105. }
  106. }
  107. #[derive(Serialize, Deserialize, Default, Debug, Clone)]
  108. pub struct NewDocumentUser {
  109. pub user_id: String,
  110. pub doc_id: String,
  111. pub latest_rev_id: i64,
  112. }