@juzi/wechaty-puppet-service 1.0.51 → 1.0.53

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 (55) hide show
  1. package/dist/cjs/src/client/duck/reducers.d.ts +1 -1
  2. package/dist/cjs/src/client/duck/reducers.d.ts.map +1 -1
  3. package/dist/cjs/src/client/grpc-manager.d.ts +2 -2
  4. package/dist/cjs/src/client/grpc-manager.d.ts.map +1 -1
  5. package/dist/cjs/src/client/grpc-manager.js +11 -4
  6. package/dist/cjs/src/client/grpc-manager.js.map +1 -1
  7. package/dist/cjs/src/client/payload-store.d.ts +1 -0
  8. package/dist/cjs/src/client/payload-store.d.ts.map +1 -1
  9. package/dist/cjs/src/client/payload-store.js +6 -0
  10. package/dist/cjs/src/client/payload-store.js.map +1 -1
  11. package/dist/cjs/src/client/puppet-service.d.ts +2 -1
  12. package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
  13. package/dist/cjs/src/client/puppet-service.js +21 -2
  14. package/dist/cjs/src/client/puppet-service.js.map +1 -1
  15. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts +1 -1
  16. package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -1
  17. package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts +1 -1
  18. package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -1
  19. package/dist/cjs/src/package-json.d.ts.map +1 -1
  20. package/dist/cjs/src/package-json.js +3 -2
  21. package/dist/cjs/src/package-json.js.map +1 -1
  22. package/dist/cjs/src/server/grpc-error.d.ts +1 -1
  23. package/dist/cjs/src/server/grpc-error.d.ts.map +1 -1
  24. package/dist/cjs/tests/uuid-file-box.spec.js +2 -1
  25. package/dist/cjs/tests/uuid-file-box.spec.js.map +1 -1
  26. package/dist/esm/src/client/duck/reducers.d.ts +1 -1
  27. package/dist/esm/src/client/duck/reducers.d.ts.map +1 -1
  28. package/dist/esm/src/client/grpc-manager.d.ts +2 -2
  29. package/dist/esm/src/client/grpc-manager.d.ts.map +1 -1
  30. package/dist/esm/src/client/grpc-manager.js +11 -4
  31. package/dist/esm/src/client/grpc-manager.js.map +1 -1
  32. package/dist/esm/src/client/payload-store.d.ts +1 -0
  33. package/dist/esm/src/client/payload-store.d.ts.map +1 -1
  34. package/dist/esm/src/client/payload-store.js +6 -0
  35. package/dist/esm/src/client/payload-store.js.map +1 -1
  36. package/dist/esm/src/client/puppet-service.d.ts +2 -1
  37. package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
  38. package/dist/esm/src/client/puppet-service.js +21 -2
  39. package/dist/esm/src/client/puppet-service.js.map +1 -1
  40. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts +1 -1
  41. package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -1
  42. package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts +1 -1
  43. package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -1
  44. package/dist/esm/src/package-json.d.ts.map +1 -1
  45. package/dist/esm/src/package-json.js +3 -2
  46. package/dist/esm/src/package-json.js.map +1 -1
  47. package/dist/esm/src/server/grpc-error.d.ts +1 -1
  48. package/dist/esm/src/server/grpc-error.d.ts.map +1 -1
  49. package/dist/esm/tests/uuid-file-box.spec.js +2 -1
  50. package/dist/esm/tests/uuid-file-box.spec.js.map +1 -1
  51. package/package.json +3 -2
  52. package/src/client/grpc-manager.ts +12 -4
  53. package/src/client/payload-store.ts +14 -5
  54. package/src/client/puppet-service.ts +25 -3
  55. package/src/package-json.ts +3 -2
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@juzi/wechaty-puppet-service",
3
- "version": "1.0.51",
3
+ "version": "1.0.53",
4
4
  "description": "Puppet Service for Wechaty",
5
5
  "type": "module",
6
6
  "exports": {
@@ -70,7 +70,7 @@
70
70
  "@juzi/wechaty-puppet": "^1.0.51"
71
71
  },
72
72
  "dependencies": {
73
- "@juzi/wechaty-grpc": "^1.0.53",
73
+ "@juzi/wechaty-grpc": "^1.0.54",
74
74
  "@juzi/wechaty-redux": "^1.0.1",
75
75
  "clone-class": "^1.1.1",
76
76
  "ducks": "^1.0.2",
@@ -81,6 +81,7 @@
81
81
  "rxjs": "^7.5.5",
82
82
  "semver": "^7.3.5",
83
83
  "stronger-typed-streams": "^0.2.0",
84
+ "typescript": "^4.7.3",
84
85
  "uuid": "^8.3.2",
85
86
  "wechaty-token": "^1.0.6"
86
87
  },
@@ -144,7 +144,7 @@ class GrpcManager extends EventEmitter {
144
144
  log.verbose('GrpcManager', 'constructor() serverName(SNI): "%s"', this.serverName)
145
145
  }
146
146
 
147
- async start (): Promise<void> {
147
+ async start (lastEventSeq?: string, accountId?: string): Promise<void> {
148
148
  log.verbose('GrpcManager', 'start()')
149
149
 
150
150
  /**
@@ -158,7 +158,7 @@ class GrpcManager extends EventEmitter {
158
158
  * 2. Connect to stream
159
159
  */
160
160
  log.verbose('GrpcManager', 'start() starting stream ...')
161
- await this.startStream()
161
+ await this.startStream(lastEventSeq, accountId)
162
162
  log.verbose('GrpcManager', 'start() starting stream ... done')
163
163
 
164
164
  /**
@@ -287,7 +287,7 @@ class GrpcManager extends EventEmitter {
287
287
  }
288
288
  }
289
289
 
290
- protected async startStream (): Promise<void> {
290
+ protected async startStream (lastEventSeq?: string, accountId?: string): Promise<void> {
291
291
  log.verbose('GrpcManager', 'startStream()')
292
292
 
293
293
  if (this.eventStream) {
@@ -296,7 +296,15 @@ class GrpcManager extends EventEmitter {
296
296
  }
297
297
 
298
298
  log.verbose('GrpcManager', 'startStream() grpc -> event() ...')
299
- const eventStream = this.client.event(new puppet.EventRequest())
299
+
300
+ const eventRequest = new puppet.EventRequest()
301
+ if (lastEventSeq) {
302
+ eventRequest.setSeq(Number(lastEventSeq))
303
+ }
304
+ if (accountId) {
305
+ eventRequest.setAccountId(accountId)
306
+ }
307
+ const eventStream = this.client.event(eventRequest)
300
308
  log.verbose('GrpcManager', 'startStream() grpc -> event() ... done')
301
309
 
302
310
  /**
@@ -46,11 +46,12 @@ class PayloadStore {
46
46
 
47
47
  // public message? : LRU<string, MessagePayload>
48
48
 
49
- public contact? : FlashStore<string, PUPPET.payloads.Contact>
50
- public roomMember? : FlashStore<string, StoreRoomMemberPayload>
51
- public room? : FlashStore<string, PUPPET.payloads.Room>
52
- public tag? : FlashStore<string, PUPPET.payloads.Tag>
53
- public tagGroup? : FlashStore<string, PUPPET.payloads.TagGroup>
49
+ public contact? : FlashStore<string, PUPPET.payloads.Contact>
50
+ public roomMember? : FlashStore<string, StoreRoomMemberPayload>
51
+ public room? : FlashStore<string, PUPPET.payloads.Room>
52
+ public tag? : FlashStore<string, PUPPET.payloads.Tag>
53
+ public tagGroup? : FlashStore<string, PUPPET.payloads.TagGroup>
54
+ public miscellaneous : FlashStore<string, string>
54
55
 
55
56
  protected storeDir: string
56
57
  protected accountId?: string
@@ -66,6 +67,12 @@ class PayloadStore {
66
67
  `v${major(VERSION)}.${minor(VERSION)}`,
67
68
  )
68
69
  log.silly('PayloadStore', 'constructor() storeDir: "%s"', this.storeDir)
70
+
71
+ if (!fs.existsSync(this.storeDir)) {
72
+ fs.mkdirSync(this.storeDir, { recursive: true })
73
+ }
74
+
75
+ this.miscellaneous = new FlashStore(path.join(this.storeDir, 'miscellaneous')) // account-free data
69
76
  }
70
77
 
71
78
  /**
@@ -148,6 +155,8 @@ class PayloadStore {
148
155
  throw new Error('Can not destroy() a start()-ed store. Call stop() to stop it first')
149
156
  }
150
157
 
158
+ await this.miscellaneous.close()
159
+
151
160
  /**
152
161
  * Huan(202108): `fs.rm` was introduced from Node.js v14.14
153
162
  * https://nodejs.org/api/fs.html#fs_fspromises_rm_path_options
@@ -87,6 +87,8 @@ class PuppetService extends PUPPET.Puppet {
87
87
  protected _ducks: Ducks<{ puppet: typeof PuppetDuck }>
88
88
  protected _store: Store
89
89
 
90
+ private timeoutMilliseconds: number
91
+
90
92
  protected _grpcManager?: GrpcManager
91
93
  get grpcManager (): GrpcManager {
92
94
  if (!this._grpcManager) {
@@ -119,6 +121,7 @@ class PuppetService extends PUPPET.Puppet {
119
121
  this._cleanupCallbackList = []
120
122
 
121
123
  this.FileBoxUuid = uuidifyFileBoxGrpc(() => this.grpcManager.client)
124
+ this.timeoutMilliseconds = (options.timeoutSeconds || 2) * 1000 * 10 // 20min default, 40min for xiaoju-bot
122
125
  }
123
126
 
124
127
  protected async serializeFileBox (fileBox: FileBoxInterface): Promise<string> {
@@ -164,7 +167,10 @@ class PuppetService extends PUPPET.Puppet {
164
167
  log.verbose('PuppetService', 'start() setting up bridge grpc event stream ... done')
165
168
 
166
169
  log.verbose('PuppetService', 'start() starting grpc manager...')
167
- await grpcManager.start()
170
+ const lastEventTimestamp = await this._payloadStore.miscellaneous.get('eventTimestamp')
171
+ const lastEventSeq = (Date.now() - Number(lastEventTimestamp || 0)) < this.timeoutMilliseconds ? await this._payloadStore.miscellaneous.get('eventSeq') : undefined
172
+ const accountId = await this._payloadStore.miscellaneous.get('accountId')
173
+ await grpcManager.start(lastEventSeq, accountId)
168
174
  log.verbose('PuppetService', 'start() starting grpc manager... done')
169
175
 
170
176
  log.verbose('PuppetService', 'start healthCheck')
@@ -228,7 +234,7 @@ class PuppetService extends PUPPET.Puppet {
228
234
  log.verbose('PuppetService', 'bridgeGrpcEventStream(client)')
229
235
 
230
236
  client
231
- .on('data', this.onGrpcStreamEvent.bind(this))
237
+ .on('data', this.onGrpcStreamEvent.bind(this) as any)
232
238
  .on('end', () => {
233
239
  log.verbose('PuppetService', 'bridgeGrpcEventStream() eventStream.on(end)')
234
240
  })
@@ -254,9 +260,11 @@ class PuppetService extends PUPPET.Puppet {
254
260
  })
255
261
  }
256
262
 
257
- private onGrpcStreamEvent (event: grpcPuppet.EventResponse): void {
263
+ private async onGrpcStreamEvent (event: grpcPuppet.EventResponse): Promise<void> {
264
+
258
265
  const type = event.getType()
259
266
  const payload = event.getPayload()
267
+ const seq = event.getSeq()
260
268
 
261
269
  if (!NO_LOG_EVENTS.includes(type)) {
262
270
  log.info('PuppetService', `received grpc event ${EventTypeRev[type]} on ${new Date().toString()}, content: ${JSON.stringify(payload)}`)
@@ -275,6 +283,14 @@ class PuppetService extends PUPPET.Puppet {
275
283
  })
276
284
  }
277
285
 
286
+ if (seq) {
287
+ const lastEventSeq = await this._payloadStore.miscellaneous.get('eventSeq')
288
+ if (!lastEventSeq || (seq > Number(lastEventSeq) || seq === 1)) {
289
+ await this._payloadStore.miscellaneous.set('eventSeq', String(seq))
290
+ await this._payloadStore.miscellaneous.set('eventTimestamp', String(Date.now()))
291
+ }
292
+ }
293
+
278
294
  switch (type) {
279
295
  case grpcPuppet.EventType.EVENT_TYPE_DONG:
280
296
  this.emit('dong', JSON.parse(payload) as PUPPET.payloads.EventDong)
@@ -291,6 +307,11 @@ class PuppetService extends PUPPET.Puppet {
291
307
  case grpcPuppet.EventType.EVENT_TYPE_LOGIN:
292
308
  {
293
309
  const loginPayload = JSON.parse(payload) as PUPPET.payloads.EventLogin
310
+ const accountId = await this._payloadStore.miscellaneous.get('accountId')
311
+ if (accountId !== loginPayload.contactId) {
312
+ await this._payloadStore.miscellaneous.delete('eventSeq')
313
+ }
314
+ await this._payloadStore.miscellaneous.set('accountId', loginPayload.contactId)
294
315
  ;(
295
316
  async () => this.login(loginPayload.contactId)
296
317
  )().catch(e =>
@@ -303,6 +324,7 @@ class PuppetService extends PUPPET.Puppet {
303
324
  case grpcPuppet.EventType.EVENT_TYPE_LOGOUT:
304
325
  {
305
326
  const logoutPayload = JSON.parse(payload) as PUPPET.payloads.EventLogout
327
+ await this._payloadStore.miscellaneous.delete('accountId')
306
328
  ;(
307
329
  async () => this.logout(logoutPayload.data)
308
330
  )().catch(e =>
@@ -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.51",
7
+ "version": "1.0.53",
8
8
  "description": "Puppet Service for Wechaty",
9
9
  "type": "module",
10
10
  "exports": {
@@ -74,7 +74,7 @@ export const packageJson: PackageJson = {
74
74
  "@juzi/wechaty-puppet": "^1.0.51"
75
75
  },
76
76
  "dependencies": {
77
- "@juzi/wechaty-grpc": "^1.0.53",
77
+ "@juzi/wechaty-grpc": "^1.0.54",
78
78
  "@juzi/wechaty-redux": "^1.0.1",
79
79
  "clone-class": "^1.1.1",
80
80
  "ducks": "^1.0.2",
@@ -85,6 +85,7 @@ export const packageJson: PackageJson = {
85
85
  "rxjs": "^7.5.5",
86
86
  "semver": "^7.3.5",
87
87
  "stronger-typed-streams": "^0.2.0",
88
+ "typescript": "^4.7.3",
88
89
  "uuid": "^8.3.2",
89
90
  "wechaty-token": "^1.0.6"
90
91
  },