130 lines
3.6 KiB
TypeScript
Raw Normal View History

2025-07-23 20:25:01 +02:00
import { OnErrorCallback, OnMessageCallback } from 'mqtt/*';
import { IMqttClient } from './interface';
import { Buffer } from 'buffer';
import { FimpResponse } from '../fimp/fimp';
import demo_data__state from './demo_data/state.json';
import demo_data__device from './demo_data/device.json';
export class DemoFimpMqttClient implements IMqttClient {
private messageHandlers = new Set<OnMessageCallback>();
private errorHandlers = new Set<OnErrorCallback>();
private onceConnectHandlers: (() => void)[] = [];
private onceErrorHandlers: OnErrorCallback[] = [];
2025-07-24 16:34:58 +02:00
connect(
_url: string,
_options: {
port: number;
username: string;
password: string;
protocolVersion: 4;
},
): void {
2025-07-23 20:25:01 +02:00
setTimeout(() => {
this.onceConnectHandlers.forEach((h) => h());
}, 100);
}
2025-07-24 16:34:58 +02:00
subscribe(
topicObject: string,
opts?: { qos: 0 | 1 | 2 },
callback?: (err: Error | null) => void,
): void;
subscribe(_topic: string, _opts?: any, _callback?: any): void {}
2025-07-23 20:25:01 +02:00
2025-07-24 16:34:58 +02:00
publish(
topic: string,
value: string,
_options: {
retain?: boolean;
qos: 0 | 1 | 2;
},
): void {
2025-07-23 20:25:01 +02:00
setTimeout(() => {
2025-07-24 16:34:58 +02:00
const msg = JSON.parse(value);
2025-07-23 20:25:01 +02:00
const sendResponse = (response: FimpResponse) => {
response.corid = response.corid ?? msg.uid;
const buffer = Buffer.from(JSON.stringify(response));
for (const handler of this.messageHandlers) {
handler(topic, buffer, { retain: false } as any);
}
2025-07-24 16:34:58 +02:00
};
2025-07-23 20:25:01 +02:00
2025-07-24 16:34:58 +02:00
if (
msg.serv == 'vinculum' &&
msg.type == 'cmd.pd7.request' &&
msg.val?.param?.components?.includes('house')
) {
sendResponse({
type: 'evt.pd7.response',
val: { param: { house: { hubId: '000000004c38b232' } } },
});
} else if (
msg.serv == 'vinculum' &&
msg.type == 'cmd.pd7.request' &&
msg.val?.param?.components?.includes('device')
) {
sendResponse({
type: 'evt.pd7.response',
val: { param: { device: demo_data__device } },
});
} else if (
msg.serv == 'vinculum' &&
msg.type == 'cmd.pd7.request' &&
msg.val?.param?.components?.includes('state')
) {
sendResponse({
type: 'evt.pd7.response',
val: { param: { state: { devices: demo_data__state } } },
});
2025-07-25 01:03:58 +02:00
} else {
sendResponse({});
2025-07-23 20:25:01 +02:00
}
}, 100);
}
on(event: 'message', handler: OnMessageCallback): void;
on(event: 'error', handler: OnErrorCallback): void;
on(event: any, handler: any): void {
if (event === 'message') {
this.messageHandlers.add(handler);
} else if (event === 'error') {
this.errorHandlers.add(handler);
}
}
off(event: 'message', handler: OnMessageCallback): void;
off(event: 'error', handler: OnErrorCallback): void;
off(event: any, handler: any): void {
if (event === 'message') {
this.messageHandlers.delete(handler);
} else if (event === 'error') {
this.errorHandlers.delete(handler);
}
}
removeListener(event: 'message', handler: OnMessageCallback): void {
this.off(event, handler);
}
once(event: 'connect', handler: () => void): void;
once(event: 'error', handler: OnErrorCallback): void;
once(event: any, handler: any): void {
if (event === 'connect') {
this.onceConnectHandlers.push(handler);
} else if (event === 'error') {
this.onceErrorHandlers.push(handler);
}
}
simulateError(message: string) {
const err = new Error(message);
for (const handler of this.errorHandlers) {
handler(err);
}
this.onceErrorHandlers.forEach((h) => h(err));
this.onceErrorHandlers = [];
}
2025-07-24 16:34:58 +02:00
}