IRequestTarget IActorBoundChannelSync.BindActor(IActorRef actor, TaggedType[] types, ActorBindingFlags bindingFlags)
        {
            if (actor == null)
                throw new ArgumentNullException(nameof(actor));

            var actorId = BindActor(actor, types.Select(t => new BoundType(t)), bindingFlags);
            return actorId != 0 ? new AkkaReceiverTarget(actor) : null;
        }
 public static async Task<IRequestTarget> BindActorOrOpenChannel(
     this ActorBoundChannelRef channel, IActorRef actor, TaggedType[] types, ActorBindingFlags bindingFlags,
     string gatewayName, object tag, ActorBindingFlags bindingFlagsForOpenChannel)
 {
     if (string.IsNullOrEmpty(gatewayName) || (channel != null && channel.CastToIActorRef().Path.Address == actor.Path.Address))
     {
         // link an actor to channel directly
         return await channel.BindActor(actor, types, bindingFlags);
     }
     else
     {
         // grant client to access an actor via gateway
         var gatewayRef = ((InternalActorRefBase)actor).Provider.ResolveActorRef(actor.Path.Root / "user" / gatewayName);
         var gateway = new ActorBoundGatewayRef(new AkkaReceiverTarget(gatewayRef));
         return await gateway.WithTimeout(TimeSpan.FromSeconds(10)).OpenChannel(actor, types, tag, bindingFlagsForOpenChannel);
     }
 }
        IRequestTarget IActorBoundGatewaySync.OpenChannel(IActorRef actor, TaggedType[] types, object tag, ActorBindingFlags bindingFlags)
        {
            if (actor == null)
                throw new ArgumentNullException(nameof(actor));

            if (_isStopped)
                return null;

            // create token and add to waiting list

            string token;
            while (true)
            {
                token = Guid.NewGuid().ToString();
                lock (_waitingMap)
                {
                    if (_waitingMap.ContainsKey(token) == false)
                    {
                        _waitingMap.Add(token, new WaitingItem
                        {
                            Tag = tag,
                            BindingActor = Tuple.Create(actor, types, bindingFlags),
                            Time = DateTime.UtcNow
                        });
                        break;
                    }
                }
            }

            var address = string.Join("|", ChannelType.Tcp.ToString(),
                                           _initiator.ConnectEndPoint.ToString(),
                                           token);
            return new BoundActorTarget(1, address);
        }
        bool IActorBoundChannelSync.BindType(IActorRef actor, TaggedType[] types)
        {
            if (actor == null)
                throw new ArgumentNullException(nameof(actor));

            return BindType(actor, types.Select(t => new BoundType(t)));
        }
 public BoundType(TaggedType type)
 {
     Type = type.Type;
     TagValue = type.TagValue;
 }
 public BoundType(TaggedType type)
 {
     Type     = type.Type;
     TagValue = type.TagValue;
 }
 public static Task<IRequestTarget> BindActorOrOpenChannel(
     this ActorBoundChannelRef channel, IActorRef actor, TaggedType[] types, ActorBindingFlags bindingFlags,
     string gatewayName, object tag)
 {
     return BindActorOrOpenChannel(channel, actor, types, bindingFlags, gatewayName, tag, bindingFlags);
 }