support for unverifying during cache update
This commit is contained in:
parent
0bb0e79939
commit
228352bedb
@ -80,10 +80,17 @@ export class AutoVerifierWithArg<T, K> {
|
|||||||
this.tokenQueries.clear();
|
this.tokenQueries.clear();
|
||||||
}
|
}
|
||||||
|
|
||||||
unverifySome(toUnverifyFilter: (query: K) => boolean) {
|
getCachedQueries(): K[] {
|
||||||
const tokensToUnverify = Array.from(this.tokenQueries.values())
|
return Array.from(this.tokenQueries.values());
|
||||||
.filter(toUnverifyFilter)
|
}
|
||||||
.map(query => this.tokenizer(query));
|
|
||||||
|
unverifyByFilter(filter: (query: K) => boolean) {
|
||||||
|
this.unverifySome(this.getCachedQueries().filter(filter));
|
||||||
|
}
|
||||||
|
|
||||||
|
// use getUnverifySomeFunc for a more functional style
|
||||||
|
unverifySome(toUnverify: K[]) {
|
||||||
|
const tokensToUnverify = new Set(toUnverify.map(query => this.tokenizer(query)));
|
||||||
for (const token of tokensToUnverify) {
|
for (const token of tokensToUnverify) {
|
||||||
this.tokenAutoVerifiers.get(token)?.unverify();
|
this.tokenAutoVerifiers.get(token)?.unverify();
|
||||||
this.tokenAutoVerifiers.delete(token);
|
this.tokenAutoVerifiers.delete(token);
|
||||||
|
@ -24,7 +24,7 @@ export enum AutoVerifierChangesType {
|
|||||||
export class AutoVerifier<T> {
|
export class AutoVerifier<T> {
|
||||||
public primaryPromise: Promise<T | null> | null = null;
|
public primaryPromise: Promise<T | null> | null = null;
|
||||||
public trustedPromise: Promise<T | null> | null = null;
|
public trustedPromise: Promise<T | null> | null = null;
|
||||||
public trustedStatus: 'none' | 'fetching' | 'verifying' | 'verified' | 'unverified' = 'none';
|
public trustedStatus: 'none' | 'fetching' | 'verifying' | 'verified' = 'none';
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Allows a trusted function to verify the primary function
|
* Allows a trusted function to verify the primary function
|
||||||
@ -226,7 +226,7 @@ export class AutoVerifier<T> {
|
|||||||
// keep in mind that this will resolve 'unverified' promises with their resulting origTrustedPromise (which should be a good thing)
|
// keep in mind that this will resolve 'unverified' promises with their resulting origTrustedPromise (which should be a good thing)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!resolved && trustedResult) {
|
if (!resolved) { // Removed 01/09/2021 pretty sure should not be here... && trustedResult
|
||||||
resolve(trustedResult);
|
resolve(trustedResult);
|
||||||
resolved = true;
|
resolved = true;
|
||||||
}
|
}
|
||||||
|
@ -18,9 +18,9 @@ export default class PairVerifierFetchable extends EventEmitter<Conflictable> im
|
|||||||
|
|
||||||
private readonly fetchResourceVerifier: AutoVerifierWithArg<Resource, IDQuery>
|
private readonly fetchResourceVerifier: AutoVerifierWithArg<Resource, IDQuery>
|
||||||
|
|
||||||
private readonly fetchMessagesRecentVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>;
|
public readonly fetchMessagesRecentVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>;
|
||||||
private readonly fetchMessagesBeforeVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>;
|
public readonly fetchMessagesBeforeVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>;
|
||||||
private readonly fetchMessagesAfterVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>;
|
public readonly fetchMessagesAfterVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>;
|
||||||
|
|
||||||
constructor(
|
constructor(
|
||||||
private primary: Fetchable & Lackable,
|
private primary: Fetchable & Lackable,
|
||||||
@ -146,11 +146,11 @@ export default class PairVerifierFetchable extends EventEmitter<Conflictable> im
|
|||||||
async handleResourceConflict(query: IDQuery, changesType: AutoVerifierChangesType, primaryResource: Resource | null, trustedResource: Resource | null): Promise<boolean> {
|
async handleResourceConflict(query: IDQuery, changesType: AutoVerifierChangesType, primaryResource: Resource | null, trustedResource: Resource | null): Promise<boolean> {
|
||||||
let success = true;
|
let success = true;
|
||||||
if (changesType === AutoVerifierChangesType.PRIMARY_ONLY) {
|
if (changesType === AutoVerifierChangesType.PRIMARY_ONLY) {
|
||||||
success = success && await this.primary.handleResourceDeleted(trustedResource as Resource);
|
success = success && await this.primary.handleResourceDeleted(trustedResource as Resource, this.fetchResourceVerifier);
|
||||||
} else if (changesType === AutoVerifierChangesType.TRUSTED_ONLY) {
|
} else if (changesType === AutoVerifierChangesType.TRUSTED_ONLY) {
|
||||||
success = success && await this.primary.handleResourceAdded(trustedResource as Resource);
|
success = success && await this.primary.handleResourceAdded(trustedResource as Resource, this.fetchResourceVerifier);
|
||||||
} else if (changesType === AutoVerifierChangesType.CONFLICT) {
|
} else if (changesType === AutoVerifierChangesType.CONFLICT) {
|
||||||
success = success && await this.primary.handleResourceChanged(trustedResource as Resource);
|
success = success && await this.primary.handleResourceChanged(trustedResource as Resource, this.fetchResourceVerifier);
|
||||||
this.emit('conflict-resource', query, changesType, primaryResource as Resource, trustedResource as Resource);
|
this.emit('conflict-resource', query, changesType, primaryResource as Resource, trustedResource as Resource);
|
||||||
}
|
}
|
||||||
return success;
|
return success;
|
||||||
@ -158,9 +158,9 @@ export default class PairVerifierFetchable extends EventEmitter<Conflictable> im
|
|||||||
|
|
||||||
async handleMessagesConflict(query: PartialMessageListQuery, changesType: AutoVerifierChangesType, changes: Changes<Message>): Promise<boolean> {
|
async handleMessagesConflict(query: PartialMessageListQuery, changesType: AutoVerifierChangesType, changes: Changes<Message>): Promise<boolean> {
|
||||||
let success = true;
|
let success = true;
|
||||||
if (changes.added.length > 0) success = success && await this.primary.handleMessagesAdded(changes.added);
|
if (changes.added.length > 0) success = success && await this.primary.handleMessagesAdded(changes.added, this.fetchMessagesRecentVerifier, this.fetchMessagesBeforeVerifier, this.fetchMessagesAfterVerifier);
|
||||||
if (changes.updated.length > 0) success = success && await this.primary.handleMessagesChanged(changes.updated.map(change => change.newDataPoint));
|
if (changes.updated.length > 0) success = success && await this.primary.handleMessagesChanged(changes.updated.map(change => change.newDataPoint), this.fetchMessagesRecentVerifier, this.fetchMessagesBeforeVerifier, this.fetchMessagesAfterVerifier);
|
||||||
if (changes.deleted.length > 0) success = success && await this.primary.handleMessagesDeleted(changes.deleted);
|
if (changes.deleted.length > 0) success = success && await this.primary.handleMessagesDeleted(changes.deleted, this.fetchMessagesRecentVerifier, this.fetchMessagesBeforeVerifier, this.fetchMessagesAfterVerifier);
|
||||||
|
|
||||||
if (changesType === AutoVerifierChangesType.CONFLICT) {
|
if (changesType === AutoVerifierChangesType.CONFLICT) {
|
||||||
this.emit('conflict-messages', query, changesType, changes);
|
this.emit('conflict-messages', query, changesType, changes);
|
||||||
|
@ -43,6 +43,9 @@ export default class CombinedGuild extends EventEmitter<Connectable & Conflictab
|
|||||||
this.personalDBGuild = new PersonalDBGuild(personalDB, this.id, this.memberId);
|
this.personalDBGuild = new PersonalDBGuild(personalDB, this.id, this.memberId);
|
||||||
this.socketGuild = new SocketGuild(socket, socketVerifier);
|
this.socketGuild = new SocketGuild(socket, socketVerifier);
|
||||||
|
|
||||||
|
const diskSocket = new PairVerifierFetchable(this.personalDBGuild, this.socketGuild);
|
||||||
|
const ramDiskSocket = new PairVerifierFetchable(this.ramGuild, diskSocket);
|
||||||
|
|
||||||
// Connect/Disconnect
|
// Connect/Disconnect
|
||||||
this.socketGuild.on('connect', () => {
|
this.socketGuild.on('connect', () => {
|
||||||
LOG.info(`g#${this.id} connected`);
|
LOG.info(`g#${this.id} connected`);
|
||||||
@ -104,8 +107,18 @@ export default class CombinedGuild extends EventEmitter<Connectable & Conflictab
|
|||||||
for (const message of messages) {
|
for (const message of messages) {
|
||||||
LOG.info(`g#${this.id} ${message}`);
|
LOG.info(`g#${this.id} ${message}`);
|
||||||
}
|
}
|
||||||
this.ramGuild.handleMessagesAdded(messages);
|
this.ramGuild.handleMessagesAdded(
|
||||||
await this.personalDBGuild.handleMessagesAdded(messages);
|
messages,
|
||||||
|
diskSocket.fetchMessagesRecentVerifier,
|
||||||
|
diskSocket.fetchMessagesBeforeVerifier,
|
||||||
|
diskSocket.fetchMessagesAfterVerifier
|
||||||
|
);
|
||||||
|
await this.personalDBGuild.handleMessagesAdded(
|
||||||
|
messages,
|
||||||
|
diskSocket.fetchMessagesRecentVerifier,
|
||||||
|
diskSocket.fetchMessagesBeforeVerifier,
|
||||||
|
diskSocket.fetchMessagesAfterVerifier
|
||||||
|
);
|
||||||
const members = await this.grabRAMMembersMap();
|
const members = await this.grabRAMMembersMap();
|
||||||
const channels = await this.grabRAMChannelsMap();
|
const channels = await this.grabRAMChannelsMap();
|
||||||
for (const message of messages) message.fill(members, channels);
|
for (const message of messages) message.fill(members, channels);
|
||||||
@ -115,8 +128,18 @@ export default class CombinedGuild extends EventEmitter<Connectable & Conflictab
|
|||||||
for (const message of messages) {
|
for (const message of messages) {
|
||||||
LOG.info(`g#${this.id} updated ${message}`);
|
LOG.info(`g#${this.id} updated ${message}`);
|
||||||
}
|
}
|
||||||
this.ramGuild.handleMessagesChanged(messages);
|
this.ramGuild.handleMessagesChanged(
|
||||||
await this.personalDBGuild.handleMessagesChanged(messages);
|
messages,
|
||||||
|
ramDiskSocket.fetchMessagesRecentVerifier,
|
||||||
|
ramDiskSocket.fetchMessagesBeforeVerifier,
|
||||||
|
ramDiskSocket.fetchMessagesAfterVerifier
|
||||||
|
);
|
||||||
|
await this.personalDBGuild.handleMessagesChanged(
|
||||||
|
messages,
|
||||||
|
diskSocket.fetchMessagesRecentVerifier,
|
||||||
|
diskSocket.fetchMessagesBeforeVerifier,
|
||||||
|
diskSocket.fetchMessagesAfterVerifier
|
||||||
|
);
|
||||||
const members = await this.grabRAMMembersMap();
|
const members = await this.grabRAMMembersMap();
|
||||||
const channels = await this.grabRAMChannelsMap();
|
const channels = await this.grabRAMChannelsMap();
|
||||||
for (const message of messages) message.fill(members, channels);
|
for (const message of messages) message.fill(members, channels);
|
||||||
@ -157,9 +180,6 @@ export default class CombinedGuild extends EventEmitter<Connectable & Conflictab
|
|||||||
this.emit('remove-tokens', removedTokens);
|
this.emit('remove-tokens', removedTokens);
|
||||||
});
|
});
|
||||||
|
|
||||||
const diskSocket = new PairVerifierFetchable(this.personalDBGuild, this.socketGuild);
|
|
||||||
const ramDiskSocket = new PairVerifierFetchable(this.ramGuild, diskSocket);
|
|
||||||
|
|
||||||
// Forward the conflict events from the last verifier in the chain
|
// Forward the conflict events from the last verifier in the chain
|
||||||
ramDiskSocket.on('conflict-metadata', (changesType: AutoVerifierChangesType, oldGuildMeta: GuildMetadata, newGuildMeta: GuildMetadata) => {
|
ramDiskSocket.on('conflict-metadata', (changesType: AutoVerifierChangesType, oldGuildMeta: GuildMetadata, newGuildMeta: GuildMetadata) => {
|
||||||
LOG.info(`g#${this.id} metadata conflict`, { oldGuildMeta, newGuildMeta });
|
LOG.info(`g#${this.id} metadata conflict`, { oldGuildMeta, newGuildMeta });
|
||||||
|
@ -7,6 +7,7 @@ import { AsyncFetchable, AsyncLackable } from "./guild-types";
|
|||||||
import { Channel, GuildMetadata, GuildMetadataLocal, Member, Message, Resource, SocketConfig, Token } from "./data-types";
|
import { Channel, GuildMetadata, GuildMetadataLocal, Member, Message, Resource, SocketConfig, Token } from "./data-types";
|
||||||
|
|
||||||
import PersonalDB from "./personal-db";
|
import PersonalDB from "./personal-db";
|
||||||
|
import { AutoVerifierWithArg, PartialMessageListQuery } from './auto-verifier-with-args';
|
||||||
|
|
||||||
export default class PersonalDBGuild implements AsyncFetchable, AsyncLackable {
|
export default class PersonalDBGuild implements AsyncFetchable, AsyncLackable {
|
||||||
constructor(
|
constructor(
|
||||||
@ -94,17 +95,35 @@ export default class PersonalDBGuild implements AsyncFetchable, AsyncLackable {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
async handleMessagesAdded(addedMessages: Message[]): Promise<boolean> {
|
async handleMessagesAdded(
|
||||||
|
addedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): Promise<boolean> {
|
||||||
|
// The PersonalDB does not remove old messages (yet) so nothing here would unverify
|
||||||
//LOG.debug(addedMessages.length + ' personal messages added');
|
//LOG.debug(addedMessages.length + ' personal messages added');
|
||||||
await this.db.addMessages(this.guildId, addedMessages);
|
await this.db.addMessages(this.guildId, addedMessages);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
async handleMessagesChanged(changedMessages: Message[]): Promise<boolean> {
|
async handleMessagesChanged(
|
||||||
|
changedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): Promise<boolean> {
|
||||||
|
// The PersonalDB does not remove old messages (yet) so nothing here would unverify
|
||||||
//LOG.debug(changedMessages.length + ' personal messages changed');
|
//LOG.debug(changedMessages.length + ' personal messages changed');
|
||||||
await this.db.updateMessages(this.guildId, changedMessages);
|
await this.db.updateMessages(this.guildId, changedMessages);
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
async handleMessagesDeleted(deletedMessages: Message[]): Promise<boolean> {
|
async handleMessagesDeleted(
|
||||||
|
deletedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): Promise<boolean> {
|
||||||
|
// The PersonalDB does not remove old messages (yet) so nothing here would unverify
|
||||||
//LOG.debug(deletedMessages.length + ' personal messages deleted');
|
//LOG.debug(deletedMessages.length + ' personal messages deleted');
|
||||||
await this.db.deleteMessages(this.guildId, deletedMessages);
|
await this.db.deleteMessages(this.guildId, deletedMessages);
|
||||||
return true;
|
return true;
|
||||||
|
@ -7,6 +7,7 @@ import { SyncFetchable, SyncLackable } from "./guild-types";
|
|||||||
import { GuildMetadata, Member, Channel, Message, Resource, Token } from "./data-types";
|
import { GuildMetadata, Member, Channel, Message, Resource, Token } from "./data-types";
|
||||||
import MessageRAMCache from "./message-ram-cache";
|
import MessageRAMCache from "./message-ram-cache";
|
||||||
import ResourceRAMCache from "./resource-ram-cache";
|
import ResourceRAMCache from "./resource-ram-cache";
|
||||||
|
import { AutoVerifierWithArg, PartialMessageListQuery } from './auto-verifier-with-args';
|
||||||
|
|
||||||
export default class RAMGuild implements SyncFetchable, SyncLackable {
|
export default class RAMGuild implements SyncFetchable, SyncLackable {
|
||||||
private metadata: GuildMetadata | null = null;
|
private metadata: GuildMetadata | null = null;
|
||||||
@ -97,7 +98,12 @@ export default class RAMGuild implements SyncFetchable, SyncLackable {
|
|||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
handleMessagesAdded(addedMessages: Message[]): boolean {
|
handleMessagesAdded(
|
||||||
|
addedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): boolean {
|
||||||
const byChannel = new Map<string, Message[]>();
|
const byChannel = new Map<string, Message[]>();
|
||||||
for (const message of addedMessages) {
|
for (const message of addedMessages) {
|
||||||
if (!byChannel.has(message.channel.id)) {
|
if (!byChannel.has(message.channel.id)) {
|
||||||
@ -107,11 +113,16 @@ export default class RAMGuild implements SyncFetchable, SyncLackable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const [ channelId, messages ] of byChannel.entries()) {
|
for (const [ channelId, messages ] of byChannel.entries()) {
|
||||||
this.recentMessages.upsertMessages(this.guildId, channelId, messages);
|
this.recentMessages.upsertMessages(this.guildId, channelId, messages, recentAutoVerifier);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
handleMessagesChanged(changedMessages: Message[]): boolean {
|
handleMessagesChanged(
|
||||||
|
changedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): boolean {
|
||||||
const byChannel = new Map<string, Message[]>();
|
const byChannel = new Map<string, Message[]>();
|
||||||
for (const message of changedMessages) {
|
for (const message of changedMessages) {
|
||||||
if (!byChannel.has(message.channel.id)) {
|
if (!byChannel.has(message.channel.id)) {
|
||||||
@ -121,11 +132,16 @@ export default class RAMGuild implements SyncFetchable, SyncLackable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const [ channelId, messages ] of byChannel.entries()) {
|
for (const [ channelId, messages ] of byChannel.entries()) {
|
||||||
this.recentMessages.upsertMessages(this.guildId, channelId, messages);
|
this.recentMessages.upsertMessages(this.guildId, channelId, messages, recentAutoVerifier);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
handleMessagesDeleted(deletedMessages: Message[]): boolean {
|
handleMessagesDeleted(
|
||||||
|
deletedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): boolean {
|
||||||
const byChannel = new Map<string, Message[]>();
|
const byChannel = new Map<string, Message[]>();
|
||||||
for (const message of deletedMessages) {
|
for (const message of deletedMessages) {
|
||||||
if (!byChannel.has(message.channel.id)) {
|
if (!byChannel.has(message.channel.id)) {
|
||||||
@ -135,7 +151,7 @@ export default class RAMGuild implements SyncFetchable, SyncLackable {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
for (const [ channelId, messages ] of byChannel.entries()) {
|
for (const [ channelId, messages ] of byChannel.entries()) {
|
||||||
this.recentMessages.deleteMessages(this.guildId, channelId, messages);
|
this.recentMessages.deleteMessages(this.guildId, channelId, messages, recentAutoVerifier);
|
||||||
}
|
}
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
import { Changes, Channel, GuildMetadata, Member, Message, Resource, Token } from './data-types';
|
import { Changes, Channel, GuildMetadata, Member, Message, Resource, Token } from './data-types';
|
||||||
import { AutoVerifierChangesType } from './auto-verifier';
|
import { AutoVerifierChangesType } from './auto-verifier';
|
||||||
import { IDQuery, PartialMessageListQuery } from './auto-verifier-with-args';
|
import { AutoVerifierWithArg, IDQuery, PartialMessageListQuery } from './auto-verifier-with-args';
|
||||||
|
|
||||||
// Fetchable
|
// Fetchable
|
||||||
|
|
||||||
@ -72,13 +72,28 @@ export interface AsyncLackable {
|
|||||||
handleChannelsChanged(changedChannels: Channel[]): Promise<boolean>;
|
handleChannelsChanged(changedChannels: Channel[]): Promise<boolean>;
|
||||||
handleChannelsDeleted(deletedChannels: Channel[]): Promise<boolean>;
|
handleChannelsDeleted(deletedChannels: Channel[]): Promise<boolean>;
|
||||||
|
|
||||||
handleMessagesAdded(addedMessages: Message[]): Promise<boolean>;
|
handleMessagesAdded(
|
||||||
handleMessagesChanged(changedMessages: Message[]): Promise<boolean>;
|
addedMessages: Message[],
|
||||||
handleMessagesDeleted(deletedMessages: Message[]): Promise<boolean>;
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): Promise<boolean>;
|
||||||
|
handleMessagesChanged(
|
||||||
|
changedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): Promise<boolean>;
|
||||||
|
handleMessagesDeleted(
|
||||||
|
deletedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): Promise<boolean>;
|
||||||
|
|
||||||
handleResourceAdded(addedResource: Resource): Promise<boolean>;
|
handleResourceAdded(addedResource: Resource, resourceAutoVerifier: AutoVerifierWithArg<Resource, IDQuery>): Promise<boolean>;
|
||||||
handleResourceChanged(changedResource: Resource): Promise<boolean>;
|
handleResourceChanged(changedResource: Resource, resourceAutoVerifier: AutoVerifierWithArg<Resource, IDQuery>): Promise<boolean>;
|
||||||
handleResourceDeleted(deletedResource: Resource): Promise<boolean>;
|
handleResourceDeleted(deletedResource: Resource, resourceAutoVerifier: AutoVerifierWithArg<Resource, IDQuery>): Promise<boolean>;
|
||||||
|
|
||||||
handleTokensAdded(addedTokens: Token[]): Promise<boolean>;
|
handleTokensAdded(addedTokens: Token[]): Promise<boolean>;
|
||||||
handleTokensChanged(changedTokens: Token[]): Promise<boolean>;
|
handleTokensChanged(changedTokens: Token[]): Promise<boolean>;
|
||||||
@ -96,13 +111,28 @@ export interface SyncLackable {
|
|||||||
handleChannelsChanged(changedChannels: Channel[]): boolean;
|
handleChannelsChanged(changedChannels: Channel[]): boolean;
|
||||||
handleChannelsDeleted(deletedChannels: Channel[]): boolean;
|
handleChannelsDeleted(deletedChannels: Channel[]): boolean;
|
||||||
|
|
||||||
handleMessagesAdded(addedMessages: Message[]): boolean;
|
handleMessagesAdded(
|
||||||
handleMessagesChanged(changedMessages: Message[]): boolean;
|
addedMessages: Message[],
|
||||||
handleMessagesDeleted(deletedMessages: Message[]): boolean;
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): boolean;
|
||||||
|
handleMessagesChanged(
|
||||||
|
changedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): boolean;
|
||||||
|
handleMessagesDeleted(
|
||||||
|
deletedMessages: Message[],
|
||||||
|
recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
beforeAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>,
|
||||||
|
afterAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>
|
||||||
|
): boolean;
|
||||||
|
|
||||||
handleResourceAdded(addedResource: Resource): boolean;
|
handleResourceAdded(addedResource: Resource, resourceAutoVerifier: AutoVerifierWithArg<Resource, IDQuery>): boolean;
|
||||||
handleResourceChanged(changedResource: Resource): boolean;
|
handleResourceChanged(changedResource: Resource, resourceAutoVerifier: AutoVerifierWithArg<Resource, IDQuery>): boolean;
|
||||||
handleResourceDeleted(deletedResource: Resource): boolean;
|
handleResourceDeleted(deletedResource: Resource, resourceAutoVerifier: AutoVerifierWithArg<Resource, IDQuery>): boolean;
|
||||||
|
|
||||||
handleTokensAdded(addedTokens: Token[]): boolean;
|
handleTokensAdded(addedTokens: Token[]): boolean;
|
||||||
handleTokensChanged(changedTokens: Token[]): boolean;
|
handleTokensChanged(changedTokens: Token[]): boolean;
|
||||||
|
@ -4,6 +4,7 @@ import Globals from "./globals";
|
|||||||
import * as electronRemote from '@electron/remote';
|
import * as electronRemote from '@electron/remote';
|
||||||
const electronConsole = electronRemote.getGlobal('console') as Console;
|
const electronConsole = electronRemote.getGlobal('console') as Console;
|
||||||
import Logger from '../../logger/logger';
|
import Logger from '../../logger/logger';
|
||||||
|
import { AutoVerifierWithArg, PartialMessageListQuery } from "./auto-verifier-with-args";
|
||||||
const LOG = Logger.create(__filename, electronConsole);
|
const LOG = Logger.create(__filename, electronConsole);
|
||||||
|
|
||||||
interface MessagesWithMetadata {
|
interface MessagesWithMetadata {
|
||||||
@ -33,13 +34,15 @@ export default class MessageRAMCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Removes the oldest messages from the channel until the channel is under the max cached character limit
|
// Removes the oldest messages from the channel until the channel is under the max cached character limit
|
||||||
private trimOldChannelMessagesIfNeeded(guildId: number, channelId: string) {
|
// Returns true if messages were removed
|
||||||
|
private trimOldChannelMessagesIfNeeded(guildId: number, channelId: string, recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>): void {
|
||||||
const id = `g#${guildId}/c#${channelId}`;
|
const id = `g#${guildId}/c#${channelId}`;
|
||||||
const value = this.data.get(id);
|
const value = this.data.get(id);
|
||||||
if (!value) return;
|
if (!value) return;
|
||||||
|
|
||||||
if (value.totalCharacters > Globals.MAX_RAM_CACHED_MESSAGES_CHANNEL_CHARACTERS) {
|
if (value.totalCharacters > Globals.MAX_RAM_CACHED_MESSAGES_CHANNEL_CHARACTERS) {
|
||||||
const messages = Array.from(value.messages.values()).sort(Message.sortOrder);
|
const messages = Array.from(value.messages.values()).sort(Message.sortOrder);
|
||||||
|
const beforeNumMessages = value.messages.size;
|
||||||
while (value.totalCharacters > Globals.MAX_RAM_CACHED_MESSAGES_CHANNEL_CHARACTERS) {
|
while (value.totalCharacters > Globals.MAX_RAM_CACHED_MESSAGES_CHANNEL_CHARACTERS) {
|
||||||
const message = messages.shift();
|
const message = messages.shift();
|
||||||
if (!message) throw new ShouldNeverHappenError('could not find a message to clear');
|
if (!message) throw new ShouldNeverHappenError('could not find a message to clear');
|
||||||
@ -47,10 +50,13 @@ export default class MessageRAMCache {
|
|||||||
value.totalCharacters -= message.text?.length ?? 0;
|
value.totalCharacters -= message.text?.length ?? 0;
|
||||||
this.totalCharacters -= message.text?.length ?? 0;
|
this.totalCharacters -= message.text?.length ?? 0;
|
||||||
}
|
}
|
||||||
|
const afterNumMessages = value.messages.size;
|
||||||
|
// TODO: Test this (it's going to be a massive pain)
|
||||||
|
recentAutoVerifier.unverifyByFilter(query => query.channelId === channelId && beforeNumMessages >= query.number && afterNumMessages < query.number);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
upsertMessages(guildId: number, channelId: string, messages: Message[]) {
|
upsertMessages(guildId: number, channelId: string, messages: Message[], recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>) {
|
||||||
const id = `g#${guildId}/c#${channelId}`;
|
const id = `g#${guildId}/c#${channelId}`;
|
||||||
|
|
||||||
if (!this.data.has(id)) {
|
if (!this.data.has(id)) {
|
||||||
@ -66,21 +72,27 @@ export default class MessageRAMCache {
|
|||||||
}
|
}
|
||||||
|
|
||||||
this.cullLeastUsedChannelsIfNeeded();
|
this.cullLeastUsedChannelsIfNeeded();
|
||||||
this.trimOldChannelMessagesIfNeeded(guildId, channelId);
|
this.trimOldChannelMessagesIfNeeded(guildId, channelId, recentAutoVerifier);
|
||||||
}
|
}
|
||||||
|
|
||||||
deleteMessages(guildId: number, channelId: string, messages: Message[]) {
|
deleteMessages(guildId: number, channelId: string, messages: Message[], recentAutoVerifier: AutoVerifierWithArg<Message[], PartialMessageListQuery>) {
|
||||||
const id = `g#${guildId}/c#${channelId}`;
|
const id = `g#${guildId}/c#${channelId}`;
|
||||||
if (!this.data.has(id)) {
|
if (!this.data.has(id)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const value = this.data.get(id);
|
const value = this.data.get(id);
|
||||||
if (!value) throw new ShouldNeverHappenError('unable to get message map');
|
if (!value) throw new ShouldNeverHappenError('unable to get message map');
|
||||||
|
const beforeNumMessages = value.messages.size;
|
||||||
for (const message of messages) {
|
for (const message of messages) {
|
||||||
const deletedMessage = value.messages.get(message.id);
|
const deletedMessage = value.messages.get(message.id);
|
||||||
if (!deletedMessage) continue;
|
if (!deletedMessage) continue;
|
||||||
value.messages.delete(message.id);
|
value.messages.delete(message.id);
|
||||||
}
|
}
|
||||||
|
const afterNumMessages = value.messages.size;
|
||||||
|
// There could be new messages before.
|
||||||
|
// The query would have been fulfilled to the number of messages requested before the delete but now it is not.
|
||||||
|
// TODO: Test this (it's going to be a massive pain)
|
||||||
|
recentAutoVerifier.unverifyByFilter(query => query.channelId === channelId && beforeNumMessages >= query.number && afterNumMessages < query.number);
|
||||||
}
|
}
|
||||||
|
|
||||||
fetchRecentMessages(guildId: number, channelId: string, number: number): Message[] | null {
|
fetchRecentMessages(guildId: number, channelId: string, number: number): Message[] | null {
|
||||||
|
Loading…
x
Reference in New Issue
Block a user