import { NextApiRequest, NextApiResponse } from 'next' import { SerialPort } from 'serialport' import { ReadlineParser } from '@serialport/parser-readline' // Global connection state let serialConnection: SerialPort | null = null let parser: ReadlineParser | null = null export default async function handler( req: NextApiRequest, res: NextApiResponse ) { if (req.method === 'POST') { const { port, baudRate = 115200 } = req.body if (!port) { return res.status(400).json({ message: 'Port is required' }) } try { // Close existing connection if (serialConnection?.isOpen) { serialConnection.close() } // Create new connection serialConnection = new SerialPort({ path: port, baudRate: baudRate, autoOpen: false }) // Set up parser for line-based data parser = serialConnection.pipe(new ReadlineParser({ delimiter: '\r\n' })) // Open connection await new Promise((resolve, reject) => { serialConnection!.open((err) => { if (err) reject(err) else resolve() }) }) res.status(200).json({ message: 'Connected successfully', port, baudRate, isOpen: serialConnection.isOpen }) } catch (error) { console.error('Serial connection error:', error) res.status(500).json({ message: 'Failed to connect', error: error instanceof Error ? error.message : 'Unknown error' }) } } else if (req.method === 'DELETE') { // Disconnect try { if (serialConnection?.isOpen) { serialConnection.close() serialConnection = null parser = null } res.status(200).json({ message: 'Disconnected successfully' }) } catch (error) { res.status(500).json({ message: 'Failed to disconnect', error: error instanceof Error ? error.message : 'Unknown error' }) } } else if (req.method === 'GET') { // Get connection status res.status(200).json({ connected: serialConnection?.isOpen || false, port: serialConnection?.path || null }) } else { res.status(405).json({ message: 'Method not allowed' }) } } export { serialConnection, parser }