Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: implement attribute index for wasm build #12

Merged
merged 3 commits into from
Feb 13, 2025
Merged

Conversation

HideBa
Copy link
Owner

@HideBa HideBa commented Feb 13, 2025

This change is Reviewable

Summary by CodeRabbit

  • New Features

    • Introduced advanced attribute-based querying that lets users filter and retrieve data using JSON inputs.
    • Launched a revamped query testing interface featuring an updated title, a dedicated query input area, and a “Run Query Test” button.
  • Improvements

    • Enhanced error feedback and logging for a smoother, more intuitive querying experience.
    • Optimized underlying configurations to ensure more consistent and reliable performance.

Copy link

coderabbitai bot commented Feb 13, 2025

Caution

Review failed

The pull request is closed.

Walkthrough

This pull request introduces a series of updates across both Rust and TypeScript modules. In Rust, the bst package now has a new [features] section with a default "http" feature and an optional dependency on "packed_rtree". The fcb_core library exposes previously internal modules and functions, while the wasm package adds enhanced logging, new methods for computing index sizes, and attribute query capabilities via new types and enum variants. In TypeScript, binding files and the HTML UI are updated to support attribute queries, and repository configuration files are revised.

Changes

File(s) Change Summary
src/rust/bst/Cargo.toml Added [features] section with a default "http" feature and an "http" feature depending on the optional "packed_rtree" (sourced from a local path).
src/rust/fcb_core/src/lib.rs
src/rust/fcb_core/src/reader/attr_query.rs
Exposed internal modules and functions by updating visibility from private to public.
src/rust/makefile Updated the wasm-build target output path from ../ts to ../../ts.
src/rust/wasm/Cargo.toml
src/rust/wasm/src/lib.rs
Added new dependencies (bst and workspace-based chrono) and enhanced HttpFcbReader with logging, new methods (rtree_index_size, attr_index_size, select_attr_query), a new enum variant, and associated structs for attribute queries.
src/ts/fcb_wasm.d.ts
src/ts/fcb_wasm.js
src/ts/fcb_wasm_bg.wasm.d.ts
Introduced new TypeScript bindings for attribute query functionality, including a new WasmAttrQuery class, updated adapter functions, and externref shim modifications.
src/ts/index.html
src/ts/.gitignore
src/ts/package.json
Updated the HTML UI to include a JSON query textarea and renamed test functions; revised .gitignore to ignore all files; removed metadata, scripts, and dependencies from package.json.

Sequence Diagram(s)

sequenceDiagram
    participant U as User
    participant UI as UI (index.html)
    participant Q as WasmAttrQuery
    participant R as HttpFcbReader
    participant I as AsyncFeatureIter

    U->>UI: Enter JSON query and click "Run Query Test"
    UI->>Q: Construct WasmAttrQuery from JSON
    UI->>R: Call select_attr_query(query)
    R->>R: Log query data & compute index sizes
    R->>I: Return AsyncFeatureIter for feature iteration
    I->>UI: Provide features for display
Loading

Possibly related PRs

Poem

I hop through lines of sparkling code,
Where features and modules lightly explode.
Carrots of logic and bytes so bright,
Querying with joy from morning to night.
A rabbit’s delight in every new line—
In this garden of code, all bugs resign!
🐇✨


📜 Recent review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between bb90aa6 and afadb32.

⛔ Files ignored due to path filters (1)
  • src/ts/fcb_wasm_bg.wasm is excluded by !**/*.wasm
📒 Files selected for processing (12)
  • src/rust/bst/Cargo.toml (0 hunks)
  • src/rust/fcb_core/src/lib.rs (1 hunks)
  • src/rust/fcb_core/src/reader/attr_query.rs (2 hunks)
  • src/rust/makefile (1 hunks)
  • src/rust/wasm/Cargo.toml (1 hunks)
  • src/rust/wasm/src/lib.rs (8 hunks)
  • src/ts/.gitignore (1 hunks)
  • src/ts/fcb_wasm.d.ts (2 hunks)
  • src/ts/fcb_wasm.js (10 hunks)
  • src/ts/fcb_wasm_bg.wasm.d.ts (1 hunks)
  • src/ts/index.html (4 hunks)
  • src/ts/package.json (1 hunks)
✨ Finishing Touches
  • 📝 Generate Docstrings (Beta)

Thank you for using CodeRabbit. We offer it for free to the OSS community and would appreciate your support in helping us grow. If you find it useful, would you consider giving us a shout-out on your favorite social media?

❤️ Share
🪧 Tips

Chat

There are 3 ways to chat with CodeRabbit:

  • Review comments: Directly reply to a review comment made by CodeRabbit. Example:
    • I pushed a fix in commit <commit_id>, please review it.
    • Generate unit testing code for this file.
    • Open a follow-up GitHub issue for this discussion.
  • Files and specific lines of code (under the "Files changed" tab): Tag @coderabbitai in a new review comment at the desired location with your query. Examples:
    • @coderabbitai generate unit testing code for this file.
    • @coderabbitai modularize this function.
  • PR comments: Tag @coderabbitai in a new PR comment to ask questions about the PR branch. For the best results, please provide a very specific query, as very limited context is provided in this mode. Examples:
    • @coderabbitai gather interesting stats about this repository and render them as a table. Additionally, render a pie chart showing the language distribution in the codebase.
    • @coderabbitai read src/utils.ts and generate unit testing code.
    • @coderabbitai read the files in the src/scheduler package and generate a class diagram using mermaid and a README in the markdown format.
    • @coderabbitai help me debug CodeRabbit configuration file.

Note: Be mindful of the bot's finite context window. It's strongly recommended to break down tasks such as reading entire modules into smaller chunks. For a focused discussion, use review comments to chat about specific files and their changes, instead of using the PR comments.

CodeRabbit Commands (Invoked using PR comments)

  • @coderabbitai pause to pause the reviews on a PR.
  • @coderabbitai resume to resume the paused reviews.
  • @coderabbitai review to trigger an incremental review. This is useful when automatic reviews are disabled for the repository.
  • @coderabbitai full review to do a full review from scratch and review all the files again.
  • @coderabbitai summary to regenerate the summary of the PR.
  • @coderabbitai generate docstrings to generate docstrings for this PR. (Beta)
  • @coderabbitai resolve resolve all the CodeRabbit review comments.
  • @coderabbitai configuration to show the current CodeRabbit configuration for the repository.
  • @coderabbitai help to get help.

Other keywords and placeholders

  • Add @coderabbitai ignore anywhere in the PR description to prevent this PR from being reviewed.
  • Add @coderabbitai summary to generate the high-level summary at a specific location in the PR description.
  • Add @coderabbitai anywhere in the PR title to generate the title automatically.

CodeRabbit Configuration File (.coderabbit.yaml)

  • You can programmatically configure CodeRabbit by adding a .coderabbit.yaml file to the root of your repository.
  • Please see the configuration documentation for more information.
  • If your editor has YAML language server enabled, you can add the path at the top of this file to enable auto-completion and validation: # yaml-language-server: $schema=https://coderabbit.ai/integrations/schema.v2.json

Documentation and Community

  • Visit our Documentation for detailed information on how to use CodeRabbit.
  • Join our Discord Community to get help, request features, and share feedback.
  • Follow us on X/Twitter for updates and announcements.

Copy link
Contributor

deepsource-io bot commented Feb 13, 2025

Here's the code health analysis summary for commits 155df98..afadb32. View details on DeepSource ↗.

Analysis Summary

AnalyzerStatusSummaryLink
DeepSource Rust LogoRust❌ Failure
❗ 7 occurences introduced
🎯 2 occurences resolved
View Check ↗

💡 If you’re a repository administrator, you can configure the quality gates from the settings.

Copy link

@coderabbitai coderabbitai bot left a comment

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Actionable comments posted: 1

🔭 Outside diff range comments (1)
src/ts/index.html (1)

103-156: 🛠️ Refactor suggestion

Enhance error handling and query validation.

The implementation needs more robust error handling:

  1. Add input validation for the query structure
  2. Implement proper cleanup in case of errors
  3. Add retry logic for network failures
  4. Add loading state handling
     async function runQueryTest() {
+      const queryTestBtn = document.getElementById('query-test-btn');
+      queryTestBtn.disabled = true;
+      try {
-      console.log('Running query test...');
+        console.log('Running query test...');
-      const urlInput = document.getElementById('url-input');
-      const queryInput = document.getElementById('query-input');
-      const url = urlInput.value.trim();
-      const queryStr = queryInput.value.trim();
+        const urlInput = document.getElementById('url-input');
+        const queryInput = document.getElementById('query-input');
+        const url = urlInput.value.trim();
+        const queryStr = queryInput.value.trim();

-      if (!url) {
-        alert('Please enter a valid URL.');
-        return;
-      }
+        if (!url) {
+          throw new Error('Please enter a valid URL.');
+        }
+        if (!url.startsWith('https://')) {
+          throw new Error('URL must use HTTPS.');
+        }

-      let queryArray;
-      try {
-        queryArray = JSON.parse(queryStr);
-      } catch (e) {
-        alert('Invalid JSON for query.');
-        return;
-      }
+        let queryArray;
+        try {
+          queryArray = JSON.parse(queryStr);
+        } catch (e) {
+          throw new Error('Invalid JSON for query.');
+        }
+        
+        if (!Array.isArray(queryArray) || !queryArray.every(q => 
+          Array.isArray(q) && q.length === 3 && 
+          typeof q[0] === 'string' && 
+          typeof q[1] === 'string')) {
+          throw new Error('Invalid query format. Expected array of [string, string, any][]');
+        }

         // ... rest of the implementation ...

+      } finally {
+        queryTestBtn.disabled = false;
+      }
     }
🧹 Nitpick comments (14)
src/rust/fcb_core/src/http_reader/mod.rs (2)

239-301: New attribute-based feature selection is a solid addition.
The implementation correctly fetches the entire attribute index and processes entries into a MultiIndex, then queries it.

Consider a more incremental or chunked approach for enormous attribute indexes to avoid large memory consumption in a single range fetch.


518-538: SelectAttr implementation is straightforward but duplicates some logic with SelectBbox.

Consider abstracting out the shared logic for reading feature buffers into a small helper to reduce code drift.

src/rust/wasm/src/lib.rs (1)

280-348: Added select_attr_query mirroring the core logic for WASM.
Implementation properly retrieves and processes the attribute index with MultiIndex.

If the attribute index can be huge, consider partial reading or streaming similarly to bounding box queries.

src/ts/fcb_wasm.js (1)

418-470: New WasmAttrQuery class
The approach is solid. However, note that returning this explicitly from the constructor (lines 457-458) is a no-op in JavaScript.

-        return this;

Removing it avoids confusion, since constructors ignore a raw this return by default in JS.

🧰 Tools
🪛 Biome (1.9.4)

[error] 457-458: The constructor should not return a value.

The constructor is here:

Returning a value from a constructor is ignored.

(lint/correctness/noConstructorReturn)

src/rust/fcb_core/tests/http.rs (2)

41-52: Consider removing commented out code and using constants.

The query vector contains commented out conditions that should either be removed or uncommented. Also, consider extracting the magic number 10.0 into a named constant for better maintainability.

+const HEIGHT_THRESHOLD: f64 = 10.0;
 let query: Vec<(String, Operator, ByteSerializableValue)> = vec![
     (
         "b3_h_dak_50p".to_string(),
         Operator::Gt,
-        ByteSerializableValue::F64(OrderedFloat(10.0)),
+        ByteSerializableValue::F64(OrderedFloat(HEIGHT_THRESHOLD)),
     ),
-    // (
-    //     "identificatie".to_string(),
-    //     Operator::Eq,
-    //     ByteSerializableValue::String("NL.IMBAG.Pand.0503100000012869".to_string()),
-    // ),
 ];

93-94: Enhance test assertions.

The current assertions only verify basic conditions. Consider adding more comprehensive checks:

  1. Verify specific attribute values in the results
  2. Test edge cases (empty query, invalid operators)
  3. Test error conditions
src/ts/fcb_wasm.d.ts (1)

34-57: LGTM! Well-documented TypeScript definitions.

The WasmAttrQuery class is well-documented with clear examples. Consider adding:

  1. Documentation for supported operators (Gt, Eq, etc.)
  2. Type information for supported value types
src/rust/bst/src/query.rs (2)

130-130: Address the TODO comment about stream processing.

The comment indicates a need for improvement in stream processing and request handling. Consider implementing streaming to handle large result sets more efficiently.

Would you like me to help implement a streaming solution that processes results incrementally?


132-194: Consider refactoring to reduce code duplication.

The stream_query function shares significant logic with the query method. Consider extracting the common query logic into a shared private function to improve maintainability.

Here's a suggested refactor:

fn execute_query(indices: &HashMap<String, Box<dyn AnyIndex>>, conditions: &[QueryCondition]) -> Vec<ValueOffset> {
    let mut candidate_sets: Vec<HashSet<ValueOffset>> = Vec::new();
    
    for condition in conditions {
        if let Some(idx) = indices.get(&condition.field) {
            let offsets: Vec<ValueOffset> = match condition.operator {
                // ... existing operator match logic ...
            };
            candidate_sets.push(offsets.into_iter().collect());
        }
    }

    if candidate_sets.is_empty() {
        return vec![];
    }

    // Intersect candidate sets
    let mut intersection: HashSet<ValueOffset> = candidate_sets.first().unwrap().clone();
    for set in candidate_sets.iter().skip(1) {
        intersection = intersection.intersection(set).cloned().collect();
    }

    let mut result: Vec<ValueOffset> = intersection.into_iter().collect();
    result.sort();
    result
}

impl MultiIndex {
    pub fn query(&self, query: Query) -> Vec<ValueOffset> {
        execute_query(&self.indices, &query.conditions)
    }
}

#[cfg(feature = "http")]
pub async fn stream_query(
    m_indices: &MultiIndex,
    query: Query,
    feature_begin: usize,
) -> Result<Vec<HttpSearchResultItem>> {
    let offsets = execute_query(&m_indices.indices, &query.conditions);
    
    let http_ranges: Vec<HttpSearchResultItem> = offsets
        .into_iter()
        .map(|offset| HttpSearchResultItem {
            range: HttpRange::RangeFrom(offset as usize + feature_begin..),
        })
        .collect();

    Ok(http_ranges)
}
src/ts/package.json (1)

1-15: Restore essential package metadata and build configuration.

The removal of essential package metadata (author, license) and build configuration (scripts, dependencies) could affect:

  1. Package distribution and compliance
  2. Build and test processes
  3. Code minification (terser dependency)

Consider restoring these configurations or documenting why they were removed.

src/rust/bst/Cargo.toml (1)

6-9: LGTM! Consider adding feature documentation.

The feature configuration is well-structured:

  • Making packed_rtree optional and gating it behind the http feature improves modularity
  • Setting http as a default feature ensures backward compatibility

Consider adding documentation comments to explain the purpose and implications of each feature.

src/rust/wasm/Cargo.toml (1)

35-36:

❓ Verification inconclusive

Verify bst feature configuration and document dependency usage.

The new dependencies look good, but:

  1. Verify that the bst dependency inherits the default http feature
  2. Document why chrono was added

Run this script to verify the feature inheritance:


🏁 Script executed:

#!/bin/bash
# Description: Check if bst dependency enables the http feature by default

# Check if bst dependency in fcb_wasm explicitly disables default features
rg "bst.*default-features.*=.*false" src/rust/wasm/Cargo.toml

# Check if http feature is explicitly disabled
rg "bst.*features.*=.*\[(?!.*http.*\])" src/rust/wasm/Cargo.toml

Length of output: 388


Verify bst default features and document chrono usage

The added dependencies align with the PR’s objective, but please take these actions:

  • Verify in src/rust/wasm/Cargo.toml that the bst dependency does not disable its default features (ensuring that the http feature remains enabled based on bst/Cargo.toml).
  • Confirm in src/rust/bst/Cargo.toml that the default feature set indeed includes http.
  • Add a brief note explaining why chrono was added (e.g., for timestamp handling or related purposes).

For further verification, please run the following commands manually using PCRE2 (which supports look-around) to double-check the configuration:

#!/bin/bash
# Check that bst dependency does not disable default features in wasm Cargo.toml
rg --pcre2 'bst\s*=\s*{[^}]*default-features\s*=\s*false' src/rust/wasm/Cargo.toml

# Verify that bst/Cargo.toml includes "http" in the default feature list
rg --pcre2 'default\s*=\s*\[.*http.*\]' src/rust/bst/Cargo.toml

Please verify these configurations and update the documentation accordingly.

src/ts/index.html (2)

44-45: Review hardcoded URL to Google Storage.

The default URL points to a specific Google Storage bucket. Consider:

  1. Moving this to a configuration file
  2. Documenting the expected data format
  3. Adding error handling for CORS issues

76-94: Enhance feature iteration implementation.

Good implementation, but consider these improvements:

  1. Make the feature limit configurable
  2. Add memory management by cleaning up the iterator
  3. Consider streaming the features instead of collecting them all
-    async function iterateFeatures(iter) {
-      let count = 0;
-      while (true) {
+    async function iterateFeatures(iter, limit = 10) {
+      let count = 0;
+      try {
+        while (true) {
-        log(`Fetching feature ${count + 1}...`);
-        const feature = await iter.next();
-        if (feature === undefined || feature === null) {
-          log('No more features.');
-          break;
-        }
-        log(`Feature ${count + 1}: ${JSON.stringify(feature, null, 2)}`);
-        count++;
-        // Limit iteration to avoid excessive logs
-        if (count >= 10) {
-          log('Reached feature iteration limit (10).');
-          break;
+          log(`Fetching feature ${count + 1}...`);
+          const feature = await iter.next();
+          if (feature === undefined || feature === null) {
+            log('No more features.');
+            break;
+          }
+          log(`Feature ${count + 1}: ${JSON.stringify(feature, null, 2)}`);
+          count++;
+          if (count >= limit) {
+            log(`Reached feature iteration limit (${limit}).`);
+            break;
+          }
+        }
+      } finally {
+        // Clean up the iterator
+        if (iter.free) {
+          iter.free();
+        }
+      }
+      log(`Total features fetched: ${count}`);
-      }
-      log(`Total features fetched: ${count}`);
     }
📜 Review details

Configuration used: CodeRabbit UI
Review profile: CHILL
Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 155df98 and bb90aa6.

⛔ Files ignored due to path filters (1)
  • src/ts/fcb_wasm_bg.wasm is excluded by !**/*.wasm
📒 Files selected for processing (18)
  • src/rust/bst/Cargo.toml (1 hunks)
  • src/rust/bst/src/byte_serializable.rs (1 hunks)
  • src/rust/bst/src/query.rs (2 hunks)
  • src/rust/fcb_core/src/http_reader/mod.rs (7 hunks)
  • src/rust/fcb_core/src/http_reader/wasm_client.rs (0 hunks)
  • src/rust/fcb_core/src/lib.rs (1 hunks)
  • src/rust/fcb_core/src/reader/attr_query.rs (2 hunks)
  • src/rust/fcb_core/tests/http.rs (2 hunks)
  • src/rust/makefile (1 hunks)
  • src/rust/packed_rtree/src/lib.rs (2 hunks)
  • src/rust/wasm/Cargo.toml (1 hunks)
  • src/rust/wasm/src/lib.rs (8 hunks)
  • src/ts/.gitignore (1 hunks)
  • src/ts/fcb_wasm.d.ts (2 hunks)
  • src/ts/fcb_wasm.js (10 hunks)
  • src/ts/fcb_wasm_bg.wasm.d.ts (1 hunks)
  • src/ts/index.html (4 hunks)
  • src/ts/package.json (1 hunks)
💤 Files with no reviewable changes (1)
  • src/rust/fcb_core/src/http_reader/wasm_client.rs
✅ Files skipped from review due to trivial changes (2)
  • src/ts/.gitignore
  • src/rust/makefile
🧰 Additional context used
🪛 Biome (1.9.4)
src/ts/fcb_wasm.js

[error] 457-458: The constructor should not return a value.

The constructor is here:

Returning a value from a constructor is ignored.

(lint/correctness/noConstructorReturn)

🔇 Additional comments (24)
src/rust/fcb_core/src/http_reader/mod.rs (8)

2-2: Import statements look appropriate.
No concerns: the newly imported items are used below without apparent issues.


10-10: Import from bst is valid.
Nothing to fix: it's consistent with usage in the new select_attr_query logic.


135-144: R-tree index size calculation appears correct.
It properly checks for non-empty index and feature count, then delegates to PackedRTree::index_size.


146-164: Attribute index size calculation is well-structured.
The overflow check is a good safety measure. Returning u64 is consistent with the R-tree calculation logic.


207-207: Potentially large attribute index on 32-bit systems.
Casting u64 to usize can overflow on 32-bit targets if datasets are enormous. Verify whether you support 32-bit systems or want to safeguard this.


211-211: Passing the attribute index size to the R-tree search is consistent with the new logic.
No issues found here.


342-342: Enum variant for SelectAttr is aligned with the new selection mode.
No concerns.


353-353: Properly handling SelectAttr in next_feature_buffer.
Integration is smooth. No issues found.

src/rust/wasm/src/lib.rs (9)

6-7: Logging and JS bridging imports look correct.
No issues found.


10-10: Serialization imports are valid.
They match the usage of serde for bridging data to/from JS.


14-14: Extended bst imports.
No concerns: they align with the new attribute-query approach.


18-18: chrono import for date/time handling is appropriate.
Matches usage in WasmAttrQuery and date conversions.


21-23: Combined import from fcb_core for process utilities.
This grouping is logically consistent.


62-62: #[wasm_bindgen(start)] attribute recognized.
This sets up the module initialization on the WASM side. No concerns.


67-68: Runtime initialization with a custom logger.
Good approach for debugging in WASM. No issues found.


170-179: R-tree index size computation mirrors the HTTP reader logic.
No concerns: consistent approach for WASM.


181-199: Attribute index size calculation in WASM environment.
Includes the overflow check and u64 return. Matches the rest of the design.

src/ts/fcb_wasm.js (2)

234-239: Helper _assertClass
Appropriate to validate the WASM object instance type.


405-415: select_attr_query(query) bridging to WASM.
Implementation matches the WASM function. No issues found.

src/rust/fcb_core/src/lib.rs (1)

4-4: LGTM! Making the module public is consistent with its usage.

The change to make the fb module public aligns with its existing public re-export and supports the implementation of attribute index functionality.

src/ts/fcb_wasm_bg.wasm.d.ts (1)

10-10: LGTM! WASM bindings are properly defined.

The new functions for attribute query support are correctly exported and match the TypeScript definitions.

Also applies to: 15-17

src/rust/bst/src/byte_serializable.rs (1)

3-3: LGTM! Good visibility change.

Making OrderedFloat public is the right choice since it's used in public types and implementations. This change follows Rust's visibility best practices.

src/rust/fcb_core/src/reader/attr_query.rs (1)

17-17: LGTM! Appropriate visibility changes.

Making process_attr_index_entry and build_query public is correct as they're needed for the new HTTP feature implementation. The functions maintain proper encapsulation and error handling.

Also applies to: 88-88

src/rust/packed_rtree/src/lib.rs (1)

570-571: LGTM! Correct offset calculation adjustment.

The addition of attr_index_size parameter and its inclusion in the feature_begin calculation is correct. This ensures proper offset calculation when attribute indices are present.

Also applies to: 586-587

Comment on lines 105 to 106
let res =
read_http_file_bbox("https://storage.googleapis.com/flatcitybuf/delft_attr.fcb").await;
Copy link

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

💡 Verification agent

🧩 Analysis chain

Consider using local test data.

The test depends on an external URL which could make tests flaky if the resource becomes unavailable. Consider downloading the test data and storing it in the repository or using a mock HTTP server for testing.


🏁 Script executed:

#!/bin/bash
# Check if the test data is accessible
curl -I "https://storage.googleapis.com/flatcitybuf/delft_attr.fcb"

Length of output: 1263


Action Required: Remove external dependency from HTTP test.
While the remote URL currently responds successfully, relying on an external resource—as seen in src/rust/fcb_core/tests/http.rs at lines 105-106—can lead to flaky tests if the resource becomes unavailable or slow to respond. To enhance test stability, please consider one of the following:

  • Storing the test data locally in the repository
  • Using a mock HTTP server to simulate the external call

@HideBa HideBa merged commit a21918b into main Feb 13, 2025
3 of 5 checks passed
@HideBa HideBa deleted the feat/bst-wasm branch February 13, 2025 10:41
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

Successfully merging this pull request may close these issues.

1 participant