示例#1
0
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)
示例#2
0
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)
示例#3
0
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)
示例#4
0
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)