Nostrduino
Loading...
Searching...
No Matches
ESP32Transport.h
Go to the documentation of this file.
1#ifndef _NOSTR_ESP32_TRANSPORT_H
2#define _NOSTR_ESP32_TRANSPORT_H 1
3#include "NostrCommon.h"
4
5#if defined(_ESP32_BOARD_)
6
7#include "ArduinoJson.h"
8#include "NostrString.h"
9#include "NostrLimits.h"
10#include "NostrTransport.h"
11#include "NostrUrl.h"
12#include "NostrUtils.h"
13#include "WiFi.h"
14#include <WiFiClientSecure.h>
15#include <HTTPClient.h>
16#include <WebSocketsClient.h>
17#include <functional>
18#include <initializer_list>
19#include <vector>
20namespace nostr {
21namespace esp32 {
22struct ESP32TlsConfig {
23 // The caller owns this PEM buffer and must keep it alive for the complete
24 // lifetime of the transport and every connection created from it.
25 const char *caCertificatePem;
26 bool requireCertificateValidation;
27
28 ESP32TlsConfig() : caCertificatePem(nullptr), requireCertificateValidation(false) {}
29};
30
31struct ESP32TransportConfig {
50 ESP32TlsConfig tls;
51 NostrLimits limits;
52 uint16_t connectTimeoutMs;
53 uint16_t readTimeoutMs;
54 uint8_t maxProtocolViolations;
55 // Empty means every syntactically valid HTTPS callback is allowed.
56 std::function<bool(const ParsedUrl &)> lnurlCallbackFilter;
57 // Empty accepts any standard Bitcoin BOLT11 network; use "bc", "tb",
58 // "tbs" or "bcrt" to bind LNURL invoices to one network.
59 NostrString expectedBolt11Currency;
60
61 ESP32TransportConfig()
62 : tls(), limits(), connectTimeoutMs(10000), readTimeoutMs(15000), maxProtocolViolations(3),
63 lnurlCallbackFilter(), expectedBolt11Currency("") {}
64};
65
66class ESP32Transport;
67class ESP32Connection : public Connection {
68 friend class ESP32Transport;
69
70 public:
71 void send(NostrString message) override;
72 void disconnect() override;
73 void loop() override;
74 bool isReady() override;
75 void addMessageListener(std::function<void(NostrString)> listener) override;
76 void addConnectionStatusListener(std::function<void(ConnectionStatus status)> listener) override;
77 WebSocketsClient *getWebsocket() { return &ws; }
78 ~ESP32Connection() override;
79
80 protected:
81 ESP32Connection(ESP32Transport *transport, NostrString url);
82
83 private:
84 ESP32Transport *transport;
85 WebSocketsClient ws;
86 std::vector<std::function<void(NostrString)>> messageListeners;
87 std::vector<std::function<void(ConnectionStatus status)>> connectionListeners;
88 NostrString fragmentedMessage;
89 bool fragmentedMessageRejected = false;
90 bool failed = false;
91 uint8_t protocolViolations = 0;
92 void noteProtocolViolation(const char *message);
93};
94class ESP32Transport : public Transport {
95 friend class ESP32Connection;
96 public:
97 void getInvoiceFromLNAddr(NostrString addr, MilliSats amountMSats, NostrString comment, std::function<void(NostrString)> callback);
98 Connection *connect(NostrString url) override;
99 void close();
100 void disconnect(Connection *conn) override;
101 ~ESP32Transport() override;
102 explicit ESP32Transport(const ESP32TransportConfig &config = ESP32TransportConfig());
103 bool isReady() override;
104 const ESP32TransportConfig &getConfig() const { return config; }
105 bool tlsCertificateValidationActive() const { return config.tls.caCertificatePem != nullptr; }
106
107 private:
108 void httpsGet(NostrString url, std::function<void(NostrString)> callback);
109 bool configureTls(WiFiClientSecure &client);
110 bool allowTlsConnection();
111 void noteUnverifiedTls();
112 ESP32TransportConfig config;
113 bool warnedUnverifiedTls = false;
114 WiFiClientSecure httpsClient;
115 std::vector<Connection *> connections;
116};
117} // namespace esp32
118} // namespace nostr
119#endif
120#endif
#define NostrString
Definition NostrString.h:10
Definition CryptoLock.h:6