Skip to content

refactoring dirtyPayload #180

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 6 commits into from
Nov 6, 2021
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "wechaty-puppet-service",
"version": "1.0.11",
"version": "1.1.1",
"description": "Puppet Service for Wechaty",
"type": "module",
"exports": {
Expand Down Expand Up @@ -64,7 +64,7 @@
"why-is-node-running": "^2.2.0"
},
"peerDependencies": {
"wechaty-puppet": "^1.2.7"
"wechaty-puppet": "^1.3.3"
},
"dependencies": {
"clone-class": "^1.0.2",
Expand Down
14 changes: 5 additions & 9 deletions src/client/payload-store.ts
Original file line number Diff line number Diff line change
Expand Up @@ -7,7 +7,6 @@ import semverPkg from 'semver'
import type * as PUPPET from 'wechaty-puppet'

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

import {
VERSION,
Expand All @@ -20,12 +19,16 @@ interface PayloadStoreOptions {
token: string
}

interface StoreRoomMemberPayload {
[roomMemberContactId: string]: PUPPET.payload.RoomMember
}

class PayloadStore {

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

public contact? : FlashStore<string, PUPPET.payload.Contact>
public roomMember? : FlashStore<string, PUPPET.payload.RoomMember>
public roomMember? : FlashStore<string, StoreRoomMemberPayload>
public room? : FlashStore<string, PUPPET.payload.Room>

protected storeDir: string
Expand Down Expand Up @@ -126,13 +129,6 @@ class PayloadStore {
})
}

roomMemberId (
roomId: string,
memberId: string,
): string {
return roomId + '-' + memberId
}

}

export { PayloadStore }
79 changes: 44 additions & 35 deletions src/client/puppet-service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -337,36 +337,16 @@ export class PuppetService extends PUPPET.Puppet {
}

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

await super.dirtyPayload(type, id)

switch (type) {
case PUPPET.type.Payload.Contact:
await this.payloadStore.contact?.delete(id)
break
case PUPPET.type.Payload.Friendship:
// TODO
break
case PUPPET.type.Payload.Message:
// await this.payloadStore.message?.del(id)
// TODO
break
case PUPPET.type.Payload.Room:
await this.payloadStore.room?.delete(id)
break
case PUPPET.type.Payload.RoomMember:
await this.payloadStore.roomMember?.delete(id)
break
default:
log.error('PuppetService', 'dirtyPayload(%s) unknown type', type)
break
}

const request = new grpcPuppet.DirtyPayloadRequest()
request.setId(id)
request.setType(type)
Expand All @@ -382,6 +362,31 @@ export class PuppetService extends PUPPET.Puppet {
}
}

/**
* `onDirty()` is called when the puppet emit `dirty` event.
* the event listener will be registered in `start()` from the `PuppetAbstract` class
*/
override onDirty (
{
payloadType,
payloadId,
}: PUPPET.payload.EventDirty,
): void {
log.verbose('PuppetService', 'onDirty(%s<%s>, %s)', PUPPET.type.Payload[payloadType], payloadType, payloadId)

const dirtyMap = {
[PUPPET.type.Payload.Contact]: async (id: string) => this.payloadStore.contact?.delete(id),
[PUPPET.type.Payload.Friendship]: async (_: string) => {},
[PUPPET.type.Payload.Message]: async (_: string) => {},
[PUPPET.type.Payload.Room]: async (id: string) => this.payloadStore.room?.delete(id),
[PUPPET.type.Payload.RoomMember]: async (id: string) => this.payloadStore.roomMember?.delete(id),
[PUPPET.type.Payload.Unspecified]: async (id: string) => { throw new Error('Unspecified type with id: ' + id) },
}

const dirtyFuncSync = this.wrapAsync(dirtyMap[payloadType])
dirtyFuncSync(payloadId)
}

/**
*
* Contact
Expand Down Expand Up @@ -1417,14 +1422,15 @@ export class PuppetService extends PUPPET.Puppet {
return response.getMemberIdsList()
}

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

const id = this.payloadStore.roomMemberId(roomId, contactId)
const cachedPayload = await this.payloadStore.roomMember?.get(id)
if (cachedPayload) {
log.silly('PuppetService', 'roomMemberRawPayload(%s) cache HIT', id)
return cachedPayload
const cachedPayload = await this.payloadStore.roomMember?.get(roomId)
const cachedRoomMemberPayload = cachedPayload && cachedPayload[contactId]

if (cachedRoomMemberPayload) {
log.silly('PuppetService', 'roomMemberRawPayload(%s, %s) cache HIT', roomId, contactId)
return cachedRoomMemberPayload
}

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

await this.payloadStore.roomMember?.set(id, payload)
log.silly('PuppetService', 'roomMemberRawPayload(%s) cache SET', id)
await this.payloadStore.roomMember?.set(roomId, {
...cachedPayload,
contactId: payload,
})
log.silly('PuppetService', 'roomMemberRawPayload(%s, %s) cache SET', roomId, contactId)

return payload
}

override async roomMemberRawPayloadParser (payload: any): Promise<PUPPET.payload.RoomMember> {
override async roomMemberRawPayloadParser (payload: PUPPET.payload.RoomMember): Promise<PUPPET.payload.RoomMember> {
// log.silly('PuppetService', 'roomMemberRawPayloadParser({id:%s})', payload.id)
// passthrough
return payload
Expand Down
2 changes: 1 addition & 1 deletion src/server/event-stream-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -17,7 +17,7 @@ class EventStreamManager {
private puppetListening = false

constructor (
public puppet: PUPPET.impl.Puppet,
public puppet: PUPPET.impl.PuppetInterface,
) {
log.verbose('EventStreamManager', 'constructor(%s)', puppet)
}
Expand Down
4 changes: 2 additions & 2 deletions src/server/puppet-implementation.ts
Original file line number Diff line number Diff line change
Expand Up @@ -28,7 +28,7 @@ import { grpcError } from './grpc-error.js'
import { EventStreamManager } from './event-stream-manager.js'

function puppetImplementation (
puppet : PUPPET.impl.Puppet,
puppet : PUPPET.impl.PuppetInterface,
FileBoxUuid : typeof FileBox,
): grpcPuppet.IPuppetServer {

Expand Down Expand Up @@ -307,7 +307,7 @@ function puppetImplementation (
await puppet.dirtyPayload(type, id)
return callback(null, new grpcPuppet.DirtyPayloadResponse())
} catch (e) {
return grpcError('dirtyPayload', e, callback)
return grpcError('puppet.dirtyPayload() rejection: ', e, callback)
}
},

Expand Down