'building a asynchronous websocket iterator

I have a class i created thats a websocket and it connects to my data endpoint with no issues. However, I wanted my socket to run forever. I am using the websockets python library. Heres a sample:

from websockets import connect


class Socket(metaclass=ABCMeta):
def __init__(self, url: str):
    self.url = url

async def __aenter__(self):
    self._conn = connect(self.url, ping_interval=None)
    self.websocket = await self._conn.__aenter__()
    return self

async def __aexit__(self, *args, **kwargs):
    await self._conn.__aexit__(*args, **kwargs)

Now, i am able to write async with statement with no problems. My issue arises when i want my socket to remain connected.

reading in the library, it seems one suggested way is to do the following:

async for socket in websockets.connect(", ping_interval=None):
    try:
         your logic
    except websockets.closedConnection as e:
        continue

This allows me to keep trying to connect if there is an issue. How would i incorporate this into my class as an iterator? I tried the following but getting error:

 TypeError: 'async for' received an object from __aiter__ that does not implement __anext__: coroutine

After i added the following code in the above class:

async def __aiter__(self):
    return self

async def __anext__(self):
    async for websocket in connect(self.url, ping_interval=None):
        try:
            self.websocket = await websocket
        except StopIteration:
            raise StopAsyncIteration

I am not posting my entire code here as the goal is to encapsulate a class around this socket class i created with the goal being

async for object in MyCustomClassSocketIterator(url):
    try:
     await object.send()
     await object.receive()
    except websockets.closedConnection as e:
etc....

where the encapsulated class has implemented receive() and send() functions. So each time program starts, object is instantiated asynchronously. If anything breaks...then it attemps to connect again if there is a socket.closedConnection. Thanks



Sources

This article follows the attribution requirements of Stack Overflow and is licensed under CC BY-SA 3.0.

Source: Stack Overflow

Solution Source