From 6068e7763de9d639ab3e525649acbdff9b9d283f Mon Sep 17 00:00:00 2001 From: Half-Shot Date: Mon, 24 Jul 2023 18:06:44 +0100 Subject: [PATCH] Cache the read head for the client --- src/pool-service/IrcConnectionPool.ts | 1 + src/pool-service/IrcPoolClient.ts | 10 +++++++++- src/pool-service/types.ts | 3 ++- 3 files changed, 12 insertions(+), 2 deletions(-) diff --git a/src/pool-service/IrcConnectionPool.ts b/src/pool-service/IrcConnectionPool.ts index 051079ec7..36347ca27 100644 --- a/src/pool-service/IrcConnectionPool.ts +++ b/src/pool-service/IrcConnectionPool.ts @@ -28,6 +28,7 @@ const TIME_TO_WAIT_BEFORE_PONG = 10000; // This value is reasonably conservative to avoid trimming too far. const STREAM_HISTORY_MAXLEN = 10000; + const Config = { redisUri: process.env.REDIS_URL ?? 'redis://localhost:6379', metricsHost: (process.env.METRICS_HOST ?? false) as string|false, diff --git a/src/pool-service/IrcPoolClient.ts b/src/pool-service/IrcPoolClient.ts index 84d8be5b7..79c4a8792 100644 --- a/src/pool-service/IrcPoolClient.ts +++ b/src/pool-service/IrcPoolClient.ts @@ -8,7 +8,8 @@ import { ClientId, ConnectionCreateArgs, HEARTBEAT_EVERY_MS, PROTOCOL_VERSION, READ_BUFFER_MAGIC_BYTES, REDIS_IRC_POOL_COMMAND_IN_STREAM, REDIS_IRC_POOL_COMMAND_OUT_STREAM, - REDIS_IRC_POOL_CONNECTIONS, REDIS_IRC_POOL_HEARTBEAT_KEY, REDIS_IRC_POOL_VERSION_KEY } from "./types"; + REDIS_IRC_POOL_CONNECTIONS, REDIS_IRC_POOL_HEARTBEAT_KEY, REDIS_IRC_POOL_VERSION_KEY, + REDIS_IRC_POOL_COMMAND_OUT_STREAM_LAST_READ } from "./types"; import { Logger } from 'matrix-appservice-bridge'; import { EventEmitter } from "stream"; @@ -46,6 +47,13 @@ export class IrcPoolClient extends (EventEmitter as unknown as new () => TypedEm }); } + public updateLastRead(msgId: string) { + this.commandStreamId = msgId; + this.redis.set(REDIS_IRC_POOL_COMMAND_OUT_STREAM_LAST_READ, msgId).catch((ex) => { + log.error(`Failed to update last-read to ${msgId}`, ex); + }) + } + public async sendCommand(type: T, payload: InCommandPayload[T]) { await this.redis.xadd(REDIS_IRC_POOL_COMMAND_IN_STREAM, "*", type, JSON.stringify({ origin_ts: Date.now(), diff --git a/src/pool-service/types.ts b/src/pool-service/types.ts index 12b342da2..140333fa8 100644 --- a/src/pool-service/types.ts +++ b/src/pool-service/types.ts @@ -12,7 +12,8 @@ export const REDIS_IRC_POOL_VERSION_KEY = "ircbridge.poolversion"; export const REDIS_IRC_POOL_HEARTBEAT_KEY = "ircbridge.pool.💓"; export const REDIS_IRC_POOL_COMMAND_OUT_STREAM = "ircbridge.stream.command.out"; export const REDIS_IRC_POOL_COMMAND_IN_STREAM = "ircbridge.stream.command.in"; -export const REDIS_IRC_POOL_COMMAND_IN_STREAM_LAST_READ = "ircbridge.stream.command.last-read"; + +export const REDIS_IRC_POOL_COMMAND_OUT_STREAM_LAST_READ = "ircbridge.stream.out.command.last-read"; export const REDIS_IRC_POOL_CONNECTIONS = "ircbridge.connections"; export const REDIS_IRC_CLIENT_STATE_KEY = `ircbridge.clientstate`; //client-id