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}