Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

fix subscribe event engine to unlock CI #204

Closed
wants to merge 40 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
40 commits
Select commit Hold shift + click to select a range
f94a136
connect listeners to event engine
Xavrax Feb 5, 2024
d92b721
locally builds
Xavrax Feb 5, 2024
e27510d
wtf?
Xavrax Feb 5, 2024
2f53912
will it give me anything?
Xavrax Feb 6, 2024
ec602c7
Yaaaay! debuging on CI
Xavrax Feb 6, 2024
7f33841
please, let me in
Xavrax Feb 6, 2024
b02aade
please...
Xavrax Feb 6, 2024
57b959a
revert debuging changes
Xavrax Feb 6, 2024
fa57328
check dispatcher
Xavrax Feb 6, 2024
8665277
check subscribe
Xavrax Feb 6, 2024
97f7b31
locally builds.......
Xavrax Feb 6, 2024
00c55e0
ehhh... i don't understand...
Xavrax Feb 6, 2024
2e8d7b6
wink wink
Xavrax Feb 6, 2024
1a9907e
revert logs
Xavrax Feb 6, 2024
d83a6d1
hehe, I'm surprised how stupid i am...
Xavrax Feb 6, 2024
1d67604
okay, it should be better but won't work
Xavrax Feb 6, 2024
b95e064
let's check
Xavrax Feb 6, 2024
1e2dff6
poka kotku co masz w srodku
Xavrax Feb 6, 2024
756f348
hmmm?
Xavrax Feb 6, 2024
731b5eb
default zeros?
Xavrax Feb 6, 2024
5fa1e01
ehhhh, ma bad
Xavrax Feb 6, 2024
99e785c
how many exceptions...
Xavrax Feb 6, 2024
8d7af4b
why so many unexpected errors....
Xavrax Feb 6, 2024
a2339d6
wrong comment
Xavrax Feb 6, 2024
ec72d4e
cleanup?
Xavrax Feb 6, 2024
ebb6b94
something is wronge here
Xavrax Feb 6, 2024
a011729
this language is a joke
Xavrax Feb 6, 2024
9f8eaa0
maybe u_all not working
Xavrax Feb 6, 2024
6f35e8e
fire&forget
Xavrax Feb 6, 2024
5e2863a
backward compatibility
Xavrax Feb 6, 2024
52bba7c
I'm too exhausted at this point
Xavrax Feb 6, 2024
5acffff
IPubNubUnitTest...
Xavrax Feb 6, 2024
db954a3
stackoverflow - I trust u
Xavrax Feb 6, 2024
ab65182
add explanatation about TODO
Xavrax Feb 6, 2024
8fa589a
I have nothing to lose
Xavrax Feb 6, 2024
a1408a8
what will it do?
Xavrax Feb 6, 2024
7faeae3
ok?
Xavrax Feb 6, 2024
621460b
wut?
Xavrax Feb 9, 2024
62d02b1
remove ee temporary
Xavrax Feb 12, 2024
ed1f8f5
ofc leftover
Xavrax Feb 12, 2024
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
117 changes: 60 additions & 57 deletions src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs
Original file line number Diff line number Diff line change
Expand Up @@ -54,64 +54,64 @@
var eventEmitter = new EventEmitter();
eventEmitter.RegisterJsonListener(JsonCallback);

var handshakeEffectHandler = new HandshakeEffectHandler(eventEmitter);
handshakeEffectHandler.LogCallback = LogCallback;
handshakeEffectHandler.HandshakeRequested += HandshakeEffect_HandshakeRequested;
handshakeEffectHandler.CancelHandshakeRequested += HandshakeEffect_CancelHandshakeRequested;
handshakeEffectHandler.AnnounceStatus = Announce;

var handshakeReconnectEffectHandler = new HandshakeReconnectEffectHandler(eventEmitter);
handshakeReconnectEffectHandler.ReconnectionPolicy = config.ReconnectionPolicy;
handshakeReconnectEffectHandler.MaxRetries = config.ConnectionMaxRetries;
handshakeReconnectEffectHandler.LogCallback = LogCallback;
handshakeReconnectEffectHandler.HandshakeReconnectRequested += HandshakeReconnectEffect_HandshakeRequested;
handshakeReconnectEffectHandler.CancelHandshakeReconnectRequested += HandshakeReconnectEffect_CancelHandshakeRequested;
handshakeReconnectEffectHandler.AnnounceStatus = Announce;
//var handshakeEffectHandler = new HandshakeEffectHandler(eventEmitter);
//handshakeEffectHandler.LogCallback = LogCallback;
//handshakeEffectHandler.HandshakeRequested += HandshakeEffect_HandshakeRequested;
//handshakeEffectHandler.CancelHandshakeRequested += HandshakeEffect_CancelHandshakeRequested;
//handshakeEffectHandler.AnnounceStatus = Announce;

//var handshakeReconnectEffectHandler = new HandshakeReconnectEffectHandler(eventEmitter);
//handshakeReconnectEffectHandler.ReconnectionPolicy = config.ReconnectionPolicy;
//handshakeReconnectEffectHandler.MaxRetries = config.ConnectionMaxRetries;
//handshakeReconnectEffectHandler.LogCallback = LogCallback;
//handshakeReconnectEffectHandler.HandshakeReconnectRequested += HandshakeReconnectEffect_HandshakeRequested;
//handshakeReconnectEffectHandler.CancelHandshakeReconnectRequested += HandshakeReconnectEffect_CancelHandshakeRequested;
//handshakeReconnectEffectHandler.AnnounceStatus = Announce;

var handshakeFailedEffectHandler = new HandshakeFailedEffectHandler(eventEmitter);
handshakeFailedEffectHandler.LogCallback = LogCallback;

var receivingEffectHandler = new ReceivingEffectHandler<object>(eventEmitter);
receivingEffectHandler.ReconnectionPolicy = config.ReconnectionPolicy;
receivingEffectHandler.LogCallback = LogCallback;
receivingEffectHandler.ReceiveRequested += ReceivingEffect_ReceiveRequested;
receivingEffectHandler.CancelReceiveRequested += ReceivingEffect_CancelReceiveRequested;
receivingEffectHandler.AnnounceStatus = Announce;
receivingEffectHandler.AnnounceMessage = Announce;
receivingEffectHandler.AnnouncePresenceEvent = Announce;

var receiveReconnectEffectHandler = new ReceiveReconnectingEffectHandler<object>(eventEmitter);
receiveReconnectEffectHandler.ReconnectionPolicy = config.ReconnectionPolicy;
receiveReconnectEffectHandler.MaxRetries = config.ConnectionMaxRetries;
receiveReconnectEffectHandler.LogCallback = LogCallback;
receiveReconnectEffectHandler.ReceiveReconnectRequested += ReceiveReconnectEffect_ReceiveRequested;
receiveReconnectEffectHandler.CancelReceiveReconnectRequested += ReceiveReconnectEffect_CancelReceiveRequested;
receiveReconnectEffectHandler.AnnounceStatus = Announce;

var effectDispatcher = new EffectDispatcher();
effectDispatcher.PubnubUnitTest = unit;
effectDispatcher.Register(EventType.Handshake,handshakeEffectHandler);
effectDispatcher.Register(EventType.CancelHandshake,handshakeEffectHandler);
effectDispatcher.Register(EventType.HandshakeSuccess, handshakeEffectHandler);

effectDispatcher.Register(EventType.HandshakeFailure, handshakeFailedEffectHandler);
effectDispatcher.Register(EventType.CancelHandshakeFailure, handshakeFailedEffectHandler);

effectDispatcher.Register(EventType.HandshakeReconnect, handshakeReconnectEffectHandler);
effectDispatcher.Register(EventType.CancelHandshakeReconnect, handshakeReconnectEffectHandler);
effectDispatcher.Register(EventType.HandshakeReconnectSuccess, handshakeReconnectEffectHandler);
effectDispatcher.Register(EventType.HandshakeReconnectGiveUp, handshakeReconnectEffectHandler);

effectDispatcher.Register(EventType.ReceiveMessages, receivingEffectHandler);
effectDispatcher.Register(EventType.CancelReceiveMessages, receivingEffectHandler);
effectDispatcher.Register(EventType.ReceiveSuccess, receivingEffectHandler);

effectDispatcher.Register(EventType.ReceiveReconnect, receiveReconnectEffectHandler);
effectDispatcher.Register(EventType.CancelReceiveReconnect, receiveReconnectEffectHandler);
effectDispatcher.Register(EventType.ReceiveReconnectSuccess, receiveReconnectEffectHandler);
effectDispatcher.Register(EventType.ReceiveReconnectGiveUp, receiveReconnectEffectHandler);

// pnEventEngine = new EventEngine(effectDispatcher, eventEmitter);
//var handshakeFailedEffectHandler = new HandshakeFailedEffectHandler(eventEmitter);
//handshakeFailedEffectHandler.LogCallback = LogCallback;

//var receivingEffectHandler = new ReceivingEffectHandler<object>(eventEmitter);
//receivingEffectHandler.ReconnectionPolicy = config.ReconnectionPolicy;
//receivingEffectHandler.LogCallback = LogCallback;
//receivingEffectHandler.ReceiveRequested += ReceivingEffect_ReceiveRequested;
//receivingEffectHandler.CancelReceiveRequested += ReceivingEffect_CancelReceiveRequested;
//receivingEffectHandler.AnnounceStatus = Announce;
//receivingEffectHandler.AnnounceMessage = Announce;
//receivingEffectHandler.AnnouncePresenceEvent = Announce;

//var receiveReconnectEffectHandler = new ReceiveReconnectingEffectHandler<object>(eventEmitter);
//receiveReconnectEffectHandler.ReconnectionPolicy = config.ReconnectionPolicy;
//receiveReconnectEffectHandler.MaxRetries = config.ConnectionMaxRetries;
//receiveReconnectEffectHandler.LogCallback = LogCallback;
//receiveReconnectEffectHandler.ReceiveReconnectRequested += ReceiveReconnectEffect_ReceiveRequested;
//receiveReconnectEffectHandler.CancelReceiveReconnectRequested += ReceiveReconnectEffect_CancelReceiveRequested;
//receiveReconnectEffectHandler.AnnounceStatus = Announce;

//var effectDispatcher = new EffectDispatcher();
//effectDispatcher.PubnubUnitTest = unit;
//effectDispatcher.Register(EventType.Handshake,handshakeEffectHandler);
//effectDispatcher.Register(EventType.CancelHandshake,handshakeEffectHandler);
//effectDispatcher.Register(EventType.HandshakeSuccess, handshakeEffectHandler);

//effectDispatcher.Register(EventType.HandshakeFailure, handshakeFailedEffectHandler);
//effectDispatcher.Register(EventType.CancelHandshakeFailure, handshakeFailedEffectHandler);

//effectDispatcher.Register(EventType.HandshakeReconnect, handshakeReconnectEffectHandler);
//effectDispatcher.Register(EventType.CancelHandshakeReconnect, handshakeReconnectEffectHandler);
//effectDispatcher.Register(EventType.HandshakeReconnectSuccess, handshakeReconnectEffectHandler);
//effectDispatcher.Register(EventType.HandshakeReconnectGiveUp, handshakeReconnectEffectHandler);

//effectDispatcher.Register(EventType.ReceiveMessages, receivingEffectHandler);
//effectDispatcher.Register(EventType.CancelReceiveMessages, receivingEffectHandler);
//effectDispatcher.Register(EventType.ReceiveSuccess, receivingEffectHandler);

//effectDispatcher.Register(EventType.ReceiveReconnect, receiveReconnectEffectHandler);
//effectDispatcher.Register(EventType.CancelReceiveReconnect, receiveReconnectEffectHandler);
//effectDispatcher.Register(EventType.ReceiveReconnectSuccess, receiveReconnectEffectHandler);
//effectDispatcher.Register(EventType.ReceiveReconnectGiveUp, receiveReconnectEffectHandler);

// // pnEventEngine = new EventEngine(effectDispatcher, eventEmitter);
// pnEventEngine.PubnubUnitTest = unit;
// pnEventEngine.Setup<T>(config);

Expand Down Expand Up @@ -184,7 +184,7 @@
}
}

protected void ProcessListenerCallback<T>(List<object> result, bool zeroTimeTokenRequest, int messageCount, string[] channels, string[] channelGroups)

Check warning on line 187 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Integration and Unit tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'

Check warning on line 187 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Integration and Unit tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'

Check warning on line 187 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Acceptance tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'
{
bool callbackAvailable = false;
if (result != null && result.Count >= 1 && SubscribeListenerList.Count >= 1)
Expand All @@ -204,7 +204,7 @@
}
}

private void ResponseToConnectCallback<T>(PNOperationType type, string[] channels, string[] channelGroups)

Check warning on line 207 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Integration and Unit tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'

Check warning on line 207 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Acceptance tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'
{
StatusBuilder statusBuilder = new StatusBuilder(config, jsonLibrary);
PNStatus status = statusBuilder.CreateStatusResponse<T>(type, PNStatusCategory.PNConnectedCategory, null, (int)HttpStatusCode.OK, null);
Expand All @@ -221,7 +221,7 @@
}
}

internal void Announce<T>(PNMessageResult<T> message)

Check warning on line 224 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Integration and Unit tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'

Check warning on line 224 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Acceptance tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'
{
List<SubscribeCallback> callbackList = SubscribeListenerList;
for (int listenerIndex = 0; listenerIndex < callbackList.Count; listenerIndex++)
Expand All @@ -230,7 +230,7 @@
}
}

internal void Announce<T>(PNSignalResult<T> message)

Check warning on line 233 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Integration and Unit tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'
{
List<SubscribeCallback> callbackList = SubscribeListenerList;
for (int listenerIndex = 0; listenerIndex < callbackList.Count; listenerIndex++)
Expand Down Expand Up @@ -275,7 +275,7 @@
}
}

private void ResponseToUserCallback<T>(List<object> result, PNOperationType type)

Check warning on line 278 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Integration and Unit tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'
{
IPubnubLog currentLog = null;
try
Expand Down Expand Up @@ -786,6 +786,9 @@
throw new ArgumentException("Either Channel Or Channel Group or Both should be provided.");
}

return;
// TODO: Reimplement it after implementing Presence Event Engine

if (this.subscribeEventEngineFactory.hasEventEngine(instanceId))
{
subscribeEventEngine = subscribeEventEngineFactory.getEventEngine(instanceId);
Expand Down Expand Up @@ -843,7 +846,7 @@
{
PubnubInstance = instance;
}
private void MessageEmitter<T>(Pubnub pubnubInstance, PNMessageResult<T> messageResult)

Check warning on line 849 in src/Api/PubnubApi/EndPoint/PubSub/SubscribeOperation2.cs

View workflow job for this annotation

GitHub Actions / Integration and Unit tests

Type parameter 'T' has the same name as the type parameter from outer type 'SubscribeOperation2<T>'
{
foreach (var listener in SubscribeListenerList) {
listener.Message(pubnubInstance, messageResult);
Expand Down
25 changes: 22 additions & 3 deletions src/Api/PubnubApi/EventEngine/Core/EffectDispatcher.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@

namespace PubnubApi.EventEngine.Core {
public class EffectDispatcher {
private readonly List<Task> runningHandlers = new List<Task>();
// assumes 1 instance of handler - capable of managing itself
private readonly Dictionary<System.Type, IEffectHandler> effectInvocationHandlerMap =
new Dictionary<System.Type, IEffectHandler>();
Expand All @@ -14,10 +15,12 @@ public class EffectDispatcher {
/// Dispatch an invocation i.e. call a registered effect handler.
/// </summary>
public async Task Dispatch(IEffectInvocation invocation) {
runningHandlers.RemoveAll(t => t.IsCompleted || t.IsCanceled || t.IsFaulted);

if (!effectInvocationHandlerMap.ContainsKey(invocation.GetType())) {
throw new ArgumentException($"No handler for {invocation.GetType().Name} found.");
}

OnEffectDispatch?.Invoke(invocation);

if (invocation is IEffectCancelInvocation) {
Expand All @@ -26,7 +29,11 @@ public async Task Dispatch(IEffectInvocation invocation) {
{
var handler = effectInvocationHandlerMap[invocation.GetType()];
if (handler.IsBackground(invocation))
handler.Run(invocation).Start();
#if NET35 || NET40
runningHandlers.Add(handler.Run(invocation));
#else
runningHandlers.Add(Task.Run(() => handler.Run(invocation)));
#endif
else
await handler.Run(invocation);
}
Expand All @@ -44,5 +51,17 @@ public EffectDispatcher Register<TEffectInvocation, TEffectHandler>(TEffectHandl
effectInvocationHandlerMap[typeof(TEffectInvocation)] = handler;
return this;
}

~EffectDispatcher()
{
foreach (var handler in effectInvocationHandlerMap.Values)
{
handler.Cancel().Wait();
}
foreach (var task in runningHandlers)
{
task.Wait();
}
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -21,6 +21,12 @@ public EmitMessagesHandler(Pubnub pubnubInstance,

public async override Task Run(EmitMessagesInvocation invocation)
{
if (invocation.Messages.Messages == null || !invocation.Messages.Messages.Any())
{
// TODO: It shouldn't happen but it does. Investigate why
return;
}

var processedMessages = invocation.Messages.Messages.Select(m => new PNMessageResult<object>()
{
Channel = m.Channel,
Expand All @@ -44,4 +50,4 @@ public override Task Cancel()
throw new NotImplementedException();
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -54,8 +54,8 @@ public override async Task Run(ReceiveMessagesInvocation invocation)
var response = await MakeReceiveMessagesRequest(invocation);
var cursor = new SubscriptionCursor()
{
Region = response.Item1?.Timetoken.Region,
Timetoken = response.Item1?.Timetoken.Timestamp
Region = response.Item1?.Timetoken?.Region ?? 0,
Timetoken = response.Item1?.Timetoken?.Timestamp ?? 0
};

switch (invocation)
Expand All @@ -82,10 +82,11 @@ public override bool IsBackground(ReceiveMessagesInvocation invocation)

private async Task<System.Tuple<ReceivingResponse<string>, PNStatus>> MakeReceiveMessagesRequest(ReceiveMessagesInvocation invocation)
{
// TODO: Why channels or channelGroups are null?
var resp = await manager.ReceiveRequest<string>(
PNOperationType.PNSubscribeOperation,
invocation.Channels.ToArray(),
invocation.ChannelGroups.ToArray(),
invocation.Channels?.ToArray() ?? new string[0],
invocation.ChannelGroups?.ToArray() ?? new string[0],
invocation.Cursor.Timetoken.Value,
invocation.Cursor.Region.Value,
invocation.InitialSubscribeQueryParams,
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -12,21 +12,24 @@ public class SubscribeEventEngine : Engine {
internal SubscribeEventEngine(Pubnub pubnubInstance,
PNConfiguration pubnubConfiguration,
SubscribeManager2 subscribeManager,
Action<Pubnub, PNStatus> statusListener = null,
Action<Pubnub, PNMessageResult<object>> messageListener = null)
Action<Pubnub, PNStatus> statusListener,
Action<Pubnub, PNMessageResult<object>> messageListener)
{
this.subscribeManager = subscribeManager;

// TODO: WHATAFUCK?!
// initialize the handler, pass dependencies
var handshakeHandler = new Effects.HandshakeEffectHandler(subscribeManager, eventQueue);
dispatcher.Register<Invocations.HandshakeInvocation, Effects.HandshakeEffectHandler>(handshakeHandler);
dispatcher.Register<Invocations.HandshakeReconnectInvocation, Effects.HandshakeEffectHandler>(handshakeHandler);
dispatcher.Register<Invocations.CancelHandshakeInvocation, Effects.HandshakeEffectHandler>(handshakeHandler);
dispatcher.Register<Invocations.CancelHandshakeReconnectInvocation, Effects.HandshakeEffectHandler>(handshakeHandler);

var receiveHandler = new Effects.ReceivingEffectHandler(subscribeManager, eventQueue);
dispatcher.Register<Invocations.ReceiveMessagesInvocation, Effects.ReceivingEffectHandler>(receiveHandler);
dispatcher.Register<Invocations.ReceiveReconnectInvocation, Effects.ReceivingEffectHandler>(receiveHandler);
dispatcher.Register<Invocations.CancelReceiveMessagesInvocation, Effects.ReceivingEffectHandler>(receiveHandler);
dispatcher.Register<Invocations.CancelReceiveReconnectInvocation, Effects.ReceivingEffectHandler>(receiveHandler);

var emitMessageHandler = new Effects.EmitMessagesHandler(pubnubInstance, messageListener);
dispatcher.Register<Invocations.EmitMessagesInvocation, Effects.EmitMessagesHandler>(emitMessageHandler);
Expand All @@ -37,4 +40,4 @@ internal SubscribeEventEngine(Pubnub pubnubInstance,
currentState = new UnsubscribedState() { ReconnectionConfiguration = new Context.ReconnectionConfiguration(pubnubConfiguration.ReconnectionPolicy, pubnubConfiguration.ConnectionMaxRetries) };
}
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -26,10 +26,19 @@ internal SubscribeEventEngine initializeEventEngine<T>(string instanceId,
Pubnub pubnubInstance,
PNConfiguration pubnubConfiguration,
SubscribeManager2 subscribeManager,
Action<Pubnub, PNStatus> statusListener = null,
Action<Pubnub, PNMessageResult<T>> messageListener= null)
Action<Pubnub, PNStatus> statusListener,
Action<Pubnub, PNMessageResult<T>> messageListener)
{
var subscribeEventEngine = new SubscribeEventEngine(pubnubInstance, pubnubConfiguration: pubnubConfiguration, subscribeManager);
var subscribeEventEngine = new SubscribeEventEngine(
pubnubInstance,
pubnubConfiguration: pubnubConfiguration,
subscribeManager,
statusListener,
// TODO: I cast it to the object to unlock the CI build. I will investigate this further
// and fix it in the future with the merging of the subscribe and presence event engines
messageListener as Action<Pubnub, PNMessageResult<object>>
);

if (engineinstances.TryAdd(instanceId, subscribeEventEngine)) {
return subscribeEventEngine;
}
Expand Down
Loading
Loading