diff --git a/.github/workflows/test.yml b/.github/workflows/test.yml
index f4d7ae7..956c9f6 100644
--- a/.github/workflows/test.yml
+++ b/.github/workflows/test.yml
@@ -10,7 +10,7 @@ jobs:
- name: Setup node
uses: actions/setup-node@v3
with:
- node-version: 16
+ node-version: 20
- name: Install dependencies
run: npm ci
diff --git a/README.md b/README.md
index c806e47..855da68 100644
--- a/README.md
+++ b/README.md
@@ -1,7 +1,8 @@
trpc-mqtt
-
+
+
diff --git a/package-lock.json b/package-lock.json
index 44462ba..7fd84f6 100644
--- a/package-lock.json
+++ b/package-lock.json
@@ -14,6 +14,7 @@
"@types/node": "^18.8.5",
"@typescript-eslint/eslint-plugin": "^5.40.0",
"@typescript-eslint/parser": "^5.40.0",
+ "aedes": "^0.51.1",
"eslint": "^8.25.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
@@ -722,7 +723,6 @@
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz",
"integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
- "peer": true,
"dependencies": {
"regenerator-runtime": "^0.14.0"
},
@@ -1946,7 +1946,6 @@
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.11.tgz",
"integrity": "sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ==",
- "peer": true,
"dependencies": {
"@types/node": "*",
"safe-buffer": "~5.1.1"
@@ -2228,7 +2227,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "peer": true,
"dependencies": {
"event-target-shim": "^5.0.0"
},
@@ -2276,6 +2274,118 @@
"node": ">=0.4.0"
}
},
+ "node_modules/aedes": {
+ "version": "0.51.1",
+ "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.51.1.tgz",
+ "integrity": "sha512-SR53TIaVmdOlM0Z/1+dnWQGxBiDRRMXLF0RbL/7DOPKEuwS5sGtvSwBKtZAPhFbdhZr1hz/lG556TuUG+1ZfMA==",
+ "dev": true,
+ "dependencies": {
+ "aedes-packet": "^3.0.0",
+ "aedes-persistence": "^9.1.2",
+ "end-of-stream": "^1.4.4",
+ "fastfall": "^1.5.1",
+ "fastparallel": "^2.4.1",
+ "fastseries": "^2.0.0",
+ "hyperid": "^3.2.0",
+ "mqemitter": "^5.0.0",
+ "mqtt-packet": "^9.0.0",
+ "retimer": "^4.0.0",
+ "reusify": "^1.0.4",
+ "uuid": "^9.0.1"
+ },
+ "engines": {
+ "node": ">=16"
+ },
+ "funding": {
+ "type": "opencollective",
+ "url": "https://opencollective.com/aedes"
+ }
+ },
+ "node_modules/aedes-packet": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/aedes-packet/-/aedes-packet-3.0.0.tgz",
+ "integrity": "sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==",
+ "dev": true,
+ "dependencies": {
+ "mqtt-packet": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
+ "node_modules/aedes-packet/node_modules/bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "node_modules/aedes-packet/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/aedes-packet/node_modules/mqtt-packet": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-7.1.2.tgz",
+ "integrity": "sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==",
+ "dev": true,
+ "dependencies": {
+ "bl": "^4.0.2",
+ "debug": "^4.1.1",
+ "process-nextick-args": "^2.0.1"
+ }
+ },
+ "node_modules/aedes-packet/node_modules/readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "dependencies": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ },
+ "engines": {
+ "node": ">= 6"
+ }
+ },
+ "node_modules/aedes-persistence": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-9.1.2.tgz",
+ "integrity": "sha512-2Wlr5pwIK0eQOkiTwb8ZF6C20s8UPUlnsJ4kXYePZ3JlQl0NbBA176mzM8wY294BJ5wybpNc9P5XEQxqadRNcQ==",
+ "dev": true,
+ "dependencies": {
+ "aedes-packet": "^3.0.0",
+ "qlobber": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=14"
+ }
+ },
"node_modules/agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -2601,14 +2711,12 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "peer": true
+ ]
},
"node_modules/bl": {
"version": "6.0.12",
"resolved": "https://registry.npmjs.org/bl/-/bl-6.0.12.tgz",
"integrity": "sha512-EnEYHilP93oaOa2MnmNEjAcovPS3JlQZOyzGXi3EyEpPhm9qWvdDp7BmAVEVusGzp8LlwQK56Av+OkDoRjzE0w==",
- "peer": true,
"dependencies": {
"@types/readable-stream": "^4.0.0",
"buffer": "^6.0.3",
@@ -2705,7 +2813,6 @@
"url": "https://feross.org/support"
}
],
- "peer": true,
"dependencies": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
@@ -3133,6 +3240,15 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
+ "node_modules/end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "dependencies": {
+ "once": "^1.4.0"
+ }
+ },
"node_modules/entities": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
@@ -3801,7 +3917,6 @@
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
"integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "peer": true,
"engines": {
"node": ">=6"
}
@@ -3810,7 +3925,6 @@
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
"integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "peer": true,
"engines": {
"node": ">=0.8.x"
}
@@ -3919,7 +4033,6 @@
"version": "8.0.13",
"resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.13.tgz",
"integrity": "sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.23.8",
"tslib": "^2.6.2"
@@ -3928,6 +4041,28 @@
"node": ">=16.1.0"
}
},
+ "node_modules/fastfall": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz",
+ "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.0"
+ },
+ "engines": {
+ "node": ">=0.10.0"
+ }
+ },
+ "node_modules/fastparallel": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz",
+ "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==",
+ "dev": true,
+ "dependencies": {
+ "reusify": "^1.0.4",
+ "xtend": "^4.0.2"
+ }
+ },
"node_modules/fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -3937,6 +4072,12 @@
"reusify": "^1.0.4"
}
},
+ "node_modules/fastseries": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fastseries/-/fastseries-2.0.0.tgz",
+ "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==",
+ "dev": true
+ },
"node_modules/fb-watchman": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
@@ -4343,6 +4484,50 @@
"node": ">=10.17.0"
}
},
+ "node_modules/hyperid": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.2.0.tgz",
+ "integrity": "sha512-PdTtDo+Rmza9nEhTunaDSUKwbC69TIzLEpZUwiB6f+0oqmY0UPfhyHCPt6K1NQ4WFv5yJBTG5vELztVWP+nEVQ==",
+ "dev": true,
+ "dependencies": {
+ "buffer": "^5.2.1",
+ "uuid": "^8.3.2",
+ "uuid-parse": "^1.1.0"
+ }
+ },
+ "node_modules/hyperid/node_modules/buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "funding": [
+ {
+ "type": "github",
+ "url": "https://github.com/sponsors/feross"
+ },
+ {
+ "type": "patreon",
+ "url": "https://www.patreon.com/feross"
+ },
+ {
+ "type": "consulting",
+ "url": "https://feross.org/support"
+ }
+ ],
+ "dependencies": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "node_modules/hyperid/node_modules/uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true,
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
"node_modules/iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -4372,8 +4557,7 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "peer": true
+ ]
},
"node_modules/ignore": {
"version": "5.2.0",
@@ -6707,6 +6891,19 @@
"url": "https://github.com/sponsors/ljharb"
}
},
+ "node_modules/mqemitter": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-5.0.0.tgz",
+ "integrity": "sha512-rqNRQhGgl0W/NV+Zrx0rpAUTZcSlAtivCVUmXBUPcFYt+AeDEpoJgy5eKlFWJP6xnatONL59WIFdV0W6niOMhw==",
+ "dev": true,
+ "dependencies": {
+ "fastparallel": "^2.3.0",
+ "qlobber": "^7.0.0"
+ },
+ "engines": {
+ "node": ">=10"
+ }
+ },
"node_modules/mqtt": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.5.3.tgz",
@@ -6744,7 +6941,6 @@
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.0.tgz",
"integrity": "sha512-8v+HkX+fwbodsWAZIZTI074XIoxVBOmPeggQuDFCGg1SqNcC+uoRMWu7J6QlJPqIUIJXmjNYYHxBBLr1Y/Df4w==",
- "peer": true,
"dependencies": {
"bl": "^6.0.8",
"debug": "^4.3.4",
@@ -7194,7 +7390,6 @@
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
"integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "peer": true,
"engines": {
"node": ">= 0.6.0"
}
@@ -7202,8 +7397,7 @@
"node_modules/process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "peer": true
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"node_modules/prompts": {
"version": "2.4.2",
@@ -7233,6 +7427,15 @@
"node": ">=6"
}
},
+ "node_modules/qlobber": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-7.0.1.tgz",
+ "integrity": "sha512-FsFg9lMuMEFNKmTO9nV7tlyPhx8BmskPPjH2akWycuYVTtWaVwhW5yCHLJQ6Q+3mvw5cFX2vMfW2l9z2SiYAbg==",
+ "dev": true,
+ "engines": {
+ "node": ">= 14"
+ }
+ },
"node_modules/querystringify": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -7269,7 +7472,6 @@
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
"integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
- "peer": true,
"dependencies": {
"abort-controller": "^3.0.0",
"buffer": "^6.0.3",
@@ -7296,8 +7498,7 @@
"node_modules/regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
- "peer": true
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"node_modules/regexp.prototype.flags": {
"version": "1.4.3",
@@ -7405,6 +7606,15 @@
"node": ">=10"
}
},
+ "node_modules/retimer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retimer/-/retimer-4.0.0.tgz",
+ "integrity": "sha512-fZIVtvbOsQsxNSDhpdPOX4lx5Ss2ni+S72AUBitARpFhtA3UzrAjQ6gDtypB2/+l7L+1VQgAgpvAKY66mElH0w==",
+ "dev": true,
+ "dependencies": {
+ "worker-timers": "^7.0.75"
+ }
+ },
"node_modules/reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -7662,7 +7872,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "peer": true,
"dependencies": {
"safe-buffer": "~5.2.0"
}
@@ -7684,8 +7893,7 @@
"type": "consulting",
"url": "https://feross.org/support"
}
- ],
- "peer": true
+ ]
},
"node_modules/string-length": {
"version": "4.0.2",
@@ -8087,8 +8295,7 @@
"node_modules/tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "peer": true
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"node_modules/tsutils": {
"version": "3.21.0",
@@ -8235,8 +8442,26 @@
"node_modules/util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "peer": true
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "node_modules/uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "dev": true,
+ "funding": [
+ "https://github.com/sponsors/broofa",
+ "https://github.com/sponsors/ctavan"
+ ],
+ "bin": {
+ "uuid": "dist/bin/uuid"
+ }
+ },
+ "node_modules/uuid-parse": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz",
+ "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==",
+ "dev": true
},
"node_modules/v8-compile-cache-lib": {
"version": "3.0.1",
@@ -8366,7 +8591,6 @@
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.1.7.tgz",
"integrity": "sha512-Dr4La61d94SjOA8P57h2LN8W3MXOVe/m1P7jER8cmuIy+JaDMqPttSwo6QRJFSK6YnG9cD6SU7J8m7CVlu8jlw==",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.24.4",
"tslib": "^2.6.2",
@@ -8378,7 +8602,6 @@
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.7.tgz",
"integrity": "sha512-8hb4lSMAijDY/Dp/MOw9Hc2x6uU59XWFYjcWQgC4bai+sxcLXjeexd9aYKdYMFZPiPoieGzMYIs9WGpv2Co3eA==",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.24.4",
"fast-unique-numbers": "^8.0.13",
@@ -8390,7 +8613,6 @@
"version": "7.0.70",
"resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.70.tgz",
"integrity": "sha512-lemWEME0RHB78hzGkkQcKfF6L82gqVhV3T9iY14jHBhbLxLq9t1RRCLmPDBZV7sdnUoW6Khkfn6coqPjgEK6cw==",
- "peer": true,
"dependencies": {
"@babel/runtime": "^7.24.4",
"tslib": "^2.6.2"
@@ -8500,6 +8722,15 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
+ "node_modules/xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true,
+ "engines": {
+ "node": ">=0.4"
+ }
+ },
"node_modules/y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
@@ -9078,7 +9309,6 @@
"version": "7.24.4",
"resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.4.tgz",
"integrity": "sha512-dkxf7+hn8mFBwKjs9bvBlArzLVxVbS8usaPUDd5p2a9JCL9tB8OaOVN1isD4+Xyk4ns89/xeOmbQvgdK7IIVdA==",
- "peer": true,
"requires": {
"regenerator-runtime": "^0.14.0"
}
@@ -10052,7 +10282,6 @@
"version": "4.0.11",
"resolved": "https://registry.npmjs.org/@types/readable-stream/-/readable-stream-4.0.11.tgz",
"integrity": "sha512-R3eUMUTTKoIoaz7UpYLxvZCrOmCRPRbAmoDDHKcimTEySltaJhF8hLzj4+EzyDifiX5eK6oDQGSfmNnXjxZzYQ==",
- "peer": true,
"requires": {
"@types/node": "*",
"safe-buffer": "~5.1.1"
@@ -10233,7 +10462,6 @@
"version": "3.0.0",
"resolved": "https://registry.npmjs.org/abort-controller/-/abort-controller-3.0.0.tgz",
"integrity": "sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==",
- "peer": true,
"requires": {
"event-target-shim": "^5.0.0"
}
@@ -10267,6 +10495,90 @@
"integrity": "sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==",
"dev": true
},
+ "aedes": {
+ "version": "0.51.1",
+ "resolved": "https://registry.npmjs.org/aedes/-/aedes-0.51.1.tgz",
+ "integrity": "sha512-SR53TIaVmdOlM0Z/1+dnWQGxBiDRRMXLF0RbL/7DOPKEuwS5sGtvSwBKtZAPhFbdhZr1hz/lG556TuUG+1ZfMA==",
+ "dev": true,
+ "requires": {
+ "aedes-packet": "^3.0.0",
+ "aedes-persistence": "^9.1.2",
+ "end-of-stream": "^1.4.4",
+ "fastfall": "^1.5.1",
+ "fastparallel": "^2.4.1",
+ "fastseries": "^2.0.0",
+ "hyperid": "^3.2.0",
+ "mqemitter": "^5.0.0",
+ "mqtt-packet": "^9.0.0",
+ "retimer": "^4.0.0",
+ "reusify": "^1.0.4",
+ "uuid": "^9.0.1"
+ }
+ },
+ "aedes-packet": {
+ "version": "3.0.0",
+ "resolved": "https://registry.npmjs.org/aedes-packet/-/aedes-packet-3.0.0.tgz",
+ "integrity": "sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==",
+ "dev": true,
+ "requires": {
+ "mqtt-packet": "^7.0.0"
+ },
+ "dependencies": {
+ "bl": {
+ "version": "4.1.0",
+ "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz",
+ "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==",
+ "dev": true,
+ "requires": {
+ "buffer": "^5.5.0",
+ "inherits": "^2.0.4",
+ "readable-stream": "^3.4.0"
+ }
+ },
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "mqtt-packet": {
+ "version": "7.1.2",
+ "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-7.1.2.tgz",
+ "integrity": "sha512-FFZbcZ2omsf4c5TxEQfcX9hI+JzDpDKPT46OmeIBpVA7+t32ey25UNqlqNXTmeZOr5BLsSIERpQQLsFWJS94SQ==",
+ "dev": true,
+ "requires": {
+ "bl": "^4.0.2",
+ "debug": "^4.1.1",
+ "process-nextick-args": "^2.0.1"
+ }
+ },
+ "readable-stream": {
+ "version": "3.6.2",
+ "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz",
+ "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==",
+ "dev": true,
+ "requires": {
+ "inherits": "^2.0.3",
+ "string_decoder": "^1.1.1",
+ "util-deprecate": "^1.0.1"
+ }
+ }
+ }
+ },
+ "aedes-persistence": {
+ "version": "9.1.2",
+ "resolved": "https://registry.npmjs.org/aedes-persistence/-/aedes-persistence-9.1.2.tgz",
+ "integrity": "sha512-2Wlr5pwIK0eQOkiTwb8ZF6C20s8UPUlnsJ4kXYePZ3JlQl0NbBA176mzM8wY294BJ5wybpNc9P5XEQxqadRNcQ==",
+ "dev": true,
+ "requires": {
+ "aedes-packet": "^3.0.0",
+ "qlobber": "^7.0.0"
+ }
+ },
"agent-base": {
"version": "6.0.2",
"resolved": "https://registry.npmjs.org/agent-base/-/agent-base-6.0.2.tgz",
@@ -10501,14 +10813,12 @@
"base64-js": {
"version": "1.5.1",
"resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz",
- "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==",
- "peer": true
+ "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA=="
},
"bl": {
"version": "6.0.12",
"resolved": "https://registry.npmjs.org/bl/-/bl-6.0.12.tgz",
"integrity": "sha512-EnEYHilP93oaOa2MnmNEjAcovPS3JlQZOyzGXi3EyEpPhm9qWvdDp7BmAVEVusGzp8LlwQK56Av+OkDoRjzE0w==",
- "peer": true,
"requires": {
"@types/readable-stream": "^4.0.0",
"buffer": "^6.0.3",
@@ -10569,7 +10879,6 @@
"version": "6.0.3",
"resolved": "https://registry.npmjs.org/buffer/-/buffer-6.0.3.tgz",
"integrity": "sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==",
- "peer": true,
"requires": {
"base64-js": "^1.3.1",
"ieee754": "^1.2.1"
@@ -10901,6 +11210,15 @@
"integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==",
"dev": true
},
+ "end-of-stream": {
+ "version": "1.4.4",
+ "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz",
+ "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==",
+ "dev": true,
+ "requires": {
+ "once": "^1.4.0"
+ }
+ },
"entities": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/entities/-/entities-4.4.0.tgz",
@@ -11391,14 +11709,12 @@
"event-target-shim": {
"version": "5.0.1",
"resolved": "https://registry.npmjs.org/event-target-shim/-/event-target-shim-5.0.1.tgz",
- "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==",
- "peer": true
+ "integrity": "sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ=="
},
"events": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/events/-/events-3.3.0.tgz",
- "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==",
- "peer": true
+ "integrity": "sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q=="
},
"execa": {
"version": "5.1.1",
@@ -11488,12 +11804,30 @@
"version": "8.0.13",
"resolved": "https://registry.npmjs.org/fast-unique-numbers/-/fast-unique-numbers-8.0.13.tgz",
"integrity": "sha512-7OnTFAVPefgw2eBJ1xj2PGGR9FwYzSUso9decayHgCDX4sJkHLdcsYTytTg+tYv+wKF3U8gJuSBz2jJpQV4u/g==",
- "peer": true,
"requires": {
"@babel/runtime": "^7.23.8",
"tslib": "^2.6.2"
}
},
+ "fastfall": {
+ "version": "1.5.1",
+ "resolved": "https://registry.npmjs.org/fastfall/-/fastfall-1.5.1.tgz",
+ "integrity": "sha512-KH6p+Z8AKPXnmA7+Iz2Lh8ARCMr+8WNPVludm1LGkZoD2MjY6LVnRMtTKhkdzI+jr0RzQWXKzKyBJm1zoHEL4Q==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.0"
+ }
+ },
+ "fastparallel": {
+ "version": "2.4.1",
+ "resolved": "https://registry.npmjs.org/fastparallel/-/fastparallel-2.4.1.tgz",
+ "integrity": "sha512-qUmhxPgNHmvRjZKBFUNI0oZuuH9OlSIOXmJ98lhKPxMZZ7zS/Fi0wRHOihDSz0R1YiIOjxzOY4bq65YTcdBi2Q==",
+ "dev": true,
+ "requires": {
+ "reusify": "^1.0.4",
+ "xtend": "^4.0.2"
+ }
+ },
"fastq": {
"version": "1.13.0",
"resolved": "https://registry.npmjs.org/fastq/-/fastq-1.13.0.tgz",
@@ -11503,6 +11837,12 @@
"reusify": "^1.0.4"
}
},
+ "fastseries": {
+ "version": "2.0.0",
+ "resolved": "https://registry.npmjs.org/fastseries/-/fastseries-2.0.0.tgz",
+ "integrity": "sha512-XBU9RXeoYc2/VnvMhplAxEmZLfIk7cvTBu+xwoBuTI8pL19E03cmca17QQycKIdxgwCeFA/a4u27gv1h3ya5LQ==",
+ "dev": true
+ },
"fb-watchman": {
"version": "2.0.2",
"resolved": "https://registry.npmjs.org/fb-watchman/-/fb-watchman-2.0.2.tgz",
@@ -11797,6 +12137,35 @@
"integrity": "sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==",
"dev": true
},
+ "hyperid": {
+ "version": "3.2.0",
+ "resolved": "https://registry.npmjs.org/hyperid/-/hyperid-3.2.0.tgz",
+ "integrity": "sha512-PdTtDo+Rmza9nEhTunaDSUKwbC69TIzLEpZUwiB6f+0oqmY0UPfhyHCPt6K1NQ4WFv5yJBTG5vELztVWP+nEVQ==",
+ "dev": true,
+ "requires": {
+ "buffer": "^5.2.1",
+ "uuid": "^8.3.2",
+ "uuid-parse": "^1.1.0"
+ },
+ "dependencies": {
+ "buffer": {
+ "version": "5.7.1",
+ "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz",
+ "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==",
+ "dev": true,
+ "requires": {
+ "base64-js": "^1.3.1",
+ "ieee754": "^1.1.13"
+ }
+ },
+ "uuid": {
+ "version": "8.3.2",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz",
+ "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==",
+ "dev": true
+ }
+ }
+ },
"iconv-lite": {
"version": "0.6.3",
"resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.6.3.tgz",
@@ -11809,8 +12178,7 @@
"ieee754": {
"version": "1.2.1",
"resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz",
- "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==",
- "peer": true
+ "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA=="
},
"ignore": {
"version": "5.2.0",
@@ -13526,6 +13894,16 @@
"resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.8.tgz",
"integrity": "sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA=="
},
+ "mqemitter": {
+ "version": "5.0.0",
+ "resolved": "https://registry.npmjs.org/mqemitter/-/mqemitter-5.0.0.tgz",
+ "integrity": "sha512-rqNRQhGgl0W/NV+Zrx0rpAUTZcSlAtivCVUmXBUPcFYt+AeDEpoJgy5eKlFWJP6xnatONL59WIFdV0W6niOMhw==",
+ "dev": true,
+ "requires": {
+ "fastparallel": "^2.3.0",
+ "qlobber": "^7.0.0"
+ }
+ },
"mqtt": {
"version": "5.5.3",
"resolved": "https://registry.npmjs.org/mqtt/-/mqtt-5.5.3.tgz",
@@ -13563,7 +13941,6 @@
"version": "9.0.0",
"resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-9.0.0.tgz",
"integrity": "sha512-8v+HkX+fwbodsWAZIZTI074XIoxVBOmPeggQuDFCGg1SqNcC+uoRMWu7J6QlJPqIUIJXmjNYYHxBBLr1Y/Df4w==",
- "peer": true,
"requires": {
"bl": "^6.0.8",
"debug": "^4.3.4",
@@ -13884,14 +14261,12 @@
"process": {
"version": "0.11.10",
"resolved": "https://registry.npmjs.org/process/-/process-0.11.10.tgz",
- "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A==",
- "peer": true
+ "integrity": "sha512-cdGef/drWFoydD1JsMzuFf8100nZl+GT+yacc2bEced5f9Rjk4z+WtFUTBu9PhOi9j/jfmBPu0mMEY4wIdAF8A=="
},
"process-nextick-args": {
"version": "2.0.1",
"resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz",
- "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==",
- "peer": true
+ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag=="
},
"prompts": {
"version": "2.4.2",
@@ -13915,6 +14290,12 @@
"integrity": "sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==",
"dev": true
},
+ "qlobber": {
+ "version": "7.0.1",
+ "resolved": "https://registry.npmjs.org/qlobber/-/qlobber-7.0.1.tgz",
+ "integrity": "sha512-FsFg9lMuMEFNKmTO9nV7tlyPhx8BmskPPjH2akWycuYVTtWaVwhW5yCHLJQ6Q+3mvw5cFX2vMfW2l9z2SiYAbg==",
+ "dev": true
+ },
"querystringify": {
"version": "2.2.0",
"resolved": "https://registry.npmjs.org/querystringify/-/querystringify-2.2.0.tgz",
@@ -13937,7 +14318,6 @@
"version": "4.5.2",
"resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-4.5.2.tgz",
"integrity": "sha512-yjavECdqeZ3GLXNgRXgeQEdz9fvDDkNKyHnbHRFtOr7/LcfgBcmct7t/ET+HaCTqfh06OzoAxrkN/IfjJBVe+g==",
- "peer": true,
"requires": {
"abort-controller": "^3.0.0",
"buffer": "^6.0.3",
@@ -13958,8 +14338,7 @@
"regenerator-runtime": {
"version": "0.14.1",
"resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz",
- "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==",
- "peer": true
+ "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw=="
},
"regexp.prototype.flags": {
"version": "1.4.3",
@@ -14036,6 +14415,15 @@
"integrity": "sha512-J1l+Zxxp4XK3LUDZ9m60LRJF/mAe4z6a4xyabPHk7pvK5t35dACV32iIjJDFeWZFfZlO29w6SZ67knR0tHzJtQ==",
"dev": true
},
+ "retimer": {
+ "version": "4.0.0",
+ "resolved": "https://registry.npmjs.org/retimer/-/retimer-4.0.0.tgz",
+ "integrity": "sha512-fZIVtvbOsQsxNSDhpdPOX4lx5Ss2ni+S72AUBitARpFhtA3UzrAjQ6gDtypB2/+l7L+1VQgAgpvAKY66mElH0w==",
+ "dev": true,
+ "requires": {
+ "worker-timers": "^7.0.75"
+ }
+ },
"reusify": {
"version": "1.0.4",
"resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz",
@@ -14225,7 +14613,6 @@
"version": "1.3.0",
"resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz",
"integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==",
- "peer": true,
"requires": {
"safe-buffer": "~5.2.0"
},
@@ -14233,8 +14620,7 @@
"safe-buffer": {
"version": "5.2.1",
"resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz",
- "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==",
- "peer": true
+ "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ=="
}
}
},
@@ -14514,8 +14900,7 @@
"tslib": {
"version": "2.6.2",
"resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.2.tgz",
- "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==",
- "peer": true
+ "integrity": "sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q=="
},
"tsutils": {
"version": "3.21.0",
@@ -14617,8 +15002,19 @@
"util-deprecate": {
"version": "1.0.2",
"resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz",
- "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==",
- "peer": true
+ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw=="
+ },
+ "uuid": {
+ "version": "9.0.1",
+ "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz",
+ "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==",
+ "dev": true
+ },
+ "uuid-parse": {
+ "version": "1.1.0",
+ "resolved": "https://registry.npmjs.org/uuid-parse/-/uuid-parse-1.1.0.tgz",
+ "integrity": "sha512-OdmXxA8rDsQ7YpNVbKSJkNzTw2I+S5WsbMDnCtIWSQaosNAcWtFuI/YK1TjzUI6nbkgiqEyh8gWngfcv8Asd9A==",
+ "dev": true
},
"v8-compile-cache-lib": {
"version": "3.0.1",
@@ -14718,7 +15114,6 @@
"version": "7.1.7",
"resolved": "https://registry.npmjs.org/worker-timers/-/worker-timers-7.1.7.tgz",
"integrity": "sha512-Dr4La61d94SjOA8P57h2LN8W3MXOVe/m1P7jER8cmuIy+JaDMqPttSwo6QRJFSK6YnG9cD6SU7J8m7CVlu8jlw==",
- "peer": true,
"requires": {
"@babel/runtime": "^7.24.4",
"tslib": "^2.6.2",
@@ -14730,7 +15125,6 @@
"version": "6.1.7",
"resolved": "https://registry.npmjs.org/worker-timers-broker/-/worker-timers-broker-6.1.7.tgz",
"integrity": "sha512-8hb4lSMAijDY/Dp/MOw9Hc2x6uU59XWFYjcWQgC4bai+sxcLXjeexd9aYKdYMFZPiPoieGzMYIs9WGpv2Co3eA==",
- "peer": true,
"requires": {
"@babel/runtime": "^7.24.4",
"fast-unique-numbers": "^8.0.13",
@@ -14742,7 +15136,6 @@
"version": "7.0.70",
"resolved": "https://registry.npmjs.org/worker-timers-worker/-/worker-timers-worker-7.0.70.tgz",
"integrity": "sha512-lemWEME0RHB78hzGkkQcKfF6L82gqVhV3T9iY14jHBhbLxLq9t1RRCLmPDBZV7sdnUoW6Khkfn6coqPjgEK6cw==",
- "peer": true,
"requires": {
"@babel/runtime": "^7.24.4",
"tslib": "^2.6.2"
@@ -14819,6 +15212,12 @@
"integrity": "sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==",
"dev": true
},
+ "xtend": {
+ "version": "4.0.2",
+ "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz",
+ "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==",
+ "dev": true
+ },
"y18n": {
"version": "5.0.8",
"resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz",
diff --git a/package.json b/package.json
index cee7f54..1513cab 100644
--- a/package.json
+++ b/package.json
@@ -13,7 +13,7 @@
"bugs": "https://github.com/edorgeville/trpc-mqtt/issues",
"scripts": {
"prepublish": "npm run build",
- "test": "tsc --noEmit && jest --verbose --passWithNoTests",
+ "test": "tsc --noEmit && jest",
"build": "rimraf dist && rimraf adapter && rimraf link && rimraf types && tsc -p tsconfig.build.json && shx mv dist/* . && rimraf dist"
},
"peerDependencies": {
@@ -27,6 +27,7 @@
"@types/node": "^18.8.5",
"@typescript-eslint/eslint-plugin": "^5.40.0",
"@typescript-eslint/parser": "^5.40.0",
+ "aedes": "^0.51.1",
"eslint": "^8.25.0",
"eslint-config-prettier": "^8.5.0",
"eslint-plugin-import": "^2.26.0",
@@ -43,4 +44,4 @@
"typescript": "^4.8.4",
"zod": "^3.19.1"
}
-}
+}
\ No newline at end of file
diff --git a/src/adapter/index.ts b/src/adapter/index.ts
index 66113e8..b73abee 100644
--- a/src/adapter/index.ts
+++ b/src/adapter/index.ts
@@ -34,6 +34,7 @@ export const createMQTTHandler =
(
const protocolVersion = client.options.protocolVersion ?? 4;
client.subscribe(requestTopic);
client.on('message', async (topic, message, packet) => {
+ if (requestTopic !== topic) return; // Ignore messages not on the response topic, from other users of the shared client
const msg = message.toString();
if (verbose) console.log(topic, msg);
if (!msg) return;
diff --git a/src/link/index.ts b/src/link/index.ts
index 3d52120..a731f92 100644
--- a/src/link/index.ts
+++ b/src/link/index.ts
@@ -31,6 +31,7 @@ export const mqttLink = (
client.subscribe(responseTopic);
client.on('message', (topic, message, packet) => {
+ if (responseTopic !== topic) return; // Ignore messages not on the response topic, from other users of the shared client
const msg = message.toString();
if (protocolVersion >= 5) {
const correlationData = packet.properties?.correlationData?.toString();
diff --git a/test/appRouter.ts b/test/appRouter.ts
index f3a3bb2..cb8c42d 100644
--- a/test/appRouter.ts
+++ b/test/appRouter.ts
@@ -7,11 +7,22 @@ const t = initTRPC.create();
const publicProcedure = t.procedure;
const router = t.router;
+const state = { count: 0 };
+
export const appRouter = router({
greet: publicProcedure
.input((val: unknown) => {
if (typeof val === 'string') return val;
throw new Error(`Invalid input: ${typeof val}`);
})
- .query(({ input }) => ({ greeting: `hello, ${input}!` }))
+ .query(({ input }) => ({ greeting: `hello, ${input}!` })),
+ countUp: publicProcedure
+ .input((val: unknown) => {
+ if (typeof val === 'number') return val;
+ throw new Error(`Invalid input: ${typeof val}`);
+ })
+ .mutation(({ input }) => {
+ state.count += input;
+ return state.count;
+ })
});
diff --git a/test/client.ts b/test/client.ts
deleted file mode 100644
index 04aa429..0000000
--- a/test/client.ts
+++ /dev/null
@@ -1,26 +0,0 @@
-import { createTRPCProxyClient } from '@trpc/client';
-import mqtt from 'mqtt';
-
-import { mqttLink } from '../src/link';
-import type { AppRouter } from './appRouter';
-
-const client = mqtt.connect('mqtt://localhost');
-
-export const trpc = createTRPCProxyClient({
- links: [
- mqttLink({
- client,
- requestTopic: 'rpc/request'
- })
- ]
-});
-
-const main = async () => {
- const greeting = await trpc.greet.query('world');
- console.log(greeting);
- console.log('Closing MQTT client...');
- client.end();
- console.log('MQTT client closed.');
-};
-
-main();
diff --git a/test/index.test.ts b/test/index.test.ts
new file mode 100644
index 0000000..a05586e
--- /dev/null
+++ b/test/index.test.ts
@@ -0,0 +1,64 @@
+import { createTRPCProxyClient } from '@trpc/client';
+import Aedes from 'aedes';
+import { once } from 'events';
+import mqtt from 'mqtt';
+import { createServer } from 'net';
+
+import { createMQTTHandler } from '../src/adapter';
+import { mqttLink } from '../src/link';
+import { AppRouter, appRouter } from './appRouter';
+
+const requestTopic = 'rpc/request';
+
+const aedes = new Aedes();
+// aedes.on('publish', (packet, client) => console.log(packet.topic, packet.payload.toString()));
+const broker = createServer(aedes.handle);
+broker.listen(1883);
+const mqttClient = mqtt.connect('mqtt://localhost');
+
+createMQTTHandler({
+ client: mqttClient,
+ requestTopic,
+ router: appRouter
+});
+
+const client = createTRPCProxyClient({
+ links: [
+ mqttLink({
+ client: mqttClient,
+ requestTopic
+ })
+ ]
+});
+
+beforeAll(async () => {
+ await once(broker, 'listening');
+ await once(mqttClient, 'connect');
+});
+
+test('broker is listening', () => {
+ expect(broker.listening).toBe(true);
+});
+
+test('mqtt client is connected', () => {
+ expect(mqttClient.connected).toBe(true);
+});
+
+test('greet query', async () => {
+ const greeting = await client.greet.query('world');
+ expect(greeting).toEqual({ greeting: 'hello, world!' });
+});
+
+test('countUp mutation', async () => {
+ const addOne = await client.countUp.mutate(1);
+ expect(addOne).toBe(1);
+
+ const addTwo = await client.countUp.mutate(2);
+ expect(addTwo).toBe(3);
+});
+
+afterAll(async () => {
+ mqttClient.end();
+ broker.close();
+ aedes.close();
+});
diff --git a/test/server.ts b/test/server.ts
deleted file mode 100644
index 5a827d5..0000000
--- a/test/server.ts
+++ /dev/null
@@ -1,18 +0,0 @@
-import mqtt from 'mqtt';
-
-import { createMQTTHandler } from '../src/adapter';
-import { appRouter } from './appRouter';
-
-const client = mqtt.connect('mqtt://localhost');
-
-createMQTTHandler({
- client,
- requestTopic: 'rpc/request',
- router: appRouter
-});
-
-process.on('SIGINT', () => {
- console.log('Closing MQTT client...');
- client.end();
- console.log('MQTT client closed.');
-});