gcf-helper
Version:
Google Cloud Functions Helper
139 lines (138 loc) • 6.05 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const DEFAULT_ERROR_CODE = "GCFError";
const DEFAULT_CORRELATION_ID_HEADER = "correlation-id";
const DEFAULT_SECRET_HEADER = "apifs-secret";
const DEFAULT_KMS_ENABLED = false;
const DEFAULT_SQL_MAX_CONNECTIONS = 1;
const DEFAULT_METRICS_FLUSH_TIMEOUT = 100;
class ConfigReader {
static getEnvVar(key) {
return typeof process.env[key] !== "undefined"
? process.env[key]
: undefined;
}
static loadKmsClient(functionOptions) {
// check if we can cover the kms client instance automatically
if (functionOptions.kmsEnabled &&
!functionOptions.kmsClient &&
functionOptions.projectId &&
functionOptions.locationId &&
functionOptions.keyRingId &&
functionOptions.cryptoKeyId) {
return Promise.resolve().then(() => require("@google-cloud/kms")).then((packageImport) => {
const { KeyManagementServiceClient } = packageImport;
functionOptions.kmsClient = new KeyManagementServiceClient();
return true;
})
.catch((_) => false);
}
if (functionOptions.kmsClient) {
return Promise.resolve(true);
}
else {
return Promise.resolve(false);
}
}
static async decrypt(functionOptions, ciphertext) {
if (!ciphertext ||
!functionOptions.kmsEnabled ||
!functionOptions.kmsClient ||
!functionOptions.projectId ||
!functionOptions.locationId ||
!functionOptions.keyRingId ||
!functionOptions.cryptoKeyId) {
return ciphertext;
}
const name = functionOptions.kmsClient.cryptoKeyPath(functionOptions.projectId, functionOptions.locationId, functionOptions.keyRingId, functionOptions.cryptoKeyId);
const [result] = await functionOptions.kmsClient.decrypt({
name,
ciphertext,
});
return result.plaintext.toString();
}
static async adaptConfig(functionOptions) {
if (!functionOptions.errorCode) {
functionOptions.errorCode = DEFAULT_ERROR_CODE;
}
if (!functionOptions.correlationId) {
functionOptions.correlationId = DEFAULT_CORRELATION_ID_HEADER;
}
if (!functionOptions.projectId) {
functionOptions.projectId = ConfigReader.getEnvVar("PROJECT_ID");
}
if (!functionOptions.locationId) {
functionOptions.locationId = ConfigReader.getEnvVar("LOCATION_ID");
}
if (!functionOptions.keyRingId) {
functionOptions.keyRingId = ConfigReader.getEnvVar("KEYRING_ID");
}
if (!functionOptions.cryptoKeyId) {
functionOptions.cryptoKeyId = ConfigReader.getEnvVar("CRYPTOKEY_ID");
}
if (!functionOptions.kmsEnabled) {
functionOptions.kmsEnabled =
ConfigReader.getEnvVar("KMS_ENABLED") === "true" || DEFAULT_KMS_ENABLED;
}
await this.loadKmsClient(functionOptions);
if (!functionOptions.apifsSecretHeader) {
functionOptions.apifsSecretHeader =
ConfigReader.getEnvVar("APIFS_SECRET_HEADER") || DEFAULT_SECRET_HEADER;
}
if (!functionOptions.apifsSecretValue) {
functionOptions.apifsSecretValue = await this.decrypt(functionOptions, ConfigReader.getEnvVar("APIFS_SECRET"));
}
if (!functionOptions.functionIdentifier) {
functionOptions.functionIdentifier = ConfigReader.getEnvVar("FUNCTION_ID");
}
if (!functionOptions.errorTopic) {
functionOptions.errorTopic = ConfigReader.getEnvVar("ERROR_TOPIC");
}
if (!functionOptions.bqDatasetId) {
functionOptions.bqDatasetId = ConfigReader.getEnvVar("DATASET_ID");
}
if (!functionOptions.bqTableId) {
functionOptions.bqTableId = ConfigReader.getEnvVar("TABLE_ID");
}
if (!functionOptions.sqlConnectionName) {
functionOptions.sqlConnectionName = ConfigReader.getEnvVar("SQL_CONNECTION_NAME");
}
if (!functionOptions.sqlDatabaseName) {
functionOptions.sqlDatabaseName = ConfigReader.getEnvVar("SQL_DATABASE_NAME");
}
if (!functionOptions.sqlUsername) {
functionOptions.sqlUsername = ConfigReader.getEnvVar("SQL_USERNAME");
}
if (!functionOptions.sqlPassword) {
functionOptions.sqlPassword = await this.decrypt(functionOptions, ConfigReader.getEnvVar("SQL_PASSWORD"));
}
if (!functionOptions.sqlMaxConnections) {
const maxConnections = ConfigReader.getEnvVar("SQL_MAX_CONNECTIONS");
if (maxConnections && !isNaN(parseInt(maxConnections, 10))) {
functionOptions.sqlMaxConnections =
parseInt(maxConnections, 10) || DEFAULT_SQL_MAX_CONNECTIONS;
}
else {
functionOptions.sqlMaxConnections = DEFAULT_SQL_MAX_CONNECTIONS;
}
}
if (!functionOptions.metricsTopic) {
functionOptions.metricsTopic = ConfigReader.getEnvVar("METRICS_TOPIC");
}
if (typeof functionOptions.disableMetrics === "undefined") {
functionOptions.disableMetrics = ConfigReader.getEnvVar("DISABLE_METRICS") === "1";
}
if (!functionOptions.metricsFlushTimeoutMs) {
const flushTimeoutMs = ConfigReader.getEnvVar("METRICS_FLUSH_TIMEOUT");
if (flushTimeoutMs && !isNaN(parseInt(flushTimeoutMs, 10))) {
functionOptions.metricsFlushTimeoutMs =
parseInt(flushTimeoutMs, 10) || DEFAULT_METRICS_FLUSH_TIMEOUT;
}
else {
functionOptions.metricsFlushTimeoutMs = DEFAULT_SQL_MAX_CONNECTIONS;
}
}
return functionOptions;
}
}
exports.default = ConfigReader;