2018-04-03 12:49:14 +00:00
|
|
|
# Copyright (C) 2018 Avatao.com Innovative Learning Kft.
|
|
|
|
# All Rights Reserved. See LICENSE file for details.
|
2018-04-13 18:20:00 +00:00
|
|
|
"""
|
|
|
|
TFW JSON message format
|
|
|
|
|
|
|
|
message:
|
|
|
|
{
|
|
|
|
"key": string, # addressing
|
|
|
|
"data": {...}, # payload
|
|
|
|
"trigger": string # FSM trigger
|
|
|
|
}
|
|
|
|
|
|
|
|
ZeroMQ's sub-pub sockets use enveloped messages
|
|
|
|
(http://zguide.zeromq.org/page:all#Pub-Sub-Message-Envelopes)
|
|
|
|
and TFW also uses them internally. This means that on ZMQ sockets
|
2018-04-16 10:50:08 +00:00
|
|
|
we always send the messages key separately and then the actual
|
2018-04-13 18:20:00 +00:00
|
|
|
message (which contains the key as well) like so:
|
|
|
|
|
|
|
|
socket.send_multipart([message['key'], message])
|
|
|
|
|
|
|
|
The purpose of this module is abstracting away this low level behaviour.
|
|
|
|
"""
|
2018-04-03 12:49:14 +00:00
|
|
|
|
2018-02-02 17:39:06 +00:00
|
|
|
import json
|
|
|
|
|
|
|
|
|
2018-04-13 18:56:28 +00:00
|
|
|
def validate_message(message):
|
2018-04-16 10:51:44 +00:00
|
|
|
return 'key' in message
|
2018-04-13 18:56:28 +00:00
|
|
|
|
|
|
|
|
2018-04-13 14:34:40 +00:00
|
|
|
def serialize_tfw_msg(message):
|
2018-04-13 18:29:02 +00:00
|
|
|
return _serialize_all(message['key'], message)
|
2018-04-13 14:34:40 +00:00
|
|
|
|
|
|
|
|
|
|
|
def deserialize_tfw_msg(*args):
|
2018-04-13 18:29:02 +00:00
|
|
|
return _deserialize_all(*args)[1]
|
2018-04-13 14:34:40 +00:00
|
|
|
|
|
|
|
|
2018-04-13 18:29:02 +00:00
|
|
|
def _serialize_all(*args):
|
2018-04-10 11:42:51 +00:00
|
|
|
return tuple(_serialize_single(arg) for arg in args)
|
|
|
|
|
|
|
|
|
2018-04-13 18:29:02 +00:00
|
|
|
def _deserialize_all(*args):
|
2018-04-10 11:42:51 +00:00
|
|
|
return tuple(_deserialize_single(arg) for arg in args)
|
|
|
|
|
|
|
|
|
|
|
|
def _serialize_single(data):
|
|
|
|
if not isinstance(data, str):
|
|
|
|
data = json.dumps(data)
|
2018-04-13 18:29:02 +00:00
|
|
|
return _encode_if_needed(data)
|
2018-04-10 11:42:51 +00:00
|
|
|
|
|
|
|
|
|
|
|
def _deserialize_single(data):
|
|
|
|
try:
|
|
|
|
return json.loads(data)
|
|
|
|
except ValueError:
|
2018-04-13 18:29:02 +00:00
|
|
|
return _decode_if_needed(data)
|
2018-04-10 11:42:51 +00:00
|
|
|
|
|
|
|
|
2018-04-13 18:29:02 +00:00
|
|
|
def _encode_if_needed(value):
|
2018-02-02 16:30:26 +00:00
|
|
|
if isinstance(value, str):
|
|
|
|
value = value.encode('utf-8')
|
|
|
|
return value
|
|
|
|
|
|
|
|
|
2018-04-13 18:29:02 +00:00
|
|
|
def _decode_if_needed(value):
|
2018-02-02 16:30:26 +00:00
|
|
|
if isinstance(value, (bytes, bytearray)):
|
|
|
|
value = value.decode('utf-8')
|
|
|
|
return value
|