Files
bot-whatsapp/packages/provider/src/meta/server.js
Leifer Mendez 2ecc41f3f0 chore: pre-chore
2023-02-04 18:03:57 +01:00

109 lines
2.8 KiB
JavaScript

const { EventEmitter } = require('node:events')
const polka = require('polka')
const { urlencoded, json } = require('body-parser')
class MetaWebHookServer extends EventEmitter {
metaServer
metaPort
token
constructor(_token, _metaPort) {
super()
this.metaServer = polka()
this.metaPort = _metaPort
this.token = _token
this.buildHTTPServer()
}
/**
* Mensaje entrante
* emit: 'message'
* @param {*} req
* @param {*} res
*/
incomingMsg = (req, res) => {
const { body } = req
const messages = body.entry[0].changes[0].value?.messages
if (!messages) return
const [message] = messages
const to = body.entry[0].changes[0].value.metadata.display_phone_number
this.emit('message', {
from: message.from,
to,
body: message.text?.body,
})
const json = JSON.stringify({ body })
res.end(json)
}
/**
* Valida el token
* @alpha
* @param {string} mode
* @param {string} token
* @example tokenIsValid('subscribe', 'MYTOKEN')
*/
tokenIsValid(mode, token) {
return mode === 'subscribe' && this.token === token
}
/**
* Verificación del token
* @param {*} req
* @param {*} res
*/
verifyToken = (req, res) => {
const { query } = req
const mode = query['hub.mode']
const token = query['hub.verify_token']
const challenge = query['hub.challenge']
if (!mode || !token) {
return (res.statusCode = 403), res.end('No token!')
}
if (this.tokenIsValid(mode, token)) {
console.log('Webhook verified--->😎😎😎😎')
return (res.statusCode = 200), res.end(challenge)
}
if (!this.tokenIsValid(mode, token)) {
return (res.statusCode = 403), res.end('No token!')
}
}
/**
* Contruir HTTP Server
* @returns
*/
buildHTTPServer = () => {
this.metaServer.use(urlencoded({ extended: true })).get('/webhook', this.verifyToken)
this.metaServer
.use(urlencoded({ extended: true }))
.use(json())
.post('/webhook', this.incomingMsg)
}
/**
* Puerto del HTTP
* @param {*} port default 3000
*/
start = () => {
this.metaServer.listen(this.metaPort, () => {
console.log(``)
console.log(`[meta]: Agregar esta url "WHEN A MESSAGE COMES IN"`)
console.log(`[meta]: POST http://localhost:${this.metaPort}/webhook`)
console.log(`[meta]: Más información en la documentacion`)
console.log(``)
})
this.emit('ready')
}
}
module.exports = MetaWebHookServer