diff --git a/.github/WhatsaaLite.png b/.github/WhatsaaLite.png new file mode 100644 index 0000000..fad7a52 Binary files /dev/null and b/.github/WhatsaaLite.png differ diff --git a/README.md b/README.md index 1629af9..9d27dd7 100644 --- a/README.md +++ b/README.md @@ -4,8 +4,6 @@ Simple node for connecting Node-Red to Whatsapp :iphone: Currently in developing mode, Continous updated may encounter. :sweat_smile: -Working on WhatsappLite (Lite version of whatsapp Web baised on web sockets.) - ## To Connect with Whatsapp ![](./.github/admin_login.gif) @@ -16,6 +14,15 @@ Working on WhatsappLite (Lite version of whatsapp Web baised on web sockets.) 4. Done - Whatsapp Connected. 5. Send "`!nodered`" to get a reply from Node-Red in Chats/Groups. +### if Whatsapp Web not working ? +Their is lite version also avilable in it. Totally different from Whatapp-Web, +Whatsapp-Lite (Beta Mode) works on Web-Sockets only, It might work for you also. + +Simply chosse `Whatsapp Lite` in Whatsapp-Link configration node. + +![](./.github/WhatsaaLite.png) + + *It will create a Whatsapp Web instance in your machine and store your session locally in Node-RED. All data are store in users `/.node-red/Whatsapp-Link` folder. Near you Node-Red's settings.js file.* @@ -62,7 +69,7 @@ Admin Node generate QR Code just below the node for easy connection with whatsap |--------|-------------| | `msg.image` | Base64 (encoded image) | | `msg.payload` | Image Caption | - | `msg.toNumber` | Sender number (if number not provided in node) | + | `msg.toNumber` | Reciver number (if number not provided in node) | Don't forget to mention international dialing code befor your number. Number must be in format like +11 99999 99999 without any space. @@ -88,7 +95,7 @@ Issues and Suggestions are welcome [here.](https://github.com/raweee/node-red-co * `Ver-0.1.23` : Nodes are formatted correctly and names are updated. * `Ver-0.1.28` : Now QR Codes are directlly avilable in run time on Whatsapp-Admin-Node. * `Ver-0.1.30` : Message can be send to an Array of contacts provided at `msg.toNumber`. -* Working on WhatsappLite. +* `Ver-0.1.32` : Socket based `Whatsapp Lite` config node added in beta mode. Image message sending support added in chats-out node. ## Future Nodes Currently working on more Whatsapp Node and will be avilable soon - diff --git a/admin.html b/admin.html index d3eadfa..25257b5 100644 --- a/admin.html +++ b/admin.html @@ -24,10 +24,15 @@ } }; - var creatImageContainer = function(NodeID, qrImage) { + var adminNodeId = null; + RED.comms.subscribe("whatsappLinkNodeID", function (e, currentID) { + adminNodeId = currentID; + }) + + var creatImageContainer = function(NodeID) { let img = document.getElementById("whatsappLink-QRcode-" + NodeID) if (!img) { - const container = document.getElementById(NodeID) + const container = document.getElementById(adminNodeId) if (!container) { return } const img = document.createElementNS("http://www.w3.org/2000/svg", 'image') img.setAttribute('id', "whatsappLink-QRcode-" + NodeID) @@ -39,7 +44,7 @@ }; var renderQrCode = function(id, qrCodeImage){ - creatImageContainer(id, qrCodeImage) + creatImageContainer(id) let qrImage = document.getElementById("whatsappLink-QRcode-" + id); qrImage.setAttribute('href', qrCodeImage) qrImage.addEventListener("click", ()=> removeQrCode(id), {once:true}) diff --git a/admin.js b/admin.js index c3e41c1..8d0083e 100644 --- a/admin.js +++ b/admin.js @@ -5,95 +5,134 @@ module.exports = function(RED) { RED.nodes.createNode(this,config); var node = this; var whatsappLinkNode = RED.nodes.getNode(config.whatsappLink); - node.waClient = whatsappLinkNode.client; - node.WARestart = whatsappLinkNode.WARestart; - node.WAConnect = whatsappLinkNode.WAConnect; - node.destroy = whatsappLinkNode.WAClose; + node.client = whatsappLinkNode.client; + RED.comms.publish("whatsappLinkNodeID", node.id) function SetStatus(WAStatus, color){ node.status({fill:color,shape:"dot",text:WAStatus}); msg = {payload : WAStatus}; node.send(msg); }; - - // Commands recived for Whatsapp Admin. - this.on('input', async function(msg, send){ - if (msg.payload === "destroy") { - node.destroy(); - SetStatus("Disconnected","red"); - } - else if (msg.payload==="logout") { - node.waClient.logout(); - SetStatus("Logged Out","red"); - } - else if (msg.payload === "test"){ - msg.payload = await node.waClient.getState(); - node.send(msg); - } - else if (msg.payload === "restart"){ - node.WARestart(); - SetStatus("Connecting...", "yellow"); - }; - }); - - //Group Add/leave status----- - node.waClient.on('group_join', async (notification)=>{ - msg.chat = await notification.getChat(); - msg.payload = msg.chat.name; - msg.chatID = msg.chat.id.user || `No ID Avilable`; - msg.type = notification.type; - msg.notification = notification; - node.send(msg); - notification.reply('!Node-Red joined'); - }); - - node.waClient.on('group_leave', async (notification)=>{ - msg.chat = await notification.getChat(); - msg.payload = msg.chat.name; - msg.type = notification.type; - msg.notification = notification; - node.send(msg); - }); - - node.waClient.on('group_update', (msg)=>{ - node.send(msg); - }); - + - //whatsapp Status Parameters---- - SetStatus("Connecting whatsapp...", "yellow"); + // Commands recived for Whatsapp Admin. + this.on('input', async function(msg, send){ + if (msg.payload === "destroy") { + if(node.client.clientType === "waWebClient"){ + node.clinet.WAClose(); + SetStatus("Disconnected","red"); + } + } + else if (msg.payload==="logout") { + if(node.client.clientType === "waWebClient"){ + node.client.logout(); + SetStatus("Logged Out","red"); + } + } + else if (msg.payload === "test"){ + if(node.client.clientType === "waWebClient"){ + msg.payload = await node.client.getState(); + node.send(msg); + } + } + else if (msg.payload === "restart"){ + if(node.client.clientType === "waWebClient"){ + node.client.WARestart(); + SetStatus("Connecting...", "yellow"); + } + }; + }); - node.waClient.on('qr', (qr) => { - SetStatus("Scan QR code to connect.", "yellow"); - QRCode.toDataURL(qr, function(err, url){ - msg = {payload : url}; + + if(node.client.clientType === "waWebClient"){ + //Group Add/leave status----- + node.client.on('group_join', async (notification)=>{ + msg.chat = await notification.getChat(); + msg.payload = msg.chat.name; + msg.chatID = msg.chat.id.user || `No ID Avilable`; + msg.type = notification.type; + msg.notification = notification; node.send(msg); + notification.reply('!Node-Red joined'); + }); + + node.client.on('group_leave', async (notification)=>{ + msg.chat = await notification.getChat(); + msg.payload = msg.chat.name; + msg.type = notification.type; + msg.notification = notification; + node.send(msg); + }); + + node.client.on('group_update', (msg)=>{ + node.send(msg); + }); + + + //whatsapp Status Parameters---- + SetStatus("Connecting whatsapp...", "yellow"); + + node.client.on('qr', (qr) => { + SetStatus("Scan QR code to connect.", "yellow"); + QRCode.toDataURL(qr, function(err, url){ + msg = {payload : url}; + node.send(msg); + let qrImageWithID = {}; + qrImageWithID.id = node.id; + qrImageWithID.image = url; + RED.comms.publish("whatsappLinkQrCode", qrImageWithID); + }); + }); + + node.client.on('auth_failure', () => { + SetStatus('Connection Fail.','red'); + }); + + node.client.on('loading_screen', () => { + SetStatus('Connecting...','yellow'); let qrImageWithID = {}; qrImageWithID.id = node.id; - qrImageWithID.image = url; + qrImageWithID.image = null; RED.comms.publish("whatsappLinkQrCode", qrImageWithID); }); - }); - - node.waClient.on('auth_failure', () => { - SetStatus('Connection Fail.','red'); - }); - - node.waClient.on('loading_screen', () => { - SetStatus('Connecting...','yellow'); - let qrImageWithID = {}; - qrImageWithID.id = node.id; - qrImageWithID.image = null; - RED.comms.publish("whatsappLinkQrCode", qrImageWithID); - }); - - node.waClient.on('ready', () => { - SetStatus('Connected','green'); - }); + + node.client.on('ready', () => { + SetStatus('Connected','green'); + }); - node.waClient.on('disconnected', () => { - SetStatus("Disconnected","red"); - }); + node.client.on('disconnected', () => { + SetStatus("Disconnected","red"); + }); + }; + + if(node.client.clientType === "waSocketClient"){ + var client = null + async function clientFromWhatsappLite(){ + client = await node.client; + client.ev.on('connection.update', (updates)=>{ + var {connection} = updates + //Setting conncetion status indication + if(connection === 'open'){ + SetStatus("Connected", "green"); + } + else if(updates.isOnline){ + SetStatus("Connected", "green"); + } + else if(connection === 'close'){ + SetStatus("Disconnected", "red"); + } + else if(connection === 'connecting'){ + SetStatus("Connecting...", "yellow"); + } + else if(updates.is){ + SetStatus("Scan QR Code to Connect.", "yellow"); + } + }) + + } + clientFromWhatsappLite(); + + }; this.on(`close`, ()=>{ SetStatus("Disconnected", "red"); diff --git a/chats-in.js b/chats-in.js index 6b9a5b2..ac1fe05 100644 --- a/chats-in.js +++ b/chats-in.js @@ -4,40 +4,89 @@ module.exports = function(RED) { var node = this; var whatsappLinkNode = RED.nodes.getNode(config.whatsappLink); node.waClient = whatsappLinkNode.client; + function SetStatus(WAStatus, color){ node.status({fill:color,shape:"dot",text:WAStatus}); }; - - node.waClient.on('message', async message => { - let msg = {}; - msg.payload = message.body; - msg.from = message.author || message.from ; - msg.chatID = message.from.replace(/\D/g, ''); - msg.from = msg.from.replace(/\D/g, ''); - msg.message = message ; - node.send(msg); - }); - //whatsapp Status Parameters---- - node.waClient.on('qr', (qr) => { - SetStatus("QR Code Generated", "yellow"); - }); - - node.waClient.on('auth_failure', () => { - SetStatus('Not Connected','red'); - }); + if(node.waClient.clientType === "waWebClient"){ + node.waClient.on('message', async message => { + let msg = {}; + msg.payload = message.body; + msg.from = message.author || message.from ; + msg.chatID = message.from.replace(/\D/g, ''); + msg.from = msg.from.replace(/\D/g, ''); + msg.message = message ; + node.send(msg); + }); + + //whatsapp Status Parameters---- + node.waClient.on('qr', (qr) => { + SetStatus("QR Code Generated", "yellow"); + }); + + node.waClient.on('auth_failure', () => { + SetStatus('Not Connected','red'); + }); + + node.waClient.on('loading_screen', () => { + SetStatus('Connecting...','yellow'); + }); + + node.waClient.on('ready', () => { + SetStatus('Connected','green'); + }); + + node.waClient.on('disconnected', () => { + SetStatus("Disconnected","red"); + }); + } + + else if (node.waClient.clientType === "waSocketClient"){ + var client = null + async function clientFromWhatsappLite(){ + client = await node.waClient; - node.waClient.on('loading_screen', () => { - SetStatus('Connecting...','yellow'); - }); - - node.waClient.on('ready', () => { - SetStatus('Connected','green'); - }); + client.ev.on('messages.upsert', msgs =>{ + msgs.messages.forEach(async msg =>{ + msg.payload = msg.message.conversation; + msg.from = msg.key.participant || msg.key.remoteJid; + msg.from = msg.from.replace(/\D/g, '') || msg.from; + msg.chatID = msg.key.remoteJid.replace(/\D/g, '') || msg.key.remoteJid ; + node.send(msg) + }) + }); + + + //Setting conncetion status indication + client.ev.on('connection.update', (updates)=>{ + var {connection} = updates + if(connection === 'open'){ + SetStatus("Connected", "green"); + } + else if(updates.isOnline){ + SetStatus("Connected", "green"); + } + else if(connection === 'close'){ + SetStatus("Disconnected", "red"); + } + else if(connection === 'connecting'){ + SetStatus("Connecting...", "yellow"); + } + else if(updates.is){ + SetStatus("Scan QR Code to Connect.", "yellow"); + } + }) + + } + clientFromWhatsappLite(); - node.waClient.on('disconnected', () => { - SetStatus("Disconnected","red"); - }); + + + + + + } } RED.nodes.registerType("chats-in", WhatsappIn); diff --git a/chats-out.html b/chats-out.html index 194d89e..6928a9f 100644 --- a/chats-out.html +++ b/chats-out.html @@ -52,7 +52,7 @@ MultiMedia Message Out: Requirments- |--------|-------------| | `msg.image` | Base64 (encoded image) | | `msg.payload` | Image Caption | -| `msg.toNumber` | Sender number (if number not provided in node) | +| `msg.toNumber` | Reciver number (if number not provided in node) | -*Don't forget to mention international dialing code befor your number. Number must be in format like `+11 99999 99999` without any space.* diff --git a/chats-out.js b/chats-out.js index c0d3dfc..40d29e5 100644 --- a/chats-out.js +++ b/chats-out.js @@ -12,21 +12,34 @@ module.exports = function(RED) { }; const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); - function whatsappMessage(numb , inputMessage){ - if (node.waClient){ + async function whatsappMessage(numb , inputMessage){ + numb = typeof numb ==='number' ? numb : numb.replace(/\D/g, ''); + if (node.waClient.clientType === "waWebClient"){ try { - numb = typeof numb ==='number' ? numb : numb.replace(/\D/g, ''); numb = `${numb}@c.us`; node.waClient.sendMessage(numb, inputMessage); - SetStatus("Message Send.", "green"); - setTimeout(()=>{ - SetStatus('Connected','green'); - }, 2000) } catch(e) { node.log(`Error Sending Msg: ${e}`); } - } else { node.log(`Error Sending Msg: ${e}`)} + } + else if (node.waClient.clientType === "waSocketClient"){ + try { + let client = await node.waClient; + numb = `${numb}@s.whatsapp.net`; + const msgStatus = await client.sendMessage(numb, {text : inputMessage}); + } + catch(e) { + node.log(`Error Sending Msg: ${e}`); + } + } + else { + node.log(`Error Sending Msg: ${e}`) + } + SetStatus("Message Send.", "green"); + setTimeout(()=>{ + SetStatus('Connected','green'); + }, 2000) }; function whatsappMultiMediaMessage(numb, whatsappImage, whatsappCaption){ @@ -76,25 +89,52 @@ module.exports = function(RED) { }); //whatsapp Status Parameters---- - node.waClient.on('qr', (qr) => { - SetStatus("QR Code Generated", "yellow"); - }); - - node.waClient.on('auth_failure', () => { - SetStatus('Not Connected','red'); - }); - - node.waClient.on('loading_screen', () => { - SetStatus('Connecting...','yellow'); - }); - - node.waClient.on('ready', () => { - SetStatus('Connected','green'); - }); + if (node.waClient.clientType === "waWebClient"){ + node.waClient.on('qr', (qr) => { + SetStatus("QR Code Generated", "yellow"); + }); + + node.waClient.on('auth_failure', () => { + SetStatus('Not Connected','red'); + }); + + node.waClient.on('loading_screen', () => { + SetStatus('Connecting...','yellow'); + }); + + node.waClient.on('ready', () => { + SetStatus('Connected','green'); + }); - node.waClient.on('disconnected', () => { - SetStatus("Disconnected","red"); - }); + node.waClient.on('disconnected', () => { + SetStatus("Disconnected","red"); + }); + + } else if (node.waClient.clientType === "waSocketClient"){ + async function checkStatusOfSockets(){ + let client = await node.waClient; + client.ev.on('connection.update', (updates)=>{ + var {connection} = updates + if(connection === 'open'){ + SetStatus("Connected", "green"); + } + else if(updates.isOnline){ + SetStatus("Connected", "green"); + } + else if(connection === 'close'){ + SetStatus("Disconnected", "red"); + } + else if(connection === 'connecting'){ + SetStatus("Connecting...", "yellow"); + } + else if(updates.is){ + SetStatus("Scan QR Code to Connect.", "yellow"); + } + }) + } + checkStatusOfSockets(); + + } } RED.nodes.registerType("chats-out", WhatsappOut); diff --git a/group-out.js b/group-out.js index cab13ec..54b4a60 100644 --- a/group-out.js +++ b/group-out.js @@ -2,37 +2,169 @@ module.exports = function(RED) { function WhatsappGroupOut(config) { RED.nodes.createNode(this,config); var node = this; - node.gID = config.gID; + node.number = config.gID; var whatsappLinkNode = RED.nodes.getNode(config.whatsappLink); node.waClient = whatsappLinkNode.client; + const { MessageMedia } = require('whatsapp-web.js') let SetStatus = function(WAStatus, color){ node.status({fill:color,shape:"dot",text:WAStatus}); }; + const delay = ms => new Promise(resolve => setTimeout(resolve, ms)); - node.on('input', (message)=> { - if(node.gID){ + async function whatsappMessage(numb , inputMessage){ + numb = typeof numb ==='number' ? numb : numb.replace(/\D/g, ''); + if (node.waClient.clientType === "waWebClient"){ try { - node.gID = node.gID.replace(/\D/g, ''); - node.gID = `${node.gID}@g.us`; - node.waClient.sendMessage(node.gID, message.payload); - SetStatus("Message Send.", "green"); - setTimeout(()=>{ - SetStatus('Connected','green'); - }, 3000) + numb = `${numb}@g.us`; + node.waClient.sendMessage(numb, inputMessage); } catch(e) { node.log(`Error Sending Msg: ${e}`); - }; + } + } + else if (node.waClient.clientType === "waSocketClient"){ + try { + let client = await node.waClient; + numb = `${numb}@g.us`; + const msgStatus = await client.sendMessage(numb, {text : inputMessage}); + } + catch(e) { + node.log(`Error Sending Msg: ${e}`); + } + } + else { + node.log(`Error Sending Msg: ${e}`) } - else { - SetStatus("No Chat-ID","red"); + SetStatus("Message Send.", "green"); + setTimeout(()=>{ + SetStatus('Connected','green'); + }, 2000) + }; + + function whatsappMultiMediaMessage(numb, whatsappImage, whatsappCaption){ + try { + numb = node.number; + whatsappImage = whatsappImage.split(',')[1] || whatsappImage; + var myMessage = new MessageMedia('image/png', whatsappImage, null, null); + numb = typeof numb ==='number' ? numb : numb.replace(/\D/g, ''); + numb = `${numb}@g.us`; + node.waClient.sendMessage(numb, myMessage, {caption : whatsappCaption || "Image from Node-Red"}); + SetStatus("Message Send.", "green"); + setTimeout(()=>{ + SetStatus('Connected','green'); + }, 2000) + } catch(e) { + node.log(`Error sending MultiMedia Message : ${e}`) + } + }; + + node.on('input', (message)=> { + if (node.number){ + if (message.image){ + whatsappMultiMediaMessage(node.number, message.image, message.payload); + } + else { + whatsappMessage(node.number, message.payload); + } + + } else if (message.toNumber){ + var numbers = typeof message.toNumber === 'number' ? Array.of(message.toNumber) : message.toNumber; + for (number of numbers) { + if(message.image){ + whatsappMultiMediaMessage(number, message.image, message.payload) + delay(2000); + + } else { + whatsappMessage(number, message.payload) + delay(2000) + } + } + } else { + SetStatus("No number","red"); setTimeout(()=>{ SetStatus('Connected','green'); }, 5000) - }; + } }); + //whatsapp Status Parameters---- + if (node.waClient.clientType === "waWebClient"){ + node.waClient.on('qr', (qr) => { + SetStatus("QR Code Generated", "yellow"); + }); + + node.waClient.on('auth_failure', () => { + SetStatus('Not Connected','red'); + }); + + node.waClient.on('loading_screen', () => { + SetStatus('Connecting...','yellow'); + }); + + node.waClient.on('ready', () => { + SetStatus('Connected','green'); + }); + + node.waClient.on('disconnected', () => { + SetStatus("Disconnected","red"); + }); + + } else if (node.waClient.clientType === "waSocketClient"){ + async function checkStatusOfSockets(){ + let client = await node.waClient; + client.ev.on('connection.update', (updates)=>{ + var {connection} = updates + if(connection === 'open'){ + SetStatus("Connected", "green"); + } + else if(updates.isOnline){ + SetStatus("Connected", "green"); + } + else if(connection === 'close'){ + SetStatus("Disconnected", "red"); + } + else if(connection === 'connecting'){ + SetStatus("Connecting...", "yellow"); + } + else if(updates.is){ + SetStatus("Scan QR Code to Connect.", "yellow"); + } + }) + } + checkStatusOfSockets(); + + } + + + + + + + + // node.on('input', (message)=> { + // if(node.gID){ + // try { + // node.gID = node.gID.replace(/\D/g, ''); + // node.gID = `${node.gID}@g.us`; + // node.waClient.sendMessage(node.gID, message.payload); + // SetStatus("Message Send.", "green"); + // setTimeout(()=>{ + // SetStatus('Connected','green'); + // }, 3000) + // } + // catch(e) { + // node.log(`Error Sending Msg: ${e}`); + // }; + // } + // else { + // SetStatus("No Chat-ID","red"); + // setTimeout(()=>{ + // SetStatus('Connected','green'); + // }, 5000) + // }; + // }); + //whatsapp Status Parameters---- node.waClient.on('qr', (qr) => { SetStatus("QR Code Generated", "yellow"); diff --git a/package-lock.json b/package-lock.json index f5a0a35..af1f3c0 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,14 +1,15 @@ { "name": "node-red-contrib-whatsapp-link", - "version": "0.1.30", + "version": "0.1.31", "lockfileVersion": 2, "requires": true, "packages": { "": { "name": "node-red-contrib-whatsapp-link", - "version": "0.1.30", + "version": "0.1.31", "license": "ISC", "dependencies": { + "@adiwajshing/baileys": "^5.0.0", "qrcode": "^1.5.1", "whatsapp-web.js": "latest" }, @@ -16,16 +17,132 @@ "node": ">=8.0.0" } }, + "node_modules/@adiwajshing/baileys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@adiwajshing/baileys/-/baileys-5.0.0.tgz", + "integrity": "sha512-AeNyYLfw1nhCwc7hDlMajU9Zr5DK4zmEO8rdrmxUR1qUbmhSKOL6IzwZpyvPjsXyHvl+oPMbp5k8+PX2p6RlJg==", + "dependencies": { + "@hapi/boom": "^9.1.3", + "axios": "^0.24.0", + "futoin-hkdf": "^1.5.1", + "libsignal": "git+https://github.com/adiwajshing/libsignal-node.git", + "music-metadata": "^7.12.3", + "node-cache": "^5.1.2", + "pino": "^7.0.0", + "protobufjs": "^6.11.3", + "ws": "^8.0.0" + }, + "peerDependencies": { + "@adiwajshing/keyed-db": "^0.2.4", + "jimp": "^0.16.1", + "link-preview-js": "^3.0.0", + "qrcode-terminal": "^0.12.0", + "sharp": "^0.30.5" + }, + "peerDependenciesMeta": { + "@adiwajshing/keyed-db": { + "optional": true + }, + "jimp": { + "optional": true + }, + "link-preview-js": { + "optional": true + }, + "qrcode-terminal": { + "optional": true + }, + "sharp": { + "optional": true + } + } + }, + "node_modules/@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "dependencies": { + "@hapi/hoek": "9.x.x" + } + }, + "node_modules/@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, "node_modules/@pedroslopez/moduleraid": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@pedroslopez/moduleraid/-/moduleraid-5.0.2.tgz", "integrity": "sha512-wtnBAETBVYZ9GvcbgdswRVSLkFkYAGv1KzwBBTeRXvGT9sb9cPllOgFFWXCn9PyARQ0H+Ijz6mmoRrGateUDxQ==" }, + "node_modules/@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "node_modules/@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "node_modules/@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "node_modules/@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "node_modules/@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "dependencies": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "node_modules/@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "node_modules/@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "node_modules/@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "node_modules/@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "node_modules/@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "node_modules/@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "node_modules/@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "node_modules/@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "optional": true + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "node_modules/@types/yauzl": { "version": "2.10.0", @@ -143,6 +260,22 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "node_modules/atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==", + "engines": { + "node": ">=8.0.0" + } + }, + "node_modules/axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "dependencies": { + "follow-redirects": "^1.14.4" + } + }, "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -298,6 +431,14 @@ "wrap-ansi": "^6.2.0" } }, + "node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } + }, "node_modules/color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -334,6 +475,14 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "node_modules/content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -392,6 +541,11 @@ } } }, + "node_modules/curve25519-js": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/curve25519-js/-/curve25519-js-0.0.4.tgz", + "integrity": "sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -465,6 +619,17 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "dependencies": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -502,6 +667,14 @@ "@types/yauzl": "^2.9.1" } }, + "node_modules/fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==", + "engines": { + "node": ">=6" + } + }, "node_modules/fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -510,6 +683,22 @@ "pend": "~1.2.0" } }, + "node_modules/file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "dependencies": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sindresorhus/file-type?sponsor=1" + } + }, "node_modules/find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -534,6 +723,25 @@ "node": ">=0.8.0" } }, + "node_modules/follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==", + "funding": [ + { + "type": "individual", + "url": "https://github.com/sponsors/RubenVerborgh" + } + ], + "engines": { + "node": ">=4.0" + }, + "peerDependenciesMeta": { + "debug": { + "optional": true + } + } + }, "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -585,6 +793,14 @@ "rimraf": "bin.js" } }, + "node_modules/futoin-hkdf": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz", + "integrity": "sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg==", + "engines": { + "node": ">=8" + } + }, "node_modules/get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -755,6 +971,45 @@ "safe-buffer": "~5.1.0" } }, + "node_modules/libsignal": { + "version": "2.0.1", + "resolved": "git+ssh://git@github.com/adiwajshing/libsignal-node.git#11dbd962ea108187c79a7c46fe4d6f790e23da97", + "license": "GPL-3.0", + "dependencies": { + "curve25519-js": "^0.0.4", + "protobufjs": "6.8.8" + } + }, + "node_modules/libsignal/node_modules/@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "node_modules/libsignal/node_modules/protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -802,6 +1057,19 @@ "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", "optional": true }, + "node_modules/long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "node_modules/media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -855,6 +1123,38 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "node_modules/music-metadata": { + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.13.3.tgz", + "integrity": "sha512-qxh+Xgy1qHhrgW4XnXu5JUxMmRNdQXDEeIZLGXpapOi96rRCocXn498L+y2P7t6NJXFK8e3Shv2tu0dC/HF/3g==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "content-type": "^1.0.4", + "debug": "^4.3.4", + "file-type": "^16.5.4", + "media-typer": "^1.1.0", + "strtok3": "^6.3.0", + "token-types": "^4.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, "node_modules/node-fetch": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", @@ -888,6 +1188,11 @@ "node": ">=0.10.0" } }, + "node_modules/on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, "node_modules/once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -945,11 +1250,58 @@ "node": ">=0.10.0" } }, + "node_modules/peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==", + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, + "node_modules/pino": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", + "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "dependencies": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.15.1" + }, + "bin": { + "pino": "bin.js" + } + }, + "node_modules/pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "dependencies": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "node_modules/pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, "node_modules/pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -975,6 +1327,11 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "optional": true }, + "node_modules/process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "node_modules/progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", @@ -983,6 +1340,31 @@ "node": ">=0.4.0" } }, + "node_modules/protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "hasInstallScript": true, + "dependencies": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + }, + "bin": { + "pbjs": "bin/pbjs", + "pbts": "bin/pbts" + } + }, "node_modules/proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -1038,6 +1420,11 @@ "node": ">=10.13.0" } }, + "node_modules/quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "node_modules/readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -1051,6 +1438,21 @@ "node": ">= 6" } }, + "node_modules/readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "dependencies": { + "readable-stream": "^3.6.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/readdir-glob": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", @@ -1081,6 +1483,14 @@ "node": ">=10" } }, + "node_modules/real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==", + "engines": { + "node": ">= 12.13.0" + } + }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -1127,6 +1537,14 @@ } ] }, + "node_modules/safe-stable-stringify": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", + "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==", + "engines": { + "node": ">=10" + } + }, "node_modules/set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -1138,6 +1556,27 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "optional": true }, + "node_modules/sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "dependencies": { + "atomic-sleep": "^1.0.0" + } + }, + "node_modules/split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==", + "engines": { + "node": ">= 10.x" + } + }, + "node_modules/stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "node_modules/string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -1170,6 +1609,22 @@ "node": ">=8" } }, + "node_modules/strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -1196,11 +1651,35 @@ "node": ">=6" } }, + "node_modules/thread-stream": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", + "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "dependencies": { + "real-require": "^0.1.0" + } + }, "node_modules/through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "node_modules/token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "dependencies": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/Borewit" + } + }, "node_modules/tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", @@ -1439,16 +1918,108 @@ } }, "dependencies": { + "@adiwajshing/baileys": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/@adiwajshing/baileys/-/baileys-5.0.0.tgz", + "integrity": "sha512-AeNyYLfw1nhCwc7hDlMajU9Zr5DK4zmEO8rdrmxUR1qUbmhSKOL6IzwZpyvPjsXyHvl+oPMbp5k8+PX2p6RlJg==", + "requires": { + "@hapi/boom": "^9.1.3", + "axios": "^0.24.0", + "futoin-hkdf": "^1.5.1", + "libsignal": "git+https://github.com/adiwajshing/libsignal-node.git", + "music-metadata": "^7.12.3", + "node-cache": "^5.1.2", + "pino": "^7.0.0", + "protobufjs": "^6.11.3", + "ws": "^8.0.0" + } + }, + "@hapi/boom": { + "version": "9.1.4", + "resolved": "https://registry.npmjs.org/@hapi/boom/-/boom-9.1.4.tgz", + "integrity": "sha512-Ls1oH8jaN1vNsqcaHVYJrKmgMcKsC1wcp8bujvXrHaAqD2iDYq3HoOwsxwo09Cuda5R5nC0o0IxlrlTuvPuzSw==", + "requires": { + "@hapi/hoek": "9.x.x" + } + }, + "@hapi/hoek": { + "version": "9.3.0", + "resolved": "https://registry.npmjs.org/@hapi/hoek/-/hoek-9.3.0.tgz", + "integrity": "sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==" + }, "@pedroslopez/moduleraid": { "version": "5.0.2", "resolved": "https://registry.npmjs.org/@pedroslopez/moduleraid/-/moduleraid-5.0.2.tgz", "integrity": "sha512-wtnBAETBVYZ9GvcbgdswRVSLkFkYAGv1KzwBBTeRXvGT9sb9cPllOgFFWXCn9PyARQ0H+Ijz6mmoRrGateUDxQ==" }, + "@protobufjs/aspromise": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/aspromise/-/aspromise-1.1.2.tgz", + "integrity": "sha512-j+gKExEuLmKwvz3OgROXtrJ2UG2x8Ch2YZUxahh+s1F2HZ+wAceUNLkvy6zKCPVRkU++ZWQrdxsUeQXmcg4uoQ==" + }, + "@protobufjs/base64": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/base64/-/base64-1.1.2.tgz", + "integrity": "sha512-AZkcAA5vnN/v4PDqKyMR5lx7hZttPDgClv83E//FMNhR2TMcLUhfRUBHCmSl0oi9zMgDDqRUJkSxO3wm85+XLg==" + }, + "@protobufjs/codegen": { + "version": "2.0.4", + "resolved": "https://registry.npmjs.org/@protobufjs/codegen/-/codegen-2.0.4.tgz", + "integrity": "sha512-YyFaikqM5sH0ziFZCN3xDC7zeGaB/d0IUb9CATugHWbd1FRFwWwt4ld4OYMPWu5a3Xe01mGAULCdqhMlPl29Jg==" + }, + "@protobufjs/eventemitter": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/eventemitter/-/eventemitter-1.1.0.tgz", + "integrity": "sha512-j9ednRT81vYJ9OfVuXG6ERSTdEL1xVsNgqpkxMsbIabzSo3goCjDIveeGv5d03om39ML71RdmrGNjG5SReBP/Q==" + }, + "@protobufjs/fetch": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/fetch/-/fetch-1.1.0.tgz", + "integrity": "sha512-lljVXpqXebpsijW71PZaCYeIcE5on1w5DlQy5WH6GLbFryLUrBD4932W/E2BSpfRJWseIL4v/KPgBFxDOIdKpQ==", + "requires": { + "@protobufjs/aspromise": "^1.1.1", + "@protobufjs/inquire": "^1.1.0" + } + }, + "@protobufjs/float": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/@protobufjs/float/-/float-1.0.2.tgz", + "integrity": "sha512-Ddb+kVXlXst9d+R9PfTIxh1EdNkgoRe5tOX6t01f1lYWOvJnSPDBlG241QLzcyPdoNTsblLUdujGSE4RzrTZGQ==" + }, + "@protobufjs/inquire": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/inquire/-/inquire-1.1.0.tgz", + "integrity": "sha512-kdSefcPdruJiFMVSbn801t4vFK7KB/5gd2fYvrxhuJYg8ILrmn9SKSX2tZdV6V+ksulWqS7aXjBcRXl3wHoD9Q==" + }, + "@protobufjs/path": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/@protobufjs/path/-/path-1.1.2.tgz", + "integrity": "sha512-6JOcJ5Tm08dOHAbdR3GrvP+yUUfkjG5ePsHYczMFLq3ZmMkAD98cDgcT2iA1lJ9NVwFd4tH/iSSoe44YWkltEA==" + }, + "@protobufjs/pool": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/pool/-/pool-1.1.0.tgz", + "integrity": "sha512-0kELaGSIDBKvcgS4zkjz1PeddatrjYcmMWOlAuAPwAeccUrPHdUqo/J6LiymHHEiJT5NrF1UVwxY14f+fy4WQw==" + }, + "@protobufjs/utf8": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/@protobufjs/utf8/-/utf8-1.1.0.tgz", + "integrity": "sha512-Vvn3zZrhQZkkBE8LSuW3em98c0FwgO4nxzv6OdSxPKJIEKY2bGbHn+mhGIPerzI4twdxaP8/0+06HBpwf345Lw==" + }, + "@tokenizer/token": { + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@tokenizer/token/-/token-0.3.0.tgz", + "integrity": "sha512-OvjF+z51L3ov0OyAU0duzsYuvO01PH7x4t6DJx+guahgTnBHkhJdG7soQeTSFLWN3efnHyibZ4Z8l2EuWwJN3A==" + }, + "@types/long": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/long/-/long-4.0.2.tgz", + "integrity": "sha512-MqTGEo5bj5t157U6fA/BiDynNkn0YknVdh48CMPkTSpFTVmvao5UQmm7uEF6xBEo7qIMAlY/JSleYaE6VOdpaA==" + }, "@types/node": { "version": "18.11.18", "resolved": "https://registry.npmjs.org/@types/node/-/node-18.11.18.tgz", - "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==", - "optional": true + "integrity": "sha512-DHQpWGjyQKSHj3ebjFI/wRKcqQcdR+MoFBygntYOZytCqNfkd2ZC4ARDJ2DQqhjH5p85Nnd3jhUJIXrszFX/JA==" }, "@types/yauzl": { "version": "2.10.0", @@ -1550,6 +2121,19 @@ "resolved": "https://registry.npmjs.org/async/-/async-3.2.4.tgz", "integrity": "sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==" }, + "atomic-sleep": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/atomic-sleep/-/atomic-sleep-1.0.0.tgz", + "integrity": "sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==" + }, + "axios": { + "version": "0.24.0", + "resolved": "https://registry.npmjs.org/axios/-/axios-0.24.0.tgz", + "integrity": "sha512-Q6cWsys88HoPgAaFAVUb0WpPk0O8iTeisR9IMqy9G8AbO4NlpVknrnQS03zzF9PGAWgO3cgletO3VjV/P7VztA==", + "requires": { + "follow-redirects": "^1.14.4" + } + }, "balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", @@ -1656,6 +2240,11 @@ "wrap-ansi": "^6.2.0" } }, + "clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==" + }, "color-convert": { "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", @@ -1686,6 +2275,11 @@ "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, + "content-type": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", + "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" + }, "core-util-is": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", @@ -1726,6 +2320,11 @@ } } }, + "curve25519-js": { + "version": "0.0.4", + "resolved": "https://registry.npmjs.org/curve25519-js/-/curve25519-js-0.0.4.tgz", + "integrity": "sha512-axn2UMEnkhyDUPWOwVKBMVIzSQy2ejH2xRGy1wq81dqRwApXfIzfbE3hIX0ZRFBIihf/KDqK158DLwESu4AK1w==" + }, "debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -1790,6 +2389,17 @@ } } }, + "duplexify": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/duplexify/-/duplexify-4.1.2.tgz", + "integrity": "sha512-fz3OjcNCHmRP12MJoZMPglx8m4rrFP8rovnk4vT8Fs+aonZoCwGg10dSsQsfP/E62eZcPTMSMP6686fu9Qlqtw==", + "requires": { + "end-of-stream": "^1.4.1", + "inherits": "^2.0.3", + "readable-stream": "^3.1.1", + "stream-shift": "^1.0.0" + } + }, "emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", @@ -1819,6 +2429,11 @@ "yauzl": "^2.10.0" } }, + "fast-redact": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/fast-redact/-/fast-redact-3.1.2.tgz", + "integrity": "sha512-+0em+Iya9fKGfEQGcd62Yv6onjBmmhV1uh86XVfOU8VwAe6kaFdQCWI9s0/Nnugx5Vd9tdbZ7e6gE2tR9dzXdw==" + }, "fd-slicer": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", @@ -1827,6 +2442,16 @@ "pend": "~1.2.0" } }, + "file-type": { + "version": "16.5.4", + "resolved": "https://registry.npmjs.org/file-type/-/file-type-16.5.4.tgz", + "integrity": "sha512-/yFHK0aGjFEgDJjEKP0pWCplsPFPhwyfwevf/pVxiN0tmE4L9LmwWxWukdJSHdoCli4VgQLehjJtwQBnqmsKcw==", + "requires": { + "readable-web-to-node-stream": "^3.0.0", + "strtok3": "^6.2.4", + "token-types": "^4.1.1" + } + }, "find-up": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-4.1.0.tgz", @@ -1845,6 +2470,11 @@ "which": "^1.1.1" } }, + "follow-redirects": { + "version": "1.15.2", + "resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.2.tgz", + "integrity": "sha512-VQLG33o04KaQ8uYi2tVNbdrWp1QWxNNea+nmIB4EVM28v0hmP17z7aG1+wAkNzVq4KeXTq3221ye5qTJP91JwA==" + }, "fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", @@ -1889,6 +2519,11 @@ } } }, + "futoin-hkdf": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/futoin-hkdf/-/futoin-hkdf-1.5.1.tgz", + "integrity": "sha512-g5d0Qp7ks55hYmYmfqn4Nz18XH49lcCR+vvIvHT92xXnsJaGZmY1EtWQWilJ6BQp57heCIXM/rRo+AFep8hGgg==" + }, "get-caller-file": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", @@ -2021,6 +2656,41 @@ } } }, + "libsignal": { + "version": "git+ssh://git@github.com/adiwajshing/libsignal-node.git#11dbd962ea108187c79a7c46fe4d6f790e23da97", + "from": "libsignal@git+https://github.com/adiwajshing/libsignal-node.git", + "requires": { + "curve25519-js": "^0.0.4", + "protobufjs": "6.8.8" + }, + "dependencies": { + "@types/node": { + "version": "10.17.60", + "resolved": "https://registry.npmjs.org/@types/node/-/node-10.17.60.tgz", + "integrity": "sha512-F0KIgDJfy2nA3zMLmWGKxcH2ZVEtCZXHHdOQs2gSaQ27+lNeEfGxzkIw90aXswATX7AZ33tahPbzy6KAfUreVw==" + }, + "protobufjs": { + "version": "6.8.8", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.8.8.tgz", + "integrity": "sha512-AAmHtD5pXgZfi7GMpllpO3q1Xw1OYldr+dMUlAnffGTAhqkg72WdmSY71uKBF/JuyiKs8psYbtKrhi0ASCD8qw==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.0", + "@types/node": "^10.1.0", + "long": "^4.0.0" + } + } + } + }, "listenercount": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/listenercount/-/listenercount-1.0.1.tgz", @@ -2065,6 +2735,16 @@ "integrity": "sha512-c4pB2CdGrGdjMKYLA+XiRDO7Y0PRQbm/Gzg8qMj+QH+pFVAoTp5sBpO0odL3FjoPCGjK96p6qsP+yQoiLoOBcw==", "optional": true }, + "long": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/long/-/long-4.0.0.tgz", + "integrity": "sha512-XsP+KhQif4bjX1kbuSiySJFNAehNxgLb6hPRGJ9QsUr8ajHkuXGdrHmFUTUUXhDwVX2R5bY4JNZEwbUiMhV+MA==" + }, + "media-typer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-1.1.0.tgz", + "integrity": "sha512-aisnrDP4GNe06UcKFnV5bfMNPBUw4jsLGaWwWfnH3v02GnBuXX2MCVn5RbrWo0j3pczUilYblq7fQ7Nw2t5XKw==" + }, "mime": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", @@ -2103,6 +2783,28 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, + "music-metadata": { + "version": "7.13.3", + "resolved": "https://registry.npmjs.org/music-metadata/-/music-metadata-7.13.3.tgz", + "integrity": "sha512-qxh+Xgy1qHhrgW4XnXu5JUxMmRNdQXDEeIZLGXpapOi96rRCocXn498L+y2P7t6NJXFK8e3Shv2tu0dC/HF/3g==", + "requires": { + "@tokenizer/token": "^0.3.0", + "content-type": "^1.0.4", + "debug": "^4.3.4", + "file-type": "^16.5.4", + "media-typer": "^1.1.0", + "strtok3": "^6.3.0", + "token-types": "^4.2.1" + } + }, + "node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "requires": { + "clone": "2.x" + } + }, "node-fetch": { "version": "2.6.8", "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.8.tgz", @@ -2122,6 +2824,11 @@ "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", "optional": true }, + "on-exit-leak-free": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/on-exit-leak-free/-/on-exit-leak-free-0.2.0.tgz", + "integrity": "sha512-dqaz3u44QbRXQooZLTUKU41ZrzYrcvLISVgbrzbyCMxpmSLJvZ3ZamIJIZ29P6OhZIkNIQKosdeM6t1LYbA9hg==" + }, "once": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", @@ -2161,11 +2868,48 @@ "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==" }, + "peek-readable": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/peek-readable/-/peek-readable-4.1.0.tgz", + "integrity": "sha512-ZI3LnwUv5nOGbQzD9c2iDG6toheuXSZP5esSHBjopsXH4dg19soufvpUGA3uohi5anFtGb2lhAVdHzH6R/Evvg==" + }, "pend": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, + "pino": { + "version": "7.11.0", + "resolved": "https://registry.npmjs.org/pino/-/pino-7.11.0.tgz", + "integrity": "sha512-dMACeu63HtRLmCG8VKdy4cShCPKaYDR4youZqoSWLxl5Gu99HUw8bw75thbPv9Nip+H+QYX8o3ZJbTdVZZ2TVg==", + "requires": { + "atomic-sleep": "^1.0.0", + "fast-redact": "^3.0.0", + "on-exit-leak-free": "^0.2.0", + "pino-abstract-transport": "v0.5.0", + "pino-std-serializers": "^4.0.0", + "process-warning": "^1.0.0", + "quick-format-unescaped": "^4.0.3", + "real-require": "^0.1.0", + "safe-stable-stringify": "^2.1.0", + "sonic-boom": "^2.2.1", + "thread-stream": "^0.15.1" + } + }, + "pino-abstract-transport": { + "version": "0.5.0", + "resolved": "https://registry.npmjs.org/pino-abstract-transport/-/pino-abstract-transport-0.5.0.tgz", + "integrity": "sha512-+KAgmVeqXYbTtU2FScx1XS3kNyfZ5TrXY07V96QnUSFqo2gAqlvmaxH67Lj7SWazqsMabf+58ctdTcBgnOLUOQ==", + "requires": { + "duplexify": "^4.1.2", + "split2": "^4.0.0" + } + }, + "pino-std-serializers": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-4.0.0.tgz", + "integrity": "sha512-cK0pekc1Kjy5w9V2/n+8MkZwusa6EyyxfeQCB799CQRhRt/CqYKiWs5adeu8Shve2ZNffvfC/7J64A2PJo1W/Q==" + }, "pkg-dir": { "version": "4.2.0", "resolved": "https://registry.npmjs.org/pkg-dir/-/pkg-dir-4.2.0.tgz", @@ -2185,11 +2929,36 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==", "optional": true }, + "process-warning": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/process-warning/-/process-warning-1.0.0.tgz", + "integrity": "sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==" + }, "progress": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, + "protobufjs": { + "version": "6.11.3", + "resolved": "https://registry.npmjs.org/protobufjs/-/protobufjs-6.11.3.tgz", + "integrity": "sha512-xL96WDdCZYdU7Slin569tFX712BxsxslWwAfAhCYjQKGTq7dAU91Lomy6nLLhh/dyGhk/YH4TwTSRxTzhuHyZg==", + "requires": { + "@protobufjs/aspromise": "^1.1.2", + "@protobufjs/base64": "^1.1.2", + "@protobufjs/codegen": "^2.0.4", + "@protobufjs/eventemitter": "^1.1.0", + "@protobufjs/fetch": "^1.1.0", + "@protobufjs/float": "^1.0.2", + "@protobufjs/inquire": "^1.1.0", + "@protobufjs/path": "^1.1.2", + "@protobufjs/pool": "^1.1.0", + "@protobufjs/utf8": "^1.1.0", + "@types/long": "^4.0.1", + "@types/node": ">=13.7.0", + "long": "^4.0.0" + } + }, "proxy-from-env": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", @@ -2234,6 +3003,11 @@ "yargs": "^15.3.1" } }, + "quick-format-unescaped": { + "version": "4.0.4", + "resolved": "https://registry.npmjs.org/quick-format-unescaped/-/quick-format-unescaped-4.0.4.tgz", + "integrity": "sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==" + }, "readable-stream": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.0.tgz", @@ -2244,6 +3018,14 @@ "util-deprecate": "^1.0.1" } }, + "readable-web-to-node-stream": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/readable-web-to-node-stream/-/readable-web-to-node-stream-3.0.2.tgz", + "integrity": "sha512-ePeK6cc1EcKLEhJFt/AebMCLL+GgSKhuygrZ/GLaKZYEecIgIECf4UaUuaByiGtzckwR4ain9VzUh95T1exYGw==", + "requires": { + "readable-stream": "^3.6.0" + } + }, "readdir-glob": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/readdir-glob/-/readdir-glob-1.1.2.tgz", @@ -2273,6 +3055,11 @@ } } }, + "real-require": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/real-require/-/real-require-0.1.0.tgz", + "integrity": "sha512-r/H9MzAWtrv8aSVjPCMFpDMl5q66GqtmmRkRjpHTsp4zBAa+snZyiQNlMONiUmEJcsnaw0wCauJ2GWODr/aFkg==" + }, "require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -2296,6 +3083,11 @@ "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.2.1.tgz", "integrity": "sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==" }, + "safe-stable-stringify": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/safe-stable-stringify/-/safe-stable-stringify-2.4.2.tgz", + "integrity": "sha512-gMxvPJYhP0O9n2pvcfYfIuYgbledAOJFcqRThtPRmjscaipiwcwPPKLytpVzMkG2HAN87Qmo2d4PtGiri1dSLA==" + }, "set-blocking": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/set-blocking/-/set-blocking-2.0.0.tgz", @@ -2307,6 +3099,24 @@ "integrity": "sha512-MATJdZp8sLqDl/68LfQmbP8zKPLQNV6BIZoIgrscFDQ+RsvK/BxeDQOgyxKKoh0y/8h3BqVFnCqQ/gd+reiIXA==", "optional": true }, + "sonic-boom": { + "version": "2.8.0", + "resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-2.8.0.tgz", + "integrity": "sha512-kuonw1YOYYNOve5iHdSahXPOK49GqwA+LZhI6Wz/l0rP57iKyXXIHaRagOBHAPmGwJC6od2Z9zgvZ5loSgMlVg==", + "requires": { + "atomic-sleep": "^1.0.0" + } + }, + "split2": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/split2/-/split2-4.1.0.tgz", + "integrity": "sha512-VBiJxFkxiXRlUIeyMQi8s4hgvKCSjtknJv/LVYbrgALPwf5zSKmEwV9Lst25AkvMDnvxODugjdl6KZgwKM1WYQ==" + }, + "stream-shift": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz", + "integrity": "sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ==" + }, "string_decoder": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-1.3.0.tgz", @@ -2333,6 +3143,15 @@ "ansi-regex": "^5.0.1" } }, + "strtok3": { + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/strtok3/-/strtok3-6.3.0.tgz", + "integrity": "sha512-fZtbhtvI9I48xDSywd/somNqgUHl2L2cstmXCCif0itOf96jeW18MBSyrLuNicYQVkvpOxkZtkzujiTJ9LW5Jw==", + "requires": { + "@tokenizer/token": "^0.3.0", + "peek-readable": "^4.1.0" + } + }, "tar-fs": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", @@ -2356,11 +3175,28 @@ "readable-stream": "^3.1.1" } }, + "thread-stream": { + "version": "0.15.2", + "resolved": "https://registry.npmjs.org/thread-stream/-/thread-stream-0.15.2.tgz", + "integrity": "sha512-UkEhKIg2pD+fjkHQKyJO3yoIvAP3N6RlNFt2dUhcS1FGvCD1cQa1M/PGknCLFIyZdtJOWQjejp7bdNqmN7zwdA==", + "requires": { + "real-require": "^0.1.0" + } + }, "through": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, + "token-types": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/token-types/-/token-types-4.2.1.tgz", + "integrity": "sha512-6udB24Q737UD/SDsKAHI9FCRP7Bqc9D/MQUV02ORQg5iskjtLJlZJNdN4kKtcdtwCeWIwIHDGaUsTsCCAa8sFQ==", + "requires": { + "@tokenizer/token": "^0.3.0", + "ieee754": "^1.2.1" + } + }, "tr46": { "version": "0.0.3", "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", diff --git a/package.json b/package.json index 711e894..0e97f41 100644 --- a/package.json +++ b/package.json @@ -1,6 +1,6 @@ { "name": "node-red-contrib-whatsapp-link", - "version": "0.1.30", + "version": "0.1.32", "description": "Node to send and receive whatsapp messages in groups and chats. | No third party APIs", "repository": { "type": "git", @@ -25,13 +25,14 @@ "whatsapp chats-in": "chats-in.js", "whatsapp chats-out": "chats-out.js", "whatsapp group-out": "group-out.js", - "whatsapp reply": "reply.js", + "whatsapp reply": "whatsappReply.js", "whatsapp Link": "whatsappLink.js" } }, "dependencies": { "qrcode": "^1.5.1", - "whatsapp-web.js": "latest" + "whatsapp-web.js": "latest", + "@adiwajshing/baileys": "^5.0.0" }, "engines": { "node": ">=8.0.0" diff --git a/whatsappLink.html b/whatsappLink.html index 142836f..ba70194 100644 --- a/whatsappLink.html +++ b/whatsappLink.html @@ -3,21 +3,35 @@ category: 'config', defaults: { cName : {value:"whatsapp-web",required:true}, - name : {value : "Web"} + name : {value : "Web"}, + clientType: {} }, label: function() { - return this.cName ; + return this.clientType; + }, + oneditprepare: function(){ + $("#node-config-input-clientType").typedInput({ + types: [ + { + value: "Select Client Type", + options: [ + { value: "waWebClient", label: "Whatsapp Web"}, + { value: "waSocketClient", label: "Whatsapp Lite"}, + ] + } + ] + }) } }); \ No newline at end of file diff --git a/whatsappLink.js b/whatsappLink.js index dcdafaf..668cc0b 100644 --- a/whatsappLink.js +++ b/whatsappLink.js @@ -1,38 +1,79 @@ module.exports = function(RED) { const { Client, LocalAuth } = require('whatsapp-web.js'); + const makeWASocket = require('@adiwajshing/baileys'); + const { useMultiFileAuthState } = makeWASocket const QRCode = require('qrcode'); + const FS = require('node:fs') const OS = require('os'); const Path = require('path'); let userDir = OS.homedir(); let whatsappLinkDir = Path.join(userDir, '.node-red', 'Whatsapp-Link'); + let whatsappLinkDirSocket = Path.join(whatsappLinkDir, 'WA-Sockets') function RemoteClientNode(n) { RED.nodes.createNode(this,n); - let WAnode = this; - let whatsappConnectionStatus; - - const client = new Client({ - authStrategy : new LocalAuth({ - dataPath : whatsappLinkDir - }), - puppeteer : { - headless : true, - args : ['--no-sandbox', '--disable-setuid-sandbox'] - } - }); + var WAnode = this; + var clientType = n.clientType; + var whatsappConnectionStatus; + var client - let WAConnect = function(){ + var WAConnect = function(){ + const webClient = new Client({ + authStrategy : new LocalAuth({ + dataPath : whatsappLinkDir + }), + puppeteer : { + headless : true, + args : ['--no-sandbox', '--disable-setuid-sandbox'] + } + }); + try { - client.initialize(); + webClient.initialize(); WAnode.log("Status : Initializing Whatsapp.."); } catch(e) { WAnode.log(`Error : Unable to start Whatsapp. Try Again..`); }; + return webClient ; + }; + + if (clientType ==="waWebClient"){ + client = WAConnect(); + WAnode.connectionSetupID = setInterval(connectionSetup, 10000); + + function WAClose(){ + try { + client.destroy(); + } + catch(e){ + WAnode.err(`Error : Too many instructions! Try again.`) + } + }; + + var WARestart = function(){ + WAClose(); + WAConnect(); + } + + async function connectionSetup(){ + try { + whatsappConnectionStatus = await client.getState(); + if(whatsappConnectionStatus === "CONNECTED"){ + clearInterval(WAnode.connectionSetupID); + } + else { + WAnode.log(`Status : Connecting to Whatsapp...`); + } + } + catch(e){ + WAnode.log(`Error : Waiting for Initializion...`); + } + }; //QR-Code on Terminal and Ready Status. client.on("qr", (qr)=>{ - clearInterval(connectionSetupID); + clearInterval(WAnode.connectionSetupID); QRCode.toString(qr, {type : 'terminal', small:true }, function(err, QRTerminal){ WAnode.log(`To Connect, Scan the QR Code through your Whatsapp Mobile App.`) console.log(""); @@ -42,85 +83,126 @@ module.exports = function(RED) { client.on("ready", ()=>{ WAnode.log(`Status : Whatsapp Connected`); }); + + //Whatsapp-Link Test Features (For Status and Testing Only.) + client.on('message_create', async (msg)=> { + if (msg.body.startsWith('!nodered')){ + let chat = await msg.getChat(); + let contact = await msg.getContact(); + if (chat.isGroup){ + let msgReply = + `Hi From Node-Red. + ------------------ + Group Name : ${chat.name}, + Group Id : ${chat.id.user}, + Group Admin : ${chat.groupMetadata.owner.user}, + Participants : ${chat.groupMetadata.size}` + msg.reply(msgReply); + } + else { + let msgReply = `Hi @${contact.number} From Node-Red.` + chat.sendMessage(msgReply, { + mentions : [contact] + }); + } + + } + + }); + + client.WAConnect = WAConnect; + client.WARestart = WARestart; + client.WAClose = WAClose; + client.clientType = clientType; + WAnode.client = client; }; - WAConnect(); - //Whatsapp-Link Test Features (For Status and Testing Only.) - client.on('message_create', async (msg)=> { - if (msg.body.startsWith('!nodered')){ - let chat = await msg.getChat(); - let contact = await msg.getContact(); - if (chat.isGroup){ - let msgReply = -`Hi From Node-Red. ------------------- -Group Name : ${chat.name}, -Group Id : ${chat.id.user}, -Group Admin : ${chat.groupMetadata.owner.user}, -Participants : ${chat.groupMetadata.size}` - msg.reply(msgReply); - } - else { - let msgReply = `Hi @${contact.number} From Node-Red.` - chat.sendMessage(msgReply, { - mentions : [contact] - }); - } + if (clientType === "waSocketClient"){ - } + async function connectSocketClient() { + const { state, saveCreds } = await useMultiFileAuthState(whatsappLinkDirSocket); + const socketClient = makeWASocket.default({ + printQRInTerminal: false, + auth : state + }) - }); + socketClient.ev.on('creds.update', saveCreds) + + socketClient.ev.on('connection.update', (update) => { + const { connection, lastDisconnect } = update + if (connection === 'close') { + // reconnect if not logged out + + if ( + lastDisconnect && + lastDisconnect.error && + lastDisconnect.error.output && + (lastDisconnect.error.output.statusCode === 410 || + lastDisconnect.error.output.statusCode === 428 || + lastDisconnect.error.output.statusCode === 515) + ) { + connectSocketClient() + } else { + if ( + lastDisconnect && + lastDisconnect.error && + lastDisconnect.error.output && + lastDisconnect.error.output.statusCode === 401 + ) { + FS.rmSync(whatsappLinkDirSocket, {recursive : true, force: true}) + connectSocketClient() + + } else { + console.log('Error unexpected', update) + } + } + } + if(update.qr){ + QRCode.toDataURL(update.qr, function(err, url){ + var qrImageWithID = {}; + qrImageWithID.id = WAnode.id; + qrImageWithID.image = url; + RED.comms.publish("whatsappLinkQrCode", qrImageWithID); + }); - function WAClose(){ - try { - client.destroy(); - WAnode.client.destroy(); - } - catch(e){ - WAnode.err(`Error : Too many instructions! Try again.`) - } - }; + QRCode.toString(update.qr, {type : 'terminal', small:true }, function(err, QRTerminal){ + WAnode.log(`To Connect, Scan the QR Code through your Whatsapp Mobile App.`) + console.log(""); + console.log(QRTerminal); + }); + } + if (connection === 'open') { + var qrImageWithID = {}; + qrImageWithID.id = WAnode.id; + qrImageWithID.image = null; + RED.comms.publish("whatsappLinkQrCode", qrImageWithID); + } + }) + return socketClient + }; + client = connectSocketClient(); + client.clientType = clientType; + WAnode.client = client + }; - async function connectionSetup(){ - try { - whatsappConnectionStatus = await client.getState(); - if(whatsappConnectionStatus === "CONNECTED"){ - clearInterval(connectionSetupID); + + this.on('close', (removed, done)=>{ + if(removed){ + if(clientType === "waWebClient"){ + clearInterval(WAnode.connectionSetupID); + WAnode.client.WAClose(); + } } else { - WAnode.log(`Status : Connecting to Whatsapp...`); + if(clientType === "waWebClient"){ + clearInterval(WAnode.connectionSetupID); + WAnode.client.WAClose(); + } } - } - catch(e){ - WAnode.log(`Error : Waiting for Initializion...`); - } - }; - let connectionSetupID = setInterval(connectionSetup, 10000); - - let WARestart = function(){ - WAClose(); - WAConnect(); - } + done(); - this.on('close', (removed, done)=>{ - if(removed){ - clearInterval(connectionSetupID); - WAClose(); - } - else { - clearInterval(connectionSetupID); - WAClose(); - } - done(); - - }); - - - this.WAConnect = WAConnect; - this.client = client; - this.WARestart = WARestart; - this.WAClose = WAClose; - this.whatsappConnectionStatus = whatsappConnectionStatus; + }); + } RED.nodes.registerType("whatsappLink",RemoteClientNode); } \ No newline at end of file diff --git a/reply.html b/whatsappReply.html similarity index 100% rename from reply.html rename to whatsappReply.html diff --git a/reply.js b/whatsappReply.js similarity index 100% rename from reply.js rename to whatsappReply.js