rpc-websocketserver
Version:
Simple rpc websocket server, wrapping the very popular 'ws' library. Register your RPCs with convenient decorators.
99 lines • 4.04 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.validateParams = exports.validateMethod = exports.validateAndParseMessage = exports.assertValidRequest = exports.assertStringOrBuffer = void 0;
/**
* Assertion to ensure value to be string or Buffer
*
* @param val {*} - value to be asserted on
* @param Err {ErrorType} - Error to be thrown if assertion fails
*/
function assertStringOrBuffer(val, Err) {
if (!Buffer.isBuffer(val) && typeof val !== 'string')
throw new Err("Message must be of type 'string' or 'Buffer'");
}
exports.assertStringOrBuffer = assertStringOrBuffer;
/**
* Assertion to ensure value is a valid rpc request object
*
* @param val {*} - value to be asserted on
* @param Err {ErrorType} - Error to be thrown if assertion fails
*/
function assertValidRequest(val, Err) {
if (typeof (val === null || val === void 0 ? void 0 : val.method) !== 'string')
throw new Err("Request must include prop 'method' with value of type 'string'");
if (val.hasOwnProperty('params')) {
if (!Array.isArray(val.params) && typeof val.params !== 'object')
throw new Err("Params must be one of 'object' or 'array'");
}
}
exports.assertValidRequest = assertValidRequest;
/**
* Validates and parses a message. Will throw error if parse/validation fails.
*
* @param message {*} - message to be parsed and validated
* @param Err {ErrorType} - Error to be thrown if parse/validation fails
* @returns {object} - parsed message
*/
function validateAndParseMessage(message, Err) {
assertStringOrBuffer(message, Err);
try {
var m = Buffer.isBuffer(message) ? message.toString('utf8') : message;
return JSON.parse(m);
}
catch (err) {
throw new Err(err.message);
}
}
exports.validateAndParseMessage = validateAndParseMessage;
/**
* Validates method for existence
*
* @param methodName {string} - method to be found
* @param registeredMethods - registered method pool to find method in
* @param Err - Error to be thrown if method could not be found
* @returns {Method}
*/
function validateMethod(methodName, registeredMethods, Err) {
var method = registeredMethods.get(methodName);
if (!method)
throw new Err("Method with name '" + methodName + "' could not be found.");
return method;
}
exports.validateMethod = validateMethod;
/**
* Validates params for correctness
*
* @param providedParams {Params | MethodArgs | undefined} - params provided by client
* @param expectedParams {Params} - expected params of registered method
* @param Err {ErrorType} - Error to be thrown if params are incorrect
* @returns {MethodArgs} - args to be passed to function
*/
function validateParams(providedParams, expectedParams, Err) {
var expectedParamsKeys = Object.keys(expectedParams);
var providedParamsKeys = [];
var providedParamsLength = 0;
if (Array.isArray(providedParams)) {
providedParamsLength = providedParams.length;
}
else if (typeof providedParams === 'object') {
providedParamsKeys = Object.keys(providedParams);
providedParamsLength = providedParamsKeys.length;
}
if (providedParamsLength !== expectedParamsKeys.length)
throw new Err("Expected " + expectedParamsKeys.length + " params. Received " + providedParamsLength + ".");
var methodArgs = [];
if (Array.isArray(providedParams)) {
methodArgs = providedParams;
}
else if (typeof providedParams === 'object') {
for (var i = 0; i < expectedParamsKeys.length; i++) {
if (!providedParams.hasOwnProperty(expectedParamsKeys[i])) {
throw new Err("Params must include '" + expectedParamsKeys[i] + "'");
}
methodArgs.push(providedParams[expectedParamsKeys[i]]);
}
}
return methodArgs;
}
exports.validateParams = validateParams;
//# sourceMappingURL=utils.js.map