From 123f4442d19fcf02b034566fe43d008fbef4ee7f Mon Sep 17 00:00:00 2001 From: Marcin Kaluza Date: Sun, 14 Oct 2018 21:26:31 +0200 Subject: [PATCH 1/3] allow subscribing using patterns --- ws4redis/subscriber.py | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/ws4redis/subscriber.py b/ws4redis/subscriber.py index ffaed00e..c7f3d4a8 100644 --- a/ws4redis/subscriber.py +++ b/ws4redis/subscriber.py @@ -46,7 +46,10 @@ def set_pubsub_channels(self, request, channels): } self._subscription = self._connection.pubsub() for key in self._get_message_channels(request=request, facility=facility, **audience): - self._subscription.subscribe(key) + if '*' in key: + self._subscription.psubscribe(key) + else: + self._subscription.subscribe(key) def send_persisted_messages(self, websocket): """ From 8502ebaa20e40036cc09d1b366f1bc5984eb8ab0 Mon Sep 17 00:00:00 2001 From: Marcin Kaluza Date: Mon, 22 Oct 2018 15:29:20 +0200 Subject: [PATCH 2/3] properly parse pattern matched messages --- ws4redis/redis_store.py | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/ws4redis/redis_store.py b/ws4redis/redis_store.py index 5cde46fa..4b2114a1 100644 --- a/ws4redis/redis_store.py +++ b/ws4redis/redis_store.py @@ -76,6 +76,8 @@ def __new__(cls, value): elif isinstance(value, list): if len(value) >= 2 and value[0] == b'message': return super(RedisMessage, cls).__new__(cls, value[2]) + if len(value) >= 3 and value[0] == b'pmessage': + return super(RedisMessage, cls).__new__(cls, value[3]) else: if isinstance(value, (six.string_types, bytearray)): if value != settings.WS4REDIS_HEARTBEAT: @@ -83,6 +85,8 @@ def __new__(cls, value): elif isinstance(value, list): if len(value) >= 2 and value[0] == 'message': return six.binary_type.__new__(cls, value[2]) + elif len(value) >= 3 and value[0] == 'pmessage': + return six.binary_type.__new__(cls, value[3]) return None From f6446c327d77c45dd04373907e84533dd3e2b87e Mon Sep 17 00:00:00 2001 From: Marcin Kaluza Date: Wed, 7 Nov 2018 14:02:22 +0100 Subject: [PATCH 3/3] include channel name in pattern matched messages --- ws4redis/redis_store.py | 12 ++++++++++-- 1 file changed, 10 insertions(+), 2 deletions(-) diff --git a/ws4redis/redis_store.py b/ws4redis/redis_store.py index 4b2114a1..584b9af7 100644 --- a/ws4redis/redis_store.py +++ b/ws4redis/redis_store.py @@ -77,7 +77,11 @@ def __new__(cls, value): if len(value) >= 2 and value[0] == b'message': return super(RedisMessage, cls).__new__(cls, value[2]) if len(value) >= 3 and value[0] == b'pmessage': - return super(RedisMessage, cls).__new__(cls, value[3]) + if settings.WS4REDIS_PREFIX: + channel = ":".join(value[2].split(":")[2:]) + else: + channel = value[2][value[2].index(":")+1:] + return super(RedisMessage, cls).__new__(cls, json.dumps({channel: value[3]})) else: if isinstance(value, (six.string_types, bytearray)): if value != settings.WS4REDIS_HEARTBEAT: @@ -86,7 +90,11 @@ def __new__(cls, value): if len(value) >= 2 and value[0] == 'message': return six.binary_type.__new__(cls, value[2]) elif len(value) >= 3 and value[0] == 'pmessage': - return six.binary_type.__new__(cls, value[3]) + if settings.WS4REDIS_PREFIX: + channel = ":".join(value[2].split(":")[2:]) + else: + channel = value[2][value[2].index(":")+1:] + return six.binary_type.__new__(cls, json.dumps({channel: value[3]})) return None