Add heartbeat option to keep connection alive (#63)

This commit is contained in:
arthur-a
2018-07-09 14:20:47 +03:00
committed by Sergey Petrov
parent 6159383a81
commit 1f9f7a9dbc
+23 -1
View File
@@ -1,7 +1,10 @@
import collections import collections
import json import json
import logging import logging
import time
import weakref
from enum import Enum from enum import Enum
from threading import Thread
from .errors import ConnectionFailed, exception_class_for_reason from .errors import ConnectionFailed, exception_class_for_reason
@@ -33,13 +36,16 @@ class APNsClient(object):
ALTERNATIVE_PORT = 2197 ALTERNATIVE_PORT = 2197
def __init__(self, credentials, use_sandbox=False, use_alternative_port=False, proto=None, json_encoder=None, def __init__(self, credentials, use_sandbox=False, use_alternative_port=False, proto=None, json_encoder=None,
password=None, proxy_host=None, proxy_port=None): password=None, proxy_host=None, proxy_port=None, heartbeat_period=None):
if credentials is None or isinstance(credentials, str): if credentials is None or isinstance(credentials, str):
self.__credentials = CertificateCredentials(credentials, password) self.__credentials = CertificateCredentials(credentials, password)
else: else:
self.__credentials = credentials self.__credentials = credentials
self._init_connection(use_sandbox, use_alternative_port, proto, proxy_host, proxy_port) self._init_connection(use_sandbox, use_alternative_port, proto, proxy_host, proxy_port)
if heartbeat_period:
self._start_heartbeat(heartbeat_period)
self.__json_encoder = json_encoder self.__json_encoder = json_encoder
self.__max_concurrent_streams = None self.__max_concurrent_streams = None
self.__previous_server_max_concurrent_streams = None self.__previous_server_max_concurrent_streams = None
@@ -49,6 +55,22 @@ class APNsClient(object):
port = self.ALTERNATIVE_PORT if use_alternative_port else self.DEFAULT_PORT port = self.ALTERNATIVE_PORT if use_alternative_port else self.DEFAULT_PORT
self._connection = self.__credentials.create_connection(server, port, proto, proxy_host, proxy_port) self._connection = self.__credentials.create_connection(server, port, proto, proxy_host, proxy_port)
def _start_heartbeat(self, heartbeat_period):
conn_ref = weakref.ref(self._connection)
def watchdog():
while True:
conn = conn_ref()
if conn is None:
break
conn.ping('-' * 8)
time.sleep(heartbeat_period)
thread = Thread(target=watchdog)
thread.setDaemon(True)
thread.start()
def send_notification(self, token_hex, notification, topic=None, priority=NotificationPriority.Immediate, def send_notification(self, token_hex, notification, topic=None, priority=NotificationPriority.Immediate,
expiration=None, collapse_id=None): expiration=None, collapse_id=None):
stream_id = self.send_notification_async(token_hex, notification, topic, priority, expiration, collapse_id) stream_id = self.send_notification_async(token_hex, notification, topic, priority, expiration, collapse_id)