/** * This module provides a Deno specific implementation of a TCP socket listener * it uses the platform agnostic MqttServer class * @module */ import { MqttServer } from "../server/mod.ts"; import { denoConnToNext } from "./denoConnToNext.ts"; import type { MqttServerOptions } from "../server/mod.ts"; /** * TCP server that wraps a MqttServer, see the /examples folder */ export class TcpServer { /** the MqttServer instance used by the server */ readonly mqttServer: MqttServer; private listener: Deno.Listener; /** * Create a new TCP server */ constructor( serverOptions: Deno.TcpListenOptions, mqttOptions: MqttServerOptions | MqttServer, ) { this.listener = Deno.listen(serverOptions); if (mqttOptions instanceof MqttServer) { this.mqttServer = mqttOptions; } else { this.mqttServer = new MqttServer(mqttOptions); } } /** * Start listening */ async start(): Promise { for await (const conn of this.listener) { this.mqttServer.serve(denoConnToNext(conn)); } } /** * Stop listening */ async stop(opts = { closeMqtt: true }): Promise { if (opts.closeMqtt) { await this.mqttServer.close(); } this.listener.close(); } /** * The port number the server is listening on */ get port(): number | undefined { // deno-coverage-ignore-start if (this.listener.addr.transport === "tcp") { return this.listener.addr.port; } return undefined; // deno-coverage-ignore-stop } /** * The address the server is listening on */ get address(): string | undefined { // deno-coverage-ignore-start if (this.listener.addr.transport === "tcp") { return this.listener.addr.hostname; } return undefined; // deno-coverage-ignore-stop } }