@launchdarkly/js-server-sdk-common
Version:
LaunchDarkly Server SDK for JavaScript - common code
97 lines • 4.48 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
const js_sdk_common_1 = require("@launchdarkly/js-sdk-common");
const serialization_1 = require("../store/serialization");
const FileLoader_1 = require("./FileLoader");
/**
* @internal
*/
class FileDataInitializerFDv2 {
constructor(options, platform, logger) {
this._validateInputs(options, platform);
this._paths = options.paths;
this._logger = logger;
this._filesystem = platform.fileSystem;
this._yamlParser = options.yamlParser;
}
_validateInputs(options, platform) {
if (!options.paths || options.paths.length === 0) {
throw new Error('FileDataInitializerFDv2: paths are required');
}
if (!platform.fileSystem) {
throw new Error('FileDataInitializerFDv2: file system is required');
}
}
start(dataCallback, statusCallback) {
statusCallback(js_sdk_common_1.subsystem.DataSourceState.Initializing);
const initMetadata = js_sdk_common_1.internal.initMetadataFromHeaders(undefined);
const payloadProcessor = new js_sdk_common_1.internal.PayloadProcessor({
flag: (flag) => {
(0, serialization_1.processFlag)(flag);
return flag;
},
segment: (segment) => {
(0, serialization_1.processSegment)(segment);
return segment;
},
}, (errorKind, message) => {
statusCallback(js_sdk_common_1.subsystem.DataSourceState.Interrupted, new js_sdk_common_1.LDPollingError(errorKind, message));
}, this._logger);
const adaptor = js_sdk_common_1.internal.FDv1PayloadAdaptor(payloadProcessor);
this._fileLoader = new FileLoader_1.default(this._filesystem, this._paths, false, // autoupdate is always false for initializer
(results) => {
var _a;
try {
const parsedData = this._processFileData(results);
payloadProcessor.addPayloadListener((payload) => {
// NOTE: file data initializer will never have a valid basis, so we always pass false
dataCallback(false, { initMetadata, payload });
});
statusCallback(js_sdk_common_1.subsystem.DataSourceState.Valid);
adaptor.processFullTransfer(parsedData);
statusCallback(js_sdk_common_1.subsystem.DataSourceState.Closed);
}
catch (err) {
(_a = this._logger) === null || _a === void 0 ? void 0 : _a.error('File contained invalid data', err);
statusCallback(js_sdk_common_1.subsystem.DataSourceState.Closed, new js_sdk_common_1.LDPollingError(js_sdk_common_1.DataSourceErrorKind.InvalidData, 'Malformed data in file response'));
}
});
this._fileLoader.loadAndWatch().catch((err) => {
var _a;
(_a = this._logger) === null || _a === void 0 ? void 0 : _a.error('Error loading files', err);
statusCallback(js_sdk_common_1.subsystem.DataSourceState.Closed, new js_sdk_common_1.LDPollingError(js_sdk_common_1.DataSourceErrorKind.NetworkError, `Failed to load files: ${err instanceof Error ? err.message : String(err)}`));
});
}
_processFileData(results) {
const combined = results.reduce((acc, curr) => {
var _a, _b;
let parsed;
if (curr.path.endsWith('.yml') || curr.path.endsWith('.yaml')) {
if (this._yamlParser) {
parsed = this._yamlParser(curr.data);
}
else {
throw new Error(`Attempted to parse yaml file (${curr.path}) without parser.`);
}
}
else {
parsed = JSON.parse(curr.data);
}
return {
segments: Object.assign(Object.assign({}, acc.segments), ((_a = parsed.segments) !== null && _a !== void 0 ? _a : {})),
flags: Object.assign(Object.assign({}, acc.flags), ((_b = parsed.flags) !== null && _b !== void 0 ? _b : {})),
};
}, {
segments: {},
flags: {},
});
return combined;
}
stop() {
if (this._fileLoader) {
this._fileLoader.close();
}
}
}
exports.default = FileDataInitializerFDv2;
//# sourceMappingURL=fileDataInitilizerFDv2.js.map