'Fetches the events stream for a given user.
If `only_keys` is not None, events from keys will be sent down.'

@defer.inlineCallbacks
@log_function
def get_stream(self, auth_user_id, pagin_config, timeout=0, as_client_event=True, affect_presence=True, only_keys=None, room_id=None, is_guest=False):

    auth_user = UserID.from_string(auth_user_id)
    presence_handler = self.hs.get_presence_handler()
    context = (yield presence_handler.user_syncing(auth_user_id, affect_presence=affect_presence))
    with context:
        if timeout:
            timeout = max(timeout, 500)
            timeout = random.randint(int((timeout * 0.9)), int((timeout * 1.1)))
        (events, tokens) = (yield self.notifier.get_events_for(auth_user, pagin_config, timeout, only_keys=only_keys, is_guest=is_guest, explicit_room_id=room_id))
        to_add = []
        for event in events:
            if (not isinstance(event, EventBase)):
                continue
            if (event.type == EventTypes.Member):
                if (event.membership != Membership.JOIN):
                    continue
                if (event.state_key == auth_user_id):
                    users = (yield self.state.get_current_user_in_room(event.room_id))
                    states = (yield presence_handler.get_states(users, as_event=True))
                    to_add.extend(states)
                else:
                    ev = (yield presence_handler.get_state(UserID.from_string(event.state_key), as_event=True))
                    to_add.append(ev)
        events.extend(to_add)
        time_now = self.clock.time_msec()
        chunks = [serialize_event(e, time_now, as_client_event) for e in events]
        chunk = {'chunk': chunks, 'start': tokens[0].to_string(), 'end': tokens[1].to_string()}
        defer.returnValue(chunk)
