Fix: handle missing MessageEvent in React Native (Hermes engine)

Aperta Adatta ai principianti
#401 0 commenti 1 reazione 0 assegnatari Vedi su GitHub

Nessuno ha ancora preso questa issue.

Valutazione

Difficoltà
2/5
Tempo stimato
1-3 ore
Idoneità per principianti
76/100
Tipo di issue
Bug
Chiarezza
Specificata chiaramente
Stato di attività
Tranquilla
Stack tecnologico
react-native, typescript
Ambito
mobile-dev

Direzione di ricerca

Inizia in packages/partysocket/src/ws.ts, in cloneEventNode intorno alla riga 72, e analizza il percorso isReactNative esistente. Esegui i test partysocket pertinenti, inclusi i test aggiunti dal fork collegato, se disponibili, e conferma che Hermes funzioni senza MessageEvent, mentre il comportamento nel browser e in Node.js rimane invariato.

Scritto dal modello di indicizzazione a partire dal testo della issue.

Descrizione

Bug
cloneEventNode in packages/partysocket/src/ws.ts (line 72) calls new MessageEvent(e.type, e) unconditionally. React Native's Hermes engine doesn't provide MessageEvent as a global, causing:
ReferenceError: Property 'MessageEvent' doesn't exist
This makes partysocket unusable on React Native without a user-side polyfill. Libraries that depend on partysocket (like @novu/js) are also affected.

The existing isReactNative detection correctly routes RN to cloneEventNode (since #257), but cloneEventNode itself assumes MessageEvent exists.
Environment
React Native 0.81.5 / Expo 54
Hermes engine (default since RN 0.70+)
partysocket 1.1.16 (same issue in all versions)
Proposed Fix
Check typeof MessageEvent !== "undefined" before using it. When unavailable, fall back to a plain Event with manually copied data, origin, and lastEventId properties:
function cloneEventNode(e: Event) {
if ("data" in e) {
if (typeof MessageEvent !== "undefined") {
return new MessageEvent(e.type, e);
}
// Fallback for React Native (Hermes) where MessageEvent doesn't exist
const evt = new Event(e.type, e) as Event & Record<string, unknown>;
evt.data = (e as MessageEvent).data;
evt.origin = (e as MessageEvent).origin;
evt.lastEventId = (e as MessageEvent).lastEventId;
return evt;
}
// ... rest unchanged
}
Zero behavior change for browsers and Node.js where MessageEvent exists.

Fork with fix + tests: https://github.com/marouanechoukri31/partykit/tree/fix/react-native-messageevent

Related: #516

Lingua principale
TypeScript
Stelle
1.3k
Fork
84
Metriche di merge delle PR
Nessuna PR unita negli ultimi 30g

Preparare l'ambiente

Come iniziare

  1. Leggi tutta la issue e poi la guida ai contributi del progetto.
  2. Commenta sulla issue per dire che te ne occupi tu — evita che due persone facciano lo stesso lavoro.
  3. Fai un fork del repository e lavora su un branch.
  4. Apri una pull request che faccia riferimento al numero della issue.

Altre issue di cloudflare/partykit

Tutte le issue di cloudflare/partykit

Issue simili

Altre issue su TypeScript

Ricevi le nuove issue nella tua casella

Un breve riepilogo di issue GitHub adatte ai principianti.