From fb98e0480b1f19346d0c678a4513857f6d9e2e82 Mon Sep 17 00:00:00 2001 From: Eduard Iskandarov Date: Tue, 19 Oct 2021 15:13:50 +0500 Subject: [PATCH 1/2] =?UTF-8?q?=F0=9F=90=9B=20store=20contextvar=20token?= =?UTF-8?q?=20in=20closure?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi_events/middleware.py | 11 ++--------- 1 file changed, 2 insertions(+), 9 deletions(-) diff --git a/fastapi_events/middleware.py b/fastapi_events/middleware.py index 0fddcbf..c66c4be 100644 --- a/fastapi_events/middleware.py +++ b/fastapi_events/middleware.py @@ -14,27 +14,20 @@ class EventHandlerASGIMiddleware: def __init__(self, app: ASGIApp, handlers: Iterable[BaseEventHandler]) -> None: self.app = app self._handlers: Iterable[BaseEventHandler] = handlers - self._token: Optional[Token] = None async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: if scope["type"] not in ["http", "websocket"]: await self.app(scope, receive, send) return - self._initialize_event_store() + token = event_store.set(deque()) try: await self.app(scope, receive, send) finally: await self._process_events() - self._teardown_event_store() + event_store.reset(token) async def _process_events(self) -> None: q: Deque[Event] = event_store.get() await asyncio.gather(*[handler.handle_many(events=q) for handler in self._handlers]) - - def _initialize_event_store(self) -> None: - self._token = event_store.set(deque()) - - def _teardown_event_store(self) -> None: - event_store.reset(self._token) From 0a168b6b1fab0954f2cbc01654d41bc856af24ba Mon Sep 17 00:00:00 2001 From: Eduard Iskandarov Date: Tue, 19 Oct 2021 15:27:07 +0500 Subject: [PATCH 2/2] =?UTF-8?q?=F0=9F=9A=A8=20fix=20linting=20error?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- fastapi_events/middleware.py | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/fastapi_events/middleware.py b/fastapi_events/middleware.py index c66c4be..917d1cb 100644 --- a/fastapi_events/middleware.py +++ b/fastapi_events/middleware.py @@ -1,7 +1,7 @@ import asyncio from collections import deque from contextvars import Token -from typing import Optional, Deque, Iterable +from typing import Deque, Iterable from starlette.types import ASGIApp, Scope, Receive, Send @@ -20,7 +20,7 @@ async def __call__(self, scope: Scope, receive: Receive, send: Send) -> None: await self.app(scope, receive, send) return - token = event_store.set(deque()) + token: Token = event_store.set(deque()) try: await self.app(scope, receive, send) finally: