fix(backend): add async lock to prevent Already borrowed issue

This commit is contained in:
h
2026-01-25 16:52:15 +01:00
parent a992e3f0c2
commit f97933bc9b
2 changed files with 10 additions and 4 deletions

View File

@@ -7,15 +7,19 @@ from convex import ConvexClient as SyncConvexClient
class ConvexClient: class ConvexClient:
def __init__(self, url: str) -> None: def __init__(self, url: str) -> None:
self._client = SyncConvexClient(url) self._client = SyncConvexClient(url)
self._lock = asyncio.Lock()
async def query(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401 async def query(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401
return await asyncio.to_thread(self._client.query, name, args or {}) async with self._lock:
return await asyncio.to_thread(self._client.query, name, args or {})
async def mutation(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401 async def mutation(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401
return await asyncio.to_thread(self._client.mutation, name, args or {}) async with self._lock:
return await asyncio.to_thread(self._client.mutation, name, args or {})
async def action(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401 async def action(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401
return await asyncio.to_thread(self._client.action, name, args or {}) async with self._lock:
return await asyncio.to_thread(self._client.action, name, args or {})
def subscribe(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401 def subscribe(self, name: str, args: dict[str, Any] | None = None) -> Any: # noqa: ANN401
return self._client.subscribe(name, args or {}) return self._client.subscribe(name, args or {})

View File

@@ -2,13 +2,15 @@
import './layout.css'; import './layout.css';
import favicon from '$lib/assets/favicon.svg'; import favicon from '$lib/assets/favicon.svg';
import { PUBLIC_CONVEX_URL } from '$env/static/public'; import { PUBLIC_CONVEX_URL } from '$env/static/public';
import { env } from '$env/dynamic/public';
import { setupConvex } from 'convex-svelte'; import { setupConvex } from 'convex-svelte';
import { hasWebSocketSupport, setupPollingConvex } from '$lib/convex-polling.svelte'; import { hasWebSocketSupport, setupPollingConvex } from '$lib/convex-polling.svelte';
import { setContext } from 'svelte'; import { setContext } from 'svelte';
let { children } = $props(); let { children } = $props();
const usePolling = !hasWebSocketSupport(); const fallbackEnabled = env.PUBLIC_FALLBACK === '1';
const usePolling = fallbackEnabled && !hasWebSocketSupport();
setContext('convex-use-polling', usePolling); setContext('convex-use-polling', usePolling);
if (usePolling) { if (usePolling) {