Skip to content

Commit ff46ae2

Browse files
committed
fix: Safety for duplicate connection callbacks
1 parent c999206 commit ff46ae2

1 file changed

Lines changed: 31 additions & 8 deletions

File tree

Assets/EOSTransport/Runtime/EOSTransport.cs

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -168,10 +168,17 @@ protected override void StartServerInternal()
168168

169169
void StartHostLoopback()
170170
{
171+
if (_isHostLoopback)
172+
return;
173+
171174
_isHostLoopback = true;
172175

173-
_connections.Add(new Connection(LOOPBACK_CONNECTION_ID));
174-
onConnected?.Invoke(new Connection(LOOPBACK_CONNECTION_ID), true);
176+
var connection = new Connection(LOOPBACK_CONNECTION_ID);
177+
if (!_connections.Contains(connection))
178+
{
179+
_connections.Add(connection);
180+
onConnected?.Invoke(connection, true);
181+
}
175182

176183
clientState = ConnectionState.Connected;
177184
onConnected?.Invoke(new Connection(0), false);
@@ -190,26 +197,34 @@ public void Listen(ushort port)
190197

191198
_server = new EOSServer();
192199
_server.Initialize(this);
200+
_server.onDataReceived += OnServerData;
201+
_server.onRemoteConnected += OnRemoteConnected;
202+
_server.onRemoteDisconnected += OnRemoteDisconnected;
193203

194204
if (_server.Listen())
195205
{
196206
listenerState = ConnectionState.Connected;
197207
}
198208
else
199209
{
210+
_server.onDataReceived -= OnServerData;
211+
_server.onRemoteConnected -= OnRemoteConnected;
212+
_server.onRemoteDisconnected -= OnRemoteDisconnected;
213+
_server = null;
214+
_connections.Clear();
200215
listenerState = ConnectionState.Disconnecting;
201216
listenerState = ConnectionState.Disconnected;
202217
}
203-
204-
_server.onDataReceived += OnServerData;
205-
_server.onRemoteConnected += OnRemoteConnected;
206-
_server.onRemoteDisconnected += OnRemoteDisconnected;
207218
}
208219

209220
void OnRemoteConnected(int connectionId)
210221
{
211-
_connections.Add(new Connection(connectionId));
212-
onConnected?.Invoke(new Connection(connectionId), true);
222+
var connection = new Connection(connectionId);
223+
if (_connections.Contains(connection))
224+
return;
225+
226+
_connections.Add(connection);
227+
onConnected?.Invoke(connection, true);
213228
}
214229

215230
void OnRemoteDisconnected(int connectionId, DisconnectReason reason)
@@ -232,6 +247,14 @@ public void StopListening()
232247
listenerState = ConnectionState.Disconnecting;
233248

234249
_server?.Stop();
250+
if (_server != null)
251+
{
252+
_server.onDataReceived -= OnServerData;
253+
_server.onRemoteConnected -= OnRemoteConnected;
254+
_server.onRemoteDisconnected -= OnRemoteDisconnected;
255+
}
256+
257+
_connections.Clear();
235258
listenerState = ConnectionState.Disconnected;
236259
_server = null;
237260
_isHostLoopback = false;

0 commit comments

Comments
 (0)