2023-02-13 12:43:00 +00:00
'use strict' ;
const { initIO } = require ( "./helpers/socket" )
const backup _session = require ( './helpers/backup_session' ) ;
const restore = require ( './helpers/restore' ) ;
const { Client , Location , List , Buttons , LocalAuth } = require ( 'whatsapp-web.js/index' ) ;
const { MessageMedia } = require ( './node_modules/whatsapp-web.js/src/structures' ) ;
const qrencode = require ( 'qr-encode' ) ;
const axios = require ( 'axios' ) . default ;
const bodyparser = require ( 'body-parser' ) ;
const path = require ( 'path' ) ;
const fs = require ( 'fs' ) ;
const express = require ( 'express' ) ;
// const dbcloud = require('./funcs/dbcloud.js');
const FormData = require ( 'form-data' ) ;
const logger = require ( 'logger' )
const dotenv = require ( 'dotenv' ) ;
dotenv . config ( { path : '.env' } ) ;
const mime = require ( 'mime' ) ;
const qrcode = require ( 'qrcode-terminal' ) ;
const omnihit = require ( './funcs/omnihit.js' ) ;
const { allowedNodeEnvironmentFlags } = require ( 'process' ) ;
require ( "./funcs/tools.js" ) ( ) ;
let scheduler _messages _outbound ;
let scheduler _monitor ;
let scheduler _monitor _cell ;
let client ;
// const PORT = 80;
let sendSeen = false
let unreadMessaesProcess
const { imageUpload } = require ( './helpers/image-uploader' )
var QRCODE = "0" ;
var mobileuid ;
var destroy ;
let asking _qrcode = false
const dbcc = require ( './helpers/mysql_conn.js' ) ;
const removeDir = require ( './helpers/remove_dir' ) ;
// (async()=>{
// backup_session(destroy)
// clearTimeout(destroy)
// })
// console.log('PASSOU............')
// return
// Sleep
const sleep = ( ms ) => {
return new Promise ( ( resolve ) => setTimeout ( resolve , ms ) ) ;
} ;
const app = express ( ) ;
app . use ( express . static ( path . join ( _ _dirname , 'public' ) ) ) ;
//app.use(bodyparser.urlencoded({ extended: true }));
app . use ( bodyparser . json ( ) ) ;
const sessionName = process . env . MOBILEUID ;
// console.log('DIRNAME: ', path.join(__dirname, '.wwebjs_auth', 'session-omnihit_sesssion'))
//TEST DEL
console . log ( 'process.env.CLIENT_URL: ' , process . env . CLIENT _URL )
console . log ( '1' ) ;
// Connect to server
var io = require ( 'socket.io-client' ) ;
// const socket = initIO('http://localhost:8024')
const socketIo = io ( process . env . CLIENT _URL , { reconnect : true , maxHttpBufferSize : 1e8 } ) ;
socketIo . on ( 'connect' , async function ( ) {
console . log ( 'Made socket connection' , socketIo . id ) ;
console . log ( 'process.env.WHATSAPP_ID: ' , process . env . WHATSAPP _ID )
socketIo . emit ( 'joinWhatsSession' , process . env . WHATSAPP _ID ) ;
sendSeen = true
if ( mobileuid ) {
console . log ( 'Socket conectado com o cliente: ' , mobileuid )
setTimeout ( async ( ) => {
console . log ( 'Entro no syncUnreadMessages ON CONNECTED SOCKET' )
await syncUnreadMessages ( client )
client . sendPresenceAvailable ( ) ;
} , 5000 )
}
} ) ;
socketIo . on ( 'message_from_server' , function ( ) {
console . log ( 'message_from_server data: ' ) ;
} ) ;
// socketIo.on('disconnect', function () {
// console.log('disconnect');
// });
// Send a message to the server 3 seconds after initial connection.
// setInterval(function () {
// socketIo.emit('message_from_client', 'Sent an event from the client!');
// }, 3000);
socketIo . on ( 'connect_error' , async function ( err ) {
console . log ( 'connection errror' , err ) ;
sendSeen = false
if ( mobileuid ) {
client . sendPresenceUnavailable ( )
}
} ) ;
//
//NOVA OPÇÃO MD
client = new Client ( {
authStrategy : new LocalAuth ( { clientId : 'omnihit_sesssion' } ) ,
puppeteer : { args : [ '--no-sandbox' , '--disable-setuid-sandbox' ] , executablePath : process . env . CHROME _BIN || '/usr/bin/google-chrome-stable' } ,
} ) ;
client . initialize ( ) ;
client . on ( "qr" , async qr => {
console . log ( "Session:" , sessionName ) ;
// Generate and scan this code with your phone
QRCODE = qr ;
qrcode . generate ( qr , { small : true } )
console . log ( 'QR RECEIVED' , qr ) ;
// omnihit.qrcode(process.env.MOBILEUID, process.env.MOBILENAME, qr);
// omnihit.monitor(process.env.MOBILEUID, process.env.MOBILENAME, "STARTUP");
asking _qrcode = true
dbcc . query ( "UPDATE Whatsapps SET qrcode = ?, status = ?, retries = ? where id = ?" , [ qr , 'qrcode' , 0 , process . env . WHATSAPP _ID ] ,
function ( err , result ) {
if ( err )
console . log ( "ERROR: " + err ) ;
// else
// console.log('myslq result: ', result);
} ) ;
let url = process . env . CLIENT _URL + '/whatsapp/connection/qrcode'
try {
let response = await axios . post ( url , { whatsappId : process . env . WHATSAPP _ID } ) ;
} catch ( error ) {
console . log ( 'There was an error on POST THE DATA TO URL: ' , url , '\n' + error ) ;
}
} ) ;
client . on ( "authenticated" , async session => {
console . log ( ` Session: ${ sessionName } AUTHENTICATED ` ) ;
} ) ;
client . on ( "auth_failure" , async msg => {
console . log (
` Session: ${ sessionName } AUTHENTICATION FAILURE! Reason: ${ msg } `
) ;
omnihit . monitor ( process . env . MOBILEUID , process . env . MOBILENAME , "AUTHFAILURE" ) ;
//reject(new Error("Error starting whatsapp session."));
} ) ;
client . on ( "ready" , async ( ) => {
console . log ( ` Session: ${ sessionName } READY ` ) ;
// console.log('>>>>>>>>>>>>>> ready client.ts MOBILE NUMBER: ', client.info["wid"]["user"])
mobileuid = client . info [ "wid" ] [ "user" ] ;
console . log ( new Date ( ) . toISOString ( ) + " >>> Mobile UID ::: " + mobileuid ) ;
// logger.info(`Session: ${sessionName} READY`);
const whatsapp = await new Promise ( ( resolve , reject ) => {
dbcc . query ( "SELECT * from Whatsapps where id = ?" , [ process . env . WHATSAPP _ID ] , ( err , result ) => {
if ( err ) {
reject ( err )
}
else {
resolve ( result )
}
} ) ;
} )
if ( whatsapp [ 0 ] [ 'name' ] . includes ( client . info [ "wid" ] [ "user" ] ) ) {
console . log ( '-----------------> THIS IS THE RIGHT NUMBER' )
}
else {
console . log ( '-----------------> THIS IS THE WRONG NUMBER' )
let read _number = client . info [ "wid" ] [ "user" ]
let url = process . env . CLIENT _URL + '/whatsapp/connection/number'
try {
await client . logout ( )
let response = await axios . post ( url , { number : read _number } ) ;
} catch ( error ) {
console . log ( 'There was an error on POST THE DATA TO URL: ' , url , '\n' + error ) ;
}
return
}
dbcc . query ( "UPDATE Whatsapps SET qrcode = ?, status = ?, retries = ?, number = ? where id = ?" , [ "" , 'CONNECTED' , 0 , client . info [ "wid" ] [ "user" ] , process . env . WHATSAPP _ID ] ,
function ( err , result ) {
if ( err )
console . log ( "ERROR: " + err ) ;
// else
// console.log('myslq result: ', result);
} ) ;
let url = process . env . CLIENT _URL + '/whatsapp/connection/qrcode'
try {
let response = await axios . post ( url , { whatsappId : process . env . WHATSAPP _ID } ) ;
} catch ( error ) {
console . log ( 'There was an error on POST THE DATA TO URL: ' , url , '\n' + error ) ;
}
console . log ( 'SEND SEEN: ' , sendSeen )
await syncUnreadMessages ( client )
if ( sendSeen ) {
client . sendPresenceAvailable ( ) ;
}
// if(asking_qrcode){
// // backup_session(destroy, 120000, true)
// }
backup _session ( destroy , 120000 , false )
asking _qrcode = false
console . log ( 'PASSOU............' )
} ) ;
async function read ( ) {
let chats = await client . getState ( ) ;
console . log ( chats ) ;
}
client . on ( "message_create" , async msg => {
2023-04-08 22:28:32 +00:00
// if (msg.hasMedia && msg.fromMe)
// return
2023-02-13 12:43:00 +00:00
await handleMessage ( msg ) ;
} ) ;
client . on ( "media_uploaded" , async msg => {
console . log ( 'Entrou no midia upload' )
let msgContact = null
let media = null
if ( msg . fromMe ) {
msgContact = await client . getContactById ( msg . to ) ;
}
else {
msgContact = await msg . getContact ( ) ;
}
const chat = await msg . getChat ( ) ;
msgContact . getProfilePicUrl = await msgContact . getProfilePicUrl ( )
let quotedMsg = await msg . getQuotedMessage ( ) ;
if ( msg . hasMedia ) {
media = await msg . downloadMedia ( ) ;
}
let data = {
id : process . env . WHATSAPP _ID ,
msg : msg ,
msgContact : msgContact ,
chat : chat ,
quotedMsg : quotedMsg ? quotedMsg . id . id : null ,
media : media
}
socketIo . emit ( "media_uploaded" , data ) ;
} ) ;
client . on ( "message_ack" , async ( msg , ack ) => {
let data = {
whatsappId : process . env . WHATSAPP _ID ,
id : msg . id . id ,
ack : ack
}
socketIo . emit ( "message_ack" , data ) ;
} ) ;
socketIo . on ( 'send_message' , async data => {
console . log ( '#' )
console . log ( '--------------> send_message from number: ' , mobileuid ) ;
console . log ( '--------------> send_message to number: ' , data . msg . number ) ;
console . log ( '--------------> send_message body: ' , data . msg . body ) ;
console . log ( '--------------> send_message quotedMessageId: ' , data . msg . quotedMessageId ) ;
console . log ( '--------------> send_message linkPreview: ' , data . msg . linkPreview ) ;
console . log ( '#' )
const sentMessage = await client . sendMessage ( data . msg . number , data . msg . body , { quotedMessageId : data . msg . quotedMessageId , linkPreview : data . msg . linkPreview } ) ;
// console.log('=====================> sentMessage: ', sentMessage)
} ) ;
socketIo . on ( 'send_media' , async data => {
console . log ( '#' )
console . log ( '--------------> send_message from number: ' , mobileuid ) ;
console . log ( '--------------> send_message to number: ' , data . msg . number ) ;
// console.log('--------------> send_message media: ', data.msg.media);
console . log ( '--------------> send_message sendAudioAsVoice: ' , data . msg . sendAudioAsVoice ) ;
console . log ( '--------------> data.msg.media.mimetype: ' , data . msg . media . mimetype ) ;
console . log ( '--------------> data.msg.media.filename: ' , data . msg . media . filename ) ;
console . log ( '#' )
let media = new MessageMedia ( data . msg . media . mimetype , data . msg . media . data , data . msg . media . file ) ;
if ( media && ! media . filename )
media . filename = data . msg . media . filename
const sentMessage = await client . sendMessage ( data . msg . number , media , { sendAudioAsVoice : data . msg . sendAudioAsVoice } ) ;
// const fullFilename = process.cwd() + process.env.MEDIA_DOWNLOAD_IN + data.msg.media.filename;
// console.log('fullFIlename: ', fullFilename)
// fs.writeFileSync(fullFilename, data.msg.media.data, { encoding: 'base64' });
} ) ;
client . on ( "change_state" , async newState => {
let omnihit _url = process . env . CLIENT _URL + '/whatsapp/connection/monitor'
// logger.info(`Monitor session: ${sessionName}, ${newState}`);
console . log ( '>>>>>>>>>>>>>> change_state wbotMonitor.ts MOBILE NUMBER: ' , client . info [ "wid" ] [ "user" ] )
let data = {
action : 'change_state' ,
whatsappId : process . env . WHATSAPP _ID
} ;
await whatsappMonitor ( newState , omnihit _url , data ) ;
} ) ;
client . on ( "disconnected" , async reason => {
let omnihit _url = process . env . CLIENT _URL + '/whatsapp/connection/monitor'
console . log ( '>>>>>>>>>>>>>> change_state wbotMonitor.ts MOBILE NUMBER: ' , client . info [ "wid" ] [ "user" ] )
let data = {
action : 'disconnected' ,
whatsappId : process . env . WHATSAPP _ID ,
reason : reason
} ;
await removeDir ( path . join ( _ _dirname , '.wwebjs_auth' , 'session-omnihit_sesssion' ) )
setTimeout ( ( ) => {
process . exit ( )
} , 3000 )
await whatsappMonitor ( 'OPENING' , omnihit _url , data ) ;
} ) ;
app . get ( '/' , function ( req , res ) { return res . send ( 'Express + TypeScript Server' ) ; } ) ;
app . post ( '/start' , function ( req , res ) {
client . initialize ( ) ;
res . send ( "OK" ) ;
} ) ;
app . post ( '/qr' , function ( req , res ) {
res . send ( QRCODE ) ;
} ) ;
app . post ( '/api/getWbotMessage' , async ( req , res ) => {
const { number , messageId , limit } = req . body
console . log ( 'number: ' , number , ' | limit: ' , limit )
const wbotChat = await client . getChatById ( number ) ;
const fetchWbotMessagesGradually = async ( ) => {
const chatMessages = await wbotChat . fetchMessages ( { limit } ) ;
const msgFound = chatMessages . find ( msg => msg . id . id === messageId ) ;
if ( ! msgFound && limit < 100 ) {
limit += 20 ;
return fetchWbotMessagesGradually ( ) ;
}
return msgFound ;
} ;
try {
const msgFound = await fetchWbotMessagesGradually ( ) ;
if ( ! msgFound ) {
res . status ( 404 ) . json ( { message : "Cannot found message within 100 last messages" } ) ;
return
}
res . status ( 200 ) . json ( { message : "ok" , data : msgFound } ) ;
} catch ( err ) {
console . log ( 'ERR_FETCH_WAPP_MSG: ' , err )
res . status ( 404 ) . json ( { message : "ERR_FETCH_WAPP_MSG" } ) ;
}
} )
app . post ( '/api/disconnect' , async ( req , res ) => {
try {
console . log ( 'Restaring the session.........' )
await removeDir ( path . join ( _ _dirname , '.wwebjs_auth' , 'session-omnihit_sesssion' ) )
await client . logout ( ) ;
setTimeout ( ( ) => {
process . exit ( )
} , 3000 )
} catch ( error ) {
console . log ( 'There was an error on try disconnect the whatsapp: ' , error )
}
res . status ( 200 ) . json ( { message : "ok" } ) ;
} )
app . post ( '/api/DeleteWhatsAppMessage' , async ( req , res ) => {
const { number , messageId , limit } = req . body
console . log ( 'number: ' , number , ' | messageId: ' , messageId , ' | limit: ' , limit )
try {
const messageToDelete = await getWbotMessage ( messageId , number , limit )
await messageToDelete . delete ( true ) ;
res . status ( 200 ) . json ( { message : "ok" , data : messageToDelete } ) ;
return
} catch ( error ) {
console . log ( 'There was an error on try disconnect the whatsapp: ' , error )
res . status ( 500 ) . json ( { message : "There was an error on trying delete the message" } ) ;
return
}
} )
app . post ( '/api/GetProfilePicUrl' , async ( req , res ) => {
const { number } = req . body
console . log ( 'THE NUMBER: ' , number )
const profilePicUrl = await client . getProfilePicUrl ( ` ${ number } @c.us ` ) ;
res . status ( 200 ) . json ( { message : "ok" , data : profilePicUrl } ) ;
} )
app . post ( '/api/restore' , async ( req , res ) => {
await restore ( client )
res . status ( 200 ) . json ( { message : "ok" } ) ;
} )
app . get ( '/api/connection/status' , async ( req , res ) => {
let stat
try {
stat = await client . getState ( ) ;
} catch ( err ) {
let terr = err . message ;
stat = ( terr . search ( 'Session closed' ) > - 1 ? 'SESSIONCLOSED' : 'UNKNOWN' )
}
res . status ( 200 ) . json ( { message : "ok" , data : stat } ) ;
} )
const syncUnreadMessages = async ( wbot ) => {
console . log ( 'ENTROU NO UNREAD MESSAGES +++++++++++++=' )
const chats = await wbot . getChats ( ) ;
/* eslint-disable no-restricted-syntax */
/* eslint-disable no-await-in-loop */
for ( const chat of chats ) {
if ( chat . unreadCount > 0 ) {
const unreadMessages = await chat . fetchMessages ( {
limit : chat . unreadCount
} ) ;
for ( const msg of unreadMessages ) {
// console.log('--BACKEND MSG: ', msg)
if ( ! sendSeen ) {
return
}
await handleMessage ( msg , wbot ) ;
}
console . log ( ':::::::::::::::::::::::::::::PASSOU' )
await chat . sendSeen ( ) ;
}
}
} ;
const getWbotMessage = async ( messageId , number , limit , ) => {
const wbotChat = await client . getChatById ( number ) ;
const fetchWbotMessagesGradually = async ( ) => {
const chatMessages = await wbotChat . fetchMessages ( { limit } ) ;
const msgFound = chatMessages . find ( msg => msg . id . id === messageId ) ;
if ( ! msgFound && limit < 100 ) {
limit += 20 ;
return fetchWbotMessagesGradually ( ) ;
}
return msgFound ;
} ;
try {
const msgFound = await fetchWbotMessagesGradually ( ) ;
if ( ! msgFound ) {
return null
}
return msgFound
} catch ( err ) {
console . log ( 'ERR_FETCH_WAPP_MSG: ' , err )
}
return null
}
async function whatsappMonitor ( newState , omnihit _url , data ) {
dbcc . query ( "UPDATE Whatsapps SET status = ? where id = ?" , [ newState , process . env . WHATSAPP _ID ] ,
function ( err , result ) {
if ( err )
console . log ( "ERROR: " + err ) ;
// else
// console.log('myslq result: ', result);
} ) ;
try {
let response = await axios . post ( omnihit _url , data ) ;
} catch ( error ) {
console . log ( 'There was an error on POST THE DATA TO URL: ' , omnihit _url , '\n' + error ) ;
}
}
async function handleMessage ( msg ) {
console . log ( 'Entrou no message_create' ) ;
let msgContact = null ;
let media = null ;
if ( msg . fromMe ) {
msgContact = await client . getContactById ( msg . to ) ;
}
else {
console . log ( '################# RECEIVING MESSAGE FROM: ' , msg . from , ' to ' , msg . to )
msgContact = await msg . getContact ( ) ;
}
const chat = await msg . getChat ( ) ;
msgContact . getProfilePicUrl = await msgContact . getProfilePicUrl ( ) ;
let quotedMsg = await msg . getQuotedMessage ( ) ;
if ( msg . hasMedia ) {
media = await msg . downloadMedia ( ) ;
}
let data = {
id : process . env . WHATSAPP _ID ,
msg : msg ,
msgContact : msgContact ,
chat : chat ,
quotedMsg : quotedMsg ? quotedMsg . id . id : null ,
media : media
} ;
socketIo . emit ( "message_create" , data ) ;
}
async function getlabels ( ) {
var ret = await client . getContactById ( '551721379544-1625752306@g.us' ) ;
//createGroup('The books', ['551100000000@c.us']);
console . log ( "-- Chats --------------------------------" ) ;
console . log ( ret ) ;
return ret ;
}
function base64 _encode ( file ) {
// read binary data
var bitmap = fs . readFileSync ( file ) ;
// convert binary data to base64 encoded string
return new Buffer ( bitmap ) . toString ( 'base64' ) ;
}
function getBase64 ( url ) {
return axios
. get ( url , {
responseType : 'arraybuffer'
} )
. then ( response => Buffer . from ( response . data , 'binary' ) . toString ( 'base64' ) )
}
function downloadMedia ( url ) {
let base64 = axios . get ( url , { response : "arraybuffer" } ) . toString ( "base64" ) ;
console . log ( "-- BASE64 -------------------------------" ) ;
console . log ( base64 ) ;
return base64 ;
}
async function validate ( mobile , cb ) {
// let ret = await client.isRegisteredUser(mobile);
let ret = await client . isRegisteredUser ( ` ${ mobile } @c.us ` ) ;
// ///////////////////////////////////////////////////// 5571992888229 casaes
let _validNumber = null
console . log ( '******** mobile: ' , mobile )
try {
_validNumber = ( await client . getNumberId ( ` ${ mobile } @c.us ` ) ) . user ;
} catch ( err ) {
console . log ( ` Error number: ${ err } ` )
}
console . log ( '_validNumber: ' , _validNumber )
////////////////////////////////////////////////////////////////////
cb ( { isValid : ret , number : _validNumber } ) ;
// cb(ret)
}
app . post ( '/api/validate' , ( req , res ) => {
console . log ( 'ENTROU' )
let mobile = req . body [ 'mobile' ] ;
console . log ( new Date ( ) + " >>> Validating Registration Number ::: " + mobile + " on WhatsApp ..." ) ;
validate ( mobile , function ( e ) {
res . send ( e ) ;
} ) ;
} ) ;
app . post ( '/api/chat' , ( req , res ) => {
let mobile = req . body [ 'mobile' ] ;
let message = req . body [ 'message' ] ;
console . log ( new Date ( ) + " >>> Send Message ::: " + mobile + " ..." ) ;
client . sendMessage ( mobile , message ) ;
res . send ( 'OK' ) ;
} ) ;
app . post ( '/group' , function ( req , res ) {
//var ret = client.createGroup("Prueba", ["55@c.us"]);
var ret = getlabels ( )
res . send ( ret ) ;
} ) ;
app . post ( '/stop' , function ( req , res ) {
client . destroy ( ) ;
res . send ( "OK" ) ;
} ) ;
app . post ( '/api/status' , function ( req , res ) {
res . send ( "OK" ) ;
} ) ;
async function monitor ( ) {
let _nextime = 0 ;
try {
clearInterval ( scheduler _monitor ) ;
let stat ;
if ( mobileuid != undefined ) {
try {
stat = await client . getState ( ) ;
} catch ( err ) {
let terr = err . message ;
stat = ( terr . search ( 'Session closed' ) > - 1 ? 'SESSIONCLOSED' : 'UNKNOWN' )
}
// omnihit.monitor(process.env.MOBILEUID, process.env.MOBILENAME, stat);
_nextime = 30000 ;
} else {
_nextime = 10000 ;
}
console . log ( ` WHATSAPP_ID: ${ process . env . WHATSAPP _ID } | CLIENT MOBILEUID: ${ mobileuid } | NAME: ${ process . env . MOBILENAME } | ENV MOBILEUID: ${ process . env . MOBILEUID } | STATUS: ${ stat } ` )
} catch ( error ) {
//new Date(new Date() + 'UTC')
// console.log(new Date().toISOString() + " >>> ", error);
console . log ( new Date ( new Date ( ) + 'UTC' ) + " >>> " , error ) ;
} finally {
scheduler _monitor = setInterval ( monitor , _nextime ) ;
}
}
async function monitorCell ( ) {
try {
clearInterval ( scheduler _monitor _cell ) ;
// let _contact_mobile = "5511954803572@c.us";
let _message = new Date ( new Date ( ) + 'UTC' ) ;
if ( client . info && client . info [ "wid" ] [ "user" ] ) {
client . sendMessage ( ` ${ process . env . MONITOR _NUMBER } @c.us ` , _message ) ;
}
} catch ( error ) {
console . log ( ` Error on send monitor message to number ${ process . env . MONITOR _NUMBER } from monitorCell function: ${ error } ` ) ;
} finally {
scheduler _monitor _cell = setInterval ( monitorCell , 1800000 ) ;
}
}
function comercialBuss ( until _hour ) {
const _hour = new Date ( ) . getHours ( )
console . log ( ' _hour: ' , _hour )
// const _minute = new Date().getMinutes()
// const _second = new Date().getSeconds()
if ( _hour >= until _hour ) {
console . log ( 'Trying send message into comercial buss!' )
return
}
}
scheduler _monitor = setInterval ( monitor , 10000 ) ;
app . listen ( process . env . PORT || 8003 , function ( ) {
console . log ( "\u26A1[server]: Server is running at Port ::: " + process . env . PORT || 8003 ) ;
} ) ;
process . on ( 'uncaughtException' , function ( err ) {
console . error ( ' ' ) ;
console . error ( '----- ' + ( new Date ) . toUTCString ( ) + ' ----------------------------------' )
console . error ( 'Erro uncaughtException: ' , err . message )
console . error ( err . stack )
console . error ( ' ' ) ;
return
} ) ;