Skip to content

Commit c1a5e0a

Browse files
author
Munis İsazadə
committed
Update
1 parent 4a5cf37 commit c1a5e0a

File tree

4 files changed

+116
-2
lines changed

4 files changed

+116
-2
lines changed

.gitignore

+2-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@ __pycache__/
55

66
# C extensions
77
*.so
8-
8+
requirements.txt
99
# Distribution / packaging
1010
.Python
1111
build/
@@ -107,4 +107,4 @@ venv.bak/
107107
# Editors
108108
.code/
109109
.idea/
110-
.vscode/
110+
.vscode/

pubsub/__init__.py

+18
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,18 @@
1+
from base import BasePubSub
2+
from dotenv import load_dotenv
3+
4+
load_dotenv()
5+
6+
pub = BasePubSub("testing")
7+
8+
9+
def handler(data):
10+
a = data.get("a")
11+
c = a * 7
12+
print(c)
13+
return c
14+
15+
16+
pub.register("vurma", handler)
17+
18+
pub.listen()

pubsub/base.py

+86
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,86 @@
1+
import redis
2+
import os
3+
import time
4+
import base64
5+
import json
6+
7+
8+
class BasePubSub(object):
9+
"""
10+
Base publish–subscribe is a
11+
messaging pattern class
12+
"""
13+
14+
def __init__(self, channel_name):
15+
"""
16+
Initialize and subscribe channel
17+
"""
18+
self.rdb = redis.StrictRedis.from_url(os.getenv("REDIS_URI"))
19+
self.channel = channel_name
20+
self.pubsub = self.rdb.pubsub()
21+
self.pubsub.subscribe(channel_name)
22+
self.events = {}
23+
24+
def listen(self):
25+
print("Pubsub is listen...")
26+
while True:
27+
message = self.pubsub.get_message()
28+
if message:
29+
if message["type"] == "message":
30+
data = self.__convert_to_python(message["data"])
31+
event_name = data["event_name"]
32+
response_data = data["data"]
33+
self.event_handler(event_name, response_data)
34+
time.sleep(0.3)
35+
36+
def event_handler(self, event_name, data):
37+
if self.events.get(event_name, False):
38+
event = self.events.get(event_name)
39+
response = event(data)
40+
if response:
41+
self.__send_reponse({
42+
"event_name": event_name,
43+
"data": data
44+
})
45+
# self.
46+
47+
def __encode_base64(self, data):
48+
return base64.b64encode(json.dumps(data).encode("utf-8"))
49+
50+
def __convert_to_python(self, byte):
51+
if isinstance(byte, bytes):
52+
response = base64.b64decode(byte).decode("utf-8")
53+
return json.loads(response)
54+
elif isinstance(byte, int):
55+
return byte
56+
else:
57+
raise TypeError(
58+
f"a bytes-like object is required, not '{type(byte).__name__}'"
59+
)
60+
61+
def register(self, name, function):
62+
if callable(function):
63+
self.events[name] = function
64+
else:
65+
raise ValueError("Event function must be callable object")
66+
67+
def __send_reponse(self, data):
68+
decode = self.__encode_base64(data)
69+
self.rdb.publish(self.channel, decode)
70+
71+
def send(self, event_name, data):
72+
resp = {
73+
"event_name": event_name,
74+
"data": data
75+
}
76+
decode = self.__encode_base64(resp)
77+
self.rdb.publish(self.channel, decode)
78+
print("Send")
79+
80+
81+
f = {
82+
"event_name": "handler",
83+
"data": {
84+
"a": 21
85+
}
86+
}

pubsub/errors.py

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
2+
3+
class b(Exception):
4+
def __init__(self, message, errors):
5+
6+
# Call the base class constructor with the parameters it needs
7+
super().__init__(message)
8+
9+
# Now for your custom code...
10+
self.errors = errors

0 commit comments

Comments
 (0)