UNPKG

@grpc/grpc-js

Version:

gRPC Library for Node - pure JS implementation

103 lines 4.85 kB
"use strict"; /* * Copyright 2019 gRPC authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. * */ Object.defineProperty(exports, "__esModule", { value: true }); exports.validateLoadBalancingConfig = exports.getFirstUsableConfig = exports.isLoadBalancerNameRegistered = exports.createLoadBalancer = exports.registerDefaultLoadBalancerType = exports.registerLoadBalancerType = exports.createChildChannelControlHelper = void 0; /** * Create a child ChannelControlHelper that overrides some methods of the * parent while letting others pass through to the parent unmodified. This * allows other code to create these children without needing to know about * all of the methods to be passed through. * @param parent * @param overrides */ function createChildChannelControlHelper(parent, overrides) { var _a, _b, _c, _d, _e, _f, _g, _h, _j, _k; return { createSubchannel: (_b = (_a = overrides.createSubchannel) === null || _a === void 0 ? void 0 : _a.bind(overrides)) !== null && _b !== void 0 ? _b : parent.createSubchannel.bind(parent), updateState: (_d = (_c = overrides.updateState) === null || _c === void 0 ? void 0 : _c.bind(overrides)) !== null && _d !== void 0 ? _d : parent.updateState.bind(parent), requestReresolution: (_f = (_e = overrides.requestReresolution) === null || _e === void 0 ? void 0 : _e.bind(overrides)) !== null && _f !== void 0 ? _f : parent.requestReresolution.bind(parent), addChannelzChild: (_h = (_g = overrides.addChannelzChild) === null || _g === void 0 ? void 0 : _g.bind(overrides)) !== null && _h !== void 0 ? _h : parent.addChannelzChild.bind(parent), removeChannelzChild: (_k = (_j = overrides.removeChannelzChild) === null || _j === void 0 ? void 0 : _j.bind(overrides)) !== null && _k !== void 0 ? _k : parent.removeChannelzChild.bind(parent), }; } exports.createChildChannelControlHelper = createChildChannelControlHelper; const registeredLoadBalancerTypes = {}; let defaultLoadBalancerType = null; function registerLoadBalancerType(typeName, loadBalancerType, loadBalancingConfigType) { registeredLoadBalancerTypes[typeName] = { LoadBalancer: loadBalancerType, LoadBalancingConfig: loadBalancingConfigType, }; } exports.registerLoadBalancerType = registerLoadBalancerType; function registerDefaultLoadBalancerType(typeName) { defaultLoadBalancerType = typeName; } exports.registerDefaultLoadBalancerType = registerDefaultLoadBalancerType; function createLoadBalancer(config, channelControlHelper) { const typeName = config.getLoadBalancerName(); if (typeName in registeredLoadBalancerTypes) { return new registeredLoadBalancerTypes[typeName].LoadBalancer(channelControlHelper); } else { return null; } } exports.createLoadBalancer = createLoadBalancer; function isLoadBalancerNameRegistered(typeName) { return typeName in registeredLoadBalancerTypes; } exports.isLoadBalancerNameRegistered = isLoadBalancerNameRegistered; function getFirstUsableConfig(configs, fallbackTodefault = false) { for (const config of configs) { if (config.getLoadBalancerName() in registeredLoadBalancerTypes) { return config; } } if (fallbackTodefault) { if (defaultLoadBalancerType) { return new registeredLoadBalancerTypes[defaultLoadBalancerType].LoadBalancingConfig(); } else { return null; } } else { return null; } } exports.getFirstUsableConfig = getFirstUsableConfig; // eslint-disable-next-line @typescript-eslint/no-explicit-any function validateLoadBalancingConfig(obj) { if (!(obj !== null && typeof obj === 'object')) { throw new Error('Load balancing config must be an object'); } const keys = Object.keys(obj); if (keys.length !== 1) { throw new Error('Provided load balancing config has multiple conflicting entries'); } const typeName = keys[0]; if (typeName in registeredLoadBalancerTypes) { return registeredLoadBalancerTypes[typeName].LoadBalancingConfig.createFromJson(obj[typeName]); } else { throw new Error(`Unrecognized load balancing config name ${typeName}`); } } exports.validateLoadBalancingConfig = validateLoadBalancingConfig; //# sourceMappingURL=load-balancer.js.map