@wppconnect/server 2.2.3 → 2.2.5
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +4 -0
- package/Dockerfile +3 -3
- package/README.md +18 -7
- package/dist/config.js +21 -4
- package/dist/controller/deviceController.js +5 -4
- package/dist/controller/groupController.js +9 -5
- package/dist/controller/messageController.js +16 -4
- package/dist/controller/sessionController.js +20 -35
- package/dist/index.js +8 -2
- package/dist/middleware/instrumentation.js +39 -0
- package/dist/routes/index.js +17 -8
- package/dist/swagger.json +135 -105
- package/dist/tests/util/bufferUtils.test.js +54 -0
- package/dist/types/ServerOptions.js +1 -1
- package/dist/util/bucketAlreadyExists.js +26 -0
- package/dist/util/bufferutils.js +50 -0
- package/dist/util/chatWootClient.js +124 -38
- package/dist/util/createSessionUtil.js +20 -7
- package/dist/util/functions.js +69 -19
- package/dist/util/sessionUtil.js +23 -22
- package/jest.config.js +5 -0
- package/package.json +47 -49
- package/tsconfig.json +6 -4
package/CHANGELOG.md
CHANGED
package/Dockerfile
CHANGED
|
@@ -1,14 +1,14 @@
|
|
|
1
|
-
FROM node:lts-alpine3.
|
|
1
|
+
FROM node:lts-alpine3.18 as base
|
|
2
2
|
WORKDIR /usr/src/wpp-server
|
|
3
3
|
ENV NODE_ENV=production PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
|
|
4
|
-
COPY package.json
|
|
4
|
+
COPY package.json ./
|
|
5
5
|
RUN yarn install --production --pure-lockfile && \
|
|
6
6
|
yarn cache clean
|
|
7
7
|
|
|
8
8
|
FROM base as build
|
|
9
9
|
WORKDIR /usr/src/wpp-server
|
|
10
10
|
ENV PUPPETEER_SKIP_CHROMIUM_DOWNLOAD=true
|
|
11
|
-
COPY package.json
|
|
11
|
+
COPY package.json ./
|
|
12
12
|
RUN yarn install --production=false --pure-lockfile && \
|
|
13
13
|
yarn cache clean
|
|
14
14
|
COPY . .
|
package/README.md
CHANGED
|
@@ -10,13 +10,14 @@
|
|
|
10
10
|
[](https://github.com/wppconnect-team/wppconnect-server/actions/workflows/build.yml)
|
|
11
11
|
[](https://github.com/release-it/release-it)
|
|
12
12
|
|
|
13
|
-
|
|
13
|
+
Welcome to the **WPPConnect Server** repository, developed by the WPPConnect Team. Our mission is to provide a robust and ready-to-use API for seamless communication with WhatsApp. The server is designed to streamline the process of sending and receiving messages, managing contacts, creating groups, and much more, all while leveraging the power of JavaScript ES6, NodeJS, and a RESTful architecture.
|
|
14
14
|
|
|
15
15
|
- Javascript ES6
|
|
16
16
|
- NodeJS
|
|
17
17
|
- Restfull
|
|
18
18
|
|
|
19
19
|
## Our online channels
|
|
20
|
+
Connect with us across various platforms to stay updated and engage in discussions:
|
|
20
21
|
|
|
21
22
|
[](https://discord.gg/JU5JGGKGNG)
|
|
22
23
|
[](https://t.me/wppconnect)
|
|
@@ -24,12 +25,11 @@ Wppconnect Server is a ready-to-use API, just download, install, and start using
|
|
|
24
25
|
[](https://www.youtube.com/c/wppconnect)
|
|
25
26
|
|
|
26
27
|
## Documentations
|
|
28
|
+
Detailed documentation and guides are available for your convenience:
|
|
27
29
|
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
Or Swagger UI in your server. Acess router: "IP:PORT/api-docs"
|
|
30
|
+
- [Postman](https://documenter.getpostman.com/view/9139457/TzshF4jQ)
|
|
31
|
+
- [Swagger](https://wppconnect.io/swagger/wppconnect-server)
|
|
32
|
+
- Swagger UI can be accessed on your server through the route: "IP:PORT/api-docs"
|
|
33
33
|
|
|
34
34
|
## Features
|
|
35
35
|
|
|
@@ -38,7 +38,8 @@ Or Swagger UI in your server. Acess router: "IP:PORT/api-docs"
|
|
|
38
38
|
| Multiple Sessions | ✔ |
|
|
39
39
|
| Send **text, image, video and docs** | ✔ |
|
|
40
40
|
| Get **contacts list** | ✔ |
|
|
41
|
-
|
|
|
41
|
+
| Manage products | ✔ |
|
|
42
|
+
| Receive/Send messages | ✔ |
|
|
42
43
|
| Open/Close Session | ✔ |
|
|
43
44
|
| Change Profile/Username | ✔ |
|
|
44
45
|
| Create Group | ✔ |
|
|
@@ -55,6 +56,7 @@ Or Swagger UI in your server. Acess router: "IP:PORT/api-docs"
|
|
|
55
56
|
- Express
|
|
56
57
|
- Nodemon
|
|
57
58
|
- SocketIO
|
|
59
|
+
- S3
|
|
58
60
|
|
|
59
61
|
## Installation
|
|
60
62
|
|
|
@@ -189,6 +191,7 @@ This server use config.ts file to define some options, default values are:
|
|
|
189
191
|
'--ignore-certificate-errors',
|
|
190
192
|
'--ignore-ssl-errors',
|
|
191
193
|
'--ignore-certificate-errors-spki-list',
|
|
194
|
+
'--disable-features=LeakyPeeker' // Disable the browser's sleep mode when idle, preventing the browser from going into sleep mode, this is useful for WhatsApp not to be in economy mode in the background, avoiding possible crashes
|
|
192
195
|
],
|
|
193
196
|
},
|
|
194
197
|
mapper: {
|
|
@@ -211,6 +214,14 @@ This server use config.ts file to define some options, default values are:
|
|
|
211
214
|
redisDb: 0,
|
|
212
215
|
redisPrefix: 'docker',
|
|
213
216
|
},
|
|
217
|
+
// Your configurations yo upload on AWS
|
|
218
|
+
aws_s3: {
|
|
219
|
+
region: 'sa-east-1',
|
|
220
|
+
access_key_id: '',
|
|
221
|
+
secret_key: '',
|
|
222
|
+
// If you already have a bucket created that will be used. Will bestored: you-default-bucket/{session}/{filename}
|
|
223
|
+
defaultBucketName: ''
|
|
224
|
+
},
|
|
214
225
|
}
|
|
215
226
|
```
|
|
216
227
|
|
package/dist/config.js
CHANGED
|
@@ -12,7 +12,6 @@
|
|
|
12
12
|
url: null,
|
|
13
13
|
autoDownload: true,
|
|
14
14
|
uploadS3: false,
|
|
15
|
-
awsBucketName: null,
|
|
16
15
|
readMessage: true,
|
|
17
16
|
allUnreadOnStart: false,
|
|
18
17
|
listenAcks: true,
|
|
@@ -21,7 +20,8 @@
|
|
|
21
20
|
onReactionMessage: true,
|
|
22
21
|
onPollResponse: true,
|
|
23
22
|
onRevokedMessage: true,
|
|
24
|
-
onLabelUpdated: true
|
|
23
|
+
onLabelUpdated: true,
|
|
24
|
+
onSelfMessage: false
|
|
25
25
|
},
|
|
26
26
|
chatwoot: {
|
|
27
27
|
sendQrCode: true,
|
|
@@ -58,8 +58,17 @@
|
|
|
58
58
|
'--safebrowsing-disable-auto-update',
|
|
59
59
|
'--ignore-certificate-errors',
|
|
60
60
|
'--ignore-ssl-errors',
|
|
61
|
-
'--ignore-certificate-errors-spki-list']
|
|
61
|
+
'--ignore-certificate-errors-spki-list'],
|
|
62
62
|
|
|
63
|
+
/**
|
|
64
|
+
* Example of configuring the linkPreview generator
|
|
65
|
+
* If you set this to 'null', it will use global servers; however, you have the option to define your own server
|
|
66
|
+
* Clone the repository https://github.com/wppconnect-team/wa-js-api-server and host it on your server with ssl
|
|
67
|
+
*
|
|
68
|
+
* Configure the attribute as follows:
|
|
69
|
+
* linkPreviewApiServers: [ 'https://www.yourserver.com/wa-js-api-server' ]
|
|
70
|
+
*/
|
|
71
|
+
linkPreviewApiServers: null
|
|
63
72
|
},
|
|
64
73
|
mapper: {
|
|
65
74
|
enable: false,
|
|
@@ -79,6 +88,14 @@
|
|
|
79
88
|
redisPassword: '',
|
|
80
89
|
redisDb: 0,
|
|
81
90
|
redisPrefix: 'docker'
|
|
91
|
+
},
|
|
92
|
+
aws_s3: {
|
|
93
|
+
region: 'sa-east-1',
|
|
94
|
+
access_key_id: null,
|
|
95
|
+
secret_key: null,
|
|
96
|
+
defaultBucketName: null,
|
|
97
|
+
endpoint: null,
|
|
98
|
+
forcePathStyle: null
|
|
82
99
|
}
|
|
83
100
|
};exports.default = _default;
|
|
84
|
-
//# sourceMappingURL=data:application/json;charset=utf-8;base64,
|
|
101
|
+
//# sourceMappingURL=data:application/json;charset=utf-8;base64,eyJ2ZXJzaW9uIjozLCJuYW1lcyI6WyJzZWNyZXRLZXkiLCJob3N0IiwicG9ydCIsImRldmljZU5hbWUiLCJwb3dlcmVkQnkiLCJzdGFydEFsbFNlc3Npb24iLCJ0b2tlblN0b3JlVHlwZSIsIm1heExpc3RlbmVycyIsImN1c3RvbVVzZXJEYXRhRGlyIiwid2ViaG9vayIsInVybCIsImF1dG9Eb3dubG9hZCIsInVwbG9hZFMzIiwicmVhZE1lc3NhZ2UiLCJhbGxVbnJlYWRPblN0YXJ0IiwibGlzdGVuQWNrcyIsIm9uUHJlc2VuY2VDaGFuZ2VkIiwib25QYXJ0aWNpcGFudHNDaGFuZ2VkIiwib25SZWFjdGlvbk1lc3NhZ2UiLCJvblBvbGxSZXNwb25zZSIsIm9uUmV2b2tlZE1lc3NhZ2UiLCJvbkxhYmVsVXBkYXRlZCIsIm9uU2VsZk1lc3NhZ2UiLCJjaGF0d29vdCIsInNlbmRRckNvZGUiLCJzZW5kU3RhdHVzIiwiYXJjaGl2ZSIsImVuYWJsZSIsIndhaXRUaW1lIiwiZGF5c1RvQXJjaGl2ZSIsImxvZyIsImxldmVsIiwibG9nZ2VyIiwiY3JlYXRlT3B0aW9ucyIsImJyb3dzZXJBcmdzIiwibGlua1ByZXZpZXdBcGlTZXJ2ZXJzIiwibWFwcGVyIiwicHJlZml4IiwiZGIiLCJtb25nb2RiRGF0YWJhc2UiLCJtb25nb2RiQ29sbGVjdGlvbiIsIm1vbmdvZGJVc2VyIiwibW9uZ29kYlBhc3N3b3JkIiwibW9uZ29kYkhvc3QiLCJtb25nb0lzUmVtb3RlIiwibW9uZ29VUkxSZW1vdGUiLCJtb25nb2RiUG9ydCIsInJlZGlzSG9zdCIsInJlZGlzUG9ydCIsInJlZGlzUGFzc3dvcmQiLCJyZWRpc0RiIiwicmVkaXNQcmVmaXgiLCJhd3NfczMiLCJyZWdpb24iLCJhY2Nlc3Nfa2V5X2lkIiwic2VjcmV0X2tleSIsImRlZmF1bHRCdWNrZXROYW1lIiwiZW5kcG9pbnQiLCJmb3JjZVBhdGhTdHlsZSIsImV4cG9ydHMiLCJkZWZhdWx0IiwiX2RlZmF1bHQiXSwic291cmNlcyI6WyIuLi9zcmMvY29uZmlnLnRzIl0sInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBkZWZhdWx0IHtcbiAgc2VjcmV0S2V5OiAnVEhJU0lTTVlTRUNVUkVUT0tFTicsXG4gIGhvc3Q6ICdodHRwOi8vbG9jYWxob3N0JyxcbiAgcG9ydDogJzIxNDY1JyxcbiAgZGV2aWNlTmFtZTogJ1dwcENvbm5lY3QnLFxuICBwb3dlcmVkQnk6ICdXUFBDb25uZWN0LVNlcnZlcicsXG4gIHN0YXJ0QWxsU2Vzc2lvbjogdHJ1ZSxcbiAgdG9rZW5TdG9yZVR5cGU6ICdmaWxlJyxcbiAgbWF4TGlzdGVuZXJzOiAxNSxcbiAgY3VzdG9tVXNlckRhdGFEaXI6ICcuL3VzZXJEYXRhRGlyLycsXG4gIHdlYmhvb2s6IHtcbiAgICB1cmw6IG51bGwsXG4gICAgYXV0b0Rvd25sb2FkOiB0cnVlLFxuICAgIHVwbG9hZFMzOiBmYWxzZSxcbiAgICByZWFkTWVzc2FnZTogdHJ1ZSxcbiAgICBhbGxVbnJlYWRPblN0YXJ0OiBmYWxzZSxcbiAgICBsaXN0ZW5BY2tzOiB0cnVlLFxuICAgIG9uUHJlc2VuY2VDaGFuZ2VkOiB0cnVlLFxuICAgIG9uUGFydGljaXBhbnRzQ2hhbmdlZDogdHJ1ZSxcbiAgICBvblJlYWN0aW9uTWVzc2FnZTogdHJ1ZSxcbiAgICBvblBvbGxSZXNwb25zZTogdHJ1ZSxcbiAgICBvblJldm9rZWRNZXNzYWdlOiB0cnVlLFxuICAgIG9uTGFiZWxVcGRhdGVkOiB0cnVlLFxuICAgIG9uU2VsZk1lc3NhZ2U6IGZhbHNlLFxuICB9LFxuICBjaGF0d29vdDoge1xuICAgIHNlbmRRckNvZGU6IHRydWUsXG4gICAgc2VuZFN0YXR1czogdHJ1ZSxcbiAgfSxcbiAgYXJjaGl2ZToge1xuICAgIGVuYWJsZTogZmFsc2UsXG4gICAgd2FpdFRpbWU6IDEwLFxuICAgIGRheXNUb0FyY2hpdmU6IDQ1LFxuICB9LFxuICBsb2c6IHtcbiAgICBsZXZlbDogJ3NpbGx5JywgLy8gQmVmb3JlIG9wZW4gYSBpc3N1ZSwgY2hhbmdlIGxldmVsIHRvIHNpbGx5IGFuZCByZXRyeSBhIGFjdGlvblxuICAgIGxvZ2dlcjogWydjb25zb2xlJywgJ2ZpbGUnXSxcbiAgfSxcbiAgY3JlYXRlT3B0aW9uczoge1xuICAgIGJyb3dzZXJBcmdzOiBbXG4gICAgICAnLS1kaXNhYmxlLXdlYi1zZWN1cml0eScsXG4gICAgICAnLS1uby1zYW5kYm94JyxcbiAgICAgICctLWRpc2FibGUtd2ViLXNlY3VyaXR5JyxcbiAgICAgICctLWFnZ3Jlc3NpdmUtY2FjaGUtZGlzY2FyZCcsXG4gICAgICAnLS1kaXNhYmxlLWNhY2hlJyxcbiAgICAgICctLWRpc2FibGUtYXBwbGljYXRpb24tY2FjaGUnLFxuICAgICAgJy0tZGlzYWJsZS1vZmZsaW5lLWxvYWQtc3RhbGUtY2FjaGUnLFxuICAgICAgJy0tZGlzay1jYWNoZS1zaXplPTAnLFxuICAgICAgJy0tZGlzYWJsZS1iYWNrZ3JvdW5kLW5ldHdvcmtpbmcnLFxuICAgICAgJy0tZGlzYWJsZS1kZWZhdWx0LWFwcHMnLFxuICAgICAgJy0tZGlzYWJsZS1leHRlbnNpb25zJyxcbiAgICAgICctLWRpc2FibGUtc3luYycsXG4gICAgICAnLS1kaXNhYmxlLXRyYW5zbGF0ZScsXG4gICAgICAnLS1oaWRlLXNjcm9sbGJhcnMnLFxuICAgICAgJy0tbWV0cmljcy1yZWNvcmRpbmctb25seScsXG4gICAgICAnLS1tdXRlLWF1ZGlvJyxcbiAgICAgICctLW5vLWZpcnN0LXJ1bicsXG4gICAgICAnLS1zYWZlYnJvd3NpbmctZGlzYWJsZS1hdXRvLXVwZGF0ZScsXG4gICAgICAnLS1pZ25vcmUtY2VydGlmaWNhdGUtZXJyb3JzJyxcbiAgICAgICctLWlnbm9yZS1zc2wtZXJyb3JzJyxcbiAgICAgICctLWlnbm9yZS1jZXJ0aWZpY2F0ZS1lcnJvcnMtc3BraS1saXN0JyxcbiAgICBdLFxuICAgIC8qKlxuICAgICAqIEV4YW1wbGUgb2YgY29uZmlndXJpbmcgdGhlIGxpbmtQcmV2aWV3IGdlbmVyYXRvclxuICAgICAqIElmIHlvdSBzZXQgdGhpcyB0byAnbnVsbCcsIGl0IHdpbGwgdXNlIGdsb2JhbCBzZXJ2ZXJzOyBob3dldmVyLCB5b3UgaGF2ZSB0aGUgb3B0aW9uIHRvIGRlZmluZSB5b3VyIG93biBzZXJ2ZXJcbiAgICAgKiBDbG9uZSB0aGUgcmVwb3NpdG9yeSBodHRwczovL2dpdGh1Yi5jb20vd3BwY29ubmVjdC10ZWFtL3dhLWpzLWFwaS1zZXJ2ZXIgYW5kIGhvc3QgaXQgb24geW91ciBzZXJ2ZXIgd2l0aCBzc2xcbiAgICAgKlxuICAgICAqIENvbmZpZ3VyZSB0aGUgYXR0cmlidXRlIGFzIGZvbGxvd3M6XG4gICAgICogbGlua1ByZXZpZXdBcGlTZXJ2ZXJzOiBbICdodHRwczovL3d3dy55b3Vyc2VydmVyLmNvbS93YS1qcy1hcGktc2VydmVyJyBdXG4gICAgICovXG4gICAgbGlua1ByZXZpZXdBcGlTZXJ2ZXJzOiBudWxsLFxuICB9LFxuICBtYXBwZXI6IHtcbiAgICBlbmFibGU6IGZhbHNlLFxuICAgIHByZWZpeDogJ3RhZ29uZS0nLFxuICB9LFxuICBkYjoge1xuICAgIG1vbmdvZGJEYXRhYmFzZTogJ3Rva2VucycsXG4gICAgbW9uZ29kYkNvbGxlY3Rpb246ICcnLFxuICAgIG1vbmdvZGJVc2VyOiAnJyxcbiAgICBtb25nb2RiUGFzc3dvcmQ6ICcnLFxuICAgIG1vbmdvZGJIb3N0OiAnJyxcbiAgICBtb25nb0lzUmVtb3RlOiB0cnVlLFxuICAgIG1vbmdvVVJMUmVtb3RlOiAnJyxcbiAgICBtb25nb2RiUG9ydDogMjcwMTcsXG4gICAgcmVkaXNIb3N0OiAnbG9jYWxob3N0JyxcbiAgICByZWRpc1BvcnQ6IDYzNzksXG4gICAgcmVkaXNQYXNzd29yZDogJycsXG4gICAgcmVkaXNEYjogMCxcbiAgICByZWRpc1ByZWZpeDogJ2RvY2tlcicsXG4gIH0sXG4gIGF3c19zMzoge1xuICAgIHJlZ2lvbjogJ3NhLWVhc3QtMScsXG4gICAgYWNjZXNzX2tleV9pZDogbnVsbCxcbiAgICBzZWNyZXRfa2V5OiBudWxsLFxuICAgIGRlZmF1bHRCdWNrZXROYW1lOiBudWxsLFxu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
|