| | 1 | | using Cysharp.Threading.Tasks; |
| | 2 | | using Decentraland.Renderer.KernelServices; |
| | 3 | | using RPC; |
| | 4 | | using rpc_csharp; |
| | 5 | | using System; |
| | 6 | | using UnityEngine; |
| | 7 | |
|
| | 8 | | namespace DCL |
| | 9 | | { |
| | 10 | | public class RPC : IRPC |
| | 11 | | { |
| | 12 | | private ClientEmotesKernelService emotes; |
| | 13 | | private ClientFriendRequestKernelService friendRequests; |
| | 14 | | private ClientFriendsKernelService friends; |
| | 15 | | private ClientSignRequestKernelService signRequest; |
| | 16 | |
|
| 425 | 17 | | private readonly UniTaskCompletionSource modulesLoaded = new (); |
| | 18 | |
|
| | 19 | | private RpcServer<RPCContext> rpcServer; |
| | 20 | |
|
| | 21 | | public ClientEmotesKernelService Emotes() => |
| 1 | 22 | | emotes; |
| | 23 | |
|
| | 24 | | public ClientFriendRequestKernelService FriendRequests() => |
| 0 | 25 | | friendRequests; |
| | 26 | |
|
| | 27 | | public ClientFriendsKernelService Friends() => |
| 0 | 28 | | friends; |
| | 29 | |
|
| | 30 | | public ClientSignRequestKernelService SignRequestKernelService() => |
| 0 | 31 | | signRequest; |
| | 32 | |
|
| | 33 | | public UniTask EnsureRpc() => |
| 0 | 34 | | modulesLoaded.Task; |
| | 35 | |
|
| | 36 | | private async UniTaskVoid LoadRpcModulesAsync(RpcClientPort port) |
| | 37 | | { |
| 0 | 38 | | emotes = await SafeLoadModule(EmotesKernelServiceCodeGen.ServiceName, port, |
| 0 | 39 | | module => new ClientEmotesKernelService(module)); |
| | 40 | |
|
| 0 | 41 | | friendRequests = await SafeLoadModule(FriendRequestKernelServiceCodeGen.ServiceName, port, |
| 0 | 42 | | module => new ClientFriendRequestKernelService(module)); |
| | 43 | |
|
| 0 | 44 | | friends = await SafeLoadModule(FriendsKernelServiceCodeGen.ServiceName, port, |
| 0 | 45 | | module => new ClientFriendsKernelService(module)); |
| | 46 | |
|
| 0 | 47 | | signRequest = await SafeLoadModule(SignRequestKernelServiceCodeGen.ServiceName, port, |
| 0 | 48 | | module => new ClientSignRequestKernelService(module)); |
| | 49 | |
|
| 0 | 50 | | modulesLoaded.TrySetResult(); |
| 0 | 51 | | } |
| | 52 | |
|
| | 53 | | private async UniTask<T> SafeLoadModule<T>(string serviceName, RpcClientPort port, Func<RpcClientModule, T> buil |
| | 54 | | where T: class |
| | 55 | | { |
| | 56 | | try |
| | 57 | | { |
| | 58 | | RpcClientModule module = await port.LoadModule(serviceName); |
| | 59 | | return builderFunction.Invoke(module); |
| | 60 | | } |
| | 61 | | catch (Exception e) |
| | 62 | | { |
| | 63 | | Debug.LogException(e); |
| | 64 | |
|
| | 65 | | // TODO: may be improved by returning a valid instance with dummy behaviour. This way we force to do nul |
| | 66 | | return null; |
| | 67 | | } |
| | 68 | | } |
| | 69 | |
|
| | 70 | | public void Initialize() |
| | 71 | | { |
| 425 | 72 | | var context = DataStore.i.rpc.context; |
| | 73 | |
|
| 425 | 74 | | context.transport.OnLoadModules += port => { LoadRpcModulesAsync(port).Forget(); }; |
| | 75 | |
|
| 425 | 76 | | context.crdt.MessagingControllersManager = Environment.i.messaging.manager; |
| 425 | 77 | | context.crdt.WorldState = Environment.i.world.state; |
| 425 | 78 | | context.crdt.SceneController = Environment.i.world.sceneController; |
| | 79 | |
|
| 425 | 80 | | rpcServer = RPCServerBuilder.BuildDefaultServer(context); |
| 425 | 81 | | } |
| | 82 | |
|
| | 83 | | public void Dispose() |
| | 84 | | { |
| 425 | 85 | | rpcServer.Dispose(); |
| 425 | 86 | | } |
| | 87 | | } |
| | 88 | | } |