{"_id":"@74labs/nestjs-protocol-mqtt-bridge","_rev":"1-ce5197bc2b0ce906eb3fcdb5c61a7cbc","name":"@74labs/nestjs-protocol-mqtt-bridge","dist-tags":{"latest":"2.0.0"},"versions":{"1.0.0":{"name":"@74labs/nestjs-protocol-mqtt-bridge","version":"1.0.0","author":{"name":"Tom Stanczyk","email":"tom.stanczyk.74labs@gmail.com"},"license":"MIT","_id":"@74labs/nestjs-protocol-mqtt-bridge@1.0.0","maintainers":[{"name":"tom.stanczyk","email":"tomasz.stanczyk@gmail.com"}],"dist":{"shasum":"317282f3247477c10aece2dd21058b7ca97b2efe","tarball":"https://registry.npmjs.org/@74labs/nestjs-protocol-mqtt-bridge/-/nestjs-protocol-mqtt-bridge-1.0.0.tgz","fileCount":30,"integrity":"sha512-TbRCcoz1sSZxyB2XGaajUUAiIsTQKDjv+p+sb/BgIK2BRRWZJg8tPO6GvYfxJXPOQLbOycyhzu+LP4KTDDI3IA==","signatures":[{"sig":"MEYCIQC/ItojQUOqg4hMVRtc6b4kpc2X/Bx9tFPzGDBM9awbSQIhAJZoFZfhgrmTVYhuE2TkN7GIIAXs3EfKwjKG2BT4wqDR","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":35763},"main":"dist/index.js","types":"dist/index.d.ts","gitHead":"cee60fe5b4ff24d40672a8cf61ad907e4fe625bb","scripts":{"test":"echo \"Error: no test specified\" && exit 1","build":"nest build"},"_npmUser":{"name":"tom.stanczyk","email":"tomasz.stanczyk@gmail.com"},"_npmVersion":"10.8.1","description":"Abstraction layer for Any Protocol to MQTT bridge implementations","directories":{},"_nodeVersion":"20.16.0","dependencies":{"@74labs/nestjs-protocol-mqtt-bridge":"file:"},"_hasShrinkwrap":false,"devDependencies":{"jest":"^29.7.0","mqtt":"^5.10.1","rxjs":"^7.8.1","ts-jest":"^29.2.5","typescript":"^5.1.3","@nestjs/cli":"^10.0.0","@types/jest":"^29.5.14","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","@nestjs/microservices":"^10.3.10"},"peerDependencies":{"mqtt":"^5.10.1","rxjs":"^7.8.1","@nestjs/core":"^10.0.0","@nestjs/common":"^10.0.0","@nestjs/config":"^3.2.3","@nestjs/microservices":"^10.3.10"},"_npmOperationalInternal":{"tmp":"tmp/nestjs-protocol-mqtt-bridge_1.0.0_1736505085369_0.2894228445540521","host":"s3://npm-registry-packages-npm-production"}},"2.0.0":{"name":"@74labs/nestjs-protocol-mqtt-bridge","version":"2.0.0","description":"Abstraction layer for Any Protocol to MQTT bridge implementations","scripts":{"build":"nest build","test":"echo \"Error: no test specified\" && exit 1"},"author":{"name":"Tom Stanczyk","email":"tom.stanczyk.74labs@gmail.com"},"license":"MIT","main":"dist/index.js","types":"dist/index.d.ts","peerDependencies":{"@nestjs/common":"^10.0.0","@nestjs/config":"^3.2.3","@nestjs/core":"^10.0.0","@nestjs/microservices":"^10.4.1","mqtt":"^5.10.1","rxjs":"^7.8.1"},"dependencies":{"@74labs/nestjs-protocol-mqtt-bridge":"file:"},"devDependencies":{"@nestjs/cli":"^10.0.0","@nestjs/common":"^10.0.0","@nestjs/core":"^10.0.0","@nestjs/microservices":"^10.4.1","@types/jest":"^29.5.14","jest":"^29.7.0","mqtt":"^5.10.1","rxjs":"^7.8.1","ts-jest":"^29.2.5","typescript":"^5.1.3"},"_id":"@74labs/nestjs-protocol-mqtt-bridge@2.0.0","gitHead":"05ed9bcddf9a1912c8c721b3d301b34603f93b7b","_nodeVersion":"20.16.0","_npmVersion":"10.8.1","dist":{"integrity":"sha512-nOUGCTHjm4tFJ9k6HtLY9FAW14B/A74tT6pD59Kjvb5BX/7U89XIbRgXzeiWUVv5c6lKn93jVKU6OupjD9vqVw==","shasum":"e734c47f4acb1265f6af60661efd2c8c0d3e3b62","tarball":"https://registry.npmjs.org/@74labs/nestjs-protocol-mqtt-bridge/-/nestjs-protocol-mqtt-bridge-2.0.0.tgz","fileCount":30,"unpackedSize":36083,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQCXiz63DZOMrEf1lBXE0ciVSU1I8YmPkQcz6ejWtk+RmgIgPgGDjkBepZskXG6mAdpZM89//7nDwAFwENXgYHGwwZI="}]},"_npmUser":{"name":"tom.stanczyk","email":"tomasz.stanczyk@gmail.com"},"directories":{},"maintainers":[{"name":"tom.stanczyk","email":"tomasz.stanczyk@gmail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/nestjs-protocol-mqtt-bridge_2.0.0_1736862902577_0.17340823398551652"},"_hasShrinkwrap":false}},"time":{"created":"2025-01-10T10:31:25.279Z","modified":"2025-01-14T13:55:02.988Z","1.0.0":"2025-01-10T10:31:25.569Z","2.0.0":"2025-01-14T13:55:02.799Z"},"author":{"name":"Tom Stanczyk","email":"tom.stanczyk.74labs@gmail.com"},"license":"MIT","description":"Abstraction layer for Any Protocol to MQTT bridge implementations","maintainers":[{"name":"tom.stanczyk","email":"tomasz.stanczyk@gmail.com"}],"readme":"# NestJS Protocol MQTT/REST Bridge\r\n\r\nNestJS abstraction layer for buliding any protocol to MQTT and/or REST bridges.\r\n\r\n## Configuration\r\n\r\nBridge module expects configuration provided via ConfigModule with following configuration keys (with default values):\r\n\r\n```typescript\r\nCONFIG_MQTT_CLIENT_ID: string = 'mqtt.clientId'\r\nCONFIG_MQTT_HOST: string = 'mqtt.host'\r\nCONFIG_MQTT_PORT: string = 'mqtt.port'\r\n\r\nDEFAULT_MQTT_CLIENT_ID: string = 'protocol-gateway'\r\nDEFAULT_MQTT_HOST: string = 'localhost'\r\nDEFAULT_MQTT_PORT: number = 1883\r\n```\r\n\r\nExample:\r\n\r\n```typescript\r\n{\r\n  mqtt: {\r\n    clientId: 'protocol-gateway',\r\n    host: 'localhost',\r\n    port: 1883\r\n  }\r\n}\r\n```\r\n\r\nBridge performs MQTT publisher only connection initialization with options like this:\r\n\r\n```typescript\r\n{\r\n  clientId: cfg.get<string>(CONFIG_MQTT_CLIENT_ID, DEFAULT_MQTT_CLIENT_ID) + '-pub',\r\n  host: cfg.get<string>(CONFIG_MQTT_HOST, DEFAULT_MQTT_HOST),\r\n  port: cfg.get<number>(CONFIG_MQTT_PORT, DEFAULT_MQTT_PORT),\r\n  protocolVersion: 5,\r\n  connectTimeout: 5000,\r\n  reconnectPeriod: 1000,\r\n}\r\n```\r\n\r\nMQTT client for subscription should be provide in your main.ts like this:\r\n\r\n```typescript\r\nconst app = await NestFactory.create(AppModule)\r\n\r\nconst cfg = app.get(ConfigService)\r\n\r\napp.connectMicroservice<MicroserviceOptions>({\r\n  transport: Transport.MQTT,\r\n  options: {\r\n    host: cfg.get<string>(CONFIG_MQTT_HOST, DEFAULT_MQTT_HOST),\r\n    port: cfg.get<number>(CONFIG_MQTT_PORT, DEFAULT_MQTT_PORT),\r\n    clientId: cfg.get<string>(CONFIG_MQTT_CLIENT_ID, DEFAULT_MQTT_CLIENT_ID) + '-sub',\r\n    protocolVersion: 5,\r\n    connectTimeout: 5000,\r\n    reconnectPeriod: 1000,\r\n  },\r\n});\r\n```\r\n\r\n## Implementation\r\n\r\nCreate your own protocol module\r\n\r\n```typescript\r\n@Module({\r\n  imports: [\r\n    ProtocolMqttBridgeModule,\r\n  ],\r\n  providers: [\r\n    YourProtocolService\r\n  ],\r\n  controllers: [\r\n    YourProtocolController\r\n  ],\r\n  exports: [\r\n    YourProtocolService\r\n  ]\r\n})\r\nexport class YourProtocolModule { }\r\n```\r\n\r\nCreate your own protocol service\r\n\r\n```typescript\r\n\r\nimport { ProtocolReadVariableConfig, ProtocolService, ProtocolWriteVariableConfig } from '@74labs/nestjs-protocol-mqtt-bridge'\r\n\r\nexport type YourProtocolConnection = any\r\nexport type YourProtocolVariableId = string\r\n\r\n@Injectable()\r\nexport class YourProtocolService extends ProtocolService<YourProtocolConnection, YourProtocolVariableId> implements OnModuleDestroy {\r\n\r\n  constructor(private config: ConfigService) {\r\n    super('MY-PROTO')\r\n    // Create connection for all devices that you want to bridge\r\n    this.config.get<any[]>('devices', []).forEach(device => this.connect(device.name, device.params))\r\n  }\r\n\r\n  // You should override these methods:\r\n\r\n  override protocolConnect(params: any): Observable<YourProtocolConnection> {\r\n    // return Observable with your protocol connection\r\n  }\r\n\r\n  override protocolConnectionCheck(connection: YourProtocolConnection): boolean {\r\n    // return true if your connection is still healthy\r\n  }\r\n\r\n  override protocolRead(connection: YourProtocolConnection, vars: ProtocolReadVariableConfig<YourProtocolVariableId>[]): Observable<any[]> {\r\n    // return Observable with array of values of variables identified via vars param\r\n  }\r\n\r\n  override protocolWrite(connection: YourProtocolConnection, vars: ProtocolWriteVariableConfig<YourProtocolVariableId>[]): Observable<void> {\r\n    // write variables identified by vars param with provided values\r\n  }\r\n\r\n  override protocolDisconnect(connection: YourProtocolConnection): Observable<void> {\r\n    // disconnect provided connection\r\n  }\r\n\r\n}\r\n```","readmeFilename":"README.md"}