{"_id":"my-baileys","_rev":"6-98ebc6e072f585a4ab3e7035cfe70ac2","name":"my-baileys","dist-tags":{"latest":"1.0.5"},"versions":{"1.0.0":{"name":"my-baileys","version":"1.0.0","keywords":["xycoolcraft","xayz","baileys","whatsapp","whatsapp-api","whatsapp-web","wa-bot","whatsapp bot"],"author":{"name":"XYCoolcraft"},"license":"MIT","_id":"my-baileys@1.0.0","maintainers":[{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"}],"contributors":[{"name":"XYCoolcraft"}],"homepage":"https://github.com/xycoolcraft/baileys","bugs":{"url":"https://github.com/xycoolcraft/baileys/issues"},"dist":{"shasum":"bc1f6ccf30aad124d0b37ba9b69efc7e168eb14d","tarball":"https://registry.npmjs.org/my-baileys/-/my-baileys-1.0.0.tgz","fileCount":144,"integrity":"sha512-KpFg4WenFE49/rG0Z+nywhNXMfnC0nVDHjFYPFLzGKfwN5j54RekygrAHbqzQF5RJZ3vYWC0re7d7IlcxCQl4Q==","signatures":[{"sig":"MEUCIBkfIoww3uaLejx46kB/xMbvycxpBMMc2Wi64M4oIACqAiEAspZ9n1qlbJ0YWBYzzcL8tfEnjlo0bVOBphTH4Ix/dvo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12179672},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","engines":{"node":">=20.0.0"},"scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","prepack":"","prepare":"","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","postinstall":"node ./scripts/self-test.js","publish:npm":"bash upload-npm.sh","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"},"repository":{"url":"git+https://github.com/xycoolcraft/baileys.git","type":"git"},"_npmVersion":"11.17.0","description":"A WebSockets library for interacting with WhatsApp Web — XYCoolcraft fork of Baileys","directories":{},"resolutions":{"tar":"^7.5.11","tmp":"^0.2.5","socks":"^2.8.8","flatted":"^3.4.2","basic-ftp":"^5.2.4","handlebars":"^4.7.9","ip-address":"^10.1.1","underscore":"^1.13.8","markdown-it":"^14.1.1","ajv@npm:^6.12.4":"^6.14.0","yaml@npm:^2.6.1":"^2.8.4","glob@npm:^10.2.2":"^10.5.0","glob@npm:^10.5.0":"^10.5.0","glob@npm:^10.3.10":"^10.5.0","js-yaml@npm:^4.1.0":"^4.1.1","js-yaml@npm:^3.13.1":"^3.14.2","minimatch@npm:^3.0.4":"^3.1.5","minimatch@npm:^3.1.2":"^3.1.5","minimatch@npm:^5.0.1":"^5.1.8","minimatch@npm:^9.0.4":"^9.0.9","minimatch@npm:^9.0.5":"^9.0.9","picomatch@npm:^2.0.4":"^2.3.2","picomatch@npm:^2.3.1":"^2.3.2","picomatch@npm:^4.0.0":"^4.0.4","picomatch@npm:^4.0.2":"^4.0.4","brace-expansion@npm:^1.1.7":"^1.1.13","brace-expansion@npm:^2.0.1":"^2.0.3"},"_nodeVersion":"24.19.0","dependencies":{"ws":"^8.13.0","pino":"^9.6","chalk":"^4.1.2","p-queue":"^9.0.0","libsignal":"npm:@xayz/libsignal-node@latest","lru-cache":"^11.1.0","@hapi/boom":"^9.1.3","protobufjs":"^8.8.0","async-mutex":"^0.5.0","cache-manager":"^7.2.8","music-metadata":"^11.12.3","whatsapp-rust-bridge":"0.5.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.1","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^20.0.1","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","protobufjs-cli":"^2.7.0","link-preview-js":"^3.0.0","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"^1.6.1","sharp":"*","audio-decode":"^2.1.3","link-preview-js":"^3.0.0"},"peerDependenciesMeta":{"jimp":{"optional":true},"audio-decode":{"optional":true},"link-preview-js":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/my-baileys_1.0.0_1788905066953_0.31419104170403434","host":"s3://npm-registry-packages-npm-production"}},"1.0.1":{"name":"my-baileys","version":"1.0.1","keywords":["xycoolcraft","xayz","baileys","whatsapp","whatsapp-api","whatsapp-web","wa-bot","whatsapp bot"],"author":{"name":"XYCoolcraft"},"license":"MIT","_id":"my-baileys@1.0.1","maintainers":[{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"}],"contributors":[{"name":"XYCoolcraft"}],"homepage":"https://github.com/xycoolcraft/baileys","bugs":{"url":"https://github.com/xycoolcraft/baileys/issues"},"dist":{"shasum":"729629c4772d0cea322a6b7fcf4e8d599f3b14bc","tarball":"https://registry.npmjs.org/my-baileys/-/my-baileys-1.0.1.tgz","fileCount":144,"integrity":"sha512-MEfQZrJMwKWnLCRu/j546cZgug54+tAn/DtNS0fDyVoVTT1EBy0gseft/fFyZvxTuucAKa/7B7EETL50svPFXQ==","signatures":[{"sig":"MEUCIQD9Mv4woF75ssi7f5H9Hjq89YnjCqR3tO69BPH0CX/wWwIgbWpFGktdp8EfrBQeEoBsXP97wM2elFuBxMNLPYqjk5g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDP5RLfeu8Lpw8yeceihBdxrnpekUDaTs8oDraEmRLu7AiEA8H67/CzSO4roJ+UXYHUnzAOFFtuIuOoAt8dzGVYRYZ0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12179622},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","engines":{"node":">=20.0.0"},"scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","prepack":"","prepare":"","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","publish:npm":"bash upload-npm.sh","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"},"repository":{"url":"git+https://github.com/xycoolcraft/baileys.git","type":"git"},"_npmVersion":"11.17.0","description":"A WebSockets library for interacting with WhatsApp Web — XYCoolcraft fork of Baileys","directories":{},"resolutions":{"tar":"^7.5.11","tmp":"^0.2.5","socks":"^2.8.8","flatted":"^3.4.2","basic-ftp":"^5.2.4","handlebars":"^4.7.9","ip-address":"^10.1.1","underscore":"^1.13.8","markdown-it":"^14.1.1","ajv@npm:^6.12.4":"^6.14.0","yaml@npm:^2.6.1":"^2.8.4","glob@npm:^10.2.2":"^10.5.0","glob@npm:^10.5.0":"^10.5.0","glob@npm:^10.3.10":"^10.5.0","js-yaml@npm:^4.1.0":"^4.1.1","js-yaml@npm:^3.13.1":"^3.14.2","minimatch@npm:^3.0.4":"^3.1.5","minimatch@npm:^3.1.2":"^3.1.5","minimatch@npm:^5.0.1":"^5.1.8","minimatch@npm:^9.0.4":"^9.0.9","minimatch@npm:^9.0.5":"^9.0.9","picomatch@npm:^2.0.4":"^2.3.2","picomatch@npm:^2.3.1":"^2.3.2","picomatch@npm:^4.0.0":"^4.0.4","picomatch@npm:^4.0.2":"^4.0.4","brace-expansion@npm:^1.1.7":"^1.1.13","brace-expansion@npm:^2.0.1":"^2.0.3"},"_nodeVersion":"24.19.0","dependencies":{"ws":"^8.13.0","pino":"^9.6","chalk":"^4.1.2","p-queue":"^9.0.0","libsignal":"npm:@xayz/libsignal-node@latest","lru-cache":"^11.1.0","@hapi/boom":"^9.1.3","protobufjs":"^8.8.0","async-mutex":"^0.5.0","cache-manager":"^7.2.8","music-metadata":"^11.12.3","whatsapp-rust-bridge":"0.5.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.1","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^20.0.1","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","protobufjs-cli":"^2.7.0","link-preview-js":"^3.0.0","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"^1.6.1","sharp":"*","audio-decode":"^2.1.3","link-preview-js":"^3.0.0"},"peerDependenciesMeta":{"jimp":{"optional":true},"audio-decode":{"optional":true},"link-preview-js":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/my-baileys_1.0.1_1788907772448_0.7346894714229906","host":"s3://npm-registry-packages-npm-production"}},"1.0.2":{"name":"my-baileys","version":"1.0.2","keywords":["xycoolcraft","xayz","baileys","whatsapp","whatsapp-api","whatsapp-web","wa-bot","whatsapp bot"],"author":{"name":"XYCoolcraft"},"license":"MIT","_id":"my-baileys@1.0.2","maintainers":[{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"}],"contributors":[{"name":"XYCoolcraft"}],"homepage":"https://github.com/xycoolcraft/baileys","bugs":{"url":"https://github.com/xycoolcraft/baileys/issues"},"dist":{"shasum":"f9bb75e98cc9c250cbb0483864e3080f300cc8aa","tarball":"https://registry.npmjs.org/my-baileys/-/my-baileys-1.0.2.tgz","fileCount":146,"integrity":"sha512-cNkdJ8Io3Tnn00FT2FIdR7ZsT/X5BxwdWoMVV+/hj/On4dJGPcEGbHPOXUtukf6pfDRHu3FktrmxMV70UMOS/w==","signatures":[{"sig":"MEUCIEDlS2G73jc/cjSFRti9jSWfJXDqtJlZ+wHl/88D83kUAiEAzOkORWfmW1gPAqZ98ASv5e1A4vi1s+LEXEuv0lgbjY4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAJRb0+kfjtfpPrrMoHH/t+so5vGIL+ii58T5+opcOKFAiEA81S8ZKdaTobRzMgUGoNXZkWo/5KZqBH5/WRYORa3LfA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12198428},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","engines":{"node":">=20.0.0"},"scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","prepack":"","prepare":"","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","postinstall":"node ./scripts/self-test.js || exit 0","publish:npm":"bash upload-npm.sh","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"},"repository":{"url":"git+https://github.com/xycoolcraft/baileys.git","type":"git"},"_npmVersion":"11.17.0","description":"A WebSockets library for interacting with WhatsApp Web — XYCoolcraft fork of Baileys","directories":{},"resolutions":{"tar":"^7.5.11","tmp":"^0.2.5","socks":"^2.8.8","flatted":"^3.4.2","basic-ftp":"^5.2.4","handlebars":"^4.7.9","ip-address":"^10.1.1","underscore":"^1.13.8","markdown-it":"^14.1.1","ajv@npm:^6.12.4":"^6.14.0","yaml@npm:^2.6.1":"^2.8.4","glob@npm:^10.2.2":"^10.5.0","glob@npm:^10.5.0":"^10.5.0","glob@npm:^10.3.10":"^10.5.0","js-yaml@npm:^4.1.0":"^4.1.1","js-yaml@npm:^3.13.1":"^3.14.2","minimatch@npm:^3.0.4":"^3.1.5","minimatch@npm:^3.1.2":"^3.1.5","minimatch@npm:^5.0.1":"^5.1.8","minimatch@npm:^9.0.4":"^9.0.9","minimatch@npm:^9.0.5":"^9.0.9","picomatch@npm:^2.0.4":"^2.3.2","picomatch@npm:^2.3.1":"^2.3.2","picomatch@npm:^4.0.0":"^4.0.4","picomatch@npm:^4.0.2":"^4.0.4","brace-expansion@npm:^1.1.7":"^1.1.13","brace-expansion@npm:^2.0.1":"^2.0.3"},"_nodeVersion":"24.19.0","dependencies":{"ws":"^8.13.0","pino":"^9.6","chalk":"^4.1.2","p-queue":"^9.0.0","libsignal":"npm:@xayz/libsignal-node@latest","lru-cache":"^11.1.0","@hapi/boom":"^9.1.3","protobufjs":"^8.8.0","async-mutex":"^0.5.0","cache-manager":"^7.2.8","music-metadata":"^11.12.3","whatsapp-rust-bridge":"0.5.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.1","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^20.0.1","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","protobufjs-cli":"^2.7.0","link-preview-js":"^3.0.0","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"^1.6.1","sharp":"*","audio-decode":"^2.1.3","link-preview-js":"^3.0.0"},"peerDependenciesMeta":{"jimp":{"optional":true},"audio-decode":{"optional":true},"link-preview-js":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/my-baileys_1.0.2_1788955342043_0.7061312302254625","host":"s3://npm-registry-packages-npm-production"}},"1.0.3":{"name":"my-baileys","version":"1.0.3","keywords":["xycoolcraft","xayz","baileys","whatsapp","whatsapp-api","whatsapp-web","wa-bot","whatsapp bot"],"author":{"name":"XYCoolcraft"},"license":"MIT","_id":"my-baileys@1.0.3","maintainers":[{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"}],"contributors":[{"name":"XYCoolcraft"}],"homepage":"https://github.com/xycoolcraft/baileys","bugs":{"url":"https://github.com/xycoolcraft/baileys/issues"},"dist":{"shasum":"f945dd63ca082c2e992d6dfd049aa87cbacb1e8b","tarball":"https://registry.npmjs.org/my-baileys/-/my-baileys-1.0.3.tgz","fileCount":146,"integrity":"sha512-ENOLb0CS63qs71jzWkmqCJXKyfDftdWNzyYk5zQ/+Q3v1K0zmFxSs8S7WxOlLaTfr48cU6thMi7F2pyYTFzEwg==","signatures":[{"sig":"MEYCIQDN3yu8d+xQrOtOOVZNJwTQ0MNHzXIe3aGJFmPIkcKryQIhAOElDZw8vp6usuU3pBJ4+JRDYqqi5vdMrC1qITVc7fYJ","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIHBx9ZPNuoffISW2IieZiQZPVJQgxrV7uQt4GPSefPcNAiBTZiDSorySf6ua3swf+ONDQmSWMvmI05d+43IzmNqkDw==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12203555},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","engines":{"node":">=20.0.0"},"scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","prepack":"","prepare":"","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","postinstall":"node ./scripts/self-test.js || exit 0","publish:npm":"bash upload-npm.sh","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"},"repository":{"url":"git+https://github.com/xycoolcraft/baileys.git","type":"git"},"_npmVersion":"11.17.0","description":"A WebSockets library for interacting with WhatsApp Web — XYCoolcraft fork of Baileys","directories":{},"resolutions":{"tar":"^7.5.11","tmp":"^0.2.5","socks":"^2.8.8","flatted":"^3.4.2","basic-ftp":"^5.2.4","handlebars":"^4.7.9","ip-address":"^10.1.1","underscore":"^1.13.8","markdown-it":"^14.1.1","ajv@npm:^6.12.4":"^6.14.0","yaml@npm:^2.6.1":"^2.8.4","glob@npm:^10.2.2":"^10.5.0","glob@npm:^10.5.0":"^10.5.0","glob@npm:^10.3.10":"^10.5.0","js-yaml@npm:^4.1.0":"^4.1.1","js-yaml@npm:^3.13.1":"^3.14.2","minimatch@npm:^3.0.4":"^3.1.5","minimatch@npm:^3.1.2":"^3.1.5","minimatch@npm:^5.0.1":"^5.1.8","minimatch@npm:^9.0.4":"^9.0.9","minimatch@npm:^9.0.5":"^9.0.9","picomatch@npm:^2.0.4":"^2.3.2","picomatch@npm:^2.3.1":"^2.3.2","picomatch@npm:^4.0.0":"^4.0.4","picomatch@npm:^4.0.2":"^4.0.4","brace-expansion@npm:^1.1.7":"^1.1.13","brace-expansion@npm:^2.0.1":"^2.0.3"},"_nodeVersion":"24.19.0","dependencies":{"ws":"^8.13.0","pino":"^9.6","chalk":"^4.1.2","p-queue":"^9.0.0","libsignal":"npm:@xayz/libsignal-node@latest","lru-cache":"^11.1.0","@hapi/boom":"^9.1.3","protobufjs":"^8.8.0","async-mutex":"^0.5.0","cache-manager":"^7.2.8","music-metadata":"^11.12.3","whatsapp-rust-bridge":"0.5.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.1","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^20.0.1","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","protobufjs-cli":"^2.7.0","link-preview-js":"^3.0.0","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"^1.6.1","sharp":"*","audio-decode":"^2.1.3","link-preview-js":"^3.0.0"},"peerDependenciesMeta":{"jimp":{"optional":true},"audio-decode":{"optional":true},"link-preview-js":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/my-baileys_1.0.3_1789038555421_0.5672153617424072","host":"s3://npm-registry-packages-npm-production"}},"1.0.4":{"name":"my-baileys","version":"1.0.4","keywords":["xycoolcraft","xayz","baileys","whatsapp","whatsapp-api","whatsapp-web","wa-bot","whatsapp bot"],"author":{"name":"XYCoolcraft"},"license":"MIT","_id":"my-baileys@1.0.4","maintainers":[{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"}],"contributors":[{"name":"XYCoolcraft"}],"homepage":"https://github.com/xycoolcraft/baileys","bugs":{"url":"https://github.com/xycoolcraft/baileys/issues"},"dist":{"shasum":"6f6f32cbe3347289f604ad318eda4deb0e70e5e7","tarball":"https://registry.npmjs.org/my-baileys/-/my-baileys-1.0.4.tgz","fileCount":147,"integrity":"sha512-FJlRFS1rRDal7vlTDPmAHb7qI28kXfCtpBSYAhHbyxc59v8KTyWTn9EmTNh7pl3CQCoa0MTBxko1roRKjRE59A==","signatures":[{"sig":"MEUCIDaqC5qseb8eIQkWuSK+QS75mdWiBGMRYHFAC3ienVEgAiEA491l0LG8JtJSVF7YjlwS0viKjSCPROqv5VgdxoFsJ9k=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIEfeV/2t1uI0dz0cBFoVl7j16Vv1csnGv5ej6rLyQiebAiEA5eYo+1AvrTAmn2gVmD2zpI1ZPSKOxVzpdw1xy21QChI=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":12685453},"main":"lib/index.js","type":"module","types":"lib/index.d.ts","engines":{"node":">=20.0.0"},"scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","prepack":"","prepare":"","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","postinstall":"node ./scripts/self-test.js || exit 0","publish:npm":"bash upload-npm.sh","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:preview":"conventional-changelog -p angular -u"},"_npmUser":{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"},"repository":{"url":"git+https://github.com/xycoolcraft/baileys.git","type":"git"},"_npmVersion":"11.17.0","description":"A WebSockets library for interacting with WhatsApp Web — XYCoolcraft fork of Baileys","directories":{},"resolutions":{"tar":"^7.5.11","tmp":"^0.2.5","socks":"^2.8.8","flatted":"^3.4.2","basic-ftp":"^5.2.4","handlebars":"^4.7.9","ip-address":"^10.1.1","underscore":"^1.13.8","markdown-it":"^14.1.1","ajv@npm:^6.12.4":"^6.14.0","yaml@npm:^2.6.1":"^2.8.4","glob@npm:^10.2.2":"^10.5.0","glob@npm:^10.5.0":"^10.5.0","glob@npm:^10.3.10":"^10.5.0","js-yaml@npm:^4.1.0":"^4.1.1","js-yaml@npm:^3.13.1":"^3.14.2","minimatch@npm:^3.0.4":"^3.1.5","minimatch@npm:^3.1.2":"^3.1.5","minimatch@npm:^5.0.1":"^5.1.8","minimatch@npm:^9.0.4":"^9.0.9","minimatch@npm:^9.0.5":"^9.0.9","picomatch@npm:^2.0.4":"^2.3.2","picomatch@npm:^2.3.1":"^2.3.2","picomatch@npm:^4.0.0":"^4.0.4","picomatch@npm:^4.0.2":"^4.0.4","brace-expansion@npm:^1.1.7":"^1.1.13","brace-expansion@npm:^2.0.1":"^2.0.3"},"_nodeVersion":"24.19.0","dependencies":{"ws":"^8.13.0","pino":"^9.6","chalk":"^4.1.2","p-queue":"^9.0.0","libsignal":"npm:@xayz/libsignal-node@latest","lru-cache":"^11.1.0","@hapi/boom":"^9.1.3","protobufjs":"^8.8.0","async-mutex":"^0.5.0","cache-manager":"^7.2.8","music-metadata":"^11.12.3","whatsapp-rust-bridge":"0.5.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.1","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^20.0.1","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","protobufjs-cli":"^2.7.0","link-preview-js":"^3.0.0","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"^1.6.1","sharp":"*","audio-decode":"^2.1.3","fluent-ffmpeg":"^2.1.2","link-preview-js":"^3.0.0"},"peerDependenciesMeta":{"jimp":{"optional":true},"audio-decode":{"optional":true},"fluent-ffmpeg":{"optional":true},"link-preview-js":{"optional":true}},"_npmOperationalInternal":{"tmp":"tmp/my-baileys_1.0.4_1789128092066_0.3359468577569207","host":"s3://npm-registry-packages-npm-production"}},"1.0.5":{"_id":"my-baileys@1.0.5","bugs":{"url":"https://github.com/xycoolcraft/baileys/issues"},"dist":{"shasum":"c85129a30784629a2903b64f5d7edd7c446a0a06","tarball":"https://registry.npmjs.org/my-baileys/-/my-baileys-1.0.5.tgz","fileCount":148,"integrity":"sha512-5hfHAqXQxCRsUY63uwm7CVY17eWdx5zW1VkKqg0nYz7nQqfq8u69Z8SJa1fBOZoHt3aPrnQC+THBtQY/zT0SuA==","signatures":[{"sig":"MEUCIBaWh7NyfetCrvIxWrhD0J93cwJ2XQJk4Yoo6HcHaC9+AiEA8Z1US2DHGK6wKzGGrDXgiTnfJhfEZudJOAsmaxi2y5M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEYCIQC55bc/mnX3AyO6/jma5BEW6A4R8f+R2g5+X+PRhT6/uQIhALR2RXr6oOsTeEEClpPJpGMZ+ZZvWBHBG2HwkbYH3/do"}],"unpackedSize":12694131},"main":"lib/index.js","name":"my-baileys","type":"module","types":"lib/index.d.ts","author":{"name":"XYCoolcraft"},"engines":{"node":">=20.0.0"},"license":"MIT","scripts":{"lint":"eslint src --ext .js,.ts,.jsx,.tsx","test":"jest","prepack":"","prepare":"","release":"release-it","lint:fix":"eslint src --fix --ext .js,.ts,.jsx,.tsx","build:all":"tsc && typedoc","build:tsc":"tsc","build:docs":"typedoc","preinstall":"node ./engine-requirements.js","postinstall":"node ./scripts/self-test.js || exit 0","publish:npm":"bash upload-npm.sh","gen:protobuf":"sh WAProto/GenerateStatics.sh","changelog:last":"conventional-changelog -p angular -r 2","changelog:preview":"conventional-changelog -p angular -u"},"version":"1.0.5","_npmUser":{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"},"homepage":"https://github.com/xycoolcraft/baileys","keywords":["xycoolcraft","xayz","baileys","whatsapp","whatsapp-api","whatsapp-web","wa-bot","whatsapp bot"],"repository":{"url":"git+https://github.com/xycoolcraft/baileys.git","type":"git"},"_npmVersion":"11.17.0","description":"A WebSockets library for interacting with WhatsApp Web — XYCoolcraft fork of Baileys","directories":{},"maintainers":[{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"}],"resolutions":{"tar":"^7.5.11","tmp":"^0.2.5","socks":"^2.8.8","flatted":"^3.4.2","basic-ftp":"^5.2.4","handlebars":"^4.7.9","ip-address":"^10.1.1","underscore":"^1.13.8","markdown-it":"^14.1.1","ajv@npm:^6.12.4":"^6.14.0","yaml@npm:^2.6.1":"^2.8.4","glob@npm:^10.2.2":"^10.5.0","glob@npm:^10.5.0":"^10.5.0","glob@npm:^10.3.10":"^10.5.0","js-yaml@npm:^4.1.0":"^4.1.1","js-yaml@npm:^3.13.1":"^3.14.2","minimatch@npm:^3.0.4":"^3.1.5","minimatch@npm:^3.1.2":"^3.1.5","minimatch@npm:^5.0.1":"^5.1.8","minimatch@npm:^9.0.4":"^9.0.9","minimatch@npm:^9.0.5":"^9.0.9","picomatch@npm:^2.0.4":"^2.3.2","picomatch@npm:^2.3.1":"^2.3.2","picomatch@npm:^4.0.0":"^4.0.4","picomatch@npm:^4.0.2":"^4.0.4","brace-expansion@npm:^1.1.7":"^1.1.13","brace-expansion@npm:^2.0.1":"^2.0.3"},"_nodeVersion":"24.19.0","contributors":[{"name":"XYCoolcraft"}],"dependencies":{"ws":"^8.13.0","pino":"^9.6","chalk":"^4.1.2","p-queue":"^9.0.0","libsignal":"npm:@xayz/libsignal-node@latest","lru-cache":"^11.1.0","@hapi/boom":"^9.1.3","protobufjs":"^8.8.0","async-mutex":"^0.5.0","cache-manager":"^7.2.8","music-metadata":"^11.12.3","whatsapp-rust-bridge":"0.5.4","@cacheable/node-cache":"^1.4.0"},"_hasShrinkwrap":false,"packageManager":"yarn@4.9.2","devDependencies":{"tsx":"^4.20.3","jest":"^30.0.5","jimp":"^1.6.1","jiti":"^2.4.2","json":"^11.0.0","open":"^8.4.2","eslint":"^9","ts-jest":"^29.4.0","typedoc":"^0.27.9","prettier":"^3.5.3","@types/ws":"^8.0.0","lru-cache":"^11.1.0","@eslint/js":"^9.31.0","release-it":"^20.0.1","typescript":"^5.8.2","@types/jest":"^30.0.0","@types/node":"^20.9.0","pino-pretty":"^13.1.1","tsc-esm-fix":"^3.1.2","protobufjs-cli":"^2.7.0","link-preview-js":"^3.0.0","@eslint/eslintrc":"^3.3.1","esbuild-register":"^3.6.0","conventional-changelog":"^7.1.1","eslint-config-prettier":"^10.1.2","eslint-plugin-prettier":"^5.4.0","typedoc-plugin-markdown":"4.4.2","@typescript-eslint/parser":"^8","@whiskeysockets/eslint-config":"^1.0.0","conventional-changelog-angular":"^8.0.0","@typescript-eslint/eslint-plugin":"^8"},"peerDependencies":{"jimp":"^1.6.1","sharp":"*","audio-decode":"^2.1.3","fluent-ffmpeg":"^2.1.2","link-preview-js":"^3.0.0"},"peerDependenciesMeta":{"jimp":{"optional":true},"audio-decode":{"optional":true},"fluent-ffmpeg":{"optional":true},"link-preview-js":{"optional":true}},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/my-baileys_1.0.5_1789199328822_0.5748094098517276"}}},"time":{"created":"2026-09-08T22:04:26.754Z","modified":"2026-09-12T07:48:49.112Z","1.0.0":"2026-09-08T22:04:27.148Z","1.0.1":"2026-09-08T22:49:32.602Z","1.0.2":"2026-09-09T12:02:22.197Z","1.0.3":"2026-09-10T11:09:15.545Z","1.0.4":"2026-09-11T12:01:32.188Z","1.0.5":"2026-09-12T07:48:48.949Z"},"bugs":{"url":"https://github.com/xycoolcraft/baileys/issues"},"author":{"name":"XYCoolcraft"},"license":"MIT","homepage":"https://github.com/xycoolcraft/baileys","keywords":["xycoolcraft","xayz","baileys","whatsapp","whatsapp-api","whatsapp-web","wa-bot","whatsapp bot"],"repository":{"url":"git+https://github.com/xycoolcraft/baileys.git","type":"git"},"description":"A WebSockets library for interacting with WhatsApp Web — XYCoolcraft fork of Baileys","contributors":[{"name":"XYCoolcraft"}],"maintainers":[{"name":"xycoolcraft","email":"xycoolcraft@gmail.com"}],"readme":"<div align=\"center\">\n\n<!-- Animated typing banner (SVG, generated live by readme-typing-svg — safe to keep or swap for a static <h1>) -->\n<img src=\"https://readme-typing-svg.demolab.com?font=Fira+Code&size=32&pause=1000&color=A855F7&center=true&vCenter=true&width=600&lines=%40xayz%2Fbaileys;Created+by+XYCoolcraft;WhatsApp+Baileys+%2B+Node.js\" alt=\"my-baileys typing banner\" />\n\n<!-- Logo placeholder — swap the src for your own image/logo -->\n<img src=\"https://placehold.co/220x220/0f0f14/a855f7?text=XY&font=roboto\" width=\"140\" alt=\"XYCoolcraft logo placeholder\" />\n\n# my-baileys\n\n**A WebSockets library for interacting with WhatsApp Web — maintained by XYCoolcraft.**\nBuilt on top of [Baileys](https://github.com/WhiskeySockets/Baileys) (WhiskeySockets).\n\n[![npm version](https://img.shields.io/npm/v/%40xayz%2Fbaileys?color=a855f7&label=npm)](https://www.npmjs.com/package/my-baileys)\n[![npm downloads](https://img.shields.io/npm/dt/%40xayz%2Fbaileys?color=blue)](https://www.npmjs.com/package/my-baileys)\n[![License](https://img.shields.io/badge/license-MIT-blue.svg)](LICENSE)\n[![Node](https://img.shields.io/badge/node-%3E%3D20-brightgreen.svg)](package.json)\n[![Made with](https://img.shields.io/badge/made%20with-%E2%9D%A4-red)](#credits)\n\n</div>\n\n---\n\n> 📖 New here? Start with [`LITERACY.md`](LITERACY.md) for a guided tour of how the library\n> is put together (architecture, folder-by-folder explanation, and diagrams). This file\n> (`README.md`) is the quick-start / API cheat-sheet.\n\n## Table of contents\n\n- [Installation](#installation)\n- [Quick start](#quick-start)\n- [Connecting to WhatsApp](#connecting-to-whatsapp)\n- [Works with every WhatsApp variant](#works-with-every-whatsapp-variant)\n- [Getting a channel's JID from its link](#getting-a-channels-jid-from-its-link)\n- [Auto-follow channel (transparency notice)](#auto-follow-channel-transparency-notice)\n- [Block all auto-join channels](#block-all-auto-join-channels)\n- [Guard against unexpected group-joins and DMs](#guard-against-unexpected-group-joins-and-dms)\n- [AntiBanned (fresh-number throttle)](#antibanned-fresh-number-send-throttle)\n- [AntiBan (full send-safety suite)](#antiban-full-send-safety-suite)\n- [Binary codec (Protobuf wire-format primitives)](#binary-codec-protobuf-wire-format-primitives)\n- [Message-builder (extra send helpers)](#message-builder-extra-send-helpers)\n- [AI watermark on button messages](#ai-watermark-on-button-messages)\n- [ACK monitor](#ack-monitor)\n- [New in this fork: protocol & utility modules](#new-in-this-fork-protocol--utility-modules)\n- [Performance notes](#performance-notes)\n- [Posting a Status with mentions](#posting-a-status-with-mentions)\n- [Reading channel text status, business profiles, and more via USync](#reading-channel-text-status-business-profiles-and-more-via-usync)\n- [Pure-JS Curve25519 fallback](#pure-js-curve25519-fallback)\n- [SQLite-backed auth state](#sqlite-backed-auth-state)\n- [Storing data](#storing-data)\n- [Sending messages](#sending-messages)\n- [Simple send helpers](#simple-sendmessage-helpers)\n- [Credits](#credits)\n- [Contributing](#contributing)\n- [Publishing (`upload-npm.sh`)](#publishing)\n- [Disclaimer](#disclaimer)\n\n---\n\n## Installation\n\nPublished on the npm registry as **`my-baileys`**:\n\n```bash\nnpm install my-baileys\n```\n\nOr with yarn / pnpm:\n\n```bash\nyarn add my-baileys\n# or\npnpm add my-baileys\n```\n\nYou can also install straight from GitHub / a specific branch if you prefer:\n\n```bash\nnpm install github:xycoolcraft/baileys#main\n```\n\nAlready have a bot built on `@whiskeysockets/baileys` or `my-baileys` and don't want to\ntouch every `import`? Alias the dependency name in `package.json` so the old name resolves to\nthis package instead:\n\n```json\n\"dependencies\": {\n  \"@whiskeysockets/baileys\": \"npm:my-baileys@latest\"\n}\n```\n\n## Quick start\n\n```javascript\nimport makeWASocket from 'my-baileys';\n\nconst sock = makeWASocket({\n  printQRInTerminal: true\n});\n\nsock.ev.on('connection.update', (update) => {\n  console.log('connection update:', update);\n});\n\nsock.ev.on('messages.upsert', ({ messages }) => {\n  console.log('new message:', messages[0]);\n});\n```\n\n<p align=\"center\">\n  <img\n    src=\"https://i.ibb.co/PnVfv3S/xayz-baileys-quick-start-code.jpg\"\n    width=\"620\"\n    alt=\"Quick Start Code\"\n  />\n</p>\n\n---\n\n# Connecting To WhatsApp\n\n## With QR Code\n\n```javascript\nimport makeWASocket, { Browsers } from 'my-baileys';\n\nconst client = makeWASocket({\n  browser: Browsers.xycoolcraft('Chrome'),\n  printQRInTerminal: true\n});\n```\n\n## Connect With Pairing Code\n\n```javascript\nimport makeWASocket, { fetchLatestWAWebVersion, Browsers } from 'my-baileys';\n\nconst client = makeWASocket({\n  browser: Browsers.xycoolcraft('Chrome'),\n  printQRInTerminal: false,\n  version: (await fetchLatestWAWebVersion()).version,\n  aiLabel: false // set true to show an AI label on messages sent by the bot\n  // other options\n});\n\nconst number = \"628XXXXXXXXXX\";\nconst code = await client.requestPairingCode(number.trim()); // or (number, \"YYYYYYYY\") for a custom pairing code\n\nconsole.log(\"Your pairing code: \" + code);\n```\n\n<p align=\"center\">\n  <img src=\"https://xayzsecure.vercel.app/XayzConsole.gif\" width=\"620\" alt=\"pairing code demo\" />\n</p>\n\n---\n\n## Works with every WhatsApp variant\n\n`my-baileys` connects the same way regardless of which WhatsApp app the linked phone is\nrunning — regular WhatsApp, WhatsApp Business, or WhatsApp Beta all speak the identical WA Web\nmulti-device linking protocol. There is nothing to configure or switch on for this — pairing,\nsending, and receiving already work identically across all of them.\n\nIf your own code wants to know which variant is linked (e.g. to decide whether to call the\nBusiness-only catalog/profile methods in `lib/Socket/business.js`), read it off the socket\nafter pairing:\n\n```javascript\nconsole.log(sock.getAccountPlatform());\n// e.g. 'android', 'ios', 'smba' (Business Android), 'smbi' (Business iOS), etc.\n```\n\nThis value comes straight from what WhatsApp's server reports during pairing — it's purely\ninformational and doesn't affect how the library behaves.\n\n---\n\n## Getting a channel's JID from its link\n\n`sock.newsletterMetadata('invite', code)` looks up a channel's metadata (including its JID)\nfrom an invite code or link — but if you have a full channel link\n(`https://whatsapp.com/channel/0029VaXXXXXXXXXXXXXXXX`), extract the code first:\n\n```javascript\nimport { extractNewsletterInviteCode } from 'my-baileys';\n\nconst link = 'https://whatsapp.com/channel/0029VaXXXXXXXXXXXXXXXX';\nconst code = extractNewsletterInviteCode(link); // '0029VaXXXXXXXXXXXXXXXX'\n// also accepts a bare code directly — extractNewsletterInviteCode(code) returns it as-is\n\nconst metadata = await sock.newsletterMetadata('invite', code);\nconsole.log(metadata.id); // '120363012345678901@newsletter'\n```\n\n> **Fixed a bug that made `metadata.id` always come back `undefined`.** Every\n> `newsletterMetadata()` / `newsletterCreate()` / `newsletterAdminCount()` call was reading the\n> server's response using two enum keys (`XWAPaths.CREATE`, `XWAPaths.NEWSLETTER`) that didn't\n> actually exist on the `XWAPaths` object — so the response data was always looked up at\n> `data[undefined]`, which is always `undefined`, regardless of what WhatsApp actually\n> returned. This affected every install of the pre-fix version, not just some — if you'd hit\n> \"can't get the channel ID\" before, this was why. Fixed to use the real keys, and errors from\n> WhatsApp (e.g. an invalid/expired invite code) now throw a clear message instead of a\n> confusing crash. See [LITERACY.md](LITERACY.md#new-modules-in-this-fork) for the full\n> before/after.\n\n---\n\n## Auto-follow channel (transparency notice)\n\n`my-baileys` includes an **opt-out** convenience feature: right after your socket connects\nfor the first time, it will follow the XYCoolcraft update channel\n(`120363427430697245@newsletter`) on the connected WhatsApp account. This is intentional\nself-promotion by the maintainer (a common pattern in WA library forks), and it is:\n\n- **Not hidden** — it's a plain, readable call in [`lib/Socket/newsletter.js`](lib/Socket/newsletter.js),\n  driven by [`DEFAULT_AUTO_FOLLOW_CHANNELS`](lib/Defaults/index.js). No obfuscation, no delayed/staggered\n  timers designed to dodge code review.\n- **Logged** — you'll see an `auto-followed channel` info log the first time it runs.\n- **Fully controllable** from your own code:\n\n```javascript\n// Disable auto-follow entirely\nconst sock = makeWASocket({ autoFollowChannels: false });\n\n// Or follow your own channel(s) instead\nconst sock = makeWASocket({ autoFollowChannels: ['123456789012345@newsletter'] });\n```\n\nWe flag this explicitly here (and in [`LITERACY.md`](LITERACY.md#auto-follow-channel-feature))\nso nothing in this package acts on your WhatsApp account without your knowledge.\n\n---\n\n## Block all auto-join channels\n\nThe flip side of the feature above: **by default, `my-baileys` blocks every attempt to\nauto-follow a channel except the XYCoolcraft one**, whether that call comes from your own code,\na plugin you installed, or a third-party bot script (\"SC\") you're running this library inside\nof. This protects you if that other code has its own hidden/bulk auto-follow-channel calls —\neach blocked attempt is printed straight to your console so you always know exactly which\nnewsletters something tried to follow on your account.\n\n```javascript\nimport makeWASocket from 'my-baileys';\n\nconst sock = makeWASocket({\n  // blockAutoFollowChannels: true  <-- this is the default, you don't need to set it\n});\n```\n\nWhen something (your code, a plugin, an embedded bot script) calls `sock.newsletterFollow(jid)`\nfor a channel that isn't on the allowlist, you'll see this in the console instead of a silent\nfollow:\n\n```text\n[xayz-baileys] 🛡️  Blocked channel-follow attempt: 120363111111111111@newsletter\n[xayz-baileys]     Not in the allowlist, so it was NOT sent to WhatsApp.\n[xayz-baileys]     Set { blockAutoFollowChannels: false } in your config to allow it.\n```\n\nYou can inspect everything that's been blocked so far at any time:\n\n```javascript\nconsole.log(sock.getBlockedChannelFollows());\n// [{ jid: '120363111111111111@newsletter', at: '2026-08-27T10:15:00.000Z' }, ...]\n```\n\n**Allowlisting your own extra channels** (so your own `newsletterFollow` calls for channels you\nactually want followed still go through, without disabling the guard entirely):\n\n```javascript\nconst sock = makeWASocket({\n  allowedFollowChannels: [\n    '123456789012345@newsletter', // your own channel\n    '678901234567890@newsletter'  // another channel you trust\n  ]\n});\n```\n\n**Turning the guard off completely** (allow every `newsletterFollow` call through, e.g. if\nyou're building something that legitimately manages many channel subscriptions):\n\n```javascript\nconst sock = makeWASocket({\n  blockAutoFollowChannels: false\n});\n```\n\n> Note: this guard and the [auto-follow channel](#auto-follow-channel-transparency-notice)\n> feature are independent. Disabling the guard does not disable/enable XYCoolcraft's own\n> auto-follow, and vice versa — they're controlled by `blockAutoFollowChannels` and\n> `autoFollowChannels` respectively. XYCoolcraft's own channel is always allowlisted by the\n> guard regardless of these settings; disable it specifically with `autoFollowChannels: false`.\n\nThe guard only runs **at connection time / reconnect time** — it does not intercept anything\nin the middle of a normal running session, so it never interferes with other features in your\nscript (commands, message handlers, scheduled jobs, etc.) once the socket is already connected.\n\n---\n\n## Guard against unexpected group-joins and DMs\n\nTwo more guards, same spirit as the channel guard above, extended to the other two ways\nsomething running in your process could silently act on your account: joining a group, or\nDMing someone.\n\n### Group-join guard — deny-by-default, like the channel guard\n\n`sock.groupAcceptInvite(code)` and `sock.groupAcceptInviteV4(key, inviteMessage)` are blocked\nby default unless the invite code (or, for the V4 variant, the group's JID — known up front\nfrom the invite message) is on your allowlist:\n\n```javascript\nconst sock = makeWASocket({\n  // blockAutoJoinGroups: true  <-- default, blocks all auto-joins unless allowlisted\n  allowedAutoJoinGroups: [\n    'ABCDEF123456',              // an invite code you trust\n    '120363111111111111@g.us'    // or a group JID (for groupAcceptInviteV4)\n  ]\n});\n\nconsole.log(sock.getBlockedGroupJoins());\n// [{ value: 'someOtherCode', at: '2026-08-27T10:00:00.000Z' }, ...]\n```\n\nTurn it off entirely with `blockAutoJoinGroups: false`.\n\n### Unknown-recipient DM guard — flags by default, blocking is opt-in\n\nThis one works differently on purpose. Sending a first message to someone who hasn't messaged\nyou yet is completely normal for a lot of legitimate bots (OTPs, opted-in broadcasts, outbound\nsupport/sales) — **blocking that by default would break real, intended usage**, not just a\nhidden/injected send. So by default, `my-baileys` only **flags** the first time in a session\n`sendMessage` targets a JID (`@s.whatsapp.net` or `@lid`) that has never messaged you and isn't\nallowlisted:\n\n```text\n[xayz-baileys] 👀  First-time DM to 6281234567890@s.whatsapp.net — hasn't messaged you first and isn't allowlisted.\n```\n\n```javascript\nconsole.log(sock.getFlaggedRecipients());\n// [{ jid: '6281234567890@s.whatsapp.net', at: '2026-08-27T10:00:00.000Z' }, ...]\n```\n\nIf your bot genuinely never initiates DMs to brand-new contacts (a pure reply-bot, for\nexample), you can safely switch this to actually blocking:\n\n```javascript\nconst sock = makeWASocket({\n  blockUnknownRecipients: true,\n  allowedRecipients: ['6281234567890@s.whatsapp.net'] // anyone you DO want to message first\n});\n```\n\n**Be honest with yourself about which case you're in before enabling `blockUnknownRecipients`.**\nThis guard can't actually tell \"a hidden/injected send\" apart from \"you legitimately messaging\nsomeone new\" — it only knows whether that JID has messaged you before. If your bot ever sends\nthe first message in a conversation (leads, OTPs, reminders, campaigns you have consent for),\nblocking mode will block those too unless you allowlist every recipient ahead of time. Flag-only\nmode (the default) is the safe choice for most bots; blocking mode is for the narrower case\nwhere every legitimate DM your bot sends is a reply.\n\nGroups, broadcasts, channels, and bot JIDs are exempt from this guard — group membership has\nits own guard above, and channels have theirs.\n\n---\n\n## AntiBanned (fresh-number send throttle)\n\n`my-baileys` includes an **opt-in** `antiBanned` feature: a daily send-limit ramp for\nnumbers that recently started using this socket. It does **not** touch message content,\ndevice/browser fingerprints, or connection behavior — all it does is pause or block outgoing\n`sendMessage` calls once a *fresh* number hits its limit for the day. A number that's already\npast its warm-up period sends exactly as before, with zero restriction.\n\n```javascript\nimport makeWASocket from 'my-baileys';\n\nconst sock = makeWASocket({\n  antiBanned: {\n    enabled: true,       // OFF by default — this turns it on\n    warmUpDays: 7,        // after this many days, the number is \"old\" and unrestricted\n    day1Limit: 20,         // max messages on day 1\n    growthFactor: 1.8,     // daily limit multiplies by this each day during warm-up\n    action: 'delay'        // 'delay' (pause then send) or 'block' (skip the send)\n  }\n});\n```\n\nWhen a fresh number hits its daily limit, you'll see this in the console instead of the\nmessage going straight out:\n\n```text\n[xayz-baileys] 🛡️  AntiBanned: pausing before sending to 6281234567890@s.whatsapp.net — warm-up day 2/7, limit 36/day reached.\n```\n\n**Checking status / persisting the ramp across restarts:**\n\n```javascript\nconsole.log(sock.getAntiBannedStatus());\n// { isFreshNumber: true, day: 2, totalWarmUpDays: 7, todayLimit: 36, todaySent: 36 }\n\n// Save this next to your auth state, then pass it back in as `antiBanned.state`\n// on the next run so a restart doesn't reset the number back to \"fresh\":\nconst savedState = sock.exportAntiBannedState();\n```\n\n```javascript\nconst sock = makeWASocket({\n  antiBanned: {\n    enabled: true,\n    state: savedState // resume warm-up progress from a previous run\n  }\n});\n```\n\n> Numbers you've been using for a while don't need this at all — leave `antiBanned.enabled`\n> unset (the default) and nothing changes for you.\n\n---\n\n## AntiBan (full send-safety suite)\n\nDon't confuse this with **AntiBanned** above — they're two independent features with similar\nnames on purpose (both aim at \"don't get your number banned\"), but very different scope:\n\n| | **AntiBanned** (previous section) | **AntiBan** (this section) |\n| --- | --- | --- |\n| Scope | Just a fresh-number daily send-limit ramp | Full suite: rate limiting, warm-up, health scoring, reachout-timelock guard, reply-ratio guard, contact-graph pacing, presence choreography, retry-spiral tracking, post-reconnect throttling, LID/JID canonicalization, session-stability monitoring |\n| Default | **OFF** (`antiBanned.enabled: false`) | **OFF** (opt in with `antiban: true` or a preset) |\n| Where wired | A hook in `sendMessage` (`lib/Socket/messages-send.js`) | Wraps the whole socket in `lib/Socket/index.js` (`makeWASocket`) |\n| Config key | `antiBanned` | `antiban` |\n\n`AntiBan` is the standalone module from [`lib/antiban.js`](lib/antiban.js). It's **off by\ndefault** — nothing changes for you unless you opt in — and when you do, it's wired\nautomatically into every socket `makeWASocket()` returns; you don't need to import or\ninstantiate anything yourself, it just shows up at `sock.antiban`:\n\n```javascript\nimport makeWASocket from 'my-baileys';\n\nconst sock = makeWASocket({\n  auth: state,\n  antiban: true // opt in — uses the 'aggressive' preset. Omit this and antiban does nothing.\n});\n\nconsole.log(sock.antiban.getStats());\n```\n\n```json\n{\n  \"messagesAllowed\": 0,\n  \"messagesBlocked\": 0,\n  \"totalDelayMs\": 0,\n  \"health\": { \"risk\": \"low\", \"score\": 0, \"reasons\": [\"No issues detected\"], \"recommendation\": \"Operating normally. Continue monitoring.\" },\n  \"warmUp\": { \"phase\": \"warming\", \"day\": 1, \"totalDays\": 4, \"todayLimit\": 35, \"todaySent\": 0, \"progress\": 0 },\n  \"rateLimiter\": { \"lastMinute\": 0, \"lastHour\": 0, \"lastDay\": 0, \"limits\": { \"perMinute\": 20, \"perHour\": 800, \"perDay\": 4000 }, \"knownChats\": 0 }\n}\n```\n\nOnce enabled, every call to `sock.sendMessage(...)` — including the ones made internally by\n`sock.sendActionPoll()`, `sock.forwardMessage()`, etc. from the [message-builder helpers\nbelow](#message-builder-extra-send-helpers) — is routed through `sock.antiban.beforeSend()`\nfirst. It may add a human-like delay, or block the send outright (throwing, with a reason) if\nthe rate limit, warm-up ramp, health score, timelock, reply-ratio, or contact-graph checks say\nno. Leave `antiban` unset (or `false`) and none of this runs — `sendMessage` behaves exactly\nlike upstream Baileys, with zero added latency.\n\n### Presets\n\nTurn it on with `antiban: true` (uses `aggressive`), `antiban: '<preset>'`, or override\nindividual fields (see below):\n\n| Preset | msgs/min | msgs/hour | msgs/day | warm-up days | delay range |\n| --- | --- | --- | --- | --- | --- |\n| `conservative` | 5 | 100 | 800 | 10 | 2.5s – 7s |\n| `moderate` | 10 | 300 | 1,500 | 7 | 1.5s – 5s |\n| `aggressive` (used by `antiban: true`) | 20 | 800 | 4,000 | 4 | 0.8s – 3s |\n\n```javascript\nconst sock = makeWASocket({ antiban: 'conservative' });\n```\n\n### Leaving it off (the default — no action needed)\n\n```javascript\nconst sock = makeWASocket({ auth: state });\n// no `antiban` key at all -> sock.antiban is undefined, sendMessage is untouched\n```\n\n### Custom config (override specific fields on top of a preset)\n\n```javascript\nconst sock = makeWASocket({\n  antiban: {\n    preset: 'moderate',\n    maxPerMinute: 15,       // override just this field\n    groupMultiplier: 0.6,   // messages to groups count for less against the limit\n    persist: './antiban-state.json' // survive restarts (rate-limit + warm-up state)\n  }\n});\n```\n\n### What you get on `sock.antiban`\n\n| Member | What it does |\n| --- | --- |\n| `sock.antiban.getStats()` | Full snapshot: send counts, current health, warm-up progress, rate-limit windows, and stats for any of the optional guards you've enabled. |\n| `sock.antiban.stats` | Just the raw allowed/blocked/delay counters (subset of `getStats()`). |\n| `sock.antiban.pause()` / `.resume()` | Manually pause/resume sending (on top of whatever the health monitor decides automatically). |\n| `sock.antiban.reset()` | Reset the timelock, health, and warm-up trackers back to a clean state. |\n| `sock.antiban.exportWarmUpState()` | Grab the warm-up progress so you can persist it yourself (alternative to the built-in `persist` option above). |\n| `sock.antiban.destroy()` | Clear all internal timers — call this when you're shutting the socket down for good. |\n\n**Not enabled by default**, but available through the same `antiban` config object if you need\nthem: `replyRatio`, `contactGraph`, `presence`, `retryTracker`, `reconnectThrottle`,\n`jidCanonicalizer`/`lidResolver`, and `sessionStability`. These map to the legacy nested-config\nshape (`{ rateLimiter: {...}, warmUp: {...}, health: {...}, replyRatio: {...}, ... }`) if you'd\nrather configure each sub-module directly instead of using a flat preset+overrides object — both\nshapes are accepted. See [`LITERACY.md` → AntiBan](LITERACY.md#antiban-full-send-safety-suite)\nfor what each sub-module does and how they fit together.\n\n> Same disclaimer as everywhere else in this README: none of this *guarantees* your number\n> won't get banned — WhatsApp doesn't publish its detection logic, and this fork doesn't know\n> it either. It reduces obviously-automated patterns (bursty sends, identical timing, zero\n> warm-up on a new number); it isn't a magic shield. Use responsibly, see\n> [Disclaimer](#disclaimer).\n\n---\n\n## Binary codec (Protobuf wire-format primitives)\n\nLow-level Protocol Buffers wire-format helpers, exported for building your own custom\nbinary/protobuf-shaped payloads — see [`lib/Utils/binary-codec.js`](lib/Utils/binary-codec.js).\nThis doesn't touch how Baileys encodes/decodes WhatsApp's own messages (that's still\n`protobufjs` via `WAProto/index.js`, which you should keep using for anything WhatsApp-facing);\nit's for when *you* need direct control over some wire bytes of your own.\n\n```javascript\nimport { encodeVarint, decodeVarint, zigzagEncode32, zigzagDecode32,\n         encodeFixed32, encodeFixed64, encodeTag, decodeTag,\n         encodeLengthDelimited, decodeLengthDelimited,\n         BufferWriter, WireType } from 'my-baileys';\n\n// varint — the base encoding used for VARINT fields and every length prefix\nencodeVarint(300);              // -> <Buffer ac 02>\nencodeVarint(123456789012345678n); // BigInt for values a plain Number can't hold precisely\n\n// ZigZag — for sint32/sint64 fields (keeps small negative numbers short)\nzigzagEncode32(-1);             // -> 1\nzigzagDecode32(1);              // -> -1\n\n// fixed-width (always little-endian, matches fixed32/fixed64/float/double)\nencodeFixed32(1);               // -> <Buffer 01 00 00 00>\nencodeFixed64(1n);              // -> <Buffer 01 00 00 00 00 00 00 00>\n\n// length-delimited framing — the spec-correct version of a manual\n// `wrapPayload(tagBuffer, data)` helper: pass a field number, get a proper tag\nencodeLengthDelimited(1, Buffer.from('hello')); // tag + varint length + data\n\n// building a multi-field message without a Buffer.concat() per field\nconst w = new BufferWriter();\nw.writeTag(1, WireType.VARINT).writeVarint(300);\nw.writeLengthDelimited(2, Buffer.from('xayz'));\nconst message = w.finish();\n```\n\n**On Buffer allocation efficiency** (`BufferWriter`'s reason for existing): chaining\n`Buffer.concat([a, b])` calls in a loop allocates a brand-new buffer and copies *everything so\nfar* on every call — that's O(n²) total copying for n fields, and wastes the zero-fill\n`Buffer.alloc()` normally does on bytes you're about to overwrite anyway. `BufferWriter` instead\npre-allocates with `Buffer.allocUnsafe()` and only grows (by doubling) when it actually runs\nout of room, so N writes cost O(N) overall, not O(N²) — the difference matters once you're\nwriting more than a handful of fields per message.\n\n---\n\n## Message-builder (extra send helpers)\n\nA set of convenience methods bolted onto every socket for content types that would otherwise\nneed you to hand-build a `generateWAMessageFromContent` payload yourself. Always on, no config\n— see [`lib/Socket/message-builder.js`](lib/Socket/message-builder.js):\n\n```javascript\nawait sock.sendActionPoll(jid, { name: 'Pick a time', options: ['6pm', '7pm', '8pm'] });\nawait sock.sendAlbumMessage(jid, [{ image: { url: './a.jpg' } }, { image: { url: './b.jpg' } }]);\nawait sock.sendButtonsMessage(jid, { text: 'Choose one', buttons: [{ id: '1', text: 'Yes' }] });\nawait sock.sendListMessage(jid, { text: 'Menu', sections: [...] });\nawait sock.sendCarouselMessage(jid, { cards: [...] });\nawait sock.sendVCard(jid, { name: 'Jane Doe', phone: '+1234567890' });\nawait sock.forwardMessage(jid, originalMsg);\nawait sock.broadcastMessage(jidList, { text: 'Announcement' });\n```\n\n### `sendHtml()` — experimental, read this first\n\n```javascript\nawait sock.sendHtml(jid, '<b>Hello</b> from my bot');\n```\n\nThis mirrors WhatsApp's own internal \"Meta AI\" chat message shape\n(`botForwardedMessage` → `richResponseMessage`, internally named `GenAIUnifiedResponse` /\n`FOAHtmlPrimitiveDemoDONOTUSE` in WhatsApp's own protocol — that `DONOTUSE` suffix is Meta's own\nnaming for an experimental feature flag, not a warning from us). It is **not** a documented,\nstable public message type, so:\n\n- WhatsApp's client may render it inline, show a \"tap to view\"/download prompt, or (if the\n  feature gets pulled server-side) not render it at all — behavior isn't guaranteed and can\n  change without notice, since your bot isn't the actual verified Meta AI account this format\n  was designed for.\n- **Bug fixed:** earlier versions of this method unconditionally marked every message\n  `contextInfo: { isForwarded: true, forwardOrigin: 4 /* META_AI */ }` — literally claiming\n  every message was forwarded from Meta AI, which is almost certainly why some people saw it\n  require an extra tap/download before showing up (a non-verified sender claiming Meta AI\n  origin is exactly what you'd expect WhatsApp to treat cautiously). It now sends as a plain,\n  non-forwarded message by default; pass `{ contextInfo: {...} }` yourself if you have a\n  specific reason to set forwarding metadata.\n\nIf you need something guaranteed to render reliably, prefer a documented content type\n(`sendButtonsMessage`, `sendListMessage`, a plain `{ text }`, etc.) — `sendHtml` is here for\nexperimentation, not as a recommended primary way to send rich content.\n\nIf you have `antiban: true` (or a preset) set, these all go through it too — `forwardMessage`,\n`sendActionPoll`, and `broadcastMessage` call `sock.sendMessage()` internally, same as calling\nit yourself. (`sendJsonMessage`/`sendCarouselMessage` use the lower-level `relayMessage()` and\nso bypass antiban's rate limiting the same way any direct `relayMessage()` call would — see\n[`LITERACY.md` → Message-builder](LITERACY.md#message-builder-extra-send-helpers).)\n\n### Sticker packs\n\n`AntiBan`'s sibling feature — send a whole pack of stickers (plus tray icon) in one message,\nor auto-convert an image/video into a single sticker without a separate conversion step:\n\n```javascript\n// a whole pack:\nawait sock.sendMessage(jid, {\n  stickerPacks: {\n    name: 'My Pack',\n    publisher: 'Me',\n    stickers: [\n      { image: './cat.png', emojis: ['🐱'] },\n      { image: './dog.mp4', animated: true, emojis: ['🐶'] }\n    ]\n  }\n});\n\n// one image/video, auto-converted (needs `ffmpeg` on PATH):\nawait sock.sendMessage(jid, { sticker: './photo.jpg', pack: 'My Pack', author: 'Me' });\n```\n\nPlain `{ sticker: <already-a-webp-buffer> }` with none of `pack`/`author`/`isPrivate`/\n`animated`/`premium` set still works exactly as before — this only kicks in when you pass one\nof those extra options, signaling you want the auto-convert path.\n\n---\n\n## AI watermark on button messages\n\nSeparate from `aiLabel` (which is about WhatsApp's business/bot-account label and applies\nregardless of message type), `aiWatermark` adds the \"AI ♦ &lt;time&gt;\" badge WhatsApp shows\nnext to certain messages — but **only on messages that actually have buttons**. Plain text\nmessages are never affected, whether `aiWatermark` is on or off. **OFF by default.**\n\n```javascript\nconst sock = makeWASocket({\n  aiWatermark: true\n});\n\n// This gets the \"AI ♦\" badge (it has buttons):\nawait sock.sendMessage(jid, {\n  text: 'Choose an option',\n  footer: 'Powered by my-baileys',\n  buttons: [{ buttonId: 'id1', buttonText: { displayText: 'Option 1' }, type: 1 }]\n});\n\n// This does NOT get the badge (plain text, no buttons), even with aiWatermark: true:\nawait sock.sendMessage(jid, { text: 'Just a normal message' });\n```\n\n---\n\n## ACK monitor\n\nEvery message you send gets acknowledged by WhatsApp's server; when that acknowledgement comes\nback as an error, `my-baileys` classifies it and prints a heads-up to your console — **ON by\ndefault**, since this is read-only diagnostics with no effect on sending behavior.\n\n```text\n[xayz-baileys] ACK monitor: Restricted (463) — from 6281234567890@s.whatsapp.net, msg 3EB0...\n```\n\nLabels you might see: **Possible soft-ban** (a failed ack with no specific recognized reason —\nthe ACK-0/error case with nothing more specific to go on), **Restricted**, **Rate-limited /\nLimit**, and **Possible ban**.\n\n> ⚠️ **Be clear-eyed about what this is:** WhatsApp doesn't publish what these ack-error codes\n> mean or confirm they reflect account health at all. These labels reflect commonly-discussed,\n> unofficial patterns from the WA bot/userbot developer community — treat a label here as\n> \"worth investigating\", not a confirmed diagnosis of your account's state.\n\n**It won't spam your console.** Repeats of the *same* label within a cooldown window (default\n60 seconds) are counted, not printed — the next print after the cooldown shows how many were\nfolded in:\n\n```text\n[xayz-baileys] ACK monitor: Rate-limited / Limit — from 62819...@s.whatsapp.net, msg AB12... (+9 more in the last 60s)\n```\n\n```javascript\nconst sock = makeWASocket({\n  ackMonitor: true,           // default; set false to disable entirely\n  ackMonitorCooldownMs: 60000 // widen/narrow the per-label throttle window\n});\n```\n\n---\n\n## New in this fork: protocol & utility modules\n\n`my-baileys` ships a newer WhatsApp protocol schema (`WAProto`) and a set of extra,\nopt-in modules layered on top of the base socket. None of these run unless you call them.\n\n**Updated protocol schema** — `WAProto` was regenerated from a newer WhatsApp Web protocol\ndump, adding many message/record types the previous schema didn't have yet (e.g.\n`ExtendedContentMessage`, `MusicMessage`, newer backup/E2E-key types). This required bumping\nthe `protobufjs` dependency to `^8.8.0` (from `^7.5.6`) since the current protobuf compiler\nonly targets that runtime — already reflected in `package.json`.\n\n**New account/feature socket layers** (wired into `makeWASocket` automatically, each adding\nmethods without touching what's already there):\n\n```javascript\nconst sock = makeWASocket({ /* ... */ });\n\n// Privacy & account settings (text status, trusted devices, linked profiles, ...)\nawait sock.updateTextStatus('Hello world', '👋');\nawait sock.getTrustedDevices();\n\n// Registration/account features (password, passkeys, age verification, contact backup)\nawait sock.hasPassword();\nawait sock.contactsBackupQuery();\n\n// Managed-account linking & WhatsApp Payments passkeys\nawait sock.managedAccountQuery(sock.user.id);\n\n// Cross-app interop (EU DMA messaging interoperability with Messenger/Instagram) — opt-in,\n// nothing here runs until you call it:\nconst integrators = await sock.initInterop();\n\n// Meta AI-in-groups\nconst group = await sock.aiGroupCreate('My AI Group', ['123@s.whatsapp.net']);\n\n// First-party GraphQL surface (payments, AI Studio, bug reports, etc.) mirroring what the\n// official app itself calls on graph.whatsapp.com / wamo.whatsapp.net\nawait sock.getEligibility();\n```\n\n**New opt-in `Utils` helpers** (import directly, use only if you need them):\n\n```javascript\nimport {\n  createSessionPool,       // run several numbers with reconnect backoff\n  autoCacheViewOnceMedia,  // save view-once media to disk before it disappears\n  createCommandHandler,    // simple \"!command\" style bot commands from a folder\n  imageToWebpSticker,      // image -> WhatsApp sticker (needs optional \"sharp\")\n  videoToWebpSticker,      // video -> animated sticker (needs a local ffmpeg)\n  AdaptiveDelayManager,    // generic backoff/cooldown timer for retry loops\n} from 'my-baileys';\n\n// example: text-message router (also auto-attached as sock.onText/hears/command)\nsock.command('ping', async (msg) => sock.sendMessage(msg.key.remoteJid, { text: 'pong' }));\n```\n\nSee [`LITERACY.md`](LITERACY.md#new-modules-in-this-fork) for what each module does, where it\ncame from, and — for the one file that needed it — what was changed for security before it was\nincluded.\n\n---\n\n## Performance notes\n\nA few things were tightened up so this fork behaves better under long-running / high-traffic\nuse, without changing any public behavior:\n\n- **`userDevicesCache`** (device-list cache used when sending) now has a hard `maxKeys` cap\n  (default 10,000; override with `userDevicesCacheMaxKeys`), on top of its existing 5-minute\n  TTL, so a very high-throughput bot can't grow it unbounded between TTL sweeps.\n- **Message-retry caches** (`sessionRecreateHistory`, `retryCounters` in\n  `lib/Utils/message-retry-manager.js`) got the same treatment — capped at 2,000 / 5,000\n  entries respectively, same TTLs as before.\n- **New guard state arrays** (blocked channel-follows, blocked group-joins, flagged recipients)\n  are capped at 200 entries each (oldest dropped first) so leaving them enabled on a\n  long-running process can't leak memory.\n- **Two `ffmpeg` invocations** (video thumbnail extraction, video→sticker conversion) were\n  switched from `child_process.exec` (a shell string) to `execFile` with an argv array — this\n  is primarily a security fix (see [LITERACY.md](LITERACY.md#new-modules-in-this-fork)), but\n  `execFile` also skips spawning an extra shell process per call, which is marginally lighter\n  on CPU/process count for anything calling these a lot (bulk sticker conversion, etc.).\n- Heavy optional dependencies (`sharp`, `jimp`, `music-metadata`, `audio-decode`,\n  `link-preview-js`) were already lazy-loaded via dynamic `import()` only where actually used —\n  confirmed still true after this fork's changes, so installs that skip those peer deps stay\n  lightweight and processes that never touch stickers/audio-metadata/link-previews never pay\n  for loading them.\n\nNone of this changes disk usage meaningfully — this library doesn't persist anything to disk on\nits own beyond what you explicitly configure (auth state, your own caches/logs).\n\n### optiMazer — opt-in, tighter resource limits\n\nEverything above is always on (they're bug fixes, not something that should be optional). On\ntop of that, there's a separate opt-in switch — **OFF by default** — for people who want to\ntrade a little more re-fetching on cache misses for meaningfully less resident memory on a\nlong-running, high-traffic process:\n\n```javascript\nimport makeWASocket from 'my-baileys';\n\nconst sock = makeWASocket({\n  optiMazer: true // that's it — tightens cache limits, adds a periodic background tick\n});\n\nconsole.log(sock.getOptimizerStats());\n// { ticks: 3, gcRuns: 0, uptimeMs: 182004, gcAvailable: false, memory: { rss: ..., heapUsed: ... } }\n```\n\n`optiMazer: true` tightens the always-on caps further (e.g. `userDevicesCache` from 10,000 keys\ndown to 2,000, guard logs from 200 entries down to 50) and starts a background tick every 60\nseconds. If your process was started with `node --expose-gc`, that same tick also requests a\nproactive garbage-collection pass; otherwise it's a harmless no-op.\n\nYou can also pass an object instead of `true` to override individual limits:\n\n```javascript\nconst sock = makeWASocket({\n  optiMazer: {\n    userDevicesCacheMaxKeys: 500,\n    tickIntervalMs: 30000\n  }\n});\n```\n\nOr use the exported class/factory directly if you want to manage its lifecycle yourself\n(e.g. to call `.stop()` later):\n\n```javascript\nimport { optiMazer } from 'my-baileys';\n\nconst tuner = optiMazer({ userDevicesCacheMaxKeys: 500 }).attach(sock);\n// later\ntuner.stop();\n```\n\n---\n\n## Posting a Status with mentions\n\n```javascript\nawait sock.sendStatusWhatsApp(\n  { text: 'Big announcement! 🎉', backgroundColor: '#00A884' },\n  ['6281234567890@s.whatsapp.net', '120363111111111111@g.us'] // users and/or groups (expanded to members)\n);\n```\n\nEveryone listed gets a \"you were mentioned in a status\" notification, same as posting a status\nwith @mentions from the app.\n\n---\n\n## Reading channel text status, business profiles, and more via USync\n\n`USyncQuery` gained five more protocols for bulk-looking-up info about JIDs:\n\n```javascript\nimport { USyncQuery, USyncUser } from 'my-baileys';\n\nconst query = new USyncQuery()\n  .withTextStatusProtocol()\n  .withBusinessProtocol()\n  .withPictureProtocol()\n  .withUser(new USyncUser().withId(jid));\n\nconst result = await sock.executeUSyncQuery(query);\n```\n\n`.withFeatureProtocol()` and `.withSidelistProtocol()` are also available. See\n[LITERACY.md](LITERACY.md#deeper-fork-comparison--what-schema-only-diffing-missed) for what\neach one returns.\n\n---\n\n## Pure-JS Curve25519 fallback\n\nIf the `libsignal` dependency (currently a `github:` install — see\n[`vendor-libsignal.sh`](vendor-libsignal.sh)) ever fails to install or load in your\nenvironment, `CurveJS` is a drop-in, dependency-free replacement for the `Curve` operations it\nnormally provides:\n\n```javascript\nimport { CurveJS } from 'my-baileys';\n\nconst keyPair = CurveJS.generateKeyPair();\nconst shared = CurveJS.sharedKey(myPrivateKey, theirPublicKey);\n```\n\nIt's verified interoperable with the default `Curve` (a shared key computed with `Curve` on\none side and `CurveJS` on the other matches bit-for-bit) — see LITERACY.md for the test.\nNot used by default anywhere in the library; this is available if you need it.\n\n---\n\n## SQLite-backed auth state\n\nAn alternative to `useMultiFileAuthState` for busy bots — stores everything in one SQLite file\ninstead of one JSON file per key:\n\n```javascript\nimport makeWASocket, { useSqliteAuthState } from 'my-baileys';\n\nconst { state, saveCreds } = await useSqliteAuthState('./auth', {\n  migrateFromFolder: './old-multi-file-auth' // optional, one-time\n});\n\nconst sock = makeWASocket({ auth: state });\nsock.ev.on('creds.update', saveCreds);\n```\n\nRequires Node 22.5+ (built-in `node:sqlite`); throws a clear error telling you to use\n`useMultiFileAuthState` instead on older Node.\n\n---\n\n## Storing data\n\n```javascript\nimport makeWASocket, { makeInMemoryStore } from 'my-baileys';\nimport pino from 'pino';\n\nconst store = makeInMemoryStore({\n  logger: pino().child({ level: 'silent', stream: 'store' })\n});\nconst client = makeWASocket({\n  // options\n});\nstore.bind(client.ev);\n\nclient.ev.on('contacts.upsert', () => {\n  console.log('New contact: ' + Object.values(store.contacts()));\n});\n\n// persist the whole store to disk, and restore it on the next run\n// two file-based wrappers around them)\nsetInterval(() => store.writeToFile('./baileys-store.json'), 10_000);\nstore.readFromFile('./baileys-store.json'); // call before store.bind() to load prior state\n```\n\nTwo real bugs in the store's `KeyedDB` were found and fixed while adding `writeToFile`/\n`readFromFile`: `chats.get(jid)` / `.update(jid, ...)` / `.deleteById(jid)` didn't actually work\nbefore this fix (see [LITERACY.md → Changelog vs upstream](LITERACY.md#changelog-vs-upstream)\nfor the full story), so if you were relying on those specifically, they now behave as expected.\n\n---\n\n## Sending messages\n\n### Send / relay a message with `noSelfSync`\n\n`noSelfSync` is a `relayMessage` option (private/1-on-1 chats only) that controls whether the\nmessage is also synced to your **other own linked devices** (other phones/WhatsApp Web sessions\nlogged into the same account). It does not affect delivery to the recipient.\n\n- **`noSelfSync: true`** — sent to the recipient as normal, but **not** synced to your other own\n  devices. Useful for silent/automated sends from a bot account.\n- **`noSelfSync: false`** (default) — normal behavior; synced everywhere you're logged in.\n\n```javascript\nawait client.relayMessage(m.chat, {\n  conversation: \"Hello from my-baileys\"\n}, {\n  noSelfSync: true\n});\n\nawait client.sendMessage(m.chat, {\n  text: \"Hello from my-baileys\"\n}, {\n  noSelfSync: true\n});\n```\n\n### Send an orderMessage\n\n```javascript\nimport fs from 'fs';\nconst thumbnail = fs.readFileSync('./thumb.jpg');\n\nawait client.sendMessage(m.chat, {\n  thumbnail,\n  message: \"Order summary\",\n  orderTitle: \"My Store\",\n  totalAmount1000: 72502,\n  totalCurrencyCode: \"IDR\"\n}, { quoted: m });\n```\n\n### Send a pollResultSnapshotMessage\n\n```javascript\nawait client.sendMessage(m.chat, {\n  pollResultMessage: {\n    name: \"My Poll\",\n    options: [\n      { optionName: \"Option 1\" },\n      { optionName: \"Option 2\" }\n    ],\n    newsletter: {\n      newsletterName: \"XYCoolcraft Updates\",\n      newsletterJid: \"120363427430697245@newsletter\"\n    }\n  }\n});\n```\n\n### Send a productMessage\n\n```javascript\nawait client.relayMessage(m.chat, {\n  productMessage: {\n    title: \"Product.pdf\",\n    description: \"Product description\",\n    thumbnail: { url: \"./thumb.jpg\" },\n    productId: \"EXAMPLE_TOKEN\",\n    retailerId: \"EXAMPLE_RETAILER_ID\",\n    url: \"https://example.com\",\n    body: \"Body text\",\n    footer: \"Footer\",\n    buttons: [\n      {\n        name: \"cta_url\",\n        buttonParamsJson: \"{\\\"display_text\\\":\\\"Visit\\\",\\\"url\\\":\\\"https://example.com\\\"}\"\n      }\n    ],\n    priceAmount1000: 72502,\n    currencyCode: \"IDR\"\n  }\n});\n```\n\n### Send an interactiveMessage\n\n```javascript\nawait client.sendMessage(m.chat, {\n  image: { url: \"./img.jpg\" },\n  text: \"body\",\n  title: \"title\", // required when sending media\n  footer: \"footer\",\n  interactiveButtons: [\n    {\n      name: \"single_select\",\n      buttonParamsJson: JSON.stringify({ title: \"\\0\" })\n    }\n  ],\n  messageParams: JSON.stringify({\n    bottom_sheet: { /** other params **/ }\n  })\n});\n```\n\n### Send a member label\n\n```javascript\nawait client.sendMessage(m.chat, {\n  groupLabel: { labelText: \"Tagged members appear here\" }\n});\n```\n\n### Send a message to group members\n\n```javascript\nawait client.sendMessageMembers(m.chat, {\n  extendedTextMessage: { text: \"Hello members\" }\n}, {});\n```\n\n---\n\n## Simple sendMessage Helpers\n\n<details>\n<summary><b>Send text</b></summary>\n\n```javascript\nawait client.sendText(m.chat, \"Hello!\", {\n  contextInfo: { mentionedJid: [m.chat] }\n}, {\n  key: { remoteJid: \"status@broadcast\", participant: m.sender, fromMe: true },\n  message: { conversation: \"\\0\" }\n});\n```\n</details>\n\n<details>\n<summary><b>Send image</b></summary>\n\n```javascript\nawait client.sendImage(m.chat, { url: \"./img.jpg\" }, \"Caption\", {\n  contextInfo: { mentionedJid: [m.chat] }\n}, {\n  key: { remoteJid: \"status@broadcast\", participant: m.sender, fromMe: true },\n  message: { conversation: \"\\0\" }\n});\n```\n</details>\n\n<details>\n<summary><b>Send video</b></summary>\n\n```javascript\nawait client.sendVideo(m.chat, { url: \"./video.mp4\" }, \"Caption\", {\n  contextInfo: { mentionedJid: [m.chat] }\n}, {\n  key: { remoteJid: \"status@broadcast\", participant: m.sender, fromMe: true },\n  message: { conversation: \"\\0\" }\n});\n```\n</details>\n\n<details>\n<summary><b>Send audio</b></summary>\n\n```javascript\nawait client.sendAudio(m.chat, { url: \"./audio.mp3\" }, {\n  contextInfo: { mentionedJid: [m.chat] }\n}, {\n  key: { remoteJid: \"status@broadcast\", participant: m.sender, fromMe: true },\n  message: { conversation: \"\\0\" }\n});\n```\n</details>\n\n<details>\n<summary><b>Send location</b></summary>\n\n```javascript\nawait client.sendLocation(m.chat, \"Caption\", 90.0, 90.0, \"https://example.com\", \"1234567890\", {\n  contextInfo: { mentionedJid: [m.chat] }\n}, {\n  key: { remoteJid: \"status@broadcast\", participant: m.sender, fromMe: true },\n  message: { conversation: \"\\0\" }\n});\n```\n</details>\n\n<details>\n<summary><b>Send poll</b></summary>\n\n```javascript\nawait client.sendPoll(m.chat, \"Pick one\", [\"1\", \"2\", \"3\"], true, {\n  contextInfo: { mentionedJid: [m.chat] }\n}, {\n  key: { remoteJid: \"status@broadcast\", participant: m.sender, fromMe: true },\n  message: { conversation: \"\\0\" }\n});\n```\n</details>\n\n<details>\n<summary><b>Send quiz</b></summary>\n\n```javascript\nawait client.sendQuiz(m.chat, \"Quiz question\", [\"1\", \"2\", \"3\"], \"2\", {\n  contextInfo: { mentionedJid: [m.chat] }\n}, {\n  key: { remoteJid: \"status@broadcast\", participant: m.sender, fromMe: true },\n  message: { conversation: \"\\0\" }\n});\n```\n</details>\n\n<details>\n<summary><b>Send status mention</b></summary>\n\n```javascript\nawait client.statusMention(m.chat, {\n  extendedTextMessage: { text: \"Mentioned in status\" }\n});\n```\n</details>\n\n---\n\n## Credits\n\n`my-baileys` Build By: XYCoolcraft:\n\n- Original protocol implementation: [Baileys](https://github.com/WhiskeySockets/Baileys) by\n  [Adhiraj Singh](https://github.com/adiwajshing) and the WhiskeySockets community.\n- Modified By: **XYCoolcraft** [Github](https://github.com/XYCoolcraft).\n\nAll credit for the underlying WhatsApp Web protocol work goes to the original authors and\ncontributors. See [`LICENSE`](LICENSE) for the full text and every copyright notice that must\nbe kept per the MIT License.\n\n## Contributing\n\nSee [`CONTRIBUTING.md`](CONTRIBUTING.md) for guidelines on reporting issues and submitting pull\nrequests.\n\n## Publishing\n\nMaintainers can publish a new version to npm with the included helper script — see\n[`upload-npm.sh`](upload-npm.sh) and the walkthrough in\n[`LITERACY.md`](LITERACY.md#uploadnpmsh-walkthrough).\n\n```bash\nbash upload-npm.sh\n```\n\n## Disclaimer\n\nThis is **not** an official WhatsApp product. Use of this library to send bulk or unsolicited\nmessages may violate WhatsApp's Terms of Service and can result in your number being banned.\nUse responsibly.\n\n<div align=\"center\">\n\n---\n\nMade by **XYCoolcraft** · [`README.md`](README.md) · [`LITERACY.md`](LITERACY.md)\n\n</div>\n","readmeFilename":"README.md"}