@robot.com/better-mqtt
Version:
A modern, TypeScript-first MQTT client library that provides a better developer experience with async iterators, shared subscriptions, and React hooks. Better MQTT is a wrapper around the excellent [mqtt.js](https://github.com/mqttjs/MQTT.js) library, enh
105 lines (104 loc) • 3.22 kB
JavaScript
;
var __defProp = Object.defineProperty;
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
var __getOwnPropNames = Object.getOwnPropertyNames;
var __hasOwnProp = Object.prototype.hasOwnProperty;
var __export = (target, all) => {
for (var name in all)
__defProp(target, name, { get: all[name], enumerable: true });
};
var __copyProps = (to, from, except, desc) => {
if (from && typeof from === "object" || typeof from === "function") {
for (let key of __getOwnPropNames(from))
if (!__hasOwnProp.call(to, key) && key !== except)
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
}
return to;
};
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
// src/react/index.tsx
var react_exports = {};
__export(react_exports, {
BetterMQTTProvider: () => BetterMQTTProvider,
useMQTT: () => useMQTT,
useMQTTError: () => useMQTTError,
useMQTTStatus: () => useMQTTStatus,
useMQTTSubscription: () => useMQTTSubscription
});
module.exports = __toCommonJS(react_exports);
var import_react = require("react");
var import_jsx_runtime = require("react/jsx-runtime");
var ctx = (0, import_react.createContext)(null);
function BetterMQTTProvider(props) {
return /* @__PURE__ */ (0, import_jsx_runtime.jsx)(ctx.Provider, { value: props.client, children: props.children });
}
function useMQTT() {
const client = (0, import_react.useContext)(ctx);
if (!client) {
throw new Error("useMQTT must be used within MQTTProvider");
}
return client;
}
function useMQTTStatus() {
const client = useMQTT();
const [status, setStatus] = (0, import_react.useState)(client.status);
(0, import_react.useEffect)(() => {
const listener = client.on("status", setStatus);
return () => {
client.off("status", listener);
};
}, [client]);
return status;
}
function useMQTTSubscription(topic, parser, onMessage, opts) {
const client = useMQTT();
const onMessageRef = (0, import_react.useRef)(onMessage);
onMessageRef.current = onMessage;
const parserRef = (0, import_react.useRef)(parser);
parserRef.current = parser;
const parserMemoed = (0, import_react.useCallback)((message) => {
return parserRef.current(message);
}, []);
(0, import_react.useEffect)(() => {
if (opts?.enabled === false) {
return;
}
const sub = client.subscribe(topic, parserMemoed, {
nl: opts?.nl,
qos: opts?.qos,
rap: opts?.rap,
rh: opts?.rh
});
sub.on("message", (message) => {
onMessageRef.current(message.content);
});
return () => {
sub.end();
};
}, [
client,
topic,
parserMemoed,
opts?.enabled,
opts?.nl,
opts?.qos,
opts?.rap,
opts?.rh
]);
}
function useMQTTError(onError) {
const client = useMQTT();
const [error, setError] = (0, import_react.useState)(null);
(0, import_react.useEffect)(() => {
const listener = (err) => {
setError(err);
onError(err);
};
client.on("error", listener);
return () => {
client.off("error", listener);
};
}, [client, onError]);
return error;
}
//# sourceMappingURL=react.cjs.map