watchdog-grpc-sdk
Version: 
JavaScript/Node.js SDK for Watchdog gRPC Service
124 lines • 5.18 kB
JavaScript
;
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    var desc = Object.getOwnPropertyDescriptor(m, k);
    if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
      desc = { enumerable: true, get: function() { return m[k]; } };
    }
    Object.defineProperty(o, k2, desc);
}) : (function(o, m, k, k2) {
    if (k2 === undefined) k2 = k;
    o[k2] = m[k];
}));
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
    Object.defineProperty(o, "default", { enumerable: true, value: v });
}) : function(o, v) {
    o["default"] = v;
});
var __importStar = (this && this.__importStar) || function (mod) {
    if (mod && mod.__esModule) return mod;
    var result = {};
    if (mod != null) for (var k in mod) if (k !== "default" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);
    __setModuleDefault(result, mod);
    return result;
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.ProtobufTypes = exports.WatchdogClient = void 0;
const grpc = __importStar(require("@grpc/grpc-js"));
const watchdog_grpc_pb_1 = require("./generated/watchdog_grpc_pb");
const pb = __importStar(require("./generated/watchdog_pb"));
exports.ProtobufTypes = pb;
class WatchdogClient {
    constructor(options) {
        const { host, port, credentials = grpc.credentials.createInsecure(), timeout = 5000 } = options;
        const target = `${host}:${port}`;
        this.client = new watchdog_grpc_pb_1.WatchdogServiceClient(target, credentials);
        this.timeout = timeout;
    }
    /**
     * Generic method to call any gRPC service method dynamically
     */
    callMethod(methodName, requestClass, requestData, responseFields) {
        return new Promise((resolve, reject) => {
            const request = new requestClass();
            const metadata = new grpc.Metadata();
            // Dynamically set request fields
            Object.entries(requestData).forEach(([key, value]) => {
                if (value !== undefined && value !== null) {
                    const setterName = `set${key.charAt(0).toUpperCase() + key.slice(1)}`;
                    if (typeof request[setterName] === 'function') {
                        request[setterName](value);
                    }
                }
            });
            // Dynamically call the client method
            const clientMethod = this.client[methodName];
            if (typeof clientMethod !== 'function') {
                reject(new Error(`Method ${methodName} not found on client`));
                return;
            }
            clientMethod.call(this.client, request, metadata, { deadline: this.createDeadline() }, (error, response) => {
                if (error) {
                    reject(new Error(`${methodName} failed: ${error.message}`));
                    return;
                }
                if (!response) {
                    reject(new Error('No response received'));
                    return;
                }
                // Dynamically extract response fields
                const result = {};
                responseFields.forEach(field => {
                    const getterName = `get${field.charAt(0).toUpperCase() + field.slice(1)}`;
                    if (typeof response[getterName] === 'function') {
                        result[field] = response[getterName]();
                    }
                });
                resolve(result);
            });
        });
    }
    getHealth() {
        return this.callMethod('getHealth', pb.HealthRequest, {}, ['status', 'message']);
    }
    registerService(service) {
        return this.callMethod('registerService', pb.RegisterServiceRequest, {
            name: service.name,
            endpoint: service.endpoint,
            type: service.type,
        }, ['serviceId', 'message']);
    }
    unregisterService(serviceId) {
        return this.callMethod('unregisterService', pb.UnregisterServiceRequest, { serviceId }, ['message']);
    }
    async listServices() {
        const result = await this.callMethod('listServices', pb.ListServicesRequest, {}, ['servicesList']);
        return result.servicesList;
    }
    updateService(update) {
        const requestData = {
            serviceId: update.serviceId,
            status: update.status,
        };
        // Add optional fields if provided
        if (update.name)
            requestData.name = update.name;
        if (update.endpoint)
            requestData.endpoint = update.endpoint;
        if (update.type !== undefined)
            requestData.type = update.type;
        return this.callMethod('updateService', pb.UpdateServiceRequest, requestData, ['message']);
    }
    // Backward compatibility method for status-only updates
    updateServiceStatus(update) {
        return this.updateService(update);
    }
    close() {
        this.client.close();
    }
    createDeadline() {
        return Date.now() + this.timeout;
    }
}
exports.WatchdogClient = WatchdogClient;
//# sourceMappingURL=client.js.map