#nullable enable using System; using System.Collections.Generic; using Cysharp.Threading.Tasks; using ShrinkEventBus; namespace ShrinkNetwork.Integration { public static class ShrinkNetworkEventBusBridgeExtensions { public static ShrinkNetworkService UseEventBusBridge(this ShrinkNetworkService service, ShrinkNetworkEventBusBridgeOptions? options = null) { if (service == null) throw new ArgumentNullException(nameof(service)); options ??= new ShrinkNetworkEventBusBridgeOptions(); if (options.AutoRegisterAttributedMessages) service.AutoRegisterAttributedMessages(); if (options.AutoRegisterStaticHandlers) service.AutoRegisterStaticHandlers(); if (options.DispatchScheduler != null) service.DispatchScheduler = options.DispatchScheduler; ShrinkNetworkEventBusBridge.RegisterService(service, options.SessionFilter); return service; } public static UniTask PublishEventAsync(this ShrinkNetworkSession session, TEvent eventArgs, string? route = null) where TEvent : EventBase, IShrinkNetworkMessage { return ShrinkNetworkEventBusBridge.PublishAsync(session, eventArgs, route); } public static UniTask BroadcastEventAsync(this ShrinkNetworkService service, TEvent eventArgs, Func? sessionFilter = null, string? route = null) where TEvent : EventBase, IShrinkNetworkMessage { if (service == null) throw new ArgumentNullException(nameof(service)); IEnumerable sessions = service.Sessions.Values; if (sessionFilter != null) { var filtered = new List(); foreach (var session in service.Sessions.Values) { if (sessionFilter(session)) filtered.Add(session); } sessions = filtered; } return ShrinkNetworkEventBusBridge.PublishAsync(sessions, eventArgs, route); } public static async UniTask RequestEventAsync( this ShrinkNetworkSession session, TEvent eventArgs, ShrinkRpcCallOptions? options = null) where TEvent : EventBase, IShrinkNetworkRequest { var response = await ShrinkNetworkEventBusBridge.RequestResultAsync(session, eventArgs, options); return ShrinkNetworkEventRequestOutcome.FromResponse(response); } } }