refactor(sync): centralize with_token in oauth.lua with shared lock

Problem: `with_token` was duplicated in `gcal.lua` and `gtasks.lua`,
with the concurrency lock added only to the gtasks copy. Any new
backend would silently inherit the same race, and gcal back-to-back
push could still create duplicate remote calendar events.

Solution: lift `with_token` into `oauth.lua` as
`M.with_token(client, name, callback)` behind a module-level
`_sync_in_flight` guard. All backends share one implementation; the
lock covers gcal, gtasks, and any future backend automatically.
This commit is contained in:
Barrett Ruth 2026-03-06 16:03:46 -05:00
parent 36a5025198
commit 90f1378cb6
3 changed files with 29 additions and 39 deletions

View file

@ -436,32 +436,9 @@ local function sync_setup(access_token)
return tasklists, s, now_ts
end
local _in_flight = false
---@param callback fun(access_token: string): nil
local function with_token(callback)
if _in_flight then
log.warn('gtasks: operation in progress — please wait')
return
end
_in_flight = true
oauth.async(function()
local token = oauth.google_client:get_access_token()
if not token then
_in_flight = false
log.warn('not authenticated — run :Pending auth')
return
end
local ok, err = pcall(callback, token)
_in_flight = false
if not ok then
log.error('gtasks: ' .. tostring(err))
end
end)
end
function M.push()
with_token(function(access_token)
oauth.with_token(oauth.google_client, 'gtasks', function(access_token)
local tasklists, s, now_ts = sync_setup(access_token)
if not tasklists then
return
@ -487,7 +464,7 @@ function M.push()
end
function M.pull()
with_token(function(access_token)
oauth.with_token(oauth.google_client, 'gtasks', function(access_token)
local tasklists, s, now_ts = sync_setup(access_token)
if not tasklists then
return
@ -514,7 +491,7 @@ function M.pull()
end
function M.sync()
with_token(function(access_token)
oauth.with_token(oauth.google_client, 'gtasks', function(access_token)
local tasklists, s, now_ts = sync_setup(access_token)
if not tasklists then
return