MCPcopy Index your code
hub / github.com/andywer/pg-listen

github.com/andywer/pg-listen @v1.7.0

Chat with this repo
repository ↗ · DeepWiki ↗ · release v1.7.0 ↗ · + Follow
31 symbols 58 edges 3 files 1 documented · 3% updated 3mo agov1.7.0 · 2020-12-19★ 6346 open issues
What it actually does AI analysis from the code graph — generated when you open this
loading…
README

pg-listen

Postgres LISTEN & NOTIFY that works

Build Status NPM Version

PostgreSQL can act as a message broker: Send notifications with arbitrary payloads from one database client to others.

Works with node.js 8+ and plain JavaScript or TypeScript 3. Uses the Postgres NOTIFY statement and subscribes to notifications using LISTEN.

Features

    📡  Send and subscribe to messages

    ⏳  Continuous connection health checks

    ♻️  Reconnects automatically

    ❗️  Proper error handling

    👌  Type-safe API


Installation

# using npm:
npm install pg-listen

# using yarn:
yarn add pg-listen

Usage

import createSubscriber from "pg-listen"
import { databaseURL } from "./config"

// Accepts the same connection config object that the "pg" package would take
const subscriber = createSubscriber({ connectionString: databaseURL })

subscriber.notifications.on("my-channel", (payload) => {
  // Payload as passed to subscriber.notify() (see below)
  console.log("Received notification in 'my-channel':", payload)
})

subscriber.events.on("error", (error) => {
  console.error("Fatal database connection error:", error)
  process.exit(1)
})

process.on("exit", () => {
  subscriber.close()
})

export async function connect () {
  await subscriber.connect()
  await subscriber.listenTo("my-channel")
}

export async function sendSampleMessage () {
  await subscriber.notify("my-channel", {
    greeting: "Hey, buddy.",
    timestamp: Date.now()
  })
}

API

For details see dist/index.d.ts.

Error & event handling

instance.events.on("connected", listener: () => void)

The connected event is emitted once after initially establishing the connection and later once after every successful reconnect. Reconnects happen automatically when pg-listen detects that the connection closed or became unresponsive.

instance.events.on("error", listener: (error: Error) => void)

An error event is emitted for fatal errors that affect the notification subscription. A standard way of handling those kinds of errors would be to console.error()-log the error and terminate the process with a non-zero exit code.

This error event is usually emitted after multiple attempts to reconnect have failed.

instance.events.on("notification", listener: ({ channel, payload }) => void)

Emitted whenever a notification is received. You must have subscribed to that channel before using instance.listenTo() in order to receive notifications.

A more convenient way of subscribing to notifications is the instance.notifications event emitter.

instance.events.on("reconnect", listener: (attempt: number) => void)

Emitted when a connection issue has been detected and an attempt to re-connect to the database is started.

instance.notifications.on(channelName: string, listener: (payload: any) => void)

The convenient way of subscribing to notifications. Don't forget to call .listenTo(channelName) to subscribe the Postgres client to this channel in order to receive notifications.

Why another package?

In one sentence: Because none of the existing packages was working reliably in production.

Using the NOTIFY and LISTEN features is not trivial using node-postgres (pg) directly, since you cannot use connection pools and even distinct client connections also tend to time out.

There are already a few packages out there, like pg-pubsub, but neither of them seems to work reliably. Errors are being swallowed, the code is hard to reason about, there is no type-safety, ...

This package aims to fix those shortcomings. Postgres LISTEN & NOTIFY in node that finally works.

Debugging

Set the DEBUG environment variable to pg-listen:* to enable debug logging.

License

MIT

Extension points exported contracts — how you extend this code

PgNotification (Interface)
(no doc)
src/index.ts
PgParsedNotification (Interface)
(no doc)
src/index.ts
PgListenEvents (Interface)
(no doc)
src/index.ts
Options (Interface)
(no doc)
src/index.ts
Subscriber (Interface)
(no doc)
src/index.ts

Core symbols most depended-on inside this repo

connect
called by 10
src/index.ts
close
called by 5
src/index.ts
createPostgresSubscriber
called by 5
src/index.ts
listenTo
called by 4
src/index.ts
getSubscribedChannels
called by 3
src/index.ts
notify
called by 3
src/index.ts
reconnect
called by 2
src/index.ts
cancelParanoidChecking
called by 2
src/index.ts

Shape

Function 19
Method 7
Interface 5

Languages

TypeScript100%

Modules by API surface

src/index.ts30 symbols
test/integration.test.ts1 symbols

Datastores touched

postgresDatabase · 1 repos

For agents

$ claude mcp add pg-listen \
  -- python -m otcore.mcp_server <graph>

⬇ download graph artifact