12.1.3
v12.1.3 (2026-10-12)
Bug fixes
core,microservices- #18111 fix(core,microservices): flush buffered logs when initialization fails (@thekhegay)
- #17993 fix(core,microservices): run transient global enhancers on controllers (@johnnyhuirilef)
platform-express- #18110 fix(express): guard async request hook completion (@GiHoon1123)
- #17973 fix(express): destroy the
StreamableFilesource on client disconnect (@maxymlyskov) - #17942 fix(express): run wildcard middleware on the bare global prefix path (@Chaoqi31)
core- #18104 fix(core): fail at startup for request-scoped class global enhancers (@thekhegay)
- #18066 fix(core): stop silently dropping request-scoped global enhancers (@OmBhandwaldar)
- #18072 fix(core): resolve uri versioned exclusions for the not-found handler (@basteez)
- #18075 fix(core): normalize slashes when mapping controllers for middleware (@basteez)
- #18086 fix(core): do not mutate the message when assigning an sse event id (@Metehan-Bicer)
- #18025 fix(core): end sse streams whose event data cannot be serialized (@OmBhandwaldar)
- #18011 fix(core): send status and headers set by handlers on sse responses (@johnnyhuirilef)
- #18021 fix(core): honor a shutdown signal received while close() is in flight (@maxymlyskov)
- #17987 fix(core): settle SSE lifecycle on early disconnect (@jackie-cqz)
- #17986 fix(core): commit SSE headers for empty streams (@jackie-cqz)
- #17978 fix(core): preserve explicit null values in reflectable decorators (@gophersg)
- #17966 fix(core): run the shutdown sequence after a failed init (@kamilmysliwiec)
- #17963 fix(core): send the expires header on sse responses (@Mohamed-Elshesheny)
- #17953 fix(core): honor global prefix exclusions for overlapping versions (@Chaoqi31)
- #17950 fix(core): let a
GETmiddleware exclusion coverHEADrequests (@Chaoqi31) - #17951 fix(core): reset the listening state when the application closes (@Chaoqi31)
- #17945 fix(core): hash
Map,SetandRegExpoptions in deep-hash tokens (@Chaoqi31) - #17947 fix(core): treat
VERSION_NEUTRALin middleware routes as no version (@Chaoqi31) - #17941 fix(core): turn off express
x-powered-byinuseSecurityHeaders()(@Chaoqi31) - #17939 fix(core): name dynamic host modules in import error messages (@Chaoqi31)
- #17940 fix(core): isolate nested transient providers injected into properties (@Chaoqi31)
microservices- #18108 fix(microservices): keep nats status updates alive when a listener throws (@kamilmysliwiec)
- #18100 fix(microservices): default server options like the client factory does (@thekhegay)
- #18083 fix(microservices): match rmq '#' wildcards in any position (@thekhegay)
- #18095 fix(microservices): fail mqtt requests whose publish fails (@izg0820)
- #18085 fix(microservices): preserve null payloads in kafka tombstone records (@Hangell)
- #18081 fix(microservices): close the connection when the channel close fails (@hktitof)
- #18071 fix(microservices): return the rmq reply publish so failures are handled (@maxymlyskov)
- #18060 fix(microservices): fail redis listen on rejected subscriptions (@kamilmysliwiec)
- #18056 fix(microservices): clone the kafka record before serializing (@Mihir-Rabari)
- #18054 fix(microservices): do not crash when the redis connection drops (@maxymlyskov)
- #18043 fix(microservices): fail pending kafka request on deserializer error (@hktitof)
- #18002 fix(microservices): wait for the TCP TLS handshake (@jackie-cqz)
- #17995 fix(microservices): survive custom deserializer errors in clients (@johnnyhuirilef)
- #18027 fix(microservices): close both kafka client connections when one fails (@izg0820)
- #18008 fix(microservices): unwrap records returned by message handlers (@johnnyhuirilef)
- #18001 fix(microservices): wait for both Redis clients to be ready (@jackie-cqz)
- #18000 fix(microservices): ignore stale NATS status events (@jackie-cqz)
- #17996 fix(microservices): preserve MQTT payload options (@jackie-cqz)
- #17989 fix(microservices): suspend incomplete packet timers during backpressure (@jackie-cqz)
- #17988 fix(microservices): cancel pending TCP retries on close (@jackie-cqz)
- #17972 fix(microservices): keep grpc response errors out of the request stream (@drakeo338)
- #17957 fix(microservices): fail rmq connect and listen on channel setup errors (@johnnyhuirilef)
- #17961 fix(microservices): run every event handler when a sibling completes empty (@johnnyhuirilef)
- #17959 fix(microservices): fail nats requests on undecodable replies (@johnnyhuirilef)
- #17955 fix(microservices): stop rmq client opening two channels on connect (@johnnyhuirilef)
- #17946 fix(microservices): answer client-streaming calls that return nothing (@Chaoqi31)
- #17943 fix(microservices): resolve grpc stream calls that complete empty (@hktitof)
platform-fastify- #18109 fix(fastify): answer the shutdown hooks 503 with fastify's json body (@kamilmysliwiec)
- #18101 fix(fastify): honor
return503OnClosingduring the shutdown hooks (@thekhegay) - #18059 fix(fastify): reject listen() on an invalid port (@kamilmysliwiec)
- #18053 fix(fastify): listen on a socket path (@johnnyhuirilef)
- #17997 fix(fastify): settle async lifecycle hooks once (@jackie-cqz)
- #17998 fix(fastify): preserve custom router constraints (@jackie-cqz)
- #17938 fix(fastify): keep the default body parsers after
useBodyParser()(@Chaoqi31) - #17937 fix(fastify): count headers flushed on
reply.rawinisHeadersSent(@Chaoqi31)
common- #18090 fix(common): keep custom decorator data that has schema or pipes keys (@Ahmad-Mosha)
- #18073 fix(common): reject arrays nested in ParseArrayPipe items (@KAPUIST)
- #17999 fix(common): collect configurable module alias dependencies (@jackie-cqz)
- #17983 fix(common): isolate file type regexp state (@jackie-cqz)
- #17982 fix(common): preserve parent validation constraints (@jackie-cqz)
- #17949 fix(common): let a redeclared
@Inject()property replace the parent's (@Chaoqi31) - #17944 fix(common): keep inherited
@Optional()properties optional (@Chaoqi31)
microservices,websocketswebsockets- #18088 fix(websockets): copy the options object in the base ws exception filter (@Mihir-Rabari)
- #18089 fix(websockets): log scoped gateway resolution errors without a hook (@basteez)
- #18048 fix(websockets): pass gateway lifecycle hook errors to exception filters (@kamilmysliwiec)
- #18046 fix(websockets): pass the pattern when a scoped handler fails to resolve (@kamilmysliwiec)
- #18044 fix(websockets): use the hook name as pattern for request-scoped hooks (@OmBhandwaldar)
- #17985 fix(websockets): retain shared contexts during disconnect hooks (@jackie-cqz)
common,core,platform-express- #17923 fix(common,core,express): answer method miss on an excluded route (@thekhegay)
platform-ws- #18003 fix(ws): default omitted adapter creation options (@jackie-cqz)
core,websockets- #17979 fix(websockets): resolve global scoped enhancers per connection (@jackie-cqz)
core,testing
Enhancements
platform-express,platform-fastify
Docs
Dependencies
platform-fastify- #18050 fix(deps): update dependency @fastify/formbody to v9.0.1 (@renovate[bot])
- #18051 fix(deps): update dependency @fastify/middie to v9.3.5 (@renovate[bot])
- #18039 fix(deps): update dependency @fastify/cors to v11.3.1 (@renovate[bot])
platform-socket.io- #18015 chore(deps): bump socket.io from 4.8.3 to 4.8.4 (@dependabot[bot])
Committers: 23
- Abdellatif Anaflous (@hktitof)
- Ahmed Gamal (@Ahmad-Mosha)
- Aurora (@auroraxo)
- Chaoqi (@Chaoqi31)
- Dustin (@GiHoon1123)
- Hangell (@Hangell)
- Johnny J. Huirilef Millán (@johnnyhuirilef)
- Kamil Mysliwiec (@kamilmysliwiec)
- Lee Jae Hyun (@izg0820)
- Luke Son (@KAPUIST)
- Maksym Lyskov (@maxymlyskov)
- Metehan Biçer (@Metehan-Bicer)
- Micael Levi L. Cavalcante (@micalevisk)
- Mohamed-Zakaria (@Mohamed-Elshesheny)
- Om Bhandwaldar (@OmBhandwaldar)
- Rabari Mihir (@Mihir-Rabari)
- RedShapedMoon (@korrayt)
- Roman Khegay (@thekhegay)
- Tiziano Basile (@basteez)
- Younes Beriane (@drakeo338)
- @gophersg
- jackie_cqz (@jackie-cqz)
- Žan Mlakar (@zanmlakar)