Release notes

edit

8.16.0

edit

Features

edit
Support for Elasticsearch v8.16
edit

You can find all the API changes here.

Support Apache Arrow in ES|QL helper
edit

The ES|QL helper can now return results as an Apache Arrow Table or RecordBatchReader, which enables high-performance calculations on ES|QL results, even if the response data is larger than the system’s available memory. See ES|QL helper for more information.

Fixes

edit
Pass prototype poisoning options to serializer correctly
edit

The client’s disablePrototypePoisoningProtection option was set to true by default, but when it was set to any other value it was ignored, making it impossible to enable prototype poisoning protection without providing a custom serializer implementation.

8.15.1

edit

Features

edit
Improved support for Elasticsearch v8.15
edit

Updated TypeScript types based on fixes and improvements to the Elasticsearch specification.

8.15.0

edit

Features

edit
Support for Elasticsearch v8.15.0
edit

You can find all the API changes here.

OpenTelemetry zero-code instrumentation support
edit

For those that use an observability service that supports OpenTelemetry spans, the client will now automatically generate traces for each Elasticsearch request it makes. See the docs for more information.

8.14.1

edit

Features

edit
Improved support for Elasticsearch 8.14
edit

Updated types based on fixes and changes to the Elasticsearch specification.

8.14.0

edit

Features

edit
Support for Elasticsearch v8.14.0
edit

You can find all the API changes here.

ES|QL object API helper
edit

A helper method has been added that parses the response of an ES|QL query and converts it into an array of objects. A TypeScript type parameter can also be provided to improve developer experience when working with the result. #2238

onSuccess callback added to bulk helper
edit

The bulk helper now supports an onSuccess callback that will be called for each successful operation. #2199

Request retries are more polite
edit

@elastic/transport v8.6.0 was released, which refactored when and how failed requests are retried. Timed-out requests are no longer retried by default, and retries now use exponential backoff rather than running immediately.

8.13.1

edit

Fixes

edit
Pin @elastic/transport to ~8.4.1
edit

Switching from ^8.4.1 to ~8.4.1 ensures 8.13 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

v8.13.0 was also released depending on v8.4.0 of @elastic/transport instead of v8.4.1, which was unintentional.

8.13.0

edit

Features

edit
Support for Elasticsearch v8.13.0
edit

You can find all the API changes here.

Fixes

edit
Ensure new connections inherit client’s set defaults #2159
edit

When instantiating a client, any connection-related defaults (e.g. requestTimeout) set on that client instance would not be inherited by nodes if they were entered as strings rather than a ConnectionOptions object.

8.12.3

edit

Fixes

edit
Bump @elastic/transport to ~8.4.1
edit

Switching from ^8.4.1 to ~8.4.1 ensures 8.12 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

8.12.2

edit

Fixes

edit
Upgrade transport to 8.4.1 #2137
edit

Upgrades @elastic/transport to 8.4.1 to resolve a bug where arrays in error diagnostics were unintentionally transformed into objects.

8.12.1

edit

Fixes

edit
Fix hang in bulk helper semaphore #2027
edit

The failing state could be reached when a server’s response times are slower than flushInterval.

8.12.0

edit

Features

edit
Support for Elasticsearch v8.12.0
edit

You can find all the API changes here.

8.11.1

edit

Fixes

edit
Bump @elastic/transport to ~8.4.0
edit

Switching from ^8.4.0 to ~8.4.0 ensures 8.11 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

8.11.0

edit

Features

edit
Support for Elasticsearch v8.11.0
edit

You can find all the API changes here.

Enhanced support for redacting potentially sensitive data #2095
edit

@elastic/transport version 8.4.0 introduces enhanced measures for ensuring that request metadata attached to some Error objects is redacted. This functionality is primarily to address custom logging solutions that don’t use common serialization methods like JSON.stringify, console.log, or util.inspect, which were already accounted for.

See Redaction of potentially sensitive data for more information.

8.10.1

edit

Fixes

edit
Bump @elastic/transport to ~8.3.4
edit

Switching from ^8.3.4 to ~8.3.4 ensures 8.10 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

8.10.0

edit

Features

edit
Support for Elasticsearch v8.10.0
edit

You can find all the API changes here.

8.9.2

edit

Fixes

edit
Bump @elastic/transport to ~8.3.4
edit

Switching from ^8.3.4 to ~8.3.4 ensures 8.9 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

8.9.1

edit

Fixes

edit
Upgrade Transport #1968
edit

Upgrades @elastic/transport to the latest patch release to fix a bug that could cause the process to exit when handling malformed HEAD requests.

8.9.0

edit

Features

edit
Support for Elasticsearch v8.9.0
edit

You can find all the API changes here.

Allow document to be overwritten in onDocument iteratee of bulk helper #1732
edit

In the bulk helper, documents could not be modified before being sent to Elasticsearch. It is now possible to modify a document before sending it.

Fixes

edit
Updated user-agent header #1954
edit

The user-agent header the client used to connect to Elasticsearch was using a non-standard format that has been improved.

8.8.2

edit

Fixes

edit
Bump @elastic/transport to ~8.3.2
edit

Switching from ^8.3.2 to ~8.3.2 ensures 8.8 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

8.8.1

edit

Features

edit
Support for Elasticsearch v8.8.1
edit

You can find all the API changes here.

Fixes

edit
Fix index drift bug in bulk helper #1759
edit

Fixes a bug in the bulk helper that would cause onDrop to send back the wrong JSON document or error on a nonexistent document when an error occurred on a bulk HTTP request that contained a delete action.

Fix a memory leak caused by an outdated version of Undici #1902
edit

Undici 5.5.1, used by elastic-transport-js, could create a memory leak when a high volume of requests created too many HTTP abort listeners. Upgrading Undici to 5.22.1 removed the memory leak.

8.8.0

edit

Features

edit
Support for Elasticsearch v8.8.0
edit

You can find all the API changes here.

Fixes

edit
Fix type declarations for legacy types with a body key #1784
edit

Prior releases contained a bug where type declarations for legacy types that include a body key were not actually importing the type that includes the body key.

8.7.3

edit

Fixes

edit
Bump @elastic/transport to ~8.3.1
edit

Switching from ^8.3.1 to ~8.3.1 ensures 8.7 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

8.7.0

edit
Support for Elasticsearch v8.7.0
edit

You can find all the API changes here.

8.6.1

edit

Fixes

edit
Bump @elastic/transport to ~8.3.1
edit

Switching from ^8.3.1 to ~8.3.1 ensures 8.6 client users are not required to update to Node.js v18+, which is a new requirement set by @elastic/transport v8.5.0. See elastic/elastic-transport-js#91 for details.

8.6.0

edit
Bump @elastic/transport to 8.3.1+ #1802
edit

The @elastic/transport dependency has been bumped to ~8.3.1 to ensure fixes to the maxResponseSize option are available in the client.

Support for Elasticsearch v8.6.0
edit

You can find all the API changes here.

8.5.0

edit
Support for Elasticsearch v8.5.0
edit

You can find all the API changes here.

8.4.0

edit
Support for Elasticsearch v8.4.0
edit

You can find all the API changes here.

8.2.1

edit

Fixes

edit
Support for Elasticsearch v8.2.1
edit

You can find all the API changes here.

Fix ndjson APIs #1688
edit

The previous release contained a bug that broken ndjson APIs. We have released v8.2.0-patch.1 to address this. This fix is the same as the one we have released and we strongly recommend upgrading to this version.

Fix node shutdown apis #1697
edit

The shutdown APIs wheren’t complete, this fix completes them.

Types: move query keys to body #1693

edit

The types definitions where wrongly representing the types of fields present in both query and body.

8.2.0

edit

Breaking changes

edit
Drop Node.js v12 #1670
edit

According to our Node.js support matrix.

Features

edit
Support for Elasticsearch v8.2
edit

You can find all the API changes here.

More lenient parameter checks #1662
edit

When creating a new client, an undefined caFingerprint no longer trigger an error for a http connection.

Update TypeScript docs and export estypes #1675
edit

You can import the full TypeScript requests & responses definitions as it follows:

import { estypes } from '@elastic/elasticsearch'

If you need the legacy definitions with the body, you can do the following:

import { estypesWithBody } from '@elastic/elasticsearch'

Fixes

edit
Updated hpagent to the latest version transport/#49
edit

You can fing the related changes here.

8.1.0

edit

Features

edit
Support for Elasticsearch v8.1
edit

You can find all the API changes here.

Export SniffingTransport #1653
edit

Now the client exports the SniffingTransport class.

Fixes

edit
Fix onFlushTimeout timer not being cleared when upstream errors #1616
edit

Fixes a memory leak caused by an error in the upstream dataset of the bulk helper.

Cleanup abort listener transport/#42
edit

The legacy http client was not cleaning up the abort listener, which could cause a memory leak.

Improve undici performances transport/#41
edit

Improve the stream body collection and keep alive timeout.

8.0.0

edit

Features

edit
Support for Elasticsearch v8.0
edit

You can find all the API changes here.

Drop old typescript definitions
edit

Breaking: Yes | Migration effort: Medium

The current TypeScript definitions will be removed from the client, and the new definitions, which contain request and response definitions as well will be shipped by default.

Drop callback-style API
edit

Breaking: Yes | Migration effort: Large

Maintaining both API styles is not a problem per se, but it makes error handling more convoluted due to async stack traces. Moving to a full-promise API will solve this issue.

// callback-style api
client.search({ params }, { options }, (err, result) => {
 console.log(err || result)
})

// promise-style api
client.search({ params }, { options })
  .then(console.log)
  .catch(console.log)

// async-style (sugar syntax on top of promises)
const response = await client.search({ params }, { options })
console.log(response)

If you are already using the promise-style API, this won’t be a breaking change for you.

Remove the current abort API and use the new AbortController standard
edit

Breaking: Yes | Migration effort: Small

The old abort API makes sense for callbacks but it’s annoying to use with promises

// callback-style api
const request = client.search({ params }, { options }, (err, result) => {
 console.log(err) // RequestAbortedError
})

request.abort()

// promise-style api
const promise = client.search({ params }, { options })

promise
  .then(console.log)
  .catch(console.log) // RequestAbortedError

promise.abort()

Node v12 has added the standard AbortController API which is designed to work well with both callbacks and promises.

const ac = new AbortController()
client.search({ params }, { signal: ac.signal })
  .then(console.log)
  .catch(console.log) // RequestAbortedError

ac.abort()
Remove the body key from the request
edit

Breaking: Yes | Migration effort: Small

Thanks to the new types we are developing now we know exactly where a parameter should go. The client API leaks HTTP-related notions in many places, and removing them would definitely improve the DX.

This could be a rather big breaking change, so a double solution could be used during the 8.x lifecycle. (accepting body keys without them being wrapped in the body as well as the current solution).

To convert code from 7.x, you need to remove the body parameter in all the endpoints request. For instance, this is an example for the search endpoint:

// from
const response = await client.search({
  index: 'test',
  body: {
    query: {
      match_all: {}
    }
  }
})

// to
const response = await client.search({
  index: 'test',
  query: {
    match_all: {}
  }
})
Migrate to new separate transport
edit

Breaking: Yes | Migration effort: Small to none

The separated transport has been rewritten in TypeScript and has already dropped the callback style API. Given that now is separated, most of the Elasticsearch specific concepts have been removed, and the client will likely need to extend parts of it for reintroducing them. If you weren’t extending the internals of the client, this won’t be a breaking change for you.

The returned value of API calls is the body and not the HTTP related keys
edit

Breaking: Yes | Migration effort: Small

The client API leaks HTTP-related notions in many places, and removing them would definitely improve the DX. The client will expose a new request-specific option to still get the full response details.

The new behaviour returns the body value directly as response. If you want to have the 7.x response format, you need to add meta : true in the request. This will return all the HTTP meta information, including the body.

For instance, this is an example for the search endpoint:

// from
const response = await client.search({
  index: 'test',
  body: {
    query: {
      match_all: {}
    }
  }
})
console.log(response) // { body: SearchResponse, statusCode: number, headers: object, warnings: array }

// to
const response = await client.search({
  index: 'test',
  query: {
    match_all: {}
  }
})
console.log(response) // SearchResponse

// with a bit of TypeScript and JavaScript magic...
const response = await client.search({
  index: 'test',
  query: {
    match_all: {}
  }
}, {
  meta: true
})
console.log(response) // { body: SearchResponse, statusCode: number, headers: object, warnings: array }
Use a weighted connection pool
edit

Breaking: Yes | Migration effort: Small to none

Move from the current cluster connection pool to a weight-based implementation. This new implementation offers better performances and runs less code in the background, the old connection pool can still be used. If you weren’t extending the internals of the client, this won’t be a breaking change for you.

Migrate to the "undici" http client
edit

Breaking: Yes | Migration effort: Small to none

By default, the HTTP client will no longer be the default Node.js HTTP client, but undici instead. Undici is a brand new HTTP client written from scratch, it offers vastly improved performances and has better support for promises. Furthermore, it offers comprehensive and predictable error handling. The old HTTP client can still be used. If you weren’t extending the internals of the client, this won’t be a breaking change for you.

Drop support for old camelCased keys
edit

Breaking: Yes | Migration effort: Medium

Currently, every path or query parameter could be expressed in both snake_case and camelCase. Internally the client will convert everything to snake_case. This was done in an effort to reduce the friction of migrating from the legacy to the new client, but now it no longer makes sense. If you are already using snake_case keys, this won’t be a breaking change for you.

Rename ssl option to tls
edit

Breaking: Yes | Migration effort: Small

People usually refers to this as tls, furthermore, internally we use the tls API and Node.js refers to it as tls everywhere.

// before
const client = new Client({
  node: 'https://localhost:9200',
  ssl: {
    rejectUnauthorized: false
  }
})

// after
const client = new Client({
  node: 'https://localhost:9200',
  tls: {
    rejectUnauthorized: false
  }
})
Remove prototype poisoning protection
edit

Breaking: Yes | Migration effort: Small

Prototype poisoning protection is very useful, but it can cause performances issues with big payloads. In v8 it will be removed, and the documentation will show how to add it back with a custom serializer.

Remove client extensions API
edit

Breaking: Yes | Migration effort: Large

Nowadays the client support the entire Elasticsearch API, and the transport.request method can be used if necessary. The client extensions API have no reason to exist.

client.extend('utility.index', ({ makeRequest }) => {
  return function _index (params, options) {
    // your code
  }
})

client.utility.index(...)

If you weren’t using client extensions, this won’t be a breaking change for you.

Move to TypeScript
edit

Breaking: No | Migration effort: None

The new separated transport is already written in TypeScript, and it makes sense that the client v8 will be fully written in TypeScript as well.

Move from emitter-like interface to a diagnostic method
edit

Breaking: Yes | Migration effort: Small

Currently, the client offers a subset of methods of the EventEmitter class, v8 will ship with a diagnostic property which will be a proper event emitter.

// from
client.on('request', console.log)

// to
client.diagnostic.on('request', console.log)
Remove username & password properties from Cloud configuration
edit

Breaking: Yes | Migration effort: Small

The Cloud configuration does not support ApiKey and Bearer auth, while the auth options does. There is no need to keep the legacy basic auth support in the cloud configuration.

// before
const client = new Client({
  cloud: {
    id: '<cloud-id>',
    username: 'elastic',
    password: 'changeme'
  }
})

// after
const client = new Client({
  cloud: {
    id: '<cloud-id>'
  },
  auth: {
    username: 'elastic',
    password: 'changeme'
  }
})

If you are already passing the basic auth options in the auth configuration, this won’t be a breaking change for you.

Calling client.close will reject new requests
edit

Once you call client.close every new request after that will be rejected with a NoLivingConnectionsError. In-flight requests will be executed normally unless an in-flight request requires a retry, in which case it will be rejected.

Parameters rename
edit
  • ilm.delete_lifecycle: policy parameter has been renamed to name
  • ilm.get_lifecycle: policy parameter has been renamed to name
  • ilm.put_lifecycle: policy parameter has been renamed to name
  • snapshot.cleanup_repository: repository parameter has been renamed to name
  • snapshot.create_repository: repository parameter has been renamed to name
  • snapshot.delete_repository: repository parameter has been renamed to name
  • snapshot.get_repository: repository parameter has been renamed to name
  • snapshot.verify_repository: repository parameter has been renamed to name
Removal of snake_cased methods
edit

The v7 client provided snake_cased methods, such as client.delete_by_query. This is no longer supported, now only camelCased method are present. So client.delete_by_query can be accessed with client.deleteByQuery