Implement network manager simulator lifecycle (#53)
All checks were successful
Native code generation / deterministic (push) Successful in 8m55s
Imaging and meshing gate / native (push) Successful in 2m45s
JPEG 2000 feature / linux (push) Successful in 1m41s
Native Rust workspace compile / compile (push) Successful in 1m57s
Skia feature / linux (push) Successful in 31m12s

This commit is contained in:
2026-08-09 14:46:34 +00:00
parent a18b09d928
commit d298b4f4c4
13 changed files with 3840 additions and 588 deletions

View File

@@ -38,6 +38,19 @@ TARGETS = {
# implementations. The generated module keeps catalog markers and re-exports
# the hand-written type so coverage remains deterministic.
NATIVE_TYPES = {
"T:LibreMetaverse.Caps.EventQueueCallback": "crate::network_manager::CapsEventQueueCallback",
"T:LibreMetaverse.CapsEventDictionary": "crate::network_manager::CapsEventDictionary",
"T:LibreMetaverse.DisconnectedEventArgs": "crate::network_manager::DisconnectedEventArgs",
"T:LibreMetaverse.GenericStreamingMessageEventArgs": "crate::network_manager::GenericStreamingMessageEventArgs",
"T:LibreMetaverse.NetworkManager.IncomingPacket": "crate::network_manager::NetworkManagerIncomingPacket",
"T:LibreMetaverse.NetworkManager.OutgoingPacket": "crate::network_manager::NetworkManagerOutgoingPacket",
"T:LibreMetaverse.PacketEventDictionary": "crate::network_manager::PacketEventDictionary",
"T:LibreMetaverse.PacketReceivedEventArgs": "crate::network_manager::PacketReceivedEventArgs",
"T:LibreMetaverse.PacketSentEventArgs": "crate::network_manager::PacketSentEventArgs",
"T:LibreMetaverse.SimChangedEventArgs": "crate::network_manager::SimChangedEventArgs",
"T:LibreMetaverse.SimConnectedEventArgs": "crate::network_manager::SimConnectedEventArgs",
"T:LibreMetaverse.SimConnectingEventArgs": "crate::network_manager::SimConnectingEventArgs",
"T:LibreMetaverse.SimDisconnectedEventArgs": "crate::network_manager::SimDisconnectedEventArgs",
"T:LibreMetaverse.ArchetypeParam": "crate::genepool_catalog::ArchetypeParam",
"T:LibreMetaverse.AttentionData": "crate::attention_catalog::AttentionData",
"T:LibreMetaverse.AttentionSet": "crate::attention_catalog::AttentionSet",
@@ -132,7 +145,9 @@ NATIVE_TYPES = {
# hand-written, while its fixed public methods remain generator-audited.
NATIVE_DECLARATIONS = {
"T:LibreMetaverse.GridClient": "crate::client_core::GridClient",
"T:LibreMetaverse.NetworkManager": "crate::network_manager::NetworkManager",
"T:LibreMetaverse.Settings": "crate::client_core::Settings",
"T:LibreMetaverse.Simulator": "crate::network_manager::Simulator",
"T:LibreMetaverse.StructuredData.OSDParser": "crate::model::OSDParser",
}
@@ -163,6 +178,122 @@ NATIVE_MEMBER_BODIES = {
"self.shutdown().map_err(Into::into)",
"M:LibreMetaverse.GridClient.ToString":
"String::new()",
"E:LibreMetaverse.NetworkManager.Disconnected":
"self.native_subscribe_disconnected(handler)",
"E:LibreMetaverse.NetworkManager.GenericStreamingMessage":
"self.native_subscribe_generic_streaming_message(handler)",
"E:LibreMetaverse.NetworkManager.PacketSent":
"self.native_subscribe_packet_sent(handler)",
"E:LibreMetaverse.NetworkManager.SimChanged":
"self.native_subscribe_sim_changed(handler)",
"E:LibreMetaverse.NetworkManager.SimConnected":
"self.native_subscribe_sim_connected(handler)",
"E:LibreMetaverse.NetworkManager.SimConnecting":
"self.native_subscribe_sim_connecting(handler)",
"E:LibreMetaverse.NetworkManager.SimDisconnected":
"self.native_subscribe_sim_disconnected(handler)",
"M:LibreMetaverse.NetworkManager.#ctor(LibreMetaverse.GridClient)":
"crate::network_manager::NetworkManager::native_new(client)",
"M:LibreMetaverse.NetworkManager.Connect(System.Net.IPAddress,System.UInt16,System.UInt64,System.Boolean,System.Uri)":
"self.native_connect(std::net::SocketAddr::new(ip, port), handle, set_default, seedcaps, crate::network_manager::Simulator::DEFAULT_REGION_SIZE_X, crate::network_manager::Simulator::DEFAULT_REGION_SIZE_Y)",
"M:LibreMetaverse.NetworkManager.Connect(System.Net.IPAddress,System.UInt16,System.UInt64,System.Boolean,System.Uri,System.UInt32,System.UInt32)":
"self.native_connect(std::net::SocketAddr::new(ip, port), handle, set_default, seedcaps, size_x, size_y)",
"M:LibreMetaverse.NetworkManager.Connect(System.Net.IPEndPoint,System.UInt64,System.Boolean,System.Uri)":
"self.native_connect(end_point, handle, set_default, seedcaps, crate::network_manager::Simulator::DEFAULT_REGION_SIZE_X, crate::network_manager::Simulator::DEFAULT_REGION_SIZE_Y)",
"M:LibreMetaverse.NetworkManager.Connect(System.Net.IPEndPoint,System.UInt64,System.Boolean,System.Uri,System.UInt32,System.UInt32)":
"self.native_connect(end_point, handle, set_default, seedcaps, size_x, size_y)",
"M:LibreMetaverse.NetworkManager.ConnectAsync(System.Net.IPAddress,System.UInt16,System.UInt64,System.Boolean,System.Uri)":
"self.native_connect_async(std::net::SocketAddr::new(ip, port), handle, set_default, seedcaps, crate::network_manager::Simulator::DEFAULT_REGION_SIZE_X, crate::network_manager::Simulator::DEFAULT_REGION_SIZE_Y).await",
"M:LibreMetaverse.NetworkManager.ConnectAsync(System.Net.IPEndPoint,System.UInt64,System.Boolean,System.Uri,System.UInt32,System.UInt32)":
"self.native_connect_async(end_point, handle, set_default, seedcaps, size_x, size_y).await",
"M:LibreMetaverse.NetworkManager.DisconnectSim(LibreMetaverse.Simulator,System.Boolean)":
"self.native_disconnect_sim(simulator, send_close_circuit)",
"M:LibreMetaverse.NetworkManager.EnqueueIncoming(LibreMetaverse.NetworkManager.IncomingPacket)":
"self.native_enqueue_incoming(packet)",
"M:LibreMetaverse.NetworkManager.EnqueueOutgoing(LibreMetaverse.NetworkManager.OutgoingPacket)":
"self.native_enqueue_outgoing(packet)",
"M:LibreMetaverse.NetworkManager.FindSimulator(System.Net.IPEndPoint)":
"Ok(self.native_find_endpoint(end_point))",
"M:LibreMetaverse.NetworkManager.FindSimulator(System.UInt64)":
"Ok(self.native_find_handle(handle))",
"M:LibreMetaverse.NetworkManager.RegisterCallback(LibreMetaverse.Packets.PacketType,System.EventHandler{LibreMetaverse.PacketReceivedEventArgs})":
"self.native_register_callback(type_, callback, true)",
"M:LibreMetaverse.NetworkManager.RegisterCallback(LibreMetaverse.Packets.PacketType,System.EventHandler{LibreMetaverse.PacketReceivedEventArgs},System.Boolean)":
"self.native_register_callback(type_, callback, is_async)",
"M:LibreMetaverse.NetworkManager.RegisterEventCallback(System.String,LibreMetaverse.Caps.EventQueueCallback)":
"self.native_register_caps(caps_event, callback)",
"M:LibreMetaverse.NetworkManager.SendPacket(LibreMetaverse.Packets.Packet)":
"self.native_send_packet(packet, None)",
"M:LibreMetaverse.NetworkManager.SendPacket(LibreMetaverse.Packets.Packet,LibreMetaverse.Simulator)":
"self.native_send_packet(packet, simulator)",
"M:LibreMetaverse.NetworkManager.Shutdown(LibreMetaverse.NetworkManager.DisconnectType)":
"self.native_shutdown(type_, format!(\"{type_:?}\"))",
"M:LibreMetaverse.NetworkManager.Shutdown(LibreMetaverse.NetworkManager.DisconnectType,System.String)":
"self.native_shutdown(type_, message)",
"M:LibreMetaverse.NetworkManager.ShutdownAsync(LibreMetaverse.NetworkManager.DisconnectType,System.String)":
"self.native_shutdown_async(type_, message).await",
"M:LibreMetaverse.NetworkManager.UnregisterCallback(LibreMetaverse.Packets.PacketType,System.EventHandler{LibreMetaverse.PacketReceivedEventArgs})":
"self.native_unregister_callback(type_, callback)",
"M:LibreMetaverse.NetworkManager.UnregisterEventCallback(System.String,LibreMetaverse.Caps.EventQueueCallback)":
"self.native_unregister_caps(caps_event, callback)",
"P:LibreMetaverse.NetworkManager.CircuitCode":
"self.native_circuit_code()",
"P:LibreMetaverse.NetworkManager.CircuitCode#set":
"self.native_set_circuit_code(value)",
"P:LibreMetaverse.NetworkManager.Connected":
"self.native_connected()",
"P:LibreMetaverse.NetworkManager.Connected#set":
"self.native_set_connected(value)",
"P:LibreMetaverse.NetworkManager.CurrentSim":
"self.native_current_sim()",
"P:LibreMetaverse.NetworkManager.CurrentSim#set":
"self.native_set_current_sim(value)",
"P:LibreMetaverse.NetworkManager.InboxCount":
"self.native_inbox_count()",
"P:LibreMetaverse.NetworkManager.OutboxCount":
"self.native_outbox_count()",
"M:LibreMetaverse.Simulator.#ctor(LibreMetaverse.GridClient,System.Net.IPEndPoint,System.UInt64,System.UInt32,System.UInt32)":
"crate::network_manager::Simulator::native_new(client, address, handle, size_x, size_y)",
"M:LibreMetaverse.Simulator.Connect(System.Boolean)":
"self.native_connect(move_to_sim)",
"M:LibreMetaverse.Simulator.ConnectAsync(System.Boolean)":
"self.native_connect_async(move_to_sim).await",
"M:LibreMetaverse.Simulator.Disconnect(System.Boolean)":
"self.native_disconnect(send_close_circuit)",
"M:LibreMetaverse.Simulator.Dispose":
"self.native_dispose()",
"M:LibreMetaverse.Simulator.Equals(System.Object)":
"self.native_equals(obj)",
"M:LibreMetaverse.Simulator.GetHashCode":
"self.native_hash_code()",
"M:LibreMetaverse.Simulator.Pause":
"self.native_pause()",
"M:LibreMetaverse.Simulator.Resume":
"self.native_resume()",
"M:LibreMetaverse.Simulator.SendPacket(LibreMetaverse.Packets.Packet)":
"self.native_send_packet(packet)",
"M:LibreMetaverse.Simulator.SendPacketData(System.Byte[],System.Int32,LibreMetaverse.Packets.PacketType,System.Boolean)":
"self.native_send_packet_data(data, data_length, type_, do_zerocode)",
"M:LibreMetaverse.Simulator.SendPing":
"self.native_send_ping()",
"M:LibreMetaverse.Simulator.SetSeedCaps(System.Uri,System.Boolean)":
"self.native_set_seed_caps(seedcaps, changed_sim)",
"M:LibreMetaverse.Simulator.ToString":
"self.native_to_string()",
"M:LibreMetaverse.Simulator.UseCircuitCode(System.Boolean)":
"self.native_use_circuit_code(wait_for_ack)",
"M:LibreMetaverse.Simulator.UseCircuitCodeAsync(System.Boolean)":
"self.native_use_circuit_code_async(wait_for_ack).await",
"M:LibreMetaverse.Simulator.op_Equality(LibreMetaverse.Simulator,LibreMetaverse.Simulator)":
"lhs == rhs",
"M:LibreMetaverse.Simulator.op_Inequality(LibreMetaverse.Simulator,LibreMetaverse.Simulator)":
"lhs != rhs",
"P:LibreMetaverse.Simulator.Connected":
"self.native_is_connected()",
"P:LibreMetaverse.Simulator.HandshakeComplete":
"self.native_handshake_complete()",
"P:LibreMetaverse.Simulator.IPEndPoint":
"self.native_ip_end_point()",
"P:LibreMetaverse.GridClient.Settings":
"&mut self.settings",
"P:LibreMetaverse.GridClient.TimeProvider":
@@ -337,6 +468,11 @@ CLIENT_CORE_NATIVE_OWNERS = (
"WorldSettings",
)
NETWORK_NATIVE_OWNERS = (
"NetworkManager",
"Simulator",
)
NATIVE_OWNER_BOUNDS = {
"T:LibreMetaverse.CacheDictionary`2": {
"TKey": "TKey: Clone + PartialEq",
@@ -477,6 +613,7 @@ NATIVE_MESSAGE_CODEC_TYPES = {
OPEN_ENUM_IDS = {"T:LibreMetaverse.BakeType", "T:LibreMetaverse.HoleType"}
TRAIT_SUPERTRAITS = {
"T:LibreMetaverse.IBakingTextureProvider": "std::any::Any",
"T:LibreMetaverse.Interfaces.IMessage": "std::any::Any",
"T:LibreMetaverse.Appearance.ICurrentOutfitPolicy": "Send + Sync",
}
CORE_NAMESPACES = (
@@ -1053,11 +1190,12 @@ def render_body(signature: str, member_id: str, error_model: str, asyncness: str
if trait:
signature = signature.removeprefix("pub ")
if body := native_member_body(member_id):
marker = (
" /* native client-core implementation */"
if any(f"LibreMetaverse.{owner}." in member_id for owner in CLIENT_CORE_NATIVE_OWNERS)
else ""
)
if any(f"LibreMetaverse.{owner}." in member_id for owner in CLIENT_CORE_NATIVE_OWNERS):
marker = " /* native client-core implementation */"
elif any(f"LibreMetaverse.{owner}." in member_id for owner in NETWORK_NATIVE_OWNERS):
marker = " /* native network implementation */"
else:
marker = ""
return f" {signature} {{{marker} {body} }}"
failure = (
f"libremetaverse_types::not_implemented({json.dumps(member_id)})"

View File

@@ -971,7 +971,10 @@ def validate_generated_shims() -> None:
if default_types - {"UUID"}:
raise ValueError(f"generated shim derives a plausible Default: {path.relative_to(ROOT)}")
for body in function_bodies(text):
if "native client-core implementation" in body:
if (
"native client-core implementation" in body
or "native network implementation" in body
):
continue
if FAKE_BODY.search(body):
raise ValueError(f"generated shim returns a plausible fallback: {path.relative_to(ROOT)}")