feat: update library and add new routes

This commit is contained in:
Anton Voylenko 2025-05-31 14:49:23 +03:00
commit a35442d609
6 changed files with 431 additions and 25 deletions

34
package-lock.json generated
View file

@ -13,11 +13,11 @@
"dotenv": "^16.5.0",
"express": "^4.21.2",
"express-rate-limit": "^7.4.1",
"pino": "^9.6.0",
"pino": "^9.7.0",
"qr-image": "^3.2.0",
"qrcode-terminal": "^0.12.0",
"swagger-ui-express": "^5.0.1",
"whatsapp-web.js": "^1.28.0",
"whatsapp-web.js": "^1.28.1-alpha.0",
"ws": "^8.18.2"
},
"devDependencies": {
@ -6362,9 +6362,9 @@
}
},
"node_modules/pino": {
"version": "9.6.0",
"resolved": "https://registry.npmjs.org/pino/-/pino-9.6.0.tgz",
"integrity": "sha512-i85pKRCt4qMjZ1+L7sy2Ag4t1atFcdbEt76+7iRJn1g2BvsnRMGu9p8pivl9fs63M2kF/A0OacFZhTub+m/qMg==",
"version": "9.7.0",
"resolved": "https://registry.npmjs.org/pino/-/pino-9.7.0.tgz",
"integrity": "sha512-vnMCM6xZTb1WDmLvtG2lE/2p+t9hDEIvTWJsu6FejkE62vB7gDhvzrpFR4Cw2to+9JNQxVnkAKVPA1KPB98vWg==",
"license": "MIT",
"dependencies": {
"atomic-sleep": "^1.0.0",
@ -6372,7 +6372,7 @@
"on-exit-leak-free": "^2.1.0",
"pino-abstract-transport": "^2.0.0",
"pino-std-serializers": "^7.0.0",
"process-warning": "^4.0.0",
"process-warning": "^5.0.0",
"quick-format-unescaped": "^4.0.3",
"real-require": "^0.2.0",
"safe-stable-stringify": "^2.3.1",
@ -6533,9 +6533,19 @@
"optional": true
},
"node_modules/process-warning": {
"version": "4.0.0",
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-4.0.0.tgz",
"integrity": "sha512-/MyYDxttz7DfGMMHiysAsFE4qF+pQYAA8ziO/3NcRVrQ5fSk+Mns4QZA/oRPFzvcqNoVJXQNWNAsdwBXLUkQKw==",
"version": "5.0.0",
"resolved": "https://registry.npmjs.org/process-warning/-/process-warning-5.0.0.tgz",
"integrity": "sha512-a39t9ApHNx2L4+HBnQKqxxHNs1r7KF+Intd8Q/g1bUh6q0WIp9voPXJ/x0j+ZL45KF1pJd9+q2jLIRMfvEshkA==",
"funding": [
{
"type": "github",
"url": "https://github.com/sponsors/fastify"
},
{
"type": "opencollective",
"url": "https://opencollective.com/fastify"
}
],
"license": "MIT"
},
"node_modules/progress": {
@ -8108,9 +8118,9 @@
"license": "BSD-2-Clause"
},
"node_modules/whatsapp-web.js": {
"version": "1.28.0",
"resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.28.0.tgz",
"integrity": "sha512-rNIgtjjUzCFkOF2prypdkJv3tJw+vToOLjvmlRoMxyyEVlFzJvlvqpicbb5sE9ys4+vY10OzZRQscwC6rjo96w==",
"version": "1.28.1-alpha.0",
"resolved": "https://registry.npmjs.org/whatsapp-web.js/-/whatsapp-web.js-1.28.1-alpha.0.tgz",
"integrity": "sha512-vRmseUwlDcaRmTZ+9PVifnsEU6pRd7A6/ZjuIbzX6opOYYkNcfwXeO6AFuLrn+V7T+kiSeNweIUtiOtcuc9B0A==",
"license": "Apache-2.0",
"dependencies": {
"@pedroslopez/moduleraid": "^5.0.2",

View file

@ -13,11 +13,11 @@
"dotenv": "^16.5.0",
"express": "^4.21.2",
"express-rate-limit": "^7.4.1",
"pino": "^9.6.0",
"pino": "^9.7.0",
"qr-image": "^3.2.0",
"qrcode-terminal": "^0.12.0",
"swagger-ui-express": "^5.0.1",
"whatsapp-web.js": "^1.28.0",
"whatsapp-web.js": "^1.28.1-alpha.0",
"ws": "^8.18.2"
},
"devDependencies": {

View file

@ -1708,6 +1708,110 @@ const openChatWindow = async (req, res) => {
}
}
/**
* Open or scroll the chat window to the position of the message.
*
* @async
* @function
* @param {Object} req - The HTTP request object containing the chatId and sessionId.
* @param {string} req.body.chatId - The unique identifier of the chat to unmute.
* @param {string} req.params.sessionId - The unique identifier of the session associated with the client to use.
* @param {Object} res - The HTTP response object.
* @returns {Promise<Object>} - A Promise that resolves with a JSON object containing a success flag and the result of the operation.
* @throws {Error} - If an error occurs during the operation, it is thrown and handled by the catch block.
*/
const openChatWindowAt = async (req, res) => {
/*
#swagger.summary = 'Open the chat window to the position of the message'
#swagger.requestBody = {
required: true,
schema: {
type: 'object',
properties: {
messageId: {
type: 'string',
description: 'ID of the message to scroll to (serialized)',
example: 'false_31235678901@c.us_3A40CB10BC3680B1EE'
},
}
},
}
*/
try {
const { messageId } = req.body
const client = sessions.get(req.params.sessionId)
await client.interface.openChatWindowAt(messageId)
res.json({ success: true })
} catch (error) {
sendErrorResponse(res, 500, error.message)
}
}
/**
* Force reset of connection state for the client.
*
* @async
* @function
* @param {Object} req - The HTTP request object containing the chatId and sessionId.
* @param {string} req.body.chatId - The unique identifier of the chat to unmute.
* @param {string} req.params.sessionId - The unique identifier of the session associated with the client to use.
* @param {Object} res - The HTTP response object.
* @returns {Promise<Object>} - A Promise that resolves with a JSON object containing a success flag and the result of the operation.
* @throws {Error} - If an error occurs during the operation, it is thrown and handled by the catch block.
*/
const resetState = async (req, res) => {
/*
#swagger.summary = 'Force reset of connection state for the client'
*/
try {
const client = sessions.get(req.params.sessionId)
await client.resetState()
res.json({ success: true })
} catch (error) {
sendErrorResponse(res, 500, error.message)
}
}
/**
* Change the background synchronization setting.
*
* @async
* @function
* @param {Object} req - The HTTP request object containing the chatId and sessionId.
* @param {string} req.body.chatId - The unique identifier of the chat to unmute.
* @param {string} req.params.sessionId - The unique identifier of the session associated with the client to use.
* @param {Object} res - The HTTP response object.
* @returns {Promise<Object>} - A Promise that resolves with a JSON object containing a success flag and the result of the operation.
* @throws {Error} - If an error occurs during the operation, it is thrown and handled by the catch block.
*/
const setBackgroundSync = async (req, res) => {
/*
#swagger.summary = 'Change the background synchronization setting'
#swagger.description = 'NOTE: This action will take effect after you restart the client'
#swagger.requestBody = {
required: true,
schema: {
type: 'object',
properties: {
flag: {
type: 'boolean',
description: 'flag true/false',
example: true
},
}
},
}
*/
try {
const { flag = true } = req.body
const client = sessions.get(req.params.sessionId)
await client.setBackgroundSync(flag)
res.json({ success: true })
} catch (error) {
sendErrorResponse(res, 500, error.message)
}
}
module.exports = {
getClassInfo,
acceptInvite,
@ -1753,5 +1857,8 @@ module.exports = {
getContactDeviceCount,
getCountryCode,
getFormattedNumber,
openChatWindow
openChatWindow,
openChatWindowAt,
resetState,
setBackgroundSync
}

View file

@ -79,17 +79,22 @@ const deleteMessage = async (req, res) => {
type: 'boolean',
description: 'If true and the message is sent by the current user or the user is an admin, will delete it for everyone in the chat.',
example: true
},
clearMedia: {
type: 'boolean',
description: 'If true, any associated media will also be deleted from a device',
example: true
}
}
}
}
*/
try {
const { messageId, chatId, everyone } = req.body
const { messageId, chatId, everyone, clearMedia = true } = req.body
const client = sessions.get(req.params.sessionId)
const message = await _getMessageById(client, messageId, chatId)
if (!message) { throw new Error('Message not found') }
const result = await message.delete(everyone)
const result = await message.delete(everyone, clearMedia)
res.json({ success: true, result })
} catch (error) {
sendErrorResponse(res, 500, error.message)

View file

@ -104,6 +104,9 @@ clientRouter.post('/getContactDeviceCount/:sessionId', [middleware.sessionNameVa
clientRouter.post('/getCountryCode/:sessionId', [middleware.sessionNameValidation, middleware.sessionValidation], clientController.getCountryCode)
clientRouter.post('/getFormattedNumber/:sessionId', [middleware.sessionNameValidation, middleware.sessionValidation], clientController.getFormattedNumber)
clientRouter.post('/openChatWindow/:sessionId', [middleware.sessionNameValidation, middleware.sessionValidation], clientController.openChatWindow)
clientRouter.post('/openChatWindowAt/:sessionId', [middleware.sessionNameValidation, middleware.sessionValidation], clientController.openChatWindowAt)
clientRouter.post('/resetState/:sessionId', [middleware.sessionNameValidation, middleware.sessionValidation], clientController.resetState)
clientRouter.post('/setBackgroundSync/:sessionId', [middleware.sessionNameValidation, middleware.sessionValidation], clientController.setBackgroundSync)
/**
* ================

View file

@ -3664,10 +3664,10 @@
"schema": {
"type": "object",
"properties": {
"chatId": {
"type": "string",
"description": "ID of the chat",
"example": "6281288888888@c.us"
"flag": {
"type": "boolean",
"description": "flag true/false",
"example": true
}
}
}
@ -3676,10 +3676,10 @@
"schema": {
"type": "object",
"properties": {
"chatId": {
"type": "string",
"description": "ID of the chat",
"example": "6281288888888@c.us"
"flag": {
"type": "boolean",
"description": "flag true/false",
"example": true
}
}
}
@ -5130,6 +5130,277 @@
}
}
},
"/client/openChatWindowAt/{sessionId}": {
"post": {
"tags": [
"Client"
],
"summary": "Open the chat window to the position of the message",
"description": "",
"parameters": [
{
"name": "sessionId",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Unique identifier for the session (alphanumeric and - allowed)",
"example": "f8377d8d-a589-4242-9ba6-9486a04ef80c"
}
],
"responses": {
"200": {
"description": "OK"
},
"403": {
"description": "Forbidden.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ForbiddenResponse"
}
}
}
},
"404": {
"description": "Not Found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NotFoundResponse"
}
}
}
},
"422": {
"description": "Unprocessable Entity.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Server failure.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"apiKeyAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"messageId": {
"type": "string",
"description": "ID of the message to scroll to (serialized)",
"example": "false_31235678901@c.us_3A40CB10BC3680B1EE"
}
}
}
},
"application/xml": {
"schema": {
"type": "object",
"properties": {
"messageId": {
"type": "string",
"description": "ID of the message to scroll to (serialized)",
"example": "false_31235678901@c.us_3A40CB10BC3680B1EE"
}
}
}
}
}
}
}
},
"/client/resetState/{sessionId}": {
"post": {
"tags": [
"Client"
],
"summary": "Force reset of connection state for the client",
"description": "",
"parameters": [
{
"name": "sessionId",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Unique identifier for the session (alphanumeric and - allowed)",
"example": "f8377d8d-a589-4242-9ba6-9486a04ef80c"
}
],
"responses": {
"200": {
"description": "OK"
},
"403": {
"description": "Forbidden.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ForbiddenResponse"
}
}
}
},
"404": {
"description": "Not Found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NotFoundResponse"
}
}
}
},
"422": {
"description": "Unprocessable Entity.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Server failure.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"apiKeyAuth": []
}
]
}
},
"/client/setBackgroundSync/{sessionId}": {
"post": {
"tags": [
"Client"
],
"summary": "Change the background synchronization setting",
"description": "NOTE: This action will take effect after you restart the client",
"parameters": [
{
"name": "sessionId",
"in": "path",
"required": true,
"schema": {
"type": "string"
},
"description": "Unique identifier for the session (alphanumeric and - allowed)",
"example": "f8377d8d-a589-4242-9ba6-9486a04ef80c"
}
],
"responses": {
"200": {
"description": "OK"
},
"403": {
"description": "Forbidden.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ForbiddenResponse"
}
}
}
},
"404": {
"description": "Not Found.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/NotFoundResponse"
}
}
}
},
"422": {
"description": "Unprocessable Entity.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
},
"500": {
"description": "Server failure.",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/ErrorResponse"
}
}
}
}
},
"security": [
{
"apiKeyAuth": []
}
],
"requestBody": {
"required": true,
"content": {
"application/json": {
"schema": {
"type": "object",
"properties": {
"flag": {
"type": "boolean",
"description": "flag true/false",
"example": true
}
}
}
},
"application/xml": {
"schema": {
"type": "object",
"properties": {
"flag": {
"type": "boolean",
"description": "flag true/false",
"example": true
}
}
}
}
}
}
}
},
"/chat/getClassInfo/{sessionId}": {
"post": {
"tags": [
@ -8524,6 +8795,11 @@
"type": "boolean",
"description": "If true and the message is sent by the current user or the user is an admin, will delete it for everyone in the chat.",
"example": true
},
"clearMedia": {
"type": "boolean",
"description": "If true, any associated media will also be deleted from a device",
"example": true
}
}
}
@ -8546,6 +8822,11 @@
"type": "boolean",
"description": "If true and the message is sent by the current user or the user is an admin, will delete it for everyone in the chat.",
"example": true
},
"clearMedia": {
"type": "boolean",
"description": "If true, any associated media will also be deleted from a device",
"example": true
}
}
}