Skip to main content

Browser Compatibility

This document covers browser support and compatibility considerations for Tombatron.Turbo.

Supported Browsers​

The client-side JavaScript requires:

  • Custom Elements (Web Components)
  • SignalR JavaScript client
  • ES2015+ JavaScript

Desktop Browsers​

BrowserMinimum VersionStatus
Chrome67+Fully supported
Firefox63+Fully supported
Safari10.1+Fully supported
Edge79+ (Chromium)Fully supported
Edge Legacy16-18Requires polyfills
Internet Explorer-Not supported

Mobile Browsers​

BrowserMinimum VersionStatus
Chrome (Android)67+Fully supported
Safari (iOS)10.3+Fully supported
Firefox (Android)63+Fully supported
Samsung Internet9.0+Fully supported

Feature Requirements​

Custom Elements​

The <turbo-stream-source-signalr> component uses the Custom Elements API:

class TurboStreamSourceSignalR extends HTMLElement {
connectedCallback() { /* ... */ }
disconnectedCallback() { /* ... */ }
}
customElements.define('turbo-stream-source-signalr', TurboStreamSourceSignalR);

Polyfill for older browsers:

<script src="https://unpkg.com/@webcomponents/custom-elements"></script>

SignalR Transport​

SignalR supports multiple transports with automatic fallback:

  1. WebSockets (preferred) - Best performance, real-time
  2. Server-Sent Events - Fallback for when WebSockets unavailable
  3. Long Polling - Final fallback for older environments

The library automatically selects the best available transport.

WebSockets​

WebSockets are supported in all modern browsers. Potential issues:

  • Corporate proxies may block WebSocket connections
  • Some load balancers require specific configuration

Testing WebSocket availability:

if ('WebSocket' in window) {
console.log('WebSockets supported');
}

Turbo.js Compatibility​

Tombatron.Turbo is designed to work with Hotwire Turbo:

<!-- Include Turbo.js -->
<script type="module">
import * as Turbo from 'https://esm.sh/@hotwired/turbo@8';
</script>

<!-- Include the SignalR streaming component -->
<script src="_content/Tombatron.Turbo/dist/turbo-signalr.bundled.min.js"></script>

Turbo.js Version Compatibility​

Turbo.js VersionStatus
8.xFully supported
7.xFully supported

Known Issues​

iOS Safari WebSocket Disconnect​

iOS Safari may disconnect WebSocket connections when the app is backgrounded. The library handles this with automatic reconnection:

// Automatic resubscription on reconnect
connection.onreconnected = () => {
// All active streams are resubscribed
};

Corporate Proxy Blocking​

Some corporate proxies block WebSocket connections. SignalR will fall back to Server-Sent Events or Long Polling automatically.

For environments where this is common, you can force a specific transport:

// Force Long Polling (not recommended for performance)
const connection = new signalR.HubConnectionBuilder()
.withUrl("/turbo-stream", { transport: signalR.HttpTransportType.LongPolling })
.build();

Ad Blockers​

Some ad blockers may interfere with SignalR connections. Test with common ad blockers:

  • uBlock Origin
  • AdBlock Plus
  • Brave Shield

Testing Recommendations​

Cross-Browser Testing​

Test your application in:

  1. Chrome (latest)
  2. Firefox (latest)
  3. Safari (latest)
  4. Edge (latest)
  5. Mobile Chrome (Android)
  6. Mobile Safari (iOS)

Tools for Testing​

  • BrowserStack - Cross-browser testing platform
  • Sauce Labs - Automated browser testing
  • Playwright - End-to-end testing across browsers

Playwright Example​

const { chromium, firefox, webkit } = require('playwright');

for (const browserType of [chromium, firefox, webkit]) {
const browser = await browserType.launch();
const context = await browser.newContext();
const page = await context.newPage();

await page.goto('http://localhost:5000');

// Wait for SignalR connection
await page.waitForFunction(() =>
window.turboSignalRConnection?.state === 'Connected'
);

// Test stream updates
// ...

await browser.close();
}

Fallback Strategies​

No JavaScript​

For users with JavaScript disabled, Turbo Frames still work with standard navigation:

<turbo-frame id="content">
<!-- Content loads via standard HTTP request -->
<a href="/page">Load Content</a>
</turbo-frame>

Turbo Streams require JavaScript and will not function without it. Consider:

  • Progressive enhancement for critical features
  • Server-side alternatives for essential updates

No WebSocket Support​

If WebSockets are unavailable, SignalR falls back automatically. For very old browsers, consider:

<!-- Polling fallback for critical updates -->
<turbo-frame id="notifications" src="/api/notifications"
data-turbo-refresh-method="morph"
data-turbo-refresh-scroll="preserve">
<!-- Poll for updates instead of streaming -->
</turbo-frame>

Performance Considerations by Browser​

Chrome​

  • Best WebSocket performance
  • Efficient JavaScript execution
  • Best DevTools for debugging

Firefox​

  • Excellent WebSocket support
  • Good performance overall
  • Useful network debugging tools

Safari​

  • WebSocket connections may be limited on mobile
  • Background tabs may disconnect
  • Test thoroughly on iOS

Edge​

  • Performance similar to Chrome (same engine)
  • Good enterprise compatibility