node-es-transformer 1.0.0-beta7 → 1.0.2

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1,6 +1,7 @@
1
1
  'use strict';
2
2
 
3
- var elasticsearch = require('@elastic/elasticsearch');
3
+ var elasticsearch9 = require('es9');
4
+ var elasticsearch8 = require('es8');
4
5
  var fs = require('fs');
5
6
  var es = require('event-stream');
6
7
  var glob = require('glob');
@@ -72,23 +73,21 @@ function createMappingFactory({
72
73
  if (indexExists === false || deleteIndex === true) {
73
74
  const resp = await targetClient.indices.create({
74
75
  index: targetIndexName,
75
- body: {
76
- mappings: targetMappings,
77
- ...(pipeline !== undefined ? {
78
- settings: {
79
- index: {
80
- default_pipeline: pipeline
81
- }
76
+ mappings: targetMappings,
77
+ ...(pipeline !== undefined ? {
78
+ settings: {
79
+ index: {
80
+ default_pipeline: pipeline
82
81
  }
83
- } : {}),
84
- ...(indexMappingTotalFieldsLimit !== undefined ? {
85
- settings: {
86
- 'index.mapping.total_fields.limit': indexMappingTotalFieldsLimit,
87
- 'index.number_of_shards': 1,
88
- 'index.number_of_replicas': 0
89
- }
90
- } : {})
91
- }
82
+ }
83
+ } : {}),
84
+ ...(indexMappingTotalFieldsLimit !== undefined ? {
85
+ settings: {
86
+ 'index.mapping.total_fields.limit': indexMappingTotalFieldsLimit,
87
+ 'index.number_of_shards': 1,
88
+ 'index.number_of_replicas': 0
89
+ }
90
+ } : {})
92
91
  });
93
92
  if (verbose) console.log('Created target mapping', resp);
94
93
  }
@@ -148,9 +147,12 @@ function fileReaderFactory(indexer, fileName, transform, splitRegex, verbose) {
148
147
  });
149
148
  }
150
149
  return () => {
151
- glob(fileName, (er, files) => {
150
+ try {
151
+ const files = glob.globSync(fileName);
152
152
  startIndex(files);
153
- });
153
+ } catch (error) {
154
+ console.log('Error matching files:', error);
155
+ }
154
156
  };
155
157
  }
156
158
 
@@ -178,43 +180,50 @@ function indexQueueFactory({
178
180
  async function* ndjsonStreamIterator(readableStream) {
179
181
  let buffer = ''; // To hold the incomplete data
180
182
  let skippedHeader = false;
183
+ try {
184
+ // Iterate over the stream using async iteration
185
+ for await (const chunk of readableStream) {
186
+ buffer += chunk.toString(); // Accumulate the chunk data in the buffer
181
187
 
182
- // Iterate over the stream using async iteration
183
- for await (const chunk of readableStream) {
184
- buffer += chunk.toString(); // Accumulate the chunk data in the buffer
185
-
186
- // Split the buffer into lines (NDJSON items)
187
- const lines = buffer.split('\n');
188
+ // Split the buffer into lines (NDJSON items)
189
+ const lines = buffer.split('\n');
188
190
 
189
- // The last line might be incomplete, so hold it back in the buffer
190
- buffer = lines.pop();
191
+ // The last line might be incomplete, so hold it back in the buffer
192
+ buffer = lines.pop();
191
193
 
192
- // Yield each complete JSON object
193
- for (const line of lines) {
194
- if (line.trim()) {
195
- try {
196
- if (!skipHeader || skipHeader && !skippedHeader) {
197
- yield JSON.parse(line); // Parse and yield the JSON object
198
- skippedHeader = true;
194
+ // Yield each complete JSON object
195
+ for (const line of lines) {
196
+ if (line.trim()) {
197
+ try {
198
+ if (!skipHeader || skipHeader && !skippedHeader) {
199
+ yield JSON.parse(line); // Parse and yield the JSON object
200
+ skippedHeader = true;
201
+ }
202
+ } catch (err) {
203
+ // Handle JSON parse errors if necessary
204
+ console.error('Failed to parse JSON:', err);
199
205
  }
200
- } catch (err) {
201
- // Handle JSON parse errors if necessary
202
- console.error('Failed to parse JSON:', err);
203
206
  }
204
207
  }
205
208
  }
206
- }
207
209
 
208
- // Handle any remaining data in the buffer after the stream ends
209
- if (buffer.trim()) {
210
- try {
211
- yield JSON.parse(buffer);
212
- } catch (err) {
213
- console.error('Failed to parse final JSON:', err);
210
+ // Handle any remaining data in the buffer after the stream ends
211
+ if (buffer.trim()) {
212
+ try {
213
+ yield JSON.parse(buffer);
214
+ } catch (err) {
215
+ console.error('Failed to parse final JSON:', err);
216
+ }
217
+ }
218
+ } finally {
219
+ // Ensure the stream is properly cleaned up if the iterator is terminated early
220
+ if (!readableStream.destroyed) {
221
+ readableStream.destroy();
214
222
  }
215
223
  }
216
224
  }
217
225
  let finished = false;
226
+ let drainListener = null;
218
227
 
219
228
  // Async IIFE to start bulk indexing
220
229
  (async () => {
@@ -222,23 +231,47 @@ function indexQueueFactory({
222
231
  queueEmitter.emit('docsPerSecond', docsPerSecond);
223
232
  docsPerSecond = 0;
224
233
  }, 1000);
225
- await client.helpers.bulk({
226
- concurrency: parallelCalls,
227
- flushBytes,
228
- flushInterval: 1000,
229
- refreshOnCompletion: true,
230
- datasource: ndjsonStreamIterator(stream$1),
231
- onDocument(doc) {
232
- docsPerSecond++;
233
- return {
234
- index: {
235
- _index: targetIndexName
236
- }
237
- };
234
+ try {
235
+ await client.helpers.bulk({
236
+ concurrency: parallelCalls,
237
+ flushBytes,
238
+ flushInterval: 1000,
239
+ refreshOnCompletion: true,
240
+ datasource: ndjsonStreamIterator(stream$1),
241
+ onDocument(doc) {
242
+ docsPerSecond++;
243
+ return {
244
+ index: {
245
+ _index: targetIndexName
246
+ }
247
+ };
248
+ }
249
+ });
250
+ } catch (error) {
251
+ console.error('Error during bulk indexing:', error);
252
+ throw error;
253
+ } finally {
254
+ // Clean up interval
255
+ clearInterval(interval);
256
+
257
+ // Remove drain listener if it exists
258
+ if (drainListener) {
259
+ stream$1.removeListener('drain', drainListener);
260
+ drainListener = null;
238
261
  }
239
- });
240
- clearInterval(interval);
241
- queueEmitter.emit('finish');
262
+
263
+ // Remove all listeners from stream
264
+ stream$1.removeAllListeners();
265
+
266
+ // Properly destroy the stream to prevent open handles
267
+ if (!stream$1.destroyed) {
268
+ stream$1.destroy();
269
+ }
270
+
271
+ // Emit finish and clean up queue emitter listeners
272
+ queueEmitter.emit('finish');
273
+ queueEmitter.removeAllListeners();
274
+ }
242
275
  })();
243
276
  return {
244
277
  add: doc => {
@@ -248,9 +281,12 @@ function indexQueueFactory({
248
281
  const canContinue = stream$1.push(`${JSON.stringify(doc)}\n`);
249
282
  if (!canContinue) {
250
283
  queueEmitter.emit('pause');
251
- stream$1.once('drain', () => {
284
+
285
+ // Store the listener so we can clean it up later
286
+ drainListener = () => {
252
287
  queueEmitter.emit('resume');
253
- });
288
+ };
289
+ stream$1.once('drain', drainListener);
254
290
  }
255
291
  },
256
292
  finish: () => {
@@ -420,10 +456,76 @@ function streamReaderFactory(indexer, stream, transform, splitRegex, verbose) {
420
456
  };
421
457
  }
422
458
 
459
+ /**
460
+ * Detect Elasticsearch version by querying the cluster
461
+ */
462
+ async function detectElasticsearchVersion(config) {
463
+ try {
464
+ // Try with v9 client first (most common for new setups)
465
+ const testClient = new elasticsearch9.Client(config);
466
+ const info = await testClient.info();
467
+ const version = info.version?.number;
468
+ await testClient.close();
469
+ if (version) {
470
+ const majorVersion = parseInt(version.split('.')[0], 10);
471
+ return majorVersion;
472
+ }
473
+ } catch (e) {
474
+ // If v9 client fails, try v8 client
475
+ try {
476
+ const testClient = new elasticsearch8.Client(config);
477
+ const info = await testClient.info();
478
+ const version = info.version?.number;
479
+ await testClient.close();
480
+ if (version) {
481
+ const majorVersion = parseInt(version.split('.')[0], 10);
482
+ return majorVersion;
483
+ }
484
+ } catch (e2) {
485
+ // Could not detect version
486
+ }
487
+ }
488
+
489
+ // Default to v9 if detection fails
490
+ return 9;
491
+ }
492
+
493
+ /**
494
+ * Create or validate an Elasticsearch client
495
+ * @param {Object|Client} clientOrConfig - Either a client instance or config object
496
+ * @param {Object} defaultConfig - Default configuration to use if creating a new client
497
+ * @param {number} [forceVersion] - Force a specific ES client version (8 or 9)
498
+ */
499
+ async function getOrCreateClient(clientOrConfig, defaultConfig, forceVersion) {
500
+ // If already a client instance, return it
501
+ if (clientOrConfig && typeof clientOrConfig.info === 'function') {
502
+ return clientOrConfig;
503
+ }
504
+ const config = clientOrConfig || defaultConfig;
505
+
506
+ // If version is forced, use the specified client
507
+ if (forceVersion === 8) {
508
+ return new elasticsearch8.Client(config);
509
+ } else if (forceVersion === 9) {
510
+ return new elasticsearch9.Client(config);
511
+ }
512
+
513
+ // Auto-detect version
514
+ const majorVersion = await detectElasticsearchVersion(config);
515
+ if (majorVersion >= 9) {
516
+ return new elasticsearch9.Client(config);
517
+ } else {
518
+ return new elasticsearch8.Client(config);
519
+ }
520
+ }
423
521
  async function transformer({
424
522
  deleteIndex = false,
523
+ sourceClient: sourceClientInput,
524
+ targetClient: targetClientInput,
425
525
  sourceClientConfig,
426
526
  targetClientConfig,
527
+ sourceClientVersion,
528
+ targetClientVersion,
427
529
  bufferSize = DEFAULT_BUFFER_SIZE,
428
530
  searchSize = DEFAULT_SEARCH_SIZE,
429
531
  stream,
@@ -445,10 +547,12 @@ async function transformer({
445
547
  throw Error('targetIndexName must be specified.');
446
548
  }
447
549
  const defaultClientConfig = {
448
- node: 'http://localhost:9200'
550
+ node: process.env.ELASTICSEARCH_URL || 'http://localhost:9200'
449
551
  };
450
- const sourceClient = new elasticsearch.Client(sourceClientConfig || defaultClientConfig);
451
- const targetClient = new elasticsearch.Client(targetClientConfig || sourceClientConfig || defaultClientConfig);
552
+
553
+ // Support both old (config) and new (client instance) patterns
554
+ const sourceClient = await getOrCreateClient(sourceClientInput || sourceClientConfig, defaultClientConfig, sourceClientVersion);
555
+ const targetClient = await getOrCreateClient(targetClientInput || targetClientConfig || sourceClientInput || sourceClientConfig, defaultClientConfig, targetClientVersion);
452
556
  const createMapping = createMappingFactory({
453
557
  sourceClient,
454
558
  sourceIndexName,
@@ -465,9 +569,7 @@ async function transformer({
465
569
  targetClient,
466
570
  targetIndexName,
467
571
  bufferSize,
468
- skipHeader,
469
- verbose
470
- });
572
+ skipHeader});
471
573
  function getReader() {
472
574
  if (typeof fileName !== 'undefined' && typeof sourceIndexName !== 'undefined') {
473
575
  throw Error('Only either one of fileName or sourceIndexName can be specified.');
@@ -1 +1 @@
1
- {"version":3,"file":"node-es-transformer.cjs.js","sources":["../src/_constants.js","../src/_create-mapping.js","../src/_file-reader.js","../src/_index-queue.js","../src/_index-reader.js","../src/_stream-reader.js","../src/main.js"],"sourcesContent":["// In earlier versions this was used to set the number of docs to index in a\n// single bulk request. Since we switched to use the helpers.bulk() method from\n// the ES client, this now translates to the `flushBytes` option of the helper.\n// However, for kind of a backwards compability with the old values, this uses\n// KBytes instead of Bytes. It will be multiplied by 1024 in the index queue.\nexport const DEFAULT_BUFFER_SIZE = 5120;\n\n// The default number of docs to fetch in a single search request when reindexing.\nexport const DEFAULT_SEARCH_SIZE = 1000;\n","export default function createMappingFactory({\n sourceClient,\n sourceIndexName,\n targetClient,\n targetIndexName,\n mappings,\n mappingsOverride,\n indexMappingTotalFieldsLimit,\n verbose,\n deleteIndex,\n pipeline,\n}) {\n return async () => {\n let targetMappings = mappingsOverride ? undefined : mappings;\n\n if (sourceClient && sourceIndexName && typeof targetMappings === 'undefined') {\n try {\n const mapping = await sourceClient.indices.getMapping({\n index: sourceIndexName,\n });\n if (mapping[sourceIndexName]) {\n targetMappings = mapping[sourceIndexName].mappings;\n } else {\n const allMappings = Object.values(mapping);\n if (allMappings.length > 0) {\n targetMappings = Object.values(mapping)[0].mappings;\n }\n }\n } catch (err) {\n console.log('Error reading source mapping', err);\n return;\n }\n }\n\n if (typeof targetMappings === 'object' && targetMappings !== null) {\n if (mappingsOverride) {\n targetMappings = {\n ...targetMappings,\n properties: {\n ...targetMappings.properties,\n ...mappings,\n },\n };\n }\n\n try {\n const indexExists = await targetClient.indices.exists({ index: targetIndexName });\n\n if (indexExists === true && deleteIndex === true) {\n await targetClient.indices.delete({ index: targetIndexName });\n }\n\n if (indexExists === false || deleteIndex === true) {\n const resp = await targetClient.indices.create({\n index: targetIndexName,\n body: {\n mappings: targetMappings,\n ...(pipeline !== undefined\n ? {\n settings: {\n index: {\n default_pipeline: pipeline,\n },\n },\n }\n : {}),\n ...(indexMappingTotalFieldsLimit !== undefined\n ? {\n settings: {\n 'index.mapping.total_fields.limit': indexMappingTotalFieldsLimit,\n 'index.number_of_shards': 1,\n 'index.number_of_replicas': 0,\n },\n }\n : {}),\n },\n });\n if (verbose) console.log('Created target mapping', resp);\n }\n } catch (err) {\n console.log('Error creating target mapping', err);\n }\n }\n };\n}\n","import fs from 'fs';\nimport es from 'event-stream';\nimport glob from 'glob';\nimport split from 'split2';\n\nexport default function fileReaderFactory(indexer, fileName, transform, splitRegex, verbose) {\n function startIndex(files) {\n let finished = false;\n\n const file = files.shift();\n const s = fs\n .createReadStream(file)\n .pipe(split(splitRegex))\n .pipe(\n es\n .mapSync(line => {\n try {\n // skip empty lines\n if (line === '') {\n return;\n }\n\n const doc =\n typeof transform === 'function'\n ? JSON.stringify(transform(JSON.parse(line)))\n : line;\n\n // if doc is undefined we'll skip indexing it\n if (typeof doc === 'undefined') {\n s.resume();\n return;\n }\n\n // the transform callback may return an array of docs so we can emit\n // multiple docs from a single line\n if (Array.isArray(doc)) {\n doc.forEach(d => indexer.add(d));\n return;\n }\n\n indexer.add(doc);\n } catch (e) {\n console.log('error', e);\n }\n })\n .on('error', err => {\n console.log('Error while reading file.', err);\n })\n .on('end', () => {\n if (verbose) console.log('Read entire file: ', file);\n if (files.length > 0) {\n startIndex(files);\n return;\n }\n\n indexer.finish();\n finished = true;\n }),\n );\n\n indexer.queueEmitter.on('pause', () => {\n if (finished) return;\n s.pause();\n });\n\n indexer.queueEmitter.on('resume', () => {\n if (finished) return;\n s.resume();\n });\n }\n\n return () => {\n glob(fileName, (er, files) => {\n startIndex(files);\n });\n };\n}\n","import { Readable } from 'stream';\n\nimport { DEFAULT_BUFFER_SIZE } from './_constants';\n\nconst EventEmitter = require('events');\n\nconst queueEmitter = new EventEmitter();\n\nconst parallelCalls = 5;\n\n// a simple helper queue to bulk index documents\nexport default function indexQueueFactory({\n targetClient: client,\n targetIndexName,\n bufferSize = DEFAULT_BUFFER_SIZE,\n skipHeader = false,\n}) {\n let docsPerSecond = 0;\n\n const flushBytes = bufferSize * 1024; // Convert KB to Bytes\n const highWaterMark = flushBytes * parallelCalls;\n\n // Create a Readable stream\n const stream = new Readable({\n read() {}, // Implement read but we manage pushing manually\n highWaterMark, // Buffer size for backpressure management\n });\n\n async function* ndjsonStreamIterator(readableStream) {\n let buffer = ''; // To hold the incomplete data\n let skippedHeader = false;\n\n // Iterate over the stream using async iteration\n for await (const chunk of readableStream) {\n buffer += chunk.toString(); // Accumulate the chunk data in the buffer\n\n // Split the buffer into lines (NDJSON items)\n const lines = buffer.split('\\n');\n\n // The last line might be incomplete, so hold it back in the buffer\n buffer = lines.pop();\n\n // Yield each complete JSON object\n for (const line of lines) {\n if (line.trim()) {\n try {\n if (!skipHeader || (skipHeader && !skippedHeader)) {\n yield JSON.parse(line); // Parse and yield the JSON object\n skippedHeader = true;\n }\n } catch (err) {\n // Handle JSON parse errors if necessary\n console.error('Failed to parse JSON:', err);\n }\n }\n }\n }\n\n // Handle any remaining data in the buffer after the stream ends\n if (buffer.trim()) {\n try {\n yield JSON.parse(buffer);\n } catch (err) {\n console.error('Failed to parse final JSON:', err);\n }\n }\n }\n\n let finished = false;\n\n // Async IIFE to start bulk indexing\n (async () => {\n const interval = setInterval(() => {\n queueEmitter.emit('docsPerSecond', docsPerSecond);\n docsPerSecond = 0;\n }, 1000);\n\n await client.helpers.bulk({\n concurrency: parallelCalls,\n flushBytes,\n flushInterval: 1000,\n refreshOnCompletion: true,\n datasource: ndjsonStreamIterator(stream),\n onDocument(doc) {\n docsPerSecond++;\n return {\n index: { _index: targetIndexName },\n };\n },\n });\n\n clearInterval(interval);\n queueEmitter.emit('finish');\n })();\n\n return {\n add: doc => {\n if (finished) {\n throw new Error('Unexpected doc added after indexer should finish.');\n }\n\n const canContinue = stream.push(`${JSON.stringify(doc)}\\n`);\n if (!canContinue) {\n queueEmitter.emit('pause');\n stream.once('drain', () => {\n queueEmitter.emit('resume');\n });\n }\n },\n finish: () => {\n finished = true;\n stream.push(null);\n },\n queueEmitter,\n };\n}\n","import cliProgress from 'cli-progress';\n\nimport { DEFAULT_SEARCH_SIZE } from './_constants';\n\n// create a new progress bar instance and use shades_classic theme\nconst progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\nexport default function indexReaderFactory(\n indexer,\n sourceIndexName,\n transform,\n client,\n query,\n searchSize = DEFAULT_SEARCH_SIZE,\n populatedFields = false,\n) {\n return async function indexReader() {\n let docsNum = 0;\n let scrollId;\n let finished = false;\n let readActive = false;\n let backPressurePause = false;\n\n async function fetchPopulatedFields() {\n try {\n // Get all populated fields from the index\n const response = await client.fieldCaps(\n {\n index: sourceIndexName,\n fields: '*',\n include_empty_fields: false,\n filters: '-metadata',\n },\n { maxRetries: 0 },\n );\n\n return Object.keys(response.fields);\n } catch (e) {\n console.log('error', e);\n }\n }\n\n function search(fields) {\n return client.search({\n index: sourceIndexName,\n scroll: '600s',\n size: searchSize,\n query,\n ...(fields ? { _source: fields } : {}),\n });\n }\n\n function scroll(id) {\n return client.scroll({\n scroll_id: id,\n scroll: '600s',\n });\n }\n\n let fieldsWithData;\n\n // identify populated fields\n if (populatedFields) {\n fieldsWithData = await fetchPopulatedFields();\n }\n\n await fetchNextResponse();\n\n function processHit(hit) {\n docsNum += 1;\n try {\n const doc = typeof transform === 'function' ? transform(hit._source) : hit._source; // eslint-disable-line no-underscore-dangle\n\n // if doc is undefined we'll skip indexing it\n if (typeof doc === 'undefined') {\n return;\n }\n\n // the transform callback may return an array of docs so we can emit\n // multiple docs from a single line\n if (Array.isArray(doc)) {\n doc.forEach(d => indexer.add(d));\n return;\n }\n\n indexer.add(doc);\n } catch (e) {\n console.log('error', e);\n }\n }\n\n async function fetchNextResponse() {\n readActive = true;\n\n const sc = scrollId ? await scroll(scrollId) : await search(fieldsWithData);\n\n if (!scrollId) {\n progressBar.start(sc.hits.total.value, 0);\n }\n\n scrollId = sc._scroll_id;\n readActive = false;\n\n processResponse(sc);\n }\n\n async function processResponse(response) {\n // collect the docs from this response\n response.hits.hits.forEach(processHit);\n\n progressBar.update(docsNum);\n\n // check to see if we have collected all of the docs\n if (response.hits.total.value === docsNum) {\n indexer.finish();\n return;\n }\n\n if (!backPressurePause) {\n await fetchNextResponse();\n }\n }\n\n indexer.queueEmitter.on('pause', async () => {\n backPressurePause = true;\n });\n\n indexer.queueEmitter.on('resume', async () => {\n backPressurePause = false;\n\n if (readActive || finished) {\n return;\n }\n\n await fetchNextResponse();\n });\n\n indexer.queueEmitter.on('finish', () => {\n finished = true;\n progressBar.stop();\n });\n };\n}\n","import es from 'event-stream';\nimport split from 'split2';\n\nexport default function streamReaderFactory(indexer, stream, transform, splitRegex, verbose) {\n function startIndex() {\n let finished = false;\n\n const s = stream.pipe(split(splitRegex)).pipe(\n es\n .mapSync(line => {\n try {\n // skip empty lines\n if (line === '') {\n return;\n }\n\n const doc =\n typeof transform === 'function' ? JSON.stringify(transform(JSON.parse(line))) : line;\n\n // if doc is undefined we'll skip indexing it\n if (typeof doc === 'undefined') {\n s.resume();\n return;\n }\n\n // the transform callback may return an array of docs so we can emit\n // multiple docs from a single line\n if (Array.isArray(doc)) {\n doc.forEach(d => indexer.add(d));\n return;\n }\n\n indexer.add(doc);\n } catch (e) {\n console.log('error', e);\n }\n })\n .on('error', err => {\n console.log('Error while reading stream.', err);\n })\n .on('end', () => {\n if (verbose) console.log('Read entire stream.');\n indexer.finish();\n finished = true;\n }),\n );\n\n indexer.queueEmitter.on('pause', () => {\n if (finished) return;\n s.pause();\n });\n\n indexer.queueEmitter.on('resume', () => {\n if (finished) return;\n s.resume();\n });\n }\n\n return () => {\n startIndex();\n };\n}\n","import elasticsearch from '@elastic/elasticsearch';\n\nimport { DEFAULT_BUFFER_SIZE, DEFAULT_SEARCH_SIZE } from './_constants';\nimport createMappingFactory from './_create-mapping';\nimport fileReaderFactory from './_file-reader';\nimport indexQueueFactory from './_index-queue';\nimport indexReaderFactory from './_index-reader';\nimport streamReaderFactory from './_stream-reader';\n\nexport default async function transformer({\n deleteIndex = false,\n sourceClientConfig,\n targetClientConfig,\n bufferSize = DEFAULT_BUFFER_SIZE,\n searchSize = DEFAULT_SEARCH_SIZE,\n stream,\n fileName,\n splitRegex = /\\n/,\n sourceIndexName,\n targetIndexName,\n mappings,\n mappingsOverride = false,\n indexMappingTotalFieldsLimit,\n pipeline,\n populatedFields = false,\n query,\n skipHeader = false,\n transform,\n verbose = true,\n}) {\n if (typeof targetIndexName === 'undefined') {\n throw Error('targetIndexName must be specified.');\n }\n\n const defaultClientConfig = {\n node: 'http://localhost:9200',\n };\n\n const sourceClient = new elasticsearch.Client(sourceClientConfig || defaultClientConfig);\n const targetClient = new elasticsearch.Client(\n targetClientConfig || sourceClientConfig || defaultClientConfig,\n );\n\n const createMapping = createMappingFactory({\n sourceClient,\n sourceIndexName,\n targetClient,\n targetIndexName,\n mappings,\n mappingsOverride,\n indexMappingTotalFieldsLimit,\n verbose,\n deleteIndex,\n pipeline,\n });\n const indexer = indexQueueFactory({\n targetClient,\n targetIndexName,\n bufferSize,\n skipHeader,\n verbose,\n });\n\n function getReader() {\n if (typeof fileName !== 'undefined' && typeof sourceIndexName !== 'undefined') {\n throw Error('Only either one of fileName or sourceIndexName can be specified.');\n }\n\n if (\n (typeof fileName !== 'undefined' && typeof sourceIndexName !== 'undefined') ||\n (typeof fileName !== 'undefined' && typeof stream !== 'undefined') ||\n (typeof sourceIndexName !== 'undefined' && typeof stream !== 'undefined')\n ) {\n throw Error('Only one of fileName, sourceIndexName, or stream can be specified.');\n }\n\n if (typeof fileName !== 'undefined') {\n return fileReaderFactory(indexer, fileName, transform, splitRegex, verbose);\n }\n\n if (typeof sourceIndexName !== 'undefined') {\n return indexReaderFactory(\n indexer,\n sourceIndexName,\n transform,\n sourceClient,\n query,\n searchSize,\n populatedFields,\n );\n }\n\n if (typeof stream !== 'undefined') {\n return streamReaderFactory(indexer, stream, transform, splitRegex, verbose);\n }\n\n return null;\n }\n\n const reader = getReader();\n\n try {\n const indexExists = await targetClient.indices.exists({ index: targetIndexName });\n\n if (indexExists === false) {\n await createMapping();\n reader();\n } else if (deleteIndex === true) {\n await targetClient.indices.delete({ index: targetIndexName });\n await createMapping();\n reader();\n } else {\n reader();\n }\n } catch (error) {\n console.error('Error checking index existence:', error);\n } finally {\n // targetClient.close();\n }\n\n return { events: indexer.queueEmitter };\n}\n"],"names":["DEFAULT_BUFFER_SIZE","DEFAULT_SEARCH_SIZE","createMappingFactory","sourceClient","sourceIndexName","targetClient","targetIndexName","mappings","mappingsOverride","indexMappingTotalFieldsLimit","verbose","deleteIndex","pipeline","targetMappings","undefined","mapping","indices","getMapping","index","allMappings","Object","values","length","err","console","log","properties","indexExists","exists","delete","resp","create","body","settings","default_pipeline","fileReaderFactory","indexer","fileName","transform","splitRegex","startIndex","files","finished","file","shift","s","fs","createReadStream","pipe","split","es","mapSync","line","doc","JSON","stringify","parse","resume","Array","isArray","forEach","d","add","e","on","finish","queueEmitter","pause","glob","er","EventEmitter","require","parallelCalls","indexQueueFactory","client","bufferSize","skipHeader","docsPerSecond","flushBytes","highWaterMark","stream","Readable","read","ndjsonStreamIterator","readableStream","buffer","skippedHeader","chunk","toString","lines","pop","trim","error","interval","setInterval","emit","helpers","bulk","concurrency","flushInterval","refreshOnCompletion","datasource","onDocument","_index","clearInterval","Error","canContinue","push","once","progressBar","cliProgress","SingleBar","Presets","shades_classic","indexReaderFactory","query","searchSize","populatedFields","indexReader","docsNum","scrollId","readActive","backPressurePause","fetchPopulatedFields","response","fieldCaps","fields","include_empty_fields","filters","maxRetries","keys","search","scroll","size","_source","id","scroll_id","fieldsWithData","fetchNextResponse","processHit","hit","sc","start","hits","total","value","_scroll_id","processResponse","update","stop","streamReaderFactory","transformer","sourceClientConfig","targetClientConfig","defaultClientConfig","node","elasticsearch","Client","createMapping","getReader","reader","events"],"mappings":"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"}
1
+ {"version":3,"file":"node-es-transformer.cjs.js","sources":["../src/_constants.js","../src/_create-mapping.js","../src/_file-reader.js","../src/_index-queue.js","../src/_index-reader.js","../src/_stream-reader.js","../src/main.js"],"sourcesContent":["// In earlier versions this was used to set the number of docs to index in a\n// single bulk request. Since we switched to use the helpers.bulk() method from\n// the ES client, this now translates to the `flushBytes` option of the helper.\n// However, for kind of a backwards compability with the old values, this uses\n// KBytes instead of Bytes. It will be multiplied by 1024 in the index queue.\nexport const DEFAULT_BUFFER_SIZE = 5120;\n\n// The default number of docs to fetch in a single search request when reindexing.\nexport const DEFAULT_SEARCH_SIZE = 1000;\n","export default function createMappingFactory({\n sourceClient,\n sourceIndexName,\n targetClient,\n targetIndexName,\n mappings,\n mappingsOverride,\n indexMappingTotalFieldsLimit,\n verbose,\n deleteIndex,\n pipeline,\n}) {\n return async () => {\n let targetMappings = mappingsOverride ? undefined : mappings;\n\n if (sourceClient && sourceIndexName && typeof targetMappings === 'undefined') {\n try {\n const mapping = await sourceClient.indices.getMapping({\n index: sourceIndexName,\n });\n if (mapping[sourceIndexName]) {\n targetMappings = mapping[sourceIndexName].mappings;\n } else {\n const allMappings = Object.values(mapping);\n if (allMappings.length > 0) {\n targetMappings = Object.values(mapping)[0].mappings;\n }\n }\n } catch (err) {\n console.log('Error reading source mapping', err);\n return;\n }\n }\n\n if (typeof targetMappings === 'object' && targetMappings !== null) {\n if (mappingsOverride) {\n targetMappings = {\n ...targetMappings,\n properties: {\n ...targetMappings.properties,\n ...mappings,\n },\n };\n }\n\n try {\n const indexExists = await targetClient.indices.exists({ index: targetIndexName });\n\n if (indexExists === true && deleteIndex === true) {\n await targetClient.indices.delete({ index: targetIndexName });\n }\n\n if (indexExists === false || deleteIndex === true) {\n const resp = await targetClient.indices.create({\n index: targetIndexName,\n mappings: targetMappings,\n ...(pipeline !== undefined\n ? {\n settings: {\n index: {\n default_pipeline: pipeline,\n },\n },\n }\n : {}),\n ...(indexMappingTotalFieldsLimit !== undefined\n ? {\n settings: {\n 'index.mapping.total_fields.limit': indexMappingTotalFieldsLimit,\n 'index.number_of_shards': 1,\n 'index.number_of_replicas': 0,\n },\n }\n : {}),\n });\n if (verbose) console.log('Created target mapping', resp);\n }\n } catch (err) {\n console.log('Error creating target mapping', err);\n }\n }\n };\n}\n","import fs from 'fs';\nimport es from 'event-stream';\nimport { globSync } from 'glob';\nimport split from 'split2';\n\nexport default function fileReaderFactory(indexer, fileName, transform, splitRegex, verbose) {\n function startIndex(files) {\n let finished = false;\n\n const file = files.shift();\n const s = fs\n .createReadStream(file)\n .pipe(split(splitRegex))\n .pipe(\n es\n .mapSync(line => {\n try {\n // skip empty lines\n if (line === '') {\n return;\n }\n\n const doc =\n typeof transform === 'function'\n ? JSON.stringify(transform(JSON.parse(line)))\n : line;\n\n // if doc is undefined we'll skip indexing it\n if (typeof doc === 'undefined') {\n s.resume();\n return;\n }\n\n // the transform callback may return an array of docs so we can emit\n // multiple docs from a single line\n if (Array.isArray(doc)) {\n doc.forEach(d => indexer.add(d));\n return;\n }\n\n indexer.add(doc);\n } catch (e) {\n console.log('error', e);\n }\n })\n .on('error', err => {\n console.log('Error while reading file.', err);\n })\n .on('end', () => {\n if (verbose) console.log('Read entire file: ', file);\n if (files.length > 0) {\n startIndex(files);\n return;\n }\n\n indexer.finish();\n finished = true;\n }),\n );\n\n indexer.queueEmitter.on('pause', () => {\n if (finished) return;\n s.pause();\n });\n\n indexer.queueEmitter.on('resume', () => {\n if (finished) return;\n s.resume();\n });\n }\n\n return () => {\n try {\n const files = globSync(fileName);\n startIndex(files);\n } catch (error) {\n console.log('Error matching files:', error);\n }\n };\n}\n","import { Readable } from 'stream';\n\nimport { DEFAULT_BUFFER_SIZE } from './_constants';\n\nconst EventEmitter = require('events');\n\nconst queueEmitter = new EventEmitter();\n\nconst parallelCalls = 5;\n\n// a simple helper queue to bulk index documents\nexport default function indexQueueFactory({\n targetClient: client,\n targetIndexName,\n bufferSize = DEFAULT_BUFFER_SIZE,\n skipHeader = false,\n}) {\n let docsPerSecond = 0;\n\n const flushBytes = bufferSize * 1024; // Convert KB to Bytes\n const highWaterMark = flushBytes * parallelCalls;\n\n // Create a Readable stream\n const stream = new Readable({\n read() {}, // Implement read but we manage pushing manually\n highWaterMark, // Buffer size for backpressure management\n });\n\n async function* ndjsonStreamIterator(readableStream) {\n let buffer = ''; // To hold the incomplete data\n let skippedHeader = false;\n\n try {\n // Iterate over the stream using async iteration\n for await (const chunk of readableStream) {\n buffer += chunk.toString(); // Accumulate the chunk data in the buffer\n\n // Split the buffer into lines (NDJSON items)\n const lines = buffer.split('\\n');\n\n // The last line might be incomplete, so hold it back in the buffer\n buffer = lines.pop();\n\n // Yield each complete JSON object\n for (const line of lines) {\n if (line.trim()) {\n try {\n if (!skipHeader || (skipHeader && !skippedHeader)) {\n yield JSON.parse(line); // Parse and yield the JSON object\n skippedHeader = true;\n }\n } catch (err) {\n // Handle JSON parse errors if necessary\n console.error('Failed to parse JSON:', err);\n }\n }\n }\n }\n\n // Handle any remaining data in the buffer after the stream ends\n if (buffer.trim()) {\n try {\n yield JSON.parse(buffer);\n } catch (err) {\n console.error('Failed to parse final JSON:', err);\n }\n }\n } finally {\n // Ensure the stream is properly cleaned up if the iterator is terminated early\n if (!readableStream.destroyed) {\n readableStream.destroy();\n }\n }\n }\n\n let finished = false;\n let drainListener = null;\n\n // Async IIFE to start bulk indexing\n (async () => {\n const interval = setInterval(() => {\n queueEmitter.emit('docsPerSecond', docsPerSecond);\n docsPerSecond = 0;\n }, 1000);\n\n try {\n await client.helpers.bulk({\n concurrency: parallelCalls,\n flushBytes,\n flushInterval: 1000,\n refreshOnCompletion: true,\n datasource: ndjsonStreamIterator(stream),\n onDocument(doc) {\n docsPerSecond++;\n return {\n index: { _index: targetIndexName },\n };\n },\n });\n } catch (error) {\n console.error('Error during bulk indexing:', error);\n throw error;\n } finally {\n // Clean up interval\n clearInterval(interval);\n\n // Remove drain listener if it exists\n if (drainListener) {\n stream.removeListener('drain', drainListener);\n drainListener = null;\n }\n\n // Remove all listeners from stream\n stream.removeAllListeners();\n\n // Properly destroy the stream to prevent open handles\n if (!stream.destroyed) {\n stream.destroy();\n }\n\n // Emit finish and clean up queue emitter listeners\n queueEmitter.emit('finish');\n queueEmitter.removeAllListeners();\n }\n })();\n\n return {\n add: doc => {\n if (finished) {\n throw new Error('Unexpected doc added after indexer should finish.');\n }\n\n const canContinue = stream.push(`${JSON.stringify(doc)}\\n`);\n if (!canContinue) {\n queueEmitter.emit('pause');\n\n // Store the listener so we can clean it up later\n drainListener = () => {\n queueEmitter.emit('resume');\n };\n stream.once('drain', drainListener);\n }\n },\n finish: () => {\n finished = true;\n stream.push(null);\n },\n queueEmitter,\n };\n}\n","import cliProgress from 'cli-progress';\n\nimport { DEFAULT_SEARCH_SIZE } from './_constants';\n\n// create a new progress bar instance and use shades_classic theme\nconst progressBar = new cliProgress.SingleBar({}, cliProgress.Presets.shades_classic);\n\nexport default function indexReaderFactory(\n indexer,\n sourceIndexName,\n transform,\n client,\n query,\n searchSize = DEFAULT_SEARCH_SIZE,\n populatedFields = false,\n) {\n return async function indexReader() {\n let docsNum = 0;\n let scrollId;\n let finished = false;\n let readActive = false;\n let backPressurePause = false;\n\n async function fetchPopulatedFields() {\n try {\n // Get all populated fields from the index\n const response = await client.fieldCaps(\n {\n index: sourceIndexName,\n fields: '*',\n include_empty_fields: false,\n filters: '-metadata',\n },\n { maxRetries: 0 },\n );\n\n return Object.keys(response.fields);\n } catch (e) {\n console.log('error', e);\n }\n }\n\n function search(fields) {\n return client.search({\n index: sourceIndexName,\n scroll: '600s',\n size: searchSize,\n query,\n ...(fields ? { _source: fields } : {}),\n });\n }\n\n function scroll(id) {\n return client.scroll({\n scroll_id: id,\n scroll: '600s',\n });\n }\n\n let fieldsWithData;\n\n // identify populated fields\n if (populatedFields) {\n fieldsWithData = await fetchPopulatedFields();\n }\n\n await fetchNextResponse();\n\n function processHit(hit) {\n docsNum += 1;\n try {\n const doc = typeof transform === 'function' ? transform(hit._source) : hit._source; // eslint-disable-line no-underscore-dangle\n\n // if doc is undefined we'll skip indexing it\n if (typeof doc === 'undefined') {\n return;\n }\n\n // the transform callback may return an array of docs so we can emit\n // multiple docs from a single line\n if (Array.isArray(doc)) {\n doc.forEach(d => indexer.add(d));\n return;\n }\n\n indexer.add(doc);\n } catch (e) {\n console.log('error', e);\n }\n }\n\n async function fetchNextResponse() {\n readActive = true;\n\n const sc = scrollId ? await scroll(scrollId) : await search(fieldsWithData);\n\n if (!scrollId) {\n progressBar.start(sc.hits.total.value, 0);\n }\n\n scrollId = sc._scroll_id;\n readActive = false;\n\n processResponse(sc);\n }\n\n async function processResponse(response) {\n // collect the docs from this response\n response.hits.hits.forEach(processHit);\n\n progressBar.update(docsNum);\n\n // check to see if we have collected all of the docs\n if (response.hits.total.value === docsNum) {\n indexer.finish();\n return;\n }\n\n if (!backPressurePause) {\n await fetchNextResponse();\n }\n }\n\n indexer.queueEmitter.on('pause', async () => {\n backPressurePause = true;\n });\n\n indexer.queueEmitter.on('resume', async () => {\n backPressurePause = false;\n\n if (readActive || finished) {\n return;\n }\n\n await fetchNextResponse();\n });\n\n indexer.queueEmitter.on('finish', () => {\n finished = true;\n progressBar.stop();\n });\n };\n}\n","import es from 'event-stream';\nimport split from 'split2';\n\nexport default function streamReaderFactory(indexer, stream, transform, splitRegex, verbose) {\n function startIndex() {\n let finished = false;\n\n const s = stream.pipe(split(splitRegex)).pipe(\n es\n .mapSync(line => {\n try {\n // skip empty lines\n if (line === '') {\n return;\n }\n\n const doc =\n typeof transform === 'function' ? JSON.stringify(transform(JSON.parse(line))) : line;\n\n // if doc is undefined we'll skip indexing it\n if (typeof doc === 'undefined') {\n s.resume();\n return;\n }\n\n // the transform callback may return an array of docs so we can emit\n // multiple docs from a single line\n if (Array.isArray(doc)) {\n doc.forEach(d => indexer.add(d));\n return;\n }\n\n indexer.add(doc);\n } catch (e) {\n console.log('error', e);\n }\n })\n .on('error', err => {\n console.log('Error while reading stream.', err);\n })\n .on('end', () => {\n if (verbose) console.log('Read entire stream.');\n indexer.finish();\n finished = true;\n }),\n );\n\n indexer.queueEmitter.on('pause', () => {\n if (finished) return;\n s.pause();\n });\n\n indexer.queueEmitter.on('resume', () => {\n if (finished) return;\n s.resume();\n });\n }\n\n return () => {\n startIndex();\n };\n}\n","import elasticsearch9 from 'es9';\nimport elasticsearch8 from 'es8';\n\nimport { DEFAULT_BUFFER_SIZE, DEFAULT_SEARCH_SIZE } from './_constants';\nimport createMappingFactory from './_create-mapping';\nimport fileReaderFactory from './_file-reader';\nimport indexQueueFactory from './_index-queue';\nimport indexReaderFactory from './_index-reader';\nimport streamReaderFactory from './_stream-reader';\n\n/**\n * Detect Elasticsearch version by querying the cluster\n */\nasync function detectElasticsearchVersion(config) {\n try {\n // Try with v9 client first (most common for new setups)\n const testClient = new elasticsearch9.Client(config);\n const info = await testClient.info();\n const version = info.version?.number;\n await testClient.close();\n\n if (version) {\n const majorVersion = parseInt(version.split('.')[0], 10);\n return majorVersion;\n }\n } catch (e) {\n // If v9 client fails, try v8 client\n try {\n const testClient = new elasticsearch8.Client(config);\n const info = await testClient.info();\n const version = info.version?.number;\n await testClient.close();\n\n if (version) {\n const majorVersion = parseInt(version.split('.')[0], 10);\n return majorVersion;\n }\n } catch (e2) {\n // Could not detect version\n }\n }\n\n // Default to v9 if detection fails\n return 9;\n}\n\n/**\n * Create or validate an Elasticsearch client\n * @param {Object|Client} clientOrConfig - Either a client instance or config object\n * @param {Object} defaultConfig - Default configuration to use if creating a new client\n * @param {number} [forceVersion] - Force a specific ES client version (8 or 9)\n */\nasync function getOrCreateClient(clientOrConfig, defaultConfig, forceVersion) {\n // If already a client instance, return it\n if (clientOrConfig && typeof clientOrConfig.info === 'function') {\n return clientOrConfig;\n }\n\n const config = clientOrConfig || defaultConfig;\n\n // If version is forced, use the specified client\n if (forceVersion === 8) {\n return new elasticsearch8.Client(config);\n } else if (forceVersion === 9) {\n return new elasticsearch9.Client(config);\n }\n\n // Auto-detect version\n const majorVersion = await detectElasticsearchVersion(config);\n\n if (majorVersion >= 9) {\n return new elasticsearch9.Client(config);\n } else {\n return new elasticsearch8.Client(config);\n }\n}\n\nexport default async function transformer({\n deleteIndex = false,\n sourceClient: sourceClientInput,\n targetClient: targetClientInput,\n sourceClientConfig,\n targetClientConfig,\n sourceClientVersion,\n targetClientVersion,\n bufferSize = DEFAULT_BUFFER_SIZE,\n searchSize = DEFAULT_SEARCH_SIZE,\n stream,\n fileName,\n splitRegex = /\\n/,\n sourceIndexName,\n targetIndexName,\n mappings,\n mappingsOverride = false,\n indexMappingTotalFieldsLimit,\n pipeline,\n populatedFields = false,\n query,\n skipHeader = false,\n transform,\n verbose = true,\n}) {\n if (typeof targetIndexName === 'undefined') {\n throw Error('targetIndexName must be specified.');\n }\n\n const defaultClientConfig = {\n node: process.env.ELASTICSEARCH_URL || 'http://localhost:9200',\n };\n\n // Support both old (config) and new (client instance) patterns\n const sourceClient = await getOrCreateClient(\n sourceClientInput || sourceClientConfig,\n defaultClientConfig,\n sourceClientVersion,\n );\n\n const targetClient = await getOrCreateClient(\n targetClientInput || targetClientConfig || sourceClientInput || sourceClientConfig,\n defaultClientConfig,\n targetClientVersion,\n );\n\n const createMapping = createMappingFactory({\n sourceClient,\n sourceIndexName,\n targetClient,\n targetIndexName,\n mappings,\n mappingsOverride,\n indexMappingTotalFieldsLimit,\n verbose,\n deleteIndex,\n pipeline,\n });\n const indexer = indexQueueFactory({\n targetClient,\n targetIndexName,\n bufferSize,\n skipHeader,\n verbose,\n });\n\n function getReader() {\n if (typeof fileName !== 'undefined' && typeof sourceIndexName !== 'undefined') {\n throw Error('Only either one of fileName or sourceIndexName can be specified.');\n }\n\n if (\n (typeof fileName !== 'undefined' && typeof sourceIndexName !== 'undefined') ||\n (typeof fileName !== 'undefined' && typeof stream !== 'undefined') ||\n (typeof sourceIndexName !== 'undefined' && typeof stream !== 'undefined')\n ) {\n throw Error('Only one of fileName, sourceIndexName, or stream can be specified.');\n }\n\n if (typeof fileName !== 'undefined') {\n return fileReaderFactory(indexer, fileName, transform, splitRegex, verbose);\n }\n\n if (typeof sourceIndexName !== 'undefined') {\n return indexReaderFactory(\n indexer,\n sourceIndexName,\n transform,\n sourceClient,\n query,\n searchSize,\n populatedFields,\n );\n }\n\n if (typeof stream !== 'undefined') {\n return streamReaderFactory(indexer, stream, transform, splitRegex, verbose);\n }\n\n return null;\n }\n\n const reader = getReader();\n\n try {\n const indexExists = await targetClient.indices.exists({ index: targetIndexName });\n\n if (indexExists === false) {\n await createMapping();\n reader();\n } else if (deleteIndex === true) {\n await targetClient.indices.delete({ index: targetIndexName });\n await createMapping();\n reader();\n } else {\n reader();\n }\n } catch (error) {\n console.error('Error checking index existence:', error);\n } finally {\n // targetClient.close();\n }\n\n return { events: indexer.queueEmitter };\n}\n"],"names":["DEFAULT_BUFFER_SIZE","DEFAULT_SEARCH_SIZE","createMappingFactory","sourceClient","sourceIndexName","targetClient","targetIndexName","mappings","mappingsOverride","indexMappingTotalFieldsLimit","verbose","deleteIndex","pipeline","targetMappings","undefined","mapping","indices","getMapping","index","allMappings","Object","values","length","err","console","log","properties","indexExists","exists","delete","resp","create","settings","default_pipeline","fileReaderFactory","indexer","fileName","transform","splitRegex","startIndex","files","finished","file","shift","s","fs","createReadStream","pipe","split","es","mapSync","line","doc","JSON","stringify","parse","resume","Array","isArray","forEach","d","add","e","on","finish","queueEmitter","pause","globSync","error","EventEmitter","require","parallelCalls","indexQueueFactory","client","bufferSize","skipHeader","docsPerSecond","flushBytes","highWaterMark","stream","Readable","read","ndjsonStreamIterator","readableStream","buffer","skippedHeader","chunk","toString","lines","pop","trim","destroyed","destroy","drainListener","interval","setInterval","emit","helpers","bulk","concurrency","flushInterval","refreshOnCompletion","datasource","onDocument","_index","clearInterval","removeListener","removeAllListeners","Error","canContinue","push","once","progressBar","cliProgress","SingleBar","Presets","shades_classic","indexReaderFactory","query","searchSize","populatedFields","indexReader","docsNum","scrollId","readActive","backPressurePause","fetchPopulatedFields","response","fieldCaps","fields","include_empty_fields","filters","maxRetries","keys","search","scroll","size","_source","id","scroll_id","fieldsWithData","fetchNextResponse","processHit","hit","sc","start","hits","total","value","_scroll_id","processResponse","update","stop","streamReaderFactory","detectElasticsearchVersion","config","testClient","elasticsearch9","Client","info","version","number","close","majorVersion","parseInt","elasticsearch8","e2","getOrCreateClient","clientOrConfig","defaultConfig","forceVersion","transformer","sourceClientInput","targetClientInput","sourceClientConfig","targetClientConfig","sourceClientVersion","targetClientVersion","defaultClientConfig","node","process","env","ELASTICSEARCH_URL","createMapping","getReader","reader","events"],"mappings":"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"}