proto.rs

  1#![allow(non_snake_case)]
  2
  3pub mod error;
  4mod macros;
  5mod typed_envelope;
  6
  7pub use error::*;
  8pub use typed_envelope::*;
  9
 10use collections::HashMap;
 11pub use prost::{DecodeError, Message};
 12use serde::Serialize;
 13use std::any::{Any, TypeId};
 14use std::time::Instant;
 15use std::{
 16    cmp,
 17    fmt::Debug,
 18    iter,
 19    time::{Duration, SystemTime, UNIX_EPOCH},
 20};
 21use std::{fmt, mem};
 22
 23include!(concat!(env!("OUT_DIR"), "/zed.messages.rs"));
 24
 25pub trait EnvelopedMessage: Clone + Debug + Serialize + Sized + Send + Sync + 'static {
 26    const NAME: &'static str;
 27    const PRIORITY: MessagePriority;
 28    fn into_envelope(
 29        self,
 30        id: u32,
 31        responding_to: Option<u32>,
 32        original_sender_id: Option<PeerId>,
 33    ) -> Envelope;
 34    fn from_envelope(envelope: Envelope) -> Option<Self>;
 35}
 36
 37pub trait EntityMessage: EnvelopedMessage {
 38    type Entity;
 39    fn remote_entity_id(&self) -> u64;
 40}
 41
 42pub trait RequestMessage: EnvelopedMessage {
 43    type Response: EnvelopedMessage;
 44}
 45
 46pub trait AnyTypedEnvelope: 'static + Send + Sync {
 47    fn payload_type_id(&self) -> TypeId;
 48    fn payload_type_name(&self) -> &'static str;
 49    fn as_any(&self) -> &dyn Any;
 50    fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync>;
 51    fn is_background(&self) -> bool;
 52    fn original_sender_id(&self) -> Option<PeerId>;
 53    fn sender_id(&self) -> PeerId;
 54    fn message_id(&self) -> u32;
 55}
 56
 57pub enum MessagePriority {
 58    Foreground,
 59    Background,
 60}
 61
 62impl<T: EnvelopedMessage> AnyTypedEnvelope for TypedEnvelope<T> {
 63    fn payload_type_id(&self) -> TypeId {
 64        TypeId::of::<T>()
 65    }
 66
 67    fn payload_type_name(&self) -> &'static str {
 68        T::NAME
 69    }
 70
 71    fn as_any(&self) -> &dyn Any {
 72        self
 73    }
 74
 75    fn into_any(self: Box<Self>) -> Box<dyn Any + Send + Sync> {
 76        self
 77    }
 78
 79    fn is_background(&self) -> bool {
 80        matches!(T::PRIORITY, MessagePriority::Background)
 81    }
 82
 83    fn original_sender_id(&self) -> Option<PeerId> {
 84        self.original_sender_id
 85    }
 86
 87    fn sender_id(&self) -> PeerId {
 88        self.sender_id
 89    }
 90
 91    fn message_id(&self) -> u32 {
 92        self.message_id
 93    }
 94}
 95
 96impl PeerId {
 97    pub fn from_u64(peer_id: u64) -> Self {
 98        let owner_id = (peer_id >> 32) as u32;
 99        let id = peer_id as u32;
100        Self { owner_id, id }
101    }
102
103    pub fn as_u64(self) -> u64 {
104        ((self.owner_id as u64) << 32) | (self.id as u64)
105    }
106}
107
108impl Copy for PeerId {}
109
110impl Eq for PeerId {}
111
112impl Ord for PeerId {
113    fn cmp(&self, other: &Self) -> cmp::Ordering {
114        self.owner_id
115            .cmp(&other.owner_id)
116            .then_with(|| self.id.cmp(&other.id))
117    }
118}
119
120impl PartialOrd for PeerId {
121    fn partial_cmp(&self, other: &Self) -> Option<cmp::Ordering> {
122        Some(self.cmp(other))
123    }
124}
125
126impl std::hash::Hash for PeerId {
127    fn hash<H: std::hash::Hasher>(&self, state: &mut H) {
128        self.owner_id.hash(state);
129        self.id.hash(state);
130    }
131}
132
133impl fmt::Display for PeerId {
134    fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
135        write!(f, "{}/{}", self.owner_id, self.id)
136    }
137}
138
139messages!(
140    (Ack, Foreground),
141    (AckBufferOperation, Background),
142    (AckChannelMessage, Background),
143    (AddNotification, Foreground),
144    (AddProjectCollaborator, Foreground),
145    (ApplyCodeAction, Background),
146    (ApplyCodeActionResponse, Background),
147    (ApplyCompletionAdditionalEdits, Background),
148    (ApplyCompletionAdditionalEditsResponse, Background),
149    (BufferReloaded, Foreground),
150    (BufferSaved, Foreground),
151    (Call, Foreground),
152    (CallCanceled, Foreground),
153    (CancelCall, Foreground),
154    (ChannelMessageSent, Foreground),
155    (ChannelMessageUpdate, Foreground),
156    (CompleteWithLanguageModel, Background),
157    (ComputeEmbeddings, Background),
158    (ComputeEmbeddingsResponse, Background),
159    (CopyProjectEntry, Foreground),
160    (CountTokensWithLanguageModel, Background),
161    (CountTokensResponse, Background),
162    (CreateBufferForPeer, Foreground),
163    (CreateChannel, Foreground),
164    (CreateChannelResponse, Foreground),
165    (CreateProjectEntry, Foreground),
166    (CreateRoom, Foreground),
167    (CreateRoomResponse, Foreground),
168    (DeclineCall, Foreground),
169    (DeleteChannel, Foreground),
170    (DeleteNotification, Foreground),
171    (UpdateNotification, Foreground),
172    (DeleteProjectEntry, Foreground),
173    (EndStream, Foreground),
174    (Error, Foreground),
175    (ExpandProjectEntry, Foreground),
176    (ExpandProjectEntryResponse, Foreground),
177    (Follow, Foreground),
178    (FollowResponse, Foreground),
179    (FormatBuffers, Foreground),
180    (FormatBuffersResponse, Foreground),
181    (FuzzySearchUsers, Foreground),
182    (GetCachedEmbeddings, Background),
183    (GetCachedEmbeddingsResponse, Background),
184    (GetChannelMembers, Foreground),
185    (GetChannelMembersResponse, Foreground),
186    (GetChannelMessages, Background),
187    (GetChannelMessagesById, Background),
188    (GetChannelMessagesResponse, Background),
189    (GetCodeActions, Background),
190    (GetCodeActionsResponse, Background),
191    (GetCompletions, Background),
192    (GetCompletionsResponse, Background),
193    (GetDefinition, Background),
194    (GetDefinitionResponse, Background),
195    (GetDocumentHighlights, Background),
196    (GetDocumentHighlightsResponse, Background),
197    (GetHover, Background),
198    (GetHoverResponse, Background),
199    (GetNotifications, Foreground),
200    (GetNotificationsResponse, Foreground),
201    (GetPrivateUserInfo, Foreground),
202    (GetPrivateUserInfoResponse, Foreground),
203    (GetProjectSymbols, Background),
204    (GetProjectSymbolsResponse, Background),
205    (GetReferences, Background),
206    (GetReferencesResponse, Background),
207    (GetSupermavenApiKey, Background),
208    (GetSupermavenApiKeyResponse, Background),
209    (GetTypeDefinition, Background),
210    (GetTypeDefinitionResponse, Background),
211    (GetImplementation, Background),
212    (GetImplementationResponse, Background),
213    (GetUsers, Foreground),
214    (Hello, Foreground),
215    (IncomingCall, Foreground),
216    (InlayHints, Background),
217    (InlayHintsResponse, Background),
218    (InviteChannelMember, Foreground),
219    (JoinChannel, Foreground),
220    (JoinChannelBuffer, Foreground),
221    (JoinChannelBufferResponse, Foreground),
222    (JoinChannelChat, Foreground),
223    (JoinChannelChatResponse, Foreground),
224    (JoinProject, Foreground),
225    (JoinHostedProject, Foreground),
226    (JoinProjectResponse, Foreground),
227    (JoinRoom, Foreground),
228    (JoinRoomResponse, Foreground),
229    (LanguageModelResponse, Background),
230    (LeaveChannelBuffer, Background),
231    (LeaveChannelChat, Foreground),
232    (LeaveProject, Foreground),
233    (LeaveRoom, Foreground),
234    (MarkNotificationRead, Foreground),
235    (MoveChannel, Foreground),
236    (OnTypeFormatting, Background),
237    (OnTypeFormattingResponse, Background),
238    (OpenBufferById, Background),
239    (OpenBufferByPath, Background),
240    (OpenBufferForSymbol, Background),
241    (OpenBufferForSymbolResponse, Background),
242    (OpenBufferResponse, Background),
243    (PerformRename, Background),
244    (PerformRenameResponse, Background),
245    (Ping, Foreground),
246    (PrepareRename, Background),
247    (PrepareRenameResponse, Background),
248    (ProjectEntryResponse, Foreground),
249    (RefreshInlayHints, Foreground),
250    (RejoinChannelBuffers, Foreground),
251    (RejoinChannelBuffersResponse, Foreground),
252    (RejoinRoom, Foreground),
253    (RejoinRoomResponse, Foreground),
254    (ReloadBuffers, Foreground),
255    (ReloadBuffersResponse, Foreground),
256    (RemoveChannelMember, Foreground),
257    (RemoveChannelMessage, Foreground),
258    (UpdateChannelMessage, Foreground),
259    (RemoveContact, Foreground),
260    (RemoveProjectCollaborator, Foreground),
261    (RenameChannel, Foreground),
262    (RenameChannelResponse, Foreground),
263    (RenameProjectEntry, Foreground),
264    (RequestContact, Foreground),
265    (ResolveCompletionDocumentation, Background),
266    (ResolveCompletionDocumentationResponse, Background),
267    (ResolveInlayHint, Background),
268    (ResolveInlayHintResponse, Background),
269    (RespondToChannelInvite, Foreground),
270    (RespondToContactRequest, Foreground),
271    (RoomUpdated, Foreground),
272    (SaveBuffer, Foreground),
273    (SetChannelMemberRole, Foreground),
274    (SetChannelVisibility, Foreground),
275    (SearchProject, Background),
276    (SearchProjectResponse, Background),
277    (SendChannelMessage, Background),
278    (SendChannelMessageResponse, Background),
279    (ShareProject, Foreground),
280    (ShareProjectResponse, Foreground),
281    (ShowContacts, Foreground),
282    (StartLanguageServer, Foreground),
283    (SubscribeToChannels, Foreground),
284    (SynchronizeBuffers, Foreground),
285    (SynchronizeBuffersResponse, Foreground),
286    (TaskContextForLocation, Background),
287    (TaskContext, Background),
288    (TaskTemplates, Background),
289    (TaskTemplatesResponse, Background),
290    (Test, Foreground),
291    (Unfollow, Foreground),
292    (UnshareProject, Foreground),
293    (UpdateBuffer, Foreground),
294    (UpdateBufferFile, Foreground),
295    (UpdateChannelBuffer, Foreground),
296    (UpdateChannelBufferCollaborators, Foreground),
297    (UpdateChannels, Foreground),
298    (UpdateUserChannels, Foreground),
299    (UpdateContacts, Foreground),
300    (UpdateDiagnosticSummary, Foreground),
301    (UpdateDiffBase, Foreground),
302    (UpdateFollowers, Foreground),
303    (UpdateInviteInfo, Foreground),
304    (UpdateLanguageServer, Foreground),
305    (UpdateParticipantLocation, Foreground),
306    (UpdateProject, Foreground),
307    (UpdateProjectCollaborator, Foreground),
308    (UpdateWorktree, Foreground),
309    (UpdateWorktreeSettings, Foreground),
310    (UsersResponse, Foreground),
311    (LspExtExpandMacro, Background),
312    (LspExtExpandMacroResponse, Background),
313    (SetRoomParticipantRole, Foreground),
314    (BlameBuffer, Foreground),
315    (BlameBufferResponse, Foreground),
316    (CreateDevServerProject, Background),
317    (CreateDevServerProjectResponse, Foreground),
318    (CreateDevServer, Foreground),
319    (CreateDevServerResponse, Foreground),
320    (DevServerInstructions, Foreground),
321    (ShutdownDevServer, Foreground),
322    (ReconnectDevServer, Foreground),
323    (ReconnectDevServerResponse, Foreground),
324    (ShareDevServerProject, Foreground),
325    (JoinDevServerProject, Foreground),
326    (RejoinRemoteProjects, Foreground),
327    (RejoinRemoteProjectsResponse, Foreground),
328    (MultiLspQuery, Background),
329    (MultiLspQueryResponse, Background),
330    (DevServerProjectsUpdate, Foreground),
331    (ValidateDevServerProjectRequest, Background),
332    (DeleteDevServer, Foreground),
333    (DeleteDevServerProject, Foreground),
334    (RegenerateDevServerToken, Foreground),
335    (RegenerateDevServerTokenResponse, Foreground),
336    (RenameDevServer, Foreground),
337    (OpenNewBuffer, Foreground),
338    (RestartLanguageServers, Foreground),
339    (LinkedEditingRange, Background),
340    (LinkedEditingRangeResponse, Background),
341    (AdvertiseContexts, Foreground),
342    (OpenContext, Foreground),
343    (OpenContextResponse, Foreground),
344    (UpdateContext, Foreground),
345    (SynchronizeContexts, Foreground),
346    (SynchronizeContextsResponse, Foreground),
347);
348
349request_messages!(
350    (ApplyCodeAction, ApplyCodeActionResponse),
351    (
352        ApplyCompletionAdditionalEdits,
353        ApplyCompletionAdditionalEditsResponse
354    ),
355    (Call, Ack),
356    (CancelCall, Ack),
357    (CopyProjectEntry, ProjectEntryResponse),
358    (CompleteWithLanguageModel, LanguageModelResponse),
359    (ComputeEmbeddings, ComputeEmbeddingsResponse),
360    (CountTokensWithLanguageModel, CountTokensResponse),
361    (CreateChannel, CreateChannelResponse),
362    (CreateProjectEntry, ProjectEntryResponse),
363    (CreateRoom, CreateRoomResponse),
364    (DeclineCall, Ack),
365    (DeleteChannel, Ack),
366    (DeleteProjectEntry, ProjectEntryResponse),
367    (ExpandProjectEntry, ExpandProjectEntryResponse),
368    (Follow, FollowResponse),
369    (FormatBuffers, FormatBuffersResponse),
370    (FuzzySearchUsers, UsersResponse),
371    (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
372    (GetChannelMembers, GetChannelMembersResponse),
373    (GetChannelMessages, GetChannelMessagesResponse),
374    (GetChannelMessagesById, GetChannelMessagesResponse),
375    (GetCodeActions, GetCodeActionsResponse),
376    (GetCompletions, GetCompletionsResponse),
377    (GetDefinition, GetDefinitionResponse),
378    (GetImplementation, GetImplementationResponse),
379    (GetDocumentHighlights, GetDocumentHighlightsResponse),
380    (GetHover, GetHoverResponse),
381    (GetNotifications, GetNotificationsResponse),
382    (GetPrivateUserInfo, GetPrivateUserInfoResponse),
383    (GetProjectSymbols, GetProjectSymbolsResponse),
384    (GetReferences, GetReferencesResponse),
385    (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
386    (GetTypeDefinition, GetTypeDefinitionResponse),
387    (LinkedEditingRange, LinkedEditingRangeResponse),
388    (GetUsers, UsersResponse),
389    (IncomingCall, Ack),
390    (InlayHints, InlayHintsResponse),
391    (InviteChannelMember, Ack),
392    (JoinChannel, JoinRoomResponse),
393    (JoinChannelBuffer, JoinChannelBufferResponse),
394    (JoinChannelChat, JoinChannelChatResponse),
395    (JoinHostedProject, JoinProjectResponse),
396    (JoinProject, JoinProjectResponse),
397    (JoinRoom, JoinRoomResponse),
398    (LeaveChannelBuffer, Ack),
399    (LeaveRoom, Ack),
400    (MarkNotificationRead, Ack),
401    (MoveChannel, Ack),
402    (OnTypeFormatting, OnTypeFormattingResponse),
403    (OpenBufferById, OpenBufferResponse),
404    (OpenBufferByPath, OpenBufferResponse),
405    (OpenBufferForSymbol, OpenBufferForSymbolResponse),
406    (OpenNewBuffer, OpenBufferResponse),
407    (PerformRename, PerformRenameResponse),
408    (Ping, Ack),
409    (PrepareRename, PrepareRenameResponse),
410    (RefreshInlayHints, Ack),
411    (RejoinChannelBuffers, RejoinChannelBuffersResponse),
412    (RejoinRoom, RejoinRoomResponse),
413    (ReloadBuffers, ReloadBuffersResponse),
414    (RemoveChannelMember, Ack),
415    (RemoveChannelMessage, Ack),
416    (UpdateChannelMessage, Ack),
417    (RemoveContact, Ack),
418    (RenameChannel, RenameChannelResponse),
419    (RenameProjectEntry, ProjectEntryResponse),
420    (RequestContact, Ack),
421    (
422        ResolveCompletionDocumentation,
423        ResolveCompletionDocumentationResponse
424    ),
425    (ResolveInlayHint, ResolveInlayHintResponse),
426    (RespondToChannelInvite, Ack),
427    (RespondToContactRequest, Ack),
428    (SaveBuffer, BufferSaved),
429    (SearchProject, SearchProjectResponse),
430    (SendChannelMessage, SendChannelMessageResponse),
431    (SetChannelMemberRole, Ack),
432    (SetChannelVisibility, Ack),
433    (ShareProject, ShareProjectResponse),
434    (SynchronizeBuffers, SynchronizeBuffersResponse),
435    (TaskContextForLocation, TaskContext),
436    (TaskTemplates, TaskTemplatesResponse),
437    (Test, Test),
438    (UpdateBuffer, Ack),
439    (UpdateParticipantLocation, Ack),
440    (UpdateProject, Ack),
441    (UpdateWorktree, Ack),
442    (LspExtExpandMacro, LspExtExpandMacroResponse),
443    (SetRoomParticipantRole, Ack),
444    (BlameBuffer, BlameBufferResponse),
445    (CreateDevServerProject, CreateDevServerProjectResponse),
446    (CreateDevServer, CreateDevServerResponse),
447    (ShutdownDevServer, Ack),
448    (ShareDevServerProject, ShareProjectResponse),
449    (JoinDevServerProject, JoinProjectResponse),
450    (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
451    (ReconnectDevServer, ReconnectDevServerResponse),
452    (ValidateDevServerProjectRequest, Ack),
453    (MultiLspQuery, MultiLspQueryResponse),
454    (DeleteDevServer, Ack),
455    (DeleteDevServerProject, Ack),
456    (RegenerateDevServerToken, RegenerateDevServerTokenResponse),
457    (RenameDevServer, Ack),
458    (RestartLanguageServers, Ack),
459    (OpenContext, OpenContextResponse),
460    (SynchronizeContexts, SynchronizeContextsResponse),
461);
462
463entity_messages!(
464    {project_id, ShareProject},
465    AddProjectCollaborator,
466    ApplyCodeAction,
467    ApplyCompletionAdditionalEdits,
468    BlameBuffer,
469    BufferReloaded,
470    BufferSaved,
471    CopyProjectEntry,
472    CreateBufferForPeer,
473    CreateProjectEntry,
474    DeleteProjectEntry,
475    ExpandProjectEntry,
476    FormatBuffers,
477    GetCodeActions,
478    GetCompletions,
479    GetDefinition,
480    GetImplementation,
481    GetDocumentHighlights,
482    GetHover,
483    GetProjectSymbols,
484    GetReferences,
485    GetTypeDefinition,
486    InlayHints,
487    JoinProject,
488    LeaveProject,
489    LinkedEditingRange,
490    MultiLspQuery,
491    RestartLanguageServers,
492    OnTypeFormatting,
493    OpenNewBuffer,
494    OpenBufferById,
495    OpenBufferByPath,
496    OpenBufferForSymbol,
497    PerformRename,
498    PrepareRename,
499    RefreshInlayHints,
500    ReloadBuffers,
501    RemoveProjectCollaborator,
502    RenameProjectEntry,
503    ResolveCompletionDocumentation,
504    ResolveInlayHint,
505    SaveBuffer,
506    SearchProject,
507    StartLanguageServer,
508    SynchronizeBuffers,
509    TaskContextForLocation,
510    TaskTemplates,
511    UnshareProject,
512    UpdateBuffer,
513    UpdateBufferFile,
514    UpdateDiagnosticSummary,
515    UpdateDiffBase,
516    UpdateLanguageServer,
517    UpdateProject,
518    UpdateProjectCollaborator,
519    UpdateWorktree,
520    UpdateWorktreeSettings,
521    LspExtExpandMacro,
522    AdvertiseContexts,
523    OpenContext,
524    UpdateContext,
525    SynchronizeContexts,
526);
527
528entity_messages!(
529    {channel_id, Channel},
530    ChannelMessageSent,
531    ChannelMessageUpdate,
532    RemoveChannelMessage,
533    UpdateChannelMessage,
534    UpdateChannelBuffer,
535    UpdateChannelBufferCollaborators,
536);
537
538impl From<Timestamp> for SystemTime {
539    fn from(val: Timestamp) -> Self {
540        UNIX_EPOCH
541            .checked_add(Duration::new(val.seconds, val.nanos))
542            .unwrap()
543    }
544}
545
546impl From<SystemTime> for Timestamp {
547    fn from(time: SystemTime) -> Self {
548        let duration = time.duration_since(UNIX_EPOCH).unwrap();
549        Self {
550            seconds: duration.as_secs(),
551            nanos: duration.subsec_nanos(),
552        }
553    }
554}
555
556impl From<u128> for Nonce {
557    fn from(nonce: u128) -> Self {
558        let upper_half = (nonce >> 64) as u64;
559        let lower_half = nonce as u64;
560        Self {
561            upper_half,
562            lower_half,
563        }
564    }
565}
566
567impl From<Nonce> for u128 {
568    fn from(nonce: Nonce) -> Self {
569        let upper_half = (nonce.upper_half as u128) << 64;
570        let lower_half = nonce.lower_half as u128;
571        upper_half | lower_half
572    }
573}
574
575pub fn split_worktree_update(
576    mut message: UpdateWorktree,
577    max_chunk_size: usize,
578) -> impl Iterator<Item = UpdateWorktree> {
579    let mut done_files = false;
580
581    let mut repository_map = message
582        .updated_repositories
583        .into_iter()
584        .map(|repo| (repo.work_directory_id, repo))
585        .collect::<HashMap<_, _>>();
586
587    iter::from_fn(move || {
588        if done_files {
589            return None;
590        }
591
592        let updated_entries_chunk_size = cmp::min(message.updated_entries.len(), max_chunk_size);
593        let updated_entries: Vec<_> = message
594            .updated_entries
595            .drain(..updated_entries_chunk_size)
596            .collect();
597
598        let removed_entries_chunk_size = cmp::min(message.removed_entries.len(), max_chunk_size);
599        let removed_entries = message
600            .removed_entries
601            .drain(..removed_entries_chunk_size)
602            .collect();
603
604        done_files = message.updated_entries.is_empty() && message.removed_entries.is_empty();
605
606        let mut updated_repositories = Vec::new();
607
608        if !repository_map.is_empty() {
609            for entry in &updated_entries {
610                if let Some(repo) = repository_map.remove(&entry.id) {
611                    updated_repositories.push(repo)
612                }
613            }
614        }
615
616        let removed_repositories = if done_files {
617            mem::take(&mut message.removed_repositories)
618        } else {
619            Default::default()
620        };
621
622        if done_files {
623            updated_repositories.extend(mem::take(&mut repository_map).into_values());
624        }
625
626        Some(UpdateWorktree {
627            project_id: message.project_id,
628            worktree_id: message.worktree_id,
629            root_name: message.root_name.clone(),
630            abs_path: message.abs_path.clone(),
631            updated_entries,
632            removed_entries,
633            scan_id: message.scan_id,
634            is_last_update: done_files && message.is_last_update,
635            updated_repositories,
636            removed_repositories,
637        })
638    })
639}
640
641#[cfg(test)]
642mod tests {
643    use super::*;
644
645    #[test]
646    fn test_converting_peer_id_from_and_to_u64() {
647        let peer_id = PeerId {
648            owner_id: 10,
649            id: 3,
650        };
651        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
652        let peer_id = PeerId {
653            owner_id: u32::MAX,
654            id: 3,
655        };
656        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
657        let peer_id = PeerId {
658            owner_id: 10,
659            id: u32::MAX,
660        };
661        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
662        let peer_id = PeerId {
663            owner_id: u32::MAX,
664            id: u32::MAX,
665        };
666        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
667    }
668}