add file
This commit is contained in:
@@ -26,6 +26,7 @@ RUN npm run postinstall || true
|
|||||||
|
|
||||||
# Copy application files
|
# Copy application files
|
||||||
COPY server.js ./
|
COPY server.js ./
|
||||||
|
COPY swagger.yml ./
|
||||||
|
|
||||||
# ==================== RUNTIME STAGE ====================
|
# ==================== RUNTIME STAGE ====================
|
||||||
FROM node:20-alpine
|
FROM node:20-alpine
|
||||||
@@ -55,6 +56,7 @@ COPY --from=builder --chown=whatsapp:whatsapp /app/node_modules ./node_modules
|
|||||||
# Copy application files
|
# Copy application files
|
||||||
COPY --chown=whatsapp:whatsapp server.js ./
|
COPY --chown=whatsapp:whatsapp server.js ./
|
||||||
COPY --chown=whatsapp:whatsapp package*.json ./
|
COPY --chown=whatsapp:whatsapp package*.json ./
|
||||||
|
COPY --chown=whatsapp:whatsapp swagger.yml ./
|
||||||
|
|
||||||
# Create volume directories
|
# Create volume directories
|
||||||
RUN mkdir -p /app/data /app/media /app/.wwebjs_cache /app/.wwebjs_auth && \
|
RUN mkdir -p /app/data /app/media /app/.wwebjs_cache /app/.wwebjs_auth && \
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ services:
|
|||||||
wapp:
|
wapp:
|
||||||
#user: "1000:1000"
|
#user: "1000:1000"
|
||||||
build:
|
build:
|
||||||
#context: /opt/apps/wapp
|
#context: /opt/00apps/wapp
|
||||||
context: .
|
context: .
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
ports:
|
ports:
|
||||||
|
|||||||
@@ -2,7 +2,7 @@ services:
|
|||||||
wapp:
|
wapp:
|
||||||
user: "1000:1000"
|
user: "1000:1000"
|
||||||
build:
|
build:
|
||||||
context: /opt/apps/wapp
|
context: ${WAPP_APP_ROOT}
|
||||||
dockerfile: Dockerfile
|
dockerfile: Dockerfile
|
||||||
ports:
|
ports:
|
||||||
- "3001:3001"
|
- "3001:3001"
|
||||||
@@ -10,6 +10,7 @@ services:
|
|||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
networks:
|
networks:
|
||||||
- traefik_net
|
- traefik_net
|
||||||
|
- default
|
||||||
environment:
|
environment:
|
||||||
# Server configuration
|
# Server configuration
|
||||||
- PORT=3001
|
- PORT=3001
|
||||||
@@ -61,6 +62,8 @@ networks:
|
|||||||
traefik_net:
|
traefik_net:
|
||||||
external: true
|
external: true
|
||||||
name: traefik_net
|
name: traefik_net
|
||||||
|
default:
|
||||||
|
driver: bridge
|
||||||
|
|
||||||
volumes:
|
volumes:
|
||||||
whatsapp-data:
|
whatsapp-data:
|
||||||
|
|||||||
86
fix_path.sh
Executable file
86
fix_path.sh
Executable file
@@ -0,0 +1,86 @@
|
|||||||
|
#!/usr/bin/env bash
|
||||||
|
set -e
|
||||||
|
|
||||||
|
echo "=== Cleaning node_modules ==="
|
||||||
|
rm -rf node_modules
|
||||||
|
echo "OK"
|
||||||
|
|
||||||
|
echo "=== Installing dependencies (ignoring scripts) ==="
|
||||||
|
npm install --ignore-scripts
|
||||||
|
echo "OK"
|
||||||
|
|
||||||
|
echo "=== Locating Injected Store.js ==="
|
||||||
|
|
||||||
|
TARGET=$(find node_modules/whatsapp-web.js/src/util/Injected -type f -name "Store.js" | head -n 1)
|
||||||
|
|
||||||
|
if [ -z "$TARGET" ]; then
|
||||||
|
echo "ERROR: Cannot find Store.js under Injected/"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "Found Injected file:"
|
||||||
|
echo " $TARGET"
|
||||||
|
|
||||||
|
echo "=== Backing up original ==="
|
||||||
|
cp "$TARGET" "$TARGET.bak"
|
||||||
|
|
||||||
|
echo "=== Applying getContactModel patch ==="
|
||||||
|
|
||||||
|
# Patch de getContactModel functie
|
||||||
|
sed -i '/getContactModel:/,/return {/c\
|
||||||
|
getContactModel: (contact) => {\n\
|
||||||
|
return {\n\
|
||||||
|
id: contact.id,\n\
|
||||||
|
name: contact.name,\n\
|
||||||
|
type: contact.type,\n\
|
||||||
|
\n\
|
||||||
|
isMe: contact.isMe || false,\n\
|
||||||
|
isUser: contact.isUser || false,\n\
|
||||||
|
isGroup: contact.isGroup || false,\n\
|
||||||
|
isBroadcast: contact.isBroadcast || false,\n\
|
||||||
|
isBusiness: contact.isBusiness || false,\n\
|
||||||
|
isEnterprise: contact.isEnterprise || false,\n\
|
||||||
|
\n\
|
||||||
|
isContactSyncEnabled: contact.isContactSyncEnabled || false,\n\
|
||||||
|
isContactLocked: contact.isContactLocked || false,\n\
|
||||||
|
\n\
|
||||||
|
verifiedLevel: contact.verifiedLevel,\n\
|
||||||
|
verifiedName: contact.verifiedName,\n\
|
||||||
|
pushname: contact.pushname,\n\
|
||||||
|
\n\
|
||||||
|
isWAContact: contact.isWAContact || false,\n\
|
||||||
|
\n\
|
||||||
|
isMyContact: (\n\
|
||||||
|
contact.isMyContact !== undefined\n\
|
||||||
|
? contact.isMyContact\n\
|
||||||
|
: contact.type === \"in\" || false\n\
|
||||||
|
),\n\
|
||||||
|
\n\
|
||||||
|
isBlocked: contact.isBlocked || false,\n\
|
||||||
|
\n\
|
||||||
|
labels: Array.isArray(contact.labels)\n\
|
||||||
|
? contact.labels.map(l => l.id)\n\
|
||||||
|
: [],\n\
|
||||||
|
\n\
|
||||||
|
displayName: contact.displayName || contact.pushname || contact.name,\n\
|
||||||
|
formattedName: contact.formattedName || contact.name,\n\
|
||||||
|
formattedShortName: contact.formattedShortName || contact.name,\n\
|
||||||
|
shortName: contact.shortName || contact.name,\n\
|
||||||
|
isSaved: contact.isSaved !== undefined ? contact.isSaved : false,\n\
|
||||||
|
\n\
|
||||||
|
isMuted: contact.muteExpiration !== undefined\n\
|
||||||
|
? contact.muteExpiration > 0\n\
|
||||||
|
: false,\n\
|
||||||
|
\n\
|
||||||
|
muteExpiration: contact.muteExpiration || 0,\n\
|
||||||
|
disappearingModeDuration: contact.disappearingModeDuration || 0,\n\
|
||||||
|
};\n\
|
||||||
|
},' "$TARGET"
|
||||||
|
|
||||||
|
echo "=== Generating patch-package diff ==="
|
||||||
|
npx patch-package whatsapp-web.js
|
||||||
|
echo "OK"
|
||||||
|
|
||||||
|
echo "=== Final npm install ==="
|
||||||
|
npm install
|
||||||
|
echo "SUCCESS — Patch applied, new diff created 🚀"
|
||||||
62
package-lock.json
generated
62
package-lock.json
generated
@@ -1,11 +1,11 @@
|
|||||||
{
|
{
|
||||||
"name": "whatsapp-web-server",
|
"name": "wapp",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"lockfileVersion": 3,
|
"lockfileVersion": 3,
|
||||||
"requires": true,
|
"requires": true,
|
||||||
"packages": {
|
"packages": {
|
||||||
"": {
|
"": {
|
||||||
"name": "whatsapp-web-server",
|
"name": "wapp",
|
||||||
"version": "1.0.0",
|
"version": "1.0.0",
|
||||||
"hasInstallScript": true,
|
"hasInstallScript": true,
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
@@ -16,7 +16,9 @@
|
|||||||
"sequelize": "^6.32.1",
|
"sequelize": "^6.32.1",
|
||||||
"socket.io": "^4.7.2",
|
"socket.io": "^4.7.2",
|
||||||
"sqlite3": "^5.1.6",
|
"sqlite3": "^5.1.6",
|
||||||
"whatsapp-web.js": "github:pedroslopez/whatsapp-web.js"
|
"swagger-ui-express": "^5.0.0",
|
||||||
|
"whatsapp-web.js": "github:pedroslopez/whatsapp-web.js",
|
||||||
|
"yamljs": "^0.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
@@ -76,6 +78,12 @@
|
|||||||
"integrity": "sha512-wtnBAETBVYZ9GvcbgdswRVSLkFkYAGv1KzwBBTeRXvGT9sb9cPllOgFFWXCn9PyARQ0H+Ijz6mmoRrGateUDxQ==",
|
"integrity": "sha512-wtnBAETBVYZ9GvcbgdswRVSLkFkYAGv1KzwBBTeRXvGT9sb9cPllOgFFWXCn9PyARQ0H+Ijz6mmoRrGateUDxQ==",
|
||||||
"license": "MIT"
|
"license": "MIT"
|
||||||
},
|
},
|
||||||
|
"node_modules/@scarf/scarf": {
|
||||||
|
"version": "1.4.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/@scarf/scarf/-/scarf-1.4.0.tgz",
|
||||||
|
"integrity": "sha512-xxeapPiUXdZAE3che6f3xogoJPeZgig6omHEy1rIY5WVsB3H2BHNnZH+gHG6x91SCWyQCzWGsuL2Hh3ClO5/qQ==",
|
||||||
|
"hasInstallScript": true
|
||||||
|
},
|
||||||
"node_modules/@socket.io/component-emitter": {
|
"node_modules/@socket.io/component-emitter": {
|
||||||
"version": "3.1.2",
|
"version": "3.1.2",
|
||||||
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
|
"resolved": "https://registry.npmjs.org/@socket.io/component-emitter/-/component-emitter-3.1.2.tgz",
|
||||||
@@ -348,6 +356,14 @@
|
|||||||
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
|
"node": "^12.13.0 || ^14.15.0 || >=16.0.0"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/argparse": {
|
||||||
|
"version": "1.0.10",
|
||||||
|
"resolved": "https://registry.npmjs.org/argparse/-/argparse-1.0.10.tgz",
|
||||||
|
"integrity": "sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==",
|
||||||
|
"dependencies": {
|
||||||
|
"sprintf-js": "~1.0.2"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/array-flatten": {
|
"node_modules/array-flatten": {
|
||||||
"version": "1.1.1",
|
"version": "1.1.1",
|
||||||
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
"resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz",
|
||||||
@@ -4023,6 +4039,11 @@
|
|||||||
"node": ">= 10"
|
"node": ">= 10"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/sprintf-js": {
|
||||||
|
"version": "1.0.3",
|
||||||
|
"resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz",
|
||||||
|
"integrity": "sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g=="
|
||||||
|
},
|
||||||
"node_modules/sqlite3": {
|
"node_modules/sqlite3": {
|
||||||
"version": "5.1.7",
|
"version": "5.1.7",
|
||||||
"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz",
|
"resolved": "https://registry.npmjs.org/sqlite3/-/sqlite3-5.1.7.tgz",
|
||||||
@@ -4126,6 +4147,28 @@
|
|||||||
"node": ">=4"
|
"node": ">=4"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/swagger-ui-dist": {
|
||||||
|
"version": "5.31.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/swagger-ui-dist/-/swagger-ui-dist-5.31.0.tgz",
|
||||||
|
"integrity": "sha512-zSUTIck02fSga6rc0RZP3b7J7wgHXwLea8ZjgLA3Vgnb8QeOl3Wou2/j5QkzSGeoz6HusP/coYuJl33aQxQZpg==",
|
||||||
|
"dependencies": {
|
||||||
|
"@scarf/scarf": "=1.4.0"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"node_modules/swagger-ui-express": {
|
||||||
|
"version": "5.0.1",
|
||||||
|
"resolved": "https://registry.npmjs.org/swagger-ui-express/-/swagger-ui-express-5.0.1.tgz",
|
||||||
|
"integrity": "sha512-SrNU3RiBGTLLmFU8GIJdOdanJTl4TOmT27tt3bWWHppqYmAZ6IDuEuBvMU6nZq0zLEe6b/1rACXCgLZqO6ZfrA==",
|
||||||
|
"dependencies": {
|
||||||
|
"swagger-ui-dist": ">=5.0.0"
|
||||||
|
},
|
||||||
|
"engines": {
|
||||||
|
"node": ">= v0.10.32"
|
||||||
|
},
|
||||||
|
"peerDependencies": {
|
||||||
|
"express": ">=4.0.0 || >=5.0.0-beta"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/tar": {
|
"node_modules/tar": {
|
||||||
"version": "6.2.1",
|
"version": "6.2.1",
|
||||||
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
|
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
|
||||||
@@ -4606,6 +4649,19 @@
|
|||||||
"url": "https://github.com/sponsors/eemeli"
|
"url": "https://github.com/sponsors/eemeli"
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
"node_modules/yamljs": {
|
||||||
|
"version": "0.3.0",
|
||||||
|
"resolved": "https://registry.npmjs.org/yamljs/-/yamljs-0.3.0.tgz",
|
||||||
|
"integrity": "sha512-C/FsVVhht4iPQYXOInoxUM/1ELSf9EsgKH34FofQOp6hwCPrW4vG4w5++TED3xRUo8gD7l0P1J1dLlDYzODsTQ==",
|
||||||
|
"dependencies": {
|
||||||
|
"argparse": "^1.0.7",
|
||||||
|
"glob": "^7.0.5"
|
||||||
|
},
|
||||||
|
"bin": {
|
||||||
|
"json2yaml": "bin/json2yaml",
|
||||||
|
"yaml2json": "bin/yaml2json"
|
||||||
|
}
|
||||||
|
},
|
||||||
"node_modules/yargs": {
|
"node_modules/yargs": {
|
||||||
"version": "15.4.1",
|
"version": "15.4.1",
|
||||||
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
|
"resolved": "https://registry.npmjs.org/yargs/-/yargs-15.4.1.tgz",
|
||||||
|
|||||||
@@ -16,7 +16,9 @@
|
|||||||
"sequelize": "^6.32.1",
|
"sequelize": "^6.32.1",
|
||||||
"socket.io": "^4.7.2",
|
"socket.io": "^4.7.2",
|
||||||
"sqlite3": "^5.1.6",
|
"sqlite3": "^5.1.6",
|
||||||
"whatsapp-web.js": "github:pedroslopez/whatsapp-web.js"
|
"whatsapp-web.js": "github:pedroslopez/whatsapp-web.js",
|
||||||
|
"swagger-ui-express": "^5.0.0",
|
||||||
|
"yamljs": "^0.3.0"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"nodemon": "^3.0.1",
|
"nodemon": "^3.0.1",
|
||||||
|
|||||||
@@ -1,65 +0,0 @@
|
|||||||
diff --git a/node_modules/whatsapp-web.js/src/util/Injected.js b/node_modules/whatsapp-web.js/src/util/Injected.js
|
|
||||||
index xxxxxxx..yyyyyyy 100644
|
|
||||||
--- a/node_modules/whatsapp-web.js/src/util/Injected.js
|
|
||||||
+++ b/node_modules/whatsapp-web.js/src/util/Injected.js
|
|
||||||
@@ -628,16 +628,28 @@ exports.ExposeStore = () => {
|
|
||||||
return Object.defineProperty(window, 'WWebJS', {
|
|
||||||
get() {
|
|
||||||
return {
|
|
||||||
getContactModel: (contact) => {
|
|
||||||
+ // Safe method extraction with fallbacks
|
|
||||||
+ const getContactMethod = (method) => {
|
|
||||||
+ if (!window.Store.ContactMethods || !window.Store.ContactMethods[method]) {
|
|
||||||
+ return null;
|
|
||||||
+ }
|
|
||||||
+ return window.Store.ContactMethods[method];
|
|
||||||
+ };
|
|
||||||
+
|
|
||||||
return {
|
|
||||||
id: contact.id,
|
|
||||||
name: contact.name,
|
|
||||||
type: contact.type,
|
|
||||||
- isMe: contact.isMe,
|
|
||||||
- isUser: contact.isUser,
|
|
||||||
- isGroup: contact.isGroup,
|
|
||||||
- isBroadcast: contact.isBroadcast,
|
|
||||||
- isBusiness: contact.isBusiness,
|
|
||||||
- isEnterprise: contact.isEnterprise,
|
|
||||||
+ isMe: contact.isMe || false,
|
|
||||||
+ isUser: contact.isUser || false,
|
|
||||||
+ isGroup: contact.isGroup || false,
|
|
||||||
+ isBroadcast: contact.isBroadcast || false,
|
|
||||||
+ isBusiness: contact.isBusiness || false,
|
|
||||||
+ isEnterprise: contact.isEnterprise || false,
|
|
||||||
+ isContactSyncEnabled: contact.isContactSyncEnabled || false,
|
|
||||||
+ isContactLocked: contact.isContactLocked || false,
|
|
||||||
verifiedLevel: contact.verifiedLevel,
|
|
||||||
verifiedName: contact.verifiedName,
|
|
||||||
pushname: contact.pushname,
|
|
||||||
@@ -646,11 +658,23 @@ exports.ExposeStore = () => {
|
|
||||||
isMe: contact.isMe,
|
|
||||||
isUser: contact.isUser,
|
|
||||||
isWAContact: contact.isWAContact,
|
|
||||||
- isMyContact: contact.isMyContact,
|
|
||||||
+ // Fallback for changed API
|
|
||||||
+ isMyContact: contact.isMyContact !== undefined
|
|
||||||
+ ? contact.isMyContact
|
|
||||||
+ : contact.type === 'in' || false,
|
|
||||||
isBlocked: contact.isBlocked,
|
|
||||||
- labels: contact.labels ? contact.labels.map(l => l.id) : []
|
|
||||||
+ labels: contact.labels ? contact.labels.map(l => l.id) : [],
|
|
||||||
+ // Additional properties
|
|
||||||
+ displayName: contact.displayName || contact.pushname || contact.name,
|
|
||||||
+ formattedName: contact.formattedName || contact.name,
|
|
||||||
+ formattedShortName: contact.formattedShortName || contact.name,
|
|
||||||
+ shortName: contact.shortName || contact.name,
|
|
||||||
+ isSaved: contact.isSaved !== undefined ? contact.isSaved : false,
|
|
||||||
+ isMuted: contact.muteExpiration !== undefined ? contact.muteExpiration > 0 : false,
|
|
||||||
+ muteExpiration: contact.muteExpiration || 0,
|
|
||||||
+ disappearingModeDuration: contact.disappearingModeDuration || 0
|
|
||||||
};
|
|
||||||
},
|
|
||||||
});
|
|
||||||
}
|
|
||||||
});
|
|
||||||
}
|
|
||||||
263
patches/whatsapp-web.js+1.34.2.patch
Normal file
263
patches/whatsapp-web.js+1.34.2.patch
Normal file
@@ -0,0 +1,263 @@
|
|||||||
|
diff --git a/node_modules/whatsapp-web.js/src/util/Injected/Store.js.bak b/node_modules/whatsapp-web.js/src/util/Injected/Store.js.bak
|
||||||
|
new file mode 100644
|
||||||
|
index 0000000..08fe745
|
||||||
|
--- /dev/null
|
||||||
|
+++ b/node_modules/whatsapp-web.js/src/util/Injected/Store.js.bak
|
||||||
|
@@ -0,0 +1,257 @@
|
||||||
|
+'use strict';
|
||||||
|
+
|
||||||
|
+exports.ExposeStore = () => {
|
||||||
|
+ /**
|
||||||
|
+ * Helper function that compares between two WWeb versions. Its purpose is to help the developer to choose the correct code implementation depending on the comparison value and the WWeb version.
|
||||||
|
+ * @param {string} lOperand The left operand for the WWeb version string to compare with
|
||||||
|
+ * @param {string} operator The comparison operator
|
||||||
|
+ * @param {string} rOperand The right operand for the WWeb version string to compare with
|
||||||
|
+ * @returns {boolean} Boolean value that indicates the result of the comparison
|
||||||
|
+ */
|
||||||
|
+ window.compareWwebVersions = (lOperand, operator, rOperand) => {
|
||||||
|
+ if (!['>', '>=', '<', '<=', '='].includes(operator)) {
|
||||||
|
+ throw new class _ extends Error {
|
||||||
|
+ constructor(m) { super(m); this.name = 'CompareWwebVersionsError'; }
|
||||||
|
+ }('Invalid comparison operator is provided');
|
||||||
|
+
|
||||||
|
+ }
|
||||||
|
+ if (typeof lOperand !== 'string' || typeof rOperand !== 'string') {
|
||||||
|
+ throw new class _ extends Error {
|
||||||
|
+ constructor(m) { super(m); this.name = 'CompareWwebVersionsError'; }
|
||||||
|
+ }('A non-string WWeb version type is provided');
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ lOperand = lOperand.replace(/-beta$/, '');
|
||||||
|
+ rOperand = rOperand.replace(/-beta$/, '');
|
||||||
|
+
|
||||||
|
+ while (lOperand.length !== rOperand.length) {
|
||||||
|
+ lOperand.length > rOperand.length
|
||||||
|
+ ? rOperand = rOperand.concat('0')
|
||||||
|
+ : lOperand = lOperand.concat('0');
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ lOperand = Number(lOperand.replace(/\./g, ''));
|
||||||
|
+ rOperand = Number(rOperand.replace(/\./g, ''));
|
||||||
|
+
|
||||||
|
+ return (
|
||||||
|
+ operator === '>' ? lOperand > rOperand :
|
||||||
|
+ operator === '>=' ? lOperand >= rOperand :
|
||||||
|
+ operator === '<' ? lOperand < rOperand :
|
||||||
|
+ operator === '<=' ? lOperand <= rOperand :
|
||||||
|
+ operator === '=' ? lOperand === rOperand :
|
||||||
|
+ false
|
||||||
|
+ );
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ window.Store = Object.assign({}, window.require('WAWebCollections'));
|
||||||
|
+ window.Store.AppState = window.require('WAWebSocketModel').Socket;
|
||||||
|
+ window.Store.BlockContact = window.require('WAWebBlockContactAction');
|
||||||
|
+ window.Store.Conn = window.require('WAWebConnModel').Conn;
|
||||||
|
+ window.Store.Cmd = window.require('WAWebCmd').Cmd;
|
||||||
|
+ window.Store.DownloadManager = window.require('WAWebDownloadManager').downloadManager;
|
||||||
|
+ window.Store.GroupQueryAndUpdate = window.require('WAWebGroupQueryJob').queryAndUpdateGroupMetadataById;
|
||||||
|
+ window.Store.MediaPrep = window.require('WAWebPrepRawMedia');
|
||||||
|
+ window.Store.MediaObject = window.require('WAWebMediaStorage');
|
||||||
|
+ window.Store.MediaTypes = window.require('WAWebMmsMediaTypes');
|
||||||
|
+ window.Store.MediaUpload = window.require('WAWebMediaMmsV4Upload');
|
||||||
|
+ window.Store.MsgKey = window.require('WAWebMsgKey');
|
||||||
|
+ window.Store.OpaqueData = window.require('WAWebMediaOpaqueData');
|
||||||
|
+ window.Store.QueryProduct = window.require('WAWebBizProductCatalogBridge');
|
||||||
|
+ window.Store.QueryOrder = window.require('WAWebBizOrderBridge');
|
||||||
|
+ window.Store.SendClear = window.require('WAWebChatClearBridge');
|
||||||
|
+ window.Store.SendDelete = window.require('WAWebDeleteChatAction');
|
||||||
|
+ window.Store.SendMessage = window.require('WAWebSendMsgChatAction');
|
||||||
|
+ window.Store.EditMessage = window.require('WAWebSendMessageEditAction');
|
||||||
|
+ window.Store.MediaDataUtils = window.require('WAWebMediaDataUtils');
|
||||||
|
+ window.Store.BlobCache = window.require('WAWebMediaInMemoryBlobCache');
|
||||||
|
+ window.Store.SendSeen = window.require('WAWebUpdateUnreadChatAction');
|
||||||
|
+ window.Store.User = window.require('WAWebUserPrefsMeUser');
|
||||||
|
+ window.Store.ContactMethods = {
|
||||||
|
+ ...window.require('WAWebContactGetters'),
|
||||||
|
+ ...window.require('WAWebFrontendContactGetters')
|
||||||
|
+ };
|
||||||
|
+ window.Store.UserConstructor = window.require('WAWebWid');
|
||||||
|
+ window.Store.Validators = window.require('WALinkify');
|
||||||
|
+ window.Store.WidFactory = window.require('WAWebWidFactory');
|
||||||
|
+ window.Store.ProfilePic = window.require('WAWebContactProfilePicThumbBridge');
|
||||||
|
+ window.Store.PresenceUtils = window.require('WAWebPresenceChatAction');
|
||||||
|
+ window.Store.ChatState = window.require('WAWebChatStateBridge');
|
||||||
|
+ window.Store.findCommonGroups = window.require('WAWebFindCommonGroupsContactAction').findCommonGroups;
|
||||||
|
+ window.Store.StatusUtils = window.require('WAWebContactStatusBridge');
|
||||||
|
+ window.Store.ConversationMsgs = window.require('WAWebChatLoadMessages');
|
||||||
|
+ window.Store.sendReactionToMsg = window.require('WAWebSendReactionMsgAction').sendReactionToMsg;
|
||||||
|
+ window.Store.createOrUpdateReactionsModule = window.require('WAWebDBCreateOrUpdateReactions');
|
||||||
|
+ window.Store.EphemeralFields = window.require('WAWebGetEphemeralFieldsMsgActionsUtils');
|
||||||
|
+ window.Store.MsgActionChecks = window.require('WAWebMsgActionCapability');
|
||||||
|
+ window.Store.QuotedMsg = window.require('WAWebQuotedMsgModelUtils');
|
||||||
|
+ window.Store.LinkPreview = window.require('WAWebLinkPreviewChatAction');
|
||||||
|
+ window.Store.Socket = window.require('WADeprecatedSendIq');
|
||||||
|
+ window.Store.SocketWap = window.require('WAWap');
|
||||||
|
+ window.Store.SearchContext = window.require('WAWebChatMessageSearch');
|
||||||
|
+ window.Store.DrawerManager = window.require('WAWebDrawerManager').DrawerManager;
|
||||||
|
+ window.Store.LidUtils = window.require('WAWebApiContact');
|
||||||
|
+ window.Store.WidToJid = window.require('WAWebWidToJid');
|
||||||
|
+ window.Store.JidToWid = window.require('WAWebJidToWid');
|
||||||
|
+ window.Store.getMsgInfo = window.require('WAWebApiMessageInfoStore').queryMsgInfo;
|
||||||
|
+ window.Store.QueryExist = window.require('WAWebQueryExistsJob').queryWidExists;
|
||||||
|
+ window.Store.ReplyUtils = window.require('WAWebMsgReply');
|
||||||
|
+ window.Store.BotSecret = window.require('WAWebBotMessageSecret');
|
||||||
|
+ window.Store.BotProfiles = window.require('WAWebBotProfileCollection');
|
||||||
|
+ window.Store.ContactCollection = window.require('WAWebContactCollection').ContactCollection;
|
||||||
|
+ window.Store.DeviceList = window.require('WAWebApiDeviceList');
|
||||||
|
+ window.Store.HistorySync = window.require('WAWebSendNonMessageDataRequest');
|
||||||
|
+ window.Store.AddonReactionTable = window.require('WAWebAddonReactionTableMode').reactionTableMode;
|
||||||
|
+ window.Store.AddonPollVoteTable = window.require('WAWebAddonPollVoteTableMode').pollVoteTableMode;
|
||||||
|
+ window.Store.ChatGetters = window.require('WAWebChatGetters');
|
||||||
|
+ window.Store.UploadUtils = window.require('WAWebUploadManager');
|
||||||
|
+ window.Store.WAWebStreamModel = window.require('WAWebStreamModel');
|
||||||
|
+ window.Store.FindOrCreateChat = window.require('WAWebFindChatAction');
|
||||||
|
+ window.Store.CustomerNoteUtils = window.require('WAWebNoteAction');
|
||||||
|
+ window.Store.BusinessGatingUtils = window.require('WAWebBizGatingUtils');
|
||||||
|
+ window.Store.PollsVotesSchema = window.require('WAWebPollsVotesSchema');
|
||||||
|
+ window.Store.PollsSendVote = window.require('WAWebPollsSendVoteMsgAction');
|
||||||
|
+
|
||||||
|
+ window.Store.Settings = {
|
||||||
|
+ ...window.require('WAWebUserPrefsGeneral'),
|
||||||
|
+ ...window.require('WAWebUserPrefsNotifications'),
|
||||||
|
+ setPushname: window.require('WAWebSetPushnameConnAction').setPushname
|
||||||
|
+ };
|
||||||
|
+ window.Store.NumberInfo = {
|
||||||
|
+ ...window.require('WAPhoneUtils'),
|
||||||
|
+ ...window.require('WAPhoneFindCC')
|
||||||
|
+ };
|
||||||
|
+ window.Store.ForwardUtils = {
|
||||||
|
+ ...window.require('WAWebChatForwardMessage')
|
||||||
|
+ };
|
||||||
|
+ window.Store.PinnedMsgUtils = {
|
||||||
|
+ ...window.require('WAWebPinInChatSchema'),
|
||||||
|
+ ...window.require('WAWebSendPinMessageAction')
|
||||||
|
+ };
|
||||||
|
+ window.Store.ScheduledEventMsgUtils = {
|
||||||
|
+ ...window.require('WAWebGenerateEventCallLink'),
|
||||||
|
+ ...window.require('WAWebSendEventEditMsgAction'),
|
||||||
|
+ ...window.require('WAWebSendEventResponseMsgAction')
|
||||||
|
+ };
|
||||||
|
+ window.Store.VCard = {
|
||||||
|
+ ...window.require('WAWebFrontendVcardUtils'),
|
||||||
|
+ ...window.require('WAWebVcardParsingUtils'),
|
||||||
|
+ ...window.require('WAWebVcardGetNameFromParsed')
|
||||||
|
+ };
|
||||||
|
+ window.Store.StickerTools = {
|
||||||
|
+ ...window.require('WAWebImageUtils'),
|
||||||
|
+ ...window.require('WAWebAddWebpMetadata')
|
||||||
|
+ };
|
||||||
|
+ window.Store.GroupUtils = {
|
||||||
|
+ ...window.require('WAWebGroupCreateJob'),
|
||||||
|
+ ...window.require('WAWebGroupModifyInfoJob'),
|
||||||
|
+ ...window.require('WAWebExitGroupAction'),
|
||||||
|
+ ...window.require('WAWebContactProfilePicThumbBridge'),
|
||||||
|
+ ...window.require('WAWebSetPropertyGroupAction')
|
||||||
|
+ };
|
||||||
|
+ window.Store.GroupParticipants = {
|
||||||
|
+ ...window.require('WAWebModifyParticipantsGroupAction'),
|
||||||
|
+ ...window.require('WASmaxGroupsAddParticipantsRPC')
|
||||||
|
+ };
|
||||||
|
+ window.Store.GroupInvite = {
|
||||||
|
+ ...window.require('WAWebGroupInviteJob'),
|
||||||
|
+ ...window.require('WAWebGroupQueryJob'),
|
||||||
|
+ ...window.require('WAWebMexFetchGroupInviteCodeJob')
|
||||||
|
+ };
|
||||||
|
+ window.Store.GroupInviteV4 = {
|
||||||
|
+ ...window.require('WAWebGroupInviteV4Job'),
|
||||||
|
+ ...window.require('WAWebChatSendMessages')
|
||||||
|
+ };
|
||||||
|
+ window.Store.MembershipRequestUtils = {
|
||||||
|
+ ...window.require('WAWebApiMembershipApprovalRequestStore'),
|
||||||
|
+ ...window.require('WASmaxGroupsMembershipRequestsActionRPC')
|
||||||
|
+ };
|
||||||
|
+ window.Store.ChannelUtils = {
|
||||||
|
+ ...window.require('WAWebLoadNewsletterPreviewChatAction'),
|
||||||
|
+ ...window.require('WAWebNewsletterMetadataQueryJob'),
|
||||||
|
+ ...window.require('WAWebNewsletterCreateQueryJob'),
|
||||||
|
+ ...window.require('WAWebEditNewsletterMetadataAction'),
|
||||||
|
+ ...window.require('WAWebNewsletterDeleteAction'),
|
||||||
|
+ ...window.require('WAWebNewsletterSubscribeAction'),
|
||||||
|
+ ...window.require('WAWebNewsletterUnsubscribeAction'),
|
||||||
|
+ ...window.require('WAWebNewsletterDirectorySearchAction'),
|
||||||
|
+ ...window.require('WAWebNewsletterToggleMuteStateJob'),
|
||||||
|
+ ...window.require('WAWebNewsletterGatingUtils'),
|
||||||
|
+ ...window.require('WAWebNewsletterModelUtils'),
|
||||||
|
+ ...window.require('WAWebMexAcceptNewsletterAdminInviteJob'),
|
||||||
|
+ ...window.require('WAWebMexRevokeNewsletterAdminInviteJob'),
|
||||||
|
+ ...window.require('WAWebChangeNewsletterOwnerAction'),
|
||||||
|
+ ...window.require('WAWebDemoteNewsletterAdminAction'),
|
||||||
|
+ ...window.require('WAWebNewsletterDemoteAdminJob'),
|
||||||
|
+ countryCodesIso: window.require('WAWebCountriesNativeCountryNames'),
|
||||||
|
+ currentRegion: window.require('WAWebL10N').getRegion(),
|
||||||
|
+ };
|
||||||
|
+ window.Store.SendChannelMessage = {
|
||||||
|
+ ...window.require('WAWebNewsletterUpdateMsgsRecordsJob'),
|
||||||
|
+ ...window.require('WAWebMsgDataFromModel'),
|
||||||
|
+ ...window.require('WAWebNewsletterSendMessageJob'),
|
||||||
|
+ ...window.require('WAWebNewsletterSendMsgAction'),
|
||||||
|
+ ...window.require('WAMediaCalculateFilehash')
|
||||||
|
+ };
|
||||||
|
+ window.Store.ChannelSubscribers = {
|
||||||
|
+ ...window.require('WAWebMexFetchNewsletterSubscribersJob'),
|
||||||
|
+ ...window.require('WAWebNewsletterSubscriberListAction')
|
||||||
|
+ };
|
||||||
|
+ window.Store.AddressbookContactUtils = {
|
||||||
|
+ ...window.require('WAWebSaveContactAction'),
|
||||||
|
+ ...window.require('WAWebDeleteContactAction')
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ if (!window.Store.Chat._find || !window.Store.Chat.findImpl) {
|
||||||
|
+ window.Store.Chat._find = e => {
|
||||||
|
+ const target = window.Store.Chat.get(e);
|
||||||
|
+ return target ? Promise.resolve(target) : Promise.resolve({
|
||||||
|
+ id: e
|
||||||
|
+ });
|
||||||
|
+ };
|
||||||
|
+ window.Store.Chat.findImpl = window.Store.Chat._find;
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ /**
|
||||||
|
+ * Target options object description
|
||||||
|
+ * @typedef {Object} TargetOptions
|
||||||
|
+ * @property {string|number} module The target module
|
||||||
|
+ * @property {string} function The function name to get from a module
|
||||||
|
+ */
|
||||||
|
+ /**
|
||||||
|
+ * Function to modify functions
|
||||||
|
+ * @param {TargetOptions} target Options specifying the target function to search for modifying
|
||||||
|
+ * @param {Function} callback Modified function
|
||||||
|
+ */
|
||||||
|
+ window.injectToFunction = (target, callback) => {
|
||||||
|
+ try {
|
||||||
|
+ let module = window.require(target.module);
|
||||||
|
+ if (!module) return;
|
||||||
|
+
|
||||||
|
+ const path = target.function.split('.');
|
||||||
|
+ const funcName = path.pop();
|
||||||
|
+
|
||||||
|
+ for (const key of path) {
|
||||||
|
+ if (!module[key]) return;
|
||||||
|
+ module = module[key];
|
||||||
|
+ }
|
||||||
|
+
|
||||||
|
+ const originalFunction = module[funcName];
|
||||||
|
+ if (typeof originalFunction !== 'function') return;
|
||||||
|
+
|
||||||
|
+ module[funcName] = (...args) => {
|
||||||
|
+ try {
|
||||||
|
+ return callback(originalFunction, ...args);
|
||||||
|
+ } catch {
|
||||||
|
+ return originalFunction(...args);
|
||||||
|
+ }
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ } catch {
|
||||||
|
+ return;
|
||||||
|
+ }
|
||||||
|
+ };
|
||||||
|
+
|
||||||
|
+ window.injectToFunction({ module: 'WAWebBackendJobsCommon', function: 'mediaTypeFromProtobuf' }, (func, ...args) => { const [proto] = args; return proto.locationMessage ? null : func(...args); });
|
||||||
|
+
|
||||||
|
+ window.injectToFunction({ module: 'WAWebE2EProtoUtils', function: 'typeAttributeFromProtobuf' }, (func, ...args) => { const [proto] = args; return proto.locationMessage || proto.groupInviteMessage ? 'text' : func(...args); });
|
||||||
|
+};
|
||||||
@@ -1,4 +1,11 @@
|
|||||||
require('dotenv').config()
|
require('dotenv').config()
|
||||||
|
const swaggerUi = require('swagger-ui-express');
|
||||||
|
const YAML = require('yamljs');
|
||||||
|
const path = require('path');
|
||||||
|
const swaggerPath = path.join(__dirname, 'swagger.yml');
|
||||||
|
const swaggerDoc = YAML.load(swaggerPath);
|
||||||
|
|
||||||
|
|
||||||
const express = require('express')
|
const express = require('express')
|
||||||
const http = require('http')
|
const http = require('http')
|
||||||
const socketIo = require('socket.io')
|
const socketIo = require('socket.io')
|
||||||
@@ -105,6 +112,7 @@ const io = socketIo(server, {
|
|||||||
})
|
})
|
||||||
|
|
||||||
app.use(express.json({ limit: '50mb' }))
|
app.use(express.json({ limit: '50mb' }))
|
||||||
|
app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDoc));
|
||||||
|
|
||||||
// Middleware
|
// Middleware
|
||||||
function validateApiKey(req, res, next) {
|
function validateApiKey(req, res, next) {
|
||||||
|
|||||||
35
swagger.yml
Normal file
35
swagger.yml
Normal file
@@ -0,0 +1,35 @@
|
|||||||
|
openapi: 3.0.0
|
||||||
|
info:
|
||||||
|
title: WAPP API
|
||||||
|
version: 1.0.0
|
||||||
|
|
||||||
|
components:
|
||||||
|
securitySchemes:
|
||||||
|
ApiKeyAuth:
|
||||||
|
type: apiKey
|
||||||
|
in: header
|
||||||
|
name: x-api-key
|
||||||
|
|
||||||
|
security:
|
||||||
|
- ApiKeyAuth: []
|
||||||
|
|
||||||
|
paths:
|
||||||
|
/api/send:
|
||||||
|
post:
|
||||||
|
summary: Send a WhatsApp message
|
||||||
|
security:
|
||||||
|
- ApiKeyAuth: []
|
||||||
|
requestBody:
|
||||||
|
required: true
|
||||||
|
content:
|
||||||
|
application/json:
|
||||||
|
schema:
|
||||||
|
type: object
|
||||||
|
properties:
|
||||||
|
phoneNumber:
|
||||||
|
type: string
|
||||||
|
message:
|
||||||
|
type: string
|
||||||
|
responses:
|
||||||
|
'200':
|
||||||
|
description: OK
|
||||||
Reference in New Issue
Block a user