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}