docs: def StartFlowAndWorker(client_id, flow_name, **kwargs):
    """Launches the flow and worker and waits for it to finish.
  
    Args:
       client_id: The client common name we issue the request.
       flow_name: The name of the flow to launch.
       **kwargs: passthrough to flow.
  
    Returns:
       A flow session id.
  
    Note: you need raw access to run this flow as it requires running a worker.
    """
    # Empty token, only works with raw access.
    queue = rdfvalue.RDFURN("DEBUG-%s-" % getpass.getuser())
    if "token" in kwargs:
      token = kwargs.pop("token")
    else:
      token = access_control.ACLToken(username="GRRConsole")
  
    session_id = flow.StartAFF4Flow(
        client_id=client_id,
        flow_name=flow_name,
        queue=queue,
        token=token,
        **kwargs)
    worker_thrd = worker_lib.GRRWorker(
        queues=[queue], token=token, threadpool_size=1)
    while True:
      try:
        worker_thrd.RunOnce()
      except KeyboardInterrupt:
        print("exiting")
        worker_thrd.thread_pool.Join()
        break
  
      time.sleep(2)
      with aff4.FACTORY.Open(session_id, token=token) as flow_obj:
        if not flow_obj.GetRunner().IsRunning():
          break
  
    # Terminate the worker threads
    worker_thrd.thread_pool.Join()
  
    return session_id