From 54e5720fcf43e562a7de3d89a876243b77255bf8 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Fri, 22 Aug 2025 03:35:09 +0200 Subject: [PATCH 01/25] team-nl-br design proposal --- 10 Notes/Team-NLBR Solution Proposal.md | 188 ++++++++++++++++++ ...Unclarity about Waku filters and topics.md | 71 +++++++ ...iversal Topic Optimization in Waku (AI).md | 86 ++++++++ 10 Notes/What is Seeding (AI)?.md | 154 ++++++++++++++ .../When are magnetlink messages sent?.md | 66 ++++++ 90 Extras/92 Assets/team-nl-br-design-1.svg | 6 + 90 Extras/92 Assets/team-nl-br-design-2.svg | 5 + 90 Extras/92 Assets/team-nl-br-design-3.svg | 5 + 8 files changed, 581 insertions(+) create mode 100644 10 Notes/Team-NLBR Solution Proposal.md create mode 100644 10 Notes/Unclarity about Waku filters and topics.md create mode 100644 10 Notes/Universal Topic Optimization in Waku (AI).md create mode 100644 10 Notes/What is Seeding (AI)?.md create mode 100644 10 Notes/When are magnetlink messages sent?.md create mode 100644 90 Extras/92 Assets/team-nl-br-design-1.svg create mode 100644 90 Extras/92 Assets/team-nl-br-design-2.svg create mode 100644 90 Extras/92 Assets/team-nl-br-design-3.svg diff --git a/10 Notes/Team-NLBR Solution Proposal.md b/10 Notes/Team-NLBR Solution Proposal.md new file mode 100644 index 0000000..2a3c7f6 --- /dev/null +++ b/10 Notes/Team-NLBR Solution Proposal.md @@ -0,0 +1,188 @@ +The `TorrentConfig` type provides the configuration for the BitTorrent-based History Archive management functionality: + +```go +type TorrentConfig struct { + // Enabled set to true enables Community History Archive protocol + Enabled bool + // Port number which the BitTorrent client will listen to for conntections + Port int + // DataDir is the file system folder Status should use for message archive torrent data. + DataDir string + // TorrentDir is the file system folder Status should use for storing torrent metadata files. + TorrentDir string +} +``` + +The `DataDir` is where the History Archives for the controlled communities are stored. Then, `TorrentDir` is where the corresponding community torrent files are preserved. + +In the `DataDir` folder, for each community there is a folder (named after community id) in which the history archive for that community is stored: + +```bash +DataDir/ +├── {communityID}/ +│ ├── index # Archive index file (metadata) +│ └── data # Archive data file (actual messages) +└── +``` + +There is one-to-one relationship between the community folder and the corresponding *torrent* file (BitTorrent metainfo): + +```bash +TorrentDir/ +├── {communityID}.torrent # Torrent metadata file +└── +``` + +## When Archives are created + +The function somehow central to the Archive creation is [InitHistoryArchiveTasks](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L3783). This function is called in a number of situations, e.g. in [Messenger.Start](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger.go#L562), [Messenger.EditCommunity](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L2807), [Messenger.ImportCommunity](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L2865), [Messenger.EnableCommunityHistoryArchiveProtocol](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L4136). + +In `InitHistoryArchiveTasks`, for each community with `HistoryArchiveSupportEnabled` option set to `true`: + +- if community torrent file already exists: call [ArchiveManager.SeedHistoryArchiveTorrent](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L408) - see also [[What is Seeding (AI)?]] and [[When are magnetlink messages sent?]]. +- determine if new archives need to be created based on the last archive end date and call [CreateAndSeedHistoryArchive](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L314) +- starts periodic archive creation task by calling [StartHistoryArchiveTasksInterval](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L323), which will in turn call [CreateAndSeedHistoryArchive](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L314). + +From `CreateAndSeedHistoryArchive`, via chain of calls, we arrive at [createHistoryArchiveTorrent](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive_file.go#L55), which is key to understand how archives are created and to our proposal. + +## Archive Creation + +Archives are about archiving messages. Thus, we first need to find the messages relevant to the given (chat) community. This happens through *filters* and connected to them `topics`. It is probably enough to say, that there is some [[Unclarity about Waku filters and topics]], but for this discussion, it should be enough to assume, that we trust to correctly retrieve the community messages. `topics` are provided to the `createHistoryArchiveTorrent`, which is where the archives are built. + +Recall that for each community, status-go uses two files: `index` metadata file, and the `data`. +The `data` file stores *protobuf*-encoded *archives*. Each archive describes a period of time given by `From` and `To` attributes (both Unix timestamps casted to `uint64`), which together with `ContentTopic` form the `Metadata` part of an archive: + +```go +type WakuMessageArchiveMetadata struct { + From uint64 + To uint64 + ContentTopic [][]byte +} +``` + +> For clarity, we skip `protobuf`-specific fields and annotations. + +In `createHistoryArchiveTorrent`, the messages are retrieved using [GetWakuMessagesByFilterTopic](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/persistence.go#L967). Then, the messages are bundled into chunks, where each chunk is max `30MB` big as given by the `maxArchiveSizeInBytes` constant. Messages bigger than `maxArchiveSizeInBytes` will not be archived. + +Now, for each message chunk, an instance of [WakuMessageArchive](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/protobuf/communities.pb.go#L2152) (`wakuMessageArchive`) is created using [createWakuMessageArchive](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive_file.go#L343). `WakuMessageArchive` has the following definition: + +```go +type WakuMessageArchive struct { + Metadata *WakuMessageArchiveMetadata + Messages []*WakuMessage +} +``` + +> again we strip `protobuf` attributes for clarity. + +We see that the `Metadata` attribute of the `WakuMessageArchive` type is set to the `WakuMessageArchiveMetadata` defined above. For reference only, `WakuMessage` has the following definition: + +```go +type WakuMessage struct { + Sig []byte + Timestamp uint64 + Topic []byte + Payload []byte + Padding []byte + Hash []byte + ThirdPartyId string +} +``` + +The `WakuMessageArchive` is then encoded and encrypted, resulting in the final `encodedArchive`. The `rawSize := len(encodedArchive)` is then padded if necessary so that the archive size is aligned to the BitTorrent piece length (which is set to `100KiB`). The `encodedArchive` together with the padding information is then added to `encodedArchives` (`[]*EncodedArchiveData`). Finally, the resulting `size` and `padding` together with the current `offset` in the existing `data` file and the `Metadata` are used to create the corresponding archive index entry that later will be serialized to the `index` file: + +```go +wakuMessageArchiveIndexMetadata := &protobuf.WakuMessageArchiveIndexMetadata{ + Metadata: wakuMessageArchive.Metadata, + Offset: offset, + Size: uint64(size), + Padding: uint64(padding), +} +``` + +The archive index entry is encoded, and its hash is used as a key in the archive index map: + +```go +wakuMessageArchiveIndexMetadataBytes, err := proto.Marshal( + wakuMessageArchiveIndexMetadata +) + +archiveID := crypto.Keccak256Hash(wakuMessageArchiveIndexMetadataBytes).String() +wakuMessageArchiveIndex[archiveID] = wakuMessageArchiveIndexMetadata +``` + +> `wakuMessageArchiveIndex` is earlier initialized to contain existing archive index entries from the current `index` file. Here we are basically appending new archive meta to the archive index data structure. + +We repeat the whole process for each message chunk in the given time period, adding more period if needed (recall, each period is 7 days long). + +After that we have a list of new archives (in `encodedArchives`) and a new archive index entries. We are ready to be encoded and serialized to the corresponding `data` (by appending) and `index` files. + +Finally, the corresponding torrent file is (re)created, the `HistoryArchivesCreatedSignal` is emitted, and the last message archive end date is recorded in the persistence. + +The diagram below shows the relationships between the datatypes described above: + +![[team-nl-br-design-1.svg]] + +And then in the following diagram we show how the `index` and `data` files are populated, the corresponding torrent file and the magnet link: + +![[team-nl-br-design-2.svg]] + +## Archive Distribution and Download + +All the nodes that want to restore the message history, first need to retrieve the `index` file. Here, the selective download of the selected files from the torrent is used. After having the index files, the nodes can find out which periods they need to retrieve. Using the `offset`, `size`, and `padding`, they use BitTorrent library, to selectively fetch only the torrent pieces that they need. In our Codex integration proposal, we suggest taking advantage of Codex CIDs to formally decouple archive index from archive data. + +## Proposed Integration with Codex + +First we propose changing the `WakuMessageArchiveIndexMetadata` type in the following direction. Instead of the `offset`, `size`, and `padding`, we suggest to refer to an archive by a Codex CID. Thus, instead of: + +```go +type WakuMessageArchiveIndexMetadata struct { + Metadata *WakuMessageArchiveMetadata + Offset uint64 + Size uint64 + Padding uint64 +} +``` + +we would have something like: + +```go +type WakuMessageArchiveIndexMetadata struct { + Metadata *WakuMessageArchiveMetadata + Cid CodexCid +} +``` + +We then upload the resulting `index` to Codex under its own `index` CID. Instead of the magnet link, the community owner only publishes this `index` CID. + +In order to receive the historical messages for the given period (given by `from` and `to` in the `WakuMessageArchiveMetadata`), the receiving node first acquires the `index` using the `index` CID. For each entry in the `index` that the node has interest in, the node then downloads the corresponding archive directly using the `Cid` from this `index` entry. + +The diagram below shows the relationship between the new `index` identified by a Codex CID that uses individual CIDs to refer to each individual archive: + +![[team-nl-br-design-3.svg]] + +### Advantages + +- clean and elegant solution - easier to maintain the archive(s) and the index, +- no dependency on the internals of the low level protocol used (like `padding`, `pieceLength`) - just nice and clean CIDs, +- reusing existing Codex protocol, no need to extend, +- Codex takes care for storage: no more `index` and `data` files: thus more reliable and less error prone. + +### Disadvantages + +- Because each archive receives its own CID which will to be announced on DHT. If this is considered problem, we may apply bundling, or using block ranges and publish the whole `data` under its own CID. Although less elegant, it still nicely decouples `index` from the `data`, but in this case we may need to expose an API to retrieve specific block index under given `treeCid`. + +## Deployment + +In the first prototype, we suggest to use Codex API in order to validate the idea and discover potential design flows early. After successful PoC, or already in parallel, we suggest building a Codex protocol library (stripped down from EC and marketplace), which will then be used to create GO bindings for the status-go integration. The same library should than also be used in the new Codex client. + +## Long Term Durability Support + +The current proposal builds on Codex and it will naturally scale towards adding stronger durability requirements with Codex Marketplace (and Erasure Coding). We consider this a long term path. In a mid-term, we consider increasing the level of durability by applying some of the element already captured in Ben's [Constellations](https://github.com/benbierens/constellations) + +- 1 unchanging ID per community +- Taking care of CID dissemination +- Rough health metrics +- Owner/admin controls +- Useful for more projects than Status + diff --git a/10 Notes/Unclarity about Waku filters and topics.md b/10 Notes/Unclarity about Waku filters and topics.md new file mode 100644 index 0000000..5d3e1e2 --- /dev/null +++ b/10 Notes/Unclarity about Waku filters and topics.md @@ -0,0 +1,71 @@ +This is the definition of the `ChatFilter` type: + +```go +type ChatFilter struct { + chatID string + filterID string + identity string + pubsubTopic string + contentTopic ContentTopic + discovery bool + negotiated bool + listen bool + ephemeral bool + priority uint64 +} +``` + +For each community, we can have a number of filters. This is how we get them. + +```go +func (m *ArchiveManager) GetCommunityChatsFilters(communityID types.HexBytes) (messagingtypes.ChatFilters, error) { + chatIDs, err := m.persistence.GetCommunityChatIDs(communityID) + if err != nil { + return nil, err + } + + filters := messagingtypes.ChatFilters{} + for _, cid := range chatIDs { + filter := m.messaging.ChatFilterByChatID(cid) + if filter != nil { + filters = append(filters, filter) + } + } + return filters, nil +} +``` + +Perhaps simplifying too much, a *filter* is basically a reference to a waku pubsub channel where the messages can be posted/received: all messages for all chats in that community. This seems to be related to [[Universal Topic Optimization in Waku (AI)]]. + +What is associated with a filter is a `contentTopic` and the filters are used to make sure we later get all relevant community messages. But here we get a lot of strange inconsistencies. First, if there suppose to be a single universal topic for the community, why do we still have multiple filters: + +```go +filters, err := m.archiveManager.GetCommunityChatsFilters(c.ID()) +if err != nil { + m.logger.Error("failed to get community chats filters for community", zap.Error(err)) + continue +} + +if len(filters) == 0 { + m.logger.Debug("no filters or chats for this community starting interval", zap.String("id", c.IDString())) + go m.archiveManager.StartHistoryArchiveTasksInterval(c, messageArchiveInterval) + continue +} +``` + +The why the universal filter is only included later, and never mapped to the corresponding topics? + +```go +topics := []messagingtypes.ContentTopic{} + +for _, filter := range filters { + topics = append(topics, filter.ContentTopic()) +} + +filter := m.messaging.ChatFilterByChatID(c.UniversalChatID()) +if filter != nil { + filters = append(filters, filter) +} +``` + +It is kind of crucial, because the topics are effectively used to get the messages in [GetWakuMessagesByFilterTopic](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive_file.go#L125) (check the body of this function [here](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/persistence.go#L967-L1000)). diff --git a/10 Notes/Universal Topic Optimization in Waku (AI).md b/10 Notes/Universal Topic Optimization in Waku (AI).md new file mode 100644 index 0000000..2836924 --- /dev/null +++ b/10 Notes/Universal Topic Optimization in Waku (AI).md @@ -0,0 +1,86 @@ +There is [a comment in the code base](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/community.go#L1584-L1589): + +```go +// Using Member updates channelID as chatID to act as a universal content-topic +// for all chats in the community as explained here +// https://forum.vac.dev/t/status-communities-review-and-proposed-usage-of-waku-content-topics/335 +``` + +See: [https://forum.vac.dev/t/status-communities-review-and-proposed-usage-of-waku-content-topics/335](https://forum.vac.dev/t/status-communities-review-and-proposed-usage-of-waku-content-topics/335) + +This comment refers to a **universal topic optimization** that Status implemented to improve efficiency in the Waku messaging protocol. Let me explain how this relates to Waku: + +### What is a ContentTopic in Waku? + +In Waku, a **ContentTopic** is like a messaging channel identifier - it's a 4-byte value that tells Waku which messages are intended for which application features. Think of it as the "address" where specific types of messages should be delivered. + +From the code I found, here's how ContentTopic works: + +```go +// From messaging/waku/common/topic.go +func (t TopicType) ContentTopic() string { + enc := hexutil.Encode(t[:]) + return "/waku/1/" + enc + "/rfc26" +} +``` + +This creates a topic like `/waku/1/0x12345678/rfc26` where `0x12345678` is the 4-byte topic. + +### The Universal Topic Optimization + +Originally, you might expect each community chat to have its own unique ContentTopic: +- `#general` → ContentTopic `0x12345678` +- `#random` → ContentTopic `0x87654321` +- `#dev` → ContentTopic `0xabcdef12` + +But Status implemented a **universal topic optimization** where all chats in a community share the **same ContentTopic**. Here's how: + +```go +// From protocol/communities/community.go lines 1584-1588 +func (o *Community) UniversalChatID() string { + // Using Member updates channelID as chatID to act as a universal content-topic + // for all chats in the community as explained here + // https://forum.vac.dev/t/status-communities-review-and-proposed-usage-of-waku-content-topics/335 + return o.MemberUpdateChannelID() +} + +func (o *Community) MemberUpdateChannelID() string { + return o.IDString() + "-memberUpdate" +} +``` + +So instead of separate topics, **all community chats** use the same ContentTopic: `{communityID}-memberUpdate`. + +### How This Works with Filters + +When you join a community, Status creates **one Filter** (subscription) that receives messages for **all channels** in that community: + +```go +// From messenger_community_chat_test.go +universalChatFilter := s.m.messaging.ChatFilterByChatID(community.UniversalChatID()) +``` + +This single filter subscribes to the universal ContentTopic, and **all messages** from all channels in the community flow through this one subscription. + +### Benefits of This Optimization + +1. **Fewer Network Subscriptions**: Instead of subscribing to N different ContentTopics (one per channel), you subscribe to just 1 +2. **Reduced Network Overhead**: Fewer pubsub subscriptions mean less network management +3. **Simplified Filter Management**: The FiltersManager only needs to track one filter per community instead of one per channel +4. **Better Message Delivery**: All community messages come through the same reliable channel + +### How Messages Are Distinguished + +Since all messages use the same ContentTopic, how does Status know which channel a message belongs to? The **message payload** contains the actual destination channel information. The universal topic is just for **transport optimization** - the application logic still correctly routes messages to the right channels. + +### Relation to Waku Protocol + +This optimization is specifically about how Status uses Waku's **pubsub topics and content filtering**: + +- **PubsubTopic**: The "physical" network topic (like a network shard) +- **ContentTopic**: The "logical" application channel (like an app feature) +- **Filter**: The subscription that tells Waku "I want messages from this ContentTopic" + +By using one ContentTopic for all community channels, Status reduces the load on Waku's **content filtering system** while maintaining the logical separation of channels at the application layer. + +This is a clever optimization that maintains user experience (separate channels) while improving network efficiency (shared transport). \ No newline at end of file diff --git a/10 Notes/What is Seeding (AI)?.md b/10 Notes/What is Seeding (AI)?.md new file mode 100644 index 0000000..4009648 --- /dev/null +++ b/10 Notes/What is Seeding (AI)?.md @@ -0,0 +1,154 @@ +Seeding is the BitTorrent process where a node that has complete archive files makes them available for other peers to download. In Status-go, this happens when: + +1. **Community control nodes** create new history archives +2. **Any node** successfully downloads archives from other peers + +## When Does Seeding Happen? + +### 1. **After Creating New Archives (Control Nodes Only)** + +In `SeedHistoryArchiveTorrent`, community control nodes seed archives after creating them: + +```go +func (m *ArchiveManager) SeedHistoryArchiveTorrent(communityID types.HexBytes) error { + m.UnseedHistoryArchiveTorrent(communityID) + + id := communityID.String() + torrentFile := torrentFile(m.torrentConfig.TorrentDir, id) + + metaInfo, err := metainfo.LoadFromFile(torrentFile) + if err != nil { + return err + } + + info, err := metaInfo.UnmarshalInfo() + if err != nil { + return err + } + + hash := metaInfo.HashInfoBytes() + m.torrentTasks[id] = hash + + if err != nil { + return err + } + + torrent, err := m.torrentClient.AddTorrent(metaInfo) + if err != nil { + return err + } + + torrent.DownloadAll() + + m.publisher.publish(&Subscription{ + HistoryArchivesSeedingSignal: &signal.HistoryArchivesSeedingSignal{ + CommunityID: communityID.String(), + }, + }) + + magnetLink := metaInfo.Magnet(nil, &info).String() + + m.logger.Debug("seeding torrent", zap.String("id", id), zap.String("magnetLink", magnetLink)) + return nil +} +``` + +This happens when: + +- **Periodic archiving**: Control nodes regularly create archives of community message history +- **Manual archiving**: When explicitly triggered through `InitHistoryArchiveTasks` + +### 2. **After Downloading Archives Successfully** + +In [DownloadHistoryArchivesByMagnetlink](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L486) around line 644, seeding starts after successful downloads: + +```go +// After downloading all archives +m.publisher.publish(&Subscription{ + HistoryArchivesSeedingSignal: &signal.HistoryArchivesSeedingSignal{ + CommunityID: communityID.String(), + }, +}) +``` + +This happens when: + +- **Regular members** download archives via magnetlinks +- **New community members** download historical messages +- **Nodes re-downloading** updated archives + +### 3. **Seeding Signal Processing** + +When seeding starts, it triggers magnetlink message distribution in `handleCommunitiesHistoryArchivesSubscription`: + +```go +if sub.HistoryArchivesSeedingSignal != nil { + // Signal UI that seeding started + m.config.messengerSignalsHandler.HistoryArchivesSeeding( + sub.HistoryArchivesSeedingSignal.CommunityID + ) + + // Get community info + c, err := m.communitiesManager.GetByIDString( + sub.HistoryArchivesSeedingSignal.CommunityID + ) + // Only control nodes send magnetlink messages + if c.IsControlNode() { + err := m.dispatchMagnetlinkMessage( + sub.HistoryArchivesSeedingSignal.CommunityID + ) + // This broadcasts the magnetlink to community members + } +} +``` + +## Seeding Lifecycle + +### **Start Seeding** + +1. Archives are created or downloaded successfully +2. `HistoryArchivesSeedingSignal` is published +3. BitTorrent client starts serving the files +4. Control nodes broadcast magnetlink messages + +### **Continue Seeding** + +- Files remain available as long as the node is online +- Other peers can download from multiple seeders simultaneously +- BitTorrent automatically manages upload bandwidth + +### **Stop Seeding** + +In `UnseedHistoryArchiveTorrent`: + +```go +func (m *ArchiveManager) UnseedHistoryArchiveTorrent(communityID types.HexBytes) { + // Remove torrent from client + torrent := m.torrentClient.Torrent(infoHash) + if torrent != nil { + torrent.Drop() + } + + // Publish unseeding signal + m.publisher.publish(&Subscription{ + HistoryArchivesUnseededSignal: &signal.HistoryArchivesUnseededSignal{ + CommunityID: communityID.String(), + }, + }) +} +``` + +This happens when: + +- **New archives replace old ones**: When fresher magnetlinks are received +- **Community leaves**: When a user leaves a community +- **Manual stop**: When archiving is disabled + +## Key Points + +- **Only control nodes send magnetlinks**, but **any node can seed** after downloading +- **Seeding is automatic** - happens immediately after successful archive creation or download +- **Multiple seeders improve availability** - BitTorrent's distributed nature means more seeders = better download speeds +- **Seeding triggers UI notifications** via `SendHistoryArchivesSeedin`. + +This distributed seeding model ensures that community history archives remain available even if the original control node goes offline, making the system resilient and scalable. diff --git a/10 Notes/When are magnetlink messages sent?.md b/10 Notes/When are magnetlink messages sent?.md new file mode 100644 index 0000000..c623800 --- /dev/null +++ b/10 Notes/When are magnetlink messages sent?.md @@ -0,0 +1,66 @@ +Magnetlink messages are sent when a community's control node (the community owner) finishes seeding history archives. Here's the complete flow: + +### 1. **Triggering Event: Archive Seeding Completion** + +Magnetlink messages are sent when a `HistoryArchivesSeedingSignal` is triggered. This happens in two scenarios: + +1. **After Creating New Archives**: In [SeedHistoryArchiveTorrent](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L408) around line 438, when the control node finishes creating and starts seeding new history archives. + +2. **After Downloading Archives**: In [DownloadHistoryArchivesByMagnetlink](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L486) around line 645, when archives are successfully downloaded and seeding begins. +### 2. **Message Dispatch Logic** + +The actual sending happens in `handleCommunitiesHistoryArchivesSubscription` at lines 246-259: + +```go +if sub.HistoryArchivesSeedingSignal != nil { + m.config.messengerSignalsHandler.HistoryArchivesSeeding( + sub.HistoryArchivesSeedingSignal.CommunityID + ) + c, err := m.communitiesManager.GetByIDString( + sub.HistoryArchivesSeedingSignal.CommunityID + ) + if err != nil { + m.logger.Debug( + "failed to retrieve community by id string", + zap.Error(err) + ) + } + if c.IsControlNode() { + err := m.dispatchMagnetlinkMessage( + sub.HistoryArchivesSeedingSignal.CommunityID + ) + if err != nil { + m.logger.Debug( + "failed to dispatch magnetlink message", + zap.Error(err) + ) + } + } +} +``` + +### 3. **Key Conditions** + +- **Only Control Nodes**: Only the community owner can send magnetlink messages +- **After Seeding**: Messages are only sent after archives are successfully seeded and available for download + +### 4. **Message Creation and Sending** + +The `dispatchMagnetlinkMessage` function (lines 4093-4138): + +1. **Gets the magnetlink**: Calls `m.archiveManager.GetHistoryArchiveMagnetlink(community.ID())` to generate the magnetlink from the torrent file +2. **Creates the message**: Builds a `CommunityMessageArchiveMagnetlink` protobuf message with current timestamp and magnetlink URI +3. **Sends publicly**: Broadcasts the message to the community's magnetlink channel using `m.messaging.SendPublic()` +4. **Updates clocks**: Updates both the community description and magnetlink message clocks + +### 5. **Message Content** + +The magnetlink message contains: + +- **Clock**: Current timestamp +- **MagnetUri**: The BitTorrent magnetlink for downloading the archives +- **Message Type**: `COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` + +### Summary + +Magnetlink messages are sent **automatically by community control nodes whenever they finish seeding new history archives**. This ensures that community members are immediately notified when new archive data becomes available for download via BitTorrent, enabling efficient peer-to-peer distribution of community message history. diff --git a/90 Extras/92 Assets/team-nl-br-design-1.svg b/90 Extras/92 Assets/team-nl-br-design-1.svg new file mode 100644 index 0000000..ba0817b --- /dev/null +++ b/90 Extras/92 Assets/team-nl-br-design-1.svg @@ -0,0 +1,6 @@ + + +From: uint64 # unix timestampTo: uint64 # unix timestampContentTopic: [][]byte # Waku ContentTopicWakuMessageArchiveMetadataSig []byteTimestamp uint64Topic []bytePayload []bytePadding []byteHash []byteThirdPartyId stringWakuMessagewakuMessageArchiveMessagesMetadatawakuMessage #0wakuMessage #1wakuMessage #NMessage ChunkmaxSize ≤ 30MBmaxSize ≤ 30MBMessagewakuMessageArchiveIndexArchivesMetadataOffset uint64Size uint64Padding uint64HASHMetadataOffset uint64Size uint64Padding uint64HASH \ No newline at end of file diff --git a/90 Extras/92 Assets/team-nl-br-design-2.svg b/90 Extras/92 Assets/team-nl-br-design-2.svg new file mode 100644 index 0000000..766d2a0 --- /dev/null +++ b/90 Extras/92 Assets/team-nl-br-design-2.svg @@ -0,0 +1,5 @@ + + +dataindexwakuMessageArchiveIndexArchivesMetadataOffset uint64Size uint64Padding uint64HASHMetadataOffset uint64Size uint64Padding uint64HASHArchiveMetadataMessagesArchiveMetadataMessagesArchiveMetadataMessagesOffsetOffset{communityID}{communityID}.torrentindexdataMagnetLinkSHARE \ No newline at end of file diff --git a/90 Extras/92 Assets/team-nl-br-design-3.svg b/90 Extras/92 Assets/team-nl-br-design-3.svg new file mode 100644 index 0000000..afe9a41 --- /dev/null +++ b/90 Extras/92 Assets/team-nl-br-design-3.svg @@ -0,0 +1,5 @@ + + +CodexCidCodexCidArchiveMetadataMessagesCodex CIDArchiveMetadataMessagesCodex CIDArchiveMetadataMessagesCodex CIDindexwakuMessageArchiveIndexArchivesMetadataCodexCid CidHASHMetadataCodexCid CidHASHCodex CIDSHARE \ No newline at end of file From ab442f5533e12de49bcd2dd908cd206bf758fc00 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Fri, 22 Aug 2025 23:12:25 +0200 Subject: [PATCH 02/25] final updates in the team-nl-br proposal --- 10 Notes/Team-NLBR Solution Proposal.md | 12 ++++++++++-- 90 Extras/92 Assets/team-nl-br-design-4.svg | 5 +++++ 2 files changed, 15 insertions(+), 2 deletions(-) create mode 100644 90 Extras/92 Assets/team-nl-br-design-4.svg diff --git a/10 Notes/Team-NLBR Solution Proposal.md b/10 Notes/Team-NLBR Solution Proposal.md index 2a3c7f6..a2c8f1c 100644 --- a/10 Notes/Team-NLBR Solution Proposal.md +++ b/10 Notes/Team-NLBR Solution Proposal.md @@ -129,7 +129,7 @@ And then in the following diagram we show how the `index` and `data` files are p ## Archive Distribution and Download -All the nodes that want to restore the message history, first need to retrieve the `index` file. Here, the selective download of the selected files from the torrent is used. After having the index files, the nodes can find out which periods they need to retrieve. Using the `offset`, `size`, and `padding`, they use BitTorrent library, to selectively fetch only the torrent pieces that they need. In our Codex integration proposal, we suggest taking advantage of Codex CIDs to formally decouple archive index from archive data. +All the nodes that want to restore the message history, first need to retrieve the `index` file. Here, the selective download of the selected files from the torrent is used. After having the index files, the nodes can find out which periods they need to retrieve. Using the `offset`, `size`, and `padding`, they use BitTorrent library to selectively fetch only the torrent pieces that they need. In our Codex integration proposal, we suggest taking advantage of Codex CIDs to formally decouple archive index from archive data. ## Proposed Integration with Codex @@ -172,10 +172,18 @@ The diagram below shows the relationship between the new `index` identified by a - Because each archive receives its own CID which will to be announced on DHT. If this is considered problem, we may apply bundling, or using block ranges and publish the whole `data` under its own CID. Although less elegant, it still nicely decouples `index` from the `data`, but in this case we may need to expose an API to retrieve specific block index under given `treeCid`. -## Deployment +## Deployment and Codex Library In the first prototype, we suggest to use Codex API in order to validate the idea and discover potential design flows early. After successful PoC, or already in parallel, we suggest building a Codex protocol library (stripped down from EC and marketplace), which will then be used to create GO bindings for the status-go integration. The same library should than also be used in the new Codex client. +Creating the Codex library was not only long requested by IFT, but it also bring opportunity to rethink the system interfaces and work towards more modular, "plugable" design. In its first instance Codex library could be made of just the block-exchange protocol, discovery module (DHT), and *RepoStore* (block storage) - each of those could potentially be also separated into separate sub-libraries. By providing bindings for various programming languages, we can better stimulate community clients, our original Codex client being one of them. The illustration below shows a high-level overview of the composition and use of the Codex library. + +![[team-nl-br-design-4.svg]] + +## Changes required in the status-go client + +From the numerous code fragments presented above, we can already imagine the works that have to be done in status-go code base. As discussed above the general entry is the [InitHistoryArchiveTasks](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L3783), which will bring us to most of the other relevant changes, most importantly [CreateAndSeedHistoryArchive](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L314) and [createHistoryArchiveTorrent](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive_file.go#L55). We expect most of the changes to be performed around [protocol/communities/manager_archive.go](https://github.com/status-im/status-go/blob/develop/protocol/communities/manager_archive.go) and [protocol/communities/manager_archive_file.go](https://github.com/status-im/status-go/blob/develop/protocol/communities/manager_archive_file.go). + ## Long Term Durability Support The current proposal builds on Codex and it will naturally scale towards adding stronger durability requirements with Codex Marketplace (and Erasure Coding). We consider this a long term path. In a mid-term, we consider increasing the level of durability by applying some of the element already captured in Ben's [Constellations](https://github.com/benbierens/constellations) diff --git a/90 Extras/92 Assets/team-nl-br-design-4.svg b/90 Extras/92 Assets/team-nl-br-design-4.svg new file mode 100644 index 0000000..505a187 --- /dev/null +++ b/90 Extras/92 Assets/team-nl-br-design-4.svg @@ -0,0 +1,5 @@ + + +CODEX(Block Exchange Engine)RepoStore(Storage)Discovery(DHT)BindingsBindingsRestAPICodex Client \ No newline at end of file From 8a301077c56a5953ae2edb0f96b5520e6f511413 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Thu, 28 Aug 2025 01:31:02 +0200 Subject: [PATCH 03/25] imports original community history spec --- 10 Notes/Community History Service Spec.md | 429 +++++++++++++++++++++ 1 file changed, 429 insertions(+) create mode 100644 10 Notes/Community History Service Spec.md diff --git a/10 Notes/Community History Service Spec.md b/10 Notes/Community History Service Spec.md new file mode 100644 index 0000000..1c9cc2d --- /dev/null +++ b/10 Notes/Community History Service Spec.md @@ -0,0 +1,429 @@ +## Abstract + +Messages are stored permanently by store nodes ([13/WAKU2-STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md)) for up to a certain configurable period of time, limited by the overall storage provided by a store node. Messages older than that period are no longer provided by store nodes, making it impossible for other nodes to request historical messages that go beyond that time range. This raises issues in the case of Status communities, where recently joined members of a community are not able to request complete message histories of the community channels. + +This specification describes how **Control Nodes** (which are specific nodes in Status communities) archive historical message data of their communities, beyond the time range limit provided by Store Nodes using the [BitTorrent](https://bittorrent.org) protocol. It also describes how the archives are distributed to community members via the Status network, so they can fetch them and gain access to a complete message history. + +## Terminology + +The following terminology is used throughout this specification. +Notice that some actors listed here are nodes that operate in Waku networks only, +while others operate in the Status communities layer): + +| Name | References | +| --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | +| Waku node | An Waku node ([10/WAKU2](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/10/waku2.md)) that implements [11/WAKU2-RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/11/relay.md) | +| Store node | A Waku node that implements [13/WAKU2-STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) | +| Waku network | A group of Waku nodes forming a graph, connected via [11/WAKU2-RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/11/relay.md) | +| Status user | An Status account that is used in a Status consumer product, such as Status Mobile or Status Desktop | +| Status node | A Status client run by a Status application | +| Control node | A Status node that owns the private key for a Status community | +| Community member | A Status user that is part of a Status community, not owning the private key of the community | +| Community member node | A Status node with message archive capabilities enabled, run by a community member | +| Live messages | Waku messages received through the Waku network | +| BitTorrent client | A program implementing the [BitTorrent](https://bittorrent.org) protocol | +| Torrent/Torrent file | A file containing metadata about data to be downloaded by BitTorrent clients | +| Magnet link | A link encoding the metadata provided by a torrent file ([Magnet URI scheme](https://en.wikipedia.org/wiki/Magnet_URI_scheme)) | + +## Requirements / Assumptions + +This specification has the following assumptions: + +- Store nodes, ([13/WAKU2-STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md)), are available 24/7 ensuring constant live message availability. +- The storage time range limit is 30 days. +- Store nodes have enough storage to persist historical messages for up to 30 days. +- No store nodes have storage to persist historical messages older than 30 days. +- All nodes are honest. +- The network is reliable. + +Furthermore, it assumes that: + +- Control nodes have enough storage to persist historical messages older than 30 days. +- Control nodes provide archives with historical messages **at least** every 30 days. +- Control nodes receive all community messages. +- Control nodes are honest. +- Control nodes know at least one store node from which it can query historical messages. + +These assumptions are less than ideal and will be enhanced in future work. +This [forum discussion](https://forum.vac.dev/t/status-communities-protocol-and-product-point-of-view/114) provides more details. + +## Overview + +The following is a high-level overview of the user flow and features this specification describes. For more detailed descriptions, read the dedicated sections in this specification. + +### Serving community history archives + +Control nodes go through the following (high level) process to provide community members with message histories: + +1. Community owner creates a Status community (previously known as [org channels](https://github.com/status-im/specs/pull/151)) which makes its node a Control node. +2. Community owner enables message archive capabilities (on by default but can be turned off as well - see [UI feature spec](https://github.com/status-im/feature-specs/pull/36)). +3. A special type of channel to exchange metadata about the archival data is created, this channel is not visible in the user interface. +4. Community owner invites community members. +5. Control node receives messages published in channels and stores them into a local database. +6. After 7 days, the control node exports and compresses last 7 days worth of messages from database and bundles it together with a [message archive index](#wakumessagearchiveindex) into a torrent, from which it then creates a magnet link ([Magnet URI scheme](https://en.wikipedia.org/wiki/Magnet_URI_scheme), [Extensions for Peers to Send Metadata Files](https://www.bittorrent.org/beps/bep_0009.html)). +7. Control node sends the magnet link created in step 6 to community members via special channel created in step 3 through the Waku network. +8. Every subsequent 7 days, steps 6 and 7 are repeated and the new message archive data is appended to the previously created message archive data. + +### Serving archives for missed messages + +If the control node goes offline (where "offline" means, the control node's main process is no longer running), it MUST go through the following process: + +1. Control node restarts +2. Control node requests messages from store nodes for the missed time range for all channels in their community +3. All missed messages are stored into control node's local message database +4. If 7 or more days have elapsed since the last message history torrent was created, the control node will perform step 6 and 7 of [Serving community history archives](#serving-community-history-archives) for every 7 days worth of messages in the missed time range (e.g. if the node was offline for 30 days, it will create 4 message history archives) + +### Receiving community history archives + +Community member nodes go through the following (high level) process to fetch and +restore community message histories: + +1. User joins community and becomes community member (see [org channels spec](https://github.com/vacp2p/rfc-index/blob/main/status/56/communities.md)) +2. By joining a community, member nodes automatically subscribe to special channel for message archive metadata exchange provided by the community +3. Member node requests live message history (last 30 days) of all the community channels, including the special channel from store nodes +4. Member node receives Waku message ([14/WAKU2-MESSAGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md)) that contains the metadata magnet link from the special channel +5. Member node extracts the magnet link from the Waku message and passes it to torrent client +6. Member node downloads [message archive index](#message-history-archive-index) file and determines which message archives are not downloaded yet (all or some) +7. Member node fetches missing message archive data via torrent +8. Member node unpacks and decompresses message archive data to then hydrate its local database, deleting any messages, for that community that the database previously stored in the same time range, as covered by the message history archive + +## Storing live messages + +For archival data serving, the control node MUST store live messages as [14/WAKU2-MESSAGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md). +This is in addition to their database of application messages. +This is required to provide confidentiality, authenticity, +and integrity of message data distributed via the BitTorrent layer, and +later validated by community members when they unpack message history archives. + +Control nodes SHOULD remove those messages from their local databases +once they are older than 30 days and after they have been turned into message archives and distributed to the BitTorrent network. + +### Exporting messages for bundling + +Control nodes export Waku messages from their local database for creating and +bundling history archives using the following criteria: + +- Waku messages to be exported MUST have a `contentTopic` that match any of the topics of the community channels +- Waku messages to be exported MUST have a `timestamp` that lies within a time range of 7 days + +The `timestamp` is determined by the context in which the control node attempts to create a message history archives as described below: + +1. The control node attempts to create an archive periodically for the past seven days (including the current day). In this case, the `timestamp` has to lie within those 7 days. +2. The control node has been offline (control node's main process has stopped and needs restart) and attempts to create archives for all the live messages it has missed since it went offline. In this case, the `timestamp` has to lie within the day the latest message was received and the current day. + +Exported messages MUST be restored as [14/WAKU2-MESSAGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md) for bundling. Waku messages that are older than 30 days and have been exported for bundling can be removed from the control node's database (control nodes still maintain a database of application messages). + +## Message history archives + +Message history archives are represented as `WakuMessageArchive` and +created from Waku messages exported from the local database. +Message history archives are implemented using the following protocol buffer. + +### WakuMessageHistoryArchive + +The `from` field SHOULD contain a timestamp of the time range's lower bound. +The type parallels the `timestamp` of [WakuMessage](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md). + +The `to` field SHOULD contain a timestamp of the time range's the higher bound. + +The `contentTopic` field MUST contain a list of all communiity channel topics. + +The `messages` field MUST contain all messages that belong into the archive +given its `from`, `to` and `contentTopic` fields. + +The `padding` field MUST contain the amount of zero bytes needed so +that the overall byte size of the protobuf encoded `WakuMessageArchive` +is a multiple of the `pieceLength` used to divide the message archive data into pieces. +This is needed for seamless encoding and +decoding of archival data in interation with BitTorrent, +as explained in [creating message archive torrents](#creating-message-archive-torrents). + +```protobuf +syntax = "proto3" + +message WakuMessageArchiveMetadata { + uint8 version = 1 + uint64 from = 2 + uint64 to = 3 + repeated string contentTopic = 4 +} + +message WakuMessageArchive { + uint8 version = 1 + WakuMessageArchiveMetadata metadata = 2 + repeated WakuMessage messages = 3 // `WakuMessage` is provided by 14/WAKU2-MESSAGE + bytes padding = 4 +} +``` + +## Message History Archive Index + +Control nodes MUST provide message archives for the entire community history. +The entirey history consists of a set of `WakuMessageArchive`'s +where each archive contains a subset of historical `WakuMessage`s for a time range of seven days. All the `WakuMessageArchive`s are concatenated into a single file as a byte string (see [Ensuring reproducible data pieces](#ensuring-reproducible-data-pieces)). + +Control nodes MUST create a message history archive index +(`WakuMessageArchiveIndex`) with metadata that allows receiving nodes +to only fetch the message history archives they are interested in. + +### WakuMessageArchiveIndex + +A `WakuMessageArchiveIndex` is a map where the key is the KECCAK-256 hash of +the `WakuMessageArchiveIndexMetadata` derived from a 7-day archive and +the value is an instance of that `WakuMessageArchiveIndexMetadata` +corresponding to that archive. + +The `offset` field MUST contain the position at which the message history archive +starts in the byte string of the total message archive data. +This MUST be the sum of the length of all previously created message archives +in bytes (see [Creating message archive torrents](#creating-message-archive-torrents)). + +```protobuf +syntax = "proto3" + +message WakuMessageArchiveIndexMetadata { + uint8 version = 1 + WakuMessageArchiveMetadata metadata = 2 + uint64 offset = 3 + uint64 num_pieces = 4 +} + +message WakuMessageArchiveIndex { + map archives = 1 +} +``` + +The control node MUST update the `WakuMessageArchiveIndex` +every time it creates one or +more `WakuMessageArchive`s and bundle it into a new torrent. +For every created `WakuMessageArchive`, +there MUST be a `WakuMessageArchiveIndexMetadata` entry in the `archives` field `WakuMessageArchiveIndex`. + +## Creating message archive torrents + +Control nodes MUST create a torrent file ("torrent") containing metadata to all message history archives. To create a torrent file, and later serve the message archive data in the BitTorrent network, control nodes MUST store the necessary data in dedicated files on the file system. + +A torrent's source folder MUST contain the following two files: + +- `data` - Contains all protobuf encoded `WakuMessageArchive`'s (as bit strings) concatenated in ascending order based on their time +- `index` - Contains the protobuf encoded `WakuMessageArchiveIndex` + +Control nodes SHOULD store these files in a dedicated folder that is identifiable, via the community id. + +### Ensuring reproducible data pieces + +The control node MUST ensure that the byte string resulting from +the protobuf encoded `data` is equal to the byte string `data` +from the previously generated message archive torrent, +plus the data of the latest 7 days worth of messages encoded as `WakuMessageArchive`. +Therefore, the size of `data` grows every seven days as it's append only. + +The control nodes also MUST ensure that the byte size of every individual `WakuMessageArchive` encoded protobuf is a multiple of `pieceLength: ???` (**TODO**) using the `padding` field. If the protobuf encoded `WakuMessageArchive` is not a multiple of `pieceLength`, its `padding` field MUST be filled with zero bytes and the `WakuMessageArchive` MUST be re-encoded until its size becomes multiple of `pieceLength`. + +This is necessary because the content of the `data` file +will be split into pieces of `pieceLength` when the torrent file is created, +and the SHA1 hash of every piece is then stored in the torrent file and +later used by other nodes to request the data for each individual data piece. + +By fitting message archives into a multiple of `pieceLength` and ensuring they fill possible remaining space with zero bytes, control nodes prevent the **next** message archive to occupy that remaining space of the last piece, which will result in a different SHA1 hash for that piece. + +#### **Example: Without padding** + +Let `WakuMessageArchive` "A1" be of size 20 bytes: + +```json + 0 11 22 33 44 55 66 77 88 99 +10 11 12 13 14 15 16 17 18 19 +``` + +With a `pieceLength` of 10 bytes, A1 will fit into `20 / 10 = 2` pieces: + +```json + 0 11 22 33 44 55 66 77 88 99 // piece[0] SHA1: 0x123 +10 11 12 13 14 15 16 17 18 19 // piece[1] SHA1: 0x456 +``` + +#### **Example: With padding** + +Let `WakuMessageArchive` "A2" be of size 21 bytes: + +```json + 0 11 22 33 44 55 66 77 88 99 +10 11 12 13 14 15 16 17 18 19 +20 +``` + +With a `pieceLength` of 10 bytes, A2 will fit into `21 / 10 = 2` pieces. +The remainder will introduce a third piece: + +```json + 0 11 22 33 44 55 66 77 88 99 // piece[0] SHA1: 0x123 +10 11 12 13 14 15 16 17 18 19 // piece[1] SHA1: 0x456 +20 // piece[2] SHA1: 0x789 +``` + +The next `WakuMessageArchive` "A3" will be appended ("#3") to the existing data +and occupy the remaining space of the third data piece. +The piece at index 2 will now produce a different SHA1 hash: + +```json + 0 11 22 33 44 55 66 77 88 99 // piece[0] SHA1: 0x123 +10 11 12 13 14 15 16 17 18 19 // piece[1] SHA1: 0x456 +20 #3 #3 #3 #3 #3 #3 #3 #3 #3 // piece[2] SHA1: 0xeef +#3 #3 #3 #3 #3 #3 #3 #3 #3 #3 // piece[3] +``` + +By filling up the remaining space of the third piece +with A2 using its `padding` field, + it is guaranteed that its SHA1 will stay the same: + +```json + 0 11 22 33 44 55 66 77 88 99 // piece[0] SHA1: 0x123 +10 11 12 13 14 15 16 17 18 19 // piece[1] SHA1: 0x456 +20 0 0 0 0 0 0 0 0 0 // piece[2] SHA1: 0x999 +#3 #3 #3 #3 #3 #3 #3 #3 #3 #3 // piece[3] +#3 #3 #3 #3 #3 #3 #3 #3 #3 #3 // piece[4] +``` + +### Seeding message history archives + +The control node MUST seed the [generated torrent](#creating-message-archive-torrents) until a new `WakuMessageArchive` is created. + +The control node SHOULD NOT seed torrents for older message history archives. +Only one torrent at a time should be seeded. + +### Creating magnet links + +Once a torrent file for all message archives is created, the control node MUST derive a magnet link following the [Magnet URI scheme](https://en.wikipedia.org/wiki/Magnet_URI_scheme) using the underlying BitTorrent protocol client. + +### Message archive distribution + +Message archives are available via the BitTorrent network as they are being [seeded by the control node](#seeding-message-history-archives). Other community member nodes will download the message archives from the BitTorrent network once they receive a magnet link that contains a message archive index. + +The control node MUST send magnet links containing message archives and +the message archive index to a special community channel. +The topic of that special channel follows the following format: + +```text +/{application-name}/{version-of-the-application}/{content-topic-name}/{encoding} +``` + +All messages sent with this topic MUST be instances of `ApplicationMetadataMessage` +([62/STATUS-PAYLOADS](https://github.com/vacp2p/rfc-index/blob/main/status/62/payloads.md)) with a `payload` of `CommunityMessageArchiveIndex`. + +Only the control node MAY post to the special channel. +Other messages on this specified channel MUST be ignored by clients. +Community members MUST NOT have permission to send messages to the special channel. +However, community member nodes MUST subscribe to special channel +to receive Waku messages containing magnet links for message archives. + +### Canonical message histories + +Only control nodes are allowed to distribute messages with magnet links via +the special channel for magnet link exchange. +Community members MUST NOT be allowed to post any messages to the special channel. + +Status nodes MUST ensure that any message +that isn't signed by the control node in the special channel is ignored. + +Since the magnet links are created from the control node's database +(and previously distributed archives), +the message history provided by the control node becomes the canonical message history +and single source of truth for the community. + +Community member nodes MUST replace messages in their local databases +with the messages extracted from archives within the same time range. +Messages that the control node didn't receive MUST be removed and +are no longer part of the message history of interest, +even if it already existed in a community member node's database. + +## Fetching message history archives + +Generally, fetching message history archives is a three step process: + +1. Receive [message archive index](#message-history-archive-index magnet link as described in [Message archive distribution], download `index` file from torrent, then determine which message archives to download +2. Download individual archives + +Community member nodes subscribe to the special channel +that control nodes publish magnet links for message history archives to. +There are two scenarios in which member nodes can receive such a magnet link message +from the special channel: + +1. The member node receives it via live messages, by listening to the special channel +2. The member node requests messages for a time range of up to 30 days from store nodes (this is the case when a new community member joins a community) + +### Downloading message archives + +When member nodes receive a message with a `CommunityMessageHistoryArchive` +([62/STATUS-PAYLOADS](https://github.com/vacp2p/rfc-index/blob/main/status/62/payloads.md)) from the aforementioned channnel, +they MUST extract the `magnet_uri` and +pass it to their underlying BitTorrent client +so they can fetch the latest message history archive index, +which is the `index` file of the torrent (see [Creating message archive torrents](#creating-message-archive-torrents)). + +Due to the nature of distributed systems, there's no guarantee that a received message is the "last" message. This is especially true when member nodes request historical messages from store nodes. + +Therefore, member nodes MUST wait for 20 seconds after receiving the last `CommunityMessageArchive` before they start extracting the magnet link to fetch the latest archive index. + +Once a message history archive index is downloaded and parsed back into `WakuMessageArchiveIndex`, community member nodes use a local lookup table to determine which of the listed archives are missing using the KECCAK-256 hashes stored in the index. + +For this lookup to work, member nodes MUST store the KECCAK-256 hashes of the `WakuMessageArchiveIndexMetadata` provided by the `index` file for all of the message history archives that have been downlaoded in their local database. + +Given a `WakuMessageArchiveIndex`, member nodes can access individual `WakuMessageArchiveIndexMetadata` to download individual archives. + +Community member nodes MUST choose one of the following options: + +1. **Download all archives** - Request and download all data pieces for `data` provided by the torrent (this is the case for new community member nodes that haven't downloaded any archives yet) +2. **Download only the latest archive** - Request and download all pieces starting at the `offset` of the latest `WakuMessageArchiveIndexMetadata` (this the case for any member node that already has downloaded all previous history and is now interested in only the latst archive) +3. **Download specific archives** - Look into `from` and `to` fields of every `WakuMessageArchiveIndexMetadata` and determine the pieces for archives of a specific time range (can be the case for member nodes that have recently joined the network and are only interested in a subset of the complete history) + +### Storing historical messages + +When message archives are fetched, community member nodes MUST unwrap the resulting `WakuMessage` instances into `ApplicationMetadataMessage` instances and store them in their local database. Community member nodes SHOULD NOT store the wrapped `WakuMessage` messages. + +All message within the same time range MUST be replaced with the messages provided by the message history archive. + +Community members nodes MUST ignore the expiration state of each archive message. + +## Considerations + +The following are things to consider when implementing this specification. + +## Control node honesty + +This spec assumes that all control nodes are honest and behave according to the spec. Meaning they don't inject their own messages into, or remove any messages from historic archives. + +## Bandwidth consumption + +Community member nodes will download the latest archive they've received from the archive index, which includes messages from the last seven days. Assuming that community members nodes were online for that time range, they have already downloaded that message data and will now download an archive that contains the same. + +This means there's a possibility member nodes will download the same data at least twice. + +## Multiple community owners + +It is possible for control nodes to export the private key of their owned community and pass it to other users so they become control nodes as well. This means, it's possible for multiple control nodes to exist. + +This might conflict with the assumption that the control node serves as a single source of truth. Multiple control nodes can have different message histories. + +Not only will multiple control nodes multiply the amount of archive index messages being distributed to the network, they might also contain different sets of magnet links and their corresponding hashes. + +Even if just a single message is missing in one of the histories, the hashes presented in archive indices will look completely different, resulting in the community member node to download the corresponding archive (which might be identical to an archive that was already downloaded, except for that one message). + +## Copyright + +Copyright and related rights waived via [CC0](https://creativecommons.org/publicdomain/zero/1.0/). + +## References + +- [13/WAKU2-STORE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/13/store.md) +- [BitTorrent](https://bittorrent.org) +- [10/WAKU2](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/10/waku2.md) +- [11/WAKU2-RELAY](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/11/relay.md) +- [Magnet URI scheme](https://en.wikipedia.org/wiki/Magnet_URI_scheme) +- [forum discussion](https://forum.vac.dev/t/status-communities-protocol-and-product-point-of-view/114) +- [org channels](https://github.com/status-im/specs/pull/151) +- [UI feature spec](https://github.com/status-im/feature-specs/pull/36) +- [Extensions for Peers to Send Metadata Files](https://www.bittorrent.org/beps/bep_0009.html) +- [org channels spec](https://github.com/vacp2p/rfc-index/blob/main/status/56/communities.md) +- [14/WAKU2-MESSAGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md) +- [62/STATUS-PAYLOADS](https://github.com/vacp2p/rfc-index/blob/main/status/62/payloads.md) \ No newline at end of file From 24e4e20477dd258d05efc0efbf4f907491a9d4ca Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Thu, 28 Aug 2025 01:50:58 +0200 Subject: [PATCH 04/25] fixes line feeds to make it readbale in Obsidian and HackMD --- 10 Notes/Community History Service Spec.md | 126 +++++---------------- 1 file changed, 30 insertions(+), 96 deletions(-) diff --git a/10 Notes/Community History Service Spec.md b/10 Notes/Community History Service Spec.md index 1c9cc2d..1f7abb6 100644 --- a/10 Notes/Community History Service Spec.md +++ b/10 Notes/Community History Service Spec.md @@ -6,9 +6,7 @@ This specification describes how **Control Nodes** (which are specific nodes in ## Terminology -The following terminology is used throughout this specification. -Notice that some actors listed here are nodes that operate in Waku networks only, -while others operate in the Status communities layer): +The following terminology is used throughout this specification. Notice that some actors listed here are nodes that operate in Waku networks only, while others operate in the Status communities layer): | Name | References | | --------------------- | ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------ | @@ -75,8 +73,7 @@ If the control node goes offline (where "offline" means, the control node's main ### Receiving community history archives -Community member nodes go through the following (high level) process to fetch and -restore community message histories: +Community member nodes go through the following (high level) process to fetch and restore community message histories: 1. User joins community and becomes community member (see [org channels spec](https://github.com/vacp2p/rfc-index/blob/main/status/56/communities.md)) 2. By joining a community, member nodes automatically subscribe to special channel for message archive metadata exchange provided by the community @@ -89,19 +86,13 @@ restore community message histories: ## Storing live messages -For archival data serving, the control node MUST store live messages as [14/WAKU2-MESSAGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md). -This is in addition to their database of application messages. -This is required to provide confidentiality, authenticity, -and integrity of message data distributed via the BitTorrent layer, and -later validated by community members when they unpack message history archives. +For archival data serving, the control node MUST store live messages as [14/WAKU2-MESSAGE](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md). This is in addition to their database of application messages. This is required to provide confidentiality, authenticity, and integrity of message data distributed via the BitTorrent layer, and later validated by community members when they unpack message history archives. -Control nodes SHOULD remove those messages from their local databases -once they are older than 30 days and after they have been turned into message archives and distributed to the BitTorrent network. +Control nodes SHOULD remove those messages from their local databases once they are older than 30 days and after they have been turned into message archives and distributed to the BitTorrent network. ### Exporting messages for bundling -Control nodes export Waku messages from their local database for creating and -bundling history archives using the following criteria: +Control nodes export Waku messages from their local database for creating and bundling history archives using the following criteria: - Waku messages to be exported MUST have a `contentTopic` that match any of the topics of the community channels - Waku messages to be exported MUST have a `timestamp` that lies within a time range of 7 days @@ -115,28 +106,19 @@ Exported messages MUST be restored as [14/WAKU2-MESSAGE](https://github.com/vacp ## Message history archives -Message history archives are represented as `WakuMessageArchive` and -created from Waku messages exported from the local database. -Message history archives are implemented using the following protocol buffer. +Message history archives are represented as `WakuMessageArchive` and created from Waku messages exported from the local database. Message history archives are implemented using the following protocol buffer. ### WakuMessageHistoryArchive -The `from` field SHOULD contain a timestamp of the time range's lower bound. -The type parallels the `timestamp` of [WakuMessage](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md). +The `from` field SHOULD contain a timestamp of the time range's lower bound. The type parallels the `timestamp` of [WakuMessage](https://github.com/vacp2p/rfc-index/blob/main/waku/standards/core/14/message.md). The `to` field SHOULD contain a timestamp of the time range's the higher bound. The `contentTopic` field MUST contain a list of all communiity channel topics. -The `messages` field MUST contain all messages that belong into the archive -given its `from`, `to` and `contentTopic` fields. +The `messages` field MUST contain all messages that belong into the archive given its `from`, `to` and `contentTopic` fields. -The `padding` field MUST contain the amount of zero bytes needed so -that the overall byte size of the protobuf encoded `WakuMessageArchive` -is a multiple of the `pieceLength` used to divide the message archive data into pieces. -This is needed for seamless encoding and -decoding of archival data in interation with BitTorrent, -as explained in [creating message archive torrents](#creating-message-archive-torrents). +The `padding` field MUST contain the amount of zero bytes needed so that the overall byte size of the protobuf encoded `WakuMessageArchive` is a multiple of the `pieceLength` used to divide the message archive data into pieces. This is needed for seamless encoding and decoding of archival data in interation with BitTorrent, as explained in [creating message archive torrents](#creating-message-archive-torrents). ```protobuf syntax = "proto3" @@ -158,25 +140,15 @@ message WakuMessageArchive { ## Message History Archive Index -Control nodes MUST provide message archives for the entire community history. -The entirey history consists of a set of `WakuMessageArchive`'s -where each archive contains a subset of historical `WakuMessage`s for a time range of seven days. All the `WakuMessageArchive`s are concatenated into a single file as a byte string (see [Ensuring reproducible data pieces](#ensuring-reproducible-data-pieces)). +Control nodes MUST provide message archives for the entire community history. The entirey history consists of a set of `WakuMessageArchive`'s where each archive contains a subset of historical `WakuMessage`s for a time range of seven days. All the `WakuMessageArchive`s are concatenated into a single file as a byte string (see [Ensuring reproducible data pieces](#ensuring-reproducible-data-pieces)). -Control nodes MUST create a message history archive index -(`WakuMessageArchiveIndex`) with metadata that allows receiving nodes -to only fetch the message history archives they are interested in. +Control nodes MUST create a message history archive index (`WakuMessageArchiveIndex`) with metadata that allows receiving nodes to only fetch the message history archives they are interested in. ### WakuMessageArchiveIndex -A `WakuMessageArchiveIndex` is a map where the key is the KECCAK-256 hash of -the `WakuMessageArchiveIndexMetadata` derived from a 7-day archive and -the value is an instance of that `WakuMessageArchiveIndexMetadata` -corresponding to that archive. +A `WakuMessageArchiveIndex` is a map where the key is the KECCAK-256 hash of the `WakuMessageArchiveIndexMetadata` derived from a 7-day archive and the value is an instance of that `WakuMessageArchiveIndexMetadata` corresponding to that archive. -The `offset` field MUST contain the position at which the message history archive -starts in the byte string of the total message archive data. -This MUST be the sum of the length of all previously created message archives -in bytes (see [Creating message archive torrents](#creating-message-archive-torrents)). +The `offset` field MUST contain the position at which the message history archive starts in the byte string of the total message archive data. This MUST be the sum of the length of all previously created message archives in bytes (see [Creating message archive torrents](#creating-message-archive-torrents)). ```protobuf syntax = "proto3" @@ -193,11 +165,7 @@ message WakuMessageArchiveIndex { } ``` -The control node MUST update the `WakuMessageArchiveIndex` -every time it creates one or -more `WakuMessageArchive`s and bundle it into a new torrent. -For every created `WakuMessageArchive`, -there MUST be a `WakuMessageArchiveIndexMetadata` entry in the `archives` field `WakuMessageArchiveIndex`. +The control node MUST update the `WakuMessageArchiveIndex` every time it creates one or more `WakuMessageArchive`s and bundle it into a new torrent. For every created `WakuMessageArchive`, there MUST be a `WakuMessageArchiveIndexMetadata` entry in the `archives` field `WakuMessageArchiveIndex`. ## Creating message archive torrents @@ -212,18 +180,11 @@ Control nodes SHOULD store these files in a dedicated folder that is identifiabl ### Ensuring reproducible data pieces -The control node MUST ensure that the byte string resulting from -the protobuf encoded `data` is equal to the byte string `data` -from the previously generated message archive torrent, -plus the data of the latest 7 days worth of messages encoded as `WakuMessageArchive`. -Therefore, the size of `data` grows every seven days as it's append only. +The control node MUST ensure that the byte string resulting from the protobuf encoded `data` is equal to the byte string `data` from the previously generated message archive torrent, plus the data of the latest 7 days worth of messages encoded as `WakuMessageArchive`. Therefore, the size of `data` grows every seven days as it's append only. The control nodes also MUST ensure that the byte size of every individual `WakuMessageArchive` encoded protobuf is a multiple of `pieceLength: ???` (**TODO**) using the `padding` field. If the protobuf encoded `WakuMessageArchive` is not a multiple of `pieceLength`, its `padding` field MUST be filled with zero bytes and the `WakuMessageArchive` MUST be re-encoded until its size becomes multiple of `pieceLength`. -This is necessary because the content of the `data` file -will be split into pieces of `pieceLength` when the torrent file is created, -and the SHA1 hash of every piece is then stored in the torrent file and -later used by other nodes to request the data for each individual data piece. +This is necessary because the content of the `data` file will be split into pieces of `pieceLength` when the torrent file is created, and the SHA1 hash of every piece is then stored in the torrent file and later used by other nodes to request the data for each individual data piece. By fitting message archives into a multiple of `pieceLength` and ensuring they fill possible remaining space with zero bytes, control nodes prevent the **next** message archive to occupy that remaining space of the last piece, which will result in a different SHA1 hash for that piece. @@ -254,6 +215,7 @@ Let `WakuMessageArchive` "A2" be of size 21 bytes: ``` With a `pieceLength` of 10 bytes, A2 will fit into `21 / 10 = 2` pieces. + The remainder will introduce a third piece: ```json @@ -262,8 +224,8 @@ The remainder will introduce a third piece: 20 // piece[2] SHA1: 0x789 ``` -The next `WakuMessageArchive` "A3" will be appended ("#3") to the existing data -and occupy the remaining space of the third data piece. +The next `WakuMessageArchive` "A3" will be appended ("#3") to the existing data and occupy the remaining space of the third data piece. + The piece at index 2 will now produce a different SHA1 hash: ```json @@ -273,9 +235,7 @@ The piece at index 2 will now produce a different SHA1 hash: #3 #3 #3 #3 #3 #3 #3 #3 #3 #3 // piece[3] ``` -By filling up the remaining space of the third piece -with A2 using its `padding` field, - it is guaranteed that its SHA1 will stay the same: +By filling up the remaining space of the third piece with A2 using its `padding` field, it is guaranteed that its SHA1 will stay the same: ```json 0 11 22 33 44 55 66 77 88 99 // piece[0] SHA1: 0x123 @@ -289,8 +249,7 @@ with A2 using its `padding` field, The control node MUST seed the [generated torrent](#creating-message-archive-torrents) until a new `WakuMessageArchive` is created. -The control node SHOULD NOT seed torrents for older message history archives. -Only one torrent at a time should be seeded. +The control node SHOULD NOT seed torrents for older message history archives. Only one torrent at a time should be seeded. ### Creating magnet links @@ -300,42 +259,25 @@ Once a torrent file for all message archives is created, the control node MUST d Message archives are available via the BitTorrent network as they are being [seeded by the control node](#seeding-message-history-archives). Other community member nodes will download the message archives from the BitTorrent network once they receive a magnet link that contains a message archive index. -The control node MUST send magnet links containing message archives and -the message archive index to a special community channel. -The topic of that special channel follows the following format: +The control node MUST send magnet links containing message archives and the message archive index to a special community channel. The topic of that special channel follows the following format: ```text /{application-name}/{version-of-the-application}/{content-topic-name}/{encoding} ``` -All messages sent with this topic MUST be instances of `ApplicationMetadataMessage` -([62/STATUS-PAYLOADS](https://github.com/vacp2p/rfc-index/blob/main/status/62/payloads.md)) with a `payload` of `CommunityMessageArchiveIndex`. +All messages sent with this topic MUST be instances of `ApplicationMetadataMessage` ([62/STATUS-PAYLOADS](https://github.com/vacp2p/rfc-index/blob/main/status/62/payloads.md)) with a `payload` of `CommunityMessageArchiveIndex`. -Only the control node MAY post to the special channel. -Other messages on this specified channel MUST be ignored by clients. -Community members MUST NOT have permission to send messages to the special channel. -However, community member nodes MUST subscribe to special channel -to receive Waku messages containing magnet links for message archives. +Only the control node MAY post to the special channel. Other messages on this specified channel MUST be ignored by clients. Community members MUST NOT have permission to send messages to the special channel. However, community member nodes MUST subscribe to special channel to receive Waku messages containing magnet links for message archives. ### Canonical message histories -Only control nodes are allowed to distribute messages with magnet links via -the special channel for magnet link exchange. -Community members MUST NOT be allowed to post any messages to the special channel. +Only control nodes are allowed to distribute messages with magnet links via the special channel for magnet link exchange. Community members MUST NOT be allowed to post any messages to the special channel. -Status nodes MUST ensure that any message -that isn't signed by the control node in the special channel is ignored. +Status nodes MUST ensure that any message that isn't signed by the control node in the special channel is ignored. -Since the magnet links are created from the control node's database -(and previously distributed archives), -the message history provided by the control node becomes the canonical message history -and single source of truth for the community. +Since the magnet links are created from the control node's database (and previously distributed archives), the message history provided by the control node becomes the canonical message history and single source of truth for the community. -Community member nodes MUST replace messages in their local databases -with the messages extracted from archives within the same time range. -Messages that the control node didn't receive MUST be removed and -are no longer part of the message history of interest, -even if it already existed in a community member node's database. +Community member nodes MUST replace messages in their local databases with the messages extracted from archives within the same time range. Messages that the control node didn't receive MUST be removed and are no longer part of the message history of interest, even if it already existed in a community member node's database. ## Fetching message history archives @@ -344,22 +286,14 @@ Generally, fetching message history archives is a three step process: 1. Receive [message archive index](#message-history-archive-index magnet link as described in [Message archive distribution], download `index` file from torrent, then determine which message archives to download 2. Download individual archives -Community member nodes subscribe to the special channel -that control nodes publish magnet links for message history archives to. -There are two scenarios in which member nodes can receive such a magnet link message -from the special channel: +Community member nodes subscribe to the special channel that control nodes publish magnet links for message history archives to. There are two scenarios in which member nodes can receive such a magnet link message from the special channel: 1. The member node receives it via live messages, by listening to the special channel 2. The member node requests messages for a time range of up to 30 days from store nodes (this is the case when a new community member joins a community) ### Downloading message archives -When member nodes receive a message with a `CommunityMessageHistoryArchive` -([62/STATUS-PAYLOADS](https://github.com/vacp2p/rfc-index/blob/main/status/62/payloads.md)) from the aforementioned channnel, -they MUST extract the `magnet_uri` and -pass it to their underlying BitTorrent client -so they can fetch the latest message history archive index, -which is the `index` file of the torrent (see [Creating message archive torrents](#creating-message-archive-torrents)). +When member nodes receive a message with a `CommunityMessageHistoryArchive` ([62/STATUS-PAYLOADS](https://github.com/vacp2p/rfc-index/blob/main/status/62/payloads.md)) from the aforementioned channnel, they MUST extract the `magnet_uri` and pass it to their underlying BitTorrent client so they can fetch the latest message history archive index, which is the `index` file of the torrent (see [Creating message archive torrents](#creating-message-archive-torrents)). Due to the nature of distributed systems, there's no guarantee that a received message is the "last" message. This is especially true when member nodes request historical messages from store nodes. From 222a5d4333010c7b0f3e7129ae1e99529b9e3149 Mon Sep 17 00:00:00 2001 From: HackMD <37423+hackmd-hub[bot]@users.noreply.github.com> Date: Thu, 28 Aug 2025 00:05:11 +0000 Subject: [PATCH 05/25] fixed a typo via HackMD --- 10 Notes/Community History Service Spec.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/10 Notes/Community History Service Spec.md b/10 Notes/Community History Service Spec.md index 1f7abb6..5ded3c6 100644 --- a/10 Notes/Community History Service Spec.md +++ b/10 Notes/Community History Service Spec.md @@ -308,7 +308,7 @@ Given a `WakuMessageArchiveIndex`, member nodes can access individual `WakuMessa Community member nodes MUST choose one of the following options: 1. **Download all archives** - Request and download all data pieces for `data` provided by the torrent (this is the case for new community member nodes that haven't downloaded any archives yet) -2. **Download only the latest archive** - Request and download all pieces starting at the `offset` of the latest `WakuMessageArchiveIndexMetadata` (this the case for any member node that already has downloaded all previous history and is now interested in only the latst archive) +2. **Download only the latest archive** - Request and download all pieces starting at the `offset` of the latest `WakuMessageArchiveIndexMetadata` (this is the case for any member node that already has downloaded all previous history and is now interested in only the latst archive) 3. **Download specific archives** - Look into `from` and `to` fields of every `WakuMessageArchiveIndexMetadata` and determine the pieces for archives of a specific time range (can be the case for member nodes that have recently joined the network and are only interested in a subset of the complete history) ### Storing historical messages From e789d7a6b1a692922bd05712819e0b20e7861e62 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Tue, 9 Sep 2025 05:42:45 +0200 Subject: [PATCH 06/25] updates naming (removing "?" characters from the titles) --- 10 Notes/Team-NLBR Solution Proposal.md | 2 +- 10 Notes/{What is Seeding (AI)?.md => What is Seeding (AI).md} | 0 ...k messages sent?.md => When are magnetlink messages sent.md} | 0 3 files changed, 1 insertion(+), 1 deletion(-) rename 10 Notes/{What is Seeding (AI)?.md => What is Seeding (AI).md} (100%) rename 10 Notes/{When are magnetlink messages sent?.md => When are magnetlink messages sent.md} (100%) diff --git a/10 Notes/Team-NLBR Solution Proposal.md b/10 Notes/Team-NLBR Solution Proposal.md index a2c8f1c..fc87728 100644 --- a/10 Notes/Team-NLBR Solution Proposal.md +++ b/10 Notes/Team-NLBR Solution Proposal.md @@ -39,7 +39,7 @@ The function somehow central to the Archive creation is [InitHistoryArchiveTasks In `InitHistoryArchiveTasks`, for each community with `HistoryArchiveSupportEnabled` option set to `true`: -- if community torrent file already exists: call [ArchiveManager.SeedHistoryArchiveTorrent](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L408) - see also [[What is Seeding (AI)?]] and [[When are magnetlink messages sent?]]. +- if community torrent file already exists: call [ArchiveManager.SeedHistoryArchiveTorrent](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L408) - see also [[What is Seeding (AI)]] and [[When are magnetlink messages sent]]. - determine if new archives need to be created based on the last archive end date and call [CreateAndSeedHistoryArchive](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L314) - starts periodic archive creation task by calling [StartHistoryArchiveTasksInterval](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L323), which will in turn call [CreateAndSeedHistoryArchive](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/manager_archive.go#L314). diff --git a/10 Notes/What is Seeding (AI)?.md b/10 Notes/What is Seeding (AI).md similarity index 100% rename from 10 Notes/What is Seeding (AI)?.md rename to 10 Notes/What is Seeding (AI).md diff --git a/10 Notes/When are magnetlink messages sent?.md b/10 Notes/When are magnetlink messages sent.md similarity index 100% rename from 10 Notes/When are magnetlink messages sent?.md rename to 10 Notes/When are magnetlink messages sent.md From 54e98b724e945085a02c5136c94c5c9e19340079 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 15 Sep 2025 04:32:55 +0200 Subject: [PATCH 07/25] Adds documention on running functional tests --- ...Running functional tests in development.md | 232 ++++++++++++++++++ .../92 Assets/Pasted image 20250911204521.png | Bin 0 -> 657421 bytes 2 files changed, 232 insertions(+) create mode 100644 10 Notes/Running functional tests in development.md create mode 100644 90 Extras/92 Assets/Pasted image 20250911204521.png diff --git a/10 Notes/Running functional tests in development.md b/10 Notes/Running functional tests in development.md new file mode 100644 index 0000000..cd5d7b5 --- /dev/null +++ b/10 Notes/Running functional tests in development.md @@ -0,0 +1,232 @@ +Here I am documenting how to run the functional tests for status go. There are not the primary focus of the status-go-codex integration, but they let us to understand the dev env and the build system better in general. I am first presenting the step-by-step instructions to run everything manually from the command line, but because it is quite a lot of details, you may skip ahead to [[#Using development scripts to run the functional tests]] and study the scripts if you want to learn the details. + +> I performed all those tests on Arch Linux ([Omarchy](https://omarchy.org/) distribution). + +### Step by step instructions to run functional tests manually without a script + +First, some helpers regarding namings: + +```bash +# identifier +$ git rev-parse --short HEAD +c827909c8 +# project_name +$ echo "status-go-func-tests-$(git rev-parse --short HEAD)" +status-go-func-tests-c827909c8 +# image_name +$ echo "statusgo-$(git rev-parse --short HEAD)" +statusgo-c827909c8 +``` + +If you do not have the pyenv in place, create one with: + +```bash +python3 -m venv "./tests-functional/.venv" +``` + +and then always make sure it is activated: + +```bash +source "./tests-functional/.venv/bin/activate" +``` + +To check if you are in a venv, you can use: + +```bash +$ echo $VIRTUAL_ENV +/home/mc2/code/status-im/status-go/tests-functional/.venv +``` + +Then make sure the dependencies are in place - you do not need to do this if you did it already and you did not introduce any new python dependencies - it does not harm to do though and it runs instantly: + +```bash +pip install --upgrade pip && pip install -r "./tests-functional/requirements.txt" +``` + +Now, if you did not before, make sure you have built status-go docker image. From status-go repo root folder: + +``` +docker build . \ + --build-arg "build_tags='gowaku_no_rln'" \ + --build-arg "enable_go_cache=false" \ + --tag "statusgo-$(git rev-parse --short HEAD)" +``` + +This, image will be used during the tests. + +I normally like to make sure I have no old related containers and networks running, before starting a new session: + +```bash +docker ps -a --filter "status-go-func-tests-$(git rev-parse --short HEAD)" -q | xargs -r docker rm -f && \ +(docker network rm "status-go-func-tests-$(git rev-parse --short HEAD)_default" 2>/dev/null || true) +``` + +Above I make sure, I ignore the error when the network does not exist. + +Now, we also need to start foundry, anvil, and the waku node. We do not not need to build custom image for that. Just run docker compose as follows: + +```bash +docker compose -p "status-go-func-tests-$(git rev-parse --short HEAD)" \ + -f "./tests-functional/docker-compose.anvil.yml" \ + -f "./tests-functional/docker-compose.waku.yml" \ + up -d --build --remove-orphans +``` + +or as a one liner: + +```bash +docker compose -p "status-go-func-tests-$(git rev-parse --short HEAD)" -f tests-functional/docker-compose.anvil.yml -f tests-functional/docker-compose.waku.yml up -d --build --remove-orphans +``` + +You will have the following containers running: + +![[Pasted image 20250911204521.png]] + +Now, with everything in place, we can run the tests: + +```bash +pytest --reruns 2 -m rpc -c ./tests-functional/pytest.ini -n 12 \ + --dist loadgroup \ + --log-cli-level=INFO \ + --logs-dir=./tests-functional/logs \ + --docker_project_name="status-go-func-tests-$(git rev-parse --short HEAD)" \ + --docker-image="statusgo-$(git rev-parse --short HEAD)" +``` + +or if you prefer a one liner: + +```bash +pytest --reruns 2 -m rpc -c ./tests-functional/pytest.ini -n 12 --dist=loadgroup --log-cli-level=INFO --logs-dir=./tests-functional/logs --docker_project_name="status-go-func-tests-$(git rev-parse --short HEAD)" --docker-image="statusgo-$(git rev-parse --short HEAD)" +``` + +After running the tests, make sure you clean up: + +```bash +$ docker compose -p "status-go-func-tests-$(git rev-parse --short HEAD)" -f tests-functional/docker-compose.anvil.yml -f tests-functional/docker-compose.waku.yml stop + +$ docker compose -p "status-go-func-tests-$(git rev-parse --short HEAD)" -f tests-functional/docker-compose.anvil.yml -f tests-functional/docker-compose.waku.yml down +``` + +and then make sure nothing is left (the above command will not clean everything if there are some other containers alive that use the resources): + +```bash +docker ps -a --filter "status-go-func-tests-$(git rev-parse --short HEAD)" -q | xargs -r docker rm -f && \ +(docker network rm "status-go-func-tests-$(git rev-parse --short HEAD)_default" 2>/dev/null || true) +``` + +To run individual test, we can use the same command with `-k ` appended. + +```bash +pytest --reruns 2 -m rpc -c ./tests-functional/pytest.ini -n 12 \ + --dist=loadgroup \ + --log-cli-level=INFO \ + --logs-dir=./tests-functional/logs \ + --docker_project_name="status-go-func-tests-$(git rev-parse --short HEAD)" \ + --docker-image="statusgo-$(git rev-parse --short HEAD)" \ + -k test_logging +``` + +Notice, that if you have some simple test that does not need status go container, you can just run something like`pytest -k test_logging`. + +### Using development scripts to run the functional tests + +To keep things easy and clean, it is easier to use a script. For development I created simplified, more robust version of the original script in `_assets/scripts/run_functional_tests.sh`. First, to get the tests run faster I extracted building of the status-go image into `_assets/scripts/build_status_go_docker.sh` + +```bash +$ _assets/scripts/build_status_go_docker.sh +``` + +> The scripts should be run from the top level directory so that the right docker files are used. + +Then I removed the coverage data (not so important in the development), and included explicit waiting for the docker services before running the tests. This way, it is easier to see which tests actually need a "rerun" and which just failed because docker services were not ready yet (which is very much observable with the original script). The name of the new script is `_assets/scripts/run_functional_tests_dev.sh`. The new script takes one optional parameter. This can be either: + +- module name +- `Test` class name +- `Test` function name +- and *parameterized* `Test`. + +You can easily find those name by looking at the typical Phyton test file: + +```python +# File: test_wakuext_messages_transactions.py ← Module Name + +import pytest + +class TestTransactionsChatMessages: # ← Test Class Name + + @pytest.mark.parametrize("wakuV2LightClient", [True, False]) + def test_accept_request_address_for_transaction(self, wakuV2LightClient): # ← Test Function Name + # Test logic here + if wakuV2LightClient: + # Test with wakuV2LightClient_True + else: + # Test with wakuV2LightClient_False ← Parameterized Test +``` + +or in a more hierarchical view: + +``` +Module: test_wakuext_messages_transactions.py +├── Class: TestTransactionsChatMessages +│ ├── Function: test_accept_request_address_for_transaction +| | [wakuV2LightClient_True] +│ └── Function: test_accept_request_address_for_transaction +| | [wakuV2LightClient_False] +│ └── Function: test_other_function[param1] +│ └── Function: test_other_function[param2] +``` + +You can target each of those tests by calling and giving as argument: + +> I am skipping the prefix in the examples below. The scripts should be run from the top level directory, e.g.: `./_assets/scripts/run_functional_tests_dev.sh ...` + +```bash +# Run all tests in the module +run_functional_tests.sh "test_wakuext_messages_transactions" + +# Run all tests in the class +run_functional_tests.sh "TestTransactionsChatMessages" + +# Run all variants of this test function +run_functional_tests.sh "test_accept_request_address_for_transaction" + +# Run only the False parameter variant +run_functional_tests.sh "test_accept_request_address_for_transaction and wakuV2LightClient_False" + +# Run only the True parameter variant +run_functional_tests.sh "test_accept_request_address_for_transaction and wakuV2LightClient_True" +``` + +When the argument is provided you the `run_functional_tests.sh` will first tell you which tests will be run and let you decide to continue or not: + +```bash +Discovering tests to be run... +Found 14 tests matching: test_wakuext_messages_transactions +Tests to execute: + 1) test_request_transaction[wakuV2LightClient_False] + 2) test_request_transaction[wakuV2LightClient_True] + 3) test_decline_request_transaction[wakuV2LightClient_False] + 4) test_decline_request_transaction[wakuV2LightClient_True] + 5) test_accept_request_transaction[wakuV2LightClient_False] + 6) test_accept_request_transaction[wakuV2LightClient_True] + 7) test_request_address_for_transaction[wakuV2LightClient_False] + 8) test_request_address_for_transaction[wakuV2LightClient_True] + 9) test_decline_request_address_for_transaction[wakuV2LightClient_False] +10) test_decline_request_address_for_transaction[wakuV2LightClient_True] +11) test_accept_request_address_for_transaction[wakuV2LightClient_False] +12) test_accept_request_address_for_transaction[wakuV2LightClient_True] +13) test_send_transaction[wakuV2LightClient_False] +14) test_send_transaction[wakuV2LightClient_True] +Continue with execution? (y/n): +``` + +When running the script without any arguments, you will be warned that all tests will be run, showing you the expected number of tests and also here you will have an option to stop: + +```bash +❯ ./_assets/scripts/run_functional_tests_dev.sh +Using existing virtual environment +Installing dependencies +Discovering tests to be run... +No test pattern provided. This will run all 272 tests! +Continue with execution? (y/n): +``` diff --git a/90 Extras/92 Assets/Pasted image 20250911204521.png b/90 Extras/92 Assets/Pasted image 20250911204521.png new file mode 100644 index 0000000000000000000000000000000000000000..fc063b6a417abd702b9503543511414fba7e9741 GIT binary patch literal 657421 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

^dS%3%;b5lk%V<$? zZPz3vy__!1Is>5r)C5K1tYng$3W z2ltE~au90Myz+1LvVSevQBFw6aGMG5gKA&AL24H7!c|mul$3Sk%HCht-lPbSqQ<(P z63htRT)g@1vqtcbI@~EZnd7A0YGqk(-4d4r2k zzVAwPvxkQkb#=Xm#Oz90@BhGA^}6!R5@^~R>-VpN;UR4@0@_dv<;Pa8alI)$DrPGu z$F6Vg;u~>%{J3p%+wXj_^|d#8=!WgGqt@Du7?0BEg!h+&h4CC4JAUs~D&1|IPa)m= zwf{OOB}YYjz>kekLnPX9BiUaG74G~L;dq1_CtxC_S%Yn!w2_~lxUAMf<_TZ?J_2)Q z=y3Le4w}E_qoFllRg*|!=Jg=DdJBhgvq)!O zBX-0Y9`S+oY?1tduQ#?&1oP0I)naJ8*+w>CaI1Btz& zLJUOaDZ&v6$c|8<8|i(MXZ4&L1QKewj>G+chi(Q6`q+{)HrAlPX(!Z_oVY6NZf znS-@epyt;(OLA1Q4k&eZ&oKa!RcjZ>SkJRjWNbU+>d~00ncroXY$JLbD~=d}N%<2b z?QJr`Ay4(5<`v$QyL_@bzss=EHa1x_2c>Ro)YYaBRJv0)${sm3C7PP zGDjA4;_X?1fcNgiN;I#RsuH1+zo1xSFO_?U5wb@#B5TAOJgeSkhPvmG#@cTE zo;2!QQMAi8+O(Zd+@g{z%NMS`Dc|Qyt_O@~C5(c3_^qyWRnfEE`#rS@{-_3U*(A%* zEz*B|8y;EY5lD_hv&ty@q0B=IH7)n(I%kxg03(`PF7Hhw$ZNh=k_$#{lBV+PaQ^0- zI8lr1HB%6Iclev!3B<1Zcw7fqnI}X)0Dtg-AMebrS`q9Lcb2{v2{2%{32cDGM}6i^ zFl_g-m^s<~y8YuzvdOSC^asODI3=D!A3nOo&kO&vXL>}CH9n7BO-)V3*s#V0`mYZJ z-aQL9)#}ai9|dD8E9I`Jm>oa)~?! zsg6qb7}(w_l1#wDMNA9DAmo8$7Zb6l45U~FAf^v_ucnJj^^Q6Q-n_Z?pc$+M2IIQ# zu@4}4hQAC^Cc+2YSzn}fGaRk8dLFA*=PxQUQ#np}tLQrBE(gTJ!0T<>d|cl^e&4o-C9sRvN*-6C>i zED-GWO6BE2vrPDg4*drPR4R)o`Y9j;bQknKIw4u;Cy$HjuEOZZMNzUryd{`2T1GT! zWBo?`zfyoJRJ$v>EsBh+8~RIq9udp|tJlUf@*kPk=cV9kbGg!N?gMeGH!FzY8%HLZ zdAtJ25$REqOV2?({IEfWfyVsT|Ke=06g)KU~k}_*{c&Y9`ir^8hIR9iLoNyp- zStZAy*Sq#gFuA=%of~6)!{+dAEuCSR%&^44BP{sM46kdk{EuJng`Fabjc=0P*ko&? zuvMB~b=E`vTH~751S1d2ybb+ML-Vw^lx6an(8xcN6*tn0C0>w1g{{-QP~fQny!Ag&q4n_>hNV|p)o2cnqH|V z|Mx0xE5nJ;pbU?UPdDu?E@fh??y0n&kkItR?s9`#YmTW-ng1oQ&hy6quR5Z^9sBSC z6Zub%M0#*0&7378S%Gf+c)!(aJ>-iN|jQ6a_%J`-S*oxV3}UQt)+ z*-Mh$ZKbz!>(V+mIjIZex)7F<-EI{}DOP({3+D=&m|P_;{Pjy_h=RW~%eKUUI$Se- z$NDXk_~MS`*CRAWO0SzTDx_XG6AQ~|4M=ciyJCTG(&G5md7#Zhm`_QX^;J1x0dNV-B z&_;T-xl#8_h(!Aiqr5(58xfHZJ*-9}AjD;l1hU|SBw=h^udzPXq-x5%3%@;7gPP=m{v-7Zd3`M1Rk{CO3VegzDf(G%PD| zJd?-!JwKq-c=%xMPWiX=D;0sO$c%p{jI_%t;l{;J39|iJZNEQ(PwFThDziyrZ0Efy zp~dGyOPaovs!OgT)~|AR)B5NkYFotz8Ma#EDr1gQC36obuQW8Y%nLU<{&p7@at5{| zPp!>jkgwiTWg{0zvLq&>wf!1>Z^$k)E-Ej_1i&V=8@wmkYlNOy=lI5Y zdL(F^y3>q-?oWxp;<~O^MQEwP!kwqLjM5JnUPdL(mw*+aHmebpUB;~%rfQ`9F|80Q zHX-#$|LSGpT6eB*o0i;4yV(7VR;@slV~LP4>(#yRj4`!3dC)lxuH`9FGYblcbDy+} z&l;MF)^I4W*Yp(;49|rfrHgNeGaG9cC^)tJPj+bEBaFh>Ny5pP7^oE5>yLu3+O-8v z`YTB|lfHdQq>!=ImxigKf5R!OH6N0}XLwv^{D&0&1FlcG>-Rj}ltBg^d z^Ssz7;ZK=Mb73G5F{V>UQL|QA>O$oP8QS@kL%n10U<9zzQVUgHTbt29g(gf1!z&qp&fzTgSsr6+o;>c=YJ%zEC8W_i*@rJVe{z{*kM~G`uZ(=sH9la( zGxOobCR>>;tq*&_nC@%KCvr^~ym^?BI(RX1-R*f1T6>jgK99B;NYf%0IywBl^k&{b z4mB%7G`WoHOLEPP-c8Jc>|OX38o`xws1~RpVDLilaEA{mq`UxT&!CDYFeirT~&8w+jYK+;DPbMZxXR2#ooz zSW=A{OaT21PjRJr%|l^%v*AaUzweL`{Etxn^p;;+8$F}Ujz6Fo9l zSIjv)6%0YM5PBY%9rDAWT8(a0>yqkrdRjWi)DD0J80B{5qcz9MmDo}`Io6Hgisg~A zusSyN+1x*?fJm43**SNCwY)URyh?`Kf856{*(oq@j7z_M20=%1?;g zVYvK=d7b-RPQ7V>10i)i$=O2>cxIo-a+MkFUxNN0<3H=<63|+8|4;2BwvF2*ATGwG zq9dSt85a2Gi^>;23$FO_YuyyxQ#6GFQV}Ayw%>LL@ z{934`Td-$u&|52T$Vzyq*8i60XwO!acWyS?inVkKz;4&LX5|0azl@3 z)KGak>$qy}eu65(}T z8eykQ%}|6M;Wd(|_lxoX!b*Z%R6JR_RiT)2^U8l(Fd3n?x6jp&+=KHW4ACCtIO0aa zn5r>~T8cRXm2fvNxO4q}ye*L1gseEoqxR|eT8U&vn@)_7JqFOBWbbQ39_^FlxznX8 zY9xx)kG=hh6)1clh9A)FZh$rAL=OVlod{@3sDNq|JR#V4OxM zXPGG!8qNn8U?}3R-##%h;S^SNktSYM;iLO0X;Y6It%p>R(O1~9%1(xw%7Dz7YH>_= zb=_U=iAEbeXI~-u2tvT4c&yiSS)WZEn2;OCFLaO<7ycAAFolqvq?sVSRYd-;4q00M zS3=Q_^e9a`hRiN!M0GrYAp{E*Klpm$yiH0!8^c=s6!n0wtGI2gl3g~S2L~j zatI!Rpu^tt0>|W(45_N@kJR)xLY7XhT#mAD7JW`-&;2@MRuE#;N=;+yA%}q zQwaTlRD0v;>gt@9$3OvKQ4OHDpy z0EE)uF~7P2UJ0IBp2taE2v;@5e>eO(DmsDolUBg!46I79EAoSQ6rzfi+qGrz8d-8I z4~UL?8OVSz<{5_l9JOLBhV_=!gQB$&@PW=|@Y@ z0n9pjD;4CgJtaO%-%T~TSRNSohh{p+eyTmE zaAD~Xw;=LBjY4voe@Afl--JTMg;x$68=Knw^dSLwN*KnkHJv=?_Zj`D2(!4vJVF4A zB6xWG+f@CF$&S}qI2XjJr=y)(qFx*YA0Iz-WaMqfMFvS&H%!l~7%FU9Fq{%-g?4iF zy%m(1sq+k z$n@zG=)g5~>q@rJxf{BfoDjA_6Fc|E1FOS{G$?5QDJCgN5}|{Wr|EDsa`Cu-ulX_p z@%YBh#;s@86Y{==k%`W1edHAF^#`Q@Nxr;FrZy@_UKM*lrqCq3e=Xd|RICO%mnajghlEqXIhMoB5n zWt6uun${DtGhDbZgVJfYay6n{cu9D2H_|Y~c;4nA4vA}KW;Q+~Y|xaJ2yjnIcOqcV4Afa76q4hrVu#m2}Eo4j5A?Pk?ufO49oU(lC7*3Oj1;w1w@z zzQ)EpY)DM4I!TGfls!YbVpAW5h-ZWNhK{T2YQW8d(VTY5Dpt(~g02+WRmNcNf@5jr zZmn~9+0ABfwCQsbh0EWH6p&(^h8H?{Glxjrz@BT1lY%v`b5;x&0J=+h1p$J;d#|?9 zd#x-)|Mdp+_#44%6AI%Krc3XM1LLPNplt|#-y&T@kt-Qw-}#_$}uP- zAsnH~m<0H$z9`ii$#IeZC|Z>x5(= zo_EkSS(B1qwHB*fYJ`l((1@gh0`uNjI|=^PlTKp*J|d_)hAqYENhUZd5n!8SXW#Uq zPsR0$4M_K?l`P2hH{&3Cc-|GF78bKO5K4kj98gNhV+!}UI6;Zs{(N;w* z8(j&}Y3mu#3&)cRoJ2YB@X`p?i=aXD+l0X@7fcFJS9#spow9`%=C#z-!(X~yP@5eM z&k7kYr+_b>=MQv6(qJ60<6sC6zt1bh$wAqSi{9Y%9;&-X@-x7B z&bzxlJ7gc91CV@P@)p8<)eXD_yDX*xVU2(vbnSP?_TqHdNY2ksrJHPfRpfnQ>_#GD zz*Q;3Tx~jW%jMRBQwK_ZIll8} zlgb;iJbxE*j8(DGQmgkXiHaquq`8b5rQAbGLGD8p^HD?aESUq$fd=$glM$j1JY0Fi zk~#nkrw(P-WujT-FYv`_9HX3E$6Vm}p>pJO3&(6fzQxMTP5k3EjD8^eRyl3EJ^AiK zZMdhRL&-_0-eq>jpZF(_r_2wkmR5Amsg$6b|t5cTv(5BPTzR67h#|i~G1?M{O)q9cF!r zNs5=!HKoUK5|2OY7D^B|7hb;kh2q7??O*|pgVS zpV;t-$YR^tgbiB1MagZ!hf3seHsJvA1X~`f5=SevfkDLNod&#>u8k0)QDU=!A&h40 z-?@|4hfM5k$3OBL=lQBLirbps5-=#s>&dZb{4^eHu7x(9$0xh4ujl1|el#n!(^gOu_(o$@-%7w@1WNowm_p#U+PJ}yg4)n=5QxLsrO zjdep(9w%;L&%-3EadkWbbJ4w-#i@|uVyS^aFq*(yBLNMA9~OTi?F*0^HdF7;A-ChC zLVoYuguSJ|x$#`_KU7sI%n2-R_ys%OeyUTt8Y<`F7xgPX{Y10LPUvzw6!=!ASsld! zV28!KJzDDmu2RgH; z|94+|n+kBGyY&?B5_?8i$JL^9DkklUabTd>^JN@90O9%@n~)BI7$N@JhNtLpoldhx zJOGa^xhN6$CD7hI(BPFK|3P0e}v8F=PD%7xg>1sPT+8P#Ai zx#YR_Wj?$7t`pf@*8se!3($s9&(Jghm&GFKABQzma$Z70L|fcAw9)J49WQ@XSBzPJ zahti8HKHMd)%fuZ7bry*0jDT}{i*4|U;DlnQFcz{u@Z|Rnyc2E5x)ZE$`20;*VWbz zvP=S!5I`!N-7t|R5Qk9Jl*Zm5)3qI zKU*3&4VE7n{KBtu9xaShG`eUVmQVX5q{mEg`A)y%qm9Y(xI0%Mh!vqQUG;oO{FYnj zQ}XzEheW2GIe!SEXZkUdE*$aPde^8Z1bjXD=o(vN*rQJWb-Wwj5~ z9J1(x-3xs&`rbBmW6@X!QY8DMExErDw%&#$kmmXAcx_Wr@7is{bo#%<k z`z2?KtRBaCp#wjCUVqN7;1}@yChFP|kyObw7o0~rIbDVrFY-Ik=abZGN~F&i8uX`@ zlIs&MWWMM`F{uZ~OWcF1qP7nFua7x*SwAGtUZwaT3^q(Pa;ouaN(sz;X25y7?SGwJ z$Cl;B-@lc%?^-y+6`g9Au~H!js!b!OyRy2r&Bo1ZCvA5B1W;KVh=NudU6;gN4O4tL z`JWbmyTT>rG3Ie3z|Cv3j4p{J3zgp3E=gGH3jXsF;7djL!tCq+S4jZi)ugRS5p8^2 zlGM5LRkK~+K=n|~!8@L6HP^-b-F|pg-%m(nHI0QHbNBvyZPlyF3#Vs>WHor2&lo&> zabovF+J-CFM}tj|(l|Blz2_k!LjVxY ztNc2Rb#)uXvYqm!YFTL_HJ3)!Rb#L|gUiT{`z=#2@A(6pl!nB0w#Vwb8d2pmn_d1m zz}tFlYR#zkli1pogn?;WG5g<_cinYkf7XyP&W7NK&HTu+55U7>O`IXJjAqfOpxu_WUe#N*adEs1AnP7U7Yfqw+X)!O z#C{93tNFY#PP}^0zBS@15`h_{TNky$Rui^eOy$#szJq79OtS2QjDP$sNRhD>r@LAxcZOGu@OmjZ_* zBo&Vf;SEM7#8W`_2npFnTZC_%-`IfeJc?dDAE5skwoO_uN!(vQf|54|?z);%TQ5?+ z%r!2`jeF|zWZ(%3Uy5=Fs~--seK(4q5RBF)`jT64-tta;o6AE^;3F_bUQUZ=02RQe zp>LQR84MSP%{vpdz@tf8eg0;-#NpOo33gd7Uy^Em--Yd^BrlMbl0&U{DB0~gM3UA6 z(NK-Uoh810#S*si1fBnYAR&2rdg`?MWyvTG^2p}=Hl4`mAmrKB(+DaZ;bML$F^d(A zhUAemHdoL04l?=XRw>=m*wyGeXdY%TJ7@^5`jpdB8W>D7UY3sl32`;B+-3zb0F}9A zzumLY6mE^4q;ny}?z@YiVY$6tr57j2ss~%rmRrZyN&EcG&ER3NIiCrJ`a$c}`F;AR zA<@{Y)oZ$|!KD@o!x8Zc(xE}DiL*~|*S{4BjH~1^P{{n=UNCpdA=$TX=84#s&bb`s zdnez}rZ);WZFBn!Xv}+h9RwWymnn~(AK&8a47$Y?`J}*$UDR7FB&%FngfhQIE1Vml zyx(`J`lvLG*=#FZ_GE=uY)&UBDIG`)OJA*ijgw_07(1?nn)~E)Ql1-@+N5u?NBPzA z&PkbVTT`ed$Drf2$^*Gsj!e;+4s=(v4QGdn12hxtB){dWHc3crr$lIMP^|Vw%9q+x zIq{86Yjo;)MUe6W;S1uk1krS8>i+06q0>cgC3udQKu^Cy7I&T?*R!me=enzp$L%#C%q#lwZn6@OFMxq`Ox31~uyAHwx0b^+m1R zbyKY)`$A$>Z>8#kIIbr0;!iY=_u?3{II4_|FoDW(`EkygqN)G={r4W#@l5#|Zbcqw zf|d{l_c(0deS2KCiD z9;Tp{M_RCz9s6!OrHVlZp=7CIma!dGE{D$rei8sE`tiBkOo%VJUnx=ZFr>-Vf9#zT zTN%1~sFEgA>nm*=Rfx>J#s@We%C{uZ1@_t)>53IbC=_pgu6~mKHa)AVubW&!YEP$c zJR8C?s43`w&g~W8&kB1iS@_s@sF0B)6umcJ;ieZy4KAs{jN`xoW=JVV#v?{N8dxzn#}>ZTF~HLrUS<2DcESvB!JMxu zJo{_&{m`XLVTm!LrnRLUSwQ67d)|rYqa%fZ0Z_IWAKyPFHg?cf|3ib)$p@BcGCmDX-rGb%jJG0 zL1yW@Z{H(8?%aEESXt=-r|Gn<+o4D0$CK5@s-nXuqU)F2%mKICsHlJp3qhJ+NkZ_U zj-iuc(bf52w!+^+X^ul)tat73{8h$nyoVOo-v%;;J}E1fxw(^|5KgmgKU`qDYZ+GOD;Q1GSTAx>y%uyy#U;A3AfFR$ zENH^7?`T_U8p9+iu|!9s8AL(**(FHM?59Cf?hjqG7W$b(yDP!*A$?zUYzRa4cp=7> zFo^wgj1SXt)&KGJRdG>uVZQ?iNQ-m}yhurRH;8l$h?InMcML;=G)hVhNP~cMcXv0^ z9nvsEe%p)h{LZ;KcU&;B_pG&_=lR#lW1LEgk={+&%p~X7+N11J>fDo~rt>2*q*4`U z?oL8vyS+F_)sI?GBf=t7p%KgbYoqha)uV1BZ2I4GMwdU&b+IrxIZVTK?V0gz-H_TtW35(iE z#48DyW_ADdA&onZPGW|VoxicyMsIaSc$+^-wY3i&ld)b0T%K_KVKGNgEq1Hwk48tY z-ush_j~`CCE3}QAtMQ1|GBSss1`s$TQL^h-U6X~T5rW~H(^29@@RF&R_rZ~Ilxq&$ zua}u=+@ml`8f0U@i-J4)o22Zkr7o{(-wsvCHdPrgKS@O=c*nc{io68M`?)6dFrw*0 zp?22AP!vh_Cf#0e#-pnTZI+e?+dW3U?oezGG%5BAR8VB=>Ky=4mCUJ>=_NC#6f&)Q zO-D%l*mH7e)1~-n*V#r5BhO(OY_8Rp&EPes*Bs3!>_8KgKkhCa!Ndc z^odqm!ZJRQN6IDzv3aIdRTxB-0{S9cLKo0gidjQq*f%#Z@smzUUbB9wC~06C{$9ma4vOC! zI9J|{xL}JUmJ7eouZ$Z$FuKUbEu=P2)eDObF7fU0_+iOj5wg^9eK-YU zadf>S9tVrdmJLRUzlqTpjNAnOO*qgLQr`{!UO3dxZk@4EK14$(u1a0fM~v{2p&>1x>g-cLFBjZ<7hDWyIY zRQ_0wBxJDs=y`=^Q;kOg-&jL2pHqbXZaDW#0d-VGn@5KTu!9!E`ww$Ql*>vWXZ>ap zZ|`q~EjpE%)d~*w+TRJBBY1fQoi(7eo4RE()G`}eUN@!{2C!qEm9!!Ru!p@|))_iW zUzbG(E4fsSme@s4e~Z**H!9wwL8nw@4|HxT`B^r^W$@a4YK~WO8Uh3|q%EopCP!r& zL~lN5->9%Z`9`SGu@BL#m}W;ObkT1T^gDT{Uzo5f4BH#o$s{-0yyJ^Y>)xTN_mSyQ zLge?xnV7X@w-%emC5*?%Ou@kj05gb6H*om2ymC=9kUqI*P(8%o&@enpz%9nE>g

  • _|RKurQ38spt`KNqmIku=j1by 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

    jxk^+D#KoTw8Jc7GFSz3Yk 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

    R?87NW-6CSskw$jbI;_XqVqfYJKCVuER;2-j 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 z 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 N42cs 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 z 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

    b|Fvt(RynE*X-|` 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%0AA3mugAS=>QF804Aug5V{L( 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 literal 0 HcmV?d00001 From 2d1ec1587e5d24e6118600c34a6f779ec5c7158d Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Wed, 17 Sep 2025 04:53:22 +0200 Subject: [PATCH 08/25] documents running unit tests for status-go --- 10 Notes/Running Unit Tests for status-go.md | 341 +++++++++++++++++++ 1 file changed, 341 insertions(+) create mode 100644 10 Notes/Running Unit Tests for status-go.md diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md new file mode 100644 index 0000000..063829f --- /dev/null +++ b/10 Notes/Running Unit Tests for status-go.md @@ -0,0 +1,341 @@ +Let's start with what we find in the [status-go build instructions](https://github.com/status-im/status-go/blob/develop/_docs/how-to-build.md) as lots of things just work. + +We have two options: (1) use the [nix](https://nixos.org/) develop shell or (2) just use standard shell you have in your shell. Theoretically, nix should give you better isolation and repeatability, yet, it is quite opinionated, has learning curve, and adds quite a bit complexity. For now thus, I decided to a more conservative shell environment, where I feel more comfortable. + +> In what follows I am using BASH on Arch Linux in [Omarchy](https://omarchy.org/) distribution. + +### Pre-requisites + +You need to have `go` installed on your system. On Arch Linux I used `sudo pacman -S go` to install it. + +### GO dependencies + +Right after cloning, you should be able to run: + +```bash +make status-go-deps +``` + +Plus, and what the original documentation does not say, you will need `gotestsum` to conveniently run unit tests. We have to install it manually: + +```bash +go install gotest.tools/gotestsum@latest +``` + +You can check it is available by running: + +```bash +gotestsum --version +gotestsum version dev +``` + +> `dev` version may be coming from using `@latest` when installing `gotestsum`. + +### Building backend and the libs + +Just to check if everything is setup correctly, let's build `status-backend` (which is a wrapper over status-go that provides web API - handy for testing), and then status-go static and shared libraries: + +```bash +make status-backend +``` + +It will be available as `./build/bin/status-backend`: + +```bash +./build/bin/status-backend -h +Usage of ./build/bin/status-backend: + -address string + host:port to listen (default "127.0.0.1:0") + -pprof + enable pprof + -testify.m string + regular expression to select tests of the testify suite to run +``` + +Now, the libs. Static lib: + +```bash +make statusgo-library +which: no go-generate-fast in (...) +Generated handlers in ../../protocol/messenger_handlers.go for Type enum. +Generated endpoints file: ../endpoints.go +## cmd/library/README.md explains the magic incantation behind this +mkdir -p build/bin/statusgo-lib +go run cmd/library/*.go > build/bin/statusgo-lib/main.go +Building static library... +go build \ + -tags 'gowaku_no_rln' \ + -ldflags="" \ + -buildmode=c-archive \ + -o build/bin/libstatus.a \ + ./build/bin/statusgo-lib +Static library built: +-rw-r--r-- 1 mc2 mc2 247898154 Sep 17 01:24 build/bin/libstatus.a +-rw-r--r-- 1 mc2 mc2 8290 Sep 17 01:24 build/bin/libstatus.h +``` + +and shared lib: + +```bash +make statusgo-shared-library +which: no go-generate-fast in (...) +Generated handlers in ../../protocol/messenger_handlers.go for Type enum. +Generated endpoints file: ../endpoints.go +## cmd/library/README.md explains the magic incantation behind this +mkdir -p build/bin/statusgo-lib +go run cmd/library/*.go > build/bin/statusgo-lib/main.go +Building shared library... +Tags: gowaku_no_rln +CGO_LDFLAGS="-Wl,-soname,libstatus.so.0" go build \ + -tags 'gowaku_no_rln' \ + -ldflags="" \ + -buildmode=c-shared \ + -o build/bin/libstatus.so \ + ./build/bin/statusgo-lib +cd build/bin && \ +ls -lah . && \ +mv ./libstatus.so ./libstatus.so.0 && \ +ln -s ./libstatus.so.0 ./libstatus.so +total 578M +drwxr-xr-x 1 mc2 mc2 190 Sep 17 01:39 . +drwxr-xr-x 1 mc2 mc2 10 Sep 10 05:15 .. +-rwxr-xr-x 1 mc2 mc2 44M Sep 10 05:15 generate-db +-rw-r--r-- 1 mc2 mc2 237M Sep 17 01:24 libstatus.a +-rw-r--r-- 1 mc2 mc2 8.1K Sep 17 01:39 libstatus.h +-rw-r--r-- 1 mc2 mc2 107M Sep 17 01:39 libstatus.so +-rwxr-xr-x 1 mc2 mc2 92M Sep 10 05:15 push-notification-server +-rwxr-xr-x 1 mc2 mc2 100M Sep 17 01:19 status-backend +drwxr-xr-x 1 mc2 mc2 14 Sep 10 05:08 statusgo-lib +Shared library built: +-rw-r--r-- 1 mc2 mc2 247898154 Sep 17 01:24 build/bin/libstatus.a +-rw-r--r-- 1 mc2 mc2 8290 Sep 17 01:39 build/bin/libstatus.h +lrwxrwxrwx 1 mc2 mc2 16 Sep 17 01:39 build/bin/libstatus.so -> ./libstatus.so.0 +-rw-r--r-- 1 mc2 mc2 111911080 Sep 17 01:39 build/bin/libstatus.so.0 +``` + +### Running unit test + +The obvious + +```bash +make test +``` + +is a mistery to me as looking at the source code, it looks it has no chance to succeed without some extra steps. + +`make test` uses `_assets/scripts/run_unit_tests.sh`, where we find the following fragment: + +```bash +if [[ $HAS_PROTOCOL_PACKAGE == 'false' ]]; then + # This is the default single-line flow for testing all packages + # The `else` branch is temporary and will be removed once the `protocol` package runtime is optimized. + run_test_for_packages "${UNIT_TEST_PACKAGES}" "0" "${UNIT_TEST_COUNT}" "${DEFAULT_TIMEOUT_MINUTES}" "All packages" +else + # Spawn a process to test all packages except `protocol` + UNIT_TEST_PACKAGES_FILTERED=$(echo "${UNIT_TEST_PACKAGES}" | tr ' ' '\n' | grep -v '/protocol$' | tr '\n' ' ') + run_test_for_packages "${UNIT_TEST_PACKAGES_FILTERED}" "0" "${UNIT_TEST_COUNT}" "${DEFAULT_TIMEOUT_MINUTES}" "All packages except 'protocol'" & + bg_pids+=("$!") + + # Spawn separate processes to run `protocol` package + for ((i=1; i<=UNIT_TEST_COUNT; i++)); do + run_test_for_packages github.com/status-im/status-go/protocol "${i}" 1 "${PROTOCOL_TIMEOUT_MINUTES}" "Only 'protocol' package" & + bg_pids+=("$!") + done +fi +``` + +From the comments, we see that the `else` branch will be used. It is split into two parts: + +1. All the tests except for the tests for `status-go/protocol` module, those are faster, which is reflected in the the shorter timeout: `DEFAULT_TIMEOUT_MINUTES=5`. +2. The `protocol tests` - slower (`PROTOCOL_TIMEOUT_MINUTES=45`). By default `UNIT_TEST_COUNT=1`. + +For our regular development, we may not like to run all tests. In particular, the `protocol` tests seem to be less relevant to our use case of message history archives. Thus, in what follows I am skipping the longer protocol tests. + +Now, if you run `make test` the tests will fail: + +```bash +=== RUN TestBasicWakuV2 + waku_test.go:172: + Error Trace: /home/mc2/code/status-im/status-go/messaging/waku/waku_test.go:172 + Error: Received unexpected error: + Get "http://localhost:8645/debug/v1/info": dial tcp [::1]:8645: connect: connection refused + Test: TestBasicWakuV2 +--- FAIL: TestBasicWakuV2 (0.00s) +``` + +Indeed, we can confirm it by running just the `TestBasicWakuV2`: + +```bash +gotestsum --packages="./messaging/waku" -f testname --rerun-fails -- \ + -count 1 -timeout "5m" \ + -tags "gowaku_no_rln gowaku_skip_migrations" \ + -run TestBasicWakuV2 +``` + +and we will get the same error. + +If we look into source code of `messaging/waku/waku_test.go`, and scroll down a bit (!!), we will find the following comment: + +```go +// In order to run these tests, you must run an nwaku node +// +// Using Docker: +// +// IP_ADDRESS=$(hostname -I | awk '{print $1}'); +// docker run \ +// -p 60000:60000/tcp -p 9000:9000/udp -p 8645:8645/tcp harbor.status.im/wakuorg/nwaku:v0.36.0 \ +// --tcp-port=60000 --discv5-discovery=true --cluster-id=16 --pubsub-topic=/waku/2/rs/16/32 --pubsub-topic=/waku/2/rs/16/64 \ +// --nat=extip:${IP_ADDRESS} --discv5-discovery --discv5-udp-port=9000 --rest-address=0.0.0.0 --store +``` + +First, on Arch Linux it may happen that `-I` option is not available. As an alternative you can use: + +```bash +IP_ADDRESS=$(ip -o -4 addr show up primary scope global | awk '{print $4}' | cut -d/ -f1 | head -n1); +``` + +Unfortunately, if we try to start waku node as recommended, we will get an error: + +```bash +docker run \ + -p 60000:60000/tcp -p 9000:9000/udp -p 8645:8645/tcp \ + harbor.status.im/wakuorg/nwaku:v0.36.0 \ + --tcp-port=60000 --discv5-discovery=true --cluster-id=16 \ + --pubsub-topic=/waku/2/rs/16/32 --pubsub-topic=/waku/2/rs/16/64 \ + --nat=extip:${IP_ADDRESS} --discv5-discovery --discv5-udp-port=9000 \ + --rest-address=0.0.0.0 --store +Unrecognized option 'pubsub-topic' +Try wakunode2 --help for more information. +``` + +Using quick co-pilot fix, it seems that we need to use `--shard` instead of `--pubsub-topic` and the correct command to start a waku node (with a store) is: + +```bash +docker run \ + -p 60000:60000/tcp -p 9000:9000/udp -p 8645:8645/tcp \ + harbor.status.im/wakuorg/nwaku:v0.36.0 \ + --tcp-port=60000 --discv5-discovery=true --cluster-id=16 \ + --shard=32 --shard=64 \ + --nat=extip:${IP_ADDRESS} --discv5-udp-port=9000 \ + --rest-address=0.0.0.0 --store +``` + +Now when we run `TestBasicWakuV2`, it passes: + +```bash +gotestsum --packages="./messaging/waku" -f testname --rerun-fails -- -count 1 -timeout "5m" -tags "gowaku_no_rln gowaku_skip_migrations" -run TestBasicWakuV2 +PASS messaging/waku.TestBasicWakuV2 (7.24s) +PASS messaging/waku +``` + +We can also run all the test relevant to the `messaging/waku` package and they should all pass: + +```bash +gotestsum --packages="./messaging/waku" -f testname --rerun-fails -- -count 1 -timeout "5m" -tags "gowaku_no_rln gowaku_skip_migrations" +PASS messaging/waku.TestMultipleTopicCopyInNewMessageFilter (0.00s) +PASS messaging/waku.TestHandlePeerAddress/valid_enrtree (0.00s) +PASS messaging/waku.TestHandlePeerAddress/invalid_multiaddr (0.00s) +PASS messaging/waku.TestHandlePeerAddress/valid_multiaddr (0.00s) +PASS messaging/waku.TestHandlePeerAddress/valid_enr (0.00s) +PASS messaging/waku.TestHandlePeerAddress/unknown_address_format (0.00s) +PASS messaging/waku.TestHandlePeerAddress (0.00s) +PASS messaging/waku.TestDiscoveryV5 (4.20s) +2025-09-17T04:02:04.059+0200 DEBUG p2p-config config/log.go:21 [Fx] HOOK OnStop github.com/libp2p/go-libp2p/p2p/transport/quicreuse.(*ConnManager).Close-fm() executing (caller: github.com/libp2p/go-libp2p/config.(*Config).addTransports.func9) +PASS messaging/waku.TestRestartDiscoveryV5 (10.86s) +2025-09-17T04:02:14.914+0200 DEBUG p2p-config config/log.go:21 [Fx] HOOK OnStop github.com/libp2p/go-libp2p/p2p/transport/quicreuse.(*ConnManager).Close-fm() called by github.com/libp2p/go-libp2p/config.(*Config).addTransports.func9 ran successfully in 12.553µs +PASS messaging/waku.TestRelayPeers (0.01s) +PASS messaging/waku.TestBasicWakuV2 (7.46s) +PASS messaging/waku.TestPeerExchange (11.06s) +SKIP messaging/waku.TestWakuV2Filter (0.00s) +PASS messaging/waku.TestOnlineChecker (0.11s) +PASS messaging/waku + +=== Skipped +=== SKIP: messaging/waku TestWakuV2Filter (0.00s) + waku_test.go:392: flaky test + +DONE 14 tests, 1 skipped in 33.720s +``` + +Now, we should also be able to successfully run all the tests using `make test`: + +```bash +make test +... +DONE 1881 tests, 25 skipped in 93.841s +Gathering test coverage results: output: coverage_merged.out, input: ./test_0.coverage.out +Generating HTML coverage report +Testing finished +``` + +Following the practice from running [[Running functional tests in development]], also here we have a handy script for starting a waku node suitable for unit testing: + +```bash +_assets/scripts/run_waku.sh +Starting waku node... +0795dbb8e786cf9047c8162fcc1cbbb11cd22926a5091f4e07df0e1b259ef62d +Waku node started. +Press any button to exit...q +Removing containers... +0795dbb8e786 +DONE! +``` + +Now, for the status-go-codex integration, most of the relevant tests are in the `TestManagerSuite`: + +```bash +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -count 1 -timeout "5m" -tags "gowaku_no_rln gowaku_skip_migrations" -run TestManagerSuite +PASS protocol/communities.TestManagerSuite/TestCheckAllChannelsPermissions (0.51s) +PASS protocol/communities.TestManagerSuite/TestCheckAllChannelsPermissions_EmptyPermissions (0.52s) +PASS protocol/communities.TestManagerSuite/TestCheckChannelPermissions_NoPermissions (0.53s) +PASS protocol/communities.TestManagerSuite/TestCheckChannelPermissions_ViewAndPostPermissions (0.51s) +PASS protocol/communities.TestManagerSuite/TestCheckChannelPermissions_ViewAndPostPermissionsCombination (0.53s) +PASS protocol/communities.TestManagerSuite/TestCheckChannelPermissions_ViewAndPostPermissionsCombination2 (0.50s) +PASS protocol/communities.TestManagerSuite/TestCheckChannelPermissions_ViewOnlyPermissions (0.52s) +PASS protocol/communities.TestManagerSuite/TestCommunityIDIsHydratedWhenMarshaling (0.25s) +PASS protocol/communities.TestManagerSuite/TestCommunityQueue (0.53s) +PASS protocol/communities.TestManagerSuite/TestCommunityQueueMultipleDifferentSigners (0.52s) +PASS protocol/communities.TestManagerSuite/TestCommunityQueueMultipleDifferentSignersIgnoreIfNotReturned (0.55s) +PASS protocol/communities.TestManagerSuite/TestCreateCommunity (0.27s) +PASS protocol/communities.TestManagerSuite/TestCreateCommunity_WithBanner (0.25s) +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrentFromMessages (0.27s) +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrentFromMessages_ShouldAppendArchives (0.25s) +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrentFromMessages_ShouldCreateMultipleArchives (0.24s) +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrent_ShouldAppendArchives (0.26s) +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrent_ShouldCreateArchive (0.25s) +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrent_ShouldCreateMultipleArchives (0.26s) +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrent_WithoutMessages (0.26s) +PASS protocol/communities.TestManagerSuite/TestDetermineChannelsForHRKeysRequest (0.27s) +PASS protocol/communities.TestManagerSuite/TestEditCommunity (0.25s) +PASS protocol/communities.TestManagerSuite/TestFillMissingCommunityTokens (0.26s) +PASS protocol/communities.TestManagerSuite/TestGetControlledCommunitiesChatIDs (0.26s) +PASS protocol/communities.TestManagerSuite/TestRetrieveCollectibles (0.50s) +PASS protocol/communities.TestManagerSuite/TestRetrieveTokens (0.53s) +PASS protocol/communities.TestManagerSuite/TestSeedHistoryArchiveTorrent (0.25s) +PASS protocol/communities.TestManagerSuite/TestStartAndStopTorrentClient (0.27s) +PASS protocol/communities.TestManagerSuite/TestStartHistoryArchiveTasksInterval (10.25s) +PASS protocol/communities.TestManagerSuite/TestStartTorrentClient_DelayedUntilOnline (0.26s) +PASS protocol/communities.TestManagerSuite/TestStopHistoryArchiveTasksIntervals (2.25s) +PASS protocol/communities.TestManagerSuite/TestStopTorrentClient_ShouldStopHistoryArchiveTasks (2.24s) +PASS protocol/communities.TestManagerSuite/TestUnseedHistoryArchiveTorrent (0.26s) +PASS protocol/communities.TestManagerSuite/Test_GetPermissionedBalances (0.50s) +PASS protocol/communities.TestManagerSuite/Test_calculatePermissionedBalances (0.50s) +PASS protocol/communities.TestManagerSuite (26.65s) +PASS protocol/communities + +DONE 36 tests in 26.685s +``` + +To run a single test, you can do something like the following: + +```bash +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -count 1 -timeout "5m" -tags "gowaku_no_rln gowaku_skip_migrations" -run TestManagerSuite/TestCreateHistoryArchiveTorrent_ShouldCreateArchive +PASS protocol/communities.TestManagerSuite/TestCreateHistoryArchiveTorrent_ShouldCreateArchive (0.27s) +PASS protocol/communities.TestManagerSuite (0.27s) +PASS protocol/communities + +DONE 2 tests in 0.307s +``` + +> The *suite* counts as one test. + From 1b3c0c0369514157415ad216d8b070b2a81769fb Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Thu, 18 Sep 2025 02:47:00 +0200 Subject: [PATCH 09/25] adds some more docs on running unit tests of status-go --- 10 Notes/Running Unit Tests for status-go.md | 77 ++++++++++++++++++++ 1 file changed, 77 insertions(+) diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index 063829f..5ddd066 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -339,3 +339,80 @@ DONE 2 tests in 0.307s > The *suite* counts as one test. +### Running "protocol" tests + +I only run all the tests (including `protocol` tests) using `make test` once. Got most of the test pass, but not all. To get a better feedback and to track progress, I prefer to run them using `gotestsum` command: + +```bash +gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout "45m" -tags "gowaku_no_rln gowaku_skip_migrations" | tee "test_1.log" + +DONE 964 tests, 5 skipped in 1159.570s +``` + +Redirecting output to a file is pretty much needed as `protocol` tests generate more output. + +Here just for the record - an example failing session: + +```bash +gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout "45m" -tags "gowaku_no_rln gowaku_skip_migrations" | tee "test_1.log + +DONE 3 runs, 968 tests, 5 skipped, 6 failures in 1194.882s +``` + +So, the reason I recorded it, is that the output can be pretty misleading if you are seeing this output for the first time. The `6 failures` is actually $1$ (one) failing test: + +```bash +TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions +``` + +This one failing test makes the whole suite `TestMessengerCommunitiesTokenPermissionsSuite` failing which is also counted as a failure, and then we have `3 runs` which is why we see $3 \times 2 = 6$ failures in the end. + +Also it is important to mention here that `--rerun-fails` option takes $2$ as default value, which means after first pass, if there are any failing tests, these tests will be rerun, and, if there are still some failing tests after second run, those tests will be rerun as well. So we have $3$ runs in total. Also notice, that the `-count 1` option we pass to the underlying `go test` ensures that each test execution is "fresh" and not cached making sure that it does not use cached results from previous test runs. + +On each rerun I am also observing the following error message: + +```bash +failed to IncreaseLevel: invalid increase level, as level "fatal" is allowed by increased level, but not by existing core +``` + +This simply means that the logger (it seems to be [Zap logger](https://github.com/uber-go/zap)) tries to increase the log level before re-running failing tests, but apparently we are already at the max log level - thus the warning message. + +About this one failing test: `TestAnnouncementsChannelPermissions`. + +We see the following errors reported: + +``` +2025-09-17T07:01:42.088+0200 ERROR 6decc309-0976-4da3-ada2-d20566a30b02 node/node.go:386 error while mapping sync state {"mvds": {"error": "sql: database is closed"}} +ERROR 758f6b9d-fa86-44fd-851a-d727d8a57732 protocol/messenger.go:1802 can't post on chat {"chatID": "0x03aa871de09ab76e4fba610c520735125f36795fb2ca6cb03f10520da449fcd0c5ab08e1bc-61bf-4ce6-82cb-e8c40f37abd2", "chatName": "general", "messageType": "CHAT_MESSAGE"} +... +ERROR 758f6b9d-fa86-44fd-851a-d727d8a57732 protocol/messenger.go:1802 can't post on chat {"chatID": "0x03aa871de09ab76e4fba610c520735125f36795fb2ca6cb03f10520da449fcd0c5ab08e1bc-61bf-4ce6-82cb-e8c40f37abd2", "chatName": "general", "messageType": "CHAT_MESSAGE"} +... + communities_messenger_token_permissions_test.go:1169: + Error Trace: /home/mc2/code/status-im/status-go/protocol/communities_messenger_token_permissions_test.go:1169 + Error: Received unexpected error: + no messages + Test: TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions + + communities_messenger_token_permissions_test.go:1169: + Error Trace: /home/mc2/code/status-im/status-go/protocol/communities_messenger_token_permissions_test.go:1169 + Error: Received unexpected error: + no messages + Test: TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions +# still some log messages +--- FAIL: TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions (11.44s) +``` + +When running this single test isolated, it is a bit flaky, sometimes it passes right away, sometimes it passes on the second run. + +```bash +❯ gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout "45m" -tags "gowaku_no_rln gowaku_skip_migrations" -run TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions +PASS protocol.TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions (1.42s) +PASS protocol.TestMessengerCommunitiesTokenPermissionsSuite (1.42s) +PASS protocol + +DONE 2 tests in 1.453s + +❯ gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout "45m" -tags "gowaku_no_rln gowaku_skip_migrations" -run TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions +... +DONE 3 runs, 6 tests, 4 failures in 27.876s +``` From 6e3bc29a92c28981705a2a491997cd348c905942 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Sat, 20 Sep 2025 03:07:04 +0200 Subject: [PATCH 10/25] final updates to the docs on running unit tests in status-go --- 10 Notes/Running Unit Tests for status-go.md | 28 +++++++++++--------- 1 file changed, 15 insertions(+), 13 deletions(-) diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index 5ddd066..963acc9 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -121,9 +121,9 @@ The obvious make test ``` -is a mistery to me as looking at the source code, it looks it has no chance to succeed without some extra steps. +a number of tests will most certainly. To understand the root cause, let's investigate a bit. -`make test` uses `_assets/scripts/run_unit_tests.sh`, where we find the following fragment: +`make test` uses `_assets/scripts/run_unit_tests.sh` under the hood, where we find the following fragment: ```bash if [[ $HAS_PROTOCOL_PACKAGE == 'false' ]]; then @@ -144,14 +144,14 @@ else fi ``` -From the comments, we see that the `else` branch will be used. It is split into two parts: +From the comments, we see that the `else` branch is currently used when running the tests. It splits running tests into two parts: 1. All the tests except for the tests for `status-go/protocol` module, those are faster, which is reflected in the the shorter timeout: `DEFAULT_TIMEOUT_MINUTES=5`. -2. The `protocol tests` - slower (`PROTOCOL_TIMEOUT_MINUTES=45`). By default `UNIT_TEST_COUNT=1`. +2. The `protocol tests` - there are many of them (over 900) and can take longer to run (`PROTOCOL_TIMEOUT_MINUTES=45`). By default `UNIT_TEST_COUNT=1`, which means it tries to run the protocol tests only once. -For our regular development, we may not like to run all tests. In particular, the `protocol` tests seem to be less relevant to our use case of message history archives. Thus, in what follows I am skipping the longer protocol tests. +> The timeout variables `DEFAULT_TIMEOUT_MINUTES` and `PROTOCOL_TIMEOUT_MINUTES` are used as the value of the `-timeout` option passed down to `go test`. It limits the time all the tests are allowing to take. -Now, if you run `make test` the tests will fail: +We may observe more or less failures, depending on the run, but one test will consistently fail, even if we modify the script to only run non-protocol tests: `TestBasicWakuV2`: ```bash === RUN TestBasicWakuV2 @@ -163,7 +163,7 @@ Now, if you run `make test` the tests will fail: --- FAIL: TestBasicWakuV2 (0.00s) ``` -Indeed, we can confirm it by running just the `TestBasicWakuV2`: +Let's try to run this test without using the `run_unit_tests.sh` script to confirm the problem: ```bash gotestsum --packages="./messaging/waku" -f testname --rerun-fails -- \ @@ -174,7 +174,7 @@ gotestsum --packages="./messaging/waku" -f testname --rerun-fails -- \ and we will get the same error. -If we look into source code of `messaging/waku/waku_test.go`, and scroll down a bit (!!), we will find the following comment: +If we look into source code of `messaging/waku/waku_test.go` where `TestBasicWakuV2` is defined, and scroll down a bit (!!), we will find the following comment: ```go // In order to run these tests, you must run an nwaku node @@ -257,7 +257,7 @@ PASS messaging/waku DONE 14 tests, 1 skipped in 33.720s ``` -Now, we should also be able to successfully run all the tests using `make test`: +Now, we should also be able to successfully run all the non-protocol tests using `make test`: ```bash make test @@ -341,7 +341,7 @@ DONE 2 tests in 0.307s ### Running "protocol" tests -I only run all the tests (including `protocol` tests) using `make test` once. Got most of the test pass, but not all. To get a better feedback and to track progress, I prefer to run them using `gotestsum` command: +When runing all the tests (including `protocol` tests) using `make test`, most of the tests pass, but not all. As already indicated above, in order to get a better feedback and to track progress, I prefer to run them using `gotestsum` command: ```bash gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout "45m" -tags "gowaku_no_rln gowaku_skip_migrations" | tee "test_1.log" @@ -349,9 +349,9 @@ gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout DONE 964 tests, 5 skipped in 1159.570s ``` -Redirecting output to a file is pretty much needed as `protocol` tests generate more output. +Redirecting output to a file using `tee` is pretty much needed as `protocol` tests may generate a lot of log messages. -Here just for the record - an example failing session: +Here - just for the record - an example failing session: ```bash gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout "45m" -tags "gowaku_no_rln gowaku_skip_migrations" | tee "test_1.log @@ -359,7 +359,7 @@ gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout DONE 3 runs, 968 tests, 5 skipped, 6 failures in 1194.882s ``` -So, the reason I recorded it, is that the output can be pretty misleading if you are seeing this output for the first time. The `6 failures` is actually $1$ (one) failing test: +So, the reason I recorded it here, is that the output can be pretty misleading if you are seeing this output for the first time. The `6 failures` is actually $1$ (one) failing test: ```bash TestMessengerCommunitiesTokenPermissionsSuite/TestAnnouncementsChannelPermissions @@ -416,3 +416,5 @@ DONE 2 tests in 1.453s ... DONE 3 runs, 6 tests, 4 failures in 27.876s ``` + +Thus, being able to run all the tests successfully a number of time, we should be allowed to conclude that our setup is correct. \ No newline at end of file From 6a0e3136881ef993db7436d42bd029fca8756e05 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Thu, 25 Sep 2025 06:08:55 +0200 Subject: [PATCH 11/25] some dev docs added --- ...tory Archives - InitHistoryArchiveTasks.md | 203 ++++++ 10 Notes/Running Unit Tests for status-go.md | 57 +- 10 Notes/Team-NLBR Solution Proposal.md | 18 +- 10 Notes/status-go processing magnet links.md | 596 ++++++++++++++++++ 10 Notes/status-go publishing magnet links.md | 186 ++++++ ...tus-go-codex integration - design notes.md | 265 ++++++++ 6 files changed, 1321 insertions(+), 4 deletions(-) create mode 100644 10 Notes/Creating History Archives - InitHistoryArchiveTasks.md create mode 100644 10 Notes/status-go processing magnet links.md create mode 100644 10 Notes/status-go publishing magnet links.md create mode 100644 10 Notes/status-go-codex integration - design notes.md diff --git a/10 Notes/Creating History Archives - InitHistoryArchiveTasks.md b/10 Notes/Creating History Archives - InitHistoryArchiveTasks.md new file mode 100644 index 0000000..c4f0381 --- /dev/null +++ b/10 Notes/Creating History Archives - InitHistoryArchiveTasks.md @@ -0,0 +1,203 @@ +--- +related-to: + - "[[Team-NLBR Solution Proposal]]" + - "[[status-go publishing magnet links]]" + - "[[status-go processing magnet links]]" + - "[[status-go-codex integration - design notes]]" + - "[[Creating History Archives - InitHistoryArchiveTasks]]" +--- +Great question! Let me trace the connection between `StartHistoryArchiveTasksInterval` and `InitHistoryArchiveTasks` to show you how the periodic archive creation system is initialized and started. + +Searched codebase for "InitHistoryArchiveTasks StartHistoryArchiveTasksInterval", 13 results + +Perfect! Now I can show you the complete connection between `InitHistoryArchiveTasks` and `StartHistoryArchiveTasksInterval`. Let me trace through this step by step: + +## **Connection Flow: `InitHistoryArchiveTasks` → `StartHistoryArchiveTasksInterval`** + +### **1. Where `InitHistoryArchiveTasks` is Called** + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger.go#640-640), lines 640 to 655 + +`InitHistoryArchiveTasks` is called from **two main places**: + +**A. During `Messenger.Start()` (startup):** +```go +// In messenger.go Start() method +controlledCommunities, err := m.communitiesManager.Controlled() +if err != nil { + return nil, err +} + +if m.archiveManager.IsReady() { + go func() { + // Wait for store node to be available + select { + case <-m.ctx.Done(): + return + case <-m.messaging.OnStorenodeAvailable(): + } + m.InitHistoryArchiveTasks(controlledCommunities) // CALLED HERE + }() +} +``` + +**B. When enabling archive protocol:** +```go +// In EnableCommunityHistoryArchiveProtocol() +controlledCommunities, err := m.communitiesManager.Controlled() +if err != nil { + return err +} + +if len(controlledCommunities) > 0 { + go m.InitHistoryArchiveTasks(controlledCommunities) // CALLED HERE +} +``` + +### **2. What `InitHistoryArchiveTasks` Does** + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#3770-3770), lines 3770 to 3810 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#3810-3810), lines 3810 to 3840 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#3840-3840), lines 3840 to 3880 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#3880-3880), lines 3880 to 3895 + +### **3. How `StartHistoryArchiveTasksInterval` Works** + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager_archive.go#320-320), lines 320 to 345 + +## **Complete Connection Flow** + +Here's the detailed connection between `InitHistoryArchiveTasks` and `StartHistoryArchiveTasksInterval`: + +### **1. Initialization Chain** + +``` +Messenger.Start() [startup] + ↓ +Wait for store node availability + ↓ +InitHistoryArchiveTasks(controlledCommunities) + ↓ +For each controlled community: + ├─ Check if archive support enabled + ├─ Seed existing torrents if available + ├─ Get community chat filters/topics + ├─ Request missed messages from store nodes + ├─ Check last archive timestamp + └─ Decide archive strategy: + ├─ Case 1: No archives yet → StartHistoryArchiveTasksInterval() + ├─ Case 2: Recent archive → Seed + delayed start → StartHistoryArchiveTasksInterval() + └─ Case 3: Old archive → Create new + StartHistoryArchiveTasksInterval() +``` + +### **2. The Three Archive Strategy Cases** + +**Case 1: No Previous Archives (`lastArchiveEndDateTimestamp == 0`)** +```go +// No prior messages to be archived, so we just kick off the archive creation loop +// for future archives +go m.archiveManager.StartHistoryArchiveTasksInterval(c, messageArchiveInterval) +``` + +**Case 2: Recent Archive (`durationSinceLastArchive < messageArchiveInterval`)** +```go +// Last archive is less than `interval` old, wait until `interval` is complete, +// then create archive and kick off archive creation loop for future archives +// Seed current archive in the meantime +err := m.archiveManager.SeedHistoryArchiveTorrent(c.ID()) + +timeToNextInterval := messageArchiveInterval - durationSinceLastArchive +time.AfterFunc(timeToNextInterval, func() { + err := m.archiveManager.CreateAndSeedHistoryArchive(c.ID(), topics, lastArchiveEndDate, to.Add(timeToNextInterval), messageArchiveInterval, c.Encrypted()) + go m.archiveManager.StartHistoryArchiveTasksInterval(c, messageArchiveInterval) +}) +``` + +**Case 3: Old Archive (`durationSinceLastArchive >= messageArchiveInterval`)** +```go +// Looks like the last archive was generated more than `interval` +// ago, so lets create a new archive now and then schedule the archive +// creation loop +err := m.archiveManager.CreateAndSeedHistoryArchive(c.ID(), topics, lastArchiveEndDate, to, messageArchiveInterval, c.Encrypted()) + +go m.archiveManager.StartHistoryArchiveTasksInterval(c, messageArchiveInterval) +``` + +### **3. What `StartHistoryArchiveTasksInterval` Does** + +```go +func (m *ArchiveManager) StartHistoryArchiveTasksInterval(community *Community, interval time.Duration) { + // 1. Check if already running for this community + if _, exists := m.historyArchiveTasks.Load(id); exists { + return // Already running + } + + // 2. Set up cancellation and tracking + cancel := make(chan struct{}) + m.historyArchiveTasks.Store(id, cancel) + m.historyArchiveTasksWaitGroup.Add(1) + + // 3. Start periodic ticker + ticker := time.NewTicker(interval) // Default: 1 hour intervals + + // 4. Archive creation loop + for { + select { + case <-ticker.C: + // Every interval, create and seed new archive + err = m.CreateAndSeedHistoryArchive(community.ID(), topics, lastArchiveEndDate, to, interval, community.Encrypted()) + + case <-cancel: + // Cleanup and exit + m.UnseedHistoryArchiveTorrent(community.ID()) + m.historyArchiveTasks.Delete(id) + m.historyArchiveTasksWaitGroup.Done() + return + } + } +} +``` + +### **4. The Interval Constants** + +Searched text for `messageArchiveInterval` (`**/messenger_communities.go`), 20 results + +The default interval is **7 days** (`7 * 24 * time.Hour`). + +### **5. Complete Flow Summary** + +``` +System Startup + ↓ +Messenger.Start() + ↓ +Wait for Store Node Availability + ↓ +InitHistoryArchiveTasks(controlledCommunities) + │ + ├─ For each community owner controls: + │ ├─ Check if archive support enabled + │ ├─ Seed existing torrents (if available) + | ├─ CreateAndSeedHistoryArchive + │ ├─ Get community topics and sync missed messages + │ ├─ Check when last archive was created + │ └─ Based on last archive timing: + │ ├─ No archives → StartHistoryArchiveTasksInterval() immediately + │ ├─ Recent archive → Seed + delayed CreateAndSeedHistoryArchive followed by StartHistoryArchiveTasksInterval() + │ └─ Old archive → Create new archive + CreateAndSeedHistoryArchive + StartHistoryArchiveTasksInterval() + │ + └─ Each StartHistoryArchiveTasksInterval(): + ├─ Runs as background goroutine + ├─ Creates ticker with 7-day interval + ├─ Every 7 days: CreateAndSeedHistoryArchive() + ├─ After seeding: publishes HistoryArchivesSeedingSignal + ├─ Signal triggers: dispatchMagnetlinkMessage() + └─ Magnetlink sent to all community members via Waku +``` + +So `InitHistoryArchiveTasks` is the **initialization and setup function** that analyzes each community's archive state and decides how to start the periodic archive creation, while `StartHistoryArchiveTasksInterval` is the **long-running background worker** that actually performs the periodic archive creation every 7 days. + +The connection is that `InitHistoryArchiveTasks` **always ends up calling** `StartHistoryArchiveTasksInterval` for each community (either immediately, delayed, or after creating a catch-up archive), making it the entry point that bootstraps the entire periodic archive system. \ No newline at end of file diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index 963acc9..72675e9 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -22,6 +22,12 @@ Plus, and what the original documentation does not say, you will need `gotestsum go install gotest.tools/gotestsum@latest ``` +or to use specific version (`v1.13.0` was the most recent while writing this doc): + +```bash +go install gotest.tools/gotestsum@v1.13.0 +``` + You can check it is available by running: ```bash @@ -29,8 +35,57 @@ gotestsum --version gotestsum version dev ``` -> `dev` version may be coming from using `@latest` when installing `gotestsum`. +`dev` version comes from using `@latest` when installing `gotestsum`. If you installed a concrete version, you will see: +```bash +gotestsum --version +gotestsum version v1.13.0 +``` + +You may also manually install go Protobuf compiler: `protoc`. I have followed the instructions from [Protocol Buffer Compiler Installation](https://protobuf.dev/installation/). + +The following bash script (Arch Linux) can come in handy: + +```bash +#!/usr/bin/env bash + +set -euo pipefail + +echo "installing go..." + +sudo pacman -S --noconfirm --needed go + +echo "installing go protoc compiler" + +PB_REL="https://github.com/protocolbuffers/protobuf/releases" +VERSION="32.1" +FILE="protoc-${VERSION}-linux-x86_64.zip" + +# 1. create a temp dir +TMP_DIR="$(mktemp -d)" + +# ensure cleanup on exit +trap 'rm -rf "$TMP_DIR"' EXIT + +echo "Created temp dir: $TMP_DIR" + +# 2. download file into temp dir +curl -L -o "$TMP_DIR/$FILE" "$PB_REL/download/v$VERSION/$FILE" + +# 3. unzip into ~/.local/share/go +mkdir -p "$HOME/.local/share/go" +unzip -o "$TMP_DIR/$FILE" -d "$HOME/.local/share/go" + +# 4. cleanup handled automatically by trap +echo "protoc $VERSION installed into $HOME/.local/share/go" +``` + +After that make sure that `$HOME/.local/share/go/bin` is in your path, and you should get: + +```bash +protoc --version +libprotoc 32.1 +``` ### Building backend and the libs Just to check if everything is setup correctly, let's build `status-backend` (which is a wrapper over status-go that provides web API - handy for testing), and then status-go static and shared libraries: diff --git a/10 Notes/Team-NLBR Solution Proposal.md b/10 Notes/Team-NLBR Solution Proposal.md index fc87728..f2ce103 100644 --- a/10 Notes/Team-NLBR Solution Proposal.md +++ b/10 Notes/Team-NLBR Solution Proposal.md @@ -1,3 +1,11 @@ +--- +related-to: + - "[[Team-NLBR Solution Proposal]]" + - "[[status-go publishing magnet links]]" + - "[[status-go processing magnet links]]" + - "[[status-go-codex integration - design notes]]" + - "[[Creating History Archives - InitHistoryArchiveTasks]]" +--- The `TorrentConfig` type provides the configuration for the BitTorrent-based History Archive management functionality: ```go @@ -113,9 +121,9 @@ wakuMessageArchiveIndex[archiveID] = wakuMessageArchiveIndexMetadata > `wakuMessageArchiveIndex` is earlier initialized to contain existing archive index entries from the current `index` file. Here we are basically appending new archive meta to the archive index data structure. -We repeat the whole process for each message chunk in the given time period, adding more period if needed (recall, each period is 7 days long). +We repeat the whole process for each message chunk in the given time period, adding more periods if needed (recall, each period is 7 days long). -After that we have a list of new archives (in `encodedArchives`) and a new archive index entries. We are ready to be encoded and serialized to the corresponding `data` (by appending) and `index` files. +After that we have a list of new archives (in `encodedArchives`) and a new archive index entries. They are ready to be encoded and serialized to the corresponding `data` (by appending) and `index` files. Finally, the corresponding torrent file is (re)created, the `HistoryArchivesCreatedSignal` is emitted, and the last message archive end date is recorded in the persistence. @@ -153,7 +161,11 @@ type WakuMessageArchiveIndexMetadata struct { } ``` -We then upload the resulting `index` to Codex under its own `index` CID. Instead of the magnet link, the community owner only publishes this `index` CID. +Now instead of appending each new archive to the data file, we stream each single archive to codex via an API call. For each archive, we receive a CID back from Codex, which we then add to the corresponding archive index metadata entry as defined above. + +After all archive entries are persisted, we then upload the resulting `index` to Codex under its own `index` CID. Instead of the magnet link, the community owner only publishes this `index` CID. + +> If the system fails to publish the index, we assume the archive publishing was unsuccessful and we will start from scratch after restart (to be checked). In other words, we do not have test is torrent file exists. If the previous publishing was successful, then the CIDs are advertised by Codex - they will already stored in the Codex RepoStore. In order to receive the historical messages for the given period (given by `from` and `to` in the `WakuMessageArchiveMetadata`), the receiving node first acquires the `index` using the `index` CID. For each entry in the `index` that the node has interest in, the node then downloads the corresponding archive directly using the `Cid` from this `index` entry. diff --git a/10 Notes/status-go processing magnet links.md b/10 Notes/status-go processing magnet links.md new file mode 100644 index 0000000..ef5fa27 --- /dev/null +++ b/10 Notes/status-go processing magnet links.md @@ -0,0 +1,596 @@ +--- +related-to: + - "[[Team-NLBR Solution Proposal]]" + - "[[status-go publishing magnet links]]" + - "[[status-go processing magnet links]]" + - "[[status-go-codex integration - design notes]]" + - "[[Creating History Archives - InitHistoryArchiveTasks]]" +--- +marcinczenko: What is the difference in handleImportedMessages and handleRetrievedMessages. How are they used? + +GitHub Copilot: I'll examine the two methods `handleImportedMessages` and `handleRetrievedMessages` to understand their differences and usage. + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger.go#2900-2900), lines 2900 to 3100 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger.go#3100-3100), lines 3100 to 3300 + +Now let me search for where these methods are called to understand their usage patterns: + +Searched text for `handleImportedMessages|handleRetrievedMessages` (`**//home/mc2/code/status-im/status-go/protocol/**`), 6 results + +Let me examine the context where these methods are called: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger.go#2670-2670), lines 2670 to 2700 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#1480-1480), lines 1480 to 1510 + +Now let me look at the specific message handling in both methods: + +Searched text for `dispatchToHandler` (`**/messenger.go`), 2 results + +Let me check the dispatchToHandler method to understand the difference: + +Searched codebase for "dispatchToHandler method implementation", 15 results + +Great! Now I can see the `dispatchToHandler` method is generated. Let me also check the specific handling in `handleImportedMessages`: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger.go#3030-3030), lines 3030 to 3080 + +Now let me also check the context where these are used in messenger_handler.go: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#1460-1460), lines 1460 to 1520 + +Let me check what method contains this logic by looking for the function signature: + +Searched text for `func (m *Messenger)` (`**/messenger_handler.go`), 20 results + +Let me look for the function that contains the separation logic: + +Searched text for `ThirdPartyID` (`**/messenger_handler.go`), 6 results + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#1440-1440), lines 1440 to 1470 + +Perfect! Now I can see the complete picture. Based on my analysis of the code, I can explain the differences between `handleImportedMessages` and `handleRetrievedMessages`: + +## Differences between `handleImportedMessages` and `handleRetrievedMessages` + +### **1. Purpose and Context** + +**`handleImportedMessages`:** +- Specifically designed for handling **imported/archived messages** (e.g., from Discord imports or community history archives) +- Used when messages have a `ThirdPartyID` (indicating they come from external sources) +- Part of the history import/archive restoration functionality + +**`handleRetrievedMessages`:** +- General-purpose message handler for **regular incoming messages** +- Used for normal message flow from the messaging protocol +- Called by `RetrieveAll()` which is the main message retrieval mechanism + +### **2. Message Separation Logic** + +In `handleArchiveMessages()` method in messenger_handler.go, messages are separated based on `ThirdPartyID`: + +```go +for filter, messages := range messagesToHandle { + for _, message := range messages { + if message.ThirdPartyID != "" { + importedMessages[filter] = append(importedMessages[filter], message) // → handleImportedMessages + } else { + otherMessages[filter] = append(otherMessages[filter], message) // → handleRetrievedMessages + } + } +} +``` + +### **3. Message Type Handling** + +**`handleImportedMessages`:** +- **Limited scope**: Only handles specific message types: + - `CHAT_MESSAGE` + - `PIN_MESSAGE` +- Uses hardcoded switch statement for message type handling +- More restrictive and focused on basic message types + +**`handleRetrievedMessages`:** +- **Full scope**: Handles all message types using `dispatchToHandler()` +- `dispatchToHandler()` is auto-generated and routes to appropriate handlers for all supported message types +- More comprehensive message processing + +### **4. Feature Differences** + +**`handleImportedMessages`:** +- **No mutex protection** during main processing (only for Discord-specific saves) +- **No notifications/activity center** updates +- **No community message storage** in Waku +- **No metrics tracking** +- **No blocked user filtering** +- **No datasync metadata handling** +- **No installation/shared secrets handling** +- Focuses on basic message persistence + +**`handleRetrievedMessages`:** +- **Full mutex protection** (`m.handleMessagesMutex`) +- **Community message storage** for controlled communities +- **Metrics tracking** (`MetricsPushReceivedMessages`) +- **Blocked user filtering** +- **Datasync metadata handling** +- **Installation and shared secrets handling** +- **Activity center notifications** +- **Contact management** +- Returns a full `MessengerResponse` + +### **5. Return Values** + +**`handleImportedMessages`:** +- Returns `error` only +- No response object for UI updates + +**`handleRetrievedMessages`:** +- Returns `(*MessengerResponse, error)` +- Provides full response for UI updates via `saveDataAndPrepareResponse()` + +### **6. Usage Context** + +**`handleImportedMessages`:** +- Used in archive restoration scenarios +- Called when processing historical/imported messages from external sources +- Part of the community history import functionality + +**`handleRetrievedMessages`:** +- Used in normal message flow +- Called by `RetrieveAll()` which is invoked by `ProcessAllMessages()` +- Part of the regular message processing loop + +### **Summary** + +`handleImportedMessages` is a **lightweight, specialized handler** for processing historical/imported messages with minimal side effects, while `handleRetrievedMessages` is the **full-featured, comprehensive handler** for regular message processing with all the bells and whistles (notifications, community features, metrics, etc.). + +The separation ensures that imported messages don't trigger unnecessary notifications or duplicate processing while still preserving the message content in the database. + +marcinczenko: ok, both functions are called by `handleArchiveMessages`, which is called by `importHistoryArchive`, which in turn is called by either `resumeHistoryArchivesImport` or `downloadAndImportHistoryArchives`. The `downloadAndImportHistoryArchives` is in turn called indirectly by `handleRetrievedMessages` - which looks like a circural dependency, which I can really understand. I am trying to get a better picure of the process of archive history download... + +GitHub Copilot: You're absolutely right to be confused about this circular dependency! Let me trace through the archive history download process to clarify what's happening. Let me examine the call chain you mentioned. + +Searched codebase for "downloadAndImportHistoryArchives function implementation", 13 results + +Now let me look at the specific methods to understand the flow better: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#1410-1410), lines 1410 to 1450 + +Searched text for `downloadAndImportHistoryArchives` (`**/messenger_handler.go`), 6 results + +Now let me search for where `handleRetrievedMessages` might indirectly call `downloadAndImportHistoryArchives`: + +Searched text for `HandleHistoryArchiveMagnetlinkMessage` (`**/messenger_handler.go`), 4 results + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#3980-3980), lines 3980 to 4010 + +Let me search for what calls `HandleCommunityMessageArchiveMagnetlink`: + +Searched text for `HandleCommunityMessageArchiveMagnetlink` (`**/*.go`), 8 results + +Now let me check the `dispatchToHandler` generated file: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handlers.go#130-130), lines 130 to 150 + +Perfect! Now I can see the complete picture. The apparent "circular dependency" you noticed is not actually circular, but rather involves **different message types flowing through the system**. Let me explain the complete archive history download process: + +## **Archive History Download Process Flow** + +### **1. Initial Trigger Points** +There are several ways archive downloads can be triggered: + +**A. Via `resumeHistoryArchivesImport()`:** +- Called during startup to resume interrupted downloads +- Directly calls `importHistoryArchives()` to process already-downloaded archives + +**B. Via received magnetlink messages:** +- `handleRetrievedMessages()` processes incoming `COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` messages +- This goes through `dispatchToHandler()` → `handleCommunityMessageArchiveMagnetlinkProtobuf()` → `HandleCommunityMessageArchiveMagnetlink()` → `HandleHistoryArchiveMagnetlinkMessage()` +- Which then spawns a goroutine that calls `downloadAndImportHistoryArchives()` + +**C. Via community join responses:** +- When joining a community, `HandleCommunityRequestToJoinResponse()` also calls `downloadAndImportHistoryArchives()` + +### **2. The Download and Import Pipeline** + +``` +downloadAndImportHistoryArchives() + ↓ + 1. DownloadHistoryArchivesByMagnetlink() [downloads archives via torrent] + ↓ + 2. importHistoryArchives() [processes downloaded archives] + ↓ + 3. ExtractMessagesFromHistoryArchive() [extracts messages from archive files] + ↓ + 4. handleArchiveMessages() [processes the extracted messages] + ↓ + 5. Separates messages by ThirdPartyID: + - Messages WITH ThirdPartyID → handleImportedMessages() + - Messages WITHOUT ThirdPartyID → handleRetrievedMessages() +``` + +### **3. The Key Insight: Different Message Types** + +The "circular dependency" you noticed is actually **different message flows**: + +**Flow A: Regular Messages → Archive Download** +1. `handleRetrievedMessages()` processes regular incoming messages from the network +2. One of these messages might be a `COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` message +3. This triggers `downloadAndImportHistoryArchives()` to download new archives + +**Flow B: Archive Processing → Message Handling** +1. `downloadAndImportHistoryArchives()` downloads archive files +2. `importHistoryArchives()` extracts messages from archives +3. `handleArchiveMessages()` processes these extracted historical messages +4. These messages are then handled by `handleImportedMessages()` and `handleRetrievedMessages()` again + +### **4. The Separation Logic** + +In `handleArchiveMessages()`, messages are separated based on `ThirdPartyID`: + +```go +for filter, messages := range messagesToHandle { + for _, message := range messages { + if message.ThirdPartyID != "" { + importedMessages[filter] = append(importedMessages[filter], message) // External imports (Discord, etc.) + } else { + otherMessages[filter] = append(otherMessages[filter], message) // Regular Status messages + } + } +} +``` + +### **5. Why This Design Makes Sense** + +1. **Regular message processing** (`handleRetrievedMessages`) can trigger **archive downloads** when magnetlink messages arrive +2. **Archive processing** can extract both **imported messages** (Discord, etc.) and **regular Status messages** +3. **Different handlers** are used based on message origin and type: + - `handleImportedMessages()`: Lightweight processing for external imports + - `handleRetrievedMessages()`: Full-featured processing for Status messages + +### **6. Complete Flow Diagram** + +``` +Network Messages → handleRetrievedMessages() + ↓ + [If MAGNETLINK message] → downloadAndImportHistoryArchives() + ↓ + Download Archive Files → importHistoryArchives() + ↓ + Extract Messages → handleArchiveMessages() + ↓ + Separate by ThirdPartyID: + ├─ External Messages → handleImportedMessages() + └─ Status Messages → handleRetrievedMessages() [different context] +``` + +So it's not circular - it's a **layered system** where: +- **Network messages** can trigger **archive downloads** +- **Archive processing** extracts **historical messages** +- **Historical messages** are processed through appropriate handlers + +The same function names are used, but they're processing **different types of messages** in **different contexts**. + +marcinczenko: ok, so the MAGNETLINK message can only come from the network I guess, and not from the archive, right? Thus, when `handleRetrievedMessages` is called in the response to the MAGETLINK message, it will process it differntly (it will not call downloadAndImportHistoryArchives). Is this correct? + +GitHub Copilot: You're absolutely correct! That's a very insightful observation. Let me confirm this by examining the logic: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#1450-1450), lines 1450 to 1500 + +Now let me check the parameters passed to `handleRetrievedMessages` in different contexts: + +Searched text for `handleRetrievedMessages` (`**/*.go`), 6 results + +Perfect! Looking at the function signature and calls: + +```go +func (m *Messenger) handleRetrievedMessages(chatWithMessages map[messagingtypes.ChatFilter][]*messagingtypes.ReceivedMessage, storeWakuMessages bool, fromArchive bool) (*MessengerResponse, error) +``` + +**Yes, you are absolutely correct!** Here's the key distinction: + +### **1. Network Messages (including MAGNETLINK):** +```go +// From RetrieveAll() -> called for regular network message processing +return m.handleRetrievedMessages(chatWithMessages, true, false) +// ^^^^ ^^^^^ +// storeWaku fromArchive=false +``` + +### **2. Archive Messages:** +```go +// From handleArchiveMessages() -> called when processing extracted archive messages +response, err := m.handleRetrievedMessages(otherMessages, false, true) +// ^^^^^ ^^^^ +// storeWaku fromArchive=true +``` + +### **3. The Key Parameter: `fromArchive`** + +When `fromArchive=true`, the `dispatchToHandler` call passes this parameter: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger.go#3240-3240), lines 3240 to 3250 + +Now let me check if the generated handlers use this `fromArchive` parameter: + +Read [](file:///home/mc2/code/status-im/status-go/cmd/generate_handlers/generate_handlers_template.txt#15-15), lines 15 to 45 + +Let me check the specific handler for MAGNETLINK messages: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handlers.go#1000-1000), lines 1000 to 1020 + +I notice that the magnetlink handler doesn't have the `fromArchive` parameter. Let me check if there's a configuration that controls this: + +Searched text for `CommunityMessageArchiveMagnetlink.*fromArchive|fromArchive.*CommunityMessageArchiveMagnetlink` (`**/*.go`), no results + +Let me check what determines if a handler gets the `fromArchive` parameter by looking at the handler generation: + +Searched text for `FromArchiveArg` (`**/cmd/generate_handlers/**`), 5 results + +Perfect! Now I can see the complete picture: + +Read [](file:///home/mc2/code/status-im/status-go/cmd/generate_handlers/generate_handlers.go#65-65), lines 65 to 75 + +## **You are 100% correct!** Here's why: + +### **1. MAGNETLINK Messages and Archive Context** + +**MAGNETLINK messages (`CommunityMessageArchiveMagnetlink`) can ONLY come from the network**, not from archives, because: + +1. **Archive files don't contain MAGNETLINK messages** - they contain the actual chat messages, pin messages, etc. that were archived +2. **MAGNETLINK messages are instructions to download archives** - they wouldn't be stored inside the archives themselves (that would be recursive) +3. **Only specific message types can come from archives**: According to the handler generation code, only `ChatMessage` and `PinMessage` get the `fromArchive` parameter + +### **2. Handler Behavior Differences** + +```go +// Only these message types get fromArchive parameter: +info.FromArchiveArg = protobufName == "ChatMessage" || protobufName == "PinMessage" +``` + +This means: +- **`CommunityMessageArchiveMagnetlink` handler** does NOT get `fromArchive` parameter +- **`ChatMessage` and `PinMessage` handlers** DO get `fromArchive` parameter and can behave differently + +### **3. The Safety Mechanism** + +When `handleRetrievedMessages` is called in different contexts: + +**A. Network Messages (fromArchive=false):** +- MAGNETLINK messages can trigger `downloadAndImportHistoryArchives()` +- This is the normal behavior for network-received magnetlinks + +**B. Archive Messages (fromArchive=true):** +- MAGNETLINK messages **cannot exist** in archives (they're not archived) +- Even if they did, the handler doesn't have access to `fromArchive` to change behavior +- But `ChatMessage` and `PinMessage` handlers **do** get `fromArchive=true` and can behave accordingly + +### **4. Logical Flow Protection** + +``` +Network Message Flow: +MAGNETLINK arrives via network +→ handleRetrievedMessages(fromArchive=false) +→ HandleCommunityMessageArchiveMagnetlink() +→ downloadAndImportHistoryArchives() ✓ ALLOWED + +Archive Processing Flow: +Archive extracted messages +→ handleRetrievedMessages(fromArchive=true) +→ Only ChatMessage/PinMessage handlers get fromArchive=true +→ MAGNETLINK messages don't exist in archives anyway ✓ SAFE +``` + +So yes, your understanding is perfect! The system naturally prevents infinite loops because: + +1. **MAGNETLINK messages only come from the network** +2. **Archive files only contain chat content messages** +3. **The `fromArchive` parameter** allows handlers to behave differently when processing historical vs. live messages +4. **Only relevant message types** get the `fromArchive` parameter + +This is a well-designed system that prevents the circular dependency issue you were concerned about! + +marcinczenko: Can you show me with more details the flow of receiving the magnet link before and how it is connected to `RetrieveAll()`? + +GitHub Copilot: Absolutely! Let me trace the complete flow from the very beginning of how a magnetlink message arrives and gets processed through to `RetrieveAll()`. This will show you the entire message reception pipeline. + +Searched codebase for "RetrieveAll message retrieval from network waku", 26 results + +Perfect! Now I can show you the complete detailed flow of how a magnetlink message travels from the network to `RetrieveAll()`. Let me trace this step by step: + +## **Complete Magnetlink Message Flow - From Network to `RetrieveAll()`** + +### **1. Network Layer - Message Reception** + +``` +Waku Network + ↓ +OnNewEnvelope() [waku/nwaku.go or waku/gowaku.go] + ↓ +postEvent(envelope) + ↓ +msgQueue <- envelope [buffered channel] +``` + +**Details:** +- Messages arrive from the Waku network via `OnNewEnvelope()` +- Messages are queued in `msgQueue` (buffered channel with `messageQueueLimit`) +- `processQueueLoop()` continuously processes this queue + +Read [](file:///home/mc2/code/status-im/status-go/messaging/waku/nwaku.go#1180-1180), lines 1180 to 1200 + +### **2. Message Store Layer** + +``` +processMessage(envelope) + ↓ +filter.Messages.Add(message) [MemoryMessageStore] + ↓ +Messages stored in filter-specific stores +``` + +**Details:** +- `processMessage()` routes messages to appropriate filters based on topic +- Each filter has its own `MemoryMessageStore` where messages accumulate +- Messages wait here until retrieved by `RetrieveAll()` + +Read [](file:///home/mc2/code/status-im/status-go/messaging/waku/nwaku.go#1200-1200), lines 1200 to 1215 + +Read [](file:///home/mc2/code/status-im/status-go/messaging/waku/nwaku.go#1215-1215), lines 1215 to 1235 + +### **3. Message Retrieval Trigger** + +The `RetrieveAll()` is called either: + +**A. Periodically via the Message Loop:** +``` +StartRetrieveMessagesLoop() [called at startup] + ↓ + ticker.C (every tick interval) + ↓ + ProcessAllMessages() + ↓ + RetrieveAll() +``` + +**B. Manually by the application:** +``` +Direct call to RetrieveAll() +``` + +### **4. The RetrieveAll() Chain** + +```go +// messenger.go +func (m *Messenger) RetrieveAll() (*MessengerResponse, error) { + chatWithMessages, err := m.messaging.RetrieveRawAll() // Step A + if err != nil { + return nil, err + } + return m.handleRetrievedMessages(chatWithMessages, true, false) // Step B +} +``` + +### **Step A: `m.messaging.RetrieveRawAll()`** + +Read [](file:///home/mc2/code/status-im/status-go/messaging/api.go#150-150), lines 150 to 165 + +This calls into the transport layer: + +Read [](file:///home/mc2/code/status-im/status-go/messaging/layers/transport/transport.go#210-210), lines 210 to 240 + +The key call here is `t.api.GetFilterMessages(filter.FilterID)`: + +Read [](file:///home/mc2/code/status-im/status-go/messaging/waku/api.go#344-344), lines 344 to 359 + +**This is where the stored messages are retrieved!** `f.Retrieve()` calls the filter's message store: + +Read [](file:///home/mc2/code/status-im/status-go/messaging/waku/common/message.go#140-140), lines 140 to 155 + +### **Step B: `handleRetrievedMessages()`** + +Now we have the messages collected from all filters. Let's trace what happens next: + +```go +// messenger.go - handleRetrievedMessages() +func (m *Messenger) handleRetrievedMessages(chatWithMessages map[messagingtypes.ChatFilter][]*messagingtypes.ReceivedMessage, storeWakuMessages bool, fromArchive bool) (*MessengerResponse, error) { + // Process each message through the handler pipeline + for iterator.HasNext() { + filter, messages := iterator.Next() + for _, shhMessage := range messages { + // Decode the raw message + handleMessagesResponse, err := m.messaging.HandleReceivedMessages(shhMessage) + + for _, msg := range statusMessages { + // Route to appropriate handler + err := m.dispatchToHandler(messageState, msg.ApplicationLayer.Payload, msg, filter, fromArchive) + + // If this is a MAGNETLINK message, it goes to: + // dispatchToHandler() → handleCommunityMessageArchiveMagnetlinkProtobuf() + // → HandleCommunityMessageArchiveMagnetlink() → HandleHistoryArchiveMagnetlinkMessage() + // → downloadAndImportHistoryArchives() + } + } + } +} +``` + +### **5. Complete Flow Diagram** + +``` +┌─────────────────────────────────────────────────────────────────┐ +│ NETWORK LAYER │ +└─────────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────────┐ +│ WAKU MESSAGE RECEPTION │ +│ Network → OnNewEnvelope() → postEvent() → msgQueue │ +└─────────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────────┐ +│ MESSAGE STORE LAYER │ +│ processQueueLoop() → processMessage() → filter.Messages.Add() │ +│ │ +│ Messages stored in MemoryMessageStore per filter │ +└─────────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────────┐ +│ RETRIEVAL TRIGGER │ +│ │ +│ Timer Loop: │ Manual: │ +│ StartRetrieveMessagesLoop() │ Direct RetrieveAll() │ +│ ↓ │ call │ +│ ProcessAllMessages() │ │ +│ ↓ │ │ +│ RetrieveAll() ←─────────────────┘ │ +└─────────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────────┐ +│ MESSAGE COLLECTION │ +│ RetrieveAll() → messaging.RetrieveRawAll() │ +│ ↓ │ +│ transport.RetrieveRawAll() │ +│ ↓ │ +│ For each filter: api.GetFilterMessages() │ +│ ↓ │ +│ filter.Retrieve() → store.Pop() │ +│ │ +│ Returns: map[ChatFilter][]*ReceivedMessage │ +└─────────────────────────────────────────────────────────────────┘ + ↓ +┌─────────────────────────────────────────────────────────────────┐ +│ MESSAGE PROCESSING │ +│ handleRetrievedMessages(messages, true, false) │ +│ ↓ │ +│ For each message: messaging.HandleReceivedMessages() │ +│ ↓ │ +│ dispatchToHandler() → route by message type │ +│ │ +│ IF MAGNETLINK MESSAGE: │ +│ → handleCommunityMessageArchiveMagnetlinkProtobuf() │ +│ → HandleCommunityMessageArchiveMagnetlink() │ +│ → HandleHistoryArchiveMagnetlinkMessage() │ +│ → downloadAndImportHistoryArchives() [ASYNC GOROUTINE] │ +└─────────────────────────────────────────────────────────────────┘ +``` + +### **6. Key Points About the Flow** + +1. **Asynchronous Message Queue**: Messages from network are queued and processed asynchronously +2. **Per-Filter Storage**: Each chat filter has its own message store +3. **Batch Retrieval**: `RetrieveAll()` collects messages from all filters at once +4. **Cache Deduplication**: Transport layer checks cache to avoid reprocessing +5. **Message Type Routing**: `dispatchToHandler()` routes messages to type-specific handlers +6. **MAGNETLINK Processing**: MAGNETLINK messages trigger async archive downloads +7. **Regular Polling**: The retrieve loop runs continuously to process new messages + +### **7. Why This Design Works Well** + +- **Network messages flow continuously** into filter stores +- **RetrieveAll() periodically collects** all accumulated messages +- **MAGNETLINK messages** in this flow trigger downloads of historical archives +- **Archive processing** uses a separate flow (`handleArchiveMessages`) that eventually calls `handleRetrievedMessages` again but with `fromArchive=true` +- **No infinite loops** because MAGNETLINK messages only come from network, not archives + +This shows how the live message processing naturally triggers the archive download process when MAGNETLINK messages arrive from community owners! \ No newline at end of file diff --git a/10 Notes/status-go publishing magnet links.md b/10 Notes/status-go publishing magnet links.md new file mode 100644 index 0000000..fe63dae --- /dev/null +++ b/10 Notes/status-go publishing magnet links.md @@ -0,0 +1,186 @@ +--- +related-to: + - "[[Team-NLBR Solution Proposal]]" + - "[[status-go publishing magnet links]]" + - "[[status-go processing magnet links]]" + - "[[status-go-codex integration - design notes]]" + - "[[Creating History Archives - InitHistoryArchiveTasks]]" +--- +See also previous conversation: [[When are magnetlink messages sent]] + +Great question! Let me trace where and how magnetlink messages are published to the Waku network. This is the other side of the equation - how the community owners/admins send these MAGNETLINK messages that we just traced receiving. + +Searched codebase for "publish magnetlink CommunityMessageArchiveMagnetlink send", 20 results + +Perfect! Now I can show you exactly where and how magnetlink messages are published to the Waku network. Let me trace this step by step: + +## **Where Magnetlink Messages are Published to Waku** + +### **1. The Key Function: `dispatchMagnetlinkMessage()`** + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#4079-4079), lines 4079 to 4109 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#4109-4109), lines 4109 to 4124 + +This is the core function! Let me also check what calls this function: + +Searched text for `dispatchMagnetlinkMessage` (`**/*.go`), 4 results + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#250-250), lines 250 to 270 + +Let me check what this subscription handler is: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#220-220), lines 220 to 250 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#200-200), lines 200 to 220 + +Now I can see the complete picture! Let me trace the flow and also check what triggers the seeding signal: + +Searched text for `HistoryArchivesSeedingSignal` (`**/*.go`), 20 results + +Let me check where the seeding signal is triggered: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager_archive.go#430-430), lines 430 to 440 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager_archive.go#420-420), lines 420 to 435 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager_archive.go#400-400), lines 400 to 420 + +Now let me check where `SeedHistoryArchiveTorrent` is called: + +Searched text for `SeedHistoryArchiveTorrent` (`**/*.go`), 20 results + +Perfect! Now I have the complete picture. Let me also check where the seeding happens from archive creation: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager_archive.go#310-310), lines 310 to 325 + +## **Complete Magnetlink Publication Flow** + +Here's the complete flow of where and how magnetlink messages are published to Waku: + +### **1. Archive Creation and Seeding Triggers** + +**A. Periodic Archive Creation (Community Owner):** +``` +StartHistoryArchiveTasksInterval() [periodic scheduler] + ↓ +CreateAndSeedHistoryArchive() + ↓ +CreateHistoryArchiveTorrentFromDB() [creates .torrent files] + ↓ +SeedHistoryArchiveTorrent() [starts BitTorrent seeding] + ↓ +publisher.publish(HistoryArchivesSeedingSignal) +``` + +**B. Manual Archive Creation:** +``` +Discord Import or other triggers + ↓ +SeedHistoryArchiveTorrent() [directly] + ↓ +publisher.publish(HistoryArchivesSeedingSignal) +``` + +**C. Archive Download Completion:** +``` +DownloadHistoryArchivesByMagnetlink() [when downloading completes] + ↓ +publisher.publish(HistoryArchivesSeedingSignal) [line 642] +``` + +### **2. The Publishing Pipeline** + +``` +SeedHistoryArchiveTorrent() + ↓ +publisher.publish(HistoryArchivesSeedingSignal) [internal event] + ↓ +handleCommunitiesHistoryArchivesSubscription() [event handler] + ↓ +IF community.IsControlNode(): + dispatchMagnetlinkMessage(communityID) + ↓ + Create CommunityMessageArchiveMagnetlink protobuf + ↓ + messaging.SendPublic(context, chatID, rawMessage) + ↓ + [WAKU NETWORK] +``` + +### **3. Key Publication Details** + +**The Message Structure:** +```go +magnetLinkMessage := &protobuf.CommunityMessageArchiveMagnetlink{ + Clock: m.getTimesource().GetCurrentTime(), + MagnetUri: magnetlink, // BitTorrent magnetlink +} + +rawMessage := messagingtypes.RawMessage{ + LocalChatID: chatID, // community.MagnetlinkMessageChannelID() + Sender: community.PrivateKey(), // Signed by community owner + Payload: encodedMessage, + MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK, + SkipGroupMessageWrap: true, // Direct message, no encryption wrapper + PubsubTopic: community.PubsubTopic(), // Community's pubsub topic + Priority: &messagingtypes.LowPriority, +} +``` + +**Where it's Published:** +- **Topic**: Community's pubsub topic (`community.PubsubTopic()`) +- **Chat ID**: `community.MagnetlinkMessageChannelID()` (special channel for magnetlinks) +- **Sender**: Community owner's private key +- **Network**: Public Waku network via `messaging.SendPublic()` + +### **4. Who Can Publish Magnetlinks?** + +Only **community control nodes** (owners) can publish magnetlink messages: +```go +if c.IsControlNode() { + err := m.dispatchMagnetlinkMessage(sub.HistoryArchivesSeedingSignal.CommunityID) +} +``` + +### **5. When are Magnetlinks Published?** + +1. **After creating new archives** (periodic archive creation) +2. **After seeding existing archives** (on startup/reboot) +3. **After downloading and re-seeding archives** (when community owners download from other peers) +4. **After Discord imports** (when historical data is imported) + +### **6. The Network Flow** + +``` +Community Owner Node: + Archive Creation → Seeding → HistoryArchivesSeedingSignal + ↓ + dispatchMagnetlinkMessage() + ↓ + messaging.SendPublic() → [WAKU NETWORK] + ↓ + [All Community Members] + ↓ + RetrieveAll() receives messages + ↓ + handleRetrievedMessages() + ↓ + HandleHistoryArchiveMagnetlinkMessage() + ↓ + downloadAndImportHistoryArchives() +``` + +### **7. Complete Publication Locations Summary** + +**Primary Publication Point:** +- `dispatchMagnetlinkMessage()` in messenger_communities.go +- Called when `HistoryArchivesSeedingSignal` is received +- Only for community control nodes +- Publishes to community's pubsub topic + +**Network Layer:** +- `messaging.SendPublic()` → `sendCommunity()` → `dispatchCommunityMessage()` → `transport.SendCommunityMessage()` +- Eventually reaches Waku network via `transport.api.Post()` + +**The magnetlink messages flow from community owners to all community members via the Waku network**, triggering automatic archive downloads when members receive them through their normal message processing loop! diff --git a/10 Notes/status-go-codex integration - design notes.md b/10 Notes/status-go-codex integration - design notes.md new file mode 100644 index 0000000..3aa865b --- /dev/null +++ b/10 Notes/status-go-codex integration - design notes.md @@ -0,0 +1,265 @@ +--- +related-to: + - "[[Team-NLBR Solution Proposal]]" + - "[[status-go publishing magnet links]]" + - "[[status-go processing magnet links]]" + - "[[status-go-codex integration - design notes]]" + - "[[Creating History Archives - InitHistoryArchiveTasks]]" +--- + +## Codex for History Archives + +As indicated in the [[Team-NLBR Solution Proposal]], the central entry point to the history management is [InitHistoryArchiveTasks](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L3783). `InitHistoryArchiveTasks` is called from **two main places**: +- During `Messenger.Start()` (startup) +- When enabling archive protocol + +In [[Creating History Archives - InitHistoryArchiveTasks]] we find the complete initialization flow: + +``` +System Startup + ↓ +Messenger.Start() + ↓ +Wait for Store Node Availability + ↓ +InitHistoryArchiveTasks(controlledCommunities) + │ + ├─ For each community owner controls: + │ ├─ Check if archive support enabled + │ ├─ Seed existing torrents (if available) + | ├─ CreateAndSeedHistoryArchive + │ ├─ Get community topics and sync missed messages + │ ├─ Check when last archive was created + │ └─ Based on last archive timing: + │ ├─ No archives → StartHistoryArchiveTasksInterval() immediately + │ ├─ Recent archive → Seed + delayed CreateAndSeedHistoryArchive followed by StartHistoryArchiveTasksInterval() + │ └─ Old archive → Create new archive + CreateAndSeedHistoryArchive + StartHistoryArchiveTasksInterval() + │ + └─ Each StartHistoryArchiveTasksInterval(): + ├─ Runs as background goroutine + ├─ Creates ticker with 7-day interval + ├─ Every 7 days: CreateAndSeedHistoryArchive() + ├─ After seeding: publishes HistoryArchivesSeedingSignal + ├─ Signal triggers: dispatchMagnetlinkMessage() + └─ Magnetlink sent to all community members via Waku +``` + +We will be going step by step through this flow and apply the changes (where we need to diverge, we will...). + +### BitTorrent - with or without + +In the first pass we do not delete the BitTorrent related code, but rather try to add Codex extensions next to it - this way I hope it will be easier to move things around without being too destructive from the beginning. + +### Seed existing torrents (if available) + +This step is only needed for torrents. Codex has its own persistence and will start seeding immediately after it starts. + +### CreateAndSeedHistoryArchive + +The first function that asks for attention is `CreateAndSeedHistoryArchive`. It is from `ArchiveService` interface. + +```go +func (m *ArchiveManager) CreateAndSeedHistoryArchive(communityID types.HexBytes, topics []messagingtypes.ContentTopic, startDate time.Time, endDate time.Time, partition time.Duration, encrypt bool) error { + m.UnseedHistoryArchiveTorrent(communityID) + _, err := m.ArchiveFileManager.CreateHistoryArchiveTorrentFromDB(communityID, topics, startDate, endDate, partition, encrypt) + if err != nil { + return err + } + return m.SeedHistoryArchiveTorrent(communityID) +} +``` + +It calls `CreateHistoryArchiveTorrentFromDB`, which then calls `createHistoryArchiveTorrent`: + +```go +func (m *ArchiveFileManager) CreateHistoryArchiveTorrentFromDB(communityID types.HexBytes, topics []messagingtypes.ContentTopic, startDate time.Time, endDate time.Time, partition time.Duration, encrypt bool) ([]string, error) { + return m.createHistoryArchiveTorrent(communityID, make([]*messagingtypes.ReceivedMessage, 0), topics, startDate, endDate, partition, encrypt) +} +``` + +`createHistoryArchiveTorrent` (`ArchiveFileManager`) is where the work is done. + +#### Protobuf messages + +Here we list all the Protobuf messages that are relevant to message archives: + +```protobuf +message CommunityMessageArchiveMagnetlink { + uint64 clock = 1; + string magnet_uri = 2; +} + +message WakuMessage { + bytes sig = 1; + uint64 timestamp = 2; + bytes topic = 3; + bytes payload = 4; + bytes padding = 5; + bytes hash = 6; + string thirdPartyId = 7; +} + +message WakuMessageArchiveMetadata { + uint32 version = 1; + uint64 from = 2; + uint64 to = 3; + repeated bytes contentTopic = 4; +} + +message WakuMessageArchive { + uint32 version = 1; + WakuMessageArchiveMetadata metadata = 2; + repeated WakuMessage messages = 3; +} + +message WakuMessageArchiveIndexMetadata { + uint32 version = 1; + WakuMessageArchiveMetadata metadata = 2; + uint64 offset = 3; + uint64 size = 4; + uint64 padding = 5; +} + +message WakuMessageArchiveIndex { + map archives = 1; +} +``` + +All in `protocol/protobuf/communities.proto`. There is one more, not directly related, but for some reason it contains a `magnet_url` field (to be checked later): + +```protobuf +message CommunityRequestToJoinResponse { + uint64 clock = 1; + CommunityDescription community = 2 [deprecated = true]; + bool accepted = 3; + bytes grant = 4; + bytes community_id = 5; + string magnet_uri = 6; + bytes protected_topic_private_key = 7; + Shard shard = 8; + // CommunityDescription protocol message with owner signature + bytes community_description_protocol_message = 9; +} +``` + +We see that most are independent from BitTorrent. The ones that are BitTorrent specific are: + +- `CommunityMessageArchiveMagnetlink` +- `WakuMessageArchiveIndexMetadata` +- `WakuMessageArchiveIndex` (because it depends on `WakuMessageArchiveIndexMetadata`) +- `CommunityRequestToJoinResponse` (because of the `magnet_uri` field) + +Now, starting with something simple (in the end we are building PoC here), we know that Codex API operates on CID encoded as `base58btc` strings. In `WakuMessageArchiveIndexMetadata`, `offset`, `size`, and `padding` are relevant to the current BitTorrent-based implementation. For Codex we can use something simpler: + +```protobuf +message CodexWakuMessageArchiveIndexMetadata { + uint32 version = 1; + WakuMessageArchiveMetadata metadata = 2; + string cid = 3; +} + +message CodexWakuMessageArchiveIndex { + map archives = 1; +} +``` + +#### Appending the index file + +In a more production version we will not operate on the local file system, yet, here, for simplicity, we will be using a physical index file and a separate file for each archive. For this reason, in the initial implementation, a community owner will not query Codex for the current index file. For this purpose, we could use `http://localhost:8001/api/codex/v1/data/${CID}` API, which returns `404` when the file does not exist in the local store: + +```bash +curl -s -D - -o /dev/null "http://localhost:8001/api/codex/v1/data/${CID}" +HTTP/1.1 404 Not Found +Connection: close +Server: nim-presto/0.0.3 (amd64/linux) +Content-Length: 74 +Date: Thu, 25 Sep 2025 02:15:07 GMT +Content-Type: text/html; charset=utf-8 +``` + +Instead, for this initial implementation, we will just read it from a local directory. For now, we will reuse BitTorrent configuration. BitTorrent config stores the index file under: + +```go +path.Join(m.torrentConfig.DataDir, communityID, "index") +``` + +For codex, we will store it under: + +```go +path.Join(m.torrentConfig.DataDir, "codex", communityID, "index") +``` + +In a similar way, the individual archive to be uploaded we will use: + +```go +path.Join(m.torrentConfig.DataDir, "codex", communityID, "data") +``` + +This data file is temporary and will be overwritten for each new archive created. With Codex, we do not have to append, thus, we do not need the previous data file anymore. We just use file now, because it may be easier to start it this way. + +This is done with `LoadHistoryArchiveIndexFromFile` +## Testing + +There will be a number of tests that will need to adjust or fix. + +But there is one test that has slightly more end-to-end nature. It is from the `protocol` package: + +``` +protocol/communities_messenger_token_permissions_test.go +``` + +This test call a couple of important functions, which will be a good indication which functions will need taken into account. + +The test - `TestImportDecryptedArchiveMessages` - first creates a community and sets up the corresponding permissions. Then the community owner sends a message to the community and then immediately retrieves it so that it is now recorded in the DB. + +After that it prepares archive parameters: `startDate`, `endDate`, `partition`, and community `topics`. All those will be passed to `CreateHistoryArchiveTorrentFromDB` - our entry point to creating history archive torrent. + +```go +// 1.1. Create community +community, chat := s.createCommunity() +// ... +// 1.2. Setup permissions +// ... +// 2. Owner: Send a message A +messageText1 := RandomLettersString(10) +message1 := s.sendChatMessage(s.owner, chat.ID, messageText1) + +// 2.2. Retrieve own message (to make it stored in the archive later) +_, err = s.owner.RetrieveAll() +s.Require().NoError(err) + +// 3. Owner: Create community archive +const partition = 2 * time.Minute +messageDate := time.UnixMilli(int64(message1.Timestamp)) +startDate := messageDate.Add(-time.Minute) +endDate := messageDate.Add(time.Minute) +topic := messagingtypes.BytesToContentTopic(messaging.ToContentTopic(chat.ID)) +communityCommonTopic := messagingtypes.BytesToContentTopic(messaging.ToContentTopic(community.UniversalChatID())) +topics := []messagingtypes.ContentTopic{topic, communityCommonTopic} + +torrentConfig := params.TorrentConfig{ + Enabled: true, + DataDir: os.TempDir() + "/archivedata", + TorrentDir: os.TempDir() + "/torrents", + Port: 0, +} + +// Share archive directory between all users +s.owner.archiveManager.SetTorrentConfig(&torrentConfig) +s.bob.archiveManager.SetTorrentConfig(&torrentConfig) +s.owner.config.messengerSignalsHandler = &MessengerSignalsHandlerMock{} +s.bob.config.messengerSignalsHandler = &MessengerSignalsHandlerMock{} +``` + +Finally we call the `CreateHistoryArchiveTorrentFromDB`: + +```go +archiveIDs, err := s.owner.archiveManager.CreateHistoryArchiveTorrentFromDB(community.ID(), topics, startDate, endDate, partition, community.Encrypted()) +s.Require().NoError(err) +s.Require().Len(archiveIDs, 1) +``` + +Notice, there is one archive expected. + +The `CreateHistoryArchiveTorrentFromDB` is called directly here, in a way bypassing the torrent seeding: in normal flow `CreateHistoryArchiveTorrentFromDB` is called in `CreateAndSeedHistoryArchive` which immediately after creating the archive, calls `SeedHistoryArchiveTorrent`. `CreateHistoryArchiveTorrentFromDB` calls `createHistoryArchiveTorrent` - which is central to the archive creating. + From 2e21d11af7b59db22a8727899811dd9a1bf9f598 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Tue, 21 Oct 2025 14:23:30 +0200 Subject: [PATCH 12/25] adds some more docs --- .obsidian/core-plugins.json | 6 +- ...ion (AI) to accomodate Codex extensions.md | 410 ++++++++++++++++++ 10 Notes/Team-NLBR Solution Proposal.md | 1 + 10 Notes/status-go publishing magnet links.md | 2 +- ...tus-go-codex integration - design notes.md | 98 ++++- .../testing codex-status-go integration.md | 90 ++++ ...g bittorrent with codex in status-go-2.svg | 5 + ...g-bittorrent-with-codex-in-status-go-1.svg | 6 + 8 files changed, 612 insertions(+), 6 deletions(-) create mode 100644 10 Notes/Databse migration (AI) to accomodate Codex extensions.md create mode 100644 10 Notes/testing codex-status-go integration.md create mode 100644 90 Extras/92 Assets/replacing bittorrent with codex in status-go-2.svg create mode 100644 90 Extras/92 Assets/replacing-bittorrent-with-codex-in-status-go-1.svg diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json index 25ae3eb..639b90d 100644 --- a/.obsidian/core-plugins.json +++ b/.obsidian/core-plugins.json @@ -7,6 +7,7 @@ "canvas": true, "outgoing-link": true, "tag-pane": true, + "footnotes": false, "properties": true, "page-preview": true, "daily-notes": true, @@ -27,7 +28,6 @@ "file-recovery": true, "publish": false, "sync": true, - "webviewer": false, - "footnotes": false, - "bases": true + "bases": true, + "webviewer": false } \ No newline at end of file diff --git a/10 Notes/Databse migration (AI) to accomodate Codex extensions.md b/10 Notes/Databse migration (AI) to accomodate Codex extensions.md new file mode 100644 index 0000000..734f43d --- /dev/null +++ b/10 Notes/Databse migration (AI) to accomodate Codex extensions.md @@ -0,0 +1,410 @@ +**Q: Where does `protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` come from?** + +Summarized conversation historyLooking at the code, `protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` appears to be a constant from the protobuf package. Let me search for where this is defined. + +Searched text for `COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK`, 2 results + +Now let me look at the protobuf file to see the full context: + +Searched text for `enum Type` (`**/protocol/protobuf/application_metadata_message.proto`), 1 result + +Searched text for `COMMUNITY_MESSAGE_ARCHIVE` (`**/protocol/protobuf/application_metadata_message.proto`), 1 result + +Let me see more context around this enum definition: + +Searched text for `(COMMUNITY_MESSAGE_ARCHIVE|= 4[0-9];|= 5[0-9];)` (`**/protocol/protobuf/application_metadata_message.proto`), 20 results + +Now let me check if there's a similar constant for INDEX_CID: + +Searched text for `COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID`, 1 result + +Let me check if this constant exists in the protobuf file: + +Searched text for `INDEX_CID` (`**/protocol/protobuf/application_metadata_message.proto`), no results + +It seems like `COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID` is being used but not defined in the protobuf file. Let me check the broader context around line 60 in the protobuf file: + +Symbol `COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID` not found + +Let me look at the entire protobuf file to see the complete enum: + +Searched codebase for "ApplicationMetadataMessage Type enum protobuf", 22 results + +Based on my search, I can now answer your question about where `protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` comes from: + +## Answer + +`protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` comes from the protobuf enum definition in application_metadata_message.proto. + +Specifically, it's defined at line 60 of the proto file as: + +```protobuf +COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK = 43; +``` + +This is part of the `Type` enum within the `ApplicationMetadataMessage` protobuf definition. When the protobuf file is compiled to Go code (using the `//go:generate protoc` directive found in `protocol/protobuf/service.go`), it generates the Go constant `protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` with the value `43`. + +The protobuf compilation process converts the proto enum value `COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK = 43` into the Go constant that you see being used throughout the codebase for message type identification. + +**Note:** I also notice that in the code there's a reference to `COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID` which doesn't appear to be defined in the protobuf file yet. This suggests it may need to be added to the enum if the Codex functionality requires it. + + +**Q: in persistance - current file - there are a couple of attributes operating on the communities_archive_info (table?). Is it hard to add additional attributes? For my index CIDs I need the following:** + +- **last_cid which corresponds to `last_magnetlink_uri`** +- **indexcid_clock => `magnetlink_clock`** + +**What is this clock used for?** + +Looking at the persistence.go file, I can see that the `communities_archive_info` table is used to store archive-related information for communities. Let me analyze the existing structure and answer your questions. + +## Current `communities_archive_info` table structure + +Based on the methods in the file, the table appears to have these columns: +- `community_id` (string) +- `magnetlink_clock` (uint64) +- `last_magnetlink_uri` (string) +- `last_message_archive_end_date` (uint64) + +## Adding new attributes + +It should **not be hard** to add your new attributes. You would need to: + +1. **Add the new columns to the table schema** (likely in a migration file) +2. **Add corresponding methods** similar to the existing ones + +For your requirements: +- `last_cid` (corresponds to `last_magnetlink_uri`) +- `indexcid_clock` (corresponds to `magnetlink_clock`) + +You could add methods like: + +```go +// Get methods +func (p *Persistence) GetLastSeenIndexCid(communityID types.HexBytes) (string, error) { + var indexCid string + err := p.db.QueryRow(`SELECT last_cid FROM communities_archive_info WHERE community_id = ?`, communityID.String()).Scan(&indexCid) + if err == sql.ErrNoRows { + return "", nil + } + return indexCid, err +} + +func (p *Persistence) GetIndexCidMessageClock(communityID types.HexBytes) (uint64, error) { + var indexCidClock uint64 + err := p.db.QueryRow(`SELECT indexcid_clock FROM communities_archive_info WHERE community_id = ?`, communityID.String()).Scan(&indexCidClock) + if err == sql.ErrNoRows { + return 0, nil + } + return indexCidClock, err +} + +// Update methods +func (p *Persistence) UpdateLastSeenIndexCid(communityID types.HexBytes, indexCid string) error { + _, err := p.db.Exec(`UPDATE communities_archive_info SET last_cid = ? WHERE community_id = ?`, + indexCid, communityID.String()) + return err +} + +func (p *Persistence) UpdateIndexCidMessageClock(communityID types.HexBytes, clock uint64) error { + _, err := p.db.Exec(`UPDATE communities_archive_info SET indexcid_clock = ? WHERE community_id = ?`, + clock, communityID.String()) + return err +} +``` + +## What is the clock used for? + +The **clock** is a **logical timestamp** used for: + +1. **Message ordering** - Ensures messages are processed in the correct order +2. **Conflict resolution** - When multiple nodes update the same data, the higher clock value wins +3. **Synchronization** - Helps determine which updates are newer when syncing between devices/nodes +4. **Deduplication** - Prevents processing the same update multiple times + +Looking at the existing code: + +```go +func (p *Persistence) UpdateMagnetlinkMessageClock(communityID types.HexBytes, clock uint64) error { +``` + +This suggests that when a new magnetlink message is received/processed, the clock value is updated to track the latest state. This is common in distributed systems to maintain consistency without requiring synchronized system clocks. + +## Next steps + +You'll need to: +1. **Create a database migration** to add the new columns +2. **Update the `SaveCommunityArchiveInfo` method** to include the new fields +3. **Add the getter/setter methods** for your new attributes +4. **Update any initialization code** that creates archive info records + +The pattern is already established in the codebase, so adding your index CID attributes should be straightforward following the same structure as the magnetlink ones. + + +Absolutely! I can see you've already added the four new methods for handling Index CID operations. Let me help you complete the remaining steps to fully integrate your Index CID functionality. + +## Step 1: Database Migration + +First, you'll need to create a database migration to add the new columns to the `communities_archive_info` table. Let me search for existing migration files to follow the pattern: + +Searched for files matching `**/migrations/**/*.sql`, 20 matches + +Let me look for community-related migrations specifically: + +Searched for files matching `**/migrations/**/*communit*.sql`, 20 matches + +Let me look for the communities_archive_info table creation: + +Searched text for `communities_archive_info` (`**/migrations/**/*.sql`), 2 results + +Great! Let me check the structure of the existing table and the most recent migration: + +Searched codebase for "communities_archive_info table CREATE TABLE migration", 21 results + +Now let me look at the actual migration files: + +Read [](file:///home/mc2/code/status-im/status-go/appdatabase/migrations/sql) + +Let me check the latest migration number and the specific migration that adds the archive_info table: + +Searched codebase for "1650616788_add_communities_archives_info_table CREATE TABLE communities_archive_info", 18 results + +Perfect! Now I can see the migration pattern. Let me create the migration file. Based on the existing files, I need to create a new migration with a timestamp. + +## Step 1: Create Database Migration + +````sql +CREATE TABLE communities_archive_info_add_index_cid_columns.sql + +```sql +ALTER TABLE communities_archive_info ADD COLUMN last_cid TEXT DEFAULT ""; +ALTER TABLE communities_archive_info ADD COLUMN indexcid_clock INTEGER DEFAULT 0; +``` +```` + +Let me check the current latest migration to get the right timestamp: + +Searched text for `1757511667`, no results + +Based on the file listing, the latest migration is `1757511667_add_messages-backup_enabled.up.sql`. So your new migration should have a timestamp after that. Here's what you need: + +**Create the migration file:** +`/home/mc2/code/status-im/status-go/appdatabase/migrations/sql/1757511668_add_index_cid_columns_to_communities_archive_info.up.sql` + +````sql +ALTER TABLE communities_archive_info ADD COLUMN last_cid TEXT DEFAULT ""; +ALTER TABLE communities_archive_info ADD COLUMN indexcid_clock INTEGER DEFAULT 0; +```` + +## Step 2: Update `SaveCommunityArchiveInfo` Method + +You'll need to modify the existing method to include the new fields. Looking at your existing code, I can see you've already added the getter/setter methods, but you need to update the initial save method: + +````go +func (p *Persistence) SaveCommunityArchiveInfo(communityID types.HexBytes, clock uint64, lastArchiveEndDate uint64) error { + _, err := p.db.Exec(`INSERT INTO communities_archive_info (magnetlink_clock, last_message_archive_end_date, community_id, last_cid, indexcid_clock) VALUES (?, ?, ?, ?, ?)`, + clock, + lastArchiveEndDate, + communityID.String(), + "", // default empty last_cid + 0, // default indexcid_clock + ) + return err +} +```` + +## Step 3: Update the Method Calls in Manager + +You'll need to find where these new methods are called. Let me search for usage patterns: + +Searched text for `UpdateMagnetlinkMessageClock`, 6 results + +Searched text for `UpdateLastSeenMagnetlink`, 4 results + +Great! Now I can see the pattern. You'll need to add corresponding manager methods and update the handlers. + +## Step 4: Add Manager Methods + +Add these methods to manager.go: + +````go +// Add these methods after the existing magnetlink methods around line 3730 + +func (m *Manager) UpdateIndexCidMessageClock(communityID types.HexBytes, clock uint64) error { + return m.persistence.UpdateIndexCidMessageClock(communityID, clock) +} + +func (m *Manager) GetIndexCidMessageClock(communityID types.HexBytes) (uint64, error) { + return m.persistence.GetIndexCidMessageClock(communityID) +} + +func (m *Manager) UpdateLastSeenIndexCid(communityID types.HexBytes, indexCid string) error { + return m.persistence.UpdateLastSeenIndexCid(communityID, indexCid) +} + +func (m *Manager) GetLastSeenIndexCid(communityID types.HexBytes) (string, error) { + return m.persistence.GetLastSeenIndexCid(communityID) +} +```` + +## Step 5: Update Community Description Structure (if needed) + +Looking at the protobuf structure, you might want to add an `archive_indexcid_clock` field similar to `archive_magnetlink_clock`. Let me search for that: + +Searched text for `archive_magnetlink_clock`, 1 result + +You might want to add a similar field to the protobuf for consistency: + +````proto +// In /home/mc2/code/status-im/status-go/protocol/protobuf/communities.proto +// Add after line 116: +uint64 archive_indexcid_clock = 20; // or the next available number +```` + +## Step 6: Add Message Handlers (similar to magnetlink) + +Looking at the existing pattern in messenger_handler.go, you'll need to add handlers for Index CID messages. Let me check where the magnetlink handler is: + +Searched text for `COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK` (`**/protocol/messenger_handler.go`), no results + +Let me search for the magnetlink message handling: + +Searched text for `CommunityMessageArchiveMagnetlink`, 4 results + +Perfect! Now I can see the complete pattern. Here's what you need to do: + +## Step 7: Create Index CID Protobuf Message + +Add to communities.proto: + +````proto +// Add after CommunityMessageArchiveMagnetlink message +message CommunityMessageArchiveIndexCid { + uint64 clock = 1; + string cid = 2; +} +```` + +## Step 8: Add Index CID Message Type + +Add to application_metadata_message.proto: + +````proto +// Add after COMMUNITY_MESSAGE_ARCHIVE_MAGNETLINK = 43; +COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID = 76; // or next available number +```` + +## Step 9: Add Index CID Message Handler + +Add to messenger_handler.go (similar to the magnetlink handler): + +````go +func (m *Messenger) HandleCommunityMessageArchiveIndexCid(state *ReceivedMessageState, message *protobuf.CommunityMessageArchiveIndexCid, statusMessage *messagingtypes.Message) error { + logger := m.logger.Named("HandleCommunityMessageArchiveIndexCid") + + haveArchiveInfo, err := m.communitiesManager.HasCommunityArchiveInfo(statusMessage.CommunityID) + if err != nil { + logger.Debug("failed to check if we have community archive info", zap.Error(err)) + return err + } + + if !haveArchiveInfo { + logger.Debug("ignoring index cid message for community with no archive info", zap.String("communityID", types.EncodeHex(statusMessage.CommunityID))) + return nil + } + + currentIndexCidClock, err := m.communitiesManager.GetIndexCidMessageClock(statusMessage.CommunityID) + if err != nil { + logger.Debug("failed to get index cid message clock", zap.Error(err)) + return err + } + + if currentIndexCidClock >= message.Clock { + // ignore older index cid messages + return nil + } + + id := statusMessage.CommunityID + clock := message.Clock + err = m.communitiesManager.UpdateIndexCidMessageClock(id, clock) + if err != nil { + logger.Debug("failed to update index cid message clock", zap.Error(err)) + return err + } + + if len(message.Cid) > 0 { + err = m.communitiesManager.UpdateLastSeenIndexCid(id, message.Cid) + if err != nil { + logger.Debug("failed to update last seen index cid", zap.Error(err)) + return err + } + } + + return nil +} +```` + +## Step 10: Update `dispatchIndexCidMessage` Method + +Update the method in messenger_communities.go to use the correct message type: + +````go +func (m *Messenger) dispatchIndexCidMessage(communityID string) error { + community, err := m.communitiesManager.GetByIDString(communityID) + if err != nil { + return err + } + + indexCid, err := m.archiveManager.GetHistoryArchiveIndexCid(community.ID()) + if err != nil { + return err + } + + indexCidMessage := &protobuf.CommunityMessageArchiveIndexCid{ + Clock: m.getTimesource().GetCurrentTime(), + Cid: indexCid, + } + + encodedMessage, err := proto.Marshal(indexCidMessage) + if err != nil { + return err + } + + chatID := community.MagnetlinkMessageChannelID() + rawMessage := messagingtypes.RawMessage{ + LocalChatID: chatID, + Sender: community.PrivateKey(), + Payload: encodedMessage, + MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID, + SkipGroupMessageWrap: true, + PubsubTopic: community.PubsubTopic(), + Priority: &messagingtypes.LowPriority, + } + + _, err = m.messaging.SendPublic(context.Background(), chatID, rawMessage) + if err != nil { + return err + } + + err = m.communitiesManager.UpdateCommunityDescriptionIndexCidMessageClock(community.ID(), indexCidMessage.Clock) + if err != nil { + return err + } + return m.communitiesManager.UpdateIndexCidMessageClock(community.ID(), indexCidMessage.Clock) +} +```` + +## Summary + +Here are all the files you need to modify: + +1. **Migration**: Create `1757511668_add_index_cid_columns_to_communities_archive_info.up.sql` +2. **Persistence**: Update `SaveCommunityArchiveInfo` method (already done the getters/setters) +3. **Manager**: Add the 4 new methods for Index CID operations +4. **Protobuf**: Add `CommunityMessageArchiveIndexCid` message and `COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID` enum +5. **Handler**: Add `HandleCommunityMessageArchiveIndexCid` method +6. **Dispatch**: Update `dispatchIndexCidMessage` to use correct message type + +The pattern is exactly the same as the magnetlink implementation, just with "IndexCid" instead of "Magnetlink". This approach ensures consistency with the existing codebase and makes it easy to maintain. + +Would you like me to help you with any specific part of this implementation? \ No newline at end of file diff --git a/10 Notes/Team-NLBR Solution Proposal.md b/10 Notes/Team-NLBR Solution Proposal.md index f2ce103..75dae04 100644 --- a/10 Notes/Team-NLBR Solution Proposal.md +++ b/10 Notes/Team-NLBR Solution Proposal.md @@ -5,6 +5,7 @@ related-to: - "[[status-go processing magnet links]]" - "[[status-go-codex integration - design notes]]" - "[[Creating History Archives - InitHistoryArchiveTasks]]" + - "[[testing codex-status-go integration]]" --- The `TorrentConfig` type provides the configuration for the BitTorrent-based History Archive management functionality: diff --git a/10 Notes/status-go publishing magnet links.md b/10 Notes/status-go publishing magnet links.md index fe63dae..caa213e 100644 --- a/10 Notes/status-go publishing magnet links.md +++ b/10 Notes/status-go publishing magnet links.md @@ -96,7 +96,7 @@ SeedHistoryArchiveTorrent() ↓ publisher.publish(HistoryArchivesSeedingSignal) [internal event] ↓ -handleCommunitiesHistoryArchivesSubscription() [event handler] +`handleCommunitiesHistoryArchivesSubscription`() [event handler] ↓ IF community.IsControlNode(): dispatchMagnetlinkMessage(communityID) diff --git a/10 Notes/status-go-codex integration - design notes.md b/10 Notes/status-go-codex integration - design notes.md index 3aa865b..294815a 100644 --- a/10 Notes/status-go-codex integration - design notes.md +++ b/10 Notes/status-go-codex integration - design notes.md @@ -6,7 +6,6 @@ related-to: - "[[status-go-codex integration - design notes]]" - "[[Creating History Archives - InitHistoryArchiveTasks]]" --- - ## Codex for History Archives As indicated in the [[Team-NLBR Solution Proposal]], the central entry point to the history management is [InitHistoryArchiveTasks](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L3783). `InitHistoryArchiveTasks` is called from **two main places**: @@ -197,7 +196,102 @@ path.Join(m.torrentConfig.DataDir, "codex", communityID, "data") This data file is temporary and will be overwritten for each new archive created. With Codex, we do not have to append, thus, we do not need the previous data file anymore. We just use file now, because it may be easier to start it this way. -This is done with `LoadHistoryArchiveIndexFromFile` +Now, just for convenience, let's recall the original data structures involved: + +![[team-nl-br-design-1.svg]] + +The data structures using with BitTorrent are: + +```go +wakuMessageArchiveIndexProto := &protobuf.WakuMessageArchiveIndex{} +wakuMessageArchiveIndex := make(map[string]*protobuf.WakuMessageArchiveIndexMetadata) +``` + +The original BitTorrent index, stored in `wakuMessageArchiveIndexProto`, is initially populated using `LoadHistoryArchiveIndexFromFile` function. After that `wakuMessageArchiveIndex` is used as temporary storage so that we can conveniently extend it with new entries and serialize it to protobuf afterwords. We use the contents of `wakuMessageArchiveIndexProto` to set it up: + +```go +for hash, metadata := range wakuMessageArchiveIndexProto.Archives { + offset = offset + metadata.Size + wakuMessageArchiveIndex[hash] = metadata +} +``` + +For the codex extension we proceed in the analogous way: + +![[replacing-bittorrent-with-codex-in-status-go-1.svg]] + +![[replacing bittorrent with codex in status-go-2.svg]] + +```go +codexWakuMessageArchiveIndexProto := &protobuf.CodexWakuMessageArchiveIndex{} + codexWakuMessageArchiveIndex := make(map[string]*protobuf.CodexWakuMessageArchiveIndexMetadata) +``` + +and then: + +```go +for hash, metadata := range codexWakuMessageArchiveIndexProto.Archives { + codexWakuMessageArchiveIndex[hash] = metadata +} +``` + +Having those variables in place and initialized correctly, we enter the loop and start creating archives one by one. + +Basically, we proceed in the same way as with BitTorrent - the `WakuMessageArchive` type does not change. + +At some point, we arrive at: + +```go +wakuMessageArchiveIndexMetadata := &protobuf.WakuMessageArchiveIndexMetadata{ + Metadata: wakuMessageArchive.Metadata, + Offset: offset, + Size: uint64(size), + Padding: uint64(padding), +} +``` + +For Codex extension, we do not have `offset`, `size`, and `padding` any more as this is something that Codex will take care - but this is the moment we need to call into Codex, to upload the archive and get the corresponding CID back so that we can properly initialize the corresponding index entry: + +```go +client := NewCodexClient("localhost", "8080") // make this configurable +cid, err := client.UploadArchive(encodedArchive) +if err != nil { + m.logger.Error("failed to upload to codex", zap.Error(err)) + return codexArchiveIDs, err +} + +m.logger.Debug("uploaded to codex", zap.String("cid", cid)) + +codexWakuMessageArchiveIndexMetadata := &protobuf.CodexWakuMessageArchiveIndexMetadata{ + Metadata: wakuMessageArchive.Metadata, + Cid: cid, +} + +codexWakuMessageArchiveIndexMetadataBytes, err := proto.Marshal(codexWakuMessageArchiveIndexMetadata) +if err != nil { + return codexArchiveIDs, err +} + +codexArchiveID := crypto.Keccak256Hash(codexWakuMessageArchiveIndexMetadataBytes).String() +codexArchiveIDs = append(codexArchiveIDs, codexArchiveID) +codexWakuMessageArchiveIndex[codexArchiveID] = codexWakuMessageArchiveIndexMetadata +``` + +where `CodexClient` is a helper that encapsulates uploading arbitrary data to a Codex client via `/api/codex/v1/data` API. The corresponding `curl` call would be similar to: + +```bash +curl -X POST \ + http://localhost:${PORT}/api/codex/v1/data \ + -H 'Content-Type: application/octet-stream' \ + -H 'Content-Disposition: filename="archive-data.bin"' \ + -w '\n' \ + -T archive-data.bin +zDvZRwzm22eSYNdLBuNHVi7jSTR2a4n48yy4Ur9qws4vHV6madiz +``` + +At this stage we have an individual archive uploaded to Codex (it should be save there now) It is already being advertised but nobody is looking for it yet as we did not finish building the Codex-aware index file, which contains CIDs for all the archives. + + ## Testing There will be a number of tests that will need to adjust or fix. diff --git a/10 Notes/testing codex-status-go integration.md b/10 Notes/testing codex-status-go integration.md new file mode 100644 index 0000000..4707f24 --- /dev/null +++ b/10 Notes/testing codex-status-go integration.md @@ -0,0 +1,90 @@ +First some low level simple manual tests. + +We will be running codex client, and then use a small testing utility to check if the low level abstraction - CodexClient - correctly uploads and downloads the content. +### Running CodexClient + +I often remove some logging noise, by slightly changing the build params in `build.nims`: + +```nim +task codex, "build codex binary": + buildBinary "codex", + # params = "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE" + params = + "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE -d:chronicles_enabled_topics:restapi:TRACE,node:TRACE" +``` + +You see a slightly more selective `params` in the `codex` task. + +To run the client I use the following command: + +```bash +./build/codex --data-dir=./data-1 --listen-addrs=/ip4/127.0.0.1/tcp/8081 --api-port=8001 --nat=none --disc-port=8091 --log-level=TRACE +``` + +### Building codex-upload and codex-download utilities + +Use the following command to build the `codex-upload` and `codex-download` utilities: + +```bash +go build -o bin/codex-upload ./cmd/upload +go build -o bin/codex-download ./cmd/download +``` +### Uploading content to Codex + +Now, using the `codex-upload` utility, we can upload the content to Codex as follows: + +```bash +~/code/local/go-codex-client +❯ ./bin/codex-upload -file test-data.bin -host localhost -port 8001 +Uploading test-data.bin (43 bytes) to Codex at localhost:8001... +✅ Upload successful! +CID: zDvZRwzm8K7bcyPeBXcZzWD7AWc4VqNuseduDr3VsuYA1yXej49V +``` + +### Downloading content from Codex + +Now, having the content uploaded to Codex - let's get it back using the `codex-download` utility: + +```bash +~/code/local/go-codex-client +❯ ./bin/codex-download -cid zDvZRwzm8K7bcyPeBXcZzWD7AWc4VqNuseduDr3VsuYA1yXej49V -file output.bin -host localhost -port 8001 +Downloading CID zDvZRwzm8K7bcyPeBXcZzWD7AWc4VqNuseduDr3VsuYA1yXej49V from Codex at localhost:8001... +✅ Download successful! +Saved to: output.bin +``` + +You can easily compare that the downloaded content matches the original using: + +```bash +~/code/local/go-codex-client +❯ openssl sha256 test-data.bin +SHA2-256(test-data.bin)= c74ce73165c288348b168baffc477b6db38af3c629b42a7725c35d99d400d992 + +~/code/local/go-codex-client +❯ openssl sha256 output.bin +SHA2-256(output.bin)= c74ce73165c288348b168baffc477b6db38af3c629b42a7725c35d99d400d992 +``` + +### Running tests + +There are a couple of basic tests, including one integration test. + +To run the unit tests: + +```bash +❯ go test -v ./communities +=== RUN TestUpload_Success +--- PASS: TestUpload_Success (0.00s) +=== RUN TestDownload_Success +--- PASS: TestDownload_Success (0.00s) +=== RUN TestDownloadWithContext_Cancel +--- PASS: TestDownloadWithContext_Cancel (0.04s) +PASS +ok go-codex-client/communities 0.044s +``` + +To run the integration test, use `integration` tag and narrow the scope using `-run Integration`: + +```bash +go test -v -tags=integration ./communities -run Integration -timeout 15s +``` diff --git a/90 Extras/92 Assets/replacing bittorrent with codex in status-go-2.svg b/90 Extras/92 Assets/replacing bittorrent with codex in status-go-2.svg new file mode 100644 index 0000000..5a77889 --- /dev/null +++ b/90 Extras/92 Assets/replacing bittorrent with codex in status-go-2.svg @@ -0,0 +1,5 @@ + + +ArchivemetadatamessagesCodex CIDArchivemetadatamessagesCodex CIDArchivemetadatamessagesCodex CIDcidcidCodex CIDSHAREindexcodexWakuMessageArchiveIndexArchivesmetadatastring cidHASHmetadatastring cidHASH \ No newline at end of file diff --git a/90 Extras/92 Assets/replacing-bittorrent-with-codex-in-status-go-1.svg b/90 Extras/92 Assets/replacing-bittorrent-with-codex-in-status-go-1.svg new file mode 100644 index 0000000..2edceeb --- /dev/null +++ b/90 Extras/92 Assets/replacing-bittorrent-with-codex-in-status-go-1.svg @@ -0,0 +1,6 @@ + + +wakuMessageArchivemessagesmetadatawakuMessage #0wakuMessage #1wakuMessage #NcodexWakuMessageArchiveIndexArchivesFrom: uint64 # unix timestampTo: uint64 # unix timestampContentTopic: [][]byte # Waku ContentTopicWakuMessageArchiveMetadataSig []byteTimestamp uint64Topic []bytePayload []bytePadding []byteHash []byteThirdPartyId stringWakuMessageMessage ChunkmaxSize ≤ 30MBmaxSize ≤ 30MBMessagemetadatacid stringHASHmetadatacid stringHASHmetadata \ No newline at end of file From 0207afc7cde92a1a0e08d93fcf07101bb83a683f Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Tue, 21 Oct 2025 14:48:01 +0200 Subject: [PATCH 13/25] updates docs about testing status-go --- ...tus-go-codex integration - design notes.md | 66 +------------ .../testing codex-status-go integration.md | 92 ++++++++++++++++++- 2 files changed, 92 insertions(+), 66 deletions(-) diff --git a/10 Notes/status-go-codex integration - design notes.md b/10 Notes/status-go-codex integration - design notes.md index 294815a..ae6dcc0 100644 --- a/10 Notes/status-go-codex integration - design notes.md +++ b/10 Notes/status-go-codex integration - design notes.md @@ -5,6 +5,7 @@ related-to: - "[[status-go processing magnet links]]" - "[[status-go-codex integration - design notes]]" - "[[Creating History Archives - InitHistoryArchiveTasks]]" + - "[[testing codex-status-go integration]]" --- ## Codex for History Archives @@ -292,68 +293,3 @@ zDvZRwzm22eSYNdLBuNHVi7jSTR2a4n48yy4Ur9qws4vHV6madiz At this stage we have an individual archive uploaded to Codex (it should be save there now) It is already being advertised but nobody is looking for it yet as we did not finish building the Codex-aware index file, which contains CIDs for all the archives. -## Testing - -There will be a number of tests that will need to adjust or fix. - -But there is one test that has slightly more end-to-end nature. It is from the `protocol` package: - -``` -protocol/communities_messenger_token_permissions_test.go -``` - -This test call a couple of important functions, which will be a good indication which functions will need taken into account. - -The test - `TestImportDecryptedArchiveMessages` - first creates a community and sets up the corresponding permissions. Then the community owner sends a message to the community and then immediately retrieves it so that it is now recorded in the DB. - -After that it prepares archive parameters: `startDate`, `endDate`, `partition`, and community `topics`. All those will be passed to `CreateHistoryArchiveTorrentFromDB` - our entry point to creating history archive torrent. - -```go -// 1.1. Create community -community, chat := s.createCommunity() -// ... -// 1.2. Setup permissions -// ... -// 2. Owner: Send a message A -messageText1 := RandomLettersString(10) -message1 := s.sendChatMessage(s.owner, chat.ID, messageText1) - -// 2.2. Retrieve own message (to make it stored in the archive later) -_, err = s.owner.RetrieveAll() -s.Require().NoError(err) - -// 3. Owner: Create community archive -const partition = 2 * time.Minute -messageDate := time.UnixMilli(int64(message1.Timestamp)) -startDate := messageDate.Add(-time.Minute) -endDate := messageDate.Add(time.Minute) -topic := messagingtypes.BytesToContentTopic(messaging.ToContentTopic(chat.ID)) -communityCommonTopic := messagingtypes.BytesToContentTopic(messaging.ToContentTopic(community.UniversalChatID())) -topics := []messagingtypes.ContentTopic{topic, communityCommonTopic} - -torrentConfig := params.TorrentConfig{ - Enabled: true, - DataDir: os.TempDir() + "/archivedata", - TorrentDir: os.TempDir() + "/torrents", - Port: 0, -} - -// Share archive directory between all users -s.owner.archiveManager.SetTorrentConfig(&torrentConfig) -s.bob.archiveManager.SetTorrentConfig(&torrentConfig) -s.owner.config.messengerSignalsHandler = &MessengerSignalsHandlerMock{} -s.bob.config.messengerSignalsHandler = &MessengerSignalsHandlerMock{} -``` - -Finally we call the `CreateHistoryArchiveTorrentFromDB`: - -```go -archiveIDs, err := s.owner.archiveManager.CreateHistoryArchiveTorrentFromDB(community.ID(), topics, startDate, endDate, partition, community.Encrypted()) -s.Require().NoError(err) -s.Require().Len(archiveIDs, 1) -``` - -Notice, there is one archive expected. - -The `CreateHistoryArchiveTorrentFromDB` is called directly here, in a way bypassing the torrent seeding: in normal flow `CreateHistoryArchiveTorrentFromDB` is called in `CreateAndSeedHistoryArchive` which immediately after creating the archive, calls `SeedHistoryArchiveTorrent`. `CreateHistoryArchiveTorrentFromDB` calls `createHistoryArchiveTorrent` - which is central to the archive creating. - diff --git a/10 Notes/testing codex-status-go integration.md b/10 Notes/testing codex-status-go integration.md index 4707f24..ed4ef12 100644 --- a/10 Notes/testing codex-status-go integration.md +++ b/10 Notes/testing codex-status-go integration.md @@ -1,4 +1,87 @@ -First some low level simple manual tests. +--- +related-to: + - "[[status-go-codex integration - design notes]]" +--- + +There is one test in status-go that has slightly more end-to-end nature. It is from the `protocol` package: + +``` +protocol/communities_messenger_token_permissions_test.go +``` + +I will be creating an updated version of this test **AFTER** testing lower levels of the stack. + +The plan is as follows: + +1. More isolated tests of the CodexClient abstraction. There is a separate small utility project, where CodexClient can be exercised against the Codex client. I thought it may be easier this way to test the integration with the Codex library. The project repo url is: [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client). Most of the tests from this project will be ported to the working branch where the main integration work takes place: `status-go-codex-integraion` in the [status-im/status-go](https://github.com/status-im/status-go) repo. +2. Tests of `protocol/communities/codex_index_downloader.go` and `protocol/communities/codex_archive_downloader.go`. +3. The "Codex" version of the above mentioned "integration" test. + +After that we should be ready for the cluster testing. If needed, we can also try to run status-desktop locally. + +### Some early notes on the "integration" test + +This is about step 3 above: "Codex" version of `protocol/communities_messenger_token_permissions_test.go`. + +The test we are particularly interested in - `TestImportDecryptedArchiveMessages` - first creates a community and sets up the corresponding permissions. Then the community owner sends a message to the community and then immediately retrieves it so that it is now recorded in the DB. + +After that it prepares archive parameters: `startDate`, `endDate`, `partition`, and community `topics`. All those will be passed to `CreateHistoryArchiveTorrentFromDB` - our entry point to creating history archive torrent. + +```go +// 1.1. Create community +community, chat := s.createCommunity() +// ... +// 1.2. Setup permissions +// ... +// 2. Owner: Send a message A +messageText1 := RandomLettersString(10) +message1 := s.sendChatMessage(s.owner, chat.ID, messageText1) + +// 2.2. Retrieve own message (to make it stored in the archive later) +_, err = s.owner.RetrieveAll() +s.Require().NoError(err) + +// 3. Owner: Create community archive +const partition = 2 * time.Minute +messageDate := time.UnixMilli(int64(message1.Timestamp)) +startDate := messageDate.Add(-time.Minute) +endDate := messageDate.Add(time.Minute) +topic := messagingtypes.BytesToContentTopic(messaging.ToContentTopic(chat.ID)) +communityCommonTopic := messagingtypes.BytesToContentTopic(messaging.ToContentTopic(community.UniversalChatID())) +topics := []messagingtypes.ContentTopic{topic, communityCommonTopic} + +torrentConfig := params.TorrentConfig{ + Enabled: true, + DataDir: os.TempDir() + "/archivedata", + TorrentDir: os.TempDir() + "/torrents", + Port: 0, +} + +// Share archive directory between all users +s.owner.archiveManager.SetTorrentConfig(&torrentConfig) +s.bob.archiveManager.SetTorrentConfig(&torrentConfig) +s.owner.config.messengerSignalsHandler = &MessengerSignalsHandlerMock{} +s.bob.config.messengerSignalsHandler = &MessengerSignalsHandlerMock{} +``` + +Finally we call the `CreateHistoryArchiveTorrentFromDB`: + +```go +archiveIDs, err := s.owner.archiveManager.CreateHistoryArchiveTorrentFromDB(community.ID(), topics, startDate, endDate, partition, community.Encrypted()) +s.Require().NoError(err) +s.Require().Len(archiveIDs, 1) +``` + +Notice, there is one archive expected. + +The `CreateHistoryArchiveTorrentFromDB` is called directly here, in a way bypassing the torrent seeding: in normal flow `CreateHistoryArchiveTorrentFromDB` is called in `CreateAndSeedHistoryArchive` which immediately after creating the archive, calls `SeedHistoryArchiveTorrent`. `CreateHistoryArchiveTorrentFromDB` calls `createHistoryArchiveTorrent` - which is central to the archive creating. + +TBC... + + +### Isolated tests of the CodexClient abstraction + +> The text in this section is basically a copy of README from [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client). We will be running codex client, and then use a small testing utility to check if the low level abstraction - CodexClient - correctly uploads and downloads the content. ### Running CodexClient @@ -88,3 +171,10 @@ To run the integration test, use `integration` tag and narrow the scope using `- ```bash go test -v -tags=integration ./communities -run Integration -timeout 15s ``` + +To make sure that the test is actually run and not cached, use `count` option: + +```bash +go test -v -tags=integration ./communities -run Integration -timeout 15s -count 1 +``` + From 7424963666393e440aec04454438bb8104862004 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 27 Oct 2025 13:57:00 +0100 Subject: [PATCH 14/25] ignores local themes --- .gitignore | 1 + 1 file changed, 1 insertion(+) diff --git a/.gitignore b/.gitignore index 3b5263f..47fd387 100644 --- a/.gitignore +++ b/.gitignore @@ -1,5 +1,6 @@ .DS_Store .obsidian/publish.json .obsidian/workspace*.json +.obsidian/themes/Omarchy 00 Planner 10 Notes/Inbox.md From 5bee36df64b557938550a9014c2c8a0535f491d6 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 27 Oct 2025 13:57:38 +0100 Subject: [PATCH 15/25] updates docs about testing --- 10 Notes/Running Unit Tests for status-go.md | 53 +++++++ 10 Notes/Running tests with gotestsum.md | 158 +++++++++++++++++++ 10 Notes/go testify assertions.md | 113 +++++++++++++ 3 files changed, 324 insertions(+) create mode 100644 10 Notes/Running tests with gotestsum.md create mode 100644 10 Notes/go testify assertions.md diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index 72675e9..d507caf 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -1,3 +1,8 @@ +--- +related-to: + - "[[Running tests with gotestsum]]" + - "[[go testify assertions]]" +--- Let's start with what we find in the [status-go build instructions](https://github.com/status-im/status-go/blob/develop/_docs/how-to-build.md) as lots of things just work. We have two options: (1) use the [nix](https://nixos.org/) develop shell or (2) just use standard shell you have in your shell. Theoretically, nix should give you better isolation and repeatability, yet, it is quite opinionated, has learning curve, and adds quite a bit complexity. For now thus, I decided to a more conservative shell environment, where I feel more comfortable. @@ -86,6 +91,54 @@ After that make sure that `$HOME/.local/share/go/bin` is in your path, and you s protoc --version libprotoc 32.1 ``` + +#### go-zerokit-rln-x86_64 vendoring problem + +If you try to run the tests for the first time, you may face the following error: + +```bash +gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -v -run "TestCodexClientTestSuite" -count 1 +FAIL github.com/status-im/status-go/protocol/communities [setup failed] + +=== Failed +=== FAIL: protocol/communities (0.00s) +FAIL github.com/status-im/status-go/protocol/communities [setup failed] + +=== Errors +vendor/github.com/waku-org/go-zerokit-rln/rln/link/x86_64.go:8:8: cannot find module providing package github.com/waku-org/go-zerokit-rln-x86_64/rln: import lookup disabled by -mod=vendor + + (Go version in go.mod is at least 1.14 and vendor directory exists.) + + +DONE 0 tests, 1 failure, 1 error in 0.000s +ERROR rerun aborted because previous run had errors +``` + +The problem can be outlined as follows: + +1. **The package *IS* declared in dependencies**: + - `go.mod` has: `github.com/waku-org/go-zerokit-rln-x86_64 v0.0.0-20230916171518-2a77c3734dd1 // indirect` + - `modules.txt` lists it as *vendored* +2. **BUT it's excluded from git**: + - `.gitignore` has: `vendor/github.com/waku-org/go-zerokit-rln-x86_64/` + - as the result. the actual vendor directory is **missing** from your file system +3. **Why it's excluded**: these seems to platform-specific native libraries (RLN - Rate Limiting Nullifier) with binary/compiled components that are large and platform-specific. The project excludes them from version control. +4. **The build tag restriction**: The file x86_64.go has build tags: + `//go:build (linux || windows) && amd64 && !android` + + So it only compiles on x86_64 Linux/Windows, but when it tries to compile, it needs the vendored package. + +#### The Solution + +We need to vendor the missing dependencies: + +```bash +# This will download the missing vendored dependencies +go mod vendor +``` + +This will populate the `vendor/github.com/waku-org/go-zerokit-rln-x86_64/` directory with the necessary files, even though they're gitignored. + ### Building backend and the libs Just to check if everything is setup correctly, let's build `status-backend` (which is a wrapper over status-go that provides web API - handy for testing), and then status-go static and shared libraries: diff --git a/10 Notes/Running tests with gotestsum.md b/10 Notes/Running tests with gotestsum.md new file mode 100644 index 0000000..0f6e119 --- /dev/null +++ b/10 Notes/Running tests with gotestsum.md @@ -0,0 +1,158 @@ +A summary of running different test scenarios with `gotestsum` based on an example + +## gotestsum Command Patterns + +### 1. **Only Selected Test** +```bash +# Run a specific test function +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloader_BasicSingleArchive$" -count 1 + +# Run specific testify test +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloader_BasicSingleArchive_Testify$" -count 1 + +# Run multiple archives testify test +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloader_MultipleArchives_Testify$" -count 1 +``` + +### 2. **Only Selected Test Suite** +```bash +# Run the entire testify suite (all methods in the suite) +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloaderSuite" -count 1 + +# Run a specific test method within the suite +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloaderSuite/TestBasicSingleArchive" -count 1 +``` + +### 3. **All Tests for Given Package** +```bash +# Run all tests in communities package +gotestsum --packages="./communities" -f testname --rerun-fails -- -count 1 + +# Alternative syntax (same result) +gotestsum --packages="./communities" -f testname --rerun-fails + +# Run all tests with verbose output +gotestsum --packages="./communities" -f testname --rerun-fails -- -v -count 1 +``` + +### 4. **Integration Tests** +```bash +# Run only integration tests (using build tags) +gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -run "Integration" -count 1 + +# Run integration tests with timeout (since they may take longer) +gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -run "Integration" -timeout=60s -count 1 + +# Run integration tests with specific environment variables +CODEX_HOST=localhost CODEX_API_PORT=8080 gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -run "Integration" -count 1 +``` + +## Advanced gotestsum Patterns + +### **Filter by Pattern (Multiple Tests)** +```bash +# Run all archive downloader tests (both standard and testify) +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "ArchiveDownloader" -count 1 + +# Run only testify tests +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "Testify" -count 1 + +# Run all CodexClient tests +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "CodexClient" -count 1 +``` + +### **Output Formats** +```bash +# Different output formats +gotestsum --packages="./communities" -f dots # Dots progress +gotestsum --packages="./communities" -f pkgname # Show package names +gotestsum --packages="./communities" -f testname # Show test names (recommended) +gotestsum --packages="./communities" -f standard-quiet # Minimal output +``` + +### **Multiple Packages** +```bash +# Run tests across multiple packages +gotestsum --packages="./communities,./cmd/upload,./cmd/download" -f testname --rerun-fails -- -count 1 + +# Run all packages recursively +gotestsum --packages="./..." -f testname --rerun-fails -- -count 1 +``` + +### **Race Detection and Coverage** +```bash +# Run with race detection +gotestsum --packages="./communities" -f testname --rerun-fails -- -race -count 1 + +# Run with coverage +gotestsum --packages="./communities" -f testname --rerun-fails -- -cover -count 1 + +# Run with both race detection and coverage +gotestsum --packages="./communities" -f testname --rerun-fails -- -race -cover -count 1 +``` + +## Key gotestsum Advantages + +1. **Better Output Formatting**: Clean, colored output with test names +2. **Automatic Retry**: `--rerun-fails` reruns failed tests automatically +3. **JUnit XML Output**: `--junitfile=results.xml` for CI/CD integration +4. **JSON Output**: `--jsonfile=results.json` for parsing +5. **Watch Mode**: `--watch` to rerun tests on file changes +6. **Parallel Execution**: Better handling of parallel test output + +## Complete Examples for Your Project + +```bash +# Quick test of archive downloader functionality +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "ArchiveDownloader" -count 1 + +# Full test suite with coverage +gotestsum --packages="./communities" -f testname --rerun-fails -- -cover -count 1 + +# Integration tests (when you have a Codex node running) +gotestsum --packages="./communities" -f testname --rerun-fails -- -tags=integration -timeout=60s -count 1 + +# Development workflow with watch mode +gotestsum --packages="./communities" -f testname --watch -- -count 1 +``` + +The key difference from `go test` is that `gotestsum` provides much better visual feedback, automatic retry capabilities, and better CI/CD integration options while using the same underlying Go test infrastructure. + +## Logs + +In your tests you can include custom logs. + +`go test -v` prints them without an issue, but for `gotestsum` to do the same you have to use `standard-verbose` format option: + +```bash +gotestsum --packages="./communities" -f standard-verbose --rerun-fails -- -run "TestCodexArchiveDownloaderSuite" -v -count 1 +=== RUN TestCodexArchiveDownloaderSuite +=== RUN TestCodexArchiveDownloaderSuite/TestBasicSingleArchive + codex_archive_downloader_testify_test.go:112: ✅ Basic single archive download test passed (testify version) + codex_archive_downloader_testify_test.go:113: - All mock expectations satisfied + codex_archive_downloader_testify_test.go:114: - Callback invoked: true +=== RUN TestCodexArchiveDownloaderSuite/TestMultipleArchives + codex_archive_downloader_testify_test.go:190: ✅ Multiple archives test passed (suite version) + codex_archive_downloader_testify_test.go:191: - Completed 3 out of 3 archives +--- PASS: TestCodexArchiveDownloaderSuite (0.20s) + --- PASS: TestCodexArchiveDownloaderSuite/TestBasicSingleArchive (0.10s) + --- PASS: TestCodexArchiveDownloaderSuite/TestMultipleArchives (0.10s) +PASS +ok go-codex-client/communities 0.205s + +DONE 3 tests in 0.205s +``` + +Compare this output with `-f testname`: + +```bash +gotestsum --packages="./communities" -f testname --rerun-fails -- -run "TestCodexArchiveDownloaderSuite" -count 1 +PASS communities.TestCodexArchiveDownloaderSuite/TestBasicSingleArchive (0.10s) +PASS communities.TestCodexArchiveDownloaderSuite/TestMultipleArchives (0.10s) +PASS communities.TestCodexArchiveDownloaderSuite (0.20s) +PASS communities + +DONE 3 tests in 0.205s +``` + +> Notice that the test suite itself is also counted as a test - this is one we see `DONE 3 tests` instead of `DONE 2 tests`. \ No newline at end of file diff --git a/10 Notes/go testify assertions.md b/10 Notes/go testify assertions.md new file mode 100644 index 0000000..16d2132 --- /dev/null +++ b/10 Notes/go testify assertions.md @@ -0,0 +1,113 @@ +Some summary about testify assertions. + +## `assert.Equal()` Function Signature + +```go +func Equal(t TestingT, expected, actual interface{}, msgAndArgs ...interface{}) bool +``` + +### Parameters Breakdown: + +1. **`t TestingT`** - The testing interface (first parameter) +2. **`expected interface{}`** - What you expect the value to be +3. **`actual interface{}`** - The actual value you're testing +4. **`msgAndArgs ...interface{}`** - Optional custom message and formatting arguments + +## What is `suite.T()`? + +When you're using testify's **test suite pattern**, `suite.T()` returns the underlying `*testing.T` instance associated with the current test method. + +```go +type CodexArchiveDownloaderTestifySuite struct { + suite.Suite // Embeds testify's Suite type + // ... other fields +} + +func (suite *CodexArchiveDownloaderTestifySuite) TestBasicSingleArchive() { + // suite.T() returns the *testing.T for this specific test method + assert.Equal(suite.T(), 1, downloader.GetTotalArchivesCount()) +} +``` + +## Comparison: Suite vs Function-Based + +### In Test Suite (what you're seeing): +```go +assert.Equal(suite.T(), expected, actual, "optional message") +``` + +### In Regular Function-Based Test: +```go +func TestSomething(t *testing.T) { + assert.Equal(t, expected, actual, "optional message") +} +``` + +## Why `suite.T()` is Needed + +The testify suite embeds a `*testing.T`, but assertions need direct access to it for: +- Reporting failures +- Marking tests as failed +- Logging output +- Integration with Go's test runner + +## Other Common Assert Functions + +```go +// Basic equality +assert.Equal(t, expected, actual) +assert.NotEqual(t, expected, actual) + +// Boolean checks +assert.True(t, condition) +assert.False(t, condition) + +// Nil checks +assert.Nil(t, value) +assert.NotNil(t, value) + +// Collection checks +assert.Len(t, collection, expectedLength) +assert.Contains(t, collection, element) +assert.Empty(t, collection) + +// Error checks +assert.NoError(t, err) +assert.Error(t, err) + +// Type checks +assert.IsType(t, expectedType, actual) + +// All with optional custom messages +assert.Equal(t, 42, result, "The calculation should return 42") +assert.True(t, isValid, "Validation should pass for input: %s", input) +``` + +## `require` vs `assert` + +Both take the same parameters, but behave differently on failure: + +```go +// assert continues test execution on failure +assert.Equal(t, 1, count) +assert.True(t, isReady) // This will still run even if above fails + +// require stops test execution immediately on failure +require.Equal(t, 1, count) +require.True(t, isReady) // This won't run if above fails +``` + +## In Your Code Context + +```go +// Line 90 you're looking at: +assert.Equal(suite.T(), 1, downloader.GetTotalArchivesCount(), "Total archives count should be 1") +``` + +This means: +- **`suite.T()`** - The testing context from the suite +- **`1`** - Expected value +- **`downloader.GetTotalArchivesCount()`** - Actual value being tested +- **`"Total archives count should be 1"`** - Custom error message if assertion fails + +The assertion will fail if `GetTotalArchivesCount()` returns anything other than `1`, and it will display your custom message along with the expected vs actual values. \ No newline at end of file From 4cd2a219c1384cfab8bde014bb735de31264ed7c Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 27 Oct 2025 15:23:22 +0100 Subject: [PATCH 16/25] adds notes on installing protoc-gen-go and mockgen --- 10 Notes/Running Unit Tests for status-go.md | 50 ++++++++++++++++++++ 1 file changed, 50 insertions(+) diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index d507caf..c49f61f 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -92,6 +92,56 @@ protoc --version libprotoc 32.1 ``` +Then also the `protoc-gen-go` plugin is required to generate Go code from `.proto` files. + +Install it with: + +```bash +go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.1 +``` + +Make sure `$(go env GOPATH)/bin` is in your `$PATH` so protoc can find the plugin. + +Verify the installation: + +```bash +which protoc-gen-go +protoc-gen-go --version +# Should output: protoc-gen-go v1.34.1 +``` +### notes on regenerating mocks + +In order to regenerate mocks you will need `mockgen`. You would expect that `make status-go-deps` did it, but it did not... + +You can install it with: + +```bash +go install go.uber.org/mock/mockgen +``` + +> Also make sure you have `$(go env GOPATH)/bin` in your PATH. Otherwise + make sure you have something like `export PATH="$PATH:$(go env GOPATH)/bin"` + in your `~/.bashrc` (adjusted to your SHELL and OS version). + This should be part of your standard GO installation. + +If everything works well, you should see something like: + +```bash +❯ which mockgen && mockgen -version +/home//go/bin/mockgen +v0.6.0 +``` + +If everything seems to be under control, we can now proceed with actual generation, e.g. for the mocks relevant to `protocol/communites`: + +```bash +go generate ./protocol/communities +``` + +The related mocks - if any - should be (re) generated. + +> Notice that `mock` folders are git ignored in status-go. + #### go-zerokit-rln-x86_64 vendoring problem If you try to run the tests for the first time, you may face the following error: From dede37f473bd213e0445dc953fe1fe2dc73fb306 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Tue, 28 Oct 2025 02:07:34 +0100 Subject: [PATCH 17/25] Updates docs about testing codex integration with status-go --- 10 Notes/Running Unit Tests for status-go.md | 2 +- ... Running functional tests in status-go.md} | 0 .../testing codex-status-go integration.md | 361 +++++++++++++----- 3 files changed, 257 insertions(+), 106 deletions(-) rename 10 Notes/{Running functional tests in development.md => Running functional tests in status-go.md} (100%) diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index c49f61f..70041a8 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -426,7 +426,7 @@ Generating HTML coverage report Testing finished ``` -Following the practice from running [[Running functional tests in development]], also here we have a handy script for starting a waku node suitable for unit testing: +Following the practice from running [[Running functional tests in status-go]], also here we have a handy script for starting a waku node suitable for unit testing: ```bash _assets/scripts/run_waku.sh diff --git a/10 Notes/Running functional tests in development.md b/10 Notes/Running functional tests in status-go.md similarity index 100% rename from 10 Notes/Running functional tests in development.md rename to 10 Notes/Running functional tests in status-go.md diff --git a/10 Notes/testing codex-status-go integration.md b/10 Notes/testing codex-status-go integration.md index ed4ef12..58c1839 100644 --- a/10 Notes/testing codex-status-go integration.md +++ b/10 Notes/testing codex-status-go integration.md @@ -2,16 +2,19 @@ related-to: - "[[status-go-codex integration - design notes]]" --- +In [[Running Unit Tests for status-go]] we provide general notes on running unit tests in the status-go project. And then we have a similar note about functional tests in [[Running functional tests in status-go]]. -There is one test in status-go that has slightly more end-to-end nature. It is from the `protocol` package: +In this document, we focus on our Codex extension to status-go and here we focus on the related unit and integration tests. + +There is one existing test in status-go that has slightly more end-to-end nature. It is from the `protocol` package: ``` protocol/communities_messenger_token_permissions_test.go ``` -I will be creating an updated version of this test **AFTER** testing lower levels of the stack. +We will be providing an updated version of this test **AFTER** testing lower levels of the stack. -The plan is as follows: +Thus, the plan is as follows: 1. More isolated tests of the CodexClient abstraction. There is a separate small utility project, where CodexClient can be exercised against the Codex client. I thought it may be easier this way to test the integration with the Codex library. The project repo url is: [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client). Most of the tests from this project will be ported to the working branch where the main integration work takes place: `status-go-codex-integraion` in the [status-im/status-go](https://github.com/status-im/status-go) repo. 2. Tests of `protocol/communities/codex_index_downloader.go` and `protocol/communities/codex_archive_downloader.go`. @@ -19,7 +22,256 @@ The plan is as follows: After that we should be ready for the cluster testing. If needed, we can also try to run status-desktop locally. -### Some early notes on the "integration" test +So in this document we first document running unit and integration tests for the three major abstractions we introduced to status-go: + +- CodexClient +- CodexIndexDownloader +- CodexArchiveDownloader + +They are comprehensively tested in the [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client) repo, but then they are integrated into the status-go. It is easy to figure out how to run the corresponding tests by just adjusting the commands in the above mentioned [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client) repo, but for completeness, we present the updated content below. + +### Regenerating artifacts + +In [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client) we include all the generated artifacts. In status-go, they are not included in the version control. Thus, what is optional in [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client), here is obligatory to do before you will be able to run the tests. + +There are two artifacts that need to be updated: + +- the protobuf +- the mocks + +For the first one - protobuf - you need two components: +1. **`protoc`** - the Protocol Buffer compiler itself +2. **`protoc-gen-go`** - the Go plugin for protoc that generates `.pb.go` files + +#### Installing protoc + +I have followed the instructions from [Protocol Buffer Compiler Installation](https://protobuf.dev/installation/). + +The following bash script (Arch Linux) can come in handy: + +```bash +#!/usr/bin/env bash + +set -euo pipefail + +echo "installing go..." + +sudo pacman -S --noconfirm --needed go + +echo "installing go protoc compiler" + +PB_REL="https://github.com/protocolbuffers/protobuf/releases" +VERSION="32.1" +FILE="protoc-${VERSION}-linux-x86_64.zip" + +# 1. create a temp dir +TMP_DIR="$(mktemp -d)" + +# ensure cleanup on exit +trap 'rm -rf "$TMP_DIR"' EXIT + +echo "Created temp dir: $TMP_DIR" + +# 2. download file into temp dir +curl -L -o "$TMP_DIR/$FILE" "$PB_REL/download/v$VERSION/$FILE" + +# 3. unzip into ~/.local/share/go +mkdir -p "$HOME/.local/share/go" +unzip -o "$TMP_DIR/$FILE" -d "$HOME/.local/share/go" + +# 4. cleanup handled automatically by trap +echo "protoc $VERSION installed into $HOME/.local/share/go" +``` + +After that make sure that `$HOME/.local/share/go/bin` is in your path, and you should get: + +```bash +protoc --version +libprotoc 32.1 +``` + +#### Installing protoc-gen-go + +The `protoc-gen-go` plugin is required to generate Go code from `.proto` files. +Install it with: + +```bash +go install google.golang.org/protobuf/cmd/protoc-gen-go@v1.34.1 +``` + +Make sure `$(go env GOPATH)/bin` is in your `$PATH` so protoc can find the plugin. + +Verify the installation: + +```bash +which protoc-gen-go +protoc-gen-go --version +# Should output: protoc-gen-go v1.34.1 +``` + +#### Installing mockgen + +In order to regenerate mocks you will need `mockgen`. + +You can install it with: + +```bash +go install go.uber.org/mock/mockgen +``` + +> Also make sure you have `$(go env GOPATH)/bin` in your PATH. Otherwise + make sure you have something like `export PATH="$PATH:$(go env GOPATH)/bin"` + in your `~/.bashrc` (adjusted to your SHELL and OS version). + This should be part of your standard GO installation. + +If everything works well, you should see something like: + +```bash +❯ which mockgen && mockgen -version +/home//go/bin/mockgen +v0.6.0 +``` + +If everything seems to be under control, we can now proceed with actual generation. + +The easiest way is to regenerate all in one go: + +```bash +go generate ./... +``` + +If you just need to regenerate the mocks: + +```bash +go generate ./protocol/communities +``` + +If you just need to regenerate the protobuf: + +```bash +go generate ./protobuf +``` + +> If you run `make`, e.g. `make statusgo-library`, the correct `generate` commands for the protobuf will be run for you. So in practice, you may not need to run `go generate ./protobuf` manually yourself - but for reference, why not... let's break something ;). + +### Running unit tests for Codex abstractions + +We have some unit tests and a couple of integration tests. + +In this section we focus on the unit tests. The integration tests are covered in the +next section. + +To run all unit tests: + +```bash +❯ go test -v ./protocol/communities -count 1 +``` + +To be more selective, e.g. in order to run all the tests from +`CodexArchiveDownloaderSuite`, run: + +```bash +go test -v ./protocol/communities -run CodexArchiveDownloader -count 1 +``` + +or for an individual test from that suite: + +```bash +go test -v ./protocol/communities -run TestCodexArchiveDownloaderSuite/TestCancellationDuringPolling -count 1 +``` + +You can also use `gotestsum` to run the tests (you may need to install it first, e.g. `go install gotest.tools/gotestsum@v1.13.0`): + +```bash +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -count 1 +``` + +For a more verbose output including logs use `-f standard-verbose`, e.g.: + +```bash +gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -v -count 1 +``` + +To be more selective, e.g. in order to run all the tests from +`CodexArchiveDownloaderSuite`, run: + +```bash +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -run CodexArchiveDownloader -count 1 +``` + +or for an individual test from that suite: + +```bash +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -run TestCodexArchiveDownloaderSuite/TestCancellationDuringPolling -count 1 +``` + +Notice, that the `-run` flag accepts a regular expression that matches against the full test path, so you can be more concise in naming if necessary, e.g.: + +```bash +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -run CodexArchiveDownloader/Cancellation -count 1 +``` + +This also applies to native `go test` command. + +### Running integration tests + +When building Codex client for testing like here, I often remove some logging noise, by slightly changing the build params in `build.nims`: + +```nim +task codex, "build codex binary": + buildBinary "codex", + # params = "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE" + params = + "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE -d:chronicles_enabled_topics:restapi:TRACE,node:TRACE" +``` + +You see a slightly more selective `params` in the `codex` task. + +To start Codex client, use e.g.: + +```bash +./build/codex --data-dir=./data-1 --listen-addrs=/ip4/127.0.0.1/tcp/8081 --api-port=8001 --nat=none --disc-port=8091 --log-level=TRACE +``` + +To run the integration test, use `codex_integration` tag and narrow the scope using `-run Integration`: + +```bash +CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run Integration -timeout 15s +``` + +This will run all integration tests, including `CodexClient` integration tests. + +To make sure that the test is actually run and not cached, use `count` option: + +```bash +CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run Integration -timeout 15s -count 1 +``` + +To be more specific and only run the tests related to, e.g. index downloader or archive +downloader you can use: + +```bash +CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run CodexIndexDownloaderIntegration -timeout 15s -count 1 + +CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run CodexArchiveDownloaderIntegration -timeout 15s -count 1 +``` + +and then, if you prefer to use `gotestsum`: + +```bash +CODEX_API_PORT=8001 gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -tags=codex_integration -run CodexIndexDownloaderIntegration -v -count 1 + +CODEX_API_PORT=8001 gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -tags=codex_integration -run CodexArchiveDownloaderIntegration -v -count 1 +``` + +or to run all integration tests (including `CodexClient` integration tests): + +```bash +CODEX_API_PORT=8001 gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -tags=codex_integration -v -count 1 -run Integration +``` + +I prefer to be more selective when running integration tests. +### Main integration test This is about step 3 above: "Codex" version of `protocol/communities_messenger_token_permissions_test.go`. @@ -77,104 +329,3 @@ Notice, there is one archive expected. The `CreateHistoryArchiveTorrentFromDB` is called directly here, in a way bypassing the torrent seeding: in normal flow `CreateHistoryArchiveTorrentFromDB` is called in `CreateAndSeedHistoryArchive` which immediately after creating the archive, calls `SeedHistoryArchiveTorrent`. `CreateHistoryArchiveTorrentFromDB` calls `createHistoryArchiveTorrent` - which is central to the archive creating. TBC... - - -### Isolated tests of the CodexClient abstraction - -> The text in this section is basically a copy of README from [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client). - -We will be running codex client, and then use a small testing utility to check if the low level abstraction - CodexClient - correctly uploads and downloads the content. -### Running CodexClient - -I often remove some logging noise, by slightly changing the build params in `build.nims`: - -```nim -task codex, "build codex binary": - buildBinary "codex", - # params = "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE" - params = - "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE -d:chronicles_enabled_topics:restapi:TRACE,node:TRACE" -``` - -You see a slightly more selective `params` in the `codex` task. - -To run the client I use the following command: - -```bash -./build/codex --data-dir=./data-1 --listen-addrs=/ip4/127.0.0.1/tcp/8081 --api-port=8001 --nat=none --disc-port=8091 --log-level=TRACE -``` - -### Building codex-upload and codex-download utilities - -Use the following command to build the `codex-upload` and `codex-download` utilities: - -```bash -go build -o bin/codex-upload ./cmd/upload -go build -o bin/codex-download ./cmd/download -``` -### Uploading content to Codex - -Now, using the `codex-upload` utility, we can upload the content to Codex as follows: - -```bash -~/code/local/go-codex-client -❯ ./bin/codex-upload -file test-data.bin -host localhost -port 8001 -Uploading test-data.bin (43 bytes) to Codex at localhost:8001... -✅ Upload successful! -CID: zDvZRwzm8K7bcyPeBXcZzWD7AWc4VqNuseduDr3VsuYA1yXej49V -``` - -### Downloading content from Codex - -Now, having the content uploaded to Codex - let's get it back using the `codex-download` utility: - -```bash -~/code/local/go-codex-client -❯ ./bin/codex-download -cid zDvZRwzm8K7bcyPeBXcZzWD7AWc4VqNuseduDr3VsuYA1yXej49V -file output.bin -host localhost -port 8001 -Downloading CID zDvZRwzm8K7bcyPeBXcZzWD7AWc4VqNuseduDr3VsuYA1yXej49V from Codex at localhost:8001... -✅ Download successful! -Saved to: output.bin -``` - -You can easily compare that the downloaded content matches the original using: - -```bash -~/code/local/go-codex-client -❯ openssl sha256 test-data.bin -SHA2-256(test-data.bin)= c74ce73165c288348b168baffc477b6db38af3c629b42a7725c35d99d400d992 - -~/code/local/go-codex-client -❯ openssl sha256 output.bin -SHA2-256(output.bin)= c74ce73165c288348b168baffc477b6db38af3c629b42a7725c35d99d400d992 -``` - -### Running tests - -There are a couple of basic tests, including one integration test. - -To run the unit tests: - -```bash -❯ go test -v ./communities -=== RUN TestUpload_Success ---- PASS: TestUpload_Success (0.00s) -=== RUN TestDownload_Success ---- PASS: TestDownload_Success (0.00s) -=== RUN TestDownloadWithContext_Cancel ---- PASS: TestDownloadWithContext_Cancel (0.04s) -PASS -ok go-codex-client/communities 0.044s -``` - -To run the integration test, use `integration` tag and narrow the scope using `-run Integration`: - -```bash -go test -v -tags=integration ./communities -run Integration -timeout 15s -``` - -To make sure that the test is actually run and not cached, use `count` option: - -```bash -go test -v -tags=integration ./communities -run Integration -timeout 15s -count 1 -``` - From 5f3b9aaa661031e4a7fc8db93d6fe16c550e6b6b Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Thu, 30 Oct 2025 04:12:08 +0100 Subject: [PATCH 18/25] latest updates to the docs --- ...tory Archives - InitHistoryArchiveTasks.md | 6 - ...tory Archives and Community Description.md | 413 ++++++++++++++++++ 10 Notes/status-go processing magnet links.md | 23 +- .../testing codex-status-go integration.md | 153 ++++++- 4 files changed, 576 insertions(+), 19 deletions(-) create mode 100644 10 Notes/History Archives and Community Description.md diff --git a/10 Notes/Creating History Archives - InitHistoryArchiveTasks.md b/10 Notes/Creating History Archives - InitHistoryArchiveTasks.md index c4f0381..b9e6c1b 100644 --- a/10 Notes/Creating History Archives - InitHistoryArchiveTasks.md +++ b/10 Notes/Creating History Archives - InitHistoryArchiveTasks.md @@ -6,12 +6,6 @@ related-to: - "[[status-go-codex integration - design notes]]" - "[[Creating History Archives - InitHistoryArchiveTasks]]" --- -Great question! Let me trace the connection between `StartHistoryArchiveTasksInterval` and `InitHistoryArchiveTasks` to show you how the periodic archive creation system is initialized and started. - -Searched codebase for "InitHistoryArchiveTasks StartHistoryArchiveTasksInterval", 13 results - -Perfect! Now I can show you the complete connection between `InitHistoryArchiveTasks` and `StartHistoryArchiveTasksInterval`. Let me trace through this step by step: - ## **Connection Flow: `InitHistoryArchiveTasks` → `StartHistoryArchiveTasksInterval`** ### **1. Where `InitHistoryArchiveTasks` is Called** diff --git a/10 Notes/History Archives and Community Description.md b/10 Notes/History Archives and Community Description.md new file mode 100644 index 0000000..abd3408 --- /dev/null +++ b/10 Notes/History Archives and Community Description.md @@ -0,0 +1,413 @@ +marcinczenko: can you remind me how `ArchiveIndexCidClock` from the community description is used? Can you summarize how community description messages are sent and received and how they relate to magent links/indexCid updates - I remembered that community description had some impact on processing magnet links. I just to remember the details... + +GitHub Copilot: I'll help you understand how `ArchiveIndexCidClock` is used and how it relates to community description messages and index CID updates. + +Let me search for relevant code to give you a complete picture. + +Searched text for `ArchiveIndexCidClock`, 2 results + +Searched text for `ArchiveMagnetlinkClock`, 2 results + +Searched text for `HandleCommunityDescriptionMessage`, 12 results + +Now let me look at the specific section where the clock comparison happens: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager.go#2310-2310), lines 2310 to 2360 + +Now let me check how these clocks are updated from the persistence layer and how magnetlink/indexCid messages are handled: + +Searched text for `UpdateCommunityDescriptionIndexCidMessageClock`, 2 results + +Searched text for `UpdateCommunityDescriptionMagnetlinkMessageClock`, 2 results + +Searched codebase for "handle archive magnetlink index CID message torrent community", 14 results + +Now let me look at the index CID related code: + +Searched text for `HandleIndexCidMessage`, no results + +Searched text for `dispatchIndexCidMessage`, 2 results + +Searched text for `CommunityMessageArchiveIndexCid`, 9 results + +Now let me look at these handler functions: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#3785-3785), lines 3785 to 3825 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#4145-4145), lines 4145 to 4205 + +Now let me check the HandleHistoryArchiveIndexCidMessage: + +Searched text for `HandleHistoryArchiveIndexCidMessage`, 2 results + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_handler.go#1344-1344), lines 1344 to 1414 + +Perfect! Now let me check how the persistence saves this and look at the protobuf definition: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/protobuf/communities.proto#220-220), lines 220 to 270 + +Searched text for `SaveCommunityArchiveInfo`, 2 results + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/persistence.go#1023-1023), lines 1023 to 1083 + +Perfect! Now I have a complete picture. Let me provide you with a comprehensive summary: + +## Summary: How `ArchiveIndexCidClock` and Community Description Messages Work + +### **Community Description Clocks for Archives** + +The community description contains two clock fields for tracking archive distribution: +1. **`ArchiveMagnetlinkClock`** - tracks the clock of the last magnetlink (torrent) message +2. **`ArchiveIndexCidClock`** - tracks the clock of the last index CID (Codex) message + +These clocks are stored in the **community description protobuf** itself and are propagated when the community description is updated and distributed. + +--- + +### **How Community Description Messages Are Sent** + +1. **Control node creates/updates community** → Community description is updated with current state +2. **Community description is marshaled** → Converted to protobuf format +3. **Wrapped in ApplicationMetadataMessage** → Signed and wrapped +4. **Published to community channels** → Sent to all members via waku + +The community description includes: +- All community metadata (name, description, members, etc.) +- Token permissions +- **Archive clocks**: `ArchiveMagnetlinkClock` and `ArchiveIndexCidClock` + +--- + +### **How Community Description Messages Are Received** + +When a node receives a community description message: + +**In `handleCommunityDescriptionMessageCommon()` (line 2295):** + +```go +// 1. Update the community with the new description +changes, err := community.UpdateCommunityDescription(description, payload, newControlNode) + +// 2. Check if archive info exists in local DB +hasCommunityArchiveInfo, err := m.persistence.HasCommunityArchiveInfo(community.ID()) + +// 3. Extract clocks from the received community description +cdMagnetlinkClock := community.config.CommunityDescription.ArchiveMagnetlinkClock +cdIndexCidClock := community.config.CommunityDescription.ArchiveIndexCidClock + +// 4. If no archive info exists, save it with the clocks from CD +if !hasCommunityArchiveInfo { + err = m.persistence.SaveCommunityArchiveInfo(community.ID(), cdMagnetlinkClock, 0, cdIndexCidClock) +} else { + // 5. If archive info exists, compare clocks and update if CD has newer clock + + // For magnetlink: + magnetlinkClock, err := m.persistence.GetMagnetlinkMessageClock(community.ID()) + if cdMagnetlinkClock > magnetlinkClock { + err = m.persistence.UpdateMagnetlinkMessageClock(community.ID(), cdMagnetlinkClock) + } + + // For index CID: + indexCidClock, err := m.persistence.GetIndexCidMessageClock(community.ID()) + if cdIndexCidClock > indexCidClock { + err = m.persistence.UpdateIndexCidMessageClock(community.ID(), cdIndexCidClock) + } +} +``` + +--- + +### **The Key Insight: Community Description Clock Comparison** + +The **community description acts as a checkpoint** for archive distribution state. When nodes receive a community description: + +- **They compare the CD's archive clocks** with their local archive info clocks +- **If CD has newer clocks**, they update their local tracking +- This ensures that even if a node **missed** the actual magnetlink/indexCid messages, they'll know there's a newer archive available when they receive the next community description + +--- + +### **How Magnetlink/IndexCid Messages Work** + +**When control node dispatches archive messages:** + +1. **Control node seeds archive** → Creates torrent/uploads to Codex +2. **Dispatches message** (magnetlink or indexCid) → Sent to community +3. **Updates CD clock** → Updates `ArchiveMagnetlinkClock` or `ArchiveIndexCidClock` in community description +4. **Updates local tracking** → Also updates local persistence tables + +**When member receives archive message:** + +```go +// In HandleHistoryArchiveIndexCidMessage (line 1344): + +// 1. Get the last clock from LOCAL tracking table +lastIndexCidClock, err := m.communitiesManager.GetIndexCidMessageClock(id) +lastMagnetlinkClock, err := m.communitiesManager.GetMagnetlinkMessageClock(id) + +// 2. Compare with incoming message clock +// 3. If incoming clock >= lastClock, process it (download archives) +// 4. Update local tracking clocks +``` + +--- + +### **Why This Design?** + +This dual-tracking system (CD clocks + local tracking) provides: + +1. **Resilience**: If a node misses the actual archive message, the next community description will let them know there's a newer archive +2. **Synchronization**: New members get the latest archive clock immediately when they join (via CD) +3. **Deduplication**: Prevents re-downloading the same archive multiple times +4. **Preference support**: Can compare clocks from both methods (torrent vs Codex) to support distribution preferences + +--- + +### **Database Storage** + +All tracked in `communities_archive_info` table: +- `magnetlink_clock` - last seen magnetlink message clock +- `index_cid_clock` - last seen index CID message clock +- `last_magnetlink_uri` - actual magnetlink string +- `last_index_cid` - actual CID string + +The community description clocks act as a "high water mark" that gets propagated with every CD update, while the local tracking tables record what archive messages were actually processed. + +marcinczenko: ok, so it looks like the clocks in community description prevent from downloading and processing outdated archives? + +Can you also show me: + +(1) where the control node opdates ArchiveMagnetlinkClock or ArchiveIndexCidClock in community description +(2) when and where community description are sent (show me where it is in code as well) + +GitHub Copilot: Great question! Yes, exactly - the clocks in the community description act as a "high water mark" to prevent processing outdated archives. Let me show you the code for both parts: + +## (1) Where Control Node Updates Archive Clocks in Community Description + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#4081-4081), lines 4081 to 4131 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#250-250), lines 250 to 290 + +Now let me find where the community description clock is actually updated: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#4130-4130), lines 4130 to 4160 + +Perfect! Now let me see where `UpdateCommunityDescriptionMagnetlinkMessageClock` and `UpdateCommunityDescriptionIndexCidMessageClock` actually update the CD: + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager.go#3696-3696), lines 3696 to 3726 + +Excellent! Now let me find where `SaveCommunity` triggers the community description to be published: + +## (2) When and Where Community Descriptions Are Sent + +Searched text for `func (m *Manager) SaveCommunity`, 4 results + +Searched text for `func (m *Manager) saveAndPublish`, 2 results + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager.go#5102-5102), lines 5102 to 5162 + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager.go#4604-4604), lines 4604 to 4644 + +Now let me find the `publish` function to see how it actually sends the community description: + +Searched text for `func (m *Manager) publish(`, 1 result + +Read [](file:///home/mc2/code/status-im/status-go/protocol/communities/manager.go#747-747), lines 747 to 767 + +Now let me find where the subscription is consumed and the actual message is sent: + +Searched text for `handleCommunitiesSubscription`, 3 results + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#306-306), lines 306 to 406 + +Perfect! Now let me find the `publishOrg` function: + +Searched text for `func (m *Messenger) publishOrg`, 1 result + +Read [](file:///home/mc2/code/status-im/status-go/protocol/messenger_communities.go#115-115), lines 115 to 195 + +Perfect! Now I have all the information. Let me provide you with a comprehensive answer: + +--- + +## Summary: How Archive Clocks Are Updated and Community Descriptions Are Sent + +### (1) Where Control Node Updates Archive Clocks in Community Description + +**The Flow:** + +1. **Archive is seeded** → Archive manager detects seeding is complete +2. **Signal is published** → `HistoryArchivesSeedingSignal` is sent via subscription +3. **Control node dispatches archive messages** → Sends magnetlink/indexCid messages +4. **Control node updates CD clocks** → Updates `ArchiveMagnetlinkClock` or `ArchiveIndexCidClock` + +**The Code Path:** + +``` +protocol/messenger_communities.go:250-270 (handleCommunitiesHistoryArchivesSubscription) +└─> When HistoryArchivesSeedingSignal received and IsControlNode(): + ├─> dispatchMagnetlinkMessage() (line 4099) + │ └─> UpdateCommunityDescriptionMagnetlinkMessageClock() (line 4138) + │ └─> manager.go:3696 - Sets community.config.CommunityDescription.ArchiveMagnetlinkClock + │ └─> SaveCommunity() - Saves to DB + │ + └─> dispatchIndexCidMessage() (line 4145) + └─> UpdateCommunityDescriptionIndexCidMessageClock() (line 4183) + └─> manager.go:3708 - Sets community.config.CommunityDescription.ArchiveIndexCidClock + └─> SaveCommunity() - Saves to DB +``` + +**Key Code Locations:** + +**In `messenger_communities.go:250-270`:** +```go +if c.IsControlNode() { + if sub.HistoryArchivesSeedingSignal.MagnetLink { + err := m.dispatchMagnetlinkMessage(sub.HistoryArchivesSeedingSignal.CommunityID) + } + if sub.HistoryArchivesSeedingSignal.IndexCid { + err := m.dispatchIndexCidMessage(sub.HistoryArchivesSeedingSignal.CommunityID) + } +} +``` + +**In `messenger_communities.go:4138-4142`:** +```go +// After sending magnetlink message: +err = m.communitiesManager.UpdateCommunityDescriptionMagnetlinkMessageClock(community.ID(), magnetLinkMessage.Clock) +``` + +**In `manager.go:3696-3705`:** +```go +func (m *Manager) UpdateCommunityDescriptionMagnetlinkMessageClock(communityID types.HexBytes, clock uint64) error { + community, err := m.GetByIDString(communityID.String()) + community.config.CommunityDescription.ArchiveMagnetlinkClock = clock + return m.SaveCommunity(community) // ← Saves to DB +} +``` + +**Important:** Note that `SaveCommunity()` **only saves to the database** - it does NOT automatically publish the community description! The CD will be published later through the periodic check or when other changes trigger a publish. + +--- + +### (2) When and Where Community Descriptions Are Sent + +**There are TWO main ways community descriptions are published:** + +#### **A. Event-Driven Publishing (Immediate)** + +When changes happen (like updating clocks, editing community, accepting members), the code calls: + +**`saveAndPublish()` → `manager.go:4608-4638`** +```go +func (m *Manager) saveAndPublish(community *Community) error { + err := m.SaveCommunity(community) // Save to DB + if err != nil { + return err + } + + if community.IsControlNode() { + m.publish(&Subscription{Community: community}) // ← Publish event + return nil + } + // ... handle admin events +} +``` + +**`publish()` → `manager.go:747-759`** +```go +func (m *Manager) publish(subscription *Subscription) { + for _, s := range m.subscriptions { + s <- subscription // ← Send to subscription channel + } +} +``` + +#### **B. Subscription Handler (Actual Network Send)** + +**`handleCommunitiesSubscription()` → `messenger_communities.go:307-406`** + +This goroutine listens to the subscription channel: + +```go +func (m *Messenger) handleCommunitiesSubscription(c chan *communities.Subscription) { + // Checks every 5 minutes + ticker := time.NewTicker(5 * time.Minute) + + go func() { + for { + select { + case sub := <-c: // ← Receives from subscription channel + if sub.Community != nil { + publishOrgAndDistributeEncryptionKeys(community) + } + case <-ticker.C: // ← Periodic check every 5 minutes + // ... republish if needed + } + } + }() +} +``` + +The `publishOrgAndDistributeEncryptionKeys` function then calls: + +**`publishOrg()` → `messenger_communities.go:115-159`** +```go +func (m *Messenger) publishOrg(org *communities.Community, shouldRekey bool) error { + payload, err := org.MarshaledDescription() // ← Marshal community description + + rawMessage := messagingtypes.RawMessage{ + Payload: payload, + Sender: org.PrivateKey(), + SkipEncryptionLayer: true, + MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_DESCRIPTION, + PubsubTopic: org.PubsubTopic(), + Priority: &messagingtypes.HighPriority, + } + + messageID, err := m.messaging.SendPublic(context.Background(), org.IDString(), rawMessage) + // ← Actually sends to the network via Waku + return err +} +``` + +--- + +### **The Complete Flow:** + +``` +1. Control Node Seeds Archive + └─> HistoryArchivesSeedingSignal published + +2. dispatchMagnetlinkMessage() or dispatchIndexCidMessage() + ├─> Sends actual magnetlink/indexCid message to network + └─> UpdateCommunityDescriptionMagnetlinkMessageClock() + └─> Updates community.config.CommunityDescription.ArchiveMagnetlinkClock + └─> SaveCommunity() - saves to DB only + +3. Later (when CD is published for any reason): + └─> saveAndPublish() called OR periodic check triggers + └─> publish(&Subscription{Community: community}) + └─> handleCommunitiesSubscription receives event + └─> publishOrg() + └─> MarshaledDescription() - includes updated clocks + └─> SendPublic() - sends to Waku network + +4. Members receive Community Description + └─> HandleCommunityDescriptionMessage() + └─> handleCommunityDescriptionMessageCommon() + └─> Compares CD clocks with local tracking + └─> Updates local tracking if CD has newer clocks +``` + +--- + +### **Key Insights:** + +1. **Archive clocks are updated in CD immediately** when magnetlink/indexCid messages are dispatched +2. **CD is NOT immediately published** - it waits for the next publish event or periodic check +3. **CD includes the updated clocks** whenever it's eventually published +4. **This design ensures** that even if members miss the actual magnetlink/indexCid message, they'll get the updated clock in the next CD update +5. **The clocks prevent reprocessing** - members won't download the same archive twice because they compare incoming message clocks against both the CD clocks and their local tracking + +This is why you can miss an archive message but still know there's a newer archive available - the CD acts as a "checkpoint" that gets propagated with every community update! \ No newline at end of file diff --git a/10 Notes/status-go processing magnet links.md b/10 Notes/status-go processing magnet links.md index ef5fa27..4e77945 100644 --- a/10 Notes/status-go processing magnet links.md +++ b/10 Notes/status-go processing magnet links.md @@ -547,18 +547,18 @@ func (m *Messenger) handleRetrievedMessages(chatWithMessages map[messagingtypes. └─────────────────────────────────────────────────────────────────┘ ↓ ┌─────────────────────────────────────────────────────────────────┐ -│ MESSAGE COLLECTION │ -│ RetrieveAll() → messaging.RetrieveRawAll() │ -│ ↓ │ -│ transport.RetrieveRawAll() │ -│ ↓ │ -│ For each filter: api.GetFilterMessages() │ -│ ↓ │ -│ filter.Retrieve() → store.Pop() │ -│ │ -│ Returns: map[ChatFilter][]*ReceivedMessage │ +│ MESSAGE COLLECTION │ +│ RetrieveAll() → messaging.RetrieveRawAll() │ +│ ↓ │ +│ transport.RetrieveRawAll() │ +│ ↓ │ +│ For each filter: api.GetFilterMessages() │ +│ ↓ │ +│ filter.Retrieve() → store.Pop() │ +│ │ +│ Returns: map[ChatFilter][]*ReceivedMessage │ └─────────────────────────────────────────────────────────────────┘ - ↓ + ↓ ┌─────────────────────────────────────────────────────────────────┐ │ MESSAGE PROCESSING │ │ handleRetrievedMessages(messages, true, false) │ @@ -575,6 +575,7 @@ func (m *Messenger) handleRetrievedMessages(chatWithMessages map[messagingtypes. └─────────────────────────────────────────────────────────────────┘ ``` +And here is also a link to a diagram in excalidraw: [https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi](https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi). ### **6. Key Points About the Flow** 1. **Asynchronous Message Queue**: Messages from network are queued and processed asynchronously diff --git a/10 Notes/testing codex-status-go integration.md b/10 Notes/testing codex-status-go integration.md index 58c1839..2dd0c9c 100644 --- a/10 Notes/testing codex-status-go integration.md +++ b/10 Notes/testing codex-status-go integration.md @@ -4,6 +4,13 @@ related-to: --- In [[Running Unit Tests for status-go]] we provide general notes on running unit tests in the status-go project. And then we have a similar note about functional tests in [[Running functional tests in status-go]]. +Also, to learn the history archive creation/upload and download/processing flows (recorded AI conversation with some edits), please check: + +- archive creation/upload: [[When are magnetlink messages sent]] +- archive download/processing: [[status-go processing magnet links]] + +In that last document I am including a link to an excalidraw diagram that can be helpful - for convenience: [https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi](https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi) + In this document, we focus on our Codex extension to status-go and here we focus on the related unit and integration tests. There is one existing test in status-go that has slightly more end-to-end nature. It is from the `protocol` package: @@ -275,7 +282,32 @@ I prefer to be more selective when running integration tests. This is about step 3 above: "Codex" version of `protocol/communities_messenger_token_permissions_test.go`. -The test we are particularly interested in - `TestImportDecryptedArchiveMessages` - first creates a community and sets up the corresponding permissions. Then the community owner sends a message to the community and then immediately retrieves it so that it is now recorded in the DB. +The test we are particularly interested in is `TestImportDecryptedArchiveMessages`. + +This test produces lots of output - with lot's warnings and errors - so looking at the log to judge the success would be a challenge. Yet, the test passes: + +```bash +❯ gotestsum --packages="./protocol" -f testname -- -run "TestMessengerCommunitiesTokenPermissionsSuite/TestImportDecryptedArchiveMessages" -count 1 -tags "gowaku_no_rln gowaku_skip_migrations" +PASS protocol.TestMessengerCommunitiesTokenPermissionsSuite/TestImportDecryptedArchiveMessages (1.88s) +PASS protocol.TestMessengerCommunitiesTokenPermissionsSuite (1.88s) +PASS protocol + +DONE 2 tests in 1.900s +``` + +If you want to take a look at the logs you can use the more verbose version of the above command: + +```bash +❯ gotestsum --packages="./protocol" -f standard-verbose -- -run "TestMessengerCommunitiesTokenPermissionsSuite/TestImportDecryptedArchiveMessages" -v -count 1 -tags "gowaku_no_rln gowaku_skip_migrations" +``` + +and you can use `tee` to redirect all the output to a file: + +```bash +❯ gotestsum --packages="./protocol" -f standard-verbose -- -run "TestMessengerCommunitiesTokenPermissionsSuite/TestImportDecryptedArchiveMessages" -v -count 1 -tags "gowaku_no_rln gowaku_skip_migrations" | tee "test_1.log" +``` + +The test first creates a community and sets up the corresponding permissions. Then the community owner sends a message to the community and then immediately retrieves it so that it is now recorded in the DB. After that it prepares archive parameters: `startDate`, `endDate`, `partition`, and community `topics`. All those will be passed to `CreateHistoryArchiveTorrentFromDB` - our entry point to creating history archive torrent. @@ -328,4 +360,121 @@ Notice, there is one archive expected. The `CreateHistoryArchiveTorrentFromDB` is called directly here, in a way bypassing the torrent seeding: in normal flow `CreateHistoryArchiveTorrentFromDB` is called in `CreateAndSeedHistoryArchive` which immediately after creating the archive, calls `SeedHistoryArchiveTorrent`. `CreateHistoryArchiveTorrentFromDB` calls `createHistoryArchiveTorrent` - which is central to the archive creating. -TBC... +The "Codex" version of the `CreateHistoryArchiveTorrentFromDB` is `CreateHistoryArchiveCodexFromDB` which will call `createHistoryArchiveCodex` - this is where archives are created and uploaded to Codex. + +Another function that this test "touches" is `LoadHistoryArchiveIndexFromFile`, for which the "Codex" version is `CodexLoadHistoryArchiveIndexFromFile`. + +Thus, this test focuses on an important cut of the whole end-to-end flow and in our case, where we use Codex, it also indirectly tests seeding and retrieving the archives from the network. + +### Other places we can consider to test + +The integration test described above does not cover actual publishing of the generated archives over waku channel. This normally happens in `CreateAndSeedHistoryArchive`: + +``` +CreateAndSeedHistoryArchive + |- CreateHistoryArchiveTorrentFromDB + |- SeedHistoryArchiveTorrent + |- CreateHistoryArchiveCodexFromDB + |- publish: HistoryArchiveSeedingSignal +``` + +We see that we seed the index file and the archives for both torrent and Codex and when at least one publishing method succeeds, we do: + +```go +m.publisher.publish(&Subscription{ + HistoryArchivesSeedingSignal: &signal.HistoryArchivesSeedingSignal{ + CommunityID: communityID.String(), + MagnetLink: archiveTorrentCreatedSuccessfully, // true if torrent created successfully + IndexCid: archiveCodexCreatedSuccessfully, // true if codex created successfully + }, +}) +``` + +This signal is subsequently received in `handleCommunitiesHistoryArchivesSubscription`, where we find: + +```go +if c.IsControlNode() { + if sub.HistoryArchivesSeedingSignal.MagnetLink { + err := m.dispatchMagnetlinkMessage(sub.HistoryArchivesSeedingSignal.CommunityID) + if err != nil { + m.logger.Debug("failed to dispatch magnetlink message", zap.Error(err)) + } + } + if sub.HistoryArchivesSeedingSignal.IndexCid { + err := m.dispatchIndexCidMessage(sub.HistoryArchivesSeedingSignal.CommunityID) + if err != nil { + m.logger.Debug("failed to dispatch index cid message", zap.Error(err)) + } + } +} +``` + +The `dispatchMagnetlinkMessage` and `dispatchIndexCidMessage` is where dispatching is happening. For Codex the MessageType used is `protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID`. + +The message is sent as follows: + +```go +chatID := community.MagnetlinkMessageChannelID() +rawMessage := messagingtypes.RawMessage{ + LocalChatID: chatID, + Sender: community.PrivateKey(), + Payload: encodedMessage, + MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_MESSAGE_ARCHIVE_INDEX_CID, + SkipGroupMessageWrap: true, + PubsubTopic: community.PubsubTopic(), + Priority: &messagingtypes.LowPriority, +} + +_, err = m.messaging.SendPublic(context.Background(), chatID, rawMessage) +if err != nil { + return err +} + +err = m.communitiesManager.UpdateCommunityDescriptionIndexCidMessageClock(community.ID(), indexCidMessage.Clock) +if err != nil { + return err +} +return m.communitiesManager.UpdateIndexCidMessageClock(community.ID(), indexCidMessage.Clock) +``` + +Here notice the call to `UpdateCommunityDescriptionIndexCidMessageClock`. As you can see, the clocks are also recorded in the community description. Community description is sent over waku to other community members periodically (every 5mins) or on some events. This how it is sent in `publishOrg` in `protocol/messenger_communities.go`: + +```go +rawMessage := messagingtypes.RawMessage{ + Payload: payload, + Sender: org.PrivateKey(), + // we don't want to wrap in an encryption layer message + SkipEncryptionLayer: true, + CommunityID: org.ID(), + MessageType: protobuf.ApplicationMetadataMessage_COMMUNITY_DESCRIPTION, + PubsubTopic: org.PubsubTopic(), // TODO: confirm if it should be sent in community pubsub topic + Priority: &messagingtypes.HighPriority, +} +if org.Encrypted() { + members := org.GetMemberPubkeys() + if err != nil { + return err + } + rawMessage.CommunityKeyExMsgType = messagingtypes.KeyExMsgRekey + // This should be the one that it was used to encrypt this community + rawMessage.HashRatchetGroupID = org.ID() + rawMessage.Recipients = members +} +messageID, err := m.messaging.SendPublic(context.Background(), org.IDString(), rawMessage) +``` + +When community members receive the community description, they compare the clocks in the community description with the most recent clocks of the most recent magnet link or index Cid. IF the clocks in the community description are newer (more recent), they update the local copies, so that when a new magnet link or index Cid message arrives, they know to ignore outdated messages. + +To read more, check: [[History Archives and Community Description]]. + +This naturally brought us to the reception of the magnet links/index Cid (see also [[status-go processing magnet links]] and [[status-go publishing magnet links]]). + +Going from Waku and layers of status-go, the accumulated messages are periodically collected using `RetrieveAll` functions, which passes the message to `handleRetrievedMessages` for processing. + +For each message, `dispatchToHandler` is called (in it in generated file `message_handler.go` generated with `go generate ./cmd/generae_handlers/`) where are magnet links/index Cid message are forwarded to their respective handlers: `handleCommunityMessageArchiveMagnetlinkProtobuf` and `handleCommunityMessageArchiveIndexCidProtobuf`. In the end they end up in `HandleHistoryArchiveMagnetlinkMessage` and `HandleHistoryArchiveIndexCidMessage` respectively. At the end, they trigger async processing in go routines calling `downloadAndImportHistoryArchives` and `downloadAndImportCodexHistoryArchives`. Just after the respective go routines are created, the clock are updated with `m.communitiesManager.UpdateMagnetlinkMessageClock(id, clock)` and `m.communitiesManager.UpdateIndexCidMessageClock(id, clock)`. + +But before even starting go routine, we check the distribution preference with `GetArchiveDistributionPreference` and the last seen index Cid `m.communitiesManager.GetLastSeenIndexCid(id)` (it will be updated after downloading the archives but before processing them in `downloadAndImportCodexHistoryArchives`) and the corresponding clock `GetIndexCidMessageClock`, to make sure we are not processing some outdated archives. + +We can see that the above "integration test", in case of Codex, by calling `RetrieveAll` it effectively triggers archive download from Codex, yet it does not cover the dissemination of the indexCid - the test basically assumes that the index file has been stored, thus, if we want to cover more, we need to go beyond that test. + +Perhaps, to cover the whole flow, it is best to build status-desktop with our status-go library and test it from there. From 4589fe23f7f11ec2906bf9392d4c8f776a408387 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Fri, 31 Oct 2025 04:29:34 +0100 Subject: [PATCH 19/25] adds note about env vars required for libcodex --- 10 Notes/testing codex-status-go integration.md | 10 ++++++++++ 1 file changed, 10 insertions(+) diff --git a/10 Notes/testing codex-status-go integration.md b/10 Notes/testing codex-status-go integration.md index 2dd0c9c..09dcf9c 100644 --- a/10 Notes/testing codex-status-go integration.md +++ b/10 Notes/testing codex-status-go integration.md @@ -161,6 +161,16 @@ go generate ./protobuf > If you run `make`, e.g. `make statusgo-library`, the correct `generate` commands for the protobuf will be run for you. So in practice, you may not need to run `go generate ./protobuf` manually yourself - but for reference, why not... let's break something ;). +### Environment variables to run unit tests + +After Codex library (`libcodex`) has been added to the project the build system depends on it. Thus, to run the tests directly using `go test` or `gotestsum` command you need to make sure that the following environment variables are set: + +```bash +export LIBS_DIR="$(realpath ./libs)" +export CGO_CFLAGS=-I$LIBS_DIR +export CGO_LDFLAGS="-L$LIBS_DIR -lcodex -Wl,-rpath,$LIBS_DIR" +``` + ### Running unit tests for Codex abstractions We have some unit tests and a couple of integration tests. From 7cea5652bf665838dc7ac402ff85906aa58a1e9f Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Tue, 4 Nov 2025 10:50:27 +0100 Subject: [PATCH 20/25] adds instructions on how to work with status-backend --- .../Running functional tests in status-go.md | 2 +- ...ng status-backend to test status-go API.md | 120 ++++++++++++++++++ 2 files changed, 121 insertions(+), 1 deletion(-) create mode 100644 10 Notes/Using status-backend to test status-go API.md diff --git a/10 Notes/Running functional tests in status-go.md b/10 Notes/Running functional tests in status-go.md index cd5d7b5..805601a 100644 --- a/10 Notes/Running functional tests in status-go.md +++ b/10 Notes/Running functional tests in status-go.md @@ -197,7 +197,7 @@ run_functional_tests.sh "test_accept_request_address_for_transaction and wakuV2L run_functional_tests.sh "test_accept_request_address_for_transaction and wakuV2LightClient_True" ``` -When the argument is provided you the `run_functional_tests.sh` will first tell you which tests will be run and let you decide to continue or not: +When the argument is provided the `run_functional_tests.sh` will first tell you which tests will be run and let you decide to continue or not: ```bash Discovering tests to be run... diff --git a/10 Notes/Using status-backend to test status-go API.md b/10 Notes/Using status-backend to test status-go API.md new file mode 100644 index 0000000..ca953ae --- /dev/null +++ b/10 Notes/Using status-backend to test status-go API.md @@ -0,0 +1,120 @@ +Here are some basic steps to follow: + +### Step 1: Initialize the application + +```bash +curl -sS http://127.0.0.1:45453/statusgo/InitializeApplication \ + -H 'Content-Type: application/json' \ + -d '{"dataDir":"/tmp/status-go-test"}' +``` + +### Step 2: Create an account (if you don't have one) OR login + +```bash +curl -sS http://127.0.0.1:45453/statusgo/CreateAccountAndLogin \ + -H 'Content-Type: application/json' \ + -d '{ + "rootDataDir": "/tmp/status-go-test", + "displayName": "TestUser", + "password": "test123456", + "customizationColor": "blue" + }' +``` + +or if you already have account: + +```bash +curl -sS http://127.0.0.1:45453/statusgo/LoginAccount -X POST -H 'Content-Type: application/json' -d '{ + "rootDataDir": "/tmp/status-go-test", + "keyUid": "0x9b755874a92bcc2d20c730fc76d451f44b39868cc8fbd31f2ff74907e299e7fd", + "password": "test123456" +}' +``` + +If you see `{"error":""}` as the output it means the command was successful and there is no error. + +If you try to call the API before login, you will get the following error (example): + +```bash +❯ curl -sS http://127.0.0.1:45453/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_getArchiveDistributionPreference","params":[]}' +{"jsonrpc":"2.0","id":1,"error":{"code":-32601,"message":"the method wakuext_getArchiveDistributionPreference does not exist/is not available"}} +``` + + +I did not record the output of the `CreateAccountAndLogin` but in the returned response object you should be able to find the `keyUid` mentioned above. It is also included in the response from `InitializeApplication` for each existing account: + +```bash +curl -sS http://127.0.0.1:45453/statusgo/InitializeApplication \ + -H 'Content-Type: application/json' \ + -d '{"dataDir":"/tmp/status-go-test"}' +{"accounts":[{"name":"TestUser","timestamp":1762236462,"identicon":"","colorHash":[[3,9],[5,18],[3,24],[5,22],[4,6],[5,23],[2,3],[4,24],[1,27],[5,21],[3,11]],"colorId":3,"customizationColor":"blue","keycard-pairing":"","key-uid":"0x9b755874a92bcc2d20c730fc76d451f44b39868cc8fbd31f2ff74907e299e7fd","images":null,"kdfIterations":3200,"hasAcceptedTerms":true}],"centralizedMetricsInfo":{"enabled":false,"userConfirmed":false,"userID":""}} +``` + +The `keyUid` is a unique identifier for each account in status-go. You can also find it by looking at the database filenames in the data directory. + +When you create an account, status-go creates database files with a specific naming pattern: + +``` +

    -v4.db +
    -wallet.db +``` + +In my case: +```bash +ls -la /tmp/status-go-test/ +``` + +Showed files like: +``` +0x9b755874a92bcc2d20c730fc76d451f44b39868cc8fbd31f2ff74907e299e7fd-v4.db +0x9b755874a92bcc2d20c730fc76d451f44b39868cc8fbd31f2ff74907e299e7fd-wallet.db +``` + +The filename pattern is: `-.db` + +Breaking it down: +- **Address**: `0x9b755874a92bcc2d20c730fc76d451f44b39868c` (42 characters - standard Ethereum address) +- **KeyUID**: `c8fbd31f2ff74907e299e7fd` (the remaining characters before the dash) + +So the full keyUid is actually: `0x9b755874a92bcc2d20c730fc76d451f44b39868cc8fbd31f2ff74907e299e7fd` (combining both parts). + +You can also query the accounts database: +```bash +❯ sqlite3 /tmp/status-go-test/accounts.sql "SELECT keyUid, name FROM accounts;" +0x9b755874a92bcc2d20c730fc76d451f44b39868cc8fbd31f2ff74907e299e7fd|TestUser +``` + +The keyUid is essentially derived from the account's key material and is used to uniquely identify the account across the system. + +### Step 3: Start the messenger (optional) + +I initially thought this is necessary - but it turns out that logging in is sufficient. But for reference: + +```bash +curl -sS http://127.0.0.1:45453/statusgo/CallRPC \ + -H 'Content-Type: application/json' \ + -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_startMessenger","params":[]}' +``` +### Step 4: Now you can call your method! + +Some examples: + +```bash +❯ curl -sS http://127.0.0.1:45453/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_getArchiveDistributionPreference","params":[]}' +{"jsonrpc":"2.0","id":1,"result":"codex"} +``` + +```bash +❯ curl -sS http://127.0.0.1:45453/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_setArchiveDistributionPreference","params":[{"preference":"codex"}]}' +{"jsonrpc":"2.0","id":1,"result":"codex"} +``` + +```bash +❯ curl -sS http://127.0.0.1:45453/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_getMessageArchiveInterval","params":[]}' +{"jsonrpc":"2.0","id":1,"result":604800000000000} +``` + +```bash +curl -sS http://127.0.0.1:12345/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":2,"method":"wakuext_updateMessageArchiveInterval","params":[10000]}' +{"jsonrpc":"2.0","id":1,"result":10000} +``` From 6669828c263798b942150711d044304bc7d1d067 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 10 Nov 2025 08:05:25 +0100 Subject: [PATCH 21/25] adds some more info about how topics and filters work in status-go and waku --- ...els, and Chat IDs in status-go and waku.md | 144 ++++++++++++++++++ ...Unclarity about Waku filters and topics.md | 3 + ...iversal Topic Optimization in Waku (AI).md | 2 + ...ng status-backend to test status-go API.md | 5 +- .../testing codex-status-go integration.md | 2 + 5 files changed, 154 insertions(+), 2 deletions(-) create mode 100644 10 Notes/Filters, Topics, Channels, and Chat IDs in status-go and waku.md diff --git a/10 Notes/Filters, Topics, Channels, and Chat IDs in status-go and waku.md b/10 Notes/Filters, Topics, Channels, and Chat IDs in status-go and waku.md new file mode 100644 index 0000000..74434bf --- /dev/null +++ b/10 Notes/Filters, Topics, Channels, and Chat IDs in status-go and waku.md @@ -0,0 +1,144 @@ +_Last updated: 2025-11-10_ + +Status-Go juggles several identifiers while shuttling messages between the protocol layer and Waku. This note ties the names together so future readers can reason about filters, channels, and archives without spelunking through `messenger.go`. + +## Quick Glossary + +| Term | Defined in | Purpose | +| --- | --- | --- | +| `ChatID` | `messaging/types/filters.go:23-48` | Status-level label for a logical chat/channel (e.g., `communityID-memberUpdate`, `communityID-general`, `0x…` contact IDs). | +| `LocalChatID` | `messagingtypes.RawMessage` (various call sites) | Field embedded in outgoing raw messages so higher layers know which chat to update; does **not** change network routing. | +| Content Topic | `messaging/layers/transport/topic.go:18-21` | Waku topic (4 bytes) derived from `ChatID` via `Keccak256(chatID)[:4]`. Real network “channel.” | +| Pubsub Topic | `messaging/types/pubsub_topics.go` (see helpers in `messagingtypes`) | Waku v2 gossipsub domain (e.g., `/waku/2/rs/16/32`, `/waku/2/default-waku/proto`). Same content topic on different pubsub topics → distinct subscriptions. | +| `transport.Filter` | `messaging/layers/transport/filter.go` | Stores `ChatID`, `FilterID`, content topic, pubsub topic, symmetric key, and flags. Returned by transport code to upper layers. | +| `messagingtypes.ChatFilter` | `messaging/types/filters.go` | Thin wrapper exposed to the protocol (`messenger.go`); created from `transport.Filter`. | + +> **Rule of thumb:** The `chatID` that created a filter is the only input to `ToTopic`, so _picking a chatID_ at send time uniquely determines the Waku content topic. + +## Where Chat IDs Come From + +Community helpers mint deterministic chat IDs (`protocol/communities/community.go:1544-1590`): + +- `Community.ChatIDs()` returns legacy per-channel identifiers (one per Status channel). +- `Community.MemberUpdateChannelID()` produces `communityID-memberUpdate`. +- `Community.UniversalChatID()` aliases the member-update channel so one topic can carry **all** community messages during the universal-channel rollout. +- Contact/discovery/chat code helpers live in `messaging/layers/transport/topic.go:27-45`. + +When a community loads, `Messenger.DefaultFilters` asks to subscribe to: + +1. `communityID` on the community shard’s pubsub topic. +2. `communityID-memberUpdate` (universal channel) on the same pubsub topic. +3. The hex-encoded community pubkey on both the global content topic and the default non-protected topic. +4. Optional fallbacks when the community does not publish a shard (`protocol/messenger_communities.go:2463-2480`). + +These `ChatID` + pubsub pairs become actual Waku subscriptions via the FiltersManager. + +## From Chat ID to Transport Filter + +`FiltersManager.LoadPublic` is the main entry point (`messaging/layers/transport/filters_manager.go:540-591`): + +1. Derive a map key (`chatID` or `chatID||pubsub` when `distinctByPubsub` is true). +2. If no filter exists yet, call `addSymmetric(chatID, pubsubTopic)` which: + - Computes `ToTopic(chatID)` → content topic. + - Calls into the Waku service (`filters_service.Subscribe`) to register the subscription. + - Returns Waku’s `FilterID`, symmetric key id, and topic bytes. +3. Store and return the populated `transport.Filter`. + +`InitCommunities` / `InitPublicChats` simply loop over `ChatsToInitialize` and call `LoadPublic` for each entry, so a single community normally yields several transport filters (legacy per-channel, universal, control/pubkey, etc.). + +### Diagram: Subscription Lifecycle + +```mermaid +flowchart TD + A[Messenger.DefaultFilters
    community.go helpers] --> B[ChatsToInitialize] + B --> C[Transport.InitPublicChats] + C --> D["FiltersManager.LoadPublic(chatID, pubsub)"] + D -->|compute Keccak| E["ToTopic(chatID)"] + E --> F["filters_service.Subscribe
    (content topic, pubsub)"] + F --> G["transport.Filter stored
    filters → chatID key"] + G --> H["messagingtypes.NewChatFilter
    exposed to messenger"] +``` + +## Sending Flow + +All public/community traffic eventually funnels through `MessageSender.SendPublic` (`messaging/common/message_sender.go:565-681`). Important details: + +1. The caller supplies `chatName` (usually `community.UniversalChatID()`). +2. After wrapping/encrypting, SendPublic calls `transport.SendPublic(ctx, newMessage, chatName)` (`messaging/layers/transport/transport.go:263-280`). +3. `transport.SendPublic` loads the filter keyed by `chatName`, then copies its symmetric key, content topic, and pubsub topic into the Waku message before posting. + +Therefore **every** universal-channel message (chat, pin, magnetlink, indexCID, etc.) shares a content topic derived from `communityID-memberUpdate`. Legacy per-channel messages keep using their old chat IDs until migration completes. + +### Diagram: Send Path + +```mermaid +sequenceDiagram + participant Proto as protocol/messenger_communities.go + participant Msg as messaging/common/message_sender.go + participant Trans as messaging/layers/transport/transport.go + participant FM as FiltersManager + participant W as Waku + + Proto->>Msg: SendPublic(chatID = communityID-memberUpdate, rawMessage) + Msg->>Trans: SendPublic(ctx, newMessage, chatID) + Trans->>FM: LoadPublic(chatID, pubsub, distinct=false) + FM-->>Trans: transport.Filter{ContentTopic, SymKeyID, PubsubTopic} + Trans->>W: Post(message with ContentTopic=ToTopic(chatID)) + W-->>Trans: Hash + Trans-->>Msg: Hash + Msg-->>Proto: MessageID/Hash +``` + +## Receiving Flow + +Incoming envelopes land inside Waku filter queues. Retrieval proceeds as follows: + +1. `transport.RetrieveRawAll` iterates over **every** registered filter, calls `api.GetFilterMessages(filter.FilterID)`, drops cached duplicates, and groups results by filter (`messaging/layers/transport/transport.go:213-258`). +2. `messenger.RetrieveAll` converts transport filters into `messagingtypes.ChatFilter` objects and feeds the map into `handleRetrievedMessages` (`protocol/messenger.go:2610`, `3042-3230`). +3. For each `(filter, []*ReceivedMessage)` pair: + - If `filter.ChatID()` matches an owned community (legacy ID or universal ID) and `storeWakuMessages == true`, the raw Waku message is persisted for archive building (`protocol/messenger.go:3051-3082`, `protocol/communities/manager.go:4372-4405`). + - `messaging.HandleReceivedMessages` decodes the payload(s). + - Each decoded Status message is dispatched by type (`dispatchToHandler`), eventually ending up in chat history, member updates, archive downloads, etc. + +### Diagram: Receive Path + +```mermaid +flowchart LR + Waku["Waku subscription queues
    (per content topic & pubsub)"] -->|GetFilterMessages| Transport + Transport -->|"map[Filter][]Message"| Messenger.RetrieveAll + Messenger.RetrieveAll -->|handleRetrievedMessages| Loop["for each filter batch"] + Loop --> Decision{"owned chat & storeWakuMessages?"} + Decision -->|Yes| Store[StoreWakuMessage] + Decision -->|No| Skip["(skip storage)"] + Store --> Decode["messaging.HandleReceivedMessages"] + Skip --> Decode + Decode --> Dispatch["dispatchToHandler
    (type-specific logic)"] + Dispatch --> DB["User DB / UI updates / archive triggers"] +``` + +## Persistence & Archives + +- Community owners call `GetOwnedCommunitiesChatIDs()` to load every legacy per-channel ID and `GetOwnedCommunitiesUniversalChatIDs()` for the universal ID (`protocol/communities/manager.go:4372-4400`). The union is the allowlist. +- `handleRetrievedMessages` is invoked in two distinct contexts: + 1. **Live retrieval loop** (`RetrieveAll`): `storeWakuMessages = true`, `fromArchive = false`. Raw envelopes that match the allowlist are stored in `waku_messages`, and handlers run with `fromArchive=false`. + 2. **Archive replay** (`handleArchiveMessages`): `storeWakuMessages = false`, `fromArchive = true`. No new rows are written, but handlers see `fromArchive=true` to suppress live-only side effects. +- Therefore, the code only writes to `waku_messages` when both the allowlist check and the “live retrieval” flags match (case 1 above). +- Stored rows retain raw payloads, timestamps, hashes, and third-party IDs (`protocol/communities/persistence.go:889-934`). Later, archive import/export code queries by content topic and timestamp windows. + +Because magnetlink/indexCID/chat traffic now shares the universal channel, one subscription per community is enough to capture everything needed for archive creation; legacy filters stay in place until every client migrates. + +## Debugging Checklist + +1. **Which filter saw the message?** Log `filter.ChatID()` in `handleRetrievedMessages` to confirm whether it was the universal channel, a legacy chat, or the admin/pubkey topic. +2. **Did the message get stored?** Ensure the `ChatID` appears in either `GetOwnedCommunitiesChatIDs()` or `GetOwnedCommunitiesUniversalChatIDs()` and that `storeWakuMessages` was true for this pass. +3. **Unexpected content topic?** Remember that changing the `chatID` you pass into `SendPublic` changes the `ToTopic` hash. Verify the string passed to `SendPublic` (search `LocalChatID:` in the caller). +4. **Multiple filters per community?** Enumerate `t.filters.Filters()` at runtime; it’s normal to see several entries per community because the migration keeps both universal and legacy subscriptions alive. + +## appendix: Useful References + +- `messaging/layers/transport/topic.go` – helpers that convert strings/public keys into Waku topics. +- `messaging/layers/transport/filters_manager.go` – how filters are registered, keyed, and updated. +- `messaging/common/message_sender.go` – wrapping, encrypting, and handing messages to the transport. +- `messaging/layers/transport/transport.go` – message retrieval, cache checks, and calls into messenger. +- `protocol/messenger_communities.go` – default chat IDs per community and subscription bootstrap. +- `protocol/messenger.go` – storage/dispatch logic (`handleRetrievedMessages`). diff --git a/10 Notes/Unclarity about Waku filters and topics.md b/10 Notes/Unclarity about Waku filters and topics.md index 5d3e1e2..d558893 100644 --- a/10 Notes/Unclarity about Waku filters and topics.md +++ b/10 Notes/Unclarity about Waku filters and topics.md @@ -1,3 +1,6 @@ +> Since we created this document we gained a bit more understanding of how topics and filters work in status-go and waku: please check [[Filters, Topics, Channels, and Chat IDs in status-go and waku]]. + + This is the definition of the `ChatFilter` type: ```go diff --git a/10 Notes/Universal Topic Optimization in Waku (AI).md b/10 Notes/Universal Topic Optimization in Waku (AI).md index 2836924..c11bb54 100644 --- a/10 Notes/Universal Topic Optimization in Waku (AI).md +++ b/10 Notes/Universal Topic Optimization in Waku (AI).md @@ -1,3 +1,5 @@ +> Since we created this document we gained a bit more understanding of how topics and filters work in status-go and waku: please check [[Filters, Topics, Channels, and Chat IDs in status-go and waku]]. + There is [a comment in the code base](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/communities/community.go#L1584-L1589): ```go diff --git a/10 Notes/Using status-backend to test status-go API.md b/10 Notes/Using status-backend to test status-go API.md index ca953ae..b9582d0 100644 --- a/10 Notes/Using status-backend to test status-go API.md +++ b/10 Notes/Using status-backend to test status-go API.md @@ -115,6 +115,7 @@ Some examples: ``` ```bash -curl -sS http://127.0.0.1:12345/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":2,"method":"wakuext_updateMessageArchiveInterval","params":[10000]}' -{"jsonrpc":"2.0","id":1,"result":10000} +curl -sS http://127.0.0.1:12345/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":2,"method":"wakuext_updateMessageArchiveInterval","params":[60480]}' +{"jsonrpc":"2.0","id":1,"result":604800000000000} ``` +Notice that value to be set is provided in seconds but the value returned in the result is in nanoseconds (to avoid potential problems with division). \ No newline at end of file diff --git a/10 Notes/testing codex-status-go integration.md b/10 Notes/testing codex-status-go integration.md index 09dcf9c..83530dd 100644 --- a/10 Notes/testing codex-status-go integration.md +++ b/10 Notes/testing codex-status-go integration.md @@ -9,6 +9,8 @@ Also, to learn the history archive creation/upload and download/processing flows - archive creation/upload: [[When are magnetlink messages sent]] - archive download/processing: [[status-go processing magnet links]] +To grasp the concept of topics and filters - check [[Filters, Topics, Channels, and Chat IDs in status-go and waku]]. + In that last document I am including a link to an excalidraw diagram that can be helpful - for convenience: [https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi](https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi) In this document, we focus on our Codex extension to status-go and here we focus on the related unit and integration tests. From d37d0b9d586f4f54ebad68321052470730be22c0 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 10 Nov 2025 08:54:09 +0100 Subject: [PATCH 22/25] documents linting commands used in status-go --- 10 Notes/linting commands for status-go.md | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 10 Notes/linting commands for status-go.md diff --git a/10 Notes/linting commands for status-go.md b/10 Notes/linting commands for status-go.md new file mode 100644 index 0000000..e41b988 --- /dev/null +++ b/10 Notes/linting commands for status-go.md @@ -0,0 +1,17 @@ +--- +related-to: + - "[[testing codex-status-go integration]]" + - "[[Running Unit Tests for status-go]]" + - "[[Running functional tests in status-go]]" +--- +Here are two commands you should use before pushing: + +```bash +golangci-lint run --build-tags=gowaku_no_rln +``` + +and: + +```bash +make lint-panics +``` From 3b953ed22a8d1ffdb77d7ef3b10b373bea7c2a6f Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Sat, 15 Nov 2025 13:27:28 +0100 Subject: [PATCH 23/25] plugins updates --- .obsidian/plugins/query-control/main.js | 14 ++++---- .obsidian/plugins/query-control/manifest.json | 2 +- .obsidian/plugins/query-control/styles.css | 34 +++++++++++++++++++ 3 files changed, 42 insertions(+), 8 deletions(-) diff --git a/.obsidian/plugins/query-control/main.js b/.obsidian/plugins/query-control/main.js index 55e54ad..b8e3cd5 100644 --- a/.obsidian/plugins/query-control/main.js +++ b/.obsidian/plugins/query-control/main.js @@ -3,10 +3,10 @@ THIS IS A GENERATED/BUNDLED FILE BY ESBUILD if you want to view the source, please visit the github repository of this plugin */ -var q=Object.defineProperty;var G=Object.getOwnPropertyDescriptor;var U=Object.getOwnPropertyNames;var X=Object.prototype.hasOwnProperty;var Y=(l,h)=>{for(var e in h)q(l,e,{get:h[e],enumerable:!0})},J=(l,h,e,t)=>{if(h&&typeof h=="object"||typeof h=="function")for(let s of U(h))!X.call(l,s)&&s!==e&&q(l,s,{get:()=>h[s],enumerable:!(t=G(h,s))||t.enumerable});return l};var Z=l=>J(q({},"__esModule",{value:!0}),l);var b=(l,h,e)=>new Promise((t,s)=>{var n=i=>{try{a(e.next(i))}catch(o){s(o)}},r=i=>{try{a(e.throw(i))}catch(o){s(o)}},a=i=>i.done?t(i.value):Promise.resolve(i.value).then(n,r);a((e=e.apply(l,h)).next())});var se={};Y(se,{default:()=>A});module.exports=Z(se);function S(l,h){let e=Object.keys(h).map(t=>K(l,t,h[t]));return e.length===1?e[0]:function(){e.forEach(t=>t())}}function K(l,h,e){let t=l[h],s=l.hasOwnProperty(h),n=s?t:function(){return Object.getPrototypeOf(l)[h].apply(this,arguments)},r=e(n);return t&&Object.setPrototypeOf(r,t),Object.setPrototypeOf(a,r),l[h]=a,i;function a(...o){return r===n&&l[h]===a&&i(),r.apply(this,o)}function i(){l[h]===a&&(s?l[h]=n:delete l[h]),r!==n&&(r=n,Object.setPrototypeOf(a,t||Function))}}var g=require("obsidian");var I=require("obsidian");var H=class extends I.MarkdownRenderer{constructor(e,t,s){super(e,t);this.app=e,this.match=s,this.subpath="",this.indent="",this.filePath=this.match.parentDom.path,this.file=this.match.parentDom.file,this.renderer.previewEl.onNodeInserted(()=>(this.updateOptions(),this.renderer.onResize()))}updateOptions(){let e=this.app.vault.getConfig("readableLineLength");this.renderer.previewEl.toggleClass("is-readable-line-width",e);let t=this.app.vault.getConfig("foldHeading");this.renderer.previewEl.toggleClass("allow-fold-headings",t);let s=this.app.vault.getConfig("foldIndent");this.renderer.previewEl.toggleClass("allow-fold-lists",s),this.renderer.previewEl.toggleClass("rtl",this.app.vault.getConfig("rightToLeft")),t||this.renderer.unfoldAllHeadings(),s||this.renderer.unfoldAllLists(),this.renderer.previewEl.toggleClass("show-frontmatter",this.app.vault.getConfig("showFrontmatter"));let n=this.app.vault.getConfig("tabSize");this.renderer.previewEl.style.setProperty("--tab-size",`${n}px`),this.renderer.rerender()}onRenderComplete(){}getFile(){return this.match.parent.file}edit(e){return b(this,null,function*(){var o;this.renderer.set(e);let t=yield this.app.vault.cachedRead(this.file),n=(o=t.slice(this.match.start,this.match.end).match(/^\s+/g))==null?void 0:o.first();n&&(e=e.replace(/^/gm,n));let r=t.slice(0,this.match.start),a=t.slice(this.match.end,this.match.parent.content.length),i=r+e+a;yield this.app.vault.modify(this.file,i)})}};var R=require("obsidian");var M=i18next.t.bind(i18next);var $={defaultCollapse:!1,defaultShowContext:!1,defaultHideTitle:!1,defaultHideResults:!1,defaultRenderMarkdown:!1,defaultSortOrder:"alphabetical"},O=[{key:"alphabetical",label:M("plugins.file-explorer.label-sort-a-to-z")},{key:"alphabeticalReverse",label:M("plugins.file-explorer.label-sort-z-to-a")},{key:"byModifiedTime",label:M("plugins.file-explorer.label-sort-new-to-old")},{key:"byModifiedTimeReverse",label:M("plugins.file-explorer.label-sort-old-to-new")},{key:"byCreatedTime",label:M("plugins.file-explorer.label-sort-created-new-to-old")},{key:"byCreatedTimeReverse",label:M("plugins.file-explorer.label-sort-created-old-to-new")}],ee=l=>l.reduce((h,e)=>(h[e.key]=e.label,h),{}),L=class extends R.PluginSettingTab{constructor(e,t){super(e,t);this.plugin=t}hide(){}display(){let{containerEl:e}=this;e.empty(),new R.Setting(e).setName("Collapse query results by default").addToggle(t=>t.setValue(this.plugin.settings.defaultCollapse).onChange(s=>{this.plugin.settings.defaultCollapse=s,this.plugin.saveSettings()})),new R.Setting(e).setName("Show additional query result context by default").addToggle(t=>t.setValue(this.plugin.settings.defaultShowContext).onChange(s=>{this.plugin.settings.defaultShowContext=s,this.plugin.saveSettings()})),new R.Setting(e).setName("Hide query title by default").addToggle(t=>t.setValue(this.plugin.settings.defaultHideTitle).onChange(s=>{this.plugin.settings.defaultHideTitle=s,this.plugin.saveSettings()})),new R.Setting(e).setName("Hide query results by default").addToggle(t=>t.setValue(this.plugin.settings.defaultHideResults).onChange(s=>{this.plugin.settings.defaultHideResults=s,this.plugin.saveSettings()})),new R.Setting(e).setName("Render results as Markdown by default").addToggle(t=>t.setValue(this.plugin.settings.defaultRenderMarkdown).onChange(s=>{this.plugin.settings.defaultRenderMarkdown=s,this.plugin.saveSettings()})),new R.Setting(e).setName("Default query result sort order").addDropdown(t=>{t.addOptions(ee(O)),t.setValue(this.plugin.settings.defaultSortOrder),t.onChange(s=>b(this,null,function*(){this.plugin.settings.defaultSortOrder=s,yield this.plugin.saveSettings()}))})}};var m,T;function F(l,h,e,t,s){if(m){T();return}m=document.createElement("div"),m.classList.add("query-control-sort-tooltip");let n=h.getBoundingClientRect(),r=n.bottom+window.scrollY+5,a=n.left+window.scrollX;m.style.setProperty("--tooltip-top",`${r}px`),m.style.setProperty("--tooltip-left",`${a}px`),l.forEach(p=>{let u=document.createElement("div");if(u.classList.add("query-control-sort-option"),u.textContent=p.label,p.key===t){u.setAttribute("aria-current","true");let y=document.createElement("span");y.textContent="\u2713",y.classList.add("query-control-sort-option-checkmark"),u.appendChild(y)}u.addEventListener("click",()=>{e(p.key),T()}),m.appendChild(u)}),document.body.appendChild(m),T=()=>{document.removeEventListener("mousedown",o,!0),document.removeEventListener("touchstart",o,!0),document.removeEventListener("click",o),document.removeEventListener("keydown",c,!0),s.workspace.off("active-leaf-change",i),m.remove(),m=void 0};let i=()=>{m.parentElement&&(m.remove(),T())},o=p=>{!m.contains(p.target)&&!h.contains(p.target)&&(m.remove(),T())},c=p=>{m.remove(),T()};document.addEventListener("mousedown",o,!0),document.addEventListener("touchstart",o,!0),document.addEventListener("click",o),document.addEventListener("keydown",c,!0),s.workspace.on("active-leaf-change",i)}var z=new WeakMap,A=class extends g.Plugin{onload(){return b(this,null,function*(){yield this.loadSettings();let e=this;this.registerSettingsTab(),this.register(S(this.app.viewRegistry.constructor.prototype,{registerView(s){return function(n,r,...a){return e.app.workspace.trigger("view-registered",n,r),s.call(this,n,r,...a)}}}));let t;if(!this.app.workspace.layoutReady){let s=this.app.workspace.on("view-registered",(r,a)=>{if(r!=="search")return;this.app.workspace.offref(s);let i=new g.WorkspaceLeaf(e.app),o=a(i);e.patchNativeSearch(o);let c=S(g.Modal.prototype,{open(p){return function(...u){e.SearchResultsExport=this.constructor}}});o.onCopyResultsClick(new MouseEvent(null)),c()}),n=this.app.workspace.on("view-registered",(r,a)=>{if(r!=="backlink")return;this.app.workspace.offref(n);let i=new g.WorkspaceLeaf(e.app),o=a(i);e.SearchHeaderDOM=o.backlink.headerDom.constructor})}this.register(t=S(g.Component.prototype,{addChild(s){return function(n,...r){try{if(!e.isSearchPatched&&n instanceof g.Component&&n.hasOwnProperty("searchQuery")&&n.hasOwnProperty("sourcePath")&&n.hasOwnProperty("dom")){let i=n;e.patchSearchView(i),e.isSearchPatched=!0}if(n instanceof g.Component&&n.hasOwnProperty("backlinkDom")){let i=n;z.set(i.backlinkDom.el.closest(".backlink-pane"),n),e.isBacklinksPatched||(e.patchBacklinksView(i),e.isBacklinksPatched=!0)}}catch(i){console.error("Error in Component.addChild around patch:",i)}return s.call(this,n,...r)}}}))})}loadSettings(){return b(this,null,function*(){this.settings=Object.assign({},$,yield this.loadData())})}saveSettings(){return b(this,null,function*(){yield this.saveData(this.settings)})}registerSettingsTab(){this.settingsTab=new L(this.app,this),this.addSettingTab(this.settingsTab)}getSearchHeader(){var s,n,r;let e=(s=this.app.workspace.getLeavesOfType("backlink"))==null?void 0:s.first();e==null||e.loadIfDeferred();let t=(r=(n=e==null?void 0:e.view)==null?void 0:n.backlink)==null?void 0:r.headerDom;return t==null?void 0:t.constructor}onunload(){let e="Query Control: Please restart Obsidian to complete plugin unload.";console.log(e),new g.Notice(e)}patchNativeSearch(e){let t=this;this.register(S(e.constructor.prototype,{onResize(s){return function(...n){var a;let r=(a=this.dom.vChildren)==null?void 0:a._children;return this.dom.el.clientWidth===0?(r.forEach(i=>{i.setCollapse(!0,!1)}),this.dom.hidden=!0):this.dom.hidden&&(this.dom.hidden=!1,setTimeout(()=>{r.forEach(i=>{i.setCollapse(this.dom.collapseAll,!1)})},100)),s.call(this,...n)}},stopSearch(s){return function(...n){let r=s.call(this,...n);return this.renderComponent&&(this.renderComponent.unload(),this.renderComponent=new g.Component),r}},addChild(s){return function(...n){var a;try{if(!this.patched){this.renderComponent||(this.renderComponent=new g.Component,this.renderComponent.load()),this.patched=!0,this.dom.parent=this,t.patchSearchResultDOM(this.dom.constructor),this.setRenderMarkdown=function(o){var p,u;let c=(p=this.dom.vChildren)==null?void 0:p._children;this.dom.renderMarkdown=o,c.forEach(y=>{y.renderContentMatches()}),this.dom.infinityScroll.invalidateAll(),this.dom.childrenEl.toggleClass("cm-preview-code-block",o),this.dom.childrenEl.toggleClass("is-rendered",o),(u=this.renderMarkdownButtonEl)==null||u.toggleClass("is-active",o)},this.renderMarkdownButtonEl=(a=this.headerDom)==null?void 0:a.addNavButton("reading-glasses","Render Markdown",()=>this.setRenderMarkdown(!this.dom.renderMarkdown));let i={renderMarkdown:t.settings.defaultRenderMarkdown};this.settings||(this.settings={}),Object.entries(i).forEach(([o,c])=>{this.settings.hasOwnProperty(o)?o==="sort"&&!O.hasOwnProperty(this.settings.sort)&&(this.settings[o]=c):this.settings[o]=c}),this.setRenderMarkdown(this.settings.renderMarkdown)}}catch(i){console.error("Error in searchView.addChild around patch:",i)}return s.call(this,...n)}}}))}patchSearchResultDOM(e){let t=this,s=S(e.prototype,{addResult(n){return function(...r){s();let a=n.call(this,...r),i=a.constructor;return t.isSearchResultItemPatched||t.patchSearchResultItem(i),a}}});this.register(s),this.register(S(e.prototype,{startLoader(n){return function(...r){var i,o,c,p,u,y;try{let x=this.el.closest(".backlink-pane");if(x){let k=z.get(x);k&&(k.patched||te(this,t,k))}if(!((o=(i=this.parent)==null?void 0:i.searchParamsContainerEl)!=null&&o.patched)&&((p=(c=this.el)==null?void 0:c.parentElement)==null?void 0:p.getAttribute("data-type"))==="search"){if(!this.parent)return;this.parent.searchParamsContainerEl.patched=!0,new g.Setting(this.parent.searchParamsContainerEl).setName("Render Markdown").setClass("mod-toggle").addToggle(k=>{k.setValue(t.settings.defaultRenderMarkdown),k.onChange(v=>{var P;this.renderMarkdown=v,((P=this.vChildren)==null?void 0:P._children).forEach(d=>{d.renderContentMatches()}),this.infinityScroll.invalidateAll(),this.childrenEl.toggleClass("cm-preview-code-block",v),this.childrenEl.toggleClass("is-rendered",v)})})}if(!this.patched&&((u=this.el.parentElement)==null?void 0:u.hasClass("internal-query"))){let k=t.SearchHeaderDOM?t.SearchHeaderDOM:t.getSearchHeader();if(!k){console.error("Error: _SearchHeaderDOM is undefined. Cannot create headerDom.");return}if((y=this.el)!=null&&y.closest(".internal-query")){this.patched=!0;let v=this.el.parentElement.querySelector(".internal-query-header");this.setExtraContext=function(d){var C;let w=(C=this.vChildren)==null?void 0:C._children;this.extraContext=d,this.extraContextButtonEl.toggleClass("is-active",d),w.forEach(f=>{f.setExtraContext(d)}),this.infinityScroll.invalidateAll()},this.setTitleDisplay=function(d){this.showTitle=d,this.showTitleButtonEl.toggleClass("is-active",d),v.toggleClass("is-hidden",d)},this.setResultsDisplay=function(d){this.showResults=d,this.showResultsButtonEl.toggleClass("is-active",d),this.el.toggleClass("is-hidden",d)},this.setRenderMarkdown=function(d){var C;this.renderMarkdown=d,((C=this.vChildren)==null?void 0:C._children).forEach(f=>{f.renderContentMatches()}),this.infinityScroll.invalidateAll(),this.childrenEl.toggleClass("cm-preview-code-block",d),this.childrenEl.toggleClass("is-rendered",d),this.renderMarkdownButtonEl.toggleClass("is-active",d)},this.setCollapseAll=function(d){var C;let w=(C=this.vChildren)==null?void 0:C._children;this.collapseAllButtonEl.toggleClass("is-active",d),this.collapseAll=d,w.forEach(f=>{f.setCollapse(d,!1)}),this.infinityScroll.invalidateAll()},this.setSortOrder=d=>{this.sortOrder=d,this.changed(),this.infinityScroll.invalidateAll()},this.onCopyResultsClick=d=>b(this,null,function*(){var _,B;d.preventDefault();let w=[],C=(_=this.vChildren)==null?void 0:_._children;for(let D of C){let Q=D.file.path,V="",j=(B=D.vChildren)==null?void 0:B._children;for(let N of j){let W=N.parent.content.substring(N.start,N.end);V+=W+` -`}w.push(`## ${Q} -${V}`)}let f=w.join(` -`);try{yield navigator.clipboard.writeText(f),new g.Notice("Search results copied to clipboard.")}catch(D){console.error("Failed to copy search results:",D),new g.Notice("Failed to copy search results.")}});let E=this.headerDom=new k(this.app,this.el.parentElement);v.insertAdjacentElement("afterend",E.navHeaderEl),this.collapseAllButtonEl=E.addNavButton("bullet-list",M("plugins.search.label-collapse-results"),d=>(d.stopPropagation(),this.setCollapseAll(!this.collapseAll))),this.extraContextButtonEl=E.addNavButton("expand-vertically",M("plugins.search.label-more-context"),d=>(d.stopPropagation(),this.setExtraContext(!this.extraContext))),this.showSortButtonEl=E.addNavButton("arrow-up-narrow-wide","Sort",d=>{d.stopPropagation();let w=O.map(f=>f.key),C=f=>{if(w.includes(f)){this.sortOrder=f;let B=`Sort (${O.find(D=>D.key===f).label})`;this.showSortButtonEl.setAttribute("aria-label",B),this.setSortOrder(f)}else console.error(`Invalid sort option: ${f}`)};F(O,this.showSortButtonEl,C,this.sortOrder,this.app)}),this.showTitleButtonEl=E.addNavButton("strikethrough-glyph","Hide title",d=>(d.stopPropagation(),this.setTitleDisplay(!this.showTitle))),this.showResultsButtonEl=E.addNavButton("minus-with-circle","Hide results",d=>(d.stopPropagation(),this.setResultsDisplay(!this.showResults))),this.renderMarkdownButtonEl=E.addNavButton("reading-glasses","Render Markdown",d=>(d.stopPropagation(),this.setRenderMarkdown(!this.renderMarkdown))),E.addNavButton("documents","Copy results",this.onCopyResultsClick.bind(this));let P={title:t.settings.defaultHideResults,collapsed:t.settings.defaultCollapse,context:t.settings.defaultShowContext,hideTitle:t.settings.defaultHideTitle,hideResults:t.settings.defaultHideResults,renderMarkdown:t.settings.defaultRenderMarkdown,sort:t.settings.defaultSortOrder};this.settings||(this.settings={}),Object.entries(P).forEach(([d,w])=>{this.settings.hasOwnProperty(d)?d==="sort"&&!O.hasOwnProperty(this.settings.sort)&&(this.settings[d]=w):this.settings[d]=w}),this.setExtraContext(this.settings.context),this.sortOrder=this.settings.sort,this.setCollapseAll(this.settings.collapsed),this.setTitleDisplay(this.settings.hideTitle),this.setRenderMarkdown(this.settings.renderMarkdown),this.setResultsDisplay(this.settings.hideResults)}}}catch(x){console.error("Error in SearchResultDOM.startLoader around patch:",x)}return n.call(this,...r)}}}))}patchSearchResultItem(e){this.isSearchResultItemPatched=!0;let t=this,s=S(e.prototype,{onResultClick(n){return function(r,a,...i){if(!(r.target instanceof HTMLElement&&(r.target.hasClass("internal-link")||r.target.hasClass("task-list-item-checkbox")||r.target.hasClass("admonition-title-content"))))return n.call(this,r,a,...i)}},renderContentMatches(n){return function(...r){var o;let a=n.call(this,...r),i=(o=this.vChildren)==null?void 0:o._children;if(!t.isSearchResultItemMatchPatched&&i.length){let c=i.first().constructor;t.patchSearchResultItemMatch(c)}return a}}});t.register(s)}patchSearchResultItemMatch(e){this.isSearchResultItemMatchPatched=!0;let t=this;t.register(S(e.prototype,{render(s){return function(...n){var c;let r=this.parentDom,a=r.content.substring(this.start,this.end).replace("```query","\\`\\`\\`query"),i=(c=a.match(/^\s+/g))==null?void 0:c.first();i&&(a=a.replace(new RegExp(`^${i}`,"gm"),""));let o=r.parent.parent;if(o&&r.parent.renderMarkdown){let p=o==null?void 0:o.renderComponent;this.el.empty();let u=new H(t.app,this.el,this);u.onRenderComplete=()=>{var y;(y=r==null?void 0:r.parent)==null||y.infinityScroll.measure(r,this)},p.addChild(u),u.renderer.set(a)}else return s.call(this,...n)}}}))}patchSearchView(e){let t=e.constructor,s=e.dom.constructor;this.register(S(t.prototype,{onunload(n){return function(...r){return this.renderComponent&&(this.renderComponent.unload(),this.dom=null,this.queue=null,this.renderComponent=null,this._children=null,this.containerEl=null),n.call(this,...r)}},onload(n){return function(...r){try{this.renderComponent||(this.renderComponent=new g.Component,this.renderComponent.load()),this.dom.parent=this;let i=this.containerEl.parentElement.querySelector(".internal-query-header"),o=this.query.matchAll(new RegExp("^(?collapsed|context|hideTitle|renderMarkdown|hideResults|sort|title):\\s*(?.+?)$","gm")),c={};for(let p of o){let u=p.groups.value.toLowerCase();(u==="true"||u==="false")&&(p.groups.value=u==="true"),c[p.groups.key]=p.groups.value}this.query=this.query.replace(/^((collapsed|context|hideTitle|renderMarkdown|hideResults|sort|title):.+?)$/gm,"").trim(),i.setText(c.title||this.query),this.dom.settings=c}catch(i){console.error("Error in EmbeddedSearch.onload:",i)}return n.call(this,...r)}}})),this.patchSearchResultDOM(s)}patchBacklinksView(e){let t=e.constructor,s=e.backlinkDom.constructor;this.register(S(t.prototype,{onunload(n){return function(...r){return this.renderComponent&&(this.renderComponent.unload(),this.dom=null,this.queue=null,this.renderComponent=null,this._children=null,this.containerEl=null),n.call(this,...r)}},onload(n){return function(...r){try{this.renderComponent||(this.renderComponent=new g.Component,this.renderComponent.load()),this.dom||(console.warn("Backlink `dom` is undefined. Initializing default properties."),this.dom={}),this.backlinkDom.parent=this,this.unlinkedDom.parent=this,this.dom.settings=this.dom.settings||{}}catch(a){console.error("Error in Backlink.onload:",a)}return n.call(this,...r)}}})),this.patchSearchResultDOM(s)}};function te(l,h,e){if(e){e.patched=!0,l.setRenderMarkdown=function(s){[e.backlinkDom,e.unlinkedDom].forEach(r=>{var i;r.renderMarkdown=s,((i=r.vChildren)==null?void 0:i._children).forEach(o=>{o.renderContentMatches()}),r.infinityScroll.invalidateAll(),r.childrenEl.toggleClass("cm-preview-code-block",s),r.childrenEl.toggleClass("is-rendered",s)}),this.renderMarkdownButtonEl.toggleClass("is-active",s)},l.onCopyResultsClick=s=>b(this,null,function*(){var i,o;s.stopPropagation(),s.preventDefault();let n=[],r=[e.backlinkDom,e.unlinkedDom];for(let c of r){let p=(i=c.vChildren)==null?void 0:i._children;for(let u of p){let y=u.file.path,x="",k=(o=u.vChildren)==null?void 0:o._children;for(let v of k){let E=v.parent.content.substring(v.start,v.end);x+=E+` -`}n.push(`## ${y} -${x}`)}}let a=n.join(` -`);try{yield navigator.clipboard.writeText(a)}catch(c){console.error("Failed to copy backlinks:",c),new g.Notice("Failed to copy backlinks.")}}),l.renderMarkdownButtonEl=e.headerDom.addNavButton("reading-glasses","Render Markdown",s=>(s.stopPropagation(),l.setRenderMarkdown(!l.renderMarkdown))),e.headerDom.addNavButton("documents","Copy results",l.onCopyResultsClick.bind(l));let t={title:h.settings.defaultHideResults,collapsed:h.settings.defaultCollapse,context:h.settings.defaultShowContext,hideTitle:h.settings.defaultHideTitle,hideResults:h.settings.defaultHideResults,renderMarkdown:h.settings.defaultRenderMarkdown,sort:h.settings.defaultSortOrder};l.settings||(l.settings={}),Object.entries(t).forEach(([s,n])=>{l.settings.hasOwnProperty(s)?s==="sort"&&!O.hasOwnProperty(l.settings.sort)&&(l.settings[s]=n):l.settings[s]=n}),e.setExtraContext(l.settings.context),e.sortOrder=l.settings.sort,e.setCollapseAll(l.settings.collapsed),l.setRenderMarkdown(l.settings.renderMarkdown)}} +var N=Object.defineProperty;var K=Object.getOwnPropertyDescriptor;var G=Object.getOwnPropertyNames;var U=Object.prototype.hasOwnProperty;var X=(u,a)=>{for(var s in a)N(u,s,{get:a[s],enumerable:!0})},J=(u,a,s,t)=>{if(a&&typeof a=="object"||typeof a=="function")for(let e of G(a))!U.call(u,e)&&e!==s&&N(u,e,{get:()=>a[e],enumerable:!(t=K(a,e))||t.enumerable});return u};var Z=u=>J(N({},"__esModule",{value:!0}),u);var R=(u,a,s)=>new Promise((t,e)=>{var n=o=>{try{r(s.next(o))}catch(l){e(l)}},i=o=>{try{r(s.throw(o))}catch(l){e(l)}},r=o=>o.done?t(o.value):Promise.resolve(o.value).then(n,i);r((s=s.apply(u,a)).next())});var rt={};X(rt,{default:()=>A});module.exports=Z(rt);function v(u,a){let s=Object.keys(a).map(t=>tt(u,t,a[t]));return s.length===1?s[0]:function(){s.forEach(t=>t())}}function tt(u,a,s){let t=u[a],e=u.hasOwnProperty(a),n=e?t:function(){return Object.getPrototypeOf(u)[a].apply(this,arguments)},i=s(n);return t&&Object.setPrototypeOf(i,t),Object.setPrototypeOf(r,i),u[a]=r,o;function r(...l){return i===n&&u[a]===r&&o(),i.apply(this,l)}function o(){u[a]===r&&(e?u[a]=n:delete u[a]),i!==n&&(i=n,Object.setPrototypeOf(r,t||Function))}}var f=require("obsidian");var $=require("obsidian");var P=class extends $.MarkdownRenderer{constructor(s,t,e){super(s,t);this.app=s,this.match=e,this.subpath="",this.indent="",this.filePath=this.match.parentDom.path,this.file=this.match.parentDom.file,this.renderer.previewEl.onNodeInserted(()=>(this.updateOptions(),this.renderer.onResize()))}updateOptions(){let s=this.app.vault.getConfig("readableLineLength");this.renderer.previewEl.toggleClass("is-readable-line-width",s);let t=this.app.vault.getConfig("foldHeading");this.renderer.previewEl.toggleClass("allow-fold-headings",t);let e=this.app.vault.getConfig("foldIndent");this.renderer.previewEl.toggleClass("allow-fold-lists",e),this.renderer.previewEl.toggleClass("rtl",this.app.vault.getConfig("rightToLeft")),t||this.renderer.unfoldAllHeadings(),e||this.renderer.unfoldAllLists(),this.renderer.previewEl.toggleClass("show-frontmatter",this.app.vault.getConfig("showFrontmatter"));let n=this.app.vault.getConfig("tabSize");this.renderer.previewEl.style.setProperty("--tab-size",`${n}px`),this.renderer.rerender()}onRenderComplete(){}getFile(){return this.match.parent.file}edit(s){return R(this,null,function*(){var l;this.renderer.set(s);let t=yield this.app.vault.cachedRead(this.file),n=(l=t.slice(this.match.start,this.match.end).match(/^\s+/g))==null?void 0:l.first();n&&(s=s.replace(/^/gm,n));let i=t.slice(0,this.match.start),r=t.slice(this.match.end,this.match.parent.content.length),o=i+s+r;yield this.app.vault.modify(this.file,o)})}};var V=require("obsidian");var x=i18next.t.bind(i18next);var H={defaultCollapse:!1,defaultShowContext:!1,defaultHideTitle:!1,defaultHideResults:!1,defaultRenderMarkdown:!1,defaultSortOrder:"alphabetical",controlVisibility:{collapseAll:"visible",extraContext:"visible",sort:"visible",hideTitle:"visible",hideResults:"visible",renderMarkdown:"visible",copyResults:"visible"}},D=[{key:"alphabetical",label:x("plugins.file-explorer.label-sort-a-to-z")},{key:"alphabeticalReverse",label:x("plugins.file-explorer.label-sort-z-to-a")},{key:"byModifiedTime",label:x("plugins.file-explorer.label-sort-new-to-old")},{key:"byModifiedTimeReverse",label:x("plugins.file-explorer.label-sort-old-to-new")},{key:"byCreatedTime",label:x("plugins.file-explorer.label-sort-created-new-to-old")},{key:"byCreatedTimeReverse",label:x("plugins.file-explorer.label-sort-created-old-to-new")}],et=u=>u.reduce((a,s)=>(a[s.key]=s.label,a),{}),st={visible:"Visible",hidden:"Hidden"},nt=["visible","hidden"],j={collapseAll:"Collapse results toggle",extraContext:"More context toggle",sort:"Sort menu",hideTitle:"Hide title toggle",hideResults:"Hide results toggle",renderMarkdown:"Render markdown toggle",copyResults:"Copy results button"},L=class extends V.PluginSettingTab{constructor(s,t){super(s,t);this.plugin=t}hide(){}display(){let{containerEl:s}=this;s.empty(),new V.Setting(s).setName("Collapse query results by default").addToggle(e=>e.setValue(this.plugin.settings.defaultCollapse).onChange(n=>{this.plugin.settings.defaultCollapse=n,this.plugin.saveSettings()})),new V.Setting(s).setName("Show additional query result context by default").addToggle(e=>e.setValue(this.plugin.settings.defaultShowContext).onChange(n=>{this.plugin.settings.defaultShowContext=n,this.plugin.saveSettings()})),new V.Setting(s).setName("Hide query title by default").addToggle(e=>e.setValue(this.plugin.settings.defaultHideTitle).onChange(n=>{this.plugin.settings.defaultHideTitle=n,this.plugin.saveSettings()})),new V.Setting(s).setName("Hide query results by default").addToggle(e=>e.setValue(this.plugin.settings.defaultHideResults).onChange(n=>{this.plugin.settings.defaultHideResults=n,this.plugin.saveSettings()})),new V.Setting(s).setName("Render results as Markdown by default").addToggle(e=>e.setValue(this.plugin.settings.defaultRenderMarkdown).onChange(n=>{this.plugin.settings.defaultRenderMarkdown=n,this.plugin.saveSettings()})),new V.Setting(s).setName("Default query result sort order").addDropdown(e=>{e.addOptions(et(D)),e.setValue(this.plugin.settings.defaultSortOrder),e.onChange(n=>R(this,null,function*(){this.plugin.settings.defaultSortOrder=n,yield this.plugin.saveSettings()}))}),s.createEl("h2",{text:"Control visibility"});let t={collapseAll:"Choose whether the Collapse Results toolbar control is shown.",extraContext:"Choose whether the More Context toolbar control is shown.",sort:"Choose whether the Sort toolbar control is shown.",hideTitle:"Choose whether the Hide Title toolbar control is shown.",hideResults:"Choose whether the Hide Results toolbar control is shown.",renderMarkdown:"Choose whether the Render Markdown toolbar control is shown.",copyResults:"Choose whether the Copy Results toolbar control is shown."};Object.keys(j).forEach(e=>{let n=nt.reduce((i,r)=>(i[r]=st[r],i),{});new V.Setting(s).setName(j[e]).setDesc(`${t[e]} Hidden keeps the control's current state but removes the toolbar button.`).addDropdown(i=>{i.addOptions(n),i.setValue(this.plugin.settings.controlVisibility[e]),i.onChange(r=>R(this,null,function*(){this.plugin.settings.controlVisibility[e]=r,this.plugin.refreshControlVisibility(),yield this.plugin.saveSettings()}))})})}};var k,T;function F(u,a,s,t,e){if(k){T();return}k=document.createElement("div"),k.classList.add("query-control-sort-tooltip");let n=a.getBoundingClientRect(),i=n.bottom+window.scrollY+5,r=n.left+window.scrollX;k.style.setProperty("--tooltip-top",`${i}px`),k.style.setProperty("--tooltip-left",`${r}px`),u.forEach(g=>{let p=document.createElement("div");if(p.classList.add("query-control-sort-option"),p.textContent=g.label,g.key===t){p.setAttribute("aria-current","true");let h=document.createElement("span");h.textContent="\u2713",h.classList.add("query-control-sort-option-checkmark"),p.appendChild(h)}p.addEventListener("click",()=>{s(g.key),T()}),k.appendChild(p)}),document.body.appendChild(k),T=()=>{document.removeEventListener("mousedown",l,!0),document.removeEventListener("touchstart",l,!0),document.removeEventListener("click",l),document.removeEventListener("keydown",c,!0),e.workspace.off("active-leaf-change",o),k.remove(),k=void 0};let o=()=>{k.parentElement&&(k.remove(),T())},l=g=>{!k.contains(g.target)&&!a.contains(g.target)&&(k.remove(),T())},c=g=>{k.remove(),T()};document.addEventListener("mousedown",l,!0),document.addEventListener("touchstart",l,!0),document.addEventListener("click",l),document.addEventListener("keydown",c,!0),e.workspace.on("active-leaf-change",o)}var z=new WeakMap,A=class extends f.Plugin{constructor(){super(...arguments);this.embeddedSearchResultDoms=new Set;this.backlinkControlContexts=new Map}getControlVisibility(s){var t,e,n;return(n=(e=(t=this.settings)==null?void 0:t.controlVisibility)==null?void 0:e[s])!=null?n:H.controlVisibility[s]}isControlVisible(s){return this.getControlVisibility(s)==="visible"}refreshControlVisibility(){var s,t,e,n;for(let i of Array.from(this.embeddedSearchResultDoms)){let r=i;if(!((s=r==null?void 0:r.el)!=null&&s.isConnected)){this.embeddedSearchResultDoms.delete(i);continue}this.applyEmbeddedSearchControlVisibility(r)}for(let[i,r]of Array.from(this.backlinkControlContexts.entries())){let o=i,l=r,c=(e=(t=l==null?void 0:l.headerDom)==null?void 0:t.navHeaderEl)==null?void 0:e.isConnected;if(!((n=o==null?void 0:o.el)!=null&&n.isConnected)||!c){this.backlinkControlContexts.delete(i);continue}this.applyBacklinkControlVisibility(i,r)}}toggleVisibility(s,t){if(!s)return;let e=s;typeof e.toggleClass=="function"?e.toggleClass("is-hidden",!t):s.classList.toggle("is-hidden",!t)}applyEmbeddedSearchControlVisibility(s){let t=s,e=t==null?void 0:t.headerDom;if(!(e!=null&&e.addNavButton))return;let n=(h,M)=>(t[h]||(t[h]=M()),t[h]),i=n("collapseAllButtonEl",()=>e.addNavButton("bullet-list",x("plugins.search.label-collapse-results"),h=>(h.stopPropagation(),t.setCollapseAll(!t.collapseAll))));this.toggleVisibility(i,this.isControlVisible("collapseAll"));let r=n("extraContextButtonEl",()=>e.addNavButton("expand-vertically",x("plugins.search.label-more-context"),h=>(h.stopPropagation(),t.setExtraContext(!t.extraContext))));this.toggleVisibility(r,this.isControlVisible("extraContext"));let o=n("showSortButtonEl",()=>e.addNavButton("arrow-up-narrow-wide","Sort",h=>{var w;h.stopPropagation();let M=D.map(E=>E.key),b=E=>{M.includes(E)?(t.sortOrder=E,t.setSortOrder(E)):console.error(`Invalid sort option: ${E}`)},C=(w=t.showSortButtonEl)!=null?w:h.currentTarget;C&&F(D,C,b,t.sortOrder,this.app)}));this.toggleVisibility(o,this.isControlVisible("sort"));let l=n("showTitleButtonEl",()=>e.addNavButton("strikethrough-glyph","Hide title",h=>(h.stopPropagation(),t.setTitleDisplay(!t.showTitle))));this.toggleVisibility(l,this.isControlVisible("hideTitle"));let c=n("showResultsButtonEl",()=>e.addNavButton("minus-with-circle","Hide results",h=>(h.stopPropagation(),t.setResultsDisplay(!t.showResults))));this.toggleVisibility(c,this.isControlVisible("hideResults"));let g=n("renderMarkdownButtonEl",()=>e.addNavButton("reading-glasses","Render Markdown",h=>(h.stopPropagation(),t.setRenderMarkdown(!t.renderMarkdown))));this.toggleVisibility(g,this.isControlVisible("renderMarkdown"));let p=n("copyResultsButtonEl",()=>e.addNavButton("documents","Copy results",t.onCopyResultsClick?t.onCopyResultsClick.bind(t):()=>{}));this.toggleVisibility(p,this.isControlVisible("copyResults"))}applyBacklinkControlVisibility(s,t){let e=s,n=t,i=n==null?void 0:n.headerDom;if(!(i!=null&&i.addNavButton))return;let r=(c,g)=>(e[c]||(e[c]=g()),e[c]),o=r("renderMarkdownButtonEl",()=>i.addNavButton("reading-glasses","Render Markdown",c=>(c.stopPropagation(),e.setRenderMarkdown(!e.renderMarkdown))));this.toggleVisibility(o,this.isControlVisible("renderMarkdown"));let l=r("copyResultsButtonEl",()=>i.addNavButton("documents","Copy results",e.onCopyResultsClick?e.onCopyResultsClick.bind(e):()=>{}));this.toggleVisibility(l,this.isControlVisible("copyResults"))}onload(){return R(this,null,function*(){yield this.loadSettings();let s=this;this.registerSettingsTab(),this.register(v(this.app.viewRegistry.constructor.prototype,{registerView(e){return function(n,i,...r){return s.app.workspace.trigger("view-registered",n,i),e.call(this,n,i,...r)}}}));let t;if(!this.app.workspace.layoutReady){let e=this.app.workspace.on("view-registered",(i,r)=>{if(i!=="search")return;this.app.workspace.offref(e);let o=new f.WorkspaceLeaf(s.app),l=r(o);s.patchNativeSearch(l);let c=v(f.Modal.prototype,{open(g){return function(...p){s.SearchResultsExport=this.constructor}}});l.onCopyResultsClick(new MouseEvent(null)),c()}),n=this.app.workspace.on("view-registered",(i,r)=>{if(i!=="backlink")return;this.app.workspace.offref(n);let o=new f.WorkspaceLeaf(s.app),l=r(o);s.SearchHeaderDOM=l.backlink.headerDom.constructor})}this.register(t=v(f.Component.prototype,{addChild(e){return function(n,...i){try{if(!s.isSearchPatched&&n instanceof f.Component&&n.hasOwnProperty("searchQuery")&&n.hasOwnProperty("sourcePath")&&n.hasOwnProperty("dom")){let o=n;s.patchSearchView(o),s.isSearchPatched=!0}if(n instanceof f.Component&&n.hasOwnProperty("backlinkDom")){let o=n;z.set(o.backlinkDom.el.closest(".backlink-pane"),n),s.isBacklinksPatched||(s.patchBacklinksView(o),s.isBacklinksPatched=!0)}}catch(o){console.error("Error in Component.addChild around patch:",o)}return e.call(this,n,...i)}}}))})}loadSettings(){return R(this,null,function*(){var t;let s=yield this.loadData();this.settings=Object.assign({},H,s),this.settings.controlVisibility=Object.assign({},H.controlVisibility,(t=s==null?void 0:s.controlVisibility)!=null?t:{}),this.refreshControlVisibility()})}saveSettings(){return R(this,null,function*(){yield this.saveData(this.settings)})}registerSettingsTab(){this.settingsTab=new L(this.app,this),this.addSettingTab(this.settingsTab)}getSearchHeader(){var e,n,i;let s=(e=this.app.workspace.getLeavesOfType("backlink"))==null?void 0:e.first();s==null||s.loadIfDeferred();let t=(i=(n=s==null?void 0:s.view)==null?void 0:n.backlink)==null?void 0:i.headerDom;return t==null?void 0:t.constructor}onunload(){let s="Query Control: Please restart Obsidian to complete plugin unload.";console.log(s),new f.Notice(s)}patchNativeSearch(s){let t=this;this.register(v(s.constructor.prototype,{onResize(e){return function(...n){var r;let i=(r=this.dom.vChildren)==null?void 0:r._children;return this.dom.el.clientWidth===0?(i.forEach(o=>{o.setCollapse(!0,!1)}),this.dom.hidden=!0):this.dom.hidden&&(this.dom.hidden=!1,setTimeout(()=>{i.forEach(o=>{o.setCollapse(this.dom.collapseAll,!1)})},100)),e.call(this,...n)}},stopSearch(e){return function(...n){let i=e.call(this,...n);return this.renderComponent&&(this.renderComponent.unload(),this.renderComponent=new f.Component),i}},addChild(e){return function(...n){var r;try{if(!this.patched){this.renderComponent||(this.renderComponent=new f.Component,this.renderComponent.load()),this.patched=!0,this.dom.parent=this,t.patchSearchResultDOM(this.dom.constructor),this.setRenderMarkdown=function(l){var g,p;let c=(g=this.dom.vChildren)==null?void 0:g._children;this.dom.renderMarkdown=l,c.forEach(h=>{h.renderContentMatches()}),this.dom.infinityScroll.invalidateAll(),this.dom.childrenEl.toggleClass("cm-preview-code-block",l),this.dom.childrenEl.toggleClass("is-rendered",l),(p=this.renderMarkdownButtonEl)==null||p.toggleClass("is-active",l)},this.renderMarkdownButtonEl=(r=this.headerDom)==null?void 0:r.addNavButton("reading-glasses","Render Markdown",()=>this.setRenderMarkdown(!this.dom.renderMarkdown));let o={renderMarkdown:t.settings.defaultRenderMarkdown};this.settings||(this.settings={}),Object.entries(o).forEach(([l,c])=>{this.settings.hasOwnProperty(l)?l==="sort"&&!D.hasOwnProperty(this.settings.sort)&&(this.settings[l]=c):this.settings[l]=c}),this.setRenderMarkdown(this.settings.renderMarkdown)}}catch(o){console.error("Error in searchView.addChild around patch:",o)}return e.call(this,...n)}}}))}patchSearchResultDOM(s){let t=this,e=v(s.prototype,{addResult(n){return function(...i){e();let r=n.call(this,...i),o=r.constructor;return t.isSearchResultItemPatched||t.patchSearchResultItem(o),r}}});this.register(e),this.register(v(s.prototype,{startLoader(n){return function(...i){var o,l,c,g,p,h;try{let M=this.el.closest(".backlink-pane");if(M){let b=z.get(M);b&&(b.patched||it(this,t,b))}if(!((l=(o=this.parent)==null?void 0:o.searchParamsContainerEl)!=null&&l.patched)&&((g=(c=this.el)==null?void 0:c.parentElement)==null?void 0:g.getAttribute("data-type"))==="search"){if(!this.parent)return;this.parent.searchParamsContainerEl.patched=!0,new f.Setting(this.parent.searchParamsContainerEl).setName("Render Markdown").setClass("mod-toggle").addToggle(b=>{b.setValue(t.settings.defaultRenderMarkdown),b.onChange(C=>{var E;this.renderMarkdown=C,((E=this.vChildren)==null?void 0:E._children).forEach(d=>{d.renderContentMatches()}),this.infinityScroll.invalidateAll(),this.childrenEl.toggleClass("cm-preview-code-block",C),this.childrenEl.toggleClass("is-rendered",C)})})}if(!this.patched&&((p=this.el.parentElement)==null?void 0:p.hasClass("internal-query"))){let b=t.SearchHeaderDOM?t.SearchHeaderDOM:t.getSearchHeader();if(!b){console.error("Error: _SearchHeaderDOM is undefined. Cannot create headerDom.");return}if((h=this.el)!=null&&h.closest(".internal-query")){this.patched=!0;let C=this.el.parentElement.querySelector(".internal-query-header");this.setExtraContext=function(d){var m,S;let y=(m=this.vChildren)==null?void 0:m._children;this.extraContext=d,(S=this.extraContextButtonEl)==null||S.toggleClass("is-active",d),y.forEach(O=>{O.setExtraContext(d)}),this.infinityScroll.invalidateAll()},this.setTitleDisplay=function(d){var y;this.showTitle=d,(y=this.showTitleButtonEl)==null||y.toggleClass("is-active",d),C==null||C.toggleClass("is-hidden",d)},this.setResultsDisplay=function(d){var y;this.showResults=d,(y=this.showResultsButtonEl)==null||y.toggleClass("is-active",d),this.el.toggleClass("is-hidden",d)},this.setRenderMarkdown=function(d){var m,S;this.renderMarkdown=d,((m=this.vChildren)==null?void 0:m._children).forEach(O=>{O.renderContentMatches()}),this.infinityScroll.invalidateAll(),this.childrenEl.toggleClass("cm-preview-code-block",d),this.childrenEl.toggleClass("is-rendered",d),(S=this.renderMarkdownButtonEl)==null||S.toggleClass("is-active",d)},this.setCollapseAll=function(d){var m,S;let y=(m=this.vChildren)==null?void 0:m._children;(S=this.collapseAllButtonEl)==null||S.toggleClass("is-active",d),this.collapseAll=d,y.forEach(O=>{O.setCollapse(d,!1)}),this.infinityScroll.invalidateAll()},this.setSortOrder=d=>{var y,m,S;this.sortOrder=d,this.changed(),this.infinityScroll.invalidateAll(),(S=this.showSortButtonEl)==null||S.setAttribute("aria-label",`Sort (${(m=(y=D.find(O=>O.key===d))==null?void 0:y.label)!=null?m:d})`)},this.onCopyResultsClick=d=>R(this,null,function*(){var O,I;d.preventDefault();let y=[],m=(O=this.vChildren)==null?void 0:O._children;for(let B of m){let Q=B.file.path,q="",W=(I=B.vChildren)==null?void 0:I._children;for(let _ of W){let Y=_.parent.content.substring(_.start,_.end);q+=Y+` +`}y.push(`## ${Q} +${q}`)}let S=y.join(` +`);try{yield navigator.clipboard.writeText(S),new f.Notice("Search results copied to clipboard.")}catch(B){console.error("Failed to copy search results:",B),new f.Notice("Failed to copy search results.")}}),this.headerDom=new b(this.app,this.el.parentElement),C==null||C.insertAdjacentElement("afterend",this.headerDom.navHeaderEl),t.embeddedSearchResultDoms.add(this),t.applyEmbeddedSearchControlVisibility(this);let w={};w.collapsed=t.settings.defaultCollapse,w.context=t.settings.defaultShowContext,w.hideTitle=t.settings.defaultHideTitle,w.hideResults=t.settings.defaultHideResults,w.renderMarkdown=t.settings.defaultRenderMarkdown,w.sort=t.settings.defaultSortOrder,this.settings||(this.settings={}),Object.entries(w).forEach(([d,y])=>{Object.prototype.hasOwnProperty.call(this.settings,d)?d==="sort"&&typeof this.settings.sort=="string"&&!D.some(m=>m.key===this.settings.sort)&&(this.settings[d]=y):this.settings[d]=y});let E=d=>Object.prototype.hasOwnProperty.call(this.settings,d);typeof this.settings.context=="boolean"&&this.setExtraContext(this.settings.context),typeof this.settings.sort=="string"&&(this.sortOrder=this.settings.sort,this.setSortOrder(this.settings.sort)),typeof this.settings.collapsed=="boolean"&&this.setCollapseAll(this.settings.collapsed),typeof this.settings.hideTitle=="boolean"&&this.setTitleDisplay(this.settings.hideTitle),typeof this.settings.renderMarkdown=="boolean"&&this.setRenderMarkdown(this.settings.renderMarkdown),typeof this.settings.hideResults=="boolean"&&this.setResultsDisplay(this.settings.hideResults)}}}catch(M){console.error("Error in SearchResultDOM.startLoader around patch:",M)}return n.call(this,...i)}}}))}patchSearchResultItem(s){this.isSearchResultItemPatched=!0;let t=this,e=v(s.prototype,{onResultClick(n){return function(i,r,...o){if(!(i.target instanceof HTMLElement&&(i.target.hasClass("internal-link")||i.target.hasClass("task-list-item-checkbox")||i.target.hasClass("admonition-title-content"))))return n.call(this,i,r,...o)}},renderContentMatches(n){return function(...i){var l;let r=n.call(this,...i),o=(l=this.vChildren)==null?void 0:l._children;if(!t.isSearchResultItemMatchPatched&&o.length){let c=o.first().constructor;t.patchSearchResultItemMatch(c)}return r}}});t.register(e)}patchSearchResultItemMatch(s){this.isSearchResultItemMatchPatched=!0;let t=this;t.register(v(s.prototype,{render(e){return function(...n){var c;let i=this.parentDom,r=i.content.substring(this.start,this.end).replace("```query","\\`\\`\\`query"),o=(c=r.match(/^\s+/g))==null?void 0:c.first();o&&(r=r.replace(new RegExp(`^${o}`,"gm"),""));let l=i.parent.parent;if(l&&i.parent.renderMarkdown){let g=l==null?void 0:l.renderComponent;this.el.empty();let p=new P(t.app,this.el,this);p.onRenderComplete=()=>{var h;(h=i==null?void 0:i.parent)==null||h.infinityScroll.measure(i,this)},g.addChild(p),p.renderer.set(r)}else return e.call(this,...n)}}}))}patchSearchView(s){let t=this,e=s.constructor,n=s.dom.constructor;this.register(v(e.prototype,{onunload(i){return function(...r){return this.dom&&t.embeddedSearchResultDoms.delete(this.dom),this.renderComponent&&(this.renderComponent.unload(),this.dom=null,this.queue=null,this.renderComponent=null,this._children=null,this.containerEl=null),i.call(this,...r)}},onload(i){return function(...r){try{this.renderComponent||(this.renderComponent=new f.Component,this.renderComponent.load()),this.dom.parent=this;let l=this.containerEl.parentElement.querySelector(".internal-query-header"),c=this.query.matchAll(new RegExp("^(?collapsed|context|hideTitle|renderMarkdown|hideResults|sort|title):\\s*(?.+?)$","gm")),g={};for(let p of c){let h=p.groups.value.toLowerCase();(h==="true"||h==="false")&&(p.groups.value=h==="true"),g[p.groups.key]=p.groups.value}this.query=this.query.replace(/^((collapsed|context|hideTitle|renderMarkdown|hideResults|sort|title):.+?)$/gm,"").trim(),l.setText(g.title||this.query),this.dom.settings=g}catch(l){console.error("Error in EmbeddedSearch.onload:",l)}return i.call(this,...r)}}})),this.patchSearchResultDOM(n)}patchBacklinksView(s){let t=this,e=s.constructor,n=s.backlinkDom.constructor;this.register(v(e.prototype,{onunload(i){return function(...r){return this.backlinkDom&&t.backlinkControlContexts.delete(this.backlinkDom),this.unlinkedDom&&t.backlinkControlContexts.delete(this.unlinkedDom),this.renderComponent&&(this.renderComponent.unload(),this.dom=null,this.queue=null,this.renderComponent=null,this._children=null,this.containerEl=null),i.call(this,...r)}},onload(i){return function(...r){try{this.renderComponent||(this.renderComponent=new f.Component,this.renderComponent.load()),this.dom||(console.warn("Backlink `dom` is undefined. Initializing default properties."),this.dom={}),this.backlinkDom.parent=this,this.unlinkedDom.parent=this,this.dom.settings=this.dom.settings||{}}catch(o){console.error("Error in Backlink.onload:",o)}return i.call(this,...r)}}})),this.patchSearchResultDOM(n)}};function it(u,a,s){if(s){let t=s,e=u;t.patched=!0,e.setRenderMarkdown=function(r){var l;[t.backlinkDom,t.unlinkedDom].forEach(c=>{var p;c.renderMarkdown=r,((p=c.vChildren)==null?void 0:p._children).forEach(h=>{h.renderContentMatches()}),c.infinityScroll.invalidateAll(),c.childrenEl.toggleClass("cm-preview-code-block",r),c.childrenEl.toggleClass("is-rendered",r)}),(l=this.renderMarkdownButtonEl)==null||l.toggleClass("is-active",r)},e.onCopyResultsClick=r=>R(this,null,function*(){var g,p;r.stopPropagation(),r.preventDefault();let o=[],l=[t.backlinkDom,t.unlinkedDom];for(let h of l){let M=(g=h.vChildren)==null?void 0:g._children;for(let b of M){let C=b.file.path,w="",E=(p=b.vChildren)==null?void 0:p._children;for(let d of E){let y=d.parent.content.substring(d.start,d.end);w+=y+` +`}o.push(`## ${C} +${w}`)}}let c=o.join(` +`);try{yield navigator.clipboard.writeText(c)}catch(h){console.error("Failed to copy backlinks:",h),new f.Notice("Failed to copy backlinks.")}}),a.backlinkControlContexts.set(u,s),a.applyBacklinkControlVisibility(u,s);let n={};n.collapsed=a.settings.defaultCollapse,n.context=a.settings.defaultShowContext,n.renderMarkdown=a.settings.defaultRenderMarkdown,n.sort=a.settings.defaultSortOrder,e.settings||(e.settings={}),Object.entries(n).forEach(([r,o])=>{Object.prototype.hasOwnProperty.call(e.settings,r)?r==="sort"&&typeof e.settings.sort=="string"&&!D.some(l=>l.key===e.settings.sort)&&(e.settings[r]=o):e.settings[r]=o});let i=r=>Object.prototype.hasOwnProperty.call(e.settings,r);typeof e.settings.context=="boolean"&&t.setExtraContext(e.settings.context),typeof e.settings.sort=="string"&&(t.sortOrder=e.settings.sort),typeof e.settings.collapsed=="boolean"&&t.setCollapseAll(e.settings.collapsed),typeof e.settings.renderMarkdown=="boolean"&&e.setRenderMarkdown(e.settings.renderMarkdown)}} diff --git a/.obsidian/plugins/query-control/manifest.json b/.obsidian/plugins/query-control/manifest.json index f0e88bd..66d24cb 100644 --- a/.obsidian/plugins/query-control/manifest.json +++ b/.obsidian/plugins/query-control/manifest.json @@ -1 +1 @@ -{"id":"query-control","name":"Query Control","version":"0.7.13","minAppVersion":"1.7.2","description":"An experimental Obsidian plugin that adds additional control to queries","author":"NothingIsLost & reply2za","authorUrl":"https://github.com/reply2za","isDesktopOnly":false} \ No newline at end of file +{"id":"query-control","name":"Query Control","version":"0.8.0","minAppVersion":"1.7.2","description":"An experimental Obsidian plugin that adds additional control to queries","author":"NothingIsLost & reply2za","authorUrl":"https://github.com/reply2za","isDesktopOnly":false} \ No newline at end of file diff --git a/.obsidian/plugins/query-control/styles.css b/.obsidian/plugins/query-control/styles.css index 9fce74e..77e85ec 100644 --- a/.obsidian/plugins/query-control/styles.css +++ b/.obsidian/plugins/query-control/styles.css @@ -7,6 +7,40 @@ justify-content: center; /* works around issues with minimal theme */ } +.workspace-leaf-content[data-type="markdown"] .internal-query .internal-query-header { + display: flex; + flex-direction: column; + justify-content: center; + align-items: center; + gap: 0.25em; + padding: 0.6em 0.9em; + margin: 0.4em auto 0.8em; + max-width: 90%; + text-align: center; + border-radius: var(--radius-m, 10px); + background-color: var(--background-secondary, rgba(0, 0, 0, 0.05)); + border: 1px solid var(--background-modifier-border, rgba(0, 0, 0, 0.08)); + box-shadow: 0 5px 16px -12px var(--shadow-s, rgba(0, 0, 0, 0.4)); + font-size: var(--font-ui-medium, 1.02em); + font-weight: 600; + letter-spacing: 0.013em; + line-height: 1.32; +} + +.workspace-leaf-content[data-type="markdown"] .internal-query .internal-query-header::after { + content: ""; + display: block; + width: 68px; + height: 2.3px; + border-radius: 999px; + background: linear-gradient( + 90deg, + var(--interactive-accent, #7f6df2) 0%, + var(--text-highlight-bg, rgba(255, 215, 0, 0.9)) 100% + ); + opacity: 0.88; +} + .workspace-leaf-content[data-type="markdown"] .internal-query .is-hidden { display: none; } From 627a8dace28dd0010d54d52325379a0969dc0814 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Sat, 15 Nov 2025 13:28:06 +0100 Subject: [PATCH 24/25] final round of docs --- 10 Notes/Running Unit Tests for status-go.md | 2 +- ...ng status-backend to test status-go API.md | 74 ++++++++++++++++++- 2 files changed, 73 insertions(+), 3 deletions(-) diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index 70041a8..2a8caa1 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -575,4 +575,4 @@ DONE 2 tests in 1.453s DONE 3 runs, 6 tests, 4 failures in 27.876s ``` -Thus, being able to run all the tests successfully a number of time, we should be allowed to conclude that our setup is correct. \ No newline at end of file +Thus, being able to run all the tests successfully a number of times, we should be allowed to conclude that our setup is correct. \ No newline at end of file diff --git a/10 Notes/Using status-backend to test status-go API.md b/10 Notes/Using status-backend to test status-go API.md index b9582d0..95c2909 100644 --- a/10 Notes/Using status-backend to test status-go API.md +++ b/10 Notes/Using status-backend to test status-go API.md @@ -1,5 +1,23 @@ +--- +related-to: + - "[[Running Unit Tests for status-go]]" + - "[[Running functional tests in status-go]]" + - "[[testing codex-status-go integration]]" +--- Here are some basic steps to follow: +Build status-backend: + +```bash +make status-backend +``` + +Start status-backend (I am using port `45453` for all examples below): + +```bash +./build/bin/status-backend -address localhost:45453 +``` + ### Step 1: Initialize the application ```bash @@ -93,7 +111,7 @@ I initially thought this is necessary - but it turns out that logging in is suff ```bash curl -sS http://127.0.0.1:45453/statusgo/CallRPC \ -H 'Content-Type: application/json' \ - -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_startMessenger","params":[]}' + -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_startMessenger","params":[]}' | jq ``` ### Step 4: Now you can call your method! @@ -118,4 +136,56 @@ Some examples: curl -sS http://127.0.0.1:12345/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":2,"method":"wakuext_updateMessageArchiveInterval","params":[60480]}' {"jsonrpc":"2.0","id":1,"result":604800000000000} ``` -Notice that value to be set is provided in seconds but the value returned in the result is in nanoseconds (to avoid potential problems with division). \ No newline at end of file +Notice that value to be set is provided in seconds but the value returned in the result is in nanoseconds (to avoid potential problems with division). + +### Enabling History Archives + +You use `EnableCodexCommunityHistoryArchiveProtocol` method to enable history archives for Codex. The method also accepts optional overrides to the default codex node config. +#### without overrides + +```bash +curl -sS http://127.0.0.1:45453/statusgo/CallRPC \ + -H 'Content-Type: application/json' \ + -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_enableCodexCommunityHistoryArchiveProtocol","params":[{}]}' + +# returns +{"jsonrpc":"2.0","id":1,"result":null} +``` +#### with overrides (example DiscoveryPort + one bootstrap SPR) + +```bash +curl -sS http://127.0.0.1:45453/statusgo/CallRPC \ + -H 'Content-Type: application/json' \ + -d '{ + "jsonrpc":"2.0", + "id":1, + "method":"wakuext_enableCodexCommunityHistoryArchiveProtocol", + "params":[ + { + "CodexNodeConfig.DiscoveryPort":"8091", + "CodexNodeConfig.BootstrapNodes":"[\"spr:CiUIAhIhAjOc4w87PAfj0XGMnqtYSgO8rwfPOxF7d8Y4-BXGVUJTEgIDARpJCicAJQgCEiECM5zjDzs8B-PRcYyeq1hKA7yvB887EXt3xjj4FcZVQlMQkfncyAYaCwoJBH8AAAGRAh-bGgsKCQSsEgAGkQIfmypGMEQCID4B7M6G5bEPQ_D_Z7YdPG6LHpXq3ghY2gkXtBxTExDeAiAFSOjwAem1PmbAIZlOq2hvT_LGQMwiEOEaVaoIJ1g-FQ\"]" + } + ] + }' + +# returns +{"jsonrpc":"2.0","id":1,"result":null} +``` + +To stop: + +```bash +curl -sS http://127.0.0.1:45453/statusgo/CallRPC -H 'Content-Type: application/json' -d '{"jsonrpc":"2.0","id":1,"method":"wakuext_disableCommunityHistoryArchiveProtocol","params":[]}' + +# returns +{"jsonrpc":"2.0","id":1,"result":null} +``` + + +And to verify the current node configuration: + +```bash +curl -sS http://127.0.0.1:45453/statusgo/GetNodeConfig \ + -H 'Content-Type: application/json' \ + -d '{}' | jq +``` From 63d93f721fd6df1b46da2e9062f9ce0cf64ef581 Mon Sep 17 00:00:00 2001 From: Marcin Czenko Date: Mon, 15 Dec 2025 03:48:08 +0100 Subject: [PATCH 25/25] updates codex-status-go integration docs --- .obsidian/core-plugins.json | 6 +- 10 Notes/Conventional Commits Prefixes.md | 17 ++ ...-preserving file sharing client in Rust.md | 1 + 10 Notes/Running Unit Tests for status-go.md | 71 +++--- 10 Notes/linting commands for status-go.md | 10 +- 10 Notes/status-go final merge notes.md | 107 +++++++++ ...tus-go-codex integration - design notes.md | 4 + .../testing codex-status-go integration.md | 217 ++++++++++-------- 8 files changed, 294 insertions(+), 139 deletions(-) create mode 100644 10 Notes/Conventional Commits Prefixes.md create mode 100644 10 Notes/Privacy-preserving file sharing client in Rust.md create mode 100644 10 Notes/status-go final merge notes.md diff --git a/.obsidian/core-plugins.json b/.obsidian/core-plugins.json index 639b90d..25ae3eb 100644 --- a/.obsidian/core-plugins.json +++ b/.obsidian/core-plugins.json @@ -7,7 +7,6 @@ "canvas": true, "outgoing-link": true, "tag-pane": true, - "footnotes": false, "properties": true, "page-preview": true, "daily-notes": true, @@ -28,6 +27,7 @@ "file-recovery": true, "publish": false, "sync": true, - "bases": true, - "webviewer": false + "webviewer": false, + "footnotes": false, + "bases": true } \ No newline at end of file diff --git a/10 Notes/Conventional Commits Prefixes.md b/10 Notes/Conventional Commits Prefixes.md new file mode 100644 index 0000000..d9c5d96 --- /dev/null +++ b/10 Notes/Conventional Commits Prefixes.md @@ -0,0 +1,17 @@ +Common conventional commit prefixes are: + +- **feat**: New feature +- **fix**: Bug fix +- **docs**: Documentation changes +- **style**: Code style changes (formatting, missing semicolons, etc.) +- **refactor**: Code refactoring (neither fixes a bug nor adds a feature) +- **perf**: Performance improvements +- **test**: Adding or updating tests +- **build**: Changes to build system or dependencies +- **ci**: Changes to CI configuration files and scripts +- **chore**: Other changes that don't modify src or test files +- **revert**: Reverts a previous commit + +Optional scope can be added in parentheses: `feat(api):`, `fix(wallet):`, etc. + +This is especially relevant when working with status-go repo. See also [[testing codex-status-go integration]]. \ No newline at end of file diff --git a/10 Notes/Privacy-preserving file sharing client in Rust.md b/10 Notes/Privacy-preserving file sharing client in Rust.md new file mode 100644 index 0000000..9003021 --- /dev/null +++ b/10 Notes/Privacy-preserving file sharing client in Rust.md @@ -0,0 +1 @@ +https://hackmd.io/@codex-storage/H1kBvIgMbg \ No newline at end of file diff --git a/10 Notes/Running Unit Tests for status-go.md b/10 Notes/Running Unit Tests for status-go.md index 2a8caa1..36b3302 100644 --- a/10 Notes/Running Unit Tests for status-go.md +++ b/10 Notes/Running Unit Tests for status-go.md @@ -214,61 +214,48 @@ Now, the libs. Static lib: ```bash make statusgo-library -which: no go-generate-fast in (...) -Generated handlers in ../../protocol/messenger_handlers.go for Type enum. -Generated endpoints file: ../endpoints.go -## cmd/library/README.md explains the magic incantation behind this -mkdir -p build/bin/statusgo-lib -go run cmd/library/*.go > build/bin/statusgo-lib/main.go +# ... Building static library... -go build \ - -tags 'gowaku_no_rln' \ - -ldflags="" \ - -buildmode=c-archive \ - -o build/bin/libstatus.a \ - ./build/bin/statusgo-lib -Static library built: --rw-r--r-- 1 mc2 mc2 247898154 Sep 17 01:24 build/bin/libstatus.a --rw-r--r-- 1 mc2 mc2 8290 Sep 17 01:24 build/bin/libstatus.h +CGO_ENABLED=1 CGO_CFLAGS="-I/home/mc2/code/status-im/status-go/libs -I/home/mc2/code/status-im/nim-sds/library -I//include -I//include/darwin -I/home/mc2/code/status-im/nim-sds/library -I/home/mc2/code/status-im/status-go/libs" CGO_LDFLAGS="-Wl,-rpath,/home/mc2/code/status-im/status-go/libs -L/home/mc2/code/status-im/status-go/libs -lcodex -Wl,-rpath,/home/mc2/code/status-im/status-go/libs -L/home/mc2/code/status-im/nim-sds/build -lsds -L/home/mc2/code/status-im/nim-sds/build -lsds -L/home/mc2/code/status-im/status-go/libs -lcodex" LD_LIBRARY_PATH=/home/mc2/code/status-im/status-go/libs:/home/mc2/code/status-im/nim-sds/build:$LD_LIBRARY_PATH go build \ + -tags 'gowaku_no_rln' \ + -ldflags="" \ + -buildmode=c-archive \ + -o build/bin/libstatus.a \ + "build/bin/statusgo-lib/main.go" +Static library built: build/bin/libstatus.a ``` and shared lib: ```bash make statusgo-shared-library -which: no go-generate-fast in (...) -Generated handlers in ../../protocol/messenger_handlers.go for Type enum. -Generated endpoints file: ../endpoints.go -## cmd/library/README.md explains the magic incantation behind this -mkdir -p build/bin/statusgo-lib -go run cmd/library/*.go > build/bin/statusgo-lib/main.go +# ... Building shared library... Tags: gowaku_no_rln -CGO_LDFLAGS="-Wl,-soname,libstatus.so.0" go build \ - -tags 'gowaku_no_rln' \ - -ldflags="" \ - -buildmode=c-shared \ - -o build/bin/libstatus.so \ - ./build/bin/statusgo-lib +CGO_LDFLAGS="-L/home/mc2/code/status-im/status-go/libs -lcodex -Wl,-rpath,/home/mc2/code/status-im/status-go/libs -L/home/mc2/code/status-im/nim-sds/build -lsds -L/home/mc2/code/status-im/nim-sds/build -lsds -L/home/mc2/code/status-im/status-go/libs -lcodex" CGO_CFLAGS="-I/home/mc2/code/status-im/status-go/libs -I/home/mc2/code/status-im/nim-sds/library -I//include -I//include/darwin -I/home/mc2/code/status-im/nim-sds/library -I/home/mc2/code/status-im/status-go/libs" \ + go build \ + -tags 'gowaku_no_rln' \ + -ldflags="" \ + -buildmode=c-shared \ + -o build/bin/libstatus.so \ + ./build/bin/statusgo-lib cd build/bin && \ ls -lah . && \ mv ./libstatus.so ./libstatus.so.0 && \ ln -s ./libstatus.so.0 ./libstatus.so -total 578M -drwxr-xr-x 1 mc2 mc2 190 Sep 17 01:39 . -drwxr-xr-x 1 mc2 mc2 10 Sep 10 05:15 .. --rwxr-xr-x 1 mc2 mc2 44M Sep 10 05:15 generate-db --rw-r--r-- 1 mc2 mc2 237M Sep 17 01:24 libstatus.a --rw-r--r-- 1 mc2 mc2 8.1K Sep 17 01:39 libstatus.h --rw-r--r-- 1 mc2 mc2 107M Sep 17 01:39 libstatus.so --rwxr-xr-x 1 mc2 mc2 92M Sep 10 05:15 push-notification-server --rwxr-xr-x 1 mc2 mc2 100M Sep 17 01:19 status-backend -drwxr-xr-x 1 mc2 mc2 14 Sep 10 05:08 statusgo-lib +total 495M +drwxr-xr-x 1 mc2 mc2 120 Dec 12 18:50 . +drwxr-xr-x 1 mc2 mc2 6 Dec 12 18:48 .. +-rw-r--r-- 1 mc2 mc2 261M Dec 12 18:49 libstatus.a +-rw-r--r-- 1 mc2 mc2 7.4K Dec 12 18:50 libstatus.h +-rw-r--r-- 1 mc2 mc2 122M Dec 12 18:50 libstatus.so +-rwxr-xr-x 1 mc2 mc2 113M Dec 12 18:48 status-backend +drwxr-xr-x 1 mc2 mc2 14 Dec 12 18:48 statusgo-lib Shared library built: --rw-r--r-- 1 mc2 mc2 247898154 Sep 17 01:24 build/bin/libstatus.a --rw-r--r-- 1 mc2 mc2 8290 Sep 17 01:39 build/bin/libstatus.h -lrwxrwxrwx 1 mc2 mc2 16 Sep 17 01:39 build/bin/libstatus.so -> ./libstatus.so.0 --rw-r--r-- 1 mc2 mc2 111911080 Sep 17 01:39 build/bin/libstatus.so.0 +-rw-r--r-- 1 mc2 mc2 272836554 Dec 12 18:49 build/bin/libstatus.a +-rw-r--r-- 1 mc2 mc2 7482 Dec 12 18:50 build/bin/libstatus.h +lrwxrwxrwx 1 mc2 mc2 16 Dec 12 18:50 build/bin/libstatus.so -> ./libstatus.so.0 +-rw-r--r-- 1 mc2 mc2 127116728 Dec 12 18:50 build/bin/libstatus.so.0 ``` ### Running unit test @@ -279,7 +266,7 @@ The obvious make test ``` -a number of tests will most certainly. To understand the root cause, let's investigate a bit. +It runs all the developer tests, except for `protocol` tests currently. `make test` uses `_assets/scripts/run_unit_tests.sh` under the hood, where we find the following fragment: diff --git a/10 Notes/linting commands for status-go.md b/10 Notes/linting commands for status-go.md index e41b988..f8a73c4 100644 --- a/10 Notes/linting commands for status-go.md +++ b/10 Notes/linting commands for status-go.md @@ -4,10 +4,16 @@ related-to: - "[[Running Unit Tests for status-go]]" - "[[Running functional tests in status-go]]" --- -Here are two commands you should use before pushing: +The easiest way: ```bash -golangci-lint run --build-tags=gowaku_no_rln +make lint +``` + +And the detailed manual commands: + +```bash +golangci-lint --build-tags 'gowaku_no_rln lint' run ./... ``` and: diff --git a/10 Notes/status-go final merge notes.md b/10 Notes/status-go final merge notes.md new file mode 100644 index 0000000..3758390 --- /dev/null +++ b/10 Notes/status-go final merge notes.md @@ -0,0 +1,107 @@ +The following bigger changes has been observed: + +- added `context` to `HandleCommunityMessageArchiveMagnetlink` so that the signature now looks like this: + +```go + func (m *Messenger) HandleCommunityMessageArchiveMagnetlink(ctx context.Context, state *ReceivedMessageState, message *protobuf.CommunityMessageArchiveMagnetlink, statusMessage *common.StatusMessage) error { + +return m.HandleHistoryArchiveMagnetlinkMessage(state, state.CurrentMessageState.PublicKey, message.MagnetUri, message.Clock) +} +``` + +### Makefile + +(1) extended parts related to `libwaku` and `libsds` + +(2) building main target does refer to vendors: + +```bash +.PHONY: $(GO_CMD_NAMES) $(GO_CMD_PATHS) $(GO_CMD_BUILDS) +$(GO_CMD_BUILDS): generate $(LIBWAKU) $(LIBSDS) +$(GO_CMD_BUILDS): ##@build Build any Go project from cmd folder + CGO_ENABLED=1 \ + CGO_CFLAGS="$(CGO_CFLAGS)" \ + CGO_LDFLAGS="$(CGO_LDFLAGS)" \ + go build -v \ + -tags '$(BUILD_TAGS)' $(BUILD_FLAGS) \ + -o ./$@ ./cmd/$(notdir $@) + @echo "Compilation done." + @echo "Run \"build/bin/$(notdir $@) -h\" to view available commands." +``` + +You see now they use: + +```bash +go build -v \ +``` + +previously they had: + +```bash +go build -mod=vendor -v \ +``` + +This is in commit `1f18d4d326537e1da90faac6b29dee6aa3bdc6d1`: + +``` +chore: stop vendoring (#6951) +* chore: ignore go work +* chore: stop vendoring +ci: update github pr workflow +chore: update nix vendor hash +* feat(Makefile): vendor-hash +* fix(Makefile): colors +* chore: rm -rf vendor +* chore: update nix vendorHash +``` + +### nix + +Nix has been slightly updated: + +```nix +in mkShell { + name = "status-go-shell"; + + buildInputs = with pkgs; + lib.optionals (stdenv.isDarwin) [ xcodeWrapper llvmPackages.openmp ] ++ [ + git jq which + go golangci-lint go-junit-report gopls codecov-cli + protobuf3_24 protoc-gen-go gotestsum openjdk openssl + rustc cargo + ]; +``` + +to: + +```nix +in mkShell { + name = "status-go-shell"; + + buildInputs = with pkgs; + lib.optionals (stdenv.isDarwin) [ xcodeWrapper ] ++ [ + git jq which + go golangci-lint go-junit-report gopls codecov-cli + protobuf3_24 protoc-gen-go gotestsum openjdk openssl + rustc cargo + nim + lib-sds-pkg + ]; +``` + +and then on top of that we have our changes: + +```nix +in mkShell { + name = "status-go-shell"; + + buildInputs = with pkgs; + lib.optionals (stdenv.isDarwin) [ xcodeWrapper llvmPackages.openmp ] ++ [ + git jq which + go golangci-lint go-junit-report gopls codecov-cli + protobuf3_24 protoc-gen-go gotestsum openjdk openssl + rustc cargo + nim + lib-sds-pkg + ] ++ lib.optionals (!stdenv.isDarwin) [ gcc ]; +``` diff --git a/10 Notes/status-go-codex integration - design notes.md b/10 Notes/status-go-codex integration - design notes.md index ae6dcc0..6df8d2f 100644 --- a/10 Notes/status-go-codex integration - design notes.md +++ b/10 Notes/status-go-codex integration - design notes.md @@ -7,6 +7,8 @@ related-to: - "[[Creating History Archives - InitHistoryArchiveTasks]]" - "[[testing codex-status-go integration]]" --- +The notes in this document aim at recording our path towards the Codex integration with status-go. It is thus good to learn the dilemmas we had and some initial assumptions. The reference is the spec document and the code. + ## Codex for History Archives As indicated in the [[Team-NLBR Solution Proposal]], the central entry point to the history management is [InitHistoryArchiveTasks](https://github.com/status-im/status-go/blob/6322f22783585474803cfc8a6f0a914757d763b5/protocol/messenger_communities.go#L3783). `InitHistoryArchiveTasks` is called from **two main places**: @@ -165,6 +167,8 @@ message CodexWakuMessageArchiveIndex { #### Appending the index file +> The final implementation proposal does not use files directly and delegates persistence fully to Codex. We also do not call Codex via its Rest API, but instead we use the Codex library (libcodex). + In a more production version we will not operate on the local file system, yet, here, for simplicity, we will be using a physical index file and a separate file for each archive. For this reason, in the initial implementation, a community owner will not query Codex for the current index file. For this purpose, we could use `http://localhost:8001/api/codex/v1/data/${CID}` API, which returns `404` when the file does not exist in the local store: ```bash diff --git a/10 Notes/testing codex-status-go integration.md b/10 Notes/testing codex-status-go integration.md index 83530dd..b492439 100644 --- a/10 Notes/testing codex-status-go integration.md +++ b/10 Notes/testing codex-status-go integration.md @@ -7,42 +7,30 @@ In [[Running Unit Tests for status-go]] we provide general notes on running unit Also, to learn the history archive creation/upload and download/processing flows (recorded AI conversation with some edits), please check: - archive creation/upload: [[When are magnetlink messages sent]] -- archive download/processing: [[status-go processing magnet links]] +- archive download/processing: [[status-go processing magnet links]]. In this document I am including a link to an excalidraw diagram that can be helpful - for convenience: [https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi](https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi) To grasp the concept of topics and filters - check [[Filters, Topics, Channels, and Chat IDs in status-go and waku]]. -In that last document I am including a link to an excalidraw diagram that can be helpful - for convenience: [https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi](https://link.excalidraw.com/readonly/vSon9uiUhYJWrwXiKAsi) - In this document, we focus on our Codex extension to status-go and here we focus on the related unit and integration tests. -There is one existing test in status-go that has slightly more end-to-end nature. It is from the `protocol` package: +> Notice that this is still a proof-of-concept and may deserve a bit more exhaustive testing if it is decided to use it in the production. -``` -protocol/communities_messenger_token_permissions_test.go -``` +The most important tests we added: -We will be providing an updated version of this test **AFTER** testing lower levels of the stack. - -Thus, the plan is as follows: - -1. More isolated tests of the CodexClient abstraction. There is a separate small utility project, where CodexClient can be exercised against the Codex client. I thought it may be easier this way to test the integration with the Codex library. The project repo url is: [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client). Most of the tests from this project will be ported to the working branch where the main integration work takes place: `status-go-codex-integraion` in the [status-im/status-go](https://github.com/status-im/status-go) repo. -2. Tests of `protocol/communities/codex_index_downloader.go` and `protocol/communities/codex_archive_downloader.go`. -3. The "Codex" version of the above mentioned "integration" test. - -After that we should be ready for the cluster testing. If needed, we can also try to run status-desktop locally. - -So in this document we first document running unit and integration tests for the three major abstractions we introduced to status-go: - -- CodexClient -- CodexIndexDownloader -- CodexArchiveDownloader - -They are comprehensively tested in the [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client) repo, but then they are integrated into the status-go. It is easy to figure out how to run the corresponding tests by just adjusting the commands in the above mentioned [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client) repo, but for completeness, we present the updated content below. +1. [CodexClient](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/protocol/communities/codex_client.go) - the proxy to the code library `libcodex`: + - [protocol/communities/codex_client_test.go](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/protocol/communities/codex_client_test.go) +2. [CodexIndexDownloader](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/protocol/communities/codex_index_downloader.go): + - [protocol/communities/codex_index_downloader_test.go](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/protocol/communities/codex_index_downloader_test.go) +3. [CodexArchiveDownloader](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/protocol/communities/codex_archive_downloader.go): + - [protocol/communities/codex_archive_downloader_test.go](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/protocol/communities/codex_archive_downloader_test.go) +4. More end-2-end developer tests in [protocol/communities_messenger_token_permissions_test.go](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/protocol/communities_messenger_token_permissions_test.go): + - [TestUploadDownloadCodexHistoryArchives_withSharedCodexClient](https://github.com/status-im/status-go/blob/377d5c0df5e80e6543d2de816fbb39e684216b73/protocol/communities_messenger_token_permissions_test.go#L2386) + - [TestUploadDownloadCodexHistoryArchives](https://github.com/status-im/status-go/blob/377d5c0df5e80e6543d2de816fbb39e684216b73/protocol/communities_messenger_token_permissions_test.go#L2871) +5. Functional tests in [tests-functional/tests/test_wakuext_community_archives.py](https://github.com/status-im/status-go/blob/feat/status-go-codex-integration/tests-functional/tests/test_wakuext_community_archives.py) +In the remaining part of the document we give some handy information on how we can run those tests. ### Regenerating artifacts -In [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client) we include all the generated artifacts. In status-go, they are not included in the version control. Thus, what is optional in [codex-storage/go-codex-client](https://github.com/codex-storage/go-codex-client), here is obligatory to do before you will be able to run the tests. - There are two artifacts that need to be updated: - the protobuf @@ -173,44 +161,72 @@ export CGO_CFLAGS=-I$LIBS_DIR export CGO_LDFLAGS="-L$LIBS_DIR -lcodex -Wl,-rpath,$LIBS_DIR" ``` -### Running unit tests for Codex abstractions - -We have some unit tests and a couple of integration tests. - -In this section we focus on the unit tests. The integration tests are covered in the -next section. - -To run all unit tests: +Additionally, since status-go added the SDS library, there are even more environment variables that need to be setup. We have a handy script to do just that: ```bash -❯ go test -v ./protocol/communities -count 1 +#!/usr/bin/env bash +# Source this file to set up environment variables for running tests with gotestsum +# Usage: source ./set-test-env.sh + +SCRIPT_DIR="$(cd "$(dirname "${BASH_SOURCE[0]}")" && pwd)" + +export LIBS_DIR="$(realpath "$SCRIPT_DIR/libs")" +export NIM_SDS_LIB_DIR="$(realpath "$SCRIPT_DIR/../nim-sds/build")" +export NIM_SDS_INC_DIR="$(realpath "$SCRIPT_DIR/../nim-sds/library")" +export CGO_CFLAGS="-I$LIBS_DIR -I$NIM_SDS_INC_DIR" +export CGO_LDFLAGS="-L$LIBS_DIR -lcodex -Wl,-rpath,$LIBS_DIR -L$NIM_SDS_LIB_DIR -lsds" + +# Detect OS and set library path accordingly +if [[ "$OSTYPE" == "darwin"* ]]; then + export DYLD_LIBRARY_PATH="$LIBS_DIR:$NIM_SDS_LIB_DIR:$DYLD_LIBRARY_PATH" + echo "Environment configured for macOS" +else + export LD_LIBRARY_PATH="$LIBS_DIR:$NIM_SDS_LIB_DIR:$LD_LIBRARY_PATH" + echo "Environment configured for Linux" +fi + +echo "Test environment variables set:" +echo " LIBS_DIR=$LIBS_DIR" +echo " NIM_SDS_LIB_DIR=$NIM_SDS_LIB_DIR" +echo " NIM_SDS_INC_DIR=$NIM_SDS_INC_DIR" +echo "" +echo "You can now run tests with gotestsum, for example:" +echo ' gotestsum --packages="./protocol/communities" -f testname -- -count 1 -tags "gowaku_no_rln gowaku_skip_migrations" -run CodexArchiveManagerSuite' ``` -To be more selective, e.g. in order to run all the tests from -`CodexArchiveDownloaderSuite`, run: +Thus, just run: ```bash -go test -v ./protocol/communities -run CodexArchiveDownloader -count 1 +source ./set-test-env.sh ``` -or for an individual test from that suite: +in the top level directory and you should be good to go. +### Running developer-facing tests for Codex abstractions + +**TL;DR** + +Install `gotestsum`: `go install gotest.tools/gotestsum@v1.13.0` + +Then to run `./protocol/community` tests: ```bash -go test -v ./protocol/communities -run TestCodexArchiveDownloaderSuite/TestCancellationDuringPolling -count 1 +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -count 1 -timeout "5m" -tags "gowaku_no_rln gowaku_skip_migrations" ``` -You can also use `gotestsum` to run the tests (you may need to install it first, e.g. `go install gotest.tools/gotestsum@v1.13.0`): +To run all `./protocol` tests: ```bash -gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -count 1 +gotestsum --packages="./protocol" -f testname --rerun-fails -- -count 1 -timeout "45m" -tags "gowaku_no_rln gowaku_skip_migrations" ``` -For a more verbose output including logs use `-f standard-verbose`, e.g.: +Of course, you can also just run: ```bash -gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -v -count 1 +make test ``` +I found running tests using `gotestsum` more reliable and more appropriate for development. + To be more selective, e.g. in order to run all the tests from `CodexArchiveDownloaderSuite`, run: @@ -221,7 +237,7 @@ gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -run or for an individual test from that suite: ```bash -gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -run TestCodexArchiveDownloaderSuite/TestCancellationDuringPolling -count 1 +gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -run CodexArchiveDownloaderSuite/TestCancellationDuringPolling -count 1 ``` Notice, that the `-run` flag accepts a regular expression that matches against the full test path, so you can be more concise in naming if necessary, e.g.: @@ -230,71 +246,85 @@ Notice, that the `-run` flag accepts a regular expression that matches against t gotestsum --packages="./protocol/communities" -f testname --rerun-fails -- -run CodexArchiveDownloader/Cancellation -count 1 ``` -This also applies to native `go test` command. - -### Running integration tests - -When building Codex client for testing like here, I often remove some logging noise, by slightly changing the build params in `build.nims`: - -```nim -task codex, "build codex binary": - buildBinary "codex", - # params = "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE" - params = - "-d:chronicles_runtime_filtering -d:chronicles_log_level=TRACE -d:chronicles_enabled_topics:restapi:TRACE,node:TRACE" -``` - -You see a slightly more selective `params` in the `codex` task. - -To start Codex client, use e.g.: +This also applies to native `go test` command, e.g.: ```bash -./build/codex --data-dir=./data-1 --listen-addrs=/ip4/127.0.0.1/tcp/8081 --api-port=8001 --nat=none --disc-port=8091 --log-level=TRACE +go test -v ./protocol/communities -count 1 -run CodexArchiveDownloaderSuite/TestCancellationDuringPolling ``` -To run the integration test, use `codex_integration` tag and narrow the scope using `-run Integration`: + +For a more verbose output including logs use `-f standard-verbose`, e.g.: ```bash -CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run Integration -timeout 15s +gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -v -count 1 -run CodexArchiveDownloaderSuite/TestCancellationDuringPolling ``` -This will run all integration tests, including `CodexClient` integration tests. - -To make sure that the test is actually run and not cached, use `count` option: +Finally, the relevant Codex integration tests from the `./protocol` module run: ```bash -CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run Integration -timeout 15s -count 1 +gotestsum --packages="./protocol" -f testname -- -count 1 -tags "gowaku_no_rln gowaku_skip_migrations" -run TestMessengerCommunitiesTokenPermissionsSuite/Codex +PASS protocol.TestMessengerCommunitiesTokenPermissionsSuite/TestUploadDownloadCodexHistoryArchives (5.44s) +PASS protocol.TestMessengerCommunitiesTokenPermissionsSuite/TestUploadDownloadCodexHistoryArchives_withSharedCodexClient (5.50s) +PASS protocol.TestMessengerCommunitiesTokenPermissionsSuite (10.94s) +PASS protocol + +DONE 3 tests in 10.968s ``` -To be more specific and only run the tests related to, e.g. index downloader or archive -downloader you can use: +### Running functional tests + +Here we use our convenience scripts. First we build the docker image running: ```bash -CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run CodexIndexDownloaderIntegration -timeout 15s -count 1 - -CODEX_API_PORT=8001 go test -v -tags=codex_integration ./protocol/communities -run CodexArchiveDownloaderIntegration -timeout 15s -count 1 +_assets/scripts/build_status_go_docker.sh ``` -and then, if you prefer to use `gotestsum`: +> We run all the commands from the top-level project directory + +And then: ```bash -CODEX_API_PORT=8001 gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -tags=codex_integration -run CodexIndexDownloaderIntegration -v -count 1 +./_assets/scripts/run_functional_tests_dev.sh TestCommunityArchives +Using existing virtual environment +Installing dependencies +Discovering tests to be run... +Found 5 tests matching: TestCommunityArchives +Tests to execute: + 1) test_community_archive_index_exists + 2) test_community_archive_exists_for_default_chat + 3) test_archive_is_not_created_without_messages + 4) test_different_archives_are_created_with_multiple_messages + 5) test_archive_is_downloaded_after_logout_login +Continue with execution? (y/n): y +... +tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_community_archive_exists_for_default_chat +tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_community_archive_index_exists +tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_archive_is_downloaded_after_logout_login +tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_different_archives_are_created_with_multiple_messages +tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_archive_is_not_created_without_messages +[gw1] [ 20%] PASSED tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_community_archive_exists_for_default_chat +[gw2] [ 40%] PASSED tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_archive_is_not_created_without_messages +[gw3] [ 60%] PASSED tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_different_archives_are_created_with_multiple_messages +[gw4] [ 80%] PASSED tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_archive_is_downloaded_after_logout_login +[gw0] [100%] PASSED tests-functional/tests/test_wakuext_community_archives.py::TestCommunityArchives::test_community_archive_index_exists -CODEX_API_PORT=8001 gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -tags=codex_integration -run CodexArchiveDownloaderIntegration -v -count 1 +======================================================================== 5 passed in 141.69s (0:02:21) ========================================================================= +Testing finished +Running cleanup... ``` -or to run all integration tests (including `CodexClient` integration tests): +You can also run a single test as follow: ```bash -CODEX_API_PORT=8001 gotestsum --packages="./protocol/communities" -f standard-verbose --rerun-fails -- -tags=codex_integration -v -count 1 -run Integration +./_assets/scripts/run_functional_tests_dev.sh test_community_archive_index_exists ``` -I prefer to be more selective when running integration tests. -### Main integration test +The logs are in `tests-functional/logs`. +## More notes -This is about step 3 above: "Codex" version of `protocol/communities_messenger_token_permissions_test.go`. +For the Codex-related tests in `protocol/communities_messenger_token_permissions_test.go`, in we add some more context below. -The test we are particularly interested in is `TestImportDecryptedArchiveMessages`. +Our two "Codex"-related tests are based on `TestImportDecryptedArchiveMessages` test. This test produces lots of output - with lot's warnings and errors - so looking at the log to judge the success would be a challenge. Yet, the test passes: @@ -374,7 +404,7 @@ The `CreateHistoryArchiveTorrentFromDB` is called directly here, in a way bypass The "Codex" version of the `CreateHistoryArchiveTorrentFromDB` is `CreateHistoryArchiveCodexFromDB` which will call `createHistoryArchiveCodex` - this is where archives are created and uploaded to Codex. -Another function that this test "touches" is `LoadHistoryArchiveIndexFromFile`, for which the "Codex" version is `CodexLoadHistoryArchiveIndexFromFile`. +Another function that this test "touches" is `LoadHistoryArchiveIndexFromFile`, for which the "Codex" version is `CodexLoadHistoryArchiveIndex`. Notice, we do not need to load it from a *file* anymore - Codex takes care. Thus, this test focuses on an important cut of the whole end-to-end flow and in our case, where we use Codex, it also indirectly tests seeding and retrieving the archives from the network. @@ -384,13 +414,16 @@ The integration test described above does not cover actual publishing of the gen ``` CreateAndSeedHistoryArchive - |- CreateHistoryArchiveTorrentFromDB - |- SeedHistoryArchiveTorrent - |- CreateHistoryArchiveCodexFromDB + |- if distributionPreference == Torrent + |- CreateHistoryArchiveTorrentFromDB + |- SeedHistoryArchiveTorrent + |- if distributionPreference == Codex + |- CreateHistoryArchiveCodexFromDB + |- SeedHistoryArchiveIndexCid (only in some cases: Codex takes care for seeding) |- publish: HistoryArchiveSeedingSignal ``` -We see that we seed the index file and the archives for both torrent and Codex and when at least one publishing method succeeds, we do: +Depending on the *distribution preference* (Codex or Torrent) we either seed the index file and the archives for torrent or for Codex and when at least one publishing method succeeds, we do: ```go m.publisher.publish(&Subscription{ @@ -426,8 +459,8 @@ The `dispatchMagnetlinkMessage` and `dispatchIndexCidMessage` is where dispatchi The message is sent as follows: ```go -chatID := community.MagnetlinkMessageChannelID() -rawMessage := messagingtypes.RawMessage{ +chatID := community.UniversalChatID() +rawMessage := common.RawMessage{ LocalChatID: chatID, Sender: community.PrivateKey(), Payload: encodedMessage, @@ -452,7 +485,7 @@ return m.communitiesManager.UpdateIndexCidMessageClock(community.ID(), indexCidM Here notice the call to `UpdateCommunityDescriptionIndexCidMessageClock`. As you can see, the clocks are also recorded in the community description. Community description is sent over waku to other community members periodically (every 5mins) or on some events. This how it is sent in `publishOrg` in `protocol/messenger_communities.go`: ```go -rawMessage := messagingtypes.RawMessage{ +rawMessage := common.RawMessage{ Payload: payload, Sender: org.PrivateKey(), // we don't want to wrap in an encryption layer message @@ -477,7 +510,7 @@ messageID, err := m.messaging.SendPublic(context.Background(), org.IDString(), r When community members receive the community description, they compare the clocks in the community description with the most recent clocks of the most recent magnet link or index Cid. IF the clocks in the community description are newer (more recent), they update the local copies, so that when a new magnet link or index Cid message arrives, they know to ignore outdated messages. -To read more, check: [[History Archives and Community Description]]. +To read more, check: [[History Archives and Community Description]] (AI session recording). This naturally brought us to the reception of the magnet links/index Cid (see also [[status-go processing magnet links]] and [[status-go publishing magnet links]]).