Files
reflector/server/client.py
2023-07-27 14:08:41 +02:00

76 lines
2.0 KiB
Python

import argparse
import asyncio
import signal
from aiortc.contrib.signaling import add_signaling_arguments, create_signaling
from utils.log_utils import LOGGER
from stream_client import StreamClient
from typing import NoReturn
async def main() -> NoReturn:
"""
Reflector's entry point to the python client for WebRTC streaming if not
using the browser based UI-application
:return:
"""
parser = argparse.ArgumentParser(description="Data channels ping/pong")
parser.add_argument(
"--url", type=str, nargs="?", default="http://0.0.0.0:1250/offer"
)
parser.add_argument(
"--ping-pong",
help="Benchmark data channel with ping pong",
type=eval,
choices=[True, False],
default="False",
)
parser.add_argument(
"--play-from",
type=str,
default="",
)
add_signaling_arguments(parser)
args = parser.parse_args()
signaling = create_signaling(args)
async def shutdown(signal, loop):
"""Cleanup tasks tied to the service's shutdown."""
LOGGER.info(f"Received exit signal {signal.name}...")
LOGGER.info("Closing database connections")
LOGGER.info("Nacking outstanding messages")
tasks = [t for t in asyncio.all_tasks() if t is not asyncio.current_task()]
[task.cancel() for task in tasks]
LOGGER.info(f"Cancelling {len(tasks)} outstanding tasks")
await asyncio.gather(*tasks, return_exceptions=True)
LOGGER.info(f'{"Flushing metrics"}')
loop.stop()
signals = (signal.SIGHUP, signal.SIGTERM, signal.SIGINT)
loop = asyncio.get_event_loop()
for s in signals:
loop.add_signal_handler(s, lambda s=s: asyncio.create_task(shutdown(s, loop)))
# Init client
sc = StreamClient(
signaling=signaling,
url=args.url,
play_from=args.play_from,
ping_pong=args.ping_pong,
)
await sc.start()
async for msg in sc.get_reader():
print(msg)
if __name__ == "__main__":
asyncio.run(main())