require("dotenv").config({ path: require("path").resolve( process.cwd(), `.env.${process.env.NODE_ENV || "development"}` ), }); const {isNil} = require('lodash'); const aws4 = require("aws4"); const {Connection, Client} = require("@opensearch-project/opensearch"); const {defaultProvider} = require("@aws-sdk/credential-provider-node"); const createAwsConnector = (credentials, region) => { class AmazonConnection extends Connection { buildRequestObject(params) { const request = super.buildRequestObject(params); request.service = "es"; request.region = region; request.headers = request.headers || {}; request.headers["host"] = request.hostname; return aws4.sign(request, credentials); } } return { Connection: AmazonConnection, }; }; const getClient = async () => { // We have manual configuration for OpenSearch, // Return a client using these custom credentials if ( !isNil(process.env.OPEN_SEARCH_PASSWORD) && !isNil(process.env.OPEN_SEARCH_USER) && !isNil(process.env.OPEN_SEARCH_HOST) && !isNil(process.env.OPEN_SEARCH_PROTOCOL) ) { // The URI is currently being stored in its entirety, so strip protocol prior to rebuilding it. const hostUrl = process.env.OPEN_SEARCH_HOST.replace(/^https?:\/\//i, ''); const node = `${process.env.OPEN_SEARCH_PROTOCOL}://${process.env.OPEN_SEARCH_USER}:${process.env.OPEN_SEARCH_PASSWORD}@${hostUrl}`; return new Client({ node, }); } // Default to the AWS Credentials Provider. const credentials = await defaultProvider()(); return new Client({ ...createAwsConnector(credentials, "ca-central-1"), node: process.env.OPEN_SEARCH_HOST, }); }; module.exports = {getClient};