В настоящее время я реализую библиотеку Bluetooth для Node.js , которая поддерживает macOS
, Linux
и Windows
. Для достижения кросс-платформенной совместимости я использую собственный, специфичный для платформы код (Objective-C, C ++ & C), который использует Node.js 'EventEmitter
и будет запускать события, когда асинхронная операция Bluetooth завершена или какое-то другое устройство вызвало событиепо какой-то причине.
Формат данных для этих событий выглядит очень по-разному, и я хотел бы их нормализовать, чтобы пользователи моей библиотеки могли получать события в одном едином формате, независимо от того, на какой платформе они находятся.
Конечно, я могу прикрепить обработчики событий к собственному EventEmitters
, преобразовать и нормализовать данные и вызвать события с этими нормализованными данными в моемсобственная библиотека.
Проблема в том, что пользователи библиотеки смогут прикреплять и удалять события в моей библиотеке, и это означает, что, если они прикрепили событие к моей библиотеке, скажем,на «deviceDiscovered» примерно так:
const myListener = (device) => { /* ... */ };
bluetoothLibrary.on("deviceDiscovered", myListener);
Моя реализация должна выглядеть примерно так:
class BluetoothLibrary {
nativeAdapter = getAdapterForCurrentOS();
on(event, callback) {
this.nativeAdapter.on(event, (data) => {
const normalizedData = this.normalize(data)
callback(normalizedData);
});
}
off(event, callback) {
this.nativeAdapter.off(event, callback)
}
normalize(data) {
/* ... */
}
}
Проблема в том, что если кто-то захочет удалить своих слушателей событийснова, вот так:
const myListener = (device) => { /* ... */ };
bluetoothLibrary.on("deviceDiscovered", myListener);
bluetoothLibrary.off("deviceDiscovered", myListener);
Из-за моей реализации слушатель никогда не будет действительно удален, потому что я никогда не прикрепляю ссылку на обратный вызов, который был передан мне, к нативному адаптеру EventEmitter
.
Мне интересно, есть ли способ преобразовать или передать события через некоторые преобразования на пути перед передачей их слушателю событий? .