@juzi/wechaty-puppet-service 1.0.105 → 1.0.107

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 (31) hide show
  1. package/dist/cjs/src/client/puppet-service.d.ts +2 -0
  2. package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
  3. package/dist/cjs/src/client/puppet-service.js +84 -0
  4. package/dist/cjs/src/client/puppet-service.js.map +1 -1
  5. package/dist/cjs/src/package-json.js +3 -3
  6. package/dist/cjs/src/package-json.js.map +1 -1
  7. package/dist/cjs/src/server/puppet-implementation.d.ts.map +1 -1
  8. package/dist/cjs/src/server/puppet-implementation.js +71 -0
  9. package/dist/cjs/src/server/puppet-implementation.js.map +1 -1
  10. package/dist/cjs/src/utils/pb-payload-helper.d.ts +2 -0
  11. package/dist/cjs/src/utils/pb-payload-helper.d.ts.map +1 -1
  12. package/dist/cjs/src/utils/pb-payload-helper.js +52 -1
  13. package/dist/cjs/src/utils/pb-payload-helper.js.map +1 -1
  14. package/dist/esm/src/client/puppet-service.d.ts +2 -0
  15. package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
  16. package/dist/esm/src/client/puppet-service.js +85 -1
  17. package/dist/esm/src/client/puppet-service.js.map +1 -1
  18. package/dist/esm/src/package-json.js +3 -3
  19. package/dist/esm/src/package-json.js.map +1 -1
  20. package/dist/esm/src/server/puppet-implementation.d.ts.map +1 -1
  21. package/dist/esm/src/server/puppet-implementation.js +71 -0
  22. package/dist/esm/src/server/puppet-implementation.js.map +1 -1
  23. package/dist/esm/src/utils/pb-payload-helper.d.ts +2 -0
  24. package/dist/esm/src/utils/pb-payload-helper.d.ts.map +1 -1
  25. package/dist/esm/src/utils/pb-payload-helper.js +49 -0
  26. package/dist/esm/src/utils/pb-payload-helper.js.map +1 -1
  27. package/package.json +3 -3
  28. package/src/client/puppet-service.ts +94 -1
  29. package/src/package-json.ts +3 -3
  30. package/src/server/puppet-implementation.ts +86 -1
  31. package/src/utils/pb-payload-helper.ts +52 -0
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juzi/wechaty-puppet-service",
3
- "version": "1.0.105",
3
+ "version": "1.0.107",
4
4
  "description": "Puppet Service for Wechaty",
5
5
  "type": "module",
6
6
  "exports": {
@@ -51,7 +51,7 @@
51
51
  "@chatie/eslint-config": "^1.0.4",
52
52
  "@chatie/semver": "^0.4.7",
53
53
  "@chatie/tsconfig": "^4.6.3",
54
- "@juzi/wechaty-puppet": "^1.0.94",
54
+ "@juzi/wechaty-puppet": "^1.0.105",
55
55
  "@juzi/wechaty-puppet-mock": "^1.0.1",
56
56
  "@swc/core": "1.3.39",
57
57
  "@types/google-protobuf": "^3.15.5",
@@ -73,7 +73,7 @@
73
73
  "@juzi/wechaty-puppet": "^1.0.84"
74
74
  },
75
75
  "dependencies": {
76
- "@juzi/wechaty-grpc": "^1.0.90",
76
+ "@juzi/wechaty-grpc": "^1.0.93",
77
77
  "clone-class": "^1.1.1",
78
78
  "ducks": "^1.0.2",
79
79
  "file-box": "^1.5.5",
@@ -50,7 +50,7 @@ import { packageJson } from '../package-json.js'
50
50
 
51
51
  import { GrpcManager } from './grpc-manager.js'
52
52
  import { PayloadStore } from './payload-store.js'
53
- import { OptionalBooleanUnwrapper, OptionalBooleanWrapper, callRecordPbToPayload, channelPayloadToPb, channelPbToPayload, chatHistoryPbToPayload, postPayloadToPb, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
53
+ import { OptionalBooleanUnwrapper, OptionalBooleanWrapper, callRecordPbToPayload, channelPayloadToPb, channelPbToPayload, chatHistoryPbToPayload, contactPbToPayload, postPayloadToPb, roomMemberPbToPayload, urlLinkPbToPayload } from '../utils/pb-payload-helper.js'
54
54
  import type { MessageBroadcastTargets } from '@juzi/wechaty-puppet/dist/esm/src/schemas/message.js'
55
55
  import { timeoutPromise } from 'gerror'
56
56
  import { BooleanIndicator } from 'state-switch'
@@ -763,6 +763,49 @@ class PuppetService extends PUPPET.Puppet {
763
763
  return payload
764
764
  }
765
765
 
766
+ override async batchContactRawPayload (contactIdList: string[]): Promise<Map<string, PUPPET.payloads.Contact>> {
767
+ log.verbose('PuppetService', 'batchContactRawPayload(%s)', contactIdList)
768
+
769
+ const result = new Map<string, PUPPET.payloads.Contact>()
770
+ const contactIdSet = new Set<string>(contactIdList)
771
+ const needGetSet = new Set<string>()
772
+ for (const contactId of contactIdSet) {
773
+ const cachedContactPayload = await this._payloadStore.contact?.get(contactId)
774
+ if (cachedContactPayload) {
775
+ result.set(contactId, cachedContactPayload)
776
+ } else {
777
+ needGetSet.add(contactId)
778
+ }
779
+ }
780
+
781
+ if (needGetSet.size > 0) {
782
+ try {
783
+ const request = new grpcPuppet.BatchContactPayloadRequest()
784
+ request.setIdsList(Array.from(needGetSet))
785
+
786
+ const response = await util.promisify(
787
+ this.grpcManager.client.batchContactPayload
788
+ .bind(this.grpcManager.client),
789
+ )(request)
790
+
791
+ const payloads = response.getContactPayloadsList()
792
+ for (const payload of payloads) {
793
+ const contactId = payload.getId()
794
+ const puppetPayload = contactPbToPayload(payload)
795
+ result.set(contactId, puppetPayload)
796
+ await this._payloadStore.contact?.set(contactId, puppetPayload)
797
+ }
798
+ } catch (e) {
799
+ log.error('PuppetService', 'batchContactRawPayload(%s, %s) error: %s, use one by one method', contactIdList, needGetSet, e)
800
+ for (const contactId of needGetSet) {
801
+ const payload = await this.contactRawPayload(contactId)
802
+ result.set(contactId, payload)
803
+ }
804
+ }
805
+ }
806
+ return result
807
+ }
808
+
766
809
  override async contactPayloadModify (contactId: string, payload: Partial<PUPPET.payloads.Contact>): Promise<void> {
767
810
  log.verbose('PuppetService', 'contactPayloadModify(%s, %s)', contactId, JSON.stringify(payload))
768
811
 
@@ -1942,6 +1985,56 @@ class PuppetService extends PUPPET.Puppet {
1942
1985
  return payload
1943
1986
  }
1944
1987
 
1988
+ override async batchRoomMemberRawPayload (roomId: string, contactIdList: string[]): Promise<Map<string, PUPPET.payloads.RoomMember>> {
1989
+ log.verbose('PuppetService', 'batchRoomMemberRawPayload(%s, %s)', roomId, contactIdList)
1990
+
1991
+ const result = new Map<string, PUPPET.payloads.RoomMember>()
1992
+ const contactIdSet = new Set<string>(contactIdList)
1993
+ let needGetSet = new Set<string>()
1994
+ const cachedPayload = await this._payloadStore.roomMember?.get(roomId) || {}
1995
+ if (Object.keys(cachedPayload).length > 0) {
1996
+ for (const contactId of contactIdSet) {
1997
+ const cachedRoomMemberPayload = cachedPayload[contactId]
1998
+ if (cachedRoomMemberPayload) {
1999
+ result.set(contactId, cachedRoomMemberPayload)
2000
+ } else {
2001
+ needGetSet.add(contactId)
2002
+ }
2003
+ }
2004
+ } else {
2005
+ needGetSet = contactIdSet
2006
+ }
2007
+
2008
+ if (needGetSet.size > 0) {
2009
+ try {
2010
+ const request = new grpcPuppet.BatchRoomMemberPayloadRequest()
2011
+ request.setId(roomId)
2012
+ request.setMemberIdsList(Array.from(needGetSet))
2013
+
2014
+ const response = await util.promisify(
2015
+ this.grpcManager.client.batchRoomMemberPayload
2016
+ .bind(this.grpcManager.client),
2017
+ )(request)
2018
+
2019
+ const payloads = response.getMemberPayloadsList()
2020
+ for (const payload of payloads) {
2021
+ const contactId = payload.getId()
2022
+ const puppetPayload = roomMemberPbToPayload(payload)
2023
+ result.set(contactId, puppetPayload)
2024
+ cachedPayload[contactId] = puppetPayload
2025
+ }
2026
+ await this._payloadStore.roomMember?.set(roomId, cachedPayload)
2027
+ } catch (e) {
2028
+ log.error('PuppetService', 'batchRoomMemberRawPayload(%s, %s) error: %s, use one by one method', roomId, needGetSet, e)
2029
+ for (const contactId of needGetSet) {
2030
+ const payload = await this.roomMemberRawPayload(roomId, contactId)
2031
+ result.set(contactId, payload)
2032
+ }
2033
+ }
2034
+ }
2035
+ return result
2036
+ }
2037
+
1945
2038
  override async roomAnnounce (roomId: string) : Promise<string>
1946
2039
  override async roomAnnounce (roomId: string, text: string) : Promise<void>
1947
2040
 
@@ -4,7 +4,7 @@
4
4
  import type { PackageJson } from 'type-fest'
5
5
  export const packageJson: PackageJson = {
6
6
  "name": "@juzi/wechaty-puppet-service",
7
- "version": "1.0.105",
7
+ "version": "1.0.107",
8
8
  "description": "Puppet Service for Wechaty",
9
9
  "type": "module",
10
10
  "exports": {
@@ -55,7 +55,7 @@ export const packageJson: PackageJson = {
55
55
  "@chatie/eslint-config": "^1.0.4",
56
56
  "@chatie/semver": "^0.4.7",
57
57
  "@chatie/tsconfig": "^4.6.3",
58
- "@juzi/wechaty-puppet": "^1.0.94",
58
+ "@juzi/wechaty-puppet": "^1.0.105",
59
59
  "@juzi/wechaty-puppet-mock": "^1.0.1",
60
60
  "@swc/core": "1.3.39",
61
61
  "@types/google-protobuf": "^3.15.5",
@@ -77,7 +77,7 @@ export const packageJson: PackageJson = {
77
77
  "@juzi/wechaty-puppet": "^1.0.84"
78
78
  },
79
79
  "dependencies": {
80
- "@juzi/wechaty-grpc": "^1.0.90",
80
+ "@juzi/wechaty-grpc": "^1.0.93",
81
81
  "clone-class": "^1.1.1",
82
82
  "ducks": "^1.0.2",
83
83
  "file-box": "^1.5.5",
@@ -293,6 +293,57 @@ function puppetImplementation (
293
293
  }
294
294
  },
295
295
 
296
+ batchContactPayload: async (call, callback) => {
297
+ log.verbose('PuppetServiceImpl', 'batchContactPayload()')
298
+
299
+ try {
300
+ const contactIdList = call.request.getIdsList()
301
+
302
+ const payloadMap = await puppet.batchContactPayload(contactIdList)
303
+
304
+ const response = new grpcPuppet.BatchContactPayloadResponse()
305
+
306
+ const payloads: grpcPuppet.ContactPayloadResponse[] = []
307
+ for (const [ _, payload ] of payloadMap.entries()) {
308
+ const pb = new grpcPuppet.ContactPayloadResponse()
309
+ pb.setAddress(payload.address || '')
310
+ pb.setAlias(payload.alias || '')
311
+ pb.setAvatar(payload.avatar)
312
+ pb.setCity(payload.city || '')
313
+ pb.setFriend(payload.friend || false)
314
+ pb.setGender(payload.gender)
315
+ pb.setId(payload.id)
316
+ pb.setName(payload.name)
317
+ pb.setProvince(payload.province || '')
318
+ pb.setSignature(payload.signature || '')
319
+ pb.setStar(payload.star || false)
320
+ pb.setType(payload.type)
321
+ /**
322
+ * @deprecated `payload.weixin` will be removed in v2.0
323
+ * @link https://github.com/wechaty/grpc/issues/174
324
+ */
325
+ pb.setWeixin(payload.handle || payload.weixin || '')
326
+ pb.setPhonesList(payload.phone)
327
+ pb.setCoworker(payload.coworker || false)
328
+ pb.setCorporation(payload.corporation || '')
329
+ pb.setTitle(payload.title || '')
330
+ pb.setDescription(payload.description || '')
331
+ pb.setAdditionalInfo(payload.additionalInfo || '')
332
+ pb.setTagIdsList(payload.tags || [])
333
+ pb.setRealName(payload.realName || '')
334
+ pb.setAka(payload.aka || '')
335
+ payloads.push(pb)
336
+ }
337
+
338
+ response.setContactPayloadsList(payloads)
339
+
340
+ return callback(null, response)
341
+
342
+ } catch (e) {
343
+ return grpcError('batchContactPayload', e, callback)
344
+ }
345
+ },
346
+
296
347
  contactPayloadModify: async (call, callback) => {
297
348
  log.verbose('PuppetServiceImpl', 'contactPayloadModify()')
298
349
 
@@ -1437,7 +1488,7 @@ function puppetImplementation (
1437
1488
  const roomId = call.request.getId()
1438
1489
 
1439
1490
  const fileBox = await puppet.roomAvatar(roomId)
1440
- const serializedFileBox = await serializeFileBox(fileBox)
1491
+ const serializedFileBox = await serializeFileBox(fileBox!)
1441
1492
 
1442
1493
  const response = new grpcPuppet.RoomAvatarResponse()
1443
1494
  response.setFileBox(serializedFileBox)
@@ -1653,6 +1704,40 @@ function puppetImplementation (
1653
1704
  }
1654
1705
  },
1655
1706
 
1707
+ batchRoomMemberPayload: async (call, callback) => {
1708
+ log.verbose('PuppetServiceImpl', 'batchRoomMemberPayload()')
1709
+
1710
+ try {
1711
+ const roomId = call.request.getId()
1712
+ const contactIdList = call.request.getMemberIdsList()
1713
+
1714
+ const payloadMap = await puppet.batchRoomMemberPayload(roomId, contactIdList)
1715
+
1716
+ const response = new grpcPuppet.BatchRoomMemberPayloadResponse()
1717
+
1718
+ const payloads: grpcPuppet.RoomMemberPayloadResponse[] = []
1719
+ for (const [ _, payload ] of payloadMap.entries()) {
1720
+ const pb = new grpcPuppet.RoomMemberPayloadResponse()
1721
+ pb.setAvatar(payload.avatar)
1722
+ pb.setId(payload.id)
1723
+ pb.setInviterId(payload.inviterId || '')
1724
+ pb.setName(payload.name)
1725
+ pb.setRoomAlias(payload.roomAlias || '')
1726
+ pb.setAdditionalInfo(payload.additionalInfo || '')
1727
+ pb.setJoinScene(payload.joinScene || PUPPET.types.RoomMemberJoinScene.Unknown)
1728
+ pb.setJoinTime(payload.joinTime || 0)
1729
+ payloads.push(pb)
1730
+ }
1731
+
1732
+ response.setMemberPayloadsList(payloads)
1733
+
1734
+ return callback(null, response)
1735
+
1736
+ } catch (e) {
1737
+ return grpcError('batchRoomMemberPayload', e, callback)
1738
+ }
1739
+ },
1740
+
1656
1741
  roomPayload: async (call, callback) => {
1657
1742
  log.verbose('PuppetServiceImpl', 'roomPayload()')
1658
1743
 
@@ -374,3 +374,55 @@ export const chatHistoryPayloadToPb = async (grpcPuppet: grpcPuppet, chatHistory
374
374
 
375
375
  return list
376
376
  }
377
+
378
+ export const roomMemberPbToPayload = (pb: puppet.RoomMemberPayloadResponse) => {
379
+ const payload: PUPPET.payloads.RoomMember = {
380
+ avatar : pb.getAvatar(),
381
+ id : pb.getId(),
382
+ inviterId : pb.getInviterId(),
383
+ name : pb.getName(),
384
+ roomAlias : pb.getRoomAlias(),
385
+ additionalInfo: pb.getAdditionalInfo(),
386
+ joinScene : pb.getJoinScene(),
387
+ joinTime : pb.getJoinTime(),
388
+ }
389
+
390
+ return payload
391
+ }
392
+
393
+ export const contactPbToPayload = (pb: puppet.ContactPayloadResponse) => {
394
+ const payload: PUPPET.payloads.Contact = {
395
+ address : pb.getAddress(),
396
+ alias : pb.getAlias(),
397
+ avatar : pb.getAvatar(),
398
+ city : pb.getCity(),
399
+ corporation : pb.getCorporation(),
400
+ coworker : pb.getCoworker(),
401
+ description : pb.getDescription(),
402
+ friend : pb.getFriend(),
403
+ gender : pb.getGender() as number,
404
+ /**
405
+ * Huan(202203): rename `getWeixin()` to `getHandle()` in v2.0.0
406
+ * @link https://github.com/wechaty/grpc/issues/174
407
+ */
408
+ handle : pb.getWeixin(),
409
+ id : pb.getId(),
410
+ name : pb.getName(),
411
+ phone : pb.getPhonesList(),
412
+ province : pb.getProvince(),
413
+ signature : pb.getSignature(),
414
+ star : pb.getStar(),
415
+ title : pb.getTitle(),
416
+ type : pb.getType() as number,
417
+ /**
418
+ * `weixin` is deprecated, will be removed after Dec 31, 2022
419
+ * use `handle` instead.
420
+ */
421
+ weixin : pb.getWeixin(),
422
+ additionalInfo: pb.getAdditionalInfo(),
423
+ tags : pb.getTagIdsList(),
424
+ realName : pb.getRealName(),
425
+ aka : pb.getAka(),
426
+ }
427
+ return payload
428
+ }