refactor: extract init_filters and event_getter

This commit is contained in:
Vlad Stan 2023-02-23 11:26:42 +02:00
parent 0cc5c59a73
commit c97fcec6e9

View file

@ -2,13 +2,15 @@ from http import HTTPStatus
import asyncio import asyncio
import ssl import ssl
import json import json
from fastapi import Request from typing import List
from fastapi import Request, WebSocket
from fastapi.param_functions import Query from fastapi.param_functions import Query
from fastapi.params import Depends from fastapi.params import Depends
from fastapi.responses import JSONResponse from fastapi.responses import JSONResponse
from starlette.exceptions import HTTPException from starlette.exceptions import HTTPException
from sse_starlette.sse import EventSourceResponse from sse_starlette.sse import EventSourceResponse
from loguru import logger
from . import nostrclient_ext from . import nostrclient_ext
@ -93,8 +95,17 @@ async def api_post_event(event: Event):
@nostrclient_ext.post("/api/v1/filters") @nostrclient_ext.post("/api/v1/filters")
async def api_subscribe(filters: Filters): async def api_subscribe(filters: Filters):
nostr_filters = init_filters(filters.__root__)
return EventSourceResponse(
event_getter(nostr_filters),
ping=20,
media_type="text/event-stream",
)
def init_filters(filters: List[Filter]):
filter_list = [] filter_list = []
for filter in filters.__root__: for filter in filters:
filter_list.append( filter_list.append(
NostrFilter( NostrFilter(
event_ids=filter.ids, event_ids=filter.ids,
@ -116,15 +127,11 @@ async def api_subscribe(filters: Filters):
request.extend(nostr_filters.to_json_array()) request.extend(nostr_filters.to_json_array())
message = json.dumps(request) message = json.dumps(request)
client.relay_manager.publish_message(message) client.relay_manager.publish_message(message)
return nostr_filters
async def event_getter():
while True:
event = await received_event_queue.get()
if nostr_filters.match(event):
yield event.to_message()
return EventSourceResponse( async def event_getter(nostr_filters):
event_getter(), while True:
ping=20, event = await received_event_queue.get()
media_type="text/event-stream", if nostr_filters.match(event):
) yield event.to_message()