Skip to content

v2.57.0

Choose a tag to compare

@kuzzlebot kuzzlebot released this 30 Sep 08:45
· 39 commits to master since this release

2.57.0 (2026-09-30)

Features

  • apiKeys: allow an api key to be deleted by the key itself or its fingerprint (#2683) (e172c73)
  • ci: ratchet implicit any, and count as unknown as as any (34e29d9)
  • cluster: retransmit lost sync messages before evicting (#2785) (0807880)
  • h4: convert lib/core/validation/validation.js to TypeScript (787cfd7)
  • h5: convert plugin.js and pluginsManager.js to TypeScript (acb958e)
  • h6: convert entryPoint.js and httpwsProtocol.js to TypeScript (5d0ef6d), closes #2749
  • i1: convert the four lib/kuzzle leaves to TypeScript (1990a22)
  • i2: convert internalIndexHandler and dumpGenerator to TypeScript (f7b9ff3)
  • native addons from prebuilt binaries, no compiler at install time (4643d45), closes #2839
  • setup claude (7de8020)
  • skills: add /wrapup skill for end-of-session handoff (bc49d3a)
  • td-43: charge for a type assertion — a sixth ratchet, casts (3f8be8c), closes #2730
  • td-56: fail on a declaration that lies, adopted or not (b415d7f)
  • td-61: make a conversion report the strict count it leaves behind (e21fbf1)
  • ts: flip strict on, and split the test code into its own program (e400320)
  • use new kuzzle vault algorithm (dcea521)
  • utils: distributed reentrant mutex (#2664) (cda3514)
  • vault: use old encryption algorithm unless configured otherwise (7eeec62)

Bug Fixes

  • API keys can be deleted by key or fingerprint on upgraded installs (99b87a7)
  • api: declare RateLimiter's limit without a dead initialiser (0130222)
  • bin: --enable-plugins skips a missing plugin with a warning (step 15, D-4) (dfec664)
  • cache: copy the Redis config with cloneDeep, not structuredClone (step 15, F-07) (1702cb1), closes #2676
  • cache: keep the receiver when calling a hoisted command (b7b7234)
  • changelog: resolve leftover merge-conflict markers (3ce76fc)
  • ci: anchor the strict-check adopted-path match (622531a)
  • ci: let the preflight conversion reminder see uncommitted work (a72c6b1), closes #2774
  • ci: make the implicit-any and casts ratchets fail closed (83f6601), closes #2731
  • ci: normalise the coverage reports before SonarCloud reads them (d3870be)
  • ci: resolve .js targets in the tests/ mirror convention (8c11613), closes #2771
  • ci: restore coverage measurement on TypeScript (TD-24, #2692) (b90eac9), closes #2658
  • ci: stop the local docker unit runner rewriting the host's node_modules (e8ae7af), closes #2793 #2790
  • ci: wait-kuzzle's fourteenth call site, and the prune that removed its runner (ff50dda)
  • cluster: a joining node no longer evicts itself for a message it already has (step 15, F-12) (cceefe8), closes #2777 #2781
  • cluster: answer a joining node's handshake within its timeout (step 15, F-03) (5b4b8e9), closes 2777/#2781
  • cluster: answer the rules node.ts's rename re-scored (17ce162)
  • cluster: answer the three rules the J3a rename re-scored (e78f566)
  • cluster: close TD-33's cluster half — TD-65 and TD-67 (c753464), closes #2773 #2776
  • cluster: do not evict a peer for heartbeats queued behind a recovery (step 15, F-04) (212183d), closes #2896
  • cluster: fork the ID card worker by the extension it actually has (690de4d)
  • cluster: inline SubscriberState, the last S6564 on the slice (84d9a7c)
  • cluster: prove the subscription is live in addNode too (f6def54)
  • cluster: satisfy the TS-only rules the subscriber rename exposed (998e727)
  • cluster: satisfy the two TS-only rules the rename exposed (afae7af)
  • cluster: shutdown before the handshake still disposes (step 15, F-11) (ef882ef), closes #2803
  • cluster: the publisher's history is readonly (fdb944e)
  • cluster: use Object.hasOwn in isSyncTopic (0d56164)
  • core: a node that exits frees the locks it holds (step 15, F-13) (6ab73f3)
  • deps: depend on the stable releases of koncorde and dumpme (52cc8cc)
  • deps: withLock on redis-semaphore, which supports Node 20 (step 15, D-3) (6a2f9ae)
  • document: export accepts an array sort (step 15, F-02) (45c2966), closes #2666
  • dump: check suffix against a regexp to sanitize user input (#2665) (79c9adf)
  • dump: keep handled-error dumps valid and never unhandled (step 15, F-05) (4356506)
  • errors: restore v2.56.0's client-facing text for plugin and WebSocket parsing errors (step 15, F-10) (fdd0512), closes #2803 #2803 #2752
  • export-csv: use sort args is provided in the query (422ae64)
  • h5: put the plugin config NOSONAR on the line Sonar flags (525203b)
  • i1: clear the five minor smells the renames re-scored (e88ca2d)
  • i2: clear the five minor smells the renames re-scored (ec07d91), closes #2688
  • kerror: drop the "probably not a Kuzzle error" suffix from plugin errors (3b030e4)
  • kerror: only an object literal given last is the options object (step 15, F-08) (3c8dbf1), closes #2803
  • kerror: survive being loaded as ESM (71b8c11)
  • kuzzle: close TD-69 — the mappings-import lock race (d37b391)
  • kuzzle: flush the application logger on shutdown (2730955), closes #2747
  • kuzzle: justify the deprecated Mutex on the import lock (6af2921), closes #2688
  • lint: three unused/shadowed bindings left by K4 and K5 (facf9c5)
  • logstash access logs carry the request headers once (b8b05c8)
  • network: enforce the multipart file-size limit and populate connection headers (47c62cf), closes #2749
  • network: Protocol.init takes any falsy first argument again (step 15, F-11) (0202c89), closes #2737
  • plugin: accessors.execute takes a null callback as absent (step 15, F-06) (9a8d036), closes #2803
  • plugin: context.constructors.ESClient follows the configured major version (0a6bc72)
  • plugin: strategy verify may return a then-only thenable (step 15, F-11) (d89e323), closes #2748
  • published typings compile without dev dependencies (2af8b4c)
  • realtime matching no longer throws after geospatial unsubscriptions (eca6292), closes kuzzleio/boost-geospatial-index#29 kuzzleio/koncorde#84 Koncorde#test
  • sonar: clear the 27 new-code violations on the network rename (b858fc2), closes #2688 #2722
  • sonar: clear the 57 new-code minors the rename re-scored (0b2ad1c)
  • sonar: declare Profile._hash as an overloaded method, not a static field (ffca3db)
  • sonar: NOSONAR the two remaining awaits of a non-Promise (TD-26) (85a22fc), closes #2697
  • sonar: optional chaining in documentController + CPD-exclude the file (899f73f)
  • sonar: resolve new-code smells in memoryStorageController (PR C) (1ea5437)
  • sonar: resolve new-code smells in serverController + documentExtractor (PR D) (1d423e5)
  • sonar: resolve the new-code smells the rename re-scored (PR G1) (d96f77f)
  • sonar: resolve the smells the clientAdapter rename re-scored (5eee56f), closes #2688
  • sonar: resolve the three smells the typing pass scored (f396617)
  • sonar: return null rather than Promise.resolve(null) in load() (4c456e1)
  • sonar: split the four functions the rename re-scored as too complex (0efbea0)
  • sonar: the last new-code minor on accessLogger (e72a829)
  • sonar: the last three new-code minors on geoShape (4be97a0)
  • step-03: bin/start-kuzzle-server, whose every option was dead (7006066)
  • step-14: M7 — ts-node reads the test program's options, not its include (2b6d4e5)
  • storage: a missing document answers not_found again (step 15, F-01) (2ad3541)
  • td-20: configure takes a result, and the core stops calling setResult (5824f88)
  • td-20: name the comma-separated array form instead of deprecating it (6e17100), closes #2721
  • td-20: validation reads input.args instead of the deprecated input.resource (7ae3126)
  • td-21: guard _wrapError on the controller name, not the request (65a9e09), closes #2687
  • td-26: drop the five awaits of a non-Promise (914341a), closes #2697
  • td-27: normalize a controller's error where it is raised, not on the funnel (563b183), closes #2703
  • td-28: drop memoryStorageController's class-wide index signature (4687d74), closes #2702 #2704
  • td-33: gate the functional suite on cluster readiness, not on a handshake (267f9d3), closes #2715
  • td-33: keep the log dump armed through the test run (f63f997)
  • td-33: make a cluster startup failure diagnose itself (ad9fe4b)
  • td-33: put fail-fast: false on the monkey matrix too (7ae01af)
  • td-34: correct Profile._hash's return type, and type its patch site (a802d4a), closes #2712 #2712
  • td-35: run copy-binaries without a native binary, and gate the build payload (389c2a0), closes #2713
  • td-36,td-37: gate the artifact that is published, and derive the gate from files (6fbb0ec), closes #2717
  • td-38,td-47: gate a fork's PR on the build, and stop paying for superseded runs (86e309d), closes #2719 #2725 #2734
  • td-40: declare the load path nullable, where it has always been nullable (e08e9fd), closes #2724 #2727
  • td-41: give Protocol.init the two overloads its union was standing in for (859d162), closes #1645 #2728
  • td-41: normalise the entry point with ?? instead of a null ternary (17e7ec1)
  • td-42: hold the coverage rule per converted file, not per block (1c1bd58), closes #2724 #2723 #2723
  • td-43: keep node: on the import the autofix split in two (0affee9)
  • td-43: make type-only imports explicit, repo-wide (ddf66ac)
  • td-44: make the strict check fail closed when tsc does not run (2059381), closes #2731
  • td-45: count extensionless Node executables in the js ratchet (f59a6a6), closes #2719 #2705 #2732
  • td-46: stop asserting an assignment to a stub the spec declared itself (100f6e2), closes #2739
  • td-48: assert that a stack trace never leaves the process (f8b3b06)
  • td-48: keep the production node out of the cluster (548bc48)
  • td-49: let the vitest tree load what reaches lib/api/controllers (6c19eaa)
  • td-50: merge coverage as istanbul, not as V8 ranges (6f095ed), closes #2744
  • td-55: make waterfall ask the chain, not the value (596a0f0)
  • td-56: stop bindPluginMethod declaring a type it does not return (818cb0d), closes #2757
  • td-57: type vault's remembered key honestly, and test it (4603d30)
  • td-58: count the messages that were actually lost (910bc9a), closes #2715
  • td-58: subtract message ids with Long, not with - (a3091ec)
  • td-59: give the cluster the id the process logs under (191a4e7), closes #2757
  • td-59: print both node ids when joining the cluster (d7805c1), closes #2764
  • td-74: the allowed-values statics are readonly (643d70b)
  • td-74: users "out" and "none" no longer share a channel name (324a6c4)
  • td-75: the date type's specification has a type of its own (53dec89)
  • td-76: declare PluginContext.constructors as constructors (6d37959)
  • td-77: remove the two invalid_openapi_schema codes nothing raises (c8cbc1d)
  • td-78: the plugin hook and pipe types admit every form the runtime takes (41c519e)
  • td-79: two config checker messages now say what they check (f3fdc72)
  • td-80: give passport its next, and route every failure through one path (9443c5b)
  • td-81: release the dump lock on every path, and check arguments before taking it (52932f0)
  • test: point cucumber's ts-node at the test program (28828af)
  • tests: close TD-70 — stop pinning the order of an unordered search (c50751b), closes #2783
  • ts-migration: put the NOSONAR marker on the flagged line (66449cb)
  • ts-migration: restore the receiver on dynamic cache-script calls (f68aaf4)
  • types: authController — step 12, K5 (7363d25)
  • types: configuration, controllers, generic events and repositories compile as against v2.56.0 (step 15, TY-04/07) (afcb08d)
  • types: declare accessors.execute's callback form as v2.56.0 did (96f1fc8)
  • types: deprecate Token.connectionId, which no runtime token carries (ADR-0002, TD-07) (4a04dc5)
  • types: ES7 storage service is strict-clean and adopted — step 12, K3 (329692f)
  • types: ES8 storage service is strict-clean and adopted — step 12, K3 (9d80753)
  • types: export public types missing from the types barrel (3dbb530)
  • types: fix triple-l typo in adminController type filename (e733094)
  • types: funnel — step 12, K5 (5a4cc05)
  • types: kerror — step 12, K5 (1ee1d0a)
  • types: let Error stringify a non-string KuzzleError message itself (f611ac8)
  • types: lib/core/network and the manifests — step 12, K5 (d8d8826)
  • types: lib/kuzzle — step 12, K5 (1271750)
  • types: make lib/api/request strict-clean — step 12, K2 (a1eaab0)
  • types: make lib/kerror's error classes strict-clean — step 12, K1 (7ebad7d)
  • types: make lib/types' small files and baseModel strict-clean — step 12, K1 (1b9eea5)
  • types: make lib/util's small files strict-clean — step 12, K1 (3978f0c)
  • types: make nine lib/core files strict-clean — step 12, K1 (cb1db7e)
  • types: make the last fifteen ≤ 5 files strict-clean — step 12, K1 (2bbafeb)
  • types: memoryStorageController and the body assertion — step 12, K5 (60a7dce)
  • types: plugin context, accessors.execute and errors compile as against v2.56.0 (step 15, TY-01/02/05) (0ad75fa)
  • types: plugin.ts, hotelClerk.ts and subscription.ts — step 12, K4 (d37aeac)
  • types: pluginContext, Backend and the debugger — step 12, K5 (f778842)
  • types: pluginsManager — step 12, K4 (27e4c6a)
  • types: point Validation.validate JSDoc at KuzzleRequest (d0484ab)
  • types: queryTranslator and the redis adapter — step 12, K5 (94469d7)
  • types: read the deprecated jwt section through one documented helper (063fb76)
  • types: request getters, user and token read as against v2.56.0 (step 15, TY-03/06) (fb4f550), closes #2801 #2803
  • types: split the three configuration shapes — step 12, K0 (TD-53) (8b51997)
  • types: stop NativeController.constructor inferring never[] (66e3ddc)
  • types: TD-62's model/security half and the repositories it moves into (c07ad0f)
  • types: the cluster — step 12, K5 (20ced7f)
  • types: the last of lib/ — step 12, K5 (aa5f4c2)
  • types: the protocol stack — step 12, K4 (1058067)
  • types: the remaining controllers and documentExtractor — step 12, K5 (3647a19)
  • types: the remaining declarations accept what v2.56.0's did (step 15, TY residuals) (20f7a80)
  • types: the token pair — step 12, K4 (e7614a3)
  • types: the two base classes and validation.ts — step 12, K4 (part 1) (664d3e0)
  • util: model Promback's settled value as T | undefined (5f8e751)
  • validation: a truthy non-boolean collection strict is strict again (step 15, F-09b) (377c9f0), closes #2803
  • validation: let plugin types provide BaseType members as getters or prototype values (step 15, F-09a) (5eb24ba), closes #2722
  • validation: use ??= in the helper the move made new code (02cfdfe)