# NOSTR WebSocket Library Export Guide This guide explains how to use the NOSTR WebSocket library in other C projects. ## Library Structure The NOSTR WebSocket library consists of these key files for export: ### Core Files (Required) - `nostr_websocket_tls.h` - Header with all function declarations and constants - `nostr_websocket_mbedtls.c` - Main implementation using mbedTLS for SSL/TLS - `../cjson/cJSON.h` and `../cjson/cJSON.c` - JSON parsing (lightweight) ### Dependencies - **mbedTLS** - For SSL/TLS support (wss:// connections) - **Standard C libraries** - socket, networking, etc. ## Quick Integration ### 1. Copy Files to Your Project ```bash # Copy the library files cp nostr_websocket_tls.h your_project/ cp nostr_websocket_mbedtls.c your_project/ cp ../cjson/cJSON.h your_project/ cp ../cjson/cJSON.c your_project/ ``` ### 2. Install mbedTLS Dependency ```bash # Ubuntu/Debian sudo apt-get install libmbedtls-dev # Or build from source (see mbedTLS documentation) ``` ### 3. Compile Your Project ```bash gcc -o my_nostr_app my_app.c nostr_websocket_mbedtls.c cJSON.c \ -lmbedtls -lmbedx509 -lmbedcrypto -lm ``` ## Basic Usage Example ```c #include "nostr_websocket_tls.h" #include "cJSON.h" #include int main() { // Connect to relay nostr_ws_client_t* client = nostr_ws_connect("wss://relay.damus.io"); if (!client) { printf("Failed to connect\n"); return 1; } // Create subscription filter cJSON* filter = cJSON_CreateObject(); cJSON* kinds = cJSON_CreateArray(); cJSON_AddItemToArray(kinds, cJSON_CreateNumber(1)); // Text notes cJSON_AddItemToObject(filter, "kinds", kinds); cJSON_AddItemToObject(filter, "limit", cJSON_CreateNumber(10)); // Send REQ message nostr_relay_send_req(client, "my-sub", filter); // Receive messages char buffer[8192]; while (1) { int len = nostr_ws_receive(client, buffer, sizeof(buffer), 1000); if (len > 0) { printf("Received: %s\n", buffer); // Parse message type char* msg_type; cJSON* parsed; if (nostr_parse_relay_message(buffer, &msg_type, &parsed) == 0) { if (strcmp(msg_type, "EOSE") == 0) { printf("End of subscription\n"); free(msg_type); cJSON_Delete(parsed); break; } free(msg_type); cJSON_Delete(parsed); } } } // Cleanup nostr_ws_close(client); cJSON_Delete(filter); return 0; } ``` ## API Reference ### Connection Management - `nostr_ws_connect(url)` - Connect to relay (ws:// or wss://) - `nostr_ws_close(client)` - Close connection and cleanup - `nostr_ws_get_state(client)` - Get connection state ### Messaging - `nostr_ws_send_text(client, message)` - Send raw text message - `nostr_ws_receive(client, buffer, size, timeout)` - Receive message - `nostr_ws_ping(client)` - Send ping frame ### NOSTR Protocol Helpers - `nostr_relay_send_req(client, sub_id, filters)` - Send REQ message - `nostr_relay_send_event(client, event)` - Send EVENT message - `nostr_relay_send_close(client, sub_id)` - Send CLOSE message - `nostr_parse_relay_message(message, type, json)` - Parse relay message ### Error Handling - `nostr_ws_strerror(error_code)` - Get error string - Return codes: `NOSTR_WS_SUCCESS`, `NOSTR_WS_ERROR_*` ## Advanced Configuration ### Custom Timeouts ```c nostr_ws_set_timeout(client, 30000); // 30 second timeout ``` ### Multiple Transports The library supports both TCP (`ws://`) and TLS (`wss://`) automatically based on URL scheme. ## Cross-Platform Notes ### Linux/Unix - Works out of the box with standard development tools - Requires: gcc, mbedTLS development headers ### Potential Windows Support - Would need Winsock2 adaptations in transport layer - mbedTLS is cross-platform compatible ### Embedded Systems - Lightweight design suitable for embedded use - Memory usage: ~4KB per client + message buffers - No dynamic allocations in hot paths ## Library Design Benefits ### Modular Architecture - Clean separation between WebSocket protocol and NOSTR logic - Transport layer abstraction (easy to add new transports) - No global state - multiple clients supported ### Performance Optimized - Minimal memory allocations - Efficient SSL buffer handling - Fast WebSocket frame parsing ### Production Ready - Proper error handling throughout - Resource cleanup on all code paths - Thread-safe design (no shared state) ## Migration from Other Libraries ### From libwebsockets ```c // Old libwebsockets code: // lws_client_connect_info info = {...}; // wsi = lws_client_connect(context, &info); // New NOSTR WebSocket library: client = nostr_ws_connect("wss://relay.example.com"); ``` ### From raw sockets The library handles all WebSocket protocol details, SSL/TLS, and NOSTR message formatting automatically. ## Support - Based on WebSocket RFC 6455 - Implements NOSTR WebSocket conventions - SSL/TLS via proven mbedTLS library - Tested with major NOSTR relays This library provides a clean, efficient way to integrate NOSTR WebSocket functionality into any C project with minimal dependencies and maximum portability.