This repository was archived by the owner on Sep 26, 2025. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 987
Expand file tree
/
Copy pathMetroDevice.tsx
More file actions
124 lines (117 loc) · 2.96 KB
/
Copy pathMetroDevice.tsx
File metadata and controls
124 lines (117 loc) · 2.96 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
/**
* Copyright (c) Meta Platforms, Inc. and affiliates.
*
* This source code is licensed under the MIT license found in the
* LICENSE file in the root directory of this source tree.
*
* @format
*/
import {DeviceLogLevel, MetroReportableEvent} from 'flipper-common';
import util from 'util';
import {FlipperServerImpl} from '../../FlipperServerImpl';
import {ServerDevice} from '../ServerDevice';
import WebSocket from 'ws';
const metroLogLevelMapping: {[key: string]: DeviceLogLevel} = {
trace: 'verbose',
info: 'info',
warn: 'warn',
error: 'error',
log: 'info',
group: 'info',
groupCollapsed: 'info',
groupEnd: 'info',
debug: 'debug',
};
function getLoglevelFromMessageType(
type: MetroReportableEvent['type'],
): DeviceLogLevel | null {
switch (type) {
case 'bundle_build_done':
case 'bundle_build_started':
case 'initialize_done':
return 'debug';
case 'bundle_build_failed':
case 'bundling_error':
case 'global_cache_error':
case 'hmr_client_error':
return 'error';
case 'bundle_transform_progressed':
return null; // Don't show at all
case 'client_log':
return null; // Handled separately
case 'dep_graph_loaded':
case 'dep_graph_loading':
case 'global_cache_disabled':
default:
return 'verbose';
}
}
export default class MetroDevice extends ServerDevice {
ws?: WebSocket;
constructor(
flipperServer: FlipperServerImpl,
serial: string,
ws: WebSocket | undefined,
) {
super(flipperServer, {
serial,
deviceType: 'emulator',
title: 'React Native',
os: 'Metro',
icon: 'mobile',
features: {
screenCaptureAvailable: false,
screenshotAvailable: false,
},
});
if (ws) {
this.ws = ws;
ws.onmessage = this._handleWSMessage;
}
}
private _handleWSMessage = ({data}: any) => {
const message: MetroReportableEvent = JSON.parse(data);
if (message.type === 'client_log') {
const type: DeviceLogLevel =
metroLogLevelMapping[message.level] || 'unknown';
this.addLogEntry({
date: new Date(),
pid: 0,
tid: 0,
type,
tag: message.type,
message: util.format(
...message.data.map((v) =>
v && typeof v === 'object' ? JSON.stringify(v, null, 2) : v,
),
),
});
} else {
const level = getLoglevelFromMessageType(message.type);
if (level !== null) {
this.addLogEntry({
date: new Date(),
pid: 0,
tid: 0,
type: level,
tag: message.type,
message: JSON.stringify(message, null, 2),
});
}
}
};
sendCommand(command: string, params?: any) {
if (this.ws) {
this.ws.send(
JSON.stringify({
version: 2,
type: 'command',
command,
params,
}),
);
} else {
console.warn('Cannot send command, no connection', command);
}
}
}