UNPKG

tencentcloud-edgeone-migration-nodejs-v2

Version:

tencentcloud cdn config copy to edgeone

125 lines (124 loc) 5.35 kB
import { Logger, InternalConsumer, SelectResponse } from "../../../.."; import { Location } from "../../../../location"; import { NamingServicePlugin, OperatingMode, PluginType } from "../../../../plugins"; import { RemoveNever } from "../../../../utils"; import type { Boxable, BoxType, DeconstructorWrappers, MonitorService, PolarisService, RatelimitService } from ".."; import { ClientPool, ClientPoolOptions, ClosableClient } from "../pool"; import { ServiceType } from "../types"; import { EndPoint, ProtobufFormat } from "../utils"; export interface BaseAdapterOptions { /** * 北极星后端节点连通性探测,最长超时时间 * 单位 ms */ detectionTimeout: number; /** * 北极星后端节点切换时长 * 单位 ms */ switchDuration: number; /** * 北极星后端命名空间 * __请勿随意修改此配置__ */ polarisNamespace: string; /** * 服务发现后端服务名 * __请勿随意修改此配置__ */ discoverService: string; /** * 预置实例上报后缀名 * __请勿随意修改此配置__ */ presetSuffix: string; /** * 预置实例是否仅用于引导启动 * __请勿随意修改此配置__ */ bootstrapOnly: boolean; } declare type ExtractServiceAPI<Service> = RemoveNever<{ [P in keyof Service]: Service[P] extends (request: infer U) => Promise<infer K> ? K extends unknown ? U extends unknown ? (request: DeconstructorWrappers<U>) => Promise<DeconstructorWrappers<K>> : never : never : never; }>; export declare type DiscoverApi = ExtractServiceAPI<PolarisService.ServerAPI>; export declare type MonitorApi = ExtractServiceAPI<MonitorService.MonitorApi>; export declare type RatelimitApi = ExtractServiceAPI<RatelimitService.RateLimitAPI>; export declare type PolarisApi = DiscoverApi & MonitorApi & RatelimitApi; export declare type PolarisClient = PolarisApi & ClosableClient; export declare type PolarisResponse = Awaited<ReturnType<PolarisApi[keyof PolarisApi]>>; export declare type PolarisRequest = Awaited<ReturnType<PolarisApi[keyof PolarisApi]>>; /** * 显式声明 `PolarisBaseAdapter` 扩展于 `NamingServicePlugin`, * 以便于共享当前插件实例 */ export interface PolarisBaseAdapter extends NamingServicePlugin, Boxable { } /** * 由于 class ... implements ... 中 class 必须要实现 implements 中的接口, * 并且 `Mixin` 方法无法组合(继承)类型,故在此仅实现 `Boxable` 接口 */ export declare abstract class PolarisBaseAdapter implements Boxable { private readonly remotes; readonly mode = OperatingMode.Internal; protected logger: Logger; protected readonly options: BaseAdapterOptions & ClientPoolOptions; protected readonly pool: ClientPool<PolarisClient>; protected stickyConsumer?: InternalConsumer; protected local?: EndPoint; protected disposeFuncs: Record<string, () => void>; protected disposed: boolean; protected initializeStatus: { promise: Promise<unknown> | null; initialized: boolean; /** fast case */ }; private mainConsumer?; private localRegistry?; private loc; readonly abstract type: PluginType; readonly abstract name: string; protected abstract readonly protocol: string; protected abstract readonly format: ProtobufFormat; constructor(remotes: readonly string[]); setLogger(logger: Logger): void; get location(): Location; dispose(): Promise<void>; get isDisposed(): boolean; /** * 由于 `stickyConsumer` 仅用于少数调用, * 故在一般情况下(如:仅使用 Consumer 时)不会被调用, * 在这里做延迟初始化以节省内存开销 */ protected buildStickyConsumer(): InternalConsumer; protected selectBackend(consumer: InternalConsumer, service: string, key?: string): Promise<SelectResponse>; /** * 此函数签名用于调用 */ protected requestBackend<MethodName extends keyof PolarisApi>(type: ServiceType, service: string, method: MethodName, payload: Parameters<PolarisApi[MethodName]>[0], key?: string): Promise<Awaited<ReturnType<PolarisApi[MethodName]>>>; /** * 追踪后端调用结果 * @param transaction 追踪 ID * @param method 调用函数名 * @param response 后端响应 */ protected tracingResponse(transaction: string, method: string, response: PolarisResponse): void; /** * 判断后端调用是否成功(不成功则抛出异常) * @param response 后端响应 * @param namespace 命名空间 * @param service 服务名 */ protected maybeErrorResponse(response: PolarisResponse, namespace: string, service: string): void; /** * 判断后端调用是否成功 * @param response 后端响应 * @param level 比较级别(默认为 `kErrorLevel`) */ protected isSuccessResponse(response: PolarisResponse, level?: number): boolean; protected waitForInitialized(): Promise<void>; private bootstrap; abstract unbox<T>(value: BoxType<T> | T | null | undefined, defaultValue: T | (() => T)): T; abstract box<T>(value: T): BoxType<T> | T | null | undefined; protected abstract buildClient<T extends PolarisClient>(address: string, type: ServiceType): T; } export {};