public void Subscribe(IActorRef subscriber, string stream, long?from, int max,
                              Func <ResolvedEvent, object> resolved)
        {
            if (!_subscriptions.TryGetValue(subscriber, out var subscriptions))
            {
                subscriptions = new HashSet <EventStoreCatchUpSubscription>();
                _subscriptions.Add(subscriber, subscriptions);
                _context.WatchWith(subscriber, new Unsubscribe(stream, subscriber));
            }

            try
            {
// need to have this since ES Catchup Subscription needs null for from when user wants to
                // read from begging of the stream
                long?nullable = null;

                var self = _context.Self;

                var subscription = _conn.SubscribeToStreamFrom(
                    stream,
                    from.HasValue && from.Value == 0 ? nullable : from,
                    new CatchUpSubscriptionSettings(max * 2, 500, false, true),
                    (sub, @event) =>
                {
                    var p = resolved(@event);
                    if (p != null)
                    {
                        subscriber.Tell(p, self);
                    }
                },
                    _ => subscriber.Tell(CaughtUp.Instance, self),
                    (_, reason, exception) =>
                {
                    var msg = $"Subscription dropped due reason {reason.ToString()}";
                    subscriber.Tell(new SubscriptionDroppedException(msg, exception), self);
                });


                subscriptions.Add(subscription);
            }
            catch (Exception)
            {
                if (subscriptions.Count == 0)
                {
                    _context.Unwatch(subscriber);
                }

                throw;
            }
        }