@iprokit/service
Version:
Powering distributed systems with simplicity and speed.
154 lines • 4.23 kB
JavaScript
"use strict";
/**
* @iProKit/Service
* Copyright (c) 2019-2025 Rutvik Katuri / iProTechs
* SPDX-License-Identifier: Apache-2.0
*/
Object.defineProperty(exports, "__esModule", { value: true });
/**
* `RFI` stands for Remote Function Identifier.
* It is represented as a case-sensitive string.
*
* Example: `SYNC:Hero.get#ONE=A&TWO=B`
*
* An RFI consists of a mode, operation, and parameters:
* - Mode: `SYNC`
* - Operation: `Hero.get`
* - Parameters: `ONE=A&TWO=B`
*/
class RFI {
mode;
operation;
parameters;
/**
* Creates an instance of `RFI`.
*
* @param mode mode of the remote function.
* @param operation operation of the remote function.
* @param parameters optional parameters of the remote function.
*/
constructor(mode, operation, parameters) {
this.mode = mode;
this.operation = operation;
this.parameters = parameters ?? {};
}
//////////////////////////////
//////// Gets/Sets
//////////////////////////////
/**
* Gets a parameter value.
*
* @param key parameter key.
*/
get(key) {
return this.parameters[key];
}
/**
* Returns `true` if the parameter exists, `false` otherwise.
*
* @param key parameter key.
*/
has(key) {
return key in this.parameters;
}
/**
* Sets a parameter.
*
* @param key parameter key.
* @param value parameter value.
*/
set(key, value) {
this.parameters[key] = value;
return this;
}
/**
* Removes a parameter.
*
* @param key parameter key.
*/
delete(key) {
delete this.parameters[key];
return this;
}
/**
* Returns an array of parameter keys.
*/
keys() {
return Object.keys(this.parameters);
}
/**
* Returns an array of parameter values.
*/
values() {
return Object.values(this.parameters);
}
/**
* Returns an array of key-value pairs of parameters.
*/
entries() {
return Object.entries(this.parameters);
}
/**
* Returns the number of parameters.
*/
get size() {
return this.keys().length;
}
//////////////////////////////
//////// To/From Helpers
//////////////////////////////
/**
* Returns the stringified version of the `RFI`.
*/
stringify() {
// Combine parameters as a string.
const _parameters = this.entries()
.map(([key, value]) => key + RFI.PARAMETER_DELIMITER + value)
.join(RFI.PARAMETERS_DELIMITER);
const parameters = _parameters ? RFI.OPERATION_DELIMITER + _parameters : '';
// Return the combined mode, operation, and parameters as a string.
return this.mode + RFI.MODE_DELIMITER + this.operation + parameters;
}
/**
* Returns the objectified version of an `RFI`.
*
* @param rfi stringified version of an `RFI`.
*/
static objectify(rfi) {
// Deconstruct mode, operation, and parameters from the string.
const [mode, _rfi] = rfi.split(RFI.MODE_DELIMITER);
const [operation, _parameters] = _rfi.split(RFI.OPERATION_DELIMITER);
const parameters = _parameters ? Object.fromEntries(_parameters.split(RFI.PARAMETERS_DELIMITER).map((parameter) => parameter.split(RFI.PARAMETER_DELIMITER))) : {};
// Return a new RFI as an object.
return new RFI(mode, operation, parameters);
}
//////////////////////////////
//////// Delimiter Definitions
//////////////////////////////
/**
* Delimiter for mode, denoted by `:`.
*
* @example `mode:operation`
*/
static MODE_DELIMITER = ':';
/**
* Delimiter for operation, denoted by `#`.
*
* @example `operation#parameters`
*/
static OPERATION_DELIMITER = '#';
/**
* Delimiter for parameters, denoted by `&`.
*
* @example `param1¶m2`
*/
static PARAMETERS_DELIMITER = '&';
/**
* Delimiter for a key-value pair, denoted by `=`.
*
* @example `key=value`
*/
static PARAMETER_DELIMITER = '=';
}
exports.default = RFI;
//# sourceMappingURL=rfi.js.map