UNPKG

@launchdarkly/js-server-sdk-common

Version:
97 lines 4.48 kB
"use strict"; 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