1
+ using Google . Protobuf ;
2
+ using GameWorkstore . Patterns ;
3
+ using System ;
4
+ using System . Collections ;
5
+ using System . Text ;
6
+ using UnityEngine . Networking ;
7
+
8
+ namespace GameWorkstore . AsyncNetworkEngine
9
+ {
10
+ public enum AsyncNetworkResult
11
+ {
12
+ SUCCESS ,
13
+ E_NETWORK ,
14
+ E_PROCESS ,
15
+ E_DATA_NULL ,
16
+ E_DATA_EMPTY ,
17
+ E_PARSER
18
+ }
19
+
20
+ public enum AsyncNetworkEngineCloud
21
+ {
22
+ GCP = 0 ,
23
+ AWS = 1
24
+ }
25
+
26
+ /// <summary>
27
+ /// Implements a UnityRequest for google protobuf web functions.
28
+ /// </summary>
29
+ /// <typeparam name="TR">Request</typeparam>
30
+ /// <typeparam name="TU">Response</typeparam>
31
+ public static class AsyncNetworkEngine < TR , TU >
32
+ where TR : IMessage < TR > , new ( )
33
+ where TU : IMessage < TU > , new ( )
34
+ {
35
+ public static AsyncNetworkEngineCloud Cloud = AsyncNetworkEngineCloud . AWS ;
36
+ private static readonly MessageParser < TU > _tuParser = new MessageParser < TU > ( ( ) => new TU ( ) ) ;
37
+ private static readonly MessageParser < GenericErrorResponse > _tvParser = new MessageParser < GenericErrorResponse > ( ( ) => new GenericErrorResponse ( ) ) ;
38
+ private static EventService _eventService = null ;
39
+
40
+ public static void Send ( string uri , TR request , Action < AsyncNetworkResult , TU , GenericErrorResponse > result )
41
+ {
42
+ if ( _eventService == null ) _eventService = ServiceProvider . GetService < EventService > ( ) ;
43
+ _eventService . StartCoroutine ( SendRequest ( uri , request , result ) ) ;
44
+ }
45
+
46
+ public static IEnumerator SendRequest ( string uri , TR request , Action < AsyncNetworkResult , TU , GenericErrorResponse > result )
47
+ {
48
+ //Notice: APIGateway automatically converts binary data into base64 strings
49
+ using var rqt = new UnityWebRequest ( uri , "POST" )
50
+ {
51
+ uploadHandler = new UploadHandlerRaw ( request . ToByteArray ( ) ) ,
52
+ downloadHandler = new DownloadHandlerBuffer ( )
53
+ } ;
54
+ yield return rqt . SendWebRequest ( ) ;
55
+
56
+ switch ( rqt . result )
57
+ {
58
+ case UnityWebRequest . Result . ConnectionError :
59
+ Return ( AsyncNetworkResult . E_NETWORK , result ) ;
60
+ break ;
61
+ case UnityWebRequest . Result . ProtocolError :
62
+ while ( ! rqt . downloadHandler . isDone ) yield return null ;
63
+ if ( rqt . downloadHandler . data == null ) { Return ( AsyncNetworkResult . E_DATA_NULL , result ) ; yield break ; }
64
+ if ( rqt . downloadHandler . data . Length <= 0 ) { Return ( AsyncNetworkResult . E_DATA_EMPTY , result ) ; yield break ; }
65
+ try
66
+ {
67
+ if ( Cloud == AsyncNetworkEngineCloud . AWS )
68
+ {
69
+ var data = Base64Url . Decode ( Encoding . ASCII . GetString ( rqt . downloadHandler . data ) ) ;
70
+ var error = _tvParser . ParseFrom ( data ) ;
71
+ Return ( AsyncNetworkResult . E_PROCESS , default , error , result ) ;
72
+ }
73
+ else
74
+ {
75
+ var error = _tvParser . ParseFrom ( rqt . downloadHandler . data ) ;
76
+ Return ( AsyncNetworkResult . E_PROCESS , default , error , result ) ;
77
+ }
78
+ }
79
+ catch
80
+ {
81
+ Return ( AsyncNetworkResult . E_PROCESS , result ) ;
82
+ }
83
+ break ;
84
+ case UnityWebRequest . Result . Success :
85
+ while ( ! rqt . downloadHandler . isDone ) yield return null ;
86
+ if ( rqt . downloadHandler . data == null ) { Return ( AsyncNetworkResult . E_DATA_NULL , result ) ; yield break ; }
87
+ if ( rqt . downloadHandler . data . Length <= 0 ) { Return ( AsyncNetworkResult . E_DATA_EMPTY , result ) ; yield break ; }
88
+ try
89
+ {
90
+ if ( Cloud == AsyncNetworkEngineCloud . AWS )
91
+ {
92
+ var data = Base64Url . Decode ( Encoding . ASCII . GetString ( rqt . downloadHandler . data ) ) ;
93
+ var packet = _tuParser . ParseFrom ( data ) ;
94
+ Return ( AsyncNetworkResult . SUCCESS , packet , default , result ) ;
95
+ }
96
+ else
97
+ {
98
+ var packet = _tuParser . ParseFrom ( rqt . downloadHandler . data ) ;
99
+ Return ( AsyncNetworkResult . SUCCESS , packet , default , result ) ;
100
+ }
101
+ }
102
+ catch
103
+ {
104
+ Return ( AsyncNetworkResult . E_PARSER , result ) ;
105
+ }
106
+ break ;
107
+ }
108
+ }
109
+
110
+ private static void Return ( AsyncNetworkResult result , Action < AsyncNetworkResult , TU , GenericErrorResponse > callback )
111
+ {
112
+ Return ( result , default , default , callback ) ;
113
+ }
114
+
115
+ private static void Return ( AsyncNetworkResult result , TU data , GenericErrorResponse error , Action < AsyncNetworkResult , TU , GenericErrorResponse > callback )
116
+ {
117
+ if ( callback == null ) return ;
118
+ _eventService . QueueAction ( ( ) => callback . Invoke ( result , data , error ) ) ;
119
+ }
120
+ }
121
+ }
0 commit comments