forked from HarukaMa/aleo-explorer
-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathapi.py
80 lines (64 loc) · 2.3 KB
/
api.py
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
import asyncio
import contextlib
import logging
import os
import threading
import time
import uvicorn
from asgi_logger import AccessLoggerMiddleware
from starlette.applications import Starlette
from starlette.exceptions import HTTPException
from starlette.requests import Request
from starlette.responses import JSONResponse
from starlette.routing import Route
from db import Database
# from node.light_node import LightNodeState
class Server(uvicorn.Server):
# https://stackoverflow.com/a/64521239
def install_signal_handlers(self):
pass
@contextlib.contextmanager
def run_in_thread(self):
thread = threading.Thread(target=self.run)
thread.start()
try:
while not self.started:
time.sleep(1e-3)
yield
finally:
self.should_exit = True
thread.join()
async def commitment_route(request: Request):
if time.time() >= 1675209600:
return JSONResponse(None)
commitment = request.query_params.get("commitment")
if not commitment:
return HTTPException(400, "Missing commitment")
return JSONResponse(await db.get_puzzle_commitment(commitment))
routes = [
Route("/commitment", commitment_route),
]
async def startup():
async def noop(_): pass
global db
# different thread so need to get a new database instance
db = Database(server=os.environ["DB_HOST"], user=os.environ["DB_USER"], password=os.environ["DB_PASS"],
database=os.environ["DB_DATABASE"], schema=os.environ["DB_SCHEMA"],
message_callback=noop)
await db.connect()
AccessLoggerMiddleware.DEFAULT_FORMAT = '\033[92mAPI\033[0m: \033[94m%(client_addr)s\033[0m - - %(t)s \033[96m"%(request_line)s"\033[0m \033[93m%(s)s\033[0m %(B)s "%(f)s" "%(a)s" %(L)s'
# noinspection PyTypeChecker
app = Starlette(
debug=True if os.environ.get("DEBUG") else False,
routes=routes,
on_startup=[startup],
# middleware=[Middleware(AccessLoggerMiddleware)]
)
db: Database
async def run():
config = uvicorn.Config("api:app", reload=True, log_level="info", port=int(os.environ.get("API_PORT", 8001)))
logging.getLogger("uvicorn.access").handlers = []
server = Server(config=config)
with server.run_in_thread():
while True:
await asyncio.sleep(3600)