scansion/error.lua

Thu, 23 Mar 2023 12:14:53 +0000

author
Matthew Wild <mwild1@gmail.com>
date
Thu, 23 Mar 2023 12:14:53 +0000
changeset 172
2c17151ed21b
parent 111
25530dccf696
permissions
-rw-r--r--

client: Fix timeout handling

Previously, the timeout handler would fire an error that would get caught and
logged by the timer code. However that error never reached the upper levels of
scansion, leading to the whole thing just hanging.

Now we just trigger resumption of the async runner, and throw the error from
there if we haven't received the stanza yet.

With this change, timeouts are now correctly handled and reported as failures.

64
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
1 local error_mt = {
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
2 __tostring = function (e)
111
25530dccf696 scansion.error, client: Change error syntax slightly, so first param is identifier string
Matthew Wild <mwild1@gmail.com>
parents: 104
diff changeset
3 return tostring(e.text or e.type or ("<Scansion error: "..tostring(e)..">"));
64
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
4 end;
104
fb915f3a9c89 scansion.error: Add __name and is() for identifying scansion errors
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
5 __name = "scansion error";
64
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
6 };
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
7
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
8 return {
111
25530dccf696 scansion.error, client: Change error syntax slightly, so first param is identifier string
Matthew Wild <mwild1@gmail.com>
parents: 104
diff changeset
9 new_error = function (type, data)
25530dccf696 scansion.error, client: Change error syntax slightly, so first param is identifier string
Matthew Wild <mwild1@gmail.com>
parents: 104
diff changeset
10 return setmetatable({ type = type, text = data.text, data = data }, error_mt);
64
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
11 end;
104
fb915f3a9c89 scansion.error: Add __name and is() for identifying scansion errors
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
12 is = function (err)
fb915f3a9c89 scansion.error: Add __name and is() for identifying scansion errors
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
13 return getmetatable(err) == error_mt;
fb915f3a9c89 scansion.error: Add __name and is() for identifying scansion errors
Matthew Wild <mwild1@gmail.com>
parents: 64
diff changeset
14 end;
64
f0a1f82b8e04 scansion.error: Util for creating error objects
Matthew Wild <mwild1@gmail.com>
parents:
diff changeset
15 };

mercurial