More robust Pushbullet reconnection logic

This commit is contained in:
Fabio Manganiello 2018-12-24 12:31:38 +01:00
parent b911d46315
commit ef241b3769
2 changed files with 25 additions and 19 deletions

View File

@ -5,7 +5,7 @@ import time
import websockets
from platypush.config import Config
from platypush.context import create_event_loop
from platypush.context import get_or_create_event_loop
from platypush.message import Message
from platypush.message.event.pushbullet import PushbulletEvent
@ -31,6 +31,9 @@ class PushbulletBackend(Backend):
* **websockets** (``pip install websockets``)
"""
_PUSHBULLET_WS_URL = 'wss://stream.pushbullet.com/websocket/'
_WS_PING_INTERVAL = 10
def __init__(self, token, device='Platypush', **kwargs):
"""
:param token: Your Pushbullet API token, see https://docs.pushbullet.com/#authentication
@ -133,29 +136,37 @@ class PushbulletBackend(Backend):
def on_error(self, ws, e):
self.logger.exception(e)
self.logger.info('Restarting PushBullet backend')
ws.close()
self._init_socket()
def _init_socket(self):
async def pushbullet_client():
async with websockets.connect('wss://stream.pushbullet.com/websocket/'
+ self.token) as self.ws:
while True:
try:
push = await self.ws.recv()
except Exception as e:
self.on_error(self.ws, e)
break
while True:
try:
self.logger.info('Connecting to Pushbullet websocket URL {}'
.format(self._PUSHBULLET_WS_URL))
self.on_push(self.ws, push)
async with websockets.connect(self._PUSHBULLET_WS_URL +
self.token) as self.ws:
self.logger.info('Connection to Pushbullet successful')
while True:
try:
push = await self.ws.recv()
except Exception as e:
self.logger.exception(e)
break
self.on_push(self.ws, push)
except Exception as e:
self.logger.exception(e)
self.close()
loop = None
loop = create_event_loop()
loop = get_or_create_event_loop()
loop.run_until_complete(pushbullet_client())
loop.run_forever()
def create_device(self, name):
return requests.post(
u'https://api.pushbullet.com/v2/devices',

View File

@ -114,11 +114,6 @@ def register_plugin(name, plugin, **kwargs):
""" Registers a plugin instance by name """
global plugins
def create_event_loop():
loop = asyncio.new_event_loop()
asyncio.set_event_loop(loop)
return loop
def get_or_create_event_loop():
try:
loop = asyncio.get_event_loop()