mod_admin_telnet: Enable async processing using util.async
authorKim Alvefur <zash@zash.se>
Thu, 27 Dec 2018 02:53:34 +0100
changeset 9739 2d8ca54ecbc6
parent 9738 cc01bb7a3305
child 9740 a5ae3f4e1a40
mod_admin_telnet: Enable async processing using util.async
plugins/mod_admin_telnet.lua
--- a/plugins/mod_admin_telnet.lua	Fri Dec 28 20:56:01 2018 +0100
+++ b/plugins/mod_admin_telnet.lua	Thu Dec 27 02:53:34 2018 +0100
@@ -31,6 +31,7 @@
 local envload = require "util.envload".envload;
 local envloadfile = require "util.envload".envloadfile;
 local has_pposix, pposix = pcall(require, "util.pposix");
+local async = require "util.async";
 
 local commands = module:shared("commands")
 local def_env = module:shared("env");
@@ -48,6 +49,21 @@
 
 console = {};
 
+local runner_callbacks = {};
+
+function runner_callbacks:ready()
+	self.data.conn:resume();
+end
+
+function runner_callbacks:waiting()
+	self.data.conn:pause();
+end
+
+function runner_callbacks:error(err)
+	module:log("error", "Traceback[telnet]: %s", err);
+end
+
+
 function console:new_session(conn)
 	local w = function(s) conn:write(s:gsub("\n", "\r\n")); end;
 	local session = { conn = conn;
@@ -63,6 +79,11 @@
 			};
 	session.env = setmetatable({}, default_env_mt);
 
+	session.thread = async.runner(function (line)
+		console:process_line(session, line);
+		session.send(string.char(0));
+	end, runner_callbacks, session);
+
 	-- Load up environment with helper objects
 	for name, t in pairs(def_env) do
 		if type(t) == "table" then
@@ -151,8 +172,7 @@
 
 	for line in data:gmatch("[^\n]*[\n\004]") do
 		if session.closed then return end
-		console:process_line(session, line);
-		session.send(string.char(0));
+		session.thread:run(line);
 	end
 	session.partial_data = data:match("[^\n]+$");
 end