Add heartbeat option to keep connection alive (#63)
This commit is contained in:
+23
-1
@@ -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)
|
||||||
|
|||||||
Reference in New Issue
Block a user