class VideoroomDataHandler(PluginDataHandler): __plugin__ = 'videoroom' __classmap__ = { cls.__id__: cls for cls in subclasses(VideoroomPluginData) if cls.__plugin__ in cls.__properties__ } __eventset__ = frozenset(cls.__event__ for cls in subclasses(VideoroomPluginData) if cls.__event__) @classmethod def decode(cls, data): try: data_type = data[cls.__plugin__] except KeyError: raise ProtocolError( 'could not get {!s} plugin data type from {!r}'.format( cls.__plugin__, data)) if data_type == 'event': common_keys = list(cls.__eventset__.intersection(data)) if len(common_keys) != 1: raise ProtocolError('unknown {!s} plugin event: {!r}'.format( cls.__plugin__, data)) event_type = common_keys[0] data_key = cls.__plugin__, data_type, event_type else: data_key = cls.__plugin__, data_type try: data_class = cls.__classmap__[data_key] except KeyError: raise ProtocolError('unknown {!s} plugin data: {!r}'.format( cls.__plugin__, data)) return data_class(**data)
class JanusMessage(object): __core_classmap__ = {cls.janus.value: cls for cls in subclasses(JanusCoreMessageBase) if 'janus' in cls.__properties__} __plugin_classmap__ = {cls.janus.value: cls for cls in subclasses(JanusPluginMessageBase) if 'janus' in cls.__properties__} __plugin_handlers__ = {handler.__plugin__: handler for handler in subclasses(PluginDataHandler)} @classmethod def from_payload(cls, payload): try: message_type = payload['janus'] except KeyError: raise ProtocolError('could not get Janus message type') if 'plugindata' in payload: try: message_class = cls.__plugin_classmap__[message_type] except KeyError: raise ProtocolError('unknown Janus message: {!s}'.format(message_type)) data_container = payload['plugindata'] try: plugin_name = data_container['plugin'].rpartition('.')[2] plugin_data = data_container['data'] except KeyError: raise ProtocolError('invalid plugin data: {!r}'.format(data_container)) try: data_handler = cls.__plugin_handlers__[plugin_name] except KeyError: raise ProtocolError('could not find a data handler for {!r}'.format(plugin_data)) data_container['data'] = data_handler.decode(plugin_data) else: try: message_class = cls.__core_classmap__[message_type] except KeyError: raise ProtocolError('unknown Janus message: {!s}'.format(message_type)) return message_class(**payload)
class SIPDataHandler(PluginDataHandler): __plugin__ = 'sip' __classmap__ = { cls.__id__: cls for cls in subclasses(SIPPluginData) if cls.__plugin__ in cls.__properties__ } @classmethod def decode(cls, data): try: sip = data[cls.__plugin__] if 'error' in data: data_key = cls.__plugin__, sip, 'error' elif 'result' in data: data_key = cls.__plugin__, sip, data['result']['event'] else: data_key = cls.__plugin__, sip except KeyError: raise ProtocolError( 'could not get {!s} plugin data type from {!r}'.format( cls.__plugin__, data)) try: data_class = cls.__classmap__[data_key] except KeyError: raise ProtocolError('unknown {!s} plugin data: {!r}'.format( cls.__plugin__, data)) return data_class(**data)
class SylkRTCRequest(object): __classmap__ = {cls.sylkrtc.value: cls for cls in subclasses(SylkRTCRequestBase) if hasattr(cls, 'sylkrtc')} @classmethod def from_message(cls, message): try: request_type = message['sylkrtc'] except KeyError: raise ProtocolError('could not get WebSocket message type') try: request_class = cls.__classmap__[request_type] except KeyError: raise ProtocolError('unknown WebSocket request: %s' % request_type) return request_class(**message)