UNPKG

@iprokit/service

Version:

Powering distributed systems with simplicity and speed.

154 lines 4.23 kB
"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&param2` */ static PARAMETERS_DELIMITER = '&'; /** * Delimiter for a key-value pair, denoted by `=`. * * @example `key=value` */ static PARAMETER_DELIMITER = '='; } exports.default = RFI; //# sourceMappingURL=rfi.js.map