sealed abstract class JobMessage extends Message;
case object JobOK extends JobMessage;
-case class JobInfo(info: Seq[String]) extends JobMessage;
-case class JobFail(err: Seq[String]) extends JobMessage;
+final case class JobInfo(info: Seq[String]) extends JobMessage;
+final case class JobFail(err: Seq[String]) extends JobMessage;
case object JobLostConnection extends JobMessage;
-case class BackgroundJobMessage(tag: String, msg: JobMessage)
+final case class BackgroundJobMessage(tag: String, msg: JobMessage)
extends Message;
-case class JobDetached(tag: String) extends Message;
+final case class JobDetached(tag: String) extends Message;
sealed abstract class AsyncMessage extends Message;
-case class Trace(msg: String) extends AsyncMessage;
-case class Warning(err: Seq[String]) extends AsyncMessage;
-case class Notify(note: Seq[String]) extends AsyncMessage;
+final case class Trace(msg: String) extends AsyncMessage;
+final case class Warning(err: Seq[String]) extends AsyncMessage;
+final case class Notify(note: Seq[String]) extends AsyncMessage;
case object ConnectionLost extends AsyncMessage;
sealed abstract class ServiceMessage extends Message;
-case class ServiceCancel(jobid: String) extends ServiceMessage;
-case class ServiceClaim(svc: String, version: String)
+final case class ServiceCancel(jobid: String) extends ServiceMessage;
+final case class ServiceClaim(svc: String, version: String)
extends ServiceMessage;
-case class ServiceJob(jobid: String, svc: String,
+final case class ServiceJob(jobid: String, svc: String,
cmd: String, args: Seq[String])
extends ServiceMessage;
/*----- Main code ---------------------------------------------------------*/
-object Connection {
-}
-
class ConnectionClosed extends Exception;
class ServerFailed(msg: String) extends Exception(msg);
val jobmap = new HashMap[String, this.Job]; // Maps tags to extant jobs.
var bgseq = 0; // Next background job tag.
+ type Pub = Connection;
+
class Job extends Iterator[Seq[String]] {
private[Connection] val ch = new Channel[JobMessage];
private[this] var nextmsg: Option[JobMessage] = None;
case msg: AsyncMessage =>
publish(msg);
case _: ServiceMessage =>
- ();
+ ok;
}
}
} catch {
j.ch.write(JobLostConnection);
fgjob = None;
notifyAll();
- case None => ();
+ case None => ok;
}
}
publish(ConnectionLost);