@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.
Files changed (479) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +83 -0
  3. package/dist/cjs/examples/ding-dong-bot.d.ts +2 -0
  4. package/dist/cjs/examples/ding-dong-bot.d.ts.map +1 -0
  5. package/dist/cjs/examples/ding-dong-bot.js +98 -0
  6. package/dist/cjs/examples/ding-dong-bot.js.map +1 -0
  7. package/dist/cjs/package.json +1 -0
  8. package/dist/cjs/src/config.d.ts +41 -0
  9. package/dist/cjs/src/config.d.ts.map +1 -0
  10. package/dist/cjs/src/config.js +58 -0
  11. package/dist/cjs/src/config.js.map +1 -0
  12. package/dist/cjs/src/data/cache-manager.d.ts +83 -0
  13. package/dist/cjs/src/data/cache-manager.d.ts.map +1 -0
  14. package/dist/cjs/src/data/cache-manager.js +303 -0
  15. package/dist/cjs/src/data/cache-manager.js.map +1 -0
  16. package/dist/cjs/src/data/cache-manager.spec.d.ts +2 -0
  17. package/dist/cjs/src/data/cache-manager.spec.d.ts.map +1 -0
  18. package/dist/cjs/src/data/cache-manager.spec.js +32 -0
  19. package/dist/cjs/src/data/cache-manager.spec.js.map +1 -0
  20. package/dist/cjs/src/exception/error-type.d.ts +80 -0
  21. package/dist/cjs/src/exception/error-type.d.ts.map +1 -0
  22. package/dist/cjs/src/exception/error-type.js +61 -0
  23. package/dist/cjs/src/exception/error-type.js.map +1 -0
  24. package/dist/cjs/src/exception/whatsapp-error.d.ts +4 -0
  25. package/dist/cjs/src/exception/whatsapp-error.d.ts.map +1 -0
  26. package/dist/cjs/src/exception/whatsapp-error.js +14 -0
  27. package/dist/cjs/src/exception/whatsapp-error.js.map +1 -0
  28. package/dist/cjs/src/exception/whatsapp-error.spec.d.ts +3 -0
  29. package/dist/cjs/src/exception/whatsapp-error.spec.d.ts.map +1 -0
  30. package/dist/cjs/src/exception/whatsapp-error.spec.js +27 -0
  31. package/dist/cjs/src/exception/whatsapp-error.spec.js.map +1 -0
  32. package/dist/cjs/src/helper/index.d.ts +2 -0
  33. package/dist/cjs/src/helper/index.d.ts.map +1 -0
  34. package/dist/cjs/src/helper/index.js +3 -0
  35. package/dist/cjs/src/helper/index.js.map +1 -0
  36. package/dist/cjs/src/helper/miscellaneous.d.ts +8 -0
  37. package/dist/cjs/src/helper/miscellaneous.d.ts.map +1 -0
  38. package/dist/cjs/src/helper/miscellaneous.js +48 -0
  39. package/dist/cjs/src/helper/miscellaneous.js.map +1 -0
  40. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.d.ts +4 -0
  41. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.d.ts.map +1 -0
  42. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.js +62 -0
  43. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.js.map +1 -0
  44. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts +2 -0
  45. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts.map +1 -0
  46. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.js +86 -0
  47. package/dist/cjs/src/helper/pure-function/contact-raw-payload-parser.spec.js.map +1 -0
  48. package/dist/cjs/src/helper/pure-function/convert-function.d.ts +4 -0
  49. package/dist/cjs/src/helper/pure-function/convert-function.d.ts.map +1 -0
  50. package/dist/cjs/src/helper/pure-function/convert-function.js +17 -0
  51. package/dist/cjs/src/helper/pure-function/convert-function.js.map +1 -0
  52. package/dist/cjs/src/helper/pure-function/index.d.ts +5 -0
  53. package/dist/cjs/src/helper/pure-function/index.d.ts.map +1 -0
  54. package/dist/cjs/src/helper/pure-function/index.js +21 -0
  55. package/dist/cjs/src/helper/pure-function/index.js.map +1 -0
  56. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.d.ts +4 -0
  57. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.d.ts.map +1 -0
  58. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.js +136 -0
  59. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.js.map +1 -0
  60. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.d.ts +2 -0
  61. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.d.ts.map +1 -0
  62. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.js +229 -0
  63. package/dist/cjs/src/helper/pure-function/message-raw-payload-parser.spec.js.map +1 -0
  64. package/dist/cjs/src/helper/pure-function/room-event-generator.d.ts +28 -0
  65. package/dist/cjs/src/helper/pure-function/room-event-generator.d.ts.map +1 -0
  66. package/dist/cjs/src/helper/pure-function/room-event-generator.js +59 -0
  67. package/dist/cjs/src/helper/pure-function/room-event-generator.js.map +1 -0
  68. package/dist/cjs/src/helper/pure-function/room-event-generator.spec.d.ts +2 -0
  69. package/dist/cjs/src/helper/pure-function/room-event-generator.spec.d.ts.map +1 -0
  70. package/dist/cjs/src/helper/pure-function/room-event-generator.spec.js +101 -0
  71. package/dist/cjs/src/helper/pure-function/room-event-generator.spec.js.map +1 -0
  72. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.d.ts +4 -0
  73. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.d.ts.map +1 -0
  74. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.js +24 -0
  75. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.js.map +1 -0
  76. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.d.ts +2 -0
  77. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.d.ts.map +1 -0
  78. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.js +68 -0
  79. package/dist/cjs/src/helper/pure-function/room-raw-payload-parser.spec.js.map +1 -0
  80. package/dist/cjs/src/helper/pure-function/vcard-parser.d.ts +28 -0
  81. package/dist/cjs/src/helper/pure-function/vcard-parser.d.ts.map +1 -0
  82. package/dist/cjs/src/helper/pure-function/vcard-parser.js +109 -0
  83. package/dist/cjs/src/helper/pure-function/vcard-parser.js.map +1 -0
  84. package/dist/cjs/src/helper/schedule/schedule-manager.d.ts +19 -0
  85. package/dist/cjs/src/helper/schedule/schedule-manager.d.ts.map +1 -0
  86. package/dist/cjs/src/helper/schedule/schedule-manager.js +49 -0
  87. package/dist/cjs/src/helper/schedule/schedule-manager.js.map +1 -0
  88. package/dist/cjs/src/helper/schedule/schedule-manager.spec.d.ts +2 -0
  89. package/dist/cjs/src/helper/schedule/schedule-manager.spec.d.ts.map +1 -0
  90. package/dist/cjs/src/helper/schedule/schedule-manager.spec.js +45 -0
  91. package/dist/cjs/src/helper/schedule/schedule-manager.spec.js.map +1 -0
  92. package/dist/cjs/src/manager-event.d.ts +18 -0
  93. package/dist/cjs/src/manager-event.d.ts.map +1 -0
  94. package/dist/cjs/src/manager-event.js +3 -0
  95. package/dist/cjs/src/manager-event.js.map +1 -0
  96. package/dist/cjs/src/manager.d.ts +67 -0
  97. package/dist/cjs/src/manager.d.ts.map +1 -0
  98. package/dist/cjs/src/manager.js +270 -0
  99. package/dist/cjs/src/manager.js.map +1 -0
  100. package/dist/cjs/src/manager.spec.d.ts +3 -0
  101. package/dist/cjs/src/manager.spec.d.ts.map +1 -0
  102. package/dist/cjs/src/manager.spec.js +38 -0
  103. package/dist/cjs/src/manager.spec.js.map +1 -0
  104. package/dist/cjs/src/mod.d.ts +5 -0
  105. package/dist/cjs/src/mod.d.ts.map +1 -0
  106. package/dist/cjs/src/mod.js +9 -0
  107. package/dist/cjs/src/mod.js.map +1 -0
  108. package/dist/cjs/src/package-json.d.ts +6 -0
  109. package/dist/cjs/src/package-json.d.ts.map +1 -0
  110. package/dist/cjs/src/package-json.js +93 -0
  111. package/dist/cjs/src/package-json.js.map +1 -0
  112. package/dist/cjs/src/package-json.spec.d.ts +3 -0
  113. package/dist/cjs/src/package-json.spec.d.ts.map +1 -0
  114. package/dist/cjs/src/package-json.spec.js +10 -0
  115. package/dist/cjs/src/package-json.spec.js.map +1 -0
  116. package/dist/cjs/src/puppet-mixin/contact-self.d.ts +5 -0
  117. package/dist/cjs/src/puppet-mixin/contact-self.d.ts.map +1 -0
  118. package/dist/cjs/src/puppet-mixin/contact-self.js +45 -0
  119. package/dist/cjs/src/puppet-mixin/contact-self.js.map +1 -0
  120. package/dist/cjs/src/puppet-mixin/contact.d.ts +16 -0
  121. package/dist/cjs/src/puppet-mixin/contact.d.ts.map +1 -0
  122. package/dist/cjs/src/puppet-mixin/contact.js +124 -0
  123. package/dist/cjs/src/puppet-mixin/contact.js.map +1 -0
  124. package/dist/cjs/src/puppet-mixin/conversation.d.ts +2 -0
  125. package/dist/cjs/src/puppet-mixin/conversation.d.ts.map +1 -0
  126. package/dist/cjs/src/puppet-mixin/conversation.js +35 -0
  127. package/dist/cjs/src/puppet-mixin/conversation.js.map +1 -0
  128. package/dist/cjs/src/puppet-mixin/friendship.d.ts +12 -0
  129. package/dist/cjs/src/puppet-mixin/friendship.d.ts.map +1 -0
  130. package/dist/cjs/src/puppet-mixin/friendship.js +99 -0
  131. package/dist/cjs/src/puppet-mixin/friendship.js.map +1 -0
  132. package/dist/cjs/src/puppet-mixin/message.d.ts +57 -0
  133. package/dist/cjs/src/puppet-mixin/message.d.ts.map +1 -0
  134. package/dist/cjs/src/puppet-mixin/message.js +327 -0
  135. package/dist/cjs/src/puppet-mixin/message.js.map +1 -0
  136. package/dist/cjs/src/puppet-mixin/room.d.ts +42 -0
  137. package/dist/cjs/src/puppet-mixin/room.d.ts.map +1 -0
  138. package/dist/cjs/src/puppet-mixin/room.js +319 -0
  139. package/dist/cjs/src/puppet-mixin/room.js.map +1 -0
  140. package/dist/cjs/src/puppet-mixin/tag.d.ts +5 -0
  141. package/dist/cjs/src/puppet-mixin/tag.d.ts.map +1 -0
  142. package/dist/cjs/src/puppet-mixin/tag.js +50 -0
  143. package/dist/cjs/src/puppet-mixin/tag.js.map +1 -0
  144. package/dist/cjs/src/puppet-whatsapp.d.ts +145 -0
  145. package/dist/cjs/src/puppet-whatsapp.d.ts.map +1 -0
  146. package/dist/cjs/src/puppet-whatsapp.js +309 -0
  147. package/dist/cjs/src/puppet-whatsapp.js.map +1 -0
  148. package/dist/cjs/src/puppet-whatsapp.spec.d.ts +3 -0
  149. package/dist/cjs/src/puppet-whatsapp.spec.d.ts.map +1 -0
  150. package/dist/cjs/src/puppet-whatsapp.spec.js +25 -0
  151. package/dist/cjs/src/puppet-whatsapp.spec.js.map +1 -0
  152. package/dist/cjs/src/request/rate-manager.d.ts +21 -0
  153. package/dist/cjs/src/request/rate-manager.d.ts.map +1 -0
  154. package/dist/cjs/src/request/rate-manager.js +92 -0
  155. package/dist/cjs/src/request/rate-manager.js.map +1 -0
  156. package/dist/cjs/src/request/request-manager.d.ts +54 -0
  157. package/dist/cjs/src/request/request-manager.d.ts.map +1 -0
  158. package/dist/cjs/src/request/request-manager.js +128 -0
  159. package/dist/cjs/src/request/request-manager.js.map +1 -0
  160. package/dist/cjs/src/request/request-pool.d.ts +10 -0
  161. package/dist/cjs/src/request/request-pool.d.ts.map +1 -0
  162. package/dist/cjs/src/request/request-pool.js +47 -0
  163. package/dist/cjs/src/request/request-pool.js.map +1 -0
  164. package/dist/cjs/src/request/request-pool.spec.d.ts +2 -0
  165. package/dist/cjs/src/request/request-pool.spec.d.ts.map +1 -0
  166. package/dist/cjs/src/request/request-pool.spec.js +36 -0
  167. package/dist/cjs/src/request/request-pool.spec.js.map +1 -0
  168. package/dist/cjs/src/schema/event-name.d.ts +9 -0
  169. package/dist/cjs/src/schema/event-name.d.ts.map +1 -0
  170. package/dist/cjs/src/schema/event-name.js +13 -0
  171. package/dist/cjs/src/schema/event-name.js.map +1 -0
  172. package/dist/cjs/src/schema/index.d.ts +2 -0
  173. package/dist/cjs/src/schema/index.d.ts.map +1 -0
  174. package/dist/cjs/src/schema/index.js +18 -0
  175. package/dist/cjs/src/schema/index.js.map +1 -0
  176. package/dist/cjs/src/schema/whatsapp-interface.d.ts +18 -0
  177. package/dist/cjs/src/schema/whatsapp-interface.d.ts.map +1 -0
  178. package/dist/cjs/src/schema/whatsapp-interface.js +26 -0
  179. package/dist/cjs/src/schema/whatsapp-interface.js.map +1 -0
  180. package/dist/cjs/src/schema/whatsapp-type.d.ts +42 -0
  181. package/dist/cjs/src/schema/whatsapp-type.d.ts.map +1 -0
  182. package/dist/cjs/src/schema/whatsapp-type.js +3 -0
  183. package/dist/cjs/src/schema/whatsapp-type.js.map +1 -0
  184. package/dist/cjs/src/whatsapp/event-handler/group-event-handler.d.ts +8 -0
  185. package/dist/cjs/src/whatsapp/event-handler/group-event-handler.d.ts.map +1 -0
  186. package/dist/cjs/src/whatsapp/event-handler/group-event-handler.js +84 -0
  187. package/dist/cjs/src/whatsapp/event-handler/group-event-handler.js.map +1 -0
  188. package/dist/cjs/src/whatsapp/event-handler/login-event-handler.d.ts +24 -0
  189. package/dist/cjs/src/whatsapp/event-handler/login-event-handler.d.ts.map +1 -0
  190. package/dist/cjs/src/whatsapp/event-handler/login-event-handler.js +203 -0
  191. package/dist/cjs/src/whatsapp/event-handler/login-event-handler.js.map +1 -0
  192. package/dist/cjs/src/whatsapp/event-handler/message-event-handler.d.ts +35 -0
  193. package/dist/cjs/src/whatsapp/event-handler/message-event-handler.d.ts.map +1 -0
  194. package/dist/cjs/src/whatsapp/event-handler/message-event-handler.js +203 -0
  195. package/dist/cjs/src/whatsapp/event-handler/message-event-handler.js.map +1 -0
  196. package/dist/cjs/src/whatsapp/whatsapp-base.d.ts +26 -0
  197. package/dist/cjs/src/whatsapp/whatsapp-base.d.ts.map +1 -0
  198. package/dist/cjs/src/whatsapp/whatsapp-base.js +69 -0
  199. package/dist/cjs/src/whatsapp/whatsapp-base.js.map +1 -0
  200. package/dist/cjs/src/whatsapp/whatsapp-manager.d.ts +16 -0
  201. package/dist/cjs/src/whatsapp/whatsapp-manager.d.ts.map +1 -0
  202. package/dist/cjs/src/whatsapp/whatsapp-manager.js +134 -0
  203. package/dist/cjs/src/whatsapp/whatsapp-manager.js.map +1 -0
  204. package/dist/cjs/tests/integration.spec.d.ts +3 -0
  205. package/dist/cjs/tests/integration.spec.d.ts.map +1 -0
  206. package/dist/cjs/tests/integration.spec.js +8 -0
  207. package/dist/cjs/tests/integration.spec.js.map +1 -0
  208. package/dist/cjs/tests/memory-card.spec.d.ts +2 -0
  209. package/dist/cjs/tests/memory-card.spec.d.ts.map +1 -0
  210. package/dist/cjs/tests/memory-card.spec.js +25 -0
  211. package/dist/cjs/tests/memory-card.spec.js.map +1 -0
  212. package/dist/cjs/tests/qrcode.spec.d.ts +2 -0
  213. package/dist/cjs/tests/qrcode.spec.d.ts.map +1 -0
  214. package/dist/cjs/tests/qrcode.spec.js +51 -0
  215. package/dist/cjs/tests/qrcode.spec.js.map +1 -0
  216. package/dist/esm/examples/ding-dong-bot.d.ts +2 -0
  217. package/dist/esm/examples/ding-dong-bot.d.ts.map +1 -0
  218. package/dist/esm/examples/ding-dong-bot.js +93 -0
  219. package/dist/esm/examples/ding-dong-bot.js.map +1 -0
  220. package/dist/esm/src/config.d.ts +41 -0
  221. package/dist/esm/src/config.d.ts.map +1 -0
  222. package/dist/esm/src/config.js +50 -0
  223. package/dist/esm/src/config.js.map +1 -0
  224. package/dist/esm/src/data/cache-manager.d.ts +83 -0
  225. package/dist/esm/src/data/cache-manager.d.ts.map +1 -0
  226. package/dist/esm/src/data/cache-manager.js +273 -0
  227. package/dist/esm/src/data/cache-manager.js.map +1 -0
  228. package/dist/esm/src/data/cache-manager.spec.d.ts +2 -0
  229. package/dist/esm/src/data/cache-manager.spec.d.ts.map +1 -0
  230. package/dist/esm/src/data/cache-manager.spec.js +30 -0
  231. package/dist/esm/src/data/cache-manager.spec.js.map +1 -0
  232. package/dist/esm/src/exception/error-type.d.ts +80 -0
  233. package/dist/esm/src/exception/error-type.d.ts.map +1 -0
  234. package/dist/esm/src/exception/error-type.js +58 -0
  235. package/dist/esm/src/exception/error-type.js.map +1 -0
  236. package/dist/esm/src/exception/whatsapp-error.d.ts +4 -0
  237. package/dist/esm/src/exception/whatsapp-error.d.ts.map +1 -0
  238. package/dist/esm/src/exception/whatsapp-error.js +11 -0
  239. package/dist/esm/src/exception/whatsapp-error.js.map +1 -0
  240. package/dist/esm/src/exception/whatsapp-error.spec.d.ts +3 -0
  241. package/dist/esm/src/exception/whatsapp-error.spec.d.ts.map +1 -0
  242. package/dist/esm/src/exception/whatsapp-error.spec.js +22 -0
  243. package/dist/esm/src/exception/whatsapp-error.spec.js.map +1 -0
  244. package/dist/esm/src/helper/index.d.ts +2 -0
  245. package/dist/esm/src/helper/index.d.ts.map +1 -0
  246. package/dist/esm/src/helper/index.js +2 -0
  247. package/dist/esm/src/helper/index.js.map +1 -0
  248. package/dist/esm/src/helper/miscellaneous.d.ts +8 -0
  249. package/dist/esm/src/helper/miscellaneous.d.ts.map +1 -0
  250. package/dist/esm/src/helper/miscellaneous.js +38 -0
  251. package/dist/esm/src/helper/miscellaneous.js.map +1 -0
  252. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.d.ts +4 -0
  253. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.d.ts.map +1 -0
  254. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.js +35 -0
  255. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.js.map +1 -0
  256. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts +2 -0
  257. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.d.ts.map +1 -0
  258. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.js +61 -0
  259. package/dist/esm/src/helper/pure-function/contact-raw-payload-parser.spec.js.map +1 -0
  260. package/dist/esm/src/helper/pure-function/convert-function.d.ts +4 -0
  261. package/dist/esm/src/helper/pure-function/convert-function.d.ts.map +1 -0
  262. package/dist/esm/src/helper/pure-function/convert-function.js +12 -0
  263. package/dist/esm/src/helper/pure-function/convert-function.js.map +1 -0
  264. package/dist/esm/src/helper/pure-function/index.d.ts +5 -0
  265. package/dist/esm/src/helper/pure-function/index.d.ts.map +1 -0
  266. package/dist/esm/src/helper/pure-function/index.js +5 -0
  267. package/dist/esm/src/helper/pure-function/index.js.map +1 -0
  268. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.d.ts +4 -0
  269. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.d.ts.map +1 -0
  270. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.js +106 -0
  271. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.js.map +1 -0
  272. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.d.ts +2 -0
  273. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.d.ts.map +1 -0
  274. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.js +227 -0
  275. package/dist/esm/src/helper/pure-function/message-raw-payload-parser.spec.js.map +1 -0
  276. package/dist/esm/src/helper/pure-function/room-event-generator.d.ts +28 -0
  277. package/dist/esm/src/helper/pure-function/room-event-generator.d.ts.map +1 -0
  278. package/dist/esm/src/helper/pure-function/room-event-generator.js +53 -0
  279. package/dist/esm/src/helper/pure-function/room-event-generator.js.map +1 -0
  280. package/dist/esm/src/helper/pure-function/room-event-generator.spec.d.ts +2 -0
  281. package/dist/esm/src/helper/pure-function/room-event-generator.spec.d.ts.map +1 -0
  282. package/dist/esm/src/helper/pure-function/room-event-generator.spec.js +99 -0
  283. package/dist/esm/src/helper/pure-function/room-event-generator.spec.js.map +1 -0
  284. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.d.ts +4 -0
  285. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.d.ts.map +1 -0
  286. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.js +17 -0
  287. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.js.map +1 -0
  288. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.d.ts +2 -0
  289. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.d.ts.map +1 -0
  290. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.js +66 -0
  291. package/dist/esm/src/helper/pure-function/room-raw-payload-parser.spec.js.map +1 -0
  292. package/dist/esm/src/helper/pure-function/vcard-parser.d.ts +28 -0
  293. package/dist/esm/src/helper/pure-function/vcard-parser.d.ts.map +1 -0
  294. package/dist/esm/src/helper/pure-function/vcard-parser.js +102 -0
  295. package/dist/esm/src/helper/pure-function/vcard-parser.js.map +1 -0
  296. package/dist/esm/src/helper/schedule/schedule-manager.d.ts +19 -0
  297. package/dist/esm/src/helper/schedule/schedule-manager.d.ts.map +1 -0
  298. package/dist/esm/src/helper/schedule/schedule-manager.js +43 -0
  299. package/dist/esm/src/helper/schedule/schedule-manager.js.map +1 -0
  300. package/dist/esm/src/helper/schedule/schedule-manager.spec.d.ts +2 -0
  301. package/dist/esm/src/helper/schedule/schedule-manager.spec.d.ts.map +1 -0
  302. package/dist/esm/src/helper/schedule/schedule-manager.spec.js +40 -0
  303. package/dist/esm/src/helper/schedule/schedule-manager.spec.js.map +1 -0
  304. package/dist/esm/src/manager-event.d.ts +18 -0
  305. package/dist/esm/src/manager-event.d.ts.map +1 -0
  306. package/dist/esm/src/manager-event.js +2 -0
  307. package/dist/esm/src/manager-event.js.map +1 -0
  308. package/dist/esm/src/manager.d.ts +67 -0
  309. package/dist/esm/src/manager.d.ts.map +1 -0
  310. package/dist/esm/src/manager.js +264 -0
  311. package/dist/esm/src/manager.js.map +1 -0
  312. package/dist/esm/src/manager.spec.d.ts +3 -0
  313. package/dist/esm/src/manager.spec.d.ts.map +1 -0
  314. package/dist/esm/src/manager.spec.js +33 -0
  315. package/dist/esm/src/manager.spec.js.map +1 -0
  316. package/dist/esm/src/mod.d.ts +5 -0
  317. package/dist/esm/src/mod.d.ts.map +1 -0
  318. package/dist/esm/src/mod.js +5 -0
  319. package/dist/esm/src/mod.js.map +1 -0
  320. package/dist/esm/src/package-json.d.ts +6 -0
  321. package/dist/esm/src/package-json.d.ts.map +1 -0
  322. package/dist/esm/src/package-json.js +90 -0
  323. package/dist/esm/src/package-json.js.map +1 -0
  324. package/dist/esm/src/package-json.spec.d.ts +3 -0
  325. package/dist/esm/src/package-json.spec.d.ts.map +1 -0
  326. package/dist/esm/src/package-json.spec.js +8 -0
  327. package/dist/esm/src/package-json.spec.js.map +1 -0
  328. package/dist/esm/src/puppet-mixin/contact-self.d.ts +5 -0
  329. package/dist/esm/src/puppet-mixin/contact-self.d.ts.map +1 -0
  330. package/dist/esm/src/puppet-mixin/contact-self.js +16 -0
  331. package/dist/esm/src/puppet-mixin/contact-self.js.map +1 -0
  332. package/dist/esm/src/puppet-mixin/contact.d.ts +16 -0
  333. package/dist/esm/src/puppet-mixin/contact.d.ts.map +1 -0
  334. package/dist/esm/src/puppet-mixin/contact.js +87 -0
  335. package/dist/esm/src/puppet-mixin/contact.js.map +1 -0
  336. package/dist/esm/src/puppet-mixin/conversation.d.ts +2 -0
  337. package/dist/esm/src/puppet-mixin/conversation.d.ts.map +1 -0
  338. package/dist/esm/src/puppet-mixin/conversation.js +8 -0
  339. package/dist/esm/src/puppet-mixin/conversation.js.map +1 -0
  340. package/dist/esm/src/puppet-mixin/friendship.d.ts +12 -0
  341. package/dist/esm/src/puppet-mixin/friendship.d.ts.map +1 -0
  342. package/dist/esm/src/puppet-mixin/friendship.js +63 -0
  343. package/dist/esm/src/puppet-mixin/friendship.js.map +1 -0
  344. package/dist/esm/src/puppet-mixin/message.d.ts +57 -0
  345. package/dist/esm/src/puppet-mixin/message.d.ts.map +1 -0
  346. package/dist/esm/src/puppet-mixin/message.js +282 -0
  347. package/dist/esm/src/puppet-mixin/message.js.map +1 -0
  348. package/dist/esm/src/puppet-mixin/room.d.ts +42 -0
  349. package/dist/esm/src/puppet-mixin/room.d.ts.map +1 -0
  350. package/dist/esm/src/puppet-mixin/room.js +273 -0
  351. package/dist/esm/src/puppet-mixin/room.js.map +1 -0
  352. package/dist/esm/src/puppet-mixin/tag.d.ts +5 -0
  353. package/dist/esm/src/puppet-mixin/tag.d.ts.map +1 -0
  354. package/dist/esm/src/puppet-mixin/tag.js +20 -0
  355. package/dist/esm/src/puppet-mixin/tag.js.map +1 -0
  356. package/dist/esm/src/puppet-whatsapp.d.ts +145 -0
  357. package/dist/esm/src/puppet-whatsapp.d.ts.map +1 -0
  358. package/dist/esm/src/puppet-whatsapp.js +280 -0
  359. package/dist/esm/src/puppet-whatsapp.js.map +1 -0
  360. package/dist/esm/src/puppet-whatsapp.spec.d.ts +3 -0
  361. package/dist/esm/src/puppet-whatsapp.spec.d.ts.map +1 -0
  362. package/dist/esm/src/puppet-whatsapp.spec.js +23 -0
  363. package/dist/esm/src/puppet-whatsapp.spec.js.map +1 -0
  364. package/dist/esm/src/request/rate-manager.d.ts +21 -0
  365. package/dist/esm/src/request/rate-manager.d.ts.map +1 -0
  366. package/dist/esm/src/request/rate-manager.js +85 -0
  367. package/dist/esm/src/request/rate-manager.js.map +1 -0
  368. package/dist/esm/src/request/request-manager.d.ts +54 -0
  369. package/dist/esm/src/request/request-manager.d.ts.map +1 -0
  370. package/dist/esm/src/request/request-manager.js +124 -0
  371. package/dist/esm/src/request/request-manager.js.map +1 -0
  372. package/dist/esm/src/request/request-pool.d.ts +10 -0
  373. package/dist/esm/src/request/request-pool.d.ts.map +1 -0
  374. package/dist/esm/src/request/request-pool.js +40 -0
  375. package/dist/esm/src/request/request-pool.js.map +1 -0
  376. package/dist/esm/src/request/request-pool.spec.d.ts +2 -0
  377. package/dist/esm/src/request/request-pool.spec.d.ts.map +1 -0
  378. package/dist/esm/src/request/request-pool.spec.js +34 -0
  379. package/dist/esm/src/request/request-pool.spec.js.map +1 -0
  380. package/dist/esm/src/schema/event-name.d.ts +9 -0
  381. package/dist/esm/src/schema/event-name.d.ts.map +1 -0
  382. package/dist/esm/src/schema/event-name.js +10 -0
  383. package/dist/esm/src/schema/event-name.js.map +1 -0
  384. package/dist/esm/src/schema/index.d.ts +2 -0
  385. package/dist/esm/src/schema/index.d.ts.map +1 -0
  386. package/dist/esm/src/schema/index.js +2 -0
  387. package/dist/esm/src/schema/index.js.map +1 -0
  388. package/dist/esm/src/schema/whatsapp-interface.d.ts +18 -0
  389. package/dist/esm/src/schema/whatsapp-interface.d.ts.map +1 -0
  390. package/dist/esm/src/schema/whatsapp-interface.js +20 -0
  391. package/dist/esm/src/schema/whatsapp-interface.js.map +1 -0
  392. package/dist/esm/src/schema/whatsapp-type.d.ts +42 -0
  393. package/dist/esm/src/schema/whatsapp-type.d.ts.map +1 -0
  394. package/dist/esm/src/schema/whatsapp-type.js +2 -0
  395. package/dist/esm/src/schema/whatsapp-type.js.map +1 -0
  396. package/dist/esm/src/whatsapp/event-handler/group-event-handler.d.ts +8 -0
  397. package/dist/esm/src/whatsapp/event-handler/group-event-handler.d.ts.map +1 -0
  398. package/dist/esm/src/whatsapp/event-handler/group-event-handler.js +78 -0
  399. package/dist/esm/src/whatsapp/event-handler/group-event-handler.js.map +1 -0
  400. package/dist/esm/src/whatsapp/event-handler/login-event-handler.d.ts +24 -0
  401. package/dist/esm/src/whatsapp/event-handler/login-event-handler.d.ts.map +1 -0
  402. package/dist/esm/src/whatsapp/event-handler/login-event-handler.js +174 -0
  403. package/dist/esm/src/whatsapp/event-handler/login-event-handler.js.map +1 -0
  404. package/dist/esm/src/whatsapp/event-handler/message-event-handler.d.ts +35 -0
  405. package/dist/esm/src/whatsapp/event-handler/message-event-handler.d.ts.map +1 -0
  406. package/dist/esm/src/whatsapp/event-handler/message-event-handler.js +197 -0
  407. package/dist/esm/src/whatsapp/event-handler/message-event-handler.js.map +1 -0
  408. package/dist/esm/src/whatsapp/whatsapp-base.d.ts +26 -0
  409. package/dist/esm/src/whatsapp/whatsapp-base.d.ts.map +1 -0
  410. package/dist/esm/src/whatsapp/whatsapp-base.js +63 -0
  411. package/dist/esm/src/whatsapp/whatsapp-base.js.map +1 -0
  412. package/dist/esm/src/whatsapp/whatsapp-manager.d.ts +16 -0
  413. package/dist/esm/src/whatsapp/whatsapp-manager.d.ts.map +1 -0
  414. package/dist/esm/src/whatsapp/whatsapp-manager.js +128 -0
  415. package/dist/esm/src/whatsapp/whatsapp-manager.js.map +1 -0
  416. package/dist/esm/tests/integration.spec.d.ts +3 -0
  417. package/dist/esm/tests/integration.spec.d.ts.map +1 -0
  418. package/dist/esm/tests/integration.spec.js +6 -0
  419. package/dist/esm/tests/integration.spec.js.map +1 -0
  420. package/dist/esm/tests/memory-card.spec.d.ts +2 -0
  421. package/dist/esm/tests/memory-card.spec.d.ts.map +1 -0
  422. package/dist/esm/tests/memory-card.spec.js +23 -0
  423. package/dist/esm/tests/memory-card.spec.js.map +1 -0
  424. package/dist/esm/tests/qrcode.spec.d.ts +2 -0
  425. package/dist/esm/tests/qrcode.spec.d.ts.map +1 -0
  426. package/dist/esm/tests/qrcode.spec.js +26 -0
  427. package/dist/esm/tests/qrcode.spec.js.map +1 -0
  428. package/package.json +89 -0
  429. package/src/config.ts +70 -0
  430. package/src/data/cache-manager.spec.ts +33 -0
  431. package/src/data/cache-manager.ts +331 -0
  432. package/src/exception/error-type.ts +59 -0
  433. package/src/exception/whatsapp-error.spec.ts +26 -0
  434. package/src/exception/whatsapp-error.ts +15 -0
  435. package/src/helper/index.ts +3 -0
  436. package/src/helper/miscellaneous.ts +45 -0
  437. package/src/helper/pure-function/contact-raw-payload-parser.spec.ts +67 -0
  438. package/src/helper/pure-function/contact-raw-payload-parser.ts +36 -0
  439. package/src/helper/pure-function/convert-function.ts +24 -0
  440. package/src/helper/pure-function/index.ts +4 -0
  441. package/src/helper/pure-function/message-raw-payload-parser.spec.ts +243 -0
  442. package/src/helper/pure-function/message-raw-payload-parser.ts +117 -0
  443. package/src/helper/pure-function/room-event-generator.spec.ts +120 -0
  444. package/src/helper/pure-function/room-event-generator.ts +63 -0
  445. package/src/helper/pure-function/room-raw-payload-parser.spec.ts +70 -0
  446. package/src/helper/pure-function/room-raw-payload-parser.ts +19 -0
  447. package/src/helper/pure-function/vcard-parser.ts +128 -0
  448. package/src/helper/schedule/schedule-manager.spec.ts +46 -0
  449. package/src/helper/schedule/schedule-manager.ts +52 -0
  450. package/src/manager-event.ts +18 -0
  451. package/src/manager.spec.ts +40 -0
  452. package/src/manager.ts +297 -0
  453. package/src/mod.ts +8 -0
  454. package/src/package-json.spec.ts +10 -0
  455. package/src/package-json.ts +93 -0
  456. package/src/puppet-mixin/contact-self.ts +20 -0
  457. package/src/puppet-mixin/contact.ts +107 -0
  458. package/src/puppet-mixin/conversation.ts +12 -0
  459. package/src/puppet-mixin/friendship.ts +88 -0
  460. package/src/puppet-mixin/message.ts +311 -0
  461. package/src/puppet-mixin/room.ts +334 -0
  462. package/src/puppet-mixin/tag.ts +34 -0
  463. package/src/puppet-whatsapp.spec.ts +30 -0
  464. package/src/puppet-whatsapp.ts +339 -0
  465. package/src/request/rate-manager.ts +118 -0
  466. package/src/request/request-manager.ts +174 -0
  467. package/src/request/request-pool.spec.ts +36 -0
  468. package/src/request/request-pool.ts +45 -0
  469. package/src/schema/event-name.ts +8 -0
  470. package/src/schema/fix-type.d.ts +63 -0
  471. package/src/schema/index.ts +1 -0
  472. package/src/schema/whatsapp-interface.ts +31 -0
  473. package/src/schema/whatsapp-type.ts +79 -0
  474. package/src/typings.d.ts +0 -0
  475. package/src/whatsapp/event-handler/group-event-handler.ts +95 -0
  476. package/src/whatsapp/event-handler/login-event-handler.ts +210 -0
  477. package/src/whatsapp/event-handler/message-event-handler.ts +230 -0
  478. package/src/whatsapp/whatsapp-base.ts +78 -0
  479. 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,8 @@
1
+ import { VERSION } from './config.js'
2
+ import { PuppetWhatsapp } from './puppet-whatsapp.js'
3
+
4
+ export {
5
+ VERSION,
6
+ PuppetWhatsapp,
7
+ }
8
+ export default PuppetWhatsapp
@@ -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
+ })