feat: add redis persistence
This commit is contained in:
43
README.md
43
README.md
@@ -47,25 +47,30 @@ const client = mqtt.connect('ws://localhost:8883/ws')
|
|||||||
|
|
||||||
Backbone can be configured using environment variables:
|
Backbone can be configured using environment variables:
|
||||||
|
|
||||||
| Variable | Description | Default |
|
| Variable | Description | Default |
|
||||||
| -------------------- | ---------------------------------------- | ----------- |
|
| -------------------- | ---------------------------------------- | ------------ |
|
||||||
| `ADMIN_TOKEN` | Admin token for API requests | `undefined` |
|
| `ADMIN_TOKEN` | Admin token for API requests | `undefined` |
|
||||||
| `JWT_SECRET` | JWT signing secret for authentication | `undefined` |
|
| `JWT_SECRET` | JWT signing secret for authentication | `undefined` |
|
||||||
| `K8S_ENABLED` | Enable Kubernetes operator mode | `false` |
|
| `K8S_ENABLED` | Enable Kubernetes operator mode | `false` |
|
||||||
| `WS_ENABLED` | Enable WebSocket MQTT server | `false` |
|
| `WS_ENABLED` | Enable WebSocket MQTT server | `false` |
|
||||||
| `API_ENABLED` | Enable HTTP API | `false` |
|
| `API_ENABLED` | Enable HTTP API | `false` |
|
||||||
| `HTTP_PORT` | HTTP server port | `8883` |
|
| `HTTP_PORT` | HTTP server port | `8883` |
|
||||||
| `TCP_ENABLED` | Enable TCP MQTT server | `false` |
|
| `TCP_ENABLED` | Enable TCP MQTT server | `false` |
|
||||||
| `TCP_PORT` | TCP server port | `1883` |
|
| `TCP_PORT` | TCP server port | `1883` |
|
||||||
| `OIDC_ENABLED` | OIDC discovery URL | `false` |
|
| `OIDC_ENABLED` | OIDC discovery URL | `false` |
|
||||||
| `OIDC_DISCOVERY` | OIDC discovery URL | `undefined` |
|
| `OIDC_DISCOVERY` | OIDC discovery URL | `undefined` |
|
||||||
| `OIDC_CLIENT_ID` | OIDC client ID | `undefined` |
|
| `OIDC_CLIENT_ID` | OIDC client ID | `undefined` |
|
||||||
| `OIDC_CLIENT_SECRET` | OIDC client secret | `undefined` |
|
| `OIDC_CLIENT_SECRET` | OIDC client secret | `undefined` |
|
||||||
| `OIDC_CLIENT_SECRET` | OIDC client secret | `undefined` |
|
| `OIDC_CLIENT_SECRET` | OIDC client secret | `undefined` |
|
||||||
| `OIDC_GROUP_FIELD` | JWT field for reading groups | `'groups'` |
|
| `OIDC_GROUP_FIELD` | JWT field for reading groups | `'groups'` |
|
||||||
| `OIDC_ADMIN_GROUP` | JWT group for admins | `undefined` |
|
| `OIDC_ADMIN_GROUP` | JWT group for admins | `undefined` |
|
||||||
| `OIDC_WRITER_GROUP` | JWT group with publish access to queue | `undefined` |
|
| `OIDC_WRITER_GROUP` | JWT group with publish access to queue | `undefined` |
|
||||||
| `OIDC_READER_GROUP` | JWT group with read-only access to queue | `undefined` |
|
| `OIDC_READER_GROUP` | JWT group with read-only access to queue | `undefined` |
|
||||||
|
| `REDIS_ENABLED` | Enable redis persistance | `false` |
|
||||||
|
| `REDIS_HOST` | Redis hostname | `'localhost` |
|
||||||
|
| `REDIS_PORT` | Redis port | `6379` |
|
||||||
|
| `REDIS_PASSWORD` | Redis password | `undefined` |
|
||||||
|
| `REDIS_DB` | Redis database | `0` |
|
||||||
|
|
||||||
### Example Configuration
|
### Example Configuration
|
||||||
|
|
||||||
|
|||||||
@@ -1,12 +1,16 @@
|
|||||||
name: backbone
|
name: backbone
|
||||||
services:
|
services:
|
||||||
app:
|
redis:
|
||||||
build:
|
image: redis
|
||||||
context: .
|
|
||||||
environment:
|
|
||||||
HTTP_ENABLED: 'true'
|
|
||||||
TCP_ENABLED: 'true'
|
|
||||||
TOKEN_SECRET: 'test'
|
|
||||||
ports:
|
ports:
|
||||||
- 1883:1883
|
- 6379:6379
|
||||||
- 8883:8883
|
# app:
|
||||||
|
# build:
|
||||||
|
# context: .
|
||||||
|
# environment:
|
||||||
|
# HTTP_ENABLED: 'true'
|
||||||
|
# TCP_ENABLED: 'true'
|
||||||
|
# TOKEN_SECRET: 'test'
|
||||||
|
# ports:
|
||||||
|
# - 1883:1883
|
||||||
|
# - 8883:8883
|
||||||
|
|||||||
@@ -49,6 +49,7 @@
|
|||||||
"aedes": "^0.51.3",
|
"aedes": "^0.51.3",
|
||||||
"aedes-packet": "^3.0.0",
|
"aedes-packet": "^3.0.0",
|
||||||
"aedes-persistence": "^10.2.2",
|
"aedes-persistence": "^10.2.2",
|
||||||
|
"aedes-persistence-redis": "^11.2.2",
|
||||||
"ajv": "^8.17.1",
|
"ajv": "^8.17.1",
|
||||||
"better-sqlite3": "^12.4.1",
|
"better-sqlite3": "^12.4.1",
|
||||||
"fastify": "^5.6.1",
|
"fastify": "^5.6.1",
|
||||||
|
|||||||
112
pnpm-lock.yaml
generated
112
pnpm-lock.yaml
generated
@@ -32,6 +32,9 @@ importers:
|
|||||||
aedes-persistence:
|
aedes-persistence:
|
||||||
specifier: ^10.2.2
|
specifier: ^10.2.2
|
||||||
version: 10.2.2
|
version: 10.2.2
|
||||||
|
aedes-persistence-redis:
|
||||||
|
specifier: ^11.2.2
|
||||||
|
version: 11.2.2
|
||||||
ajv:
|
ajv:
|
||||||
specifier: ^8.17.1
|
specifier: ^8.17.1
|
||||||
version: 8.17.1
|
version: 8.17.1
|
||||||
@@ -394,6 +397,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
|
resolution: {integrity: sha512-bV0Tgo9K4hfPCek+aMAn81RppFKv2ySDQeMoSZuvTASywNTnVJCArCZE2FWqpvIatKu7VMRLWlR1EazvVhDyhQ==}
|
||||||
engines: {node: '>=18.18'}
|
engines: {node: '>=18.18'}
|
||||||
|
|
||||||
|
'@ioredis/commands@1.4.0':
|
||||||
|
resolution: {integrity: sha512-aFT2yemJJo+TZCmieA7qnYGQooOS7QfNmYrzGtsYd3g9j5iDP8AimYYAesf79ohjbLG12XxC4nG5DyEnC88AsQ==}
|
||||||
|
|
||||||
'@isaacs/cliui@8.0.2':
|
'@isaacs/cliui@8.0.2':
|
||||||
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
resolution: {integrity: sha512-O8jcjabXaleOG9DQ0+ARXWZBTfnP4WNAqzuiJK7ll44AmxGKv/J2M4TPjxjY3znBCfvBXFzucm1twdyFybFqEA==}
|
||||||
engines: {node: '>=12'}
|
engines: {node: '>=12'}
|
||||||
@@ -911,6 +917,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==}
|
resolution: {integrity: sha512-swASey0BxGs4/npZGWoiVDmnEyPvVFIRY6l2LVKL4rbiW8IhcIGDLfnb20Qo8U20itXlitAKPQ3MVTEbOGG5ZA==}
|
||||||
engines: {node: '>=14'}
|
engines: {node: '>=14'}
|
||||||
|
|
||||||
|
aedes-persistence-redis@11.2.2:
|
||||||
|
resolution: {integrity: sha512-kJRHG6FiykSdkniWJYDNYW892buif3D8iu5FrkgXsVuoF7A7rX3I1n4w6BV4Ocvz8thFaKBjWe3EAtOzOdEPIA==}
|
||||||
|
engines: {node: '>=20'}
|
||||||
|
|
||||||
aedes-persistence@10.2.2:
|
aedes-persistence@10.2.2:
|
||||||
resolution: {integrity: sha512-lbiViUGXxOyUakU01xvD758LGOLJ8T7PzpT3q2q8enMSMFSigy0dYQc0b7bgHcz96AYJjEraQSfVpXH7L546TA==}
|
resolution: {integrity: sha512-lbiViUGXxOyUakU01xvD758LGOLJ8T7PzpT3q2q8enMSMFSigy0dYQc0b7bgHcz96AYJjEraQSfVpXH7L546TA==}
|
||||||
engines: {node: '>=20'}
|
engines: {node: '>=20'}
|
||||||
@@ -1204,6 +1214,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
|
resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==}
|
||||||
engines: {node: '>=0.8'}
|
engines: {node: '>=0.8'}
|
||||||
|
|
||||||
|
cluster-key-slot@1.1.2:
|
||||||
|
resolution: {integrity: sha512-RMr0FhtfXemyinomL4hrWcYJxmX6deFdCxpJzhDttxgO1+bcCnkk+9drydLVDmAMG7NE6aN/fl4F7ucU/90gAA==}
|
||||||
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
color-convert@2.0.1:
|
color-convert@2.0.1:
|
||||||
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==}
|
||||||
engines: {node: '>=7.0.0'}
|
engines: {node: '>=7.0.0'}
|
||||||
@@ -1318,6 +1332,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==}
|
||||||
engines: {node: '>=0.4.0'}
|
engines: {node: '>=0.4.0'}
|
||||||
|
|
||||||
|
denque@2.1.0:
|
||||||
|
resolution: {integrity: sha512-HVQE3AAb/pxF8fQAoiqpvg9i3evqug3hoiwakOyZAwJm+6vZehbkYXZ0l4JxS+I3QxM97v5aaRNhj8v5oBhekw==}
|
||||||
|
engines: {node: '>=0.10'}
|
||||||
|
|
||||||
depd@2.0.0:
|
depd@2.0.0:
|
||||||
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
@@ -1506,6 +1524,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
|
event-lite@0.1.3:
|
||||||
|
resolution: {integrity: sha512-8qz9nOz5VeD2z96elrEKD2U433+L3DWdUdDkOINLGOJvx1GsMBbMn0aCeu28y8/e85A6mCigBiFlYMnTBEGlSw==}
|
||||||
|
|
||||||
event-target-shim@5.0.1:
|
event-target-shim@5.0.1:
|
||||||
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
|
resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==}
|
||||||
engines: {node: '>=6'}
|
engines: {node: '>=6'}
|
||||||
@@ -1766,6 +1787,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
|
resolution: {integrity: sha512-NqADB8VjPFLM2V0VvHUewwwsw0ZWBaIdgo+ieHtK3hasLz4qeCRjYcqfB6AQrBggRKppKF8L52/VqdVsO47Dlw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
|
|
||||||
|
hashlru@2.3.0:
|
||||||
|
resolution: {integrity: sha512-0cMsjjIC8I+D3M44pOQdsy0OHXGLVz6Z0beRuufhKa0KfaD2wGwAev6jILzXsd3/vpnNQJmWyZtIILqM1N+n5A==}
|
||||||
|
|
||||||
hasown@2.0.2:
|
hasown@2.0.2:
|
||||||
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
resolution: {integrity: sha512-0hJU9SCPvmMzIBdZFqNPXWa6dqh7WdH0cII9y+CyS8rG3nL48Bclra9HmKhVVUHyPWNH5Y7xDwAB7bfgSjkUMQ==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -1823,6 +1847,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==}
|
resolution: {integrity: sha512-it4HyVAUTKBc6m8e1iXWvXSTdndF7HbdN713+kvLrymxTaU4AUBWrJ4vEooP+V7fexnVD3LKcBshjGGPefSMUQ==}
|
||||||
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
|
engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0}
|
||||||
|
|
||||||
|
int64-buffer@0.1.10:
|
||||||
|
resolution: {integrity: sha512-v7cSY1J8ydZ0GyjUHqF+1bshJ6cnEVLo9EnjB8p+4HDRPZc9N5jjmvUV7NvEsqQOKyH0pmIBFWXVQbiS0+OBbA==}
|
||||||
|
|
||||||
internal-slot@1.1.0:
|
internal-slot@1.1.0:
|
||||||
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
|
resolution: {integrity: sha512-4gd7VpWNQNB4UKKCFFVcp1AVv+FMOgs9NKzjHKusc8jTMhd5eL1NqQqOpE0KzMds804/yHlglp3uxgluOqAPLw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -1831,6 +1858,10 @@ packages:
|
|||||||
resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==}
|
resolution: {integrity: sha512-Ju0Bz/cEia55xDwUWEa8+olFpCiQoypjnQySseKtmjNrnps3P+xfpUmGr90T7yjlVJmOtybRvPXhKMbHr+fWnw==}
|
||||||
engines: {node: '>= 0.10'}
|
engines: {node: '>= 0.10'}
|
||||||
|
|
||||||
|
ioredis@5.8.1:
|
||||||
|
resolution: {integrity: sha512-Qho8TgIamqEPdgiMadJwzRMW3TudIg6vpg4YONokGDudy4eqRIJtDbVX72pfLBcWxvbn3qm/40TyGUObdW4tLQ==}
|
||||||
|
engines: {node: '>=12.22.0'}
|
||||||
|
|
||||||
ip-address@10.0.1:
|
ip-address@10.0.1:
|
||||||
resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==}
|
resolution: {integrity: sha512-NWv9YLW4PoW2B7xtzaS3NCot75m6nK7Icdv0o3lfMceJVRfSoQwqD4wEH5rLwoKJwUiZ/rfpiVBhnaF0FK4HoA==}
|
||||||
engines: {node: '>= 12'}
|
engines: {node: '>= 12'}
|
||||||
@@ -1962,6 +1993,9 @@ packages:
|
|||||||
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
|
resolution: {integrity: sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==}
|
||||||
engines: {node: '>=0.10.0'}
|
engines: {node: '>=0.10.0'}
|
||||||
|
|
||||||
|
isarray@1.0.0:
|
||||||
|
resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==}
|
||||||
|
|
||||||
isarray@2.0.5:
|
isarray@2.0.5:
|
||||||
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
|
resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==}
|
||||||
|
|
||||||
@@ -2118,9 +2152,15 @@ packages:
|
|||||||
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
|
resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==}
|
||||||
engines: {node: '>=10'}
|
engines: {node: '>=10'}
|
||||||
|
|
||||||
|
lodash.defaults@4.2.0:
|
||||||
|
resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==}
|
||||||
|
|
||||||
lodash.includes@4.3.0:
|
lodash.includes@4.3.0:
|
||||||
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
|
resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==}
|
||||||
|
|
||||||
|
lodash.isarguments@3.1.0:
|
||||||
|
resolution: {integrity: sha512-chi4NHZlZqZD18a0imDHnZPrDeBbTtVN7GXMwuGdRH9qotxAjYs3aVLKc7zNOG9eddR5Ksd8rvFEBc9SsggPpg==}
|
||||||
|
|
||||||
lodash.isboolean@3.0.3:
|
lodash.isboolean@3.0.3:
|
||||||
resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
|
resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==}
|
||||||
|
|
||||||
@@ -2250,6 +2290,10 @@ packages:
|
|||||||
ms@2.1.3:
|
ms@2.1.3:
|
||||||
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==}
|
||||||
|
|
||||||
|
msgpack-lite@0.1.26:
|
||||||
|
resolution: {integrity: sha512-SZ2IxeqZ1oRFGo0xFGbvBJWMp3yLIY9rlIJyxy8CGrwZn1f0ZK4r6jV/AM1r0FZMDUkWkglOk/eeKIL9g77Nxw==}
|
||||||
|
hasBin: true
|
||||||
|
|
||||||
nanoid@3.3.11:
|
nanoid@3.3.11:
|
||||||
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
|
resolution: {integrity: sha512-N8SpfPUnUp1bK+PMYW8qSWdl9U+wwNWI4QKxOYDy9JAro3WMX7p2OeVRF9v+347pnakNevPmiHhNmZ2HbFA76w==}
|
||||||
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
engines: {node: ^10 || ^12 || ^13.7 || ^14 || >=15.0.1}
|
||||||
@@ -2602,6 +2646,14 @@ packages:
|
|||||||
resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
|
resolution: {integrity: sha512-/vxpCXddiX8NGfGO/mTafwjq4aFa/71pvamip0++IQk3zG8cbCj0fifNPrjjF1XMXUne91jL9OoxmdykoEtifQ==}
|
||||||
engines: {node: '>= 10.13.0'}
|
engines: {node: '>= 10.13.0'}
|
||||||
|
|
||||||
|
redis-errors@1.2.0:
|
||||||
|
resolution: {integrity: sha512-1qny3OExCf0UvUV/5wpYKf2YwPcOqXzkwKKSmKHiE6ZMQs5heeE/c8eXK+PNllPvmjgAbfnsbpkGZWy8cBpn9w==}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
|
redis-parser@3.0.0:
|
||||||
|
resolution: {integrity: sha512-DJnGAeenTdpMEH6uAJRK/uiyEIH9WVsUmoLwzudwGJUwZPp80PDBWPHXSAGNPwNvIXAbe7MSUB1zQFugFml66A==}
|
||||||
|
engines: {node: '>=4'}
|
||||||
|
|
||||||
reflect.getprototypeof@1.0.10:
|
reflect.getprototypeof@1.0.10:
|
||||||
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
|
resolution: {integrity: sha512-00o4I+DVrefhv+nX0ulyi3biSHCPDe+yLv5o/p6d/UVlirijB8E16FtfwSAi4g3tcqrQ4lRAqQSoFEZJehYEcw==}
|
||||||
engines: {node: '>= 0.4'}
|
engines: {node: '>= 0.4'}
|
||||||
@@ -2799,6 +2851,9 @@ packages:
|
|||||||
stacktracey@2.1.8:
|
stacktracey@2.1.8:
|
||||||
resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==}
|
resolution: {integrity: sha512-Kpij9riA+UNg7TnphqjH7/CzctQ/owJGNbFkfEeve4Z4uxT5+JapVLFXcsurIfN34gnTWZNJ/f7NMG0E8JDzTw==}
|
||||||
|
|
||||||
|
standard-as-callback@2.1.0:
|
||||||
|
resolution: {integrity: sha512-qoRRSyROncaz1z0mvYqIE4lCd9p2R90i6GxW3uZv5ucSu8tU7B5HXUP1gG8pVZsYNVaXjk8ClXHPttLyxAL48A==}
|
||||||
|
|
||||||
statuses@2.0.1:
|
statuses@2.0.1:
|
||||||
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==}
|
||||||
engines: {node: '>= 0.8'}
|
engines: {node: '>= 0.8'}
|
||||||
@@ -3482,6 +3537,8 @@ snapshots:
|
|||||||
|
|
||||||
'@humanwhocodes/retry@0.4.3': {}
|
'@humanwhocodes/retry@0.4.3': {}
|
||||||
|
|
||||||
|
'@ioredis/commands@1.4.0': {}
|
||||||
|
|
||||||
'@isaacs/cliui@8.0.2':
|
'@isaacs/cliui@8.0.2':
|
||||||
dependencies:
|
dependencies:
|
||||||
string-width: 5.1.2
|
string-width: 5.1.2
|
||||||
@@ -4137,6 +4194,16 @@ snapshots:
|
|||||||
transitivePeerDependencies:
|
transitivePeerDependencies:
|
||||||
- supports-color
|
- supports-color
|
||||||
|
|
||||||
|
aedes-persistence-redis@11.2.2:
|
||||||
|
dependencies:
|
||||||
|
aedes-persistence: 10.2.2
|
||||||
|
hashlru: 2.3.0
|
||||||
|
ioredis: 5.8.1
|
||||||
|
msgpack-lite: 0.1.26
|
||||||
|
qlobber: 8.0.1
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
aedes-persistence@10.2.2:
|
aedes-persistence@10.2.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
aedes-packet: 3.0.0
|
aedes-packet: 3.0.0
|
||||||
@@ -4480,6 +4547,8 @@ snapshots:
|
|||||||
|
|
||||||
clone@1.0.4: {}
|
clone@1.0.4: {}
|
||||||
|
|
||||||
|
cluster-key-slot@1.1.2: {}
|
||||||
|
|
||||||
color-convert@2.0.1:
|
color-convert@2.0.1:
|
||||||
dependencies:
|
dependencies:
|
||||||
color-name: 1.1.4
|
color-name: 1.1.4
|
||||||
@@ -4580,6 +4649,8 @@ snapshots:
|
|||||||
|
|
||||||
delayed-stream@1.0.0: {}
|
delayed-stream@1.0.0: {}
|
||||||
|
|
||||||
|
denque@2.1.0: {}
|
||||||
|
|
||||||
depd@2.0.0: {}
|
depd@2.0.0: {}
|
||||||
|
|
||||||
dequal@2.0.3: {}
|
dequal@2.0.3: {}
|
||||||
@@ -4871,6 +4942,8 @@ snapshots:
|
|||||||
|
|
||||||
esutils@2.0.3: {}
|
esutils@2.0.3: {}
|
||||||
|
|
||||||
|
event-lite@0.1.3: {}
|
||||||
|
|
||||||
event-target-shim@5.0.1: {}
|
event-target-shim@5.0.1: {}
|
||||||
|
|
||||||
events-universal@1.0.1:
|
events-universal@1.0.1:
|
||||||
@@ -5151,6 +5224,8 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
has-symbols: 1.1.0
|
has-symbols: 1.1.0
|
||||||
|
|
||||||
|
hashlru@2.3.0: {}
|
||||||
|
|
||||||
hasown@2.0.2:
|
hasown@2.0.2:
|
||||||
dependencies:
|
dependencies:
|
||||||
function-bind: 1.1.2
|
function-bind: 1.1.2
|
||||||
@@ -5198,6 +5273,8 @@ snapshots:
|
|||||||
|
|
||||||
ini@3.0.1: {}
|
ini@3.0.1: {}
|
||||||
|
|
||||||
|
int64-buffer@0.1.10: {}
|
||||||
|
|
||||||
internal-slot@1.1.0:
|
internal-slot@1.1.0:
|
||||||
dependencies:
|
dependencies:
|
||||||
es-errors: 1.3.0
|
es-errors: 1.3.0
|
||||||
@@ -5206,6 +5283,20 @@ snapshots:
|
|||||||
|
|
||||||
interpret@2.2.0: {}
|
interpret@2.2.0: {}
|
||||||
|
|
||||||
|
ioredis@5.8.1:
|
||||||
|
dependencies:
|
||||||
|
'@ioredis/commands': 1.4.0
|
||||||
|
cluster-key-slot: 1.1.2
|
||||||
|
debug: 4.4.3
|
||||||
|
denque: 2.1.0
|
||||||
|
lodash.defaults: 4.2.0
|
||||||
|
lodash.isarguments: 3.1.0
|
||||||
|
redis-errors: 1.2.0
|
||||||
|
redis-parser: 3.0.0
|
||||||
|
standard-as-callback: 2.1.0
|
||||||
|
transitivePeerDependencies:
|
||||||
|
- supports-color
|
||||||
|
|
||||||
ip-address@10.0.1: {}
|
ip-address@10.0.1: {}
|
||||||
|
|
||||||
ipaddr.js@2.2.0: {}
|
ipaddr.js@2.2.0: {}
|
||||||
@@ -5332,6 +5423,8 @@ snapshots:
|
|||||||
|
|
||||||
is-windows@1.0.2: {}
|
is-windows@1.0.2: {}
|
||||||
|
|
||||||
|
isarray@1.0.0: {}
|
||||||
|
|
||||||
isarray@2.0.5: {}
|
isarray@2.0.5: {}
|
||||||
|
|
||||||
isexe@2.0.0: {}
|
isexe@2.0.0: {}
|
||||||
@@ -5495,8 +5588,12 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
p-locate: 5.0.0
|
p-locate: 5.0.0
|
||||||
|
|
||||||
|
lodash.defaults@4.2.0: {}
|
||||||
|
|
||||||
lodash.includes@4.3.0: {}
|
lodash.includes@4.3.0: {}
|
||||||
|
|
||||||
|
lodash.isarguments@3.1.0: {}
|
||||||
|
|
||||||
lodash.isboolean@3.0.3: {}
|
lodash.isboolean@3.0.3: {}
|
||||||
|
|
||||||
lodash.isinteger@4.0.4: {}
|
lodash.isinteger@4.0.4: {}
|
||||||
@@ -5629,6 +5726,13 @@ snapshots:
|
|||||||
|
|
||||||
ms@2.1.3: {}
|
ms@2.1.3: {}
|
||||||
|
|
||||||
|
msgpack-lite@0.1.26:
|
||||||
|
dependencies:
|
||||||
|
event-lite: 0.1.3
|
||||||
|
ieee754: 1.2.1
|
||||||
|
int64-buffer: 0.1.10
|
||||||
|
isarray: 1.0.0
|
||||||
|
|
||||||
nanoid@3.3.11: {}
|
nanoid@3.3.11: {}
|
||||||
|
|
||||||
nanoid@5.1.5: {}
|
nanoid@5.1.5: {}
|
||||||
@@ -5967,6 +6071,12 @@ snapshots:
|
|||||||
dependencies:
|
dependencies:
|
||||||
resolve: 1.22.10
|
resolve: 1.22.10
|
||||||
|
|
||||||
|
redis-errors@1.2.0: {}
|
||||||
|
|
||||||
|
redis-parser@3.0.0:
|
||||||
|
dependencies:
|
||||||
|
redis-errors: 1.2.0
|
||||||
|
|
||||||
reflect.getprototypeof@1.0.10:
|
reflect.getprototypeof@1.0.10:
|
||||||
dependencies:
|
dependencies:
|
||||||
call-bind: 1.0.8
|
call-bind: 1.0.8
|
||||||
@@ -6204,6 +6314,8 @@ snapshots:
|
|||||||
as-table: 1.0.55
|
as-table: 1.0.55
|
||||||
get-source: 2.0.12
|
get-source: 2.0.12
|
||||||
|
|
||||||
|
standard-as-callback@2.1.0: {}
|
||||||
|
|
||||||
statuses@2.0.1: {}
|
statuses@2.0.1: {}
|
||||||
|
|
||||||
std-env@3.10.0: {}
|
std-env@3.10.0: {}
|
||||||
|
|||||||
@@ -49,7 +49,7 @@ class Backbone {
|
|||||||
const http = await this.server.getHttpServer();
|
const http = await this.server.getHttpServer();
|
||||||
http.listen({ port: this.config.http.port, host: '0.0.0.0' });
|
http.listen({ port: this.config.http.port, host: '0.0.0.0' });
|
||||||
}
|
}
|
||||||
if (this.config.tcp) {
|
if (this.config.tcp.enabled) {
|
||||||
const tcp = this.server.getTcpServer();
|
const tcp = this.server.getTcpServer();
|
||||||
tcp.listen(this.config.tcp.port);
|
tcp.listen(this.config.tcp.port);
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -30,6 +30,21 @@ class Config {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public get redis() {
|
||||||
|
const enabled = process.env.REDIS_ENABLED === 'true';
|
||||||
|
const host = process.env.REDIS_HOST;
|
||||||
|
const port = process.env.REDIS_PORT ? parseInt(process.env.REDIS_PORT) : 6379;
|
||||||
|
const password = process.env.REDIS_PASSWORD;
|
||||||
|
const db = process.env.REDIS_DB ? parseInt(process.env.REDIS_DB) : 0;
|
||||||
|
return {
|
||||||
|
enabled,
|
||||||
|
host,
|
||||||
|
port,
|
||||||
|
password,
|
||||||
|
db,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
public get k8s() {
|
public get k8s() {
|
||||||
const enabled = process.env.K8S_ENABLED === 'true';
|
const enabled = process.env.K8S_ENABLED === 'true';
|
||||||
return {
|
return {
|
||||||
|
|||||||
@@ -2,6 +2,8 @@ import { Backbone } from './backbone.ts';
|
|||||||
process.env.JWT_SECRET = 'test';
|
process.env.JWT_SECRET = 'test';
|
||||||
process.env.ADMIN_TOKEN = 'admin';
|
process.env.ADMIN_TOKEN = 'admin';
|
||||||
process.env.API_ENABLED = 'true';
|
process.env.API_ENABLED = 'true';
|
||||||
|
process.env.WS_ENABLED = 'true';
|
||||||
|
process.env.TCP_ENABLED = 'true';
|
||||||
|
|
||||||
const backbone = new Backbone();
|
const backbone = new Backbone();
|
||||||
await backbone.start();
|
await backbone.start();
|
||||||
|
|||||||
12
src/global.d.ts
vendored
12
src/global.d.ts
vendored
@@ -1,2 +1,14 @@
|
|||||||
|
// import 'aedes-persistence';
|
||||||
|
|
||||||
// eslint-disable-next-line
|
// eslint-disable-next-line
|
||||||
declare type ExplicitAny = any;
|
declare type ExplicitAny = any;
|
||||||
|
|
||||||
|
declare module 'aedes-persistence-redis' {
|
||||||
|
// eslint-disable-next-line
|
||||||
|
export default any;
|
||||||
|
}
|
||||||
|
|
||||||
|
declare module 'aedes-persist' {
|
||||||
|
// eslint-disable-next-line
|
||||||
|
export default any;
|
||||||
|
}
|
||||||
|
|||||||
@@ -16,6 +16,8 @@ import fastify, { type FastifyInstance } from 'fastify';
|
|||||||
import fastifyWebSocket from '@fastify/websocket';
|
import fastifyWebSocket from '@fastify/websocket';
|
||||||
import { createWebSocketStream } from 'ws';
|
import { createWebSocketStream } from 'ws';
|
||||||
import fastifySensible from '@fastify/sensible';
|
import fastifySensible from '@fastify/sensible';
|
||||||
|
import redis from 'aedes-persistence-redis';
|
||||||
|
import memory from 'aedes-persistence';
|
||||||
|
|
||||||
import { api } from '../api/api.ts';
|
import { api } from '../api/api.ts';
|
||||||
|
|
||||||
@@ -49,6 +51,7 @@ class MqttServer {
|
|||||||
constructor(services: Services) {
|
constructor(services: Services) {
|
||||||
this.#services = services;
|
this.#services = services;
|
||||||
this.#server = aedes.createBroker({
|
this.#server = aedes.createBroker({
|
||||||
|
persistence: this.#getPersistance(),
|
||||||
authenticate: this.#authenticate,
|
authenticate: this.#authenticate,
|
||||||
authorizePublish: this.#authorizePublish,
|
authorizePublish: this.#authorizePublish,
|
||||||
authorizeSubscribe: this.#authorizeSubscribe,
|
authorizeSubscribe: this.#authorizeSubscribe,
|
||||||
@@ -61,6 +64,19 @@ class MqttServer {
|
|||||||
return this.#server;
|
return this.#server;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#getPersistance = () => {
|
||||||
|
const config = this.#services.get(Config);
|
||||||
|
if (config.redis.enabled) {
|
||||||
|
return redis({
|
||||||
|
host: config.redis.host,
|
||||||
|
port: config.redis.port,
|
||||||
|
password: config.redis.password,
|
||||||
|
db: config.redis.db,
|
||||||
|
});
|
||||||
|
}
|
||||||
|
return (memory as ExplicitAny)();
|
||||||
|
};
|
||||||
|
|
||||||
#authenticate: AuthenticateHandler = async (client, username, password, callback) => {
|
#authenticate: AuthenticateHandler = async (client, username, password, callback) => {
|
||||||
try {
|
try {
|
||||||
if (!username || !password) {
|
if (!username || !password) {
|
||||||
|
|||||||
@@ -43,6 +43,13 @@ const createWorld = async (options: WorldOptions) => {
|
|||||||
enabled: false,
|
enabled: false,
|
||||||
port: 1883,
|
port: 1883,
|
||||||
},
|
},
|
||||||
|
redis: {
|
||||||
|
enabled: false,
|
||||||
|
host: undefined,
|
||||||
|
password: undefined,
|
||||||
|
db: 0,
|
||||||
|
port: 0,
|
||||||
|
},
|
||||||
});
|
});
|
||||||
const accessTokens = backbone.services.get(JwtAuth);
|
const accessTokens = backbone.services.get(JwtAuth);
|
||||||
backbone.sessionProvider.register('token', accessTokens);
|
backbone.sessionProvider.register('token', accessTokens);
|
||||||
|
|||||||
Reference in New Issue
Block a user