UNPKG

tencentcloud-edgeone-migration-nodejs-v2

Version:

tencentcloud cdn config copy to edgeone

287 lines 13.8 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.PolarisDiscoverAdapter = void 0; const util_1 = require("util"); const __1 = require("../../../.."); const location_1 = require("../../../../location"); const plugins_1 = require("../../../../plugins"); const utils_1 = require("../../../../utils"); const rules_1 = require("../rules"); const types_1 = require("../types"); const utils_2 = require("../utils"); const base_1 = require("./base"); const kDefaultRegisterOptions = { enableHealthCheck: true, healthCheckType: plugins_1.HealthCheckType.HEARTBEAT, healthCheckTTL: 5 }; class PolarisDiscoverAdapter extends base_1.PolarisBaseAdapter { async list(namespace, service, revision) { if (!this.initializeStatus.initialized) { const signal = this.waitForInitialized(); const { polarisNamespace, discoverService } = this.options; /** * 当请求 `polarisNamespace.discoverService` 时,无需等待初始化完成 */ if (namespace !== polarisNamespace || service !== discoverService) { await signal; } else { signal.catch(() => { /** * (empty function) * * 仅当请求 `polarisNamespace.discoverService` 时才会使用此分支, * 为了避免 `unhandledRejection`,__进行捕获__。 * 但由于如下两个原因,忽略捕获的异常: * * 由用户直接发起的调用:初始化异常和调用返回的异常几乎相同。 * * 由初始化函数发起的调用:异常已经被上层处理函数捕获。 */ }); } } const { logger } = this; const { transaction } = logger; if (logger.tracingEnabled) { logger.trace("Plugins" /* Plugins */, this.name, "list", transaction, `request ${namespace}.${service}${(revision !== null && revision !== void 0 ? revision : "") && `@${revision}`}`); } const response = await this.requestBackend(types_1.ServiceType.Discover, this.options.discoverService, "discover", { type: types_1.DiscoverRequestType.INSTANCE, service: { namespace: this.box(namespace), name: this.box(service), revision: this.box(revision) } }); this.tracingResponse(transaction, "list", response); this.maybeErrorResponse(response, namespace, service); if (!response.service) { (0, utils_1.UNREACHABLE)(); } if (revision !== undefined && this.unbox(response.service.revision, "") === revision) { logger.trace("Plugins" /* Plugins */, this.name, "list", transaction, "revision is equal"); return { data: [], revision }; } logger.trace("Plugins" /* Plugins */, this.name, "list", transaction, "response instances length is", response.instances.length); const instances = this.procInstances(response); logger.trace("Plugins" /* Plugins */, this.name, "list", transaction, "returned instances is", instances); return { data: instances, revision: this.unbox(response.service.revision, "") }; } async routingRules(namespace, service, revision) { if (!this.initializeStatus.initialized) { const signal = this.waitForInitialized(); const { polarisNamespace, discoverService } = this.options; /** * 当请求 `polarisNamespace.discoverService` 时,无需等待初始化完成 */ if (namespace !== polarisNamespace || service !== discoverService) { await signal; } else { signal.catch(() => { /** * (empty function) * * 仅当请求 `polarisNamespace.discoverService` 时才会使用此分支, * 为了避免 `unhandledRejection`,__进行捕获__。 * 但由于如下两个原因,忽略捕获的异常: * * 由用户直接发起的调用:初始化异常和调用返回的异常几乎相同。 * * 由初始化函数发起的调用:异常已经被上层处理函数捕获。 */ }); } } const { logger } = this; const { transaction } = logger; if (logger.tracingEnabled) { logger.trace("Plugins" /* Plugins */, this.name, "routingRules", transaction, `request ${namespace}.${service}${(revision !== null && revision !== void 0 ? revision : "") && `@${revision}`}`); } const response = await this.requestBackend(types_1.ServiceType.Discover, this.options.discoverService, "discover", { type: types_1.DiscoverRequestType.ROUTING, service: { namespace: this.box(namespace), name: this.box(service) } }); this.tracingResponse(transaction, "routingRules", response); this.maybeErrorResponse(response, namespace, service); const { routing } = response; if (!routing /** 当 `routing` 不存在时,认为 `routing` 为空不匹配。 */ || (revision !== undefined && this.unbox(routing.revision, "") === revision)) { logger.trace("Plugins" /* Plugins */, this.name, "routingRules", transaction, "empty rule or revision is equal"); return { data: { in: [], out: [] }, revision: routing ? (revision !== null && revision !== void 0 ? revision : "") : "" }; } let { routingRuleProcessor } = this; if (routingRuleProcessor === undefined) { routingRuleProcessor = new rules_1.RuleProcessor(this.unbox.bind(this)); this.routingRuleProcessor = routingRuleProcessor; } const rules = { in: Array.isArray(routing.inbounds) ? routingRuleProcessor.procRules(routing.inbounds) : [], out: Array.isArray(routing.outbounds) ? routingRuleProcessor.procRules(routing.outbounds) : [] }; logger.trace("Plugins" /* Plugins */, this.name, "routingRules", transaction, "returned rules is", rules); return { data: rules, revision: this.unbox(routing.revision, "") }; } async register(namespace, service, token, instance, options) { if (!this.initializeStatus.initialized) { await this.waitForInitialized(); } const opt = Object.assign(Object.assign({}, kDefaultRegisterOptions), options); const { logger } = this; const { transaction } = logger; if (logger.tracingEnabled) { logger.trace("Plugins" /* Plugins */, this.name, "register", transaction, `register ${instance.host}:${instance.port} to ${namespace}.${service} with options ${(0, util_1.inspect)(opt.enableHealthCheck)}}`); } const response = await this.requestBackend(types_1.ServiceType.Discover, this.options.discoverService, "registerInstance", { namespace: this.box(namespace), service: this.box(service), host: this.box(instance.host), port: this.box(instance.port), protocol: this.box(instance.protocol), weight: this.box(instance.staticWeight), metadata: instance.metadata, version: this.box(instance.version), healthy: this.box(instance.status === 0 /* Normal */), isolate: this.box(instance.status === 3 /* Fused */), enable_health_check: this.box(opt.enableHealthCheck), health_check: { type: opt.healthCheckType, heartbeat: { ttl: this.box(opt.healthCheckTTL) } }, service_token: this.box(token) }); this.tracingResponse(transaction, "register", response); this.maybeErrorResponse(response, namespace, service); if (!response.instance) { (0, utils_1.UNREACHABLE)(); } const id = this.unbox(response.instance.id, ""); logger.trace("Plugins" /* Plugins */, this.name, "register", transaction, "registered instance id is", id); return id; } async unregister(...args) { if (!this.initializeStatus.initialized) { await this.waitForInitialized(); } const { logger } = this; const { transaction } = logger; logger.trace("Plugins" /* Plugins */, this.name, "unregister", transaction, "unregister instance with args:", args); const request = this.instanceTupleToRequest(args); if (!request) { throw new __1.ArgumentError("Illegal parameter"); } const response = await this.requestBackend(types_1.ServiceType.Discover, this.options.discoverService, "deregisterInstance", request); this.tracingResponse(transaction, "unregister", response); return this.isSuccessResponse(response); } async heartbeat(...args) { if (!this.initializeStatus.initialized) { await this.waitForInitialized(); } const { logger } = this; const { transaction } = logger; logger.trace("Plugins" /* Plugins */, this.name, "unregister", transaction, "heartbeat instance with args:", args); const request = this.instanceTupleToRequest(args); if (!request) { throw new __1.ArgumentError("Illegal parameter"); } if (!this.stickyConsumer) { this.buildStickyConsumer(); } if (this.local === undefined) { (0, utils_1.UNREACHABLE)(); } const response = await this.requestBackend(types_1.ServiceType.Discover, this.options.healthcheckService, "heartbeat", request, this.local.host); this.tracingResponse(transaction, "heartbeat", response); return this.isSuccessResponse(response); } instanceTupleToRequest(args) { if (args.length === 2) { const [id, serviceToken] = args; if (id && serviceToken) { return { id: this.box(id), service_token: this.box(serviceToken) }; } } else if (args.length === 5) { const [namespace, service, host, port, serviceToken] = args; if (namespace && service && host && serviceToken && (0, utils_2.isValidPort)(port)) { return { namespace: this.box(namespace), service: this.box(service), host: this.box(host), port: this.box(port), service_token: this.box(serviceToken) }; } } return null; } procInstances(response) { const { isolateUnhealthy } = this.options; const instances = []; const { metadata: serviceMetadata } = response.service; for (let i = 0; i < response.instances.length; i += 1) { // eslint-disable-line @typescript-eslint/prefer-for-of const { host, port, id, metadata: instanceMetadata, priority, protocol, weight, healthy, isolate, location, version, logic_set: logicSet, vpc_id: vpcId } = response.instances[i]; const instanceHost = this.unbox(host, ""); const instancePort = this.unbox(port, 0); const instanceId = this.unbox(id, ""); const instanceWeight = this.unbox(weight, 0); const instanceHealthy = this.unbox(healthy, false); if (instanceHost === "" || instancePort === 0 || instanceId === "") { throw new __1.InvalidInstance(); } /** 过滤符合条件的实例 */ if (instanceWeight > 0 /** 实例权重大于 0 */ && !this.unbox(isolate, false) /** 实例没有被隔离 */ && (!isolateUnhealthy || instanceHealthy) /** 如开启 `options.isolateUnhealthy`,则过滤出健康的实例 */) { const instance = { id: instanceId, host: instanceHost, port: instancePort, vpcId: this.unbox(vpcId, ""), staticWeight: instanceWeight, version: this.unbox(version, ""), logicSet: this.unbox(logicSet, ""), priority: this.unbox(priority, 9), protocol: this.unbox(protocol, "unknown"), status: this.unbox(healthy, false) ? 0 /* Normal */ : 3 /* Fused */, dynamicWeight: 0, location: Object.assign({}, location_1.blankLocation /** copy */), metadata: Object.assign(Object.assign({}, serviceMetadata), instanceMetadata) }; if (location) { instance.location = { region: this.unbox(location.region, ""), zone: this.unbox(location.zone, ""), campus: this.unbox(location.campus, "") }; } instances.push(instance); } } return instances; } } exports.PolarisDiscoverAdapter = PolarisDiscoverAdapter; //# sourceMappingURL=discover.js.map