├── .env.example ├── .gitignore ├── .prettierrc ├── README.md ├── docker-compose.yml ├── package-lock.json ├── package.json └── packages ├── hass2mesh ├── .dockerignore ├── .prettierrc.js ├── Dockerfile ├── create-socket.js ├── devices │ └── light.js ├── index.js ├── package-lock.json └── package.json ├── hci2mqtt ├── .dockerignore ├── Dockerfile ├── index.js ├── package-lock.json └── package.json ├── mesh2hass ├── .dockerignore ├── .prettierrc.js ├── Dockerfile ├── devices.json.example ├── devices │ ├── kabbi-strip.js │ ├── light-hsl.js │ └── light.js ├── index.js ├── package-lock.json └── package.json ├── mesh2mqtt ├── .dockerignore ├── Dockerfile ├── index.js ├── keychain.json.example ├── models │ ├── kabbi-kv.js │ └── kabbi-strip.js ├── package-lock.json ├── package.json └── topics.js └── routed-mqtt ├── index.js ├── package-lock.json └── package.json /.env.example: -------------------------------------------------------------------------------- 1 | MQTT_URL=mqtt://keeper.local 2 | MESH_MQTT_PREFIX=mesh2mqtt 3 | HASS_MQTT_PREFIX=mesh2hass 4 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | /.vscode 2 | node_modules 3 | keychain.json 4 | .env 5 | .seqs 6 | -------------------------------------------------------------------------------- /.prettierrc: -------------------------------------------------------------------------------- 1 | { 2 | "singleQuote": true, 3 | "trailingComma": "all" 4 | } 5 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | mesh2mqtt 2 | --------- 3 | 4 | A demo project for my smart house to make BLE Mesh and Home Assistant work together. 5 | 6 | System components: 7 | - ble mesh network (i'm using some yeelight bulbs and some custom nrf52 devices running zephyr firmware) 8 | - meshbridge - custom esp32 firmware to relay mesh messages to mqtt and vice versa 9 | - packages/hci2mqtt - simple service to relay mesh messages from hardware bluetooth device to mqtt topic, tested on raspberry pi 4 internal ble module 10 | - packages/mesh2mqtt - handles all the mesh stack functions - crypto, segmentation, parsing, outputs nice jsons to mqtt topics 11 | - packages/mesh2hass - listens those jsons and provides hass mqtt discovery and high-level control endpoints 12 | 13 | To run in docker, see example [docker-compose](docker-compose.yml). 14 | 15 | This does not currently support auto-discovery of mesh devices, so you should configure them manually in `devices.json` 16 | 17 | Supported device types: 18 | - `onoff-client-button` - mesh buttons (actually, anything using Generic OnOff Client can be configured as hass button) 19 | 20 | -------------------------------------------------------------------------------- /docker-compose.yml: -------------------------------------------------------------------------------- 1 | version: '3' 2 | 3 | services: 4 | hci2mqtt: 5 | image: kabbi/hci2mqtt 6 | restart: unless-stopped 7 | # This network mode is important to pass ble device into container 8 | network_mode: host 9 | # All variables are optional, these are their default values 10 | environment: 11 | - MQTT_URL=mqtt://localhost 12 | - BRIDGE_MQTT_PREFIX=meshbridge/rpi 13 | 14 | mesh2mqtt: 15 | image: kabbi/mesh2mqtt 16 | restart: unless-stopped 17 | # This network mode is not required, it's here because i'm lazy and running mqtt server on localhost 18 | network_mode: host 19 | volumes: 20 | - ./keychain.json:/usr/src/app/keychain.json 21 | # All variables are optional, these are their default values 22 | environment: 23 | - DEBUG=mesh:* 24 | - MQTT_URL=mqtt://localhost 25 | - MESH_MQTT_PREFIX=mesh2mqtt 26 | 27 | mesh2hass: 28 | image: kabbi/mesh2hass 29 | restart: unless-stopped 30 | # This network mode is not required, it's here because i'm lazy and running mqtt server on localhost 31 | network_mode: host 32 | volumes: 33 | - ./devices.json:/usr/src/app/devices.json 34 | # All variables are optional, these are their default values 35 | environment: 36 | - MQTT_URL=mqtt://localhost 37 | - MESH_MQTT_PREFIX=mesh2mqtt 38 | - HASS_MQTT_PREFIX=mesh2hass 39 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/mesh2mqtt-parent", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "workspaces": [ 13 | "./packages/*" 14 | ], 15 | "devDependencies": { 16 | "prettier": "^2.4.1" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /packages/hass2mesh/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /packages/hass2mesh/.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | jsxBracketSameLine: true, 3 | singleQuote: true, 4 | }; 5 | -------------------------------------------------------------------------------- /packages/hass2mesh/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | 3 | WORKDIR /usr/src/app 4 | 5 | COPY package*.json ./ 6 | RUN npm install 7 | 8 | COPY *.js . 9 | COPY devices ./devices/ 10 | CMD ["node", "index.js"] 11 | -------------------------------------------------------------------------------- /packages/hass2mesh/create-socket.js: -------------------------------------------------------------------------------- 1 | const WebSocket = require('ws'); 2 | 3 | const MSG_TYPE_AUTH_REQUIRED = 'auth_required'; 4 | const MSG_TYPE_AUTH_INVALID = 'auth_invalid'; 5 | const MSG_TYPE_AUTH_OK = 'auth_ok'; 6 | const ERR_CANNOT_CONNECT = 1; 7 | const ERR_INVALID_AUTH = 2; 8 | 9 | module.exports = function createSocket(auth, ignoreCertificates) { 10 | const url = auth.wsUrl; 11 | 12 | function connect(triesLeft, promResolve, promReject) { 13 | const socket = new WebSocket(url, { 14 | rejectUnauthorized: !ignoreCertificates, 15 | }); 16 | 17 | // If invalid auth, we will not try to reconnect. 18 | let invalidAuth = false; 19 | 20 | const closeMessage = (ev) => { 21 | let errorMessage; 22 | if (ev && ev.code && ev.code !== 1000) { 23 | errorMessage = `WebSocket connection to Home Assistant closed with code ${ev.code} and reason ${ev.reason}`; 24 | } 25 | closeOrError(errorMessage); 26 | }; 27 | 28 | const errorMessage = (ev) => { 29 | // If we are in error handler make sure close handler doesn't also fire. 30 | socket.removeEventListener('close', closeMessage); 31 | let errMessage = 32 | 'Disconnected from Home Assistant with a WebSocket error'; 33 | if (ev.message) { 34 | errMessage += ` with message: ${ev.message}`; 35 | } 36 | closeOrError(errMessage); 37 | }; 38 | 39 | const closeOrError = (errorText) => { 40 | if (errorText) { 41 | console.error( 42 | `WebSocket Connection to Home Assistant closed with an error: ${errorText}` 43 | ); 44 | } 45 | 46 | if (invalidAuth) { 47 | promReject(ERR_INVALID_AUTH); 48 | return; 49 | } 50 | 51 | // Reject if we no longer have to retry 52 | if (triesLeft === 0) { 53 | // We never were connected and will not retry 54 | promReject(ERR_CANNOT_CONNECT); 55 | return; 56 | } 57 | 58 | const newTries = triesLeft === -1 ? -1 : triesLeft - 1; 59 | // Try again in a second 60 | setTimeout(() => connect(newTries, promResolve, promReject), 1000); 61 | }; 62 | 63 | // Auth is mandatory, so we can send the auth message right away. 64 | const handleOpen = async () => { 65 | try { 66 | if (auth.expired) { 67 | await auth.refreshAccessToken(); 68 | } 69 | socket.send( 70 | JSON.stringify({ 71 | type: 'auth', 72 | access_token: auth.accessToken, 73 | }) 74 | ); 75 | } catch (err) { 76 | // Refresh token failed 77 | invalidAuth = err === ERR_INVALID_AUTH; 78 | socket.close(); 79 | } 80 | }; 81 | 82 | const handleMessage = (event) => { 83 | const message = JSON.parse(event.data); 84 | 85 | switch (message.type) { 86 | case MSG_TYPE_AUTH_INVALID: 87 | invalidAuth = true; 88 | socket.close(); 89 | break; 90 | 91 | case MSG_TYPE_AUTH_OK: 92 | socket.removeEventListener('open', handleOpen); 93 | socket.removeEventListener('message', handleMessage); 94 | socket.removeEventListener('close', closeMessage); 95 | socket.removeEventListener('error', errorMessage); 96 | socket.haVersion = message.ha_version; 97 | promResolve(socket); 98 | break; 99 | 100 | default: 101 | // We already send this message when socket opens 102 | if (message.type !== MSG_TYPE_AUTH_REQUIRED) { 103 | console.error('[Auth phase] Unhandled message', message); 104 | } 105 | } 106 | }; 107 | 108 | socket.addEventListener('open', handleOpen); 109 | socket.addEventListener('message', handleMessage); 110 | socket.addEventListener('close', closeMessage); 111 | socket.addEventListener('error', errorMessage); 112 | } 113 | 114 | return new Promise((resolve, reject) => connect(3, resolve, reject)); 115 | }; 116 | -------------------------------------------------------------------------------- /packages/hass2mesh/devices/light.js: -------------------------------------------------------------------------------- 1 | const { 2 | createConnection, 3 | createLongLivedTokenAuth, 4 | subscribeEntities, 5 | callService, 6 | getStates, 7 | } = require('home-assistant-js-websocket'); 8 | 9 | module.exports = ({ mqtt, meshPrefix, entity, addr, hass, db }) => { 10 | const sendMeshMsg = (to, type, payload) => { 11 | mqtt.publishJSON(`${meshPrefix}/tx`, { 12 | type, 13 | payload, 14 | meta: { 15 | ttl: 7, 16 | type: 'access', 17 | from: addr, 18 | to, 19 | }, 20 | }); 21 | }; 22 | 23 | mqtt.handleJSON(`${meshPrefix}/rx`, (match, msg) => { 24 | const { type, payload, meta } = msg; 25 | 26 | if (meta.to !== parseInt(addr, 16)) { 27 | return; 28 | } 29 | 30 | switch (type) { 31 | case 'GenericOnOffSet': 32 | callService(hass, 'light', `turn_${payload.status}`, { 33 | entity_id: entity.entity_id, 34 | }); 35 | sendMeshMsg(meta.from, 'GenericOnOffStatus', { 36 | status: payload.status, 37 | }); 38 | break; 39 | case 'GenericOnOffSetUnacknowledged': 40 | callService(hass, 'light', `turn_${payload.status}`, { 41 | entity_id: entity.entity_id, 42 | }); 43 | break; 44 | default: 45 | console.log(`- [${addr}] unhandled mesh msg ${type}`); 46 | break; 47 | } 48 | }); 49 | }; 50 | -------------------------------------------------------------------------------- /packages/hass2mesh/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const debug = require('debug')('app'); 3 | const mqtt = require('@kabbi/routed-mqtt'); 4 | const WebSocket = require('ws'); 5 | const { 6 | createConnection, 7 | createLongLivedTokenAuth, 8 | subscribeEntities, 9 | callService, 10 | getStates, 11 | } = require('home-assistant-js-websocket'); 12 | 13 | require('dotenv').config(); 14 | 15 | const createSocket = require('./create-socket'); 16 | 17 | const client = mqtt.connect(process.env.MQTT_URL || 'mqtt://localhost'); 18 | const meshPrefix = process.env.MESH_MQTT_PREFIX || 'mesh2mqtt'; 19 | const hassUrl = process.env.HASS_URL || 'http://localhost:8123'; 20 | const dbPath = process.env.DB_PATH || './db.json'; 21 | const startAddr = process.env.START_ADDR || 0x1000; 22 | 23 | const loadDB = () => { 24 | if (!fs.existsSync(dbPath)) { 25 | return {}; 26 | } 27 | return JSON.parse(fs.readFileSync(dbPath, 'utf8')); 28 | }; 29 | 30 | const saveDB = (data) => { 31 | fs.writeFileSync(dbPath, JSON.stringify(data, null, 2)); 32 | }; 33 | 34 | const start = async (hass) => { 35 | const db = loadDB(); 36 | 37 | const entities = await getStates(hass); 38 | 39 | let lastAddr = Math.max( 40 | startAddr - 1, 41 | ...Object.values(db).map((item) => parseInt(item.addr, 16)) 42 | ); 43 | 44 | for (const entity of entities) { 45 | const { entity_id } = entity; 46 | 47 | const [domain] = entity_id.split('.'); 48 | const handlerPath = `./devices/${domain}.js`; 49 | 50 | if (!fs.existsSync(handlerPath)) { 51 | continue; 52 | } 53 | 54 | if (!db[entity_id]) { 55 | db[entity_id] = { 56 | entity_id, 57 | addr: (++lastAddr).toString(16).padStart(4, '0'), 58 | }; 59 | } 60 | 61 | console.log(`- [${db[entity_id].addr}] setting up ${entity_id}`); 62 | 63 | const handler = require(handlerPath); 64 | handler({ 65 | addr: db[entity_id].addr, 66 | mqtt: client, 67 | meshPrefix, 68 | entity, 69 | hass, 70 | db, 71 | }); 72 | } 73 | 74 | saveDB(db); 75 | }; 76 | 77 | client.once('connect', async () => { 78 | const auth = createLongLivedTokenAuth(hassUrl, process.env.HASS_TOKEN); 79 | 80 | const hass = await createConnection({ 81 | createSocket: () => createSocket(auth), 82 | auth, 83 | }); 84 | 85 | start(hass); 86 | }); 87 | -------------------------------------------------------------------------------- /packages/hass2mesh/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/hass2mesh", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@kabbi/routed-mqtt": "^1.0.0", 14 | "debug": "^4.3.1", 15 | "dotenv": "^8.2.0", 16 | "home-assistant-js-websocket": "^6.1.1", 17 | "ws": "^8.5.0" 18 | } 19 | } 20 | -------------------------------------------------------------------------------- /packages/hci2mqtt/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /packages/hci2mqtt/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | 3 | WORKDIR /usr/src/app 4 | 5 | RUN apk add bluez-deprecated 6 | 7 | COPY package*.json ./ 8 | RUN npm install 9 | 10 | COPY *.js . 11 | CMD ["node", "index.js"] 12 | -------------------------------------------------------------------------------- /packages/hci2mqtt/index.js: -------------------------------------------------------------------------------- 1 | const cp = require('child_process'); 2 | const mqtt = require('@kabbi/routed-mqtt'); 3 | const Queue = require('queue-promise'); 4 | require('dotenv').config(); 5 | 6 | const client = mqtt.connect(process.env.MQTT_URL || 'mqtt://localhost'); 7 | const prefix = process.env.BRIDGE_MQTT_PREFIX || 'meshbridge/rpi'; 8 | 9 | const sendQueue = new Queue({ 10 | concurrent: 1, 11 | interval: 0, 12 | }); 13 | 14 | const scanner = cp.spawn('hcitool', ['lescan', '--passive'], { 15 | stdio: 'ignore', 16 | }); 17 | 18 | scanner.on('close', () => { 19 | console.log('scanner closed'); 20 | process.exit(1); 21 | }); 22 | 23 | const parser = cp.spawn('hcidump', ['--raw']); 24 | 25 | parser.stdout.on('data', (data) => { 26 | const str = data.toString('utf8'); 27 | if (!str.startsWith('>')) { 28 | return; 29 | } 30 | const v = str.slice(2).replace(/\s+/g, ''); 31 | const buf = Buffer.from(v, 'hex').slice(14, -1); 32 | if (buf[1] !== 0x2a) { 33 | return; 34 | } 35 | if (buf[0] !== buf.byteLength - 1) { 36 | return; 37 | } 38 | client.publish(`${prefix}/msg`, buf.slice(2)); 39 | }); 40 | 41 | parser.on('close', () => { 42 | console.log('hcidump closed'); 43 | process.exit(1); 44 | }); 45 | 46 | const delay = (time) => new Promise((resolve) => setTimeout(resolve, time)); 47 | 48 | const sendHciCommand = async (cmd, data) => { 49 | const hexBytes = [...data].map((v) => v.toString(16).padStart(2, '0')); 50 | 51 | // This is some sad dark magic ): 52 | // I don't really like hci subsystem on linux 53 | await cp.spawnSync('hcitool', [ 54 | 'cmd', 55 | '0x08', 56 | `0x${cmd.toString(16).padStart(4, '0')}`, 57 | ...hexBytes, 58 | ]); 59 | }; 60 | 61 | const sendMeshMessage = async (payload) => { 62 | if (payload.length >= 32) { 63 | console.log('dropping message >31 bytes', payload.toString('hex')); 64 | return; 65 | } 66 | 67 | const msg = Buffer.concat([ 68 | Buffer.of(payload.length + 2), // adv data header 69 | Buffer.of(payload.length + 1, 0x2a), // mesh packet header 70 | payload, // mesh packet 71 | Buffer.alloc(31 - (payload.length + 2)), // pad up to 31 bytes 72 | ]); 73 | 74 | // Set adv data 75 | await sendHciCommand(0x08, msg); 76 | 77 | // Set adv params 78 | await sendHciCommand( 79 | 0x06, 80 | // 100 ms interval, non-connectable undirected type 81 | Buffer.from('A000A0000300000000000000000700', 'hex'), 82 | ); 83 | 84 | // Start advertising 85 | await sendHciCommand(0x0a, Buffer.of(1)); 86 | 87 | await delay(250); // 100 ms adv interval + some safety gap 88 | 89 | // Stop advertising 90 | await sendHciCommand(0x0a, Buffer.of(0)); 91 | }; 92 | 93 | client.once('connect', async () => { 94 | await client.handle(`${prefix}/msg/send`, async (match, payload) => { 95 | sendQueue.enqueue(() => sendMeshMessage(payload)); 96 | }); 97 | }); 98 | -------------------------------------------------------------------------------- /packages/hci2mqtt/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/hci2mqtt", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@kabbi/hci2mqtt", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@kabbi/routed-mqtt": "^1.0.0", 13 | "dotenv": "^8.2.0", 14 | "queue-promise": "^2.1.0" 15 | } 16 | }, 17 | "node_modules/@kabbi/routed-mqtt": { 18 | "version": "1.0.0", 19 | "resolved": "https://registry.npmjs.org/@kabbi/routed-mqtt/-/routed-mqtt-1.0.0.tgz", 20 | "integrity": "sha512-oNeuFlawT7gINOWAHz08ooXcsUlIAZkQMNKSCq+WLqJ2dW1dipVA8SqGff0CHhgKT2TLUI9QHBM/FrrA/0etTQ==", 21 | "dependencies": { 22 | "async-mqtt": "^2.6.1", 23 | "path-to-regexp": "^6.2.0" 24 | } 25 | }, 26 | "node_modules/async-mqtt": { 27 | "version": "2.6.1", 28 | "resolved": "https://registry.npmjs.org/async-mqtt/-/async-mqtt-2.6.1.tgz", 29 | "integrity": "sha512-EkXAwRzwMaPC6ji0EvNeM5OMe6VjMhEKVJJUN7gu/hGzkcDpZtaI34nUwdwCMbjQB3pnuSOHqQMFKsUpg+D8kA==", 30 | "dependencies": { 31 | "mqtt": "^4.1.0" 32 | } 33 | }, 34 | "node_modules/balanced-match": { 35 | "version": "1.0.2", 36 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 37 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 38 | }, 39 | "node_modules/base64-js": { 40 | "version": "1.5.1", 41 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 42 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 43 | "funding": [ 44 | { 45 | "type": "github", 46 | "url": "https://github.com/sponsors/feross" 47 | }, 48 | { 49 | "type": "patreon", 50 | "url": "https://www.patreon.com/feross" 51 | }, 52 | { 53 | "type": "consulting", 54 | "url": "https://feross.org/support" 55 | } 56 | ] 57 | }, 58 | "node_modules/bl": { 59 | "version": "4.1.0", 60 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 61 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 62 | "dependencies": { 63 | "buffer": "^5.5.0", 64 | "inherits": "^2.0.4", 65 | "readable-stream": "^3.4.0" 66 | } 67 | }, 68 | "node_modules/brace-expansion": { 69 | "version": "1.1.11", 70 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 71 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 72 | "dependencies": { 73 | "balanced-match": "^1.0.0", 74 | "concat-map": "0.0.1" 75 | } 76 | }, 77 | "node_modules/buffer": { 78 | "version": "5.7.1", 79 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 80 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 81 | "funding": [ 82 | { 83 | "type": "github", 84 | "url": "https://github.com/sponsors/feross" 85 | }, 86 | { 87 | "type": "patreon", 88 | "url": "https://www.patreon.com/feross" 89 | }, 90 | { 91 | "type": "consulting", 92 | "url": "https://feross.org/support" 93 | } 94 | ], 95 | "dependencies": { 96 | "base64-js": "^1.3.1", 97 | "ieee754": "^1.1.13" 98 | } 99 | }, 100 | "node_modules/buffer-from": { 101 | "version": "1.1.1", 102 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 103 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 104 | }, 105 | "node_modules/callback-stream": { 106 | "version": "1.1.0", 107 | "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", 108 | "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", 109 | "dependencies": { 110 | "inherits": "^2.0.1", 111 | "readable-stream": "> 1.0.0 < 3.0.0" 112 | } 113 | }, 114 | "node_modules/callback-stream/node_modules/readable-stream": { 115 | "version": "2.3.7", 116 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 117 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 118 | "dependencies": { 119 | "core-util-is": "~1.0.0", 120 | "inherits": "~2.0.3", 121 | "isarray": "~1.0.0", 122 | "process-nextick-args": "~2.0.0", 123 | "safe-buffer": "~5.1.1", 124 | "string_decoder": "~1.1.1", 125 | "util-deprecate": "~1.0.1" 126 | } 127 | }, 128 | "node_modules/callback-stream/node_modules/safe-buffer": { 129 | "version": "5.1.2", 130 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 131 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 132 | }, 133 | "node_modules/callback-stream/node_modules/string_decoder": { 134 | "version": "1.1.1", 135 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 136 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 137 | "dependencies": { 138 | "safe-buffer": "~5.1.0" 139 | } 140 | }, 141 | "node_modules/commist": { 142 | "version": "1.1.0", 143 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 144 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 145 | "dependencies": { 146 | "leven": "^2.1.0", 147 | "minimist": "^1.1.0" 148 | } 149 | }, 150 | "node_modules/concat-map": { 151 | "version": "0.0.1", 152 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 153 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 154 | }, 155 | "node_modules/concat-stream": { 156 | "version": "2.0.0", 157 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 158 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 159 | "engines": [ 160 | "node >= 6.0" 161 | ], 162 | "dependencies": { 163 | "buffer-from": "^1.0.0", 164 | "inherits": "^2.0.3", 165 | "readable-stream": "^3.0.2", 166 | "typedarray": "^0.0.6" 167 | } 168 | }, 169 | "node_modules/core-util-is": { 170 | "version": "1.0.2", 171 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 172 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 173 | }, 174 | "node_modules/debug": { 175 | "version": "4.3.1", 176 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 177 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 178 | "dependencies": { 179 | "ms": "2.1.2" 180 | }, 181 | "engines": { 182 | "node": ">=6.0" 183 | }, 184 | "peerDependenciesMeta": { 185 | "supports-color": { 186 | "optional": true 187 | } 188 | } 189 | }, 190 | "node_modules/dotenv": { 191 | "version": "8.2.0", 192 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 193 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", 194 | "engines": { 195 | "node": ">=8" 196 | } 197 | }, 198 | "node_modules/duplexify": { 199 | "version": "3.7.1", 200 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 201 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 202 | "dependencies": { 203 | "end-of-stream": "^1.0.0", 204 | "inherits": "^2.0.1", 205 | "readable-stream": "^2.0.0", 206 | "stream-shift": "^1.0.0" 207 | } 208 | }, 209 | "node_modules/duplexify/node_modules/readable-stream": { 210 | "version": "2.3.7", 211 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 212 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 213 | "dependencies": { 214 | "core-util-is": "~1.0.0", 215 | "inherits": "~2.0.3", 216 | "isarray": "~1.0.0", 217 | "process-nextick-args": "~2.0.0", 218 | "safe-buffer": "~5.1.1", 219 | "string_decoder": "~1.1.1", 220 | "util-deprecate": "~1.0.1" 221 | } 222 | }, 223 | "node_modules/duplexify/node_modules/safe-buffer": { 224 | "version": "5.1.2", 225 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 226 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 227 | }, 228 | "node_modules/duplexify/node_modules/string_decoder": { 229 | "version": "1.1.1", 230 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 231 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 232 | "dependencies": { 233 | "safe-buffer": "~5.1.0" 234 | } 235 | }, 236 | "node_modules/end-of-stream": { 237 | "version": "1.4.4", 238 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 239 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 240 | "dependencies": { 241 | "once": "^1.4.0" 242 | } 243 | }, 244 | "node_modules/extend": { 245 | "version": "3.0.2", 246 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 247 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 248 | }, 249 | "node_modules/fs.realpath": { 250 | "version": "1.0.0", 251 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 252 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 253 | }, 254 | "node_modules/glob": { 255 | "version": "7.1.6", 256 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 257 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 258 | "dependencies": { 259 | "fs.realpath": "^1.0.0", 260 | "inflight": "^1.0.4", 261 | "inherits": "2", 262 | "minimatch": "^3.0.4", 263 | "once": "^1.3.0", 264 | "path-is-absolute": "^1.0.0" 265 | }, 266 | "engines": { 267 | "node": "*" 268 | }, 269 | "funding": { 270 | "url": "https://github.com/sponsors/isaacs" 271 | } 272 | }, 273 | "node_modules/glob-parent": { 274 | "version": "3.1.0", 275 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 276 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 277 | "dependencies": { 278 | "is-glob": "^3.1.0", 279 | "path-dirname": "^1.0.0" 280 | } 281 | }, 282 | "node_modules/glob-stream": { 283 | "version": "6.1.0", 284 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 285 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 286 | "dependencies": { 287 | "extend": "^3.0.0", 288 | "glob": "^7.1.1", 289 | "glob-parent": "^3.1.0", 290 | "is-negated-glob": "^1.0.0", 291 | "ordered-read-streams": "^1.0.0", 292 | "pumpify": "^1.3.5", 293 | "readable-stream": "^2.1.5", 294 | "remove-trailing-separator": "^1.0.1", 295 | "to-absolute-glob": "^2.0.0", 296 | "unique-stream": "^2.0.2" 297 | }, 298 | "engines": { 299 | "node": ">= 0.10" 300 | } 301 | }, 302 | "node_modules/glob-stream/node_modules/readable-stream": { 303 | "version": "2.3.7", 304 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 305 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 306 | "dependencies": { 307 | "core-util-is": "~1.0.0", 308 | "inherits": "~2.0.3", 309 | "isarray": "~1.0.0", 310 | "process-nextick-args": "~2.0.0", 311 | "safe-buffer": "~5.1.1", 312 | "string_decoder": "~1.1.1", 313 | "util-deprecate": "~1.0.1" 314 | } 315 | }, 316 | "node_modules/glob-stream/node_modules/safe-buffer": { 317 | "version": "5.1.2", 318 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 319 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 320 | }, 321 | "node_modules/glob-stream/node_modules/string_decoder": { 322 | "version": "1.1.1", 323 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 324 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 325 | "dependencies": { 326 | "safe-buffer": "~5.1.0" 327 | } 328 | }, 329 | "node_modules/help-me": { 330 | "version": "1.1.0", 331 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", 332 | "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", 333 | "dependencies": { 334 | "callback-stream": "^1.0.2", 335 | "glob-stream": "^6.1.0", 336 | "through2": "^2.0.1", 337 | "xtend": "^4.0.0" 338 | } 339 | }, 340 | "node_modules/ieee754": { 341 | "version": "1.2.1", 342 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 343 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 344 | "funding": [ 345 | { 346 | "type": "github", 347 | "url": "https://github.com/sponsors/feross" 348 | }, 349 | { 350 | "type": "patreon", 351 | "url": "https://www.patreon.com/feross" 352 | }, 353 | { 354 | "type": "consulting", 355 | "url": "https://feross.org/support" 356 | } 357 | ] 358 | }, 359 | "node_modules/inflight": { 360 | "version": "1.0.6", 361 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 362 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 363 | "dependencies": { 364 | "once": "^1.3.0", 365 | "wrappy": "1" 366 | } 367 | }, 368 | "node_modules/inherits": { 369 | "version": "2.0.4", 370 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 371 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 372 | }, 373 | "node_modules/is-absolute": { 374 | "version": "1.0.0", 375 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 376 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 377 | "dependencies": { 378 | "is-relative": "^1.0.0", 379 | "is-windows": "^1.0.1" 380 | }, 381 | "engines": { 382 | "node": ">=0.10.0" 383 | } 384 | }, 385 | "node_modules/is-extglob": { 386 | "version": "2.1.1", 387 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 388 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 389 | "engines": { 390 | "node": ">=0.10.0" 391 | } 392 | }, 393 | "node_modules/is-glob": { 394 | "version": "3.1.0", 395 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 396 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 397 | "dependencies": { 398 | "is-extglob": "^2.1.0" 399 | }, 400 | "engines": { 401 | "node": ">=0.10.0" 402 | } 403 | }, 404 | "node_modules/is-negated-glob": { 405 | "version": "1.0.0", 406 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 407 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", 408 | "engines": { 409 | "node": ">=0.10.0" 410 | } 411 | }, 412 | "node_modules/is-relative": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 415 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 416 | "dependencies": { 417 | "is-unc-path": "^1.0.0" 418 | }, 419 | "engines": { 420 | "node": ">=0.10.0" 421 | } 422 | }, 423 | "node_modules/is-unc-path": { 424 | "version": "1.0.0", 425 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 426 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 427 | "dependencies": { 428 | "unc-path-regex": "^0.1.2" 429 | }, 430 | "engines": { 431 | "node": ">=0.10.0" 432 | } 433 | }, 434 | "node_modules/is-windows": { 435 | "version": "1.0.2", 436 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 437 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 438 | "engines": { 439 | "node": ">=0.10.0" 440 | } 441 | }, 442 | "node_modules/isarray": { 443 | "version": "1.0.0", 444 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 445 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 446 | }, 447 | "node_modules/json-stable-stringify-without-jsonify": { 448 | "version": "1.0.1", 449 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 450 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 451 | }, 452 | "node_modules/leven": { 453 | "version": "2.1.0", 454 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 455 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", 456 | "engines": { 457 | "node": ">=0.10.0" 458 | } 459 | }, 460 | "node_modules/minimatch": { 461 | "version": "3.0.4", 462 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 463 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 464 | "dependencies": { 465 | "brace-expansion": "^1.1.7" 466 | }, 467 | "engines": { 468 | "node": "*" 469 | } 470 | }, 471 | "node_modules/minimist": { 472 | "version": "1.2.5", 473 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 474 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 475 | }, 476 | "node_modules/mqtt": { 477 | "version": "4.2.6", 478 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.6.tgz", 479 | "integrity": "sha512-GpxVObyOzL0CGPBqo6B04GinN8JLk12NRYAIkYvARd9ZCoJKevvOyCaWK6bdK/kFSDj3LPDnCsJbezzNlsi87Q==", 480 | "dependencies": { 481 | "commist": "^1.0.0", 482 | "concat-stream": "^2.0.0", 483 | "debug": "^4.1.1", 484 | "help-me": "^1.0.1", 485 | "inherits": "^2.0.3", 486 | "minimist": "^1.2.5", 487 | "mqtt-packet": "^6.6.0", 488 | "pump": "^3.0.0", 489 | "readable-stream": "^3.6.0", 490 | "reinterval": "^1.1.0", 491 | "split2": "^3.1.0", 492 | "ws": "^7.3.1", 493 | "xtend": "^4.0.2" 494 | }, 495 | "bin": { 496 | "mqtt": "bin/mqtt.js", 497 | "mqtt_pub": "bin/pub.js", 498 | "mqtt_sub": "bin/sub.js" 499 | }, 500 | "engines": { 501 | "node": ">=10.0.0" 502 | } 503 | }, 504 | "node_modules/mqtt-packet": { 505 | "version": "6.9.1", 506 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.9.1.tgz", 507 | "integrity": "sha512-0+u0ZoRj6H6AuzNY5d8qzXzyXmFI19gkdPRA14kGfKvbqYcpOL+HWUGHjtCxHqjm8CscwsH+dX0+Rxx4se5HSA==", 508 | "dependencies": { 509 | "bl": "^4.0.2", 510 | "debug": "^4.1.1", 511 | "process-nextick-args": "^2.0.1" 512 | } 513 | }, 514 | "node_modules/ms": { 515 | "version": "2.1.2", 516 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 517 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 518 | }, 519 | "node_modules/once": { 520 | "version": "1.4.0", 521 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 522 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 523 | "dependencies": { 524 | "wrappy": "1" 525 | } 526 | }, 527 | "node_modules/ordered-read-streams": { 528 | "version": "1.0.1", 529 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 530 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 531 | "dependencies": { 532 | "readable-stream": "^2.0.1" 533 | } 534 | }, 535 | "node_modules/ordered-read-streams/node_modules/readable-stream": { 536 | "version": "2.3.7", 537 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 538 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 539 | "dependencies": { 540 | "core-util-is": "~1.0.0", 541 | "inherits": "~2.0.3", 542 | "isarray": "~1.0.0", 543 | "process-nextick-args": "~2.0.0", 544 | "safe-buffer": "~5.1.1", 545 | "string_decoder": "~1.1.1", 546 | "util-deprecate": "~1.0.1" 547 | } 548 | }, 549 | "node_modules/ordered-read-streams/node_modules/safe-buffer": { 550 | "version": "5.1.2", 551 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 552 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 553 | }, 554 | "node_modules/ordered-read-streams/node_modules/string_decoder": { 555 | "version": "1.1.1", 556 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 557 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 558 | "dependencies": { 559 | "safe-buffer": "~5.1.0" 560 | } 561 | }, 562 | "node_modules/path-dirname": { 563 | "version": "1.0.2", 564 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 565 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 566 | }, 567 | "node_modules/path-is-absolute": { 568 | "version": "1.0.1", 569 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 570 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 571 | "engines": { 572 | "node": ">=0.10.0" 573 | } 574 | }, 575 | "node_modules/path-to-regexp": { 576 | "version": "6.2.0", 577 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", 578 | "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" 579 | }, 580 | "node_modules/process-nextick-args": { 581 | "version": "2.0.1", 582 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 583 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 584 | }, 585 | "node_modules/pump": { 586 | "version": "3.0.0", 587 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 588 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 589 | "dependencies": { 590 | "end-of-stream": "^1.1.0", 591 | "once": "^1.3.1" 592 | } 593 | }, 594 | "node_modules/pumpify": { 595 | "version": "1.5.1", 596 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 597 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 598 | "dependencies": { 599 | "duplexify": "^3.6.0", 600 | "inherits": "^2.0.3", 601 | "pump": "^2.0.0" 602 | } 603 | }, 604 | "node_modules/pumpify/node_modules/pump": { 605 | "version": "2.0.1", 606 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 607 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 608 | "dependencies": { 609 | "end-of-stream": "^1.1.0", 610 | "once": "^1.3.1" 611 | } 612 | }, 613 | "node_modules/queue-promise": { 614 | "version": "2.1.0", 615 | "resolved": "https://registry.npmjs.org/queue-promise/-/queue-promise-2.1.0.tgz", 616 | "integrity": "sha512-JoIruzwY8HEXsUT0UHdL6Ny5L4CMid9YXLvjbTEHZkjGupae3tlR9/INhdq7Zm9/4NVp9ycLOAKd/zZItWWZhA==", 617 | "engines": { 618 | "node": ">=8.12.0" 619 | } 620 | }, 621 | "node_modules/readable-stream": { 622 | "version": "3.6.0", 623 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 624 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 625 | "dependencies": { 626 | "inherits": "^2.0.3", 627 | "string_decoder": "^1.1.1", 628 | "util-deprecate": "^1.0.1" 629 | }, 630 | "engines": { 631 | "node": ">= 6" 632 | } 633 | }, 634 | "node_modules/reinterval": { 635 | "version": "1.1.0", 636 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 637 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 638 | }, 639 | "node_modules/remove-trailing-separator": { 640 | "version": "1.1.0", 641 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 642 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 643 | }, 644 | "node_modules/safe-buffer": { 645 | "version": "5.2.1", 646 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 647 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 648 | "funding": [ 649 | { 650 | "type": "github", 651 | "url": "https://github.com/sponsors/feross" 652 | }, 653 | { 654 | "type": "patreon", 655 | "url": "https://www.patreon.com/feross" 656 | }, 657 | { 658 | "type": "consulting", 659 | "url": "https://feross.org/support" 660 | } 661 | ] 662 | }, 663 | "node_modules/split2": { 664 | "version": "3.2.2", 665 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 666 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 667 | "dependencies": { 668 | "readable-stream": "^3.0.0" 669 | } 670 | }, 671 | "node_modules/stream-shift": { 672 | "version": "1.0.1", 673 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 674 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 675 | }, 676 | "node_modules/string_decoder": { 677 | "version": "1.3.0", 678 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 679 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 680 | "dependencies": { 681 | "safe-buffer": "~5.2.0" 682 | } 683 | }, 684 | "node_modules/through2": { 685 | "version": "2.0.5", 686 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 687 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 688 | "dependencies": { 689 | "readable-stream": "~2.3.6", 690 | "xtend": "~4.0.1" 691 | } 692 | }, 693 | "node_modules/through2-filter": { 694 | "version": "3.0.0", 695 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 696 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 697 | "dependencies": { 698 | "through2": "~2.0.0", 699 | "xtend": "~4.0.0" 700 | } 701 | }, 702 | "node_modules/through2/node_modules/readable-stream": { 703 | "version": "2.3.7", 704 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 705 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 706 | "dependencies": { 707 | "core-util-is": "~1.0.0", 708 | "inherits": "~2.0.3", 709 | "isarray": "~1.0.0", 710 | "process-nextick-args": "~2.0.0", 711 | "safe-buffer": "~5.1.1", 712 | "string_decoder": "~1.1.1", 713 | "util-deprecate": "~1.0.1" 714 | } 715 | }, 716 | "node_modules/through2/node_modules/safe-buffer": { 717 | "version": "5.1.2", 718 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 719 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 720 | }, 721 | "node_modules/through2/node_modules/string_decoder": { 722 | "version": "1.1.1", 723 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 724 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 725 | "dependencies": { 726 | "safe-buffer": "~5.1.0" 727 | } 728 | }, 729 | "node_modules/to-absolute-glob": { 730 | "version": "2.0.2", 731 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 732 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 733 | "dependencies": { 734 | "is-absolute": "^1.0.0", 735 | "is-negated-glob": "^1.0.0" 736 | }, 737 | "engines": { 738 | "node": ">=0.10.0" 739 | } 740 | }, 741 | "node_modules/typedarray": { 742 | "version": "0.0.6", 743 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 744 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 745 | }, 746 | "node_modules/unc-path-regex": { 747 | "version": "0.1.2", 748 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 749 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 750 | "engines": { 751 | "node": ">=0.10.0" 752 | } 753 | }, 754 | "node_modules/unique-stream": { 755 | "version": "2.3.1", 756 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 757 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 758 | "dependencies": { 759 | "json-stable-stringify-without-jsonify": "^1.0.1", 760 | "through2-filter": "^3.0.0" 761 | } 762 | }, 763 | "node_modules/util-deprecate": { 764 | "version": "1.0.2", 765 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 766 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 767 | }, 768 | "node_modules/wrappy": { 769 | "version": "1.0.2", 770 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 771 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 772 | }, 773 | "node_modules/ws": { 774 | "version": "7.4.5", 775 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", 776 | "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", 777 | "engines": { 778 | "node": ">=8.3.0" 779 | }, 780 | "peerDependencies": { 781 | "bufferutil": "^4.0.1", 782 | "utf-8-validate": "^5.0.2" 783 | }, 784 | "peerDependenciesMeta": { 785 | "bufferutil": { 786 | "optional": true 787 | }, 788 | "utf-8-validate": { 789 | "optional": true 790 | } 791 | } 792 | }, 793 | "node_modules/xtend": { 794 | "version": "4.0.2", 795 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 796 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 797 | "engines": { 798 | "node": ">=0.4" 799 | } 800 | } 801 | }, 802 | "dependencies": { 803 | "@kabbi/routed-mqtt": { 804 | "version": "1.0.0", 805 | "resolved": "https://registry.npmjs.org/@kabbi/routed-mqtt/-/routed-mqtt-1.0.0.tgz", 806 | "integrity": "sha512-oNeuFlawT7gINOWAHz08ooXcsUlIAZkQMNKSCq+WLqJ2dW1dipVA8SqGff0CHhgKT2TLUI9QHBM/FrrA/0etTQ==", 807 | "requires": { 808 | "async-mqtt": "^2.6.1", 809 | "path-to-regexp": "^6.2.0" 810 | } 811 | }, 812 | "async-mqtt": { 813 | "version": "2.6.1", 814 | "resolved": "https://registry.npmjs.org/async-mqtt/-/async-mqtt-2.6.1.tgz", 815 | "integrity": "sha512-EkXAwRzwMaPC6ji0EvNeM5OMe6VjMhEKVJJUN7gu/hGzkcDpZtaI34nUwdwCMbjQB3pnuSOHqQMFKsUpg+D8kA==", 816 | "requires": { 817 | "mqtt": "^4.1.0" 818 | } 819 | }, 820 | "balanced-match": { 821 | "version": "1.0.2", 822 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 823 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 824 | }, 825 | "base64-js": { 826 | "version": "1.5.1", 827 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 828 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 829 | }, 830 | "bl": { 831 | "version": "4.1.0", 832 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 833 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 834 | "requires": { 835 | "buffer": "^5.5.0", 836 | "inherits": "^2.0.4", 837 | "readable-stream": "^3.4.0" 838 | } 839 | }, 840 | "brace-expansion": { 841 | "version": "1.1.11", 842 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 843 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 844 | "requires": { 845 | "balanced-match": "^1.0.0", 846 | "concat-map": "0.0.1" 847 | } 848 | }, 849 | "buffer": { 850 | "version": "5.7.1", 851 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 852 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 853 | "requires": { 854 | "base64-js": "^1.3.1", 855 | "ieee754": "^1.1.13" 856 | } 857 | }, 858 | "buffer-from": { 859 | "version": "1.1.1", 860 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 861 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 862 | }, 863 | "callback-stream": { 864 | "version": "1.1.0", 865 | "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", 866 | "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", 867 | "requires": { 868 | "inherits": "^2.0.1", 869 | "readable-stream": "> 1.0.0 < 3.0.0" 870 | }, 871 | "dependencies": { 872 | "readable-stream": { 873 | "version": "2.3.7", 874 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 875 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 876 | "requires": { 877 | "core-util-is": "~1.0.0", 878 | "inherits": "~2.0.3", 879 | "isarray": "~1.0.0", 880 | "process-nextick-args": "~2.0.0", 881 | "safe-buffer": "~5.1.1", 882 | "string_decoder": "~1.1.1", 883 | "util-deprecate": "~1.0.1" 884 | } 885 | }, 886 | "safe-buffer": { 887 | "version": "5.1.2", 888 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 889 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 890 | }, 891 | "string_decoder": { 892 | "version": "1.1.1", 893 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 894 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 895 | "requires": { 896 | "safe-buffer": "~5.1.0" 897 | } 898 | } 899 | } 900 | }, 901 | "commist": { 902 | "version": "1.1.0", 903 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 904 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 905 | "requires": { 906 | "leven": "^2.1.0", 907 | "minimist": "^1.1.0" 908 | } 909 | }, 910 | "concat-map": { 911 | "version": "0.0.1", 912 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 913 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 914 | }, 915 | "concat-stream": { 916 | "version": "2.0.0", 917 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 918 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 919 | "requires": { 920 | "buffer-from": "^1.0.0", 921 | "inherits": "^2.0.3", 922 | "readable-stream": "^3.0.2", 923 | "typedarray": "^0.0.6" 924 | } 925 | }, 926 | "core-util-is": { 927 | "version": "1.0.2", 928 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 929 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 930 | }, 931 | "debug": { 932 | "version": "4.3.1", 933 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 934 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 935 | "requires": { 936 | "ms": "2.1.2" 937 | } 938 | }, 939 | "dotenv": { 940 | "version": "8.2.0", 941 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 942 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 943 | }, 944 | "duplexify": { 945 | "version": "3.7.1", 946 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 947 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 948 | "requires": { 949 | "end-of-stream": "^1.0.0", 950 | "inherits": "^2.0.1", 951 | "readable-stream": "^2.0.0", 952 | "stream-shift": "^1.0.0" 953 | }, 954 | "dependencies": { 955 | "readable-stream": { 956 | "version": "2.3.7", 957 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 958 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 959 | "requires": { 960 | "core-util-is": "~1.0.0", 961 | "inherits": "~2.0.3", 962 | "isarray": "~1.0.0", 963 | "process-nextick-args": "~2.0.0", 964 | "safe-buffer": "~5.1.1", 965 | "string_decoder": "~1.1.1", 966 | "util-deprecate": "~1.0.1" 967 | } 968 | }, 969 | "safe-buffer": { 970 | "version": "5.1.2", 971 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 972 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 973 | }, 974 | "string_decoder": { 975 | "version": "1.1.1", 976 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 977 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 978 | "requires": { 979 | "safe-buffer": "~5.1.0" 980 | } 981 | } 982 | } 983 | }, 984 | "end-of-stream": { 985 | "version": "1.4.4", 986 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 987 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 988 | "requires": { 989 | "once": "^1.4.0" 990 | } 991 | }, 992 | "extend": { 993 | "version": "3.0.2", 994 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 995 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 996 | }, 997 | "fs.realpath": { 998 | "version": "1.0.0", 999 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 1000 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 1001 | }, 1002 | "glob": { 1003 | "version": "7.1.6", 1004 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 1005 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 1006 | "requires": { 1007 | "fs.realpath": "^1.0.0", 1008 | "inflight": "^1.0.4", 1009 | "inherits": "2", 1010 | "minimatch": "^3.0.4", 1011 | "once": "^1.3.0", 1012 | "path-is-absolute": "^1.0.0" 1013 | } 1014 | }, 1015 | "glob-parent": { 1016 | "version": "3.1.0", 1017 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 1018 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 1019 | "requires": { 1020 | "is-glob": "^3.1.0", 1021 | "path-dirname": "^1.0.0" 1022 | } 1023 | }, 1024 | "glob-stream": { 1025 | "version": "6.1.0", 1026 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 1027 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 1028 | "requires": { 1029 | "extend": "^3.0.0", 1030 | "glob": "^7.1.1", 1031 | "glob-parent": "^3.1.0", 1032 | "is-negated-glob": "^1.0.0", 1033 | "ordered-read-streams": "^1.0.0", 1034 | "pumpify": "^1.3.5", 1035 | "readable-stream": "^2.1.5", 1036 | "remove-trailing-separator": "^1.0.1", 1037 | "to-absolute-glob": "^2.0.0", 1038 | "unique-stream": "^2.0.2" 1039 | }, 1040 | "dependencies": { 1041 | "readable-stream": { 1042 | "version": "2.3.7", 1043 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1044 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1045 | "requires": { 1046 | "core-util-is": "~1.0.0", 1047 | "inherits": "~2.0.3", 1048 | "isarray": "~1.0.0", 1049 | "process-nextick-args": "~2.0.0", 1050 | "safe-buffer": "~5.1.1", 1051 | "string_decoder": "~1.1.1", 1052 | "util-deprecate": "~1.0.1" 1053 | } 1054 | }, 1055 | "safe-buffer": { 1056 | "version": "5.1.2", 1057 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1058 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1059 | }, 1060 | "string_decoder": { 1061 | "version": "1.1.1", 1062 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1063 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1064 | "requires": { 1065 | "safe-buffer": "~5.1.0" 1066 | } 1067 | } 1068 | } 1069 | }, 1070 | "help-me": { 1071 | "version": "1.1.0", 1072 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", 1073 | "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", 1074 | "requires": { 1075 | "callback-stream": "^1.0.2", 1076 | "glob-stream": "^6.1.0", 1077 | "through2": "^2.0.1", 1078 | "xtend": "^4.0.0" 1079 | } 1080 | }, 1081 | "ieee754": { 1082 | "version": "1.2.1", 1083 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1084 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1085 | }, 1086 | "inflight": { 1087 | "version": "1.0.6", 1088 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1089 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1090 | "requires": { 1091 | "once": "^1.3.0", 1092 | "wrappy": "1" 1093 | } 1094 | }, 1095 | "inherits": { 1096 | "version": "2.0.4", 1097 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1098 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1099 | }, 1100 | "is-absolute": { 1101 | "version": "1.0.0", 1102 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1103 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1104 | "requires": { 1105 | "is-relative": "^1.0.0", 1106 | "is-windows": "^1.0.1" 1107 | } 1108 | }, 1109 | "is-extglob": { 1110 | "version": "2.1.1", 1111 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1112 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1113 | }, 1114 | "is-glob": { 1115 | "version": "3.1.0", 1116 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1117 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1118 | "requires": { 1119 | "is-extglob": "^2.1.0" 1120 | } 1121 | }, 1122 | "is-negated-glob": { 1123 | "version": "1.0.0", 1124 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 1125 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" 1126 | }, 1127 | "is-relative": { 1128 | "version": "1.0.0", 1129 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1130 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1131 | "requires": { 1132 | "is-unc-path": "^1.0.0" 1133 | } 1134 | }, 1135 | "is-unc-path": { 1136 | "version": "1.0.0", 1137 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1138 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1139 | "requires": { 1140 | "unc-path-regex": "^0.1.2" 1141 | } 1142 | }, 1143 | "is-windows": { 1144 | "version": "1.0.2", 1145 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1146 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1147 | }, 1148 | "isarray": { 1149 | "version": "1.0.0", 1150 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1151 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1152 | }, 1153 | "json-stable-stringify-without-jsonify": { 1154 | "version": "1.0.1", 1155 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1156 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 1157 | }, 1158 | "leven": { 1159 | "version": "2.1.0", 1160 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 1161 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" 1162 | }, 1163 | "minimatch": { 1164 | "version": "3.0.4", 1165 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1166 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1167 | "requires": { 1168 | "brace-expansion": "^1.1.7" 1169 | } 1170 | }, 1171 | "minimist": { 1172 | "version": "1.2.5", 1173 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1174 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1175 | }, 1176 | "mqtt": { 1177 | "version": "4.2.6", 1178 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.6.tgz", 1179 | "integrity": "sha512-GpxVObyOzL0CGPBqo6B04GinN8JLk12NRYAIkYvARd9ZCoJKevvOyCaWK6bdK/kFSDj3LPDnCsJbezzNlsi87Q==", 1180 | "requires": { 1181 | "commist": "^1.0.0", 1182 | "concat-stream": "^2.0.0", 1183 | "debug": "^4.1.1", 1184 | "help-me": "^1.0.1", 1185 | "inherits": "^2.0.3", 1186 | "minimist": "^1.2.5", 1187 | "mqtt-packet": "^6.6.0", 1188 | "pump": "^3.0.0", 1189 | "readable-stream": "^3.6.0", 1190 | "reinterval": "^1.1.0", 1191 | "split2": "^3.1.0", 1192 | "ws": "^7.3.1", 1193 | "xtend": "^4.0.2" 1194 | } 1195 | }, 1196 | "mqtt-packet": { 1197 | "version": "6.9.1", 1198 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.9.1.tgz", 1199 | "integrity": "sha512-0+u0ZoRj6H6AuzNY5d8qzXzyXmFI19gkdPRA14kGfKvbqYcpOL+HWUGHjtCxHqjm8CscwsH+dX0+Rxx4se5HSA==", 1200 | "requires": { 1201 | "bl": "^4.0.2", 1202 | "debug": "^4.1.1", 1203 | "process-nextick-args": "^2.0.1" 1204 | } 1205 | }, 1206 | "ms": { 1207 | "version": "2.1.2", 1208 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1209 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1210 | }, 1211 | "once": { 1212 | "version": "1.4.0", 1213 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1214 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1215 | "requires": { 1216 | "wrappy": "1" 1217 | } 1218 | }, 1219 | "ordered-read-streams": { 1220 | "version": "1.0.1", 1221 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 1222 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 1223 | "requires": { 1224 | "readable-stream": "^2.0.1" 1225 | }, 1226 | "dependencies": { 1227 | "readable-stream": { 1228 | "version": "2.3.7", 1229 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1230 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1231 | "requires": { 1232 | "core-util-is": "~1.0.0", 1233 | "inherits": "~2.0.3", 1234 | "isarray": "~1.0.0", 1235 | "process-nextick-args": "~2.0.0", 1236 | "safe-buffer": "~5.1.1", 1237 | "string_decoder": "~1.1.1", 1238 | "util-deprecate": "~1.0.1" 1239 | } 1240 | }, 1241 | "safe-buffer": { 1242 | "version": "5.1.2", 1243 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1244 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1245 | }, 1246 | "string_decoder": { 1247 | "version": "1.1.1", 1248 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1249 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1250 | "requires": { 1251 | "safe-buffer": "~5.1.0" 1252 | } 1253 | } 1254 | } 1255 | }, 1256 | "path-dirname": { 1257 | "version": "1.0.2", 1258 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1259 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 1260 | }, 1261 | "path-is-absolute": { 1262 | "version": "1.0.1", 1263 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1264 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1265 | }, 1266 | "path-to-regexp": { 1267 | "version": "6.2.0", 1268 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", 1269 | "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" 1270 | }, 1271 | "process-nextick-args": { 1272 | "version": "2.0.1", 1273 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1274 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1275 | }, 1276 | "pump": { 1277 | "version": "3.0.0", 1278 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1279 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1280 | "requires": { 1281 | "end-of-stream": "^1.1.0", 1282 | "once": "^1.3.1" 1283 | } 1284 | }, 1285 | "pumpify": { 1286 | "version": "1.5.1", 1287 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 1288 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 1289 | "requires": { 1290 | "duplexify": "^3.6.0", 1291 | "inherits": "^2.0.3", 1292 | "pump": "^2.0.0" 1293 | }, 1294 | "dependencies": { 1295 | "pump": { 1296 | "version": "2.0.1", 1297 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1298 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1299 | "requires": { 1300 | "end-of-stream": "^1.1.0", 1301 | "once": "^1.3.1" 1302 | } 1303 | } 1304 | } 1305 | }, 1306 | "queue-promise": { 1307 | "version": "2.1.0", 1308 | "resolved": "https://registry.npmjs.org/queue-promise/-/queue-promise-2.1.0.tgz", 1309 | "integrity": "sha512-JoIruzwY8HEXsUT0UHdL6Ny5L4CMid9YXLvjbTEHZkjGupae3tlR9/INhdq7Zm9/4NVp9ycLOAKd/zZItWWZhA==" 1310 | }, 1311 | "readable-stream": { 1312 | "version": "3.6.0", 1313 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1314 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1315 | "requires": { 1316 | "inherits": "^2.0.3", 1317 | "string_decoder": "^1.1.1", 1318 | "util-deprecate": "^1.0.1" 1319 | } 1320 | }, 1321 | "reinterval": { 1322 | "version": "1.1.0", 1323 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 1324 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 1325 | }, 1326 | "remove-trailing-separator": { 1327 | "version": "1.1.0", 1328 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1329 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 1330 | }, 1331 | "safe-buffer": { 1332 | "version": "5.2.1", 1333 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1334 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1335 | }, 1336 | "split2": { 1337 | "version": "3.2.2", 1338 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 1339 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 1340 | "requires": { 1341 | "readable-stream": "^3.0.0" 1342 | } 1343 | }, 1344 | "stream-shift": { 1345 | "version": "1.0.1", 1346 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1347 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 1348 | }, 1349 | "string_decoder": { 1350 | "version": "1.3.0", 1351 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1352 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1353 | "requires": { 1354 | "safe-buffer": "~5.2.0" 1355 | } 1356 | }, 1357 | "through2": { 1358 | "version": "2.0.5", 1359 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1360 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1361 | "requires": { 1362 | "readable-stream": "~2.3.6", 1363 | "xtend": "~4.0.1" 1364 | }, 1365 | "dependencies": { 1366 | "readable-stream": { 1367 | "version": "2.3.7", 1368 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1369 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1370 | "requires": { 1371 | "core-util-is": "~1.0.0", 1372 | "inherits": "~2.0.3", 1373 | "isarray": "~1.0.0", 1374 | "process-nextick-args": "~2.0.0", 1375 | "safe-buffer": "~5.1.1", 1376 | "string_decoder": "~1.1.1", 1377 | "util-deprecate": "~1.0.1" 1378 | } 1379 | }, 1380 | "safe-buffer": { 1381 | "version": "5.1.2", 1382 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1383 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1384 | }, 1385 | "string_decoder": { 1386 | "version": "1.1.1", 1387 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1388 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1389 | "requires": { 1390 | "safe-buffer": "~5.1.0" 1391 | } 1392 | } 1393 | } 1394 | }, 1395 | "through2-filter": { 1396 | "version": "3.0.0", 1397 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 1398 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 1399 | "requires": { 1400 | "through2": "~2.0.0", 1401 | "xtend": "~4.0.0" 1402 | } 1403 | }, 1404 | "to-absolute-glob": { 1405 | "version": "2.0.2", 1406 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 1407 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 1408 | "requires": { 1409 | "is-absolute": "^1.0.0", 1410 | "is-negated-glob": "^1.0.0" 1411 | } 1412 | }, 1413 | "typedarray": { 1414 | "version": "0.0.6", 1415 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1416 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1417 | }, 1418 | "unc-path-regex": { 1419 | "version": "0.1.2", 1420 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 1421 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" 1422 | }, 1423 | "unique-stream": { 1424 | "version": "2.3.1", 1425 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 1426 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 1427 | "requires": { 1428 | "json-stable-stringify-without-jsonify": "^1.0.1", 1429 | "through2-filter": "^3.0.0" 1430 | } 1431 | }, 1432 | "util-deprecate": { 1433 | "version": "1.0.2", 1434 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1435 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1436 | }, 1437 | "wrappy": { 1438 | "version": "1.0.2", 1439 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1440 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1441 | }, 1442 | "ws": { 1443 | "version": "7.4.5", 1444 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", 1445 | "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", 1446 | "requires": {} 1447 | }, 1448 | "xtend": { 1449 | "version": "4.0.2", 1450 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1451 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1452 | } 1453 | } 1454 | } 1455 | -------------------------------------------------------------------------------- /packages/hci2mqtt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/hci2mqtt", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@kabbi/routed-mqtt": "^1.0.0", 14 | "dotenv": "^8.2.0", 15 | "queue-promise": "^2.1.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/mesh2hass/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | -------------------------------------------------------------------------------- /packages/mesh2hass/.prettierrc.js: -------------------------------------------------------------------------------- 1 | module.exports = { 2 | jsxBracketSameLine: true, 3 | singleQuote: true, 4 | }; 5 | -------------------------------------------------------------------------------- /packages/mesh2hass/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | 3 | WORKDIR /usr/src/app 4 | 5 | COPY package*.json ./ 6 | RUN npm install 7 | 8 | COPY *.js . 9 | COPY devices ./devices/ 10 | CMD ["node", "index.js"] 11 | -------------------------------------------------------------------------------- /packages/mesh2hass/devices.json.example: -------------------------------------------------------------------------------- 1 | [ 2 | { 3 | "addr": "1100", 4 | "type": "onoff-client-button" 5 | }, 6 | { 7 | "addr": "110d", 8 | "type": "switch" 9 | }, 10 | { 11 | "addr": "110c", 12 | "type": "strip", 13 | "features": [ 14 | { 15 | "type": "brightness" 16 | }, 17 | { 18 | "type": "rgb" 19 | }, 20 | { 21 | "type": "white-channel" 22 | } 23 | ] 24 | }, 25 | { 26 | "addr": "1108", 27 | "type": "switch" 28 | }, 29 | { 30 | "addr": "0015", 31 | "type": "light", 32 | "features": [ 33 | { 34 | "type": "brightness" 35 | }, 36 | { 37 | "type": "color-temperature", 38 | "overrideAddr": "0016" 39 | } 40 | ] 41 | }, 42 | { 43 | "addr": "0017", 44 | "type": "light", 45 | "features": [ 46 | { 47 | "type": "brightness" 48 | }, 49 | { 50 | "type": "color-temperature", 51 | "overrideAddr": "0018" 52 | } 53 | ] 54 | }, 55 | { 56 | "addr": "000d", 57 | "type": "light", 58 | "features": [ 59 | { 60 | "type": "brightness" 61 | }, 62 | { 63 | "type": "color-temperature", 64 | "overrideAddr": "000e" 65 | } 66 | ] 67 | }, 68 | { 69 | "addr": "0011", 70 | "type": "light", 71 | "features": [ 72 | { 73 | "type": "brightness" 74 | }, 75 | { 76 | "type": "color-temperature", 77 | "overrideAddr": "0012" 78 | } 79 | ] 80 | }, 81 | { 82 | "addr": "0019", 83 | "type": "light", 84 | "features": [ 85 | { 86 | "type": "brightness" 87 | }, 88 | { 89 | "type": "color-temperature", 90 | "overrideAddr": "001a" 91 | } 92 | ] 93 | }, 94 | { 95 | "addr": "001b", 96 | "type": "light", 97 | "features": [ 98 | { 99 | "type": "brightness" 100 | }, 101 | { 102 | "type": "color-temperature", 103 | "overrideAddr": "001c" 104 | } 105 | ] 106 | }, 107 | { 108 | "addr": "1103", 109 | "type": "light", 110 | "features": [ 111 | { 112 | "type": "hsl" 113 | }, 114 | { 115 | "type": "white-channel", 116 | "overrideAddr": "1106" 117 | } 118 | ] 119 | } 120 | ] -------------------------------------------------------------------------------- /packages/mesh2hass/devices/kabbi-strip.js: -------------------------------------------------------------------------------- 1 | module.exports = async ({ device, client, state, config }) => { 2 | const { transactionsSent } = state; 3 | const hassPrefix = `${config.devicePrefix}/${device.addr}`; 4 | const meshPrefix = `${config.meshPrefix}/${device.addr}/models`; 5 | 6 | const KeyIndex = ['on', 'color']; 7 | 8 | await client.publish( 9 | `homeassistant/light/${device.addr}/light/config`, 10 | JSON.stringify({ 11 | schema: 'json', 12 | name: `${device.addr}_light`, 13 | unique_id: device.addr, 14 | device: { 15 | identifiers: [`blemesh_${device.addr}`], 16 | name: device.addr, 17 | }, 18 | // TODO: Get rid of optimistic 19 | optimistic: true, 20 | color_mode: true, 21 | command_topic: `${hassPrefix}/cmd`, 22 | state_topic: `${hassPrefix}/state`, 23 | supported_color_modes: [device.features.white_channel ? 'rgbw' : 'rgb'], 24 | }), 25 | { retain: true } 26 | ); 27 | 28 | // hass -> mesh 29 | await client.handleJSON(`${hassPrefix}/cmd`, async (match, payload) => { 30 | const { state, color } = payload; 31 | const tid = transactionsSent.get(device.addr) || 0; 32 | transactionsSent.set(device.addr, tid + 1); 33 | 34 | if (state && Object.keys(payload).length === 1) { 35 | await client.publishJSON(`${meshPrefix}/generic-onoff/set/send`, { 36 | status: state.toLowerCase(), 37 | transactionId: tid, 38 | }); 39 | } 40 | 41 | if (color) { 42 | const packedColor = 43 | ((color.r << 24) | 44 | (color.g << 16) | 45 | (color.b << 8) | 46 | (color.w || 0)) >>> 47 | 0; 48 | await client.publishJSON(`${meshPrefix}/kabbi-kv/set-int-indexed/send`, { 49 | key: KeyIndex.indexOf('color'), 50 | value: packedColor, 51 | }); 52 | } 53 | }); 54 | 55 | // mesh -> hass 56 | await client.handleJSON( 57 | `${meshPrefix}/generic-onoff/status`, 58 | async (match, payload) => { 59 | await client.publishJSON(`${hassPrefix}/state`, { 60 | state: `${payload.status}`.toUpperCase(), 61 | }); 62 | } 63 | ); 64 | }; 65 | -------------------------------------------------------------------------------- /packages/mesh2hass/devices/light-hsl.js: -------------------------------------------------------------------------------- 1 | const getSubAddr = (addr, delta) => { 2 | const v = Number.parseInt(addr, 16); 3 | return (v + delta).toString(16).padStart(4, '0'); 4 | }; 5 | 6 | module.exports = async ({ device, client, state, config }) => { 7 | const { transactionsSent } = state; 8 | const hassPrefix = `${config.devicePrefix}/${device.addr}`; 9 | const meshPrefix = `${config.meshPrefix}/${device.addr}/models`; 10 | const meshHuePrefix = `${config.meshPrefix}/${getSubAddr( 11 | device.addr, 12 | 1 13 | )}/models`; 14 | const meshSatPrefix = `${config.meshPrefix}/${getSubAddr( 15 | device.addr, 16 | 2 17 | )}/models`; 18 | 19 | await client.publish( 20 | `homeassistant/light/${device.addr}/light/config`, 21 | JSON.stringify({ 22 | device: { 23 | identifiers: [`blemesh_${device.addr}`], 24 | name: device.addr, 25 | }, 26 | schema: 'json', 27 | command_topic: `${hassPrefix}/cmd`, 28 | state_topic: `${hassPrefix}/state`, 29 | brightness: !!device.features?.brightness, 30 | brightness_scale: 0xffff, 31 | color_mode: true, 32 | supported_color_modes: ['hs'], 33 | name: `${device.addr}_light`, 34 | unique_id: device.addr, 35 | }), 36 | { retain: true } 37 | ); 38 | 39 | // hass -> mesh 40 | await client.handleJSON(`${hassPrefix}/cmd`, async (match, payload) => { 41 | const { state, brightness, color } = payload; 42 | const tid = transactionsSent.get(device.addr) || 0; 43 | transactionsSent.set(device.addr, tid + 1); 44 | 45 | await client.publishJSON(`${meshPrefix}/generic-onoff/set/send`, { 46 | status: state.toLowerCase(), 47 | transactionId: tid, 48 | }); 49 | 50 | if (brightness != null) { 51 | await client.publishJSON(`${meshPrefix}/generic-level/set/send`, { 52 | level: brightness - 0x8000, 53 | transactionId: tid, 54 | }); 55 | } 56 | 57 | if (color != null && !device.features.update_method) { 58 | await client.publishJSON(`${meshPrefix}/light-hsl/set/send`, { 59 | hue: (color.h / 360) * 0xffff, 60 | saturation: (color.s / 100) * 0xffff, 61 | lightness: 32000, 62 | transactionId: tid, 63 | }); 64 | } 65 | 66 | if (color != null && device.features.update_method === 'hacky') { 67 | await client.publishJSON(`${meshHuePrefix}/generic-level/set/send`, { 68 | level: (color.h / 360) * 0xffff - 0x8000, 69 | transactionId: tid, 70 | }); 71 | await client.publishJSON(`${meshSatPrefix}/generic-level/set/send`, { 72 | level: (color.s / 100) * 0xffff - 0x8000, 73 | transactionId: tid, 74 | }); 75 | } 76 | }); 77 | 78 | // mesh -> hass 79 | await client.handleJSON( 80 | `${meshPrefix}/generic-onoff/status`, 81 | async (match, payload) => { 82 | await client.publishJSON(`${hassPrefix}/state`, { 83 | state: `${payload.status}`.toUpperCase(), 84 | }); 85 | } 86 | ); 87 | }; 88 | -------------------------------------------------------------------------------- /packages/mesh2hass/devices/light.js: -------------------------------------------------------------------------------- 1 | module.exports = async ({ device, client, state, config }) => { 2 | const { transactionsSent } = state; 3 | const hassPrefix = `${config.devicePrefix}/${device.addr}`; 4 | const meshPrefix = `${config.meshPrefix}/${device.addr}/models`; 5 | 6 | await client.publish( 7 | `homeassistant/light/${device.addr}/light/config`, 8 | JSON.stringify({ 9 | device: { 10 | identifiers: [`blemesh_${device.addr}`], 11 | name: device.addr, 12 | }, 13 | schema: 'json', 14 | command_topic: `${hassPrefix}/cmd`, 15 | state_topic: `${hassPrefix}/state`, 16 | brightness: !!device.features?.brightness, 17 | brightness_scale: 0xffff, 18 | name: `${device.addr}_light`, 19 | unique_id: device.addr, 20 | }), 21 | { retain: true } 22 | ); 23 | 24 | // hass -> mesh 25 | await client.handleJSON(`${hassPrefix}/cmd`, async (match, payload) => { 26 | const { state, brightness } = payload; 27 | const tid = transactionsSent.get(device.addr) || 0; 28 | transactionsSent.set(device.addr, tid + 1); 29 | 30 | await client.publishJSON(`${meshPrefix}/generic-onoff/set/send`, { 31 | status: state.toLowerCase(), 32 | transactionId: tid, 33 | }); 34 | 35 | if (brightness != null) { 36 | await client.publishJSON(`${meshPrefix}/generic-level/set/send`, { 37 | level: brightness - 0x8000, 38 | transactionId: tid, 39 | }); 40 | } 41 | }); 42 | 43 | // mesh -> hass 44 | await client.handleJSON( 45 | `${meshPrefix}/generic-onoff/status`, 46 | async (match, payload) => { 47 | await client.publishJSON(`${hassPrefix}/state`, { 48 | state: `${payload.status}`.toUpperCase(), 49 | }); 50 | } 51 | ); 52 | }; 53 | -------------------------------------------------------------------------------- /packages/mesh2hass/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const debug = require('debug')('app'); 3 | const mqtt = require('@kabbi/routed-mqtt'); 4 | require('dotenv').config(); 5 | 6 | const devices = require('./devices.json'); 7 | 8 | const client = mqtt.connect(process.env.MQTT_URL || 'mqtt://localhost'); 9 | const devicePrefix = process.env.HASS_MQTT_PREFIX || 'mesh2hass'; 10 | const meshPrefix = process.env.MESH_MQTT_PREFIX || 'mesh2mqtt'; 11 | 12 | const transactionsSeen = new Set(); 13 | const transactionsSent = new Map(); 14 | 15 | client.setMaxListeners(1e3); 16 | client.once('connect', async () => { 17 | console.log('- setting up devices'); 18 | 19 | for (const device of devices) { 20 | let handler; 21 | try { 22 | handler = require(`./devices/${device.type}`); 23 | } catch (e) { 24 | console.error('Unsupported device type', device.type); 25 | continue; 26 | } 27 | 28 | console.log(`- [${device.addr}] ${device.type}`); 29 | handler({ 30 | device, 31 | client, 32 | state: { 33 | transactionsSent, 34 | transactionsSeen, 35 | }, 36 | config: { 37 | devicePrefix, 38 | meshPrefix, 39 | }, 40 | }); 41 | } 42 | }); 43 | -------------------------------------------------------------------------------- /packages/mesh2hass/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/mesh2hass", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "name": "@kabbi/mesh2hass", 9 | "version": "1.0.0", 10 | "license": "ISC", 11 | "dependencies": { 12 | "@kabbi/routed-mqtt": "^1.0.0", 13 | "debug": "^4.3.1", 14 | "dotenv": "^8.2.0" 15 | } 16 | }, 17 | "node_modules/@kabbi/routed-mqtt": { 18 | "version": "1.0.0", 19 | "resolved": "https://registry.npmjs.org/@kabbi/routed-mqtt/-/routed-mqtt-1.0.0.tgz", 20 | "integrity": "sha512-oNeuFlawT7gINOWAHz08ooXcsUlIAZkQMNKSCq+WLqJ2dW1dipVA8SqGff0CHhgKT2TLUI9QHBM/FrrA/0etTQ==", 21 | "dependencies": { 22 | "async-mqtt": "^2.6.1", 23 | "path-to-regexp": "^6.2.0" 24 | } 25 | }, 26 | "node_modules/async-mqtt": { 27 | "version": "2.6.1", 28 | "resolved": "https://registry.npmjs.org/async-mqtt/-/async-mqtt-2.6.1.tgz", 29 | "integrity": "sha512-EkXAwRzwMaPC6ji0EvNeM5OMe6VjMhEKVJJUN7gu/hGzkcDpZtaI34nUwdwCMbjQB3pnuSOHqQMFKsUpg+D8kA==", 30 | "dependencies": { 31 | "mqtt": "^4.1.0" 32 | } 33 | }, 34 | "node_modules/balanced-match": { 35 | "version": "1.0.2", 36 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 37 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 38 | }, 39 | "node_modules/base64-js": { 40 | "version": "1.5.1", 41 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 42 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 43 | "funding": [ 44 | { 45 | "type": "github", 46 | "url": "https://github.com/sponsors/feross" 47 | }, 48 | { 49 | "type": "patreon", 50 | "url": "https://www.patreon.com/feross" 51 | }, 52 | { 53 | "type": "consulting", 54 | "url": "https://feross.org/support" 55 | } 56 | ] 57 | }, 58 | "node_modules/bl": { 59 | "version": "4.1.0", 60 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 61 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 62 | "dependencies": { 63 | "buffer": "^5.5.0", 64 | "inherits": "^2.0.4", 65 | "readable-stream": "^3.4.0" 66 | } 67 | }, 68 | "node_modules/brace-expansion": { 69 | "version": "1.1.11", 70 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 71 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 72 | "dependencies": { 73 | "balanced-match": "^1.0.0", 74 | "concat-map": "0.0.1" 75 | } 76 | }, 77 | "node_modules/buffer": { 78 | "version": "5.7.1", 79 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 80 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 81 | "funding": [ 82 | { 83 | "type": "github", 84 | "url": "https://github.com/sponsors/feross" 85 | }, 86 | { 87 | "type": "patreon", 88 | "url": "https://www.patreon.com/feross" 89 | }, 90 | { 91 | "type": "consulting", 92 | "url": "https://feross.org/support" 93 | } 94 | ], 95 | "dependencies": { 96 | "base64-js": "^1.3.1", 97 | "ieee754": "^1.1.13" 98 | } 99 | }, 100 | "node_modules/buffer-from": { 101 | "version": "1.1.1", 102 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 103 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 104 | }, 105 | "node_modules/callback-stream": { 106 | "version": "1.1.0", 107 | "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", 108 | "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", 109 | "dependencies": { 110 | "inherits": "^2.0.1", 111 | "readable-stream": "> 1.0.0 < 3.0.0" 112 | } 113 | }, 114 | "node_modules/callback-stream/node_modules/readable-stream": { 115 | "version": "2.3.7", 116 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 117 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 118 | "dependencies": { 119 | "core-util-is": "~1.0.0", 120 | "inherits": "~2.0.3", 121 | "isarray": "~1.0.0", 122 | "process-nextick-args": "~2.0.0", 123 | "safe-buffer": "~5.1.1", 124 | "string_decoder": "~1.1.1", 125 | "util-deprecate": "~1.0.1" 126 | } 127 | }, 128 | "node_modules/callback-stream/node_modules/safe-buffer": { 129 | "version": "5.1.2", 130 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 131 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 132 | }, 133 | "node_modules/callback-stream/node_modules/string_decoder": { 134 | "version": "1.1.1", 135 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 136 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 137 | "dependencies": { 138 | "safe-buffer": "~5.1.0" 139 | } 140 | }, 141 | "node_modules/commist": { 142 | "version": "1.1.0", 143 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 144 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 145 | "dependencies": { 146 | "leven": "^2.1.0", 147 | "minimist": "^1.1.0" 148 | } 149 | }, 150 | "node_modules/concat-map": { 151 | "version": "0.0.1", 152 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 153 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 154 | }, 155 | "node_modules/concat-stream": { 156 | "version": "2.0.0", 157 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 158 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 159 | "engines": [ 160 | "node >= 6.0" 161 | ], 162 | "dependencies": { 163 | "buffer-from": "^1.0.0", 164 | "inherits": "^2.0.3", 165 | "readable-stream": "^3.0.2", 166 | "typedarray": "^0.0.6" 167 | } 168 | }, 169 | "node_modules/core-util-is": { 170 | "version": "1.0.2", 171 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 172 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 173 | }, 174 | "node_modules/debug": { 175 | "version": "4.3.1", 176 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 177 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 178 | "dependencies": { 179 | "ms": "2.1.2" 180 | }, 181 | "engines": { 182 | "node": ">=6.0" 183 | }, 184 | "peerDependenciesMeta": { 185 | "supports-color": { 186 | "optional": true 187 | } 188 | } 189 | }, 190 | "node_modules/dotenv": { 191 | "version": "8.2.0", 192 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 193 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==", 194 | "engines": { 195 | "node": ">=8" 196 | } 197 | }, 198 | "node_modules/duplexify": { 199 | "version": "3.7.1", 200 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 201 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 202 | "dependencies": { 203 | "end-of-stream": "^1.0.0", 204 | "inherits": "^2.0.1", 205 | "readable-stream": "^2.0.0", 206 | "stream-shift": "^1.0.0" 207 | } 208 | }, 209 | "node_modules/duplexify/node_modules/readable-stream": { 210 | "version": "2.3.7", 211 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 212 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 213 | "dependencies": { 214 | "core-util-is": "~1.0.0", 215 | "inherits": "~2.0.3", 216 | "isarray": "~1.0.0", 217 | "process-nextick-args": "~2.0.0", 218 | "safe-buffer": "~5.1.1", 219 | "string_decoder": "~1.1.1", 220 | "util-deprecate": "~1.0.1" 221 | } 222 | }, 223 | "node_modules/duplexify/node_modules/safe-buffer": { 224 | "version": "5.1.2", 225 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 226 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 227 | }, 228 | "node_modules/duplexify/node_modules/string_decoder": { 229 | "version": "1.1.1", 230 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 231 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 232 | "dependencies": { 233 | "safe-buffer": "~5.1.0" 234 | } 235 | }, 236 | "node_modules/end-of-stream": { 237 | "version": "1.4.4", 238 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 239 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 240 | "dependencies": { 241 | "once": "^1.4.0" 242 | } 243 | }, 244 | "node_modules/extend": { 245 | "version": "3.0.2", 246 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 247 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 248 | }, 249 | "node_modules/fs.realpath": { 250 | "version": "1.0.0", 251 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 252 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 253 | }, 254 | "node_modules/glob": { 255 | "version": "7.1.6", 256 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 257 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 258 | "dependencies": { 259 | "fs.realpath": "^1.0.0", 260 | "inflight": "^1.0.4", 261 | "inherits": "2", 262 | "minimatch": "^3.0.4", 263 | "once": "^1.3.0", 264 | "path-is-absolute": "^1.0.0" 265 | }, 266 | "engines": { 267 | "node": "*" 268 | }, 269 | "funding": { 270 | "url": "https://github.com/sponsors/isaacs" 271 | } 272 | }, 273 | "node_modules/glob-parent": { 274 | "version": "3.1.0", 275 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 276 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 277 | "dependencies": { 278 | "is-glob": "^3.1.0", 279 | "path-dirname": "^1.0.0" 280 | } 281 | }, 282 | "node_modules/glob-stream": { 283 | "version": "6.1.0", 284 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 285 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 286 | "dependencies": { 287 | "extend": "^3.0.0", 288 | "glob": "^7.1.1", 289 | "glob-parent": "^3.1.0", 290 | "is-negated-glob": "^1.0.0", 291 | "ordered-read-streams": "^1.0.0", 292 | "pumpify": "^1.3.5", 293 | "readable-stream": "^2.1.5", 294 | "remove-trailing-separator": "^1.0.1", 295 | "to-absolute-glob": "^2.0.0", 296 | "unique-stream": "^2.0.2" 297 | }, 298 | "engines": { 299 | "node": ">= 0.10" 300 | } 301 | }, 302 | "node_modules/glob-stream/node_modules/readable-stream": { 303 | "version": "2.3.7", 304 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 305 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 306 | "dependencies": { 307 | "core-util-is": "~1.0.0", 308 | "inherits": "~2.0.3", 309 | "isarray": "~1.0.0", 310 | "process-nextick-args": "~2.0.0", 311 | "safe-buffer": "~5.1.1", 312 | "string_decoder": "~1.1.1", 313 | "util-deprecate": "~1.0.1" 314 | } 315 | }, 316 | "node_modules/glob-stream/node_modules/safe-buffer": { 317 | "version": "5.1.2", 318 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 319 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 320 | }, 321 | "node_modules/glob-stream/node_modules/string_decoder": { 322 | "version": "1.1.1", 323 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 324 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 325 | "dependencies": { 326 | "safe-buffer": "~5.1.0" 327 | } 328 | }, 329 | "node_modules/help-me": { 330 | "version": "1.1.0", 331 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", 332 | "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", 333 | "dependencies": { 334 | "callback-stream": "^1.0.2", 335 | "glob-stream": "^6.1.0", 336 | "through2": "^2.0.1", 337 | "xtend": "^4.0.0" 338 | } 339 | }, 340 | "node_modules/ieee754": { 341 | "version": "1.2.1", 342 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 343 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 344 | "funding": [ 345 | { 346 | "type": "github", 347 | "url": "https://github.com/sponsors/feross" 348 | }, 349 | { 350 | "type": "patreon", 351 | "url": "https://www.patreon.com/feross" 352 | }, 353 | { 354 | "type": "consulting", 355 | "url": "https://feross.org/support" 356 | } 357 | ] 358 | }, 359 | "node_modules/inflight": { 360 | "version": "1.0.6", 361 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 362 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 363 | "dependencies": { 364 | "once": "^1.3.0", 365 | "wrappy": "1" 366 | } 367 | }, 368 | "node_modules/inherits": { 369 | "version": "2.0.4", 370 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 371 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 372 | }, 373 | "node_modules/is-absolute": { 374 | "version": "1.0.0", 375 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 376 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 377 | "dependencies": { 378 | "is-relative": "^1.0.0", 379 | "is-windows": "^1.0.1" 380 | }, 381 | "engines": { 382 | "node": ">=0.10.0" 383 | } 384 | }, 385 | "node_modules/is-extglob": { 386 | "version": "2.1.1", 387 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 388 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 389 | "engines": { 390 | "node": ">=0.10.0" 391 | } 392 | }, 393 | "node_modules/is-glob": { 394 | "version": "3.1.0", 395 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 396 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 397 | "dependencies": { 398 | "is-extglob": "^2.1.0" 399 | }, 400 | "engines": { 401 | "node": ">=0.10.0" 402 | } 403 | }, 404 | "node_modules/is-negated-glob": { 405 | "version": "1.0.0", 406 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 407 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", 408 | "engines": { 409 | "node": ">=0.10.0" 410 | } 411 | }, 412 | "node_modules/is-relative": { 413 | "version": "1.0.0", 414 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 415 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 416 | "dependencies": { 417 | "is-unc-path": "^1.0.0" 418 | }, 419 | "engines": { 420 | "node": ">=0.10.0" 421 | } 422 | }, 423 | "node_modules/is-unc-path": { 424 | "version": "1.0.0", 425 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 426 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 427 | "dependencies": { 428 | "unc-path-regex": "^0.1.2" 429 | }, 430 | "engines": { 431 | "node": ">=0.10.0" 432 | } 433 | }, 434 | "node_modules/is-windows": { 435 | "version": "1.0.2", 436 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 437 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 438 | "engines": { 439 | "node": ">=0.10.0" 440 | } 441 | }, 442 | "node_modules/isarray": { 443 | "version": "1.0.0", 444 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 445 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 446 | }, 447 | "node_modules/json-stable-stringify-without-jsonify": { 448 | "version": "1.0.1", 449 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 450 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 451 | }, 452 | "node_modules/leven": { 453 | "version": "2.1.0", 454 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 455 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", 456 | "engines": { 457 | "node": ">=0.10.0" 458 | } 459 | }, 460 | "node_modules/minimatch": { 461 | "version": "3.0.4", 462 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 463 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 464 | "dependencies": { 465 | "brace-expansion": "^1.1.7" 466 | }, 467 | "engines": { 468 | "node": "*" 469 | } 470 | }, 471 | "node_modules/minimist": { 472 | "version": "1.2.5", 473 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 474 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 475 | }, 476 | "node_modules/mqtt": { 477 | "version": "4.2.6", 478 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.6.tgz", 479 | "integrity": "sha512-GpxVObyOzL0CGPBqo6B04GinN8JLk12NRYAIkYvARd9ZCoJKevvOyCaWK6bdK/kFSDj3LPDnCsJbezzNlsi87Q==", 480 | "dependencies": { 481 | "commist": "^1.0.0", 482 | "concat-stream": "^2.0.0", 483 | "debug": "^4.1.1", 484 | "help-me": "^1.0.1", 485 | "inherits": "^2.0.3", 486 | "minimist": "^1.2.5", 487 | "mqtt-packet": "^6.6.0", 488 | "pump": "^3.0.0", 489 | "readable-stream": "^3.6.0", 490 | "reinterval": "^1.1.0", 491 | "split2": "^3.1.0", 492 | "ws": "^7.3.1", 493 | "xtend": "^4.0.2" 494 | }, 495 | "bin": { 496 | "mqtt": "bin/mqtt.js", 497 | "mqtt_pub": "bin/pub.js", 498 | "mqtt_sub": "bin/sub.js" 499 | }, 500 | "engines": { 501 | "node": ">=10.0.0" 502 | } 503 | }, 504 | "node_modules/mqtt-packet": { 505 | "version": "6.9.1", 506 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.9.1.tgz", 507 | "integrity": "sha512-0+u0ZoRj6H6AuzNY5d8qzXzyXmFI19gkdPRA14kGfKvbqYcpOL+HWUGHjtCxHqjm8CscwsH+dX0+Rxx4se5HSA==", 508 | "dependencies": { 509 | "bl": "^4.0.2", 510 | "debug": "^4.1.1", 511 | "process-nextick-args": "^2.0.1" 512 | } 513 | }, 514 | "node_modules/ms": { 515 | "version": "2.1.2", 516 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 517 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 518 | }, 519 | "node_modules/once": { 520 | "version": "1.4.0", 521 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 522 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 523 | "dependencies": { 524 | "wrappy": "1" 525 | } 526 | }, 527 | "node_modules/ordered-read-streams": { 528 | "version": "1.0.1", 529 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 530 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 531 | "dependencies": { 532 | "readable-stream": "^2.0.1" 533 | } 534 | }, 535 | "node_modules/ordered-read-streams/node_modules/readable-stream": { 536 | "version": "2.3.7", 537 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 538 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 539 | "dependencies": { 540 | "core-util-is": "~1.0.0", 541 | "inherits": "~2.0.3", 542 | "isarray": "~1.0.0", 543 | "process-nextick-args": "~2.0.0", 544 | "safe-buffer": "~5.1.1", 545 | "string_decoder": "~1.1.1", 546 | "util-deprecate": "~1.0.1" 547 | } 548 | }, 549 | "node_modules/ordered-read-streams/node_modules/safe-buffer": { 550 | "version": "5.1.2", 551 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 552 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 553 | }, 554 | "node_modules/ordered-read-streams/node_modules/string_decoder": { 555 | "version": "1.1.1", 556 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 557 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 558 | "dependencies": { 559 | "safe-buffer": "~5.1.0" 560 | } 561 | }, 562 | "node_modules/path-dirname": { 563 | "version": "1.0.2", 564 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 565 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 566 | }, 567 | "node_modules/path-is-absolute": { 568 | "version": "1.0.1", 569 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 570 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 571 | "engines": { 572 | "node": ">=0.10.0" 573 | } 574 | }, 575 | "node_modules/path-to-regexp": { 576 | "version": "6.2.0", 577 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", 578 | "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" 579 | }, 580 | "node_modules/process-nextick-args": { 581 | "version": "2.0.1", 582 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 583 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 584 | }, 585 | "node_modules/pump": { 586 | "version": "3.0.0", 587 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 588 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 589 | "dependencies": { 590 | "end-of-stream": "^1.1.0", 591 | "once": "^1.3.1" 592 | } 593 | }, 594 | "node_modules/pumpify": { 595 | "version": "1.5.1", 596 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 597 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 598 | "dependencies": { 599 | "duplexify": "^3.6.0", 600 | "inherits": "^2.0.3", 601 | "pump": "^2.0.0" 602 | } 603 | }, 604 | "node_modules/pumpify/node_modules/pump": { 605 | "version": "2.0.1", 606 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 607 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 608 | "dependencies": { 609 | "end-of-stream": "^1.1.0", 610 | "once": "^1.3.1" 611 | } 612 | }, 613 | "node_modules/readable-stream": { 614 | "version": "3.6.0", 615 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 616 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 617 | "dependencies": { 618 | "inherits": "^2.0.3", 619 | "string_decoder": "^1.1.1", 620 | "util-deprecate": "^1.0.1" 621 | }, 622 | "engines": { 623 | "node": ">= 6" 624 | } 625 | }, 626 | "node_modules/reinterval": { 627 | "version": "1.1.0", 628 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 629 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 630 | }, 631 | "node_modules/remove-trailing-separator": { 632 | "version": "1.1.0", 633 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 634 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 635 | }, 636 | "node_modules/safe-buffer": { 637 | "version": "5.2.1", 638 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 639 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 640 | "funding": [ 641 | { 642 | "type": "github", 643 | "url": "https://github.com/sponsors/feross" 644 | }, 645 | { 646 | "type": "patreon", 647 | "url": "https://www.patreon.com/feross" 648 | }, 649 | { 650 | "type": "consulting", 651 | "url": "https://feross.org/support" 652 | } 653 | ] 654 | }, 655 | "node_modules/split2": { 656 | "version": "3.2.2", 657 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 658 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 659 | "dependencies": { 660 | "readable-stream": "^3.0.0" 661 | } 662 | }, 663 | "node_modules/stream-shift": { 664 | "version": "1.0.1", 665 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 666 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 667 | }, 668 | "node_modules/string_decoder": { 669 | "version": "1.3.0", 670 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 671 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 672 | "dependencies": { 673 | "safe-buffer": "~5.2.0" 674 | } 675 | }, 676 | "node_modules/through2": { 677 | "version": "2.0.5", 678 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 679 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 680 | "dependencies": { 681 | "readable-stream": "~2.3.6", 682 | "xtend": "~4.0.1" 683 | } 684 | }, 685 | "node_modules/through2-filter": { 686 | "version": "3.0.0", 687 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 688 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 689 | "dependencies": { 690 | "through2": "~2.0.0", 691 | "xtend": "~4.0.0" 692 | } 693 | }, 694 | "node_modules/through2/node_modules/readable-stream": { 695 | "version": "2.3.7", 696 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 697 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 698 | "dependencies": { 699 | "core-util-is": "~1.0.0", 700 | "inherits": "~2.0.3", 701 | "isarray": "~1.0.0", 702 | "process-nextick-args": "~2.0.0", 703 | "safe-buffer": "~5.1.1", 704 | "string_decoder": "~1.1.1", 705 | "util-deprecate": "~1.0.1" 706 | } 707 | }, 708 | "node_modules/through2/node_modules/safe-buffer": { 709 | "version": "5.1.2", 710 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 711 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 712 | }, 713 | "node_modules/through2/node_modules/string_decoder": { 714 | "version": "1.1.1", 715 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 716 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 717 | "dependencies": { 718 | "safe-buffer": "~5.1.0" 719 | } 720 | }, 721 | "node_modules/to-absolute-glob": { 722 | "version": "2.0.2", 723 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 724 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 725 | "dependencies": { 726 | "is-absolute": "^1.0.0", 727 | "is-negated-glob": "^1.0.0" 728 | }, 729 | "engines": { 730 | "node": ">=0.10.0" 731 | } 732 | }, 733 | "node_modules/typedarray": { 734 | "version": "0.0.6", 735 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 736 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 737 | }, 738 | "node_modules/unc-path-regex": { 739 | "version": "0.1.2", 740 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 741 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 742 | "engines": { 743 | "node": ">=0.10.0" 744 | } 745 | }, 746 | "node_modules/unique-stream": { 747 | "version": "2.3.1", 748 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 749 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 750 | "dependencies": { 751 | "json-stable-stringify-without-jsonify": "^1.0.1", 752 | "through2-filter": "^3.0.0" 753 | } 754 | }, 755 | "node_modules/util-deprecate": { 756 | "version": "1.0.2", 757 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 758 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 759 | }, 760 | "node_modules/wrappy": { 761 | "version": "1.0.2", 762 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 763 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 764 | }, 765 | "node_modules/ws": { 766 | "version": "7.4.5", 767 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", 768 | "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", 769 | "engines": { 770 | "node": ">=8.3.0" 771 | }, 772 | "peerDependencies": { 773 | "bufferutil": "^4.0.1", 774 | "utf-8-validate": "^5.0.2" 775 | }, 776 | "peerDependenciesMeta": { 777 | "bufferutil": { 778 | "optional": true 779 | }, 780 | "utf-8-validate": { 781 | "optional": true 782 | } 783 | } 784 | }, 785 | "node_modules/xtend": { 786 | "version": "4.0.2", 787 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 788 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 789 | "engines": { 790 | "node": ">=0.4" 791 | } 792 | } 793 | }, 794 | "dependencies": { 795 | "@kabbi/routed-mqtt": { 796 | "version": "1.0.0", 797 | "resolved": "https://registry.npmjs.org/@kabbi/routed-mqtt/-/routed-mqtt-1.0.0.tgz", 798 | "integrity": "sha512-oNeuFlawT7gINOWAHz08ooXcsUlIAZkQMNKSCq+WLqJ2dW1dipVA8SqGff0CHhgKT2TLUI9QHBM/FrrA/0etTQ==", 799 | "requires": { 800 | "async-mqtt": "^2.6.1", 801 | "path-to-regexp": "^6.2.0" 802 | } 803 | }, 804 | "async-mqtt": { 805 | "version": "2.6.1", 806 | "resolved": "https://registry.npmjs.org/async-mqtt/-/async-mqtt-2.6.1.tgz", 807 | "integrity": "sha512-EkXAwRzwMaPC6ji0EvNeM5OMe6VjMhEKVJJUN7gu/hGzkcDpZtaI34nUwdwCMbjQB3pnuSOHqQMFKsUpg+D8kA==", 808 | "requires": { 809 | "mqtt": "^4.1.0" 810 | } 811 | }, 812 | "balanced-match": { 813 | "version": "1.0.2", 814 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 815 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 816 | }, 817 | "base64-js": { 818 | "version": "1.5.1", 819 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 820 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 821 | }, 822 | "bl": { 823 | "version": "4.1.0", 824 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 825 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 826 | "requires": { 827 | "buffer": "^5.5.0", 828 | "inherits": "^2.0.4", 829 | "readable-stream": "^3.4.0" 830 | } 831 | }, 832 | "brace-expansion": { 833 | "version": "1.1.11", 834 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 835 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 836 | "requires": { 837 | "balanced-match": "^1.0.0", 838 | "concat-map": "0.0.1" 839 | } 840 | }, 841 | "buffer": { 842 | "version": "5.7.1", 843 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 844 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 845 | "requires": { 846 | "base64-js": "^1.3.1", 847 | "ieee754": "^1.1.13" 848 | } 849 | }, 850 | "buffer-from": { 851 | "version": "1.1.1", 852 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 853 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 854 | }, 855 | "callback-stream": { 856 | "version": "1.1.0", 857 | "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", 858 | "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", 859 | "requires": { 860 | "inherits": "^2.0.1", 861 | "readable-stream": "> 1.0.0 < 3.0.0" 862 | }, 863 | "dependencies": { 864 | "readable-stream": { 865 | "version": "2.3.7", 866 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 867 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 868 | "requires": { 869 | "core-util-is": "~1.0.0", 870 | "inherits": "~2.0.3", 871 | "isarray": "~1.0.0", 872 | "process-nextick-args": "~2.0.0", 873 | "safe-buffer": "~5.1.1", 874 | "string_decoder": "~1.1.1", 875 | "util-deprecate": "~1.0.1" 876 | } 877 | }, 878 | "safe-buffer": { 879 | "version": "5.1.2", 880 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 881 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 882 | }, 883 | "string_decoder": { 884 | "version": "1.1.1", 885 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 886 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 887 | "requires": { 888 | "safe-buffer": "~5.1.0" 889 | } 890 | } 891 | } 892 | }, 893 | "commist": { 894 | "version": "1.1.0", 895 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 896 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 897 | "requires": { 898 | "leven": "^2.1.0", 899 | "minimist": "^1.1.0" 900 | } 901 | }, 902 | "concat-map": { 903 | "version": "0.0.1", 904 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 905 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 906 | }, 907 | "concat-stream": { 908 | "version": "2.0.0", 909 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 910 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 911 | "requires": { 912 | "buffer-from": "^1.0.0", 913 | "inherits": "^2.0.3", 914 | "readable-stream": "^3.0.2", 915 | "typedarray": "^0.0.6" 916 | } 917 | }, 918 | "core-util-is": { 919 | "version": "1.0.2", 920 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 921 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 922 | }, 923 | "debug": { 924 | "version": "4.3.1", 925 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 926 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 927 | "requires": { 928 | "ms": "2.1.2" 929 | } 930 | }, 931 | "dotenv": { 932 | "version": "8.2.0", 933 | "resolved": "https://registry.npmjs.org/dotenv/-/dotenv-8.2.0.tgz", 934 | "integrity": "sha512-8sJ78ElpbDJBHNeBzUbUVLsqKdccaa/BXF1uPTw3GrvQTBgrQrtObr2mUrE38vzYd8cEv+m/JBfDLioYcfXoaw==" 935 | }, 936 | "duplexify": { 937 | "version": "3.7.1", 938 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 939 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 940 | "requires": { 941 | "end-of-stream": "^1.0.0", 942 | "inherits": "^2.0.1", 943 | "readable-stream": "^2.0.0", 944 | "stream-shift": "^1.0.0" 945 | }, 946 | "dependencies": { 947 | "readable-stream": { 948 | "version": "2.3.7", 949 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 950 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 951 | "requires": { 952 | "core-util-is": "~1.0.0", 953 | "inherits": "~2.0.3", 954 | "isarray": "~1.0.0", 955 | "process-nextick-args": "~2.0.0", 956 | "safe-buffer": "~5.1.1", 957 | "string_decoder": "~1.1.1", 958 | "util-deprecate": "~1.0.1" 959 | } 960 | }, 961 | "safe-buffer": { 962 | "version": "5.1.2", 963 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 964 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 965 | }, 966 | "string_decoder": { 967 | "version": "1.1.1", 968 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 969 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 970 | "requires": { 971 | "safe-buffer": "~5.1.0" 972 | } 973 | } 974 | } 975 | }, 976 | "end-of-stream": { 977 | "version": "1.4.4", 978 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 979 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 980 | "requires": { 981 | "once": "^1.4.0" 982 | } 983 | }, 984 | "extend": { 985 | "version": "3.0.2", 986 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 987 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 988 | }, 989 | "fs.realpath": { 990 | "version": "1.0.0", 991 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 992 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 993 | }, 994 | "glob": { 995 | "version": "7.1.6", 996 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 997 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 998 | "requires": { 999 | "fs.realpath": "^1.0.0", 1000 | "inflight": "^1.0.4", 1001 | "inherits": "2", 1002 | "minimatch": "^3.0.4", 1003 | "once": "^1.3.0", 1004 | "path-is-absolute": "^1.0.0" 1005 | } 1006 | }, 1007 | "glob-parent": { 1008 | "version": "3.1.0", 1009 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 1010 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 1011 | "requires": { 1012 | "is-glob": "^3.1.0", 1013 | "path-dirname": "^1.0.0" 1014 | } 1015 | }, 1016 | "glob-stream": { 1017 | "version": "6.1.0", 1018 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 1019 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 1020 | "requires": { 1021 | "extend": "^3.0.0", 1022 | "glob": "^7.1.1", 1023 | "glob-parent": "^3.1.0", 1024 | "is-negated-glob": "^1.0.0", 1025 | "ordered-read-streams": "^1.0.0", 1026 | "pumpify": "^1.3.5", 1027 | "readable-stream": "^2.1.5", 1028 | "remove-trailing-separator": "^1.0.1", 1029 | "to-absolute-glob": "^2.0.0", 1030 | "unique-stream": "^2.0.2" 1031 | }, 1032 | "dependencies": { 1033 | "readable-stream": { 1034 | "version": "2.3.7", 1035 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1036 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1037 | "requires": { 1038 | "core-util-is": "~1.0.0", 1039 | "inherits": "~2.0.3", 1040 | "isarray": "~1.0.0", 1041 | "process-nextick-args": "~2.0.0", 1042 | "safe-buffer": "~5.1.1", 1043 | "string_decoder": "~1.1.1", 1044 | "util-deprecate": "~1.0.1" 1045 | } 1046 | }, 1047 | "safe-buffer": { 1048 | "version": "5.1.2", 1049 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1050 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1051 | }, 1052 | "string_decoder": { 1053 | "version": "1.1.1", 1054 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1055 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1056 | "requires": { 1057 | "safe-buffer": "~5.1.0" 1058 | } 1059 | } 1060 | } 1061 | }, 1062 | "help-me": { 1063 | "version": "1.1.0", 1064 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", 1065 | "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", 1066 | "requires": { 1067 | "callback-stream": "^1.0.2", 1068 | "glob-stream": "^6.1.0", 1069 | "through2": "^2.0.1", 1070 | "xtend": "^4.0.0" 1071 | } 1072 | }, 1073 | "ieee754": { 1074 | "version": "1.2.1", 1075 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1076 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1077 | }, 1078 | "inflight": { 1079 | "version": "1.0.6", 1080 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1081 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1082 | "requires": { 1083 | "once": "^1.3.0", 1084 | "wrappy": "1" 1085 | } 1086 | }, 1087 | "inherits": { 1088 | "version": "2.0.4", 1089 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1090 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1091 | }, 1092 | "is-absolute": { 1093 | "version": "1.0.0", 1094 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1095 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1096 | "requires": { 1097 | "is-relative": "^1.0.0", 1098 | "is-windows": "^1.0.1" 1099 | } 1100 | }, 1101 | "is-extglob": { 1102 | "version": "2.1.1", 1103 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1104 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1105 | }, 1106 | "is-glob": { 1107 | "version": "3.1.0", 1108 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1109 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1110 | "requires": { 1111 | "is-extglob": "^2.1.0" 1112 | } 1113 | }, 1114 | "is-negated-glob": { 1115 | "version": "1.0.0", 1116 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 1117 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" 1118 | }, 1119 | "is-relative": { 1120 | "version": "1.0.0", 1121 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1122 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1123 | "requires": { 1124 | "is-unc-path": "^1.0.0" 1125 | } 1126 | }, 1127 | "is-unc-path": { 1128 | "version": "1.0.0", 1129 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1130 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1131 | "requires": { 1132 | "unc-path-regex": "^0.1.2" 1133 | } 1134 | }, 1135 | "is-windows": { 1136 | "version": "1.0.2", 1137 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1138 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1139 | }, 1140 | "isarray": { 1141 | "version": "1.0.0", 1142 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1143 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1144 | }, 1145 | "json-stable-stringify-without-jsonify": { 1146 | "version": "1.0.1", 1147 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1148 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 1149 | }, 1150 | "leven": { 1151 | "version": "2.1.0", 1152 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 1153 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" 1154 | }, 1155 | "minimatch": { 1156 | "version": "3.0.4", 1157 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1158 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1159 | "requires": { 1160 | "brace-expansion": "^1.1.7" 1161 | } 1162 | }, 1163 | "minimist": { 1164 | "version": "1.2.5", 1165 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1166 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1167 | }, 1168 | "mqtt": { 1169 | "version": "4.2.6", 1170 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.6.tgz", 1171 | "integrity": "sha512-GpxVObyOzL0CGPBqo6B04GinN8JLk12NRYAIkYvARd9ZCoJKevvOyCaWK6bdK/kFSDj3LPDnCsJbezzNlsi87Q==", 1172 | "requires": { 1173 | "commist": "^1.0.0", 1174 | "concat-stream": "^2.0.0", 1175 | "debug": "^4.1.1", 1176 | "help-me": "^1.0.1", 1177 | "inherits": "^2.0.3", 1178 | "minimist": "^1.2.5", 1179 | "mqtt-packet": "^6.6.0", 1180 | "pump": "^3.0.0", 1181 | "readable-stream": "^3.6.0", 1182 | "reinterval": "^1.1.0", 1183 | "split2": "^3.1.0", 1184 | "ws": "^7.3.1", 1185 | "xtend": "^4.0.2" 1186 | } 1187 | }, 1188 | "mqtt-packet": { 1189 | "version": "6.9.1", 1190 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.9.1.tgz", 1191 | "integrity": "sha512-0+u0ZoRj6H6AuzNY5d8qzXzyXmFI19gkdPRA14kGfKvbqYcpOL+HWUGHjtCxHqjm8CscwsH+dX0+Rxx4se5HSA==", 1192 | "requires": { 1193 | "bl": "^4.0.2", 1194 | "debug": "^4.1.1", 1195 | "process-nextick-args": "^2.0.1" 1196 | } 1197 | }, 1198 | "ms": { 1199 | "version": "2.1.2", 1200 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1201 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1202 | }, 1203 | "once": { 1204 | "version": "1.4.0", 1205 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1206 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1207 | "requires": { 1208 | "wrappy": "1" 1209 | } 1210 | }, 1211 | "ordered-read-streams": { 1212 | "version": "1.0.1", 1213 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 1214 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 1215 | "requires": { 1216 | "readable-stream": "^2.0.1" 1217 | }, 1218 | "dependencies": { 1219 | "readable-stream": { 1220 | "version": "2.3.7", 1221 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1222 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1223 | "requires": { 1224 | "core-util-is": "~1.0.0", 1225 | "inherits": "~2.0.3", 1226 | "isarray": "~1.0.0", 1227 | "process-nextick-args": "~2.0.0", 1228 | "safe-buffer": "~5.1.1", 1229 | "string_decoder": "~1.1.1", 1230 | "util-deprecate": "~1.0.1" 1231 | } 1232 | }, 1233 | "safe-buffer": { 1234 | "version": "5.1.2", 1235 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1236 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1237 | }, 1238 | "string_decoder": { 1239 | "version": "1.1.1", 1240 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1241 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1242 | "requires": { 1243 | "safe-buffer": "~5.1.0" 1244 | } 1245 | } 1246 | } 1247 | }, 1248 | "path-dirname": { 1249 | "version": "1.0.2", 1250 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1251 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 1252 | }, 1253 | "path-is-absolute": { 1254 | "version": "1.0.1", 1255 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1256 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1257 | }, 1258 | "path-to-regexp": { 1259 | "version": "6.2.0", 1260 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", 1261 | "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" 1262 | }, 1263 | "process-nextick-args": { 1264 | "version": "2.0.1", 1265 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1266 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1267 | }, 1268 | "pump": { 1269 | "version": "3.0.0", 1270 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1271 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1272 | "requires": { 1273 | "end-of-stream": "^1.1.0", 1274 | "once": "^1.3.1" 1275 | } 1276 | }, 1277 | "pumpify": { 1278 | "version": "1.5.1", 1279 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 1280 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 1281 | "requires": { 1282 | "duplexify": "^3.6.0", 1283 | "inherits": "^2.0.3", 1284 | "pump": "^2.0.0" 1285 | }, 1286 | "dependencies": { 1287 | "pump": { 1288 | "version": "2.0.1", 1289 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1290 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1291 | "requires": { 1292 | "end-of-stream": "^1.1.0", 1293 | "once": "^1.3.1" 1294 | } 1295 | } 1296 | } 1297 | }, 1298 | "readable-stream": { 1299 | "version": "3.6.0", 1300 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1301 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1302 | "requires": { 1303 | "inherits": "^2.0.3", 1304 | "string_decoder": "^1.1.1", 1305 | "util-deprecate": "^1.0.1" 1306 | } 1307 | }, 1308 | "reinterval": { 1309 | "version": "1.1.0", 1310 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 1311 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 1312 | }, 1313 | "remove-trailing-separator": { 1314 | "version": "1.1.0", 1315 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1316 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 1317 | }, 1318 | "safe-buffer": { 1319 | "version": "5.2.1", 1320 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1321 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1322 | }, 1323 | "split2": { 1324 | "version": "3.2.2", 1325 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 1326 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 1327 | "requires": { 1328 | "readable-stream": "^3.0.0" 1329 | } 1330 | }, 1331 | "stream-shift": { 1332 | "version": "1.0.1", 1333 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1334 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 1335 | }, 1336 | "string_decoder": { 1337 | "version": "1.3.0", 1338 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1339 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1340 | "requires": { 1341 | "safe-buffer": "~5.2.0" 1342 | } 1343 | }, 1344 | "through2": { 1345 | "version": "2.0.5", 1346 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1347 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1348 | "requires": { 1349 | "readable-stream": "~2.3.6", 1350 | "xtend": "~4.0.1" 1351 | }, 1352 | "dependencies": { 1353 | "readable-stream": { 1354 | "version": "2.3.7", 1355 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1356 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1357 | "requires": { 1358 | "core-util-is": "~1.0.0", 1359 | "inherits": "~2.0.3", 1360 | "isarray": "~1.0.0", 1361 | "process-nextick-args": "~2.0.0", 1362 | "safe-buffer": "~5.1.1", 1363 | "string_decoder": "~1.1.1", 1364 | "util-deprecate": "~1.0.1" 1365 | } 1366 | }, 1367 | "safe-buffer": { 1368 | "version": "5.1.2", 1369 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1370 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1371 | }, 1372 | "string_decoder": { 1373 | "version": "1.1.1", 1374 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1375 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1376 | "requires": { 1377 | "safe-buffer": "~5.1.0" 1378 | } 1379 | } 1380 | } 1381 | }, 1382 | "through2-filter": { 1383 | "version": "3.0.0", 1384 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 1385 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 1386 | "requires": { 1387 | "through2": "~2.0.0", 1388 | "xtend": "~4.0.0" 1389 | } 1390 | }, 1391 | "to-absolute-glob": { 1392 | "version": "2.0.2", 1393 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 1394 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 1395 | "requires": { 1396 | "is-absolute": "^1.0.0", 1397 | "is-negated-glob": "^1.0.0" 1398 | } 1399 | }, 1400 | "typedarray": { 1401 | "version": "0.0.6", 1402 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1403 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1404 | }, 1405 | "unc-path-regex": { 1406 | "version": "0.1.2", 1407 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 1408 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" 1409 | }, 1410 | "unique-stream": { 1411 | "version": "2.3.1", 1412 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 1413 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 1414 | "requires": { 1415 | "json-stable-stringify-without-jsonify": "^1.0.1", 1416 | "through2-filter": "^3.0.0" 1417 | } 1418 | }, 1419 | "util-deprecate": { 1420 | "version": "1.0.2", 1421 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1422 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1423 | }, 1424 | "wrappy": { 1425 | "version": "1.0.2", 1426 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1427 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1428 | }, 1429 | "ws": { 1430 | "version": "7.4.5", 1431 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", 1432 | "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", 1433 | "requires": {} 1434 | }, 1435 | "xtend": { 1436 | "version": "4.0.2", 1437 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1438 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1439 | } 1440 | } 1441 | } 1442 | -------------------------------------------------------------------------------- /packages/mesh2hass/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/mesh2hass", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@kabbi/routed-mqtt": "^1.0.0", 14 | "debug": "^4.3.1", 15 | "dotenv": "^8.2.0" 16 | } 17 | } 18 | -------------------------------------------------------------------------------- /packages/mesh2mqtt/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | keychain.json 3 | -------------------------------------------------------------------------------- /packages/mesh2mqtt/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:lts-alpine 2 | 3 | WORKDIR /usr/src/app 4 | 5 | COPY package*.json ./ 6 | RUN apk add --no-cache --virtual .gyp python3 make g++ \ 7 | && npm install --no-optional \ 8 | && apk del .gyp 9 | 10 | COPY *.js . 11 | COPY models ./models/ 12 | CMD ["node", "index.js"] 13 | -------------------------------------------------------------------------------- /packages/mesh2mqtt/index.js: -------------------------------------------------------------------------------- 1 | const fs = require('fs'); 2 | const debug = require('debug')('app'); 3 | const { 4 | NetworkLayer, 5 | AccessLayer, 6 | UpperLayer, 7 | LowerLayer, 8 | Keychain, 9 | } = require('@kabbi/ble-mesh'); 10 | const { kebabCase } = require('lodash'); 11 | const mqtt = require('@kabbi/routed-mqtt'); 12 | require('dotenv').config(); 13 | 14 | const TypeToTopic = require('./topics'); 15 | 16 | const client = mqtt.connect(process.env.MQTT_URL || 'mqtt://localhost'); 17 | const prefix = process.env.MESH_MQTT_PREFIX || 'mesh2mqtt'; 18 | const ownMeshAddr = +process.env.MESH_OUTGOING_ADDR || 0x7fc; 19 | let bridgeAddr = process.env.MESH_DEFAULT_BRIDGE_NAME || 'rpi'; 20 | 21 | const keychain = new Keychain(); 22 | keychain.load(require('./keychain.json')); 23 | 24 | // Setup mesh stuff 25 | const networkLayer = new NetworkLayer(keychain); 26 | const lowerLayer = new LowerLayer(keychain); 27 | const upperLayer = new UpperLayer(); 28 | const accessLayer = new AccessLayer(); 29 | 30 | // Connect all the layers together 31 | networkLayer.on('incoming', (networkMessage) => { 32 | lowerLayer.handleIncoming(networkMessage); 33 | }); 34 | lowerLayer.on('incoming', (lowerTransportMessage) => { 35 | upperLayer.handleIncoming(lowerTransportMessage); 36 | }); 37 | upperLayer.on('incoming', (accessMessage) => { 38 | accessLayer.handleIncoming(accessMessage); 39 | }); 40 | accessLayer.on('outgoing', (accessMessage) => { 41 | upperLayer.handleOutgoing(accessMessage); 42 | }); 43 | upperLayer.on('outgoing', (lowerTransportMessage) => { 44 | lowerLayer.handleOutgoing(lowerTransportMessage); 45 | }); 46 | lowerLayer.on('outgoing', (networkMessage) => { 47 | networkLayer.handleOutgoing(networkMessage); 48 | }); 49 | 50 | // Register all custom model handlers 51 | for (const fileName of fs.readdirSync('./models')) { 52 | try { 53 | let m = require(`./models/${fileName}`); 54 | accessLayer.registerModel(m); 55 | } catch (error) { 56 | console.error(`Cannot register module ${fileName}`, error); 57 | } 58 | } 59 | 60 | // Handle all the mqtt topics 61 | client.once('connect', async () => { 62 | await client.publish(`${prefix}/online`, 'true'); 63 | 64 | // Route meshbridge messages from mqtt to mesh stack 65 | await client.handle('meshbridge/:addr/msg', (match, payload) => { 66 | bridgeAddr = match.params.addr; 67 | networkLayer.handleIncoming(payload); 68 | }); 69 | 70 | // Route meshbridge messages from mesh stack to mqtt 71 | networkLayer.on('outgoing', async (payload) => { 72 | debug('sending', payload.toString('hex')); 73 | await client.publish(`meshbridge/${bridgeAddr}/msg/send`, payload); 74 | }); 75 | 76 | // Route model access messages from mesh to mqtt 77 | accessLayer.on('incoming', async (msg) => { 78 | debug('incoming message', msg); 79 | const addr = msg.meta.from.toString(16).padStart(4, '0'); 80 | 81 | // Raw unprocessed message 82 | await client.publish(`${prefix}/rx`, JSON.stringify(msg)); 83 | 84 | // Fancy topic and only payload 85 | const topic = TypeToTopic[msg.type]; 86 | if (topic) { 87 | await client.publish( 88 | `${prefix}/${addr}/models/${topic.join('/')}`, 89 | JSON.stringify(msg.payload), 90 | ); 91 | } 92 | }); 93 | 94 | // Route model access messages from mqtt to mesh 95 | await client.handleJSON(`${prefix}/tx`, (match, payload) => { 96 | accessLayer.handleOutgoing(payload); 97 | }); 98 | 99 | // Same as above, but with fancy topic and sane defaults 100 | await client.handle( 101 | `${prefix}/:addr/models/:model/:op/send`, 102 | (match, payload) => { 103 | const { addr, model, op } = match.params; 104 | 105 | const type = Object.keys(TypeToTopic).find((key) => { 106 | const [modelName, opName] = TypeToTopic[key]; 107 | return modelName === model && opName === op; 108 | }); 109 | 110 | accessLayer.handleOutgoing({ 111 | type, 112 | appKey: 'mi', 113 | payload: JSON.parse(payload), 114 | meta: { 115 | to: Number.parseInt(addr, 16), 116 | from: ownMeshAddr, 117 | ttl: 5, 118 | }, 119 | }); 120 | }, 121 | ); 122 | }); 123 | -------------------------------------------------------------------------------- /packages/mesh2mqtt/keychain.json.example: -------------------------------------------------------------------------------- 1 | { 2 | "network": "1234567890abcdef1234567890abcdef", 3 | "devices": { 4 | "1": "1234567890abcdef1234567890abcdef", 5 | "2": "1234567890abcdef1234567890abcdef", 6 | "1234": "1234567890abcdef1234567890abcdef" 7 | }, 8 | "apps": { 9 | "blinker": "1234567890abcdef1234567890abcdef", 10 | "living-room": "1234567890abcdef1234567890abcdef" 11 | } 12 | } -------------------------------------------------------------------------------- /packages/mesh2mqtt/models/kabbi-kv.js: -------------------------------------------------------------------------------- 1 | const jBinary = require('jbinary'); 2 | 3 | exports.messages = { 4 | 0xe03298: 'KabbiKVSetInt', 5 | 0xe13298: 'KabbiKVSetIntIndexed', 6 | 0xe23298: 'KabbiKVSetString', 7 | 0xe33298: 'KabbiKVSetStringIndexed', 8 | 0xe43298: 'KabbiKVSetStatus', 9 | 0xe53298: 'KabbiKVGetInt', 10 | 0xe63298: 'KabbiKVGetIntIndexed', 11 | 0xe73298: 'KabbiKVGetIntStatus', 12 | 0xe83298: 'KabbiKVGetString', 13 | 0xe93298: 'KabbiKVGetStringIndexed', 14 | 0xea3298: 'KabbiKVGetStringStatus', 15 | }; 16 | 17 | exports.typeSet = { 18 | KabbiKVSetInt: { 19 | value: 'uint32', 20 | key: 'string', 21 | }, 22 | KabbiKVSetIntIndexed: { 23 | key: 'uint8', 24 | value: 'uint32', 25 | }, 26 | KabbiKVSetStatus: {}, 27 | }; 28 | -------------------------------------------------------------------------------- /packages/mesh2mqtt/models/kabbi-strip.js: -------------------------------------------------------------------------------- 1 | const jBinary = require('jbinary'); 2 | 3 | exports.messages = { 4 | 0xc43298: 'KabbiStripStartEffect', 5 | 0xc53298: 'KabbiStripStartEffectStatus', 6 | 0xc63298: 'KabbiStripStopEffect', 7 | 0xc73298: 'KabbiStripStopEffectStatus', 8 | 0xc83298: 'KabbiStripSetParam', 9 | 0xc93298: 'KabbiStripGetParam', 10 | 0xca3298: 'KabbiStripParamStatus', 11 | }; 12 | 13 | exports.typeSet = { 14 | KabbiStripStartEffect: { 15 | flags: 'uint8', 16 | name_len: 'uint8', 17 | name: 'string', 18 | }, 19 | KabbiStripStartEffectStatus: { 20 | pid: 'uint8', 21 | }, 22 | KabbiStripStopEffect: { 23 | pid: 'uint8', 24 | }, 25 | KabbiStripStopEffectStatus: { 26 | result: 'uint8', 27 | }, 28 | KabbiStripSetParam: { 29 | value: 'uint32', 30 | key: 'string', 31 | }, 32 | KabbiStripGetParam: { 33 | key: 'string', 34 | }, 35 | KabbiStripParamStatus: { 36 | result: 'uint8', 37 | value: 'uint32', 38 | }, 39 | }; 40 | -------------------------------------------------------------------------------- /packages/mesh2mqtt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/mesh2mqtt", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "@kabbi/ble-mesh": "^1.0.7", 14 | "@kabbi/routed-mqtt": "^1.0.0", 15 | "debug": "^4.3.1", 16 | "dotenv": "^8.2.0", 17 | "jbinary": "^2.1.5", 18 | "lodash": "^4.17.21" 19 | } 20 | } 21 | -------------------------------------------------------------------------------- /packages/mesh2mqtt/topics.js: -------------------------------------------------------------------------------- 1 | // This maps model types and messages to mqtt topic names 2 | module.exports = { 3 | GenericOnOffGet: ['generic-onoff', 'get'], 4 | GenericOnOffSet: ['generic-onoff', 'set'], 5 | GenericOnOffStatus: ['generic-onoff', 'status'], 6 | GenericOnOffSetUnacknowledged: ['generic-onoff', 'set-unack'], 7 | GenericLevelGet: ['generic-level', 'get'], 8 | GenericLevelSet: ['generic-level', 'set'], 9 | GenericLevelStatus: ['generic-level', 'status'], 10 | GenericLevelSetUnacknowledged: ['generic-level', 'set-unack'], 11 | GenericBatteryStatus: ['generic-battery', 'status'], 12 | LightLightnessStatus: ['light-lightness', 'status'], 13 | LightLightnessSet: ['light-lightness', 'set'], 14 | LightLightnessSetUnacknowledged: ['light-lightness', 'set-unack'], 15 | LightCTLTemperatureStatus: ['light-ctl', 'temp-status'], 16 | LightCTLTemperatureSet: ['light-ctl', 'temp-set'], 17 | LightCTLTemperatureSetUnacknowledged: ['light-ctl', 'temp-set-unack'], 18 | LightHSLHueStatus: ['light-hsl', 'hue-status'], 19 | LightHSLHueSet: ['light-hsl', 'hue-set'], 20 | LightHSLSet: ['light-hsl', 'set'], 21 | LightHSLStatus: ['light-hsl', 'status'], 22 | SensorStatus: ['sensor', 'status'], 23 | SensorGet: ['sensor', 'get'], 24 | KabbiStripSetSegment: ['kabbi-strip', 'set-segment'], 25 | KabbiStripSetParam: ['kabbi-strip', 'set-param'], 26 | KabbiStripParamStatus: ['kabbi-strip', 'param-status'], 27 | KabbiKVSetInt: ['kabbi-kv', 'set-int'], 28 | KabbiKVSetIntIndexed: ['kabbi-kv', 'set-int-indexed'], 29 | KabbiKVSetStatus: ['kabbi-kv', 'set-status'], 30 | }; 31 | -------------------------------------------------------------------------------- /packages/routed-mqtt/index.js: -------------------------------------------------------------------------------- 1 | const mqtt = require('async-mqtt'); 2 | const { parse, match } = require('path-to-regexp'); 3 | 4 | const patchClient = (client) => { 5 | client.handle = async (topicPattern, handler) => { 6 | const tokens = parse(topicPattern); 7 | const matcher = match(topicPattern); 8 | 9 | const wildcardTopic = tokens 10 | .map((v) => { 11 | if (typeof v === 'string') { 12 | return v; 13 | } 14 | return `${v.prefix}+`; 15 | }) 16 | .join(''); 17 | 18 | await client.subscribe(wildcardTopic); 19 | client.on('message', (topic, payload) => { 20 | const matched = matcher(topic); 21 | if (!matched) { 22 | return; 23 | } 24 | 25 | handler(matched, payload); 26 | }); 27 | }; 28 | 29 | client.publishJSON = async (topic, payload) => { 30 | await client.publish(topic, JSON.stringify(payload)); 31 | }; 32 | 33 | client.handleJSON = async (topicPattern, handler) => { 34 | await client.handle(topicPattern, (match, payload) => 35 | handler(match, JSON.parse(payload)), 36 | ); 37 | }; 38 | }; 39 | 40 | module.exports = { 41 | connect: (...args) => { 42 | const client = mqtt.connect(...args); 43 | patchClient(client); 44 | return client; 45 | }, 46 | }; 47 | -------------------------------------------------------------------------------- /packages/routed-mqtt/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/routed-mqtt", 3 | "version": "1.0.0", 4 | "lockfileVersion": 2, 5 | "requires": true, 6 | "packages": { 7 | "": { 8 | "version": "1.0.0", 9 | "license": "ISC", 10 | "dependencies": { 11 | "async-mqtt": "^2.6.1", 12 | "path-to-regexp": "^6.2.0" 13 | } 14 | }, 15 | "node_modules/async-mqtt": { 16 | "version": "2.6.1", 17 | "resolved": "https://registry.npmjs.org/async-mqtt/-/async-mqtt-2.6.1.tgz", 18 | "integrity": "sha512-EkXAwRzwMaPC6ji0EvNeM5OMe6VjMhEKVJJUN7gu/hGzkcDpZtaI34nUwdwCMbjQB3pnuSOHqQMFKsUpg+D8kA==", 19 | "dependencies": { 20 | "mqtt": "^4.1.0" 21 | } 22 | }, 23 | "node_modules/balanced-match": { 24 | "version": "1.0.2", 25 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 26 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 27 | }, 28 | "node_modules/base64-js": { 29 | "version": "1.5.1", 30 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 31 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", 32 | "funding": [ 33 | { 34 | "type": "github", 35 | "url": "https://github.com/sponsors/feross" 36 | }, 37 | { 38 | "type": "patreon", 39 | "url": "https://www.patreon.com/feross" 40 | }, 41 | { 42 | "type": "consulting", 43 | "url": "https://feross.org/support" 44 | } 45 | ] 46 | }, 47 | "node_modules/bl": { 48 | "version": "4.1.0", 49 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 50 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 51 | "dependencies": { 52 | "buffer": "^5.5.0", 53 | "inherits": "^2.0.4", 54 | "readable-stream": "^3.4.0" 55 | } 56 | }, 57 | "node_modules/brace-expansion": { 58 | "version": "1.1.11", 59 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 60 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 61 | "dependencies": { 62 | "balanced-match": "^1.0.0", 63 | "concat-map": "0.0.1" 64 | } 65 | }, 66 | "node_modules/buffer": { 67 | "version": "5.7.1", 68 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 69 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 70 | "funding": [ 71 | { 72 | "type": "github", 73 | "url": "https://github.com/sponsors/feross" 74 | }, 75 | { 76 | "type": "patreon", 77 | "url": "https://www.patreon.com/feross" 78 | }, 79 | { 80 | "type": "consulting", 81 | "url": "https://feross.org/support" 82 | } 83 | ], 84 | "dependencies": { 85 | "base64-js": "^1.3.1", 86 | "ieee754": "^1.1.13" 87 | } 88 | }, 89 | "node_modules/buffer-from": { 90 | "version": "1.1.1", 91 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 92 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 93 | }, 94 | "node_modules/callback-stream": { 95 | "version": "1.1.0", 96 | "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", 97 | "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", 98 | "dependencies": { 99 | "inherits": "^2.0.1", 100 | "readable-stream": "> 1.0.0 < 3.0.0" 101 | } 102 | }, 103 | "node_modules/callback-stream/node_modules/readable-stream": { 104 | "version": "2.3.7", 105 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 106 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 107 | "dependencies": { 108 | "core-util-is": "~1.0.0", 109 | "inherits": "~2.0.3", 110 | "isarray": "~1.0.0", 111 | "process-nextick-args": "~2.0.0", 112 | "safe-buffer": "~5.1.1", 113 | "string_decoder": "~1.1.1", 114 | "util-deprecate": "~1.0.1" 115 | } 116 | }, 117 | "node_modules/callback-stream/node_modules/safe-buffer": { 118 | "version": "5.1.2", 119 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 120 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 121 | }, 122 | "node_modules/callback-stream/node_modules/string_decoder": { 123 | "version": "1.1.1", 124 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 125 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 126 | "dependencies": { 127 | "safe-buffer": "~5.1.0" 128 | } 129 | }, 130 | "node_modules/commist": { 131 | "version": "1.1.0", 132 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 133 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 134 | "dependencies": { 135 | "leven": "^2.1.0", 136 | "minimist": "^1.1.0" 137 | } 138 | }, 139 | "node_modules/concat-map": { 140 | "version": "0.0.1", 141 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 142 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 143 | }, 144 | "node_modules/concat-stream": { 145 | "version": "2.0.0", 146 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 147 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 148 | "engines": [ 149 | "node >= 6.0" 150 | ], 151 | "dependencies": { 152 | "buffer-from": "^1.0.0", 153 | "inherits": "^2.0.3", 154 | "readable-stream": "^3.0.2", 155 | "typedarray": "^0.0.6" 156 | } 157 | }, 158 | "node_modules/core-util-is": { 159 | "version": "1.0.2", 160 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 161 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 162 | }, 163 | "node_modules/debug": { 164 | "version": "4.3.1", 165 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 166 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 167 | "dependencies": { 168 | "ms": "2.1.2" 169 | }, 170 | "engines": { 171 | "node": ">=6.0" 172 | }, 173 | "peerDependenciesMeta": { 174 | "supports-color": { 175 | "optional": true 176 | } 177 | } 178 | }, 179 | "node_modules/duplexify": { 180 | "version": "3.7.1", 181 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 182 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 183 | "dependencies": { 184 | "end-of-stream": "^1.0.0", 185 | "inherits": "^2.0.1", 186 | "readable-stream": "^2.0.0", 187 | "stream-shift": "^1.0.0" 188 | } 189 | }, 190 | "node_modules/duplexify/node_modules/readable-stream": { 191 | "version": "2.3.7", 192 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 193 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 194 | "dependencies": { 195 | "core-util-is": "~1.0.0", 196 | "inherits": "~2.0.3", 197 | "isarray": "~1.0.0", 198 | "process-nextick-args": "~2.0.0", 199 | "safe-buffer": "~5.1.1", 200 | "string_decoder": "~1.1.1", 201 | "util-deprecate": "~1.0.1" 202 | } 203 | }, 204 | "node_modules/duplexify/node_modules/safe-buffer": { 205 | "version": "5.1.2", 206 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 207 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 208 | }, 209 | "node_modules/duplexify/node_modules/string_decoder": { 210 | "version": "1.1.1", 211 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 212 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 213 | "dependencies": { 214 | "safe-buffer": "~5.1.0" 215 | } 216 | }, 217 | "node_modules/end-of-stream": { 218 | "version": "1.4.4", 219 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 220 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 221 | "dependencies": { 222 | "once": "^1.4.0" 223 | } 224 | }, 225 | "node_modules/extend": { 226 | "version": "3.0.2", 227 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 228 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 229 | }, 230 | "node_modules/fs.realpath": { 231 | "version": "1.0.0", 232 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 233 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 234 | }, 235 | "node_modules/glob": { 236 | "version": "7.1.6", 237 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 238 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 239 | "dependencies": { 240 | "fs.realpath": "^1.0.0", 241 | "inflight": "^1.0.4", 242 | "inherits": "2", 243 | "minimatch": "^3.0.4", 244 | "once": "^1.3.0", 245 | "path-is-absolute": "^1.0.0" 246 | }, 247 | "engines": { 248 | "node": "*" 249 | }, 250 | "funding": { 251 | "url": "https://github.com/sponsors/isaacs" 252 | } 253 | }, 254 | "node_modules/glob-parent": { 255 | "version": "3.1.0", 256 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 257 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 258 | "dependencies": { 259 | "is-glob": "^3.1.0", 260 | "path-dirname": "^1.0.0" 261 | } 262 | }, 263 | "node_modules/glob-stream": { 264 | "version": "6.1.0", 265 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 266 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 267 | "dependencies": { 268 | "extend": "^3.0.0", 269 | "glob": "^7.1.1", 270 | "glob-parent": "^3.1.0", 271 | "is-negated-glob": "^1.0.0", 272 | "ordered-read-streams": "^1.0.0", 273 | "pumpify": "^1.3.5", 274 | "readable-stream": "^2.1.5", 275 | "remove-trailing-separator": "^1.0.1", 276 | "to-absolute-glob": "^2.0.0", 277 | "unique-stream": "^2.0.2" 278 | }, 279 | "engines": { 280 | "node": ">= 0.10" 281 | } 282 | }, 283 | "node_modules/glob-stream/node_modules/readable-stream": { 284 | "version": "2.3.7", 285 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 286 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 287 | "dependencies": { 288 | "core-util-is": "~1.0.0", 289 | "inherits": "~2.0.3", 290 | "isarray": "~1.0.0", 291 | "process-nextick-args": "~2.0.0", 292 | "safe-buffer": "~5.1.1", 293 | "string_decoder": "~1.1.1", 294 | "util-deprecate": "~1.0.1" 295 | } 296 | }, 297 | "node_modules/glob-stream/node_modules/safe-buffer": { 298 | "version": "5.1.2", 299 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 300 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 301 | }, 302 | "node_modules/glob-stream/node_modules/string_decoder": { 303 | "version": "1.1.1", 304 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 305 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 306 | "dependencies": { 307 | "safe-buffer": "~5.1.0" 308 | } 309 | }, 310 | "node_modules/help-me": { 311 | "version": "1.1.0", 312 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", 313 | "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", 314 | "dependencies": { 315 | "callback-stream": "^1.0.2", 316 | "glob-stream": "^6.1.0", 317 | "through2": "^2.0.1", 318 | "xtend": "^4.0.0" 319 | } 320 | }, 321 | "node_modules/ieee754": { 322 | "version": "1.2.1", 323 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 324 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", 325 | "funding": [ 326 | { 327 | "type": "github", 328 | "url": "https://github.com/sponsors/feross" 329 | }, 330 | { 331 | "type": "patreon", 332 | "url": "https://www.patreon.com/feross" 333 | }, 334 | { 335 | "type": "consulting", 336 | "url": "https://feross.org/support" 337 | } 338 | ] 339 | }, 340 | "node_modules/inflight": { 341 | "version": "1.0.6", 342 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 343 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 344 | "dependencies": { 345 | "once": "^1.3.0", 346 | "wrappy": "1" 347 | } 348 | }, 349 | "node_modules/inherits": { 350 | "version": "2.0.4", 351 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 352 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 353 | }, 354 | "node_modules/is-absolute": { 355 | "version": "1.0.0", 356 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 357 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 358 | "dependencies": { 359 | "is-relative": "^1.0.0", 360 | "is-windows": "^1.0.1" 361 | }, 362 | "engines": { 363 | "node": ">=0.10.0" 364 | } 365 | }, 366 | "node_modules/is-extglob": { 367 | "version": "2.1.1", 368 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 369 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=", 370 | "engines": { 371 | "node": ">=0.10.0" 372 | } 373 | }, 374 | "node_modules/is-glob": { 375 | "version": "3.1.0", 376 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 377 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 378 | "dependencies": { 379 | "is-extglob": "^2.1.0" 380 | }, 381 | "engines": { 382 | "node": ">=0.10.0" 383 | } 384 | }, 385 | "node_modules/is-negated-glob": { 386 | "version": "1.0.0", 387 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 388 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=", 389 | "engines": { 390 | "node": ">=0.10.0" 391 | } 392 | }, 393 | "node_modules/is-relative": { 394 | "version": "1.0.0", 395 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 396 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 397 | "dependencies": { 398 | "is-unc-path": "^1.0.0" 399 | }, 400 | "engines": { 401 | "node": ">=0.10.0" 402 | } 403 | }, 404 | "node_modules/is-unc-path": { 405 | "version": "1.0.0", 406 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 407 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 408 | "dependencies": { 409 | "unc-path-regex": "^0.1.2" 410 | }, 411 | "engines": { 412 | "node": ">=0.10.0" 413 | } 414 | }, 415 | "node_modules/is-windows": { 416 | "version": "1.0.2", 417 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 418 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==", 419 | "engines": { 420 | "node": ">=0.10.0" 421 | } 422 | }, 423 | "node_modules/isarray": { 424 | "version": "1.0.0", 425 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 426 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 427 | }, 428 | "node_modules/json-stable-stringify-without-jsonify": { 429 | "version": "1.0.1", 430 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 431 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 432 | }, 433 | "node_modules/leven": { 434 | "version": "2.1.0", 435 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 436 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=", 437 | "engines": { 438 | "node": ">=0.10.0" 439 | } 440 | }, 441 | "node_modules/minimatch": { 442 | "version": "3.0.4", 443 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 444 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 445 | "dependencies": { 446 | "brace-expansion": "^1.1.7" 447 | }, 448 | "engines": { 449 | "node": "*" 450 | } 451 | }, 452 | "node_modules/minimist": { 453 | "version": "1.2.5", 454 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 455 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 456 | }, 457 | "node_modules/mqtt": { 458 | "version": "4.2.6", 459 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.6.tgz", 460 | "integrity": "sha512-GpxVObyOzL0CGPBqo6B04GinN8JLk12NRYAIkYvARd9ZCoJKevvOyCaWK6bdK/kFSDj3LPDnCsJbezzNlsi87Q==", 461 | "dependencies": { 462 | "commist": "^1.0.0", 463 | "concat-stream": "^2.0.0", 464 | "debug": "^4.1.1", 465 | "help-me": "^1.0.1", 466 | "inherits": "^2.0.3", 467 | "minimist": "^1.2.5", 468 | "mqtt-packet": "^6.6.0", 469 | "pump": "^3.0.0", 470 | "readable-stream": "^3.6.0", 471 | "reinterval": "^1.1.0", 472 | "split2": "^3.1.0", 473 | "ws": "^7.3.1", 474 | "xtend": "^4.0.2" 475 | }, 476 | "bin": { 477 | "mqtt": "bin/mqtt.js", 478 | "mqtt_pub": "bin/pub.js", 479 | "mqtt_sub": "bin/sub.js" 480 | }, 481 | "engines": { 482 | "node": ">=10.0.0" 483 | } 484 | }, 485 | "node_modules/mqtt-packet": { 486 | "version": "6.9.1", 487 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.9.1.tgz", 488 | "integrity": "sha512-0+u0ZoRj6H6AuzNY5d8qzXzyXmFI19gkdPRA14kGfKvbqYcpOL+HWUGHjtCxHqjm8CscwsH+dX0+Rxx4se5HSA==", 489 | "dependencies": { 490 | "bl": "^4.0.2", 491 | "debug": "^4.1.1", 492 | "process-nextick-args": "^2.0.1" 493 | } 494 | }, 495 | "node_modules/ms": { 496 | "version": "2.1.2", 497 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 498 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 499 | }, 500 | "node_modules/once": { 501 | "version": "1.4.0", 502 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 503 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 504 | "dependencies": { 505 | "wrappy": "1" 506 | } 507 | }, 508 | "node_modules/ordered-read-streams": { 509 | "version": "1.0.1", 510 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 511 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 512 | "dependencies": { 513 | "readable-stream": "^2.0.1" 514 | } 515 | }, 516 | "node_modules/ordered-read-streams/node_modules/readable-stream": { 517 | "version": "2.3.7", 518 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 519 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 520 | "dependencies": { 521 | "core-util-is": "~1.0.0", 522 | "inherits": "~2.0.3", 523 | "isarray": "~1.0.0", 524 | "process-nextick-args": "~2.0.0", 525 | "safe-buffer": "~5.1.1", 526 | "string_decoder": "~1.1.1", 527 | "util-deprecate": "~1.0.1" 528 | } 529 | }, 530 | "node_modules/ordered-read-streams/node_modules/safe-buffer": { 531 | "version": "5.1.2", 532 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 533 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 534 | }, 535 | "node_modules/ordered-read-streams/node_modules/string_decoder": { 536 | "version": "1.1.1", 537 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 538 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 539 | "dependencies": { 540 | "safe-buffer": "~5.1.0" 541 | } 542 | }, 543 | "node_modules/path-dirname": { 544 | "version": "1.0.2", 545 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 546 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 547 | }, 548 | "node_modules/path-is-absolute": { 549 | "version": "1.0.1", 550 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 551 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=", 552 | "engines": { 553 | "node": ">=0.10.0" 554 | } 555 | }, 556 | "node_modules/path-to-regexp": { 557 | "version": "6.2.0", 558 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", 559 | "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" 560 | }, 561 | "node_modules/process-nextick-args": { 562 | "version": "2.0.1", 563 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 564 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 565 | }, 566 | "node_modules/pump": { 567 | "version": "3.0.0", 568 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 569 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 570 | "dependencies": { 571 | "end-of-stream": "^1.1.0", 572 | "once": "^1.3.1" 573 | } 574 | }, 575 | "node_modules/pumpify": { 576 | "version": "1.5.1", 577 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 578 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 579 | "dependencies": { 580 | "duplexify": "^3.6.0", 581 | "inherits": "^2.0.3", 582 | "pump": "^2.0.0" 583 | } 584 | }, 585 | "node_modules/pumpify/node_modules/pump": { 586 | "version": "2.0.1", 587 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 588 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 589 | "dependencies": { 590 | "end-of-stream": "^1.1.0", 591 | "once": "^1.3.1" 592 | } 593 | }, 594 | "node_modules/readable-stream": { 595 | "version": "3.6.0", 596 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 597 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 598 | "dependencies": { 599 | "inherits": "^2.0.3", 600 | "string_decoder": "^1.1.1", 601 | "util-deprecate": "^1.0.1" 602 | }, 603 | "engines": { 604 | "node": ">= 6" 605 | } 606 | }, 607 | "node_modules/reinterval": { 608 | "version": "1.1.0", 609 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 610 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 611 | }, 612 | "node_modules/remove-trailing-separator": { 613 | "version": "1.1.0", 614 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 615 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 616 | }, 617 | "node_modules/safe-buffer": { 618 | "version": "5.2.1", 619 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 620 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==", 621 | "funding": [ 622 | { 623 | "type": "github", 624 | "url": "https://github.com/sponsors/feross" 625 | }, 626 | { 627 | "type": "patreon", 628 | "url": "https://www.patreon.com/feross" 629 | }, 630 | { 631 | "type": "consulting", 632 | "url": "https://feross.org/support" 633 | } 634 | ] 635 | }, 636 | "node_modules/split2": { 637 | "version": "3.2.2", 638 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 639 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 640 | "dependencies": { 641 | "readable-stream": "^3.0.0" 642 | } 643 | }, 644 | "node_modules/stream-shift": { 645 | "version": "1.0.1", 646 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 647 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 648 | }, 649 | "node_modules/string_decoder": { 650 | "version": "1.3.0", 651 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 652 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 653 | "dependencies": { 654 | "safe-buffer": "~5.2.0" 655 | } 656 | }, 657 | "node_modules/through2": { 658 | "version": "2.0.5", 659 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 660 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 661 | "dependencies": { 662 | "readable-stream": "~2.3.6", 663 | "xtend": "~4.0.1" 664 | } 665 | }, 666 | "node_modules/through2-filter": { 667 | "version": "3.0.0", 668 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 669 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 670 | "dependencies": { 671 | "through2": "~2.0.0", 672 | "xtend": "~4.0.0" 673 | } 674 | }, 675 | "node_modules/through2/node_modules/readable-stream": { 676 | "version": "2.3.7", 677 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 678 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 679 | "dependencies": { 680 | "core-util-is": "~1.0.0", 681 | "inherits": "~2.0.3", 682 | "isarray": "~1.0.0", 683 | "process-nextick-args": "~2.0.0", 684 | "safe-buffer": "~5.1.1", 685 | "string_decoder": "~1.1.1", 686 | "util-deprecate": "~1.0.1" 687 | } 688 | }, 689 | "node_modules/through2/node_modules/safe-buffer": { 690 | "version": "5.1.2", 691 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 692 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 693 | }, 694 | "node_modules/through2/node_modules/string_decoder": { 695 | "version": "1.1.1", 696 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 697 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 698 | "dependencies": { 699 | "safe-buffer": "~5.1.0" 700 | } 701 | }, 702 | "node_modules/to-absolute-glob": { 703 | "version": "2.0.2", 704 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 705 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 706 | "dependencies": { 707 | "is-absolute": "^1.0.0", 708 | "is-negated-glob": "^1.0.0" 709 | }, 710 | "engines": { 711 | "node": ">=0.10.0" 712 | } 713 | }, 714 | "node_modules/typedarray": { 715 | "version": "0.0.6", 716 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 717 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 718 | }, 719 | "node_modules/unc-path-regex": { 720 | "version": "0.1.2", 721 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 722 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=", 723 | "engines": { 724 | "node": ">=0.10.0" 725 | } 726 | }, 727 | "node_modules/unique-stream": { 728 | "version": "2.3.1", 729 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 730 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 731 | "dependencies": { 732 | "json-stable-stringify-without-jsonify": "^1.0.1", 733 | "through2-filter": "^3.0.0" 734 | } 735 | }, 736 | "node_modules/util-deprecate": { 737 | "version": "1.0.2", 738 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 739 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 740 | }, 741 | "node_modules/wrappy": { 742 | "version": "1.0.2", 743 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 744 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 745 | }, 746 | "node_modules/ws": { 747 | "version": "7.4.5", 748 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", 749 | "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", 750 | "engines": { 751 | "node": ">=8.3.0" 752 | }, 753 | "peerDependencies": { 754 | "bufferutil": "^4.0.1", 755 | "utf-8-validate": "^5.0.2" 756 | }, 757 | "peerDependenciesMeta": { 758 | "bufferutil": { 759 | "optional": true 760 | }, 761 | "utf-8-validate": { 762 | "optional": true 763 | } 764 | } 765 | }, 766 | "node_modules/xtend": { 767 | "version": "4.0.2", 768 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 769 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", 770 | "engines": { 771 | "node": ">=0.4" 772 | } 773 | } 774 | }, 775 | "dependencies": { 776 | "async-mqtt": { 777 | "version": "2.6.1", 778 | "resolved": "https://registry.npmjs.org/async-mqtt/-/async-mqtt-2.6.1.tgz", 779 | "integrity": "sha512-EkXAwRzwMaPC6ji0EvNeM5OMe6VjMhEKVJJUN7gu/hGzkcDpZtaI34nUwdwCMbjQB3pnuSOHqQMFKsUpg+D8kA==", 780 | "requires": { 781 | "mqtt": "^4.1.0" 782 | } 783 | }, 784 | "balanced-match": { 785 | "version": "1.0.2", 786 | "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", 787 | "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" 788 | }, 789 | "base64-js": { 790 | "version": "1.5.1", 791 | "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", 792 | "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==" 793 | }, 794 | "bl": { 795 | "version": "4.1.0", 796 | "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", 797 | "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", 798 | "requires": { 799 | "buffer": "^5.5.0", 800 | "inherits": "^2.0.4", 801 | "readable-stream": "^3.4.0" 802 | } 803 | }, 804 | "brace-expansion": { 805 | "version": "1.1.11", 806 | "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", 807 | "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", 808 | "requires": { 809 | "balanced-match": "^1.0.0", 810 | "concat-map": "0.0.1" 811 | } 812 | }, 813 | "buffer": { 814 | "version": "5.7.1", 815 | "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", 816 | "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", 817 | "requires": { 818 | "base64-js": "^1.3.1", 819 | "ieee754": "^1.1.13" 820 | } 821 | }, 822 | "buffer-from": { 823 | "version": "1.1.1", 824 | "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz", 825 | "integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==" 826 | }, 827 | "callback-stream": { 828 | "version": "1.1.0", 829 | "resolved": "https://registry.npmjs.org/callback-stream/-/callback-stream-1.1.0.tgz", 830 | "integrity": "sha1-RwGlEmbwbgbqpx/BcjOCLYdfSQg=", 831 | "requires": { 832 | "inherits": "^2.0.1", 833 | "readable-stream": "> 1.0.0 < 3.0.0" 834 | }, 835 | "dependencies": { 836 | "readable-stream": { 837 | "version": "2.3.7", 838 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 839 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 840 | "requires": { 841 | "core-util-is": "~1.0.0", 842 | "inherits": "~2.0.3", 843 | "isarray": "~1.0.0", 844 | "process-nextick-args": "~2.0.0", 845 | "safe-buffer": "~5.1.1", 846 | "string_decoder": "~1.1.1", 847 | "util-deprecate": "~1.0.1" 848 | } 849 | }, 850 | "safe-buffer": { 851 | "version": "5.1.2", 852 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 853 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 854 | }, 855 | "string_decoder": { 856 | "version": "1.1.1", 857 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 858 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 859 | "requires": { 860 | "safe-buffer": "~5.1.0" 861 | } 862 | } 863 | } 864 | }, 865 | "commist": { 866 | "version": "1.1.0", 867 | "resolved": "https://registry.npmjs.org/commist/-/commist-1.1.0.tgz", 868 | "integrity": "sha512-rraC8NXWOEjhADbZe9QBNzLAN5Q3fsTPQtBV+fEVj6xKIgDgNiEVE6ZNfHpZOqfQ21YUzfVNUXLOEZquYvQPPg==", 869 | "requires": { 870 | "leven": "^2.1.0", 871 | "minimist": "^1.1.0" 872 | } 873 | }, 874 | "concat-map": { 875 | "version": "0.0.1", 876 | "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", 877 | "integrity": "sha1-2Klr13/Wjfd5OnMDajug1UBdR3s=" 878 | }, 879 | "concat-stream": { 880 | "version": "2.0.0", 881 | "resolved": "https://registry.npmjs.org/concat-stream/-/concat-stream-2.0.0.tgz", 882 | "integrity": "sha512-MWufYdFw53ccGjCA+Ol7XJYpAlW6/prSMzuPOTRnJGcGzuhLn4Scrz7qf6o8bROZ514ltazcIFJZevcfbo0x7A==", 883 | "requires": { 884 | "buffer-from": "^1.0.0", 885 | "inherits": "^2.0.3", 886 | "readable-stream": "^3.0.2", 887 | "typedarray": "^0.0.6" 888 | } 889 | }, 890 | "core-util-is": { 891 | "version": "1.0.2", 892 | "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.2.tgz", 893 | "integrity": "sha1-tf1UIgqivFq1eqtxQMlAdUUDwac=" 894 | }, 895 | "debug": { 896 | "version": "4.3.1", 897 | "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.1.tgz", 898 | "integrity": "sha512-doEwdvm4PCeK4K3RQN2ZC2BYUBaxwLARCqZmMjtF8a51J2Rb0xpVloFRnCODwqjpwnAoao4pelN8l3RJdv3gRQ==", 899 | "requires": { 900 | "ms": "2.1.2" 901 | } 902 | }, 903 | "duplexify": { 904 | "version": "3.7.1", 905 | "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-3.7.1.tgz", 906 | "integrity": "sha512-07z8uv2wMyS51kKhD1KsdXJg5WQ6t93RneqRxUHnskXVtlYYkLqM0gqStQZ3pj073g687jPCHrqNfCzawLYh5g==", 907 | "requires": { 908 | "end-of-stream": "^1.0.0", 909 | "inherits": "^2.0.1", 910 | "readable-stream": "^2.0.0", 911 | "stream-shift": "^1.0.0" 912 | }, 913 | "dependencies": { 914 | "readable-stream": { 915 | "version": "2.3.7", 916 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 917 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 918 | "requires": { 919 | "core-util-is": "~1.0.0", 920 | "inherits": "~2.0.3", 921 | "isarray": "~1.0.0", 922 | "process-nextick-args": "~2.0.0", 923 | "safe-buffer": "~5.1.1", 924 | "string_decoder": "~1.1.1", 925 | "util-deprecate": "~1.0.1" 926 | } 927 | }, 928 | "safe-buffer": { 929 | "version": "5.1.2", 930 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 931 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 932 | }, 933 | "string_decoder": { 934 | "version": "1.1.1", 935 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 936 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 937 | "requires": { 938 | "safe-buffer": "~5.1.0" 939 | } 940 | } 941 | } 942 | }, 943 | "end-of-stream": { 944 | "version": "1.4.4", 945 | "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", 946 | "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", 947 | "requires": { 948 | "once": "^1.4.0" 949 | } 950 | }, 951 | "extend": { 952 | "version": "3.0.2", 953 | "resolved": "https://registry.npmjs.org/extend/-/extend-3.0.2.tgz", 954 | "integrity": "sha512-fjquC59cD7CyW6urNXK0FBufkZcoiGG80wTuPujX590cB5Ttln20E2UB4S/WARVqhXffZl2LNgS+gQdPIIim/g==" 955 | }, 956 | "fs.realpath": { 957 | "version": "1.0.0", 958 | "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", 959 | "integrity": "sha1-FQStJSMVjKpA20onh8sBQRmU6k8=" 960 | }, 961 | "glob": { 962 | "version": "7.1.6", 963 | "resolved": "https://registry.npmjs.org/glob/-/glob-7.1.6.tgz", 964 | "integrity": "sha512-LwaxwyZ72Lk7vZINtNNrywX0ZuLyStrdDtabefZKAY5ZGJhVtgdznluResxNmPitE0SAO+O26sWTHeKSI2wMBA==", 965 | "requires": { 966 | "fs.realpath": "^1.0.0", 967 | "inflight": "^1.0.4", 968 | "inherits": "2", 969 | "minimatch": "^3.0.4", 970 | "once": "^1.3.0", 971 | "path-is-absolute": "^1.0.0" 972 | } 973 | }, 974 | "glob-parent": { 975 | "version": "3.1.0", 976 | "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-3.1.0.tgz", 977 | "integrity": "sha1-nmr2KZ2NO9K9QEMIMr0RPfkGxa4=", 978 | "requires": { 979 | "is-glob": "^3.1.0", 980 | "path-dirname": "^1.0.0" 981 | } 982 | }, 983 | "glob-stream": { 984 | "version": "6.1.0", 985 | "resolved": "https://registry.npmjs.org/glob-stream/-/glob-stream-6.1.0.tgz", 986 | "integrity": "sha1-cEXJlBOz65SIjYOrRtC0BMx73eQ=", 987 | "requires": { 988 | "extend": "^3.0.0", 989 | "glob": "^7.1.1", 990 | "glob-parent": "^3.1.0", 991 | "is-negated-glob": "^1.0.0", 992 | "ordered-read-streams": "^1.0.0", 993 | "pumpify": "^1.3.5", 994 | "readable-stream": "^2.1.5", 995 | "remove-trailing-separator": "^1.0.1", 996 | "to-absolute-glob": "^2.0.0", 997 | "unique-stream": "^2.0.2" 998 | }, 999 | "dependencies": { 1000 | "readable-stream": { 1001 | "version": "2.3.7", 1002 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1003 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1004 | "requires": { 1005 | "core-util-is": "~1.0.0", 1006 | "inherits": "~2.0.3", 1007 | "isarray": "~1.0.0", 1008 | "process-nextick-args": "~2.0.0", 1009 | "safe-buffer": "~5.1.1", 1010 | "string_decoder": "~1.1.1", 1011 | "util-deprecate": "~1.0.1" 1012 | } 1013 | }, 1014 | "safe-buffer": { 1015 | "version": "5.1.2", 1016 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1017 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1018 | }, 1019 | "string_decoder": { 1020 | "version": "1.1.1", 1021 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1022 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1023 | "requires": { 1024 | "safe-buffer": "~5.1.0" 1025 | } 1026 | } 1027 | } 1028 | }, 1029 | "help-me": { 1030 | "version": "1.1.0", 1031 | "resolved": "https://registry.npmjs.org/help-me/-/help-me-1.1.0.tgz", 1032 | "integrity": "sha1-jy1QjQYAtKRW2i8IZVbn5cBWo8Y=", 1033 | "requires": { 1034 | "callback-stream": "^1.0.2", 1035 | "glob-stream": "^6.1.0", 1036 | "through2": "^2.0.1", 1037 | "xtend": "^4.0.0" 1038 | } 1039 | }, 1040 | "ieee754": { 1041 | "version": "1.2.1", 1042 | "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", 1043 | "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==" 1044 | }, 1045 | "inflight": { 1046 | "version": "1.0.6", 1047 | "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", 1048 | "integrity": "sha1-Sb1jMdfQLQwJvJEKEHW6gWW1bfk=", 1049 | "requires": { 1050 | "once": "^1.3.0", 1051 | "wrappy": "1" 1052 | } 1053 | }, 1054 | "inherits": { 1055 | "version": "2.0.4", 1056 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", 1057 | "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" 1058 | }, 1059 | "is-absolute": { 1060 | "version": "1.0.0", 1061 | "resolved": "https://registry.npmjs.org/is-absolute/-/is-absolute-1.0.0.tgz", 1062 | "integrity": "sha512-dOWoqflvcydARa360Gvv18DZ/gRuHKi2NU/wU5X1ZFzdYfH29nkiNZsF3mp4OJ3H4yo9Mx8A/uAGNzpzPN3yBA==", 1063 | "requires": { 1064 | "is-relative": "^1.0.0", 1065 | "is-windows": "^1.0.1" 1066 | } 1067 | }, 1068 | "is-extglob": { 1069 | "version": "2.1.1", 1070 | "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", 1071 | "integrity": "sha1-qIwCU1eR8C7TfHahueqXc8gz+MI=" 1072 | }, 1073 | "is-glob": { 1074 | "version": "3.1.0", 1075 | "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-3.1.0.tgz", 1076 | "integrity": "sha1-e6WuJCF4BKxwcHuWkiVnSGzD6Eo=", 1077 | "requires": { 1078 | "is-extglob": "^2.1.0" 1079 | } 1080 | }, 1081 | "is-negated-glob": { 1082 | "version": "1.0.0", 1083 | "resolved": "https://registry.npmjs.org/is-negated-glob/-/is-negated-glob-1.0.0.tgz", 1084 | "integrity": "sha1-aRC8pdqMleeEtXUbl2z1oQ/uNtI=" 1085 | }, 1086 | "is-relative": { 1087 | "version": "1.0.0", 1088 | "resolved": "https://registry.npmjs.org/is-relative/-/is-relative-1.0.0.tgz", 1089 | "integrity": "sha512-Kw/ReK0iqwKeu0MITLFuj0jbPAmEiOsIwyIXvvbfa6QfmN9pkD1M+8pdk7Rl/dTKbH34/XBFMbgD4iMJhLQbGA==", 1090 | "requires": { 1091 | "is-unc-path": "^1.0.0" 1092 | } 1093 | }, 1094 | "is-unc-path": { 1095 | "version": "1.0.0", 1096 | "resolved": "https://registry.npmjs.org/is-unc-path/-/is-unc-path-1.0.0.tgz", 1097 | "integrity": "sha512-mrGpVd0fs7WWLfVsStvgF6iEJnbjDFZh9/emhRDcGWTduTfNHd9CHeUwH3gYIjdbwo4On6hunkztwOaAw0yllQ==", 1098 | "requires": { 1099 | "unc-path-regex": "^0.1.2" 1100 | } 1101 | }, 1102 | "is-windows": { 1103 | "version": "1.0.2", 1104 | "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", 1105 | "integrity": "sha512-eXK1UInq2bPmjyX6e3VHIzMLobc4J94i4AWn+Hpq3OU5KkrRC96OAcR3PRJ/pGu6m8TRnBHP9dkXQVsT/COVIA==" 1106 | }, 1107 | "isarray": { 1108 | "version": "1.0.0", 1109 | "resolved": "https://registry.npmjs.org/isarray/-/isarray-1.0.0.tgz", 1110 | "integrity": "sha1-u5NdSFgsuhaMBoNJV6VKPgcSTxE=" 1111 | }, 1112 | "json-stable-stringify-without-jsonify": { 1113 | "version": "1.0.1", 1114 | "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", 1115 | "integrity": "sha1-nbe1lJatPzz+8wp1FC0tkwrXJlE=" 1116 | }, 1117 | "leven": { 1118 | "version": "2.1.0", 1119 | "resolved": "https://registry.npmjs.org/leven/-/leven-2.1.0.tgz", 1120 | "integrity": "sha1-wuep93IJTe6dNCAq6KzORoeHVYA=" 1121 | }, 1122 | "minimatch": { 1123 | "version": "3.0.4", 1124 | "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.0.4.tgz", 1125 | "integrity": "sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==", 1126 | "requires": { 1127 | "brace-expansion": "^1.1.7" 1128 | } 1129 | }, 1130 | "minimist": { 1131 | "version": "1.2.5", 1132 | "resolved": "https://registry.npmjs.org/minimist/-/minimist-1.2.5.tgz", 1133 | "integrity": "sha512-FM9nNUYrRBAELZQT3xeZQ7fmMOBg6nWNmJKTcgsJeaLstP/UODVpGsr5OhXhhXg6f+qtJ8uiZ+PUxkDWcgIXLw==" 1134 | }, 1135 | "mqtt": { 1136 | "version": "4.2.6", 1137 | "resolved": "https://registry.npmjs.org/mqtt/-/mqtt-4.2.6.tgz", 1138 | "integrity": "sha512-GpxVObyOzL0CGPBqo6B04GinN8JLk12NRYAIkYvARd9ZCoJKevvOyCaWK6bdK/kFSDj3LPDnCsJbezzNlsi87Q==", 1139 | "requires": { 1140 | "commist": "^1.0.0", 1141 | "concat-stream": "^2.0.0", 1142 | "debug": "^4.1.1", 1143 | "help-me": "^1.0.1", 1144 | "inherits": "^2.0.3", 1145 | "minimist": "^1.2.5", 1146 | "mqtt-packet": "^6.6.0", 1147 | "pump": "^3.0.0", 1148 | "readable-stream": "^3.6.0", 1149 | "reinterval": "^1.1.0", 1150 | "split2": "^3.1.0", 1151 | "ws": "^7.3.1", 1152 | "xtend": "^4.0.2" 1153 | } 1154 | }, 1155 | "mqtt-packet": { 1156 | "version": "6.9.1", 1157 | "resolved": "https://registry.npmjs.org/mqtt-packet/-/mqtt-packet-6.9.1.tgz", 1158 | "integrity": "sha512-0+u0ZoRj6H6AuzNY5d8qzXzyXmFI19gkdPRA14kGfKvbqYcpOL+HWUGHjtCxHqjm8CscwsH+dX0+Rxx4se5HSA==", 1159 | "requires": { 1160 | "bl": "^4.0.2", 1161 | "debug": "^4.1.1", 1162 | "process-nextick-args": "^2.0.1" 1163 | } 1164 | }, 1165 | "ms": { 1166 | "version": "2.1.2", 1167 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", 1168 | "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" 1169 | }, 1170 | "once": { 1171 | "version": "1.4.0", 1172 | "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", 1173 | "integrity": "sha1-WDsap3WWHUsROsF9nFC6753Xa9E=", 1174 | "requires": { 1175 | "wrappy": "1" 1176 | } 1177 | }, 1178 | "ordered-read-streams": { 1179 | "version": "1.0.1", 1180 | "resolved": "https://registry.npmjs.org/ordered-read-streams/-/ordered-read-streams-1.0.1.tgz", 1181 | "integrity": "sha1-d8DLN8QVJdZBZtmQ/61+xqDhNj4=", 1182 | "requires": { 1183 | "readable-stream": "^2.0.1" 1184 | }, 1185 | "dependencies": { 1186 | "readable-stream": { 1187 | "version": "2.3.7", 1188 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1189 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1190 | "requires": { 1191 | "core-util-is": "~1.0.0", 1192 | "inherits": "~2.0.3", 1193 | "isarray": "~1.0.0", 1194 | "process-nextick-args": "~2.0.0", 1195 | "safe-buffer": "~5.1.1", 1196 | "string_decoder": "~1.1.1", 1197 | "util-deprecate": "~1.0.1" 1198 | } 1199 | }, 1200 | "safe-buffer": { 1201 | "version": "5.1.2", 1202 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1203 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1204 | }, 1205 | "string_decoder": { 1206 | "version": "1.1.1", 1207 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1208 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1209 | "requires": { 1210 | "safe-buffer": "~5.1.0" 1211 | } 1212 | } 1213 | } 1214 | }, 1215 | "path-dirname": { 1216 | "version": "1.0.2", 1217 | "resolved": "https://registry.npmjs.org/path-dirname/-/path-dirname-1.0.2.tgz", 1218 | "integrity": "sha1-zDPSTVJeCZpTiMAzbG4yuRYGCeA=" 1219 | }, 1220 | "path-is-absolute": { 1221 | "version": "1.0.1", 1222 | "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", 1223 | "integrity": "sha1-F0uSaHNVNP+8es5r9TpanhtcX18=" 1224 | }, 1225 | "path-to-regexp": { 1226 | "version": "6.2.0", 1227 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-6.2.0.tgz", 1228 | "integrity": "sha512-f66KywYG6+43afgE/8j/GoiNyygk/bnoCbps++3ErRKsIYkGGupyv07R2Ok5m9i67Iqc+T2g1eAUGUPzWhYTyg==" 1229 | }, 1230 | "process-nextick-args": { 1231 | "version": "2.0.1", 1232 | "resolved": "https://registry.npmjs.org/process-nextick-args/-/process-nextick-args-2.0.1.tgz", 1233 | "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" 1234 | }, 1235 | "pump": { 1236 | "version": "3.0.0", 1237 | "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", 1238 | "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", 1239 | "requires": { 1240 | "end-of-stream": "^1.1.0", 1241 | "once": "^1.3.1" 1242 | } 1243 | }, 1244 | "pumpify": { 1245 | "version": "1.5.1", 1246 | "resolved": "https://registry.npmjs.org/pumpify/-/pumpify-1.5.1.tgz", 1247 | "integrity": "sha512-oClZI37HvuUJJxSKKrC17bZ9Cu0ZYhEAGPsPUy9KlMUmv9dKX2o77RUmq7f3XjIxbwyGwYzbzQ1L2Ks8sIradQ==", 1248 | "requires": { 1249 | "duplexify": "^3.6.0", 1250 | "inherits": "^2.0.3", 1251 | "pump": "^2.0.0" 1252 | }, 1253 | "dependencies": { 1254 | "pump": { 1255 | "version": "2.0.1", 1256 | "resolved": "https://registry.npmjs.org/pump/-/pump-2.0.1.tgz", 1257 | "integrity": "sha512-ruPMNRkN3MHP1cWJc9OWr+T/xDP0jhXYCLfJcBuX54hhfIBnaQmAUMfDcG4DM5UMWByBbJY69QSphm3jtDKIkA==", 1258 | "requires": { 1259 | "end-of-stream": "^1.1.0", 1260 | "once": "^1.3.1" 1261 | } 1262 | } 1263 | } 1264 | }, 1265 | "readable-stream": { 1266 | "version": "3.6.0", 1267 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", 1268 | "integrity": "sha512-BViHy7LKeTz4oNnkcLJ+lVSL6vpiFeX6/d3oSH8zCW7UxP2onchk+vTGB143xuFjHS3deTgkKoXXymXqymiIdA==", 1269 | "requires": { 1270 | "inherits": "^2.0.3", 1271 | "string_decoder": "^1.1.1", 1272 | "util-deprecate": "^1.0.1" 1273 | } 1274 | }, 1275 | "reinterval": { 1276 | "version": "1.1.0", 1277 | "resolved": "https://registry.npmjs.org/reinterval/-/reinterval-1.1.0.tgz", 1278 | "integrity": "sha1-M2Hs+jymwYKDOA3Qu5VG85D17Oc=" 1279 | }, 1280 | "remove-trailing-separator": { 1281 | "version": "1.1.0", 1282 | "resolved": "https://registry.npmjs.org/remove-trailing-separator/-/remove-trailing-separator-1.1.0.tgz", 1283 | "integrity": "sha1-wkvOKig62tW8P1jg1IJJuSN52O8=" 1284 | }, 1285 | "safe-buffer": { 1286 | "version": "5.2.1", 1287 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", 1288 | "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" 1289 | }, 1290 | "split2": { 1291 | "version": "3.2.2", 1292 | "resolved": "https://registry.npmjs.org/split2/-/split2-3.2.2.tgz", 1293 | "integrity": "sha512-9NThjpgZnifTkJpzTZ7Eue85S49QwpNhZTq6GRJwObb6jnLFNGB7Qm73V5HewTROPyxD0C29xqmaI68bQtV+hg==", 1294 | "requires": { 1295 | "readable-stream": "^3.0.0" 1296 | } 1297 | }, 1298 | "stream-shift": { 1299 | "version": "1.0.1", 1300 | "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", 1301 | "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" 1302 | }, 1303 | "string_decoder": { 1304 | "version": "1.3.0", 1305 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", 1306 | "integrity": "sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==", 1307 | "requires": { 1308 | "safe-buffer": "~5.2.0" 1309 | } 1310 | }, 1311 | "through2": { 1312 | "version": "2.0.5", 1313 | "resolved": "https://registry.npmjs.org/through2/-/through2-2.0.5.tgz", 1314 | "integrity": "sha512-/mrRod8xqpA+IHSLyGCQ2s8SPHiCDEeQJSep1jqLYeEUClOFG2Qsh+4FU6G9VeqpZnGW/Su8LQGc4YKni5rYSQ==", 1315 | "requires": { 1316 | "readable-stream": "~2.3.6", 1317 | "xtend": "~4.0.1" 1318 | }, 1319 | "dependencies": { 1320 | "readable-stream": { 1321 | "version": "2.3.7", 1322 | "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-2.3.7.tgz", 1323 | "integrity": "sha512-Ebho8K4jIbHAxnuxi7o42OrZgF/ZTNcsZj6nRKyUmkhLFq8CHItp/fy6hQZuZmP/n3yZ9VBUbp4zz/mX8hmYPw==", 1324 | "requires": { 1325 | "core-util-is": "~1.0.0", 1326 | "inherits": "~2.0.3", 1327 | "isarray": "~1.0.0", 1328 | "process-nextick-args": "~2.0.0", 1329 | "safe-buffer": "~5.1.1", 1330 | "string_decoder": "~1.1.1", 1331 | "util-deprecate": "~1.0.1" 1332 | } 1333 | }, 1334 | "safe-buffer": { 1335 | "version": "5.1.2", 1336 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 1337 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 1338 | }, 1339 | "string_decoder": { 1340 | "version": "1.1.1", 1341 | "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.1.1.tgz", 1342 | "integrity": "sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==", 1343 | "requires": { 1344 | "safe-buffer": "~5.1.0" 1345 | } 1346 | } 1347 | } 1348 | }, 1349 | "through2-filter": { 1350 | "version": "3.0.0", 1351 | "resolved": "https://registry.npmjs.org/through2-filter/-/through2-filter-3.0.0.tgz", 1352 | "integrity": "sha512-jaRjI2WxN3W1V8/FMZ9HKIBXixtiqs3SQSX4/YGIiP3gL6djW48VoZq9tDqeCWs3MT8YY5wb/zli8VW8snY1CA==", 1353 | "requires": { 1354 | "through2": "~2.0.0", 1355 | "xtend": "~4.0.0" 1356 | } 1357 | }, 1358 | "to-absolute-glob": { 1359 | "version": "2.0.2", 1360 | "resolved": "https://registry.npmjs.org/to-absolute-glob/-/to-absolute-glob-2.0.2.tgz", 1361 | "integrity": "sha1-GGX0PZ50sIItufFFt4z/fQ98hJs=", 1362 | "requires": { 1363 | "is-absolute": "^1.0.0", 1364 | "is-negated-glob": "^1.0.0" 1365 | } 1366 | }, 1367 | "typedarray": { 1368 | "version": "0.0.6", 1369 | "resolved": "https://registry.npmjs.org/typedarray/-/typedarray-0.0.6.tgz", 1370 | "integrity": "sha1-hnrHTjhkGHsdPUfZlqeOxciDB3c=" 1371 | }, 1372 | "unc-path-regex": { 1373 | "version": "0.1.2", 1374 | "resolved": "https://registry.npmjs.org/unc-path-regex/-/unc-path-regex-0.1.2.tgz", 1375 | "integrity": "sha1-5z3T17DXxe2G+6xrCufYxqadUPo=" 1376 | }, 1377 | "unique-stream": { 1378 | "version": "2.3.1", 1379 | "resolved": "https://registry.npmjs.org/unique-stream/-/unique-stream-2.3.1.tgz", 1380 | "integrity": "sha512-2nY4TnBE70yoxHkDli7DMazpWiP7xMdCYqU2nBRO0UB+ZpEkGsSija7MvmvnZFUeC+mrgiUfcHSr3LmRFIg4+A==", 1381 | "requires": { 1382 | "json-stable-stringify-without-jsonify": "^1.0.1", 1383 | "through2-filter": "^3.0.0" 1384 | } 1385 | }, 1386 | "util-deprecate": { 1387 | "version": "1.0.2", 1388 | "resolved": "https://registry.npmjs.org/util-deprecate/-/util-deprecate-1.0.2.tgz", 1389 | "integrity": "sha1-RQ1Nyfpw3nMnYvvS1KKJgUGaDM8=" 1390 | }, 1391 | "wrappy": { 1392 | "version": "1.0.2", 1393 | "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", 1394 | "integrity": "sha1-tSQ9jz7BqjXxNkYFvA0QNuMKtp8=" 1395 | }, 1396 | "ws": { 1397 | "version": "7.4.5", 1398 | "resolved": "https://registry.npmjs.org/ws/-/ws-7.4.5.tgz", 1399 | "integrity": "sha512-xzyu3hFvomRfXKH8vOFMU3OguG6oOvhXMo3xsGy3xWExqaM2dxBbVxuD99O7m3ZUFMvvscsZDqxfgMaRr/Nr1g==", 1400 | "requires": {} 1401 | }, 1402 | "xtend": { 1403 | "version": "4.0.2", 1404 | "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", 1405 | "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==" 1406 | } 1407 | } 1408 | } 1409 | -------------------------------------------------------------------------------- /packages/routed-mqtt/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "@kabbi/routed-mqtt", 3 | "version": "1.0.0", 4 | "description": "", 5 | "main": "index.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "keywords": [], 10 | "author": "", 11 | "license": "ISC", 12 | "dependencies": { 13 | "async-mqtt": "^2.6.1", 14 | "path-to-regexp": "^6.2.0" 15 | } 16 | } 17 | --------------------------------------------------------------------------------