@creditkarma/consul-client
Version:
A client for Hashicorp Consul written in TypeScript
131 lines • 5.5 kB
JavaScript
;
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