Part of https://www.notion.so/Laconic-Mainnet-Plan-1eca6b22d47280569cd0d1e6d711d949 Co-authored-by: Shreerang Kale <shreerangkale@gmail.com> Reviewed-on: #1 Co-authored-by: shreerang <shreerang@noreply.git.vdb.to> Co-committed-by: shreerang <shreerang@noreply.git.vdb.to>
89 lines
2.4 KiB
Python
89 lines
2.4 KiB
Python
import os
|
|
import logging
|
|
import asyncio
|
|
from dotenv import load_dotenv
|
|
from aiohttp import web
|
|
from providers import create_providers
|
|
from cache import Cache
|
|
from errors import ErrorLogger
|
|
from router import Router
|
|
from http_proxy import setup_routes
|
|
from ws_proxy import setup_ws_routes
|
|
|
|
|
|
@web.middleware
|
|
async def cors_middleware(request, handler):
|
|
"""Add CORS headers to all responses"""
|
|
if request.method == 'OPTIONS':
|
|
# Handle preflight requests
|
|
return web.Response(headers={
|
|
'Access-Control-Allow-Origin': '*',
|
|
'Access-Control-Allow-Methods': 'GET, POST, OPTIONS',
|
|
'Access-Control-Allow-Headers': '*',
|
|
'Access-Control-Max-Age': '86400'
|
|
})
|
|
|
|
response = await handler(request)
|
|
response.headers['Access-Control-Allow-Origin'] = '*'
|
|
response.headers['Access-Control-Allow-Methods'] = 'GET, POST, OPTIONS'
|
|
response.headers['Access-Control-Allow-Headers'] = '*'
|
|
return response
|
|
|
|
|
|
def load_config() -> dict:
|
|
load_dotenv()
|
|
|
|
return {
|
|
"proxy_port": int(os.getenv("PROXY_PORT", 8545)),
|
|
"cache_size_gb": int(os.getenv("CACHE_SIZE_GB", 1)),
|
|
"backoff_minutes": int(os.getenv("BACKOFF_MINUTES", 30)),
|
|
"log_level": os.getenv("LOG_LEVEL", "INFO"),
|
|
"error_db_path": os.getenv("ERROR_DB_PATH", "./errors.db"),
|
|
}
|
|
|
|
|
|
def setup_logging(log_level: str) -> None:
|
|
logging.basicConfig(
|
|
level=getattr(logging, log_level.upper()),
|
|
format='%(asctime)s - %(name)s - %(levelname)s - %(message)s'
|
|
)
|
|
|
|
|
|
def create_app(config: dict) -> web.Application:
|
|
app = web.Application(middlewares=[cors_middleware])
|
|
|
|
providers = create_providers()
|
|
cache = Cache(size_limit_gb=config["cache_size_gb"])
|
|
error_logger = ErrorLogger(db_path=config["error_db_path"])
|
|
router = Router(providers, cache, error_logger)
|
|
|
|
app['router'] = router
|
|
app['config'] = config
|
|
|
|
setup_routes(app)
|
|
setup_ws_routes(app)
|
|
|
|
return app
|
|
|
|
|
|
def main() -> None:
|
|
config = load_config()
|
|
setup_logging(config["log_level"])
|
|
|
|
logger = logging.getLogger(__name__)
|
|
logger.info(f"Starting Solana RPC Proxy on port {config['proxy_port']}")
|
|
logger.info(f"Cache size limit: {config['cache_size_gb']}GB")
|
|
logger.info(f"Provider backoff time: {config['backoff_minutes']} minutes")
|
|
|
|
app = create_app(config)
|
|
|
|
web.run_app(
|
|
app,
|
|
host='0.0.0.0',
|
|
port=config["proxy_port"]
|
|
)
|
|
|
|
|
|
if __name__ == "__main__":
|
|
main()
|