60 lines
2.0 KiB
TypeScript
60 lines
2.0 KiB
TypeScript
import createSubscriber from 'pg-listen'
|
|
import type Log from 'bunyan';
|
|
|
|
import { Events } from './events';
|
|
import { Pg } from './pg';
|
|
|
|
export default function createNotify(log: Log, pg: Pg, events) {
|
|
const OFFERS_CHANNEL = 'offers.events';
|
|
const USERS_CHANNEL = 'users.events';
|
|
const LISTINGS_CHANNEL = 'listings.events';
|
|
const WANTS_CHANNEL = 'wants.events';
|
|
|
|
const subscriber = createSubscriber({ connectionString: process.env.DATABASE_URL });
|
|
|
|
// pg has a hard limit of 8000B for the notification payload
|
|
// so we only receive the ids of the updated record
|
|
// and go fetch the whole thing to figure out who to notify
|
|
|
|
async function handleOffers(payload) {
|
|
const { action, id } = payload;
|
|
log.debug({ channel: OFFERS_CHANNEL, action, id });
|
|
if (action === 'DELETE') return null;
|
|
|
|
// const offer = await pg.offerFindId(id);
|
|
// events.emit(Events.OffersUpdated, offer);
|
|
}
|
|
|
|
async function handleUsers(payload) {
|
|
const { action, id } = payload;
|
|
log.debug({ channel: USERS_CHANNEL, action, id });
|
|
}
|
|
|
|
async function handleListings(payload) {
|
|
const { action, id } = payload;
|
|
log.debug({ channel: LISTINGS_CHANNEL, action, id });
|
|
}
|
|
|
|
async function handleWants(payload) {
|
|
const { action, id } = payload;
|
|
// const want = await pg.offerFindId(id);
|
|
log.debug({ channel: WANTS_CHANNEL, action, id });
|
|
}
|
|
|
|
subscriber.notifications.on(OFFERS_CHANNEL, handleOffers);
|
|
subscriber.notifications.on(USERS_CHANNEL, handleUsers);
|
|
subscriber.notifications.on(LISTINGS_CHANNEL, handleListings);
|
|
subscriber.notifications.on(WANTS_CHANNEL, handleWants);
|
|
|
|
async function listen() {
|
|
await subscriber.connect();
|
|
await Promise.all([
|
|
subscriber.listenTo(OFFERS_CHANNEL),
|
|
subscriber.listenTo(USERS_CHANNEL),
|
|
subscriber.listenTo(LISTINGS_CHANNEL),
|
|
subscriber.listenTo(WANTS_CHANNEL),
|
|
]);
|
|
}
|
|
|
|
return { listen };
|
|
} |