From 7d9ccf0639c138c16513cbe05cef4bfe9941a27e Mon Sep 17 00:00:00 2001 From: Ben Allfree Date: Tue, 22 Jul 2025 08:14:50 -0700 Subject: [PATCH] enh(pockethost): add event handlers to MothershipMirrorService --- .../services/MothershipMirrorService/index.ts | 76 +++++++++++-------- 1 file changed, 46 insertions(+), 30 deletions(-) diff --git a/packages/pockethost/src/services/MothershipMirrorService/index.ts b/packages/pockethost/src/services/MothershipMirrorService/index.ts index 6bad88e9..d0bc2c5b 100644 --- a/packages/pockethost/src/services/MothershipMirrorService/index.ts +++ b/packages/pockethost/src/services/MothershipMirrorService/index.ts @@ -1,4 +1,5 @@ import { + createEvent, EDGE_APEX_DOMAIN, InstanceFields, InstanceId, @@ -18,6 +19,11 @@ export type MothershipMirrorServiceConfig = SingletonBaseConfig & { export const MothershipMirrorService = mkSingleton(async (config: MothershipMirrorServiceConfig) => { const { dbg, error } = (config.logger ?? LoggerService()).create(`MothershipMirrorService`) + const [onInstanceUpserted, fireInstanceUpserted] = createEvent() + const [onInstanceDeleted, fireInstanceDeleted] = createEvent() + const [onUserUpserted, fireUserUpserted] = createEvent() + const [onUserDeleted, fireUserDeleted] = createEvent() + const client = config.client const mirror: { @@ -37,7 +43,7 @@ export const MothershipMirrorService = mkSingleton(async (config: MothershipMirr } const upsertInstance = (record: InstanceFields) => { - dbg(`upsertInstance`, { record }) + dbg(`upsertInstance ${record.id}`) deleteInstance(record.id) const canonicalId = `${record.id}.${EDGE_APEX_DOMAIN()}` const canonicalSubdomain = `${record.subdomain}.${EDGE_APEX_DOMAIN()}` @@ -64,7 +70,7 @@ export const MothershipMirrorService = mkSingleton(async (config: MothershipMirr } const upsertUser = (record: UserFields) => { - dbg(`upsertUser`, { record }) + dbg(`upsertUser ${record.id}`) deleteUser(record.id) mirror.users[record.id] = record } @@ -76,35 +82,39 @@ export const MothershipMirrorService = mkSingleton(async (config: MothershipMirr } } - client.collection(`instances`).subscribe(`*`, (e) => { - const { action, record } = e - if (action === `create` || action === `update`) { - dbg(`instance`, { action, record }) - upsertInstance(record) - } - if (action === `delete`) { - dbg(`instance`, { action, record }) - deleteInstance(record.id) - } - }) - - client.collection(`users`).subscribe(`*`, (e) => { - const deleteUser = (id: UserId) => { - const oldUser = mirror.users[id] - if (oldUser) { - delete mirror.users[oldUser.id] + client + .collection(`instances`) + .subscribe(`*`, (e) => { + const { action, record } = e + if (action === `create` || action === `update`) { + dbg(`instance`, { action, record }) + upsertInstance(record) + fireInstanceUpserted(record) } - } - const { action, record } = e - if (action === `create` || action === `update`) { - dbg(`user`, { action, record }) - upsertUser(record) - } - if (action === `delete`) { - dbg(`user`, { action, record }) - deleteUser(record.id) - } - }) + if (action === `delete`) { + dbg(`instance`, { action, record }) + deleteInstance(record.id) + fireInstanceDeleted(record.id) + } + }) + .catch(error) + + client + .collection(`users`) + .subscribe(`*`, (e) => { + const { action, record } = e + if (action === `create` || action === `update`) { + dbg(`user`, { action, record }) + upsertUser(record) + fireUserUpserted(record) + } + if (action === `delete`) { + dbg(`user`, { action, record }) + deleteUser(record.id) + fireUserDeleted(record.id) + } + }) + .catch(error) const init = async () => { dbg(`init`) @@ -146,6 +156,12 @@ export const MothershipMirrorService = mkSingleton(async (config: MothershipMirr async getUser(id: UserId) { return mirror.users[id] }, + onInstanceUpserted, + onInstanceDeleted, + onUserDeleted, + onUserUpserted, + getInstances: () => Object.values(mirror.instancesById), + getUsers: () => Object.values(mirror.users), } return api })