I'm currently working on a project to connect Android devices to a web client via Node.js and WebSocket, Tango ADB. I'm able to list connected devices using AdbServerClient and retrieve the transportId of a specific device Now, I want to send this transportId from the server to the client through WebSocket, so the client can use it to establish an ADB connection with the device. transport id is a bigint data type so the error TypeError: Do not know how to serialize a BigInt, it's missing the letter n How can I pass it to the client? If possible, can create adb in the client? Please!!help mee!! diagram: client(react) -->sever(socket)-->sidecar(nodejs)-->device
bigint
string
client:
const [loading, setLoading] = useState(false);
const [deviceInfo, setDeviceInfo] = useState<Device[]>([]);
const [transport, setTransport] = useState<any>(null);
const [error, setError] = useState<string | null>(null);
const socket = io("http://localhost:8080", {
auth: {
token: "user",
},
query: {
deviceId: "user",
},
});
const getDevices = async () => {
setLoading(true);
setError(null);
try {
socket.emit("request", { clientId: "user" });
console.log("socket :>> ", socket);
socket.on("transportAndDeviceToFrontend", (data) => {
console.log("data :>> ", data);
const device = {
...data.device,
transportId: BigInt(data.device.transportId),
};
setDeviceInfo([device]);
setTransport(data.transport);
setLoading(false);
});
console.log("receivedDevices :>> ", devices);
} catch (err) {
setError("Failed to load devices. Please try again.");
console.log(error);
setLoading(false);
}
};
return (
<div className="p-6">
<button
onClick={getDevices}
disabled={loading}
className="px-4 py-2 bg-blue-500 text-white rounded disabled:bg-gray-400"
>
{loading ? "Loading..." : "Get Device Transport"}
</button>
{error && <div className="mt-4 text-red-500">{error}</div>}
{deviceInfo.length > 0 && (
<div className="mt-6">
<h2 className="text-xl font-bold mb-4">Device Information</h2>
{deviceInfo.map((device, index) => (
<div key={index} className="bg-gray-100 p-4 rounded mb-4">
<p>Serial: {device.serial}</p>
<p>Model: {device.model || "N/A"}</p>
<p>Product: {device.product || "N/A"}</p>
<p>Transport ID: {device.transportId.toString()}</p>
</div>
))}
</div>
)}
{transport && (
<button
onClick={connectDevice}
disabled={loading}
className="px-4 py-2 bg-green-500 text-white rounded disabled:bg-gray-400 mt-4"
>
{loading ? "Connecting..." : "Connect to Device"}
</button>
)}
</div>
);
socket:
@SubscribeMessage('sendTransportAndDevice')
handleDevice(@MessageBody() data: any) {
console.log(`Received device:`, data);
this.server
.to(data.clientId)
.emit('transportAndDeviceToFrontend', {
device: data.device,
transport: data.transportId,
});
}
@SubscribeMessage('request')
sendRequest(@MessageBody() data: any) {
console.log(' :>> ', data);
this.server.to('device').emit('sendRequest', data);
}
sidecar:
const main = async () => {
const deviceId = process.env.DEVICE_ID || "123";
const socketUrl = process.env.SOCKET_URL || "ws://localhost:8080";
const socket = io(socketUrl, {
auth: {
token: "device",
},
query: {
deviceId: deviceId,
},
});
socket.on("connect", async () => {
console.log("Connected Socket");
});
socket.on("sendRequest", async (data: any) => {
try {
const devices: AdbServerClient.Device[] = await getTransport();
log("devices :>> ", devices);
if (devices.length > 0) {
const client = new AdbServerClient(
new AdbServerNodeTcpConnector({ host: "127.0.0.1", port: 5037 })
);
const transport = await client.createTransport(devices[0]);
log("transport :>> ", transport);
const originalConnect = transport.connect;
transport.connect = async (service) => {
const adbSocket = await originalConnect.call(transport, service); //connect adb vs device
const writer = adbSocket.writable.getWriter(); // ghi dữ liệu vào adbSocket
adbSocket.readable = adbSocket.readable.pipeThrough(
new TransformStream({
async transform(chunk, controller) {
if (
decodeUtf8(chunk).includes("please input verify password:")
) {
await writer.write(encodeUtf8("adb36987\n"));
return;
}
controller.enqueue(chunk);
},
})
);
adbSocket.writable = new WritableStream({
write(chunk) {
return writer.write(chunk);
},
close() {
return writer.close();
},
abort() {
return writer.abort();
},
});
return adbSocket;
};
const { transportId, ...transportData } = transport;
socket.emit("sendTransportAndDevice", {
clientId: data.clientId,
device: {
...devices[0],
transportId: devices[0].transportId,
},
log: "Connected to device11",
});
log("Connected to device 2");
}
} catch (e) {
console.error("Error creating transport:", e);
socket.emit("error", {
message: "Failed to create transport",
clientId: data.clientId,
});
}
});