The format is based on Keep a Changelog.
2.0.6 - 2026-05-26
- fix(security): use a safe 25 MiB default for
spool_afterwhen missing or invalid. - fix(security): prevent body lines like
--__proto__--\r\nfrom mutating Object.prototype - fix:
destroy()during a pending spool open now closes the late-arriving fd and removes the spool file
2.0.5 - 2026-05-12
- fix: restore compat shim for legacy
dot_stuffingoption (Haraka < 3.1). See haraka/email-message#23.
2.0.4 - 2026-05-10
- fix: add
unpipefor cleaning up failed pipes. See also #22 and other issues where Cannot pipe while currently piping surfaced.
2.0.3 - 2026-04-23
- register
transformer.once('end'...)before piping #21
2.0.2 - 2026-04-08
- fix: limit header size to prevent memory exhaustion
- fix: limit boundaries to prevent memory exhaustion
- fix: sanitize the spool filename, prevent path traversal
- fix: on Writable stream, set
autoClose: falseendis a noop here, that's for fs.createReadableStream
- fix: wait until spool WS is flushed before pipe.
- non-issue for node 22+, introduced in #19, race condition on node <= 20
- fix: GetDataStream must extend Writable, not legacy Stream #19
2.0.1 - 2026-04-02
- fix(pipe): honor
end: falseoption to prevent closing destination when piping - change: drop legacy dot_stuffing option
- test: add test coverage for
end: falseoption
2.0.0 - 2026-03-23
- docs(README): added pretty good documentation
- transformers: HeaderSkipper & LineTransformer (separated the concerns)
- async Iteration: implemented
Symbol.asyncIteratorforfor await...of. - pipeline Architecture:
pipe()now generates independentPassThroughandTransformchains per call to support natural backpressure and sequential piping.
- style(exnext): converted
MessageStreaminternal state (#queue,#fd,#bufferMax, etc.) to private class fields. - style(esnext): replaced
write_completepolling with a_write_completeevent listener. - source delegation:
pause()andresume()now delegate directly to the active#currentSource.
- error propagation: ensure disk I/O errors correctly propagate via
this.emit('error') - race conditions: updated
destroy()to close file descriptors before unlinking to preventEBADFerrors.
1.3.3 - 2026-03-23
- test: added functional tests, coverage 69 -> 93%
- dep(h-test-fixtures): removed, unused
- ci publish: more permissions (#14)
- publish: add read perms (#13)
1.3.2 - 2025-12-30
- use optional chaining for c.main.dot_stuffed
- doc(README): remove code climate badge
1.3.1 - 2025-07-23
- fix: add a compat shim for dot_stuffing on Haraka < 3.1
1.3.0 - 2025-06-27
- fix: also remove dot-stuffing from leftovers #9
- thanks to report at haraka/haraka-plugin-dkim#17
- test: add tests for removing dot-stuffing
- fix: replace polynomial regex with trimEnd()
- change: rename dot_stuffing -> dot_stuffed, consistent with Haraka
- improves readability, fixes a case of the not nots
- change: switch test runner from mocha to
node --test - doc(README): add ref to Haraka Transaction docs showing usage
- deps(test-fixtures): bump to latest
1.2.3 - 2025-02-02
- dep(eslint): upgrade to v9
- prettier: move config into package.json
1.2.2 - 2024-08-05
- chore: populate [files] in package.json. Delete .npmignore.
- chore: automated code formatting
- ci: updated to shared configs
- dep: eslint-plugin-haraka -> @haraka/eslint-config
- doc: added CONTRIBUTORS.md
- doc: consistent naming of "special" files like CHANGELOG.md.
1.2.1 - 2024-04-03
- es6: use optional chaining (?.), for safety
- es6: use default function params
1.2.0 - 2022-06-24
- merged in ChunkEmitter, only used here
- copied in indexOfLF, removed haraka-utils dependency
1.1.0 - 2022-06-23
- fix: boundary marker corruption issue haraka/Haraka#3068
- Import from Haraka
- convert tests to mocha