use crate::common::{docker::Docker, logs::Logs, port, Error, Result};
pub const GEAR_NODE_BIN_PATH: &str = "/usr/local/bin/gear-node";
pub const GEAR_NODE_DOCKER_IMAGE: &str = "ghcr.io/gear-tech/node:latest";
pub struct Node {
ps: Docker,
pub port: u16,
}
impl Node {
pub fn ws(&self) -> String {
format!("ws://{}:{}", port::LOCALHOST, self.port)
}
pub fn dev() -> Result<Self> {
let port = port::pick();
let ps = Docker::run(&[
"-p",
&format!("{}:9944", port),
GEAR_NODE_DOCKER_IMAGE,
GEAR_NODE_BIN_PATH,
"--tmp",
"--dev",
"--unsafe-ws-external",
])?;
Ok(Self { ps, port })
}
pub fn logs(&mut self) -> Result<Logs> {
self.ps.logs()
}
pub fn wait(&mut self, log: &str) -> Result<()> {
let mut logs: Vec<String> = Default::default();
for line in self.logs()? {
if line.contains(log) {
return Ok(());
}
logs.push(line.clone());
}
Err(Error::Spawn(logs.join("\n")))
}
}