Skip to content

Commit 6a35023

Browse files
authored
refactoring dirtyPayload (#180)
* refactoring dirtyPayload * follow the latest dirty design * use PuppetInterface * 1.0.12 * use roomMember store payload * 1.1.1
1 parent 376dace commit 6a35023

File tree

5 files changed

+54
-49
lines changed

5 files changed

+54
-49
lines changed

package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "wechaty-puppet-service",
3-
"version": "1.0.11",
3+
"version": "1.1.1",
44
"description": "Puppet Service for Wechaty",
55
"type": "module",
66
"exports": {
@@ -64,7 +64,7 @@
6464
"why-is-node-running": "^2.2.0"
6565
},
6666
"peerDependencies": {
67-
"wechaty-puppet": "^1.2.7"
67+
"wechaty-puppet": "^1.3.3"
6868
},
6969
"dependencies": {
7070
"clone-class": "^1.0.2",

src/client/payload-store.ts

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -7,7 +7,6 @@ import semverPkg from 'semver'
77
import type * as PUPPET from 'wechaty-puppet'
88

99
import { FlashStore } from 'flash-store'
10-
// import LRU from 'lru-cache'
1110

1211
import {
1312
VERSION,
@@ -20,12 +19,16 @@ interface PayloadStoreOptions {
2019
token: string
2120
}
2221

22+
interface StoreRoomMemberPayload {
23+
[roomMemberContactId: string]: PUPPET.payload.RoomMember
24+
}
25+
2326
class PayloadStore {
2427

2528
// public message? : LRU<string, MessagePayload>
2629

2730
public contact? : FlashStore<string, PUPPET.payload.Contact>
28-
public roomMember? : FlashStore<string, PUPPET.payload.RoomMember>
31+
public roomMember? : FlashStore<string, StoreRoomMemberPayload>
2932
public room? : FlashStore<string, PUPPET.payload.Room>
3033

3134
protected storeDir: string
@@ -126,13 +129,6 @@ class PayloadStore {
126129
})
127130
}
128131

129-
roomMemberId (
130-
roomId: string,
131-
memberId: string,
132-
): string {
133-
return roomId + '-' + memberId
134-
}
135-
136132
}
137133

138134
export { PayloadStore }

src/client/puppet-service.ts

Lines changed: 44 additions & 35 deletions
Original file line numberDiff line numberDiff line change
@@ -337,36 +337,16 @@ export class PuppetService extends PUPPET.Puppet {
337337
}
338338

339339
/**
340-
* Huan(202108): consider to use `messagePayloadDirty`, `roomPayloadDirty`
341-
* to replace this `dirtyPayload` method for a clearer design and easy to maintain.
340+
*
341+
* Huan(202111) Issue #158 - Refactoring the 'dirty' event, dirtyPayload(),
342+
* and XXXPayloadDirty() methods logic & spec
343+
*
344+
* @see https://github.com/wechaty/puppet/issues/158
345+
*
342346
*/
343347
override async dirtyPayload (type: PUPPET.type.Payload, id: string) {
344348
log.verbose('PuppetService', 'dirtyPayload(%s, %s)', type, id)
345349

346-
await super.dirtyPayload(type, id)
347-
348-
switch (type) {
349-
case PUPPET.type.Payload.Contact:
350-
await this.payloadStore.contact?.delete(id)
351-
break
352-
case PUPPET.type.Payload.Friendship:
353-
// TODO
354-
break
355-
case PUPPET.type.Payload.Message:
356-
// await this.payloadStore.message?.del(id)
357-
// TODO
358-
break
359-
case PUPPET.type.Payload.Room:
360-
await this.payloadStore.room?.delete(id)
361-
break
362-
case PUPPET.type.Payload.RoomMember:
363-
await this.payloadStore.roomMember?.delete(id)
364-
break
365-
default:
366-
log.error('PuppetService', 'dirtyPayload(%s) unknown type', type)
367-
break
368-
}
369-
370350
const request = new grpcPuppet.DirtyPayloadRequest()
371351
request.setId(id)
372352
request.setType(type)
@@ -382,6 +362,31 @@ export class PuppetService extends PUPPET.Puppet {
382362
}
383363
}
384364

365+
/**
366+
* `onDirty()` is called when the puppet emit `dirty` event.
367+
* the event listener will be registered in `start()` from the `PuppetAbstract` class
368+
*/
369+
override onDirty (
370+
{
371+
payloadType,
372+
payloadId,
373+
}: PUPPET.payload.EventDirty,
374+
): void {
375+
log.verbose('PuppetService', 'onDirty(%s<%s>, %s)', PUPPET.type.Payload[payloadType], payloadType, payloadId)
376+
377+
const dirtyMap = {
378+
[PUPPET.type.Payload.Contact]: async (id: string) => this.payloadStore.contact?.delete(id),
379+
[PUPPET.type.Payload.Friendship]: async (_: string) => {},
380+
[PUPPET.type.Payload.Message]: async (_: string) => {},
381+
[PUPPET.type.Payload.Room]: async (id: string) => this.payloadStore.room?.delete(id),
382+
[PUPPET.type.Payload.RoomMember]: async (id: string) => this.payloadStore.roomMember?.delete(id),
383+
[PUPPET.type.Payload.Unspecified]: async (id: string) => { throw new Error('Unspecified type with id: ' + id) },
384+
}
385+
386+
const dirtyFuncSync = this.wrapAsync(dirtyMap[payloadType])
387+
dirtyFuncSync(payloadId)
388+
}
389+
385390
/**
386391
*
387392
* Contact
@@ -1417,14 +1422,15 @@ export class PuppetService extends PUPPET.Puppet {
14171422
return response.getMemberIdsList()
14181423
}
14191424

1420-
override async roomMemberRawPayload (roomId: string, contactId: string): Promise<any> {
1425+
override async roomMemberRawPayload (roomId: string, contactId: string): Promise<PUPPET.payload.RoomMember> {
14211426
log.verbose('PuppetService', 'roomMemberRawPayload(%s, %s)', roomId, contactId)
14221427

1423-
const id = this.payloadStore.roomMemberId(roomId, contactId)
1424-
const cachedPayload = await this.payloadStore.roomMember?.get(id)
1425-
if (cachedPayload) {
1426-
log.silly('PuppetService', 'roomMemberRawPayload(%s) cache HIT', id)
1427-
return cachedPayload
1428+
const cachedPayload = await this.payloadStore.roomMember?.get(roomId)
1429+
const cachedRoomMemberPayload = cachedPayload && cachedPayload[contactId]
1430+
1431+
if (cachedRoomMemberPayload) {
1432+
log.silly('PuppetService', 'roomMemberRawPayload(%s, %s) cache HIT', roomId, contactId)
1433+
return cachedRoomMemberPayload
14281434
}
14291435

14301436
const request = new grpcPuppet.RoomMemberPayloadRequest()
@@ -1444,13 +1450,16 @@ export class PuppetService extends PUPPET.Puppet {
14441450
roomAlias : response.getRoomAlias(),
14451451
}
14461452

1447-
await this.payloadStore.roomMember?.set(id, payload)
1448-
log.silly('PuppetService', 'roomMemberRawPayload(%s) cache SET', id)
1453+
await this.payloadStore.roomMember?.set(roomId, {
1454+
...cachedPayload,
1455+
contactId: payload,
1456+
})
1457+
log.silly('PuppetService', 'roomMemberRawPayload(%s, %s) cache SET', roomId, contactId)
14491458

14501459
return payload
14511460
}
14521461

1453-
override async roomMemberRawPayloadParser (payload: any): Promise<PUPPET.payload.RoomMember> {
1462+
override async roomMemberRawPayloadParser (payload: PUPPET.payload.RoomMember): Promise<PUPPET.payload.RoomMember> {
14541463
// log.silly('PuppetService', 'roomMemberRawPayloadParser({id:%s})', payload.id)
14551464
// passthrough
14561465
return payload

src/server/event-stream-manager.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ class EventStreamManager {
1717
private puppetListening = false
1818

1919
constructor (
20-
public puppet: PUPPET.impl.Puppet,
20+
public puppet: PUPPET.impl.PuppetInterface,
2121
) {
2222
log.verbose('EventStreamManager', 'constructor(%s)', puppet)
2323
}

src/server/puppet-implementation.ts

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,7 @@ import { grpcError } from './grpc-error.js'
2828
import { EventStreamManager } from './event-stream-manager.js'
2929

3030
function puppetImplementation (
31-
puppet : PUPPET.impl.Puppet,
31+
puppet : PUPPET.impl.PuppetInterface,
3232
FileBoxUuid : typeof FileBox,
3333
): grpcPuppet.IPuppetServer {
3434

@@ -307,7 +307,7 @@ function puppetImplementation (
307307
await puppet.dirtyPayload(type, id)
308308
return callback(null, new grpcPuppet.DirtyPayloadResponse())
309309
} catch (e) {
310-
return grpcError('dirtyPayload', e, callback)
310+
return grpcError('puppet.dirtyPayload() rejection: ', e, callback)
311311
}
312312
},
313313

0 commit comments

Comments
 (0)