openvidu/openvidu-browser/src/OpenViduInternal/KurentoUtils/kurento-jsonrpc/packers/JsonRPC.js

95 lines
2.2 KiB
JavaScript
Raw Normal View History

/**
* JsonRPC 2.0 packer
*/
/**
* Pack a JsonRPC 2.0 message
*
* @param {Object} message - object to be packaged. It requires to have all the
* fields needed by the JsonRPC 2.0 message that it's going to be generated
*
* @return {String} - the stringified JsonRPC 2.0 message
*/
2021-03-22 12:14:38 +01:00
function pack(message, id) {
var result = {
jsonrpc: "2.0"
};
// Request
2021-03-22 12:14:38 +01:00
if (message.method) {
result.method = message.method;
2021-03-22 12:14:38 +01:00
if (message.params)
result.params = message.params;
// Request is a notification
2021-03-22 12:14:38 +01:00
if (id != undefined)
result.id = id;
}
// Response
2021-03-22 12:14:38 +01:00
else if (id != undefined) {
if (message.error) {
if (message.result !== undefined)
throw new TypeError("Both result and error are defined");
result.error = message.error;
2021-03-22 12:14:38 +01:00
} else if (message.result !== undefined)
result.result = message.result;
else
throw new TypeError("No result or error is defined");
result.id = id;
};
return JSON.stringify(result);
};
/**
* Unpack a JsonRPC 2.0 message
*
* @param {String} message - string with the content of the JsonRPC 2.0 message
*
* @throws {TypeError} - Invalid JsonRPC version
*
* @return {Object} - object filled with the JsonRPC 2.0 message content
*/
2021-03-22 12:14:38 +01:00
function unpack(message) {
var result = message;
2021-03-22 12:14:38 +01:00
if (typeof message === 'string' || message instanceof String) {
result = JSON.parse(message);
}
// Check if it's a valid message
var version = result.jsonrpc;
2021-03-22 12:14:38 +01:00
if (version !== '2.0')
throw new TypeError("Invalid JsonRPC version '" + version + "': " + message);
// Response
2021-03-22 12:14:38 +01:00
if (result.method == undefined) {
if (result.id == undefined)
throw new TypeError("Invalid message: " + message);
var result_defined = result.result !== undefined;
2021-03-22 12:14:38 +01:00
var error_defined = result.error !== undefined;
// Check only result or error is defined, not both or none
2021-03-22 12:14:38 +01:00
if (result_defined && error_defined)
throw new TypeError("Both result and error are defined: " + message);
2021-03-22 12:14:38 +01:00
if (!result_defined && !error_defined)
throw new TypeError("No result or error is defined: " + message);
result.ack = result.id;
delete result.id;
}
// Return unpacked message
return result;
};
2021-03-22 12:14:38 +01:00
exports.pack = pack;
exports.unpack = unpack;