class MSApi: def __init__( self, monitoring_service: MonitoringService, operator: str, info_message: str = DEFAULT_INFO_MESSAGE, ) -> None: flask_app = Flask(__name__) self.api = ApiWithErrorHandler(flask_app) # Add the metrics prometheus app self.flask_app = DispatcherMiddleware( NotFound(), { "/metrics": make_wsgi_app(registry=metrics.REGISTRY), API_PATH: flask_app.wsgi_app, }, ) self.rest_server: Optional[WSGIServer] = None self.monitoring_service = monitoring_service self.operator = operator self.info_message = info_message resources: List[Tuple[str, Resource, str]] = [ ("/v1/info", cast(Resource, InfoResource), "info"), ("/v2/info", cast(Resource, InfoResource2), "info2"), ] for endpoint_url, resource, endpoint in resources: self.api.add_resource( resource, endpoint_url, resource_class_kwargs={ "monitoring_service": monitoring_service, "api": self }, endpoint=endpoint, ) def run(self, host: str, port: int) -> None: self.rest_server = WSGIServer((host, port), self.flask_app) self.rest_server.start() log.info("Running endpoint", endpoint=f"http://{host}:{port}") def stop(self) -> None: if self.rest_server: self.rest_server.stop()
def __init__( self, pathfinding_service: PathfindingService, one_to_n_address: Address, operator: str, info_message: str = DEFAULT_INFO_MESSAGE, service_fee: TokenAmount = TokenAmount(0), debug_mode: bool = False, enable_tracing: bool = False, ) -> None: flask_app = Flask(__name__) if enable_tracing: FlaskTracing(opentracing.tracer, trace_all_requests=True, app=flask_app) self.flask_app = DispatcherMiddleware( NotFound(), { "/metrics": make_wsgi_app(registry=metrics.REGISTRY), API_PATH: flask_app.wsgi_app, }, ) self.api = ApiWithErrorHandler(flask_app) self.rest_server: Optional[WSGIServer] = None self.one_to_n_address = one_to_n_address self.pathfinding_service = pathfinding_service self.service_fee = service_fee self.operator = operator self.info_message = info_message # Enable cross origin requests @flask_app.after_request def after_request(response: Response) -> Response: # pylint: disable=unused-variable response.headers.add("Access-Control-Allow-Origin", "*") response.headers.add("Access-Control-Allow-Headers", "Origin, Content-Type, Accept") response.headers.add("Access-Control-Allow-Methods", "GET,POST,OPTIONS") return response resources: List[Tuple[str, Resource, Dict, str]] = [ ( "/v1/<token_network_address>/paths", PathsResource, dict(debug_mode=debug_mode), "paths", ), ("/v1/<token_network_address>/payment/iou", IOUResource, {}, "payments"), ("/v1/<token_network_address>/feedback", FeedbackResource, {}, "feedback"), ( "/v1/<token_network_address>/suggest_partner", SuggestPartnerResource, {}, "suggest_partner", ), ("/v1/online_addresses", OnlineAddressesResource, {}, "online_addresses"), ("/v1/info", InfoResource, {}, "info"), ("/v2/info", InfoResource2, {}, "info2"), ( "/v1/address/<checksummed_address>/metadata", AddressMetadataResource, {}, "address_metadata", ), ] if debug_mode: log.warning("The debug REST API is enabled. Don't do this on public nodes.") resources.extend( [ ( "/v1/_debug/routes/<token_network_address>/<source_address>", cast(Resource, DebugPathResource), {}, "debug1", ), ( "/v1/_debug/routes/<token_network_address>/<source_address>/<target_address>", # noqa DebugPathResource, {}, "debug2", ), ("/v1/_debug/ious/<source_address>", DebugIOUResource, {}, "debug3"), ("/v1/_debug/stats", DebugStatsResource, {}, "debug4"), ] ) for endpoint_url, resource, kwargs, endpoint in resources: kwargs.update({"pathfinding_service": pathfinding_service, "api": self}) self.api.add_resource( resource, endpoint_url, resource_class_kwargs=kwargs, endpoint=f"rest-{endpoint}" )