UNPKG

@creditkarma/consul-client

Version:

A client for Hashicorp Consul written in TypeScript

131 lines 5.5 kB
"use strict"; Object.defineProperty(exports, "__esModule", { value: true }); exports.KvStore = void 0; const ConsulClient_1 = require("./ConsulClient"); const request_1 = require("./request"); const Utils = require("../utils"); const Observer_1 = require("../Observer"); const logger = require("../logger"); class KvStore { constructor(consulAddresses = Utils.defaultAddresses(), baseOptions = {}, maxRetries = 5) { this.consulAddresses = consulAddresses; this.baseOptions = { responseType: 'json', ...baseOptions, }; this.client = new ConsulClient_1.ConsulClient(this.consulAddresses); this.watchMap = new Map(); this.maxRetries = maxRetries; } get(key, requestOptions = {}) { const extendedOptions = Utils.deepMerge(this.baseOptions, requestOptions); return this.client .send((0, request_1.getRequest)({ key }), extendedOptions) .then((res) => { switch (res.statusCode) { case 200: const metadata = res.body; return Promise.resolve(Utils.decodeBase64(metadata[0].Value)); case 404: return Promise.resolve(null); default: return Promise.reject(new Error(`${res.statusMessage}: ${res.body}`)); } }); } ignore(key) { const observer = this.watchMap.get(key.path); if (observer !== undefined) { observer.destroy(); this.watchMap.delete(key.path); } } watch(key, requestOptions = {}) { const extendedOptions = Utils.deepMerge(this.baseOptions, requestOptions); let numRetries = 0; const observer = new Observer_1.Observer((sink) => { const _watch = (index) => { this.client .send((0, request_1.getRequest)({ key, index }), extendedOptions) .then((res) => { if (this.watchMap.has(key.path)) { switch (res.statusCode) { case 200: const metadata = res.body; const modifyIndex = metadata[0].ModifyIndex; numRetries = 0; if (modifyIndex !== index) { if (sink(undefined, Utils.decodeBase64(metadata[0].Value))) { _watch(modifyIndex); } } else { setTimeout(() => _watch(index), 5000); } break; case 404: logger.warn(`Unable to find value for key[${key.path}]. Retrying...`); setTimeout(_watch, 5000); break; default: logger.error(`Error retrieving key[${key.path}]: ${res.statusMessage}.`); if (numRetries < this.maxRetries) { setTimeout(_watch, 5000); numRetries += 1; } else { sink(new Error(`Error retrieving key[${key.path}]: ${res.statusMessage}.`)); } break; } } }) .catch((err) => { logger.error(`Error retrieving key[${key.path}]: ${err.message}.`); if (numRetries < this.maxRetries) { setTimeout(_watch, 5000); numRetries += 1; } else { sink(new Error(`Error retrieving key[${key.path}]: ${err.message}.`)); } }); }; _watch(); }); this.watchMap.set(key.path, observer); return observer; } set(key, value, requestOptions = {}) { const extendedOptions = Utils.deepMerge(this.baseOptions, requestOptions); return this.client .send((0, request_1.updateRequest)({ key, value }), extendedOptions) .then((res) => { switch (res.statusCode) { case 200: return Promise.resolve(res.body); case 404: return Promise.resolve(false); default: return Promise.reject(new Error(res.statusMessage)); } }); } delete(key, requestOptions = {}) { const extendedOptions = Utils.deepMerge(this.baseOptions, requestOptions); return this.client .send((0, request_1.deleteRequest)({ key }), extendedOptions) .then((res) => { switch (res.statusCode) { case 200: return Promise.resolve(res.body); case 404: return Promise.resolve(false); default: return Promise.reject(new Error(res.statusMessage)); } }); } } exports.KvStore = KvStore; //# sourceMappingURL=KvStore.js.map