aboutsummaryrefslogtreecommitdiffstats
path: root/lua/nvim-lsp-installer/core/async/init.lua
diff options
context:
space:
mode:
authorWilliam Boman <william@redwill.se>2022-03-02 20:13:26 +0100
committerGitHub <noreply@github.com>2022-03-02 20:13:26 +0100
commitac04f507f83f178ad563426cfa0d0d4f0e984ecc (patch)
tree90c94ed076ec3abe30b178b0f9d9fc0fdd036e18 /lua/nvim-lsp-installer/core/async/init.lua
parentrun autogen_metadata.lua (diff)
downloadmason-ac04f507f83f178ad563426cfa0d0d4f0e984ecc.tar
mason-ac04f507f83f178ad563426cfa0d0d4f0e984ecc.tar.gz
mason-ac04f507f83f178ad563426cfa0d0d4f0e984ecc.tar.bz2
mason-ac04f507f83f178ad563426cfa0d0d4f0e984ecc.tar.lz
mason-ac04f507f83f178ad563426cfa0d0d4f0e984ecc.tar.xz
mason-ac04f507f83f178ad563426cfa0d0d4f0e984ecc.tar.zst
mason-ac04f507f83f178ad563426cfa0d0d4f0e984ecc.zip
fix(async): pcall callback-style functions to catch errors (#515)
Diffstat (limited to 'lua/nvim-lsp-installer/core/async/init.lua')
-rw-r--r--lua/nvim-lsp-installer/core/async/init.lua27
1 files changed, 19 insertions, 8 deletions
diff --git a/lua/nvim-lsp-installer/core/async/init.lua b/lua/nvim-lsp-installer/core/async/init.lua
index a9c1704c..1dd2c138 100644
--- a/lua/nvim-lsp-installer/core/async/init.lua
+++ b/lua/nvim-lsp-installer/core/async/init.lua
@@ -6,15 +6,23 @@ local Promise = {}
Promise.__index = Promise
function Promise.new(resolver)
- return setmetatable({ resolver = resolver }, Promise)
+ return setmetatable({ resolver = resolver, has_resolved = false }, Promise)
+end
+
+---@param success boolean
+---@param cb fun()
+function Promise:_wrap_resolver_cb(success, cb)
+ return function(...)
+ if self.has_resolved then
+ return
+ end
+ self.has_resolved = true
+ cb(success, ...)
+ end
end
function Promise:__call(callback)
- self.resolver(function(...)
- callback(true, ...)
- end, function(...)
- callback(false, ...)
- end)
+ self.resolver(self:_wrap_resolver_cb(true, callback), self:_wrap_resolver_cb(false, callback))
end
local function await(resolver)
@@ -28,9 +36,12 @@ end
local function promisify(async_fn)
return function(...)
local args = table_pack(...)
- return await(function(resolve)
+ return await(function(resolve, reject)
args[args.n + 1] = resolve
- async_fn(unpack(args, 1, args.n + 1))
+ local ok, err = pcall(async_fn, unpack(args, 1, args.n + 1))
+ if not ok then
+ reject(err)
+ end
end)
end
end