@juzi/wechaty-puppet-service 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 (602) hide show
  1. package/LICENSE +201 -0
  2. package/README.md +166 -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 +156 -0
  6. package/dist/cjs/examples/ding-dong-bot.js.map +1 -0
  7. package/dist/cjs/package.json +3 -0
  8. package/dist/cjs/src/auth/auth-impl-token.d.ts +4 -0
  9. package/dist/cjs/src/auth/auth-impl-token.d.ts.map +1 -0
  10. package/dist/cjs/src/auth/auth-impl-token.js +81 -0
  11. package/dist/cjs/src/auth/auth-impl-token.js.map +1 -0
  12. package/dist/cjs/src/auth/auth-impl-token.spec.d.ts +3 -0
  13. package/dist/cjs/src/auth/auth-impl-token.spec.d.ts.map +1 -0
  14. package/dist/cjs/src/auth/auth-impl-token.spec.js +65 -0
  15. package/dist/cjs/src/auth/auth-impl-token.spec.js.map +1 -0
  16. package/dist/cjs/src/auth/ca.d.ts +46 -0
  17. package/dist/cjs/src/auth/ca.d.ts.map +1 -0
  18. package/dist/cjs/src/auth/ca.js +135 -0
  19. package/dist/cjs/src/auth/ca.js.map +1 -0
  20. package/dist/cjs/src/auth/ca.spec.d.ts +3 -0
  21. package/dist/cjs/src/auth/ca.spec.d.ts.map +1 -0
  22. package/dist/cjs/src/auth/ca.spec.js +115 -0
  23. package/dist/cjs/src/auth/ca.spec.js.map +1 -0
  24. package/dist/cjs/src/auth/call-cred.d.ts +9 -0
  25. package/dist/cjs/src/auth/call-cred.d.ts.map +1 -0
  26. package/dist/cjs/src/auth/call-cred.js +17 -0
  27. package/dist/cjs/src/auth/call-cred.js.map +1 -0
  28. package/dist/cjs/src/auth/call-cred.spec.d.ts +3 -0
  29. package/dist/cjs/src/auth/call-cred.spec.d.ts.map +1 -0
  30. package/dist/cjs/src/auth/call-cred.spec.js +18 -0
  31. package/dist/cjs/src/auth/call-cred.spec.js.map +1 -0
  32. package/dist/cjs/src/auth/env-vars.d.ts +13 -0
  33. package/dist/cjs/src/auth/env-vars.d.ts.map +1 -0
  34. package/dist/cjs/src/auth/env-vars.js +29 -0
  35. package/dist/cjs/src/auth/env-vars.js.map +1 -0
  36. package/dist/cjs/src/auth/grpc-js.d.ts +7 -0
  37. package/dist/cjs/src/auth/grpc-js.d.ts.map +1 -0
  38. package/dist/cjs/src/auth/grpc-js.js +10 -0
  39. package/dist/cjs/src/auth/grpc-js.js.map +1 -0
  40. package/dist/cjs/src/auth/mod.d.ts +5 -0
  41. package/dist/cjs/src/auth/mod.d.ts.map +1 -0
  42. package/dist/cjs/src/auth/mod.js +10 -0
  43. package/dist/cjs/src/auth/mod.js.map +1 -0
  44. package/dist/cjs/src/auth/mokey-patch-header-authorization.d.ts +11 -0
  45. package/dist/cjs/src/auth/mokey-patch-header-authorization.d.ts.map +1 -0
  46. package/dist/cjs/src/auth/mokey-patch-header-authorization.js +32 -0
  47. package/dist/cjs/src/auth/mokey-patch-header-authorization.js.map +1 -0
  48. package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.d.ts +3 -0
  49. package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.d.ts.map +1 -0
  50. package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.js +19 -0
  51. package/dist/cjs/src/auth/monkey-patch-header-authorization.spec.js.map +1 -0
  52. package/dist/cjs/src/client/duck/actions.d.ts +6 -0
  53. package/dist/cjs/src/client/duck/actions.d.ts.map +1 -0
  54. package/dist/cjs/src/client/duck/actions.js +54 -0
  55. package/dist/cjs/src/client/duck/actions.js.map +1 -0
  56. package/dist/cjs/src/client/duck/epic-recover.d.ts +36 -0
  57. package/dist/cjs/src/client/duck/epic-recover.d.ts.map +1 -0
  58. package/dist/cjs/src/client/duck/epic-recover.js +41 -0
  59. package/dist/cjs/src/client/duck/epic-recover.js.map +1 -0
  60. package/dist/cjs/src/client/duck/epic-recover.spec.d.ts +3 -0
  61. package/dist/cjs/src/client/duck/epic-recover.spec.d.ts.map +1 -0
  62. package/dist/cjs/src/client/duck/epic-recover.spec.js +131 -0
  63. package/dist/cjs/src/client/duck/epic-recover.spec.js.map +1 -0
  64. package/dist/cjs/src/client/duck/epics.d.ts +4 -0
  65. package/dist/cjs/src/client/duck/epics.d.ts.map +1 -0
  66. package/dist/cjs/src/client/duck/epics.js +36 -0
  67. package/dist/cjs/src/client/duck/epics.js.map +1 -0
  68. package/dist/cjs/src/client/duck/mod.d.ts +29 -0
  69. package/dist/cjs/src/client/duck/mod.d.ts.map +1 -0
  70. package/dist/cjs/src/client/duck/mod.js +63 -0
  71. package/dist/cjs/src/client/duck/mod.js.map +1 -0
  72. package/dist/cjs/src/client/duck/operations.d.ts +23 -0
  73. package/dist/cjs/src/client/duck/operations.d.ts.map +1 -0
  74. package/dist/cjs/src/client/duck/operations.js +30 -0
  75. package/dist/cjs/src/client/duck/operations.js.map +1 -0
  76. package/dist/cjs/src/client/duck/reducers.d.ts +59 -0
  77. package/dist/cjs/src/client/duck/reducers.d.ts.map +1 -0
  78. package/dist/cjs/src/client/duck/reducers.js +51 -0
  79. package/dist/cjs/src/client/duck/reducers.js.map +1 -0
  80. package/dist/cjs/src/client/duck/selectors.d.ts +21 -0
  81. package/dist/cjs/src/client/duck/selectors.d.ts.map +1 -0
  82. package/dist/cjs/src/client/duck/selectors.js +23 -0
  83. package/dist/cjs/src/client/duck/selectors.js.map +1 -0
  84. package/dist/cjs/src/client/duck/tests.spec.d.ts +3 -0
  85. package/dist/cjs/src/client/duck/tests.spec.d.ts.map +1 -0
  86. package/dist/cjs/src/client/duck/tests.spec.js +49 -0
  87. package/dist/cjs/src/client/duck/tests.spec.js.map +1 -0
  88. package/dist/cjs/src/client/duck/types.d.ts +21 -0
  89. package/dist/cjs/src/client/duck/types.d.ts.map +1 -0
  90. package/dist/cjs/src/client/duck/types.js +24 -0
  91. package/dist/cjs/src/client/duck/types.js.map +1 -0
  92. package/dist/cjs/src/client/duck/utils.d.ts +21 -0
  93. package/dist/cjs/src/client/duck/utils.d.ts.map +1 -0
  94. package/dist/cjs/src/client/duck/utils.js +3 -0
  95. package/dist/cjs/src/client/duck/utils.js.map +1 -0
  96. package/dist/cjs/src/client/grpc-manager.d.ts +29 -0
  97. package/dist/cjs/src/client/grpc-manager.d.ts.map +1 -0
  98. package/dist/cjs/src/client/grpc-manager.js +359 -0
  99. package/dist/cjs/src/client/grpc-manager.js.map +1 -0
  100. package/dist/cjs/src/client/grpc-manager.spec.d.ts +3 -0
  101. package/dist/cjs/src/client/grpc-manager.spec.d.ts.map +1 -0
  102. package/dist/cjs/src/client/grpc-manager.spec.js +19 -0
  103. package/dist/cjs/src/client/grpc-manager.spec.js.map +1 -0
  104. package/dist/cjs/src/client/payload-store.d.ts +26 -0
  105. package/dist/cjs/src/client/payload-store.d.ts.map +1 -0
  106. package/dist/cjs/src/client/payload-store.js +118 -0
  107. package/dist/cjs/src/client/payload-store.js.map +1 -0
  108. package/dist/cjs/src/client/payload-store.spec.d.ts +3 -0
  109. package/dist/cjs/src/client/payload-store.spec.d.ts.map +1 -0
  110. package/dist/cjs/src/client/payload-store.spec.js +17 -0
  111. package/dist/cjs/src/client/payload-store.spec.js.map +1 -0
  112. package/dist/cjs/src/client/puppet-service.d.ts +161 -0
  113. package/dist/cjs/src/client/puppet-service.d.ts.map +1 -0
  114. package/dist/cjs/src/client/puppet-service.js +1384 -0
  115. package/dist/cjs/src/client/puppet-service.js.map +1 -0
  116. package/dist/cjs/src/client/puppet-service.spec.d.ts +3 -0
  117. package/dist/cjs/src/client/puppet-service.spec.d.ts.map +1 -0
  118. package/dist/cjs/src/client/puppet-service.spec.js +55 -0
  119. package/dist/cjs/src/client/puppet-service.spec.js.map +1 -0
  120. package/dist/cjs/src/config.d.ts +20 -0
  121. package/dist/cjs/src/config.d.ts.map +1 -0
  122. package/dist/cjs/src/config.js +49 -0
  123. package/dist/cjs/src/config.js.map +1 -0
  124. package/dist/cjs/src/deprecated/chunk-pb.d.ts +15 -0
  125. package/dist/cjs/src/deprecated/chunk-pb.d.ts.map +1 -0
  126. package/dist/cjs/src/deprecated/chunk-pb.js +60 -0
  127. package/dist/cjs/src/deprecated/chunk-pb.js.map +1 -0
  128. package/dist/cjs/src/deprecated/chunk-pb.spec.d.ts +3 -0
  129. package/dist/cjs/src/deprecated/chunk-pb.spec.d.ts.map +1 -0
  130. package/dist/cjs/src/deprecated/chunk-pb.spec.js +144 -0
  131. package/dist/cjs/src/deprecated/chunk-pb.spec.js.map +1 -0
  132. package/dist/cjs/src/deprecated/conversation-id-file-box.d.ts +21 -0
  133. package/dist/cjs/src/deprecated/conversation-id-file-box.d.ts.map +1 -0
  134. package/dist/cjs/src/deprecated/conversation-id-file-box.js +43 -0
  135. package/dist/cjs/src/deprecated/conversation-id-file-box.js.map +1 -0
  136. package/dist/cjs/src/deprecated/conversation-id-file-box.spec.d.ts +3 -0
  137. package/dist/cjs/src/deprecated/conversation-id-file-box.spec.d.ts.map +1 -0
  138. package/dist/cjs/src/deprecated/conversation-id-file-box.spec.js +94 -0
  139. package/dist/cjs/src/deprecated/conversation-id-file-box.spec.js.map +1 -0
  140. package/dist/cjs/src/deprecated/file-box-chunk.d.ts +14 -0
  141. package/dist/cjs/src/deprecated/file-box-chunk.d.ts.map +1 -0
  142. package/dist/cjs/src/deprecated/file-box-chunk.js +67 -0
  143. package/dist/cjs/src/deprecated/file-box-chunk.js.map +1 -0
  144. package/dist/cjs/src/deprecated/file-box-chunk.spec.d.ts +3 -0
  145. package/dist/cjs/src/deprecated/file-box-chunk.spec.d.ts.map +1 -0
  146. package/dist/cjs/src/deprecated/file-box-chunk.spec.js +134 -0
  147. package/dist/cjs/src/deprecated/file-box-chunk.spec.js.map +1 -0
  148. package/dist/cjs/src/deprecated/file-box-pb.d.ts +15 -0
  149. package/dist/cjs/src/deprecated/file-box-pb.d.ts.map +1 -0
  150. package/dist/cjs/src/deprecated/file-box-pb.js +26 -0
  151. package/dist/cjs/src/deprecated/file-box-pb.js.map +1 -0
  152. package/dist/cjs/src/deprecated/file-box-pb.spec.d.ts +3 -0
  153. package/dist/cjs/src/deprecated/file-box-pb.spec.d.ts.map +1 -0
  154. package/dist/cjs/src/deprecated/file-box-pb.spec.js +18 -0
  155. package/dist/cjs/src/deprecated/file-box-pb.spec.js.map +1 -0
  156. package/dist/cjs/src/deprecated/file-box-pb.type.d.ts +15 -0
  157. package/dist/cjs/src/deprecated/file-box-pb.type.d.ts.map +1 -0
  158. package/dist/cjs/src/deprecated/file-box-pb.type.js +3 -0
  159. package/dist/cjs/src/deprecated/file-box-pb.type.js.map +1 -0
  160. package/dist/cjs/src/deprecated/mod.d.ts +3 -0
  161. package/dist/cjs/src/deprecated/mod.d.ts.map +1 -0
  162. package/dist/cjs/src/deprecated/mod.js +10 -0
  163. package/dist/cjs/src/deprecated/mod.js.map +1 -0
  164. package/dist/cjs/src/deprecated/next-data.d.ts +7 -0
  165. package/dist/cjs/src/deprecated/next-data.d.ts.map +1 -0
  166. package/dist/cjs/src/deprecated/next-data.js +26 -0
  167. package/dist/cjs/src/deprecated/next-data.js.map +1 -0
  168. package/dist/cjs/src/deprecated/serialize-file-box.d.ts +6 -0
  169. package/dist/cjs/src/deprecated/serialize-file-box.d.ts.map +1 -0
  170. package/dist/cjs/src/deprecated/serialize-file-box.js +22 -0
  171. package/dist/cjs/src/deprecated/serialize-file-box.js.map +1 -0
  172. package/dist/cjs/src/env-vars.d.ts +5 -0
  173. package/dist/cjs/src/env-vars.d.ts.map +1 -0
  174. package/dist/cjs/src/env-vars.js +88 -0
  175. package/dist/cjs/src/env-vars.js.map +1 -0
  176. package/dist/cjs/src/env-vars.spec.d.ts +3 -0
  177. package/dist/cjs/src/env-vars.spec.d.ts.map +1 -0
  178. package/dist/cjs/src/env-vars.spec.js +21 -0
  179. package/dist/cjs/src/env-vars.spec.js.map +1 -0
  180. package/dist/cjs/src/event-type-rev.d.ts +11 -0
  181. package/dist/cjs/src/event-type-rev.d.ts.map +1 -0
  182. package/dist/cjs/src/event-type-rev.js +17 -0
  183. package/dist/cjs/src/event-type-rev.js.map +1 -0
  184. package/dist/cjs/src/file-box-helper/mod.d.ts +4 -0
  185. package/dist/cjs/src/file-box-helper/mod.d.ts.map +1 -0
  186. package/dist/cjs/src/file-box-helper/mod.js +8 -0
  187. package/dist/cjs/src/file-box-helper/mod.js.map +1 -0
  188. package/dist/cjs/src/file-box-helper/normalize-filebox.d.ts +6 -0
  189. package/dist/cjs/src/file-box-helper/normalize-filebox.d.ts.map +1 -0
  190. package/dist/cjs/src/file-box-helper/normalize-filebox.js +76 -0
  191. package/dist/cjs/src/file-box-helper/normalize-filebox.js.map +1 -0
  192. package/dist/cjs/src/file-box-helper/normalize-filebox.spec.d.ts +3 -0
  193. package/dist/cjs/src/file-box-helper/normalize-filebox.spec.d.ts.map +1 -0
  194. package/dist/cjs/src/file-box-helper/normalize-filebox.spec.js +35 -0
  195. package/dist/cjs/src/file-box-helper/normalize-filebox.spec.js.map +1 -0
  196. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts +6 -0
  197. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -0
  198. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.js +45 -0
  199. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.js.map +1 -0
  200. package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts +5 -0
  201. package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -0
  202. package/dist/cjs/src/file-box-helper/uuidify-file-box-local.js +19 -0
  203. package/dist/cjs/src/file-box-helper/uuidify-file-box-local.js.map +1 -0
  204. package/dist/cjs/src/mod.d.ts +8 -0
  205. package/dist/cjs/src/mod.d.ts.map +1 -0
  206. package/dist/cjs/src/mod.js +13 -0
  207. package/dist/cjs/src/mod.js.map +1 -0
  208. package/dist/cjs/src/mod.spec.d.ts +3 -0
  209. package/dist/cjs/src/mod.spec.d.ts.map +1 -0
  210. package/dist/cjs/src/mod.spec.js +32 -0
  211. package/dist/cjs/src/mod.spec.js.map +1 -0
  212. package/dist/cjs/src/package-json.d.ts +6 -0
  213. package/dist/cjs/src/package-json.d.ts.map +1 -0
  214. package/dist/cjs/src/package-json.js +101 -0
  215. package/dist/cjs/src/package-json.js.map +1 -0
  216. package/dist/cjs/src/package-json.spec.d.ts +3 -0
  217. package/dist/cjs/src/package-json.spec.d.ts.map +1 -0
  218. package/dist/cjs/src/package-json.spec.js +10 -0
  219. package/dist/cjs/src/package-json.spec.js.map +1 -0
  220. package/dist/cjs/src/pure-functions/timestamp.d.ts +8 -0
  221. package/dist/cjs/src/pure-functions/timestamp.d.ts.map +1 -0
  222. package/dist/cjs/src/pure-functions/timestamp.js +23 -0
  223. package/dist/cjs/src/pure-functions/timestamp.js.map +1 -0
  224. package/dist/cjs/src/server/event-stream-manager.d.ts +40 -0
  225. package/dist/cjs/src/server/event-stream-manager.d.ts.map +1 -0
  226. package/dist/cjs/src/server/event-stream-manager.js +344 -0
  227. package/dist/cjs/src/server/event-stream-manager.js.map +1 -0
  228. package/dist/cjs/src/server/grpc-error.d.ts +5 -0
  229. package/dist/cjs/src/server/grpc-error.d.ts.map +1 -0
  230. package/dist/cjs/src/server/grpc-error.js +12 -0
  231. package/dist/cjs/src/server/grpc-error.js.map +1 -0
  232. package/dist/cjs/src/server/health-implementation.d.ts +5 -0
  233. package/dist/cjs/src/server/health-implementation.d.ts.map +1 -0
  234. package/dist/cjs/src/server/health-implementation.js +55 -0
  235. package/dist/cjs/src/server/health-implementation.js.map +1 -0
  236. package/dist/cjs/src/server/puppet-implementation.d.ts +6 -0
  237. package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -0
  238. package/dist/cjs/src/server/puppet-implementation.js +1226 -0
  239. package/dist/cjs/src/server/puppet-implementation.js.map +1 -0
  240. package/dist/cjs/src/server/puppet-server.d.ts +23 -0
  241. package/dist/cjs/src/server/puppet-server.d.ts.map +1 -0
  242. package/dist/cjs/src/server/puppet-server.js +159 -0
  243. package/dist/cjs/src/server/puppet-server.js.map +1 -0
  244. package/dist/cjs/src/server/puppet-server.spec.d.ts +3 -0
  245. package/dist/cjs/src/server/puppet-server.spec.d.ts.map +1 -0
  246. package/dist/cjs/src/server/puppet-server.spec.js +15 -0
  247. package/dist/cjs/src/server/puppet-server.spec.js.map +1 -0
  248. package/dist/cjs/tests/grpc-client.spec.d.ts +3 -0
  249. package/dist/cjs/tests/grpc-client.spec.d.ts.map +1 -0
  250. package/dist/cjs/tests/grpc-client.spec.js +137 -0
  251. package/dist/cjs/tests/grpc-client.spec.js.map +1 -0
  252. package/dist/cjs/tests/grpc-stream.spec.d.ts +15 -0
  253. package/dist/cjs/tests/grpc-stream.spec.d.ts.map +1 -0
  254. package/dist/cjs/tests/grpc-stream.spec.js +67 -0
  255. package/dist/cjs/tests/grpc-stream.spec.js.map +1 -0
  256. package/dist/cjs/tests/integration.spec.d.ts +3 -0
  257. package/dist/cjs/tests/integration.spec.d.ts.map +1 -0
  258. package/dist/cjs/tests/integration.spec.js +70 -0
  259. package/dist/cjs/tests/integration.spec.js.map +1 -0
  260. package/dist/cjs/tests/performance.spec.d.ts +14 -0
  261. package/dist/cjs/tests/performance.spec.d.ts.map +1 -0
  262. package/dist/cjs/tests/performance.spec.js +129 -0
  263. package/dist/cjs/tests/performance.spec.js.map +1 -0
  264. package/dist/cjs/tests/ready-event.spec.d.ts +3 -0
  265. package/dist/cjs/tests/ready-event.spec.d.ts.map +1 -0
  266. package/dist/cjs/tests/ready-event.spec.js +80 -0
  267. package/dist/cjs/tests/ready-event.spec.js.map +1 -0
  268. package/dist/cjs/tests/uuid-file-box.spec.d.ts +3 -0
  269. package/dist/cjs/tests/uuid-file-box.spec.d.ts.map +1 -0
  270. package/dist/cjs/tests/uuid-file-box.spec.js +77 -0
  271. package/dist/cjs/tests/uuid-file-box.spec.js.map +1 -0
  272. package/dist/esm/examples/ding-dong-bot.d.ts +2 -0
  273. package/dist/esm/examples/ding-dong-bot.d.ts.map +1 -0
  274. package/dist/esm/examples/ding-dong-bot.js +131 -0
  275. package/dist/esm/examples/ding-dong-bot.js.map +1 -0
  276. package/dist/esm/src/auth/auth-impl-token.d.ts +4 -0
  277. package/dist/esm/src/auth/auth-impl-token.d.ts.map +1 -0
  278. package/dist/esm/src/auth/auth-impl-token.js +78 -0
  279. package/dist/esm/src/auth/auth-impl-token.js.map +1 -0
  280. package/dist/esm/src/auth/auth-impl-token.spec.d.ts +3 -0
  281. package/dist/esm/src/auth/auth-impl-token.spec.d.ts.map +1 -0
  282. package/dist/esm/src/auth/auth-impl-token.spec.js +63 -0
  283. package/dist/esm/src/auth/auth-impl-token.spec.js.map +1 -0
  284. package/dist/esm/src/auth/ca.d.ts +46 -0
  285. package/dist/esm/src/auth/ca.d.ts.map +1 -0
  286. package/dist/esm/src/auth/ca.js +129 -0
  287. package/dist/esm/src/auth/ca.js.map +1 -0
  288. package/dist/esm/src/auth/ca.spec.d.ts +3 -0
  289. package/dist/esm/src/auth/ca.spec.d.ts.map +1 -0
  290. package/dist/esm/src/auth/ca.spec.js +87 -0
  291. package/dist/esm/src/auth/ca.spec.js.map +1 -0
  292. package/dist/esm/src/auth/call-cred.d.ts +9 -0
  293. package/dist/esm/src/auth/call-cred.d.ts.map +1 -0
  294. package/dist/esm/src/auth/call-cred.js +13 -0
  295. package/dist/esm/src/auth/call-cred.js.map +1 -0
  296. package/dist/esm/src/auth/call-cred.spec.d.ts +3 -0
  297. package/dist/esm/src/auth/call-cred.spec.d.ts.map +1 -0
  298. package/dist/esm/src/auth/call-cred.spec.js +16 -0
  299. package/dist/esm/src/auth/call-cred.spec.js.map +1 -0
  300. package/dist/esm/src/auth/env-vars.d.ts +13 -0
  301. package/dist/esm/src/auth/env-vars.d.ts.map +1 -0
  302. package/dist/esm/src/auth/env-vars.js +21 -0
  303. package/dist/esm/src/auth/env-vars.js.map +1 -0
  304. package/dist/esm/src/auth/grpc-js.d.ts +7 -0
  305. package/dist/esm/src/auth/grpc-js.d.ts.map +1 -0
  306. package/dist/esm/src/auth/grpc-js.js +4 -0
  307. package/dist/esm/src/auth/grpc-js.js.map +1 -0
  308. package/dist/esm/src/auth/mod.d.ts +5 -0
  309. package/dist/esm/src/auth/mod.d.ts.map +1 -0
  310. package/dist/esm/src/auth/mod.js +5 -0
  311. package/dist/esm/src/auth/mod.js.map +1 -0
  312. package/dist/esm/src/auth/mokey-patch-header-authorization.d.ts +11 -0
  313. package/dist/esm/src/auth/mokey-patch-header-authorization.d.ts.map +1 -0
  314. package/dist/esm/src/auth/mokey-patch-header-authorization.js +29 -0
  315. package/dist/esm/src/auth/mokey-patch-header-authorization.js.map +1 -0
  316. package/dist/esm/src/auth/monkey-patch-header-authorization.spec.d.ts +3 -0
  317. package/dist/esm/src/auth/monkey-patch-header-authorization.spec.d.ts.map +1 -0
  318. package/dist/esm/src/auth/monkey-patch-header-authorization.spec.js +17 -0
  319. package/dist/esm/src/auth/monkey-patch-header-authorization.spec.js.map +1 -0
  320. package/dist/esm/src/client/duck/actions.d.ts +6 -0
  321. package/dist/esm/src/client/duck/actions.d.ts.map +1 -0
  322. package/dist/esm/src/client/duck/actions.js +28 -0
  323. package/dist/esm/src/client/duck/actions.js.map +1 -0
  324. package/dist/esm/src/client/duck/epic-recover.d.ts +36 -0
  325. package/dist/esm/src/client/duck/epic-recover.d.ts.map +1 -0
  326. package/dist/esm/src/client/duck/epic-recover.js +36 -0
  327. package/dist/esm/src/client/duck/epic-recover.js.map +1 -0
  328. package/dist/esm/src/client/duck/epic-recover.spec.d.ts +3 -0
  329. package/dist/esm/src/client/duck/epic-recover.spec.d.ts.map +1 -0
  330. package/dist/esm/src/client/duck/epic-recover.spec.js +126 -0
  331. package/dist/esm/src/client/duck/epic-recover.spec.js.map +1 -0
  332. package/dist/esm/src/client/duck/epics.d.ts +4 -0
  333. package/dist/esm/src/client/duck/epics.d.ts.map +1 -0
  334. package/dist/esm/src/client/duck/epics.js +33 -0
  335. package/dist/esm/src/client/duck/epics.js.map +1 -0
  336. package/dist/esm/src/client/duck/mod.d.ts +29 -0
  337. package/dist/esm/src/client/duck/mod.d.ts.map +1 -0
  338. package/dist/esm/src/client/duck/mod.js +29 -0
  339. package/dist/esm/src/client/duck/mod.js.map +1 -0
  340. package/dist/esm/src/client/duck/operations.d.ts +23 -0
  341. package/dist/esm/src/client/duck/operations.d.ts.map +1 -0
  342. package/dist/esm/src/client/duck/operations.js +4 -0
  343. package/dist/esm/src/client/duck/operations.js.map +1 -0
  344. package/dist/esm/src/client/duck/reducers.d.ts +59 -0
  345. package/dist/esm/src/client/duck/reducers.d.ts.map +1 -0
  346. package/dist/esm/src/client/duck/reducers.js +26 -0
  347. package/dist/esm/src/client/duck/reducers.js.map +1 -0
  348. package/dist/esm/src/client/duck/selectors.d.ts +21 -0
  349. package/dist/esm/src/client/duck/selectors.d.ts.map +1 -0
  350. package/dist/esm/src/client/duck/selectors.js +22 -0
  351. package/dist/esm/src/client/duck/selectors.js.map +1 -0
  352. package/dist/esm/src/client/duck/tests.spec.d.ts +3 -0
  353. package/dist/esm/src/client/duck/tests.spec.d.ts.map +1 -0
  354. package/dist/esm/src/client/duck/tests.spec.js +24 -0
  355. package/dist/esm/src/client/duck/tests.spec.js.map +1 -0
  356. package/dist/esm/src/client/duck/types.d.ts +21 -0
  357. package/dist/esm/src/client/duck/types.d.ts.map +1 -0
  358. package/dist/esm/src/client/duck/types.js +21 -0
  359. package/dist/esm/src/client/duck/types.js.map +1 -0
  360. package/dist/esm/src/client/duck/utils.d.ts +21 -0
  361. package/dist/esm/src/client/duck/utils.d.ts.map +1 -0
  362. package/dist/esm/src/client/duck/utils.js +2 -0
  363. package/dist/esm/src/client/duck/utils.js.map +1 -0
  364. package/dist/esm/src/client/grpc-manager.d.ts +29 -0
  365. package/dist/esm/src/client/grpc-manager.d.ts.map +1 -0
  366. package/dist/esm/src/client/grpc-manager.js +353 -0
  367. package/dist/esm/src/client/grpc-manager.js.map +1 -0
  368. package/dist/esm/src/client/grpc-manager.spec.d.ts +3 -0
  369. package/dist/esm/src/client/grpc-manager.spec.d.ts.map +1 -0
  370. package/dist/esm/src/client/grpc-manager.spec.js +17 -0
  371. package/dist/esm/src/client/grpc-manager.spec.js.map +1 -0
  372. package/dist/esm/src/client/payload-store.d.ts +26 -0
  373. package/dist/esm/src/client/payload-store.d.ts.map +1 -0
  374. package/dist/esm/src/client/payload-store.js +112 -0
  375. package/dist/esm/src/client/payload-store.js.map +1 -0
  376. package/dist/esm/src/client/payload-store.spec.d.ts +3 -0
  377. package/dist/esm/src/client/payload-store.spec.d.ts.map +1 -0
  378. package/dist/esm/src/client/payload-store.spec.js +15 -0
  379. package/dist/esm/src/client/payload-store.spec.js.map +1 -0
  380. package/dist/esm/src/client/puppet-service.d.ts +161 -0
  381. package/dist/esm/src/client/puppet-service.d.ts.map +1 -0
  382. package/dist/esm/src/client/puppet-service.js +1357 -0
  383. package/dist/esm/src/client/puppet-service.js.map +1 -0
  384. package/dist/esm/src/client/puppet-service.spec.d.ts +3 -0
  385. package/dist/esm/src/client/puppet-service.spec.d.ts.map +1 -0
  386. package/dist/esm/src/client/puppet-service.spec.js +50 -0
  387. package/dist/esm/src/client/puppet-service.spec.js.map +1 -0
  388. package/dist/esm/src/config.d.ts +20 -0
  389. package/dist/esm/src/config.d.ts.map +1 -0
  390. package/dist/esm/src/config.js +20 -0
  391. package/dist/esm/src/config.js.map +1 -0
  392. package/dist/esm/src/deprecated/chunk-pb.d.ts +15 -0
  393. package/dist/esm/src/deprecated/chunk-pb.d.ts.map +1 -0
  394. package/dist/esm/src/deprecated/chunk-pb.js +56 -0
  395. package/dist/esm/src/deprecated/chunk-pb.js.map +1 -0
  396. package/dist/esm/src/deprecated/chunk-pb.spec.d.ts +3 -0
  397. package/dist/esm/src/deprecated/chunk-pb.spec.d.ts.map +1 -0
  398. package/dist/esm/src/deprecated/chunk-pb.spec.js +142 -0
  399. package/dist/esm/src/deprecated/chunk-pb.spec.js.map +1 -0
  400. package/dist/esm/src/deprecated/conversation-id-file-box.d.ts +21 -0
  401. package/dist/esm/src/deprecated/conversation-id-file-box.d.ts.map +1 -0
  402. package/dist/esm/src/deprecated/conversation-id-file-box.js +39 -0
  403. package/dist/esm/src/deprecated/conversation-id-file-box.js.map +1 -0
  404. package/dist/esm/src/deprecated/conversation-id-file-box.spec.d.ts +3 -0
  405. package/dist/esm/src/deprecated/conversation-id-file-box.spec.d.ts.map +1 -0
  406. package/dist/esm/src/deprecated/conversation-id-file-box.spec.js +92 -0
  407. package/dist/esm/src/deprecated/conversation-id-file-box.spec.js.map +1 -0
  408. package/dist/esm/src/deprecated/file-box-chunk.d.ts +14 -0
  409. package/dist/esm/src/deprecated/file-box-chunk.d.ts.map +1 -0
  410. package/dist/esm/src/deprecated/file-box-chunk.js +63 -0
  411. package/dist/esm/src/deprecated/file-box-chunk.js.map +1 -0
  412. package/dist/esm/src/deprecated/file-box-chunk.spec.d.ts +3 -0
  413. package/dist/esm/src/deprecated/file-box-chunk.spec.d.ts.map +1 -0
  414. package/dist/esm/src/deprecated/file-box-chunk.spec.js +132 -0
  415. package/dist/esm/src/deprecated/file-box-chunk.spec.js.map +1 -0
  416. package/dist/esm/src/deprecated/file-box-pb.d.ts +15 -0
  417. package/dist/esm/src/deprecated/file-box-pb.d.ts.map +1 -0
  418. package/dist/esm/src/deprecated/file-box-pb.js +22 -0
  419. package/dist/esm/src/deprecated/file-box-pb.js.map +1 -0
  420. package/dist/esm/src/deprecated/file-box-pb.spec.d.ts +3 -0
  421. package/dist/esm/src/deprecated/file-box-pb.spec.d.ts.map +1 -0
  422. package/dist/esm/src/deprecated/file-box-pb.spec.js +16 -0
  423. package/dist/esm/src/deprecated/file-box-pb.spec.js.map +1 -0
  424. package/dist/esm/src/deprecated/file-box-pb.type.d.ts +15 -0
  425. package/dist/esm/src/deprecated/file-box-pb.type.d.ts.map +1 -0
  426. package/dist/esm/src/deprecated/file-box-pb.type.js +2 -0
  427. package/dist/esm/src/deprecated/file-box-pb.type.js.map +1 -0
  428. package/dist/esm/src/deprecated/mod.d.ts +3 -0
  429. package/dist/esm/src/deprecated/mod.d.ts.map +1 -0
  430. package/dist/esm/src/deprecated/mod.js +3 -0
  431. package/dist/esm/src/deprecated/mod.js.map +1 -0
  432. package/dist/esm/src/deprecated/next-data.d.ts +7 -0
  433. package/dist/esm/src/deprecated/next-data.d.ts.map +1 -0
  434. package/dist/esm/src/deprecated/next-data.js +23 -0
  435. package/dist/esm/src/deprecated/next-data.js.map +1 -0
  436. package/dist/esm/src/deprecated/serialize-file-box.d.ts +6 -0
  437. package/dist/esm/src/deprecated/serialize-file-box.d.ts.map +1 -0
  438. package/dist/esm/src/deprecated/serialize-file-box.js +18 -0
  439. package/dist/esm/src/deprecated/serialize-file-box.js.map +1 -0
  440. package/dist/esm/src/env-vars.d.ts +5 -0
  441. package/dist/esm/src/env-vars.d.ts.map +1 -0
  442. package/dist/esm/src/env-vars.js +83 -0
  443. package/dist/esm/src/env-vars.js.map +1 -0
  444. package/dist/esm/src/env-vars.spec.d.ts +3 -0
  445. package/dist/esm/src/env-vars.spec.d.ts.map +1 -0
  446. package/dist/esm/src/env-vars.spec.js +19 -0
  447. package/dist/esm/src/env-vars.spec.js.map +1 -0
  448. package/dist/esm/src/event-type-rev.d.ts +11 -0
  449. package/dist/esm/src/event-type-rev.d.ts.map +1 -0
  450. package/dist/esm/src/event-type-rev.js +14 -0
  451. package/dist/esm/src/event-type-rev.js.map +1 -0
  452. package/dist/esm/src/file-box-helper/mod.d.ts +4 -0
  453. package/dist/esm/src/file-box-helper/mod.d.ts.map +1 -0
  454. package/dist/esm/src/file-box-helper/mod.js +4 -0
  455. package/dist/esm/src/file-box-helper/mod.js.map +1 -0
  456. package/dist/esm/src/file-box-helper/normalize-filebox.d.ts +6 -0
  457. package/dist/esm/src/file-box-helper/normalize-filebox.d.ts.map +1 -0
  458. package/dist/esm/src/file-box-helper/normalize-filebox.js +72 -0
  459. package/dist/esm/src/file-box-helper/normalize-filebox.js.map +1 -0
  460. package/dist/esm/src/file-box-helper/normalize-filebox.spec.d.ts +3 -0
  461. package/dist/esm/src/file-box-helper/normalize-filebox.spec.d.ts.map +1 -0
  462. package/dist/esm/src/file-box-helper/normalize-filebox.spec.js +33 -0
  463. package/dist/esm/src/file-box-helper/normalize-filebox.spec.js.map +1 -0
  464. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts +6 -0
  465. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -0
  466. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.js +42 -0
  467. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.js.map +1 -0
  468. package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts +5 -0
  469. package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -0
  470. package/dist/esm/src/file-box-helper/uuidify-file-box-local.js +16 -0
  471. package/dist/esm/src/file-box-helper/uuidify-file-box-local.js.map +1 -0
  472. package/dist/esm/src/mod.d.ts +8 -0
  473. package/dist/esm/src/mod.d.ts.map +1 -0
  474. package/dist/esm/src/mod.js +7 -0
  475. package/dist/esm/src/mod.js.map +1 -0
  476. package/dist/esm/src/mod.spec.d.ts +3 -0
  477. package/dist/esm/src/mod.spec.d.ts.map +1 -0
  478. package/dist/esm/src/mod.spec.js +7 -0
  479. package/dist/esm/src/mod.spec.js.map +1 -0
  480. package/dist/esm/src/package-json.d.ts +6 -0
  481. package/dist/esm/src/package-json.d.ts.map +1 -0
  482. package/dist/esm/src/package-json.js +98 -0
  483. package/dist/esm/src/package-json.js.map +1 -0
  484. package/dist/esm/src/package-json.spec.d.ts +3 -0
  485. package/dist/esm/src/package-json.spec.d.ts.map +1 -0
  486. package/dist/esm/src/package-json.spec.js +8 -0
  487. package/dist/esm/src/package-json.spec.js.map +1 -0
  488. package/dist/esm/src/pure-functions/timestamp.d.ts +8 -0
  489. package/dist/esm/src/pure-functions/timestamp.d.ts.map +1 -0
  490. package/dist/esm/src/pure-functions/timestamp.js +19 -0
  491. package/dist/esm/src/pure-functions/timestamp.js.map +1 -0
  492. package/dist/esm/src/server/event-stream-manager.d.ts +40 -0
  493. package/dist/esm/src/server/event-stream-manager.d.ts.map +1 -0
  494. package/dist/esm/src/server/event-stream-manager.js +318 -0
  495. package/dist/esm/src/server/event-stream-manager.js.map +1 -0
  496. package/dist/esm/src/server/grpc-error.d.ts +5 -0
  497. package/dist/esm/src/server/grpc-error.d.ts.map +1 -0
  498. package/dist/esm/src/server/grpc-error.js +8 -0
  499. package/dist/esm/src/server/grpc-error.js.map +1 -0
  500. package/dist/esm/src/server/health-implementation.d.ts +5 -0
  501. package/dist/esm/src/server/health-implementation.d.ts.map +1 -0
  502. package/dist/esm/src/server/health-implementation.js +52 -0
  503. package/dist/esm/src/server/health-implementation.js.map +1 -0
  504. package/dist/esm/src/server/puppet-implementation.d.ts +6 -0
  505. package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -0
  506. package/dist/esm/src/server/puppet-implementation.js +1200 -0
  507. package/dist/esm/src/server/puppet-implementation.js.map +1 -0
  508. package/dist/esm/src/server/puppet-server.d.ts +23 -0
  509. package/dist/esm/src/server/puppet-server.d.ts.map +1 -0
  510. package/dist/esm/src/server/puppet-server.js +152 -0
  511. package/dist/esm/src/server/puppet-server.js.map +1 -0
  512. package/dist/esm/src/server/puppet-server.spec.d.ts +3 -0
  513. package/dist/esm/src/server/puppet-server.spec.d.ts.map +1 -0
  514. package/dist/esm/src/server/puppet-server.spec.js +13 -0
  515. package/dist/esm/src/server/puppet-server.spec.js.map +1 -0
  516. package/dist/esm/tests/grpc-client.spec.d.ts +3 -0
  517. package/dist/esm/tests/grpc-client.spec.d.ts.map +1 -0
  518. package/dist/esm/tests/grpc-client.spec.js +132 -0
  519. package/dist/esm/tests/grpc-client.spec.js.map +1 -0
  520. package/dist/esm/tests/grpc-stream.spec.d.ts +15 -0
  521. package/dist/esm/tests/grpc-stream.spec.d.ts.map +1 -0
  522. package/dist/esm/tests/grpc-stream.spec.js +62 -0
  523. package/dist/esm/tests/grpc-stream.spec.js.map +1 -0
  524. package/dist/esm/tests/integration.spec.d.ts +3 -0
  525. package/dist/esm/tests/integration.spec.d.ts.map +1 -0
  526. package/dist/esm/tests/integration.spec.js +65 -0
  527. package/dist/esm/tests/integration.spec.js.map +1 -0
  528. package/dist/esm/tests/performance.spec.d.ts +14 -0
  529. package/dist/esm/tests/performance.spec.d.ts.map +1 -0
  530. package/dist/esm/tests/performance.spec.js +104 -0
  531. package/dist/esm/tests/performance.spec.js.map +1 -0
  532. package/dist/esm/tests/ready-event.spec.d.ts +3 -0
  533. package/dist/esm/tests/ready-event.spec.d.ts.map +1 -0
  534. package/dist/esm/tests/ready-event.spec.js +52 -0
  535. package/dist/esm/tests/ready-event.spec.js.map +1 -0
  536. package/dist/esm/tests/uuid-file-box.spec.d.ts +3 -0
  537. package/dist/esm/tests/uuid-file-box.spec.d.ts.map +1 -0
  538. package/dist/esm/tests/uuid-file-box.spec.js +49 -0
  539. package/dist/esm/tests/uuid-file-box.spec.js.map +1 -0
  540. package/package.json +97 -0
  541. package/src/auth/README.md +10 -0
  542. package/src/auth/auth-impl-token.spec.ts +81 -0
  543. package/src/auth/auth-impl-token.ts +108 -0
  544. package/src/auth/ca.spec.ts +116 -0
  545. package/src/auth/ca.ts +137 -0
  546. package/src/auth/call-cred.spec.ts +25 -0
  547. package/src/auth/call-cred.ts +22 -0
  548. package/src/auth/env-vars.ts +32 -0
  549. package/src/auth/grpc-js.ts +29 -0
  550. package/src/auth/mod.ts +9 -0
  551. package/src/auth/mokey-patch-header-authorization.ts +45 -0
  552. package/src/auth/monkey-patch-header-authorization.spec.ts +26 -0
  553. package/src/client/duck/actions.ts +31 -0
  554. package/src/client/duck/epic-recover.spec.ts +180 -0
  555. package/src/client/duck/epic-recover.ts +109 -0
  556. package/src/client/duck/epics.ts +53 -0
  557. package/src/client/duck/mod.ts +38 -0
  558. package/src/client/duck/operations.ts +28 -0
  559. package/src/client/duck/reducers.ts +36 -0
  560. package/src/client/duck/selectors.ts +27 -0
  561. package/src/client/duck/tests.spec.ts +25 -0
  562. package/src/client/duck/types.ts +20 -0
  563. package/src/client/duck/utils.ts +20 -0
  564. package/src/client/grpc-manager.spec.ts +20 -0
  565. package/src/client/grpc-manager.ts +440 -0
  566. package/src/client/payload-store.spec.ts +19 -0
  567. package/src/client/payload-store.ts +153 -0
  568. package/src/client/puppet-service.spec.ts +59 -0
  569. package/src/client/puppet-service.ts +1938 -0
  570. package/src/config.ts +31 -0
  571. package/src/deprecated/chunk-pb.spec.ts +210 -0
  572. package/src/deprecated/chunk-pb.ts +75 -0
  573. package/src/deprecated/conversation-id-file-box.spec.ts +131 -0
  574. package/src/deprecated/conversation-id-file-box.ts +72 -0
  575. package/src/deprecated/file-box-chunk.spec.ts +184 -0
  576. package/src/deprecated/file-box-chunk.ts +87 -0
  577. package/src/deprecated/file-box-pb.spec.ts +31 -0
  578. package/src/deprecated/file-box-pb.ts +41 -0
  579. package/src/deprecated/file-box-pb.type.ts +16 -0
  580. package/src/deprecated/mod.ts +8 -0
  581. package/src/deprecated/next-data.ts +35 -0
  582. package/src/deprecated/serialize-file-box.ts +24 -0
  583. package/src/env-vars.spec.ts +23 -0
  584. package/src/env-vars.ts +100 -0
  585. package/src/event-type-rev.ts +19 -0
  586. package/src/file-box-helper/mod.ts +11 -0
  587. package/src/file-box-helper/normalize-filebox.spec.ts +47 -0
  588. package/src/file-box-helper/normalize-filebox.ts +90 -0
  589. package/src/file-box-helper/uuidify-file-box-grpc.ts +83 -0
  590. package/src/file-box-helper/uuidify-file-box-local.ts +31 -0
  591. package/src/mod.spec.ts +9 -0
  592. package/src/mod.ts +25 -0
  593. package/src/package-json.spec.ts +10 -0
  594. package/src/package-json.ts +101 -0
  595. package/src/pure-functions/timestamp.ts +28 -0
  596. package/src/server/event-stream-manager.ts +383 -0
  597. package/src/server/grpc-error.ts +23 -0
  598. package/src/server/health-implementation.ts +78 -0
  599. package/src/server/puppet-implementation.ts +1539 -0
  600. package/src/server/puppet-server.spec.ts +21 -0
  601. package/src/server/puppet-server.ts +239 -0
  602. package/src/typings.d.ts +68 -0
@@ -0,0 +1,1938 @@
1
+ /**
2
+ * Wechaty Open Source Software - https://github.com/wechaty
3
+ *
4
+ * @copyright 2016 Huan LI (李卓桓) <https://github.com/huan>, and
5
+ * Wechaty Contributors <https://github.com/wechaty>.
6
+ *
7
+ * Licensed under the Apache License, Version 2.0 (the "License");
8
+ * you may not use this file except in compliance with the License.
9
+ * You may obtain a copy of the License at
10
+ *
11
+ * http://www.apache.org/licenses/LICENSE-2.0
12
+ *
13
+ * Unless required by applicable law or agreed to in writing, software
14
+ * distributed under the License is distributed on an "AS IS" BASIS,
15
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
16
+ * See the License for the specific language governing permissions and
17
+ * limitations under the License.
18
+ *
19
+ */
20
+ import util from 'util'
21
+ import type { Writable } from 'stream'
22
+ import * as PUPPET from '@juzi/wechaty-puppet'
23
+
24
+ import type {
25
+ FileBoxInterface,
26
+ FileBox,
27
+ } from 'file-box'
28
+ import {
29
+ StringValue,
30
+ puppet as grpcPuppet,
31
+ } from '@juzi/wechaty-grpc'
32
+ import {
33
+ puppet$,
34
+ Duck as PuppetDuck,
35
+ } from 'wechaty-redux'
36
+ import {
37
+ Ducks,
38
+ // Bundle,
39
+ } from 'ducks'
40
+ import type { Store } from 'redux'
41
+ // import type { Subscription } from 'rxjs'
42
+
43
+ /**
44
+ * Deprecated. Will be removed after Dec 31, 2022
45
+ */
46
+ import {
47
+ packConversationIdFileBoxToPb,
48
+ unpackFileBoxFromPb,
49
+ } from '../deprecated/mod.js'
50
+ import { serializeFileBox } from '../deprecated/serialize-file-box.js'
51
+
52
+ import { millisecondsFromTimestamp } from '../pure-functions/timestamp.js'
53
+
54
+ import {
55
+ uuidifyFileBoxGrpc,
56
+ normalizeFileBoxUuid,
57
+ } from '../file-box-helper/mod.js'
58
+ import {
59
+ envVars,
60
+ log,
61
+ VERSION,
62
+ } from '../config.js'
63
+ import {
64
+ EventTypeRev,
65
+ } from '../event-type-rev.js'
66
+ import { packageJson } from '../package-json.js'
67
+
68
+ import { GrpcManager } from './grpc-manager.js'
69
+ import { PayloadStore } from './payload-store.js'
70
+
71
+ export type PuppetServiceOptions = PUPPET.PuppetOptions & {
72
+ authority? : string
73
+ tls?: {
74
+ caCert? : string
75
+ serverName? : string
76
+ /**
77
+ * Huan(202108): only for compatible with old clients/servers
78
+ * for disabling TLS
79
+ */
80
+ disable? : boolean
81
+ }
82
+ }
83
+
84
+ class PuppetService extends PUPPET.Puppet {
85
+
86
+ static override readonly VERSION = VERSION
87
+
88
+ protected _cleanupCallbackList: (() => void)[]
89
+ protected _payloadStore: PayloadStore
90
+
91
+ /**
92
+ * Wechaty Redux
93
+ */
94
+ protected _ducks: Ducks<{ puppet: typeof PuppetDuck }>
95
+ protected _store: Store
96
+
97
+ protected _grpcManager?: GrpcManager
98
+ get grpcManager (): GrpcManager {
99
+ if (!this._grpcManager) {
100
+ throw new Error('no grpc manager')
101
+ }
102
+ return this._grpcManager
103
+ }
104
+
105
+ /**
106
+ * UUIDify:
107
+ * We need to clone a FileBox
108
+ * to set uuid loader/saver with this grpc client
109
+ */
110
+ protected FileBoxUuid: typeof FileBox
111
+
112
+ constructor (
113
+ public override options: PuppetServiceOptions = {},
114
+ ) {
115
+ super(options)
116
+ this._payloadStore = new PayloadStore({
117
+ token: envVars.WECHATY_PUPPET_SERVICE_TOKEN(this.options.token),
118
+ })
119
+
120
+ this.hookPayloadStore()
121
+
122
+ this._ducks = new Ducks({ puppet: PuppetDuck })
123
+ this._store = this._ducks.configureStore()
124
+
125
+ this._cleanupCallbackList = []
126
+
127
+ this.FileBoxUuid = uuidifyFileBoxGrpc(() => this.grpcManager.client)
128
+ }
129
+
130
+ protected async serializeFileBox (fileBox: FileBoxInterface): Promise<string> {
131
+ /**
132
+ * 1. if the fileBox is one of type `Url`, `QRCode`, `Uuid`, etc,
133
+ * then it can be serialized by `fileBox.toString()`
134
+ * 2. if the fileBox is one of type `Stream`, `Buffer`, `File`, etc,
135
+ * then it need to be convert to type `Uuid`
136
+ * before serialized by `fileBox.toString()`
137
+ */
138
+ const normalizedFileBox = await normalizeFileBoxUuid(this.FileBoxUuid)(fileBox)
139
+ return JSON.stringify(normalizedFileBox)
140
+ }
141
+
142
+ override name () {
143
+ return packageJson.name || 'wechaty-puppet-service'
144
+ }
145
+
146
+ override version () {
147
+ return packageJson.version || '0.0.0'
148
+ }
149
+
150
+ override async onStart (): Promise<void> {
151
+ log.verbose('PuppetService', 'onStart()')
152
+
153
+ if (this._grpcManager) {
154
+ log.warn('PuppetService', 'onStart() found this.grpc is already existed. dropped.')
155
+ this._grpcManager = undefined
156
+ }
157
+
158
+ log.verbose('PuppetService', 'start() instanciating GrpcManager ...')
159
+ const grpcManager = new GrpcManager(this.options)
160
+ log.verbose('PuppetService', 'start() instanciating GrpcManager ... done')
161
+
162
+ /**
163
+ * Huan(202108): when we started the event stream,
164
+ * the `this.grpc` need to be available for all listeners.
165
+ */
166
+ this._grpcManager = grpcManager
167
+
168
+ log.verbose('PuppetService', 'start() setting up bridge grpc event stream ...')
169
+ this.bridgeGrpcEventStream(grpcManager)
170
+ log.verbose('PuppetService', 'start() setting up bridge grpc event stream ... done')
171
+
172
+ log.verbose('PuppetService', 'start() starting grpc manager...')
173
+ await grpcManager.start()
174
+ log.verbose('PuppetService', 'start() starting grpc manager... done')
175
+
176
+ /**
177
+ * Ducks management
178
+ */
179
+ const subscription = puppet$(this)
180
+ .subscribe(this._store.dispatch)
181
+
182
+ this._cleanupCallbackList.push(
183
+ () => subscription.unsubscribe(),
184
+ )
185
+
186
+ log.verbose('PuppetService', 'onStart() ... done')
187
+ }
188
+
189
+ override async onStop (): Promise<void> {
190
+ log.verbose('PuppetService', 'onStop()')
191
+
192
+ this._cleanupCallbackList.map(setImmediate)
193
+ this._cleanupCallbackList.length = 0
194
+
195
+ if (this._grpcManager) {
196
+ log.verbose('PuppetService', 'onStop() stopping grpc manager ...')
197
+ const grpcManager = this._grpcManager
198
+ this._grpcManager = undefined
199
+ await grpcManager.stop()
200
+ log.verbose('PuppetService', 'onStop() stopping grpc manager ... done')
201
+ }
202
+
203
+ log.verbose('PuppetService', 'onStop() ... done')
204
+ }
205
+
206
+ protected hookPayloadStore (): void {
207
+ log.verbose('PuppetService', 'hookPayloadStore()')
208
+
209
+ this.on('login', async ({ contactId }) => {
210
+ try {
211
+ log.verbose('PuppetService', 'hookPayloadStore() this.on(login) contactId: "%s"', contactId)
212
+ await this._payloadStore.start(contactId)
213
+ } catch (e) {
214
+ log.verbose('PuppetService', 'hookPayloadStore() this.on(login) rejection "%s"', (e as Error).message)
215
+ }
216
+ })
217
+
218
+ this.on('logout', async ({ contactId }) => {
219
+ log.verbose('PuppetService', 'hookPayloadStore() this.on(logout) contactId: "%s"', contactId)
220
+ try {
221
+ await this._payloadStore.stop()
222
+ } catch (e) {
223
+ log.verbose('PuppetService', 'hookPayloadStore() this.on(logout) rejection "%s"', (e as Error).message)
224
+ }
225
+ })
226
+ }
227
+
228
+ protected bridgeGrpcEventStream (client: GrpcManager): void {
229
+ log.verbose('PuppetService', 'bridgeGrpcEventStream(client)')
230
+
231
+ client
232
+ .on('data', this.onGrpcStreamEvent.bind(this))
233
+ .on('end', () => {
234
+ log.verbose('PuppetService', 'bridgeGrpcEventStream() eventStream.on(end)')
235
+ })
236
+ .on('error', (e: unknown) => {
237
+ this.emit('error', e)
238
+ // https://github.com/wechaty/wechaty-puppet-service/issues/16
239
+ // log.verbose('PuppetService', 'bridgeGrpcEventStream() eventStream.on(error) %s', e)
240
+ // const reason = 'bridgeGrpcEventStream() eventStream.on(error) ' + e
241
+ /**
242
+ * Huan(202110): simple reset puppet when grpc client has error? (or not?)
243
+ */
244
+ // this.wrapAsync(this.reset())
245
+ // /**
246
+ // * The `Puppet` class have a throttleQueue for receiving the `reset` events
247
+ // * and it's the `Puppet` class's duty for call the `puppet.reset()` to reset the puppet.
248
+ // */
249
+ // if (this.state.on()) {
250
+ // this.emit('reset', { data: reason })
251
+ // }
252
+ })
253
+ .on('cancel', (...args: any[]) => {
254
+ log.verbose('PuppetService', 'bridgeGrpcEventStream() eventStream.on(cancel), %s', JSON.stringify(args))
255
+ })
256
+ }
257
+
258
+ private onGrpcStreamEvent (event: grpcPuppet.EventResponse): void {
259
+ const type = event.getType()
260
+ const payload = event.getPayload()
261
+
262
+ log.verbose('PuppetService',
263
+ 'onGrpcStreamEvent({type:%s(%s), payload(len:%s)})',
264
+ EventTypeRev[type],
265
+ type,
266
+ payload.length,
267
+ )
268
+ log.silly('PuppetService',
269
+ 'onGrpcStreamEvent({type:%s(%s), payload:"%s"})',
270
+ EventTypeRev[type],
271
+ type,
272
+ payload,
273
+ )
274
+
275
+ if (type !== grpcPuppet.EventType.EVENT_TYPE_HEARTBEAT) {
276
+ this.emit('heartbeat', {
277
+ data: `onGrpcStreamEvent(${EventTypeRev[type]})`,
278
+ })
279
+ }
280
+
281
+ switch (type) {
282
+ case grpcPuppet.EventType.EVENT_TYPE_DONG:
283
+ this.emit('dong', JSON.parse(payload) as PUPPET.payloads.EventDong)
284
+ break
285
+ case grpcPuppet.EventType.EVENT_TYPE_ERROR:
286
+ this.emit('error', JSON.parse(payload) as PUPPET.payloads.EventError)
287
+ break
288
+ case grpcPuppet.EventType.EVENT_TYPE_HEARTBEAT:
289
+ this.emit('heartbeat', JSON.parse(payload) as PUPPET.payloads.EventHeartbeat)
290
+ break
291
+ case grpcPuppet.EventType.EVENT_TYPE_FRIENDSHIP:
292
+ this.emit('friendship', JSON.parse(payload) as PUPPET.payloads.EventFriendship)
293
+ break
294
+ case grpcPuppet.EventType.EVENT_TYPE_LOGIN:
295
+ {
296
+ const loginPayload = JSON.parse(payload) as PUPPET.payloads.EventLogin
297
+ ;(
298
+ async () => this.login(loginPayload.contactId)
299
+ )().catch(e =>
300
+ log.error('PuppetService', 'onGrpcStreamEvent() this.login() rejection %s',
301
+ (e as Error).message,
302
+ ),
303
+ )
304
+ }
305
+ break
306
+ case grpcPuppet.EventType.EVENT_TYPE_LOGOUT:
307
+ {
308
+ const logoutPayload = JSON.parse(payload) as PUPPET.payloads.EventLogout
309
+ ;(
310
+ async () => this.logout(logoutPayload.data)
311
+ )().catch(e =>
312
+ log.error('PuppetService', 'onGrpcStreamEvent() this.logout() rejection %s',
313
+ (e as Error).message,
314
+ ),
315
+ )
316
+ }
317
+ break
318
+ case grpcPuppet.EventType.EVENT_TYPE_DIRTY:
319
+ this.emit('dirty', JSON.parse(payload) as PUPPET.payloads.EventDirty)
320
+ break
321
+ case grpcPuppet.EventType.EVENT_TYPE_MESSAGE:
322
+ this.emit('message', JSON.parse(payload) as PUPPET.payloads.EventMessage)
323
+ break
324
+ case grpcPuppet.EventType.EVENT_TYPE_POST:
325
+ this.emit('post', JSON.parse(payload) as PUPPET.payloads.EventPost)
326
+ break
327
+ case grpcPuppet.EventType.EVENT_TYPE_READY:
328
+ this.emit('ready', JSON.parse(payload) as PUPPET.payloads.EventReady)
329
+ break
330
+ case grpcPuppet.EventType.EVENT_TYPE_ROOM_INVITE:
331
+ this.emit('room-invite', JSON.parse(payload) as PUPPET.payloads.EventRoomInvite)
332
+ break
333
+ case grpcPuppet.EventType.EVENT_TYPE_ROOM_JOIN:
334
+ this.emit('room-join', JSON.parse(payload) as PUPPET.payloads.EventRoomJoin)
335
+ break
336
+ case grpcPuppet.EventType.EVENT_TYPE_ROOM_LEAVE:
337
+ this.emit('room-leave', JSON.parse(payload) as PUPPET.payloads.EventRoomLeave)
338
+ break
339
+ case grpcPuppet.EventType.EVENT_TYPE_ROOM_TOPIC:
340
+ this.emit('room-topic', JSON.parse(payload) as PUPPET.payloads.EventRoomTopic)
341
+ break
342
+ case grpcPuppet.EventType.EVENT_TYPE_SCAN:
343
+ this.emit('scan', JSON.parse(payload) as PUPPET.payloads.EventScan)
344
+ break
345
+ case grpcPuppet.EventType.EVENT_TYPE_RESET:
346
+ log.warn('PuppetService', 'onGrpcStreamEvent() got an EventType.EVENT_TYPE_RESET ?')
347
+ // the `reset` event should be dealed not send out
348
+ break
349
+
350
+ case grpcPuppet.EventType.EVENT_TYPE_UNSPECIFIED:
351
+ log.error('PuppetService', 'onGrpcStreamEvent() got an EventType.EVENT_TYPE_UNSPECIFIED ?')
352
+ break
353
+
354
+ default:
355
+ // Huan(202003): in default, the `type` type should be `never`, please check.
356
+ throw new Error('eventType ' + type + ' unsupported! (code should not reach here)')
357
+ }
358
+ }
359
+
360
+ override async logout (reason?: string): Promise<void> {
361
+ log.verbose('PuppetService', 'logout(%s)', reason ? `"${reason}"` : '')
362
+
363
+ await super.logout(reason)
364
+
365
+ try {
366
+ await util.promisify(
367
+ this.grpcManager.client.logout
368
+ .bind(this.grpcManager.client),
369
+ )(new grpcPuppet.LogoutRequest())
370
+
371
+ } catch (e) {
372
+ log.silly('PuppetService', 'logout() no grpc client')
373
+ }
374
+ }
375
+
376
+ override ding (data: string): void {
377
+ log.silly('PuppetService', 'ding(%s)', data)
378
+
379
+ const request = new grpcPuppet.DingRequest()
380
+ request.setData(data || '')
381
+
382
+ this.grpcManager.client.ding(
383
+ request,
384
+ (error, _response) => {
385
+ if (error) {
386
+ log.error('PuppetService', 'ding() rejection: %s', error)
387
+ }
388
+ },
389
+ )
390
+ }
391
+
392
+ /**
393
+ *
394
+ * Huan(202111) Issue #158 - Refactoring the 'dirty' event, dirtyPayload(),
395
+ * and XXXPayloadDirty() methods logic & spec
396
+ *
397
+ * @see https://github.com/wechaty/puppet/issues/158
398
+ *
399
+ */
400
+ override async dirtyPayload (type: PUPPET.types.Dirty, id: string) {
401
+ log.verbose('PuppetService', 'dirtyPayload(%s, %s)', type, id)
402
+
403
+ const request = new grpcPuppet.DirtyPayloadRequest()
404
+ request.setId(id)
405
+ request.setType(type as Parameters<typeof request.setType>[0])
406
+ try {
407
+ await util.promisify(
408
+ this.grpcManager.client.dirtyPayload
409
+ .bind(this.grpcManager.client),
410
+ )(request)
411
+
412
+ } catch (e) {
413
+ log.error('PuppetService', 'dirtyPayload() rejection: %s', e && (e as Error).message)
414
+ throw e
415
+ }
416
+ }
417
+
418
+ /**
419
+ * `onDirty()` is called when the puppet emit `dirty` event.
420
+ * the event listener will be registered in `start()` from the `PuppetAbstract` class
421
+ */
422
+ override onDirty (
423
+ {
424
+ payloadType,
425
+ payloadId,
426
+ }: PUPPET.payloads.EventDirty,
427
+ ): void {
428
+ log.verbose('PuppetService', 'onDirty(%s<%s>, %s)', PUPPET.types.Dirty[payloadType], payloadType, payloadId)
429
+
430
+ const dirtyMap = {
431
+ [PUPPET.types.Dirty.Contact]: async (id: string) => this._payloadStore.contact?.delete(id),
432
+ [PUPPET.types.Dirty.Friendship]: async (_: string) => {},
433
+ [PUPPET.types.Dirty.Message]: async (_: string) => {},
434
+ [PUPPET.types.Dirty.Post]: async (_: string) => {},
435
+ [PUPPET.types.Dirty.Room]: async (id: string) => this._payloadStore.room?.delete(id),
436
+ [PUPPET.types.Dirty.RoomMember]: async (id: string) => this._payloadStore.roomMember?.delete(id),
437
+ [PUPPET.types.Dirty.Unspecified]: async (id: string) => { throw new Error('Unspecified type with id: ' + id) },
438
+ }
439
+
440
+ const dirtyFuncSync = this.wrapAsync(dirtyMap[payloadType])
441
+ dirtyFuncSync(payloadId)
442
+
443
+ /**
444
+ * We need to call `super.onDirty()` to clean the `PuppetAbstract` LRUCache
445
+ */
446
+ super.onDirty({ payloadId, payloadType })
447
+ }
448
+
449
+ /**
450
+ *
451
+ * Contact
452
+ *
453
+ */
454
+ override contactAlias (contactId: string) : Promise<string>
455
+ override contactAlias (contactId: string, alias: string | null): Promise<void>
456
+
457
+ override async contactAlias (contactId: string, alias?: string | null): Promise<void | string> {
458
+ log.verbose('PuppetService', 'contactAlias(%s, %s)', contactId, alias)
459
+
460
+ /**
461
+ * Get alias
462
+ */
463
+ if (typeof alias === 'undefined') {
464
+ const request = new grpcPuppet.ContactAliasRequest()
465
+ request.setId(contactId)
466
+
467
+ const response = await util.promisify(
468
+ this.grpcManager.client.contactAlias
469
+ .bind(this.grpcManager.client),
470
+ )(request)
471
+
472
+ const result = response.getAlias()
473
+ if (result) {
474
+ return result
475
+ }
476
+
477
+ {
478
+ // DEPRECATED, will be removed after Dec 31, 2022
479
+ const aliasWrapper = response.getAliasStringValueDeprecated()
480
+
481
+ if (!aliasWrapper) {
482
+ throw new Error('can not get aliasWrapper')
483
+ }
484
+
485
+ return aliasWrapper.getValue()
486
+ }
487
+ }
488
+
489
+ /**
490
+ * Set alias
491
+ */
492
+ const request = new grpcPuppet.ContactAliasRequest()
493
+ request.setId(contactId)
494
+ request.setAlias(alias || '') // null -> '', in server, we treat '' as null
495
+
496
+ {
497
+ // DEPRECATED, will be removed after Dec 31, 2022
498
+ const aliasWrapper = new StringValue()
499
+ aliasWrapper.setValue(alias || '') // null -> '', in server, we treat '' as null
500
+ request.setAliasStringValueDeprecated(aliasWrapper)
501
+ }
502
+
503
+ await util.promisify(
504
+ this.grpcManager.client.contactAlias
505
+ .bind(this.grpcManager.client),
506
+ )(request)
507
+ }
508
+
509
+ override async contactPhone (contactId: string, phoneList: string[]): Promise<void> {
510
+ log.verbose('PuppetService', 'contactPhone(%s, %s)', contactId, phoneList)
511
+
512
+ const request = new grpcPuppet.ContactPhoneRequest()
513
+ request.setContactId(contactId)
514
+ request.setPhonesList(phoneList)
515
+
516
+ await util.promisify(
517
+ this.grpcManager.client.contactPhone
518
+ .bind(this.grpcManager.client),
519
+ )(request)
520
+ }
521
+
522
+ override async contactCorporationRemark (contactId: string, corporationRemark: string | null) {
523
+ log.verbose('PuppetService', 'contactCorporationRemark(%s, %s)', contactId, corporationRemark)
524
+
525
+ const request = new grpcPuppet.ContactCorporationRemarkRequest()
526
+ request.setContactId(contactId)
527
+ if (corporationRemark) {
528
+ request.setCorporationRemark(corporationRemark)
529
+ }
530
+
531
+ {
532
+ // DEPRECATED, will be removed after Dec 31, 2022
533
+ const corporationRemarkWrapper = new StringValue()
534
+ if (corporationRemark) {
535
+ corporationRemarkWrapper.setValue(corporationRemark)
536
+ request.setCorporationRemarkStringValueDeprecated(corporationRemarkWrapper)
537
+ }
538
+ }
539
+
540
+ await util.promisify(
541
+ this.grpcManager.client.contactCorporationRemark
542
+ .bind(this.grpcManager.client),
543
+ )(request)
544
+ }
545
+
546
+ override async contactDescription (contactId: string, description: string | null) {
547
+ log.verbose('PuppetService', 'contactDescription(%s, %s)', contactId, description)
548
+
549
+ const request = new grpcPuppet.ContactDescriptionRequest()
550
+ request.setContactId(contactId)
551
+ if (description) {
552
+ request.setDescription(description)
553
+ }
554
+
555
+ {
556
+ // DEPRECATED, will be removed after Dec 31, 2022
557
+ const descriptionWrapper = new StringValue()
558
+ if (description) {
559
+ descriptionWrapper.setValue(description)
560
+ request.setDescriptionStringValueDeprecated(descriptionWrapper)
561
+ }
562
+ }
563
+
564
+ await util.promisify(
565
+ this.grpcManager.client.contactDescription
566
+ .bind(this.grpcManager.client),
567
+ )(request)
568
+ }
569
+
570
+ override async contactList (): Promise<string[]> {
571
+ log.verbose('PuppetService', 'contactList()')
572
+
573
+ const response = await util.promisify(
574
+ this.grpcManager.client.contactList
575
+ .bind(this.grpcManager.client),
576
+ )(new grpcPuppet.ContactListRequest())
577
+
578
+ return response.getIdsList()
579
+ }
580
+
581
+ override async contactAvatar (contactId: string) : Promise<FileBoxInterface>
582
+ override async contactAvatar (contactId: string, file: FileBoxInterface) : Promise<void>
583
+
584
+ override async contactAvatar (contactId: string, fileBox?: FileBoxInterface): Promise<void | FileBoxInterface> {
585
+ log.verbose('PuppetService', 'contactAvatar(%s)', contactId)
586
+
587
+ /**
588
+ * 1. set
589
+ */
590
+ if (fileBox) {
591
+ const request = new grpcPuppet.ContactAvatarRequest()
592
+ request.setId(contactId)
593
+
594
+ const serializedFileBox = await this.serializeFileBox(fileBox)
595
+ request.setFileBox(serializedFileBox)
596
+
597
+ {
598
+ // DEPRECATED, will be removed after Dec 31, 2022
599
+ const fileboxWrapper = new StringValue()
600
+ fileboxWrapper.setValue(await serializeFileBox(fileBox))
601
+ request.setFileboxStringValueDeprecated(fileboxWrapper)
602
+ }
603
+
604
+ await util.promisify(
605
+ this.grpcManager.client.contactAvatar
606
+ .bind(this.grpcManager.client),
607
+ )(request)
608
+
609
+ return
610
+ }
611
+
612
+ /**
613
+ * 2. get
614
+ */
615
+ const request = new grpcPuppet.ContactAvatarRequest()
616
+ request.setId(contactId)
617
+
618
+ const response = await util.promisify(
619
+ this.grpcManager.client.contactAvatar
620
+ .bind(this.grpcManager.client),
621
+ )(request)
622
+
623
+ let jsonText: string
624
+ jsonText = response.getFileBox()
625
+
626
+ {
627
+ // DEPRECATED, will be removed after Dec 31, 2022
628
+ const deprecated = true
629
+ void deprecated
630
+
631
+ if (!jsonText) {
632
+ const textWrapper = response.getFileboxStringValueDeprecated()
633
+ if (!textWrapper) {
634
+ throw new Error('can not get textWrapper')
635
+ }
636
+ jsonText = textWrapper.getValue()
637
+ }
638
+ }
639
+
640
+ return this.FileBoxUuid.fromJSON(jsonText)
641
+ }
642
+
643
+ override async contactRawPayload (id: string): Promise<PUPPET.payloads.Contact> {
644
+ log.verbose('PuppetService', 'contactRawPayload(%s)', id)
645
+
646
+ const cachedPayload = await this._payloadStore.contact?.get(id)
647
+ if (cachedPayload) {
648
+ log.silly('PuppetService', 'contactRawPayload(%s) cache HIT', id)
649
+ return cachedPayload
650
+ }
651
+
652
+ const request = new grpcPuppet.ContactPayloadRequest()
653
+ request.setId(id)
654
+
655
+ const response = await util.promisify(
656
+ this.grpcManager.client.contactPayload
657
+ .bind(this.grpcManager.client),
658
+ )(request)
659
+
660
+ const payload: PUPPET.payloads.Contact = {
661
+ address : response.getAddress(),
662
+ alias : response.getAlias(),
663
+ avatar : response.getAvatar(),
664
+ city : response.getCity(),
665
+ corporation : response.getCorporation(),
666
+ coworker : response.getCoworker(),
667
+ description : response.getDescription(),
668
+ friend : response.getFriend(),
669
+ gender : response.getGender() as number,
670
+ /**
671
+ * Huan(202203): rename `getWeixin()` to `getHandle()` in v2.0.0
672
+ * @link https://github.com/wechaty/grpc/issues/174
673
+ */
674
+ handle : response.getWeixin(),
675
+ id : response.getId(),
676
+ name : response.getName(),
677
+ phone : response.getPhonesList(),
678
+ province : response.getProvince(),
679
+ signature : response.getSignature(),
680
+ star : response.getStar(),
681
+ title : response.getTitle(),
682
+ type : response.getType() as number,
683
+ /**
684
+ * `weixin` is deprecated, will be removed after Dec 31, 2022
685
+ * use `handle` instead.
686
+ */
687
+ weixin : response.getWeixin(),
688
+ }
689
+
690
+ await this._payloadStore.contact?.set(id, payload)
691
+ log.silly('PuppetService', 'contactRawPayload(%s) cache SET', id)
692
+
693
+ return payload
694
+ }
695
+
696
+ override async contactRawPayloadParser (payload: PUPPET.payloads.Contact): Promise<PUPPET.payloads.Contact> {
697
+ // log.silly('PuppetService', 'contactRawPayloadParser({id:%s})', payload.id)
698
+ // passthrough
699
+ return payload
700
+ }
701
+
702
+ override async contactSelfName (name: string): Promise<void> {
703
+ log.verbose('PuppetService', 'contactSelfName(%s)', name)
704
+
705
+ const request = new grpcPuppet.ContactSelfNameRequest()
706
+ request.setName(name)
707
+
708
+ await util.promisify(
709
+ this.grpcManager.client.contactSelfName
710
+ .bind(this.grpcManager.client),
711
+ )(request)
712
+ }
713
+
714
+ override async contactSelfQRCode (): Promise<string> {
715
+ log.verbose('PuppetService', 'contactSelfQRCode()')
716
+
717
+ const response = await util.promisify(
718
+ this.grpcManager.client.contactSelfQRCode
719
+ .bind(this.grpcManager.client),
720
+ )(new grpcPuppet.ContactSelfQRCodeRequest())
721
+
722
+ return response.getQrcode()
723
+ }
724
+
725
+ override async contactSelfSignature (signature: string): Promise<void> {
726
+ log.verbose('PuppetService', 'contactSelfSignature(%s)', signature)
727
+
728
+ const request = new grpcPuppet.ContactSelfSignatureRequest()
729
+ request.setSignature(signature)
730
+
731
+ await util.promisify(
732
+ this.grpcManager.client.contactSelfSignature
733
+ .bind(this.grpcManager.client),
734
+ )(request)
735
+ }
736
+
737
+ /**
738
+ *
739
+ * Conversation
740
+ *
741
+ */
742
+ override conversationReadMark (
743
+ conversationId: string,
744
+ hasRead = true,
745
+ ) : Promise<void> {
746
+ log.verbose('PuppetService', 'conversationMarkRead(%s, %s)', conversationId, hasRead)
747
+ return PUPPET.throwUnsupportedError('not implemented. See https://github.com/wechaty/wechaty-puppet/pull/132')
748
+ }
749
+
750
+ /**
751
+ *
752
+ * Message
753
+ *
754
+ */
755
+ override async messageMiniProgram (
756
+ messageId: string,
757
+ ): Promise<PUPPET.payloads.MiniProgram> {
758
+ log.verbose('PuppetService', 'messageMiniProgram(%s)', messageId)
759
+
760
+ const request = new grpcPuppet.MessageMiniProgramRequest()
761
+ request.setId(messageId)
762
+
763
+ const response = await util.promisify(
764
+ this.grpcManager.client.messageMiniProgram
765
+ .bind(this.grpcManager.client),
766
+ )(request)
767
+
768
+ let miniProgramPayload = response.getMiniProgram()?.toObject()
769
+ if (!miniProgramPayload) {
770
+ /**
771
+ * Deprecated: will be removed after Dec 22, 2022
772
+ */
773
+ const jsonText = response.getMiniProgramDeprecated()
774
+ miniProgramPayload = JSON.parse(jsonText)
775
+ }
776
+
777
+ const payload: PUPPET.payloads.MiniProgram = {
778
+ ...miniProgramPayload,
779
+ }
780
+
781
+ return payload
782
+ }
783
+
784
+ override async messageLocation (
785
+ messageId: string,
786
+ ): Promise<PUPPET.payloads.Location> {
787
+ log.verbose('PuppetService', 'messageLocation(%s)', messageId)
788
+
789
+ const request = new grpcPuppet.MessageLocationRequest()
790
+ request.setId(messageId)
791
+
792
+ const response = await util.promisify(
793
+ this.grpcManager.client.messageLocation
794
+ .bind(this.grpcManager.client),
795
+ )(request)
796
+
797
+ const locationPayload = response.getLocation()
798
+ const payload: PUPPET.payloads.Location = {
799
+ accuracy : 0,
800
+ address : 'NOADDRESS',
801
+ latitude : 0,
802
+ longitude : 0,
803
+ name : 'NONAME',
804
+ ...locationPayload,
805
+ }
806
+
807
+ return payload
808
+ }
809
+
810
+ override async messageImage (
811
+ messageId: string,
812
+ imageType: PUPPET.types.Image,
813
+ ): Promise<FileBoxInterface> {
814
+ log.verbose('PuppetService', 'messageImage(%s, %s[%s])',
815
+ messageId,
816
+ imageType,
817
+ PUPPET.types.Image[imageType],
818
+ )
819
+
820
+ try {
821
+ const request = new grpcPuppet.MessageImageRequest()
822
+ request.setId(messageId)
823
+ request.setType(imageType)
824
+
825
+ const response = await util.promisify(
826
+ this.grpcManager.client.messageImage
827
+ .bind(this.grpcManager.client),
828
+ )(request)
829
+
830
+ const jsonText = response.getFileBox()
831
+
832
+ if (jsonText) {
833
+ return this.FileBoxUuid.fromJSON(jsonText)
834
+ }
835
+
836
+ } catch (e) {
837
+ log.verbose('PuppetService', 'messageImage() rejection %s', (e as Error).message)
838
+ }
839
+
840
+ {
841
+ // Deprecated. Will be removed after Dec 31, 2022
842
+ const request = new grpcPuppet.MessageImageStreamRequest()
843
+ request.setId(messageId)
844
+ request.setType(imageType)
845
+
846
+ const pbStream = this.grpcManager.client.messageImageStream(request)
847
+ const fileBox = await unpackFileBoxFromPb(pbStream)
848
+ // const fileBoxChunkStream = unpackFileBoxChunk(stream)
849
+ // return unpackFileBox(fileBoxChunkStream)
850
+ return fileBox
851
+ }
852
+ }
853
+
854
+ override async messageContact (
855
+ messageId: string,
856
+ ): Promise<string> {
857
+ log.verbose('PuppetService', 'messageContact(%s)', messageId)
858
+
859
+ const request = new grpcPuppet.MessageContactRequest()
860
+ request.setId(messageId)
861
+
862
+ const response = await util.promisify(
863
+ this.grpcManager.client.messageContact
864
+ .bind(this.grpcManager.client),
865
+ )(request)
866
+
867
+ const contactId = response.getId()
868
+ return contactId
869
+ }
870
+
871
+ override async messageSendMiniProgram (
872
+ conversationId : string,
873
+ miniProgramPayload : PUPPET.payloads.MiniProgram,
874
+ ): Promise<void | string> {
875
+ log.verbose('PuppetService', 'messageSendMiniProgram(%s, "%s")', conversationId, JSON.stringify(miniProgramPayload))
876
+
877
+ const request = new grpcPuppet.MessageSendMiniProgramRequest()
878
+ request.setConversationId(conversationId)
879
+
880
+ const pbMiniProgramPayload = new grpcPuppet.MiniProgramPayload()
881
+ if (miniProgramPayload.appid) { pbMiniProgramPayload.setAppid(miniProgramPayload.appid) }
882
+ if (miniProgramPayload.description) { pbMiniProgramPayload.setDescription(miniProgramPayload.description) }
883
+ if (miniProgramPayload.iconUrl) { pbMiniProgramPayload.setIconUrl(miniProgramPayload.iconUrl) }
884
+ if (miniProgramPayload.pagePath) { pbMiniProgramPayload.setPagePath(miniProgramPayload.pagePath) }
885
+ if (miniProgramPayload.shareId) { pbMiniProgramPayload.setShareId(miniProgramPayload.shareId) }
886
+ if (miniProgramPayload.thumbKey) { pbMiniProgramPayload.setThumbKey(miniProgramPayload.thumbKey) }
887
+ if (miniProgramPayload.thumbUrl) { pbMiniProgramPayload.setThumbUrl(miniProgramPayload.thumbUrl) }
888
+ if (miniProgramPayload.title) { pbMiniProgramPayload.setTitle(miniProgramPayload.title) }
889
+ if (miniProgramPayload.username) { pbMiniProgramPayload.setUsername(miniProgramPayload.username) }
890
+ request.setMiniProgram(pbMiniProgramPayload)
891
+
892
+ /**
893
+ * Deprecated: will be removed after Dec 31, 2022
894
+ */
895
+ request.setMiniProgramDeprecated(JSON.stringify(miniProgramPayload))
896
+
897
+ const response = await util.promisify(
898
+ this.grpcManager.client.messageSendMiniProgram
899
+ .bind(this.grpcManager.client),
900
+ )(request)
901
+
902
+ const messageId = response.getId()
903
+
904
+ if (messageId) {
905
+ return messageId
906
+ }
907
+
908
+ {
909
+ /**
910
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
911
+ */
912
+ const messageIdWrapper = response.getIdStringValueDeprecated()
913
+
914
+ if (messageIdWrapper) {
915
+ return messageIdWrapper.getValue()
916
+ }
917
+ }
918
+ }
919
+
920
+ override async messageSendLocation (
921
+ conversationId: string,
922
+ locationPayload: PUPPET.payloads.Location,
923
+ ): Promise<void | string> {
924
+ log.verbose('PuppetService', 'messageSendLocation(%s)', conversationId, JSON.stringify(locationPayload))
925
+
926
+ const request = new grpcPuppet.MessageSendLocationRequest()
927
+ request.setConversationId(conversationId)
928
+
929
+ const pbLocationPayload = new grpcPuppet.LocationPayload()
930
+ pbLocationPayload.setAccuracy(locationPayload.accuracy)
931
+ pbLocationPayload.setAddress(locationPayload.address)
932
+ pbLocationPayload.setLatitude(locationPayload.latitude)
933
+ pbLocationPayload.setLongitude(locationPayload.longitude)
934
+ pbLocationPayload.setName(locationPayload.name)
935
+ request.setLocation(pbLocationPayload)
936
+
937
+ const response = await util.promisify(
938
+ this.grpcManager.client.messageSendLocation
939
+ .bind(this.grpcManager.client),
940
+ )(request)
941
+
942
+ const id = response.getId()
943
+
944
+ if (id) {
945
+ return id
946
+ }
947
+ }
948
+
949
+ override async messageRecall (
950
+ messageId: string,
951
+ ): Promise<boolean> {
952
+ log.verbose('PuppetService', 'messageRecall(%s)', messageId)
953
+
954
+ const request = new grpcPuppet.MessageRecallRequest()
955
+ request.setId(messageId)
956
+
957
+ const response = await util.promisify(
958
+ this.grpcManager.client.messageRecall
959
+ .bind(this.grpcManager.client),
960
+ )(request)
961
+
962
+ return response.getSuccess()
963
+ }
964
+
965
+ override async messageFile (id: string): Promise<FileBoxInterface> {
966
+ log.verbose('PuppetService', 'messageFile(%s)', id)
967
+
968
+ try {
969
+ const request = new grpcPuppet.MessageFileRequest()
970
+ request.setId(id)
971
+ const response = await util.promisify(
972
+ this.grpcManager.client.messageFile
973
+ .bind(this.grpcManager.client),
974
+ )(request)
975
+
976
+ const jsonText = response.getFileBox()
977
+ if (jsonText) {
978
+ return this.FileBoxUuid.fromJSON(jsonText)
979
+ }
980
+ } catch (e) {
981
+ log.warn('PuppetService', 'messageFile() rejection: %s', (e as Error).message)
982
+ log.warn('PuppetService', [
983
+ 'This might because you are using Wechaty v1.x with a Puppet Service v0.x',
984
+ 'Contact your Wechaty Puppet Service provided to report this problem',
985
+ 'Related issues:',
986
+ ' - https://github.com/wechaty/puppet-service/issues/179',
987
+ ' - https://github.com/wechaty/puppet-service/pull/170',
988
+ ].join('\n'))
989
+ }
990
+
991
+ {
992
+ // Deprecated. `MessageFileStream` Will be removed after Dec 31, 2022
993
+ const request = new grpcPuppet.MessageFileStreamRequest()
994
+ request.setId(id)
995
+
996
+ const pbStream = this.grpcManager.client.messageFileStream(request)
997
+ // const fileBoxChunkStream = unpackFileBoxChunk(pbStream)
998
+ // return unpackFileBox(fileBoxChunkStream)
999
+ const fileBox = await unpackFileBoxFromPb(pbStream)
1000
+ return fileBox
1001
+ }
1002
+ }
1003
+
1004
+ override async messageForward (
1005
+ conversationId: string,
1006
+ messageId: string,
1007
+ ): Promise<string | void> {
1008
+ log.verbose('PuppetService', 'messageForward(%s, %s)', conversationId, messageId)
1009
+
1010
+ const request = new grpcPuppet.MessageForwardRequest()
1011
+ request.setConversationId(conversationId)
1012
+ request.setMessageId(messageId)
1013
+
1014
+ const response = await util.promisify(
1015
+ this.grpcManager.client.messageForward
1016
+ .bind(this.grpcManager.client),
1017
+ )(request)
1018
+
1019
+ const forwardedMessageId = response.getId()
1020
+
1021
+ if (forwardedMessageId) {
1022
+ return forwardedMessageId
1023
+ }
1024
+
1025
+ {
1026
+ /**
1027
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1028
+ */
1029
+ const messageIdWrapper = response.getIdStringValueDeprecated()
1030
+
1031
+ if (messageIdWrapper) {
1032
+ return messageIdWrapper.getValue()
1033
+ }
1034
+ }
1035
+ }
1036
+
1037
+ override async messageRawPayload (id: string): Promise<PUPPET.payloads.Message> {
1038
+ log.verbose('PuppetService', 'messageRawPayload(%s)', id)
1039
+
1040
+ // const cachedPayload = await this.payloadStore.message?.get(id)
1041
+ // if (cachedPayload) {
1042
+ // log.silly('PuppetService', 'messageRawPayload(%s) cache HIT', id)
1043
+ // return cachedPayload
1044
+ // }
1045
+
1046
+ const request = new grpcPuppet.MessagePayloadRequest()
1047
+ request.setId(id)
1048
+
1049
+ const response = await util.promisify(
1050
+ this.grpcManager.client.messagePayload
1051
+ .bind(this.grpcManager.client),
1052
+ )(request)
1053
+
1054
+ let timestamp
1055
+ const receiveTime = response.getReceiveTime()
1056
+ if (receiveTime) {
1057
+ timestamp = millisecondsFromTimestamp(receiveTime)
1058
+ } else {
1059
+ // Deprecated: will be removed after Dec 31, 2022
1060
+ timestamp = response.getTimestampDeprecated()
1061
+ }
1062
+
1063
+ const payload: PUPPET.payloads.Message = {
1064
+ filename : response.getFilename(),
1065
+ id : response.getId(),
1066
+ listenerId : response.getListenerId(),
1067
+ mentionIdList : response.getMentionIdsList(),
1068
+ roomId : response.getRoomId(),
1069
+ talkerId : response.getTalkerId(),
1070
+ text : response.getText(),
1071
+ timestamp,
1072
+ type : response.getType() as number,
1073
+ }
1074
+
1075
+ // log.silly('PuppetService', 'messageRawPayload(%s) cache SET', id)
1076
+ // await this.payloadStore.message?.set(id, payload)
1077
+
1078
+ return payload
1079
+ }
1080
+
1081
+ override async messageRawPayloadParser (payload: PUPPET.payloads.Message): Promise<PUPPET.payloads.Message> {
1082
+ // log.silly('PuppetService', 'messagePayload({id:%s})', payload.id)
1083
+ // passthrough
1084
+ return payload
1085
+ }
1086
+
1087
+ override async messageSendText (
1088
+ conversationId : string,
1089
+ text : string,
1090
+ mentionIdList? : string[],
1091
+ ): Promise<void | string> {
1092
+ log.verbose('PuppetService', 'messageSend(%s, %s)', conversationId, text)
1093
+
1094
+ const request = new grpcPuppet.MessageSendTextRequest()
1095
+ request.setConversationId(conversationId)
1096
+ request.setText(text)
1097
+ if (typeof mentionIdList !== 'undefined') {
1098
+ request.setMentionalIdsList(mentionIdList)
1099
+ }
1100
+
1101
+ const response = await util.promisify(
1102
+ this.grpcManager.client.messageSendText
1103
+ .bind(this.grpcManager.client),
1104
+ )(request)
1105
+
1106
+ const messageId = response.getId()
1107
+
1108
+ if (messageId) {
1109
+ return messageId
1110
+ }
1111
+
1112
+ {
1113
+ /**
1114
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1115
+ */
1116
+ const messageIdWrapper = response.getIdStringValueDeprecated()
1117
+
1118
+ if (messageIdWrapper) {
1119
+ return messageIdWrapper.getValue()
1120
+ }
1121
+ }
1122
+ }
1123
+
1124
+ override async messageSendFile (
1125
+ conversationId : string,
1126
+ fileBox : FileBoxInterface,
1127
+ ): Promise<void | string> {
1128
+ log.verbose('PuppetService', 'messageSendFile(%s, %s)', conversationId, fileBox)
1129
+
1130
+ try {
1131
+ const request = new grpcPuppet.MessageSendFileRequest()
1132
+ request.setConversationId(conversationId)
1133
+
1134
+ const serializedFileBox = await this.serializeFileBox(fileBox)
1135
+ request.setFileBox(serializedFileBox)
1136
+
1137
+ const response = await util.promisify(
1138
+ this.grpcManager.client.messageSendFile
1139
+ .bind(this.grpcManager.client),
1140
+ )(request)
1141
+
1142
+ const messageId = response.getId()
1143
+
1144
+ if (messageId) {
1145
+ return messageId
1146
+ } else {
1147
+ /**
1148
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1149
+ */
1150
+ const messageIdWrapper = response.getIdStringValueDeprecated()
1151
+ if (messageIdWrapper) {
1152
+ return messageIdWrapper.getValue()
1153
+ }
1154
+ }
1155
+
1156
+ return // void
1157
+
1158
+ } catch (e) {
1159
+ log.verbose('PuppetService', 'messageSendFile() rejection: %s', (e as Error).message)
1160
+ }
1161
+
1162
+ /**
1163
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1164
+ * The old server will not support `Upload` gRPC method,
1165
+ * which I'm expecting the above code will throw a exception,
1166
+ * then the below code will be executed.
1167
+ */
1168
+ return this.messageSendFileStream(conversationId, fileBox)
1169
+ }
1170
+
1171
+ override async messageSendContact (
1172
+ conversationId : string,
1173
+ contactId : string,
1174
+ ): Promise<void | string> {
1175
+ log.verbose('PuppetService', 'messageSend("%s", %s)', conversationId, contactId)
1176
+
1177
+ const request = new grpcPuppet.MessageSendContactRequest()
1178
+ request.setConversationId(conversationId)
1179
+ request.setContactId(contactId)
1180
+
1181
+ const response = await util.promisify(
1182
+ this.grpcManager.client.messageSendContact
1183
+ .bind(this.grpcManager.client),
1184
+ )(request)
1185
+
1186
+ const messageId = response.getId()
1187
+
1188
+ if (messageId) {
1189
+ return messageId
1190
+ }
1191
+
1192
+ {
1193
+ /**
1194
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1195
+ */
1196
+ const messageIdWrapper = response.getIdStringValueDeprecated()
1197
+
1198
+ if (messageIdWrapper) {
1199
+ return messageIdWrapper.getValue()
1200
+ }
1201
+ }
1202
+ }
1203
+
1204
+ override async messageSendUrl (
1205
+ conversationId: string,
1206
+ urlLinkPayload: PUPPET.payloads.UrlLink,
1207
+ ): Promise<void | string> {
1208
+ log.verbose('PuppetService', 'messageSendUrl("%s", %s)', conversationId, JSON.stringify(urlLinkPayload))
1209
+
1210
+ const request = new grpcPuppet.MessageSendUrlRequest()
1211
+ request.setConversationId(conversationId)
1212
+
1213
+ const pbUrlLinkPayload = new grpcPuppet.UrlLinkPayload()
1214
+ pbUrlLinkPayload.setUrl(urlLinkPayload.url)
1215
+ pbUrlLinkPayload.setTitle(urlLinkPayload.title)
1216
+ if (urlLinkPayload.description) { pbUrlLinkPayload.setDescription(urlLinkPayload.description) }
1217
+ if (urlLinkPayload.thumbnailUrl) { pbUrlLinkPayload.setThumbnailUrl(urlLinkPayload.thumbnailUrl) }
1218
+ request.setUrlLink(pbUrlLinkPayload)
1219
+
1220
+ // Deprecated: will be removed after Dec 31, 2022
1221
+ request.setUrlLinkDeprecated(JSON.stringify(urlLinkPayload))
1222
+
1223
+ const response = await util.promisify(
1224
+ this.grpcManager.client.messageSendUrl
1225
+ .bind(this.grpcManager.client),
1226
+ )(request)
1227
+
1228
+ const messageId = response.getId()
1229
+
1230
+ if (messageId) {
1231
+ return messageId
1232
+ }
1233
+
1234
+ {
1235
+ /**
1236
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1237
+ */
1238
+ const messageIdWrapper = response.getIdStringValueDeprecated()
1239
+
1240
+ if (messageIdWrapper) {
1241
+ return messageIdWrapper.getValue()
1242
+ }
1243
+ }
1244
+ }
1245
+
1246
+ override async messageUrl (messageId: string): Promise<PUPPET.payloads.UrlLink> {
1247
+ log.verbose('PuppetService', 'messageUrl(%s)', messageId)
1248
+
1249
+ const request = new grpcPuppet.MessageUrlRequest()
1250
+ request.setId(messageId)
1251
+
1252
+ const response = await util.promisify(
1253
+ this.grpcManager.client.messageUrl
1254
+ .bind(this.grpcManager.client),
1255
+ )(request)
1256
+
1257
+ let pbUrlLinkPayload = response.getUrlLink()?.toObject()
1258
+ if (!pbUrlLinkPayload) {
1259
+ // Deprecated: will be removed after Dec 31, 2022
1260
+ const jsonText = response.getUrlLinkDeprecated()
1261
+ pbUrlLinkPayload = JSON.parse(jsonText)
1262
+ }
1263
+
1264
+ const payload: PUPPET.payloads.UrlLink = {
1265
+ title : 'NOTITLE',
1266
+ url : 'NOURL',
1267
+ ...pbUrlLinkPayload,
1268
+ }
1269
+ return payload
1270
+ }
1271
+
1272
+ /**
1273
+ *
1274
+ * Room
1275
+ *
1276
+ */
1277
+ override async roomRawPayload (
1278
+ id: string,
1279
+ ): Promise<PUPPET.payloads.Room> {
1280
+ log.verbose('PuppetService', 'roomRawPayload(%s)', id)
1281
+
1282
+ const cachedPayload = await this._payloadStore.room?.get(id)
1283
+ if (cachedPayload) {
1284
+ log.silly('PuppetService', 'roomRawPayload(%s) cache HIT', id)
1285
+ return cachedPayload
1286
+ }
1287
+
1288
+ const request = new grpcPuppet.RoomPayloadRequest()
1289
+ request.setId(id)
1290
+
1291
+ const response = await util.promisify(
1292
+ this.grpcManager.client.roomPayload
1293
+ .bind(this.grpcManager.client),
1294
+ )(request)
1295
+
1296
+ const payload: PUPPET.payloads.Room = {
1297
+ adminIdList : response.getAdminIdsList(),
1298
+ avatar : response.getAvatar(),
1299
+ handle : response.getHandle(),
1300
+ id : response.getId(),
1301
+ memberIdList : response.getMemberIdsList(),
1302
+ ownerId : response.getOwnerId(),
1303
+ topic : response.getTopic(),
1304
+ }
1305
+
1306
+ await this._payloadStore.room?.set(id, payload)
1307
+ log.silly('PuppetService', 'roomRawPayload(%s) cache SET', id)
1308
+
1309
+ return payload
1310
+ }
1311
+
1312
+ override async roomRawPayloadParser (payload: PUPPET.payloads.Room): Promise<PUPPET.payloads.Room> {
1313
+ // log.silly('PuppetService', 'roomRawPayloadParser({id:%s})', payload.id)
1314
+ // passthrough
1315
+ return payload
1316
+ }
1317
+
1318
+ override async roomList (): Promise<string[]> {
1319
+ log.verbose('PuppetService', 'roomList()')
1320
+
1321
+ const response = await util.promisify(
1322
+ this.grpcManager.client.roomList
1323
+ .bind(this.grpcManager.client),
1324
+ )(new grpcPuppet.RoomListRequest())
1325
+
1326
+ return response.getIdsList()
1327
+ }
1328
+
1329
+ override async roomDel (
1330
+ roomId : string,
1331
+ contactId : string,
1332
+ ): Promise<void> {
1333
+ log.verbose('PuppetService', 'roomDel(%s, %s)', roomId, contactId)
1334
+
1335
+ const request = new grpcPuppet.RoomDelRequest()
1336
+ request.setId(roomId)
1337
+ request.setContactId(contactId)
1338
+
1339
+ await util.promisify(
1340
+ this.grpcManager.client.roomDel
1341
+ .bind(this.grpcManager.client),
1342
+ )(request)
1343
+ }
1344
+
1345
+ override async roomAvatar (roomId: string): Promise<FileBoxInterface> {
1346
+ log.verbose('PuppetService', 'roomAvatar(%s)', roomId)
1347
+
1348
+ const request = new grpcPuppet.RoomAvatarRequest()
1349
+ request.setId(roomId)
1350
+
1351
+ const response = await util.promisify(
1352
+ this.grpcManager.client.roomAvatar
1353
+ .bind(this.grpcManager.client),
1354
+ )(request)
1355
+
1356
+ const jsonText = response.getFileBox()
1357
+ return this.FileBoxUuid.fromJSON(jsonText)
1358
+ }
1359
+
1360
+ override async roomAdd (
1361
+ roomId : string,
1362
+ contactId : string,
1363
+ inviteOnly : boolean,
1364
+ ): Promise<void> {
1365
+ log.verbose('PuppetService', 'roomAdd(%s, %s)', roomId, contactId)
1366
+
1367
+ const request = new grpcPuppet.RoomAddRequest()
1368
+ request.setId(roomId)
1369
+ request.setContactId(contactId)
1370
+ request.setInviteOnly(inviteOnly)
1371
+
1372
+ await util.promisify(
1373
+ this.grpcManager.client.roomAdd
1374
+ .bind(this.grpcManager.client),
1375
+ )(request)
1376
+ }
1377
+
1378
+ override async roomTopic (roomId: string) : Promise<string>
1379
+ override async roomTopic (roomId: string, topic: string) : Promise<void>
1380
+
1381
+ override async roomTopic (
1382
+ roomId: string,
1383
+ topic?: string,
1384
+ ): Promise<void | string> {
1385
+ log.verbose('PuppetService', 'roomTopic(%s, %s)', roomId, topic)
1386
+
1387
+ /**
1388
+ * Get
1389
+ */
1390
+ if (typeof topic === 'undefined') {
1391
+ const request = new grpcPuppet.RoomTopicRequest()
1392
+ request.setId(roomId)
1393
+
1394
+ const response = await util.promisify(
1395
+ this.grpcManager.client.roomTopic
1396
+ .bind(this.grpcManager.client),
1397
+ )(request)
1398
+
1399
+ const result = response.getTopic()
1400
+ if (result) {
1401
+ return result
1402
+ }
1403
+
1404
+ {
1405
+ // DEPRECATED, will be removed after Dec 31, 2022
1406
+ const topicWrapper = response.getTopicStringValueDeprecated()
1407
+ if (topicWrapper) {
1408
+ return topicWrapper.getValue()
1409
+ }
1410
+ }
1411
+
1412
+ return ''
1413
+ }
1414
+
1415
+ /**
1416
+ * Set
1417
+ */
1418
+ const request = new grpcPuppet.RoomTopicRequest()
1419
+ request.setId(roomId)
1420
+ request.setTopic(topic)
1421
+
1422
+ {
1423
+ // DEPRECATED, will be removed after Dec 31, 2022
1424
+ const topicWrapper = new StringValue()
1425
+ topicWrapper.setValue(topic)
1426
+
1427
+ request.setTopicStringValueDeprecated(topicWrapper)
1428
+ }
1429
+
1430
+ await util.promisify(
1431
+ this.grpcManager.client.roomTopic
1432
+ .bind(this.grpcManager.client),
1433
+ )(request)
1434
+ }
1435
+
1436
+ override async roomCreate (
1437
+ contactIdList : string[],
1438
+ topic : string,
1439
+ ): Promise<string> {
1440
+ log.verbose('PuppetService', 'roomCreate(%s, %s)', contactIdList, topic)
1441
+
1442
+ const request = new grpcPuppet.RoomCreateRequest()
1443
+ request.setContactIdsList(contactIdList)
1444
+ request.setTopic(topic)
1445
+
1446
+ const response = await util.promisify(
1447
+ this.grpcManager.client.roomCreate
1448
+ .bind(this.grpcManager.client),
1449
+ )(request)
1450
+
1451
+ return response.getId()
1452
+ }
1453
+
1454
+ override async roomQuit (roomId: string): Promise<void> {
1455
+ log.verbose('PuppetService', 'roomQuit(%s)', roomId)
1456
+
1457
+ const request = new grpcPuppet.RoomQuitRequest()
1458
+ request.setId(roomId)
1459
+
1460
+ await util.promisify(
1461
+ this.grpcManager.client.roomQuit
1462
+ .bind(this.grpcManager.client),
1463
+ )(request)
1464
+ }
1465
+
1466
+ override async roomQRCode (roomId: string): Promise<string> {
1467
+ log.verbose('PuppetService', 'roomQRCode(%s)', roomId)
1468
+
1469
+ const request = new grpcPuppet.RoomQRCodeRequest()
1470
+ request.setId(roomId)
1471
+
1472
+ const response = await util.promisify(
1473
+ this.grpcManager.client.roomQRCode
1474
+ .bind(this.grpcManager.client),
1475
+ )(request)
1476
+
1477
+ return response.getQrcode()
1478
+ }
1479
+
1480
+ override async roomMemberList (roomId: string) : Promise<string[]> {
1481
+ log.verbose('PuppetService', 'roomMemberList(%s)', roomId)
1482
+
1483
+ const request = new grpcPuppet.RoomMemberListRequest()
1484
+ request.setId(roomId)
1485
+
1486
+ const response = await util.promisify(
1487
+ this.grpcManager.client.roomMemberList
1488
+ .bind(this.grpcManager.client),
1489
+ )(request)
1490
+
1491
+ return response.getMemberIdsList()
1492
+ }
1493
+
1494
+ override async roomMemberRawPayload (roomId: string, contactId: string): Promise<PUPPET.payloads.RoomMember> {
1495
+ log.verbose('PuppetService', 'roomMemberRawPayload(%s, %s)', roomId, contactId)
1496
+
1497
+ const cachedPayload = await this._payloadStore.roomMember?.get(roomId)
1498
+ const cachedRoomMemberPayload = cachedPayload && cachedPayload[contactId]
1499
+
1500
+ if (cachedRoomMemberPayload) {
1501
+ log.silly('PuppetService', 'roomMemberRawPayload(%s, %s) cache HIT', roomId, contactId)
1502
+ return cachedRoomMemberPayload
1503
+ }
1504
+
1505
+ const request = new grpcPuppet.RoomMemberPayloadRequest()
1506
+ request.setId(roomId)
1507
+ request.setMemberId(contactId)
1508
+
1509
+ const response = await util.promisify(
1510
+ this.grpcManager.client.roomMemberPayload
1511
+ .bind(this.grpcManager.client),
1512
+ )(request)
1513
+
1514
+ const payload: PUPPET.payloads.RoomMember = {
1515
+ avatar : response.getAvatar(),
1516
+ id : response.getId(),
1517
+ inviterId : response.getInviterId(),
1518
+ name : response.getName(),
1519
+ roomAlias : response.getRoomAlias(),
1520
+ }
1521
+
1522
+ await this._payloadStore.roomMember?.set(roomId, {
1523
+ ...cachedPayload,
1524
+ [contactId]: payload,
1525
+ })
1526
+ log.silly('PuppetService', 'roomMemberRawPayload(%s, %s) cache SET', roomId, contactId)
1527
+
1528
+ return payload
1529
+ }
1530
+
1531
+ override async roomMemberRawPayloadParser (payload: PUPPET.payloads.RoomMember): Promise<PUPPET.payloads.RoomMember> {
1532
+ // log.silly('PuppetService', 'roomMemberRawPayloadParser({id:%s})', payload.id)
1533
+ // passthrough
1534
+ return payload
1535
+ }
1536
+
1537
+ override async roomAnnounce (roomId: string) : Promise<string>
1538
+ override async roomAnnounce (roomId: string, text: string) : Promise<void>
1539
+
1540
+ override async roomAnnounce (roomId: string, text?: string) : Promise<void | string> {
1541
+ log.verbose('PuppetService', 'roomAnnounce(%s%s)',
1542
+ roomId,
1543
+ typeof text === 'undefined'
1544
+ ? ''
1545
+ : `, ${text}`,
1546
+ )
1547
+
1548
+ /**
1549
+ * Set
1550
+ */
1551
+ if (text) {
1552
+ const request = new grpcPuppet.RoomAnnounceRequest()
1553
+ request.setId(roomId)
1554
+ request.setText(text)
1555
+
1556
+ {
1557
+ // DEPRECATED, will be removed after Dec 31, 2022
1558
+ const textWrapper = new StringValue()
1559
+ textWrapper.setValue(text)
1560
+ request.setTextStringValueDeprecated(textWrapper)
1561
+ }
1562
+
1563
+ await util.promisify(
1564
+ this.grpcManager.client.roomAnnounce
1565
+ .bind(this.grpcManager.client),
1566
+ )(request)
1567
+
1568
+ return
1569
+ }
1570
+
1571
+ /**
1572
+ * Get
1573
+ */
1574
+ const request = new grpcPuppet.RoomAnnounceRequest()
1575
+ request.setId(roomId)
1576
+
1577
+ const response = await util.promisify(
1578
+ this.grpcManager.client.roomAnnounce
1579
+ .bind(this.grpcManager.client),
1580
+ )(request)
1581
+
1582
+ const result = response.getText()
1583
+ if (result) {
1584
+ return result
1585
+ }
1586
+
1587
+ {
1588
+ // DEPRECATED, will be removed after Dec 31, 2022
1589
+ const textWrapper = response.getTextStringValueDeprecated()
1590
+ if (textWrapper) {
1591
+ return textWrapper.getValue()
1592
+ }
1593
+ }
1594
+
1595
+ return ''
1596
+ }
1597
+
1598
+ override async roomInvitationAccept (
1599
+ roomInvitationId: string,
1600
+ ): Promise<void> {
1601
+ log.verbose('PuppetService', 'roomInvitationAccept(%s)', roomInvitationId)
1602
+
1603
+ const request = new grpcPuppet.RoomInvitationAcceptRequest()
1604
+ request.setId(roomInvitationId)
1605
+
1606
+ await util.promisify(
1607
+ this.grpcManager.client.roomInvitationAccept
1608
+ .bind(this.grpcManager.client),
1609
+ )(request)
1610
+ }
1611
+
1612
+ override async roomInvitationRawPayload (
1613
+ id: string,
1614
+ ): Promise<PUPPET.payloads.RoomInvitation> {
1615
+ log.verbose('PuppetService', 'roomInvitationRawPayload(%s)', id)
1616
+
1617
+ const request = new grpcPuppet.RoomInvitationPayloadRequest()
1618
+ request.setId(id)
1619
+
1620
+ const response = await util.promisify(
1621
+ this.grpcManager.client.roomInvitationPayload
1622
+ .bind(this.grpcManager.client),
1623
+ )(request)
1624
+
1625
+ let timestamp
1626
+ const receiveTime = response.getReceiveTime()
1627
+ if (receiveTime) {
1628
+ timestamp = millisecondsFromTimestamp(receiveTime)
1629
+ }
1630
+
1631
+ {
1632
+ // Deprecated: will be removed after Dec 31, 2022
1633
+ const deprecated = true
1634
+ void deprecated
1635
+
1636
+ if (!receiveTime) {
1637
+ timestamp = response.getTimestampUint64Deprecated()
1638
+ }
1639
+ }
1640
+
1641
+ // FIXME: how to set it better?
1642
+ timestamp ??= 0
1643
+
1644
+ const payload: PUPPET.payloads.RoomInvitation = {
1645
+ avatar : response.getAvatar(),
1646
+ id : response.getId(),
1647
+ invitation : response.getInvitation(),
1648
+ inviterId : response.getInviterId(),
1649
+ memberCount : response.getMemberCount(),
1650
+ memberIdList : response.getMemberIdsList(),
1651
+ receiverId : response.getReceiverId(),
1652
+ timestamp,
1653
+ topic : response.getTopic(),
1654
+ }
1655
+
1656
+ return payload
1657
+ }
1658
+
1659
+ override async roomInvitationRawPayloadParser (payload: PUPPET.payloads.RoomInvitation): Promise<PUPPET.payloads.RoomInvitation> {
1660
+ // log.silly('PuppetService', 'roomInvitationRawPayloadParser({id:%s})', payload.id)
1661
+ // passthrough
1662
+ return payload
1663
+ }
1664
+
1665
+ /**
1666
+ *
1667
+ * Friendship
1668
+ *
1669
+ */
1670
+ override async friendshipSearchPhone (
1671
+ phone: string,
1672
+ ): Promise<string | null> {
1673
+ log.verbose('PuppetService', 'friendshipSearchPhone(%s)', phone)
1674
+
1675
+ const request = new grpcPuppet.FriendshipSearchPhoneRequest()
1676
+ request.setPhone(phone)
1677
+
1678
+ const response = await util.promisify(
1679
+ this.grpcManager.client.friendshipSearchPhone
1680
+ .bind(this.grpcManager.client),
1681
+ )(request)
1682
+
1683
+ const contactId = response.getContactId()
1684
+ if (contactId) {
1685
+ return contactId
1686
+ }
1687
+
1688
+ {
1689
+ // DEPRECATED, will be removed after Dec 31, 2022
1690
+ const contactIdWrapper = response.getContactIdStringValueDeprecated()
1691
+ if (contactIdWrapper) {
1692
+ return contactIdWrapper.getValue()
1693
+ }
1694
+ }
1695
+
1696
+ return null
1697
+ }
1698
+
1699
+ override async friendshipSearchHandle (
1700
+ handle: string,
1701
+ ): Promise<string | null> {
1702
+ log.verbose('PuppetService', 'friendshipSearchHandle(%s)', handle)
1703
+
1704
+ const request = new grpcPuppet.FriendshipSearchHandleRequest()
1705
+ /**
1706
+ * TODO: use `setHandle()` in v2.0.0
1707
+ * @link https://github.com/wechaty/grpc/issues/174
1708
+ */
1709
+ request.setWeixin(handle)
1710
+
1711
+ const response = await util.promisify(
1712
+ this.grpcManager.client.friendshipSearchHandle
1713
+ .bind(this.grpcManager.client),
1714
+ )(request)
1715
+
1716
+ const contactId = response.getContactId()
1717
+ if (contactId) {
1718
+ return contactId
1719
+ }
1720
+
1721
+ {
1722
+ // DEPRECATED, will be removed after Dec 31, 2022
1723
+ const contactIdWrapper = response.getContactIdStringValueDeprecated()
1724
+ if (contactIdWrapper) {
1725
+ return contactIdWrapper.getValue()
1726
+ }
1727
+ }
1728
+
1729
+ return null
1730
+ }
1731
+
1732
+ override async friendshipRawPayload (id: string): Promise<PUPPET.payloads.Friendship> {
1733
+ log.verbose('PuppetService', 'friendshipRawPayload(%s)', id)
1734
+
1735
+ const request = new grpcPuppet.FriendshipPayloadRequest()
1736
+ request.setId(id)
1737
+
1738
+ const response = await util.promisify(
1739
+ this.grpcManager.client.friendshipPayload
1740
+ .bind(this.grpcManager.client),
1741
+ )(request)
1742
+
1743
+ const payload: PUPPET.payloads.Friendship = {
1744
+ contactId : response.getContactId(),
1745
+ hello: response.getHello(),
1746
+ id,
1747
+ scene : response.getScene() as number,
1748
+ stranger : response.getStranger(),
1749
+ ticket : response.getTicket(),
1750
+ type : response.getType() as number,
1751
+ } as any // FIXME: Huan(202002)
1752
+
1753
+ return payload
1754
+ }
1755
+
1756
+ override async friendshipRawPayloadParser (payload: PUPPET.payloads.Friendship) : Promise<PUPPET.payloads.Friendship> {
1757
+ // log.silly('PuppetService', 'friendshipRawPayloadParser({id:%s})', payload.id)
1758
+ // passthrough
1759
+ return payload
1760
+ }
1761
+
1762
+ override async friendshipAdd (
1763
+ contactId : string,
1764
+ options : PUPPET.types.FriendshipAddOptions,
1765
+ ): Promise<void> {
1766
+ log.verbose('PuppetService', 'friendshipAdd(%s, %s)', contactId, JSON.stringify(options))
1767
+
1768
+ const request = new grpcPuppet.FriendshipAddRequest()
1769
+ request.setContactId(contactId)
1770
+
1771
+ // FIXME: for backward compatibility, need to be removed after all puppet has updated.
1772
+ if (typeof options === 'string') {
1773
+ request.setHello(options)
1774
+ } else {
1775
+ request.setHello(options.hello!)
1776
+
1777
+ const referrer = new grpcPuppet.Referrer()
1778
+ if (options.contactId) { referrer.setContactId(options.contactId) }
1779
+ if (options.roomId) { referrer.setRoomId(options.roomId) }
1780
+ request.setReferrer(referrer)
1781
+
1782
+ {
1783
+ // Deprecated: will be removed after Dec 31, 2022
1784
+ const contactIdWrapper = new StringValue()
1785
+ contactIdWrapper.setValue(options.contactId || '')
1786
+ const roomIdWrapper = new StringValue()
1787
+ roomIdWrapper.setValue(options.roomId || '')
1788
+ request.setSourceRoomIdStringValueDeprecated(roomIdWrapper)
1789
+ request.setSourceContactIdStringValueDeprecated(contactIdWrapper)
1790
+ }
1791
+ }
1792
+
1793
+ await util.promisify(
1794
+ this.grpcManager.client.friendshipAdd
1795
+ .bind(this.grpcManager.client),
1796
+ )(request)
1797
+ }
1798
+
1799
+ override async friendshipAccept (
1800
+ friendshipId : string,
1801
+ ): Promise<void> {
1802
+ log.verbose('PuppetService', 'friendshipAccept(%s)', friendshipId)
1803
+
1804
+ const request = new grpcPuppet.FriendshipAcceptRequest()
1805
+ request.setId(friendshipId)
1806
+
1807
+ await util.promisify(
1808
+ this.grpcManager.client.friendshipAccept
1809
+ .bind(this.grpcManager.client),
1810
+ )(request)
1811
+ }
1812
+
1813
+ /**
1814
+ *
1815
+ * Tag
1816
+ *
1817
+ */
1818
+ // add a tag for a Contact. Create it first if it not exist.
1819
+ override async tagContactAdd (
1820
+ id: string,
1821
+ contactId: string,
1822
+ ): Promise<void> {
1823
+ log.verbose('PuppetService', 'tagContactAdd(%s, %s)', id, contactId)
1824
+
1825
+ const request = new grpcPuppet.TagContactAddRequest()
1826
+ request.setId(id)
1827
+ request.setContactId(contactId)
1828
+
1829
+ await util.promisify(
1830
+ this.grpcManager.client.tagContactAdd
1831
+ .bind(this.grpcManager.client),
1832
+ )(request)
1833
+ }
1834
+
1835
+ // remove a tag from the Contact
1836
+ override async tagContactRemove (
1837
+ id: string,
1838
+ contactId: string,
1839
+ ) : Promise<void> {
1840
+ log.verbose('PuppetService', 'tagContactRemove(%s, %s)', id, contactId)
1841
+
1842
+ const request = new grpcPuppet.TagContactRemoveRequest()
1843
+ request.setId(id)
1844
+ request.setContactId(contactId)
1845
+
1846
+ await util.promisify(
1847
+ this.grpcManager.client.tagContactRemove
1848
+ .bind(this.grpcManager.client),
1849
+ )(request)
1850
+ }
1851
+
1852
+ // delete a tag from Wechat
1853
+ override async tagContactDelete (
1854
+ id: string,
1855
+ ) : Promise<void> {
1856
+ log.verbose('PuppetService', 'tagContactDelete(%s)', id)
1857
+
1858
+ const request = new grpcPuppet.TagContactDeleteRequest()
1859
+ request.setId(id)
1860
+
1861
+ await util.promisify(
1862
+ this.grpcManager.client.tagContactDelete
1863
+ .bind(this.grpcManager.client),
1864
+ )(request)
1865
+ }
1866
+
1867
+ // get tags from a specific Contact
1868
+ override async tagContactList (
1869
+ contactId?: string,
1870
+ ) : Promise<string[]> {
1871
+ log.verbose('PuppetService', 'tagContactList(%s)', contactId)
1872
+
1873
+ const request = new grpcPuppet.TagContactListRequest()
1874
+
1875
+ if (typeof contactId !== 'undefined') {
1876
+ request.setContactId(contactId)
1877
+ {
1878
+
1879
+ /**
1880
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1881
+ */
1882
+ const contactIdWrapper = new StringValue()
1883
+ contactIdWrapper.setValue(contactId)
1884
+ request.setContactIdStringValueDeprecated(contactIdWrapper)
1885
+ }
1886
+ }
1887
+
1888
+ const response = await util.promisify(
1889
+ this.grpcManager.client.tagContactList
1890
+ .bind(this.grpcManager.client),
1891
+ )(request)
1892
+
1893
+ return response.getIdsList()
1894
+ }
1895
+
1896
+ /**
1897
+ * @deprecated Will be removed in v2.0
1898
+ */
1899
+ private async messageSendFileStream (
1900
+ conversationId : string,
1901
+ file : FileBoxInterface,
1902
+ ): Promise<void | string> {
1903
+ const request = await packConversationIdFileBoxToPb(grpcPuppet.MessageSendFileStreamRequest)(conversationId, file)
1904
+
1905
+ const response = await new Promise<grpcPuppet.MessageSendFileStreamResponse>((resolve, reject) => {
1906
+ const stream = this.grpcManager.client.messageSendFileStream((err, response) => {
1907
+ if (err) {
1908
+ reject(err)
1909
+ } else {
1910
+ resolve(response)
1911
+ }
1912
+ })
1913
+ request.pipe(stream as unknown as Writable) // Huan(202203): FIXME: as unknown as
1914
+ })
1915
+
1916
+ const messageId = response.getId()
1917
+
1918
+ if (messageId) {
1919
+ return messageId
1920
+ }
1921
+
1922
+ {
1923
+ /**
1924
+ * Huan(202110): Deprecated: will be removed after Dec 31, 2022
1925
+ */
1926
+ const messageIdWrapper = response.getIdStringValueDeprecated()
1927
+ if (messageIdWrapper) {
1928
+ return messageIdWrapper.getValue()
1929
+ }
1930
+ }
1931
+ }
1932
+
1933
+ }
1934
+
1935
+ export {
1936
+ PuppetService,
1937
+ }
1938
+ export default PuppetService