public long Subscribe(ISubscribeRequest <TMessage> request, SubscribeOptions options, string topicUri) { lock (mLock) { WampRawTopic <TMessage> rawTopic; IWampCustomizedSubscriptionId customizedSubscriptionId = mTopicContainer.GetSubscriptionId(topicUri, options); if (!mTopicUriToTopic.TryGetValue(customizedSubscriptionId, out rawTopic)) { rawTopic = CreateRawTopic(topicUri, options, customizedSubscriptionId); IWampRegistrationSubscriptionToken subscriptionToken = mTopicContainer.Subscribe(rawTopic, topicUri, options); long subscriptionId = subscriptionToken.TokenId; mSubscriptionIdToTopic.TryAdd(subscriptionId, rawTopic); rawTopic.SubscriptionId = subscriptionId; rawTopic.SubscriptionDisposable = subscriptionToken; } rawTopic.Subscribe(request, options); return(rawTopic.SubscriptionId); } }
public long Register(IRegisterRequest request, RegisterOptions options, string procedure) { WampCalleeRpcOperation <TMessage> operation = new WampCalleeRpcOperation <TMessage>(procedure, request.Callee, options, mInvocationHandler, this); try { IWampRegistrationSubscriptionToken token = mCatalog.Register(operation, options); long registrationId = token.TokenId; operation.RegistrationId = registrationId; CompositeDisposable disposable = new CompositeDisposable(token, operation); bool alreadyRegistered = !mOperationToDisposable.TryAdd(operation, disposable); request.Registered(registrationId); // If the operation is already registered, ignore it. if (!alreadyRegistered) { operation.Open(); } return(registrationId); } catch (Exception) { operation.Dispose(); throw; } }
public ForwardingToken(IWampRegistrationSubscriptionToken localToken, Task <IAsyncDisposable> remoteToken) { this._localToken = localToken; Task.Run(() => this.RegisterForwardingTokenAsync(remoteToken)).ConfigureAwait(false); }