예제 #1
0
파일: routes.py 프로젝트: camuschat/camus
async def room_ws(room_id):
    # Verify that the room exists
    Room.query.filter_by(slug=room_id).first_or_404()

    # Verify the client using a secure cookie
    client = Client.query.filter_by(uuid=session.get('id', None)).first()
    if client:
        logging.info(f'Accepted websocket connection for client {client.uuid}')
        await websocket.accept()
    else:
        return 'Forbidden', 403

    inbox, outbox = message_handler.inbox, message_handler.outbox

    send_task = asyncio.create_task(
        copy_current_websocket_context(ws_send)(outbox[client.uuid]), )
    receive_task = asyncio.create_task(
        copy_current_websocket_context(ws_receive)(client.uuid, inbox), )
    try:
        await asyncio.gather(send_task, receive_task)
    finally:
        logging.info(
            f'Terminating websocket connection for client {client.uuid}')
        send_task.cancel()
        receive_task.cancel()
예제 #2
0
async def ws():
    if args.verbosity > 1: print(f'{OV}entered ws(){OM}')
    await broadcast('{"Type":"System","Data":"Someone connected"}')
    # await broadcast(b'{"Type":"System","Data":"This is a byte string yo!"}')
    consumer_task = asyncio.ensure_future( # copy websocket to consumer()
        copy_current_websocket_context(consumer)(),
    )
    producer_task = asyncio.ensure_future( # copy websocket to producer()
        copy_current_websocket_context(producer)(),
    )
    try:
        result = await asyncio.gather(consumer_task, producer_task)
        if args.verbosity > 1: print(f'{OV}result is {OR}{result}{OM}')
    finally:
        consumer_task.cancel()
        producer_task.cancel()
예제 #3
0
async def chat_room_ws(room_id):
    manager = chat.get_chat_manager()
    room = manager.get_room(room_id)

    if room is None:
        return  # close the websocket

    client = manager.create_client()
    room.add_client(client)

    send_task = asyncio.create_task(
        copy_current_websocket_context(ws_send)(client.outbox), )
    receive_task = asyncio.create_task(
        copy_current_websocket_context(ws_receive)(client.inbox), )
    try:
        await asyncio.gather(send_task, receive_task)
    finally:
        send_task.cancel()
        receive_task.cancel()
예제 #4
0
async def channel_feed_websocket():
    obj = websocket._get_current_object()

    feeds.add(obj)

    consumer = asyncio.ensure_future(
        copy_current_websocket_context(receiving)(), )
    try:
        await asyncio.gather(consumer)
    finally:
        consumer.cancel()
        feeds.remove(obj)
예제 #5
0
async def ws(room_id):
    obj = websocket._get_current_object()

    # Put connection in a dict
    connections[obj] = room_id

    room = create_room(room_id)

    await room.new_member(obj)

    # Tie sending loop to the connection
    consumer = asyncio.ensure_future(
        copy_current_websocket_context(receiving)(), )
    try:
        await asyncio.gather(consumer)
    finally:
        consumer.cancel()
        room.member_leave(obj)
예제 #6
0
파일: state.py 프로젝트: agoose77/pysam
 def wrapper(*args, **kwargs):
     coro = copy_current_websocket_context(coro_fun)(*args, **kwargs)
     asyncio.ensure_future(coro)