# ol.trixnity A Clojure adapter for Trixnity, a Matrix SDK. ## ol.trixnity.client # ol.trixnity.client Matrix client lifecycle, sync control, and client-level state flows. ## Upstream Mapping This namespace maps to client-wide APIs on Trixnity’s `de.connect2x.trixnity.client.MatrixClient`. The public wrappers here cover: * opening or resuming a client with [`open`](#open) * sync lifecycle tasks such as [`start-sync`](#start-sync), [`await-running`](#await-running), [`stop-sync`](#stop-sync), and [`close`](#close) * synchronous `current-*` accessors paired with relieved Missionary flows for profile, server data, sync state, login state, and startup state Use [`ol.trixnity.repo`](api/ol-trixnity-repo.adoc) when you want the built-in sqlite4clj-backed repository setup, and [`ol.trixnity.room`](api/ol-trixnity-room.adoc), [`ol.trixnity.user`](api/ol-trixnity-user.adoc), [`ol.trixnity.notification`](api/ol-trixnity-notification.adoc), [`ol.trixnity.verification`](api/ol-trixnity-verification.adoc), and [`ol.trixnity.key`](api/ol-trixnity-key.adoc) for service-specific APIs. ## open ```clojure (open config) ``` Opens or resumes a `MatrixClient` using the built-in sqlite4clj-backed repository configuration. If `config` already contains a client under `::mx/client`, the returned task resolves to that client immediately. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L39-L50) --- ## start-sync ```clojure (start-sync client) ``` Starts sync for `client` and returns a Missionary task. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L52-L55) --- ## await-running ```clojure (await-running client) (await-running client opts) ``` Waits for `client` to reach `RUNNING`. Supported opts: `{::mx/timeout java.time.Duration}` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L57-L69) --- ## stop-sync ```clojure (stop-sync client) ``` Stops sync for `client` and returns a Missionary task. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L71-L74) --- ## close ```clojure (close client) ``` Closes `client` and tears down its bridge-owned coroutine scope. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L76-L79) --- ## current-user-id ```clojure (current-user-id client) ``` Returns the Matrix user id of `client` as a string. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L81-L84) --- ## current-sync-state ```clojure (current-sync-state client) ``` Returns the current sync state as a lower-case keyword. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L86-L89) --- ## current-profile ```clojure (current-profile client) ``` Returns the current normalized client profile. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L91-L94) --- ## profile ```clojure (profile client) ``` Returns a Missionary flow of the current normalized client profile. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L96-L100) --- ## current-server-data ```clojure (current-server-data client) ``` Returns the current normalized server data snapshot. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L102-L105) --- ## server-data ```clojure (server-data client) ``` Returns a Missionary flow of normalized server data snapshots. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L107-L111) --- ## sync-state ```clojure (sync-state client) ``` Returns a Missionary flow of the current sync state. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L113-L118) --- ## current-initial-sync-done ```clojure (current-initial-sync-done client) ``` Returns whether initial sync has completed. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L120-L123) --- ## initial-sync-done ```clojure (initial-sync-done client) ``` Returns a Missionary flow of initial-sync completion state. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L125-L129) --- ## current-login-state ```clojure (current-login-state client) ``` Returns the current login state as a lower-case keyword or nil. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L131-L134) --- ## login-state ```clojure (login-state client) ``` Returns a Missionary flow of lower-case login-state keywords or nil. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L136-L141) --- ## current-started ```clojure (current-started client) ``` Returns whether sync has been started for `client`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L143-L146) --- ## started ```clojure (started client) ``` Returns a Missionary flow of `client` started state. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj#L148-L152) ## ol.trixnity.event # ol.trixnity.event Accessors and predicates for normalized event maps. This namespace provides convenience accessors over the normalized event shapes defined in [`ol.trixnity.schemas`](api/ol-trixnity-schemas.adoc) without exposing callers to raw bridge internals. Use these helpers when consuming timeline events, notifications, or reply metadata from [`ol.trixnity.room`](api/ol-trixnity-room.adoc), [`ol.trixnity.notification`](api/ol-trixnity-notification.adoc), and [`ol.trixnity.room.message`](api/ol-trixnity-room-message.adoc). ## type ```clojure (type event) ``` Returns the Matrix event type string from normalized `event`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L17-L20) --- ## room-id ```clojure (room-id event) ``` Returns the Matrix room id string from normalized `event`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L22-L25) --- ## event-id ```clojure (event-id event) ``` Returns the Matrix event id string from normalized `event`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L27-L30) --- ## sender ```clojure (sender event) ``` Returns the sender user id string from normalized `event`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L32-L35) --- ## sender-display-name ```clojure (sender-display-name event) ``` Returns the sender display name from normalized `event`, if present. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L37-L40) --- ## body ```clojure (body event) ``` Returns the normalized message body from `event`, if present. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L42-L45) --- ## key ```clojure (key event) ``` Returns the normalized reaction key or relation key from `event`, if present. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L47-L50) --- ## relates-to ```clojure (relates-to event) ``` Returns the normalized `::mx/relates-to` map from `event`, if present. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L52-L55) --- ## relation-event-id ```clojure (relation-event-id event) ``` Returns the related event id from `event` reply or relation metadata, if present. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L57-L60) --- ## raw ```clojure (raw event) ``` Returns the upstream raw event object carried by normalized `event`, if present. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L62-L65) --- ## text? ```clojure (text? event) ``` Returns true when `event` is a Matrix room-message event. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L67-L70) --- ## reaction? ```clojure (reaction? event) ``` Returns true when `event` is a Matrix reaction event. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/event.clj#L72-L75) ## ol.trixnity.internal.bridge # ol.trixnity.internal.bridge ## open-client ```clojure (open-client request on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L17-L18) --- ## start-sync ```clojure (start-sync client on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L20-L21) --- ## await-running ```clojure (await-running client timeout on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L23-L24) --- ## stop-sync ```clojure (stop-sync client on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L26-L27) --- ## close-client ```clojure (close-client client on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L29-L30) --- ## current-user-id ```clojure (current-user-id client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L32-L33) --- ## current-sync-state ```clojure (current-sync-state client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L35-L36) --- ## current-profile ```clojure (current-profile client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L38-L39) --- ## profile-flow ```clojure (profile-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L41-L42) --- ## current-server-data ```clojure (current-server-data client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L44-L45) --- ## server-data-flow ```clojure (server-data-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L47-L48) --- ## sync-state-flow ```clojure (sync-state-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L50-L51) --- ## current-initial-sync-done ```clojure (current-initial-sync-done client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L53-L54) --- ## initial-sync-done-flow ```clojure (initial-sync-done-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L56-L57) --- ## current-login-state ```clojure (current-login-state client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L59-L60) --- ## login-state-flow ```clojure (login-state-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L62-L63) --- ## current-started ```clojure (current-started client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L65-L66) --- ## started-flow ```clojure (started-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L68-L69) --- ## current-users-typing ```clojure (current-users-typing client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L71-L72) --- ## users-typing-flow ```clojure (users-typing-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L74-L75) --- ## create-room ```clojure (create-room client room-name on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L77-L78) --- ## invite-user ```clojure (invite-user client room-id user-id timeout on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L80-L81) --- ## join-room ```clojure (join-room client room-id timeout on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L83-L84) --- ## forget-room ```clojure (forget-room client room-id force on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L86-L87) --- ## send-message ```clojure (send-message client room-id message timeout on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L89-L90) --- ## send-reaction ```clojure (send-reaction client room-id event-id key timeout on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L92-L93) --- ## cancel-send-message ```clojure (cancel-send-message client room-id transaction-id on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L95-L96) --- ## retry-send-message ```clojure (retry-send-message client room-id transaction-id on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L98-L99) --- ## room-by-id ```clojure (room-by-id client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L101-L102) --- ## rooms ```clojure (rooms client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L104-L105) --- ## rooms-flat ```clojure (rooms-flat client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L107-L108) --- ## account-data ```clojure (account-data client room-id event-content-class key) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L110-L111) --- ## state ```clojure (state client room-id event-content-class state-key) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L113-L114) --- ## all-state ```clojure (all-state client room-id event-content-class) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L116-L117) --- ## outbox ```clojure (outbox client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L119-L120) --- ## outbox-flat ```clojure (outbox-flat client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L122-L123) --- ## outbox-by-room ```clojure (outbox-by-room client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L125-L126) --- ## outbox-by-room-flat ```clojure (outbox-by-room-flat client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L128-L129) --- ## outbox-message ```clojure (outbox-message client room-id transaction-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L131-L132) --- ## fill-timeline-gaps ```clojure (fill-timeline-gaps client room-id event-id limit on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L134-L135) --- ## timeline-events-from-now-on ```clojure (timeline-events-from-now-on client decryption-timeout-ms sync-response-buffer-size) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L137-L142) --- ## response-timeline-events ```clojure (response-timeline-events client response decryption-timeout-ms) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L144-L145) --- ## timeline-event ```clojure (timeline-event client room-id event-id decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L147-L156) --- ## previous-timeline-event ```clojure (previous-timeline-event client timeline-event decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L158-L166) --- ## next-timeline-event ```clojure (next-timeline-event client timeline-event decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L168-L176) --- ## last-timeline-event ```clojure (last-timeline-event client room-id decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L178-L186) --- ## timeline-event-chain ```clojure (timeline-event-chain client room-id start-from direction decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content min-size max-size) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L188-L200) --- ## last-timeline-events ```clojure (last-timeline-events client room-id decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content min-size max-size) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L202-L212) --- ## timeline-events-list ```clojure (timeline-events-list client room-id start-from direction max-size min-size decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L214-L226) --- ## last-timeline-events-list ```clojure (last-timeline-events-list client room-id max-size min-size decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L228-L238) --- ## timeline-events-around ```clojure (timeline-events-around client room-id start-from max-size-before max-size-after decryption-timeout-ms fetch-timeout-ms fetch-size allow-replace-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L240-L251) --- ## timeline-event-relations ```clojure (timeline-event-relations client room-id event-id relation-type) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L253-L254) --- ## user-all ```clojure (user-all client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L256-L257) --- ## load-members ```clojure (load-members client room-id wait on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L259-L260) --- ## user-by-id ```clojure (user-by-id client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L262-L263) --- ## user-all-receipts ```clojure (user-all-receipts client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L265-L266) --- ## user-receipts-by-id ```clojure (user-receipts-by-id client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L268-L269) --- ## user-power-level ```clojure (user-power-level client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L271-L272) --- ## can-kick-user ```clojure (can-kick-user client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L274-L275) --- ## can-ban-user ```clojure (can-ban-user client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L277-L278) --- ## can-unban-user ```clojure (can-unban-user client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L280-L281) --- ## can-invite-user ```clojure (can-invite-user client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L283-L284) --- ## can-invite ```clojure (can-invite client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L286-L287) --- ## can-redact-event ```clojure (can-redact-event client room-id event-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L289-L290) --- ## can-set-power-level-to-max ```clojure (can-set-power-level-to-max client room-id user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L292-L293) --- ## can-send-event-by-class ```clojure (can-send-event-by-class client room-id event-content-class) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L295-L296) --- ## can-send-event-by-content ```clojure (can-send-event-by-content client room-id event-content) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L298-L299) --- ## user-presence ```clojure (user-presence client user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L301-L302) --- ## user-account-data ```clojure (user-account-data client event-content-class key) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L304-L305) --- ## notifications ```clojure (notifications client decryption-timeout-ms sync-response-buffer-size) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L307-L308) --- ## notifications-from-response ```clojure (notifications-from-response client response decryption-timeout-ms) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L310-L311) --- ## notification-all ```clojure (notification-all client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L313-L314) --- ## notification-all-flat ```clojure (notification-all-flat client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L316-L317) --- ## notification-by-id ```clojure (notification-by-id client id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L319-L320) --- ## notification-count ```clojure (notification-count client) (notification-count client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L322-L326) --- ## notification-unread ```clojure (notification-unread client room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L328-L329) --- ## notification-all-updates ```clojure (notification-all-updates client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L331-L332) --- ## notification-dismiss ```clojure (notification-dismiss client id on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L334-L335) --- ## notification-dismiss-all ```clojure (notification-dismiss-all client on-success on-failure) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L337-L338) --- ## current-active-device-verification ```clojure (current-active-device-verification client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L340-L341) --- ## active-device-verification-flow ```clojure (active-device-verification-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L343-L344) --- ## current-active-user-verifications ```clojure (current-active-user-verifications client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L346-L347) --- ## active-user-verifications-flow ```clojure (active-user-verifications-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L349-L350) --- ## self-verification-methods ```clojure (self-verification-methods client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L352-L353) --- ## current-bootstrap-running ```clojure (current-bootstrap-running client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L355-L356) --- ## bootstrap-running-flow ```clojure (bootstrap-running-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L358-L359) --- ## current-backup-version ```clojure (current-backup-version client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L361-L362) --- ## backup-version-flow ```clojure (backup-version-flow client) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L364-L365) --- ## device-trust-level ```clojure (device-trust-level client user-id device-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L367-L368) --- ## timeline-trust-level ```clojure (timeline-trust-level client room-id event-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L370-L371) --- ## user-trust-level ```clojure (user-trust-level client user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L373-L374) --- ## device-keys-flow ```clojure (device-keys-flow client user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L376-L377) --- ## cross-signing-keys-flow ```clojure (cross-signing-keys-flow client user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal/bridge.clj#L379-L380) ## ol.trixnity.internal # ol.trixnity.internal ## observe-flow ```clojure (observe-flow client kotlin-flow) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal.clj#L17-L21) --- ## observe-keyed-flow-map ```clojure (observe-keyed-flow-map client kotlin-outer-flow) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal.clj#L23-L40) --- ## observe-flow-list ```clojure (observe-flow-list client kotlin-outer-flow) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal.clj#L42-L47) --- ## suspend-task ```clojure (suspend-task bridge-fn & args) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal.clj#L49-L52) --- ## duration->millis ```clojure (duration->millis duration) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/internal.clj#L54-L55) ## ol.trixnity.key # ol.trixnity.key Encryption-key state, backup state, and trust-level queries. ## Upstream Mapping This namespace maps to Trixnity’s `KeyService` and `KeyBackupService`. The public wrappers here cover: * current and flow-based backup bootstrap state * current and flow-based backup-version observation * trust-level queries for users, devices, and timeline events * device-key and cross-signing-key lookup Use [`ol.trixnity.verification`](api/ol-trixnity-verification.adoc) for active verification workflows and [`ol.trixnity.room`](api/ol-trixnity-room.adoc) when you need room timeline events to pair with trust-level checks. ## current-bootstrap-running ```clojure (current-bootstrap-running client) ``` Returns whether cross-signing bootstrap is currently running. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/key.clj#L27-L30) --- ## bootstrap-running ```clojure (bootstrap-running client) ``` Returns a Missionary flow of cross-signing bootstrap state. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/key.clj#L32-L36) --- ## current-backup-version ```clojure (current-backup-version client) ``` Returns the current active room-key-backup version, or nil when unavailable. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/key.clj#L38-L41) --- ## backup-version ```clojure (backup-version client) ``` Returns a Missionary flow of the active room-key-backup version. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/key.clj#L43-L47) --- ## get-trust-level ```clojure (get-trust-level client user-id) (get-trust-level client user-id-or-room-id device-id-or-event-id) ``` Returns a Missionary flow of trust information. With two arguments, `user-id` resolves to the trust level of that user. With three arguments, the meaning depends on the first id: * a `@user:server` value resolves device trust for `device-id` * a `!room:server` value resolves the trust level for the device that sent the timeline `event-id` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/key.clj#L49-L71) --- ## get-device-keys ```clojure (get-device-keys client user-id) ``` Returns a Missionary flow of device keys for `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/key.clj#L73-L77) --- ## get-cross-signing-keys ```clojure (get-cross-signing-keys client user-id) ``` Returns a Missionary flow of cross-signing keys for `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/key.clj#L79-L83) ## ol.trixnity.notification # ol.trixnity.notification Notification snapshots and notification update flows. ## Upstream Mapping This namespace maps to Trixnity’s `NotificationService`. The public wrappers here cover: * observing the full notification set in keyed or flat shapes * looking up individual notifications and unread counts * consuming live notification updates * a deprecated bridge for notification extraction from sync responses Use [`ol.trixnity.room`](api/ol-trixnity-room.adoc) for room timeline access and [`ol.trixnity.client`](api/ol-trixnity-client.adoc) for client lifecycle. ## get-notifications ```clojure (get-notifications client) (get-notifications client response-or-opts) (get-notifications client response opts) ``` Returns deprecated notification extraction flows. Prefer [`get-all`](#get-all), [`get-by-id`](#get-by-id), and [`get-all-updates`](#get-all-updates) for the current notification model. Supported opts: | key | description | |----------------------------------|------------------------------------------------------------------| | `::mx/decryption-timeout` | Decryption timeout for derived timeline events | | `::mx/sync-response-buffer-size` | Number of sync responses buffered while extracting notifications | _deprecated_ [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L26-L58) --- ## get-all ```clojure (get-all client) ``` Returns a Missionary flow of the current notifications as a list of inner flows. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L60-L63) --- ## get-all-flat ```clojure (get-all-flat client) ``` Returns a Missionary flow of flattened notification snapshots. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L65-L68) --- ## get-by-id ```clojure (get-by-id client id) ``` Returns a Missionary flow of the notification with `id`, or nil when unavailable. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L70-L74) --- ## get-count ```clojure (get-count client) (get-count client room-id) ``` Returns a Missionary flow of notification counts. With one argument, returns the total count across all rooms. With `room-id`, returns the count for that room. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L76-L85) --- ## is-unread ```clojure (is-unread client room-id) ``` Returns a Missionary flow that is true when `room-id` is considered unread. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L87-L91) --- ## dismiss ```clojure (dismiss client id) ``` Marks the notification with `id` as dismissed and returns a Missionary task. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L93-L97) --- ## dismiss-all ```clojure (dismiss-all client) ``` Dismisses all notifications and returns a Missionary task. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L99-L102) --- ## get-all-updates ```clojure (get-all-updates client) ``` Returns a Missionary flow of notification updates. Upstream notes that this stream should not be buffered because consumed updates are removed from the backing store as new values are requested. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/notification.clj#L104-L110) ## ol.trixnity.repo.common # ol.trixnity.repo.common ## db ```clojure (db handle) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L48-L50) --- ## json ```clojure (json handle) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L52-L54) --- ## writer-pool ```clojure (writer-pool handle) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L56-L58) --- ## reader-pool ```clojure (reader-pool handle) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L60-L62) --- ## borrow-reader-conn! ```clojure (borrow-reader-conn! handle) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L64-L66) --- ## borrow-writer-conn! ```clojure (borrow-writer-conn! handle) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L68-L70) --- ## release-reader-conn! ```clojure (release-reader-conn! handle conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L72-L75) --- ## release-writer-conn! ```clojure (release-writer-conn! handle conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L77-L80) --- ## begin-deferred! ```clojure (begin-deferred! conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L82-L85) --- ## begin-immediate! ```clojure (begin-immediate! conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L87-L90) --- ## commit! ```clojure (commit! conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L92-L95) --- ## rollback! ```clojure (rollback! conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L97-L100) --- ## current-read-conn ```clojure (current-read-conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L102-L104) --- ## current-write-conn ```clojure (current-write-conn) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L106-L108) --- ## q-read ```clojure (q-read handle query) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L110-L115) --- ## q-write ```clojure (q-write handle query) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L117-L121) --- ## open! ```clojure (open! path json) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L123-L125) --- ## ensure-schema! ```clojure (ensure-schema! handle) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L127-L131) --- ## encode-json ```clojure (encode-json json serializer value) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L133-L135) --- ## decode-json ```clojure (decode-json json serializer value) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L137-L139) --- ## first-row ```clojure (first-row rows) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L141-L144) --- ## maybe-rows ```clojure (maybe-rows rows) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L146-L148) --- ## in-placeholders ```clojure (in-placeholders n) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L150-L152) --- ## minimal-get ```clojure (minimal-get handle table repo-key serializer) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L154-L160) --- ## minimal-save! ```clojure (minimal-save! handle table repo-key payload) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L162-L169) --- ## minimal-delete! ```clojure (minimal-delete! handle table repo-key) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L171-L176) --- ## delete-all! ```clojure (delete-all! handle table) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L178-L182) --- ## full-get-all ```clojure (full-get-all handle table serializer) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L184-L189) --- ## room-id-str ```clojure (room-id-str room-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L191-L193) --- ## user-id-str ```clojure (user-id-str user-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L195-L197) --- ## event-id-str ```clojure (event-id-str event-id) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo/common.clj#L199-L201) ## ol.trixnity.repo # ol.trixnity.repo Built-in repository helpers for the sqlite4clj-backed repository setup. Most callers do not need to interact with the raw repository handle or the Kotlin bridge types directly. Use [`sqlite4clj-config`](#sqlite4clj-config) with [`ol.trixnity.client/open`](api/ol-trixnity-client.adoc#open). Advanced callers can still build a `MatrixClient` with some other repository implementation and pass that client to [`ol.trixnity.client/open`](api/ol-trixnity-client.adoc#open) via `::mx/client`. ## sqlite4clj-config ```clojure (sqlite4clj-config options) ``` Returns config entries for the built-in sqlite4clj repository and okio media store. Prefer the namespaced keys from [`ol.trixnity.schemas`](api/ol-trixnity-schemas.adoc). Plain keywords are still accepted here as a convenience when normalizing app config. Options: | key | description |-----|------------- | `::mx/database-path` | SQLite file path used by `ol.trixnity.repo` | `::mx/media-path` | Directory used by the okio-backed media store Example: ```clojure (m/? (client/open (merge {::mx/homeserver-url "https://matrix.example.org" ::mx/username "bot" ::mx/password "secret"} (repo/sqlite4clj-config {::mx/database-path "./var/trixnity.sqlite" ::mx/media-path "./var/media"})))) ``` [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo.clj#L47-L74) --- ## open-handle! ```clojure (open-handle! path json) ``` Opens a low-level sqlite4clj repository handle for `path`. Most callers should prefer [`sqlite4clj-config`](#sqlite4clj-config) with [`ol.trixnity.client/open`](api/ol-trixnity-client.adoc#open). This is the lower-level escape hatch used by the built-in repository assembly. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo.clj#L76-L83) --- ## create-repositories ```clojure (create-repositories handle mappings) ``` Builds the repository map expected by the Kotlin bridge from `handle`. This is primarily a low-level integration seam for custom client assembly. Most callers should use [`sqlite4clj-config`](#sqlite4clj-config) instead of constructing this map directly. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo.clj#L789-L827) ## ol.trixnity.room.message # ol.trixnity.room.message Helpers for constructing normalized room message payloads. This namespace provides small builders for the message-spec maps accepted by [`ol.trixnity.room/send-message`](api/ol-trixnity-room.adoc#send-message). The helpers here focus on common text-message cases: * [`text`](#text) builds a normalized text message payload * [`reply-to`](#reply-to) attaches reply metadata from a normalized event map Use [`ol.trixnity.event`](api/ol-trixnity-event.adoc) to inspect the events you are replying to. ## text ```clojure (text body) (text body opts) ``` Builds a text message-spec map understood by [`ol.trixnity.room/send-message`](api/ol-trixnity-room.adoc#send-message). [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room/message.clj#L19-L30) --- ## reply-to ```clojure (reply-to message ev) ``` Associates reply metadata from normalized event `ev` onto `message`. When `ev` already carries relation metadata, that relation is copied into the reply target so upstream threading semantics are preserved. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room/message.clj#L32-L45) ## ol.trixnity.room # ol.trixnity.room Room operations, state queries, and timeline traversal. ## Upstream Mapping This namespace maps primarily to Trixnity’s `RoomService` on `de.connect2x.trixnity.client.MatrixClient`. The public wrappers here cover three upstream groupings: * room mutations such as room creation, invites, messages, and reactions * room observation and state operations such as `getById`, `getAll`, `getAccountData`, `getState`, and `getOutbox` * room-scoped timeline lookup and traversal helpers exposed through the room service and its timeline helpers Use [`ol.trixnity.user`](api/ol-trixnity-user.adoc) for `UserService` APIs and [`ol.trixnity.notification`](api/ol-trixnity-notification.adoc), [`ol.trixnity.verification`](api/ol-trixnity-verification.adoc), and [`ol.trixnity.key`](api/ol-trixnity-key.adoc) for the other non-room service mappings. ## create-room ```clojure (create-room client opts) ``` Creates a room and returns a Missionary task that resolves to the new room id. Supported opts: | key | description | |------------------|-----------------------------------------| | `::mx/room-name` | Explicit room name used during creation | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L61-L73) --- ## invite-user ```clojure (invite-user client room-id user-id) (invite-user client room-id user-id opts) ``` Invites `user-id` to `room-id` and returns a Missionary task. Supported opts: | key | description |-----|------------- | `::mx/timeout` | Maximum time to wait for the invite request | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L75-L93) --- ## join-room ```clojure (join-room client room-id) (join-room client room-id opts) ``` Joins `room-id` and returns a Missionary task. Supported opts: | key | description |-----|------------- | `::mx/timeout` | Maximum time to wait for the join request | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L95-L111) --- ## forget-room ```clojure (forget-room client room-id) (forget-room client room-id opts) ``` Forgets `room-id` locally and returns a Missionary task. Upstream notes that this is intended for rooms in `LEAVE` membership. Supported opts: | key | description |-----|------------- | `::mx/force` | Force forgetting even when the usual upstream preconditions are not met | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L113-L131) --- ## send-message ```clojure (send-message client room-id message) (send-message client room-id message opts) ``` Queues `message` for `room-id` and returns a Missionary task of the transaction id. Supported opts: | key | description |-----|------------- | `::mx/timeout` | Maximum time to wait for the send operation | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L133-L151) --- ## send-reaction ```clojure (send-reaction client room-id ev key) (send-reaction client room-id ev key opts) ``` Sends a reaction to event `ev` in `room-id` and returns a Missionary task. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L153-L167) --- ## cancel-send-message ```clojure (cancel-send-message client room-id transaction-id) ``` Cancels an outbox message identified by `transaction-id` and returns a Missionary task. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L169-L177) --- ## retry-send-message ```clojure (retry-send-message client room-id transaction-id) ``` Retries an outbox message identified by `transaction-id` and returns a Missionary task. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L179-L187) --- ## get-by-id ```clojure (get-by-id client room-id) ``` Returns a Missionary flow of the room for `room-id`, or nil when unavailable. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L189-L193) --- ## get-all ```clojure (get-all client) ``` Returns a Missionary flow of room flows keyed by room id. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L195-L198) --- ## get-all-flat ```clojure (get-all-flat client) ``` Returns a Missionary flow of flattened room snapshots. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L200-L203) --- ## current-users-typing ```clojure (current-users-typing client) ``` Returns the current typing-state snapshot keyed by room id. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L205-L208) --- ## users-typing ```clojure (users-typing client) ``` Returns a relieved Missionary flow of typing-state snapshots keyed by room id. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L210-L214) --- ## get-account-data ```clojure (get-account-data client room-id event-content-class) (get-account-data client room-id event-content-class key) ``` Returns a Missionary flow of room account-data content. When `key` is omitted, the empty-string key is used. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L216-L230) --- ## get-state ```clojure (get-state client room-id event-content-class) (get-state client room-id event-content-class state-key) ``` Returns a Missionary flow of room state for `event-content-class`. When `state-key` is omitted, the empty-string state key is used. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L232-L246) --- ## get-all-state ```clojure (get-all-state client room-id event-content-class) ``` Returns a Missionary flow of state-event flows keyed by state key. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L248-L257) --- ## get-outbox ```clojure (get-outbox client) (get-outbox client room-id) (get-outbox client room-id transaction-id) ``` Returns Missionary flows over room outbox state. Arities: * `(get-outbox client)` returns all outbox entries as a list of inner flows * `(get-outbox client room-id)` scopes that list to one room * `(get-outbox client room-id transaction-id)` returns the single outbox entry flow for that transaction id [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L259-L276) --- ## get-outbox-flat ```clojure (get-outbox-flat client) (get-outbox-flat client room-id) ``` Returns flattened Missionary flows over room outbox state. With `room-id`, scopes the flattened outbox view to a single room. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L278-L286) --- ## fill-timeline-gaps ```clojure (fill-timeline-gaps client room-id event-id) (fill-timeline-gaps client room-id event-id opts) ``` Fills timeline gaps around `event-id` in `room-id` and returns a Missionary task. Supported opts: | key | description |-----|------------- | `::mx/limit` | Maximum number of events to request while filling gaps (default `20`) | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L288-L306) --- ## get-timeline-event ```clojure (get-timeline-event client room-id event-id) (get-timeline-event client room-id event-id opts) ``` Returns a Missionary flow of the timeline event for `event-id`. Upstream notes that this lookup may traverse locally stored events and fill remote gaps when the event is not available locally. Supported opts: | key | description |-----|------------- | `::mx/decryption-timeout` | Timeout used while decrypting timeline events | `::mx/fetch-timeout` | Timeout for remote fetches when the event is missing locally | `::mx/fetch-size` | Maximum number of events fetched from the server at once | `::mx/allow-replace-content` | Replace event content when an `m.replace` relation is present | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L308-L338) --- ## get-previous-timeline-event ```clojure (get-previous-timeline-event client timeline-event) (get-previous-timeline-event client timeline-event opts) ``` Returns a Missionary flow of the previous timeline event relative to `timeline-event`. Returns nil when upstream cannot traverse backward from the supplied event. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L340-L356) --- ## get-next-timeline-event ```clojure (get-next-timeline-event client timeline-event) (get-next-timeline-event client timeline-event opts) ``` Returns a Missionary flow of the next timeline event relative to `timeline-event`. Returns nil when upstream cannot traverse forward from the supplied event. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L358-L374) --- ## get-last-timeline-event ```clojure (get-last-timeline-event client room-id) (get-last-timeline-event client room-id opts) ``` Returns a Missionary outer flow whose values are flows of the latest timeline event. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L376-L392) --- ## get-timeline-events ```clojure (get-timeline-events client response) (get-timeline-events client response opts) (get-timeline-events client room-id start-from direction) (get-timeline-events client room-id start-from direction opts) ``` Returns Missionary flows over timeline events. Arities: * `(get-timeline-events client response opts)` extracts timeline events from a sync `response` * `(get-timeline-events client room-id start-from direction opts)` traverses a room timeline from `start-from` in `:backwards` or `:forwards` The room traversal arity follows upstream behavior: it emits flows of events, may fetch missing events from the server, and can be bounded with `::mx/min-size` and `::mx/max-size`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L394-L437) --- ## get-last-timeline-events ```clojure (get-last-timeline-events client room-id) (get-last-timeline-events client room-id opts) ``` Returns a Missionary flow whose values are flows of flows for the latest timeline events. This mirrors upstream’s nested-flow shape for continuously updated room-end traversal. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L439-L460) --- ## get-timeline-events-list ```clojure (get-timeline-events-list client room-id start-from direction max-size min-size) (get-timeline-events-list client room-id start-from direction max-size min-size opts) ``` Returns a Missionary flow of timeline-event lists starting from `start-from`. `max-size` and `min-size` bound the list-shaped traversal directly. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L462-L488) --- ## get-last-timeline-events-list ```clojure (get-last-timeline-events-list client room-id max-size min-size) (get-last-timeline-events-list client room-id max-size min-size opts) ``` Returns a Missionary flow of the latest timeline events as lists. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L490-L510) --- ## get-timeline-events-around ```clojure (get-timeline-events-around client room-id start-from max-size-before max-size-after) (get-timeline-events-around client room-id start-from max-size-before max-size-after opts) ``` Returns a Missionary flow of timeline-event lists centered around `start-from`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L512-L534) --- ## get-timeline-events-from-now-on ```clojure (get-timeline-events-from-now-on client) (get-timeline-events-from-now-on client opts) ``` Returns a Missionary flow of timeline events received after subscription starts. Upstream notes that timeline gaps are not filled automatically for this live stream. Supported opts: | key | description |-----|------------- | `::mx/decryption-timeout` | Timeout used while decrypting live events | `::mx/sync-response-buffer-size` | Number of sync responses buffered while events are consumed | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L536-L557) --- ## get-timeline-event-relations ```clojure (get-timeline-event-relations client room-id event-id relation-type) ``` Returns a Missionary flow of related timeline-event flows keyed by related event id. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/room.clj#L559-L567) ## ol.trixnity.schemas # ol.trixnity.schemas Malli schema registry for ol.trixnity Public namespaces validate arguments and normalize bridge-shaped data through the schemas defined here before crossing into [`ol.trixnity.internal.bridge`](api/ol-trixnity-internal-bridge.adoc). The registry includes: * public request and options maps for client, room, notification, and key operations * normalized event, profile, room, notification, verification, and trust data shapes * helper functions for building a registry and enforcing schema validation Most callers use these namespaced keys indirectly through the higher-level public APIs. Reach for this namespace directly when constructing config or payload maps by hand. ## schemas ```clojure (schemas _) ``` Returns the project Malli schema map for `opts`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/schemas.clj#L45-L400) --- ## registry ```clojure (registry opts) ``` Builds a Malli registry containing the project schemas and default schemas. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/schemas.clj#L402-L407) --- ## schema-registry Default Malli registry used by public API validation. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/schemas.clj#L409-L411) --- ## validate! ```clojure (validate! schema-id data) (validate! registry schema-id data) ``` Validates `data` against `schema-id` and returns `data` on success. Throws `ExceptionInfo` with humanized Malli errors on validation failure. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/schemas.clj#L416-L430) ## ol.trixnity.user # ol.trixnity.user Room user state, receipts, presence, and permission checks. ## Upstream Mapping This namespace wraps the user-oriented room APIs exposed by Trixnity’s `RoomService`. The public wrappers here cover: * room member lookup by id or as keyed flow maps * per-user receipt and power-level observation * permission checks for invites, bans, kicks, redactions, power changes, and sending events * user presence and global account-data queries Use [`ol.trixnity.room`](api/ol-trixnity-room.adoc) for room lifecycle and timeline access, and [`ol.trixnity.client`](api/ol-trixnity-client.adoc) for client-wide state. ## load-members ```clojure (load-members client room-id) (load-members client room-id opts) ``` Loads room members for `room-id` and returns a Missionary task. Supported opts: | key | description |-----|------------- | `::mx/wait` | When true, wait for the member load to finish before resolving the task (default `true`) | [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L26-L42) --- ## get-all ```clojure (get-all client room-id) ``` Returns a Missionary flow of room members keyed by user id. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L44-L48) --- ## get-by-id ```clojure (get-by-id client room-id user-id) ``` Returns a Missionary flow of the room member for `user-id`, or nil when unavailable. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L50-L55) --- ## get-all-receipts ```clojure (get-all-receipts client room-id) ``` Returns a Missionary flow of per-user receipt flows keyed by user id. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L57-L61) --- ## get-receipts-by-id ```clojure (get-receipts-by-id client room-id user-id) ``` Returns a Missionary flow of receipts for `user-id` in `room-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L63-L68) --- ## get-power-level ```clojure (get-power-level client room-id user-id) ``` Returns a Missionary flow of the current power-level view for `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L70-L75) --- ## can-kick-user ```clojure (can-kick-user client room-id user-id) ``` Returns a Missionary flow that reports whether the current client can kick `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L77-L82) --- ## can-ban-user ```clojure (can-ban-user client room-id user-id) ``` Returns a Missionary flow that reports whether the current client can ban `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L84-L89) --- ## can-unban-user ```clojure (can-unban-user client room-id user-id) ``` Returns a Missionary flow that reports whether the current client can unban `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L91-L96) --- ## can-invite-user ```clojure (can-invite-user client room-id user-id) ``` Returns a Missionary flow that reports whether the current client can invite `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L98-L103) --- ## can-invite ```clojure (can-invite client room-id) ``` Returns a Missionary flow that reports whether the current client can invite users to `room-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L105-L109) --- ## can-redact-event ```clojure (can-redact-event client room-id event-id) ``` Returns a Missionary flow that reports whether the current client can redact `event-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L111-L116) --- ## can-set-power-level-to-max ```clojure (can-set-power-level-to-max client room-id user-id) ``` Returns a Missionary flow of the maximum power level the current client may assign to `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L118-L123) --- ## can-send-event ```clojure (can-send-event client room-id event-class-or-content) ``` Returns a Missionary flow that reports whether the current client can send an event. `event-class-or-content` may be either a room-event-content class or a concrete room-event-content instance. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L125-L142) --- ## get-presence ```clojure (get-presence client user-id) ``` Returns a Missionary flow of presence data for `user-id`. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L144-L148) --- ## get-account-data ```clojure (get-account-data client event-content-class) (get-account-data client event-content-class key) ``` Returns a Missionary flow of global account-data content. When `key` is omitted, the empty-string state key is used. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/user.clj#L150-L161) ## ol.trixnity.verification # ol.trixnity.verification Verification state snapshots and active verification flows. ## Upstream Mapping This namespace maps to Trixnity’s `VerificationService`. The public wrappers here cover: * the current active device verification and its relieved flow * the current active user verifications and their relieved flow * self-verification method discovery Use [`ol.trixnity.key`](api/ol-trixnity-key.adoc) for trust and key-management APIs that often accompany verification workflows. ## current-active-device-verification ```clojure (current-active-device-verification client) ``` Returns the current active device verification, or nil when none is active. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/verification.clj#L23-L26) --- ## active-device-verification ```clojure (active-device-verification client) ``` Returns a relieved Missionary flow of the current active device verification. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/verification.clj#L28-L32) --- ## current-active-user-verifications ```clojure (current-active-user-verifications client) ``` Returns the current active user verifications as a vector. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/verification.clj#L34-L37) --- ## active-user-verifications ```clojure (active-user-verifications client) ``` Returns a relieved Missionary flow of the current active user verifications. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/verification.clj#L39-L43) --- ## get-self-verification-methods ```clojure (get-self-verification-methods client) ``` Returns a Missionary flow of available self-verification methods. Upstream models this as a state machine that distinguishes unmet preconditions, no-cross-signing-yet, already-cross-signed, and available self-verification methods. [source,window=_blank](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/verification.clj#L45-L52) ## Changelog # Changelog All notable changes to this project will be documented in this file. This project uses [**Break Versioning**](https://www.taoensso.com/break-versioning). ## ++[++UNRELEASED++]++ ## `v0.0.1` (2026-03-12) Initial public release of `trixnity-clj`. This release establishes the first published Clojure wrapper around Trixnity, with Missionary-based task and flow interop plus the sqlite4clj-backed repository module. ## Upstream API Coverage # Upstream API Coverage This page tracks `trixnity-clj` coverage of Trixnity’s API. `Implemented` means there is a public wrapper under `ol.trixnity.*`. For upstream `StateFlow` members, the Clojure surface usually appears as a `current-*` accessor plus a Missionary flow. `Not yet` means there is no public wrapper today. ## Client ### MatrixClient | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `userId` | `ol.trixnity.client/current-user-id` | Current snapshot only. | | Not yet | `deviceId` | - | No public wrapper. | | Not yet | `baseUrl` | - | No public wrapper. | | Not yet | `identityKey` | - | No public wrapper. | | Not yet | `signingKey` | - | No public wrapper. | | Not yet | `di` | - | No public wrapper. | | Not yet | `api` | - | Used internally by the bridge for some room endpoints, but not exposed publicly. | | Implemented | `profile` | `ol.trixnity.client/current-profile`, `ol.trixnity.client/profile` | Current snapshot plus relieved flow. | | Implemented | `serverData` | `ol.trixnity.client/current-server-data`, `ol.trixnity.client/server-data` | Current snapshot plus relieved flow. | | Implemented | `syncState` | `ol.trixnity.client/current-sync-state`, `ol.trixnity.client/sync-state` | Current snapshot plus relieved flow. | | Implemented | `initialSyncDone` | `ol.trixnity.client/current-initial-sync-done`, `ol.trixnity.client/initial-sync-done` | Current snapshot plus relieved flow. | | Implemented | `loginState` | `ol.trixnity.client/current-login-state`, `ol.trixnity.client/login-state` | Current snapshot plus relieved flow. | | Implemented | `started` | `ol.trixnity.client/current-started`, `ol.trixnity.client/started` | Current snapshot plus relieved flow. | | Not yet | `logout()` | - | No public wrapper. | | Not yet | `clearCache()` | - | No public wrapper. | | Not yet | `clearMediaCache()` | - | No public wrapper. | | Implemented | `startSync(...)` | `ol.trixnity.client/start-sync` | Uses upstream default presence. There is no public presence parameter. | | Not yet | `syncOnce(...)` | - | No public wrapper. | | Not yet | `syncOnce(..., runOnce)` | - | No public wrapper. | | Implemented | `stopSync()` | `ol.trixnity.client/stop-sync` | - | | Not yet | `cancelSync()` | - | No public wrapper. | | Not yet | `setProfileField(...)` | - | No public wrapper. | | Implemented | `closeSuspending()` | `ol.trixnity.client/close` | Public close path for the client lifecycle. | ### Additional Public APIs * `ol.trixnity.client/open` wraps client creation or resume around the built-in sqlite4clj repository configuration. * `ol.trixnity.client/await-running` waits for `syncState` to reach `RUNNING`. ## Room ### RoomService | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `usersTyping` | `ol.trixnity.room/current-users-typing`, `ol.trixnity.room/users-typing` | Current snapshot plus relieved flow. | | Implemented | `fillTimelineGaps(roomId, eventId, limit)` | `ol.trixnity.room/fill-timeline-gaps` | - | | Implemented | `getTimelineEvent(roomId, eventId, config)` | `ol.trixnity.room/get-timeline-event` | Flow wrapper over one timeline event lookup. | | Implemented | `getPreviousTimelineEvent(timelineEvent, config)` | `ol.trixnity.room/get-previous-timeline-event` | - | | Implemented | `getNextTimelineEvent(timelineEvent, config)` | `ol.trixnity.room/get-next-timeline-event` | - | | Implemented | `getLastTimelineEvent(roomId, config)` | `ol.trixnity.room/get-last-timeline-event` | Preserves the upstream nested-flow shape. | | Implemented | `getTimelineEvents(roomId, startFrom, direction, config)` | `ol.trixnity.room/get-timeline-events`, `ol.trixnity.room/get-timeline-events-list` | `get-timeline-events-list` is a list-shaped convenience built on top of the same upstream timeline chain. | | Implemented | `getLastTimelineEvents(roomId, config)` | `ol.trixnity.room/get-last-timeline-events`, `ol.trixnity.room/get-last-timeline-events-list` | `get-last-timeline-events-list` is a list-shaped convenience over the same upstream room-end traversal. | | Implemented | `getTimelineEventsFromNowOn(...)` | `ol.trixnity.room/get-timeline-events-from-now-on` | Live timeline stream from the current sync position forward. | | Implemented | `getTimelineEvents(response, decryptionTimeout)` | `ol.trixnity.room/get-timeline-events` | Covered by the sync-response arity. | | Not yet | `getTimeline(...)` | - | The advanced mutable `Timeline` abstraction is not exposed yet. | | Implemented | `getTimelineEventRelations(roomId, eventId, relationType)` | `ol.trixnity.room/get-timeline-event-relations` | - | | Implemented | `sendMessage(roomId, wait, builder)` | `ol.trixnity.room/send-message`, `ol.trixnity.room/send-reaction` | `send-message` currently covers text messages and reply metadata. Reactions have a dedicated wrapper. | | Implemented | `cancelSendMessage(roomId, transactionId)` | `ol.trixnity.room/cancel-send-message` | - | | Implemented | `retrySendMessage(roomId, transactionId)` | `ol.trixnity.room/retry-send-message` | - | | Implemented | `getAll()` | `ol.trixnity.room/get-all`, `ol.trixnity.room/get-all-flat` | `get-all-flat` flattens the nested upstream flow map. | | Implemented | `getById(roomId)` | `ol.trixnity.room/get-by-id` | - | | Implemented | `forgetRoom(roomId, force)` | `ol.trixnity.room/forget-room` | - | | Implemented | `getAccountData(roomId, contentClass, key)` | `ol.trixnity.room/get-account-data` | - | | Implemented | `getOutbox()` | `ol.trixnity.room/get-outbox`, `ol.trixnity.room/get-outbox-flat` | `get-outbox-flat` flattens the nested upstream outbox flows. | | Implemented | `getOutbox(roomId)` | `ol.trixnity.room/get-outbox`, `ol.trixnity.room/get-outbox-flat` | Covered by room-scoped arities. | | Implemented | `getOutbox(roomId, transactionId)` | `ol.trixnity.room/get-outbox` | Covered by the transaction-id arity. | | Implemented | `getState(roomId, contentClass, stateKey)` | `ol.trixnity.room/get-state` | - | | Implemented | `getAllState(roomId, contentClass)` | `ol.trixnity.room/get-all-state` | - | ### Additional Public APIs | Status | Upstream API | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `MatrixClientServerApiClient.room.createRoom(...)` | `ol.trixnity.room/create-room` | Exposed directly through `client.api.room`, not through `RoomService`. | | Implemented | `MatrixClientServerApiClient.room.inviteUser(...)` | `ol.trixnity.room/invite-user` | Exposed directly through `client.api.room`, not through `RoomService`. | | Implemented | `MatrixClientServerApiClient.room.joinRoom(...)` | `ol.trixnity.room/join-room` | Exposed directly through `client.api.room`, not through `RoomService`. | | Implemented | `de.connect2x.trixnity.client.room.getTimelineEventsAround(...)` | `ol.trixnity.room/get-timeline-events-around` | Centers a list-shaped view around one timeline event. | ## Timeline | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Not yet | `state` | - | No public wrapper for `TimelineState`. | | Not yet | `init(...)` | - | No public wrapper. | | Not yet | `loadBefore(...)` | - | No public wrapper. | | Not yet | `loadAfter(...)` | - | No public wrapper. | | Not yet | `dropBefore(...)` | - | No public wrapper. | | Not yet | `dropAfter(...)` | - | No public wrapper. | ## UserService | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `loadMembers(roomId, wait)` | `ol.trixnity.user/load-members` | - | | Implemented | `getAll(roomId)` | `ol.trixnity.user/get-all` | - | | Implemented | `getById(roomId, userId)` | `ol.trixnity.user/get-by-id` | - | | Implemented | `getAllReceipts(roomId)` | `ol.trixnity.user/get-all-receipts` | - | | Implemented | `getReceiptsById(roomId, userId)` | `ol.trixnity.user/get-receipts-by-id` | - | | Implemented | `getPowerLevel(roomId, userId)` | `ol.trixnity.user/get-power-level` | - | | Not yet | `getPowerLevel(roomId, createEvent, powerLevels)` | - | Pure helper overload is not wrapped. | | Implemented | `canKickUser(roomId, userId)` | `ol.trixnity.user/can-kick-user` | - | | Implemented | `canBanUser(roomId, userId)` | `ol.trixnity.user/can-ban-user` | - | | Implemented | `canUnbanUser(roomId, userId)` | `ol.trixnity.user/can-unban-user` | - | | Implemented | `canInviteUser(roomId, userId)` | `ol.trixnity.user/can-invite-user` | - | | Implemented | `canInvite(roomId)` | `ol.trixnity.user/can-invite` | - | | Implemented | `canRedactEvent(roomId, eventId)` | `ol.trixnity.user/can-redact-event` | - | | Implemented | `canSetPowerLevelToMax(roomId, userId)` | `ol.trixnity.user/can-set-power-level-to-max` | - | | Implemented | `canSendEvent(roomId, KClass)` | `ol.trixnity.user/can-send-event` | Covered by the class-taking arity. | | Implemented | `canSendEvent(roomId, RoomEventContent)` | `ol.trixnity.user/can-send-event` | Covered by the content-taking arity. | | Implemented | `getPresence(userId)` | `ol.trixnity.user/get-presence` | - | | Implemented | `getAccountData(contentClass, key)` | `ol.trixnity.user/get-account-data` | - | ## NotificationService | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `getNotifications(decryptionTimeout, syncResponseBufferSize)` | `ol.trixnity.notification/get-notifications` | Deprecated upstream path. Still exposed as a deprecated Clojure wrapper. | | Implemented | `getNotifications(response, decryptionTimeout)` | `ol.trixnity.notification/get-notifications` | Covered by the response-taking deprecated arity. | | Implemented | `getAll()` | `ol.trixnity.notification/get-all`, `ol.trixnity.notification/get-all-flat` | `get-all-flat` flattens the nested upstream flows. | | Implemented | `getById(id)` | `ol.trixnity.notification/get-by-id` | - | | Implemented | `getCount()` | `ol.trixnity.notification/get-count` | Covered by the one-argument arity. | | Implemented | `getCount(roomId)` | `ol.trixnity.notification/get-count` | Covered by the room-scoped arity. | | Implemented | `isUnread(roomId)` | `ol.trixnity.notification/is-unread` | - | | Implemented | `dismiss(id)` | `ol.trixnity.notification/dismiss` | - | | Implemented | `dismissAll()` | `ol.trixnity.notification/dismiss-all` | - | | Implemented | `getAllUpdates()` | `ol.trixnity.notification/get-all-updates` | - | | Not yet | `onPush(roomId, eventId)` | - | No public wrapper. | | Not yet | `processPending()` | - | No public wrapper. | ## VerificationService | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `activeDeviceVerification` | `ol.trixnity.verification/current-active-device-verification`, `ol.trixnity.verification/active-device-verification` | Current snapshot plus relieved flow. | | Implemented | `activeUserVerifications` | `ol.trixnity.verification/current-active-user-verifications`, `ol.trixnity.verification/active-user-verifications` | Current snapshot plus relieved flow. | | Not yet | `createDeviceVerificationRequest(...)` | - | No public wrapper. | | Not yet | `createUserVerificationRequest(...)` | - | No public wrapper. | | Implemented | `getSelfVerificationMethods()` | `ol.trixnity.verification/get-self-verification-methods` | - | | Not yet | `getActiveUserVerification(timelineEvent)` | - | No public wrapper. | | Not yet | `getActiveUserVerification(roomId, eventId)` | - | No public wrapper. | ## KeyService | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `bootstrapRunning` | `ol.trixnity.key/current-bootstrap-running`, `ol.trixnity.key/bootstrap-running` | Current snapshot plus relieved flow. | | Not yet | `bootstrapCrossSigning(secretKey, secretKeyEvent)` | - | No public wrapper. | | Not yet | `bootstrapCrossSigning()` | - | No public wrapper. | | Not yet | `bootstrapCrossSigningFromPassphrase(passphrase)` | - | No public wrapper. | | Implemented | `getTrustLevel(userId, deviceId)` | `ol.trixnity.key/get-trust-level` | Covered by the three-argument arity when the first id is a user id. | | Implemented | `getTrustLevel(roomId, eventId)` | `ol.trixnity.key/get-trust-level` | Covered by the three-argument arity when the first id is a room id. | | Implemented | `getTrustLevel(userId)` | `ol.trixnity.key/get-trust-level` | Covered by the two-argument arity. | | Implemented | `getDeviceKeys(userId)` | `ol.trixnity.key/get-device-keys` | - | | Implemented | `getCrossSigningKeys(userId)` | `ol.trixnity.key/get-cross-signing-keys` | - | ## KeyBackupService | Status | Upstream member | `trixnity-clj` surface | Notes | | --- | --- | --- | --- | | Implemented | `version` | `ol.trixnity.key/current-backup-version`, `ol.trixnity.key/backup-version` | Current snapshot plus relieved flow. | | Not yet | `loadMegolmSession(roomId, sessionId)` | - | No public wrapper. | | Not yet | `keyBackupCanBeTrusted(version, recoveryKey)` | - | No public wrapper. | | Not yet | `bootstrapRoomKeyBackup(...)` | - | No public wrapper. | ## ol.trixnity # ol.trixnity > A Clojure adapter for Trixnity, a Matrix SDK. Write Matrix apps and bots in Clojure. ![doc](https://img.shields.io/badge/doc-outskirtslabs-orange.svg) ![status: experimental](https://img.shields.io/badge/status-experimental-red.svg) [Trixnity](https://trixnity.connect2x.de/) is a Kotlin Multiplatform library for building Matrix applications. It covers the full Matrix client-server API surface, including room management, sync, and end-to-end encryption. Despite flying under the radar, Trixnity already powers a large chunk of Germany’s TI-Messenger healthcare infrastructure, reaching tens of millions of potential users. Trixnity targets the JVM, which means Clojure can call into it directly, but the interop is still rough. Nearly every interesting API is either a Kotlin suspend function or returns a `Flow` or `StateFlow`, so even basic client work quickly turns into coroutine plumbing: scopes, dispatchers, cancellation, and stream observation. The flow-heavy parts are especially awkward because they are long-lived Kotlin stream types, not something Clojure can consume idiomatically. So things like sync state, timeline updates, and other live observations need extra translation. Kotlin’s compiler also mangles names in the compiled bytecode, which makes direct interop harder when reading the upstream docs. `trixnity-clj` wraps Trixnity with a small Kotlin bridge and exposes the concurrency model using [Missionary](https://github.com/leonoel/missionary/). Kotlin suspend functions become Missionary tasks. Kotlin `Flow` and `StateFlow` surfaces become Missionary flows. `StateFlow` properties are exposed as a synchronous `current-*` getter plus a relieved Missionary flow. Project status: **[Experimental](https://docs.outskirtslabs.com/open-source-vital-signs#experimental)**. ## Repository Backend In Trixnity, a repository module is the persistence backend for all the client state it needs to keep around: sync tokens, rooms, timelines, outbox entries, encryption keys, notifications, and the rest of the Matrix baggage. Upstream ships several of these across platforms. If you want durable storage on the JVM, the stock option is the [Exposed repository module](https://gitlab.com/trixnity/trixnity/-/tree/main/trixnity-client/trixnity-client-repository-exposed), which means JetBrains’s ORM Exposed layered on top of JDBC. Maybe that sparks joy for somebody. It does not spark joy for me. For the kind of bots and small clients I am building, running SQLite through JDBC makes write serialization harder than it should be, which means more `busy_timeout` pain. And god forbid anyone suggest dragging Hikari into that mess. So this library includes its own repository implementation backed by [sqlite4clj](https://github.com/andersmurphy/sqlite4clj), and that is the default setup. The storage layer is just plain SQLite, explicit SQL, and a lot less nonsense. Shout out to Anders Murphy for building [sqlite4clj](https://github.com/andersmurphy/sqlite4clj), and making the SQLite story in Clojure 100% less deranged. ## Example Usage Use [`ol.trixnity.repo`](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/repo.clj) to configure the built-in sqlite4clj repository, then open a client with [`ol.trixnity.client/open`](https://github.com/outskirtslabs/trixnity-clj/blob/main/src/clj/ol/trixnity/client.clj): ```clojure (ns my.bot (:require [missionary.core :as m] [ol.trixnity.client :as client] [ol.trixnity.event :as event] [ol.trixnity.repo :as repo] [ol.trixnity.room :as room] [ol.trixnity.room.message :as msg] [ol.trixnity.schemas :as mx]) (:import [java.time Duration])) (defn run-bot [] (let [client (m/? (client/open (merge {::mx/homeserver-url "https://matrix.example.org" ::mx/username "bot" ::mx/password "secret"} (repo/sqlite4clj-config {:database-path "./var/trixnity.sqlite" :media-path "./var/media"}))))] (m/? (client/start-sync client)) (m/? (client/await-running client {::mx/timeout (Duration/ofSeconds 30)})) (future (m/? (m/reduce (fn [_ ev] (when (event/text? ev) (m/? (room/send-message client (event/room-id ev) (-> (msg/text "pong") (msg/reply-to ev)) {::mx/timeout (Duration/ofSeconds 5)}))) nil) nil (room/get-timeline-events-from-now-on client {::mx/decryption-timeout (Duration/ofSeconds 8)})))) {:client client})) ``` If you want a different repository implementation, construct a `MatrixClient` yourself and pass it to `client/open` as `::mx/client`. ## Documentation * [Docs](https://docs.outskirtslabs.com/ol.trixnity/next/) * [API Reference](https://docs.outskirtslabs.com/ol.trixnity/next/api) * [Support via GitHub Issues](https://github.com/outskirtslabs/trixnity-clj/issues) ## Examples Several examples are available in [examples](examples/): * [basic-bot](examples/basic-bot/) - A minimal end-to-end bot that opens a client, starts sync, joins invited rooms, and replies to live timeline events. ## License Copyright (C) 2026 Casey Link Distributed under the [Apache-2.0](https://spdx.org/licenses/Apache-2.0.html) just like Trixnity itself. ## Security policy # Security policy ## Advisories All security advisories for `trixnity-clj` will be posted [on GitHub](https://github.com/outskirtslabs/trixnity-clj/security/advisories). ## Reporting a vulnerability Please report possible security vulnerabilities [via GitHub](https://github.com/outskirtslabs/trixnity-clj/security/advisories), or by emailing me at `casey@outskirtslabs.com`. You may encrypt email with [my public PGP key](https://casey.link/pgp.asc). For the organization-wide security policy, see [Outskirts Labs Security Policy](https://docs.outskirtslabs.com/security-policy). Thank you! [Casey Link](https://casey.link)