/// <summary>
        /// Start a new session
        /// </summary>
        public SessionId Start(SessionId sessionId, int timeoutSeconds, Map <string, object> initialState)
        {
            lock (sync)
            {
                if (sessions.ContainsKey(sessionId))
                {
                    return(sessionId);
                }
                var session = SessionVector.Create(timeoutSeconds, VectorConflictStrategy.First, initialState);
                sessions = sessions.Add(sessionId, session);

                // Create a subject per session that will buffer touches so we don't push too
                // much over the net when not needed.  This routes to a single stream that isn't
                // buffered.
                var touch = new Subject <Tuple <SessionId, DateTime> >();
                touch.Sample(TimeSpan.FromSeconds(1))
                .ObserveOn(TaskPoolScheduler.Default)
                .Subscribe(touched.OnNext);
                sessionTouched = sessionTouched.Add(sessionId, touch);
            }
            return(sessionId);
        }
 public ActorRequestContext(
     ActorSystem system,
     ActorItem self,
     ProcessId sender,
     ActorItem parent,
     object currentMsg,
     ActorRequest currentRequest,
     ProcessFlags processFlags,
     ProcessOpTransaction ops,
     SessionVector session
     )
 {
     Self = self;
     Sender = sender;
     Parent = parent;
     CurrentMsg = currentMsg;
     CurrentRequest = currentRequest;
     ProcessFlags = processFlags;
     Ops = ops;
     System = system;
     Session = session;
 }