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    (GetSignatureHelp, Background),
208    (GetSignatureHelpResponse, Background),
209    (GetSupermavenApiKey, Background),
210    (GetSupermavenApiKeyResponse, Background),
211    (GetTypeDefinition, Background),
212    (GetTypeDefinitionResponse, Background),
213    (GetImplementation, Background),
214    (GetImplementationResponse, Background),
215    (GetUsers, Foreground),
216    (Hello, Foreground),
217    (IncomingCall, Foreground),
218    (InlayHints, Background),
219    (InlayHintsResponse, Background),
220    (InviteChannelMember, Foreground),
221    (JoinChannel, Foreground),
222    (JoinChannelBuffer, Foreground),
223    (JoinChannelBufferResponse, Foreground),
224    (JoinChannelChat, Foreground),
225    (JoinChannelChatResponse, Foreground),
226    (JoinProject, Foreground),
227    (JoinHostedProject, Foreground),
228    (JoinProjectResponse, Foreground),
229    (JoinRoom, Foreground),
230    (JoinRoomResponse, Foreground),
231    (LanguageModelResponse, Background),
232    (LeaveChannelBuffer, Background),
233    (LeaveChannelChat, Foreground),
234    (LeaveProject, Foreground),
235    (LeaveRoom, Foreground),
236    (MarkNotificationRead, Foreground),
237    (MoveChannel, Foreground),
238    (OnTypeFormatting, Background),
239    (OnTypeFormattingResponse, Background),
240    (OpenBufferById, Background),
241    (OpenBufferByPath, Background),
242    (OpenBufferForSymbol, Background),
243    (OpenBufferForSymbolResponse, Background),
244    (OpenBufferResponse, Background),
245    (PerformRename, Background),
246    (PerformRenameResponse, Background),
247    (Ping, Foreground),
248    (PrepareRename, Background),
249    (PrepareRenameResponse, Background),
250    (ProjectEntryResponse, Foreground),
251    (RefreshInlayHints, Foreground),
252    (RejoinChannelBuffers, Foreground),
253    (RejoinChannelBuffersResponse, Foreground),
254    (RejoinRoom, Foreground),
255    (RejoinRoomResponse, Foreground),
256    (ReloadBuffers, Foreground),
257    (ReloadBuffersResponse, Foreground),
258    (RemoveChannelMember, Foreground),
259    (RemoveChannelMessage, Foreground),
260    (UpdateChannelMessage, Foreground),
261    (RemoveContact, Foreground),
262    (RemoveProjectCollaborator, Foreground),
263    (RenameChannel, Foreground),
264    (RenameChannelResponse, Foreground),
265    (RenameProjectEntry, Foreground),
266    (RequestContact, Foreground),
267    (ResolveCompletionDocumentation, Background),
268    (ResolveCompletionDocumentationResponse, Background),
269    (ResolveInlayHint, Background),
270    (ResolveInlayHintResponse, Background),
271    (RespondToChannelInvite, Foreground),
272    (RespondToContactRequest, Foreground),
273    (RoomUpdated, Foreground),
274    (SaveBuffer, Foreground),
275    (SetChannelMemberRole, Foreground),
276    (SetChannelVisibility, Foreground),
277    (SearchProject, Background),
278    (SearchProjectResponse, Background),
279    (SendChannelMessage, Background),
280    (SendChannelMessageResponse, Background),
281    (ShareProject, Foreground),
282    (ShareProjectResponse, Foreground),
283    (ShowContacts, Foreground),
284    (StartLanguageServer, Foreground),
285    (SubscribeToChannels, Foreground),
286    (SynchronizeBuffers, Foreground),
287    (SynchronizeBuffersResponse, Foreground),
288    (TaskContextForLocation, Background),
289    (TaskContext, Background),
290    (TaskTemplates, Background),
291    (TaskTemplatesResponse, Background),
292    (Test, Foreground),
293    (Unfollow, Foreground),
294    (UnshareProject, Foreground),
295    (UpdateBuffer, Foreground),
296    (UpdateBufferFile, Foreground),
297    (UpdateChannelBuffer, Foreground),
298    (UpdateChannelBufferCollaborators, Foreground),
299    (UpdateChannels, Foreground),
300    (UpdateUserChannels, Foreground),
301    (UpdateContacts, Foreground),
302    (UpdateDiagnosticSummary, Foreground),
303    (UpdateDiffBase, Foreground),
304    (UpdateFollowers, Foreground),
305    (UpdateInviteInfo, Foreground),
306    (UpdateLanguageServer, Foreground),
307    (UpdateParticipantLocation, Foreground),
308    (UpdateProject, Foreground),
309    (UpdateProjectCollaborator, Foreground),
310    (UpdateWorktree, Foreground),
311    (UpdateWorktreeSettings, Foreground),
312    (UsersResponse, Foreground),
313    (LspExtExpandMacro, Background),
314    (LspExtExpandMacroResponse, Background),
315    (SetRoomParticipantRole, Foreground),
316    (BlameBuffer, Foreground),
317    (BlameBufferResponse, Foreground),
318    (CreateDevServerProject, Background),
319    (CreateDevServerProjectResponse, Foreground),
320    (CreateDevServer, Foreground),
321    (CreateDevServerResponse, Foreground),
322    (DevServerInstructions, Foreground),
323    (ShutdownDevServer, Foreground),
324    (ReconnectDevServer, Foreground),
325    (ReconnectDevServerResponse, Foreground),
326    (ShareDevServerProject, Foreground),
327    (JoinDevServerProject, Foreground),
328    (RejoinRemoteProjects, Foreground),
329    (RejoinRemoteProjectsResponse, Foreground),
330    (MultiLspQuery, Background),
331    (MultiLspQueryResponse, Background),
332    (DevServerProjectsUpdate, Foreground),
333    (ValidateDevServerProjectRequest, Background),
334    (DeleteDevServer, Foreground),
335    (DeleteDevServerProject, Foreground),
336    (RegenerateDevServerToken, Foreground),
337    (RegenerateDevServerTokenResponse, Foreground),
338    (RenameDevServer, Foreground),
339    (OpenNewBuffer, Foreground),
340    (RestartLanguageServers, Foreground),
341    (LinkedEditingRange, Background),
342    (LinkedEditingRangeResponse, Background),
343    (AdvertiseContexts, Foreground),
344    (OpenContext, Foreground),
345    (OpenContextResponse, Foreground),
346    (UpdateContext, Foreground),
347    (SynchronizeContexts, Foreground),
348    (SynchronizeContextsResponse, Foreground),
349);
350
351request_messages!(
352    (ApplyCodeAction, ApplyCodeActionResponse),
353    (
354        ApplyCompletionAdditionalEdits,
355        ApplyCompletionAdditionalEditsResponse
356    ),
357    (Call, Ack),
358    (CancelCall, Ack),
359    (CopyProjectEntry, ProjectEntryResponse),
360    (CompleteWithLanguageModel, LanguageModelResponse),
361    (ComputeEmbeddings, ComputeEmbeddingsResponse),
362    (CountTokensWithLanguageModel, CountTokensResponse),
363    (CreateChannel, CreateChannelResponse),
364    (CreateProjectEntry, ProjectEntryResponse),
365    (CreateRoom, CreateRoomResponse),
366    (DeclineCall, Ack),
367    (DeleteChannel, Ack),
368    (DeleteProjectEntry, ProjectEntryResponse),
369    (ExpandProjectEntry, ExpandProjectEntryResponse),
370    (Follow, FollowResponse),
371    (FormatBuffers, FormatBuffersResponse),
372    (FuzzySearchUsers, UsersResponse),
373    (GetCachedEmbeddings, GetCachedEmbeddingsResponse),
374    (GetChannelMembers, GetChannelMembersResponse),
375    (GetChannelMessages, GetChannelMessagesResponse),
376    (GetChannelMessagesById, GetChannelMessagesResponse),
377    (GetCodeActions, GetCodeActionsResponse),
378    (GetCompletions, GetCompletionsResponse),
379    (GetDefinition, GetDefinitionResponse),
380    (GetImplementation, GetImplementationResponse),
381    (GetDocumentHighlights, GetDocumentHighlightsResponse),
382    (GetHover, GetHoverResponse),
383    (GetNotifications, GetNotificationsResponse),
384    (GetPrivateUserInfo, GetPrivateUserInfoResponse),
385    (GetProjectSymbols, GetProjectSymbolsResponse),
386    (GetReferences, GetReferencesResponse),
387    (GetSignatureHelp, GetSignatureHelpResponse),
388    (GetSupermavenApiKey, GetSupermavenApiKeyResponse),
389    (GetTypeDefinition, GetTypeDefinitionResponse),
390    (LinkedEditingRange, LinkedEditingRangeResponse),
391    (GetUsers, UsersResponse),
392    (IncomingCall, Ack),
393    (InlayHints, InlayHintsResponse),
394    (InviteChannelMember, Ack),
395    (JoinChannel, JoinRoomResponse),
396    (JoinChannelBuffer, JoinChannelBufferResponse),
397    (JoinChannelChat, JoinChannelChatResponse),
398    (JoinHostedProject, JoinProjectResponse),
399    (JoinProject, JoinProjectResponse),
400    (JoinRoom, JoinRoomResponse),
401    (LeaveChannelBuffer, Ack),
402    (LeaveRoom, Ack),
403    (MarkNotificationRead, Ack),
404    (MoveChannel, Ack),
405    (OnTypeFormatting, OnTypeFormattingResponse),
406    (OpenBufferById, OpenBufferResponse),
407    (OpenBufferByPath, OpenBufferResponse),
408    (OpenBufferForSymbol, OpenBufferForSymbolResponse),
409    (OpenNewBuffer, OpenBufferResponse),
410    (PerformRename, PerformRenameResponse),
411    (Ping, Ack),
412    (PrepareRename, PrepareRenameResponse),
413    (RefreshInlayHints, Ack),
414    (RejoinChannelBuffers, RejoinChannelBuffersResponse),
415    (RejoinRoom, RejoinRoomResponse),
416    (ReloadBuffers, ReloadBuffersResponse),
417    (RemoveChannelMember, Ack),
418    (RemoveChannelMessage, Ack),
419    (UpdateChannelMessage, Ack),
420    (RemoveContact, Ack),
421    (RenameChannel, RenameChannelResponse),
422    (RenameProjectEntry, ProjectEntryResponse),
423    (RequestContact, Ack),
424    (
425        ResolveCompletionDocumentation,
426        ResolveCompletionDocumentationResponse
427    ),
428    (ResolveInlayHint, ResolveInlayHintResponse),
429    (RespondToChannelInvite, Ack),
430    (RespondToContactRequest, Ack),
431    (SaveBuffer, BufferSaved),
432    (SearchProject, SearchProjectResponse),
433    (SendChannelMessage, SendChannelMessageResponse),
434    (SetChannelMemberRole, Ack),
435    (SetChannelVisibility, Ack),
436    (ShareProject, ShareProjectResponse),
437    (SynchronizeBuffers, SynchronizeBuffersResponse),
438    (TaskContextForLocation, TaskContext),
439    (TaskTemplates, TaskTemplatesResponse),
440    (Test, Test),
441    (UpdateBuffer, Ack),
442    (UpdateParticipantLocation, Ack),
443    (UpdateProject, Ack),
444    (UpdateWorktree, Ack),
445    (LspExtExpandMacro, LspExtExpandMacroResponse),
446    (SetRoomParticipantRole, Ack),
447    (BlameBuffer, BlameBufferResponse),
448    (CreateDevServerProject, CreateDevServerProjectResponse),
449    (CreateDevServer, CreateDevServerResponse),
450    (ShutdownDevServer, Ack),
451    (ShareDevServerProject, ShareProjectResponse),
452    (JoinDevServerProject, JoinProjectResponse),
453    (RejoinRemoteProjects, RejoinRemoteProjectsResponse),
454    (ReconnectDevServer, ReconnectDevServerResponse),
455    (ValidateDevServerProjectRequest, Ack),
456    (MultiLspQuery, MultiLspQueryResponse),
457    (DeleteDevServer, Ack),
458    (DeleteDevServerProject, Ack),
459    (RegenerateDevServerToken, RegenerateDevServerTokenResponse),
460    (RenameDevServer, Ack),
461    (RestartLanguageServers, Ack),
462    (OpenContext, OpenContextResponse),
463    (SynchronizeContexts, SynchronizeContextsResponse),
464);
465
466entity_messages!(
467    {project_id, ShareProject},
468    AddProjectCollaborator,
469    ApplyCodeAction,
470    ApplyCompletionAdditionalEdits,
471    BlameBuffer,
472    BufferReloaded,
473    BufferSaved,
474    CopyProjectEntry,
475    CreateBufferForPeer,
476    CreateProjectEntry,
477    DeleteProjectEntry,
478    ExpandProjectEntry,
479    FormatBuffers,
480    GetCodeActions,
481    GetCompletions,
482    GetDefinition,
483    GetImplementation,
484    GetDocumentHighlights,
485    GetHover,
486    GetProjectSymbols,
487    GetReferences,
488    GetSignatureHelp,
489    GetTypeDefinition,
490    InlayHints,
491    JoinProject,
492    LeaveProject,
493    LinkedEditingRange,
494    MultiLspQuery,
495    RestartLanguageServers,
496    OnTypeFormatting,
497    OpenNewBuffer,
498    OpenBufferById,
499    OpenBufferByPath,
500    OpenBufferForSymbol,
501    PerformRename,
502    PrepareRename,
503    RefreshInlayHints,
504    ReloadBuffers,
505    RemoveProjectCollaborator,
506    RenameProjectEntry,
507    ResolveCompletionDocumentation,
508    ResolveInlayHint,
509    SaveBuffer,
510    SearchProject,
511    StartLanguageServer,
512    SynchronizeBuffers,
513    TaskContextForLocation,
514    TaskTemplates,
515    UnshareProject,
516    UpdateBuffer,
517    UpdateBufferFile,
518    UpdateDiagnosticSummary,
519    UpdateDiffBase,
520    UpdateLanguageServer,
521    UpdateProject,
522    UpdateProjectCollaborator,
523    UpdateWorktree,
524    UpdateWorktreeSettings,
525    LspExtExpandMacro,
526    AdvertiseContexts,
527    OpenContext,
528    UpdateContext,
529    SynchronizeContexts,
530);
531
532entity_messages!(
533    {channel_id, Channel},
534    ChannelMessageSent,
535    ChannelMessageUpdate,
536    RemoveChannelMessage,
537    UpdateChannelMessage,
538    UpdateChannelBuffer,
539    UpdateChannelBufferCollaborators,
540);
541
542impl From<Timestamp> for SystemTime {
543    fn from(val: Timestamp) -> Self {
544        UNIX_EPOCH
545            .checked_add(Duration::new(val.seconds, val.nanos))
546            .unwrap()
547    }
548}
549
550impl From<SystemTime> for Timestamp {
551    fn from(time: SystemTime) -> Self {
552        let duration = time.duration_since(UNIX_EPOCH).unwrap();
553        Self {
554            seconds: duration.as_secs(),
555            nanos: duration.subsec_nanos(),
556        }
557    }
558}
559
560impl From<u128> for Nonce {
561    fn from(nonce: u128) -> Self {
562        let upper_half = (nonce >> 64) as u64;
563        let lower_half = nonce as u64;
564        Self {
565            upper_half,
566            lower_half,
567        }
568    }
569}
570
571impl From<Nonce> for u128 {
572    fn from(nonce: Nonce) -> Self {
573        let upper_half = (nonce.upper_half as u128) << 64;
574        let lower_half = nonce.lower_half as u128;
575        upper_half | lower_half
576    }
577}
578
579pub fn split_worktree_update(
580    mut message: UpdateWorktree,
581    max_chunk_size: usize,
582) -> impl Iterator<Item = UpdateWorktree> {
583    let mut done_files = false;
584
585    let mut repository_map = message
586        .updated_repositories
587        .into_iter()
588        .map(|repo| (repo.work_directory_id, repo))
589        .collect::<HashMap<_, _>>();
590
591    iter::from_fn(move || {
592        if done_files {
593            return None;
594        }
595
596        let updated_entries_chunk_size = cmp::min(message.updated_entries.len(), max_chunk_size);
597        let updated_entries: Vec<_> = message
598            .updated_entries
599            .drain(..updated_entries_chunk_size)
600            .collect();
601
602        let removed_entries_chunk_size = cmp::min(message.removed_entries.len(), max_chunk_size);
603        let removed_entries = message
604            .removed_entries
605            .drain(..removed_entries_chunk_size)
606            .collect();
607
608        done_files = message.updated_entries.is_empty() && message.removed_entries.is_empty();
609
610        let mut updated_repositories = Vec::new();
611
612        if !repository_map.is_empty() {
613            for entry in &updated_entries {
614                if let Some(repo) = repository_map.remove(&entry.id) {
615                    updated_repositories.push(repo)
616                }
617            }
618        }
619
620        let removed_repositories = if done_files {
621            mem::take(&mut message.removed_repositories)
622        } else {
623            Default::default()
624        };
625
626        if done_files {
627            updated_repositories.extend(mem::take(&mut repository_map).into_values());
628        }
629
630        Some(UpdateWorktree {
631            project_id: message.project_id,
632            worktree_id: message.worktree_id,
633            root_name: message.root_name.clone(),
634            abs_path: message.abs_path.clone(),
635            updated_entries,
636            removed_entries,
637            scan_id: message.scan_id,
638            is_last_update: done_files && message.is_last_update,
639            updated_repositories,
640            removed_repositories,
641        })
642    })
643}
644
645#[cfg(test)]
646mod tests {
647    use super::*;
648
649    #[test]
650    fn test_converting_peer_id_from_and_to_u64() {
651        let peer_id = PeerId {
652            owner_id: 10,
653            id: 3,
654        };
655        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
656        let peer_id = PeerId {
657            owner_id: u32::MAX,
658            id: 3,
659        };
660        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
661        let peer_id = PeerId {
662            owner_id: 10,
663            id: u32::MAX,
664        };
665        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
666        let peer_id = PeerId {
667            owner_id: u32::MAX,
668            id: u32::MAX,
669        };
670        assert_eq!(PeerId::from_u64(peer_id.as_u64()), peer_id);
671    }
672}