enh(pockethost): add event handlers to MothershipMirrorService

This commit is contained in:
Ben Allfree 2025-07-22 08:14:50 -07:00
parent a3a8a215f2
commit 7d9ccf0639

View File

@ -1,4 +1,5 @@
import { import {
createEvent,
EDGE_APEX_DOMAIN, EDGE_APEX_DOMAIN,
InstanceFields, InstanceFields,
InstanceId, InstanceId,
@ -18,6 +19,11 @@ export type MothershipMirrorServiceConfig = SingletonBaseConfig & {
export const MothershipMirrorService = mkSingleton(async (config: MothershipMirrorServiceConfig) => { export const MothershipMirrorService = mkSingleton(async (config: MothershipMirrorServiceConfig) => {
const { dbg, error } = (config.logger ?? LoggerService()).create(`MothershipMirrorService`) const { dbg, error } = (config.logger ?? LoggerService()).create(`MothershipMirrorService`)
const [onInstanceUpserted, fireInstanceUpserted] = createEvent<InstanceFields>()
const [onInstanceDeleted, fireInstanceDeleted] = createEvent<InstanceId>()
const [onUserUpserted, fireUserUpserted] = createEvent<UserFields>()
const [onUserDeleted, fireUserDeleted] = createEvent<UserId>()
const client = config.client const client = config.client
const mirror: { const mirror: {
@ -37,7 +43,7 @@ export const MothershipMirrorService = mkSingleton(async (config: MothershipMirr
} }
const upsertInstance = (record: InstanceFields) => { const upsertInstance = (record: InstanceFields) => {
dbg(`upsertInstance`, { record }) dbg(`upsertInstance ${record.id}`)
deleteInstance(record.id) deleteInstance(record.id)
const canonicalId = `${record.id}.${EDGE_APEX_DOMAIN()}` const canonicalId = `${record.id}.${EDGE_APEX_DOMAIN()}`
const canonicalSubdomain = `${record.subdomain}.${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) => { const upsertUser = (record: UserFields) => {
dbg(`upsertUser`, { record }) dbg(`upsertUser ${record.id}`)
deleteUser(record.id) deleteUser(record.id)
mirror.users[record.id] = record mirror.users[record.id] = record
} }
@ -76,35 +82,39 @@ export const MothershipMirrorService = mkSingleton(async (config: MothershipMirr
} }
} }
client.collection(`instances`).subscribe<InstanceFields>(`*`, (e) => { client
.collection(`instances`)
.subscribe<InstanceFields>(`*`, (e) => {
const { action, record } = e const { action, record } = e
if (action === `create` || action === `update`) { if (action === `create` || action === `update`) {
dbg(`instance`, { action, record }) dbg(`instance`, { action, record })
upsertInstance(record) upsertInstance(record)
fireInstanceUpserted(record)
} }
if (action === `delete`) { if (action === `delete`) {
dbg(`instance`, { action, record }) dbg(`instance`, { action, record })
deleteInstance(record.id) deleteInstance(record.id)
fireInstanceDeleted(record.id)
} }
}) })
.catch(error)
client.collection(`users`).subscribe<UserFields>(`*`, (e) => { client
const deleteUser = (id: UserId) => { .collection(`users`)
const oldUser = mirror.users[id] .subscribe<UserFields>(`*`, (e) => {
if (oldUser) {
delete mirror.users[oldUser.id]
}
}
const { action, record } = e const { action, record } = e
if (action === `create` || action === `update`) { if (action === `create` || action === `update`) {
dbg(`user`, { action, record }) dbg(`user`, { action, record })
upsertUser(record) upsertUser(record)
fireUserUpserted(record)
} }
if (action === `delete`) { if (action === `delete`) {
dbg(`user`, { action, record }) dbg(`user`, { action, record })
deleteUser(record.id) deleteUser(record.id)
fireUserDeleted(record.id)
} }
}) })
.catch(error)
const init = async () => { const init = async () => {
dbg(`init`) dbg(`init`)
@ -146,6 +156,12 @@ export const MothershipMirrorService = mkSingleton(async (config: MothershipMirr
async getUser(id: UserId) { async getUser(id: UserId) {
return mirror.users[id] return mirror.users[id]
}, },
onInstanceUpserted,
onInstanceDeleted,
onUserDeleted,
onUserUpserted,
getInstances: () => Object.values(mirror.instancesById),
getUsers: () => Object.values(mirror.users),
} }
return api return api
}) })