提交 4e56c04b 编写于 作者: Huan (李卓桓)'s avatar Huan (李卓桓)

try to use file to save memory

上级 c9b689bd
......@@ -4,7 +4,7 @@ import fs from 'fs-extra'
import { MemoryCard } from 'memory-card'
import { StateSwitch } from 'state-switch'
import { FlashStoreSync } from 'flash-store'
import { FlashStore } from 'flash-store'
import {
Subscription,
} from 'rxjs'
......@@ -71,11 +71,11 @@ export class PadchatManager extends PadchatRpc {
private userId?: string
private cacheContactRawPayload? : FlashStoreSync<string, PadchatContactPayload>
private cacheRoomMemberRawPayload? : FlashStoreSync<string, {
private storeContactRawPayload? : FlashStore<string, PadchatContactPayload>
private storeRoomMemberRawPayload? : FlashStore<string, {
[contactId: string]: PadchatRoomMemberPayload,
}>
private cacheRoomRawPayload? : FlashStoreSync<string, PadchatRoomPayload>
private storeRoomRawPayload? : FlashStore<string, PadchatRoomPayload>
private readonly state : StateSwitch
private readonly delayQueueExecutor : DelayQueueExector
......@@ -107,9 +107,9 @@ export class PadchatManager extends PadchatRpc {
): Promise<void> {
log.verbose('PuppetPadchatManager', 'initCache(%s, %s)', token, userId)
if ( this.cacheContactRawPayload
|| this.cacheRoomMemberRawPayload
|| this.cacheRoomRawPayload
if ( this.storeContactRawPayload
|| this.storeRoomMemberRawPayload
|| this.storeRoomRawPayload
) {
throw new Error('cache exists')
}
......@@ -131,27 +131,32 @@ export class PadchatManager extends PadchatRpc {
await fs.mkdirp(baseDir)
}
this.cacheContactRawPayload = new FlashStoreSync(path.join(baseDir, 'contact-raw-payload'))
this.cacheRoomMemberRawPayload = new FlashStoreSync(path.join(baseDir, 'room-member-raw-payload'))
this.cacheRoomRawPayload = new FlashStoreSync(path.join(baseDir, 'room-raw-payload'))
this.storeContactRawPayload = new FlashStore(path.join(baseDir, 'contact-raw-payload'))
this.storeRoomMemberRawPayload = new FlashStore(path.join(baseDir, 'room-member-raw-payload'))
this.storeRoomRawPayload = new FlashStore(path.join(baseDir, 'room-raw-payload'))
await Promise.all([
this.cacheContactRawPayload.ready(),
this.cacheRoomMemberRawPayload.ready(),
this.cacheRoomRawPayload.ready(),
])
// await Promise.all([
// this.storeContactRawPayload.ready(),
// this.storeRoomMemberRawPayload.ready(),
// this.storeRoomRawPayload.ready(),
// ])
const roomMemberTotalNum = [...this.cacheRoomMemberRawPayload.values()].reduce(
(accuVal, currVal) => {
return accuVal + Object.keys(currVal).length
},
0,
)
let roomMemberTotalNum = 0
for await (const value of this.storeRoomMemberRawPayload.values()) {
roomMemberTotalNum += Object.keys(value).length
}
// const roomMemberTotalNum = [...this.storeRoomMemberRawPayload.values()].reduce(
// (accuVal, currVal) => {
// return accuVal + Object.keys(currVal).length
// },
// 0,
// )
log.verbose('PuppetPadchatManager', 'initCache() inited %d Contacts, %d RoomMembers, %d Rooms, cachedir="%s"',
this.cacheContactRawPayload.size,
this.storeContactRawPayload.size,
roomMemberTotalNum,
this.cacheRoomRawPayload.size,
this.storeRoomRawPayload.size,
baseDir,
)
}
......@@ -159,17 +164,17 @@ export class PadchatManager extends PadchatRpc {
protected async releaseCache(): Promise<void> {
log.verbose('PuppetPadchatManager', 'releaseCache()')
if ( this.cacheContactRawPayload
&& this.cacheRoomMemberRawPayload
&& this.cacheRoomRawPayload
if ( this.storeContactRawPayload
&& this.storeRoomMemberRawPayload
&& this.storeRoomRawPayload
) {
await this.cacheContactRawPayload.close(),
await this.cacheRoomMemberRawPayload.close(),
await this.cacheRoomRawPayload.close(),
await this.storeContactRawPayload.close(),
await this.storeRoomMemberRawPayload.close(),
await this.storeRoomRawPayload.close(),
this.cacheContactRawPayload = undefined
this.cacheRoomMemberRawPayload = undefined
this.cacheRoomRawPayload = undefined
this.storeContactRawPayload = undefined
this.storeRoomMemberRawPayload = undefined
this.storeRoomRawPayload = undefined
log.silly('PuppetPadchatManager', 'releaseCache() cache closed.')
} else {
......@@ -277,8 +282,8 @@ export class PadchatManager extends PadchatRpc {
/**
* Refresh the login-ed user payload
*/
if (this.cacheContactRawPayload) {
this.cacheContactRawPayload.delete(this.userId)
if (this.storeContactRawPayload) {
await this.storeContactRawPayload.delete(this.userId)
await this.contactRawPayload(this.userId)
}
......@@ -553,7 +558,7 @@ export class PadchatManager extends PadchatRpc {
// wait 1 second and try again
await new Promise(r => setTimeout(r, 1000))
return await this.emitLoginQrcode()
return this.emitLoginQrcode()
}
const fileBox = FileBox.fromBase64(result.qr_code, 'qrcode.jpg')
......@@ -671,34 +676,42 @@ export class PadchatManager extends PadchatRpc {
}
}
public getContactIdList(): string[] {
public async getContactIdList(): Promise<string[]> {
log.verbose('PuppetPadchatManager', 'getContactIdList()')
if (!this.cacheContactRawPayload) {
if (!this.storeContactRawPayload) {
throw new Error('cache not inited' )
}
const contactIdList = [...this.cacheContactRawPayload.keys()]
// const contactIdList = [...this.storeContactRawPayload.keys()]
const contactIdList: string[] = []
for await (const contactId of this.storeContactRawPayload.keys()) {
contactIdList.push(contactId)
}
log.silly('PuppetPadchatManager', 'getContactIdList() = %d', contactIdList.length)
return contactIdList
}
public getRoomIdList(): string[] {
public async getRoomIdList(): Promise<string[]> {
log.verbose('PuppetPadchatManager', 'getRoomIdList()')
if (!this.cacheRoomRawPayload) {
if (!this.storeRoomRawPayload) {
throw new Error('cache not inited' )
}
const roomIdList = [...this.cacheRoomRawPayload.keys()]
// const roomIdList = [...this.storeRoomRawPayload.keys()]
const roomIdList: string[] = []
for await (const roomId of this.storeRoomRawPayload.keys()) {
roomIdList.push(roomId)
}
log.verbose('PuppetPadchatManager', 'getRoomIdList()=%d', roomIdList.length)
return roomIdList
}
public roomMemberRawPayloadDirty(
public async roomMemberRawPayloadDirty(
roomId: string,
): void {
): Promise<void> {
log.verbose('PuppetPadchatManager', 'roomMemberRawPayloadDirty(%d)', roomId)
if (!this.cacheRoomMemberRawPayload) {
if (!this.storeRoomMemberRawPayload) {
throw new Error('cache not inited' )
}
this.cacheRoomMemberRawPayload.delete(roomId)
await this.storeRoomMemberRawPayload.delete(roomId)
}
public async getRoomMemberIdList(
......@@ -706,15 +719,15 @@ export class PadchatManager extends PadchatRpc {
dirty = false,
): Promise<string[]> {
log.verbose('PuppetPadchatManager', 'getRoomMemberIdList(%d)', roomId)
if (!this.cacheRoomMemberRawPayload) {
if (!this.storeRoomMemberRawPayload) {
throw new Error('cache not inited' )
}
if (dirty) {
this.roomMemberRawPayloadDirty(roomId)
await this.roomMemberRawPayloadDirty(roomId)
}
const memberRawPayloadDict = this.cacheRoomMemberRawPayload.get(roomId)
const memberRawPayloadDict = await this.storeRoomMemberRawPayload.get(roomId)
|| await this.syncRoomMember(roomId)
if (!memberRawPayloadDict) {
......@@ -729,24 +742,24 @@ export class PadchatManager extends PadchatRpc {
return memberIdList
}
public roomRawPayloadDirty(
public async roomRawPayloadDirty(
roomId: string,
): void {
): Promise<void> {
log.verbose('PuppetPadchatManager', 'roomRawPayloadDirty(%d)', roomId)
if (!this.cacheRoomRawPayload) {
if (!this.storeRoomRawPayload) {
throw new Error('cache not inited' )
}
this.cacheRoomRawPayload.delete(roomId)
await this.storeRoomRawPayload.delete(roomId)
}
public async roomMemberRawPayload(roomId: string): Promise<{ [contactId: string]: PadchatRoomMemberPayload }> {
log.verbose('PuppetPadchatManager', 'roomMemberRawPayload(%s)', roomId)
if (!this.cacheRoomMemberRawPayload) {
if (!this.storeRoomMemberRawPayload) {
throw new Error('cache not inited' )
}
const memberRawPayloadDict = this.cacheRoomMemberRawPayload.get(roomId)
const memberRawPayloadDict = await this.storeRoomMemberRawPayload.get(roomId)
|| await this.syncRoomMember(roomId)
if (!memberRawPayloadDict) {
......@@ -768,8 +781,8 @@ export class PadchatManager extends PadchatRpc {
* Room Id not exist
* See: https://github.com/lijiarui/wechaty-puppet-padchat/issues/64#issuecomment-397319016
*/
this.roomMemberRawPayloadDirty(roomId)
this.roomRawPayloadDirty(roomId)
await this.roomMemberRawPayloadDirty(roomId)
await this.roomRawPayloadDirty(roomId)
return {}
......@@ -787,16 +800,16 @@ export class PadchatManager extends PadchatRpc {
memberDict[contactId] = memberPayload
}
if (!this.cacheRoomMemberRawPayload) {
if (!this.storeRoomMemberRawPayload) {
throw new Error('cache not inited' )
}
const oldMemberDict = this.cacheRoomMemberRawPayload.get(roomId)
const oldMemberDict = await this.storeRoomMemberRawPayload.get(roomId)
const newMemberDict = {
...oldMemberDict,
...memberDict,
}
this.cacheRoomMemberRawPayload.set(roomId, newMemberDict)
await this.storeRoomMemberRawPayload.set(roomId, newMemberDict)
return newMemberDict
}
......@@ -817,16 +830,16 @@ export class PadchatManager extends PadchatRpc {
continue
}
if ( !this.cacheContactRawPayload
|| !this.cacheRoomRawPayload
if ( !this.storeContactRawPayload
|| !this.storeRoomRawPayload
) {
throw new Error('no cache')
}
log.silly('PuppetPadchatManager', 'syncContactsAndRooms() syncing %d out of Contact(%d) & Room(%d) ...',
syncContactList.length,
this.cacheContactRawPayload.size,
this.cacheRoomRawPayload.size,
await this.storeContactRawPayload.size,
await this.storeRoomRawPayload.size,
)
for (const syncContact of syncContactList) {
......@@ -849,7 +862,7 @@ export class PadchatManager extends PadchatRpc {
const roomId = syncContact.user_name
const roomPayload = syncContact as PadchatRoomPayload
this.cacheRoomRawPayload.set(roomId, roomPayload)
await this.storeRoomRawPayload.set(roomId, roomPayload)
/**
* Use delay queue executor to sync room:
......@@ -872,7 +885,7 @@ export class PadchatManager extends PadchatRpc {
const contactPayload = syncContact as PadchatContactPayload
const contactId = contactPayload.user_name
this.cacheContactRawPayload.set(contactId, contactPayload)
await this.storeContactRawPayload.set(contactId, contactPayload)
} else {
throw new Error('id is neither room nor contact')
......@@ -896,14 +909,14 @@ export class PadchatManager extends PadchatRpc {
}
}
public contactRawPayloadDirty(
public async contactRawPayloadDirty(
contactId: string,
): void {
): Promise<void> {
log.verbose('PuppetPadchatManager', 'contactRawPayloadDirty(%d)', contactId)
if (!this.cacheContactRawPayload) {
if (!this.storeContactRawPayload) {
throw new Error('cache not inited' )
}
this.cacheContactRawPayload.delete(contactId)
await this.storeContactRawPayload.delete(contactId)
}
public async contactRawPayload(contactId: string): Promise<PadchatContactPayload> {
......@@ -912,12 +925,12 @@ export class PadchatManager extends PadchatRpc {
const rawPayload = await Misc.retry(async (retry, attempt) => {
log.silly('PuppetPadchatManager', 'contactRawPayload(%s) retry() attempt=%d', contactId, attempt)
if (!this.cacheContactRawPayload) {
if (!this.storeContactRawPayload) {
throw new Error('no cache')
}
if (this.cacheContactRawPayload.has(contactId)) {
return this.cacheContactRawPayload.get(contactId)
if (this.storeContactRawPayload.has(contactId)) {
return this.storeContactRawPayload.get(contactId)
}
const tryRawPayload = await this.WXGetContactPayload(contactId)
......@@ -925,7 +938,7 @@ export class PadchatManager extends PadchatRpc {
// check user_name too becasue the server might return {}
// See issue #1358 https://github.com/Chatie/wechaty/issues/1358
if (tryRawPayload /* && tryRawPayload.user_name */) {
this.cacheContactRawPayload.set(contactId, tryRawPayload)
await this.storeContactRawPayload.set(contactId, tryRawPayload)
return tryRawPayload
}
return retry(new Error('tryRawPayload empty'))
......@@ -937,18 +950,20 @@ export class PadchatManager extends PadchatRpc {
return rawPayload
}
public async roomRawPayload(id: string): Promise<PadchatRoomPayload> {
public async roomRawPayload(
id: string,
): Promise<PadchatRoomPayload> {
log.verbose('PuppetPadchatManager', 'roomRawPayload(%s)', id)
const rawPayload = await Misc.retry(async (retry, attempt) => {
log.silly('PuppetPadchatManager', 'roomRawPayload(%s) retry() attempt=%d', id, attempt)
if (!this.cacheRoomRawPayload) {
if (!this.storeRoomRawPayload) {
throw new Error('no cache')
}
if (this.cacheRoomRawPayload.has(id)) {
return this.cacheRoomRawPayload.get(id)
if (await this.storeRoomRawPayload.has(id)) {
return this.storeRoomRawPayload.get(id)
}
const tryRawPayload = await this.WXGetRoomPayload(id)
......@@ -956,7 +971,7 @@ export class PadchatManager extends PadchatRpc {
// check user_name too becasue the server might return {}
// See issue #1358 https://github.com/Chatie/wechaty/issues/1358
if (tryRawPayload /* && tryRawPayload.user_name */) {
this.cacheRoomRawPayload.set(id, tryRawPayload)
await this.storeRoomRawPayload.set(id, tryRawPayload)
return tryRawPayload
}
return retry(new Error('tryRawPayload empty'))
......
......@@ -602,7 +602,7 @@ export class PuppetPadchat extends Puppet {
throw new Error('no padchat manager')
}
const contactIdList = this.padchatManager.getContactIdList()
const contactIdList = await this.padchatManager.getContactIdList()
return contactIdList
}
......@@ -671,7 +671,7 @@ export class PuppetPadchat extends Puppet {
log.verbose('PuppetPadchat', 'contactPayloadDirty(%s)', contactId)
if (this.padchatManager) {
this.padchatManager.contactRawPayloadDirty(contactId)
await this.padchatManager.contactRawPayloadDirty(contactId)
}
await super.contactPayloadDirty(contactId)
......@@ -924,7 +924,7 @@ export class PuppetPadchat extends Puppet {
log.verbose('PuppetPadchat', 'roomPayloadDirty(%s)', roomId)
if (this.padchatManager) {
this.padchatManager.roomRawPayloadDirty(roomId)
await this.padchatManager.roomRawPayloadDirty(roomId)
}
await super.roomPayloadDirty(roomId)
......
......@@ -32,13 +32,13 @@
true,
180
],
"callable-types": true,
"interface-over-type-literal": true,
"no-empty-interface": true,
"no-string-throw": true,
"prefer-const": true,
"unified-signatures": false,
"no-inferrable-types": [true, "ignore-params"],
"callable-types": true,
"interface-over-type-literal": true,
"no-empty-interface": true,
"no-string-throw": true,
"prefer-const": true,
"unified-signatures": false,
"no-inferrable-types": [true, "ignore-params"],
"member-access": true,
"member-ordering": [false],
"no-any": false,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册