Skip to content

fix/rn-messaging-layer#441

Merged
IAmKio merged 5 commits intostagingfrom
fix/rn-messaging-layer
Oct 24, 2025
Merged

fix/rn-messaging-layer#441
IAmKio merged 5 commits intostagingfrom
fix/rn-messaging-layer

Conversation

@IAmKio
Copy link
Collaborator

@IAmKio IAmKio commented Oct 24, 2025

Description

  • Added enhanced messaging transport between Pillar Wallet and PillarX to capture all message channels

How Has This Been Tested?

  • Locally and using emulated devices

Screenshots (if appropriate):

Types of changes

  • Bug fix (non-breaking change which fixes an issue)
  • New feature (non-breaking change which adds functionality)
  • Breaking change (fix or feature that would cause existing functionality to change)

Summary by CodeRabbit

  • Bug Fixes

    • Improved device-platform detection with better prioritization, fallback and conditional persistence; enhanced logging of resolved sources.
    • Broadened cross-context messaging support for native app webviews and browsers so authentication messages are handled more reliably.
    • Removed noisy breadcrumbs/analytics during auth flow to reduce extraneous logging.
  • Chores

    • Enabled HTTPS for local dev server and added tooling to support local SSL.

@IAmKio IAmKio requested a review from RanaBug October 24, 2025 11:11
@IAmKio IAmKio self-assigned this Oct 24, 2025
@coderabbitai
Copy link
Contributor

coderabbitai bot commented Oct 24, 2025

Walkthrough

Added basic-ssl plugin and enabled HTTPS in Vite; updated React Native platform detection to prefer URL param and persist only when URL-provided; expanded Pillar Wallet messaging to support RN-style document and custom pillarWalletMessage events, removed Sentry breadcrumbs, and simplified some function signatures.

Changes

Cohort / File(s) Summary
Build & Configuration
package.json, vite.config.js
Added @vitejs/plugin-basic-ssl (also added to devDependencies), included the plugin in Vite config, enabled HTTPS and set server host to 0.0.0.0.
React Native Platform Detection
src/containers/Main.tsx
Read devicePlatform from URL and from localStorage (DEVICE_PLATFORM), prefer URL value, log both source values and resolved value, and only write DEVICE_PLATFORM to localStorage when URL-provided.
Pillar Wallet Messaging
src/utils/pillarWalletMessaging.ts
Removed Sentry breadcrumbs and related analytics logging; changed requestPrivateKey() signature to no-args and createWebViewMessageHandler() to accept only success/error callbacks; added document.addEventListener('message', ...) and custom pillarWalletMessage window event handlers; augmented global Document typing; unified cross-context message handling and extended cleanup to remove new listeners.

Sequence Diagram(s)

sequenceDiagram
    participant URL as URL params
    participant Storage as localStorage
    participant Main as Main.tsx
    participant App as App

    Main->>URL: read devicePlatformFromUrl
    Main->>Storage: read devicePlatformFromStorage
    alt devicePlatformFromUrl present
        Main->>Main: resolved = devicePlatformFromUrl
        Main->>Storage: write DEVICE_PLATFORM
    else
        Main->>Main: resolved = devicePlatformFromStorage
    end
    Main->>App: pass resolved devicePlatform
    Main->>Main: log devicePlatformFromUrl, devicePlatformFromStorage, resolved
Loading
sequenceDiagram
    participant RNWebview as RN Webview
    participant Document as document
    participant Window as window (custom)
    participant Handler as message handler

    RNWebview->>Document: dispatch 'message' (string payload)
    Document->>Document: parse payload
    Document->>Handler: forward parsed message (e.g., pillarWalletPkResponse)

    RNWebview->>Window: emit custom event 'pillarWalletMessage' (detail payload)
    Window->>Window: parse event.detail
    Window->>Handler: forward parsed message

    Handler->>Handler: invoke onSuccess / onError (no change to core success path)
Loading

Estimated code review effort

🎯 3 (Moderate) | ⏱️ ~20 minutes

Poem

🐰 I found a shiny SSL key,
URL wins the platform spree,
Webviews knock with messages new,
Listeners stretch to catch the view,
Hops and logs — a nimble me!

Pre-merge checks and finishing touches

❌ Failed checks (1 warning)
Check name Status Explanation Resolution
Docstring Coverage ⚠️ Warning Docstring coverage is 0.00% which is insufficient. The required threshold is 80.00%. You can run @coderabbitai generate docstrings to improve docstring coverage.
✅ Passed checks (2 passed)
Check name Status Explanation
Title Check ✅ Passed The title "fix/rn-messaging-layer" clearly and specifically identifies the core change in this PR. The raw_summary shows that the most substantial modifications are in src/utils/pillarWalletMessaging.ts, which implements enhanced messaging transport between Pillar Wallet and PillarX by adding support for multiple message channels (document 'message' events, custom window events, and retry behavior). While the PR includes supporting changes (SSL setup in vite.config.js and device platform context handling in Main.tsx), the title accurately captures the main focus of the changeset. The title is concise, descriptive, and not vague or generic.
Description Check ✅ Passed The PR description addresses all required template sections with the main parts completed. The "Description" section provides a clear summary of the enhanced messaging transport changes, and the "Types of changes" section is properly filled out with "Bug fix" selected. However, the "How Has This Been Tested?" section is present but lacks detail—it only states "Locally and using emulated devices" without explaining what specific tests were performed, what environments were used, or how the changes were validated. Despite this brevity, the description is mostly complete with all major sections addressed, which meets the pass threshold for this check.
✨ Finishing touches
  • 📝 Generate docstrings
🧪 Generate unit tests (beta)
  • Create PR with unit tests
  • Post copyable unit tests in a comment
  • Commit unit tests in branch fix/rn-messaging-layer

Warning

There were issues while running some tools. Please review the errors and either fix the tool's configuration or disable the tool if it's a critical failure.

🔧 ast-grep (0.39.6)
src/utils/pillarWalletMessaging.ts

[
{
"text": "window.postMessage(JSON.stringify(message), '')",
"range": {
"byteOffset": {
"start": 1570,
"end": 1618
},
"start": {
"line": 70,
"column": 4
},
"end": {
"line": 70,
"column": 52
}
},
"file": "src/utils/pillarWalletMessaging.ts",
"lines": " window.postMessage(JSON.stringify(message), '
');",
"charCount": {
"leading": 4,
"trailing": 1
},
"language": "TypeScript",
"ruleId": "message-origin-validation",
"severity": "warning",
"note": "[CWE-923] Improper Restriction of Communication Channel to Intended Endpoints [REFERENCES]\n - https://developer.mozilla.org/en-US/docs/Web/API/Window/postMessage\n - https://cwe.mitre.org/data/definitions/923.html",
"message": "Detected usage of wildcard '' as origin in postMessage. Always specify an exact target origin instead of using '' to prevent sensitive data from being sent to malicious websites and avoid spoofing attacks.",
"labels"

... [truncated 5313 characters] ...

"style": "secondary"
},
{
"text": "''",
"range": {
"byteOffset": {
"start": 1614,
"end": 1617
},
"start": {
"line": 70,
"column": 48
},
"end": {
"line": 70,
"column": 51
}
},
"style": "secondary"
},
{
"text": "(JSON.stringify(message), '
')",
"range": {
"byteOffset": {
"start": 1588,
"end": 1618
},
"start": {
"line": 70,
"column": 22
},
"end": {
"line": 70,
"column": 52
}
},
"style": "secondary"
}
]
}
]
Error: 1 error(s) found in code.
Help: Scan succeeded and found error level diagnostics in the codebase.


Thanks for using CodeRabbit! It's free for OSS, and your support helps us grow. If you like it, consider giving us a shout-out.

❤️ Share

Comment @coderabbitai help to get the list of available commands and usage tips.

@IAmKio IAmKio marked this pull request as ready for review October 24, 2025 11:12
Copy link
Contributor

@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: 0

🧹 Nitpick comments (1)
src/utils/pillarWalletMessaging.ts (1)

244-246: Silent error handling may complicate debugging.

The empty catch blocks intentionally ignore JSON parsing errors. While this prevents non-JSON messages from breaking the handler, it makes debugging harder when legitimate messages fail to parse.

Consider logging parse failures at a lower severity level:

     } catch (e) {
-      // Ignore parsing errors
+      // Non-JSON message, ignore
+      Sentry.addBreadcrumb({
+        category: 'authentication',
+        message: 'Non-JSON message ignored in document handler',
+        level: 'debug',
+      });
     }

Also applies to: 266-268

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 06daea5 and 92e7dd1.

⛔ Files ignored due to path filters (1)
  • package-lock.json is excluded by !**/package-lock.json
📒 Files selected for processing (4)
  • package.json (1 hunks)
  • src/containers/Main.tsx (3 hunks)
  • src/utils/pillarWalletMessaging.ts (3 hunks)
  • vite.config.js (2 hunks)
🧰 Additional context used
🧠 Learnings (1)
📚 Learning: 2025-10-15T10:31:06.760Z
Learnt from: IAmKio
PR: pillarwallet/x#432
File: src/containers/Main.tsx:135-141
Timestamp: 2025-10-15T10:31:06.760Z
Learning: In src/containers/Main.tsx, the React Native webview messaging setup intentionally only activates when the `devicePlatform` URL parameter is present ('ios' or 'android'). On reloads or direct navigation without URL params, the site should behave normally and not attempt to re-establish RN messaging. This is by design to ensure the site functions properly in both RN webview and standard browser contexts.

Applied to files:

  • src/containers/Main.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (2)
  • GitHub Check: lint
  • GitHub Check: unit-tests
🔇 Additional comments (10)
vite.config.js (2)

6-6: LGTM! SSL plugin correctly integrated.

The @vitejs/plugin-basic-ssl import and plugin registration are correctly implemented.

Also applies to: 9-9


29-32: Note: Dev server exposed on all network interfaces.

Setting host: '0.0.0.0' makes the HTTPS dev server accessible from any network interface. While this is necessary for testing with mobile devices and React Native webviews, ensure this configuration is only used in development environments and not in production.

src/containers/Main.tsx (3)

138-144: Verify: Platform detection behavior change may conflict with documented approach.

The code now uses localStorage as a fallback when the URL parameter is absent (devicePlatform = devicePlatformFromUrl || devicePlatformFromStorage). This means React Native messaging will activate on page reloads even without the URL parameter, as long as localStorage contains the value.

According to retrieved learnings, "the React Native webview messaging setup intentionally only activates when the devicePlatform URL parameter is present" and "on reloads or direct navigation without URL params, the site should behave normally and not attempt to re-establish RN messaging."

The new behavior appears to contradict this design. If this is an intentional enhancement (consistent with the PR's goal of "enhanced messaging transport"), please confirm and update the documentation. Based on learnings.


151-152: Good addition: Enhanced logging visibility.

Including both devicePlatformFromUrl and devicePlatformFromStorage in the breadcrumb improves debugging and visibility into the platform detection logic.


161-163: Note the conditional persistence behavior.

localStorage is now only updated when devicePlatformFromUrl exists, preventing unconditional writes of the resolved platform value. This ensures the stored value always originates from an explicit URL parameter.

src/utils/pillarWalletMessaging.ts (4)

100-100: Good enhancement: Raw data logging.

Adding rawData: event.data to the breadcrumb improves debugging capabilities by preserving the original message payload.


229-248: Broader compatibility but note the non-standard API usage.

The documentMessageHandler expands React Native webview message compatibility. However, document.addEventListener('message', ...) (line 252) is non-standard and may not work consistently across all React Native webview implementations.

Consider logging when these alternative handlers successfully receive messages to confirm they're actually being used in your target environments:

       if (data?.type === 'pillarWalletPkResponse') {
+        Sentry.addBreadcrumb({
+          category: 'authentication',
+          message: 'Message received via document event handler',
+          level: 'info',
+          data: { authRequestId },
+        });
         // Create a proper MessageEvent and call our handler
         const messageEvent = new MessageEvent('message', {
           data: event.data,
         });
         messageHandler(messageEvent);
       }

250-275: Custom event handler adds another compatibility layer.

The customEventHandler listening for 'pillarWalletMessage' events provides an additional message channel. This is a reasonable approach for environments where standard messaging doesn't work.


283-290: Cleanup correctly removes all listeners.

The cleanup function properly removes all three event listeners (window message, document message, and custom event) and clears the timeout, preventing memory leaks.

package.json (1)

114-114: No issues found—package version is valid and has no known security vulnerabilities.

Version 2.1.0 of @vitejs/plugin-basic-ssl is a valid published version, and there are no known security vulnerabilities for this package. The dependency as specified is appropriate.

@github-actions github-actions bot temporarily deployed to Preview (fix/rn-messaging-layer) October 24, 2025 11:29 Inactive
@cloudflare-workers-and-pages
Copy link

cloudflare-workers-and-pages bot commented Oct 24, 2025

Deploying x with  Cloudflare Pages  Cloudflare Pages

Latest commit: 94a4cec
Status: ✅  Deploy successful!
Preview URL: https://87deba03.x-e62.pages.dev
Branch Preview URL: https://fix-rn-messaging-layer.x-e62.pages.dev

View logs

Copy link
Contributor

@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: 2

🧹 Nitpick comments (2)
src/utils/pillarWalletMessaging.ts (2)

46-55: Document interface augmentation is non-standard - consider documenting the constraint.

The Document interface augmentation for 'message' events is specific to React Native webview behavior and deviates from standard Web APIs. While this enables the necessary functionality, consider adding a JSDoc comment explaining this is a React Native-specific workaround to prevent confusion for future maintainers.

Apply this diff to add clarifying documentation:

+  /**
+   * React Native webview-specific augmentation.
+   * Standard Document interface does not support 'message' events.
+   * This augmentation enables document-level message handling in RN webviews.
+   */
   interface Document {
     addEventListener(
       type: 'message',
       listener: (event: MessageEvent) => void
     ): void;
     removeEventListener(
       type: 'message',
       listener: (event: MessageEvent) => void
     ): void;
   }

240-286: Refactor duplicated message forwarding logic.

The documentMessageHandler (lines 240-259) and customEventHandler (lines 265-286) contain nearly identical logic: parse stringified data, check for pillarWalletPkResponse type, create a MessageEvent, and forward to the main handler. This duplication increases maintenance burden.

Extract the common pattern into a helper function:

+  // Helper to forward messages to the main handler
+  const forwardMessage = (rawData: string) => {
+    try {
+      const data = JSON.parse(rawData);
+      if (data?.type === 'pillarWalletPkResponse') {
+        const messageEvent = new MessageEvent('message', { data: rawData });
+        messageHandler(messageEvent);
+      }
+    } catch (e) {
+      // Ignore parsing errors - message not intended for us
+    }
+  };
+
   // For React Native webview, we also need to listen for direct document events
   // React Native webview messages sometimes come through document events
   const documentMessageHandler = (event: MessageEvent) => {
-    // Check if this is a React Native webview message
     if (event.data && typeof event.data === 'string') {
-      try {
-        const data = JSON.parse(event.data);
-
-        if (data?.type === 'pillarWalletPkResponse') {
-          // Create a proper MessageEvent and call our handler
-          const messageEvent = new MessageEvent('message', {
-            data: event.data,
-          });
-          messageHandler(messageEvent);
-        }
-      } catch (e) {
-        // Ignore parsing errors
-      }
+      forwardMessage(event.data);
     }
   };
 
   // Listen for document events (React Native webview specific)
   // Note: document.addEventListener('message') is not standard, but some React Native webviews use it
   document.addEventListener('message', documentMessageHandler);
 
   // Also listen for custom events that might be triggered by React Native
   const customEventHandler = (event: CustomEvent) => {
     if (event.detail && typeof event.detail === 'string') {
-      try {
-        const data = JSON.parse(event.detail);
-
-        if (data?.type === 'pillarWalletPkResponse') {
-          const messageEvent = new MessageEvent('message', {
-            data: event.detail,
-          });
-          messageHandler(messageEvent);
-        }
-      } catch (e) {
-        // Ignore parsing errors
-      }
+      forwardMessage(event.detail);
     }
   };
📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between 92e7dd1 and a20d14d.

📒 Files selected for processing (2)
  • src/containers/Main.tsx (3 hunks)
  • src/utils/pillarWalletMessaging.ts (4 hunks)
🚧 Files skipped from review as they are similar to previous changes (1)
  • src/containers/Main.tsx
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: unit-tests
  • GitHub Check: lint
  • GitHub Check: build
🔇 Additional comments (1)
src/utils/pillarWalletMessaging.ts (1)

294-302: LGTM: Cleanup properly removes all event listeners.

The cleanup function correctly removes all three event listeners (window message, document message, and custom pillarWalletMessage) and clears the timeout, ensuring no memory leaks from lingering event handlers.

@github-actions github-actions bot temporarily deployed to Preview (fix/rn-messaging-layer) October 24, 2025 11:36 Inactive
},
server: {
https: true,
host: '0.0.0.0',
Copy link
Collaborator

Choose a reason for hiding this comment

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

do we want the local host to always be 0.0.0.0? Or leave it as it was before?

messageHandler(messageEvent);
}
} catch (e) {
// Ignore parsing errors
Copy link
Collaborator

Choose a reason for hiding this comment

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

Are we sure we do not want to add anything in the catch?

messageHandler(messageEvent);
}
} catch (e) {
// Ignore parsing errors
Copy link
Collaborator

Choose a reason for hiding this comment

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

same comment as above

@github-actions github-actions bot temporarily deployed to Preview (staging) October 24, 2025 12:05 Inactive
Copy link
Contributor

@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

Caution

Some comments are outside the diff and can’t be posted inline due to platform limitations.

⚠️ Outside diff range comments (1)
src/utils/pillarWalletMessaging.ts (1)

121-202: Implement deduplication to prevent multiple onSuccess invocations.

Three event listeners (window.addEventListener('message'), document.addEventListener('message'), window.addEventListener('pillarWalletMessage')) handle the same incoming message concurrently. A single RN webview message can trigger all three listeners, causing onSuccess to be called multiple times with identical credentials.

While the previous review marked deduplication as "addressed," the current code only removed Sentry logging (which eliminated duplicate log entries) but did not implement actual message deduplication. The onSuccess callback can still be invoked multiple times.

Add a deduplication guard using one of these approaches:

Option 1: Single-use flag (simplest):

export const setupPillarWalletMessaging = (
  onSuccess: OnPrivateKeyReceivedCallback,
  onError: OnErrorCallback
): (() => void) => {
  let processed = false;
  
  const wrappedOnSuccess: OnPrivateKeyReceivedCallback = (address, privateKey) => {
    if (processed) return;
    processed = true;
    
    // Immediately remove all listeners
    cleanup();
    
    onSuccess(address, privateKey);
  };

  const messageHandler = createWebViewMessageHandler(wrappedOnSuccess, onError);
  // ... rest of setup

Option 2: Track by message content (more robust):

const processedMessages = new Set<string>();

const wrappedOnSuccess: OnPrivateKeyReceivedCallback = (address, privateKey) => {
  const messageKey = `${address}:${privateKey.slice(0, 10)}`;
  if (processedMessages.has(messageKey)) return;
  processedMessages.add(messageKey);
  
  onSuccess(address, privateKey);
};

Option 1 is recommended for single authentication flows.

♻️ Duplicate comments (1)
src/utils/pillarWalletMessaging.ts (1)

172-178: Same infinite retry loop issue as documentMessageHandler.

This catch block has the identical unbounded retry logic as the documentMessageHandler (lines 146-152). Apply the same fix to prevent infinite retries on persistent parse errors.

🧹 Nitpick comments (1)
src/utils/pillarWalletMessaging.ts (1)

60-73: Consider reintroducing request correlation for better tracking.

Removing the authRequestId parameter eliminates the ability to correlate requests with responses. While this simplifies the API, it makes it impossible to:

  • Implement request/response matching for deduplication
  • Debug which request triggered which response
  • Handle concurrent authentication flows

If only one authentication flow is active at a time, this is acceptable. Otherwise, consider reintroducing a request ID mechanism.

📜 Review details

Configuration used: CodeRabbit UI

Review profile: CHILL

Plan: Pro

📥 Commits

Reviewing files that changed from the base of the PR and between a20d14d and 94a4cec.

📒 Files selected for processing (1)
  • src/utils/pillarWalletMessaging.ts (2 hunks)
⏰ Context from checks skipped due to timeout of 90000ms. You can increase the timeout in your CodeRabbit configuration to a maximum of 15 minutes (900000ms). (3)
  • GitHub Check: unit-tests
  • GitHub Check: lint
  • GitHub Check: build
🔇 Additional comments (3)
src/utils/pillarWalletMessaging.ts (3)

44-54: Verify runtime support for non-standard Document 'message' event.

The Document interface augmentation enables TypeScript compilation, but document.addEventListener('message') is not a standard DOM API. While some React Native webview implementations may support this, behavior is platform-specific and could break across different RN versions or platforms (iOS vs Android).

Consider testing on target platforms and adding runtime checks:

if (typeof (document as any).addEventListener === 'function') {
  try {
    document.addEventListener('message', documentMessageHandler);
  } catch (e) {
    console.warn('document.addEventListener("message") not supported:', e);
  }
}

Alternatively, document which RN webview versions/platforms require this approach.


81-113: LGTM! Clean implementation of message handling and validation.

The private key processing logic is sound:

  • Proper parsing with error handling
  • Uses viem to derive and validate the address
  • Appropriate error callbacks for cryptographic failures
  • Silent catch for parsing errors (expected for non-target messages)

193-201: LGTM! Comprehensive cleanup of all event listeners.

The cleanup function properly removes all three event listeners (window, document, custom) and clears the timer. This prevents memory leaks and ensures clean teardown.

Comment on lines +146 to +152
} catch (e) {
console.error('Error parsing document message, retrying in 5s:', e);
// Retry request every 5 seconds on parsing errors
setTimeout(() => {
requestPrivateKey();
}, 5000);
}
Copy link
Contributor

Choose a reason for hiding this comment

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

⚠️ Potential issue | 🟠 Major

Risk of infinite retry loop on persistent parse errors.

The catch block retries requestPrivateKey() every 5 seconds on any parsing error. If the error is persistent (e.g., malformed data from another message source), this creates an unbounded retry loop that:

  • Continuously sends authentication requests
  • Consumes resources
  • May spam the console with errors

Consider these alternatives:

Option 1: Remove retry logic (recommended for parse errors):

      } catch (e) {
        console.error('Error parsing document message:', e);
-       // Retry request every 5 seconds on parsing errors
-       setTimeout(() => {
-         requestPrivateKey();
-       }, 5000);
      }

Option 2: Add bounded retry with exponential backoff:

let retryCount = 0;
const MAX_RETRIES = 3;

// In catch block:
if (retryCount < MAX_RETRIES) {
  retryCount++;
  setTimeout(() => requestPrivateKey(), Math.min(1000 * Math.pow(2, retryCount), 30000));
}

Parsing errors typically indicate wrong message format, not transient failures, so Option 1 is preferred.

🤖 Prompt for AI Agents
In src/utils/pillarWalletMessaging.ts around lines 146 to 152, the catch block
currently retries requestPrivateKey() every 5s on any parse error which can
create an infinite retry loop; remove the unconditional retry and instead either
(preferred) drop the retry logic entirely for parse errors (just log and return)
or (alternative) implement a bounded retry: add a retry counter (module/closure
scope) and MAX_RETRIES, increment on each failure, schedule requestPrivateKey()
with exponential backoff only while retryCount < MAX_RETRIES, reset retryCount
on a successful parse, and emit a final error log when the max is reached so
retries stop and the system doesn’t spam requests.

@IAmKio IAmKio merged commit bfdedf6 into staging Oct 24, 2025
6 checks passed
@IAmKio IAmKio deleted the fix/rn-messaging-layer branch October 24, 2025 12:10
@coderabbitai coderabbitai bot mentioned this pull request Nov 7, 2025
3 tasks
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.

2 participants