--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/main.lua Tue Mar 09 12:16:56 2021 +0000 @@ -0,0 +1,83 @@ +local LUA_WEB_APP_FRAMEWORK = os.getenv("LUA_WEB_APP_FRAMEWORK"); + +if LUA_WEB_APP_FRAMEWORK then + package.path = ("%s/?.lua;%s"):format(LUA_WEB_APP_FRAMEWORK, package.path); + package.cpath = ("%s/?.so;%s"):format(LUA_WEB_APP_FRAMEWORK, package.cpath); +end + +local ssl = require "ssl"; +local server = require "net.server_epoll"; +local envload = require"util.envload"; +local logger = require "util.logger"; + +package.loaded["net.server"] = server; -- COMPAT this module from Prosody can't be loaded outside of prosody + +local log = logger.init("main"); + +local config = { + loglevel = "debug"; +}; + +local logfile = io.stderr; + +local function log2file(source, level, message, ...) + logfile:write(os.date("!%Y-%m-%dT%H:%M:%SZ"), "\t", source, "\t", level, "\t", message:format(...), "\n"); +end + +local function init(config_file) + if type(config_file) ~= "table" then + setmetatable(config, { __index = { ENV = os.getenv } }); + local ok, err = envload.envloadfile(config_file or "./config.lua", config); + if ok then ok, err = pcall(ok); end + setmetatable(config, nil); + if not ok then log2file("config", "error", "Parse failed: %s", err or "Unknown error"); end + else + config = config_file; + end + + local events = require"util.events".new(); + + -- Set up logging to stdout + logger.reset(); + local logsink = log2file; + if config.logfile then + if config.logfile == "*stdout" then + logfile = io.stdout; + elseif config.logfile == "*stderr" then + logfile = io.stderr; + else + logfile = assert(io.open(config.logfile, "a")); + end + end + if logfile then + logfile:setvbuf("line"); + for _, level in ipairs{"error", "warn", "info", "debug"} do + logger.add_level_sink(level, logsink); + if config.loglevel == level then break; end + end + end + log("debug", "Logging ready"); + + require "http".init(config, events); + + -- Load optional extensions specified in the config + for _, ext in ipairs(config.extensions or {}) do + require("extensions."..ext).init(config, events); + end +end + +local function run() + server.loop(); +end + +if arg then + init(...); + run(); +else + return { + init = init, + run = run, + }; +end + +