Packages
An Elixir wrapper for the nostr Rust library, built with Rustler. Provides key management, text parsing, NIP-19 encoding/decoding, event creation, and filter management.
Current section
Files
Jump to
Current section
Files
lib/nostr_elixir.ex
defmodule NostrElixir do
@moduledoc """
NostrElixir: Elixir wrapper for the nostr Rust library.
## Modules
* `NostrElixir.Keys` – Key management (generation, parsing, conversions)
* `NostrElixir.Nip19` – NIP-19 encoding/decoding
* `NostrElixir.Event` – Event creation, signing, verification, helpers
* `NostrElixir.Filter` – Filter creation and helpers
* `NostrElixir.Nip04` – Encrypted DMs (NIP-04)
* `NostrElixir.Nip44` – Encrypted DMs v2 (NIP-44)
See the documentation for each module for details and examples.
"""
alias NostrElixir.Keys
alias NostrElixir.Nip19
alias NostrElixir.Event
alias NostrElixir.Filter
# Optionally, re-export the most common functions for backward compatibility
defdelegate generate_keypair(), to: Keys
defdelegate parse_keypair(secret_key), to: Keys
defdelegate nip19_encode(type, data), to: Nip19, as: :encode
defdelegate nip19_decode(bech32_string), to: Nip19, as: :decode
defdelegate nip19_decode_map(bech32_string), to: Nip19, as: :decode_map
defdelegate new_event(pubkey, content, kind, tags), to: Event, as: :new
defdelegate sign_event(event_json, secret_key), to: Event, as: :sign
defdelegate verify_event(event_json), to: Event, as: :verify
defdelegate create_text_note(keys, content), to: Event
defdelegate create_metadata(keys, metadata), to: Event
defdelegate new_filter(filter_spec), to: Filter, as: :new
defdelegate user_notes_filter(pubkey), to: Filter
defdelegate user_follow_list_filter(pubkey), to: Filter
defdelegate get_user_metadata(pubkey), to: Filter
defdelegate search_hashtag(hashtag), to: Filter
defdelegate recent_events(), to: Filter
# Keep the NIF stubs for Rustler
use Rustler, otp_app: :nostr_elixir, crate: :nostr_nif
def keys_generate_nif, do: :erlang.nif_error(:nif_not_loaded)
def keys_parse_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def keys_public_key_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def keys_secret_key_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def keys_public_key_bech32_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def keys_secret_key_bech32_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def keys_secret_key_hex_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def parser_parse_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def nip19_encode_nif(_, _), do: :erlang.nif_error(:nif_not_loaded)
def nip19_decode_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def event_new_nif(_, _, _, _), do: :erlang.nif_error(:nif_not_loaded)
def event_sign_nif(_, _), do: :erlang.nif_error(:nif_not_loaded)
def event_verify_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def event_to_json_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def event_from_json_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def filter_new_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def filter_to_json_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def filter_from_json_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def nip06_generate_mnemonic_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def nip06_mnemonic_to_seed_nif(_, _), do: :erlang.nif_error(:nif_not_loaded)
def nip06_derive_key_nif(_, _), do: :erlang.nif_error(:nif_not_loaded)
def nip06_validate_mnemonic_nif(_), do: :erlang.nif_error(:nif_not_loaded)
def nip04_encrypt_nif(_, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip04_decrypt_nif(_, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip44_encrypt_nif(_, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip44_decrypt_nif(_, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip57_private_zap_request_nif(_, _, _, _, _, _, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip57_anonymous_zap_request_nif(_, _, _, _, _, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip57_decrypt_sent_private_zap_message_nif(_, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip57_decrypt_received_private_zap_message_nif(_, _), do: :erlang.nif_error(:nif_not_loaded)
def nip17_encrypt_dm_nif(_, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip17_decrypt_dm_nif(_, _, _), do: :erlang.nif_error(:nif_not_loaded)
def nip65_create_relay_list_event_nif(_relays, _pubkey), do: :erlang.nif_error(:nif_not_loaded)
def nip65_extract_relay_list_nif(_event_json), do: :erlang.nif_error(:nif_not_loaded)
def nip02_create_contact_list_event_nif(_contacts, _pubkey), do: :erlang.nif_error(:nif_not_loaded)
def nip02_extract_contacts_nif(_event_json), do: :erlang.nif_error(:nif_not_loaded)
def nip10_create_text_note_nif(_keys_json, _content), do: :erlang.nif_error(:nif_not_loaded)
def nip10_create_text_note_reply_nif(_keys_json, _content, _reply_to_json, _root_json, _relay_url), do: :erlang.nif_error(:nif_not_loaded)
# Parse text tokens (convenience wrapper)
def parse_text_tokens(text) do
tokens_json = parser_parse_nif(text)
tokens = Jason.decode!(tokens_json)
Enum.map(tokens, fn token ->
%{
token_type: token["token_type"],
value: token["value"]
}
end)
end
end