import { IncomingMessage } from 'node:http' import { Socket } from 'node:net' import type { Brokers, AuthenticateError, Client, Connection } from '../../aedes.js' import { Aedes } from '../../aedes.js' import type { AedesPublishPacket, ConnackPacket, ConnectPacket, PingreqPacket, PublishPacket, PubrelPacket, Subscription, SubscribePacket, UnsubscribePacket } from '../../types/packet' import { expectType } from 'tsd' // Aedes server expectType>(Aedes.createBroker()) const broker = new Aedes({ id: 'aedes', concurrency: 100, heartbeatInterval: 60000, connectTimeout: 30000, maxClientsIdLength: 23, keepaliveLimit: 0, preConnect: (client: Client, packet: ConnectPacket, callback) => { if (client.req) { callback(new Error('not websocket stream'), false) } if (client.conn instanceof Socket && client.conn.remoteAddress === '::1') { callback(null, true) } else { callback(new Error('connection error'), false) } }, authenticate: ( client: Client, username: Readonly, password: Readonly, callback ) => { if ( username === 'test' && password === Buffer.from('test') && client.version === 4 ) { callback(null, true) } else { const error = new Error() as AuthenticateError error.returnCode = 1 callback(error, false) } }, authorizePublish: ( client: Client | null, packet: PublishPacket, callback ) => { if (packet.topic === 'aaaa') { return callback(new Error('wrong topic')) } if (packet.topic === 'bbb') { packet.payload = Buffer.from('overwrite packet payload') } callback(null) }, authorizeSubscribe: (client: Client, sub: Subscription, callback) => { if (sub.topic === 'aaaa') { return callback(new Error('wrong topic')) } if (sub.topic === 'bbb') { // overwrites subscription sub.qos = 2 } callback(null, sub) }, authorizeForward: (client: Client, packet: AedesPublishPacket) => { if (packet.topic === 'aaaa' && client.id === 'I should not see this') { return null // also works with return undefined } else if ( packet.topic === 'aaaa' && client.id === 'I should not see this either' ) { return } if (packet.topic === 'bbb') { packet.payload = Buffer.from('overwrite packet payload') } return packet }, published: (packet: AedesPublishPacket, client: Client, callback) => { callback(null) callback(new Error()) } }) expectType(broker) expectType>(broker.brokers) expectType(broker.on('closed', () => {})) expectType(broker.on('client', (client: Client) => {})) expectType(broker.on('clientReady', (client: Client) => {})) expectType(broker.on('clientDisconnect', (client: Client) => {})) expectType(broker.on('keepaliveTimeout', (client: Client) => {})) expectType( broker.on('clientError', (client: Client, error: Error) => {}) ) expectType( broker.on('connectionError', (client: Client, error: Error) => {}) ) expectType( broker.on('connackSent', (packet: ConnackPacket, client: Client) => {}) ) expectType( broker.on('ping', (packet: PingreqPacket, client: Client) => {}) ) expectType( broker.on( 'publish', (packet: AedesPublishPacket, client: Client | null) => {} ) ) expectType( broker.on('ack', (packet: PublishPacket | PubrelPacket, client: Client) => {}) ) expectType( broker.on('subscribe', (subscriptions: Subscription[], client: Client) => {}) ) expectType( broker.on('unsubscribe', (unsubscriptions: string[], client: Client) => {}) ) expectType( broker.publish({} as PublishPacket, (error?: Error) => { if (error) { console.error(error) } }) ) expectType( broker.subscribe( 'topic', (packet: AedesPublishPacket, callback: () => void) => {}, () => {} ) ) expectType( broker.unsubscribe( 'topic', (packet: AedesPublishPacket, callback: () => void) => {}, () => {} ) ) expectType(broker.close()) expectType(broker.close(() => {})) // Aedes client const client = broker.handle({} as Connection, {} as IncomingMessage) const client2 = broker.handle({} as Connection) expectType(client) expectType(client2) expectType(client.conn) expectType(client.req!) expectType(client.on('connected', () => {})) expectType( client.on('error', (error: Error) => { if (error) { console.error(error) } }) ) expectType( client.publish({} as PublishPacket, (error?: Error) => { if (error) { console.error(error) } }) ) expectType(client.publish({} as PublishPacket)) expectType( client.subscribe({} as Subscription, (error?: Error) => { if (error) { console.error(error) } }) ) expectType(client.subscribe({} as Subscription)) expectType(client.subscribe([] as Subscription[])) expectType(client.subscribe({} as SubscribePacket)) expectType( client.unsubscribe({} as Subscription, (error?: Error) => { if (error) { console.error(error) } }) ) expectType(client.unsubscribe({} as Subscription)) expectType(client.unsubscribe([] as Subscription[])) expectType(client.unsubscribe({} as UnsubscribePacket)) expectType(client.emptyOutgoingQueue()) expectType(client.emptyOutgoingQueue(() => {})) expectType(client.close()) expectType(client.close(() => {}))