@juzi/wechaty 1.0.156 → 1.0.157

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 (32) hide show
  1. package/dist/cjs/src/package-json.js +4 -4
  2. package/dist/cjs/src/user-modules/contact.d.ts +24 -0
  3. package/dist/cjs/src/user-modules/contact.d.ts.map +1 -1
  4. package/dist/cjs/src/user-modules/contact.js +55 -0
  5. package/dist/cjs/src/user-modules/contact.js.map +1 -1
  6. package/dist/cjs/src/user-modules/contact.spec.js +156 -0
  7. package/dist/cjs/src/user-modules/contact.spec.js.map +1 -1
  8. package/dist/cjs/src/user-modules/room.d.ts +23 -0
  9. package/dist/cjs/src/user-modules/room.d.ts.map +1 -1
  10. package/dist/cjs/src/user-modules/room.js +52 -0
  11. package/dist/cjs/src/user-modules/room.js.map +1 -1
  12. package/dist/cjs/src/user-modules/room.spec.js +156 -0
  13. package/dist/cjs/src/user-modules/room.spec.js.map +1 -1
  14. package/dist/esm/src/package-json.js +4 -4
  15. package/dist/esm/src/user-modules/contact.d.ts +24 -0
  16. package/dist/esm/src/user-modules/contact.d.ts.map +1 -1
  17. package/dist/esm/src/user-modules/contact.js +55 -0
  18. package/dist/esm/src/user-modules/contact.js.map +1 -1
  19. package/dist/esm/src/user-modules/contact.spec.js +157 -1
  20. package/dist/esm/src/user-modules/contact.spec.js.map +1 -1
  21. package/dist/esm/src/user-modules/room.d.ts +23 -0
  22. package/dist/esm/src/user-modules/room.d.ts.map +1 -1
  23. package/dist/esm/src/user-modules/room.js +52 -0
  24. package/dist/esm/src/user-modules/room.js.map +1 -1
  25. package/dist/esm/src/user-modules/room.spec.js +156 -0
  26. package/dist/esm/src/user-modules/room.spec.js.map +1 -1
  27. package/package.json +3 -3
  28. package/src/package-json.ts +4 -4
  29. package/src/user-modules/contact.spec.ts +212 -0
  30. package/src/user-modules/contact.ts +67 -0
  31. package/src/user-modules/room.spec.ts +210 -0
  32. package/src/user-modules/room.ts +63 -0
@@ -1 +1 @@
1
- {"version":3,"file":"room.spec.js","sourceRoot":"","sources":["../../../../src/user-modules/room.spec.ts"],"names":[],"mappings":";AACA;;;;;;;;;;;;;;;;;;GAkBG;AACH,OAAO,EACL,IAAI,EACJ,KAAK,GACN,MAAkB,QAAQ,CAAA;AAG3B,OAAO,EAAE,UAAU,EAAE,MAAQ,2BAA2B,CAAA;AAExD,OAAO,EAAE,cAAc,EAAE,MAAM,uBAAuB,CAAA;AAMtD,IAAI,CAAC,WAAW,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC1B,MAAM,gBAAgB,GAAQ,SAAS,CAAA;IACvC,MAAM,mBAAmB,GAAK,YAAY,CAAA;IAC1C,MAAM,qBAAqB,GAAG,CAAE,gBAAgB,CAAE,CAAA;IAElD,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAA;IAErC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAS,CAAA;IACtC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEhD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IAErB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;IAClE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACnD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;QACnD,OAAO;YACL,KAAK,EAAE,mBAAmB;SACH,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,MAAM,WAAW,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,CAAC,EAAE,IAAI,EAAE,KAAK,EAAE,CAAC,CAAA;IAChE,MAAM,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,WAAW,CAAC,CAAA;IAEtC,MAAM,MAAM,GAAG,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE;QACnC,OAAO,CAAC,EAAE,CAAC,OAAO,EAAE,OAAO,CAAC,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,MAAM,MAAM,CAAA;IAEZ,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAA;IAC7C,CAAC,CAAC,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC,EAAE,oBAAoB,CAAC,CAAA;IACjD,CAAC,CAAC,KAAK,CAAC,MAAM,QAAQ,CAAC,CAAC,CAAE,CAAC,KAAK,EAAE,EAAE,mBAAmB,EAAE,+BAA+B,CAAC,CAAA;IAEzF,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,+BAA+B,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAC9C,MAAM,gBAAgB,GAAQ,SAAS,CAAA;IACvC,MAAM,mBAAmB,GAAK,YAAY,CAAA;IAC1C,MAAM,qBAAqB,GAAG,CAAE,gBAAgB,CAAE,CAAA;IAElD,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAA;IAErC,MAAM,MAAM,GAAG,IAAI,UAAU,EAAS,CAAA;IACtC,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEhD,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IAErB,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,qBAAqB,CAAC,CAAA;IAClE,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IACnD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;QACnD,OAAO;YACL,KAAK,EAAE,mBAAmB;SACH,CAAA;IAC3B,CAAC,CAAC,CAAA;IAEF,MAAM,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,CAAA;IAEvC,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,0BAA0B,EAAE,KAAK,IAAI,EAAE;IAE1C,MAAM,OAAO,GAAG,KAAK,CAAC,aAAa,EAAE,CAAA;IACrC,MAAM,QAAQ,GAAG,KAAK,CAAC,GAAG,EAAE,CAAA;IAE5B,MAAM,MAAM,GAAG,IAAI,UAAU,EAAE,CAAA;IAC/B,MAAM,OAAO,GAAG,cAAc,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,CAAA;IAEhD,MAAM,GAAG,GAAG,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,CAAA;IACzC,MAAM,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAA;IAExB,MAAM,OAAO,CAAC,KAAK,EAAE,CAAA;IAErB,MAAM,gBAAgB,GAAW,QAAQ,CAAA;IACzC,MAAM,mBAAmB,GAAQ,YAAY,CAAA;IAC7C,MAAM,6BAA6B,GAAG;QACpC,QAAQ,EAAE,GAAG;QACb,QAAQ,EAAE,GAAG;KACd,CAAA;IACD,MAAM,qBAAqB,GAAM,UAAU,CAAA;IAC3C,MAAM,wBAAwB,GAAG,SAAS,CAAA;IAC1C,MAAM,qBAAqB,GAAM,UAAU,CAAA;IAC3C,MAAM,wBAAwB,GAAG,MAAM,CAAA;IACvC,MAAM,WAAW,GAAoC,EAAE,CAAA;IACvD,WAAW,CAAC,qBAAqB,CAAC,GAAG,wBAAwB,CAAA;IAC7D,WAAW,CAAC,qBAAqB,CAAC,GAAG,wBAAwB,CAAA;IAE7D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,mBAAmB,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,CAAC,EAAE,SAAS,EAAE,EAAE;QACzE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;QACnD,OAAO;YACL,EAAE,EAAE,SAAS;YACb,SAAS,EAAE,WAAW,CAAC,SAAS,CAAC;SACJ,CAAA;IACjC,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,aAAa,CAAC,CAAC,SAAS,CAAC,KAAK,IAAI,EAAE;QACvD,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;QACnD,OAAO;YACL,KAAK,EAAE,mBAAmB;YAC1B,cAAc,EAAE,IAAI,CAAC,SAAS,CAAC,6BAA6B,CAAC;SACtC,CAAA;IAC3B,CAAC,CAAC,CAAA;IACF,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,SAAS,CAAC,KAAK,EAAE,SAAS,EAAE,EAAE;QACnE,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,YAAY,CAAC,OAAO,CAAC,CAAC,CAAA;QACnD,OAAO;YACL,EAAE,EAAE,SAAS;SACa,CAAA;IAC9B,CAAC,CAAC,CAAA;IACF,yCAAyC;IACzC,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,iBAAiB,CAAC,CAAC,SAAS,CAAC,QAAQ,CAAC,CAAA;IAC3D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,gBAAgB,CAAC,CAAC,QAAQ,CAAC,EAAE,CAAC,CAAA;IAEnD,MAAM,cAAc,GAAG,KAAK,EAAE,GAAG,IAAW,EAAE,EAAE;QAC9C,MAAM,IAAI,OAAO,CAAC,YAAY,CAAC,CAAA;QAC/B,OAAO,CAAE,IAAI,CAAC,CAAC,CAAC,CAAC,EAAE,CAAE,CAAA;IACvB,CAAC,CAAA;IACD,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,eAAe,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAC/D,OAAO,CAAC,IAAI,CAAC,MAAM,EAAE,YAAY,CAAC,CAAC,SAAS,CAAC,cAAc,CAAC,CAAA;IAE5D,MAAM,IAAI,GAAG,MAAM,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,gBAAgB,EAAE,CAAC,CAAA;IAC9D,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAA;IAC1E,MAAM,QAAQ,GAAG,MAAM,OAAO,CAAC,OAAO,CAAC,IAAI,CAAC,EAAE,EAAE,EAAE,qBAAqB,EAAE,CAAC,CAAA;IAE1E,IAAI,CAAC,IAAI,IAAI,CAAC,QAAQ,IAAI,CAAC,QAAQ,EAAE;QACnC,MAAM,IAAI,KAAK,CAAC,uBAAuB,CAAC,CAAA;KACzC;IACD,wBAAwB;IACxB,wBAAwB;IACxB,oBAAoB;IAEpB,IAAI,CAAC,sBAAsB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;QACrC,QAAQ,CAAC,YAAY,EAAE,CAAA;QACvB,MAAM,cAAc,GAAG,IAAI,CAAC,cAAc,EAAE,CAAA;QAE5C,CAAC,CAAC,IAAI,CAAC,cAAc,EAAE,6BAA6B,EAAE,mCAAmC,CAAC,CAAA;IAC5F,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,0BAA0B,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;QACzC,QAAQ,CAAC,YAAY,EAAE,CAAA;QACvB,MAAM,IAAI,CAAC,GAAG,CAAA,SAAS,QAAQ,iBAAiB,QAAQ,EAAE,CAAA;QAE1D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,kEAAkE;YAClE,gBAAgB;YAChB,mCAAmC;YACnC,CAAE,qBAAqB,EAAE,qBAAqB,CAAE;SACjD,EAAE,uCAAuC,CAAC,CAAA;IAC7C,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,kCAAkC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;QACjD,QAAQ,CAAC,YAAY,EAAE,CAAA;QACvB,MAAM,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,QAAQ,CAAC,CAAA;QAE9B,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,kEAAkE;YAClE,gBAAgB;YAChB,aAAa;YACb,CAAE,qBAAqB,CAAE;SAC1B,EAAE,0CAA0C,CAAC,CAAA;IAChD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,mCAAmC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;QAClD,QAAQ,CAAC,YAAY,EAAE,CAAA;QACvB,MAAM,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,QAAQ,EAAE,QAAQ,CAAC,CAAA;QAE/D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,kEAAkE;YAClE,gBAAgB;YAChB,0CAA0C;YAC1C,CAAE,qBAAqB,EAAE,qBAAqB,CAAE;SACjD,EAAE,2CAA2C,CAAC,CAAA;IACjD,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,eAAe,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;QAC9B,QAAQ,CAAC,YAAY,EAAE,CAAA;QACvB,MAAM,IAAI,CAAC,GAAG,CAAC,2BAA2B,EAAE,MAAM,EAAE,QAAQ,CAAC,CAAA;QAE7D,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,kEAAkE;YAClE,gBAAgB;YAChB,yCAAyC;YACzC,CAAE,MAAM,EAAE,qBAAqB,CAAE;SAClC,EAAE,kCAAkC,CAAC,CAAA;IACxC,CAAC,CAAC,CAAA;IAEF,IAAI,CAAC,qCAAqC,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;QACpD,QAAQ,CAAC,YAAY,EAAE,CAAA;QACvB,MAAM,IAAI,CAAC,GAAG,CAAA,OAAO,MAAM,4BAA4B,QAAQ,EAAE,CAAA;QAEjE,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAC,CAAC,IAAI,EAAE;YAC/B,kEAAkE;YAClE,gBAAgB;YAChB,4CAA4C;YAC5C,CAAE,MAAM,EAAE,qBAAqB,CAAE;SAClC,EAAE,oDAAoD,CAAC,CAAA;IAC1D,CAAC,CAAC,CAAA;IAEF,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;AACtB,CAAC,CAAC,CAAA;AAEF,IAAI,CAAC,qBAAqB,EAAE,KAAK,EAAC,CAAC,EAAC,EAAE;IAIpC,MAAM,SAAS,GAAiB,IAAI,CAAA;IACpC,CAAC,CAAC,EAAE,CAAC,SAAS,EAAE,8DAA8D,CAAC,CAAA;AACjF,CAAC,CAAC,CAAA"}
1
+ {"version":3,"file":"room.spec.js","sourceRoot":"","sources":["../../../../src/user-modules/room.spec.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juzi/wechaty",
3
- "version": "1.0.156",
3
+ "version": "1.0.157",
4
4
  "description": "Wechaty is a RPA SDK for Chatbot Makers.",
5
5
  "type": "module",
6
6
  "exports": {
@@ -109,7 +109,7 @@
109
109
  },
110
110
  "homepage": "https://github.com/wechaty/",
111
111
  "dependencies": {
112
- "@juzi/wechaty-puppet-service": "1.0.119",
112
+ "@juzi/wechaty-puppet-service": "1.0.121",
113
113
  "clone-class": "^1.1.1",
114
114
  "cmd-ts": "^0.10.0",
115
115
  "cockatiel": "^2.0.2",
@@ -132,7 +132,7 @@
132
132
  "@chatie/eslint-config": "^1.0.4",
133
133
  "@chatie/semver": "^0.4.7",
134
134
  "@chatie/tsconfig": "^4.6.3",
135
- "@juzi/wechaty-puppet": "^1.0.143",
135
+ "@juzi/wechaty-puppet": "^1.0.145",
136
136
  "@juzi/wechaty-puppet-mock": "^1.0.1",
137
137
  "@swc/core": "1.3.44",
138
138
  "@swc/helpers": "^0.3.6",
@@ -4,10 +4,10 @@
4
4
  */
5
5
  import type { PackageJsonWechaty } from './config'
6
6
 
7
- export const GIT_COMMIT_HASH: string = 'fc009a425c4ec3b7dee53eee50896b4ffc383f70'
7
+ export const GIT_COMMIT_HASH: string = 'a69947004cdd32876cf204ef4344e10443d444a3'
8
8
  export const packageJson: PackageJsonWechaty = {
9
9
  "name": "@juzi/wechaty",
10
- "version": "1.0.156",
10
+ "version": "1.0.157",
11
11
  "description": "Wechaty is a RPA SDK for Chatbot Makers.",
12
12
  "type": "module",
13
13
  "exports": {
@@ -116,7 +116,7 @@ export const packageJson: PackageJsonWechaty = {
116
116
  },
117
117
  "homepage": "https://github.com/wechaty/",
118
118
  "dependencies": {
119
- "@juzi/wechaty-puppet-service": "1.0.119",
119
+ "@juzi/wechaty-puppet-service": "1.0.121",
120
120
  "clone-class": "^1.1.1",
121
121
  "cmd-ts": "^0.10.0",
122
122
  "cockatiel": "^2.0.2",
@@ -139,7 +139,7 @@ export const packageJson: PackageJsonWechaty = {
139
139
  "@chatie/eslint-config": "^1.0.4",
140
140
  "@chatie/semver": "^0.4.7",
141
141
  "@chatie/tsconfig": "^4.6.3",
142
- "@juzi/wechaty-puppet": "^1.0.143",
142
+ "@juzi/wechaty-puppet": "^1.0.145",
143
143
  "@juzi/wechaty-puppet-mock": "^1.0.1",
144
144
  "@swc/core": "1.3.44",
145
145
  "@swc/helpers": "^0.3.6",
@@ -20,8 +20,10 @@
20
20
  */
21
21
  import {
22
22
  test,
23
+ sinon,
23
24
  } from 'tstest'
24
25
 
26
+ import type * as PUPPET from '@juzi/wechaty-puppet'
25
27
  import { PuppetMock } from '@juzi/wechaty-puppet-mock'
26
28
  import { WechatyBuilder } from '../wechaty-builder.js'
27
29
 
@@ -88,6 +90,216 @@ test('should throw when instanciate the global class', async t => {
88
90
  }, 'should throw when we instanciate a global class')
89
91
  })
90
92
 
93
+ test('findAllIter() yields every contact returned by contactSearch', async t => {
94
+ const TOTAL = 7
95
+
96
+ const sandbox = sinon.createSandbox()
97
+ const puppet = new PuppetMock() as any
98
+ const wechaty = WechatyBuilder.build({ puppet })
99
+
100
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `c-${idx}`)
101
+ const buildPayload = (id: string) => ({ id, name: `name-${id}` } as PUPPET.payloads.Contact)
102
+
103
+ sandbox.stub(puppet, 'contactSearch').resolves(idList)
104
+ sandbox.stub(puppet, 'batchContactPayload').callsFake(async (...args: any[]) => {
105
+ const ids = args[0] as string[]
106
+ return new Map(ids.map(id => [ id, buildPayload(id) ]))
107
+ })
108
+
109
+ await wechaty.start()
110
+ const bot = puppet.mocker.createContact({ name: 'bot' })
111
+ await puppet.mocker.login(bot)
112
+
113
+ const seen: string[] = []
114
+ for await (const chunk of wechaty.Contact.findAllIter()) {
115
+ for (const contact of chunk) {
116
+ seen.push(contact.id)
117
+ }
118
+ }
119
+
120
+ t.equal(seen.length, TOTAL, `should yield ${TOTAL} contacts`)
121
+ t.same(seen, idList, 'should yield contacts in search order')
122
+
123
+ await wechaty.stop()
124
+ })
125
+
126
+ test('findAllIter() chunks 101 contacts into [100, 1] at default batch=100', async t => {
127
+ const TOTAL = 101
128
+
129
+ const sandbox = sinon.createSandbox()
130
+ const puppet = new PuppetMock() as any
131
+ const wechaty = WechatyBuilder.build({ puppet })
132
+
133
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `c-${idx}`)
134
+ sandbox.stub(puppet, 'contactSearch').resolves(idList)
135
+ sandbox.stub(puppet, 'batchContactPayload').callsFake(async (...args: any[]) => {
136
+ const ids = args[0] as string[]
137
+ return new Map(ids.map(id => [ id, { id, name: id } as PUPPET.payloads.Contact ]))
138
+ })
139
+
140
+ await wechaty.start()
141
+ const bot = puppet.mocker.createContact({ name: 'bot' })
142
+ await puppet.mocker.login(bot)
143
+
144
+ const sizes: number[] = []
145
+ for await (const chunk of wechaty.Contact.findAllIter()) {
146
+ sizes.push(chunk.length)
147
+ }
148
+
149
+ t.same(sizes, [ 100, 1 ], 'should split into two batches: 100 and 1')
150
+
151
+ await wechaty.stop()
152
+ })
153
+
154
+ test('findAllIter() honors early break without throwing', async t => {
155
+ const TOTAL = 250
156
+
157
+ const sandbox = sinon.createSandbox()
158
+ const puppet = new PuppetMock() as any
159
+ const wechaty = WechatyBuilder.build({ puppet })
160
+
161
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `c-${idx}`)
162
+ sandbox.stub(puppet, 'contactSearch').resolves(idList)
163
+ const batchSpy = sandbox.stub(puppet, 'batchContactPayload').callsFake(async (...args: any[]) => {
164
+ const ids = args[0] as string[]
165
+ return new Map(ids.map(id => [ id, { id, name: id } as PUPPET.payloads.Contact ]))
166
+ })
167
+
168
+ await wechaty.start()
169
+ const bot = puppet.mocker.createContact({ name: 'bot' })
170
+ await puppet.mocker.login(bot)
171
+
172
+ let received = 0
173
+ await t.resolves((async () => {
174
+ for await (const chunk of wechaty.Contact.findAllIter()) {
175
+ received += chunk.length
176
+ if (received >= 100) {
177
+ break
178
+ }
179
+ }
180
+ })(), 'breaking the loop should not throw')
181
+
182
+ t.equal(received, 100, 'should stop after the first batch')
183
+ t.equal(batchSpy.callCount, 1, 'should not invoke batchContactPayload again after break')
184
+
185
+ await wechaty.stop()
186
+ })
187
+
188
+ test('findAllIter() invokes batchContactPayload ceil(N/batch) times, not N times', async t => {
189
+ const TOTAL = 100
190
+ const BATCH = 25
191
+
192
+ const sandbox = sinon.createSandbox()
193
+ const puppet = new PuppetMock() as any
194
+ const wechaty = WechatyBuilder.build({ puppet })
195
+
196
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `c-${idx}`)
197
+ sandbox.stub(puppet, 'contactSearch').resolves(idList)
198
+
199
+ const batchSpy = sandbox.stub(puppet, 'batchContactPayload').callsFake(async (...args: any[]) => {
200
+ const ids = args[0] as string[]
201
+ return new Map(ids.map(id => [ id, { id, name: id } as PUPPET.payloads.Contact ]))
202
+ })
203
+ const rawSpy = sandbox.spy(puppet, 'contactRawPayload')
204
+
205
+ await wechaty.start()
206
+ const bot = puppet.mocker.createContact({ name: 'bot' })
207
+ await puppet.mocker.login(bot)
208
+
209
+ const rawCountBefore = rawSpy.callCount
210
+
211
+ let received = 0
212
+ for await (const chunk of wechaty.Contact.findAllIter(undefined, { batch: BATCH })) {
213
+ received += chunk.length
214
+ }
215
+
216
+ t.equal(received, TOTAL, 'should iterate all contacts')
217
+ t.equal(batchSpy.callCount, Math.ceil(TOTAL / BATCH), `should invoke batchContactPayload ${Math.ceil(TOTAL / BATCH)} times`)
218
+ t.equal(rawSpy.callCount, rawCountBefore, 'should never fall back to per-id contactRawPayload during iteration')
219
+
220
+ await wechaty.stop()
221
+ })
222
+
223
+ test('findAllIter() with empty contactSearch yields nothing and does not throw', async t => {
224
+ const sandbox = sinon.createSandbox()
225
+ const puppet = new PuppetMock() as any
226
+ const wechaty = WechatyBuilder.build({ puppet })
227
+
228
+ sandbox.stub(puppet, 'contactSearch').resolves([])
229
+ const batchSpy = sandbox.stub(puppet, 'batchContactPayload').resolves(new Map())
230
+
231
+ await wechaty.start()
232
+ const bot = puppet.mocker.createContact({ name: 'bot' })
233
+ await puppet.mocker.login(bot)
234
+
235
+ let chunkCount = 0
236
+ await t.resolves((async () => {
237
+ for await (const _chunk of wechaty.Contact.findAllIter()) {
238
+ chunkCount++
239
+ }
240
+ })(), 'empty iteration should not throw')
241
+
242
+ t.equal(chunkCount, 0, 'should yield zero chunks')
243
+ t.equal(batchSpy.callCount, 0, 'should not call batchContactPayload when no ids')
244
+
245
+ await wechaty.stop()
246
+ })
247
+
248
+ test('findAllIter() throws when batch <= 0', async t => {
249
+ const sandbox = sinon.createSandbox()
250
+ const puppet = new PuppetMock() as any
251
+ const wechaty = WechatyBuilder.build({ puppet })
252
+
253
+ sandbox.stub(puppet, 'contactSearch').resolves([])
254
+ sandbox.stub(puppet, 'batchContactPayload').resolves(new Map())
255
+
256
+ await wechaty.start()
257
+ const bot = puppet.mocker.createContact({ name: 'bot' })
258
+ await puppet.mocker.login(bot)
259
+
260
+ for (const badBatch of [ 0, -1 ]) {
261
+ await t.rejects(
262
+ (async () => {
263
+ for await (const _chunk of wechaty.Contact.findAllIter(undefined, { batch: badBatch })) {
264
+ // should never reach here
265
+ }
266
+ })(),
267
+ /batch must be positive/,
268
+ `should throw when batch=${badBatch}`,
269
+ )
270
+ }
271
+
272
+ await wechaty.stop()
273
+ })
274
+
275
+ test('findAllIter() skips ids missing from payloadMap', async t => {
276
+ const sandbox = sinon.createSandbox()
277
+ const puppet = new PuppetMock() as any
278
+ const wechaty = WechatyBuilder.build({ puppet })
279
+
280
+ sandbox.stub(puppet, 'contactSearch').resolves([ 'c1', 'c2', 'c3' ])
281
+ sandbox.stub(puppet, 'batchContactPayload').resolves(
282
+ new Map([ [ 'c1', { id: 'c1', name: 'name-c1' } as PUPPET.payloads.Contact ] ]),
283
+ )
284
+
285
+ await wechaty.start()
286
+ const bot = puppet.mocker.createContact({ name: 'bot' })
287
+ await puppet.mocker.login(bot)
288
+
289
+ const seen: string[] = []
290
+ await t.resolves((async () => {
291
+ for await (const chunk of wechaty.Contact.findAllIter()) {
292
+ for (const contact of chunk) {
293
+ seen.push(contact.id)
294
+ }
295
+ }
296
+ })(), 'missing ids should not throw or stall iteration')
297
+
298
+ t.same(seen, [ 'c1' ], 'should yield only contacts whose payload was returned')
299
+
300
+ await wechaty.stop()
301
+ })
302
+
91
303
  test('ProtectedProperties', async t => {
92
304
  type NotExistInWechaty = Exclude<ContactProtectedProperty, keyof ContactImpl>
93
305
  type NotExistTest = NotExistInWechaty extends never ? true : false
@@ -216,6 +216,73 @@ class ContactMixin extends MixinBase implements SayableSayer {
216
216
  return contactList
217
217
  }
218
218
 
219
+ /**
220
+ * Async iterator variant of {@link findAll} that yields contacts in batches.
221
+ *
222
+ * Each batch is materialised with a single `puppet.batchContactPayload` RPC,
223
+ * so iterating N contacts costs roughly `ceil(N / batch)` round trips instead
224
+ * of N. Uses `puppet.batchContactPayload` directly (required on the puppet
225
+ * abstract), without holding the whole list in memory or blocking the caller
226
+ * until every contact has been hydrated. Callers may `break` between batches
227
+ * to short-circuit.
228
+ *
229
+ * @static
230
+ * @param {string | PUPPET.filters.Contact} [query]
231
+ * @param {{ batch?: number }} [opts] batch size, default 100
232
+ * @returns {AsyncIterable<ContactInterface[]>}
233
+ * @example
234
+ * for await (const chunk of bot.Contact.findAllIter()) {
235
+ * for (const contact of chunk) {
236
+ * console.log(contact.name())
237
+ * }
238
+ * }
239
+ */
240
+ static async * findAllIter (
241
+ query? : string | PUPPET.filters.Contact,
242
+ opts? : { batch?: number },
243
+ ): AsyncIterable<ContactInterface[]> {
244
+ const batch = opts?.batch ?? 100
245
+ log.verbose('Contact', 'findAllIter(%s, batch=%d)', JSON.stringify(query, stringifyFilter) || '', batch)
246
+
247
+ if (batch <= 0) {
248
+ throw new Error(`Contact.findAllIter() batch must be positive, got ${batch}`)
249
+ }
250
+
251
+ const contactIdList: string[] = await this.wechaty.puppet.contactSearch(query)
252
+
253
+ if (!this.wechaty.isLoggedIn) {
254
+ throw new Error('Contact.findAllIter() requires logged in')
255
+ }
256
+
257
+ for (let i = 0; i < contactIdList.length; i += batch) {
258
+ const idChunk = contactIdList.slice(i, i + batch)
259
+
260
+ const payloadMap = await this.wechaty.puppet.batchContactPayload(idChunk)
261
+
262
+ const contactChunk: ContactInterface[] = []
263
+ for (const id of idChunk) {
264
+ const payload = payloadMap.get(id)
265
+ if (!payload) {
266
+ log.silly('Contact', 'findAllIter() payload missing for id=%s, skip', id)
267
+ continue
268
+ }
269
+
270
+ const contact: ContactImpl = this.wechaty.puppet.currentUserId === id
271
+ ? (this.wechaty.ContactSelf as any as typeof ContactSelfImpl).load(id)
272
+ : (this.wechaty.Contact as any as typeof ContactImpl).load(id)
273
+
274
+ contact.payload = payload
275
+ contactChunk.push(contact)
276
+ }
277
+
278
+ if (contactChunk.length > 0) {
279
+ yield contactChunk
280
+ } else {
281
+ log.warn('Contact', 'findAllIter() batch all missing from payloadMap, idChunk=%j', idChunk)
282
+ }
283
+ }
284
+ }
285
+
219
286
  static async batchLoadContacts (contactIdList: string[]) {
220
287
  if (typeof this.wechaty.puppet.batchContactPayload === 'function') {
221
288
  const contactList: ContactInterface[] = contactIdList.map(id => {
@@ -232,6 +232,216 @@ test('room.say() smoke testing', async () => {
232
232
  await wechaty.stop()
233
233
  })
234
234
 
235
+ test('Room.findAllIter() yields every room returned by roomSearch', async t => {
236
+ const TOTAL = 6
237
+
238
+ const sandbox = sinon.createSandbox()
239
+ const puppet = new PuppetMock() as any
240
+ const wechaty = WechatyBuilder.build({ puppet })
241
+
242
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `r-${idx}`)
243
+ const buildPayload = (id: string) => ({ id, topic: `topic-${id}`, memberIdList: [], adminIdList: [] } as PUPPET.payloads.Room)
244
+
245
+ sandbox.stub(puppet, 'roomSearch').resolves(idList)
246
+ sandbox.stub(puppet, 'batchRoomPayload').callsFake(async (...args: any[]) => {
247
+ const ids = args[0] as string[]
248
+ return new Map(ids.map(id => [ id, buildPayload(id) ]))
249
+ })
250
+
251
+ await wechaty.start()
252
+ const bot = puppet.mocker.createContact({ name: 'bot' })
253
+ await puppet.mocker.login(bot)
254
+
255
+ const seen: string[] = []
256
+ for await (const chunk of wechaty.Room.findAllIter()) {
257
+ for (const room of chunk) {
258
+ seen.push(room.id)
259
+ }
260
+ }
261
+
262
+ t.equal(seen.length, TOTAL, `should yield ${TOTAL} rooms`)
263
+ t.same(seen, idList, 'should yield rooms in search order')
264
+
265
+ await wechaty.stop()
266
+ })
267
+
268
+ test('Room.findAllIter() chunks 101 rooms into [100, 1] at default batch=100', async t => {
269
+ const TOTAL = 101
270
+
271
+ const sandbox = sinon.createSandbox()
272
+ const puppet = new PuppetMock() as any
273
+ const wechaty = WechatyBuilder.build({ puppet })
274
+
275
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `r-${idx}`)
276
+ sandbox.stub(puppet, 'roomSearch').resolves(idList)
277
+ sandbox.stub(puppet, 'batchRoomPayload').callsFake(async (...args: any[]) => {
278
+ const ids = args[0] as string[]
279
+ return new Map(ids.map(id => [ id, { id, topic: id, memberIdList: [], adminIdList: [] } as PUPPET.payloads.Room ]))
280
+ })
281
+
282
+ await wechaty.start()
283
+ const bot = puppet.mocker.createContact({ name: 'bot' })
284
+ await puppet.mocker.login(bot)
285
+
286
+ const sizes: number[] = []
287
+ for await (const chunk of wechaty.Room.findAllIter()) {
288
+ sizes.push(chunk.length)
289
+ }
290
+
291
+ t.same(sizes, [ 100, 1 ], 'should split into two batches: 100 and 1')
292
+
293
+ await wechaty.stop()
294
+ })
295
+
296
+ test('Room.findAllIter() honors early break without throwing', async t => {
297
+ const TOTAL = 250
298
+
299
+ const sandbox = sinon.createSandbox()
300
+ const puppet = new PuppetMock() as any
301
+ const wechaty = WechatyBuilder.build({ puppet })
302
+
303
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `r-${idx}`)
304
+ sandbox.stub(puppet, 'roomSearch').resolves(idList)
305
+ const batchSpy = sandbox.stub(puppet, 'batchRoomPayload').callsFake(async (...args: any[]) => {
306
+ const ids = args[0] as string[]
307
+ return new Map(ids.map(id => [ id, { id, topic: id, memberIdList: [], adminIdList: [] } as PUPPET.payloads.Room ]))
308
+ })
309
+
310
+ await wechaty.start()
311
+ const bot = puppet.mocker.createContact({ name: 'bot' })
312
+ await puppet.mocker.login(bot)
313
+
314
+ let received = 0
315
+ await t.resolves((async () => {
316
+ for await (const chunk of wechaty.Room.findAllIter()) {
317
+ received += chunk.length
318
+ if (received >= 100) {
319
+ break
320
+ }
321
+ }
322
+ })(), 'breaking the loop should not throw')
323
+
324
+ t.equal(received, 100, 'should stop after the first batch')
325
+ t.equal(batchSpy.callCount, 1, 'should not invoke batchRoomPayload again after break')
326
+
327
+ await wechaty.stop()
328
+ })
329
+
330
+ test('Room.findAllIter() invokes batchRoomPayload ceil(N/batch) times, not N times', async t => {
331
+ const TOTAL = 100
332
+ const BATCH = 25
333
+
334
+ const sandbox = sinon.createSandbox()
335
+ const puppet = new PuppetMock() as any
336
+ const wechaty = WechatyBuilder.build({ puppet })
337
+
338
+ const idList = Array.from({ length: TOTAL }, (_, idx) => `r-${idx}`)
339
+ sandbox.stub(puppet, 'roomSearch').resolves(idList)
340
+
341
+ const batchSpy = sandbox.stub(puppet, 'batchRoomPayload').callsFake(async (...args: any[]) => {
342
+ const ids = args[0] as string[]
343
+ return new Map(ids.map(id => [ id, { id, topic: id, memberIdList: [], adminIdList: [] } as PUPPET.payloads.Room ]))
344
+ })
345
+ const rawSpy = sandbox.spy(puppet, 'roomRawPayload')
346
+
347
+ await wechaty.start()
348
+ const bot = puppet.mocker.createContact({ name: 'bot' })
349
+ await puppet.mocker.login(bot)
350
+
351
+ const rawCountBefore = rawSpy.callCount
352
+
353
+ let received = 0
354
+ for await (const chunk of wechaty.Room.findAllIter(undefined, { batch: BATCH })) {
355
+ received += chunk.length
356
+ }
357
+
358
+ t.equal(received, TOTAL, 'should iterate all rooms')
359
+ t.equal(batchSpy.callCount, Math.ceil(TOTAL / BATCH), `should invoke batchRoomPayload ${Math.ceil(TOTAL / BATCH)} times`)
360
+ t.equal(rawSpy.callCount, rawCountBefore, 'should never fall back to per-id roomRawPayload during iteration')
361
+
362
+ await wechaty.stop()
363
+ })
364
+
365
+ test('Room.findAllIter() with empty roomSearch yields nothing and does not throw', async t => {
366
+ const sandbox = sinon.createSandbox()
367
+ const puppet = new PuppetMock() as any
368
+ const wechaty = WechatyBuilder.build({ puppet })
369
+
370
+ sandbox.stub(puppet, 'roomSearch').resolves([])
371
+ const batchSpy = sandbox.stub(puppet, 'batchRoomPayload').resolves(new Map())
372
+
373
+ await wechaty.start()
374
+ const bot = puppet.mocker.createContact({ name: 'bot' })
375
+ await puppet.mocker.login(bot)
376
+
377
+ let chunkCount = 0
378
+ await t.resolves((async () => {
379
+ for await (const _chunk of wechaty.Room.findAllIter()) {
380
+ chunkCount++
381
+ }
382
+ })(), 'empty iteration should not throw')
383
+
384
+ t.equal(chunkCount, 0, 'should yield zero chunks')
385
+ t.equal(batchSpy.callCount, 0, 'should not call batchRoomPayload when no ids')
386
+
387
+ await wechaty.stop()
388
+ })
389
+
390
+ test('Room.findAllIter() throws when batch <= 0', async t => {
391
+ const sandbox = sinon.createSandbox()
392
+ const puppet = new PuppetMock() as any
393
+ const wechaty = WechatyBuilder.build({ puppet })
394
+
395
+ sandbox.stub(puppet, 'roomSearch').resolves([])
396
+ sandbox.stub(puppet, 'batchRoomPayload').resolves(new Map())
397
+
398
+ await wechaty.start()
399
+ const bot = puppet.mocker.createContact({ name: 'bot' })
400
+ await puppet.mocker.login(bot)
401
+
402
+ for (const badBatch of [ 0, -1 ]) {
403
+ await t.rejects(
404
+ (async () => {
405
+ for await (const _chunk of wechaty.Room.findAllIter(undefined, { batch: badBatch })) {
406
+ // should never reach here
407
+ }
408
+ })(),
409
+ /batch must be positive/,
410
+ `should throw when batch=${badBatch}`,
411
+ )
412
+ }
413
+
414
+ await wechaty.stop()
415
+ })
416
+
417
+ test('Room.findAllIter() skips ids missing from payloadMap', async t => {
418
+ const sandbox = sinon.createSandbox()
419
+ const puppet = new PuppetMock() as any
420
+ const wechaty = WechatyBuilder.build({ puppet })
421
+
422
+ sandbox.stub(puppet, 'roomSearch').resolves([ 'r1', 'r2', 'r3' ])
423
+ sandbox.stub(puppet, 'batchRoomPayload').resolves(
424
+ new Map([ [ 'r1', { id: 'r1', topic: 'topic-r1', memberIdList: [], adminIdList: [] } as PUPPET.payloads.Room ] ]),
425
+ )
426
+
427
+ await wechaty.start()
428
+ const bot = puppet.mocker.createContact({ name: 'bot' })
429
+ await puppet.mocker.login(bot)
430
+
431
+ const seen: string[] = []
432
+ await t.resolves((async () => {
433
+ for await (const chunk of wechaty.Room.findAllIter()) {
434
+ for (const room of chunk) {
435
+ seen.push(room.id)
436
+ }
437
+ }
438
+ })(), 'missing ids should not throw or stall iteration')
439
+
440
+ t.same(seen, [ 'r1' ], 'should yield only rooms whose payload was returned')
441
+
442
+ await wechaty.stop()
443
+ })
444
+
235
445
  test('ProtectedProperties', async t => {
236
446
  type NotExistInWechaty = Exclude<RoomProtectedProperty, keyof RoomImpl>
237
447
  type NotExistTest = NotExistInWechaty extends never ? true : false