[Feature] Improve type safety by reducing 'any' type usage in CDP message handlers
Les mainteneurs répondent en général sous 1 jour
Évaluation
- Difficulté
- 5/5
- Temps estimé
- Plus d'une semaine
- Accessibilité débutants
- 35/100
- Type d'issue
- Fonctionnalité
- Clarté
- Plutôt claire
- Activité
- Active
- Stack technique
- typescript
- Domaine
- developer-experience, devtools, tooling
Piste de recherche
Commencez par lire les handlers sous src/cdp-proxy/CDPMessageHandlers/ et l’interface ICDPMessageHandler, puis vérifiez si des types de protocole CDP existants sont disponibles. Définissez progressivement des types pour les formes de messages indiquées, ajoutez des guards lorsque nécessaire et mettez à jour les handlers afin de remplacer les utilisations de any identifiées, tout en préservant leurs messages traités et leur comportement.
Rédigé par le modèle d'indexation à partir du texte de l'issue.
Description
Summary
The CDP (Chrome DevTools Protocol) message handler files use any type extensively, reducing type safety and making the code harder to maintain and debug.
Current Situation
High usage of any type in CDP handlers:
src/cdp-proxy/CDPMessageHandlers/hermesCDPMessageHandler.ts:
- processDebuggerCDPMessage(event: any)
- processApplicationCDPMessage(event: any)
- handleCallFunctionOnEvent(event: any): any
- handleFunctionTypeResult(event: any): any
- handlePausedEvent(event: any): any
- handleBreakpointSetting(event: any): any
src/cdp-proxy/CDPMessageHandlers/iOSDirectCDPMessageHandler.ts:
- processDebuggerCDPMessage(event: any)
- processApplicationCDPMessage(event: any)
- processDeprecatedConsoleMessage(event: any)
- params: any = {}
src/cdp-proxy/CDPMessageHandlers/rnCDPMessageHandler.ts:
- processDebuggerCDPMessage(event: any)
- processApplicationCDPMessage(event: any)
- handleAppBundleFirstPauseEvent(event: IProtocolCommand): any
- params: any = event.params
Interface definition:
interface ICDPMessageHandler {
processDebuggerCDPMessage: (event: any) => ProcessedCDPMessage;
processApplicationCDPMessage: (event: any) => ProcessedCDPMessage;
}
Problems with Current Approach
- No compile-time type checking: Can't catch CDP message structure errors at build time
- Poor IntelliSense: No autocomplete for CDP message properties
- Runtime errors: Easy to access non-existent properties without warning
- Maintainability: Harder to understand expected message structure
- Refactoring risk: Changes can break code without TypeScript catching it
Proposed Changes
Phase 1: Define CDP Message Types
Create type definitions for CDP protocol messages:
// cdp-proxy/types/CDPMessages.ts
interface CDPEvent {
method: string;
params?: Record<string, unknown>;
}
interface CDPCallFunctionOnEvent extends CDPEvent {
method: 'Runtime.callFunctionOn';
params: {
functionDeclaration: string;
objectId?: string;
arguments?: any[];
returnByValue?: boolean;
};
}
interface CDPPausedEvent extends CDPEvent {
method: 'Debugger.paused';
params: {
callFrames: CallFrame[];
reason: string;
data?: Record<string, unknown>;
};
}
interface CallFrame {
callFrameId: string;
functionName: string;
location: Location;
scopeChain: Scope[];
}
// ... more type definitions
Phase 2: Update Handler Interfaces
Replace any with proper types:
interface ICDPMessageHandler {
processDebuggerCDPMessage: (event: CDPEvent) => ProcessedCDPMessage;
processApplicationCDPMessage: (event: CDPEvent) => ProcessedCDPMessage;
}
Phase 3: Add Type Guards
Implement type guards for runtime type checking:
function isCDPCallFunctionOnEvent(event: CDPEvent): event is CDPCallFunctionOnEvent {
return event.method === 'Runtime.callFunctionOn';
}
function isCDPPausedEvent(event: CDPEvent): event is CDPPausedEvent {
return event.method === 'Debugger.paused';
}
Phase 4: Update Handler Implementations
Use type guards in handlers:
public processDebuggerCDPMessage(event: CDPEvent): ProcessedCDPMessage {
if (isCDPCallFunctionOnEvent(event)) {
return this.handleCallFunctionOnEvent(event);
}
if (isCDPPausedEvent(event)) {
return this.handlePausedEvent(event);
}
// ...
}
private handleCallFunctionOnEvent(event: CDPCallFunctionOnEvent): ProcessedCDPMessage {
// event.params is now properly typed
const { functionDeclaration, objectId } = event.params;
// ...
}
Benefits
- Type safety: Catch CDP message structure errors at compile time
- Better IntelliSense: Autocomplete for CDP message properties
- Self-documenting: Types serve as documentation for CDP protocol usage
- Refactoring safety: TypeScript catches breaking changes
- Debugging: Easier to identify message structure issues
- Maintenance: Clearer code intent and expected structures
Implementation Strategy
- Start with commonly used CDP message types
- Add type definitions incrementally (one handler at a time)
- Use union types for messages with variants
- Leverage TypeScript's discriminated unions for type narrowing
- Consider using existing CDP protocol type definitions if available
Potential Challenges
- CDP protocol has many message types
- Some messages have dynamic/flexible structures
- Need to balance type safety with flexibility
- Requires understanding CDP protocol specification
Alternative Approaches
- Use
@types/chrome-devtools-protocol: Leverage existing type definitions - Generate types from protocol JSON: Use CDP protocol specification
- Gradual typing: Start with loose types, refine incrementally
- Unknown over any: Use
unknowninstead ofanyfor better safety
References
- CDP Message Handlers:
src/cdp-proxy/CDPMessageHandlers/ - Chrome DevTools Protocol: https://chromedevtools.github.io/devtools-protocol/
- Potential types package:
@types/chrome-devtools-protocol - TypeScript discriminated unions: https://www.typescriptlang.org/docs/handbook/unions-and-intersections.html#discriminating-unions
- Langage dominant
- TypeScript
- Étoiles
- 2.7k
- Forks
- 298
- Merge moyen
- 18 h 34 min
- PR mergées (30 j)
- 30
Préparer son environnement
- Aucun Dockerfile ni fichier Docker Compose
- Aucun modèle de pull request
- Lire le guide de contribution
Par où commencer
- Lisez l'issue en entier, puis le guide de contribution du projet.
- Signalez en commentaire que vous la prenez — cela évite que deux personnes fassent le même travail.
- Forkez le dépôt et travaillez sur une branche.
- Ouvrez une pull request qui référence le numéro de l'issue.
Autres issues de microsoft/vscode-react-native
-
[Feature] Avoid duplicate error notificationsPeut-être pris @erenbati l’a pris il y a 6 jours. Ouverteenhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 75/100
microsoft/vscode-react-native#2963 ·
Les mainteneurs répondent en général sous 1 jour
-
[Feature] Stop Expo Go installation when Quick Pick is canceledPeut-être pris @erenbati l’a pris il y a 21 jours. Ouverteenhancement
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
microsoft/vscode-react-native#2959 ·
Les mainteneurs répondent en général sous 1 jour
-
enhancement follow-up
Difficulté 2/5 1-3 heures Accessibilité débutants 88/100
microsoft/vscode-react-native#2951 ·
Les mainteneurs répondent en général sous 1 jour
-
[Feature] Add smoke coverage for release VSIX artifact handlingPeut-être pris @EmmaYuan1015 l’a pris il y a 2 jours. Ouverteenhancement
Difficulté 3/5 Une demi-journée Accessibilité débutants 35/100
microsoft/vscode-react-native#3004 ·
Les mainteneurs répondent en général sous 1 jour
-
[Feature] Expo Doctor output is lost when diagnostics failPeut-être pris @erenbati l’a pris il y a 21 jours. Ouverteenhancement
Difficulté 3/5 1-2 jours Accessibilité débutants 72/100
microsoft/vscode-react-native#2957 ·
Les mainteneurs répondent en général sous 1 jour
Toutes les issues de microsoft/vscode-react-native
Issues similaires
-
Difficulté 2/5 1-3 heures Accessibilité débutants 77/100
TomerAberbach/profiler-md#733 ·
Les mainteneurs répondent en général sous 1 jour
-
bug priority: medium
Difficulté 2/5 1-3 heures Accessibilité débutants 68/100
brentspine/brents-toasts#143 ·
-
🐛 bug 🗺️ DB Models & Ops
Difficulté 2/5 1-3 heures Accessibilité débutants 83/100
LibreChat-AI/LibreChat#17214 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 67/100
Wavvon/Wavvon-clients#136 ·
Les mainteneurs répondent en général sous 1 jour
-
Difficulté 2/5 1-3 heures Accessibilité débutants 62/100
umami-software/umami#4637 ·
Les mainteneurs répondent en général sous 3 jours