def __init__(self, page_cls): self.flask = flask.Flask(__name__) self.page_cls = page_cls self.publisher = Publisher() self.context_by_pageid = {} self.user_by_id = {} self.page_by_id = {} self.world = _Channel(self.publisher, 'world') @self.flask.route('/sse.js') def server_sse(): return flask.Response(open('sse.js').read(), content_type='application/javascript') @self.flask.route('/sse/subscribe/<pageid>') def subscribe(pageid): context = self.context_by_pageid[pageid] response = flask.Response(context.subscription, content_type='text/event-stream') return response @self.flask.route('/call/<method_name>', methods=['POST']) def action(method_name): pageid = flask.request.form['pageid'] page = self.page_by_id[pageid] params = [value for key, value in sorted(flask.request.form.items()) if key != 'pageid'] method = getattr(page, method_name) return method(*params) or '' @self.flask.route('/') @self.flask.route('/<resource>') def root(resource='/'): pageid = str(uuid4()) page = self._get_page(pageid) response = flask.make_response(str(page)) response.set_cookie('pageid', pageid) if flask.request.cookies.get('userid') is None: response.set_cookie('userid', self._get_user_channel().id) return response
def test_multiple(self): p = Publisher() s1 = p.subscribe() s2 = p.subscribe() s3 = p.subscribe() p.publish('test') p.close() self.assertEqual(self.read(s1), 'data: test') self.assertEqual(self.read(s2), 'data: test') self.assertEqual(self.read(s3), 'data: test')
def test_initial_data(self): p = Publisher() s = p.subscribe(initial_data=['start 1', 'start 2']) p.publish('test') p.close() self.assertEqual(self.read(s), 'data: start 1\n\n' 'data: start 2\n\n' 'data: test')
def test_channel(self): p = Publisher() s1 = p.subscribe('channel 1') s2 = p.subscribe('channel 2') s3 = p.subscribe(['channel 1', 'channel 2']) p.publish('test1', 'channel 1') p.publish('test2', 'channel 2') p.close() self.assertEqual(self.read(s1), 'data: test1') self.assertEqual(self.read(s2), 'data: test2') self.assertEqual(self.read(s3), 'data: test1\n\ndata: test2')
def test_custom(self): p = Publisher() s1 = p.subscribe(properties=1) s2 = p.subscribe(properties=2) p.publish(lambda properties: properties) p.close() self.assertEqual(self.read(s1), 'data: 1') self.assertEqual(self.read(s2), 'data: 2')
class App(object): def __init__(self, page_cls): self.flask = flask.Flask(__name__) self.page_cls = page_cls self.publisher = Publisher() self.context_by_pageid = {} self.user_by_id = {} self.page_by_id = {} self.world = _Channel(self.publisher, 'world') @self.flask.route('/sse.js') def server_sse(): return flask.Response(open('sse.js').read(), content_type='application/javascript') @self.flask.route('/sse/subscribe/<pageid>') def subscribe(pageid): context = self.context_by_pageid[pageid] response = flask.Response(context.subscription, content_type='text/event-stream') return response @self.flask.route('/call/<method_name>', methods=['POST']) def action(method_name): pageid = flask.request.form['pageid'] page = self.page_by_id[pageid] params = [value for key, value in sorted(flask.request.form.items()) if key != 'pageid'] method = getattr(page, method_name) return method(*params) or '' @self.flask.route('/') @self.flask.route('/<resource>') def root(resource='/'): pageid = str(uuid4()) page = self._get_page(pageid) response = flask.make_response(str(page)) response.set_cookie('pageid', pageid) if flask.request.cookies.get('userid') is None: response.set_cookie('userid', self._get_user_channel().id) return response def serve(self, public=False, debug=True, ssl_context=None): if public: bind = '0.0.0.0' if ssl_context: from flask_sslify import SSLify port = 443 SSLify(self.flask, permanent=True) else: port = 80 else: bind = '127.0.0.1' port = 8080 self.flask.run(debug=debug, host=bind, threaded=True, port=port, ssl_context=ssl_context) def _get_user_channel(self): userid = flask.request.cookies.get('userid') or str(uuid4()) try: return self.user_by_id[userid] except KeyError: user = _Channel(self.publisher, userid) user.id = userid self.user_by_id[userid] = user return user def _get_page(self, pageid): try: return self.context_by_pageid[pageid] except KeyError: page_channel = _Channel(self.publisher, pageid) user_channel = self._get_user_channel() world_channel = self.world channel_names = ['world', user_channel.id, pageid] subscription = self.publisher.subscribe(channel_names) context = _Context(page_channel, user_channel, world_channel, subscription) page = self.page_cls(context) self.context_by_pageid[pageid] = context self.page_by_id[pageid] = page return page
import flask import pprint import string import socket import threading from pathlib import Path from config import Config from flask import render_template import voice from sse import Publisher from makedirs import MakeDirs publisher = Publisher() _threadFacebook = None _threadTwitch = None _threadYoutube = None _threadDouyu = None _now_timestamp = int(time.time()) _now_array = time.localtime(_now_timestamp) _now_day_string = time.strftime("%Y-%m-%d", _now_array) # ============================== # Flask Route # ============================== app = flask.Flask(__name__)
def test_single(self): p = Publisher() s = p.subscribe() p.publish('test') p.close() self.assertEqual(self.read(s), 'data: test')
def test_multiline(self): p = Publisher() s = p.subscribe() p.publish('line 1\nline 2') p.close() self.assertEqual(self.read(s), 'data: line 1\ndata: line 2')