Basic bindings to the recently implemented pgo_notifications. - #78
Basic bindings to the recently implemented pgo_notifications.#78foxfriends wants to merge 2 commits into
pgo_notifications.#78Conversation
4184091 to
dae5cc3
Compare
Added support for PostgreSQL `LISTEN/NOTIFY` by lightly wrapping the
implementation in `pgo`.
As in `pgo`:
* The notifications listener is started as a new process, different from a regular connection.
* The `listen(conn, channel)` function subscribes to a Postgres channel.
* `unlisten(conn, reference)` can be used to unsubscribe.
* Notifications from Postgres are sent to the process that called `listen` as the `Notify` type. Receive these using the `pog.notification_selector()`.
General usage example:
```gleam
let assert Ok(db) = pog.default_config("db")
|> pog.start()
let assert Ok(notifications) = pog.default_config("notifications")
|> pog.start_notifications()
let assert Ok(reference) = pog.listen(notifications.data, "some_channel")
let selector = pog.notification_selector()
let assert Ok(_) = pog.query("NOTIFY some_channel, 'some_payload'")
|> pog.execute(db.data)
let assert Ok(Notify(pid, ref, chan, data)) = process.selector_receive(selector, 100)
assert pid == notifications.pid
assert ref == reference
assert chan == "some_channel"
assert data = "some_payload"
pog.unlisten(notifications.data, reference)
```
|
I found and patched a bug in the underlying pgo implementation, so I suggest waiting until that's merged before considering accepting this PR. Having been trying out my patch for a few days in a project, I am finding it to work fine, but maybe is not the most idiomatic Gleam; pretty new to it all, and not sure the best way to represent this system, I went with a "light" approach so far, mimicking the pgo interface, but open to suggestions to make it more "Gleam" flavoured for sure. :) |
lpil
left a comment
There was a problem hiding this comment.
Thank you! I've left some questions inline
|
Thanks for the notes, I have updated it, let me know if anything else :) |
|
Hello @foxfriends! While integrating notification sessions under supervision, I found two lifecycle edges:
Would it make sense to normalize |
Added support for PostgreSQL
LISTEN/NOTIFYby lightly wrapping the implementation inpgo.As in
pgo:listen(conn, channel)function subscribes to a Postgres channel.unlisten(conn, reference)can be used to unsubscribe.listenas theNotifytype. Receive these using thepog.notification_selector().General usage example:
Closes #13