From ee77ccd1d4af8807880333cee8b01e97f466b6f5 Mon Sep 17 00:00:00 2001 From: javalikescript Date: Sun, 5 Jan 2025 08:54:03 +0100 Subject: [PATCH] Support web-base restart --- extensions/web-base/addons.lua | 39 ++++++++++++++++++++------------ extensions/web-base/web-base.lua | 19 +++++----------- lha/Engine.lua | 10 -------- 3 files changed, 30 insertions(+), 38 deletions(-) diff --git a/extensions/web-base/addons.lua b/extensions/web-base/addons.lua index 1fe5de3..0fca2ff 100644 --- a/extensions/web-base/addons.lua +++ b/extensions/web-base/addons.lua @@ -1,27 +1,36 @@ -local function onStartup(extension, script) - extension:getEngine():onExtension('web-base', function(webBaseExtension) - webBaseExtension:registerAddonExtension(extension, script or true) - end) -end - -local function onShutdown(extension) - extension:getEngine():onExtension('web-base', function(webBaseExtension) - webBaseExtension:unregisterAddonExtension(extension) - end) +local function onWebBase(extension, script) + local webBaseExt = extension:getEngine():getExtensionById('web-base') + if webBaseExt then + if script then + webBaseExt:registerAddonExtension(extension, script) + else + webBaseExt:unregisterAddonExtension(extension) + end + end end local function registerAddonExtension(extension, script) + local started = false + if script == nil then + script = extension:getId()..'.js' + end extension:subscribeEvent('startup', function() - onStartup(extension, script) + started = true + onWebBase(extension, script) + end) + extension:subscribeEvent('web-base:startup', function() + if started then + onWebBase(extension, script) + end end) extension:subscribeEvent('shutdown', function() - onShutdown(extension) + started = false + onWebBase(extension) end) end return { - onStartup = onStartup, - onShutdown = onShutdown, - registerAddonExtension = registerAddonExtension + registerAddonExtension = registerAddonExtension, + register = registerAddonExtension } diff --git a/extensions/web-base/web-base.lua b/extensions/web-base/web-base.lua index 0d31e15..b4438ac 100644 --- a/extensions/web-base/web-base.lua +++ b/extensions/web-base/web-base.lua @@ -60,9 +60,11 @@ local RollingList = class.create(List, function(rollingList) end) local websockets = {} +local addons = {} local function cleanup() websockets = {} + addons = {} Logger.setLogRecorder(recordLog) end @@ -114,24 +116,13 @@ local function onDataChange(value, previousValue, path) end end -local addons = {} - function extension:registerAddon(id, addon) addons[id] = addon - logger:info('Web base add-on "%s" registered', id) - webSocketBroadcast({event = 'addon-change'}) -end - -function extension:unregisterAddon(name) - addons[name] = nil - logger:info('Web base add-on "%s" unregistered', name) + logger:info('Web base add-on "%s" %s', id, addon and 'registered' or 'unregistered') webSocketBroadcast({event = 'addon-change'}) end function extension:registerAddonExtension(ext, script) - if script == true then - script = ext:getId()..'.js' - end self:registerAddon(ext:getId(), { handler = AddonFileHttpHandler:new(ext:getDir()), script = script or 'init.js' @@ -139,7 +130,7 @@ function extension:registerAddonExtension(ext, script) end function extension:unregisterAddonExtension(ext) - self:unregisterAddon(ext:getId()) + self:registerAddon(ext:getId()) end extension:watchPattern('^data/.*', onDataChange) @@ -240,6 +231,8 @@ extension:subscribeEvent('startup', function() HttpExchange.ok(exchange, json.stringify(l), 'application/json') end)) logger:info('WebSocket available on /ws/') + + extension:getEngine():publishEvent('web-base:startup', extension) end) extension:subscribeEvent('shutdown', function() diff --git a/lha/Engine.lua b/lha/Engine.lua index 0ba54ff..b8680ef 100644 --- a/lha/Engine.lua +++ b/lha/Engine.lua @@ -245,16 +245,6 @@ return class.create(function(engine) List.removeFirst(self.extensions, extension) end - function engine:onExtension(id, fn) - -- TODO replay on extension reload - local extension = self:getExtensionById(id) - if extension then - fn(extension) - return true - end - return false - end - function engine:getExtensionById(id) for _, extension in ipairs(self.extensions) do if extension:getId() == id then