appName: strfry features: ssl: true config: true onAppStartup: true db: true customLMDBSetup: true websockets: true templar: true includes: | #include "PackedEvent.h" tables: ## DB meta-data. Single entry, with id = 1 Meta: fields: - name: dbVersion - name: endianness ## Meta-info of nostr events, suitable for indexing ## Primary key is auto-incremented, called "levId" for Local EVent ID Event: opaque: true indices: created_at: integer: true id: comparator: StringUint64 pubkey: comparator: StringUint64 kind: comparator: Uint64Uint64 pubkeyKind: comparator: StringUint64Uint64 tag: comparator: StringUint64 multi: true deletion: # eventId, pubkey multi: true expiration: # unix timestamp, value of 1 is special-case for ephemeral event integer: true multi: true replace: # pubkey, d-tag, kind multi: true indexPrelude: | PackedEventView packed(v.buf); created_at = packed.created_at(); uint64_t indexTime = *created_at; id = makeKey_StringUint64(packed.id(), indexTime); pubkey = makeKey_StringUint64(packed.pubkey(), indexTime); kind = makeKey_Uint64Uint64(packed.kind(), indexTime); pubkeyKind = makeKey_StringUint64Uint64(packed.pubkey(), packed.kind(), indexTime); packed.foreachTag([&](char tagName, std::string_view tagVal){ tag.push_back(makeKey_StringUint64(std::string(1, tagName) + std::string(tagVal), indexTime)); if (tagName == 'd' && replace.size() == 0) { replace.push_back(makeKey_StringUint64(std::string(packed.pubkey()) + std::string(tagVal), packed.kind())); } else if (tagName == 'e' && packed.kind() == 5) { deletion.push_back(std::string(tagVal) + std::string(packed.pubkey())); } return true; }); if (packed.expiration() != 0) { expiration.push_back(packed.expiration()); } CompressionDictionary: fields: - name: dict type: ubytes tablesRaw: ## Raw nostr event JSON, possibly compressed ## keys are levIds ## vals are prefixed with a type byte: ## 0: no compression, payload follows ## 1: zstd compression. Followed by Dictionary ID (native endian uint32) then compressed payload EventPayload: flags: 'MDB_INTEGERKEY' config: - name: db desc: "Directory that contains the strfry LMDB database" default: "./strfry-db/" noReload: true - name: dbParams__maxreaders desc: "Maximum number of threads/processes that can simultaneously have LMDB transactions open" default: 256 noReload: true - name: dbParams__mapsize desc: "Size of mmap() to use when loading LMDB (default is 10TB, does *not* correspond to disk-space used)" default: 10995116277760 noReload: true - name: dbParams__noReadAhead desc: "Disables read-ahead when accessing the LMDB mapping. Reduces IO activity when DB size is larger than RAM." default: false noReload: true - name: events__maxEventSize desc: "Maximum size of normalised JSON, in bytes" default: 65536 - name: events__rejectEventsNewerThanSeconds desc: "Events newer than this will be rejected" default: 900 # 15 mins - name: events__rejectEventsOlderThanSeconds desc: "Events older than this will be rejected" default: 94608000 # 3 years - name: events__rejectEphemeralEventsOlderThanSeconds desc: "Ephemeral events older than this will be rejected" default: 60 - name: events__ephemeralEventsLifetimeSeconds desc: "Ephemeral events will be deleted from the DB when older than this" default: 300 - name: events__maxNumTags desc: "Maximum number of tags allowed" default: 2000 - name: events__maxTagValSize desc: "Maximum size for tag values, in bytes" default: 1024