"""
sse of Lin
~~~~~~~~~
sse 实现类
:copyright: © 2020 by the Lin team.
:license: MIT, see LICENSE for more details.
"""
import json
from collections import deque
class Sse(object):
messages = deque()
_retry = None
def __init__(self, default_retry=2000):
self._buffer = []
self._default_id = 1
self.set_retry(default_retry)
def set_retry(self, num):
self._retry = num
self._buffer.append("retry: {0}\n".format(self._retry))
def set_event_id(self, event_id=None):
if event_id:
self._default_id = event_id
self._buffer.append("id: {0}\n".format(event_id))
else:
self._buffer.append("id: {0}\n".format(self._default_id))
def reset_event_id(self):
self.set_event_id(1)
def increase_id(self):
self._default_id += 1
def add_message(self, event, obj, flush=True):
self.set_event_id()
self._buffer.append("event: {0}\n".format(event))
line = json.dumps(obj, ensure_ascii=False)
self._buffer.append("data: {0}\n".format(line))
self._buffer.append("\n")
if flush:
self.flush()
def flush(self):
self.messages.append(self.join_buffer())
self._buffer.clear()
self.increase_id()
def pop(self):
return self.messages.popleft()
def heartbeat(self, comment=None):
if comment and type(comment) == "str":
self._buffer.append(comment)
else:
self._buffer.append(": sse sever is still alive \n\n")
tmp = self.join_buffer()
self._buffer.clear()
return tmp
def join_buffer(self):
string = ""
for it in self._buffer:
string += it
return string
def exit_message(self):
return len(self.messages) > 0
sser = Sse()