UNPKG

@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

1 lines 4.33 kB
{"version":3,"sources":["../src/react/index.tsx"],"sourcesContent":["import type { ErrorWithReasonCode } from 'mqtt'\nimport {\n createContext,\n type ReactNode,\n useCallback,\n useContext,\n useEffect,\n useRef,\n useState,\n} from 'react'\nimport type { BetterMQTT, SubscriptionOptions } from '..'\n\nconst ctx = createContext<BetterMQTT | null>(null)\n\nexport function BetterMQTTProvider(props: {\n children: ReactNode\n client: BetterMQTT\n}) {\n return <ctx.Provider value={props.client}>{props.children}</ctx.Provider>\n}\n\nexport function useMQTT() {\n const client = useContext(ctx)\n\n if (!client) {\n throw new Error('useMQTT must be used within MQTTProvider')\n }\n\n return client\n}\n\nexport function useMQTTStatus() {\n const client = useMQTT()\n\n const [status, setStatus] = useState(client.status)\n\n useEffect(() => {\n const listener = client.on('status', setStatus)\n\n return () => {\n client.off('status', listener)\n }\n }, [client])\n\n return status\n}\n\nexport function useMQTTSubscription<T>(\n topic: string,\n parser: (message: Buffer) => T,\n onMessage: (message: T) => void,\n opts?: {\n enabled?: boolean\n } & Partial<SubscriptionOptions>,\n) {\n const client = useMQTT()\n\n const onMessageRef = useRef(onMessage)\n onMessageRef.current = onMessage\n const parserRef = useRef(parser)\n parserRef.current = parser\n\n const parserMemoed = useCallback((message: Buffer) => {\n return parserRef.current(message)\n }, [])\n\n useEffect(() => {\n if (opts?.enabled === false) {\n return\n }\n\n const sub = client.subscribe<T>(topic, parserMemoed, {\n nl: opts?.nl,\n qos: opts?.qos,\n rap: opts?.rap,\n rh: opts?.rh,\n })\n\n sub.on('message', (message) => {\n onMessageRef.current(message.content)\n })\n\n return () => {\n sub.end()\n }\n }, [\n client,\n topic,\n parserMemoed,\n opts?.enabled,\n opts?.nl,\n opts?.qos,\n opts?.rap,\n opts?.rh,\n ])\n}\n\nexport function useMQTTError(\n onError: (error: Error) => void,\n): Error | ErrorWithReasonCode | null {\n const client = useMQTT()\n\n const [error, setError] = useState<Error | ErrorWithReasonCode | null>(null)\n\n useEffect(() => {\n const listener = (err: Error | ErrorWithReasonCode) => {\n setError(err)\n onError(err)\n }\n\n client.on('error', listener)\n\n return () => {\n client.off('error', listener)\n }\n }, [client, onError])\n\n return error\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AACA,mBAQO;AASI;AANX,IAAM,UAAM,4BAAiC,IAAI;AAE1C,SAAS,mBAAmB,OAGhC;AACC,SAAO,4CAAC,IAAI,UAAJ,EAAa,OAAO,MAAM,QAAS,gBAAM,UAAS;AAC9D;AAEO,SAAS,UAAU;AACtB,QAAM,aAAS,yBAAW,GAAG;AAE7B,MAAI,CAAC,QAAQ;AACT,UAAM,IAAI,MAAM,0CAA0C;AAAA,EAC9D;AAEA,SAAO;AACX;AAEO,SAAS,gBAAgB;AAC5B,QAAM,SAAS,QAAQ;AAEvB,QAAM,CAAC,QAAQ,SAAS,QAAI,uBAAS,OAAO,MAAM;AAElD,8BAAU,MAAM;AACZ,UAAM,WAAW,OAAO,GAAG,UAAU,SAAS;AAE9C,WAAO,MAAM;AACT,aAAO,IAAI,UAAU,QAAQ;AAAA,IACjC;AAAA,EACJ,GAAG,CAAC,MAAM,CAAC;AAEX,SAAO;AACX;AAEO,SAAS,oBACZ,OACA,QACA,WACA,MAGF;AACE,QAAM,SAAS,QAAQ;AAEvB,QAAM,mBAAe,qBAAO,SAAS;AACrC,eAAa,UAAU;AACvB,QAAM,gBAAY,qBAAO,MAAM;AAC/B,YAAU,UAAU;AAEpB,QAAM,mBAAe,0BAAY,CAAC,YAAoB;AAClD,WAAO,UAAU,QAAQ,OAAO;AAAA,EACpC,GAAG,CAAC,CAAC;AAEL,8BAAU,MAAM;AACZ,QAAI,MAAM,YAAY,OAAO;AACzB;AAAA,IACJ;AAEA,UAAM,MAAM,OAAO,UAAa,OAAO,cAAc;AAAA,MACjD,IAAI,MAAM;AAAA,MACV,KAAK,MAAM;AAAA,MACX,KAAK,MAAM;AAAA,MACX,IAAI,MAAM;AAAA,IACd,CAAC;AAED,QAAI,GAAG,WAAW,CAAC,YAAY;AAC3B,mBAAa,QAAQ,QAAQ,OAAO;AAAA,IACxC,CAAC;AAED,WAAO,MAAM;AACT,UAAI,IAAI;AAAA,IACZ;AAAA,EACJ,GAAG;AAAA,IACC;AAAA,IACA;AAAA,IACA;AAAA,IACA,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,IACN,MAAM;AAAA,EACV,CAAC;AACL;AAEO,SAAS,aACZ,SACkC;AAClC,QAAM,SAAS,QAAQ;AAEvB,QAAM,CAAC,OAAO,QAAQ,QAAI,uBAA6C,IAAI;AAE3E,8BAAU,MAAM;AACZ,UAAM,WAAW,CAAC,QAAqC;AACnD,eAAS,GAAG;AACZ,cAAQ,GAAG;AAAA,IACf;AAEA,WAAO,GAAG,SAAS,QAAQ;AAE3B,WAAO,MAAM;AACT,aAAO,IAAI,SAAS,QAAQ;AAAA,IAChC;AAAA,EACJ,GAAG,CAAC,QAAQ,OAAO,CAAC;AAEpB,SAAO;AACX;","names":[]}