Modernize the entire customer-merchant communication layer from deprecated
NIP-04 (kind 4, AES-256-CBC) to NIP-17 private direct messages using
NIP-44 v2 encryption (ChaCha20 + HMAC-SHA256) and NIP-59 gift wrapping
(rumor/seal/gift-wrap protocol). No backwards compatibility retained.
New modules:
- nostr/nip44.py: NIP-44 v2 encryption verified against official spec vectors
- nostr/nip59.py: NIP-59 gift wrap with wrap/unwrap convenience functions
- tests/: 44 unit tests for NIP-44 and NIP-59
Key changes:
- Subscription filters: kind 4 → kind 1059 gift wraps
- Message handler: _handle_nip04_message → _handle_gift_wrap (unwrap + route)
- send_dm/reply_to_structured_dm: NIP-59 gift wrap to recipient + self-archive
- Merchant model: removed NIP-04 crypto methods (decrypt/encrypt/build_dm_event)
- helpers.py: removed NIP-04 functions, kept Schnorr signing + key normalization
- views_api.py: consolidated DM sending through send_dm() service function
Reliability improvements:
- Event deduplication via bounded LRU set in NostrClient
- Subscription health monitor (resubscribes after 120s of silence)
- Preserved 5-minute lenient time window from prior work
Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
Enhances the processing of Nostr messages by adding more robust error handling and logging, providing better insights into potential issues.
Specifically:
- Improves the checks on the websocket connection to log errors and debug information.
- Implements more comprehensive error logging for failed product quantity checks.
- Enhances logging and validation of EVENT messages to prevent potential errors.
- Implements a more robust merchant lookup logic to avoid double processing of events.
- Implements a more lenient time window for direct message subscriptions.
Improves websocket connection reliability by predefining the websocket URL and handling potential queueing errors.
This change also updates the websocket close message for clarity.
* feat: restore stalls from `nostr` as pending
* feat: stall and prod last update time
* feat: restore products and stalls as `pending`
* feat: show pending stalls
* feat: restore stall
* feat: restore a stall from nostr
* feat: add blank `Restore Product` button
* fix: handle no talls to restore case
* feat: show restore dialog
* feat: allow query for pending products
* feat: restore products
* chore: code clean-up
* fix: last dm and last order query
* chore: code clean-up
* fix: subscribe for stalls and products on merchant create/restore
* feat: add message type to orders
* feat: simplify messages; code format
* feat: add type to DMs; restore DMs from nostr
* fix: parsing ints
* fix: hide copy button if invoice not present
* fix: do not generate invoice if product not found
* feat: order restore: first version
* refactor: move some logic into `services`
* feat: improve restore UX
* fix: too many calls to customer DMs
* fix: allow `All` customers filter
* fix: ws reconnect on server restart
* fix: query for customer profiles only one
* fix: unread messages per customer per merchant
* fix: disable `user-profile-events`
* fix: customer profile is optional
* fix: get customers after new message debounced
* chore: code clean-up
* feat: auto-create zone
* feat: fixed ID for default zone
* feat: notify order paid