All files / src index.ts

88.88% Statements 8/9
100% Branches 0/0
100% Functions 2/2
85.71% Lines 6/7

Press n or j to go to the next uncovered block, b, p or k for the previous block.

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95                                                                                                                                1x                                 1x       1x 1x 1x       1x      
import { injectable } from '@biorate/inversion';
import { Connector } from '@biorate/connector';
import { Client } from '@opensearch-project/opensearch';
import { IOpenSearchConfig, IOpenSearchConnection } from './interfaces';
import { OpenSearchCantConnectError } from './errors';
 
export * from './errors';
export * from './interfaces';
 
/**
 * @description OpenSearch connector
 *
 * ### Features:
 * - connector manager for OpenSearch
 *
 * @example
 * ```
 * import { inject, container, Types, Core } from '@biorate/inversion';
 * import { IConfig, Config } from '@biorate/config';
 * import { OpenSearchConnector, IOpenSearchConnector } from '../../src';
 *
 * export class Root extends Core() {
 *   @inject(Types.Config) public config: IConfig;
 *
 *   @inject(OpenSearchConnector) public opensearchConnector: IOpenSearchConnector;
 * }
 *
 * container.bind<IConfig>(Types.Config).to(Config).inSingletonScope();
 * container.bind<IOpenSearchConnector>(OpenSearchConnector).toSelf().inSingletonScope();
 * container.bind<Root>(Root).toSelf().inSingletonScope();
 *
 * container.get<IConfig>(Types.Config).merge({
 *   OpenSearch: [
 *     {
 *       name: 'dev',
 *       options: {
 *         node: 'https://admin:admin_pass@localhost:9200',
 *         ssl: {
 *           rejectUnauthorized: false,
 *         },
 *       },
 *     },
 *   ],
 * });
 *
 * (async () => {
 *   root = container.get<Root>(Root);
 *   await root.$run();
 *
 *   await root.opensearchConnector.current!.indices.create({
 *     index: 'test_index',
 *     body: {
 *       settings: {
 *         index: {
 *           number_of_shards: 1,
 *           number_of_replicas: 1,
 *         },
 *       },
 *     },
 *   });
 * })();
 * ```
 */
@injectable()
export class OpenSearchConnector extends Connector<
  IOpenSearchConfig,
  IOpenSearchConnection
> {
  /**
   * @description Private connections storage
   */
  private '#connections': Map<string, IOpenSearchConnection>;
 
  /**
   * @description Private link to selected (used) connection
   */
  private '#current': IOpenSearchConnection | undefined;
 
  /**
   * @description Namespace path for fetching configuration
   */
  protected readonly namespace = 'OpenSearch';
 
  protected async connect(config: IOpenSearchConfig) {
    let connection: IOpenSearchConnection;
    try {
      connection = new Client(config.options);
      await connection.ping();
    } catch (e: unknown) {
      throw new OpenSearchCantConnectError(<Error>e);
    }
    return connection;
  }
}