{"_id":"hridoy-ultimate","_rev":"13-aea4c11372aa966be575b91614d3490b","name":"hridoy-ultimate","dist-tags":{"latest":"9.0.4"},"versions":{"0.0.0-stage":{"name":"hridoy-ultimate","version":"0.0.0-stage","_id":"hridoy-ultimate@0.0.0-stage","stub":true,"maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"dist":{"shasum":"305e72ac5247be5cc836c38409bd5d1f5976ce17","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-0.0.0-stage.tgz","fileCount":2,"integrity":"sha512-VlOxKAh1chG5X7KO6797JTpE7tTShKMszoxJ0kX2nePTf/p7vEHrrFtaVC3c+8yjbT7xQSO4oAlQ5F6M7iQ6uw==","signatures":[{"sig":"MEYCIQCQLJxHTnz5BfrAyYCvQiP1Y1IzUVGb5hO5fsulHkPB0gIhAPczouT9jRKYgLFeUaVq+2XLZOL5KNkmb4S8Y1wDTxSR","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":337},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"description":"Temporary package placeholder for staged publishing","directories":{}},"8.0.0":{"name":"hridoy-ultimate","version":"8.0.0","keywords":["facebook","chat","api","messenger","bot","unofficial","fca","toru-ultimate"],"author":{"name":"HR ID OY"},"license":"MIT","_id":"hridoy-ultimate@8.0.0","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"contributors":[{"url":"Original","name":"DongDev"}],"dist":{"shasum":"372c4b1ab6bf240453be8134a75534ad1dd2ddaf","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-8.0.0.tgz","fileCount":166,"integrity":"sha512-tYhRQXsgy/V1VU5bl5675xPOLeyVLd+/sOZS1l5MxxZuH3CDSDbZJl098JkMRqxERXuVEO6wSD5B2BgRMai8uA==","signatures":[{"sig":"MEUCIAq+H4bzSnkwheZN1O+G6vXfONfcEbxbGDw1hqogPzrxAiEA9kIehEMMdyXKmMDVebTQTKI3YXUS5EHjmT45H39whZk=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIQDcPd1pXAqdQrSib2p/xmKAkuDuCWdrYeEZ1m4EM+iCewIgGoFv8e8OGgpZ4rUBF4j9yDN1nfKskohDUdPk97Dlmv8=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34469446},"main":"index.js","types":"index.d.ts","engines":{"node":">=12.0.0"},"exports":{".":{"types":"./index.d.ts","default":"./index.js","require":"./index.js"}},"scripts":{"lint":"eslint .","test":"mocha"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"_npmVersion":"11.20.0","description":"Facebook Chat API by HR ID OY | Stable • Auto Re-login • Full E2EE Support — send messages, media, reactions & more in encrypted chats, hassle-free","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mime":"^3.0.0","mqtt":"^5.10.1","axios":"^1.13.5","chalk":"^4.1.2","koffi":"^3.0.2","cheerio":"1.0.0-rc.12","sqlite3":"^5.1.7","bluebird":"^3.7.2","duplexify":"^4.1.3","sequelize":"^6.37.6","protobufjs":"^8.4.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","fca-unofficial":"github:VangBanLaNhat/fca-unofficial","totp-generator":"^1.0.0","gradient-string":"^2.0.2","yumi-json-bigint":"^1.0.0","https-proxy-agent":"^4.0.0","axios-cookiejar-support":"^5.0.5","@signalapp/libsignal-client":"0.70.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.2.0","eslint":"^8.50.0"},"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_8.0.0_1791284275203_0.0061575994355971275","host":"s3://npm-registry-packages-npm-production"}},"8.0.1":{"name":"hridoy-ultimate","version":"8.0.1","keywords":["facebook","chat","api","messenger","bot","fca","hridoy-ultimate","goatbot","anti-logout","cookie-login","inbox-bot","e2ee"],"author":{"name":"hridoy-ultimate contributors"},"license":"MIT","_id":"hridoy-ultimate@8.0.1","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"dist":{"shasum":"a9e4cc6edaf68ed661957b7e1fb08125c264fe04","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-8.0.1.tgz","fileCount":121,"integrity":"sha512-zeoTolfiR93pL9PsPWjRL+Tlq7EkamqPRU67GC9WL2Rt+u0HWe1GFQowjBMuRan54fAN2pBQOCq2jX5krCC6GQ==","signatures":[{"sig":"MEYCIQDC46SMlNJ8lwfrs9b4Gb8KZptqLcX8xHNLsXu/84Y0EwIhAMya1gr679NLVgoxWYhwpOmJr+yejiEBhnstd4ICm7zs","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIAPCefXPPwMW5PgB2VYiBHp8ClAlFxH+zH8stBDkI9bvAiEApZ8FtUKqr1v2oX+tZXUQu0OpKswCd+q46DdzwvPqJrs=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":667490},"main":"index.js","engines":{"node":">=18.0.0"},"scripts":{"test":"node --test test/*.test.js","check":"node scripts/check.js"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"_npmVersion":"11.20.0","description":"HR ID OY— Node.js Messenger API with guarded MQTT lifecycle and explicit reaction acknowledgements.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mime":"^3.0.0","mqtt":"^5.10.1","axios":"^1.7.2","koffi":"^2.8.4","npmlog":"^6.0.2","undici":"^6.21.0","cheerio":"1.0.0-rc.12","request":"^2.88.2","bluebird":"^3.7.2","form-data":"^4.0.0","yumi-json-bigint":"*","https-proxy-agent":"^7.0.5"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_8.0.1_1791541479215_0.58774919449938","host":"s3://npm-registry-packages-npm-production"}},"8.0.2":{"name":"hridoy-ultimate","version":"8.0.2","keywords":["facebook","chat","api","messenger","bot","fca","hridoy-ultimate","goatbot","anti-logout","cookie-login","inbox-bot","e2ee"],"author":{"name":"hridoy-ultimate contributors"},"license":"MIT","_id":"hridoy-ultimate@8.0.2","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"dist":{"shasum":"226310e0943ad38b7a1fc5d2acb9b072f18af069","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-8.0.2.tgz","fileCount":123,"integrity":"sha512-JB/Bses5dsgTLct9ieSxGbrP82yCLIMGp9lBf2E8QXTUlDzN9+AGv4PTUrMGw7p3BDuIlXI4zRm50Zc0jweyAg==","signatures":[{"sig":"MEUCIQC9Xhps9lstNhXUW5KMHeVzBZfZPlQMHZ1QzaaymYYpKAIgQ0JoK8WrtyoEqeKHLc4azU/vtxUCoTHDrP7/yIXq+8U=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIAqvGnwK5+Q1oJ0QRx/5aCQnEIFz2qiw1mHOqF71xEKAAiA1yeuJbYz0hfsQSKmRzBVPtL8TGs50kH9xtmKaoOViWg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":33974729},"main":"index.js","engines":{"node":">=18.0.0"},"scripts":{"test":"node --test test/*.test.js","check":"node scripts/check.js"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"_npmVersion":"11.20.0","description":"HR ID OY— Node.js Messenger API with guarded MQTT lifecycle and explicit reaction acknowledgements.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mime":"^3.0.0","mqtt":"^5.10.1","axios":"^1.7.2","koffi":"^2.8.4","npmlog":"^6.0.2","undici":"^6.21.0","cheerio":"1.0.0-rc.12","request":"^2.88.2","bluebird":"^3.7.2","form-data":"^4.0.0","yumi-json-bigint":"*","https-proxy-agent":"^7.0.5"},"_hasShrinkwrap":false,"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_8.0.2_1791541793723_0.18999208971837955","host":"s3://npm-registry-packages-npm-production"}},"8.0.5":{"name":"hridoy-ultimate","version":"8.0.5","keywords":["facebook","messenger","chat","api","fca","mqtt","bot","unofficial","hridoy-ultimate"],"author":{"name":"HR ID OY"},"license":"MIT","_id":"hridoy-ultimate@8.0.5","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"contributors":[{"url":"https://github.com/hridoyhossen48360","name":"hridoyhossen48360"},{"url":"original","name":"DongDev"}],"dist":{"shasum":"716429649c218081571521151ee9eb441a9b0b52","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-8.0.5.tgz","fileCount":175,"integrity":"sha512-WEcc8WYYUICyBKM755cKeB9tXlFveOILuiUaLc+uon4mUNRXjEAyN1Yn4sGL0IJVLYiux7jeU+tk7DRaZSD/dA==","signatures":[{"sig":"MEUCIQDFj1nGySOMP2v/MsXMtUaktFr0ZHCTdsVWJrJhRphTLgIgR2AHQjYB03lcC8fgnVqd9d4ME2m9lJl25JxKfocGUiY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDXdAkOs8j+VRgYBgH2VZje0ojedFFQude3aNzpPm+NoAiEArZ6GCTnrQrusYiClbOt9nxQryL3/eHa/9bGG+lFoaUg=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":1199371},"main":"index.js","types":"index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js","require":"./index.js"},"./package.json":"./package.json"},"scripts":{"lint":"node scripts/syntax-check.js","pack":"npm pack","test":"node scripts/run-tests.js all","test:unit":"node scripts/run-tests.js unit","test:integration":"node scripts/run-tests.js integration"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"_npmVersion":"11.20.0","description":"Unified Facebook Chat API (FCA) for Messenger bots - with a hardened MQTT lifecycle (bounded backoff, clean shutdown) and opt-in anti-spam/E2EE extras.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mqtt":"^5.10.1","axios":"^1.13.5","chalk":"^4.1.2","request":"^2.88.2","sqlite3":"^5.1.7","bluebird":"^3.7.2","duplexify":"^4.1.3","form-data":"^4.0.0","sequelize":"^6.37.6","tough-cookie":"^5.0.0","gradient-string":"^2.0.2","https-proxy-agent":"^4.0.0","axios-cookiejar-support":"^5.0.5"},"_hasShrinkwrap":false,"optionalDependencies":{"mime":"^3.0.0","koffi":"^3.0.2","undici":"^6.0.0","protobufjs":"^8.4.0","fca-unofficial":"github:VangBanLaNhat/fca-unofficial","yumi-json-bigint":"^1.0.0","@signalapp/libsignal-client":"0.70.0"},"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_8.0.5_1791860230308_0.3219295788350929","host":"s3://npm-registry-packages-npm-production"}},"9.0.0":{"name":"hridoy-ultimate","version":"9.0.0","keywords":["facebook","messenger","chat","api","fca","mqtt","bot","unofficial","hridoy-ultimate","typing-indicator","e2ee"],"author":{"name":"HR ID OY"},"license":"MIT","_id":"hridoy-ultimate@9.0.0","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"contributors":[{"url":"https://github.com/hridoyhossen48360","name":"hridoyhossen48360"},{"url":"original","name":"DongDev"}],"dist":{"shasum":"a40773e1cb1f31418bc171546b83e71e391b26f1","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-9.0.0.tgz","fileCount":183,"integrity":"sha512-tpIYF9itPGB13amSMyTCLCxnsAjb0P+lImJmkqwTeMGXrIKjlSu6CKA75PoxB2hPvT/GSTiKJ9ki8AhFgzHadw==","signatures":[{"sig":"MEYCIQCdrQjhLJAy0eTfywfdkRtcnQSWRftT+//KLWigxgXgNQIhAP2daTiao539Rf5xayQSh4tYpng3inC+YHk5O6rpPKsx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQDd3ShvX2mFqCqtUc5IFoDTJAUjYYHgwBkls9ejckNZ9QIhAPx2RrxSdUi5ILfcFl1IgE/+k/GJdH3jDNz3WPRcYLoN","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34542851},"main":"index.js","types":"index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js","require":"./index.js"},"./package.json":"./package.json"},"scripts":{"lint":"node scripts/syntax-check.js","pack":"npm pack","test":"node scripts/run-tests.js all","test:unit":"node scripts/run-tests.js unit","test:integration":"node scripts/run-tests.js integration"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"_npmVersion":"11.20.0","description":"Unified Facebook Chat API (FCA) for Messenger bots - hardened MQTT lifecycle, default-on typing indicator, bundled (opt-in) native E2EE engine.","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mqtt":"^5.10.1","axios":"^1.13.5","chalk":"^4.1.2","request":"^2.88.2","sqlite3":"^5.1.7","bluebird":"^3.7.2","duplexify":"^4.1.3","form-data":"^4.0.0","sequelize":"^6.37.6","tough-cookie":"^5.0.0","gradient-string":"^2.0.2","https-proxy-agent":"^4.0.0","axios-cookiejar-support":"^5.0.5"},"_hasShrinkwrap":false,"optionalDependencies":{"mime":"^3.0.0","koffi":"^3.0.2","undici":"^6.0.0","protobufjs":"^8.4.0","fca-unofficial":"github:VangBanLaNhat/fca-unofficial","yumi-json-bigint":"^1.0.0","@signalapp/libsignal-client":"0.70.0"},"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_9.0.0_1791946603720_0.012385533132067694","host":"s3://npm-registry-packages-npm-production"}},"9.0.1":{"name":"hridoy-ultimate","version":"9.0.1","keywords":["facebook","chat","api","messenger","bot","unofficial","fca","hridoy-ultimate","hridoy"],"author":{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},"license":"MIT","_id":"hridoy-ultimate@9.0.1","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"contributors":[{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},{"url":"Base fork","name":"EryXenX"},{"url":"Original","name":"DongDev"}],"homepage":"https://github.com/hridoyhossen48360/hridoy-ultimate#readme","bugs":{"url":"https://github.com/hridoyhossen48360/hridoy-ultimate/issues"},"dist":{"shasum":"241b7813416fd7db203d51a02cde8b38b12a7acb","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-9.0.1.tgz","fileCount":166,"integrity":"sha512-Wvkei1yVXr50JPdSdz8wD2Yu75m0JU/YBxj8qmLwAkmMPFNc41vOtcvro55o1Gz+iGjxl0M1BlHXs3kOtT2FFA==","signatures":[{"sig":"MEYCIQCUNvPvC1A5ZnoIqOrKinb2dU0sQQ43Mt8ho1J+uyQzCAIhAPXp3Jk7CIFa63bP15GdWjl8wgAv98GKnVFF62pk5acH","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIH4FtXtjH0tiSGj5U3FOBmvf1UPvVtk2lhtfsGRMOUkZAiAPWcjyFdk55nMVgp612MzKToqlw5rk+jbPBIEgWioYWA==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34479508},"main":"index.js","types":"index.d.ts","engines":{"node":">=12.0.0"},"exports":{".":{"types":"./index.d.ts","default":"./index.js","require":"./index.js"}},"scripts":{"lint":"eslint .","test":"mocha"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"repository":{"url":"git+https://github.com/hridoyhossen48360/hridoy-ultimate.git","type":"git"},"_npmVersion":"11.20.0","description":"Facebook Chat API by HR ID OY | Stable • Auto Re-login • Full E2EE Support — send messages, media, reactions & more in encrypted chats, hassle-free","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mime":"^3.0.0","mqtt":"^5.10.1","axios":"^1.13.5","chalk":"^4.1.2","koffi":"^3.0.2","cheerio":"1.0.0-rc.12","sqlite3":"^5.1.7","bluebird":"^3.7.2","duplexify":"^4.1.3","sequelize":"^6.37.6","protobufjs":"^8.4.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","fca-unofficial":"github:VangBanLaNhat/fca-unofficial","totp-generator":"^1.0.0","gradient-string":"^2.0.2","yumi-json-bigint":"^1.0.0","https-proxy-agent":"^4.0.0","axios-cookiejar-support":"^5.0.5","@signalapp/libsignal-client":"0.70.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.2.0","eslint":"^8.50.0"},"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_9.0.1_1792175664355_0.42003668712204023","host":"s3://npm-registry-packages-npm-production"}},"9.0.2":{"name":"hridoy-ultimate","version":"9.0.2","keywords":["facebook","chat","api","messenger","bot","unofficial","fca","hridoy-ultimate","hridoy"],"author":{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},"license":"MIT","_id":"hridoy-ultimate@9.0.2","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"contributors":[{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},{"url":"Base fork","name":"EryXenX"},{"url":"Original","name":"DongDev"}],"homepage":"https://github.com/hridoyhossen48360/hridoy-ultimate#readme","bugs":{"url":"https://github.com/hridoyhossen48360/hridoy-ultimate/issues"},"dist":{"shasum":"8652eb17caf149939ca4a542c26254958876be74","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-9.0.2.tgz","fileCount":165,"integrity":"sha512-uFYjvUnvtSWv17QIItkp9/Bnf25Z9O5Dhb6EqpkNmLeWyOd321ztMhKCk64Y8WSDX+n2CgWyt0RkLRcbyDlgmw==","signatures":[{"sig":"MEUCIFtixZ1+P658W684sNd6Neg/1VGHuCZwD2uNRsE08TNlAiEA3T05HYQDZu0FvYsZFW9WLN8olFvaxB7aiJL+Y0W+BNo=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEQCIB1+mTwKln8zvygJdugZTQuvTMYH6H3irAQNeVNJ7cduAiBmSIo7wLwGn1sDX4TYuSwtYbvapaAYzhjvFiVFo32l5A==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34479863},"main":"index.js","types":"index.d.ts","engines":{"node":">=12.0.0"},"exports":{".":{"types":"./index.d.ts","default":"./index.js","require":"./index.js"}},"scripts":{"lint":"eslint .","test":"mocha"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"repository":{"url":"git+https://github.com/hridoyhossen48360/hridoy-ultimate.git","type":"git"},"_npmVersion":"12.2.1","description":"Facebook Chat API by HR ID OY | Stable • Auto Re-login • Full E2EE Support — send messages, media, reactions & more in encrypted chats, hassle-free","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mime":"^3.0.0","mqtt":"^5.10.1","axios":"^1.13.5","chalk":"^4.1.2","koffi":"^3.0.2","cheerio":"1.0.0-rc.12","sqlite3":"^5.1.7","bluebird":"^3.7.2","duplexify":"^4.1.3","sequelize":"^6.37.6","protobufjs":"^8.4.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","fca-unofficial":"github:VangBanLaNhat/fca-unofficial","totp-generator":"^1.0.0","gradient-string":"^2.0.2","yumi-json-bigint":"^1.0.0","https-proxy-agent":"^4.0.0","axios-cookiejar-support":"^5.0.5","@signalapp/libsignal-client":"0.70.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.2.0","eslint":"^8.50.0"},"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_9.0.2_1792668317092_0.545748533763674","host":"s3://npm-registry-packages-npm-production"}},"9.0.3":{"name":"hridoy-ultimate","version":"9.0.3","keywords":["facebook","chat","api","messenger","bot","unofficial","fca","hridoy-ultimate","hridoy"],"author":{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},"license":"MIT","_id":"hridoy-ultimate@9.0.3","maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"contributors":[{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},{"url":"Base fork","name":"EryXenX"},{"url":"Original","name":"DongDev"}],"homepage":"https://github.com/hridoyhossen48360/hridoy-ultimate#readme","bugs":{"url":"https://github.com/hridoyhossen48360/hridoy-ultimate/issues"},"dist":{"shasum":"87aee55c998032866cdbf99eb457954b37203b7a","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-9.0.3.tgz","fileCount":165,"integrity":"sha512-w/oqPSCbNDFocSO3e3C5s4WyxSlBsJgwsvvBHXex2rpOk4Ip9XqQOpegXPKHsKy1je5JcWD9UyTCiAsOyZmtcA==","signatures":[{"sig":"MEUCIQCIrjd/8ykQ7uEtryf7+Y9x+kY3FI6R/GpHhN9322WOBAIgEeI/WPvDL3pN26tsoGuaRzfvAgpUHqoPapV/IHXOq3M=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEUCIDAv9MoTgEzcs1Q6fmsQjeJ8j9KNgSwUfXtFkiI1R4BXAiEAn9GLR7THsJo4wNkCItFn5Md0/LUcQGzEWv0IVn+bDFQ=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":34487695},"main":"index.js","types":"index.d.ts","engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js","require":"./index.js"},"./package.json":"./package.json"},"scripts":{"lint":"eslint .","test":"mocha"},"_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"repository":{"url":"git+https://github.com/hridoyhossen48360/hridoy-ultimate.git","type":"git"},"_npmVersion":"12.2.1","description":"Facebook Chat API by HR ID OY | Stable • Auto Re-login • Full E2EE Support — send messages, media, reactions & more in encrypted chats, hassle-free","directories":{},"_nodeVersion":"26.4.0","dependencies":{"ws":"^8.18.0","mime":"^3.0.0","mqtt":"^5.10.1","axios":"^1.13.5","chalk":"^4.1.2","koffi":"^3.0.2","cheerio":"1.0.0-rc.12","sqlite3":"^5.1.7","bluebird":"^3.7.2","duplexify":"^4.1.3","sequelize":"^6.37.6","protobufjs":"^8.4.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","totp-generator":"^1.0.0","gradient-string":"^2.0.2","yumi-json-bigint":"^1.0.0","https-proxy-agent":"^4.0.0","axios-cookiejar-support":"^5.0.5","@signalapp/libsignal-client":"0.70.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.2.0","eslint":"^8.50.0"},"optionalDependencies":{"fca-unofficial":"github:VangBanLaNhat/fca-unofficial"},"_npmOperationalInternal":{"tmp":"tmp/hridoy-ultimate_9.0.3_1793022674140_0.3008242343440566","host":"s3://npm-registry-packages-npm-production"}},"9.0.4":{"_id":"hridoy-ultimate@9.0.4","bugs":{"url":"https://github.com/hridoyhossen48360/hridoy-ultimate/issues"},"dist":{"shasum":"cd397012001a4ed70eebd4e1591f50cf5984ba6b","tarball":"https://registry.npmjs.org/hridoy-ultimate/-/hridoy-ultimate-9.0.4.tgz","fileCount":167,"integrity":"sha512-pNy4AuJ2CSV/nikMcuIvkbBfr/t/1ZhmSea0Za2wDSkpnkxKFgRUFa4pHTGHZiz8pTnjqzlrQyoZzz0WbOebjw==","signatures":[{"sig":"MEUCIQDnT+mKVg1OhZTNll+i1jKn+Dk2MjVZeBwen1818cmyVwIgGgMWxG1r+N6RPUPAeEPSecxPsCGogjxgHqDIY0msd7g=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIAhpEL8UUNEYE/344lXy7OCMfynuJUXRcILRpJsjmPNeAiEAhO4s3LV10yeIGRieiKF5iu870Ak43KWL0rlm4NM3cSM="}],"unpackedSize":34502363},"main":"index.js","name":"hridoy-ultimate","types":"index.d.ts","author":{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},"engines":{"node":">=18"},"exports":{".":{"types":"./index.d.ts","default":"./index.js","require":"./index.js"},"./package.json":"./package.json"},"gitHead":"5315a4c8031aacbaeda0a08375899367553fa3d5","license":"MIT","scripts":{"lint":"eslint .","test":"node --test"},"version":"9.0.4","_npmUser":{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"},"homepage":"https://github.com/hridoyhossen48360/hridoy-ultimate#readme","keywords":["facebook","chat","api","messenger","bot","unofficial","fca","hridoy-ultimate","hridoy"],"repository":{"url":"git+https://github.com/hridoyhossen48360/hridoy-ultimate.git","type":"git"},"_npmVersion":"12.2.1","description":"Facebook Chat API by HR ID OY | Stable • Auto Re-login • Full E2EE Support — send messages, media, reactions & more in encrypted chats, hassle-free","directories":{},"maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"_nodeVersion":"26.12.1","contributors":[{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},{"url":"Base fork","name":"EryXenX"},{"url":"Original","name":"DongDev"}],"dependencies":{"ws":"^8.18.0","mime":"^3.0.0","mqtt":"^5.10.1","axios":"^1.13.5","chalk":"^4.1.2","koffi":"^3.0.2","cheerio":"1.0.0-rc.12","request":"^2.88.2","sqlite3":"^5.1.7","bluebird":"^3.7.2","duplexify":"^4.1.3","form-data":"^4.0.0","sequelize":"^6.37.6","protobufjs":"^8.4.0","tough-cookie":"^5.0.0","@noble/curves":"^2.2.0","@noble/hashes":"^2.2.0","totp-generator":"^1.0.0","gradient-string":"^2.0.2","yumi-json-bigint":"^1.0.0","https-proxy-agent":"^4.0.0","axios-cookiejar-support":"^5.0.5","@signalapp/libsignal-client":"0.70.0"},"publishConfig":{"access":"public","registry":"https://registry.npmjs.org/"},"_hasShrinkwrap":false,"devDependencies":{"mocha":"^10.2.0","eslint":"^8.50.0"},"optionalDependencies":{"fca-unofficial":"github:VangBanLaNhat/fca-unofficial"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/hridoy-ultimate_9.0.4_1793362479536_0.2363216632369768"}}},"time":{"created":"2026-10-06T10:55:46.016Z","modified":"2026-10-30T12:14:40.611Z","1.0.0":"2026-08-23T06:18:04.715Z","0.0.0-stage":"2026-10-06T10:55:46.016Z","8.0.0":"2026-10-06T10:57:55.499Z","8.0.1":"2026-10-09T10:24:39.292Z","8.0.2":"2026-10-09T10:29:53.985Z","8.0.5":"2026-10-13T02:57:10.439Z","9.0.0":"2026-10-14T02:56:44.041Z","9.0.1":"2026-10-16T18:34:24.622Z","9.0.2":"2026-10-22T11:25:17.346Z","9.0.3":"2026-10-26T13:51:14.369Z","9.0.4":"2026-10-30T12:14:40.425Z"},"bugs":{"url":"https://github.com/hridoyhossen48360/hridoy-ultimate/issues"},"author":{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},"license":"MIT","homepage":"https://github.com/hridoyhossen48360/hridoy-ultimate#readme","keywords":["facebook","chat","api","messenger","bot","unofficial","fca","hridoy-ultimate","hridoy"],"repository":{"url":"git+https://github.com/hridoyhossen48360/hridoy-ultimate.git","type":"git"},"description":"Facebook Chat API by HR ID OY | Stable • Auto Re-login • Full E2EE Support — send messages, media, reactions & more in encrypted chats, hassle-free","contributors":[{"url":"https://github.com/hridoyhossen48360","name":"HR ID OY"},{"url":"Base fork","name":"EryXenX"},{"url":"Original","name":"DongDev"}],"maintainers":[{"name":"alpha-kakashi","email":"hridoykhan827642@gmail.com"}],"readme":"<div align=\"center\">\n\n# 💬 hridoy-ultimate\n\n**Unofficial Facebook Messenger Bot API for Node.js**\nNEXCA MQTT · Signal Protocol E2EE (mautrix-go powered) · sessionGuard · 90+ API Methods · Zero TypeScript\n\n[![npm](https://img.shields.io/npm/v/hridoy-ultimate?color=blue)](https://www.npmjs.com/package/hridoy-ultimate)\n[![license](https://img.shields.io/badge/license-MIT-green)](./LICENSE-MIT)\n[![node](https://img.shields.io/badge/node-%3E%3D20-brightgreen)](https://nodejs.org)\n\n[Features](#-features) • [Installation](#-installation) • [Quick Start](#-quick-start) • [E2EE](#-e2ee--encrypted-conversations) • [sessionGuard](#-sessionguard) • [sendBroadcast](#-sendbroadcast) • [API Reference](#-api-reference)\n\n</div>\n\n---\n\n## ⚡ Why hridoy-ultimate?\n\n- ✅ **NEXCA MQTT** — stable connection core, autoReconnect, jitter\n- ✅ **Signal Protocol E2EE** — Facebook real encrypted conversations support. Reliable media/reaction/unsend delivery is powered by a bundled **mautrix-go / mautrix-meta** native engine (© Tulir Asokan, MPL-2.0) — NEXCA's own hand-written E2EE encoder produced protocol-valid messages that Facebook accepted but Messenger clients failed to render for attachments/reactions/unsend, so this fork routes those through the native engine instead. Text messaging still uses the original engine (already reliable). The native engine is opt-in (`FCA_E2EE_NATIVE=1`) — see [Native media engine](#native-media-engine).\n- ✅ **sessionGuard** — appstate corruption and silent logout protection, auto-backup\n- ✅ **sendBroadcast** — rate-limited multi-thread broadcast\n- ✅ **Fixed MQTT subscribe race condition** — no more \"Connection refused: No subscription existed\"\n- ✅ **`isActiveClient()` guard** — stale MQTT client events no longer processed\n- ✅ **`connectTimeout` extended** — no premature logout on slow networks\n- ✅ **autoReconnect** — auto-reconnect on connection drop\n- ✅ **GoatBot compatible** — all API signatures unchanged (`threadID` optional etc.)\n- ✅ **90+ API methods** — sendMessage, editMessage, setMessageReaction, getThreadInfo and more\n\n---\n\n## ✨ Features\n\n- ✅ Full Messenger API — messages, reactions, attachments, stickers, polls, pins\n- ✅ NEXCA MQTT — stable connection, autoReconnect, jitter, isActiveClient guard\n- ✅ E2EE — Signal Protocol encrypted threads, auto-connects after login (listenE2EE, e2ee.*)\n- ✅ E2EE media engine — native mautrix-go engine (opt-in via `FCA_E2EE_NATIVE=1`) for reliable image/video/audio/document sending, reactions, and unsend in encrypted threads (falls back to the built-in JS engine automatically)\n- ✅ E2EE incoming media — attachments on encrypted messages (including replies) are auto-decrypted and served locally, so existing commands work unmodified\n- ✅ sessionGuard — appstate auto-save, corruption guard, .bak backup\n- ✅ Command anti-spam humanizer — human-like reply delay, per-thread cooldown, GoatBot no-prefix/onChat/onReply auto-detection\n- ✅ sendBroadcast — parallel/sequential multi-thread sending with rate limit\n- ✅ MessengerBot — Discord.js/Telegraf style (.command, .hears, .launch)\n- ✅ createFcaClient — namespaced facade (client.messages, client.threads etc.)\n- ✅ GoatBot / Mirai compatible — drop-in replacement\n\n---\n\n## 📦 Installation\n\n```bash\nnpm install hridoy-ultimate\n```\n\nNode.js >= 20 required.\n\nThe E2EE media engine ships a precompiled native binary (`src/api/socket/e2ee/native/build/`) for **Linux (.so)** and **Windows (.dll)**, loaded via the `koffi` FFI. `npm install` pulls in `koffi` and `yumi-json-bigint` automatically — no extra setup needed. Note the native engine only runs when `FCA_E2EE_NATIVE=1` is set (see [Native media engine](#native-media-engine)); on platforms other than Linux/Windows x64 (e.g. macOS, ARM) the binary fails to load and E2EE media/reactions/unsend automatically fall back to the built-in JS engine (text messaging is unaffected either way).\n\nThe E2EE socket's User-Agent defaults to desktop Windows Chrome 139 to match the rest of the client; override with `FCA_E2EE_UA` if you run with a different UA.\n\n---\n\n## 🚀 Quick Start\n\n### Classic (GoatBot compatible)\n\n```javascript\nconst login = require(\"hridoy-ultimate\");\n\nlogin({ appState: require(\"./account.json\") }, { listenEvents: true }, (err, api) => {\n  if (err) throw err;\n\n  api.sessionGuard(\"./account.json\", {\n    interval: 3 * 60 * 1000,\n    debounce: 30 * 1000\n  });\n\n  api.listenMqtt((err, event) => {\n    if (err) throw err;\n    if (event.type === \"message\") api.sendMessage(event.body, event.threadID);\n  });\n});\n```\n\n### With E2EE (regular + encrypted threads)\n\n`connectE2EE()` runs **automatically** right after login — you never call it yourself. Calling it again in your own code opens a second, racing connection on the same bridge. Just check `api.e2ee.isConnected()` if you need to know the status.\n\n```javascript\nlogin({ appState: require(\"./account.json\") }, { listenEvents: true }, (err, api) => {\n  if (err) throw err;\n\n  api.sessionGuard(\"./account.json\");\n  // E2EE is already connecting in the background here — do not call connectE2EE().\n\n  api.listenE2EE((err, event) => {\n    if (err) throw err;\n    if (event.type === \"message\") {\n      if (event.isE2EE) {\n        api.e2ee.sendMessage(event.threadID, \"Got your encrypted message!\");\n      } else {\n        api.sendMessage(\"Got it!\", event.threadID);\n      }\n    }\n  });\n});\n```\n\n### GoatBot login.js\n\n```javascript\nconst login = require(\"hridoy-ultimate\");\n\nlogin({ appState }, options, (err, api) => {\n  if (err) return;\n\n  api.sessionGuard(path.join(process.cwd(), \"account.txt\"), {\n    interval: 3 * 60 * 1000,\n    debounce: 30 * 1000\n  });\n\n  // Nothing else needed for E2EE — it auto-connects inside hridoy-ultimate\n  // right after login. Do NOT call api.connectE2EE() here.\n\n  api.listenMqtt(callback);\n});\n```\n\n**This is the only setup needed — nothing else in `login.js` (or anywhere in GoatBot) has to change for E2EE.** Once login succeeds, `api.e2ee` is already connecting in the background, and every existing GoatBot call — `api.sendMessage(...)` (with or without `attachment`), `api.setMessageReaction(...)`, `api.unsendMessage(...)` — automatically detects when a thread is an encrypted DM and routes through the E2EE engine internally. Commands don't need to know or care whether a thread is encrypted; they call the same functions either way.\n\n#### Adding this to your own login.js\n\nYour bot's actual `login.js` will look different from the snippet above (dashboard setup, database sync, custom logging, etc.) — you're not replacing the file, just adding/checking two things inside your existing login callback:\n\n| Step | What to do |\n|---|---|\n| 1. sessionGuard | Add `api.sessionGuard(accountPath, { interval, debounce })` once, right after login succeeds, if it's not already there. |\n| 2. E2EE | Nothing to add — it's automatic. If your `login.js` already has an explicit `await api.connectE2EE()` call, **delete it** — it's redundant with the automatic connection and the two can race. |\n\nTo check whether E2EE is already wired into your bot, search for `e2ee.isConnected` in your `login.js` — if it's there, setup is already done.\n\n---\n\n## 🔐 E2EE — Encrypted Conversations\n\nUses Facebook's real Signal Protocol infrastructure — same as the official Messenger app.\n\n### Setup\n\nE2EE connects automatically after login (creating `.nexca/e2ee_device.json` on first run) — there's nothing to call manually. Just check status once connected:\n\n```javascript\nconsole.log(api.e2ee.isConnected()); // true (may need a moment right after login)\n```\n\n### Listen (regular + E2EE combined)\n\n```javascript\napi.listenE2EE((err, event) => {\n  if (event.type === \"message\") {\n    if (event.isE2EE) {\n      api.e2ee.sendMessage(event.threadID, \"Encrypted reply!\");\n    } else {\n      api.sendMessage(\"Normal reply!\", event.threadID);\n    }\n  }\n});\n```\n\n### E2EE Methods\n\n```javascript\nawait api.e2ee.sendMessage(threadID, \"Hello!\");\nawait api.e2ee.sendMessage(threadID, { body: \"Photo!\", attachment: fs.createReadStream(\"photo.jpg\") });\nawait api.e2ee.sendReaction(threadID, messageID, \"❤️\");\nawait api.e2ee.sendTyping(threadID, true);\nawait api.e2ee.unsendMessage(messageID, threadID);\nawait api.e2ee.editMessage(threadID, messageID, \"Updated!\");\napi.e2ee.isConnected();\nawait api.e2ee.disconnect();\n```\n\n### Native media engine\n\nSending image/video/audio/document attachments, reactions, and unsend in E2EE threads can be routed through a precompiled **mautrix-go / mautrix-meta** binary (`src/api/socket/e2ee/native/`) via the `koffi` FFI, instead of this project's own hand-written Signal Protocol encoder. This project's own encoder builds protocol-valid messages that Facebook's servers accept, but real Messenger clients silently fail to render — the native engine avoids that entirely.\n\n**⚠️ The native engine is DISABLED by default.** Both the vendored JS engine and the native engine register with Facebook as the *same* E2EE device (same device id), and Facebook's server keeps only one live E2EE socket per device — so when both run at once they kick each other off in a loop (a fresh handshake every few seconds, which looks like automated behavior to Facebook). The vendored JS engine is therefore given exclusive use of the socket unless you opt in:\n\n- Set `FCA_E2EE_NATIVE=1` in the environment to enable the native engine. With it on you get E2EE group text receive/send, native media sends, native reactions/unsend/edit/markRead — but you also accept the device-kick socket churn described above (the JS engine reconnects with exponential backoff, so it stays usable, just noisy).\n- With it off (default): E2EE DM text + DM media work through the vendored engine. E2EE **group** send/receive, and E2EE markRead, are unavailable; reactions/unsend/edit in E2EE DMs fall back to the vendored engine.\n\n- Text messages always use hridoy-ultimate's own E2EE engine (already reliable, no native dependency).\n- If the native engine fails to load or a send fails (unsupported platform, binary mismatch, etc.), hridoy-ultimate automatically falls back to its own engine and logs `[native-media] ... falling back to legacy vendor engine`.\n- See `src/api/socket/e2ee/native/NOTICE.md` for the required MPL-2.0 attribution to the upstream mautrix-go/mautrix-meta project (© Tulir Asokan and contributors) — do not remove it if you redistribute this fork.\n\n### Receiving E2EE media (attachments & replies)\n\nIncoming encrypted image/video/audio/document messages are automatically decrypted and served over a short-lived local URL (`http://127.0.0.1:<port>/<token>`, 15 min TTL), and populated into `event.attachments` / `event.messageReply.attachments` — same shape as normal (non-E2EE) attachments. Reply-based commands (e.g. \"reply to an image with `/imgur`\") work the same in E2EE threads as in normal ones, no command code changes needed.\n\n```javascript\nif (event.messageReply && event.messageReply.attachments.length) {\n  const url = event.messageReply.attachments[0].url; // works for E2EE too\n}\n```\n\nIf media resolution fails, check the console for `[media-resolve]` / `[media-decode]` errors — this usually means the CDN download host (`FB_E2EE_MEDIA_DOWNLOAD_HOST` env var, default `rupload.facebook.com`) needs adjusting for your account/region.\n\n---\n\n## 🛡️ Command Anti-Spam (Humanizer)\n\nDelays and rate-limits command replies so the bot reacts like a person\ntyping, not a script firing instantly — and drops commands sent faster\nthan a human could plausibly send them (spam bursts).\n\nInstalled automatically on login (`enabled` by default). No setup needed:\n\n```javascript\nlogin({ appState }, {}, (err, api) => {\n  api.listenMqtt((err, event) => { /* ... */ });\n});\n```\n\nConfigure it via the `humanize` login option, or `api.setOptions({ humanize })`:\n\n```javascript\nlogin({ appState }, {\n  humanize: {\n    enabled: true,\n    reactDelayMs: [2000, 3000], // random delay before a command is let through\n    cooldownMs: 5500,           // min gap between two accepted commands (per thread)\n    resetMs: 10000,             // idle gap before cooldown state resets\n    maxPerMinute: 20,           // global accepted-commands cap\n    commands: [\"/\", \"!\", \".\"],  // prefixes that count as \"this is a command\"\n    perThread: true             // cooldown tracked per thread vs. globally\n  }\n}, cb);\n```\n\n`api.setOptions({ humanize: { enabled: false } })` turns it off entirely.\n\n### What counts as a \"command\"\n\nBy default, only messages starting with one of the `commands` prefixes are\ntreated as commands — everything else (plain chat) passes through\nuntouched, with no delay and no typing indicator.\n\nIf `global.GoatBot` is present (i.e. running under GoatBot-Pro), the\nhumanizer **automatically** also treats these as commands, with zero\nconfig needed:\n\n- **No-prefix admin commands** — `config.noPrefix.enable: true` +\n  sender in `config.adminBot`, first word matches a real command/alias.\n- **`onChat` triggers** — a message whose full text exactly matches a\n  command name registered in `GoatBot.onChat` (e.g. typing `prefix` with\n  no `/`, which GoatBot's `prefix.js` reacts to).\n- **`onReply` flows** — a reply to a message tracked in `GoatBot.onReply`\n  (e.g. the numeric \"1\", \"2\", \"3\" replies used by GoatBot's `setting.js`\n  menu system).\n\nThis means the whole multi-step `setting` command flow — not just the\ninitial `/setting` — gets the same delay/cooldown/typing treatment as a\nnormal command.\n\nFor anything outside these built-ins, give it a custom matcher:\n\n```javascript\nconst h = api.getHumanizer();\nh.setMatcher((event) => {\n  // your own logic — return true to treat this event as a command\n  return event.body === \"some no-prefix trigger\";\n});\n```\n\n`matcher` can also be passed directly in the `humanize` config\n(`humanize: { matcher: fn }`). A message counts as a command if it matches\nthe prefix list **or** a built-in GoatBot check **or** the matcher.\n\n### Typing indicator\n\nWhen a command is accepted, `api.sendTypingIndicator(threadID, true)` is\ncalled immediately, held for the exact accepted delay, then turned off\nright before the event is forwarded — so the typing indicator and the\nreply delay are the same window, not two stacked waits. Disabled\nautomatically if `global.GoatBot.config.enableTypingIndicator` is `false`.\n\n### Inspecting it\n\n```javascript\nconst h = api.getHumanizer();\nh.stats();     // { enabled, global: {accepted, dropped, ...}, threads: [...] }\nh.reset();     // clear all cooldown state\n```\n\n> Note: this operates on **incoming** command volume — separate from\n> outgoing send pacing (see `sendBroadcast` below, and any queueing you\n> add yourself around `api.sendMessage`).\n\n---\n\n## 🛡️ sessionGuard\n\nProtects your appstate from corruption and silent logouts.\n\n```javascript\napi.sessionGuard(\"./account.json\");\n\n// Custom timing\napi.sessionGuard(\"./account.json\", {\n  interval: 3 * 60 * 1000,\n  debounce: 30 * 1000\n});\n```\n\nWhat it does:\n- Auto-saves appstate every N minutes\n- Saves after every successful sendMessage (debounced)\n- Corruption guard — never overwrites a larger appstate with a smaller one\n- Auto-backup — writes `.bak` before every overwrite\n\n```javascript\napi.saveSession();           // force save now\napi.restoreSessionBackup();  // restore from .bak\napi.stopSessionGuard();      // stop the timer\n```\n\n---\n\n## 📡 sendBroadcast\n\nRate-limited multi-thread broadcast.\n\n```javascript\nconst result = await api.sendBroadcast(\n  \"Hello everyone!\",\n  [\"THREAD_1\", \"THREAD_2\", \"THREAD_3\"],\n  {\n    delay: 2000,\n    parallel: 2,\n    onEach: (err, info, id) => {\n      console.log(err ? \"Failed: \" + id : \"Sent: \" + id);\n    }\n  }\n);\nconsole.log(result.sent.length + \"/\" + result.total + \" delivered\");\n```\n\n---\n\n## 🤖 MessengerBot\n\nDiscord.js/Telegraf style high-level bot class.\n\n```javascript\nconst { createMessengerBot } = require(\"hridoy-ultimate\");\n\nconst bot = await createMessengerBot(\n  { appState: require(\"./account.json\") },\n  { commandPrefix: \"/\", stopOnSignals: true }\n);\n\nbot.command(\"ping\", async ctx => await ctx.replyAsync(\"pong 🏓\"));\nbot.hears(/hello/i, async ctx => await ctx.replyAsync(\"Hi! 👋\"));\nbot.on(\"messageCreate\", event => console.log(event.body));\n\nawait bot.launch({ stopOnSignals: true });\n```\n\n---\n\n## 🎯 createFcaClient\n\nNamespaced facade grouping all API methods by domain.\n\n```javascript\nconst { createFcaClient } = require(\"hridoy-ultimate\");\nconst client = createFcaClient(api);\n\nawait client.messages.send(\"Hello!\", threadID);\nawait client.messages.react(\"❤️\", messageID, threadID);\nawait client.threads.getInfo(threadID);\nawait client.users.getInfo(userID);\nawait client.account.refreshDtsg();\n```\n\n---\n\n## 📖 API Reference\n\n### Sending Messages\n\n```javascript\napi.sendMessage(\"Hello!\", threadID);\napi.sendMessage({ body: \"Photo!\", attachment: fs.createReadStream(\"photo.jpg\") }, threadID);\napi.sendMessage({ body: \"Hey @John\", mentions: [{ id: \"uid\", tag: \"@John\", fromIndex: 4 }] }, threadID);\napi.sendMessage({ sticker: \"369239263222822\" }, threadID);\napi.sendMessage({ location: { latitude: 23.8, longitude: 90.4, current: true } }, threadID);\napi.sendBroadcast(\"msg\", [\"tid1\", \"tid2\"], { delay: 2000 });\napi.sendGif(\"https://media.giphy.com/xyz.gif\", threadID);\napi.sendLocation(23.8, 90.4, threadID);\napi.sendImage(\"./photo.jpg\", threadID, \"caption\");\napi.sendVideo(\"./video.mp4\", threadID);\napi.sendAudio(\"./voice.ogg\", threadID);\napi.sendFile(\"./doc.pdf\", threadID);\napi.shareLink(\"https://github.com\", threadID, \"Check this!\");\napi.shareContact(\"Meet my friend!\", userID, threadID);\n```\n\n### Message Actions\n\n```javascript\napi.editMessage(\"Updated text\", messageID);\napi.unsendMessage(messageID);\napi.deleteMessage([messageID]);\napi.setMessageReaction(\"😍\", messageID, threadID);  // threadID optional\napi.setMessageReaction(\"\", messageID);               // remove reaction\napi.getMessage(threadID, messageID);\napi.forwardAttachment(attachmentID, [userID]);\napi.uploadAttachment([fs.createReadStream(\"photo.jpg\")]);\n```\n\n### Read Receipts & Typing\n\n```javascript\napi.markAsRead(threadID);\napi.markAsReadAll();\napi.markAsDelivered(threadID, messageID);\napi.markAsSeen();\napi.sendTypingIndicator(threadID, true);\n```\n\n### Thread Management\n\n```javascript\napi.getThreadInfo(threadID);\napi.getThreadList(10, null, [\"INBOX\"]);\napi.getThreadHistory(threadID, 20);\napi.createGroup(\"Hey!\", [\"uid1\", \"uid2\"]);\napi.deleteThread(threadID);\napi.muteThread(threadID, 3600);\napi.changeArchivedStatus(threadID, true);\napi.handleMessageRequest(threadID, true);\napi.searchForThread(\"query\");\n```\n\n### Thread Customization\n\n```javascript\napi.setTitle(\"New Name\", threadID);\napi.changeThreadColor(\"#0084FF\", threadID);\napi.changeThreadEmoji(\"🔥\", threadID);\napi.changeNickname(\"The Boss\", threadID, userID);\napi.changeGroupImage(fs.createReadStream(\"group.jpg\"), threadID);\napi.changeAdminStatus(threadID, userID, true);\napi.addUserToGroup(userID, threadID);\napi.removeUserFromGroup(userID, threadID);\napi.createPoll(\"Question?\", threadID, { \"Yes\": false, \"No\": false });\napi.pinMessage(messageID, threadID);\napi.unpinMessage(messageID, threadID);\n```\n\n### User Info\n\n```javascript\napi.getUserInfo(userID);\napi.getUserID(\"John Doe\", callback);\napi.getUID(\"https://facebook.com/zuck\");\napi.getFriendsList();\napi.getAvatarUser(userID);\napi.getProfileInfo(userID);\napi.getPublicData(userID);\napi.sendFriendRequest(userID);\napi.handleFriendRequest(userID, true);\napi.changeBlockedStatus(userID, true);\napi.followUser(userID);\napi.unfollowUser(userID);\napi.unfriend(userID);\n```\n\n### Social\n\n```javascript\napi.reactToPost(postID, \"love\");\napi.reactToComment(commentID, \"haha\");\napi.postComment(postID, \"Great post!\");\napi.sharePost(postID, \"Check this!\");\n```\n\n### Account & Config\n\n```javascript\napi.getCurrentUserID();\napi.getAppState();\napi.setOptions({ listenTyping: true });\napi.logout();               // local stop only; your browser stays logged in\napi.logoutFromFacebook();   // real Facebook logout (ends your browser session too)\napi.refreshFb_dtsg();\napi.addExternalModule(\"myFunc\", (defaultFuncs, api, ctx) => {\n  return function(text, threadID) {\n    return api.sendMessage(\"[BOT] \" + text, threadID);\n  };\n});\n```\n\n### HTTP Utilities\n\n```javascript\napi.httpGet(url, params, callback);\napi.httpPost(url, form, callback);\napi.httpPostFormData(url, form, callback);\napi.uploadImageToImgbb(imageUrl);\n```\n\n---\n\n## 📋 Login Options\n\n| Option | Type | Default | Description |\n|--------|------|---------|-------------|\n| `selfListen` | boolean | false | Receive your own sent messages |\n| `listenEvents` | boolean | true | Receive thread/group events |\n| `listenTyping` | boolean | false | Receive typing indicator events |\n| `updatePresence` | boolean | false | Receive online/offline presence events |\n| `autoMarkDelivery` | boolean | false | Auto-mark incoming messages as delivered |\n| `autoMarkRead` | boolean | false | Auto-mark threads as read |\n| `autoReconnect` | boolean | true | Auto-reconnect MQTT on disconnect |\n| `online` | boolean | false | Appear as online to others |\n| `emitReady` | boolean | false | Emit ready event when MQTT connected |\n| `proxy` | string | — | HTTP proxy URL |\n| `userAgent` | string | Safari UA | Override HTTP User-Agent |\n\n---\n\n## 📄 License\n\nMIT License\n\n**hridoy-ultimate** v9.0.4 by [HR ID OY](https://github.com/hridoyhossen48360)\n\n> The E2EE native media engine (`src/api/socket/e2ee/native/`) bundles a\n> precompiled binary built from **mautrix-go** / **mautrix-meta**, © Tulir\n> Asokan and contributors, licensed under **MPL-2.0** (not MIT). See\n> `src/api/socket/e2ee/native/NOTICE.md` for full attribution — this notice\n> must be preserved in any redistribution of this fork.\nNEXCA MQTT core by [Deku](https://github.com/dekuzxc) — MIT License\n\n> Unauthorized copying or redistribution without credit is prohibited.\n\n---\n\n<div align=\"center\">\n\nMade with ❤️ by HR ID OY\n\n</div>\n","readmeFilename":"README.md"}