@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.
- package/dist/cjs/src/client/duck/reducers.d.ts +1 -1
- package/dist/cjs/src/client/duck/reducers.d.ts.map +1 -1
- package/dist/cjs/src/client/grpc-manager.d.ts +2 -2
- package/dist/cjs/src/client/grpc-manager.d.ts.map +1 -1
- package/dist/cjs/src/client/grpc-manager.js +11 -4
- package/dist/cjs/src/client/grpc-manager.js.map +1 -1
- package/dist/cjs/src/client/payload-store.d.ts +1 -0
- package/dist/cjs/src/client/payload-store.d.ts.map +1 -1
- package/dist/cjs/src/client/payload-store.js +6 -0
- package/dist/cjs/src/client/payload-store.js.map +1 -1
- package/dist/cjs/src/client/puppet-service.d.ts +2 -1
- package/dist/cjs/src/client/puppet-service.d.ts.map +1 -1
- package/dist/cjs/src/client/puppet-service.js +21 -2
- package/dist/cjs/src/client/puppet-service.js.map +1 -1
- package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts +1 -1
- package/dist/cjs/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -1
- package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts +1 -1
- package/dist/cjs/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -1
- package/dist/cjs/src/package-json.d.ts.map +1 -1
- package/dist/cjs/src/package-json.js +3 -2
- package/dist/cjs/src/package-json.js.map +1 -1
- package/dist/cjs/src/server/grpc-error.d.ts +1 -1
- package/dist/cjs/src/server/grpc-error.d.ts.map +1 -1
- package/dist/cjs/tests/uuid-file-box.spec.js +2 -1
- package/dist/cjs/tests/uuid-file-box.spec.js.map +1 -1
- package/dist/esm/src/client/duck/reducers.d.ts +1 -1
- package/dist/esm/src/client/duck/reducers.d.ts.map +1 -1
- package/dist/esm/src/client/grpc-manager.d.ts +2 -2
- package/dist/esm/src/client/grpc-manager.d.ts.map +1 -1
- package/dist/esm/src/client/grpc-manager.js +11 -4
- package/dist/esm/src/client/grpc-manager.js.map +1 -1
- package/dist/esm/src/client/payload-store.d.ts +1 -0
- package/dist/esm/src/client/payload-store.d.ts.map +1 -1
- package/dist/esm/src/client/payload-store.js +6 -0
- package/dist/esm/src/client/payload-store.js.map +1 -1
- package/dist/esm/src/client/puppet-service.d.ts +2 -1
- package/dist/esm/src/client/puppet-service.d.ts.map +1 -1
- package/dist/esm/src/client/puppet-service.js +21 -2
- package/dist/esm/src/client/puppet-service.js.map +1 -1
- package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts +1 -1
- package/dist/esm/src/file-box-helper/uuidify-file-box-grpc.d.ts.map +1 -1
- package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts +1 -1
- package/dist/esm/src/file-box-helper/uuidify-file-box-local.d.ts.map +1 -1
- package/dist/esm/src/package-json.d.ts.map +1 -1
- package/dist/esm/src/package-json.js +3 -2
- package/dist/esm/src/package-json.js.map +1 -1
- package/dist/esm/src/server/grpc-error.d.ts +1 -1
- package/dist/esm/src/server/grpc-error.d.ts.map +1 -1
- package/dist/esm/tests/uuid-file-box.spec.js +2 -1
- package/dist/esm/tests/uuid-file-box.spec.js.map +1 -1
- package/package.json +3 -2
- package/src/client/grpc-manager.ts +12 -4
- package/src/client/payload-store.ts +14 -5
- package/src/client/puppet-service.ts +25 -3
- 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.
|
|
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.
|
|
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
|
-
|
|
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?
|
|
50
|
-
public roomMember?
|
|
51
|
-
public room?
|
|
52
|
-
public tag?
|
|
53
|
-
public 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
|
|
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 =>
|
package/src/package-json.ts
CHANGED
|
@@ -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.
|
|
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.
|
|
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
|
},
|