featurehub-eventsource-sdk
Version:
FeatureHub SDK. Supports near real-time feature flag updates via eventsource (SSE) or on-demand updates via REST requests.
63 lines • 2.06 kB
JavaScript
import { fhLog, SSEResultState } from 'featurehub-repository';
import EventSource from 'eventsource';
export class FeatureHubEventSourceClient {
constructor(config, repository) {
this._config = config;
this._repository = repository;
}
init() {
const options = {};
if (this._header) {
options.headers = {
'x-featurehub': this._header
};
}
fhLog.log('listening at ', this._config.url());
this.eventSource = new EventSource(this._config.url(), options);
[SSEResultState.Features, SSEResultState.Feature, SSEResultState.DeleteFeature,
SSEResultState.Bye, SSEResultState.Failure, SSEResultState.Ack].forEach((name) => {
const fName = name.toString();
this.eventSource.addEventListener(fName, e => {
try {
fhLog.log("received ", fName, JSON.stringify(e));
this._repository.notify(name, JSON.parse(e.data));
}
catch (e) {
fhLog.error(JSON.stringify(e));
}
});
});
this.eventSource.onerror = (e) => {
fhLog.error("got error", e);
this._repository.notify(SSEResultState.Failure, null);
};
}
close() {
if (this.eventSource != null) {
const es = this.eventSource;
this.eventSource = undefined;
es.close();
}
}
clientEvaluated() {
return this._config.clientEvaluated();
}
contextChange(header) {
this._header = header;
if (this.eventSource !== undefined) {
this.close();
}
this.init();
return Promise.resolve(undefined);
}
poll() {
if (this.eventSource == undefined) {
this.init();
}
return new Promise((resolve) => resolve());
}
requiresReplacementOnHeaderChange() {
return true;
}
}
//# sourceMappingURL=featurehub_eventsource.js.map