mqtt-plus 1.4.15 → 1.4.17

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.
Files changed (104) hide show
  1. package/.claude/CLAUDE.md +1 -0
  2. package/.gemini/settings.json +5 -0
  3. package/AGENTS.md +86 -95
  4. package/CHANGELOG.md +49 -0
  5. package/README.md +1 -1
  6. package/doc/mqtt-plus-api.md +36 -18
  7. package/doc/mqtt-plus-architecture.md +1 -1
  8. package/doc/mqtt-plus-broker-setup.md +2 -2
  9. package/doc/mqtt-plus-comm.md +5 -3
  10. package/doc/mqtt-plus-internals.md +11 -1
  11. package/dst-stage1/mqtt-plus-auth.js +2 -13
  12. package/dst-stage1/mqtt-plus-auth.js.map +1 -1
  13. package/dst-stage1/mqtt-plus-base.d.ts +2 -1
  14. package/dst-stage1/mqtt-plus-base.js +14 -3
  15. package/dst-stage1/mqtt-plus-base.js.map +1 -1
  16. package/dst-stage1/mqtt-plus-error.d.ts +1 -0
  17. package/dst-stage1/mqtt-plus-error.js +62 -38
  18. package/dst-stage1/mqtt-plus-error.js.map +1 -1
  19. package/dst-stage1/mqtt-plus-event.d.ts +2 -0
  20. package/dst-stage1/mqtt-plus-event.js +60 -12
  21. package/dst-stage1/mqtt-plus-event.js.map +1 -1
  22. package/dst-stage1/mqtt-plus-info.d.ts +5 -1
  23. package/dst-stage1/mqtt-plus-msg.d.ts +5 -3
  24. package/dst-stage1/mqtt-plus-msg.js +10 -8
  25. package/dst-stage1/mqtt-plus-msg.js.map +1 -1
  26. package/dst-stage1/mqtt-plus-service.d.ts +2 -0
  27. package/dst-stage1/mqtt-plus-service.js +128 -21
  28. package/dst-stage1/mqtt-plus-service.js.map +1 -1
  29. package/dst-stage1/mqtt-plus-sink.d.ts +5 -0
  30. package/dst-stage1/mqtt-plus-sink.js +369 -89
  31. package/dst-stage1/mqtt-plus-sink.js.map +1 -1
  32. package/dst-stage1/mqtt-plus-source.d.ts +2 -0
  33. package/dst-stage1/mqtt-plus-source.js +217 -78
  34. package/dst-stage1/mqtt-plus-source.js.map +1 -1
  35. package/dst-stage1/mqtt-plus-subscription.js +14 -8
  36. package/dst-stage1/mqtt-plus-subscription.js.map +1 -1
  37. package/dst-stage1/mqtt-plus-timer.d.ts +2 -0
  38. package/dst-stage1/mqtt-plus-timer.js +48 -0
  39. package/dst-stage1/mqtt-plus-timer.js.map +1 -1
  40. package/dst-stage1/mqtt-plus-trace.js +3 -1
  41. package/dst-stage1/mqtt-plus-trace.js.map +1 -1
  42. package/dst-stage1/mqtt-plus-util.d.ts +17 -2
  43. package/dst-stage1/mqtt-plus-util.js +56 -14
  44. package/dst-stage1/mqtt-plus-util.js.map +1 -1
  45. package/dst-stage1/mqtt-plus-version.d.ts +2 -0
  46. package/dst-stage1/mqtt-plus-version.js +3 -0
  47. package/dst-stage1/mqtt-plus-version.js.map +1 -1
  48. package/dst-stage1/tsc.tsbuildinfo +1 -1
  49. package/dst-stage2/{mqtt-plus.cjs.js → mqtt-plus.cjs.cjs} +806 -254
  50. package/dst-stage2/mqtt-plus.esm.js +806 -254
  51. package/dst-stage2/mqtt-plus.umd.js +11 -11
  52. package/etc/d2.mts +19 -13
  53. package/etc/knip.jsonc +2 -1
  54. package/etc/stx.conf +24 -17
  55. package/etc/tsc.json +0 -1
  56. package/etc/vite.mts +3 -2
  57. package/package.d/@typescript-eslint+typescript-estree+8.57.2.patch +12 -0
  58. package/package.d/{vite+8.0.0.patch → vite+8.0.3.patch} +2 -2
  59. package/package.json +25 -19
  60. package/src/mqtt-plus-auth.ts +3 -15
  61. package/src/mqtt-plus-base.ts +22 -8
  62. package/src/mqtt-plus-error.ts +68 -40
  63. package/src/mqtt-plus-event.ts +66 -13
  64. package/src/mqtt-plus-info.ts +9 -3
  65. package/src/mqtt-plus-msg.ts +24 -18
  66. package/src/mqtt-plus-service.ts +135 -21
  67. package/src/mqtt-plus-sink.ts +399 -99
  68. package/src/mqtt-plus-source.ts +232 -83
  69. package/src/mqtt-plus-subscription.ts +17 -9
  70. package/src/mqtt-plus-timer.ts +54 -2
  71. package/src/mqtt-plus-trace.ts +3 -1
  72. package/src/mqtt-plus-util.ts +62 -14
  73. package/src/mqtt-plus-version.ts +5 -1
  74. package/tst/.c8/index.html +59 -59
  75. package/tst/.c8/mqtt-plus-auth.ts.html +2 -2
  76. package/tst/.c8/mqtt-plus-base.ts.html +100 -97
  77. package/tst/.c8/mqtt-plus-codec.ts.html +1 -1
  78. package/tst/.c8/mqtt-plus-encode.ts.html +1 -1
  79. package/tst/.c8/mqtt-plus-error.ts.html +67 -67
  80. package/tst/.c8/mqtt-plus-event.ts.html +34 -10
  81. package/tst/.c8/mqtt-plus-meta.ts.html +1 -1
  82. package/tst/.c8/mqtt-plus-msg.ts.html +25 -16
  83. package/tst/.c8/mqtt-plus-options.ts.html +10 -10
  84. package/tst/.c8/mqtt-plus-service.ts.html +34 -10
  85. package/tst/.c8/mqtt-plus-sink.ts.html +830 -140
  86. package/tst/.c8/mqtt-plus-source.ts.html +452 -89
  87. package/tst/.c8/mqtt-plus-subscription.ts.html +6 -6
  88. package/tst/.c8/mqtt-plus-timer.ts.html +12 -12
  89. package/tst/.c8/mqtt-plus-trace.ts.html +8 -8
  90. package/tst/.c8/mqtt-plus-util.ts.html +245 -128
  91. package/tst/.c8/mqtt-plus-version.ts.html +10 -10
  92. package/tst/.c8/mqtt-plus.ts.html +1 -1
  93. package/tst/.c8/tmp/coverage-55051-1774563847819-2.json +1 -0
  94. package/tst/.c8/tmp/coverage-55051-1774563847829-1.json +1 -0
  95. package/tst/.c8/tmp/coverage-55051-1774563847850-0.json +1 -0
  96. package/tst/.c8/tmp/{coverage-6578-1773528089194-0.json → coverage-55052-1774563837907-0.json} +1 -1
  97. package/tst/mqtt-plus-0-broker-mosquitto.ts +2 -2
  98. package/tst/mqtt-plus-5-source.spec.ts +3 -3
  99. package/tst/mqtt-plus-7-spool.spec.ts +65 -0
  100. package/tst/tsc.cov.json +1 -3
  101. package/tst/tsc.std.json +1 -3
  102. package/tst/.c8/tmp/coverage-6577-1773528098323-2.json +0 -1
  103. package/tst/.c8/tmp/coverage-6577-1773528098331-1.json +0 -1
  104. package/tst/.c8/tmp/coverage-6577-1773528098353-0.json +0 -1
@@ -0,0 +1 @@
1
+ @../AGENTS.md
@@ -0,0 +1,5 @@
1
+ {
2
+ "context": {
3
+ "fileName": "AGENTS.md"
4
+ }
5
+ }
package/AGENTS.md CHANGED
@@ -1,47 +1,41 @@
1
1
 
2
- AGENTS
3
- ======
2
+ # Overview for AI Agents
4
3
 
5
- This file provides guidance to Agentic AI Coding Tools when working with code in this repository.
4
+ ## Project Abstract
6
5
 
7
- Project Overview
8
- ----------------
6
+ MQTT+ (`mqtt-plus`) is a TypeScript library implementing four MQTT
7
+ communication patterns with full type safety: Event Emission, Service
8
+ Call (RPC), Source Fetch, and Sink Push. It uses `mqtt` as a peer
9
+ dependency and builds to ESM, CJS, and UMD formats.
9
10
 
10
- MQTT+ (`mqtt-plus`) is a TypeScript library implementing four MQTT communication patterns
11
- with full type safety: Event Emission, Service Call (RPC), Source Fetch, and Sink Push.
12
- It uses `mqtt` as a peer dependency and builds to ESM, CJS, and UMD formats.
11
+ ## Technology Stack
13
12
 
14
- Commands
15
- --------
13
+ Build-Tools: npm, @rse/stx, vite, eslint, typescript
14
+ Language: TypeScript
15
+ Libraries: nanoid, cbor2, p-lazy, valibot, jose, @stablelib/pbkdf2, @stablelib/sha256
16
+ Runtime: Browser, Node.js
16
17
 
17
- MQTT+ plus uses NPM:
18
+ ## Build Commands
18
19
 
19
- ```bash
20
- npm install # install dependencies
21
- ```
22
-
23
- Build and development commands use STX (`@rse/stx`) as the task runner:
20
+ Build and development commands use NPM and STX (`@rse/stx`) as the task runner:
24
21
 
25
22
  ```bash
26
- npm start lint # standard: perform static code analysis
27
- npm start build # standard: build everything
28
- npm start test # standard: run unit test suite
23
+ npm install # install dependencies
29
24
 
30
- npm start build-doc # generate SVG diagrams from D2 sources only
31
- npm start dev # development watch mode (rebuild on change)
32
- npm start sample # run sample/sample.ts via `tsx`
25
+ npm start lint # standard: perform static code analysis
26
+ npm start build # standard: build everything
27
+ npm start test # standard: run unit test suite
33
28
 
34
- npm start clean # remove dst-stage1/ and dst-stage2/
35
- npm start distclean # remove node_modules/ and package-lock.json
36
- npm start publish # publish to npm (restricted to maintainer host)
37
- ```
29
+ npm start build-doc # generate SVG diagrams from D2 sources only
30
+ npm start dev # development watch mode (rebuild on change)
31
+ npm start sample # run sample/sample.ts via `tsx`
38
32
 
39
- Tests require an MQTT broker under run-time; the test suite starts/stops
40
- one automatically. If Docker is available, a Mosquitto broker is used;
41
- otherwise, the Aedes in-process broker serves as the fallback.
33
+ npm start clean # remove dst-stage1/ and dst-stage2/
34
+ npm start distclean # remove node_modules/ and package-lock.json
35
+ npm start publish # publish to npm (restricted to maintainer host)
36
+ ```
42
37
 
43
- Build Pipeline
44
- --------------
38
+ ## Build Pipeline
45
39
 
46
40
  Two-stage build:
47
41
 
@@ -52,16 +46,22 @@ Two-stage build:
52
46
  `mqtt-plus.esm.js`, `mqtt-plus.cjs.js`, `mqtt-plus.umd.js`.
53
47
  UMD build includes Node polyfills (events, stream, buffer).
54
48
 
55
- Configuration lives in `etc/`: `tsc.json`, `vite.mts`, `eslint.mts`, `knip.jsonc`, `stx.conf`, `d2.mts`, `d2.theme.d2`, `logo.ai`, `logo.svg`.
49
+ Configuration lives in `etc/`: `tsc.json`, `vite.mts`, `eslint.mts`,
50
+ `knip.jsonc`, `stx.conf`, `d2.mts`, `d2.theme.d2`, `logo.ai`,
51
+ `logo.svg`.
52
+
53
+ Tests require an MQTT broker under run-time; the test suite starts/stops
54
+ one automatically. If Docker is available, a Mosquitto broker is used;
55
+ otherwise, the Aedes in-process broker serves as the fallback.
56
+ For regression testing always use the all-in-one command `npm start build test`.
56
57
 
57
- Architecture
58
- ------------
58
+ ## Architecture
59
59
 
60
60
  ### Trait-Based Mixin Tower
61
61
 
62
62
  The library is composed as a vertical chain of trait classes (mixins),
63
- each extending the previous. The final exported class `MQTTp` sits at
64
- the bottom of this chain:
63
+ each extending the previous one. The final exported class `MQTTp` sits
64
+ at the bottom of this chain:
65
65
 
66
66
  ```
67
67
  OptionsTrait — configuration (id, codec, timeout, share, chunkSize, chunkCredit, topicMake/topicMatch)
@@ -85,63 +85,55 @@ Each trait lives in its own file: `src/mqtt-plus-<trait>.ts`.
85
85
 
86
86
  ### Key Source Files
87
87
 
88
- | File | Role |
89
- |---------------------------------|------|
90
- | `src/mqtt-plus.ts` | Main entry point, re-exports public API types and the final MQTTp class |
91
- | `src/mqtt-plus-api.ts` | Branded endpoint type definitions (Event, Service, Source, Sink) and APISchema generic |
92
- | `src/mqtt-plus-info.ts` | Info/context object types passed to pattern callbacks (sender metadata, etc.) |
93
- | `src/mqtt-plus-error.ts` | Spool (resource cleanup) and run (error handling) utilities |
94
- | `src/mqtt-plus-util.ts` | PLazy, CreditGate flow control, and stream/buffer collection utilities |
95
- | `src/mqtt-plus-version.ts` | Version utility for converting version strings to numeric format |
96
- | `src/mqtt-plus-options.ts` | OptionsTraitconfiguration (id, codec, timeout, share, chunkSize, chunkCredit, topicMake/topicMatch) |
97
- | `src/mqtt-plus-codec.ts` | CodecTraitCBOR and JSON codec encoding/decoding |
98
- | `src/mqtt-plus-encode.ts` | EncodeTraitstring/buffer conversion utilities (str2buf, buf2str) |
99
- | `src/mqtt-plus-msg.ts` | MsgTraitmessage class definitions, valibot schemas, and parsing logic |
100
- | `src/mqtt-plus-trace.ts` | TraceTraitEventEmitter and structured logging |
101
- | `src/mqtt-plus-base.ts` | BaseTraitMQTT client connection, subscription management, message routing |
102
- | `src/mqtt-plus-subscription.ts` | SubscriptionTrait RefCountedSubscription class and ref-counted MQTT topic subscription management |
103
- | `src/mqtt-plus-timer.ts` | TimerTraitnamed timer management (refresh/clear) |
104
- | `src/mqtt-plus-meta.ts` | MetaTraitinstance and per-request metadata management |
105
- | `src/mqtt-plus-auth.ts` | AuthTraitJWT authentication (jose) and role-based access control |
106
- | `src/mqtt-plus-event.ts` | EventTraitEvent Emission communication pattern (event/emit) |
107
- | `src/mqtt-plus-service.ts` | ServiceTraitService Call / RPC communication pattern (service/call) |
108
- | `src/mqtt-plus-source.ts` | SourceTrait — Source Fetch communication pattern (source/fetch) |
109
- | `src/mqtt-plus-sink.ts` | SinkTrait — Sink Push communication pattern (sink/push) |
110
-
111
- ### Documentation
112
-
113
- The `doc/` directory contains Markdown documentation, D2 diagram sources,
114
- and generated SVG files:
115
-
116
- - `doc/mqtt-plus-api.md` public API reference
117
- - `doc/mqtt-plus-architecture.{d2,svg,md}` architecture overview (diagram + docs)
118
- - `doc/mqtt-plus-broker-setup.md` MQTT broker setup guide
119
- - `doc/mqtt-plus-comm.md` communication patterns overview
120
- - `doc/mqtt-plus-comm-event-emission.{d2,svg}` Event Emission pattern diagram
121
- - `doc/mqtt-plus-comm-service-call.{d2,svg}` Service Call pattern diagram
122
- - `doc/mqtt-plus-comm-sink-push.{d2,svg}` Sink Push pattern diagram
123
- - `doc/mqtt-plus-comm-source-fetch.{d2,svg}` Source Fetch pattern diagram
124
- - `doc/mqtt-plus-internals.md` internal implementation details
125
-
126
- Regenerate diagrams with `npm start build-doc` (requires the `etc/d2.mts` helper script).
127
-
128
- ### Tests
129
-
130
- Test files live in `tst/`:
131
-
132
- | File | Role |
133
- |-----------------------------------|------|
134
- | `tst/mqtt-plus-0-fixture.ts` | Shared test fixture setup (broker, MQTTp instances, etc.) |
135
- | `tst/mqtt-plus-0-broker.ts` | Broker dispatch: creates Aedes or Mosquitto broker based on env |
136
- | `tst/mqtt-plus-0-broker-aedes.ts` | Helper for starting/stopping the Aedes MQTT broker |
137
- | `tst/mqtt-plus-0-broker-mosquitto.ts` | Helper for starting/stopping the Mosquitto MQTT broker |
138
- | `tst/mqtt-plus-1-api.spec.ts` | API type and endpoint definition tests |
139
- | `tst/mqtt-plus-2-event.spec.ts` | Event Emission pattern tests |
140
- | `tst/mqtt-plus-3-service.spec.ts` | Service Call / RPC pattern tests |
141
- | `tst/mqtt-plus-4-sink.spec.ts` | Sink Push pattern tests |
142
- | `tst/mqtt-plus-5-source.spec.ts` | Source Fetch pattern tests |
143
- | `tst/mqtt-plus-6-misc.spec.ts` | Miscellaneous / edge-case tests |
144
- | `tst/tsc.json` | TypeScript configuration for the test directory |
88
+ - `src/mqtt-plus.ts`: Main entry point, re-exports public API types and the final MQTTp class
89
+ - `src/mqtt-plus-api.ts`: Branded endpoint type definitions (Event, Service, Source, Sink) and APISchema generic
90
+ - `src/mqtt-plus-info.ts`: Info/context object types passed to pattern callbacks (sender metadata, etc.)
91
+ - `src/mqtt-plus-error.ts`: Spool (resource cleanup) and run (error handling) utilities
92
+ - `src/mqtt-plus-util.ts`: PLazy, CreditGate flow control, and stream/buffer collection utilities
93
+ - `src/mqtt-plus-version.ts`: Version utility for converting version strings to numeric format
94
+ - `src/mqtt-plus-options.ts`: OptionsTrait configuration (id, codec, timeout, share, chunkSize, chunkCredit, topicMake/topicMatch)
95
+ - `src/mqtt-plus-codec.ts`: CodecTrait CBOR and JSON codec encoding/decoding
96
+ - `src/mqtt-plus-encode.ts`: EncodeTraitstring/buffer conversion utilities (str2buf, buf2str)
97
+ - `src/mqtt-plus-msg.ts`: MsgTraitmessage class definitions, valibot schemas, and parsing logic
98
+ - `src/mqtt-plus-trace.ts`: TraceTraitEventEmitter and structured logging
99
+ - `src/mqtt-plus-base.ts`: BaseTraitMQTT client connection, subscription management, message routing
100
+ - `src/mqtt-plus-subscription.ts`: SubscriptionTraitRefCountedSubscription class and ref-counted MQTT topic subscription management
101
+ - `src/mqtt-plus-timer.ts`: TimerTraitnamed timer management (refresh/clear)
102
+ - `src/mqtt-plus-meta.ts`: MetaTraitinstance and per-request metadata management
103
+ - `src/mqtt-plus-auth.ts`: AuthTraitJWT authentication (jose) and role-based access control
104
+ - `src/mqtt-plus-event.ts`: EventTraitEvent Emission communication pattern (event/emit)
105
+ - `src/mqtt-plus-service.ts`: ServiceTraitService Call / RPC communication pattern (service/call)
106
+ - `src/mqtt-plus-source.ts`: SourceTraitSource Fetch communication pattern (source/fetch)
107
+ - `src/mqtt-plus-sink.ts`: SinkTraitSink Push communication pattern (sink/push)
108
+
109
+ ### Key Test Files
110
+
111
+ - `tst/mqtt-plus-0-fixture.ts`: Shared test fixture setup (broker, MQTTp instances, etc.)
112
+ - `tst/mqtt-plus-0-broker.ts`: Broker dispatch: creates Aedes or Mosquitto broker based on env
113
+ - `tst/mqtt-plus-0-broker-aedes.ts`: Helper for starting/stopping the Aedes MQTT broker
114
+ - `tst/mqtt-plus-0-broker-mosquitto.ts`: Helper for starting/stopping the Mosquitto MQTT broker
115
+ - `tst/mqtt-plus-1-api.spec.ts`: API type and endpoint definition tests
116
+ - `tst/mqtt-plus-2-event.spec.ts`: Event Emission pattern tests
117
+ - `tst/mqtt-plus-3-service.spec.ts`: Service Call / RPC pattern tests
118
+ - `tst/mqtt-plus-4-sink.spec.ts`: Sink Push pattern tests
119
+ - `tst/mqtt-plus-5-source.spec.ts`: Source Fetch pattern tests
120
+ - `tst/mqtt-plus-6-misc.spec.ts`: Miscellaneous / edge-case tests
121
+ - `tst/mqtt-plus-7-spool.spec.ts`: Spool (resource cleanup) utility tests
122
+ - `tst/mqtt-plus-8-run.spec.ts`: Run (error handling) utility tests
123
+ - `tst/tsc.std.json`: TypeScript configuration for the test directory (standard)
124
+ - `tst/tsc.cov.json`: TypeScript configuration for the test directory (coverage)
125
+
126
+ ### Key Documentation Files
127
+
128
+ - `doc/mqtt-plus-api.md`: public API reference
129
+ - `doc/mqtt-plus-architecture.{d2,svg,md}`: architecture overview (diagram + docs)
130
+ - `doc/mqtt-plus-broker-setup.md`: MQTT broker setup guide
131
+ - `doc/mqtt-plus-comm.md`: communication patterns overview
132
+ - `doc/mqtt-plus-comm-event-emission.{d2,svg}`: Event Emission pattern diagram
133
+ - `doc/mqtt-plus-comm-service-call.{d2,svg}`: Service Call pattern diagram
134
+ - `doc/mqtt-plus-comm-sink-push.{d2,svg}`: Sink Push pattern diagram
135
+ - `doc/mqtt-plus-comm-source-fetch.{d2,svg}`: Source Fetch pattern diagram
136
+ - `doc/mqtt-plus-internals.md`: internal implementation details
145
137
 
146
138
  ### Type System
147
139
 
@@ -150,8 +142,7 @@ The API uses branded types (`Event<...>`, `Service<...>`, `Source<...>`,
150
142
  type parameter threads through the trait tower, enabling full type
151
143
  inference for pattern names and parameter types.
152
144
 
153
- Coding Style
154
- ------------
145
+ ## Coding Style
155
146
 
156
147
  - 4-space indentation, double quotes, no semicolons
157
148
  - Stroustrup brace style (`else`/`catch`/`finally` on new line after closing brace)
package/CHANGELOG.md CHANGED
@@ -2,6 +2,55 @@
2
2
  ChangeLog
3
3
  =========
4
4
 
5
+ 1.4.17 (2026-04-11)
6
+ -------------------
7
+
8
+ - IMPROVEMENT: add "signal" field to info of service and event callbacks for signalling abortion
9
+ - IMPROVEMENT: add more utility functions related to timers
10
+ - IMPROVEMENT: support cancelling push operations with a credit of zero
11
+ - IMPROVEMENT: let Spool.unroll() always execute the cleanup callback
12
+ - IMPROVEMENT: perform a minimum version check in the protocol
13
+ - IMPROVEMENT: log invalid requests with missing senders
14
+ - IMPROVEMENT: add upper bound for the nanoid iteration
15
+ - IMPROVEMENT: perform topic receiver matching and validate service response names
16
+ - IMPROVEMENT: move the destroyed flag to the base class and protect other methods
17
+ - IMPROVEMENT: send errors to peer and provide AggregateError to not lose errors
18
+ - IMPROVEMENT: bump minimum Node version to 20 for ES2022
19
+ - BUGFIX: Spool.unroll() silently skipped remaining cleanups on first async failure
20
+ - BUGFIX: improve semantics of info.authenticated field for event/service/sink/source in case of optional authentication
21
+ - BUGFIX: in the ReadableTee class, do not run read() twice: once ourself and once via the base class
22
+ - BUGFIX: correctly propagate description in run() also to finally callback
23
+ - BUGFIX: fix resource handling in source trait
24
+ - BUGFIX: avoid race conditions and unhandled promise rejections in async processing
25
+ - BUGFIX: fix cleanup and error handling across sink/source traits
26
+ - BUGFIX: fix Mosqitto ACL
27
+ - UPDATE: upgrade NPM dependencies
28
+ - CLEANUP: various code cleanups (callback handling, settle code, destroy handling, termination, subscriptions)
29
+ - CLEANUP: align with ensureError code and fix typos
30
+
31
+ 1.4.16 (2026-03-27)
32
+ -------------------
33
+
34
+ - IMPROVEMENT: allow source/sink operations to be aborted via a signal
35
+ - IMPROVEMENT: support `info.buffer` to be a plain `Uint8Array` for sources
36
+ - IMPROVEMENT: provide callback indicating which field is consumed
37
+ - IMPROVEMENT: improve credit-based flow control enforcement
38
+ - IMPROVEMENT: validate and deduplicate request IDs
39
+ - IMPROVEMENT: lock responder for communication
40
+ - IMPROVEMENT: improve backpressure and stream handling
41
+ - IMPROVEMENT: improve meta handling
42
+ - IMPROVEMENT: improve typing
43
+ - IMPROVEMENT: use cross-env for better script portability
44
+ - IMPROVEMENT: switch "npm start test" procedure to individual tasks for portability
45
+ - BUGFIX: in sink and source traits: do not miss stream data in case the stream is consumed as a buffer
46
+ - BUGFIX: fix error handling and prevent unhandled exceptions in sink and source traits
47
+ - BUGFIX: fix message name mismatch and cancellation handling
48
+ - BUGFIX: guard for already destroyed streams
49
+ - BUGFIX: use .cjs for file extension of CJS variant
50
+ - CLEANUP: align and track spool handling in source trait
51
+ - CLEANUP: align and guard timer handling
52
+ - CLEANUP: merge handlers into one
53
+
5
54
  1.4.15 (2026-03-14)
6
55
  -------------------
7
56
 
package/README.md CHANGED
@@ -165,7 +165,7 @@ Main documentation:
165
165
  - [**Communication Patterns**](doc/mqtt-plus-comm.md)
166
166
  - [**Application Programming Interface (API)**](doc/mqtt-plus-api.md)
167
167
 
168
- Additional auxilliary documentation:
168
+ Additional auxiliary documentation:
169
169
 
170
170
  - [Extra: Architecture Overview](doc/mqtt-plus-architecture.md)
171
171
  - [Extra: Internal Protocol](doc/mqtt-plus-internals.md)
@@ -250,9 +250,10 @@ Register for an event.
250
250
  - The optional `auth` enables authentication validation on incoming events.
251
251
  When set to a role name string (e.g., `"admin"`), authentication is required
252
252
  and the token must include that role. When set to an object `{ mode, roles }`,
253
- the mode can be `"require"` (reject unauthenticated) or `"optional"` (accept all
254
- but reflect validation result in `info.authenticated`), and roles specifies
255
- the required role names.
253
+ the mode can be `"require"` (reject unauthenticated, so `info.authenticated`
254
+ is always `true` in the callback) or `"optional"` (accept all, but set
255
+ `info.authenticated` to `true` or `false` to reflect the validation result),
256
+ and roles specifies the required role names.
256
257
 
257
258
  - Internally, on the MQTT broker, the topics generated by
258
259
  `topicMake(name, "event-emission")` (default: `${name}/event-emission/any` and
@@ -380,9 +381,10 @@ Register a service.
380
381
  - The optional `auth` enables authentication validation on incoming service calls.
381
382
  When set to a role name string (e.g., `"admin"`), authentication is required
382
383
  and the token must include that role. When set to an object `{ mode, roles }`,
383
- the mode can be `"require"` (reject unauthenticated with error response) or
384
- `"optional"` (accept all but reflect validation result in `info.authenticated`),
385
- and roles specifies the required role names.
384
+ the mode can be `"require"` (reject unauthenticated with error response, so
385
+ `info.authenticated` is always `true` in the callback) or `"optional"` (accept
386
+ all, but set `info.authenticated` to `true` or `false` to reflect the validation
387
+ result), and roles specifies the required role names.
386
388
 
387
389
  - Internally, on the MQTT broker, the topics generated by
388
390
  `topicMake(name, "service-call-request")` (default: `${name}/service-call-request/any` and
@@ -437,6 +439,7 @@ Sink Registration
437
439
  receiver?: string,
438
440
  authenticated?: boolean,
439
441
  meta?: Record<string, any>,
442
+ signal: AbortSignal,
440
443
  stream: Readable,
441
444
  buffer: Promise<Uint8Array>
442
445
  }
@@ -451,6 +454,7 @@ Sink Registration
451
454
  receiver?: string,
452
455
  authenticated?: boolean,
453
456
  meta?: Record<string, any>,
457
+ signal: AbortSignal,
454
458
  stream: Readable,
455
459
  buffer: Promise<Uint8Array>
456
460
  }
@@ -467,6 +471,11 @@ Register a sink for receiving data.
467
471
  - The `callback` is called with the `params` passed to a remote `push()`.
468
472
  The `info.stream` provides a Node.js `Readable` stream for consuming the pushed data.
469
473
  The `info.buffer` provides a lazy `Promise<Uint8Array>` that resolves to the complete data once the stream ends.
474
+ The `info.signal` is aborted when the push request is cancelled, times out, or is otherwise torn down,
475
+ allowing the sink handler to stop any related side work cooperatively.
476
+ When the sink handler's stream closes abnormally (before normal completion),
477
+ a cancel signal (`credit=0`) is automatically sent to the pusher to abort
478
+ the data transfer on the sender side.
470
479
  The `info.meta` contains optional metadata sent by the pusher via `push()`.
471
480
 
472
481
  - The optional `options` allows setting MQTT.js `subscribe()` options like `qos`.
@@ -482,9 +491,10 @@ Register a sink for receiving data.
482
491
  When set to a role name string (e.g., `"admin"`), authentication
483
492
  is required and the token must include that role. When set to an
484
493
  object `{ mode, roles }`, the mode can be `"require"` (reject
485
- unauthenticated) or `"optional"` (accept all but reflect validation
486
- result in `info.authenticated`), and roles specifies the required
487
- role names.
494
+ unauthenticated, so `info.authenticated` is always `true` in the
495
+ callback) or `"optional"` (accept all, but set `info.authenticated`
496
+ to `true` or `false` to reflect the validation result), and roles
497
+ specifies the required role names.
488
498
 
489
499
  - Internally, on the MQTT broker, the topics generated by
490
500
  `topicMake(name, "sink-push-request")`
@@ -528,9 +538,12 @@ Pushes data to all established sinks or a specific sink handler.
528
538
  configurable via `chunkSize` option) and sent over MQTT until the
529
539
  stream is closed or the buffer is fully transferred.
530
540
  The returned `Promise` resolves when the entire data has been pushed.
541
+ If the receiver cancels the push (via a cancel signal with `credit=0`),
542
+ the returned `Promise` rejects with a cancellation error.
531
543
 
532
544
  - The remote `sink()` `callback` is called with `params` and an `info` object
533
- containing `stream` (`Readable`) for consuming the pushed data,
545
+ containing `signal` (`AbortSignal`) for cooperative cancellation,
546
+ `stream` (`Readable`) for consuming the pushed data,
534
547
  `buffer` (lazy `Promise<Uint8Array>`) that resolves to the complete
535
548
  data once the stream ends, and `meta` (`Record<string, any> |
536
549
  undefined`) containing the metadata sent by the pusher.
@@ -559,8 +572,9 @@ Source Registration
559
572
  receiver?: string,
560
573
  authenticated?: boolean,
561
574
  meta?: Record<string, any>,
575
+ signal: AbortSignal,
562
576
  stream?: Readable,
563
- buffer?: Promise<Uint8Array>
577
+ buffer?: Promise<Uint8Array> | Uint8Array
564
578
  }
565
579
  ) => void | Promise<void>
566
580
  ): Promise<Registration>
@@ -573,8 +587,9 @@ Source Registration
573
587
  receiver?: string,
574
588
  authenticated?: boolean,
575
589
  meta?: Record<string, any>,
590
+ signal: AbortSignal,
576
591
  stream?: Readable,
577
- buffer?: Promise<Uint8Array>
592
+ buffer?: Promise<Uint8Array> | Uint8Array
578
593
  }
579
594
  ) => void | Promise<void>,
580
595
  options?: MQTT::IClientSubscribeOptions,
@@ -588,7 +603,9 @@ Register a source for sending data.
588
603
 
589
604
  - The `callback` is called with the `params` passed to a remote `fetch()`.
590
605
  The `callback` should set `info.stream` to a `Readable` or
591
- `info.buffer` to a `Promise<Uint8Array>` containing the data.
606
+ `info.buffer` to a `Promise<Uint8Array>` or `Uint8Array` containing the data.
607
+ The `info.signal` is aborted when the fetch request is cancelled, times out,
608
+ or is otherwise torn down, allowing the source handler to stop producing data.
592
609
  Optionally, the `callback` can set `info.meta` to a `Record<string,
593
610
  any>` to send metadata back with the response.
594
611
 
@@ -605,9 +622,10 @@ Register a source for sending data.
605
622
  When set to a role name string (e.g., `"admin"`), authentication
606
623
  is required and the token must include that role. When set to an
607
624
  object `{ mode, roles }`, the mode can be `"require"` (reject
608
- unauthenticated) or `"optional"` (accept all but reflect validation
609
- result in `info.authenticated`), and roles specifies the required
610
- role names.
625
+ unauthenticated, so `info.authenticated` is always `true` in the
626
+ callback) or `"optional"` (accept all, but set `info.authenticated`
627
+ to `true` or `false` to reflect the validation result), and roles
628
+ specifies the required role names.
611
629
 
612
630
  - Internally, on the MQTT broker, the topics generated by
613
631
  `topicMake(name, "source-fetch-request")`
@@ -658,7 +676,8 @@ Fetches data from any source or from a specific source.
658
676
  optional metadata sent by the source when the first chunk arrives.
659
677
 
660
678
  - The remote `source()` `callback` is called with `params` and
661
- should set `info.stream` to a `Readable` or `info.buffer` to
679
+ receives `info.signal` (`AbortSignal`) for cooperative cancellation
680
+ and should set `info.stream` to a `Readable` or `info.buffer` to
662
681
  a `Promise<Uint8Array>` containing the data. Optionally, the
663
682
  `callback` can set `info.meta` to send metadata back with the
664
683
  response. If the remote `callback` throws an exception, this
@@ -703,4 +722,3 @@ Example:
703
722
  const ui8a = mqttp.arr2buf(buffer)
704
723
  const buffer = mqttp.buf2arr(ui8a, Buffer)
705
724
  const i8a = mqttp.buf2arr(ui8a, Int8Array)
706
-
@@ -2,7 +2,7 @@
2
2
  MQTT+ Architecture
3
3
  ==================
4
4
 
5
- **MQTT+** is composed as a vertical chain of API and infratructure trait
5
+ **MQTT+** is composed as a vertical chain of API and infrastructure trait
6
6
  classes (mixins), each extending the previous. Additionally, some base
7
7
  modules complement the functionality.
8
8
 
@@ -69,7 +69,7 @@ pattern read example/server/+/service-call-response/%c
69
69
 
70
70
  topic read example/client/+/service-call-request/any
71
71
  pattern read example/client/+/service-call-request/%c
72
- pattern write example/client/+/service-call-response/%c
72
+ pattern write example/client/+/service-call-response/+
73
73
 
74
74
  # ---- source fetch ----
75
75
 
@@ -87,7 +87,7 @@ pattern read example/server/+/sink-push-response/%c
87
87
 
88
88
  topic read example/client/+/sink-push-request/any
89
89
  pattern read example/client/+/sink-push-request/%c
90
- pattern write example/client/+/sink-push-response/%c
90
+ pattern write example/client/+/sink-push-response/+
91
91
 
92
92
  # ==== server/authenticated ACL ====
93
93
 
@@ -50,7 +50,9 @@ chunks as a stream with arguments.
50
50
  > In contrast to the regular MQTT message publish/subscribe, this
51
51
  > pattern allows to transfer arbitrary amounts of arbitrary data by
52
52
  > chunking the data via a stream. Additionally, it supports authentication
53
- > and meta-data, etc.
53
+ > and meta-data, provides an `AbortSignal` to the sink handler for
54
+ > cooperative cancellation, and allows the receiver to cancel an
55
+ > in-progress push via a cancel signal (`credit=0`), etc.
54
56
 
55
57
  ![Sink Push](mqtt-plus-comm-sink-push.svg)
56
58
 
@@ -67,7 +69,7 @@ data chunks as a stream with arguments.
67
69
  > In contrast to the regular MQTT message publish/subscribe, this
68
70
  > pattern allows to transfer arbitrary amounts of arbitrary data by
69
71
  > chunking the data via a stream. Additionally, it supports
70
- > authentication and meta-data, etc.
72
+ > authentication and meta-data, and provides an `AbortSignal` to the
73
+ > source handler for cooperative cancellation, etc.
71
74
 
72
75
  ![Source Fetch](mqtt-plus-comm-source-fetch.svg)
73
-
@@ -138,7 +138,7 @@ Exactly one of `result` or `error` is present.
138
138
  | Field | Type | Required | Description |
139
139
  |----------|-----------|----------|-------------------------------------|
140
140
  | `name` | `string` | yes | Sink endpoint name |
141
- | `credit` | `integer` | yes | Number of additional credits (min 1)|
141
+ | `credit` | `integer` | yes | Number of additional credits (min 0). A value of `0` is a **cancel signal**, indicating that the receiver wants to abort the push stream. |
142
142
 
143
143
  ### `source-fetch-request`
144
144
 
@@ -272,6 +272,16 @@ Setting `chunkCredit` to `0` disables flow control entirely.
272
272
  | Sink Push | Sink | Pusher | `sink-push-credit` |
273
273
  | Source Fetch | Fetcher | Source | `source-fetch-credit` |
274
274
 
275
+ ### Receiver-Initiated Cancellation (Sink Push)
276
+
277
+ The sink (receiver) can cancel an in-progress push by sending a
278
+ `sink-push-credit` message with `credit` set to `0`. This acts as
279
+ a **cancel signal**: the pusher aborts the data transfer immediately
280
+ and does not send an error chunk back to the receiver (since the
281
+ cancellation originated from the receiver itself). On the receiver
282
+ side, the `AbortSignal` provided to the sink callback is triggered
283
+ when the push stream closes abnormally.
284
+
275
285
  Authentication
276
286
  --------------
277
287
 
@@ -86,16 +86,8 @@ export class AuthTrait extends MetaTrait {
86
86
  async authenticated(clientId, tokens, option) {
87
87
  let authenticated = false;
88
88
  /* determine authentication configuration */
89
- let mode;
90
- let roles;
91
- if (typeof option === "string") {
92
- mode = "require";
93
- roles = [option];
94
- }
95
- else {
96
- mode = option.mode;
97
- roles = option.roles;
98
- }
89
+ const roles = typeof option === "string"
90
+ ? [option] : option.roles;
99
91
  /* iterate over all roles and try to authenticate token (first-match, max 8) */
100
92
  if (tokens !== undefined) {
101
93
  for (const token of tokens.slice(0, 8)) {
@@ -120,9 +112,6 @@ export class AuthTrait extends MetaTrait {
120
112
  break;
121
113
  }
122
114
  }
123
- /* handle optional case */
124
- if (!authenticated && mode === "optional")
125
- authenticated = true;
126
115
  return authenticated;
127
116
  }
128
117
  }
@@ -1 +1 @@
1
- {"version":3,"file":"mqtt-plus-auth.js","sourceRoot":"","sources":["../src/mqtt-plus-auth.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"mqtt-plus-auth.js","sourceRoot":"","sources":["../src/mqtt-plus-auth.ts"],"names":[],"mappings":"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"}
@@ -6,11 +6,12 @@ import { Spool } from "./mqtt-plus-error";
6
6
  export declare class BaseTrait<T extends APISchema = APISchema> extends TraceTrait<T> {
7
7
  private mqtt;
8
8
  private messageHandler;
9
+ protected destroyed: boolean;
9
10
  protected onRequest: Map<string, (message: any, topicName: string) => void | Promise<void>>;
10
11
  protected onResponse: Map<string, (message: any, topicName: string) => void | Promise<void>>;
11
12
  constructor(mqtt: MqttClient | null, options?: Partial<APIOptions>);
12
13
  destroy(): Promise<void>;
13
- protected makeRegistration(spool: Spool, kind: string, name: string, key: string): Registration;
14
+ protected makeRegistration(spool: Spool, kind: string, name: string): Registration;
14
15
  protected subscribeTopic(topic: string, options?: Partial<IClientSubscribeOptions>): Promise<void>;
15
16
  protected unsubscribeTopic(topic: string): Promise<void>;
16
17
  protected publishToTopic(topic: string, message: string | Uint8Array, options?: IClientPublishOptions): Promise<void>;