diff options
| author | s-ol <s-ol@users.noreply.github.com> | 2019-10-15 15:57:28 +0000 |
|---|---|---|
| committer | s-ol <s-ol@users.noreply.github.com> | 2019-10-15 15:57:28 +0000 |
| commit | 74e6bb948fa84590b2c0b921868fa9abca6d41d2 (patch) | |
| tree | 704bfd3b3b9870164a1fae0bbaa1099c4649b795 | |
| parent | add xy-workshop (diff) | |
| download | mmm-74e6bb948fa84590b2c0b921868fa9abca6d41d2.tar.gz mmm-74e6bb948fa84590b2c0b921868fa9abca6d41d2.zip | |
better error-handling / logging
| -rw-r--r-- | build/server.moon | 11 | ||||
| -rw-r--r-- | mmm/component/init.client.moon | 3 | ||||
| -rw-r--r-- | mmm/component/init.server.moon | 3 | ||||
| -rw-r--r-- | mmm/init.client.moon | 2 | ||||
| -rw-r--r-- | mmm/init.server.moon | 2 | ||||
| -rw-r--r-- | mmm/mmmfs/browser.moon | 7 | ||||
| -rw-r--r-- | mmm/mmmfs/conversion.moon | 6 | ||||
| -rw-r--r-- | mmm/mmmfs/converts.moon | 3 | ||||
| -rw-r--r-- | mmm/mmmfs/stores/web.moon | 1 |
9 files changed, 26 insertions, 12 deletions
diff --git a/build/server.moon b/build/server.moon index 72b5ffd..aa7bf50 100644 --- a/build/server.moon +++ b/build/server.moon @@ -73,7 +73,9 @@ class Server local store = web.WebStore({ verbose = true }) local root = fileder.Fileder(store, store:get_index(nil, -1)) - BROWSER = browser.Browser(root, path, facet, true) + local err_and_trace = function (msg) return debug.traceback(msg, 2) end + ok, BROWSER = xpcall(browser.Browser, err_and_trace, root, path, facet, true) + if not ok then error(BROWSER) end end) </script>" else if not fileder\has_facet facet.name @@ -88,6 +90,7 @@ class Server else 501, "not implemented" + err_and_trace = (msg) -> debug.traceback msg, 2 stream: (sv, stream) => req = stream\get_headers! method = req\get ':method' @@ -102,10 +105,10 @@ class Server type = type\match '%s*(.*)' facet = Key facet, type - ok, status, body = pcall @.handle, @, method, path, facet + ok, status, body = xpcall @.handle, err_and_trace, @, method, path, facet if not ok - warn status, body - body = "Internal Server Error: #{status}" + warn "Error handling request (#{method} #{path} #{facet}):\n#{status}" + body = "Internal Server Error:\n#{status}" status = 500 res = headers.new! diff --git a/mmm/component/init.client.moon b/mmm/component/init.client.moon index c72644b..00e5e03 100644 --- a/mmm/component/init.client.moon +++ b/mmm/component/init.client.moon @@ -16,6 +16,8 @@ tohtml = (val) -> else error "not a Node: #{val}, #{type val}" +fromhtml = (node) -> :node + -- shorthand to form a text node from a string text = (str) -> document\createTextNode tostring str @@ -146,6 +148,7 @@ elements = setmetatable {}, __index: (name) => :get_or_create, -- :join, :tohtml, + :fromhtml, :text, :elements, } diff --git a/mmm/component/init.server.moon b/mmm/component/init.server.moon index 7c7fb7e..1cf2bd9 100644 --- a/mmm/component/init.server.moon +++ b/mmm/component/init.server.moon @@ -16,6 +16,8 @@ tohtml = (val) -> else error "not a Node: #{val}, #{type val}" +fromhtml = (html) -> render: -> html + -- shorthand to form a text node from strings escapes = { '&': '&' @@ -128,6 +130,7 @@ get_or_create = (elem, id, ...) -> :ReactiveElement, :get_or_create, :tohtml, + :fromhtml, :text, :elements, } diff --git a/mmm/init.client.moon b/mmm/init.client.moon index e32f25d..955b8d8 100644 --- a/mmm/init.client.moon +++ b/mmm/init.client.moon @@ -10,7 +10,7 @@ deep_tostring = (tbl, space='') -> return tbl if 'userdata' == type tbl buf = space .. tostring tbl - return buf unless 'table' == type tbl + return buf unless 'table' == (type tbl) or table.__tostring buf = buf .. ' {\n' for k,v in pairs tbl diff --git a/mmm/init.server.moon b/mmm/init.server.moon index 0fe36d5..c4d663d 100644 --- a/mmm/init.server.moon +++ b/mmm/init.server.moon @@ -4,7 +4,7 @@ MODE = 'SERVER' deep_tostring = (tbl, space='') -> buf = space .. tostring tbl - return buf unless 'table' == type tbl + return buf unless 'table' == (type tbl) or tbl.__tostring buf = buf .. ' {\n' for k,v in pairs tbl diff --git a/mmm/mmmfs/browser.moon b/mmm/mmmfs/browser.moon index f872ed9..2287c4c 100644 --- a/mmm/mmmfs/browser.moon +++ b/mmm/mmmfs/browser.moon @@ -166,7 +166,7 @@ class Browser @node = wrapper.node @render = wrapper\render - err_and_trace = (msg) -> { :msg, trace: debug.traceback! } + err_and_trace = (msg) -> debug.traceback msg, 2 default_convert = (key) => @get key.name, 'mmm/dom' -- render #browser-content @@ -177,7 +177,7 @@ class Browser if MODE == 'CLIENT' err\set pre msg warn "ERROR rendering content: #{msg}" - nil + div! active = @active\get! @@ -193,10 +193,9 @@ class Browser res elseif ok div "[no conversion path to #{prop.type}]" - elseif res and res.msg.match and res.msg\match '%[nossr%]$' + elseif res and res\match '%[nossr%]' div "[this page could not be pre-rendered on the server]" else - res = "#{res.msg}\n#{res.trace}" disp_error res get_inspector: => diff --git a/mmm/mmmfs/conversion.moon b/mmm/mmmfs/conversion.moon index 4b47bba..4700eea 100644 --- a/mmm/mmmfs/conversion.moon +++ b/mmm/mmmfs/conversion.moon @@ -77,10 +77,14 @@ print_conversions = (conversions) -> -- * value - value -- * ... - other transform parameters (fileder, key) -- returns converted value +err_and_trace = (msg) -> debug.traceback msg, 2 apply_conversions = (conversions, value, ...) -> for i=#conversions,1,-1 step = conversions[i] - value = step.convert.transform step, value, ... + ok, value = xpcall step.convert.transform, err_and_trace, step, value, ... + if not ok + f, k = ... + error "error while converting #{f} #{k} from '#{step.from}' to '#{step.to}':\n#{value}" value diff --git a/mmm/mmmfs/converts.moon b/mmm/mmmfs/converts.moon index e4a6ddf..7a998e8 100644 --- a/mmm/mmmfs/converts.moon +++ b/mmm/mmmfs/converts.moon @@ -127,6 +127,7 @@ converts = { nolink = js_fix element\getAttribute 'nolink' inline = js_fix element\getAttribute 'inline' desc = js_fix element.innerText + desc = nil if desc == '' element\replaceWith embed path or '', facet or '', fileder, { :nolink, :inline, :desc } @@ -239,7 +240,7 @@ converts = { { inp: '(.+)', out: 'URL -> %1', - cost: 10 + cost: 5 transform: (_, fileder, key) => "#{fileder.path}/#{key.name}:#{@from}" } { diff --git a/mmm/mmmfs/stores/web.moon b/mmm/mmmfs/stores/web.moon index f3b60c7..ea17b5a 100644 --- a/mmm/mmmfs/stores/web.moon +++ b/mmm/mmmfs/stores/web.moon @@ -81,6 +81,7 @@ class WebStore extends Store coroutine.yield facet.name, facet.type load_facet: (path, name, type) => + @log "loading facet #{path} #{name}: #{type}" fetch "#{@host .. path}/#{name}: #{type}" create_facet: (path, name, type, blob) => |
