@juzi/wechaty-puppet-whatsapp 1.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/LICENSE +201 -0
- package/README.md +83 -0
- package/dist/cjs/examples/ding-dong-bot.d.ts +2 -0
- package/dist/cjs/examples/ding-dong-bot.d.ts.map +1 -0
- package/dist/cjs/examples/ding-dong-bot.js +98 -0
- package/dist/cjs/examples/ding-dong-bot.js.map +1 -0
- package/dist/cjs/package.json +1 -0
- package/dist/cjs/src/config.d.ts +41 -0
- package/dist/cjs/src/config.d.ts.map +1 -0
- package/dist/cjs/src/config.js +58 -0
- package/dist/cjs/src/config.js.map +1 -0
- package/dist/cjs/src/data/cache-manager.d.ts +83 -0
- package/dist/cjs/src/data/cache-manager.d.ts.map +1 -0
- package/dist/cjs/src/data/cache-manager.js +303 -0
- package/dist/cjs/src/data/cache-manager.js.map +1 -0
- package/dist/cjs/src/data/cache-manager.spec.d.ts +2 -0
- package/dist/cjs/src/data/cache-manager.spec.d.ts.map +1 -0
- package/dist/cjs/src/data/cache-manager.spec.js +32 -0
- package/dist/cjs/src/data/cache-manager.spec.js.map +1 -0
- package/dist/cjs/src/exception/error-type.d.ts +80 -0
- package/dist/cjs/src/exception/error-type.d.ts.map +1 -0
- package/dist/cjs/src/exception/error-type.js +61 -0
- package/dist/cjs/src/exception/error-type.js.map +1 -0
- package/dist/cjs/src/exception/whatsapp-error.d.ts +4 -0
- package/dist/cjs/src/exception/whatsapp-error.d.ts.map +1 -0
- package/dist/cjs/src/exception/whatsapp-error.js +14 -0
- package/dist/cjs/src/exception/whatsapp-error.js.map +1 -0
- package/dist/cjs/src/exception/whatsapp-error.spec.d.ts +3 -0
- package/dist/cjs/src/exception/whatsapp-error.spec.d.ts.map +1 -0
- package/dist/cjs/src/exception/whatsapp-error.spec.js +27 -0
- package/dist/cjs/src/exception/whatsapp-error.spec.js.map +1 -0
- package/dist/cjs/src/helper/index.d.ts +2 -0
- package/dist/cjs/src/helper/index.d.ts.map +1 -0
- package/dist/cjs/src/helper/index.js +3 -0
- package/dist/cjs/src/helper/index.js.map +1 -0
- package/dist/cjs/src/helper/miscellaneous.d.ts +8 -0
- package/dist/cjs/src/helper/miscellaneous.d.ts.map +1 -0
- package/dist/cjs/src/helper/miscellaneous.js +48 -0
- package/dist/cjs/src/helper/miscellaneous.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.d.ts +4 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.js +62 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts +2 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.js +86 -0
- package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/convert-function.d.ts +4 -0
- package/dist/cjs/src/helper/pure-function/convert-function.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/convert-function.js +17 -0
- package/dist/cjs/src/helper/pure-function/convert-function.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/index.d.ts +5 -0
- package/dist/cjs/src/helper/pure-function/index.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/index.js +21 -0
- package/dist/cjs/src/helper/pure-function/index.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.d.ts +4 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.js +136 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.d.ts +2 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.js +229 -0
- package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.d.ts +28 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.js +59 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.spec.d.ts +2 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.spec.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.spec.js +101 -0
- package/dist/cjs/src/helper/pure-function/room-event-generator.spec.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.d.ts +4 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.js +24 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.d.ts +2 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.js +68 -0
- package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.js.map +1 -0
- package/dist/cjs/src/helper/pure-function/vcard-parser.d.ts +28 -0
- package/dist/cjs/src/helper/pure-function/vcard-parser.d.ts.map +1 -0
- package/dist/cjs/src/helper/pure-function/vcard-parser.js +109 -0
- package/dist/cjs/src/helper/pure-function/vcard-parser.js.map +1 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.d.ts +19 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.d.ts.map +1 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.js +49 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.js.map +1 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.spec.d.ts +2 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.spec.d.ts.map +1 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.spec.js +45 -0
- package/dist/cjs/src/helper/schedule/schedule-manager.spec.js.map +1 -0
- package/dist/cjs/src/manager-event.d.ts +18 -0
- package/dist/cjs/src/manager-event.d.ts.map +1 -0
- package/dist/cjs/src/manager-event.js +3 -0
- package/dist/cjs/src/manager-event.js.map +1 -0
- package/dist/cjs/src/manager.d.ts +67 -0
- package/dist/cjs/src/manager.d.ts.map +1 -0
- package/dist/cjs/src/manager.js +270 -0
- package/dist/cjs/src/manager.js.map +1 -0
- package/dist/cjs/src/manager.spec.d.ts +3 -0
- package/dist/cjs/src/manager.spec.d.ts.map +1 -0
- package/dist/cjs/src/manager.spec.js +38 -0
- package/dist/cjs/src/manager.spec.js.map +1 -0
- package/dist/cjs/src/mod.d.ts +5 -0
- package/dist/cjs/src/mod.d.ts.map +1 -0
- package/dist/cjs/src/mod.js +9 -0
- package/dist/cjs/src/mod.js.map +1 -0
- package/dist/cjs/src/package-json.d.ts +6 -0
- package/dist/cjs/src/package-json.d.ts.map +1 -0
- package/dist/cjs/src/package-json.js +93 -0
- package/dist/cjs/src/package-json.js.map +1 -0
- package/dist/cjs/src/package-json.spec.d.ts +3 -0
- package/dist/cjs/src/package-json.spec.d.ts.map +1 -0
- package/dist/cjs/src/package-json.spec.js +10 -0
- package/dist/cjs/src/package-json.spec.js.map +1 -0
- package/dist/cjs/src/puppet-mixin/contact-self.d.ts +5 -0
- package/dist/cjs/src/puppet-mixin/contact-self.d.ts.map +1 -0
- package/dist/cjs/src/puppet-mixin/contact-self.js +45 -0
- package/dist/cjs/src/puppet-mixin/contact-self.js.map +1 -0
- package/dist/cjs/src/puppet-mixin/contact.d.ts +16 -0
- package/dist/cjs/src/puppet-mixin/contact.d.ts.map +1 -0
- package/dist/cjs/src/puppet-mixin/contact.js +124 -0
- package/dist/cjs/src/puppet-mixin/contact.js.map +1 -0
- package/dist/cjs/src/puppet-mixin/conversation.d.ts +2 -0
- package/dist/cjs/src/puppet-mixin/conversation.d.ts.map +1 -0
- package/dist/cjs/src/puppet-mixin/conversation.js +35 -0
- package/dist/cjs/src/puppet-mixin/conversation.js.map +1 -0
- package/dist/cjs/src/puppet-mixin/friendship.d.ts +12 -0
- package/dist/cjs/src/puppet-mixin/friendship.d.ts.map +1 -0
- package/dist/cjs/src/puppet-mixin/friendship.js +99 -0
- package/dist/cjs/src/puppet-mixin/friendship.js.map +1 -0
- package/dist/cjs/src/puppet-mixin/message.d.ts +57 -0
- package/dist/cjs/src/puppet-mixin/message.d.ts.map +1 -0
- package/dist/cjs/src/puppet-mixin/message.js +327 -0
- package/dist/cjs/src/puppet-mixin/message.js.map +1 -0
- package/dist/cjs/src/puppet-mixin/room.d.ts +42 -0
- package/dist/cjs/src/puppet-mixin/room.d.ts.map +1 -0
- package/dist/cjs/src/puppet-mixin/room.js +319 -0
- package/dist/cjs/src/puppet-mixin/room.js.map +1 -0
- package/dist/cjs/src/puppet-mixin/tag.d.ts +5 -0
- package/dist/cjs/src/puppet-mixin/tag.d.ts.map +1 -0
- package/dist/cjs/src/puppet-mixin/tag.js +50 -0
- package/dist/cjs/src/puppet-mixin/tag.js.map +1 -0
- package/dist/cjs/src/puppet-whatsapp.d.ts +145 -0
- package/dist/cjs/src/puppet-whatsapp.d.ts.map +1 -0
- package/dist/cjs/src/puppet-whatsapp.js +309 -0
- package/dist/cjs/src/puppet-whatsapp.js.map +1 -0
- package/dist/cjs/src/puppet-whatsapp.spec.d.ts +3 -0
- package/dist/cjs/src/puppet-whatsapp.spec.d.ts.map +1 -0
- package/dist/cjs/src/puppet-whatsapp.spec.js +25 -0
- package/dist/cjs/src/puppet-whatsapp.spec.js.map +1 -0
- package/dist/cjs/src/request/rate-manager.d.ts +21 -0
- package/dist/cjs/src/request/rate-manager.d.ts.map +1 -0
- package/dist/cjs/src/request/rate-manager.js +92 -0
- package/dist/cjs/src/request/rate-manager.js.map +1 -0
- package/dist/cjs/src/request/request-manager.d.ts +54 -0
- package/dist/cjs/src/request/request-manager.d.ts.map +1 -0
- package/dist/cjs/src/request/request-manager.js +128 -0
- package/dist/cjs/src/request/request-manager.js.map +1 -0
- package/dist/cjs/src/request/request-pool.d.ts +10 -0
- package/dist/cjs/src/request/request-pool.d.ts.map +1 -0
- package/dist/cjs/src/request/request-pool.js +47 -0
- package/dist/cjs/src/request/request-pool.js.map +1 -0
- package/dist/cjs/src/request/request-pool.spec.d.ts +2 -0
- package/dist/cjs/src/request/request-pool.spec.d.ts.map +1 -0
- package/dist/cjs/src/request/request-pool.spec.js +36 -0
- package/dist/cjs/src/request/request-pool.spec.js.map +1 -0
- package/dist/cjs/src/schema/event-name.d.ts +9 -0
- package/dist/cjs/src/schema/event-name.d.ts.map +1 -0
- package/dist/cjs/src/schema/event-name.js +13 -0
- package/dist/cjs/src/schema/event-name.js.map +1 -0
- package/dist/cjs/src/schema/index.d.ts +2 -0
- package/dist/cjs/src/schema/index.d.ts.map +1 -0
- package/dist/cjs/src/schema/index.js +18 -0
- package/dist/cjs/src/schema/index.js.map +1 -0
- package/dist/cjs/src/schema/whatsapp-interface.d.ts +18 -0
- package/dist/cjs/src/schema/whatsapp-interface.d.ts.map +1 -0
- package/dist/cjs/src/schema/whatsapp-interface.js +26 -0
- package/dist/cjs/src/schema/whatsapp-interface.js.map +1 -0
- package/dist/cjs/src/schema/whatsapp-type.d.ts +42 -0
- package/dist/cjs/src/schema/whatsapp-type.d.ts.map +1 -0
- package/dist/cjs/src/schema/whatsapp-type.js +3 -0
- package/dist/cjs/src/schema/whatsapp-type.js.map +1 -0
- package/dist/cjs/src/whatsapp/event-handler/group-event-handler.d.ts +8 -0
- package/dist/cjs/src/whatsapp/event-handler/group-event-handler.d.ts.map +1 -0
- package/dist/cjs/src/whatsapp/event-handler/group-event-handler.js +84 -0
- package/dist/cjs/src/whatsapp/event-handler/group-event-handler.js.map +1 -0
- package/dist/cjs/src/whatsapp/event-handler/login-event-handler.d.ts +24 -0
- package/dist/cjs/src/whatsapp/event-handler/login-event-handler.d.ts.map +1 -0
- package/dist/cjs/src/whatsapp/event-handler/login-event-handler.js +203 -0
- package/dist/cjs/src/whatsapp/event-handler/login-event-handler.js.map +1 -0
- package/dist/cjs/src/whatsapp/event-handler/message-event-handler.d.ts +35 -0
- package/dist/cjs/src/whatsapp/event-handler/message-event-handler.d.ts.map +1 -0
- package/dist/cjs/src/whatsapp/event-handler/message-event-handler.js +203 -0
- package/dist/cjs/src/whatsapp/event-handler/message-event-handler.js.map +1 -0
- package/dist/cjs/src/whatsapp/whatsapp-base.d.ts +26 -0
- package/dist/cjs/src/whatsapp/whatsapp-base.d.ts.map +1 -0
- package/dist/cjs/src/whatsapp/whatsapp-base.js +69 -0
- package/dist/cjs/src/whatsapp/whatsapp-base.js.map +1 -0
- package/dist/cjs/src/whatsapp/whatsapp-manager.d.ts +16 -0
- package/dist/cjs/src/whatsapp/whatsapp-manager.d.ts.map +1 -0
- package/dist/cjs/src/whatsapp/whatsapp-manager.js +134 -0
- package/dist/cjs/src/whatsapp/whatsapp-manager.js.map +1 -0
- package/dist/cjs/tests/integration.spec.d.ts +3 -0
- package/dist/cjs/tests/integration.spec.d.ts.map +1 -0
- package/dist/cjs/tests/integration.spec.js +8 -0
- package/dist/cjs/tests/integration.spec.js.map +1 -0
- package/dist/cjs/tests/memory-card.spec.d.ts +2 -0
- package/dist/cjs/tests/memory-card.spec.d.ts.map +1 -0
- package/dist/cjs/tests/memory-card.spec.js +25 -0
- package/dist/cjs/tests/memory-card.spec.js.map +1 -0
- package/dist/cjs/tests/qrcode.spec.d.ts +2 -0
- package/dist/cjs/tests/qrcode.spec.d.ts.map +1 -0
- package/dist/cjs/tests/qrcode.spec.js +51 -0
- package/dist/cjs/tests/qrcode.spec.js.map +1 -0
- package/dist/esm/examples/ding-dong-bot.d.ts +2 -0
- package/dist/esm/examples/ding-dong-bot.d.ts.map +1 -0
- package/dist/esm/examples/ding-dong-bot.js +93 -0
- package/dist/esm/examples/ding-dong-bot.js.map +1 -0
- package/dist/esm/src/config.d.ts +41 -0
- package/dist/esm/src/config.d.ts.map +1 -0
- package/dist/esm/src/config.js +50 -0
- package/dist/esm/src/config.js.map +1 -0
- package/dist/esm/src/data/cache-manager.d.ts +83 -0
- package/dist/esm/src/data/cache-manager.d.ts.map +1 -0
- package/dist/esm/src/data/cache-manager.js +273 -0
- package/dist/esm/src/data/cache-manager.js.map +1 -0
- package/dist/esm/src/data/cache-manager.spec.d.ts +2 -0
- package/dist/esm/src/data/cache-manager.spec.d.ts.map +1 -0
- package/dist/esm/src/data/cache-manager.spec.js +30 -0
- package/dist/esm/src/data/cache-manager.spec.js.map +1 -0
- package/dist/esm/src/exception/error-type.d.ts +80 -0
- package/dist/esm/src/exception/error-type.d.ts.map +1 -0
- package/dist/esm/src/exception/error-type.js +58 -0
- package/dist/esm/src/exception/error-type.js.map +1 -0
- package/dist/esm/src/exception/whatsapp-error.d.ts +4 -0
- package/dist/esm/src/exception/whatsapp-error.d.ts.map +1 -0
- package/dist/esm/src/exception/whatsapp-error.js +11 -0
- package/dist/esm/src/exception/whatsapp-error.js.map +1 -0
- package/dist/esm/src/exception/whatsapp-error.spec.d.ts +3 -0
- package/dist/esm/src/exception/whatsapp-error.spec.d.ts.map +1 -0
- package/dist/esm/src/exception/whatsapp-error.spec.js +22 -0
- package/dist/esm/src/exception/whatsapp-error.spec.js.map +1 -0
- package/dist/esm/src/helper/index.d.ts +2 -0
- package/dist/esm/src/helper/index.d.ts.map +1 -0
- package/dist/esm/src/helper/index.js +2 -0
- package/dist/esm/src/helper/index.js.map +1 -0
- package/dist/esm/src/helper/miscellaneous.d.ts +8 -0
- package/dist/esm/src/helper/miscellaneous.d.ts.map +1 -0
- package/dist/esm/src/helper/miscellaneous.js +38 -0
- package/dist/esm/src/helper/miscellaneous.js.map +1 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.d.ts +4 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.js +35 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.js.map +1 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts +2 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.js +61 -0
- package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.js.map +1 -0
- package/dist/esm/src/helper/pure-function/convert-function.d.ts +4 -0
- package/dist/esm/src/helper/pure-function/convert-function.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/convert-function.js +12 -0
- package/dist/esm/src/helper/pure-function/convert-function.js.map +1 -0
- package/dist/esm/src/helper/pure-function/index.d.ts +5 -0
- package/dist/esm/src/helper/pure-function/index.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/index.js +5 -0
- package/dist/esm/src/helper/pure-function/index.js.map +1 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.d.ts +4 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.js +106 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.js.map +1 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.d.ts +2 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.js +227 -0
- package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.js.map +1 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.d.ts +28 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.js +53 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.js.map +1 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.spec.d.ts +2 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.spec.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.spec.js +99 -0
- package/dist/esm/src/helper/pure-function/room-event-generator.spec.js.map +1 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.d.ts +4 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.js +17 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.js.map +1 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.d.ts +2 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.js +66 -0
- package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.js.map +1 -0
- package/dist/esm/src/helper/pure-function/vcard-parser.d.ts +28 -0
- package/dist/esm/src/helper/pure-function/vcard-parser.d.ts.map +1 -0
- package/dist/esm/src/helper/pure-function/vcard-parser.js +102 -0
- package/dist/esm/src/helper/pure-function/vcard-parser.js.map +1 -0
- package/dist/esm/src/helper/schedule/schedule-manager.d.ts +19 -0
- package/dist/esm/src/helper/schedule/schedule-manager.d.ts.map +1 -0
- package/dist/esm/src/helper/schedule/schedule-manager.js +43 -0
- package/dist/esm/src/helper/schedule/schedule-manager.js.map +1 -0
- package/dist/esm/src/helper/schedule/schedule-manager.spec.d.ts +2 -0
- package/dist/esm/src/helper/schedule/schedule-manager.spec.d.ts.map +1 -0
- package/dist/esm/src/helper/schedule/schedule-manager.spec.js +40 -0
- package/dist/esm/src/helper/schedule/schedule-manager.spec.js.map +1 -0
- package/dist/esm/src/manager-event.d.ts +18 -0
- package/dist/esm/src/manager-event.d.ts.map +1 -0
- package/dist/esm/src/manager-event.js +2 -0
- package/dist/esm/src/manager-event.js.map +1 -0
- package/dist/esm/src/manager.d.ts +67 -0
- package/dist/esm/src/manager.d.ts.map +1 -0
- package/dist/esm/src/manager.js +264 -0
- package/dist/esm/src/manager.js.map +1 -0
- package/dist/esm/src/manager.spec.d.ts +3 -0
- package/dist/esm/src/manager.spec.d.ts.map +1 -0
- package/dist/esm/src/manager.spec.js +33 -0
- package/dist/esm/src/manager.spec.js.map +1 -0
- package/dist/esm/src/mod.d.ts +5 -0
- package/dist/esm/src/mod.d.ts.map +1 -0
- package/dist/esm/src/mod.js +5 -0
- package/dist/esm/src/mod.js.map +1 -0
- package/dist/esm/src/package-json.d.ts +6 -0
- package/dist/esm/src/package-json.d.ts.map +1 -0
- package/dist/esm/src/package-json.js +90 -0
- package/dist/esm/src/package-json.js.map +1 -0
- package/dist/esm/src/package-json.spec.d.ts +3 -0
- package/dist/esm/src/package-json.spec.d.ts.map +1 -0
- package/dist/esm/src/package-json.spec.js +8 -0
- package/dist/esm/src/package-json.spec.js.map +1 -0
- package/dist/esm/src/puppet-mixin/contact-self.d.ts +5 -0
- package/dist/esm/src/puppet-mixin/contact-self.d.ts.map +1 -0
- package/dist/esm/src/puppet-mixin/contact-self.js +16 -0
- package/dist/esm/src/puppet-mixin/contact-self.js.map +1 -0
- package/dist/esm/src/puppet-mixin/contact.d.ts +16 -0
- package/dist/esm/src/puppet-mixin/contact.d.ts.map +1 -0
- package/dist/esm/src/puppet-mixin/contact.js +87 -0
- package/dist/esm/src/puppet-mixin/contact.js.map +1 -0
- package/dist/esm/src/puppet-mixin/conversation.d.ts +2 -0
- package/dist/esm/src/puppet-mixin/conversation.d.ts.map +1 -0
- package/dist/esm/src/puppet-mixin/conversation.js +8 -0
- package/dist/esm/src/puppet-mixin/conversation.js.map +1 -0
- package/dist/esm/src/puppet-mixin/friendship.d.ts +12 -0
- package/dist/esm/src/puppet-mixin/friendship.d.ts.map +1 -0
- package/dist/esm/src/puppet-mixin/friendship.js +63 -0
- package/dist/esm/src/puppet-mixin/friendship.js.map +1 -0
- package/dist/esm/src/puppet-mixin/message.d.ts +57 -0
- package/dist/esm/src/puppet-mixin/message.d.ts.map +1 -0
- package/dist/esm/src/puppet-mixin/message.js +282 -0
- package/dist/esm/src/puppet-mixin/message.js.map +1 -0
- package/dist/esm/src/puppet-mixin/room.d.ts +42 -0
- package/dist/esm/src/puppet-mixin/room.d.ts.map +1 -0
- package/dist/esm/src/puppet-mixin/room.js +273 -0
- package/dist/esm/src/puppet-mixin/room.js.map +1 -0
- package/dist/esm/src/puppet-mixin/tag.d.ts +5 -0
- package/dist/esm/src/puppet-mixin/tag.d.ts.map +1 -0
- package/dist/esm/src/puppet-mixin/tag.js +20 -0
- package/dist/esm/src/puppet-mixin/tag.js.map +1 -0
- package/dist/esm/src/puppet-whatsapp.d.ts +145 -0
- package/dist/esm/src/puppet-whatsapp.d.ts.map +1 -0
- package/dist/esm/src/puppet-whatsapp.js +280 -0
- package/dist/esm/src/puppet-whatsapp.js.map +1 -0
- package/dist/esm/src/puppet-whatsapp.spec.d.ts +3 -0
- package/dist/esm/src/puppet-whatsapp.spec.d.ts.map +1 -0
- package/dist/esm/src/puppet-whatsapp.spec.js +23 -0
- package/dist/esm/src/puppet-whatsapp.spec.js.map +1 -0
- package/dist/esm/src/request/rate-manager.d.ts +21 -0
- package/dist/esm/src/request/rate-manager.d.ts.map +1 -0
- package/dist/esm/src/request/rate-manager.js +85 -0
- package/dist/esm/src/request/rate-manager.js.map +1 -0
- package/dist/esm/src/request/request-manager.d.ts +54 -0
- package/dist/esm/src/request/request-manager.d.ts.map +1 -0
- package/dist/esm/src/request/request-manager.js +124 -0
- package/dist/esm/src/request/request-manager.js.map +1 -0
- package/dist/esm/src/request/request-pool.d.ts +10 -0
- package/dist/esm/src/request/request-pool.d.ts.map +1 -0
- package/dist/esm/src/request/request-pool.js +40 -0
- package/dist/esm/src/request/request-pool.js.map +1 -0
- package/dist/esm/src/request/request-pool.spec.d.ts +2 -0
- package/dist/esm/src/request/request-pool.spec.d.ts.map +1 -0
- package/dist/esm/src/request/request-pool.spec.js +34 -0
- package/dist/esm/src/request/request-pool.spec.js.map +1 -0
- package/dist/esm/src/schema/event-name.d.ts +9 -0
- package/dist/esm/src/schema/event-name.d.ts.map +1 -0
- package/dist/esm/src/schema/event-name.js +10 -0
- package/dist/esm/src/schema/event-name.js.map +1 -0
- package/dist/esm/src/schema/index.d.ts +2 -0
- package/dist/esm/src/schema/index.d.ts.map +1 -0
- package/dist/esm/src/schema/index.js +2 -0
- package/dist/esm/src/schema/index.js.map +1 -0
- package/dist/esm/src/schema/whatsapp-interface.d.ts +18 -0
- package/dist/esm/src/schema/whatsapp-interface.d.ts.map +1 -0
- package/dist/esm/src/schema/whatsapp-interface.js +20 -0
- package/dist/esm/src/schema/whatsapp-interface.js.map +1 -0
- package/dist/esm/src/schema/whatsapp-type.d.ts +42 -0
- package/dist/esm/src/schema/whatsapp-type.d.ts.map +1 -0
- package/dist/esm/src/schema/whatsapp-type.js +2 -0
- package/dist/esm/src/schema/whatsapp-type.js.map +1 -0
- package/dist/esm/src/whatsapp/event-handler/group-event-handler.d.ts +8 -0
- package/dist/esm/src/whatsapp/event-handler/group-event-handler.d.ts.map +1 -0
- package/dist/esm/src/whatsapp/event-handler/group-event-handler.js +78 -0
- package/dist/esm/src/whatsapp/event-handler/group-event-handler.js.map +1 -0
- package/dist/esm/src/whatsapp/event-handler/login-event-handler.d.ts +24 -0
- package/dist/esm/src/whatsapp/event-handler/login-event-handler.d.ts.map +1 -0
- package/dist/esm/src/whatsapp/event-handler/login-event-handler.js +174 -0
- package/dist/esm/src/whatsapp/event-handler/login-event-handler.js.map +1 -0
- package/dist/esm/src/whatsapp/event-handler/message-event-handler.d.ts +35 -0
- package/dist/esm/src/whatsapp/event-handler/message-event-handler.d.ts.map +1 -0
- package/dist/esm/src/whatsapp/event-handler/message-event-handler.js +197 -0
- package/dist/esm/src/whatsapp/event-handler/message-event-handler.js.map +1 -0
- package/dist/esm/src/whatsapp/whatsapp-base.d.ts +26 -0
- package/dist/esm/src/whatsapp/whatsapp-base.d.ts.map +1 -0
- package/dist/esm/src/whatsapp/whatsapp-base.js +63 -0
- package/dist/esm/src/whatsapp/whatsapp-base.js.map +1 -0
- package/dist/esm/src/whatsapp/whatsapp-manager.d.ts +16 -0
- package/dist/esm/src/whatsapp/whatsapp-manager.d.ts.map +1 -0
- package/dist/esm/src/whatsapp/whatsapp-manager.js +128 -0
- package/dist/esm/src/whatsapp/whatsapp-manager.js.map +1 -0
- package/dist/esm/tests/integration.spec.d.ts +3 -0
- package/dist/esm/tests/integration.spec.d.ts.map +1 -0
- package/dist/esm/tests/integration.spec.js +6 -0
- package/dist/esm/tests/integration.spec.js.map +1 -0
- package/dist/esm/tests/memory-card.spec.d.ts +2 -0
- package/dist/esm/tests/memory-card.spec.d.ts.map +1 -0
- package/dist/esm/tests/memory-card.spec.js +23 -0
- package/dist/esm/tests/memory-card.spec.js.map +1 -0
- package/dist/esm/tests/qrcode.spec.d.ts +2 -0
- package/dist/esm/tests/qrcode.spec.d.ts.map +1 -0
- package/dist/esm/tests/qrcode.spec.js +26 -0
- package/dist/esm/tests/qrcode.spec.js.map +1 -0
- package/package.json +89 -0
- package/src/config.ts +70 -0
- package/src/data/cache-manager.spec.ts +33 -0
- package/src/data/cache-manager.ts +331 -0
- package/src/exception/error-type.ts +59 -0
- package/src/exception/whatsapp-error.spec.ts +26 -0
- package/src/exception/whatsapp-error.ts +15 -0
- package/src/helper/index.ts +3 -0
- package/src/helper/miscellaneous.ts +45 -0
- package/src/helper/pure-function/contact-raw-payload-parser.spec.ts +67 -0
- package/src/helper/pure-function/contact-raw-payload-parser.ts +36 -0
- package/src/helper/pure-function/convert-function.ts +24 -0
- package/src/helper/pure-function/index.ts +4 -0
- package/src/helper/pure-function/message-raw-payload-parser.spec.ts +243 -0
- package/src/helper/pure-function/message-raw-payload-parser.ts +117 -0
- package/src/helper/pure-function/room-event-generator.spec.ts +120 -0
- package/src/helper/pure-function/room-event-generator.ts +63 -0
- package/src/helper/pure-function/room-raw-payload-parser.spec.ts +70 -0
- package/src/helper/pure-function/room-raw-payload-parser.ts +19 -0
- package/src/helper/pure-function/vcard-parser.ts +128 -0
- package/src/helper/schedule/schedule-manager.spec.ts +46 -0
- package/src/helper/schedule/schedule-manager.ts +52 -0
- package/src/manager-event.ts +18 -0
- package/src/manager.spec.ts +40 -0
- package/src/manager.ts +297 -0
- package/src/mod.ts +8 -0
- package/src/package-json.spec.ts +10 -0
- package/src/package-json.ts +93 -0
- package/src/puppet-mixin/contact-self.ts +20 -0
- package/src/puppet-mixin/contact.ts +107 -0
- package/src/puppet-mixin/conversation.ts +12 -0
- package/src/puppet-mixin/friendship.ts +88 -0
- package/src/puppet-mixin/message.ts +311 -0
- package/src/puppet-mixin/room.ts +334 -0
- package/src/puppet-mixin/tag.ts +34 -0
- package/src/puppet-whatsapp.spec.ts +30 -0
- package/src/puppet-whatsapp.ts +339 -0
- package/src/request/rate-manager.ts +118 -0
- package/src/request/request-manager.ts +174 -0
- package/src/request/request-pool.spec.ts +36 -0
- package/src/request/request-pool.ts +45 -0
- package/src/schema/event-name.ts +8 -0
- package/src/schema/fix-type.d.ts +63 -0
- package/src/schema/index.ts +1 -0
- package/src/schema/whatsapp-interface.ts +31 -0
- package/src/schema/whatsapp-type.ts +79 -0
- package/src/typings.d.ts +0 -0
- package/src/whatsapp/event-handler/group-event-handler.ts +95 -0
- package/src/whatsapp/event-handler/login-event-handler.ts +210 -0
- package/src/whatsapp/event-handler/message-event-handler.ts +230 -0
- package/src/whatsapp/whatsapp-base.ts +78 -0
- package/src/whatsapp/whatsapp-manager.ts +160 -0
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* eslint-disable sort-keys */
|
|
2
|
+
|
|
3
|
+
import { test } from 'tstest'
|
|
4
|
+
import { parserRoomRawPayload } from './room-raw-payload-parser.js'
|
|
5
|
+
|
|
6
|
+
test('parse room info', async t => {
|
|
7
|
+
const roomPayload = {
|
|
8
|
+
id: {
|
|
9
|
+
server: 'g.us',
|
|
10
|
+
user: '120363021332004743',
|
|
11
|
+
_serialized: '120363021332004743@g.us',
|
|
12
|
+
},
|
|
13
|
+
number: null,
|
|
14
|
+
isBusiness: false,
|
|
15
|
+
isEnterprise: false,
|
|
16
|
+
labels: [],
|
|
17
|
+
name: '哈哈哈 测试',
|
|
18
|
+
statusMute: false,
|
|
19
|
+
type: 'in',
|
|
20
|
+
isMe: false,
|
|
21
|
+
isUser: false,
|
|
22
|
+
isGroup: true,
|
|
23
|
+
isWAContact: false,
|
|
24
|
+
isMyContact: false,
|
|
25
|
+
isBlocked: false,
|
|
26
|
+
avatar: 'https://pps.whatsapp.net/v/t61.24694-24/259270979_6900708863337894_342691323244398878_n.jpg?ccb=11-4&oh=ceb59735080411ee0ff36834e5ce688b&oe=6222C441',
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const roomChat = {
|
|
30
|
+
groupMetadata: {
|
|
31
|
+
id: {
|
|
32
|
+
server: 'g.us',
|
|
33
|
+
user: '120363021332004743',
|
|
34
|
+
_serialized: '120363021332004743@g.us',
|
|
35
|
+
},
|
|
36
|
+
creation: 1643116497,
|
|
37
|
+
owner: { server: 'c.us', user: '8613812345678', _serialized: '8613812345678@c.us' },
|
|
38
|
+
restrict: false,
|
|
39
|
+
announce: false,
|
|
40
|
+
noFrequentlyForwarded: false,
|
|
41
|
+
ephemeralDuration: 0,
|
|
42
|
+
support: false,
|
|
43
|
+
suspended: false,
|
|
44
|
+
uniqueShortNameMap: {},
|
|
45
|
+
notAddedByContact: false,
|
|
46
|
+
participants: [{ id: { server: 'c.us', user: '8613812345678', _serialized: '8613812345678@c.us' }, isAdmin: true, isSuperAdmin: true }, { id: { server: 'c.us', user: '8613812345679', _serialized: '8613812345679@c.us' }, isAdmin: false, isSuperAdmin: false }, { id: { server: 'c.us', user: '8613812345670', _serialized: '8613812345670@c.us' }, isAdmin: false, isSuperAdmin: false }, { id: { server: 'c.us', user: '8613812345671', _serialized: '8613812345671@c.us' }, isAdmin: false, isSuperAdmin: false }],
|
|
47
|
+
pendingParticipants: [],
|
|
48
|
+
},
|
|
49
|
+
participants: [{ id: { server: 'c.us', user: '8613812345678', _serialized: '8613812345678@c.us' }, isAdmin: true, isSuperAdmin: true }, { id: { server: 'c.us', user: '8613812345679', _serialized: '8613812345679@c.us' }, isAdmin: false, isSuperAdmin: false }, { id: { server: 'c.us', user: '8613812345670', _serialized: '8613812345670@c.us' }, isAdmin: false, isSuperAdmin: false }, { id: { server: 'c.us', user: '8613812345671', _serialized: '8613812345671@c.us' }, isAdmin: false, isSuperAdmin: false }],
|
|
50
|
+
id: { server: 'g.us', user: '120363021332004743', _serialized: '120363021332004743@g.us' },
|
|
51
|
+
name: '哈哈哈 测试',
|
|
52
|
+
isGroup: true,
|
|
53
|
+
isReadOnly: false,
|
|
54
|
+
unreadCount: 0,
|
|
55
|
+
timestamp: 1645128573,
|
|
56
|
+
archived: false,
|
|
57
|
+
pinned: false,
|
|
58
|
+
isMuted: false,
|
|
59
|
+
muteExpiration: 0,
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const result = parserRoomRawPayload(roomPayload as any, roomChat as any)
|
|
63
|
+
console.info(result)
|
|
64
|
+
t.ok(result.topic === '哈哈哈 测试', 'should get correct room topic')
|
|
65
|
+
t.ok(result.adminIdList[0] === '8613812345678@c.us', 'should get correct admin')
|
|
66
|
+
t.ok(result.memberIdList.length === 4, 'should get correct member count')
|
|
67
|
+
t.ok(result.avatar === 'https://pps.whatsapp.net/v/t61.24694-24/259270979_6900708863337894_342691323244398878_n.jpg?ccb=11-4&oh=ceb59735080411ee0ff36834e5ce688b&oe=6222C441', 'should get correct avatar')
|
|
68
|
+
|
|
69
|
+
t.pass('parse room info pass')
|
|
70
|
+
})
|
|
@@ -0,0 +1,19 @@
|
|
|
1
|
+
import type * as PUPPET from '@juzi/wechaty-puppet'
|
|
2
|
+
import { WA_ERROR_TYPE } from '../../exception/error-type.js'
|
|
3
|
+
import WAError from '../../exception/whatsapp-error.js'
|
|
4
|
+
import type { WhatsAppContactPayload as RoomPayload, GroupChat } from '../../schema/whatsapp-type.js'
|
|
5
|
+
|
|
6
|
+
export function parserRoomRawPayload (roomPayload: RoomPayload, roomChat: GroupChat): PUPPET.payloads.Room {
|
|
7
|
+
const roomId = roomPayload.id._serialized
|
|
8
|
+
if (roomChat.participants.length === 0) {
|
|
9
|
+
throw WAError(WA_ERROR_TYPE.ERR_ROOM_NOT_FOUND, `roomRawPayloadParser(${roomId}) can not get chat info for this room.`)
|
|
10
|
+
}
|
|
11
|
+
return {
|
|
12
|
+
adminIdList: roomChat.participants.filter(m => m.isAdmin || m.isSuperAdmin).map(m => m.id._serialized),
|
|
13
|
+
avatar: roomPayload.avatar,
|
|
14
|
+
id: roomId,
|
|
15
|
+
memberIdList: roomChat.participants.map(m => m.id._serialized),
|
|
16
|
+
ownerId: roomChat.owner?._serialized,
|
|
17
|
+
topic: roomPayload.name || roomPayload.pushname || '',
|
|
18
|
+
}
|
|
19
|
+
}
|
|
@@ -0,0 +1,128 @@
|
|
|
1
|
+
import { log } from '../../config.js'
|
|
2
|
+
import { WA_ERROR_TYPE } from '../../exception/error-type.js'
|
|
3
|
+
import WAError from '../../exception/whatsapp-error.js'
|
|
4
|
+
|
|
5
|
+
const PRE = 'VCARD_PARSER'
|
|
6
|
+
export interface IVcard {
|
|
7
|
+
/**
|
|
8
|
+
* VERSION: X.X
|
|
9
|
+
*/
|
|
10
|
+
version: string;
|
|
11
|
+
/**
|
|
12
|
+
* N, name
|
|
13
|
+
*/
|
|
14
|
+
N?: string[];
|
|
15
|
+
/**
|
|
16
|
+
* FN, Full name
|
|
17
|
+
*/
|
|
18
|
+
FN?: string;
|
|
19
|
+
/**
|
|
20
|
+
* item1.TEL field
|
|
21
|
+
*/
|
|
22
|
+
TEL?: {
|
|
23
|
+
waid: string;
|
|
24
|
+
phone: string;
|
|
25
|
+
}[];
|
|
26
|
+
[k: string]: any;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
const VersionPattern = /VERSION:(\d+\.\d*)$/m
|
|
30
|
+
const CheckItermTelPattern = /^(item\d\.TEL|TEL;)/i
|
|
31
|
+
const TelPatternForContainOnePhoneNumber = /waid=(\d*):([+ \d]*)$/m
|
|
32
|
+
const TelPatternForContainMultiPhoneNumbers = /[+ \d]*$/m
|
|
33
|
+
|
|
34
|
+
/*
|
|
35
|
+
# Case 1: One phone number in card body from ANDROID
|
|
36
|
+
BEGIN:VCARD
|
|
37
|
+
VERSION:3.0
|
|
38
|
+
N:;[name];;;
|
|
39
|
+
FN:[name]
|
|
40
|
+
item1.TEL;waid=[waid]:[phone]
|
|
41
|
+
item1.X-ABLabel:WhatsApp | 手机 | 公费电话
|
|
42
|
+
END:VCARD
|
|
43
|
+
|
|
44
|
+
# Case 2: One phone number in card body from IOS
|
|
45
|
+
BEGIN:VCARD
|
|
46
|
+
VERSION:3.0
|
|
47
|
+
N:🐉;socialbear;;;
|
|
48
|
+
FN:socialbear 🐉
|
|
49
|
+
TEL;type=CELL;type=VOICE;waid=8613240330438:+86 132 4033 0438
|
|
50
|
+
END:VCARD
|
|
51
|
+
|
|
52
|
+
# Case 3: Multi phone numbers in card body
|
|
53
|
+
BEGIN:VCARD
|
|
54
|
+
VERSION:3.0
|
|
55
|
+
N:;[name];;;
|
|
56
|
+
FN:[name]
|
|
57
|
+
item1.TEL;[phone]
|
|
58
|
+
item1.X-ABLabel:WhatsApp | 手机 | 公费电话
|
|
59
|
+
END:VCARD
|
|
60
|
+
|
|
61
|
+
For more detail, see: https://github.com/wechaty/puppet-whatsapp/issues/136#issuecomment-1032388884
|
|
62
|
+
*/
|
|
63
|
+
|
|
64
|
+
/**
|
|
65
|
+
* parse vcard body
|
|
66
|
+
* @param body vcard body string
|
|
67
|
+
*/
|
|
68
|
+
export function parseVcard (body: string): IVcard {
|
|
69
|
+
const lines = body.split('\n')
|
|
70
|
+
// vcard body must be at least 3 lines, 'BEGIN', 'VERSION' and 'END'
|
|
71
|
+
if (lines.length < 2) {
|
|
72
|
+
throw WAError(WA_ERROR_TYPE.ERR_MSG_CONTACT, `Invalid Vcard body: invalid length, detail: ${body}`)
|
|
73
|
+
}
|
|
74
|
+
if (lines[0] !== 'BEGIN:VCARD') {
|
|
75
|
+
throw WAError(WA_ERROR_TYPE.ERR_MSG_CONTACT, `Invalid Vcard body: begin not found, detail: ${body}`)
|
|
76
|
+
}
|
|
77
|
+
|
|
78
|
+
const versionMatch = VersionPattern.exec(lines[1]!)
|
|
79
|
+
if (!versionMatch) {
|
|
80
|
+
throw WAError(WA_ERROR_TYPE.ERR_MSG_CONTACT, `Invalid Vcard body: version field not found, detail: ${body}`)
|
|
81
|
+
}
|
|
82
|
+
const result: IVcard = {
|
|
83
|
+
TEL: [],
|
|
84
|
+
version: versionMatch[1]!,
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
// skip BEGIN and VERSION filed
|
|
88
|
+
for (let i = 2; i < lines.length; i++) {
|
|
89
|
+
const content = lines[i]!
|
|
90
|
+
if (content.startsWith('N:')) {
|
|
91
|
+
result.N = content.replace('N:', '').split(';').filter(v => !!v)
|
|
92
|
+
} else if (content.startsWith('FN:')) {
|
|
93
|
+
result.FN = content.replace('FN:', '')
|
|
94
|
+
} else if (CheckItermTelPattern.test(content)) {
|
|
95
|
+
if (content.includes('waid')) {
|
|
96
|
+
const match = TelPatternForContainOnePhoneNumber.exec(content)
|
|
97
|
+
if (match) {
|
|
98
|
+
result.TEL!.push({
|
|
99
|
+
phone: match[2]!,
|
|
100
|
+
waid: `${match[1]}@c.us`,
|
|
101
|
+
})
|
|
102
|
+
}
|
|
103
|
+
} else {
|
|
104
|
+
const match = TelPatternForContainMultiPhoneNumbers.exec(content)
|
|
105
|
+
log.verbose(PRE, `match: ${JSON.stringify(match)}`)
|
|
106
|
+
if (match) {
|
|
107
|
+
result.TEL!.push({
|
|
108
|
+
phone: match[0]!,
|
|
109
|
+
waid: `${extractContactIdFromPhoneNumber(match[0]!)}@c.us`,
|
|
110
|
+
})
|
|
111
|
+
}
|
|
112
|
+
}
|
|
113
|
+
} else if (content === 'END:VCARD') {
|
|
114
|
+
break
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
if (result.TEL!.length !== 1) {
|
|
119
|
+
log.error(PRE, `This card contains more than 1 phone number, detail: ${JSON.stringify(result.TEL)}`)
|
|
120
|
+
throw WAError(WA_ERROR_TYPE.ERR_MSG_CONTACT, `This card contains more than 1 phone number, detail: ${JSON.stringify(result.TEL)}`)
|
|
121
|
+
}
|
|
122
|
+
|
|
123
|
+
return result
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
function extractContactIdFromPhoneNumber (phone: string) {
|
|
127
|
+
return phone.replace(/\+|\s/g, '')
|
|
128
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
import ScheduleManager from './schedule-manager.js'
|
|
2
|
+
import { test } from 'tstest'
|
|
3
|
+
import { Job } from 'node-schedule'
|
|
4
|
+
|
|
5
|
+
test('scheduleManager task add and remove test', async t => {
|
|
6
|
+
try {
|
|
7
|
+
const scheduleManager = ScheduleManager.Instance
|
|
8
|
+
t.ok(scheduleManager instanceof ScheduleManager)
|
|
9
|
+
|
|
10
|
+
const task = scheduleManager.addScheduledTask('42 * * * *', () => {
|
|
11
|
+
console.info('The answer to life, the universe, and everything!')
|
|
12
|
+
})
|
|
13
|
+
t.ok(task instanceof Job)
|
|
14
|
+
|
|
15
|
+
scheduleManager.removeScheduledTask(task)
|
|
16
|
+
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition
|
|
17
|
+
t.ok(task.nextInvocation() === null)
|
|
18
|
+
scheduleManager.clearAllTasks()
|
|
19
|
+
|
|
20
|
+
t.pass('scheduleManager add and remove test pass.')
|
|
21
|
+
|
|
22
|
+
} catch (e) {
|
|
23
|
+
t.fail(e as any)
|
|
24
|
+
}
|
|
25
|
+
})
|
|
26
|
+
|
|
27
|
+
test('scheduleManager task add and clear test', async t => {
|
|
28
|
+
try {
|
|
29
|
+
const scheduleManager = ScheduleManager.Instance
|
|
30
|
+
t.ok(scheduleManager instanceof ScheduleManager)
|
|
31
|
+
|
|
32
|
+
const task = scheduleManager.addScheduledTask('42 * * * *', () => {
|
|
33
|
+
console.info('The answer to life, the universe, and everything!')
|
|
34
|
+
})
|
|
35
|
+
t.ok(task instanceof Job)
|
|
36
|
+
|
|
37
|
+
scheduleManager.clearAllTasks()
|
|
38
|
+
// @ts-ignore
|
|
39
|
+
const taskCount = scheduleManager.jobPool.length
|
|
40
|
+
t.ok(taskCount === 0)
|
|
41
|
+
t.pass('scheduleManager add and clear test pass.')
|
|
42
|
+
|
|
43
|
+
} catch (e) {
|
|
44
|
+
t.fail(e as any)
|
|
45
|
+
}
|
|
46
|
+
})
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
import schedule, { Job, JobCallback, RecurrenceRule, RecurrenceSpecDateRange, RecurrenceSpecObjLit } from 'node-schedule'
|
|
2
|
+
import { log } from '../../config.js'
|
|
3
|
+
|
|
4
|
+
const PRE = 'ScheduleManager'
|
|
5
|
+
|
|
6
|
+
type ScheduleRule = RecurrenceRule | RecurrenceSpecDateRange | RecurrenceSpecObjLit | Date | string | number
|
|
7
|
+
|
|
8
|
+
export default class ScheduleManager {
|
|
9
|
+
|
|
10
|
+
private static _instance?: ScheduleManager
|
|
11
|
+
private jobPool :Job[] = []
|
|
12
|
+
|
|
13
|
+
private constructor () {}
|
|
14
|
+
|
|
15
|
+
public static get Instance () {
|
|
16
|
+
if (!this._instance) {
|
|
17
|
+
this._instance = new ScheduleManager()
|
|
18
|
+
}
|
|
19
|
+
return this._instance
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
/**
|
|
23
|
+
* Create a schedule job.
|
|
24
|
+
*
|
|
25
|
+
* @param rule scheduling info, ref: https://github.com/node-schedule/node-schedule#cron-style-scheduling
|
|
26
|
+
* @param callback callback to be executed on each invocation
|
|
27
|
+
*/
|
|
28
|
+
public addScheduledTask (rule: ScheduleRule, callback: JobCallback): Job {
|
|
29
|
+
log.silly(PRE, 'addScheduledTask()')
|
|
30
|
+
const job = schedule.scheduleJob(rule, callback)
|
|
31
|
+
this.jobPool.push(job)
|
|
32
|
+
return job
|
|
33
|
+
}
|
|
34
|
+
|
|
35
|
+
public removeScheduledTask (job: Job): boolean {
|
|
36
|
+
log.silly(PRE, 'removeScheduledTask()')
|
|
37
|
+
const jobIndex = this.jobPool.indexOf(job)
|
|
38
|
+
if (jobIndex === -1) {
|
|
39
|
+
log.warn(PRE, 'trying to cannel a job not in jobPool')
|
|
40
|
+
} else {
|
|
41
|
+
this.jobPool.splice(jobIndex, 1)
|
|
42
|
+
}
|
|
43
|
+
return job.cancel()
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
public clearAllTasks () {
|
|
47
|
+
log.silly(PRE, 'clearAllTasks()')
|
|
48
|
+
this.jobPool.map(job => job.cancel())
|
|
49
|
+
this.jobPool = []
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type * as PUPPET from '@juzi/wechaty-puppet'
|
|
2
|
+
|
|
3
|
+
export type ManagerEvents = {
|
|
4
|
+
'message': (payload: PUPPET.payloads.EventMessage) => any,
|
|
5
|
+
'room-join': (payload: PUPPET.payloads.EventRoomJoin) => any,
|
|
6
|
+
'room-leave': (payload: PUPPET.payloads.EventRoomLeave) => any,
|
|
7
|
+
'room-topic': (payload: PUPPET.payloads.EventRoomTopic) => any,
|
|
8
|
+
'room-invite': (payload: PUPPET.payloads.EventRoomInvite) => any,
|
|
9
|
+
'scan': (payload: PUPPET.payloads.EventScan) => any,
|
|
10
|
+
'login': (userId: string) => any,
|
|
11
|
+
'logout': (userId: string, message: string) => any,
|
|
12
|
+
'friendship': (payload: PUPPET.payloads.EventFriendship) => any,
|
|
13
|
+
'reset': (reason: string) => any,
|
|
14
|
+
'error': (error: string) => any,
|
|
15
|
+
'heartbeat': (data: string) => any,
|
|
16
|
+
'ready': () => any,
|
|
17
|
+
'dirty': (payload: PUPPET.payloads.EventDirty) => any
|
|
18
|
+
};
|
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
#!/usr/bin/env node --no-warnings --loader ts-node/esm
|
|
2
|
+
|
|
3
|
+
import { test } from 'tstest'
|
|
4
|
+
import Manager from './manager.js'
|
|
5
|
+
|
|
6
|
+
function genTimestamp () {
|
|
7
|
+
return Math.floor(Date.now() / 1000) - 2 * 24 * 3600 - Math.floor(Math.random() * 10000)
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
const fakeMsgListWithin3Days = Array(10).fill({ timestamp: genTimestamp() }) as any
|
|
11
|
+
|
|
12
|
+
const fakeMsgListOver3Days = [
|
|
13
|
+
Array(10).fill({ timestamp: 1644823352 }),
|
|
14
|
+
...fakeMsgListWithin3Days,
|
|
15
|
+
] as any
|
|
16
|
+
|
|
17
|
+
const contactId = 'fake_contact_id'
|
|
18
|
+
|
|
19
|
+
class ManagerTest extends Manager {
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
test('filterFetchedMessages within 3 days', async t => {
|
|
23
|
+
const manager = new ManagerTest({})
|
|
24
|
+
await manager.initCache(contactId)
|
|
25
|
+
// @ts-ignore
|
|
26
|
+
const list = await manager.filterFetchedMessages(contactId, fakeMsgListWithin3Days)
|
|
27
|
+
t.ok(list.length === fakeMsgListWithin3Days.length)
|
|
28
|
+
await manager.releaseCache()
|
|
29
|
+
t.pass('filterFetchedMessages within 3 days pass')
|
|
30
|
+
})
|
|
31
|
+
|
|
32
|
+
test('filterFetchedMessages within 5 days', async t => {
|
|
33
|
+
const manager = new ManagerTest({})
|
|
34
|
+
await manager.initCache(contactId)
|
|
35
|
+
// @ts-ignore
|
|
36
|
+
const list = await manager.filterFetchedMessages(contactId, fakeMsgListOver3Days)
|
|
37
|
+
t.ok(list.length === fakeMsgListWithin3Days.length)
|
|
38
|
+
await manager.releaseCache()
|
|
39
|
+
t.pass('filterFetchedMessages within 5 days pass')
|
|
40
|
+
})
|
package/src/manager.ts
ADDED
|
@@ -0,0 +1,297 @@
|
|
|
1
|
+
import { EventEmitter as EE } from 'ee-ts'
|
|
2
|
+
import type { MemoryCard } from '@juzi/wechaty-puppet/dist/esm/src/config'
|
|
3
|
+
import { log, MAX_HEARTBEAT_MISSED, MEMORY_SLOT } from './config.js'
|
|
4
|
+
import { CacheManager } from './data/cache-manager.js'
|
|
5
|
+
import { WA_ERROR_TYPE } from './exception/error-type.js'
|
|
6
|
+
import WAError from './exception/whatsapp-error.js'
|
|
7
|
+
import { batchProcess, getMaxTimestampForLoadHistoryMessages, isRoomId, sleep } from './helper/miscellaneous.js'
|
|
8
|
+
import ScheduleManager from './helper/schedule/schedule-manager.js'
|
|
9
|
+
import type { ManagerEvents } from './manager-event.js'
|
|
10
|
+
import type { PuppetWhatsAppOptions } from './puppet-whatsapp.js'
|
|
11
|
+
import { RequestManager, requestManagerKeys } from './request/request-manager.js'
|
|
12
|
+
import { MessageAck } from './schema/whatsapp-interface.js'
|
|
13
|
+
import type { GroupChat, WhatsAppContact, WhatsAppMessage } from './schema/whatsapp-type.js'
|
|
14
|
+
import WhatsAppManager from './whatsapp/whatsapp-manager.js'
|
|
15
|
+
|
|
16
|
+
const PRE = 'Manager'
|
|
17
|
+
|
|
18
|
+
export default class Manager extends EE<ManagerEvents> {
|
|
19
|
+
|
|
20
|
+
public whatsAppManager: WhatsAppManager
|
|
21
|
+
private cacheManager?: CacheManager
|
|
22
|
+
private _requestManager?: RequestManager
|
|
23
|
+
private scheduleManager: ScheduleManager
|
|
24
|
+
private memory?: MemoryCard
|
|
25
|
+
|
|
26
|
+
private fetchingMessages: boolean = false
|
|
27
|
+
private heartbeatTimer?: NodeJS.Timer
|
|
28
|
+
|
|
29
|
+
constructor (private options: PuppetWhatsAppOptions) {
|
|
30
|
+
super()
|
|
31
|
+
this.whatsAppManager = new WhatsAppManager(this)
|
|
32
|
+
this.scheduleManager = ScheduleManager.Instance
|
|
33
|
+
|
|
34
|
+
this.whatsAppManager.on({
|
|
35
|
+
friendship: data => this.emit('friendship', data),
|
|
36
|
+
login: data => this.emit('login', data),
|
|
37
|
+
logout: (botId, data) => this.emit('logout', botId, data),
|
|
38
|
+
message: data => this.emit('message', data),
|
|
39
|
+
ready: () => this.emit('ready'),
|
|
40
|
+
'room-invite': data => this.emit('room-invite', data),
|
|
41
|
+
'room-join': data => this.emit('room-join', data),
|
|
42
|
+
'room-leave': data => this.emit('room-leave', data),
|
|
43
|
+
'room-topic': data => this.emit('room-topic', data),
|
|
44
|
+
scan: data => this.emit('scan', data),
|
|
45
|
+
})
|
|
46
|
+
|
|
47
|
+
return new Proxy(this, {
|
|
48
|
+
get: (target: Manager, prop: keyof Manager & keyof RequestManager) => {
|
|
49
|
+
return requestManagerKeys.indexOf(prop) > -1 ? (target.requestManager[prop] as Function).bind(target.requestManager) : target[prop]
|
|
50
|
+
},
|
|
51
|
+
})
|
|
52
|
+
}
|
|
53
|
+
|
|
54
|
+
getMemory (): MemoryCard {
|
|
55
|
+
if (this.memory) {
|
|
56
|
+
return this.memory
|
|
57
|
+
} else {
|
|
58
|
+
throw WAError(WA_ERROR_TYPE.ERR_INIT, 'No Memory')
|
|
59
|
+
}
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
/**
|
|
63
|
+
* Lifecycle
|
|
64
|
+
*/
|
|
65
|
+
|
|
66
|
+
public async start (memory?: MemoryCard) {
|
|
67
|
+
if (memory) {
|
|
68
|
+
this.memory = memory
|
|
69
|
+
}
|
|
70
|
+
const session = await this.getMemory().get(MEMORY_SLOT)
|
|
71
|
+
log.verbose(PRE, 'start()')
|
|
72
|
+
const whatsAppClient = await this.whatsAppManager.genWhatsAppClient(this.options['puppeteerOptions'], session)
|
|
73
|
+
try {
|
|
74
|
+
await this.whatsAppManager.initWhatsAppEvents()
|
|
75
|
+
await this.whatsAppManager.initWhatsAppClient()
|
|
76
|
+
} catch (error) {
|
|
77
|
+
log.error(PRE, `start() error message: ${(error as Error).stack}`)
|
|
78
|
+
await sleep(2 * 1000)
|
|
79
|
+
await this.start(session)
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
this._requestManager = new RequestManager(whatsAppClient)
|
|
83
|
+
this.startHeartbeat()
|
|
84
|
+
return whatsAppClient
|
|
85
|
+
}
|
|
86
|
+
|
|
87
|
+
public async stop () {
|
|
88
|
+
log.verbose(PRE, 'stop()')
|
|
89
|
+
await this.whatsAppManager.stop()
|
|
90
|
+
await this.releaseCache()
|
|
91
|
+
this._requestManager = undefined
|
|
92
|
+
|
|
93
|
+
this.stopHeartbeat()
|
|
94
|
+
}
|
|
95
|
+
|
|
96
|
+
public get requestManager () {
|
|
97
|
+
if (!this._requestManager) {
|
|
98
|
+
throw WAError(WA_ERROR_TYPE.ERR_INIT, 'No request manager')
|
|
99
|
+
}
|
|
100
|
+
return this._requestManager
|
|
101
|
+
}
|
|
102
|
+
|
|
103
|
+
public getWhatsAppClient () {
|
|
104
|
+
return this.whatsAppManager.getWhatsAppClient()
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
/**
|
|
108
|
+
* LOGIC METHODS
|
|
109
|
+
*/
|
|
110
|
+
|
|
111
|
+
/**
|
|
112
|
+
* Fetch history messages of contact or room, and then call onMessage method to emit them or not.
|
|
113
|
+
* @param {WhatsAppContact} contactOrRoom contact or room instance
|
|
114
|
+
*/
|
|
115
|
+
public async processHistoryMessages (contactOrRoom: WhatsAppContact) {
|
|
116
|
+
if (this.fetchingMessages) {
|
|
117
|
+
return
|
|
118
|
+
}
|
|
119
|
+
this.fetchingMessages = true
|
|
120
|
+
const fetchedMessageList = await this.fetchMessages(contactOrRoom)
|
|
121
|
+
const filteredMessageList = await this.filterFetchedMessages(contactOrRoom.id._serialized, fetchedMessageList)
|
|
122
|
+
await this.processFetchedMessages(filteredMessageList)
|
|
123
|
+
this.fetchingMessages = false
|
|
124
|
+
}
|
|
125
|
+
|
|
126
|
+
private async fetchMessages (contactOrRoom: WhatsAppContact) {
|
|
127
|
+
if (contactOrRoom.isMe) {
|
|
128
|
+
// can not get chat for bot self
|
|
129
|
+
return []
|
|
130
|
+
}
|
|
131
|
+
const chat = await contactOrRoom.getChat()
|
|
132
|
+
const messageList = await chat.fetchMessages({})
|
|
133
|
+
return messageList
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
private async filterFetchedMessages (contactOrRoomId: string, messageList: WhatsAppMessage[]) {
|
|
137
|
+
const cacheManager = await this.getCacheManager()
|
|
138
|
+
const maxTimestampForLoadHistoryMessages = getMaxTimestampForLoadHistoryMessages()
|
|
139
|
+
const latestTimestampInCache = await cacheManager.getLatestMessageTimestampForChat(contactOrRoomId)
|
|
140
|
+
const minTimestamp = Math.min(latestTimestampInCache, maxTimestampForLoadHistoryMessages)
|
|
141
|
+
try {
|
|
142
|
+
const _messageList = messageList.filter(m => m.timestamp >= minTimestamp)
|
|
143
|
+
const latestMessageTimestamp = _messageList[_messageList.length - 1]?.timestamp
|
|
144
|
+
if (latestMessageTimestamp) {
|
|
145
|
+
await cacheManager.setLatestMessageTimestampForChat(contactOrRoomId, latestMessageTimestamp)
|
|
146
|
+
}
|
|
147
|
+
return _messageList
|
|
148
|
+
} catch (error) {
|
|
149
|
+
log.error(PRE, `filterFetchedMessages error: ${(error as Error).message}`)
|
|
150
|
+
return []
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
private async processFetchedMessages (messageList: WhatsAppMessage[]) {
|
|
155
|
+
const batchSize = 50
|
|
156
|
+
await batchProcess(batchSize, messageList, async (message: WhatsAppMessage) => {
|
|
157
|
+
if (message.ack === MessageAck.ACK_DEVICE || message.ack === MessageAck.ACK_READ) {
|
|
158
|
+
await this.processMessage(message)
|
|
159
|
+
}
|
|
160
|
+
})
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
public async getRoomChatById (roomId: string) {
|
|
164
|
+
if (isRoomId(roomId)) {
|
|
165
|
+
const roomChat = await this.requestManager.getChatById(roomId)
|
|
166
|
+
return roomChat as GroupChat
|
|
167
|
+
} else {
|
|
168
|
+
throw WAError(WA_ERROR_TYPE.ERR_GROUP_OR_CONTACT_ID, `The roomId: ${roomId} is not right.`)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
/**
|
|
173
|
+
* Get member id list from web api
|
|
174
|
+
* @param { PuppetWhatsApp } this whatsapp client
|
|
175
|
+
* @param { string } roomId roomId
|
|
176
|
+
* @returns { string[] } member id list
|
|
177
|
+
*/
|
|
178
|
+
public async syncRoomMemberList (roomId: string): Promise<string[]> {
|
|
179
|
+
const roomChat = await this.getRoomChatById(roomId)
|
|
180
|
+
// FIXME: How to deal with pendingParticipants? Maybe we should find which case could has this attribute.
|
|
181
|
+
const memberIdList = roomChat.participants.map(m => m.id._serialized)
|
|
182
|
+
const cacheManager = await this.getCacheManager()
|
|
183
|
+
await cacheManager.setRoomMemberIdList(roomId, memberIdList)
|
|
184
|
+
return memberIdList
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
public async syncContactOrRoomList () {
|
|
188
|
+
const whatsapp = this.getWhatsAppClient()
|
|
189
|
+
const contactList: WhatsAppContact[] = await whatsapp.getContacts()
|
|
190
|
+
const contactOrRoomList = contactList.filter(c => c.id.server !== 'broadcast' && c.id._serialized !== '0@c.us')
|
|
191
|
+
return contactOrRoomList
|
|
192
|
+
}
|
|
193
|
+
|
|
194
|
+
public async processMessage (message: WhatsAppMessage) {
|
|
195
|
+
log.silly(PRE, `processMessage(${message})`)
|
|
196
|
+
await this.whatsAppManager.getMessageEventHandler().onMessage(message)
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* Cache Section
|
|
201
|
+
*/
|
|
202
|
+
|
|
203
|
+
public async initCache (userId: string) {
|
|
204
|
+
log.verbose(PRE, `initCache(${userId})`)
|
|
205
|
+
if (this.cacheManager) {
|
|
206
|
+
log.warn(PRE, 'initCache() already initialized, skip the init...')
|
|
207
|
+
return
|
|
208
|
+
}
|
|
209
|
+
await CacheManager.init(userId)
|
|
210
|
+
this.cacheManager = CacheManager.Instance
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
public async releaseCache () {
|
|
214
|
+
log.verbose(PRE, 'releaseCache()')
|
|
215
|
+
if (this.cacheManager) {
|
|
216
|
+
log.warn(PRE, 'releaseCache() already initialized, skip the init...')
|
|
217
|
+
return
|
|
218
|
+
}
|
|
219
|
+
await CacheManager.release()
|
|
220
|
+
}
|
|
221
|
+
|
|
222
|
+
public async getCacheManager () {
|
|
223
|
+
if (!this.cacheManager) {
|
|
224
|
+
throw WAError(WA_ERROR_TYPE.ERR_INIT, 'no cache manager')
|
|
225
|
+
}
|
|
226
|
+
return this.cacheManager
|
|
227
|
+
}
|
|
228
|
+
|
|
229
|
+
/**
|
|
230
|
+
* Schedule
|
|
231
|
+
*/
|
|
232
|
+
|
|
233
|
+
public startSchedule () {
|
|
234
|
+
this.scheduleManager.addScheduledTask('0 */2 * * * *', async () => {
|
|
235
|
+
log.silly(PRE, 'startSyncMissedMessages')
|
|
236
|
+
const contactOrRoomList = await this.syncContactOrRoomList()
|
|
237
|
+
const batchSize = 100
|
|
238
|
+
await batchProcess(batchSize, contactOrRoomList, async (contactOrRoom: WhatsAppContact) => {
|
|
239
|
+
await this.processHistoryMessages(contactOrRoom)
|
|
240
|
+
})
|
|
241
|
+
log.silly(PRE, 'startSyncMissedMessages finished')
|
|
242
|
+
})
|
|
243
|
+
}
|
|
244
|
+
|
|
245
|
+
public stopSchedule () {
|
|
246
|
+
this.scheduleManager.clearAllTasks()
|
|
247
|
+
}
|
|
248
|
+
|
|
249
|
+
/**
|
|
250
|
+
* Heatbeat
|
|
251
|
+
*/
|
|
252
|
+
|
|
253
|
+
private startHeartbeat () {
|
|
254
|
+
if (!this.heartbeatTimer) {
|
|
255
|
+
this.asystoleCount = 0
|
|
256
|
+
this.heartbeatTimer = setInterval(this.heartbeat.bind(this), 15 * 1000)
|
|
257
|
+
}
|
|
258
|
+
}
|
|
259
|
+
|
|
260
|
+
private stopHeartbeat () {
|
|
261
|
+
if (this.heartbeatTimer) {
|
|
262
|
+
clearInterval(this.heartbeatTimer)
|
|
263
|
+
this.heartbeatTimer = undefined
|
|
264
|
+
}
|
|
265
|
+
}
|
|
266
|
+
|
|
267
|
+
private asystoleCount = 0
|
|
268
|
+
private async heartbeat () {
|
|
269
|
+
|
|
270
|
+
/**
|
|
271
|
+
* puppteer.isConnected behaviour: (in MacOs)
|
|
272
|
+
* it will still return true if the Chromium window is closed with command + w
|
|
273
|
+
* it will not return true if the Chromium process is terminated with command + q
|
|
274
|
+
*/
|
|
275
|
+
|
|
276
|
+
let alive = false
|
|
277
|
+
try {
|
|
278
|
+
alive = !!this.getWhatsAppClient().pupBrowser?.isConnected()
|
|
279
|
+
} catch (e) {
|
|
280
|
+
alive = false
|
|
281
|
+
}
|
|
282
|
+
if (alive) {
|
|
283
|
+
this.asystoleCount = 0
|
|
284
|
+
this.emit('heartbeat', 'puppeteer still connected')
|
|
285
|
+
} else {
|
|
286
|
+
this.asystoleCount += 1
|
|
287
|
+
log.warn(PRE, `asystole count: ${this.asystoleCount}`)
|
|
288
|
+
if (this.asystoleCount > MAX_HEARTBEAT_MISSED) {
|
|
289
|
+
log.error(PRE, 'max asystole reached, restarting...')
|
|
290
|
+
await this.stop()
|
|
291
|
+
await this.start()
|
|
292
|
+
this.asystoleCount = 0
|
|
293
|
+
}
|
|
294
|
+
}
|
|
295
|
+
}
|
|
296
|
+
|
|
297
|
+
}
|
package/src/mod.ts
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
#!/usr/bin/env node --no-warnings --loader ts-node/esm
|
|
2
|
+
|
|
3
|
+
import { test } from 'tstest'
|
|
4
|
+
|
|
5
|
+
import { packageJson } from './package-json.js'
|
|
6
|
+
|
|
7
|
+
test('Make sure the packageJson is fresh in source code', async t => {
|
|
8
|
+
const keyNum = Object.keys(packageJson).length
|
|
9
|
+
t.equal(keyNum, 0, 'packageJson should be empty in source code, only updated before publish to NPM')
|
|
10
|
+
})
|