database-devtools 0.1.3 → 0.1.4

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/types/protocol.ts","../src/types/adapter.ts","../src/types/kind.ts","../src/types/snapshot.ts","../src/adapter/errors.ts","../src/adapter/registry.ts","../src/adapters/sqlite/buildWriteSql.ts","../src/adapters/sqlite/createExpoSqliteAdapter.ts","../src/adapters/sqlite/detect.ts","../src/adapters/sqlite/register.ts","../src/adapter/registerBuiltins.ts","../src/adapter/resolveAdapter.ts","../src/inspector/registry.ts","../src/utils/ids.ts","../src/utils/reconnect.ts","../src/client/createDevToolsClient.ts","../src/client/fetchSnapshot.ts","../src/client/resolveDeviceDatabaseUrl.ts","../src/client/deviceDatabase.ts","../src/client/resolveProjectDatabaseUrl.ts","../src/client/projectDatabase.ts","../src/client/snapshotUpload.ts","../src/client/handleDeviceSnapshot.ts","../src/client/handleWriteOperations.ts","../src/utils/isDevToolsEnabled.ts","../src/client/formatSyncError.ts","../src/hooks/useDevTools.ts","../src/utils/resolveDevToolsHost.ts","../src/utils/resolveDeviceMetadata.ts","../src/utils/resolveServerUrl.ts","../src/utils/persistDeviceId.ts","../src/utils/sqlSafety.ts","../src/mobile/sqliteTableQuery.ts","../src/mobile/createExpoSqliteInspector.ts","../src/components/DevToolsProvider.tsx","../src/components/ConnectionStatusBadge.tsx","../src/components/DevToolsLauncherModal.tsx","../src/components/DevToolsSettingsModal.tsx","../src/utils/floatingButtonPosition.ts","../src/components/FloatingDevToolsButton.tsx","../src/components/mobile/mobileExplorerStyles.ts","../src/components/mobile/ExplorerOverviewTab.tsx","../src/mobile/constants.ts","../src/mobile/computeColumnWidths.ts","../src/mobile/copyToClipboard.ts","../src/components/mobile/MobileDataCardList.tsx","../src/components/mobile/MobileDataTable.tsx","../src/components/mobile/MobileDataView.tsx","../src/components/mobile/ExplorerSqlTab.tsx","../src/components/mobile/ExplorerTableDetail.tsx","../src/components/mobile/ExplorerTablesTab.tsx","../src/components/mobile/MobileDatabaseExplorer.tsx","../src/components/DatabaseDevTools.tsx","../src/utils/logger.ts","../src/server/attachWebUi.ts","../src/server/attachWebSocket.ts","../src/server/connectionManager.ts","../src/server/cors.ts","../src/server/deviceRegistry.ts","../src/server/heartbeat.ts","../src/server/messageRouter.ts","../src/server/pendingRefreshStore.ts","../src/server/refreshCoordinator.ts","../src/server/projectData.ts","../src/server/deviceExportStorage.ts","../src/server/migrateLegacyActiveDb.ts","../src/server/snapshotFileStore.ts","../src/server/snapshotStore.ts","../src/server/writeCoordinator.ts","../src/server/writeSessionManager.ts","../src/server/createDevToolsServer.ts"],"names":["resolveApiBase","createContext","useContext","Platform","Constants","NativeModules","AsyncStorage","quoteIdentifier","useState","useMemo","useRef","useCallback","useEffect","client","jsx","jsxs","View","Text","StyleSheet","Modal","styles","Pressable","ActivityIndicator","ScrollView","TextInput","Fragment","useWindowDimensions","PanResponder","MaterialCommunityIcons","FlatList","formatValue","path","existsSync","express","WebSocketServer","mkdir","readFile","writeFile","stat","rm","absolutePath","createServer"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { WriteOperation } from './write';\r\n\r\n/** Client and server roles on the WebSocket hub. */\r\nexport const DevToolsRole = {\r\n MOBILE: 'mobile',\r\n BROWSER: 'browser',\r\n} as const;\r\n\r\nexport type DevToolsRole = (typeof DevToolsRole)[keyof typeof DevToolsRole];\r\n\r\n/** All wire message type identifiers. */\r\nexport const MessageType = {\r\n REGISTER: 'register',\r\n PING: 'ping',\r\n PONG: 'pong',\r\n DEVICE_STATUS: 'deviceStatus',\r\n BROADCAST: 'broadcast',\r\n REFRESH_REQUEST: 'refreshRequest',\r\n SNAPSHOT_UPLOAD_REQUESTED: 'snapshotUploadRequested',\r\n REFRESH_STATUS: 'refreshStatus',\r\n SNAPSHOT_READY: 'snapshotReady',\r\n REFRESH_ERROR: 'refreshError',\r\n EXPORT_SNAPSHOT_REQUEST: 'exportSnapshotRequest',\r\n EXPORT_SNAPSHOT_ERROR: 'exportSnapshotError',\r\n BEGIN_TRANSACTION_REQUEST: 'beginTransactionRequest',\r\n COMMIT_TRANSACTION_REQUEST: 'commitTransactionRequest',\r\n ROLLBACK_TRANSACTION_REQUEST: 'rollbackTransactionRequest',\r\n WRITE_REQUEST: 'writeRequest',\r\n BEGIN_TRANSACTION: 'beginTransaction',\r\n COMMIT_TRANSACTION: 'commitTransaction',\r\n ROLLBACK_TRANSACTION: 'rollbackTransaction',\r\n EXECUTE_WRITE: 'executeWrite',\r\n TRANSACTION_ACK: 'transactionAck',\r\n WRITE_ACK: 'writeAck',\r\n TRANSACTION_STATUS: 'transactionStatus',\r\n WRITE_RESULT: 'writeResult',\r\n WRITE_ERROR: 'writeError',\r\n} as const;\r\n\r\nexport type MessageTypeValue = (typeof MessageType)[keyof typeof MessageType];\r\n\r\n/** Shared base for every protocol message. */\r\nexport interface DevToolsMessageBase {\r\n type: MessageTypeValue;\r\n timestamp: number;\r\n}\r\n\r\nexport type DeviceMetadata = {\r\n platform?: string;\r\n appName?: string;\r\n [key: string]: string | undefined;\r\n};\r\n\r\n/** Client → Server: register role on connect. */\r\nexport interface RegisterMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REGISTER;\r\n role: DevToolsRole;\r\n deviceId?: string;\r\n metadata?: DeviceMetadata;\r\n}\r\n\r\n/** Server → Client: heartbeat probe. */\r\nexport interface PingMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.PING;\r\n pingId: string;\r\n}\r\n\r\n/** Client → Server: heartbeat response. */\r\nexport interface PongMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.PONG;\r\n pingId: string;\r\n}\r\n\r\nexport type BrowserConnectionInfo = {\r\n connectionId: string;\r\n connectedAt: number;\r\n};\r\n\r\nexport type MobileDeviceInfo = {\r\n deviceId: string;\r\n connectionId: string;\r\n connectedAt: number;\r\n metadata?: DeviceMetadata;\r\n};\r\n\r\nexport type DeviceStatusPayload = {\r\n browserCount: number;\r\n mobileCount: number;\r\n browsers: BrowserConnectionInfo[];\r\n mobiles: MobileDeviceInfo[];\r\n};\r\n\r\n/** Server → Client: hub snapshot after connect/disconnect. */\r\nexport interface DeviceStatusMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.DEVICE_STATUS;\r\n payload: DeviceStatusPayload;\r\n}\r\n\r\n/** Server → Client: generic routed envelope for future features. */\r\nexport interface BroadcastMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.BROADCAST;\r\n payload: unknown;\r\n}\r\n\r\nexport type RefreshType = 'snapshot';\r\n\r\nexport type RefreshState =\r\n | 'requested'\r\n | 'exporting'\r\n | 'uploading'\r\n | 'ready'\r\n | 'failed'\r\n | 'timeout';\r\n\r\n/** @deprecated Use RefreshState */\r\nexport type SyncState = RefreshState;\r\n\r\nexport type RefreshErrorCode =\r\n | 'DEVICE_OFFLINE'\r\n | 'REFRESH_IN_PROGRESS'\r\n | 'EXPORT_FAILED'\r\n | 'UPLOAD_FAILED'\r\n | 'TIMEOUT'\r\n | 'SNAPSHOT_NOT_FOUND'\r\n | 'INVALID_REQUEST';\r\n\r\n/** @deprecated Use RefreshErrorCode */\r\nexport type SyncErrorCode = RefreshErrorCode;\r\n\r\n/** Browser → Server: request a database snapshot from a mobile device. */\r\nexport interface RefreshRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REFRESH_REQUEST;\r\n deviceId: string;\r\n refreshType: RefreshType;\r\n}\r\n\r\n/** Server → Mobile: export database and upload via REST. */\r\nexport interface SnapshotUploadRequestedMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.SNAPSHOT_UPLOAD_REQUESTED;\r\n deviceId: string;\r\n refreshType: RefreshType;\r\n}\r\n\r\n/** Server → Browser: refresh progress update. */\r\nexport interface RefreshStatusMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REFRESH_STATUS;\r\n deviceId: string;\r\n state: RefreshState;\r\n message?: string;\r\n}\r\n\r\n/** Server → Browser: snapshot uploaded and ready to download. */\r\nexport interface SnapshotReadyMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.SNAPSHOT_READY;\r\n deviceId: string;\r\n size: number;\r\n exportedAt: number;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n}\r\n\r\n/** Server → Browser: refresh failed. */\r\nexport interface RefreshErrorMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REFRESH_ERROR;\r\n deviceId: string;\r\n code: RefreshErrorCode;\r\n message: string;\r\n}\r\n\r\n/** Mobile → Server: push database snapshot to the web inspector. */\r\nexport interface ExportSnapshotRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.EXPORT_SNAPSHOT_REQUEST;\r\n refreshType: RefreshType;\r\n}\r\n\r\n/** Server → Mobile: export request failed before upload. */\r\nexport interface ExportSnapshotErrorMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.EXPORT_SNAPSHOT_ERROR;\r\n code: RefreshErrorCode;\r\n message: string;\r\n}\r\n\r\nexport type RefreshInitiator = 'browser' | 'mobile';\r\n\r\nexport type TransactionStatusState =\r\n | 'idle'\r\n | 'opening'\r\n | 'open'\r\n | 'committing'\r\n | 'rolling_back'\r\n | 'failed';\r\n\r\nexport type WriteErrorCode =\r\n | 'DEVICE_OFFLINE'\r\n | 'NO_TRANSACTION'\r\n | 'TRANSACTION_BUSY'\r\n | 'INVALID_OPERATION'\r\n | 'WRITE_FAILED'\r\n | 'ADAPTER_ERROR'\r\n | 'TIMEOUT';\r\n\r\n/** Browser → Server: open a write transaction on a device. */\r\nexport interface BeginTransactionRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.BEGIN_TRANSACTION_REQUEST;\r\n transactionId: string;\r\n deviceId: string;\r\n}\r\n\r\n/** Browser → Server: commit the active transaction. */\r\nexport interface CommitTransactionRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.COMMIT_TRANSACTION_REQUEST;\r\n transactionId: string;\r\n deviceId: string;\r\n}\r\n\r\n/** Browser → Server: roll back the active transaction. */\r\nexport interface RollbackTransactionRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.ROLLBACK_TRANSACTION_REQUEST;\r\n transactionId: string;\r\n deviceId: string;\r\n}\r\n\r\n/** Browser → Server: execute a structured write inside a transaction. */\r\nexport interface WriteRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_REQUEST;\r\n writeId: string;\r\n transactionId: string;\r\n deviceId: string;\r\n operation: WriteOperation;\r\n}\r\n\r\n/** Server → Mobile: begin a transaction on the live database. */\r\nexport interface BeginTransactionMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.BEGIN_TRANSACTION;\r\n transactionId: string;\r\n}\r\n\r\n/** Server → Mobile: commit the open transaction. */\r\nexport interface CommitTransactionMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.COMMIT_TRANSACTION;\r\n transactionId: string;\r\n}\r\n\r\n/** Server → Mobile: roll back the open transaction. */\r\nexport interface RollbackTransactionMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.ROLLBACK_TRANSACTION;\r\n transactionId: string;\r\n}\r\n\r\n/** Server → Mobile: run a structured write operation. */\r\nexport interface ExecuteWriteMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.EXECUTE_WRITE;\r\n writeId: string;\r\n transactionId: string;\r\n operation: WriteOperation;\r\n}\r\n\r\n/** Mobile → Server: transaction lifecycle acknowledgement. */\r\nexport interface TransactionAckMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.TRANSACTION_ACK;\r\n transactionId: string;\r\n action: 'begin' | 'commit' | 'rollback';\r\n ok: boolean;\r\n message?: string;\r\n}\r\n\r\n/** Mobile → Server: write operation acknowledgement. */\r\nexport interface WriteAckMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_ACK;\r\n writeId: string;\r\n transactionId: string;\r\n ok: boolean;\r\n rowsAffected?: number;\r\n message?: string;\r\n}\r\n\r\n/** Server → Browser: transaction state update. */\r\nexport interface TransactionStatusMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.TRANSACTION_STATUS;\r\n transactionId: string;\r\n deviceId: string;\r\n state: TransactionStatusState;\r\n message?: string;\r\n}\r\n\r\n/** Server → Browser: write succeeded. */\r\nexport interface WriteResultMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_RESULT;\r\n writeId: string;\r\n transactionId: string;\r\n rowsAffected: number;\r\n}\r\n\r\n/** Server → Browser: write or transaction failed. */\r\nexport interface WriteErrorMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_ERROR;\r\n transactionId: string;\r\n writeId?: string;\r\n code: WriteErrorCode;\r\n message: string;\r\n}\r\n\r\nexport type ClientMessage =\r\n | RegisterMessage\r\n | PongMessage\r\n | RefreshRequestMessage\r\n | ExportSnapshotRequestMessage\r\n | BeginTransactionRequestMessage\r\n | CommitTransactionRequestMessage\r\n | RollbackTransactionRequestMessage\r\n | WriteRequestMessage\r\n | TransactionAckMessage\r\n | WriteAckMessage;\r\n\r\nexport type ServerMessage =\r\n | PingMessage\r\n | DeviceStatusMessage\r\n | BroadcastMessage\r\n | SnapshotUploadRequestedMessage\r\n | RefreshStatusMessage\r\n | SnapshotReadyMessage\r\n | RefreshErrorMessage\r\n | ExportSnapshotErrorMessage\r\n | BeginTransactionMessage\r\n | CommitTransactionMessage\r\n | RollbackTransactionMessage\r\n | ExecuteWriteMessage\r\n | TransactionStatusMessage\r\n | WriteResultMessage\r\n | WriteErrorMessage;\r\n\r\nexport type DevToolsMessage = ClientMessage | ServerMessage;\r\n\r\nexport const DEVTOOLS_WS_PATH = '/ws';\r\n\r\nexport const DEFAULT_DEVTOOLS_PORT = 3847;\r\n\r\nexport const DEFAULT_DEVTOOLS_HOST = '0.0.0.0';\r\n\r\nexport const HEARTBEAT_INTERVAL_MS = 30_000;\r\n\r\nexport const HEARTBEAT_TIMEOUT_MS = 10_000;\r\n\r\nexport const DEVICE_SNAPSHOT_API_PATH = '/api/devices';\r\n\r\nexport const PROJECT_DATABASE_API_PATH = '/api/project/database';\r\n\r\nexport const PROJECT_DATABASE_META_API_PATH = '/api/project/database/meta';\r\n\r\nexport const PROJECT_DATABASES_API_PATH = '/api/project/databases';\r\n\r\nexport const PROJECT_DEVICE_EXPORTS_API_PATH = '/api/project/devices';\r\n\r\n/** @deprecated Use DEVICE_SNAPSHOT_API_PATH */\r\nexport const SNAPSHOT_API_PATH = DEVICE_SNAPSHOT_API_PATH;\r\n\r\nexport const REFRESH_TIMEOUT_MS = 60_000;\r\n\r\n/** @deprecated Use REFRESH_TIMEOUT_MS */\r\nexport const SYNC_TIMEOUT_MS = REFRESH_TIMEOUT_MS;\r\n\r\nexport const WRITE_TRANSACTION_TIMEOUT_MS = 5 * 60 * 1000;\r\n\r\nexport const MAX_SNAPSHOT_BYTES = 50 * 1024 * 1024;\r\n\r\nexport function createMessage<T extends DevToolsMessageBase>(\r\n message: Omit<T, 'timestamp'>,\r\n): T {\r\n return { ...message, timestamp: Date.now() } as T;\r\n}\r\n\r\nexport function buildDevToolsHttpUrl(\r\n host = 'localhost',\r\n port = DEFAULT_DEVTOOLS_PORT,\r\n): string {\r\n return `http://${host}:${port}`;\r\n}\r\n\r\nexport function buildDevToolsWsUrl(\r\n host = 'localhost',\r\n port = DEFAULT_DEVTOOLS_PORT,\r\n): string {\r\n return `ws://${host}:${port}${DEVTOOLS_WS_PATH}`;\r\n}\r\n\r\nexport function buildDeviceSnapshotUrl(httpBaseUrl: string, deviceId: string): string {\r\n const base = httpBaseUrl.replace(/\\/$/, '');\r\n return `${base}${DEVICE_SNAPSHOT_API_PATH}/${encodeURIComponent(deviceId)}/snapshot`;\r\n}\r\n\r\n/** @deprecated Use buildDeviceSnapshotUrl */\r\nexport function buildSnapshotUrl(httpBaseUrl: string, deviceId: string): string {\r\n return buildDeviceSnapshotUrl(httpBaseUrl, deviceId);\r\n}\r\n\r\nexport function wsUrlToHttpUrl(wsUrl: string): string {\r\n const url = new URL(wsUrl);\r\n url.protocol = url.protocol === 'wss:' ? 'https:' : 'http:';\r\n url.pathname = '';\r\n url.search = '';\r\n url.hash = '';\r\n return url.toString().replace(/\\/$/, '');\r\n}\r\n\r\nfunction hasMessageType(value: unknown): value is { type: string } {\r\n return typeof value === 'object' && value !== null && typeof (value as { type: unknown }).type === 'string';\r\n}\r\n\r\nexport function isRegisterMessage(value: unknown): value is RegisterMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REGISTER) {\r\n return false;\r\n }\r\n\r\n const message = value as RegisterMessage;\r\n return (\r\n message.role === DevToolsRole.MOBILE || message.role === DevToolsRole.BROWSER\r\n );\r\n}\r\n\r\nexport function isPongMessage(value: unknown): value is PongMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.PONG) {\r\n return false;\r\n }\r\n\r\n const message = value as PongMessage;\r\n return typeof message.pingId === 'string';\r\n}\r\n\r\nexport function isRefreshRequestMessage(value: unknown): value is RefreshRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REFRESH_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as RefreshRequestMessage;\r\n return typeof message.deviceId === 'string' && message.refreshType === 'snapshot';\r\n}\r\n\r\nexport function isSnapshotUploadRequestedMessage(\r\n value: unknown,\r\n): value is SnapshotUploadRequestedMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.SNAPSHOT_UPLOAD_REQUESTED) {\r\n return false;\r\n }\r\n\r\n const message = value as SnapshotUploadRequestedMessage;\r\n return typeof message.deviceId === 'string' && message.refreshType === 'snapshot';\r\n}\r\n\r\nexport function isRefreshStatusMessage(value: unknown): value is RefreshStatusMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REFRESH_STATUS) {\r\n return false;\r\n }\r\n\r\n const message = value as RefreshStatusMessage;\r\n return typeof message.deviceId === 'string' && typeof message.state === 'string';\r\n}\r\n\r\nexport function isSnapshotReadyMessage(value: unknown): value is SnapshotReadyMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.SNAPSHOT_READY) {\r\n return false;\r\n }\r\n\r\n const message = value as SnapshotReadyMessage;\r\n return (\r\n typeof message.deviceId === 'string' &&\r\n typeof message.size === 'number' &&\r\n typeof message.exportedAt === 'number' &&\r\n typeof message.kind === 'string' &&\r\n typeof message.mimeType === 'string'\r\n );\r\n}\r\n\r\nexport function isRefreshErrorMessage(value: unknown): value is RefreshErrorMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REFRESH_ERROR) {\r\n return false;\r\n }\r\n\r\n const message = value as RefreshErrorMessage;\r\n return typeof message.deviceId === 'string' && typeof message.code === 'string';\r\n}\r\n\r\nexport function isExportSnapshotRequestMessage(\r\n value: unknown,\r\n): value is ExportSnapshotRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.EXPORT_SNAPSHOT_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as ExportSnapshotRequestMessage;\r\n return message.refreshType === 'snapshot';\r\n}\r\n\r\nexport function isExportSnapshotErrorMessage(\r\n value: unknown,\r\n): value is ExportSnapshotErrorMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.EXPORT_SNAPSHOT_ERROR) {\r\n return false;\r\n }\r\n\r\n const message = value as ExportSnapshotErrorMessage;\r\n return typeof message.code === 'string' && typeof message.message === 'string';\r\n}\r\n\r\nexport function isBeginTransactionRequestMessage(\r\n value: unknown,\r\n): value is BeginTransactionRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.BEGIN_TRANSACTION_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as BeginTransactionRequestMessage;\r\n return typeof message.transactionId === 'string' && typeof message.deviceId === 'string';\r\n}\r\n\r\nexport function isCommitTransactionRequestMessage(\r\n value: unknown,\r\n): value is CommitTransactionRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.COMMIT_TRANSACTION_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as CommitTransactionRequestMessage;\r\n return typeof message.transactionId === 'string' && typeof message.deviceId === 'string';\r\n}\r\n\r\nexport function isRollbackTransactionRequestMessage(\r\n value: unknown,\r\n): value is RollbackTransactionRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.ROLLBACK_TRANSACTION_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as RollbackTransactionRequestMessage;\r\n return typeof message.transactionId === 'string' && typeof message.deviceId === 'string';\r\n}\r\n\r\nexport function isWriteRequestMessage(value: unknown): value is WriteRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteRequestMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.deviceId === 'string' &&\r\n typeof message.operation === 'object' &&\r\n message.operation !== null\r\n );\r\n}\r\n\r\nexport function isTransactionAckMessage(value: unknown): value is TransactionAckMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.TRANSACTION_ACK) {\r\n return false;\r\n }\r\n\r\n const message = value as TransactionAckMessage;\r\n return (\r\n typeof message.transactionId === 'string' &&\r\n (message.action === 'begin' || message.action === 'commit' || message.action === 'rollback') &&\r\n typeof message.ok === 'boolean'\r\n );\r\n}\r\n\r\nexport function isWriteAckMessage(value: unknown): value is WriteAckMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_ACK) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteAckMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.ok === 'boolean'\r\n );\r\n}\r\n\r\nexport function isClientMessage(value: unknown): value is ClientMessage {\r\n return (\r\n isRegisterMessage(value) ||\r\n isPongMessage(value) ||\r\n isRefreshRequestMessage(value) ||\r\n isExportSnapshotRequestMessage(value) ||\r\n isBeginTransactionRequestMessage(value) ||\r\n isCommitTransactionRequestMessage(value) ||\r\n isRollbackTransactionRequestMessage(value) ||\r\n isWriteRequestMessage(value) ||\r\n isTransactionAckMessage(value) ||\r\n isWriteAckMessage(value)\r\n );\r\n}\r\n\r\nexport function isPingMessage(value: unknown): value is PingMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.PING) {\r\n return false;\r\n }\r\n\r\n const message = value as PingMessage;\r\n return typeof message.pingId === 'string';\r\n}\r\n\r\nexport function isDeviceStatusMessage(value: unknown): value is DeviceStatusMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.DEVICE_STATUS) {\r\n return false;\r\n }\r\n\r\n const message = value as DeviceStatusMessage;\r\n return typeof message.payload === 'object' && message.payload !== null;\r\n}\r\n\r\nexport function isBroadcastMessage(value: unknown): value is BroadcastMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.BROADCAST) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function isBeginTransactionMessage(value: unknown): value is BeginTransactionMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.BEGIN_TRANSACTION) {\r\n return false;\r\n }\r\n\r\n const message = value as BeginTransactionMessage;\r\n return typeof message.transactionId === 'string';\r\n}\r\n\r\nexport function isCommitTransactionMessage(value: unknown): value is CommitTransactionMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.COMMIT_TRANSACTION) {\r\n return false;\r\n }\r\n\r\n const message = value as CommitTransactionMessage;\r\n return typeof message.transactionId === 'string';\r\n}\r\n\r\nexport function isRollbackTransactionMessage(value: unknown): value is RollbackTransactionMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.ROLLBACK_TRANSACTION) {\r\n return false;\r\n }\r\n\r\n const message = value as RollbackTransactionMessage;\r\n return typeof message.transactionId === 'string';\r\n}\r\n\r\nexport function isExecuteWriteMessage(value: unknown): value is ExecuteWriteMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.EXECUTE_WRITE) {\r\n return false;\r\n }\r\n\r\n const message = value as ExecuteWriteMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.operation === 'object' &&\r\n message.operation !== null\r\n );\r\n}\r\n\r\nexport function isTransactionStatusMessage(value: unknown): value is TransactionStatusMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.TRANSACTION_STATUS) {\r\n return false;\r\n }\r\n\r\n const message = value as TransactionStatusMessage;\r\n return (\r\n typeof message.transactionId === 'string' &&\r\n typeof message.deviceId === 'string' &&\r\n typeof message.state === 'string'\r\n );\r\n}\r\n\r\nexport function isWriteResultMessage(value: unknown): value is WriteResultMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_RESULT) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteResultMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.rowsAffected === 'number'\r\n );\r\n}\r\n\r\nexport function isWriteErrorMessage(value: unknown): value is WriteErrorMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_ERROR) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteErrorMessage;\r\n return typeof message.transactionId === 'string' && typeof message.code === 'string';\r\n}\r\n\r\nexport function isServerMessage(value: unknown): value is ServerMessage {\r\n return (\r\n isPingMessage(value) ||\r\n isDeviceStatusMessage(value) ||\r\n isBroadcastMessage(value) ||\r\n isSnapshotUploadRequestedMessage(value) ||\r\n isRefreshStatusMessage(value) ||\r\n isSnapshotReadyMessage(value) ||\r\n isRefreshErrorMessage(value) ||\r\n isExportSnapshotErrorMessage(value) ||\r\n isBeginTransactionMessage(value) ||\r\n isCommitTransactionMessage(value) ||\r\n isRollbackTransactionMessage(value) ||\r\n isExecuteWriteMessage(value) ||\r\n isTransactionStatusMessage(value) ||\r\n isWriteResultMessage(value) ||\r\n isWriteErrorMessage(value)\r\n );\r\n}\r\n","import type { AdapterCapabilities } from './capabilities';\r\nimport type { DatabaseKind } from './kind';\r\nimport type { SnapshotExport } from './snapshot';\r\nimport type { WriteOperation } from './write';\r\n\r\n/** Database adapter interface for export and write operations on the live device. */\r\nexport interface DatabaseAdapter {\r\n readonly kind: DatabaseKind;\r\n /** @deprecated Use `kind` instead. */\r\n readonly dialect: DatabaseKind;\r\n readonly id: string;\r\n readonly name: string;\r\n readonly capabilities: AdapterCapabilities;\r\n exportSnapshot(): Promise<SnapshotExport>;\r\n}\r\n\r\nexport type WriteResult = {\r\n rowsAffected: number;\r\n};\r\n\r\n/** Adapter that supports transactional writes on the live device database. */\r\nexport interface WritableDatabaseAdapter extends DatabaseAdapter {\r\n beginTransaction(): Promise<void>;\r\n commitTransaction(): Promise<void>;\r\n rollbackTransaction(): Promise<void>;\r\n executeWrite(operation: WriteOperation): Promise<WriteResult>;\r\n}\r\n\r\n/** @deprecated Use `WritableDatabaseAdapter` instead. */\r\nexport type EditableDatabaseAdapter = WritableDatabaseAdapter;\r\n\r\nexport function isWritableDatabaseAdapter(\r\n adapter: DatabaseAdapter | undefined,\r\n): adapter is WritableDatabaseAdapter {\r\n if (!adapter?.capabilities.transactionalWrites) {\r\n return false;\r\n }\r\n\r\n const candidate = adapter as WritableDatabaseAdapter;\r\n return (\r\n typeof candidate.beginTransaction === 'function' &&\r\n typeof candidate.commitTransaction === 'function' &&\r\n typeof candidate.rollbackTransaction === 'function' &&\r\n typeof candidate.executeWrite === 'function'\r\n );\r\n}\r\n\r\n/** @deprecated Use `isWritableDatabaseAdapter` instead. */\r\nexport const isEditableDatabaseAdapter = isWritableDatabaseAdapter;\r\n","/** Supported database engine identifiers. */\r\nexport type DatabaseKind = 'sqlite' | 'realm' | 'duckdb' | (string & {});\r\n\r\nexport const DATABASE_DEVTOOLS_KIND = Symbol.for('@database-devtools/kind');\r\n\r\nexport function readDatabaseKindMarker(value: unknown): DatabaseKind | undefined {\r\n if (typeof value !== 'object' || value === null) {\r\n return undefined;\r\n }\r\n\r\n const marker = (value as Record<symbol, unknown>)[DATABASE_DEVTOOLS_KIND];\r\n\r\n return typeof marker === 'string' ? (marker as DatabaseKind) : undefined;\r\n}\r\n","import type { DatabaseKind } from '../types/kind';\r\n\r\nexport const SNAPSHOT_KIND_HEADER = 'x-database-kind';\r\nexport const SNAPSHOT_MIME_HEADER = 'x-snapshot-mime-type';\r\nexport const SNAPSHOT_NAME_HEADER = 'x-database-name';\r\n\r\nexport const SQLITE_SNAPSHOT_MIME_TYPE = 'application/x-sqlite3';\r\n\r\nexport type SnapshotExport = {\r\n bytes: Uint8Array;\r\n mimeType: string;\r\n kind: DatabaseKind;\r\n exportedAt?: number;\r\n};\r\n","import type { DatabaseKind } from '../types/kind';\r\n\r\nexport type SupportedDatabase = {\r\n kind: DatabaseKind;\r\n displayName: string;\r\n};\r\n\r\nexport class AdapterResolutionError extends Error {\r\n readonly name = 'AdapterResolutionError';\r\n\r\n constructor(\r\n public readonly supported: SupportedDatabase[],\r\n public readonly hint: 'type' | 'adapter' | 'install-package',\r\n ) {\r\n super(formatAdapterResolutionMessage(supported, hint));\r\n }\r\n}\r\n\r\nexport function formatAdapterResolutionMessage(\r\n supported: SupportedDatabase[],\r\n hint: 'type' | 'adapter' | 'install-package',\r\n): string {\r\n const lines = [\r\n 'Unable to determine the database type.',\r\n '',\r\n 'Supported databases:',\r\n ...supported.map((entry) => ` • ${entry.displayName}`),\r\n '',\r\n 'Try specifying a type:',\r\n ' <DatabaseDevTools database={db} type=\"sqlite\" />',\r\n '',\r\n 'Or provide a custom adapter:',\r\n ' <DatabaseDevTools database={db} adapter={myAdapter} />',\r\n ];\r\n\r\n if (hint === 'install-package') {\r\n lines.push(\r\n '',\r\n 'For SQLite, install expo-sqlite:',\r\n ' npm install expo-sqlite',\r\n );\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n","import { readDatabaseKindMarker } from '../types/kind';\r\nimport type { AdapterDefinition } from './types';\r\n\r\nexport class AdapterRegistry {\r\n private readonly definitions = new Map<string, AdapterDefinition>();\r\n\r\n register(definition: AdapterDefinition): void {\r\n this.definitions.set(definition.kind, definition);\r\n }\r\n\r\n get(kind: string): AdapterDefinition | undefined {\r\n return this.definitions.get(kind);\r\n }\r\n\r\n listSupported(): { kind: string; displayName: string }[] {\r\n return [...this.definitions.values()]\r\n .sort((left, right) => left.displayName.localeCompare(right.displayName))\r\n .map((definition) => ({\r\n kind: definition.kind,\r\n displayName: definition.displayName,\r\n }));\r\n }\r\n\r\n detect(database: unknown): AdapterDefinition | undefined {\r\n const markerKind = readDatabaseKindMarker(database);\r\n\r\n if (markerKind) {\r\n const marked = this.definitions.get(markerKind);\r\n\r\n if (marked) {\r\n return marked;\r\n }\r\n }\r\n\r\n const matches = [...this.definitions.values()]\r\n .filter((definition) => {\r\n try {\r\n return definition.detect(database);\r\n } catch {\r\n return false;\r\n }\r\n })\r\n .sort((left, right) => right.priority - left.priority);\r\n\r\n return matches[0];\r\n }\r\n}\r\n\r\nlet globalRegistry: AdapterRegistry | null = null;\r\n\r\nexport function getAdapterRegistry(): AdapterRegistry {\r\n if (!globalRegistry) {\r\n globalRegistry = new AdapterRegistry();\r\n }\r\n\r\n return globalRegistry;\r\n}\r\n\r\nexport function resetAdapterRegistry(): void {\r\n globalRegistry = null;\r\n}\r\n","import type {\r\n DeleteOperation,\r\n InsertOperation,\r\n UpdateOperation,\r\n WriteCellValue,\r\n} from '../../types/write';\r\n\r\nconst IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\r\n\r\nexport function quoteIdentifier(name: string): string {\r\n if (!IDENTIFIER_PATTERN.test(name)) {\r\n throw new Error(`Invalid identifier: ${name}`);\r\n }\r\n\r\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\r\n}\r\n\r\nexport function buildInsertSql(operation: InsertOperation): { sql: string; params: WriteCellValue[] } {\r\n const columns = Object.keys(operation.values);\r\n\r\n if (columns.length === 0) {\r\n throw new Error('Insert requires at least one column value');\r\n }\r\n\r\n const quotedColumns = columns.map(quoteIdentifier).join(', ');\r\n const placeholders = columns.map(() => '?').join(', ');\r\n const sql = `INSERT INTO ${quoteIdentifier(operation.table)} (${quotedColumns}) VALUES (${placeholders})`;\r\n const params = columns.map((column) => operation.values[column] ?? null);\r\n\r\n return { sql, params };\r\n}\r\n\r\nexport function buildUpdateSql(operation: UpdateOperation): { sql: string; params: WriteCellValue[] } {\r\n const valueColumns = Object.keys(operation.values);\r\n const pkColumns = Object.keys(operation.primaryKey);\r\n\r\n if (valueColumns.length === 0) {\r\n throw new Error('Update requires at least one column value');\r\n }\r\n\r\n if (pkColumns.length === 0) {\r\n throw new Error('Update requires a primary key');\r\n }\r\n\r\n const setClause = valueColumns.map((column) => `${quoteIdentifier(column)} = ?`).join(', ');\r\n const whereClause = pkColumns.map((column) => `${quoteIdentifier(column)} = ?`).join(' AND ');\r\n const sql = `UPDATE ${quoteIdentifier(operation.table)} SET ${setClause} WHERE ${whereClause}`;\r\n const params = [\r\n ...valueColumns.map((column) => operation.values[column] ?? null),\r\n ...pkColumns.map((column) => operation.primaryKey[column] ?? null),\r\n ];\r\n\r\n return { sql, params };\r\n}\r\n\r\nexport function buildDeleteSql(operation: DeleteOperation): { sql: string; params: WriteCellValue[] } {\r\n const pkColumns = Object.keys(operation.primaryKey);\r\n\r\n if (pkColumns.length === 0) {\r\n throw new Error('Delete requires a primary key');\r\n }\r\n\r\n const whereClause = pkColumns.map((column) => `${quoteIdentifier(column)} = ?`).join(' AND ');\r\n const sql = `DELETE FROM ${quoteIdentifier(operation.table)} WHERE ${whereClause}`;\r\n const params = pkColumns.map((column) => operation.primaryKey[column] ?? null);\r\n\r\n return { sql, params };\r\n}\r\n","import type { WritableDatabaseAdapter } from '../../types/adapter';\r\nimport type { WriteOperation } from '../../types/write';\r\nimport { SQLITE_SNAPSHOT_MIME_TYPE } from '../../types/snapshot';\r\nimport {\r\n buildDeleteSql,\r\n buildInsertSql,\r\n buildUpdateSql,\r\n} from './buildWriteSql';\r\nimport type { ExpoSqliteDatabase } from './types';\r\n\r\nexport type CreateExpoSqliteAdapterOptions = {\r\n database: ExpoSqliteDatabase;\r\n id?: string;\r\n name?: string;\r\n};\r\n\r\nexport function createExpoSqliteAdapter(\r\n options: CreateExpoSqliteAdapterOptions,\r\n): WritableDatabaseAdapter {\r\n const { database } = options;\r\n let inTransaction = false;\r\n let operationQueue: Promise<void> = Promise.resolve();\r\n\r\n const enqueue = async <T>(operation: () => Promise<T>): Promise<T> => {\r\n const next = operationQueue.then(operation);\r\n operationQueue = next.then(\r\n () => undefined,\r\n () => undefined,\r\n );\r\n return next;\r\n };\r\n\r\n const assertTransaction = (): void => {\r\n if (!inTransaction) {\r\n throw new Error('No open transaction. Call beginTransaction() first.');\r\n }\r\n };\r\n\r\n const runWrite = async (operation: WriteOperation) => {\r\n assertTransaction();\r\n\r\n let sql: string;\r\n let params: unknown[];\r\n\r\n switch (operation.kind) {\r\n case 'insert': {\r\n const built = buildInsertSql(operation);\r\n sql = built.sql;\r\n params = built.params;\r\n break;\r\n }\r\n case 'update': {\r\n const built = buildUpdateSql(operation);\r\n sql = built.sql;\r\n params = built.params;\r\n break;\r\n }\r\n case 'delete': {\r\n const built = buildDeleteSql(operation);\r\n sql = built.sql;\r\n params = built.params;\r\n break;\r\n }\r\n default: {\r\n const exhaustive: never = operation;\r\n throw new Error(`Unsupported write operation: ${(exhaustive as WriteOperation).kind}`);\r\n }\r\n }\r\n\r\n const result = await database.runAsync(sql, params);\r\n return { rowsAffected: result.changes };\r\n };\r\n\r\n return {\r\n kind: 'sqlite',\r\n dialect: 'sqlite',\r\n id: options.id ?? database.databasePath,\r\n name: options.name ?? 'SQLite',\r\n capabilities: {\r\n exportSnapshot: true,\r\n executeQuery: false,\r\n listTables: false,\r\n getSchema: false,\r\n transactionalWrites: true,\r\n observeChanges: false,\r\n importSnapshot: false,\r\n },\r\n async exportSnapshot() {\r\n return enqueue(async () => {\r\n if (inTransaction) {\r\n throw new Error('Cannot export while a write transaction is open');\r\n }\r\n\r\n await database.execAsync('PRAGMA wal_checkpoint(FULL)');\r\n const bytes = await database.serializeAsync();\r\n\r\n return {\r\n bytes,\r\n mimeType: SQLITE_SNAPSHOT_MIME_TYPE,\r\n kind: 'sqlite' as const,\r\n exportedAt: Date.now(),\r\n };\r\n });\r\n },\r\n async beginTransaction() {\r\n return enqueue(async () => {\r\n if (inTransaction) {\r\n throw new Error('Transaction already open');\r\n }\r\n\r\n await database.execAsync('BEGIN IMMEDIATE');\r\n inTransaction = true;\r\n });\r\n },\r\n async commitTransaction() {\r\n return enqueue(async () => {\r\n assertTransaction();\r\n\r\n try {\r\n await database.execAsync('COMMIT');\r\n } finally {\r\n inTransaction = false;\r\n }\r\n });\r\n },\r\n async rollbackTransaction() {\r\n return enqueue(async () => {\r\n if (!inTransaction) {\r\n return;\r\n }\r\n\r\n try {\r\n await database.execAsync('ROLLBACK');\r\n } finally {\r\n inTransaction = false;\r\n }\r\n });\r\n },\r\n executeWrite: (operation) => enqueue(() => runWrite(operation)),\r\n };\r\n}\r\n","import type { ExpoSqliteDatabase, ExpoSqliteInspectableDatabase } from './types';\r\n\r\nexport function detectExpoSqlite(database: unknown): database is ExpoSqliteDatabase {\r\n return (\r\n typeof database === 'object' &&\r\n database !== null &&\r\n typeof (database as ExpoSqliteDatabase).execAsync === 'function' &&\r\n typeof (database as ExpoSqliteDatabase).serializeAsync === 'function' &&\r\n typeof (database as ExpoSqliteDatabase).runAsync === 'function' &&\r\n typeof (database as ExpoSqliteDatabase).databasePath === 'string'\r\n );\r\n}\r\n\r\nexport function detectExpoSqliteInspectable(\r\n database: unknown,\r\n): database is ExpoSqliteInspectableDatabase {\r\n return (\r\n detectExpoSqlite(database) &&\r\n typeof (database as ExpoSqliteInspectableDatabase).getAllAsync === 'function' &&\r\n typeof (database as ExpoSqliteInspectableDatabase).getFirstAsync === 'function'\r\n );\r\n}\r\n","import { getAdapterRegistry } from '../../adapter/registry';\r\nimport type { AdapterDefinition } from '../../adapter/types';\r\nimport { createExpoSqliteAdapter } from './createExpoSqliteAdapter';\r\nimport { detectExpoSqlite } from './detect';\r\nimport type { ExpoSqliteDatabase } from './types';\r\n\r\nexport const sqliteAdapterDefinition: AdapterDefinition = {\r\n kind: 'sqlite',\r\n displayName: 'SQLite',\r\n priority: 100,\r\n detect: detectExpoSqlite,\r\n create: (database) =>\r\n createExpoSqliteAdapter({\r\n database: database as ExpoSqliteDatabase,\r\n name: (database as ExpoSqliteDatabase).databasePath,\r\n }),\r\n};\r\n\r\nexport function registerSqliteAdapter(): void {\r\n getAdapterRegistry().register(sqliteAdapterDefinition);\r\n}\r\n","import { registerSqliteAdapter } from '../adapters/sqlite/register';\r\n\r\nexport async function registerBuiltInAdapters(): Promise<void> {\r\n registerSqliteAdapter();\r\n}\r\n","import type { DatabaseAdapter } from '../types/adapter';\r\nimport { AdapterResolutionError } from './errors';\r\nimport { getAdapterRegistry } from './registry';\r\nimport { registerBuiltInAdapters } from './registerBuiltins';\r\nimport type { ResolveAdapterOptions } from './types';\r\n\r\nexport async function resolveAdapter(\r\n database: unknown,\r\n options: ResolveAdapterOptions = {},\r\n): Promise<DatabaseAdapter> {\r\n if (options.adapter) {\r\n return options.adapter;\r\n }\r\n\r\n if (!database) {\r\n throw new AdapterResolutionError([], 'adapter');\r\n }\r\n\r\n await registerBuiltInAdapters();\r\n\r\n const registry = getAdapterRegistry();\r\n\r\n if (options.type) {\r\n const definition = registry.get(options.type);\r\n\r\n if (!definition) {\r\n throw new AdapterResolutionError(registry.listSupported(), 'type');\r\n }\r\n\r\n return definition.create(database);\r\n }\r\n\r\n const detected = registry.detect(database);\r\n\r\n if (!detected) {\r\n throw new AdapterResolutionError(\r\n registry.listSupported(),\r\n registry.listSupported().length === 0 ? 'install-package' : 'type',\r\n );\r\n }\r\n\r\n return detected.create(database);\r\n}\r\n","import type { DatabaseKind } from '../types/kind';\r\nimport type { DatabaseInspector, InspectorDefinition } from './types';\r\n\r\nexport class InspectorRegistry {\r\n private readonly definitions = new Map<string, InspectorDefinition>();\r\n\r\n register(definition: InspectorDefinition): void {\r\n this.definitions.set(definition.kind, definition);\r\n }\r\n\r\n get(kind: DatabaseKind): InspectorDefinition | undefined {\r\n return this.definitions.get(kind);\r\n }\r\n\r\n listSupported(): { kind: string; displayName: string }[] {\r\n return [...this.definitions.values()]\r\n .sort((left, right) => left.displayName.localeCompare(right.displayName))\r\n .map((definition) => ({\r\n kind: definition.kind,\r\n displayName: definition.displayName,\r\n }));\r\n }\r\n\r\n detectFromBytes(bytes: ArrayBuffer): InspectorDefinition | undefined {\r\n return [...this.definitions.values()].find((definition) => definition.canOpenBytes?.(bytes));\r\n }\r\n\r\n detectFromSnapshot(input: { kind: DatabaseKind; mimeType: string }): InspectorDefinition | undefined {\r\n const byKind = this.definitions.get(input.kind);\r\n\r\n if (byKind) {\r\n return byKind;\r\n }\r\n\r\n return [...this.definitions.values()].find((definition) =>\r\n definition.mimeTypes.includes(input.mimeType),\r\n );\r\n }\r\n}\r\n\r\nlet globalInspectorRegistry: InspectorRegistry | null = null;\r\n\r\nexport function getInspectorRegistry(): InspectorRegistry {\r\n if (!globalInspectorRegistry) {\r\n globalInspectorRegistry = new InspectorRegistry();\r\n }\r\n\r\n return globalInspectorRegistry;\r\n}\r\n\r\nexport function resetInspectorRegistry(): void {\r\n globalInspectorRegistry = null;\r\n}\r\n\r\nexport async function createInspectorForSnapshot(input: {\r\n kind: DatabaseKind;\r\n mimeType: string;\r\n bytes: ArrayBuffer;\r\n}): Promise<DatabaseInspector> {\r\n const registry = getInspectorRegistry();\r\n const definition =\r\n registry.get(input.kind) ??\r\n registry.detectFromBytes(input.bytes) ??\r\n registry.detectFromSnapshot(input);\r\n\r\n if (!definition) {\r\n throw new Error(`No inspector registered for database kind \"${input.kind}\"`);\r\n }\r\n\r\n const inspector = await definition.createInspector();\r\n await inspector.open(input.bytes);\r\n return inspector;\r\n}\r\n","export function generateConnectionId(): string {\r\n return generateUniqueId('conn');\r\n}\r\n\r\nexport function generateDeviceId(): string {\r\n return generateUniqueId('device');\r\n}\r\n\r\nexport function generatePingId(): string {\r\n return generateUniqueId('ping');\r\n}\r\n\r\nexport function generateSyncId(): string {\r\n return generateUniqueId('sync');\r\n}\r\n\r\nexport function generateTransactionId(): string {\r\n return generateUniqueId('txn');\r\n}\r\n\r\nexport function generateWriteId(): string {\r\n return generateUniqueId('write');\r\n}\r\n\r\nfunction generateUniqueId(prefix: string): string {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return `${prefix}-${crypto.randomUUID()}`;\r\n }\r\n\r\n const random = Math.random().toString(36).slice(2, 10);\r\n return `${prefix}-${Date.now()}-${random}`;\r\n}\r\n","export type ReconnectOptions = {\n baseMs?: number;\n maxMs?: number;\n jitterMs?: number;\n};\n\nconst DEFAULT_BASE_MS = 1_000;\nconst DEFAULT_MAX_MS = 30_000;\nconst DEFAULT_JITTER_MS = 500;\n\nexport function calculateBackoffDelay(attempt: number, options: ReconnectOptions = {}): number {\n const baseMs = options.baseMs ?? DEFAULT_BASE_MS;\n const maxMs = options.maxMs ?? DEFAULT_MAX_MS;\n const jitterMs = options.jitterMs ?? DEFAULT_JITTER_MS;\n\n const exponential = baseMs * 2 ** attempt;\n const capped = Math.min(exponential, maxMs);\n const jitter = Math.floor(Math.random() * jitterMs);\n\n return capped + jitter;\n}\n\nexport type ReconnectSchedulerOptions = ReconnectOptions & {\n onReconnect: () => void;\n};\n\nexport class ReconnectScheduler {\n private attempt = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly onReconnect: () => void;\n private readonly options: ReconnectOptions;\n\n constructor({ onReconnect, ...options }: ReconnectSchedulerOptions) {\n this.onReconnect = onReconnect;\n this.options = options;\n }\n\n schedule(): void {\n if (this.timer !== null) {\n return;\n }\n\n const delay = calculateBackoffDelay(this.attempt, this.options);\n this.attempt += 1;\n\n this.timer = setTimeout(() => {\n this.timer = null;\n this.onReconnect();\n }, delay);\n }\n\n reset(): void {\n this.attempt = 0;\n this.cancel();\n }\n\n cancel(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n","import {\r\n buildDevToolsWsUrl,\r\n DEFAULT_DEVTOOLS_PORT,\r\n DevToolsRole,\r\n isBeginTransactionMessage,\r\n isCommitTransactionMessage,\r\n isDeviceStatusMessage,\r\n isExecuteWriteMessage,\r\n isExportSnapshotErrorMessage,\r\n isPingMessage,\r\n isRefreshErrorMessage,\r\n isRefreshStatusMessage,\r\n isRollbackTransactionMessage,\r\n isSnapshotReadyMessage,\r\n isSnapshotUploadRequestedMessage,\r\n isTransactionStatusMessage,\r\n isWriteErrorMessage,\r\n isWriteResultMessage,\r\n MessageType,\r\n type ClientMessage,\r\n type DeviceMetadata,\r\n type DeviceStatusPayload,\r\n type ExportSnapshotErrorMessage,\r\n type PongMessage,\r\n type RefreshErrorMessage,\r\n type RefreshRequestMessage,\r\n type RefreshStatusMessage,\r\n type RegisterMessage,\r\n type SnapshotReadyMessage,\r\n type SnapshotUploadRequestedMessage,\r\n type TransactionAckMessage,\r\n type TransactionStatusMessage,\r\n type WriteAckMessage,\r\n type WriteErrorMessage,\r\n type WriteResultMessage,\r\n} from '../types/protocol';\r\nimport type { WriteOperation } from '../types/write';\r\nimport { generateDeviceId, generateTransactionId, generateWriteId } from '../utils/ids';\r\nimport { ReconnectScheduler } from '../utils/reconnect';\r\n\r\nexport type ConnectionState = 'connecting' | 'connected' | 'reconnecting' | 'disconnected';\r\n\r\nexport type TransactionState = 'idle' | 'opening' | 'open' | 'committing' | 'rolling_back';\r\n\r\nexport type DevToolsClientOptions = {\r\n serverUrl?: string;\r\n role?: DevToolsRole;\r\n deviceId?: string;\r\n metadata?: DeviceMetadata;\r\n WebSocketImpl?: typeof WebSocket;\r\n onConnect?: () => void;\r\n onDisconnect?: () => void;\r\n onConnectionStateChange?: (state: ConnectionState) => void;\r\n onDeviceStatus?: (status: DeviceStatusPayload) => void;\r\n onSnapshotUploadRequested?: (message: SnapshotUploadRequestedMessage) => void;\r\n onExportSnapshotError?: (message: ExportSnapshotErrorMessage) => void;\r\n onRefreshStatus?: (message: RefreshStatusMessage) => void;\r\n onSnapshotReady?: (message: SnapshotReadyMessage) => void;\r\n onRefreshError?: (message: RefreshErrorMessage) => void;\r\n onBeginTransaction?: (message: import('../types/protocol').BeginTransactionMessage) => void;\r\n onCommitTransaction?: (message: import('../types/protocol').CommitTransactionMessage) => void;\r\n onRollbackTransaction?: (message: import('../types/protocol').RollbackTransactionMessage) => void;\r\n onExecuteWrite?: (message: import('../types/protocol').ExecuteWriteMessage) => void;\r\n onTransactionStatus?: (message: TransactionStatusMessage) => void;\r\n onWriteResult?: (message: WriteResultMessage) => void;\r\n onWriteError?: (message: WriteErrorMessage) => void;\r\n onTransactionStateChange?: (state: TransactionState) => void;\r\n onError?: (error: Error) => void;\r\n};\r\n\r\nexport type DevToolsClient = {\r\n connect: () => void;\r\n disconnect: () => void;\r\n getConnectionState: () => ConnectionState;\r\n getLastConnectionError: () => string | null;\r\n getDeviceStatus: () => DeviceStatusPayload | null;\r\n getDeviceId: () => string | undefined;\r\n getServerUrl: () => string;\r\n setServerUrl: (url: string) => void;\r\n send: (message: ClientMessageInput) => void;\r\n requestRefresh: (deviceId: string) => void;\r\n requestExportSnapshot: () => void;\r\n sendTransactionAck: (message: Omit<TransactionAckMessage, 'timestamp' | 'type'>) => void;\r\n sendWriteAck: (message: Omit<WriteAckMessage, 'timestamp' | 'type'>) => void;\r\n beginTransaction: (deviceId: string) => Promise<void>;\r\n commitTransaction: () => Promise<void>;\r\n rollbackTransaction: () => Promise<void>;\r\n executeWrite: (operation: WriteOperation) => Promise<{ rowsAffected: number }>;\r\n getTransactionState: () => TransactionState;\r\n getActiveTransactionId: () => string | null;\r\n};\r\n\r\ntype ClientMessageInput =\r\n | Omit<RegisterMessage, 'timestamp'>\r\n | Omit<PongMessage, 'timestamp'>\r\n | Omit<RefreshRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').ExportSnapshotRequestMessage, 'timestamp'>\r\n | Omit<TransactionAckMessage, 'timestamp'>\r\n | Omit<WriteAckMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').BeginTransactionRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').CommitTransactionRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').RollbackTransactionRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').WriteRequestMessage, 'timestamp'>;\r\n\r\nconst WRITE_TIMEOUT_MS = 30_000;\r\n\r\nexport function createDevToolsClient(options: DevToolsClientOptions = {}): DevToolsClient {\r\n const role = options.role ?? DevToolsRole.MOBILE;\r\n const WebSocketImpl = options.WebSocketImpl ?? globalThis.WebSocket;\r\n\r\n if (!WebSocketImpl) {\r\n throw new Error('WebSocket is not available in this environment.');\r\n }\r\n\r\n let socket: InstanceType<typeof WebSocketImpl> | null = null;\r\n let deviceStatus: DeviceStatusPayload | null = null;\r\n let connectionState: ConnectionState = 'disconnected';\r\n let lastConnectionError: string | null = null;\r\n let intentionalDisconnect = false;\r\n let transactionState: TransactionState = 'idle';\r\n let activeTransactionId: string | null = null;\r\n let activeDeviceId: string | null = null;\r\n\r\n const pendingTransaction = new Map<\r\n string,\r\n { resolve: () => void; reject: (error: Error) => void; action: 'begin' | 'commit' | 'rollback' }\r\n >();\r\n const pendingWrites = new Map<\r\n string,\r\n { resolve: (result: { rowsAffected: number }) => void; reject: (error: Error) => void }\r\n >();\r\n\r\n const deviceId =\r\n role === DevToolsRole.MOBILE ? (options.deviceId ?? generateDeviceId()) : undefined;\r\n\r\n let wsUrl =\r\n options.serverUrl ?? buildDevToolsWsUrl('localhost', DEFAULT_DEVTOOLS_PORT);\r\n\r\n const setConnectionState = (state: ConnectionState): void => {\r\n if (connectionState === state) {\r\n return;\r\n }\r\n\r\n connectionState = state;\r\n options.onConnectionStateChange?.(state);\r\n };\r\n\r\n const setTransactionState = (state: TransactionState): void => {\r\n if (transactionState === state) {\r\n return;\r\n }\r\n\r\n transactionState = state;\r\n options.onTransactionStateChange?.(state);\r\n };\r\n\r\n const resetTransaction = (): void => {\r\n setTransactionState('idle');\r\n activeTransactionId = null;\r\n activeDeviceId = null;\r\n };\r\n\r\n const rejectPendingTransaction = (transactionId: string, error: Error): void => {\r\n const pending = pendingTransaction.get(transactionId);\r\n\r\n if (pending) {\r\n pending.reject(error);\r\n pendingTransaction.delete(transactionId);\r\n }\r\n };\r\n\r\n const rejectAllPending = (error: Error): void => {\r\n for (const [id, pending] of pendingTransaction) {\r\n pending.reject(error);\r\n pendingTransaction.delete(id);\r\n }\r\n\r\n for (const [id, pending] of pendingWrites) {\r\n pending.reject(error);\r\n pendingWrites.delete(id);\r\n }\r\n\r\n resetTransaction();\r\n };\r\n\r\n const reconnectScheduler = new ReconnectScheduler({\r\n onReconnect: () => {\r\n openSocket();\r\n },\r\n });\r\n\r\n const send = (message: ClientMessageInput): void => {\r\n if (!socket || socket.readyState !== WebSocketImpl.OPEN) {\r\n return;\r\n }\r\n\r\n socket.send(JSON.stringify({ ...message, timestamp: Date.now() }));\r\n };\r\n\r\n const sendRegister = (): void => {\r\n send({\r\n type: MessageType.REGISTER,\r\n role,\r\n ...(deviceId ? { deviceId } : {}),\r\n ...(options.metadata ? { metadata: options.metadata } : {}),\r\n });\r\n };\r\n\r\n const handleServerMessage = (parsed: unknown): void => {\r\n if (isPingMessage(parsed)) {\r\n send({\r\n type: MessageType.PONG,\r\n pingId: parsed.pingId,\r\n });\r\n return;\r\n }\r\n\r\n if (isDeviceStatusMessage(parsed)) {\r\n deviceStatus = parsed.payload;\r\n options.onDeviceStatus?.(parsed.payload);\r\n return;\r\n }\r\n\r\n if (isSnapshotUploadRequestedMessage(parsed)) {\r\n options.onSnapshotUploadRequested?.(parsed);\r\n return;\r\n }\r\n\r\n if (isExportSnapshotErrorMessage(parsed)) {\r\n options.onExportSnapshotError?.(parsed);\r\n return;\r\n }\r\n\r\n if (isRefreshStatusMessage(parsed)) {\r\n options.onRefreshStatus?.(parsed);\r\n return;\r\n }\r\n\r\n if (isSnapshotReadyMessage(parsed)) {\r\n options.onSnapshotReady?.(parsed);\r\n return;\r\n }\r\n\r\n if (isRefreshErrorMessage(parsed)) {\r\n options.onRefreshError?.(parsed);\r\n return;\r\n }\r\n\r\n if (isBeginTransactionMessage(parsed)) {\r\n options.onBeginTransaction?.(parsed);\r\n return;\r\n }\r\n\r\n if (isCommitTransactionMessage(parsed)) {\r\n options.onCommitTransaction?.(parsed);\r\n return;\r\n }\r\n\r\n if (isRollbackTransactionMessage(parsed)) {\r\n options.onRollbackTransaction?.(parsed);\r\n return;\r\n }\r\n\r\n if (isExecuteWriteMessage(parsed)) {\r\n options.onExecuteWrite?.(parsed);\r\n return;\r\n }\r\n\r\n if (isTransactionStatusMessage(parsed)) {\r\n options.onTransactionStatus?.(parsed);\r\n\r\n if (role !== DevToolsRole.BROWSER) {\r\n return;\r\n }\r\n\r\n const pending = pendingTransaction.get(parsed.transactionId);\r\n\r\n if (parsed.state === 'open' && pending?.action === 'begin') {\r\n setTransactionState('open');\r\n activeTransactionId = parsed.transactionId;\r\n activeDeviceId = parsed.deviceId;\r\n pending.resolve();\r\n pendingTransaction.delete(parsed.transactionId);\r\n return;\r\n }\r\n\r\n if (parsed.state === 'idle' && pending && (pending.action === 'commit' || pending.action === 'rollback')) {\r\n resetTransaction();\r\n pending.resolve();\r\n pendingTransaction.delete(parsed.transactionId);\r\n return;\r\n }\r\n\r\n if (parsed.state === 'failed') {\r\n rejectPendingTransaction(\r\n parsed.transactionId,\r\n new Error(parsed.message ?? 'Transaction failed'),\r\n );\r\n resetTransaction();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (isWriteResultMessage(parsed)) {\r\n options.onWriteResult?.(parsed);\r\n\r\n const pending = pendingWrites.get(parsed.writeId);\r\n\r\n if (pending) {\r\n pending.resolve({ rowsAffected: parsed.rowsAffected });\r\n pendingWrites.delete(parsed.writeId);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (isWriteErrorMessage(parsed)) {\r\n options.onWriteError?.(parsed);\r\n\r\n const error = new Error(parsed.message);\r\n\r\n if (parsed.writeId) {\r\n const pendingWrite = pendingWrites.get(parsed.writeId);\r\n\r\n if (pendingWrite) {\r\n pendingWrite.reject(error);\r\n pendingWrites.delete(parsed.writeId);\r\n }\r\n } else {\r\n rejectPendingTransaction(parsed.transactionId, error);\r\n resetTransaction();\r\n }\r\n }\r\n };\r\n\r\n const openSocket = (): void => {\r\n if (\r\n socket &&\r\n (socket.readyState === WebSocketImpl.OPEN || socket.readyState === WebSocketImpl.CONNECTING)\r\n ) {\r\n return;\r\n }\r\n\r\n setConnectionState(intentionalDisconnect ? 'disconnected' : connectionState === 'disconnected' ? 'connecting' : 'reconnecting');\r\n\r\n socket = new WebSocketImpl(wsUrl);\r\n\r\n socket.addEventListener('open', () => {\r\n reconnectScheduler.reset();\r\n lastConnectionError = null;\r\n setConnectionState('connected');\r\n options.onConnect?.();\r\n sendRegister();\r\n });\r\n\r\n socket.addEventListener('message', (event) => {\r\n let parsed: unknown;\r\n\r\n try {\r\n parsed = JSON.parse(String(event.data));\r\n } catch {\r\n return;\r\n }\r\n\r\n handleServerMessage(parsed);\r\n });\r\n\r\n socket.addEventListener('close', () => {\r\n socket = null;\r\n options.onDisconnect?.();\r\n rejectAllPending(new Error('Disconnected from DevTools hub'));\r\n\r\n if (intentionalDisconnect) {\r\n setConnectionState('disconnected');\r\n return;\r\n }\r\n\r\n setConnectionState('reconnecting');\r\n reconnectScheduler.schedule();\r\n });\r\n\r\n socket.addEventListener('error', () => {\r\n const error = new Error(`WebSocket connection failed: ${wsUrl}`);\r\n lastConnectionError = error.message;\r\n options.onError?.(error);\r\n });\r\n };\r\n\r\n const connect = (): void => {\r\n intentionalDisconnect = false;\r\n openSocket();\r\n };\r\n\r\n const disconnect = (): void => {\r\n intentionalDisconnect = true;\r\n reconnectScheduler.cancel();\r\n socket?.close();\r\n socket = null;\r\n rejectAllPending(new Error('Disconnected'));\r\n setConnectionState('disconnected');\r\n };\r\n\r\n const setServerUrl = (url: string): void => {\r\n wsUrl = url;\r\n const wasConnected =\r\n connectionState === 'connected' ||\r\n connectionState === 'connecting' ||\r\n connectionState === 'reconnecting';\r\n\r\n disconnect();\r\n intentionalDisconnect = false;\r\n\r\n if (wasConnected) {\r\n connect();\r\n }\r\n };\r\n\r\n const requestRefresh = (targetDeviceId: string): void => {\r\n send({\r\n type: MessageType.REFRESH_REQUEST,\r\n deviceId: targetDeviceId,\r\n refreshType: 'snapshot',\r\n });\r\n };\r\n\r\n const requestExportSnapshot = (): void => {\r\n send({\r\n type: MessageType.EXPORT_SNAPSHOT_REQUEST,\r\n refreshType: 'snapshot',\r\n });\r\n };\r\n\r\n const sendTransactionAck = (message: Omit<TransactionAckMessage, 'timestamp' | 'type'>): void => {\r\n send({\r\n type: MessageType.TRANSACTION_ACK,\r\n ...message,\r\n });\r\n };\r\n\r\n const sendWriteAck = (message: Omit<WriteAckMessage, 'timestamp' | 'type'>): void => {\r\n send({\r\n type: MessageType.WRITE_ACK,\r\n ...message,\r\n });\r\n };\r\n\r\n const waitForTransaction = (\r\n transactionId: string,\r\n action: 'begin' | 'commit' | 'rollback',\r\n ): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n pendingTransaction.delete(transactionId);\r\n reject(new Error(`Transaction ${action} timed out`));\r\n }, WRITE_TIMEOUT_MS);\r\n\r\n pendingTransaction.set(transactionId, {\r\n action,\r\n resolve: () => {\r\n clearTimeout(timer);\r\n resolve();\r\n },\r\n reject: (error) => {\r\n clearTimeout(timer);\r\n reject(error);\r\n },\r\n });\r\n });\r\n };\r\n\r\n const beginTransaction = async (targetDeviceId: string): Promise<void> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('beginTransaction is only available for browser clients');\r\n }\r\n\r\n if (transactionState !== 'idle') {\r\n throw new Error('A transaction is already active');\r\n }\r\n\r\n const transactionId = generateTransactionId();\r\n setTransactionState('opening');\r\n activeTransactionId = transactionId;\r\n activeDeviceId = targetDeviceId;\r\n\r\n const promise = waitForTransaction(transactionId, 'begin');\r\n\r\n send({\r\n type: MessageType.BEGIN_TRANSACTION_REQUEST,\r\n transactionId,\r\n deviceId: targetDeviceId,\r\n });\r\n\r\n await promise;\r\n };\r\n\r\n const commitTransaction = async (): Promise<void> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('commitTransaction is only available for browser clients');\r\n }\r\n\r\n if (!activeTransactionId || !activeDeviceId || transactionState !== 'open') {\r\n throw new Error('No open transaction');\r\n }\r\n\r\n const transactionId = activeTransactionId;\r\n const deviceIdForCommit = activeDeviceId;\r\n setTransactionState('committing');\r\n\r\n const promise = waitForTransaction(transactionId, 'commit');\r\n\r\n send({\r\n type: MessageType.COMMIT_TRANSACTION_REQUEST,\r\n transactionId,\r\n deviceId: deviceIdForCommit,\r\n });\r\n\r\n await promise;\r\n };\r\n\r\n const rollbackTransaction = async (): Promise<void> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('rollbackTransaction is only available for browser clients');\r\n }\r\n\r\n if (!activeTransactionId || !activeDeviceId) {\r\n throw new Error('No active transaction');\r\n }\r\n\r\n const transactionId = activeTransactionId;\r\n const deviceIdForRollback = activeDeviceId;\r\n setTransactionState('rolling_back');\r\n\r\n const promise = waitForTransaction(transactionId, 'rollback');\r\n\r\n send({\r\n type: MessageType.ROLLBACK_TRANSACTION_REQUEST,\r\n transactionId,\r\n deviceId: deviceIdForRollback,\r\n });\r\n\r\n await promise;\r\n };\r\n\r\n const executeWrite = async (operation: WriteOperation): Promise<{ rowsAffected: number }> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('executeWrite is only available for browser clients');\r\n }\r\n\r\n if (!activeTransactionId || !activeDeviceId || transactionState !== 'open') {\r\n throw new Error('No open transaction');\r\n }\r\n\r\n const writeId = generateWriteId();\r\n\r\n const promise = new Promise<{ rowsAffected: number }>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n pendingWrites.delete(writeId);\r\n reject(new Error('Write operation timed out'));\r\n }, WRITE_TIMEOUT_MS);\r\n\r\n pendingWrites.set(writeId, {\r\n resolve: (result) => {\r\n clearTimeout(timer);\r\n resolve(result);\r\n },\r\n reject: (error) => {\r\n clearTimeout(timer);\r\n reject(error);\r\n },\r\n });\r\n });\r\n\r\n send({\r\n type: MessageType.WRITE_REQUEST,\r\n writeId,\r\n transactionId: activeTransactionId,\r\n deviceId: activeDeviceId,\r\n operation,\r\n });\r\n\r\n return promise;\r\n };\r\n\r\n return {\r\n connect,\r\n disconnect,\r\n getConnectionState: () => connectionState,\r\n getLastConnectionError: () => lastConnectionError,\r\n getDeviceStatus: () => deviceStatus,\r\n getDeviceId: () => deviceId,\r\n getServerUrl: () => wsUrl,\r\n setServerUrl,\r\n send,\r\n requestRefresh,\r\n requestExportSnapshot,\r\n sendTransactionAck,\r\n sendWriteAck,\r\n beginTransaction,\r\n commitTransaction,\r\n rollbackTransaction,\r\n executeWrite,\r\n getTransactionState: () => transactionState,\r\n getActiveTransactionId: () => activeTransactionId,\r\n };\r\n}\r\n","export async function fetchSnapshot(downloadUrl: string): Promise<ArrayBuffer> {\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(downloadUrl);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(\r\n `Network error fetching snapshot from ${downloadUrl}. ${networkMessage} If the web UI runs on a different port than the hub, ensure CORS is enabled on the hub HTTP API.`,\r\n );\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch snapshot from ${downloadUrl}: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n\r\n return response.arrayBuffer();\r\n}\r\n","import {\r\n PROJECT_DEVICE_EXPORTS_API_PATH,\r\n wsUrlToHttpUrl,\r\n} from '../types/protocol';\r\nimport type { ResolveProjectDatabaseUrlOptions } from './resolveProjectDatabaseUrl';\r\n\r\nfunction resolveApiBase(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string {\r\n if (options?.useSameOriginApi && typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n\r\n if (serverUrl.startsWith('ws://') || serverUrl.startsWith('wss://')) {\r\n return wsUrlToHttpUrl(serverUrl);\r\n }\r\n\r\n return serverUrl.replace(/\\/$/, '');\r\n}\r\n\r\nexport function resolveDeviceExportDatabaseUrl(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n const base = resolveApiBase(serverUrl, options);\r\n return `${base}${PROJECT_DEVICE_EXPORTS_API_PATH}/${encodeURIComponent(deviceId)}/database`;\r\n}\r\n\r\nexport function resolveDeviceExportDatabaseMetaUrl(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n const base = resolveApiBase(serverUrl, options);\r\n return `${base}${PROJECT_DEVICE_EXPORTS_API_PATH}/${encodeURIComponent(deviceId)}/database/meta`;\r\n}\r\n\r\nexport function resolveDeviceExportsUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n const base = resolveApiBase(serverUrl, options);\r\n return `${base}${PROJECT_DEVICE_EXPORTS_API_PATH}`;\r\n}\r\n","import { fetchSnapshot } from './fetchSnapshot';\r\nimport type { ListedProjectDatabase, ProjectDatabaseMeta } from './projectDatabase';\r\nimport {\r\n resolveDeviceExportDatabaseMetaUrl,\r\n resolveDeviceExportDatabaseUrl,\r\n resolveDeviceExportsUrl,\r\n} from './resolveDeviceDatabaseUrl';\r\nimport type { ResolveProjectDatabaseUrlOptions } from './resolveProjectDatabaseUrl';\r\n\r\nexport type DeviceExportMeta = ProjectDatabaseMeta;\r\nexport type ListedDeviceExport = ListedProjectDatabase;\r\n\r\nasync function fetchJson<T>(url: string, errorLabel: string): Promise<T> {\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Network error fetching ${errorLabel} from ${url}. ${networkMessage}`);\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${errorLabel} from ${url}: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n return (await response.json()) as T;\r\n}\r\n\r\nexport async function fetchDeviceExportMeta(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<DeviceExportMeta> {\r\n const url = resolveDeviceExportDatabaseMetaUrl(serverUrl, deviceId, options);\r\n return fetchJson<DeviceExportMeta>(url, 'device export metadata');\r\n}\r\n\r\nexport async function fetchDeviceExportDatabase(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ArrayBuffer> {\r\n const url = resolveDeviceExportDatabaseUrl(serverUrl, deviceId, options);\r\n return fetchSnapshot(url);\r\n}\r\n\r\nexport async function fetchDeviceExports(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ListedDeviceExport[]> {\r\n const url = resolveDeviceExportsUrl(serverUrl, options);\r\n const payload = await fetchJson<{ devices?: ListedDeviceExport[] }>(url, 'device exports');\r\n return payload.devices ?? [];\r\n}\r\n","import {\r\n PROJECT_DATABASE_API_PATH,\r\n PROJECT_DATABASE_META_API_PATH,\r\n PROJECT_DATABASES_API_PATH,\r\n wsUrlToHttpUrl,\r\n} from '../types/protocol';\r\n\r\nexport type ResolveProjectDatabaseUrlOptions = {\r\n useSameOriginApi?: boolean;\r\n};\r\n\r\nfunction resolveApiBase(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string {\r\n if (options?.useSameOriginApi && typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n\r\n if (serverUrl.startsWith('ws://') || serverUrl.startsWith('wss://')) {\r\n return wsUrlToHttpUrl(serverUrl);\r\n }\r\n\r\n return serverUrl.replace(/\\/$/, '');\r\n}\r\n\r\nexport function resolveProjectDatabaseUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n return `${resolveApiBase(serverUrl, options)}${PROJECT_DATABASE_API_PATH}`;\r\n}\r\n\r\nexport function resolveProjectDatabaseMetaUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n return `${resolveApiBase(serverUrl, options)}${PROJECT_DATABASE_META_API_PATH}`;\r\n}\r\n\r\nexport function resolveProjectDatabasesUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n return `${resolveApiBase(serverUrl, options)}${PROJECT_DATABASES_API_PATH}`;\r\n}\r\n","import { fetchSnapshot } from './fetchSnapshot';\r\nimport {\r\n resolveProjectDatabaseMetaUrl,\r\n resolveProjectDatabaseUrl,\r\n resolveProjectDatabasesUrl,\r\n type ResolveProjectDatabaseUrlOptions,\r\n} from './resolveProjectDatabaseUrl';\r\n\r\nexport type ProjectDatabaseMeta = {\r\n exists: boolean;\r\n relativePath?: string;\r\n absolutePath?: string;\r\n kind?: string;\r\n mimeType?: string;\r\n databaseName?: string;\r\n size?: number;\r\n updatedAt?: number;\r\n source?: 'active' | 'device';\r\n deviceId?: string;\r\n};\r\n\r\nexport type ListedProjectDatabase = {\r\n id: string;\r\n label: string;\r\n relativePath: string;\r\n source: 'active' | 'device';\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n databaseName?: string;\r\n size: number;\r\n updatedAt: number;\r\n};\r\n\r\n/** @deprecated Use device-scoped `fetchDeviceExportMeta` instead. Proxies to the newest device export. */\r\nexport async function fetchProjectDatabaseMeta(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ProjectDatabaseMeta> {\r\n const url = resolveProjectDatabaseMetaUrl(serverUrl, options);\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Network error fetching project database metadata from ${url}. ${networkMessage}`);\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch project database metadata from ${url}: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n\r\n return (await response.json()) as ProjectDatabaseMeta;\r\n}\r\n\r\n/** @deprecated Use device-scoped `fetchDeviceExportDatabase` instead. Proxies to the newest device export. */\r\nexport async function fetchProjectDatabase(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ArrayBuffer> {\r\n const url = resolveProjectDatabaseUrl(serverUrl, options);\r\n return fetchSnapshot(url);\r\n}\r\n\r\n/** @deprecated Use `fetchDeviceExports` instead. */\r\nexport async function fetchProjectDatabases(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ListedProjectDatabase[]> {\r\n const url = resolveProjectDatabasesUrl(serverUrl, options);\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Network error fetching project databases from ${url}. ${networkMessage}`);\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch project databases from ${url}: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n\r\n const payload = (await response.json()) as { databases?: ListedProjectDatabase[] };\r\n return payload.databases ?? [];\r\n}\r\n","import { wsUrlToHttpUrl } from '../types/protocol';\r\n\r\n/**\r\n * React Native fetch does not support `new Blob([ArrayBuffer])`.\r\n * Pass the Uint8Array directly as the request body.\r\n */\r\nexport function createSnapshotUploadBody(bytes: Uint8Array): Uint8Array {\r\n return bytes;\r\n}\r\n\r\n/**\r\n * The hub advertises snapshot URLs using its bind address (often localhost).\r\n * Mobile clients reach the hub via a different host (10.0.2.2, LAN IP, etc.).\r\n * Rewrite the upload URL to match the WebSocket hub URL the device already uses.\r\n */\r\nexport function resolveSnapshotUploadUrl(uploadUrl: string, hubWsUrl: string): string {\r\n const hubHttpBase = wsUrlToHttpUrl(hubWsUrl);\r\n const target = new URL(uploadUrl);\r\n const hub = new URL(hubHttpBase.endsWith('/') ? hubHttpBase : `${hubHttpBase}/`);\r\n\r\n target.protocol = hub.protocol;\r\n target.hostname = hub.hostname;\r\n target.port = hub.port;\r\n\r\n return target.toString();\r\n}\r\n\r\nexport type UploadSnapshotOptions = {\r\n kind: string;\r\n mimeType: string;\r\n kindHeader: string;\r\n mimeHeader: string;\r\n databaseName?: string;\r\n nameHeader?: string;\r\n};\r\n\r\nexport async function uploadSnapshot(\r\n uploadUrl: string,\r\n bytes: Uint8Array,\r\n options: UploadSnapshotOptions,\r\n): Promise<void> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/octet-stream',\r\n [options.kindHeader]: options.kind,\r\n [options.mimeHeader]: options.mimeType,\r\n };\r\n\r\n if (options.databaseName && options.nameHeader) {\r\n headers[options.nameHeader] = options.databaseName;\r\n }\r\n\r\n const response = await fetch(uploadUrl, {\r\n method: 'POST',\r\n headers,\r\n body: createSnapshotUploadBody(bytes) as BodyInit,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Upload failed with status ${response.status}`);\r\n }\r\n}\r\n","import type { DatabaseAdapter } from '../types/adapter';\r\nimport {\r\n buildDeviceSnapshotUrl,\r\n wsUrlToHttpUrl,\r\n type SnapshotUploadRequestedMessage,\r\n} from '../types/protocol';\r\nimport { SNAPSHOT_KIND_HEADER, SNAPSHOT_MIME_HEADER, SNAPSHOT_NAME_HEADER } from '../types/snapshot';\r\nimport { uploadSnapshot } from './snapshotUpload';\r\n\r\nexport type HandleDeviceSnapshotOptions = {\r\n /** WebSocket URL of the connected hub — used to build the upload URL on mobile. */\r\n hubServerUrl?: string;\r\n /** This mobile client's device ID — upload is ignored when it does not match. */\r\n deviceId?: string;\r\n};\r\n\r\nexport async function handleDeviceSnapshotUpload(\r\n database: DatabaseAdapter | undefined,\r\n message: SnapshotUploadRequestedMessage,\r\n options: HandleDeviceSnapshotOptions = {},\r\n): Promise<void> {\r\n if (options.deviceId && message.deviceId !== options.deviceId) {\r\n return;\r\n }\r\n\r\n if (!database) {\r\n throw new Error('No database adapter configured');\r\n }\r\n\r\n if (!options.hubServerUrl) {\r\n throw new Error('hubServerUrl is required to upload a device snapshot');\r\n }\r\n\r\n const snapshot = await database.exportSnapshot();\r\n const hubHttp = wsUrlToHttpUrl(options.hubServerUrl);\r\n const uploadUrl = buildDeviceSnapshotUrl(hubHttp, message.deviceId);\r\n\r\n await uploadSnapshot(uploadUrl, snapshot.bytes, {\r\n kind: snapshot.kind,\r\n mimeType: snapshot.mimeType,\r\n kindHeader: SNAPSHOT_KIND_HEADER,\r\n mimeHeader: SNAPSHOT_MIME_HEADER,\r\n databaseName: database.name,\r\n nameHeader: SNAPSHOT_NAME_HEADER,\r\n });\r\n}\r\n","import type { DatabaseAdapter } from '../types/adapter';\r\nimport { isWritableDatabaseAdapter } from '../types/adapter';\r\nimport type {\r\n BeginTransactionMessage,\r\n CommitTransactionMessage,\r\n ExecuteWriteMessage,\r\n RollbackTransactionMessage,\r\n TransactionAckMessage,\r\n WriteAckMessage,\r\n} from '../types/protocol';\r\n\r\nexport type TransactionAckReporter = (\r\n message: Omit<TransactionAckMessage, 'timestamp' | 'type'>,\r\n) => void;\r\nexport type WriteAckReporter = (message: Omit<WriteAckMessage, 'timestamp' | 'type'>) => void;\r\n\r\nexport async function handleBeginTransaction(\r\n adapter: DatabaseAdapter | undefined,\r\n message: BeginTransactionMessage,\r\n report: TransactionAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'begin',\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.beginTransaction();\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'begin',\r\n ok: true,\r\n });\r\n } catch (error) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'begin',\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Failed to begin transaction',\r\n });\r\n }\r\n}\r\n\r\nexport async function handleCommitTransaction(\r\n adapter: DatabaseAdapter | undefined,\r\n message: CommitTransactionMessage,\r\n report: TransactionAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'commit',\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.commitTransaction();\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'commit',\r\n ok: true,\r\n });\r\n } catch (error) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'commit',\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Failed to commit transaction',\r\n });\r\n }\r\n}\r\n\r\nexport async function handleRollbackTransaction(\r\n adapter: DatabaseAdapter | undefined,\r\n message: RollbackTransactionMessage,\r\n report: TransactionAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'rollback',\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.rollbackTransaction();\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'rollback',\r\n ok: true,\r\n });\r\n } catch (error) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'rollback',\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Failed to roll back transaction',\r\n });\r\n }\r\n}\r\n\r\nexport async function handleExecuteWrite(\r\n adapter: DatabaseAdapter | undefined,\r\n message: ExecuteWriteMessage,\r\n report: WriteAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n const result = await adapter.executeWrite(message.operation);\r\n report({\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n ok: true,\r\n rowsAffected: result.rowsAffected,\r\n });\r\n } catch (error) {\r\n report({\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Write operation failed',\r\n });\r\n }\r\n}\r\n","export function isDevToolsEnabled(enabled?: boolean): boolean {\n if (enabled === false) {\n return false;\n }\n\n if (enabled === true) {\n return true;\n }\n\n return typeof __DEV__ !== 'undefined' && __DEV__;\n}\n","import type { RefreshErrorCode } from '../types/protocol';\r\n\r\n/** @deprecated Use formatRefreshErrorMessage */\r\nexport function formatSyncErrorMessage(code: RefreshErrorCode, message: string): string {\r\n return formatRefreshErrorMessage(code, message);\r\n}\r\n\r\nexport function formatRefreshErrorMessage(code: RefreshErrorCode, message: string): string {\r\n switch (code) {\r\n case 'DEVICE_OFFLINE':\r\n return 'Selected device disconnected. Reconnect the mobile app and try again.';\r\n case 'REFRESH_IN_PROGRESS':\r\n return 'A refresh is already in progress for this device.';\r\n case 'EXPORT_FAILED':\r\n return `Device failed to export or upload snapshot: ${message}`;\r\n case 'UPLOAD_FAILED':\r\n return `Snapshot upload failed on the hub: ${message}`;\r\n case 'TIMEOUT':\r\n return 'Timed out waiting for the device to upload a snapshot.';\r\n case 'SNAPSHOT_NOT_FOUND':\r\n return 'Snapshot expired or was not found. Click Refresh again.';\r\n case 'INVALID_REQUEST':\r\n return `Invalid refresh request: ${message}`;\r\n default:\r\n return message;\r\n }\r\n}\r\n","import { createContext, useContext } from 'react';\r\nimport type { ConnectionState } from '../client/createDevToolsClient';\r\nimport type { DatabaseAdapter } from '../types/adapter';\r\nimport type { DeviceMetadata } from '../types/protocol';\r\nimport type { MobileDatabaseInspector } from '../mobile/types';\r\n\r\nexport type ExportState = 'idle' | 'exporting' | 'success' | 'error';\r\n\r\nexport type DevToolsContextValue = {\r\n connectionState: ConnectionState;\r\n connectionError: string | null;\r\n connectionHint: string | null;\r\n deviceId: string | undefined;\r\n serverUrl: string;\r\n metadata: DeviceMetadata;\r\n database: DatabaseAdapter | undefined;\r\n adapterError: string | null;\r\n mobileInspector: MobileDatabaseInspector | null;\r\n launcherVisible: boolean;\r\n openLauncher: () => void;\r\n closeLauncher: () => void;\r\n explorerVisible: boolean;\r\n openExplorer: () => void;\r\n closeExplorer: () => void;\r\n settingsVisible: boolean;\r\n openSettings: () => void;\r\n closeSettings: () => void;\r\n reconnect: (url: string) => void;\r\n exportState: ExportState;\r\n exportError: string | null;\r\n exportDatabase: () => Promise<void>;\r\n};\r\n\r\nexport const DevToolsContext = createContext<DevToolsContextValue | null>(null);\r\n\r\nexport function useDevTools(): DevToolsContextValue {\r\n const context = useContext(DevToolsContext);\r\n\r\n if (!context) {\r\n throw new Error('useDevTools must be used within DevToolsProvider');\r\n }\r\n\r\n return context;\r\n}\r\n","import { Platform } from 'react-native';\r\nimport Constants from 'expo-constants';\r\n\r\n/** Host loopback aliases that do not reach the dev machine from Android. */\r\nconst ANDROID_LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1']);\r\n\r\n/** Special alias from the Android emulator to the host machine. */\r\nexport const ANDROID_EMULATOR_HOST = '10.0.2.2';\r\n\r\ntype ExpoConstantsShape = {\r\n expoConfig?: { hostUri?: string };\r\n expoGoConfig?: { debuggerHost?: string };\r\n manifest2?: { extra?: { expoGo?: { debuggerHost?: string } } };\r\n manifest?: { debuggerHost?: string };\r\n};\r\n\r\nexport function isAndroidLoopbackHost(host: string): boolean {\r\n return ANDROID_LOOPBACK_HOSTS.has(host.toLowerCase());\r\n}\r\n\r\nexport function readMetroDevHostFromConstants(\r\n constants: ExpoConstantsShape | undefined,\r\n): string | undefined {\r\n const hostUri =\r\n constants?.expoConfig?.hostUri ??\r\n constants?.expoGoConfig?.debuggerHost ??\r\n constants?.manifest2?.extra?.expoGo?.debuggerHost ??\r\n constants?.manifest?.debuggerHost;\r\n\r\n if (typeof hostUri !== 'string' || hostUri.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return hostUri.split(':')[0];\r\n}\r\n\r\n/**\r\n * Picks a dev-machine hostname that mobile clients can reach.\r\n * - Physical devices: Metro debugger host (LAN IP).\r\n * - Android emulator: 10.0.2.2 when Metro reports loopback.\r\n * - iOS simulator / default: localhost.\r\n */\r\nexport function resolveDevToolsHostFromInputs(\r\n platformOs: string,\r\n metroHost?: string,\r\n): string {\r\n if (platformOs === 'android') {\r\n if (metroHost && !isAndroidLoopbackHost(metroHost)) {\r\n return metroHost;\r\n }\r\n\r\n return ANDROID_EMULATOR_HOST;\r\n }\r\n\r\n if (metroHost) {\r\n return metroHost;\r\n }\r\n\r\n return 'localhost';\r\n}\r\n\r\nexport function getConnectionHintForPlatform(\r\n platformOs: string,\r\n serverUrl: string,\r\n): string | null {\r\n try {\r\n const parsed = new URL(serverUrl);\r\n const host = parsed.hostname.toLowerCase();\r\n\r\n if (platformOs === 'android' && isAndroidLoopbackHost(host)) {\r\n return `On Android, \"${host}\" refers to the device itself. Use ${ANDROID_EMULATOR_HOST} (emulator) or your PC's LAN IP (physical device).`;\r\n }\r\n\r\n if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {\r\n return 'Server URL must start with ws:// or wss://';\r\n }\r\n } catch {\r\n return 'Invalid WebSocket URL.';\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getPlatformOs(): string {\r\n return Platform.OS;\r\n}\r\n\r\nfunction readMetroDevHostRuntime(): string | undefined {\r\n return readMetroDevHostFromConstants(Constants);\r\n}\r\n\r\nexport function readMetroDevHost(): string | undefined {\r\n return readMetroDevHostRuntime();\r\n}\r\n\r\nexport function resolveDevToolsHost(): string {\r\n return resolveDevToolsHostFromInputs(getPlatformOs(), readMetroDevHostRuntime());\r\n}\r\n\r\nexport function getConnectionHint(serverUrl: string): string | null {\r\n return getConnectionHintForPlatform(getPlatformOs(), serverUrl);\r\n}\r\n","import { Platform } from 'react-native';\nimport Constants from 'expo-constants';\nimport type { DeviceMetadata } from '../types/protocol';\n\ntype ExpoConstants = {\n expoConfig?: {\n name?: string;\n version?: string;\n ios?: { bundleIdentifier?: string };\n android?: { package?: string };\n };\n};\n\nfunction getExpoConstants(): ExpoConstants | undefined {\n return Constants;\n}\n\nexport function resolveDeviceMetadata(): DeviceMetadata {\n const constants = getExpoConstants();\n const config = constants?.expoConfig;\n\n const metadata: DeviceMetadata = {\n platform: Platform.OS,\n appName: config?.name ?? 'React Native App',\n };\n\n if (config?.version) {\n metadata.appVersion = config.version;\n }\n\n const bundleId = config?.ios?.bundleIdentifier ?? config?.android?.package;\n\n if (bundleId) {\n metadata.bundleId = bundleId;\n }\n\n return metadata;\n}\n","import { buildDevToolsWsUrl, DEFAULT_DEVTOOLS_PORT } from '../types/protocol';\r\nimport { resolveDevToolsHost } from './resolveDevToolsHost';\r\n\r\nexport function normalizeServerUrl(url: string): string {\r\n const trimmed = url.trim();\r\n\r\n if (trimmed.startsWith('ws://') || trimmed.startsWith('wss://')) {\r\n return trimmed;\r\n }\r\n\r\n return buildDevToolsWsUrl(trimmed.replace(/^https?:\\/\\//, ''), DEFAULT_DEVTOOLS_PORT);\r\n}\r\n\r\nexport function resolveServerUrl(serverUrl?: string): string {\r\n if (serverUrl) {\r\n return normalizeServerUrl(serverUrl);\r\n }\r\n\r\n const envUrl =\r\n typeof process !== 'undefined'\r\n ? process.env.EXPO_PUBLIC_DATABASE_DEVTOOLS_URL\r\n : undefined;\r\n\r\n if (envUrl) {\r\n return normalizeServerUrl(envUrl);\r\n }\r\n\r\n return buildDevToolsWsUrl(resolveDevToolsHost(), DEFAULT_DEVTOOLS_PORT);\r\n}\r\n","import AsyncStorage from '@react-native-async-storage/async-storage';\r\nimport { NativeModules } from 'react-native';\r\n\r\nimport { generateDeviceId } from './ids';\r\n\r\nexport const PERSISTED_DEVICE_ID_STORAGE_KEY = '@database-devtools/device-id';\r\n\r\nexport type DeviceIdStorage = {\r\n getItem: (key: string) => Promise<string | null>;\r\n setItem: (key: string, value: string) => Promise<void>;\r\n};\r\n\r\nlet memoryDeviceId: string | null = null;\r\n\r\nfunction hasAsyncStorageNativeModule(): boolean {\r\n return Boolean(\r\n NativeModules.RNCAsyncStorage ??\r\n NativeModules.RNC_AsyncSQLiteDBStoragePassThru ??\r\n NativeModules.PlatformLocalStorage,\r\n );\r\n}\r\n\r\nexport function createAsyncStorageDeviceIdStore(): DeviceIdStorage | null {\r\n if (!hasAsyncStorageNativeModule()) {\r\n return null;\r\n }\r\n\r\n return AsyncStorage;\r\n}\r\n\r\nfunction loadOrCreateMemoryDeviceId(): string {\r\n if (!memoryDeviceId) {\r\n memoryDeviceId = generateDeviceId();\r\n }\r\n\r\n return memoryDeviceId;\r\n}\r\n\r\nexport async function loadOrCreateDeviceId(\r\n storage: DeviceIdStorage | null = createAsyncStorageDeviceIdStore(),\r\n): Promise<string> {\r\n if (storage) {\r\n try {\r\n const stored = await storage.getItem(PERSISTED_DEVICE_ID_STORAGE_KEY);\r\n\r\n if (stored) {\r\n return stored;\r\n }\r\n\r\n const created = generateDeviceId();\r\n await storage.setItem(PERSISTED_DEVICE_ID_STORAGE_KEY, created);\r\n return created;\r\n } catch {\r\n // Expo Go / missing native module — use an in-memory id for this session.\r\n }\r\n }\r\n\r\n return loadOrCreateMemoryDeviceId();\r\n}\r\n/** @internal Test helper */\r\nexport function resetMemoryDeviceIdForTests(): void {\r\n memoryDeviceId = null;\r\n}\r\n","const BLOCKED_KEYWORDS =\r\n /\\b(INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|REPLACE|ATTACH|DETACH|REINDEX|VACUUM|TRUNCATE)\\b/i;\r\n\r\nexport function validateReadOnlySql(sql: string): void {\r\n const trimmed = sql.trim();\r\n\r\n if (!trimmed) {\r\n throw new Error('SQL query is empty');\r\n }\r\n\r\n if (BLOCKED_KEYWORDS.test(trimmed)) {\r\n throw new Error(\r\n 'DevTools is read-only; only SELECT, PRAGMA, EXPLAIN, and WITH queries are allowed',\r\n );\r\n }\r\n\r\n const statements = trimmed\r\n .split(';')\r\n .map((statement) => statement.trim())\r\n .filter(Boolean);\r\n\r\n for (const statement of statements) {\r\n const leading = statement.replace(/^\\s*(--[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*/g, '').trim();\r\n const keyword = leading.split(/\\s+/)[0]?.toUpperCase();\r\n\r\n if (!keyword) {\r\n continue;\r\n }\r\n\r\n if (\r\n keyword !== 'SELECT' &&\r\n keyword !== 'PRAGMA' &&\r\n keyword !== 'EXPLAIN' &&\r\n keyword !== 'WITH'\r\n ) {\r\n throw new Error(`DevTools is read-only; \"${keyword}\" statements are not allowed`);\r\n }\r\n }\r\n}\r\n","import type { ColumnInfo } from '../types/inspection';\r\n\r\nexport function quoteIdentifier(name: string): string {\r\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\r\n}\r\n\r\nexport function buildSearchClause(\r\n columns: ColumnInfo[],\r\n search: string | undefined,\r\n): { clause: string; params: string[] } {\r\n const term = search?.trim();\r\n\r\n if (!term || columns.length === 0) {\r\n return { clause: '', params: [] };\r\n }\r\n\r\n const pattern = `%${term}%`;\r\n const conditions = columns.map(\r\n (column) => `CAST(${quoteIdentifier(column.name)} AS TEXT) LIKE ?`,\r\n );\r\n\r\n return {\r\n clause: ` WHERE (${conditions.join(' OR ')})`,\r\n params: columns.map(() => pattern),\r\n };\r\n}\r\n\r\nexport function resolveSortColumn(\r\n columns: ColumnInfo[],\r\n sortColumn: string | null | undefined,\r\n): string | null {\r\n if (!sortColumn) {\r\n return null;\r\n }\r\n\r\n return columns.some((column) => column.name === sortColumn) ? sortColumn : null;\r\n}\r\n","import type { ExpoSqliteInspectableDatabase } from '../adapters/sqlite/types';\r\nimport type {\r\n ColumnInfo,\r\n QueryResult,\r\n SchemaTable,\r\n TableInfo,\r\n TablePageRequest,\r\n TablePageResult,\r\n} from '../types/inspection';\r\nimport { validateReadOnlySql } from '../utils/sqlSafety';\r\nimport type { MobileDatabaseInfo, MobileDatabaseInspector } from './types';\r\nimport { buildSearchClause, quoteIdentifier, resolveSortColumn } from './sqliteTableQuery';\r\n\r\ntype PragmaTableInfoRow = {\r\n name: string;\r\n type: string;\r\n notnull: number;\r\n dflt_value: string | number | null;\r\n pk: number;\r\n};\r\n\r\nfunction normalizeCell(cell: unknown): string | number | null {\r\n if (cell === null || cell === undefined) {\r\n return null;\r\n }\r\n\r\n if (typeof cell === 'number' || typeof cell === 'string') {\r\n return cell;\r\n }\r\n\r\n if (typeof cell === 'boolean') {\r\n return cell ? 1 : 0;\r\n }\r\n\r\n if (cell instanceof Uint8Array) {\r\n return `[BLOB ${cell.byteLength} bytes]`;\r\n }\r\n\r\n return String(cell);\r\n}\r\n\r\nfunction objectRowsToMatrix(rows: Record<string, unknown>[]): {\r\n columns: string[];\r\n matrix: (string | number | null)[][];\r\n} {\r\n if (rows.length === 0) {\r\n return { columns: [], matrix: [] };\r\n }\r\n\r\n const columns = Object.keys(rows[0]!);\r\n\r\n return {\r\n columns,\r\n matrix: rows.map((row) => columns.map((column) => normalizeCell(row[column]))),\r\n };\r\n}\r\n\r\nexport function createExpoSqliteInspector(\r\n database: ExpoSqliteInspectableDatabase,\r\n): MobileDatabaseInspector {\r\n let operationQueue: Promise<void> = Promise.resolve();\r\n\r\n const enqueue = async <T>(operation: () => Promise<T>): Promise<T> => {\r\n const next = operationQueue.then(operation);\r\n operationQueue = next.then(\r\n () => undefined,\r\n () => undefined,\r\n );\r\n return next;\r\n };\r\n\r\n const listTablesInternal = async (): Promise<TableInfo[]> => {\r\n const masterRows = await database.getAllAsync<{ name: string }>(\r\n `SELECT name FROM sqlite_master\r\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'\r\n ORDER BY name`,\r\n );\r\n\r\n const tables: TableInfo[] = [];\r\n\r\n for (const row of masterRows) {\r\n const countRow = await database.getFirstAsync<{ count: number }>(\r\n `SELECT COUNT(*) AS count FROM ${quoteIdentifier(row.name)}`,\r\n );\r\n\r\n tables.push({\r\n name: row.name,\r\n rowCount: Number(countRow?.count ?? 0),\r\n });\r\n }\r\n\r\n return tables;\r\n };\r\n\r\n const getTableColumnsInternal = async (table: string): Promise<ColumnInfo[]> => {\r\n const rows = await database.getAllAsync<PragmaTableInfoRow>(\r\n `PRAGMA table_info(${quoteIdentifier(table)})`,\r\n );\r\n\r\n return rows.map((row) => ({\r\n name: row.name,\r\n type: row.type || 'ANY',\r\n notNull: row.notnull === 1,\r\n pk: row.pk === 1,\r\n defaultValue:\r\n row.dflt_value === null || row.dflt_value === undefined\r\n ? null\r\n : String(row.dflt_value),\r\n }));\r\n };\r\n\r\n return {\r\n listTables: () => enqueue(listTablesInternal),\r\n\r\n getSchema: () =>\r\n enqueue(async () => {\r\n const tables = await listTablesInternal();\r\n\r\n return Promise.all(\r\n tables.map(async (table) => ({\r\n name: table.name,\r\n columns: await getTableColumnsInternal(table.name),\r\n })),\r\n );\r\n }),\r\n\r\n getTableColumns: (table) => enqueue(() => getTableColumnsInternal(table)),\r\n\r\n getDatabaseInfo: () =>\r\n enqueue(async () => {\r\n const tables = await listTablesInternal();\r\n const versionRow = await database.getFirstAsync<{ version: string }>(\r\n 'SELECT sqlite_version() AS version',\r\n );\r\n const pageRow = await database.getFirstAsync<{ page_size: number; page_count: number }>(\r\n 'SELECT page_size, page_count FROM pragma_page_size(), pragma_page_count()',\r\n );\r\n const pageSize = Number(pageRow?.page_size ?? 0);\r\n const pageCount = Number(pageRow?.page_count ?? 0);\r\n\r\n return {\r\n name: database.databasePath.split('/').pop() ?? database.databasePath,\r\n path: database.databasePath,\r\n tableCount: tables.length,\r\n sqliteVersion: versionRow?.version ?? 'unknown',\r\n pageSize,\r\n pageCount,\r\n estimatedSizeBytes: pageSize * pageCount,\r\n } satisfies MobileDatabaseInfo;\r\n }),\r\n\r\n fetchTablePage: (request) =>\r\n enqueue(async () => {\r\n const columns = await getTableColumnsInternal(request.table);\r\n const { clause, params: searchParams } = buildSearchClause(columns, request.search);\r\n const quotedTable = quoteIdentifier(request.table);\r\n const countRow = await database.getFirstAsync<{ count: number }>(\r\n `SELECT COUNT(*) AS count FROM ${quotedTable}${clause}`,\r\n searchParams,\r\n );\r\n const totalCount = Number(countRow?.count ?? 0);\r\n const pageSize = Math.max(1, request.pageSize);\r\n const page = Math.max(1, request.page);\r\n const offset = (page - 1) * pageSize;\r\n const sortColumn = resolveSortColumn(columns, request.sortColumn);\r\n const orderClause = sortColumn\r\n ? ` ORDER BY ${quoteIdentifier(sortColumn)} ${request.sortDir === 'desc' ? 'DESC' : 'ASC'}`\r\n : '';\r\n const rows = await database.getAllAsync<Record<string, unknown>>(\r\n `SELECT * FROM ${quotedTable}${clause}${orderClause} LIMIT ? OFFSET ?`,\r\n [...searchParams, pageSize, offset],\r\n );\r\n const { columns: resultColumns, matrix } = objectRowsToMatrix(rows);\r\n\r\n return {\r\n columns: resultColumns,\r\n rows: matrix,\r\n totalCount,\r\n page,\r\n pageSize,\r\n } satisfies TablePageResult;\r\n }),\r\n\r\n executeQuery: (sql) =>\r\n enqueue(async () => {\r\n validateReadOnlySql(sql);\r\n const started = Date.now();\r\n const rows = await database.getAllAsync<Record<string, unknown>>(sql);\r\n const { columns, matrix } = objectRowsToMatrix(rows);\r\n\r\n return {\r\n columns,\r\n rows: matrix,\r\n rowCount: matrix.length,\r\n durationMs: Date.now() - started,\r\n } satisfies QueryResult;\r\n }),\r\n };\r\n}\r\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\r\nimport { resolveAdapter } from '../adapter/resolveAdapter';\r\nimport { detectExpoSqliteInspectable } from '../adapters/sqlite/detect';\r\nimport { isWritableDatabaseAdapter } from '../types/adapter';\r\nimport {\r\n createDevToolsClient,\r\n type ConnectionState,\r\n} from '../client/createDevToolsClient';\r\nimport { formatRefreshErrorMessage } from '../client/formatSyncError';\r\nimport { handleDeviceSnapshotUpload } from '../client/handleDeviceSnapshot';\r\nimport {\r\n handleBeginTransaction,\r\n handleCommitTransaction,\r\n handleExecuteWrite,\r\n handleRollbackTransaction,\r\n} from '../client/handleWriteOperations';\r\nimport { DevToolsContext, type ExportState } from '../hooks/useDevTools';\r\nimport type { DatabaseAdapter } from '../types/adapter';\r\nimport type { DatabaseKind } from '../types/kind';\r\nimport { DevToolsRole, REFRESH_TIMEOUT_MS } from '../types/protocol';\r\nimport { getConnectionHint } from '../utils/resolveDevToolsHost';\r\nimport { resolveDeviceMetadata } from '../utils/resolveDeviceMetadata';\r\nimport { normalizeServerUrl, resolveServerUrl } from '../utils/resolveServerUrl';\r\nimport { loadOrCreateDeviceId } from '../utils/persistDeviceId';\r\nimport { createExpoSqliteInspector } from '../mobile/createExpoSqliteInspector';\r\nimport type { MobileDatabaseInspector } from '../mobile/types';\r\n\r\nexport type DevToolsProviderProps = {\r\n children: ReactNode;\r\n database?: unknown;\r\n type?: DatabaseKind;\r\n adapter?: DatabaseAdapter;\r\n serverUrl?: string;\r\n onConnectionStateChange?: (state: ConnectionState) => void;\r\n};\r\n\r\ntype ExportWaiters = {\r\n resolve: () => void;\r\n reject: (error: Error) => void;\r\n};\r\n\r\nexport function DevToolsProvider({\r\n children,\r\n database,\r\n type,\r\n adapter: explicitAdapter,\r\n serverUrl: initialServerUrl,\r\n onConnectionStateChange,\r\n}: DevToolsProviderProps) {\r\n const [connectionState, setConnectionState] = useState<ConnectionState>('connecting');\r\n const [connectionError, setConnectionError] = useState<string | null>(null);\r\n const [serverUrl, setServerUrl] = useState(() => resolveServerUrl(initialServerUrl));\r\n const [deviceId, setDeviceId] = useState<string | undefined>();\r\n const [deviceIdReady, setDeviceIdReady] = useState(false);\r\n const [settingsVisible, setSettingsVisible] = useState(false);\r\n const [launcherVisible, setLauncherVisible] = useState(false);\r\n const [explorerVisible, setExplorerVisible] = useState(false);\r\n const [mobileInspector, setMobileInspector] = useState<MobileDatabaseInspector | null>(null);\r\n const [resolvedAdapter, setResolvedAdapter] = useState<DatabaseAdapter | undefined>(explicitAdapter);\r\n const [adapterError, setAdapterError] = useState<string | null>(null);\r\n const [exportState, setExportState] = useState<ExportState>('idle');\r\n const [exportError, setExportError] = useState<string | null>(null);\r\n\r\n const metadata = useMemo(() => resolveDeviceMetadata(), []);\r\n const clientRef = useRef<ReturnType<typeof createDevToolsClient> | null>(null);\r\n const onConnectionStateChangeRef = useRef(onConnectionStateChange);\r\n const databaseRef = useRef(resolvedAdapter);\r\n const rollbackOpenTransactionRef = useRef<(() => Promise<void>) | null>(null);\r\n const exportWaitersRef = useRef<ExportWaiters | null>(null);\r\n const exportTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const exportSuccessTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const clearExportWaiters = useCallback(() => {\r\n if (exportTimeoutRef.current) {\r\n clearTimeout(exportTimeoutRef.current);\r\n exportTimeoutRef.current = null;\r\n }\r\n\r\n exportWaitersRef.current = null;\r\n }, []);\r\n\r\n const resetExportSuccessLater = useCallback(() => {\r\n if (exportSuccessTimeoutRef.current) {\r\n clearTimeout(exportSuccessTimeoutRef.current);\r\n }\r\n\r\n exportSuccessTimeoutRef.current = setTimeout(() => {\r\n setExportState((current) => (current === 'success' ? 'idle' : current));\r\n exportSuccessTimeoutRef.current = null;\r\n }, 3000);\r\n }, []);\r\n\r\n const finishExportSuccess = useCallback(() => {\r\n clearExportWaiters();\r\n setExportState('success');\r\n setExportError(null);\r\n resetExportSuccessLater();\r\n }, [clearExportWaiters, resetExportSuccessLater]);\r\n\r\n const finishExportFailure = useCallback(\r\n (message: string) => {\r\n clearExportWaiters();\r\n setExportState('error');\r\n setExportError(message);\r\n },\r\n [clearExportWaiters],\r\n );\r\n\r\n useEffect(() => {\r\n onConnectionStateChangeRef.current = onConnectionStateChange;\r\n }, [onConnectionStateChange]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n async function resolveDatabaseAdapter(): Promise<void> {\r\n if (explicitAdapter) {\r\n setResolvedAdapter(explicitAdapter);\r\n setAdapterError(null);\r\n return;\r\n }\r\n\r\n if (!database) {\r\n setResolvedAdapter(undefined);\r\n setAdapterError(null);\r\n return;\r\n }\r\n\r\n try {\r\n const nextAdapter = await resolveAdapter(database, { type });\r\n if (!cancelled) {\r\n setResolvedAdapter(nextAdapter);\r\n setAdapterError(null);\r\n }\r\n } catch (error) {\r\n if (!cancelled) {\r\n setResolvedAdapter(undefined);\r\n setAdapterError(error instanceof Error ? error.message : 'Failed to resolve database adapter');\r\n }\r\n }\r\n }\r\n\r\n void resolveDatabaseAdapter();\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [database, type, explicitAdapter]);\r\n\r\n useEffect(() => {\r\n if (detectExpoSqliteInspectable(database)) {\r\n setMobileInspector(createExpoSqliteInspector(database));\r\n return;\r\n }\r\n\r\n setMobileInspector(null);\r\n }, [database]);\r\n\r\n useEffect(() => {\r\n databaseRef.current = resolvedAdapter;\r\n }, [resolvedAdapter]);\r\n\r\n useEffect(() => {\r\n rollbackOpenTransactionRef.current = async () => {\r\n const adapter = databaseRef.current;\r\n\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.rollbackTransaction();\r\n } catch {\r\n // Best-effort cleanup when the provider unmounts or reconnects.\r\n }\r\n };\r\n }, [resolvedAdapter]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n void loadOrCreateDeviceId().then((persistedId) => {\r\n if (!cancelled) {\r\n setDeviceId(persistedId);\r\n setDeviceIdReady(true);\r\n }\r\n });\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!deviceIdReady || !deviceId) {\r\n return;\r\n }\r\n\r\n const client = createDevToolsClient({\r\n serverUrl,\r\n role: DevToolsRole.MOBILE,\r\n deviceId,\r\n metadata,\r\n onConnect: () => {\r\n setConnectionError(null);\r\n },\r\n onConnectionStateChange: (state) => {\r\n setConnectionState(state);\r\n onConnectionStateChangeRef.current?.(state);\r\n },\r\n onError: (error) => {\r\n setConnectionError(error.message);\r\n },\r\n onSnapshotUploadRequested: async (message) => {\r\n try {\r\n await handleDeviceSnapshotUpload(databaseRef.current, message, {\r\n hubServerUrl: serverUrl,\r\n deviceId: clientRef.current?.getDeviceId(),\r\n });\r\n\r\n if (exportWaitersRef.current) {\r\n exportWaitersRef.current.resolve();\r\n clearExportWaiters();\r\n }\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Database export or upload failed';\r\n\r\n if (exportWaitersRef.current) {\r\n exportWaitersRef.current.reject(new Error(errorMessage));\r\n clearExportWaiters();\r\n return;\r\n }\r\n\r\n console.error('[database-devtools] Snapshot export or upload failed:', errorMessage);\r\n }\r\n },\r\n onExportSnapshotError: (message) => {\r\n const errorMessage = formatRefreshErrorMessage(message.code, message.message);\r\n\r\n if (exportWaitersRef.current) {\r\n exportWaitersRef.current.reject(new Error(errorMessage));\r\n clearExportWaiters();\r\n }\r\n },\r\n onBeginTransaction: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleBeginTransaction(databaseRef.current, message, (ack) => {\r\n client.sendTransactionAck(ack);\r\n });\r\n },\r\n onCommitTransaction: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleCommitTransaction(databaseRef.current, message, (ack) => {\r\n client.sendTransactionAck(ack);\r\n });\r\n },\r\n onRollbackTransaction: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleRollbackTransaction(databaseRef.current, message, (ack) => {\r\n client.sendTransactionAck(ack);\r\n });\r\n },\r\n onExecuteWrite: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleExecuteWrite(databaseRef.current, message, (ack) => {\r\n client.sendWriteAck(ack);\r\n });\r\n },\r\n });\r\n\r\n clientRef.current = client;\r\n setDeviceId(client.getDeviceId());\r\n client.connect();\r\n\r\n return () => {\r\n void rollbackOpenTransactionRef.current?.();\r\n client.disconnect();\r\n clientRef.current = null;\r\n clearExportWaiters();\r\n\r\n if (exportSuccessTimeoutRef.current) {\r\n clearTimeout(exportSuccessTimeoutRef.current);\r\n exportSuccessTimeoutRef.current = null;\r\n }\r\n };\r\n }, [serverUrl, metadata, clearExportWaiters, deviceIdReady, deviceId]);\r\n\r\n const openLauncher = useCallback(() => {\r\n setLauncherVisible(true);\r\n }, []);\r\n\r\n const closeLauncher = useCallback(() => {\r\n setLauncherVisible(false);\r\n }, []);\r\n\r\n const openExplorer = useCallback(() => {\r\n setLauncherVisible(false);\r\n setExplorerVisible(true);\r\n }, []);\r\n\r\n const closeExplorer = useCallback(() => {\r\n setExplorerVisible(false);\r\n }, []);\r\n\r\n const openSettings = useCallback(() => {\r\n setLauncherVisible(false);\r\n setSettingsVisible(true);\r\n }, []);\r\n\r\n const closeSettings = useCallback(() => {\r\n setSettingsVisible(false);\r\n }, []);\r\n\r\n const reconnect = useCallback((url: string) => {\r\n setConnectionError(null);\r\n setServerUrl(normalizeServerUrl(url));\r\n }, []);\r\n\r\n const exportDatabase = useCallback(async () => {\r\n if (exportState === 'exporting') {\r\n return;\r\n }\r\n\r\n if (connectionState !== 'connected') {\r\n finishExportFailure('Connect to the DevTools hub first');\r\n return;\r\n }\r\n\r\n if (!resolvedAdapter) {\r\n finishExportFailure(adapterError ?? 'No database adapter connected');\r\n return;\r\n }\r\n\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n finishExportFailure('DevTools client is not ready');\r\n return;\r\n }\r\n\r\n setExportState('exporting');\r\n setExportError(null);\r\n\r\n try {\r\n await new Promise<void>((resolve, reject) => {\r\n exportWaitersRef.current = { resolve, reject };\r\n exportTimeoutRef.current = setTimeout(() => {\r\n exportWaitersRef.current?.reject(new Error('Export timed out'));\r\n clearExportWaiters();\r\n }, REFRESH_TIMEOUT_MS);\r\n\r\n client.requestExportSnapshot();\r\n });\r\n\r\n finishExportSuccess();\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Export failed';\r\n finishExportFailure(message);\r\n }\r\n }, [\r\n adapterError,\r\n connectionState,\r\n exportState,\r\n finishExportFailure,\r\n resolvedAdapter,\r\n ]);\r\n\r\n const connectionHint = useMemo(() => getConnectionHint(serverUrl), [serverUrl]);\r\n\r\n const value = useMemo(\r\n () => ({\r\n connectionState,\r\n connectionError,\r\n connectionHint,\r\n deviceId,\r\n serverUrl,\r\n metadata,\r\n database: resolvedAdapter,\r\n adapterError,\r\n mobileInspector,\r\n launcherVisible,\r\n openLauncher,\r\n closeLauncher,\r\n explorerVisible,\r\n openExplorer,\r\n closeExplorer,\r\n settingsVisible,\r\n openSettings,\r\n closeSettings,\r\n reconnect,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n }),\r\n [\r\n connectionState,\r\n connectionError,\r\n connectionHint,\r\n deviceId,\r\n serverUrl,\r\n metadata,\r\n resolvedAdapter,\r\n adapterError,\r\n mobileInspector,\r\n launcherVisible,\r\n openLauncher,\r\n closeLauncher,\r\n explorerVisible,\r\n openExplorer,\r\n closeExplorer,\r\n settingsVisible,\r\n openSettings,\r\n closeSettings,\r\n reconnect,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n ],\r\n );\r\n\r\n return <DevToolsContext.Provider value={value}>{children}</DevToolsContext.Provider>;\r\n}\r\n","import { StyleSheet, Text, View } from 'react-native';\nimport type { ConnectionState } from '../client/createDevToolsClient';\n\nexport type ConnectionStatusBadgeProps = {\n state: ConnectionState;\n};\n\ntype StatusConfig = {\n label: string;\n color: string;\n backgroundColor: string;\n};\n\nfunction getStatusConfig(state: ConnectionState): StatusConfig {\n switch (state) {\n case 'connected':\n return { label: 'Connected', color: '#166534', backgroundColor: '#dcfce7' };\n case 'reconnecting':\n return { label: 'Reconnecting', color: '#92400e', backgroundColor: '#fef3c7' };\n case 'connecting':\n return { label: 'Connecting', color: '#92400e', backgroundColor: '#fef3c7' };\n case 'disconnected':\n return { label: 'Disconnected', color: '#991b1b', backgroundColor: '#fee2e2' };\n }\n}\n\nexport function getConnectionDotColor(state: ConnectionState): string {\n switch (state) {\n case 'connected':\n return '#22c55e';\n case 'reconnecting':\n case 'connecting':\n return '#eab308';\n case 'disconnected':\n return '#ef4444';\n }\n}\n\nexport function ConnectionStatusBadge({ state }: ConnectionStatusBadgeProps) {\n const config = getStatusConfig(state);\n\n return (\n <View style={[styles.badge, { backgroundColor: config.backgroundColor }]}>\n <View style={[styles.dot, { backgroundColor: getConnectionDotColor(state) }]} />\n <Text style={[styles.label, { color: config.color }]}>{config.label}</Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n badge: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'flex-start',\n paddingHorizontal: 10,\n paddingVertical: 6,\n borderRadius: 999,\n gap: 6,\n },\n dot: {\n width: 8,\n height: 8,\n borderRadius: 4,\n },\n label: {\n fontSize: 13,\n fontWeight: '600',\n },\n});\n","import {\r\n ActivityIndicator,\r\n Modal,\r\n Pressable,\r\n ScrollView,\r\n StyleSheet,\r\n Text,\r\n View,\r\n} from 'react-native';\r\nimport { useDevTools } from '../hooks/useDevTools';\r\nimport { ConnectionStatusBadge } from './ConnectionStatusBadge';\r\n\r\nexport function DevToolsLauncherModal() {\r\n const {\r\n launcherVisible,\r\n closeLauncher,\r\n openExplorer,\r\n openSettings,\r\n connectionState,\r\n mobileInspector,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n database,\r\n adapterError,\r\n } = useDevTools();\r\n\r\n const isExporting = exportState === 'exporting';\r\n const exportDisabled =\r\n connectionState !== 'connected' || !database || isExporting || Boolean(adapterError);\r\n\r\n return (\r\n <Modal\r\n animationType=\"slide\"\r\n onRequestClose={closeLauncher}\r\n transparent\r\n visible={launcherVisible}\r\n >\r\n <View style={styles.overlay}>\r\n <View style={styles.sheet}>\r\n <View style={styles.header}>\r\n <Text style={styles.title}>Database DevTools</Text>\r\n <Pressable accessibilityLabel=\"Close launcher\" onPress={closeLauncher}>\r\n <Text style={styles.closeButton}>Close</Text>\r\n </Pressable>\r\n </View>\r\n\r\n <View style={styles.body}>\r\n <ConnectionStatusBadge state={connectionState} />\r\n <Text style={styles.hint}>\r\n Browse and query the on-device database, or connect to the web inspector.\r\n </Text>\r\n\r\n <Pressable\r\n accessibilityLabel=\"View database on device\"\r\n disabled={!mobileInspector}\r\n onPress={openExplorer}\r\n style={[styles.primaryButton, !mobileInspector && styles.primaryButtonDisabled]}\r\n >\r\n <Text style={styles.primaryLabel}>View Database</Text>\r\n </Pressable>\r\n {!mobileInspector ? (\r\n <Text style={styles.warning}>\r\n On-device explorer requires an Expo SQLite database instance.\r\n </Text>\r\n ) : null}\r\n\r\n <Pressable\r\n accessibilityLabel=\"Open DevTools settings\"\r\n onPress={openSettings}\r\n style={styles.secondaryButton}\r\n >\r\n <Text style={styles.secondaryLabel}>DevTools Settings</Text>\r\n </Pressable>\r\n\r\n <Pressable\r\n accessibilityLabel=\"Export database to web inspector\"\r\n accessibilityState={{ busy: isExporting, disabled: exportDisabled }}\r\n disabled={exportDisabled}\r\n onPress={() => void exportDatabase()}\r\n style={[styles.ghostButton, exportDisabled && !isExporting && styles.buttonDisabled]}\r\n >\r\n <View style={styles.exportContent}>\r\n {isExporting ? <ActivityIndicator color=\"#0f172a\" size=\"small\" /> : null}\r\n <Text style={styles.ghostLabel}>\r\n {isExporting ? 'Exporting…' : 'Export to Web Inspector'}\r\n </Text>\r\n </View>\r\n </Pressable>\r\n\r\n {connectionState !== 'connected' ? (\r\n <Text style={styles.hint}>Connect to the hub in settings before exporting.</Text>\r\n ) : null}\r\n {exportState === 'success' ? (\r\n <Text style={styles.success}>Sent to web inspector</Text>\r\n ) : null}\r\n {exportError ? <Text style={styles.error}>{exportError}</Text> : null}\r\n {adapterError ? <Text style={styles.error}>{adapterError}</Text> : null}\r\n </View>\r\n </View>\r\n </View>\r\n </Modal>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n overlay: {\r\n flex: 1,\r\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\r\n justifyContent: 'flex-end',\r\n },\r\n sheet: {\r\n backgroundColor: '#ffffff',\r\n borderTopLeftRadius: 16,\r\n borderTopRightRadius: 16,\r\n overflow: 'hidden',\r\n },\r\n header: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingHorizontal: 20,\r\n paddingVertical: 16,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: '#e2e8f0',\r\n },\r\n title: {\r\n fontSize: 18,\r\n fontWeight: '700',\r\n color: '#0f172a',\r\n },\r\n closeButton: {\r\n fontSize: 16,\r\n color: '#2563eb',\r\n fontWeight: '600',\r\n },\r\n body: {\r\n padding: 20,\r\n gap: 12,\r\n },\r\n hint: {\r\n fontSize: 13,\r\n color: '#64748b',\r\n lineHeight: 20,\r\n },\r\n warning: {\r\n fontSize: 12,\r\n color: '#b45309',\r\n marginTop: -4,\r\n },\r\n primaryButton: {\r\n backgroundColor: '#2563eb',\r\n borderRadius: 8,\r\n paddingVertical: 14,\r\n alignItems: 'center',\r\n },\r\n primaryButtonDisabled: {\r\n opacity: 0.5,\r\n },\r\n primaryLabel: {\r\n color: '#f8fafc',\r\n fontSize: 16,\r\n fontWeight: '700',\r\n },\r\n secondaryButton: {\r\n backgroundColor: '#1e293b',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n },\r\n secondaryLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n ghostButton: {\r\n borderWidth: 1,\r\n borderColor: '#cbd5e1',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n },\r\n buttonDisabled: {\r\n opacity: 0.5,\r\n },\r\n ghostLabel: {\r\n color: '#0f172a',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n exportContent: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: 8,\r\n },\r\n success: {\r\n fontSize: 13,\r\n color: '#15803d',\r\n },\r\n error: {\r\n fontSize: 13,\r\n color: '#dc2626',\r\n },\r\n});\r\n","import { useEffect, useState, type ReactNode } from 'react';\r\nimport {\r\n ActivityIndicator,\r\n Modal,\r\n Pressable,\r\n ScrollView,\r\n StyleSheet,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport { useDevTools } from '../hooks/useDevTools';\r\nimport { ConnectionStatusBadge } from './ConnectionStatusBadge';\r\n\r\nexport function DevToolsSettingsModal() {\r\n const {\r\n settingsVisible,\r\n closeSettings,\r\n connectionState,\r\n connectionError,\r\n connectionHint,\r\n deviceId,\r\n serverUrl,\r\n metadata,\r\n database,\r\n adapterError,\r\n reconnect,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n } = useDevTools();\r\n\r\n const [draftUrl, setDraftUrl] = useState(serverUrl);\r\n\r\n useEffect(() => {\r\n if (settingsVisible) {\r\n setDraftUrl(serverUrl);\r\n }\r\n }, [settingsVisible, serverUrl]);\r\n\r\n const handleReconnect = () => {\r\n const trimmed = draftUrl.trim();\r\n\r\n if (trimmed) {\r\n reconnect(trimmed);\r\n }\r\n };\r\n\r\n const handleExportDatabase = () => {\r\n void exportDatabase();\r\n };\r\n\r\n const isExporting = exportState === 'exporting';\r\n const exportDisabled =\r\n connectionState !== 'connected' || !database || isExporting;\r\n\r\n return (\r\n <Modal\r\n animationType=\"slide\"\r\n onRequestClose={closeSettings}\r\n transparent\r\n visible={settingsVisible}\r\n >\r\n <View style={styles.overlay}>\r\n <View style={styles.sheet}>\r\n <View style={styles.header}>\r\n <Text style={styles.title}>Database DevTools</Text>\r\n <Pressable accessibilityLabel=\"Close settings\" onPress={closeSettings}>\r\n <Text style={styles.closeButton}>Close</Text>\r\n </Pressable>\r\n </View>\r\n\r\n <ScrollView\r\n contentContainerStyle={styles.content}\r\n style={styles.scrollBody}\r\n >\r\n <Section title=\"Connection\">\r\n <ConnectionStatusBadge state={connectionState} />\r\n <InfoRow label=\"Server URL\" value={serverUrl} mono />\r\n {connectionError ? (\r\n <Text style={styles.errorText}>{connectionError}</Text>\r\n ) : null}\r\n {connectionHint ? (\r\n <Text style={styles.hintText}>{connectionHint}</Text>\r\n ) : null}\r\n {connectionState === 'reconnecting' ? (\r\n <Text style={styles.hintText}>\r\n Ensure the inspector hub is running (npx database-devtools) and the URL reaches\r\n your development machine — not the phone itself.\r\n </Text>\r\n ) : null}\r\n </Section>\r\n\r\n <Section title=\"Device\">\r\n <InfoRow label=\"Device ID\" value={deviceId ?? '—'} mono />\r\n <InfoRow label=\"Platform\" value={metadata.platform ?? '—'} />\r\n <InfoRow label=\"App\" value={metadata.appName ?? '—'} />\r\n {metadata.appVersion ? (\r\n <InfoRow label=\"Version\" value={metadata.appVersion} />\r\n ) : null}\r\n {metadata.bundleId ? (\r\n <InfoRow label=\"Bundle ID\" value={metadata.bundleId} mono />\r\n ) : null}\r\n </Section>\r\n\r\n <Section title=\"Server\">\r\n <Text style={styles.fieldLabel}>WebSocket URL</Text>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n onChangeText={setDraftUrl}\r\n placeholder=\"ws://10.0.2.2:3847/ws\"\r\n style={styles.input}\r\n value={draftUrl}\r\n />\r\n <Pressable onPress={handleReconnect} style={styles.reconnectButton}>\r\n <Text style={styles.reconnectLabel}>Reconnect</Text>\r\n </Pressable>\r\n </Section>\r\n\r\n <Section title=\"Database\">\r\n {database ? (\r\n <>\r\n <InfoRow label=\"Kind\" value={database.kind} />\r\n <InfoRow label=\"Name\" value={database.name} />\r\n <InfoRow label=\"ID\" value={database.id} mono />\r\n </>\r\n ) : (\r\n <Text style={styles.placeholder}>\r\n {adapterError ? 'Adapter not connected' : 'No adapter connected'}\r\n </Text>\r\n )}\r\n </Section>\r\n </ScrollView>\r\n\r\n <View style={styles.exportFooter}>\r\n {adapterError ? <Text style={styles.errorText}>{adapterError}</Text> : null}\r\n {database ? (\r\n <>\r\n <Pressable\r\n accessibilityLabel=\"Export database to web inspector\"\r\n accessibilityState={{ busy: isExporting, disabled: exportDisabled }}\r\n disabled={exportDisabled}\r\n onPress={handleExportDatabase}\r\n style={[\r\n styles.exportButton,\r\n exportDisabled && !isExporting && styles.exportButtonDisabled,\r\n ]}\r\n >\r\n <View style={styles.exportButtonContent}>\r\n {isExporting ? (\r\n <ActivityIndicator color=\"#f8fafc\" size=\"small\" />\r\n ) : null}\r\n <Text style={styles.exportLabel}>\r\n {isExporting ? 'Exporting…' : 'Export Database'}\r\n </Text>\r\n </View>\r\n </Pressable>\r\n {connectionState !== 'connected' ? (\r\n <Text style={styles.hintText}>Connect to the hub before exporting.</Text>\r\n ) : null}\r\n {exportState === 'success' ? (\r\n <Text style={styles.successText}>Sent to web inspector</Text>\r\n ) : null}\r\n {exportError ? <Text style={styles.errorText}>{exportError}</Text> : null}\r\n </>\r\n ) : (\r\n <Text style={styles.placeholder}>\r\n {adapterError ? 'Adapter not connected' : 'No adapter connected'}\r\n </Text>\r\n )}\r\n </View>\r\n </View>\r\n </View>\r\n </Modal>\r\n );\r\n}\r\n\r\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\r\n return (\r\n <View style={styles.section}>\r\n <Text style={styles.sectionTitle}>{title}</Text>\r\n {children}\r\n </View>\r\n );\r\n}\r\n\r\nfunction InfoRow({\r\n label,\r\n value,\r\n mono = false,\r\n}: {\r\n label: string;\r\n value: string;\r\n mono?: boolean;\r\n}) {\r\n return (\r\n <View style={styles.infoRow}>\r\n <Text style={styles.infoLabel}>{label}</Text>\r\n <Text style={[styles.infoValue, mono && styles.mono]} selectable>\r\n {value}\r\n </Text>\r\n </View>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n overlay: {\r\n flex: 1,\r\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\r\n justifyContent: 'flex-end',\r\n },\r\n sheet: {\r\n backgroundColor: '#ffffff',\r\n borderTopLeftRadius: 16,\r\n borderTopRightRadius: 16,\r\n maxHeight: '85%',\r\n overflow: 'hidden',\r\n },\r\n scrollBody: {\r\n flexGrow: 0,\r\n flexShrink: 1,\r\n },\r\n header: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingHorizontal: 20,\r\n paddingVertical: 16,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: '#e2e8f0',\r\n },\r\n title: {\r\n fontSize: 18,\r\n fontWeight: '700',\r\n color: '#0f172a',\r\n },\r\n closeButton: {\r\n fontSize: 16,\r\n color: '#2563eb',\r\n fontWeight: '600',\r\n },\r\n exportFooter: {\r\n paddingHorizontal: 20,\r\n paddingTop: 12,\r\n paddingBottom: 20,\r\n gap: 8,\r\n borderTopWidth: StyleSheet.hairlineWidth,\r\n borderTopColor: '#e2e8f0',\r\n backgroundColor: '#ffffff',\r\n },\r\n content: {\r\n padding: 20,\r\n gap: 20,\r\n },\r\n section: {\r\n gap: 10,\r\n },\r\n sectionTitle: {\r\n fontSize: 13,\r\n fontWeight: '600',\r\n color: '#64748b',\r\n textTransform: 'uppercase',\r\n letterSpacing: 0.5,\r\n },\r\n infoRow: {\r\n gap: 2,\r\n },\r\n infoLabel: {\r\n fontSize: 12,\r\n color: '#94a3b8',\r\n },\r\n infoValue: {\r\n fontSize: 14,\r\n color: '#0f172a',\r\n },\r\n mono: {\r\n fontFamily: 'monospace',\r\n fontSize: 12,\r\n },\r\n fieldLabel: {\r\n fontSize: 12,\r\n color: '#64748b',\r\n marginBottom: 4,\r\n },\r\n input: {\r\n borderWidth: 1,\r\n borderColor: '#cbd5e1',\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 14,\r\n color: '#0f172a',\r\n fontFamily: 'monospace',\r\n },\r\n reconnectButton: {\r\n marginTop: 8,\r\n backgroundColor: '#1e293b',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n },\r\n reconnectLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n exportButton: {\r\n backgroundColor: '#2563eb',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n paddingHorizontal: 16,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n },\r\n exportButtonContent: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 8,\r\n },\r\n exportButtonDisabled: {\r\n opacity: 0.5,\r\n },\r\n exportLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n successText: {\r\n fontSize: 13,\r\n color: '#15803d',\r\n },\r\n placeholder: {\r\n fontSize: 14,\r\n color: '#94a3b8',\r\n fontStyle: 'italic',\r\n },\r\n errorText: {\r\n fontSize: 13,\r\n color: '#dc2626',\r\n marginBottom: 8,\r\n },\r\n hintText: {\r\n fontSize: 12,\r\n color: '#b45309',\r\n lineHeight: 18,\r\n },\r\n});\r\n","export type FloatingButtonCorner = 'bottom-right' | 'bottom-left';\r\n\r\nexport type FloatingButtonPosition = {\r\n x: number;\r\n y: number;\r\n};\r\n\r\nexport type FloatingButtonLayout = {\r\n windowWidth: number;\r\n windowHeight: number;\r\n buttonSize: number;\r\n margin: number;\r\n};\r\n\r\nexport const FLOATING_BUTTON_SIZE = 48;\r\nexport const FLOATING_BUTTON_MARGIN = 16;\r\nexport const FLOATING_BUTTON_BOTTOM = 24;\r\nexport const FLOATING_BUTTON_TAP_THRESHOLD = 8;\r\n\r\nexport function getCornerPosition(\r\n corner: FloatingButtonCorner,\r\n layout: FloatingButtonLayout,\r\n bottomInset = FLOATING_BUTTON_BOTTOM,\r\n): FloatingButtonPosition {\r\n const { windowWidth, windowHeight, buttonSize, margin } = layout;\r\n const y = windowHeight - bottomInset - buttonSize;\r\n\r\n return {\r\n x: corner === 'bottom-right' ? windowWidth - margin - buttonSize : margin,\r\n y,\r\n };\r\n}\r\n\r\nexport function clampFloatingPosition(\r\n position: FloatingButtonPosition,\r\n layout: FloatingButtonLayout,\r\n): FloatingButtonPosition {\r\n const { windowWidth, windowHeight, buttonSize, margin } = layout;\r\n\r\n return {\r\n x: Math.min(Math.max(margin, position.x), windowWidth - margin - buttonSize),\r\n y: Math.min(Math.max(margin, position.y), windowHeight - margin - buttonSize),\r\n };\r\n}\r\n\r\nexport function snapFloatingPositionToEdges(\r\n position: FloatingButtonPosition,\r\n layout: FloatingButtonLayout,\r\n): FloatingButtonPosition {\r\n const { windowWidth, windowHeight, buttonSize, margin } = layout;\r\n const clamped = clampFloatingPosition(position, layout);\r\n const centerX = clamped.x + buttonSize / 2;\r\n const centerY = clamped.y + buttonSize / 2;\r\n\r\n let x = centerX < windowWidth / 2 ? margin : windowWidth - margin - buttonSize;\r\n let y = clamped.y;\r\n\r\n if (centerY < windowHeight * 0.2) {\r\n y = margin;\r\n } else if (centerY > windowHeight * 0.8) {\r\n y = windowHeight - margin - buttonSize;\r\n }\r\n\r\n return { x, y };\r\n}\r\n\r\nexport function isFloatingButtonTap(totalMovement: number): boolean {\r\n return totalMovement < FLOATING_BUTTON_TAP_THRESHOLD;\r\n}\r\n","import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n PanResponder,\r\n Pressable,\r\n StyleSheet,\r\n View,\r\n useWindowDimensions,\r\n type StyleProp,\r\n type TextStyle,\r\n} from 'react-native';\r\nimport { useDevTools } from '../hooks/useDevTools';\r\nimport {\r\n FLOATING_BUTTON_MARGIN,\r\n FLOATING_BUTTON_SIZE,\r\n clampFloatingPosition,\r\n getCornerPosition,\r\n isFloatingButtonTap,\r\n snapFloatingPositionToEdges,\r\n type FloatingButtonCorner,\r\n type FloatingButtonPosition,\r\n} from '../utils/floatingButtonPosition';\r\nimport { getConnectionDotColor } from './ConnectionStatusBadge';\r\n\r\nconst DEFAULT_ICON_SIZE = 22;\r\nconst DEFAULT_ICON_COLOR = '#f8fafc';\r\n\r\nexport type FloatingDevToolsButtonProps = {\r\n position?: FloatingButtonCorner;\r\n iconStyle?: StyleProp<TextStyle>;\r\n draggable?: boolean;\r\n snapToEdges?: boolean;\r\n floatingPosition?: FloatingButtonPosition;\r\n onFloatingPositionChange?: (position: FloatingButtonPosition) => void;\r\n};\r\n\r\nexport function FloatingDevToolsButton({\r\n position = 'bottom-right',\r\n iconStyle,\r\n draggable = true,\r\n snapToEdges = true,\r\n floatingPosition,\r\n onFloatingPositionChange,\r\n}: FloatingDevToolsButtonProps) {\r\n const { connectionState, openLauncher } = useDevTools();\r\n const { width: windowWidth, height: windowHeight } = useWindowDimensions();\r\n const [internalPosition, setInternalPosition] = useState<FloatingButtonPosition | null>(null);\r\n const [dragPosition, setDragPosition] = useState<FloatingButtonPosition | null>(null);\r\n const dragOrigin = useRef<FloatingButtonPosition>({ x: 0, y: 0 });\r\n const hasInitialized = useRef(false);\r\n const onFloatingPositionChangeRef = useRef(onFloatingPositionChange);\r\n\r\n useEffect(() => {\r\n onFloatingPositionChangeRef.current = onFloatingPositionChange;\r\n }, [onFloatingPositionChange]);\r\n\r\n const layout = useMemo(\r\n () => ({\r\n windowWidth,\r\n windowHeight,\r\n buttonSize: FLOATING_BUTTON_SIZE,\r\n margin: FLOATING_BUTTON_MARGIN,\r\n }),\r\n [windowWidth, windowHeight],\r\n );\r\n\r\n const committedPosition = floatingPosition ?? internalPosition;\r\n const renderedPosition = dragPosition ?? committedPosition;\r\n\r\n const commitPosition = useCallback(\r\n (next: FloatingButtonPosition) => {\r\n const clamped = clampFloatingPosition(next, layout);\r\n\r\n if (!floatingPosition) {\r\n setInternalPosition(clamped);\r\n }\r\n\r\n onFloatingPositionChangeRef.current?.(clamped);\r\n return clamped;\r\n },\r\n [floatingPosition, layout],\r\n );\r\n\r\n useEffect(() => {\r\n if (windowWidth <= 0 || windowHeight <= 0) {\r\n return;\r\n }\r\n\r\n if (floatingPosition) {\r\n hasInitialized.current = true;\r\n return;\r\n }\r\n\r\n if (!hasInitialized.current) {\r\n setInternalPosition(getCornerPosition(position, layout));\r\n hasInitialized.current = true;\r\n }\r\n }, [floatingPosition, layout, position, windowHeight, windowWidth]);\r\n\r\n useEffect(() => {\r\n if (!committedPosition || windowWidth <= 0 || windowHeight <= 0) {\r\n return;\r\n }\r\n\r\n const clamped = clampFloatingPosition(committedPosition, layout);\r\n\r\n if (clamped.x !== committedPosition.x || clamped.y !== committedPosition.y) {\r\n commitPosition(clamped);\r\n }\r\n }, [commitPosition, committedPosition, layout, windowHeight, windowWidth]);\r\n\r\n const panResponder = useMemo(\r\n () =>\r\n PanResponder.create({\r\n onStartShouldSetPanResponder: () => draggable,\r\n onMoveShouldSetPanResponder: (_, gesture) =>\r\n draggable && (Math.abs(gesture.dx) > 2 || Math.abs(gesture.dy) > 2),\r\n onPanResponderGrant: () => {\r\n if (!committedPosition) {\r\n return;\r\n }\r\n\r\n dragOrigin.current = committedPosition;\r\n },\r\n onPanResponderMove: (_, gesture) => {\r\n setDragPosition(\r\n clampFloatingPosition(\r\n {\r\n x: dragOrigin.current.x + gesture.dx,\r\n y: dragOrigin.current.y + gesture.dy,\r\n },\r\n layout,\r\n ),\r\n );\r\n },\r\n onPanResponderRelease: (_, gesture) => {\r\n setDragPosition(null);\r\n\r\n const movement = Math.hypot(gesture.dx, gesture.dy);\r\n\r\n if (isFloatingButtonTap(movement)) {\r\n openLauncher();\r\n return;\r\n }\r\n\r\n const raw = {\r\n x: dragOrigin.current.x + gesture.dx,\r\n y: dragOrigin.current.y + gesture.dy,\r\n };\r\n const next = snapToEdges\r\n ? snapFloatingPositionToEdges(raw, layout)\r\n : clampFloatingPosition(raw, layout);\r\n\r\n commitPosition(next);\r\n },\r\n onPanResponderTerminate: () => {\r\n setDragPosition(null);\r\n },\r\n }),\r\n [commitPosition, committedPosition, draggable, layout, openLauncher, snapToEdges],\r\n );\r\n\r\n if (!renderedPosition) {\r\n return null;\r\n }\r\n\r\n const buttonContent = (\r\n <>\r\n <MaterialCommunityIcons\r\n color={DEFAULT_ICON_COLOR}\r\n name=\"database\"\r\n size={DEFAULT_ICON_SIZE}\r\n style={iconStyle}\r\n />\r\n <View\r\n style={[styles.statusDot, { backgroundColor: getConnectionDotColor(connectionState) }]}\r\n />\r\n </>\r\n );\r\n\r\n if (!draggable) {\r\n const positionStyle = position === 'bottom-left' ? styles.bottomLeft : styles.bottomRight;\r\n\r\n return (\r\n <View style={[styles.fixedContainer, positionStyle]} pointerEvents=\"box-none\">\r\n <Pressable\r\n accessibilityLabel=\"Open Database DevTools\"\r\n accessibilityRole=\"button\"\r\n onPress={openLauncher}\r\n style={({ pressed }) => [styles.button, pressed && styles.buttonPressed]}\r\n >\r\n {buttonContent}\r\n </Pressable>\r\n </View>\r\n );\r\n }\r\n\r\n return (\r\n <View\r\n pointerEvents=\"box-none\"\r\n style={[\r\n styles.draggableContainer,\r\n {\r\n transform: [\r\n { translateX: renderedPosition.x },\r\n { translateY: renderedPosition.y },\r\n ],\r\n },\r\n ]}\r\n {...panResponder.panHandlers}\r\n >\r\n <View\r\n accessibilityHint=\"Drag to move. Tap to open DevTools launcher.\"\r\n accessibilityLabel=\"Open Database DevTools\"\r\n accessibilityRole=\"button\"\r\n style={[styles.button, dragPosition && styles.buttonDragging]}\r\n >\r\n {buttonContent}\r\n </View>\r\n </View>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n fixedContainer: {\r\n position: 'absolute',\r\n bottom: 24,\r\n zIndex: 9999,\r\n },\r\n bottomRight: {\r\n right: 16,\r\n },\r\n bottomLeft: {\r\n left: 16,\r\n },\r\n draggableContainer: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n zIndex: 9999,\r\n },\r\n button: {\r\n width: FLOATING_BUTTON_SIZE,\r\n height: FLOATING_BUTTON_SIZE,\r\n borderRadius: FLOATING_BUTTON_SIZE / 2,\r\n backgroundColor: '#1e293b',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n shadowColor: '#000',\r\n shadowOffset: { width: 0, height: 2 },\r\n shadowOpacity: 0.25,\r\n shadowRadius: 4,\r\n elevation: 6,\r\n },\r\n buttonPressed: {\r\n opacity: 0.85,\r\n },\r\n buttonDragging: {\r\n opacity: 0.92,\r\n transform: [{ scale: 1.04 }],\r\n },\r\n statusDot: {\r\n position: 'absolute',\r\n top: 2,\r\n right: 2,\r\n width: 10,\r\n height: 10,\r\n borderRadius: 5,\r\n borderWidth: 2,\r\n borderColor: '#1e293b',\r\n },\r\n});\r\n","import { StyleSheet } from 'react-native';\r\n\r\nexport const explorerColors = {\r\n background: '#ffffff',\r\n surface: '#f8fafc',\r\n border: '#e2e8f0',\r\n text: '#0f172a',\r\n muted: '#64748b',\r\n subtle: '#94a3b8',\r\n accent: '#2563eb',\r\n accentSoft: '#dbeafe',\r\n error: '#dc2626',\r\n success: '#15803d',\r\n overlay: 'rgba(0, 0, 0, 0.45)',\r\n};\r\n\r\nexport const explorerStyles = StyleSheet.create({\r\n fullScreen: {\r\n flex: 1,\r\n backgroundColor: explorerColors.background,\r\n },\r\n header: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingHorizontal: 16,\r\n paddingVertical: 14,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n backgroundColor: explorerColors.background,\r\n },\r\n headerTitle: {\r\n fontSize: 17,\r\n fontWeight: '700',\r\n color: explorerColors.text,\r\n },\r\n headerAction: {\r\n fontSize: 16,\r\n color: explorerColors.accent,\r\n fontWeight: '600',\r\n },\r\n tabRow: {\r\n flexDirection: 'row',\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n backgroundColor: explorerColors.surface,\r\n },\r\n tab: {\r\n flex: 1,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n borderBottomWidth: 2,\r\n borderBottomColor: 'transparent',\r\n },\r\n tabActive: {\r\n borderBottomColor: explorerColors.accent,\r\n },\r\n tabLabel: {\r\n fontSize: 14,\r\n color: explorerColors.muted,\r\n fontWeight: '500',\r\n },\r\n tabLabelActive: {\r\n color: explorerColors.accent,\r\n fontWeight: '700',\r\n },\r\n content: {\r\n flex: 1,\r\n padding: 16,\r\n },\r\n sectionTitle: {\r\n fontSize: 12,\r\n fontWeight: '600',\r\n color: explorerColors.muted,\r\n textTransform: 'uppercase',\r\n letterSpacing: 0.5,\r\n marginBottom: 8,\r\n },\r\n infoRow: {\r\n marginBottom: 10,\r\n },\r\n infoLabel: {\r\n fontSize: 12,\r\n color: explorerColors.subtle,\r\n marginBottom: 2,\r\n },\r\n infoValue: {\r\n fontSize: 14,\r\n color: explorerColors.text,\r\n },\r\n mono: {\r\n fontFamily: 'monospace',\r\n fontSize: 12,\r\n },\r\n listItem: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingVertical: 12,\r\n paddingHorizontal: 12,\r\n borderRadius: 8,\r\n backgroundColor: explorerColors.surface,\r\n marginBottom: 8,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n },\r\n listItemTitle: {\r\n fontSize: 15,\r\n fontWeight: '600',\r\n color: explorerColors.text,\r\n fontFamily: 'monospace',\r\n },\r\n listItemMeta: {\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n },\r\n searchInput: {\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 14,\r\n color: explorerColors.text,\r\n backgroundColor: explorerColors.background,\r\n marginBottom: 12,\r\n },\r\n primaryButton: {\r\n backgroundColor: explorerColors.accent,\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n },\r\n primaryButtonDisabled: {\r\n opacity: 0.5,\r\n },\r\n primaryButtonLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n secondaryButton: {\r\n backgroundColor: '#1e293b',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n },\r\n secondaryButtonLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n ghostButton: {\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n backgroundColor: explorerColors.background,\r\n },\r\n ghostButtonLabel: {\r\n color: explorerColors.text,\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n errorText: {\r\n fontSize: 13,\r\n color: explorerColors.error,\r\n marginTop: 8,\r\n },\r\n hintText: {\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n marginTop: 8,\r\n lineHeight: 18,\r\n },\r\n placeholder: {\r\n fontSize: 14,\r\n color: explorerColors.subtle,\r\n fontStyle: 'italic',\r\n textAlign: 'center',\r\n marginTop: 24,\r\n },\r\n sqlInput: {\r\n minHeight: 120,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 13,\r\n fontFamily: 'monospace',\r\n color: explorerColors.text,\r\n textAlignVertical: 'top',\r\n backgroundColor: explorerColors.surface,\r\n },\r\n sqlTabRoot: {\r\n flex: 1,\r\n minHeight: 0,\r\n },\r\n sqlQueryPane: {\r\n flexShrink: 0,\r\n paddingHorizontal: 16,\r\n paddingTop: 16,\r\n paddingBottom: 12,\r\n gap: 12,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n backgroundColor: explorerColors.background,\r\n },\r\n sqlInputCompact: {\r\n minHeight: 96,\r\n maxHeight: 120,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 13,\r\n fontFamily: 'monospace',\r\n color: explorerColors.text,\r\n textAlignVertical: 'top',\r\n backgroundColor: explorerColors.surface,\r\n },\r\n sqlResultsPane: {\r\n flex: 1,\r\n minHeight: 0,\r\n paddingHorizontal: 16,\r\n paddingTop: 8,\r\n paddingBottom: 16,\r\n },\r\n sqlResultsEmpty: {\r\n flex: 1,\r\n justifyContent: 'center',\r\n paddingHorizontal: 16,\r\n },\r\n subTabRow: {\r\n flexDirection: 'row',\r\n gap: 8,\r\n marginBottom: 12,\r\n },\r\n subTab: {\r\n paddingHorizontal: 12,\r\n paddingVertical: 6,\r\n borderRadius: 999,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n backgroundColor: explorerColors.background,\r\n },\r\n subTabActive: {\r\n borderColor: explorerColors.accent,\r\n backgroundColor: explorerColors.accentSoft,\r\n },\r\n subTabLabel: {\r\n fontSize: 13,\r\n color: explorerColors.muted,\r\n },\r\n subTabLabelActive: {\r\n color: explorerColors.accent,\r\n fontWeight: '600',\r\n },\r\n paginationRow: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingVertical: 12,\r\n borderTopWidth: StyleSheet.hairlineWidth,\r\n borderTopColor: explorerColors.border,\r\n },\r\n paginationLabel: {\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n },\r\n});\r\n\r\nexport const tableStyles = StyleSheet.create({\r\n viewRoot: {\r\n flex: 1,\r\n minHeight: 0,\r\n },\r\n viewToolbar: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n marginBottom: 8,\r\n flexWrap: 'wrap',\r\n },\r\n viewMeta: {\r\n flex: 1,\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n },\r\n viewToggle: {\r\n flexDirection: 'row',\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n overflow: 'hidden',\r\n },\r\n viewToggleButton: {\r\n paddingHorizontal: 10,\r\n paddingVertical: 6,\r\n backgroundColor: explorerColors.background,\r\n },\r\n viewToggleButtonActive: {\r\n backgroundColor: explorerColors.accentSoft,\r\n },\r\n viewToggleLabel: {\r\n fontSize: 12,\r\n fontWeight: '600',\r\n color: explorerColors.muted,\r\n },\r\n viewToggleLabelActive: {\r\n color: explorerColors.accent,\r\n },\r\n footerHint: {\r\n flexShrink: 0,\r\n marginTop: 8,\r\n fontSize: 11,\r\n color: explorerColors.subtle,\r\n textAlign: 'center',\r\n },\r\n tableContainer: {\r\n flex: 1,\r\n minHeight: 0,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n overflow: 'hidden',\r\n backgroundColor: explorerColors.background,\r\n },\r\n horizontalScroll: {\r\n flex: 1,\r\n },\r\n scrollHint: {\r\n paddingHorizontal: 10,\r\n paddingVertical: 6,\r\n fontSize: 11,\r\n color: explorerColors.muted,\r\n backgroundColor: explorerColors.surface,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n },\r\n headerRow: {\r\n flexDirection: 'row',\r\n backgroundColor: '#f1f5f9',\r\n borderBottomWidth: 1,\r\n borderBottomColor: explorerColors.border,\r\n },\r\n headerCell: {\r\n backgroundColor: '#f1f5f9',\r\n },\r\n headerText: {\r\n fontSize: 12,\r\n fontWeight: '700',\r\n color: explorerColors.text,\r\n fontFamily: 'monospace',\r\n },\r\n bodyList: {\r\n flex: 1,\r\n },\r\n dataRow: {\r\n flexDirection: 'row',\r\n backgroundColor: explorerColors.background,\r\n },\r\n dataRowAlt: {\r\n backgroundColor: explorerColors.surface,\r\n },\r\n cell: {\r\n paddingHorizontal: 10,\r\n paddingVertical: 8,\r\n borderRightWidth: 1,\r\n borderBottomWidth: 1,\r\n borderColor: explorerColors.border,\r\n justifyContent: 'center',\r\n },\r\n cellText: {\r\n fontSize: 13,\r\n color: explorerColors.text,\r\n },\r\n cellTextMono: {\r\n fontFamily: 'monospace',\r\n fontSize: 12,\r\n },\r\n cellNull: {\r\n color: explorerColors.subtle,\r\n fontStyle: 'italic',\r\n },\r\n copiedHint: {\r\n marginTop: 2,\r\n fontSize: 10,\r\n color: explorerColors.accent,\r\n fontWeight: '600',\r\n },\r\n cardList: {\r\n paddingBottom: 8,\r\n gap: 8,\r\n },\r\n card: {\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n backgroundColor: explorerColors.surface,\r\n padding: 12,\r\n gap: 10,\r\n },\r\n cardField: {\r\n gap: 2,\r\n },\r\n cardLabel: {\r\n fontSize: 11,\r\n fontWeight: '600',\r\n color: explorerColors.muted,\r\n textTransform: 'uppercase',\r\n letterSpacing: 0.4,\r\n },\r\n cardValue: {\r\n fontSize: 14,\r\n color: explorerColors.text,\r\n },\r\n cardValueMono: {\r\n fontFamily: 'monospace',\r\n fontSize: 13,\r\n },\r\n detailBody: {\r\n flex: 1,\r\n minHeight: 0,\r\n paddingHorizontal: 16,\r\n },\r\n detailDataPane: {\r\n flex: 1,\r\n minHeight: 0,\r\n },\r\n});\r\n","import { Pressable, ScrollView, Text, View } from 'react-native';\r\nimport type { MobileDatabaseInfo } from '../../mobile/types';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerOverviewTabProps = {\r\n info: MobileDatabaseInfo | null;\r\n loading: boolean;\r\n error: string | null;\r\n onOpenTables: () => void;\r\n onOpenSql: () => void;\r\n};\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes < 1024) {\r\n return `${bytes} B`;\r\n }\r\n\r\n if (bytes < 1024 * 1024) {\r\n return `${(bytes / 1024).toFixed(1)} KB`;\r\n }\r\n\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n}\r\n\r\nexport function ExplorerOverviewTab({\r\n info,\r\n loading,\r\n error,\r\n onOpenTables,\r\n onOpenSql,\r\n}: ExplorerOverviewTabProps) {\r\n if (loading) {\r\n return <Text style={explorerStyles.placeholder}>Loading database info…</Text>;\r\n }\r\n\r\n if (error) {\r\n return <Text style={explorerStyles.errorText}>{error}</Text>;\r\n }\r\n\r\n if (!info) {\r\n return <Text style={explorerStyles.placeholder}>No database information available.</Text>;\r\n }\r\n\r\n return (\r\n <ScrollView contentContainerStyle={explorerStyles.content}>\r\n <Text style={explorerStyles.sectionTitle}>Database</Text>\r\n <Info label=\"Name\" value={info.name} />\r\n <Info label=\"Path\" value={info.path} mono />\r\n <Info label=\"SQLite version\" value={info.sqliteVersion} />\r\n <Info label=\"Tables\" value={String(info.tableCount)} />\r\n <Info label=\"Estimated size\" value={formatBytes(info.estimatedSizeBytes)} />\r\n <Info\r\n label=\"Pages\"\r\n value={`${info.pageCount.toLocaleString()} × ${info.pageSize} bytes`}\r\n />\r\n\r\n <View style={{ height: 16 }} />\r\n <Text style={explorerStyles.sectionTitle}>Quick actions</Text>\r\n <View style={{ gap: 8 }}>\r\n <ActionButton label=\"Browse tables\" onPress={onOpenTables} />\r\n <ActionButton label=\"Run SQL query\" onPress={onOpenSql} />\r\n </View>\r\n </ScrollView>\r\n );\r\n}\r\n\r\nfunction Info({ label, value, mono = false }: { label: string; value: string; mono?: boolean }) {\r\n return (\r\n <View style={explorerStyles.infoRow}>\r\n <Text style={explorerStyles.infoLabel}>{label}</Text>\r\n <Text style={[explorerStyles.infoValue, mono && explorerStyles.mono]} selectable>\r\n {value}\r\n </Text>\r\n </View>\r\n );\r\n}\r\n\r\nfunction ActionButton({ label, onPress }: { label: string; onPress: () => void }) {\r\n return (\r\n <Pressable onPress={onPress} style={explorerStyles.ghostButton}>\r\n <Text style={explorerStyles.ghostButtonLabel}>{label}</Text>\r\n </Pressable>\r\n );\r\n}\r\n","export const DEFAULT_MOBILE_SQL = '';\r\n\r\nexport const DEFAULT_PAGE_SIZE = 50;\r\n","const CHAR_WIDTH = 7.5;\r\nconst CELL_PADDING = 24;\r\nconst MIN_COLUMN_WIDTH = 72;\r\nconst MAX_COLUMN_WIDTH = 280;\r\nconst SAMPLE_ROW_LIMIT = 20;\r\n\r\nfunction hintMinWidth(columnName: string): number {\r\n const lower = columnName.toLowerCase();\r\n\r\n if (lower === 'id' || lower.endsWith('_id')) {\r\n return 80;\r\n }\r\n\r\n if (lower.includes('email')) {\r\n return 168;\r\n }\r\n\r\n if (lower.includes('created_at') || lower.includes('updated_at') || lower.endsWith('_at')) {\r\n return 188;\r\n }\r\n\r\n if (lower === 'name' || lower.includes('title')) {\r\n return 128;\r\n }\r\n\r\n if (lower === 'status' || lower === 'type') {\r\n return 96;\r\n }\r\n\r\n return MIN_COLUMN_WIDTH;\r\n}\r\n\r\nfunction measureText(text: string): number {\r\n return Math.ceil(text.length * CHAR_WIDTH) + CELL_PADDING;\r\n}\r\n\r\nfunction formatCellValue(value: string | number | null): string {\r\n if (value === null) {\r\n return 'NULL';\r\n }\r\n\r\n return String(value);\r\n}\r\n\r\nexport function computeColumnWidths(\r\n columns: string[],\r\n rows: (string | number | null)[][],\r\n): number[] {\r\n const sampleRows = rows.slice(0, SAMPLE_ROW_LIMIT);\r\n\r\n return columns.map((column, columnIndex) => {\r\n let maxWidth = measureText(column);\r\n\r\n for (const row of sampleRows) {\r\n const cell = formatCellValue(row[columnIndex] ?? null);\r\n maxWidth = Math.max(maxWidth, measureText(cell));\r\n }\r\n\r\n maxWidth = Math.max(maxWidth, hintMinWidth(column));\r\n\r\n return Math.min(MAX_COLUMN_WIDTH, Math.max(MIN_COLUMN_WIDTH, maxWidth));\r\n });\r\n}\r\n\r\nexport function totalTableWidth(columnWidths: number[]): number {\r\n return columnWidths.reduce((sum, width) => sum + width, 0);\r\n}\r\n\r\nexport function defaultMobileDataViewMode(): 'table' {\r\n return 'table';\r\n}\r\n\r\nexport function isMonospaceColumn(columnName: string): boolean {\r\n const lower = columnName.toLowerCase();\r\n\r\n return (\r\n lower === 'id' ||\r\n lower.endsWith('_id') ||\r\n lower.includes('created_at') ||\r\n lower.includes('updated_at') ||\r\n lower.endsWith('_at') ||\r\n lower.includes('date') ||\r\n lower.includes('time')\r\n );\r\n}\r\n","/** Web / Node fallback — clipboard is provided by the native module. */\r\nexport async function copyToClipboard(_text: string): Promise<boolean> {\r\n return false;\r\n}\r\n","import { useState } from 'react';\r\nimport { FlatList, Pressable, Text, View } from 'react-native';\r\nimport { isMonospaceColumn } from '../../mobile/computeColumnWidths';\r\nimport { copyToClipboard } from '../../mobile/copyToClipboard';\r\nimport { tableStyles } from './mobileExplorerStyles';\r\n\r\ntype MobileDataCardListProps = {\r\n columns: string[];\r\n rows: (string | number | null)[][];\r\n};\r\n\r\nfunction formatValue(value: string | number | null): string {\r\n return value === null ? 'NULL' : String(value);\r\n}\r\n\r\nexport function MobileDataCardList({ columns, rows }: MobileDataCardListProps) {\r\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\r\n\r\n const copyValue = async (value: string, key: string) => {\r\n await copyToClipboard(value);\r\n setCopiedKey(key);\r\n setTimeout(() => setCopiedKey(null), 1500);\r\n };\r\n\r\n return (\r\n <FlatList\r\n data={rows}\r\n keyExtractor={(_, index) => String(index)}\r\n contentContainerStyle={tableStyles.cardList}\r\n style={tableStyles.bodyList}\r\n renderItem={({ item: row, index: rowIndex }) => (\r\n <View style={tableStyles.card}>\r\n {columns.map((column, columnIndex) => {\r\n const value = formatValue(row[columnIndex] ?? null);\r\n const key = `${rowIndex}-${column}`;\r\n const isNull = row[columnIndex] === null;\r\n\r\n return (\r\n <Pressable\r\n key={key}\r\n onPress={() => void copyValue(value, key)}\r\n style={tableStyles.cardField}\r\n >\r\n <Text style={tableStyles.cardLabel}>{column}</Text>\r\n <Text\r\n style={[\r\n tableStyles.cardValue,\r\n isMonospaceColumn(column) && tableStyles.cardValueMono,\r\n isNull && tableStyles.cellNull,\r\n ]}\r\n >\r\n {value}\r\n </Text>\r\n {copiedKey === key && <Text style={tableStyles.copiedHint}>Copied</Text>}\r\n </Pressable>\r\n );\r\n })}\r\n </View>\r\n )}\r\n />\r\n );\r\n}\r\n","import { useMemo, useState } from 'react';\r\nimport {\r\n FlatList,\r\n Pressable,\r\n ScrollView,\r\n Text,\r\n useWindowDimensions,\r\n View,\r\n} from 'react-native';\r\nimport {\r\n computeColumnWidths,\r\n isMonospaceColumn,\r\n totalTableWidth,\r\n} from '../../mobile/computeColumnWidths';\r\nimport { copyToClipboard } from '../../mobile/copyToClipboard';\r\nimport { tableStyles } from './mobileExplorerStyles';\r\n\r\ntype MobileDataTableProps = {\r\n columns: string[];\r\n rows: (string | number | null)[][];\r\n columnWidths?: number[];\r\n};\r\n\r\nfunction formatValue(value: string | number | null): string {\r\n return value === null ? 'NULL' : String(value);\r\n}\r\n\r\nexport function MobileDataTable({ columns, rows, columnWidths: columnWidthsProp }: MobileDataTableProps) {\r\n const { width: windowWidth } = useWindowDimensions();\r\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\r\n\r\n const columnWidths = useMemo(\r\n () => columnWidthsProp ?? computeColumnWidths(columns, rows),\r\n [columnWidthsProp, columns, rows],\r\n );\r\n\r\n const tableWidth = useMemo(() => totalTableWidth(columnWidths), [columnWidths]);\r\n const showScrollHint = tableWidth > windowWidth - 32;\r\n\r\n const copyCell = async (value: string, key: string) => {\r\n await copyToClipboard(value);\r\n setCopiedKey(key);\r\n setTimeout(() => setCopiedKey(null), 1500);\r\n };\r\n\r\n if (columns.length === 0) {\r\n return null;\r\n }\r\n\r\n const headerRow = (\r\n <View style={tableStyles.headerRow}>\r\n {columns.map((column, index) => (\r\n <View\r\n key={column}\r\n style={[tableStyles.cell, tableStyles.headerCell, { width: columnWidths[index] }]}\r\n >\r\n <Text style={tableStyles.headerText}>{column}</Text>\r\n </View>\r\n ))}\r\n </View>\r\n );\r\n\r\n return (\r\n <View style={tableStyles.tableContainer}>\r\n {showScrollHint && (\r\n <Text style={tableStyles.scrollHint}>Swipe horizontally for more columns</Text>\r\n )}\r\n <ScrollView\r\n horizontal\r\n bounces={false}\r\n nestedScrollEnabled\r\n showsHorizontalScrollIndicator\r\n style={tableStyles.horizontalScroll}\r\n >\r\n <View style={{ width: tableWidth, flex: 1 }}>\r\n {headerRow}\r\n <FlatList\r\n data={rows}\r\n keyExtractor={(_, index) => String(index)}\r\n nestedScrollEnabled\r\n style={tableStyles.bodyList}\r\n renderItem={({ item: row, index: rowIndex }) => (\r\n <View style={[tableStyles.dataRow, rowIndex % 2 === 1 && tableStyles.dataRowAlt]}>\r\n {row.map((cell, cellIndex) => {\r\n const column = columns[cellIndex]!;\r\n const display = formatValue(cell);\r\n const key = `${rowIndex}-${cellIndex}`;\r\n const isNull = cell === null;\r\n\r\n return (\r\n <Pressable\r\n key={key}\r\n onPress={() => void copyCell(display, key)}\r\n style={[tableStyles.cell, { width: columnWidths[cellIndex] }]}\r\n >\r\n <Text\r\n numberOfLines={2}\r\n selectable\r\n style={[\r\n tableStyles.cellText,\r\n isMonospaceColumn(column) && tableStyles.cellTextMono,\r\n isNull && tableStyles.cellNull,\r\n ]}\r\n >\r\n {display}\r\n </Text>\r\n {copiedKey === key && <Text style={tableStyles.copiedHint}>Copied</Text>}\r\n </Pressable>\r\n );\r\n })}\r\n </View>\r\n )}\r\n />\r\n </View>\r\n </ScrollView>\r\n </View>\r\n );\r\n}\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { Pressable, Text, View } from 'react-native';\r\nimport {\r\n computeColumnWidths,\r\n totalTableWidth,\r\n} from '../../mobile/computeColumnWidths';\r\nimport { MobileDataCardList } from './MobileDataCardList';\r\nimport { MobileDataTable } from './MobileDataTable';\r\nimport { explorerStyles, tableStyles } from './mobileExplorerStyles';\r\n\r\nexport type MobileDataViewMode = 'table' | 'cards';\r\n\r\ntype MobileDataViewProps = {\r\n columns: string[];\r\n rows: (string | number | null)[][];\r\n metaSuffix?: string;\r\n defaultMode?: MobileDataViewMode;\r\n dataKey?: string;\r\n};\r\n\r\nexport function MobileDataView({\r\n columns,\r\n rows,\r\n metaSuffix,\r\n defaultMode = 'table',\r\n dataKey,\r\n}: MobileDataViewProps) {\r\n const [mode, setMode] = useState<MobileDataViewMode>(defaultMode);\r\n\r\n const columnWidths = useMemo(() => computeColumnWidths(columns, rows), [columns, rows]);\r\n const tableWidth = useMemo(() => totalTableWidth(columnWidths), [columnWidths]);\r\n const columnsKey = columns.join('|');\r\n\r\n useEffect(() => {\r\n setMode(defaultMode);\r\n }, [columnsKey, dataKey, defaultMode, rows.length]);\r\n\r\n if (columns.length === 0) {\r\n return <Text style={explorerStyles.placeholder}>No rows to display.</Text>;\r\n }\r\n\r\n const meta = `${rows.length} row${rows.length === 1 ? '' : 's'} · ${columns.length} column${\r\n columns.length === 1 ? '' : 's'\r\n }${metaSuffix ? ` · ${metaSuffix}` : ''}`;\r\n\r\n return (\r\n <View style={tableStyles.viewRoot}>\r\n <View style={tableStyles.viewToolbar}>\r\n <Text style={tableStyles.viewMeta}>{meta}</Text>\r\n <View style={tableStyles.viewToggle}>\r\n <Pressable\r\n onPress={() => setMode('cards')}\r\n style={[tableStyles.viewToggleButton, mode === 'cards' && tableStyles.viewToggleButtonActive]}\r\n >\r\n <Text\r\n style={[tableStyles.viewToggleLabel, mode === 'cards' && tableStyles.viewToggleLabelActive]}\r\n >\r\n Cards\r\n </Text>\r\n </Pressable>\r\n <Pressable\r\n onPress={() => setMode('table')}\r\n style={[tableStyles.viewToggleButton, mode === 'table' && tableStyles.viewToggleButtonActive]}\r\n >\r\n <Text\r\n style={[tableStyles.viewToggleLabel, mode === 'table' && tableStyles.viewToggleLabelActive]}\r\n >\r\n Table\r\n </Text>\r\n </Pressable>\r\n </View>\r\n </View>\r\n\r\n {mode === 'cards' ? (\r\n <MobileDataCardList columns={columns} rows={rows} />\r\n ) : (\r\n <MobileDataTable columnWidths={columnWidths} columns={columns} rows={rows} />\r\n )}\r\n\r\n {mode === 'table' && tableWidth > 320 && (\r\n <Text style={tableStyles.footerHint}>Tap a cell to copy its value</Text>\r\n )}\r\n {mode === 'cards' && (\r\n <Text style={tableStyles.footerHint}>Tap a field to copy its value</Text>\r\n )}\r\n </View>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport {\r\n ActivityIndicator,\r\n Pressable,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport type { QueryResult } from '../../types/inspection';\r\nimport type { MobileDatabaseInspector } from '../../mobile/types';\r\nimport { DEFAULT_MOBILE_SQL } from '../../mobile/constants';\r\nimport { MobileDataView } from './MobileDataView';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerSqlTabProps = {\r\n inspector: MobileDatabaseInspector;\r\n};\r\n\r\nexport function ExplorerSqlTab({ inspector }: ExplorerSqlTabProps) {\r\n const [sql, setSql] = useState(DEFAULT_MOBILE_SQL);\r\n const [result, setResult] = useState<QueryResult | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [running, setRunning] = useState(false);\r\n const [panel, setPanel] = useState<'results' | 'output'>('results');\r\n const [resultKey, setResultKey] = useState(0);\r\n\r\n const runQuery = async () => {\r\n setRunning(true);\r\n setError(null);\r\n\r\n try {\r\n const queryResult = await inspector.executeQuery(sql);\r\n setResult(queryResult);\r\n setResultKey((current) => current + 1);\r\n setPanel('results');\r\n } catch (runError) {\r\n const message = runError instanceof Error ? runError.message : 'Query failed';\r\n setError(message);\r\n setResult(null);\r\n setPanel('output');\r\n } finally {\r\n setRunning(false);\r\n }\r\n };\r\n\r\n const renderResultsContent = () => {\r\n if (panel === 'output') {\r\n if (error) {\r\n return <Text style={explorerStyles.errorText}>{error}</Text>;\r\n }\r\n\r\n if (result) {\r\n return (\r\n <Text style={explorerStyles.infoValue}>\r\n Query executed successfully. {result.rowCount} row\r\n {result.rowCount === 1 ? '' : 's'} in {result.durationMs.toFixed(1)} ms.\r\n </Text>\r\n );\r\n }\r\n\r\n return <Text style={explorerStyles.placeholder}>Messages and errors appear here.</Text>;\r\n }\r\n\r\n if (!result) {\r\n return (\r\n <View style={explorerStyles.sqlResultsEmpty}>\r\n <Text style={[explorerStyles.placeholder, { marginTop: 0 }]}>\r\n Run a query to see results.\r\n </Text>\r\n </View>\r\n );\r\n }\r\n\r\n if (result.columns.length === 0) {\r\n return (\r\n <View style={explorerStyles.sqlResultsEmpty}>\r\n <Text style={[explorerStyles.placeholder, { marginTop: 0 }]}>\r\n Query completed with no result set ({result.durationMs.toFixed(1)} ms).\r\n </Text>\r\n </View>\r\n );\r\n }\r\n\r\n return (\r\n <MobileDataView\r\n columns={result.columns}\r\n dataKey={String(resultKey)}\r\n defaultMode=\"table\"\r\n metaSuffix={`${result.durationMs.toFixed(1)} ms`}\r\n rows={result.rows}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <View style={explorerStyles.sqlTabRoot}>\r\n <View style={explorerStyles.sqlQueryPane}>\r\n <Text style={explorerStyles.sectionTitle}>SQL (read-only)</Text>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n multiline\r\n onChangeText={setSql}\r\n scrollEnabled\r\n style={explorerStyles.sqlInputCompact}\r\n value={sql}\r\n />\r\n <Pressable\r\n disabled={running}\r\n onPress={() => void runQuery()}\r\n style={[explorerStyles.primaryButton, running && explorerStyles.primaryButtonDisabled]}\r\n >\r\n {running ? (\r\n <ActivityIndicator color=\"#f8fafc\" />\r\n ) : (\r\n <Text style={explorerStyles.primaryButtonLabel}>Run query</Text>\r\n )}\r\n </Pressable>\r\n <Text style={[explorerStyles.hintText, { marginTop: 0 }]}>\r\n Allowed: SELECT, PRAGMA, EXPLAIN, WITH. Writes are blocked in DevTools.\r\n </Text>\r\n </View>\r\n\r\n <View style={[explorerStyles.tabRow, { flexShrink: 0 }]}>\r\n <Pressable\r\n onPress={() => setPanel('results')}\r\n style={[explorerStyles.tab, panel === 'results' && explorerStyles.tabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.tabLabel, panel === 'results' && explorerStyles.tabLabelActive]}\r\n >\r\n Results{result ? ` (${result.rowCount})` : ''}\r\n </Text>\r\n </Pressable>\r\n <Pressable\r\n onPress={() => setPanel('output')}\r\n style={[explorerStyles.tab, panel === 'output' && explorerStyles.tabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.tabLabel, panel === 'output' && explorerStyles.tabLabelActive]}\r\n >\r\n Output\r\n </Text>\r\n </Pressable>\r\n </View>\r\n\r\n <View style={explorerStyles.sqlResultsPane}>{renderResultsContent()}</View>\r\n </View>\r\n );\r\n}\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport {\r\n ActivityIndicator,\r\n Pressable,\r\n ScrollView,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport type { ColumnInfo, TablePageResult } from '../../types/inspection';\r\nimport type { MobileDatabaseInspector } from '../../mobile/types';\r\nimport { DEFAULT_PAGE_SIZE } from '../../mobile/constants';\r\nimport { MobileDataView } from './MobileDataView';\r\nimport { explorerStyles, tableStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerTableDetailProps = {\r\n inspector: MobileDatabaseInspector;\r\n tableName: string;\r\n onBack: () => void;\r\n};\r\n\r\ntype DetailView = 'data' | 'schema';\r\n\r\nexport function ExplorerTableDetail({ inspector, tableName, onBack }: ExplorerTableDetailProps) {\r\n const [view, setView] = useState<DetailView>('data');\r\n const [columns, setColumns] = useState<ColumnInfo[]>([]);\r\n const [pageResult, setPageResult] = useState<TablePageResult | null>(null);\r\n const [search, setSearch] = useState('');\r\n const [page, setPage] = useState(1);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const nextColumns = await inspector.getTableColumns(tableName);\r\n setColumns(nextColumns);\r\n\r\n const result = await inspector.fetchTablePage({\r\n table: tableName,\r\n page,\r\n pageSize: DEFAULT_PAGE_SIZE,\r\n search,\r\n });\r\n\r\n setPageResult(result);\r\n } catch (loadError) {\r\n setError(loadError instanceof Error ? loadError.message : 'Failed to load table');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [inspector, page, search, tableName]);\r\n\r\n useEffect(() => {\r\n void loadData();\r\n }, [loadData]);\r\n\r\n const totalPages = pageResult\r\n ? Math.max(1, Math.ceil(pageResult.totalCount / pageResult.pageSize))\r\n : 1;\r\n\r\n return (\r\n <View style={explorerStyles.fullScreen}>\r\n <View style={explorerStyles.header}>\r\n <Pressable onPress={onBack}>\r\n <Text style={explorerStyles.headerAction}>← Back</Text>\r\n </Pressable>\r\n <Text style={explorerStyles.headerTitle}>{tableName}</Text>\r\n <View style={{ width: 48 }} />\r\n </View>\r\n\r\n <View style={[explorerStyles.subTabRow, { paddingHorizontal: 16, paddingTop: 12 }]}>\r\n <Pressable\r\n onPress={() => setView('data')}\r\n style={[explorerStyles.subTab, view === 'data' && explorerStyles.subTabActive]}\r\n >\r\n <Text style={[explorerStyles.subTabLabel, view === 'data' && explorerStyles.subTabLabelActive]}>\r\n Data\r\n </Text>\r\n </Pressable>\r\n <Pressable\r\n onPress={() => setView('schema')}\r\n style={[explorerStyles.subTab, view === 'schema' && explorerStyles.subTabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.subTabLabel, view === 'schema' && explorerStyles.subTabLabelActive]}\r\n >\r\n Schema\r\n </Text>\r\n </Pressable>\r\n </View>\r\n\r\n {view === 'data' ? (\r\n <View style={tableStyles.detailBody}>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n onChangeText={(value) => {\r\n setSearch(value);\r\n setPage(1);\r\n }}\r\n placeholder=\"Search rows…\"\r\n style={explorerStyles.searchInput}\r\n value={search}\r\n />\r\n\r\n {loading ? (\r\n <ActivityIndicator style={{ marginTop: 24 }} />\r\n ) : error ? (\r\n <Text style={explorerStyles.errorText}>{error}</Text>\r\n ) : pageResult ? (\r\n <>\r\n <View style={tableStyles.detailDataPane}>\r\n <MobileDataView\r\n columns={pageResult.columns}\r\n dataKey={`${tableName}-${page}-${search}`}\r\n defaultMode=\"table\"\r\n metaSuffix={`page ${page} of ${totalPages}`}\r\n rows={pageResult.rows}\r\n />\r\n </View>\r\n <View style={explorerStyles.paginationRow}>\r\n <Pressable disabled={page <= 1} onPress={() => setPage((current) => current - 1)}>\r\n <Text style={explorerStyles.headerAction}>Previous</Text>\r\n </Pressable>\r\n <Text style={explorerStyles.paginationLabel}>\r\n Page {page} of {totalPages} · {pageResult.totalCount.toLocaleString()} rows\r\n </Text>\r\n <Pressable\r\n disabled={page >= totalPages}\r\n onPress={() => setPage((current) => current + 1)}\r\n >\r\n <Text style={explorerStyles.headerAction}>Next</Text>\r\n </Pressable>\r\n </View>\r\n </>\r\n ) : null}\r\n </View>\r\n ) : (\r\n <ScrollView contentContainerStyle={explorerStyles.content}>\r\n {columns.length === 0 ? (\r\n <Text style={explorerStyles.placeholder}>No schema information.</Text>\r\n ) : (\r\n columns.map((column) => (\r\n <View key={column.name} style={explorerStyles.listItem}>\r\n <View style={{ flex: 1 }}>\r\n <Text style={explorerStyles.listItemTitle}>{column.name}</Text>\r\n <Text style={explorerStyles.listItemMeta}>\r\n {column.type}\r\n {column.pk ? ' · PK' : ''}\r\n {column.notNull ? ' · NOT NULL' : ''}\r\n {column.defaultValue ? ` · DEFAULT ${column.defaultValue}` : ''}\r\n </Text>\r\n </View>\r\n </View>\r\n ))\r\n )}\r\n </ScrollView>\r\n )}\r\n </View>\r\n );\r\n}\r\n","import { useMemo, useState } from 'react';\r\nimport {\r\n FlatList,\r\n Pressable,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport type { TableInfo } from '../../types/inspection';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerTablesTabProps = {\r\n tables: TableInfo[];\r\n loading: boolean;\r\n error: string | null;\r\n onSelectTable: (tableName: string) => void;\r\n};\r\n\r\nexport function ExplorerTablesTab({\r\n tables,\r\n loading,\r\n error,\r\n onSelectTable,\r\n}: ExplorerTablesTabProps) {\r\n const [search, setSearch] = useState('');\r\n\r\n const filtered = useMemo(() => {\r\n const term = search.trim().toLowerCase();\r\n\r\n if (!term) {\r\n return tables;\r\n }\r\n\r\n return tables.filter((table) => table.name.toLowerCase().includes(term));\r\n }, [search, tables]);\r\n\r\n if (loading) {\r\n return <Text style={explorerStyles.placeholder}>Loading tables…</Text>;\r\n }\r\n\r\n if (error) {\r\n return <Text style={explorerStyles.errorText}>{error}</Text>;\r\n }\r\n\r\n return (\r\n <View style={{ flex: 1, padding: 16 }}>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n onChangeText={setSearch}\r\n placeholder=\"Filter tables…\"\r\n style={explorerStyles.searchInput}\r\n value={search}\r\n />\r\n\r\n {filtered.length === 0 ? (\r\n <Text style={explorerStyles.placeholder}>No tables match your search.</Text>\r\n ) : (\r\n <FlatList\r\n data={filtered}\r\n keyExtractor={(item) => item.name}\r\n style={{ flex: 1 }}\r\n renderItem={({ item }) => (\r\n <Pressable onPress={() => onSelectTable(item.name)} style={explorerStyles.listItem}>\r\n <View>\r\n <Text style={explorerStyles.listItemTitle}>{item.name}</Text>\r\n <Text style={explorerStyles.listItemMeta}>\r\n {item.rowCount.toLocaleString()} row{item.rowCount === 1 ? '' : 's'}\r\n </Text>\r\n </View>\r\n <Text style={explorerStyles.listItemMeta}>›</Text>\r\n </Pressable>\r\n )}\r\n />\r\n )}\r\n </View>\r\n );\r\n}\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { Modal, Pressable, Text, View } from 'react-native';\r\nimport { useDevTools } from '../../hooks/useDevTools';\r\nimport type { MobileDatabaseInfo } from '../../mobile/types';\r\nimport type { TableInfo } from '../../types/inspection';\r\nimport { ExplorerOverviewTab } from './ExplorerOverviewTab';\r\nimport { ExplorerSqlTab } from './ExplorerSqlTab';\r\nimport { ExplorerTableDetail } from './ExplorerTableDetail';\r\nimport { ExplorerTablesTab } from './ExplorerTablesTab';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerTab = 'overview' | 'tables' | 'sql';\r\n\r\ntype ExplorerScreen =\r\n | { kind: 'tabs' }\r\n | { kind: 'table'; tableName: string };\r\n\r\nexport function MobileDatabaseExplorer() {\r\n const { explorerVisible, closeExplorer, mobileInspector } = useDevTools();\r\n const [tab, setTab] = useState<ExplorerTab>('overview');\r\n const [screen, setScreen] = useState<ExplorerScreen>({ kind: 'tabs' });\r\n const [info, setInfo] = useState<MobileDatabaseInfo | null>(null);\r\n const [tables, setTables] = useState<TableInfo[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadOverview = useCallback(async () => {\r\n if (!mobileInspector) {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const [nextInfo, nextTables] = await Promise.all([\r\n mobileInspector.getDatabaseInfo(),\r\n mobileInspector.listTables(),\r\n ]);\r\n setInfo(nextInfo);\r\n setTables(nextTables);\r\n } catch (loadError) {\r\n setError(loadError instanceof Error ? loadError.message : 'Failed to load database');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [mobileInspector]);\r\n\r\n useEffect(() => {\r\n if (!explorerVisible) {\r\n setScreen({ kind: 'tabs' });\r\n setTab('overview');\r\n return;\r\n }\r\n\r\n void loadOverview();\r\n }, [explorerVisible, loadOverview]);\r\n\r\n if (!mobileInspector) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Modal animationType=\"slide\" onRequestClose={closeExplorer} visible={explorerVisible}>\r\n {screen.kind === 'table' ? (\r\n <ExplorerTableDetail\r\n inspector={mobileInspector}\r\n onBack={() => setScreen({ kind: 'tabs' })}\r\n tableName={screen.tableName}\r\n />\r\n ) : (\r\n <View style={explorerStyles.fullScreen}>\r\n <View style={explorerStyles.header}>\r\n <Text style={explorerStyles.headerTitle}>Database Explorer</Text>\r\n <Pressable accessibilityLabel=\"Close database explorer\" onPress={closeExplorer}>\r\n <Text style={explorerStyles.headerAction}>Close</Text>\r\n </Pressable>\r\n </View>\r\n\r\n <View style={explorerStyles.tabRow}>\r\n {(['overview', 'tables', 'sql'] as ExplorerTab[]).map((item) => (\r\n <Pressable\r\n key={item}\r\n onPress={() => setTab(item)}\r\n style={[explorerStyles.tab, tab === item && explorerStyles.tabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.tabLabel, tab === item && explorerStyles.tabLabelActive]}\r\n >\r\n {item === 'overview' ? 'Overview' : item === 'tables' ? 'Tables' : 'SQL'}\r\n </Text>\r\n </Pressable>\r\n ))}\r\n </View>\r\n\r\n <View style={{ flex: 1 }}>\r\n {tab === 'overview' && (\r\n <ExplorerOverviewTab\r\n error={error}\r\n info={info}\r\n loading={loading}\r\n onOpenSql={() => setTab('sql')}\r\n onOpenTables={() => setTab('tables')}\r\n />\r\n )}\r\n {tab === 'tables' && (\r\n <ExplorerTablesTab\r\n error={error}\r\n loading={loading}\r\n onSelectTable={(tableName) => setScreen({ kind: 'table', tableName })}\r\n tables={tables}\r\n />\r\n )}\r\n {tab === 'sql' && <ExplorerSqlTab inspector={mobileInspector} />}\r\n </View>\r\n </View>\r\n )}\r\n </Modal>\r\n );\r\n}\r\n","import { StyleSheet, View, type StyleProp, type TextStyle } from 'react-native';\r\nimport type { ConnectionState } from '../client/createDevToolsClient';\r\nimport type { DatabaseAdapter } from '../types/adapter';\r\nimport type { DatabaseKind } from '../types/kind';\r\nimport type { FloatingButtonPosition } from '../utils/floatingButtonPosition';\r\nimport { isDevToolsEnabled } from '../utils/isDevToolsEnabled';\r\nimport { DevToolsProvider } from './DevToolsProvider';\r\nimport { DevToolsLauncherModal } from './DevToolsLauncherModal';\r\nimport { DevToolsSettingsModal } from './DevToolsSettingsModal';\r\nimport { FloatingDevToolsButton } from './FloatingDevToolsButton';\r\nimport { MobileDatabaseExplorer } from './mobile/MobileDatabaseExplorer';\r\n\r\nexport type { ConnectionState };\r\nexport type { FloatingButtonPosition };\r\n\r\nexport type DatabaseDevToolsProps = {\r\n /** Raw database instance (auto-detected) or a resolved adapter. */\r\n database?: unknown;\r\n /** Explicit database kind override. */\r\n type?: DatabaseKind;\r\n /** Custom adapter override (advanced). */\r\n adapter?: DatabaseAdapter;\r\n serverUrl?: string;\r\n enabled?: boolean;\r\n position?: 'bottom-right' | 'bottom-left';\r\n /** Allow dragging the floating button around the screen. */\r\n draggable?: boolean;\r\n /** Snap the button to screen edges after dragging. */\r\n snapToEdges?: boolean;\r\n /** Controlled floating button position. */\r\n floatingPosition?: FloatingButtonPosition;\r\n /** Called when the user drags the floating button to a new position. */\r\n onFloatingPositionChange?: (position: FloatingButtonPosition) => void;\r\n /** Optional style for the floating button database icon. */\r\n style?: StyleProp<TextStyle>;\r\n onConnectionStateChange?: (state: ConnectionState) => void;\r\n};\r\n\r\nexport function DatabaseDevTools({\r\n database,\r\n type,\r\n adapter,\r\n serverUrl,\r\n enabled,\r\n position = 'bottom-right',\r\n draggable = true,\r\n snapToEdges = true,\r\n floatingPosition,\r\n onFloatingPositionChange,\r\n style,\r\n onConnectionStateChange,\r\n}: DatabaseDevToolsProps) {\r\n if (!isDevToolsEnabled(enabled)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <DevToolsProvider\r\n adapter={adapter}\r\n database={database}\r\n onConnectionStateChange={onConnectionStateChange}\r\n serverUrl={serverUrl}\r\n type={type}\r\n >\r\n <View pointerEvents=\"box-none\" style={StyleSheet.absoluteFill}>\r\n <FloatingDevToolsButton\r\n draggable={draggable}\r\n floatingPosition={floatingPosition}\r\n iconStyle={style}\r\n onFloatingPositionChange={onFloatingPositionChange}\r\n position={position}\r\n snapToEdges={snapToEdges}\r\n />\r\n <DevToolsLauncherModal />\r\n <DevToolsSettingsModal />\r\n <MobileDatabaseExplorer />\r\n </View>\r\n </DevToolsProvider>\r\n );\r\n}\r\n","const RESET = '\\x1b[0m';\r\nconst GREEN = '\\x1b[32m';\r\nconst YELLOW = '\\x1b[33m';\r\nconst CYAN = '\\x1b[36m';\r\nconst RED = '\\x1b[31m';\r\nconst DIM = '\\x1b[2m';\r\n\r\nconst PREFIX = `${DIM}[database-devtools]${RESET}`;\r\n\r\nfunction log(color: string, symbol: string, message: string): void {\r\n console.log(`${PREFIX} ${color}${symbol}${RESET} ${message}`);\r\n}\r\n\r\nexport const logger = {\r\n browserConnected(connectionId?: string): void {\r\n const suffix = connectionId ? ` ${DIM}(${connectionId})${RESET}` : '';\r\n log(GREEN, '✓', `Browser Connected${suffix}`);\r\n },\r\n\r\n browserDisconnected(connectionId?: string): void {\r\n const suffix = connectionId ? ` ${DIM}(${connectionId})${RESET}` : '';\r\n log(YELLOW, '✓', `Browser Disconnected${suffix}`);\r\n },\r\n\r\n mobileConnected(deviceId?: string): void {\r\n const suffix = deviceId ? ` ${DIM}(deviceId: ${deviceId})${RESET}` : '';\r\n log(GREEN, '✓', `Mobile Connected${suffix}`);\r\n },\r\n\r\n mobileDisconnected(deviceId?: string): void {\r\n const suffix = deviceId ? ` ${DIM}(deviceId: ${deviceId})${RESET}` : '';\r\n log(YELLOW, '✓', `Mobile Disconnected${suffix}`);\r\n },\r\n\r\n broadcastSent(target?: string): void {\r\n const suffix = target ? ` ${DIM}→ ${target}${RESET}` : '';\r\n log(CYAN, '✓', `Broadcast Sent${suffix}`);\r\n },\r\n\r\n serverStarted(url: string, wsUrl: string, webUiEnabled = false): void {\r\n log(GREEN, '✓', `Server started at ${url}`);\r\n log(GREEN, '✓', `WebSocket endpoint ${wsUrl}`);\r\n\r\n if (webUiEnabled) {\r\n log(GREEN, '✓', `Browser UI available at ${url}`);\r\n }\r\n },\r\n\r\n heartbeatTimeout(connectionId: string): void {\r\n log(RED, '✓', `Heartbeat timeout — removing ${connectionId}`);\r\n },\r\n\r\n refreshStarted(deviceId: string): void {\r\n log(CYAN, '↻', `Refresh started ${DIM}(${deviceId})${RESET}`);\r\n },\r\n\r\n refreshUploaded(deviceId: string, bytes: number): void {\r\n log(GREEN, '↻', `Snapshot uploaded ${DIM}(${deviceId}, ${bytes} bytes)${RESET}`);\r\n },\r\n\r\n refreshFailed(deviceId: string, code: string, message: string): void {\r\n log(RED, '↻', `Refresh failed ${DIM}(${deviceId}: ${code})${RESET} ${message}`);\r\n },\r\n\r\n /** @deprecated Use refreshStarted */\r\n syncStarted(syncId: string, deviceId: string): void {\r\n this.refreshStarted(deviceId);\r\n },\r\n\r\n /** @deprecated Use refreshUploaded */\r\n syncUploaded(syncId: string, bytes: number): void {\r\n this.refreshUploaded(syncId, bytes);\r\n },\r\n\r\n /** @deprecated Use refreshFailed */\r\n syncFailed(syncId: string, code: string, message: string): void {\r\n this.refreshFailed(syncId, code, message);\r\n },\r\n\r\n error(message: string): void {\r\n log(RED, '✗', message);\r\n },\r\n};\r\n","import { existsSync } from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { Express, Request, Response } from 'express';\r\nimport express from 'express';\r\n\r\nfunction shouldServeSpa(request: Request): boolean {\r\n if (request.method !== 'GET' && request.method !== 'HEAD') {\r\n return false;\r\n }\r\n\r\n if (request.path.startsWith('/api')) {\r\n return false;\r\n }\r\n\r\n if (request.path === '/health') {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function attachWebUi(app: Express, webDistPath: string): void {\r\n const indexPath = path.join(webDistPath, 'index.html');\r\n\r\n if (!existsSync(indexPath)) {\r\n return;\r\n }\r\n\r\n app.use(\r\n express.static(webDistPath, {\r\n index: false,\r\n setHeaders(response, filePath) {\r\n if (filePath.endsWith('.wasm')) {\r\n response.setHeader('Content-Type', 'application/wasm');\r\n }\r\n },\r\n }),\r\n );\r\n\r\n app.get('*', (request: Request, response: Response, next) => {\r\n if (!shouldServeSpa(request)) {\r\n next();\r\n return;\r\n }\r\n\r\n response.sendFile(indexPath);\r\n });\r\n}\r\n","import type { Server } from 'node:http';\r\nimport { WebSocketServer, type WebSocket } from 'ws';\r\nimport {\r\n DEVTOOLS_WS_PATH,\r\n DevToolsRole,\r\n isBeginTransactionRequestMessage,\r\n isCommitTransactionRequestMessage,\r\n isExportSnapshotRequestMessage,\r\n isPongMessage,\r\n isRefreshRequestMessage,\r\n isRegisterMessage,\r\n isRollbackTransactionRequestMessage,\r\n isTransactionAckMessage,\r\n isWriteAckMessage,\r\n isWriteRequestMessage,\r\n} from '../types/protocol';\r\nimport { logger } from '../utils/logger';\r\nimport type { ConnectionManager } from './connectionManager';\r\nimport type { Heartbeat } from './heartbeat';\r\nimport type { MessageRouter } from './messageRouter';\r\nimport type { RefreshCoordinator } from './refreshCoordinator';\r\nimport type { SnapshotFileStore } from './snapshotFileStore';\r\nimport type { WriteCoordinator } from './writeCoordinator';\r\n\r\nexport type AttachWebSocketOptions = {\r\n snapshotFileStore?: SnapshotFileStore;\r\n};\r\n\r\nexport type AttachWebSocketResult = {\r\n wss: WebSocketServer;\r\n};\r\n\r\nexport function attachWebSocket(\r\n httpServer: Server,\r\n connectionManager: ConnectionManager,\r\n router: MessageRouter,\r\n heartbeat: Heartbeat,\r\n refreshCoordinator: RefreshCoordinator,\r\n writeCoordinator: WriteCoordinator,\r\n options?: AttachWebSocketOptions,\r\n): AttachWebSocketResult {\r\n const wss = new WebSocketServer({ server: httpServer, path: DEVTOOLS_WS_PATH });\r\n\r\n const handleDisconnect = (socket: WebSocket): void => {\r\n const client = connectionManager.remove(socket);\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n if (client.role === DevToolsRole.MOBILE) {\r\n if (client.deviceId) {\r\n writeCoordinator.rollbackSessionsForDevice(client.deviceId);\r\n }\r\n\r\n logger.mobileDisconnected(client.deviceId);\r\n } else {\r\n writeCoordinator.rollbackSessionsOnBrowserDisconnect(client.connectionId);\r\n logger.browserDisconnected(client.connectionId);\r\n }\r\n\r\n router.broadcastDeviceStatus();\r\n };\r\n\r\n wss.on('connection', (socket: WebSocket) => {\r\n socket.on('message', (raw) => {\r\n let parsed: unknown;\r\n\r\n try {\r\n parsed = JSON.parse(String(raw));\r\n } catch {\r\n return;\r\n }\r\n\r\n if (isRegisterMessage(parsed)) {\r\n const existing = connectionManager.getBySocket(socket);\r\n\r\n if (existing) {\r\n return;\r\n }\r\n\r\n const client = connectionManager.add({\r\n socket,\r\n role: parsed.role,\r\n deviceId: parsed.deviceId,\r\n metadata: parsed.metadata,\r\n });\r\n\r\n if (client.role === DevToolsRole.MOBILE) {\r\n logger.mobileConnected(client.deviceId);\r\n\r\n if (client.deviceId && options?.snapshotFileStore) {\r\n void options.snapshotFileStore\r\n .reconcileOnMobileConnect({\r\n deviceId: client.deviceId,\r\n bundleId: client.metadata?.bundleId,\r\n })\r\n .finally(() => {\r\n router.broadcastDeviceStatus();\r\n });\r\n return;\r\n }\r\n } else {\r\n logger.browserConnected(client.connectionId);\r\n }\r\n\r\n router.broadcastDeviceStatus();\r\n return;\r\n }\r\n\r\n if (isPongMessage(parsed)) {\r\n connectionManager.updateLastPong(socket);\r\n return;\r\n }\r\n\r\n if (isRefreshRequestMessage(parsed)) {\r\n refreshCoordinator.handleRefreshRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isExportSnapshotRequestMessage(parsed)) {\r\n refreshCoordinator.handleMobileExportRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isBeginTransactionRequestMessage(parsed)) {\r\n writeCoordinator.handleBeginTransactionRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isCommitTransactionRequestMessage(parsed)) {\r\n writeCoordinator.handleCommitTransactionRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isRollbackTransactionRequestMessage(parsed)) {\r\n writeCoordinator.handleRollbackTransactionRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isWriteRequestMessage(parsed)) {\r\n writeCoordinator.handleWriteRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isTransactionAckMessage(parsed)) {\r\n writeCoordinator.handleTransactionAck(parsed);\r\n return;\r\n }\r\n\r\n if (isWriteAckMessage(parsed)) {\r\n writeCoordinator.handleWriteAck(parsed);\r\n }\r\n });\r\n\r\n socket.on('close', () => {\r\n handleDisconnect(socket);\r\n });\r\n\r\n socket.on('error', () => {\r\n handleDisconnect(socket);\r\n });\r\n });\r\n\r\n heartbeat.start();\r\n\r\n return { wss };\r\n}\r\n","import type { WebSocket } from 'ws';\nimport type { DevToolsRole, DeviceMetadata } from '../types/protocol';\nimport { generateConnectionId } from '../utils/ids';\n\nexport type ConnectedClient = {\n socket: WebSocket;\n connectionId: string;\n role: DevToolsRole;\n deviceId?: string;\n metadata?: DeviceMetadata;\n connectedAt: number;\n lastPongAt: number;\n};\n\nexport type RegisterClientInput = {\n socket: WebSocket;\n role: DevToolsRole;\n deviceId?: string;\n metadata?: DeviceMetadata;\n};\n\nexport class ConnectionManager {\n private readonly clients = new Map<WebSocket, ConnectedClient>();\n\n add(input: RegisterClientInput): ConnectedClient {\n const now = Date.now();\n const client: ConnectedClient = {\n socket: input.socket,\n connectionId: generateConnectionId(),\n role: input.role,\n deviceId: input.deviceId,\n metadata: input.metadata,\n connectedAt: now,\n lastPongAt: now,\n };\n\n this.clients.set(input.socket, client);\n return client;\n }\n\n remove(socket: WebSocket): ConnectedClient | undefined {\n const client = this.clients.get(socket);\n\n if (client) {\n this.clients.delete(socket);\n }\n\n return client;\n }\n\n getBySocket(socket: WebSocket): ConnectedClient | undefined {\n return this.clients.get(socket);\n }\n\n getByConnectionId(connectionId: string): ConnectedClient | undefined {\n for (const client of this.clients.values()) {\n if (client.connectionId === connectionId) {\n return client;\n }\n }\n\n return undefined;\n }\n\n getByDeviceId(deviceId: string): ConnectedClient | undefined {\n for (const client of this.clients.values()) {\n if (client.deviceId === deviceId) {\n return client;\n }\n }\n\n return undefined;\n }\n\n getByRole(role: DevToolsRole): ConnectedClient[] {\n return [...this.clients.values()].filter((client) => client.role === role);\n }\n\n updateLastPong(socket: WebSocket): void {\n const client = this.clients.get(socket);\n\n if (client) {\n client.lastPongAt = Date.now();\n }\n }\n\n getAll(): ConnectedClient[] {\n return [...this.clients.values()];\n }\n}\n","import type { NextFunction, Request, Response } from 'express';\r\nimport {\r\n SNAPSHOT_KIND_HEADER,\r\n SNAPSHOT_MIME_HEADER,\r\n SNAPSHOT_NAME_HEADER,\r\n} from '../types/snapshot';\r\n\r\nconst ALLOWED_METHODS = 'GET, POST, OPTIONS';\r\n\r\nconst ALLOWED_HEADERS = [\r\n 'Content-Type',\r\n SNAPSHOT_KIND_HEADER,\r\n SNAPSHOT_MIME_HEADER,\r\n SNAPSHOT_NAME_HEADER,\r\n].join(', ');\r\n\r\nexport type CorsOptions = {\r\n /** Fixed origin, or `*` when request has no Origin header. */\r\n allowedOrigin?: string;\r\n};\r\n\r\nexport function resolveCorsOrigin(\r\n requestOrigin: string | undefined,\r\n configuredOrigin?: string,\r\n): string {\r\n if (configuredOrigin) {\r\n return configuredOrigin;\r\n }\r\n\r\n if (!requestOrigin) {\r\n return '*';\r\n }\r\n\r\n try {\r\n const url = new URL(requestOrigin);\r\n const isLocalDev =\r\n url.hostname === 'localhost' ||\r\n url.hostname === '127.0.0.1' ||\r\n url.hostname === '10.0.2.2';\r\n\r\n if (isLocalDev) {\r\n return requestOrigin;\r\n }\r\n } catch {\r\n return '*';\r\n }\r\n\r\n return '*';\r\n}\r\n\r\nexport function createCorsMiddleware(options: CorsOptions = {}) {\r\n const configuredOrigin = options.allowedOrigin ?? process.env.DATABASE_DEVTOOLS_CORS_ORIGIN;\r\n\r\n return (request: Request, response: Response, next: NextFunction): void => {\r\n const origin = resolveCorsOrigin(request.header('origin'), configuredOrigin);\r\n\r\n response.setHeader('Access-Control-Allow-Origin', origin);\r\n response.setHeader('Access-Control-Allow-Methods', ALLOWED_METHODS);\r\n response.setHeader('Access-Control-Allow-Headers', ALLOWED_HEADERS);\r\n response.setHeader('Vary', 'Origin');\r\n\r\n if (request.method === 'OPTIONS') {\r\n response.status(204).end();\r\n return;\r\n }\r\n\r\n next();\r\n };\r\n}\r\n","import type { ConnectionManager } from './connectionManager';\nimport type { DeviceStatusPayload } from '../types/protocol';\nimport { DevToolsRole } from '../types/protocol';\n\nexport class DeviceRegistry {\n constructor(private readonly connectionManager: ConnectionManager) {}\n\n snapshot(): DeviceStatusPayload {\n const browsers = this.connectionManager\n .getByRole(DevToolsRole.BROWSER)\n .map((client) => ({\n connectionId: client.connectionId,\n connectedAt: client.connectedAt,\n }));\n\n const mobiles = this.connectionManager\n .getByRole(DevToolsRole.MOBILE)\n .map((client) => ({\n deviceId: client.deviceId ?? client.connectionId,\n connectionId: client.connectionId,\n connectedAt: client.connectedAt,\n metadata: client.metadata,\n }));\n\n return {\n browserCount: browsers.length,\n mobileCount: mobiles.length,\n browsers,\n mobiles,\n };\n }\n}\n","import {\n createMessage,\n HEARTBEAT_INTERVAL_MS,\n HEARTBEAT_TIMEOUT_MS,\n MessageType,\n type PingMessage,\n} from '../types/protocol';\nimport { generatePingId } from '../utils/ids';\nimport { logger } from '../utils/logger';\nimport type { ConnectionManager } from './connectionManager';\nimport type { MessageRouter } from './messageRouter';\n\nexport class Heartbeat {\n private interval: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly connectionManager: ConnectionManager,\n private readonly router: MessageRouter,\n ) {}\n\n start(): void {\n if (this.interval !== null) {\n return;\n }\n\n this.interval = setInterval(() => {\n this.pingAll();\n this.removeStaleConnections();\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.interval !== null) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n\n private pingAll(): void {\n const pingId = generatePingId();\n const message = createMessage<PingMessage>({\n type: MessageType.PING,\n pingId,\n });\n\n for (const client of this.connectionManager.getAll()) {\n this.router.sendToSocket(client.socket, message);\n }\n }\n\n private removeStaleConnections(): void {\n const now = Date.now();\n\n for (const client of this.connectionManager.getAll()) {\n if (now - client.lastPongAt > HEARTBEAT_INTERVAL_MS + HEARTBEAT_TIMEOUT_MS) {\n logger.heartbeatTimeout(client.connectionId);\n client.socket.terminate();\n this.connectionManager.remove(client.socket);\n }\n }\n }\n}\n","import type { WebSocket } from 'ws';\nimport {\n createMessage,\n DevToolsRole,\n MessageType,\n type BroadcastMessage,\n type DeviceStatusMessage,\n type ServerMessage,\n} from '../types/protocol';\nimport { logger } from '../utils/logger';\nimport type { ConnectionManager } from './connectionManager';\nimport type { DeviceRegistry } from './deviceRegistry';\n\nexport type OutboundMessage = ServerMessage;\n\nexport class MessageRouter {\n constructor(\n private readonly connectionManager: ConnectionManager,\n private readonly deviceRegistry: DeviceRegistry,\n ) {}\n\n sendToSocket(socket: WebSocket, message: OutboundMessage): void {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n\n sendToBrowser(connectionId: string, message: OutboundMessage): void {\n const client = this.connectionManager.getByConnectionId(connectionId);\n\n if (client?.role === DevToolsRole.BROWSER) {\n this.sendToSocket(client.socket, message);\n }\n }\n\n sendToMobile(deviceId: string, message: OutboundMessage): void {\n const client = this.connectionManager.getByDeviceId(deviceId);\n\n if (client?.role === DevToolsRole.MOBILE) {\n this.sendToSocket(client.socket, message);\n }\n }\n\n broadcastToBrowsers(message: OutboundMessage): void {\n for (const client of this.connectionManager.getByRole(DevToolsRole.BROWSER)) {\n this.sendToSocket(client.socket, message);\n }\n\n logger.broadcastSent('browsers');\n }\n\n broadcastToMobiles(message: OutboundMessage): void {\n for (const client of this.connectionManager.getByRole(DevToolsRole.MOBILE)) {\n this.sendToSocket(client.socket, message);\n }\n\n logger.broadcastSent('mobiles');\n }\n\n broadcastToAll(message: OutboundMessage): void {\n for (const client of this.connectionManager.getAll()) {\n this.sendToSocket(client.socket, message);\n }\n\n logger.broadcastSent('all');\n }\n\n broadcast(message: unknown, target: 'browsers' | 'mobiles' | 'all' = 'all'): void {\n const broadcastMessage = createMessage<BroadcastMessage>({\n type: MessageType.BROADCAST,\n payload: message,\n });\n\n if (target === 'browsers') {\n this.broadcastToBrowsers(broadcastMessage);\n return;\n }\n\n if (target === 'mobiles') {\n this.broadcastToMobiles(broadcastMessage);\n return;\n }\n\n this.broadcastToAll(broadcastMessage);\n }\n\n broadcastDeviceStatus(): void {\n const message = createMessage<DeviceStatusMessage>({\n type: MessageType.DEVICE_STATUS,\n payload: this.deviceRegistry.snapshot(),\n });\n\n this.broadcastToAll(message);\n }\n}\n","import type { RefreshInitiator, RefreshType } from '../types/protocol';\r\nimport { REFRESH_TIMEOUT_MS } from '../types/protocol';\r\n\r\nexport type PendingRefresh = {\r\n deviceId: string;\r\n refreshType: RefreshType;\r\n startedAt: number;\r\n initiator: RefreshInitiator;\r\n browserConnectionId?: string;\r\n notifyAllBrowsers?: boolean;\r\n};\r\n\r\nexport class PendingRefreshStore {\r\n private readonly pendingByDevice = new Map<string, PendingRefresh>();\r\n\r\n create(input: PendingRefresh): void {\r\n this.pendingByDevice.set(input.deviceId, input);\r\n }\r\n\r\n get(deviceId: string): PendingRefresh | undefined {\r\n return this.pendingByDevice.get(deviceId);\r\n }\r\n\r\n has(deviceId: string): boolean {\r\n return this.pendingByDevice.has(deviceId);\r\n }\r\n\r\n remove(deviceId: string): void {\r\n this.pendingByDevice.delete(deviceId);\r\n }\r\n\r\n getExpired(now = Date.now()): PendingRefresh[] {\r\n return [...this.pendingByDevice.values()].filter(\r\n (pending) => now - pending.startedAt >= REFRESH_TIMEOUT_MS,\r\n );\r\n }\r\n}\r\n","import type { WebSocket } from 'ws';\r\nimport {\r\n createMessage,\r\n DevToolsRole,\r\n MessageType,\r\n type ExportSnapshotErrorMessage,\r\n type ExportSnapshotRequestMessage,\r\n type RefreshErrorCode,\r\n type RefreshErrorMessage,\r\n type RefreshRequestMessage,\r\n type RefreshState,\r\n type RefreshStatusMessage,\r\n type SnapshotReadyMessage,\r\n type SnapshotUploadRequestedMessage,\r\n} from '../types/protocol';\r\nimport { logger } from '../utils/logger';\r\nimport type { ConnectionManager } from './connectionManager';\r\nimport type { MessageRouter } from './messageRouter';\r\nimport type { PendingRefreshStore } from './pendingRefreshStore';\r\nimport type { SnapshotFileStore } from './snapshotFileStore';\r\nimport type { SnapshotStore } from './snapshotStore';\r\n\r\nexport class RefreshCoordinator {\r\n constructor(\r\n private readonly connectionManager: ConnectionManager,\r\n private readonly router: MessageRouter,\r\n private readonly pending: PendingRefreshStore,\r\n private readonly snapshots: SnapshotStore,\r\n private readonly snapshotFiles?: SnapshotFileStore,\r\n ) {}\r\n\r\n handleRefreshRequest(browserSocket: WebSocket, message: RefreshRequestMessage): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER) {\r\n return;\r\n }\r\n\r\n if (message.refreshType !== 'snapshot') {\r\n this.sendRefreshError(browser.connectionId, {\r\n deviceId: message.deviceId,\r\n code: 'INVALID_REQUEST',\r\n message: `Unsupported refresh type: ${message.refreshType}`,\r\n });\r\n return;\r\n }\r\n\r\n const mobile = this.connectionManager.getByDeviceId(message.deviceId);\r\n\r\n if (!mobile) {\r\n this.sendRefreshError(browser.connectionId, {\r\n deviceId: message.deviceId,\r\n code: 'DEVICE_OFFLINE',\r\n message: `Device ${message.deviceId} is not connected`,\r\n });\r\n return;\r\n }\r\n\r\n if (this.pending.has(message.deviceId)) {\r\n this.sendRefreshError(browser.connectionId, {\r\n deviceId: message.deviceId,\r\n code: 'REFRESH_IN_PROGRESS',\r\n message: 'A refresh is already in progress for this device',\r\n });\r\n return;\r\n }\r\n\r\n this.pending.create({\r\n deviceId: message.deviceId,\r\n initiator: 'browser',\r\n browserConnectionId: browser.connectionId,\r\n refreshType: message.refreshType,\r\n startedAt: Date.now(),\r\n });\r\n\r\n logger.refreshStarted(message.deviceId);\r\n\r\n this.sendRefreshStatus(browser.connectionId, message.deviceId, 'requested');\r\n this.sendRefreshStatus(browser.connectionId, message.deviceId, 'exporting');\r\n\r\n this.requestMobileUpload(message.deviceId, message.refreshType);\r\n }\r\n\r\n handleMobileExportRequest(mobileSocket: WebSocket, message: ExportSnapshotRequestMessage): void {\r\n const mobile = this.connectionManager.getBySocket(mobileSocket);\r\n\r\n if (!mobile || mobile.role !== DevToolsRole.MOBILE || !mobile.deviceId) {\r\n return;\r\n }\r\n\r\n if (message.refreshType !== 'snapshot') {\r\n this.sendExportSnapshotError(mobileSocket, {\r\n code: 'INVALID_REQUEST',\r\n message: `Unsupported refresh type: ${message.refreshType}`,\r\n });\r\n return;\r\n }\r\n\r\n if (this.pending.has(mobile.deviceId)) {\r\n this.sendExportSnapshotError(mobileSocket, {\r\n code: 'REFRESH_IN_PROGRESS',\r\n message: 'An export is already in progress for this device',\r\n });\r\n return;\r\n }\r\n\r\n this.pending.create({\r\n deviceId: mobile.deviceId,\r\n initiator: 'mobile',\r\n notifyAllBrowsers: true,\r\n refreshType: message.refreshType,\r\n startedAt: Date.now(),\r\n });\r\n\r\n logger.refreshStarted(mobile.deviceId);\r\n\r\n this.requestMobileUpload(mobile.deviceId, message.refreshType);\r\n }\r\n\r\n async handleSnapshotUpload(\r\n deviceId: string,\r\n body: Buffer,\r\n metadata?: { kind?: string; mimeType?: string; databaseName?: string },\r\n ): Promise<{ ok: true; stored: SnapshotReadyMessage } | { ok: false; code: RefreshErrorCode }> {\r\n const pending = this.pending.get(deviceId);\r\n\r\n if (!pending) {\r\n return { ok: false, code: 'SNAPSHOT_NOT_FOUND' };\r\n }\r\n\r\n if (pending.browserConnectionId) {\r\n this.sendRefreshStatus(pending.browserConnectionId, deviceId, 'uploading');\r\n }\r\n\r\n const stored = this.snapshots.set(deviceId, body, {\r\n kind: metadata?.kind ?? 'sqlite',\r\n mimeType: metadata?.mimeType ?? 'application/x-sqlite3',\r\n databaseName: metadata?.databaseName,\r\n });\r\n\r\n const mobile = this.connectionManager.getByDeviceId(deviceId);\r\n\r\n await this.snapshotFiles?.persistDeviceSnapshot({\r\n deviceId,\r\n bytes: body,\r\n kind: stored.kind,\r\n mimeType: stored.mimeType,\r\n databaseName: stored.databaseName,\r\n bundleId: mobile?.metadata?.bundleId,\r\n });\r\n\r\n logger.refreshUploaded(deviceId, body.byteLength);\r\n\r\n const readyMessage = createMessage<SnapshotReadyMessage>({\r\n type: MessageType.SNAPSHOT_READY,\r\n deviceId,\r\n size: body.byteLength,\r\n exportedAt: stored.exportedAt,\r\n kind: stored.kind,\r\n mimeType: stored.mimeType,\r\n ...(stored.databaseName ? { databaseName: stored.databaseName } : {}),\r\n });\r\n\r\n if (pending.notifyAllBrowsers) {\r\n this.router.broadcastToBrowsers(readyMessage);\r\n } else if (pending.browserConnectionId) {\r\n this.sendRefreshStatus(pending.browserConnectionId, deviceId, 'ready');\r\n this.router.sendToBrowser(pending.browserConnectionId, readyMessage);\r\n }\r\n\r\n this.pending.remove(deviceId);\r\n\r\n return { ok: true, stored: readyMessage };\r\n }\r\n\r\n getSnapshot(deviceId: string): Buffer | undefined {\r\n return this.snapshots.getBytes(deviceId);\r\n }\r\n\r\n async getSnapshotAsync(deviceId: string): Promise<Buffer | undefined> {\r\n if (this.snapshotFiles) {\r\n const fromDisk = await this.snapshotFiles.readDeviceSnapshot(deviceId);\r\n\r\n if (fromDisk) {\r\n return fromDisk;\r\n }\r\n }\r\n\r\n return this.snapshots.getBytes(deviceId);\r\n }\r\n\r\n checkTimeouts(): void {\r\n for (const pending of this.pending.getExpired()) {\r\n if (pending.initiator === 'mobile') {\r\n this.failMobileExport(\r\n pending.deviceId,\r\n 'TIMEOUT',\r\n 'Export timed out waiting for device upload',\r\n );\r\n continue;\r\n }\r\n\r\n if (pending.browserConnectionId) {\r\n this.failRefresh(\r\n pending.deviceId,\r\n pending.browserConnectionId,\r\n 'TIMEOUT',\r\n 'Refresh timed out waiting for device upload',\r\n );\r\n } else {\r\n this.pending.remove(pending.deviceId);\r\n }\r\n }\r\n }\r\n\r\n private requestMobileUpload(deviceId: string, refreshType: 'snapshot'): void {\r\n this.router.sendToMobile(\r\n deviceId,\r\n createMessage<SnapshotUploadRequestedMessage>({\r\n type: MessageType.SNAPSHOT_UPLOAD_REQUESTED,\r\n deviceId,\r\n refreshType,\r\n }),\r\n );\r\n }\r\n\r\n private failRefresh(\r\n deviceId: string,\r\n browserConnectionId: string,\r\n code: RefreshErrorCode,\r\n message: string,\r\n ): void {\r\n logger.refreshFailed(deviceId, code, message);\r\n\r\n this.sendRefreshError(browserConnectionId, {\r\n deviceId,\r\n code,\r\n message,\r\n });\r\n\r\n this.pending.remove(deviceId);\r\n }\r\n\r\n private failMobileExport(\r\n deviceId: string,\r\n code: RefreshErrorCode,\r\n message: string,\r\n ): void {\r\n logger.refreshFailed(deviceId, code, message);\r\n\r\n const mobile = this.connectionManager.getByDeviceId(deviceId);\r\n\r\n if (mobile) {\r\n this.sendExportSnapshotError(mobile.socket, { code, message });\r\n }\r\n\r\n const refreshError = createMessage<RefreshErrorMessage>({\r\n type: MessageType.REFRESH_ERROR,\r\n deviceId,\r\n code,\r\n message,\r\n });\r\n\r\n this.router.broadcastToBrowsers(refreshError);\r\n this.pending.remove(deviceId);\r\n }\r\n\r\n private sendRefreshStatus(\r\n browserConnectionId: string,\r\n deviceId: string,\r\n state: RefreshState,\r\n ): void {\r\n const statusMessage = createMessage<RefreshStatusMessage>({\r\n type: MessageType.REFRESH_STATUS,\r\n deviceId,\r\n state,\r\n });\r\n\r\n this.router.sendToBrowser(browserConnectionId, statusMessage);\r\n }\r\n\r\n private sendRefreshError(\r\n browserConnectionId: string,\r\n input: {\r\n deviceId: string;\r\n code: RefreshErrorCode;\r\n message: string;\r\n },\r\n ): void {\r\n const message = createMessage<RefreshErrorMessage>({\r\n type: MessageType.REFRESH_ERROR,\r\n deviceId: input.deviceId,\r\n code: input.code,\r\n message: input.message,\r\n });\r\n\r\n this.router.sendToBrowser(browserConnectionId, message);\r\n logger.refreshFailed(input.deviceId, input.code, input.message);\r\n }\r\n\r\n private sendExportSnapshotError(\r\n mobileSocket: WebSocket,\r\n input: {\r\n code: RefreshErrorCode;\r\n message: string;\r\n },\r\n ): void {\r\n const message = createMessage<ExportSnapshotErrorMessage>({\r\n type: MessageType.EXPORT_SNAPSHOT_ERROR,\r\n code: input.code,\r\n message: input.message,\r\n });\r\n\r\n this.router.sendToSocket(mobileSocket, message);\r\n }\r\n}\r\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\n\r\nexport const DEFAULT_DATA_DIR = '.devtools';\r\n\r\n/** @deprecated Legacy single-database path. Removed — use per-device exports instead. */\r\nexport const DEFAULT_DATABASE_RELATIVE_PATH = 'databases/active.db';\r\n\r\nexport type ProjectDevToolsConfig = {\r\n /** @deprecated No longer used. */\r\n defaultDatabase?: string;\r\n deviceSync?: {\r\n /** @deprecated Ignored — active.db is no longer written. */\r\n promoteLatestToActive?: boolean;\r\n };\r\n};\r\n\r\nexport type DatabaseManifestEntry = {\r\n id: string;\r\n label: string;\r\n relativePath: string;\r\n source: 'active' | 'device';\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n size: number;\r\n updatedAt: number;\r\n};\r\n\r\nexport type DatabaseManifest = {\r\n version: 1;\r\n /** @deprecated No longer written. */\r\n activeDatabase?: string;\r\n entries: DatabaseManifestEntry[];\r\n};\r\n\r\nexport type PersistDeviceSnapshotInput = {\r\n deviceId: string;\r\n bytes: Buffer;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n bundleId?: string;\r\n};\r\n\r\nexport type PersistDeviceSnapshotResult = {\r\n deviceRelativePath: string;\r\n exportedAt: number;\r\n size: number;\r\n};\r\n\r\nconst DEFAULT_CONFIG: ProjectDevToolsConfig = {\r\n deviceSync: {\r\n promoteLatestToActive: false,\r\n },\r\n};\r\n\r\nexport function resolveDataDir(explicitDir?: string): string {\r\n const fromEnv = process.env.DATABASE_DEVTOOLS_DATA_DIR?.trim();\r\n\r\n if (explicitDir?.trim()) {\r\n return path.resolve(explicitDir.trim());\r\n }\r\n\r\n if (fromEnv) {\r\n return path.resolve(fromEnv);\r\n }\r\n\r\n return path.resolve(process.cwd(), DEFAULT_DATA_DIR);\r\n}\r\n\r\nexport function isPersistenceEnabled(): boolean {\r\n const flag = process.env.DATABASE_DEVTOOLS_SNAPSHOT_PERSIST?.trim().toLowerCase();\r\n\r\n if (flag === '0' || flag === 'false' || flag === 'off') {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function sanitizePathSegment(value: string): string {\r\n return value.replace(/[^a-zA-Z0-9._-]+/g, '_');\r\n}\r\n\r\nexport function resolveProjectPaths(dataDir: string) {\r\n const databasesDir = path.join(dataDir, 'databases');\r\n const devicesDir = path.join(databasesDir, 'devices');\r\n const configPath = path.join(dataDir, 'devtools.json');\r\n const manifestPath = path.join(dataDir, 'manifest.json');\r\n\r\n return {\r\n dataDir,\r\n databasesDir,\r\n devicesDir,\r\n configPath,\r\n manifestPath,\r\n };\r\n}\r\n\r\nexport async function ensureProjectDirectories(dataDir: string): Promise<void> {\r\n const paths = resolveProjectPaths(dataDir);\r\n\r\n await mkdir(paths.devicesDir, { recursive: true });\r\n}\r\n\r\nexport async function loadProjectConfig(dataDir: string): Promise<ProjectDevToolsConfig> {\r\n const { configPath } = resolveProjectPaths(dataDir);\r\n\r\n try {\r\n const raw = await readFile(configPath, 'utf8');\r\n const parsed = JSON.parse(raw) as ProjectDevToolsConfig;\r\n\r\n return {\r\n ...DEFAULT_CONFIG,\r\n ...parsed,\r\n deviceSync: {\r\n promoteLatestToActive: false,\r\n },\r\n };\r\n } catch {\r\n return { ...DEFAULT_CONFIG };\r\n }\r\n}\r\n\r\nexport async function writeDefaultProjectConfig(dataDir: string): Promise<void> {\r\n const { configPath } = resolveProjectPaths(dataDir);\r\n\r\n try {\r\n await readFile(configPath, 'utf8');\r\n } catch {\r\n await mkdir(dataDir, { recursive: true });\r\n await writeFile(configPath, `${JSON.stringify(DEFAULT_CONFIG, null, 2)}\\n`, 'utf8');\r\n }\r\n}\r\n\r\nexport function resolveActiveDatabasePath(dataDir: string, config: ProjectDevToolsConfig): string {\r\n const relative = config.defaultDatabase ?? DEFAULT_DATABASE_RELATIVE_PATH;\r\n return path.join(dataDir, relative);\r\n}\r\n\r\nexport function deviceDatabaseFileName(deviceId: string): string {\r\n return `Database-${sanitizePathSegment(deviceId)}.db`;\r\n}\r\n\r\nexport const DEVICE_EXPORT_FILE_NAME = 'database.db';\r\n\r\nexport function resolveDeviceStorageKey(input: { bundleId?: string; deviceId: string }): string {\r\n const bundleId = input.bundleId?.trim();\r\n\r\n if (bundleId) {\r\n return sanitizePathSegment(bundleId);\r\n }\r\n\r\n return sanitizePathSegment(input.deviceId);\r\n}\r\n\r\nexport function deviceStorageManifestId(storageKey: string): string {\r\n return `device:${storageKey}`;\r\n}\r\n\r\nexport function deviceStorageRelativePath(storageKey: string): string {\r\n return path\r\n .join('databases', 'devices', storageKey, DEVICE_EXPORT_FILE_NAME)\r\n .replace(/\\\\/g, '/');\r\n}\r\n\r\nexport function deviceDatabaseRelativePath(deviceId: string): string {\r\n const segment = sanitizePathSegment(deviceId);\r\n return path\r\n .join('databases', 'devices', segment, deviceDatabaseFileName(deviceId))\r\n .replace(/\\\\/g, '/');\r\n}\r\n\r\n/** @deprecated Legacy path — migrated reads still check this location. */\r\nexport function deviceLatestRelativePath(deviceId: string): string {\r\n return path.join('databases', 'devices', sanitizePathSegment(deviceId), 'latest.db').replace(/\\\\/g, '/');\r\n}\r\n\r\nexport async function readManifest(dataDir: string): Promise<DatabaseManifest> {\r\n const { manifestPath } = resolveProjectPaths(dataDir);\r\n\r\n try {\r\n const raw = await readFile(manifestPath, 'utf8');\r\n const parsed = JSON.parse(raw) as DatabaseManifest;\r\n\r\n if (parsed.version !== 1 || !Array.isArray(parsed.entries)) {\r\n return { version: 1, entries: [] };\r\n }\r\n\r\n return parsed;\r\n } catch {\r\n return { version: 1, entries: [] };\r\n }\r\n}\r\n\r\nexport async function writeManifest(dataDir: string, manifest: DatabaseManifest): Promise<void> {\r\n const { manifestPath } = resolveProjectPaths(dataDir);\r\n\r\n await mkdir(dataDir, { recursive: true });\r\n await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function upsertManifestEntry(\r\n manifest: DatabaseManifest,\r\n entry: DatabaseManifestEntry,\r\n): DatabaseManifest {\r\n const entries = manifest.entries.filter((item) => item.id !== entry.id);\r\n entries.push(entry);\r\n\r\n entries.sort((left, right) => right.updatedAt - left.updatedAt);\r\n\r\n return {\r\n version: manifest.version,\r\n entries,\r\n };\r\n}\r\n","import type { DatabaseManifestEntry } from './projectData';\r\nimport { deviceStorageManifestId, sanitizePathSegment } from './projectData';\r\n\r\nexport type ListedDeviceExportLike = {\r\n id: string;\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n databaseName?: string;\r\n updatedAt: number;\r\n};\r\n\r\nexport function deriveStorageKeyFromEntry(entry: DatabaseManifestEntry): string {\r\n if (entry.storageKey) {\r\n return entry.storageKey;\r\n }\r\n\r\n if (entry.bundleId) {\r\n return sanitizePathSegment(entry.bundleId);\r\n }\r\n\r\n const match = entry.relativePath.match(/databases\\/devices\\/([^/]+)\\//);\r\n\r\n if (match?.[1]) {\r\n return match[1];\r\n }\r\n\r\n if (entry.deviceId) {\r\n return sanitizePathSegment(entry.deviceId);\r\n }\r\n\r\n return entry.id;\r\n}\r\n\r\nexport function findManifestEntryByDeviceId(\r\n entries: DatabaseManifestEntry[],\r\n deviceId: string,\r\n): DatabaseManifestEntry | undefined {\r\n return entries.find((entry) => entry.source === 'device' && entry.deviceId === deviceId);\r\n}\r\n\r\nexport type PruneDeviceExportsInput = {\r\n keepStorageKey: string;\r\n keepDeviceId: string;\r\n bundleId?: string;\r\n databaseName?: string;\r\n};\r\n\r\nexport function selectDeviceExportEntriesToPrune(\r\n entries: DatabaseManifestEntry[],\r\n keep: PruneDeviceExportsInput,\r\n): DatabaseManifestEntry[] {\r\n const keepManifestId = deviceStorageManifestId(keep.keepStorageKey);\r\n\r\n return entries.filter((entry) => {\r\n if (entry.source !== 'device') {\r\n return false;\r\n }\r\n\r\n if (entry.id === keepManifestId) {\r\n return false;\r\n }\r\n\r\n const entryStorageKey = deriveStorageKeyFromEntry(entry);\r\n\r\n if (entryStorageKey === keep.keepStorageKey) {\r\n return true;\r\n }\r\n\r\n if (keep.bundleId && entry.bundleId === keep.bundleId) {\r\n return true;\r\n }\r\n\r\n if (\r\n keep.bundleId &&\r\n keep.databaseName &&\r\n !entry.bundleId &&\r\n entry.databaseName === keep.databaseName\r\n ) {\r\n return true;\r\n }\r\n\r\n if (\r\n !keep.bundleId &&\r\n keep.databaseName &&\r\n entry.databaseName === keep.databaseName &&\r\n entry.deviceId !== keep.keepDeviceId\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n}\r\n\r\nexport function dedupeListedDeviceExports<T extends ListedDeviceExportLike>(entries: T[]): T[] {\r\n const byStorageKey = new Map<string, T>();\r\n\r\n for (const entry of entries) {\r\n const storageKey = entry.storageKey\r\n ? entry.storageKey\r\n : entry.bundleId\r\n ? sanitizePathSegment(entry.bundleId)\r\n : entry.deviceId\r\n ? sanitizePathSegment(entry.deviceId)\r\n : entry.id;\r\n\r\n const existing = byStorageKey.get(storageKey);\r\n\r\n if (!existing || entry.updatedAt > existing.updatedAt) {\r\n byStorageKey.set(storageKey, entry);\r\n }\r\n }\r\n\r\n return [...byStorageKey.values()].sort((left, right) => right.updatedAt - left.updatedAt);\r\n}\r\n\r\nexport type ReconcileLegacyExportsInput = {\r\n entries: DatabaseManifestEntry[];\r\n preferredDeviceId?: string;\r\n};\r\n\r\nexport function reconcileLegacyManifestEntries(\r\n input: ReconcileLegacyExportsInput,\r\n): DatabaseManifestEntry[] {\r\n const deviceEntries = input.entries.filter((entry) => entry.source === 'device');\r\n const otherEntries = input.entries.filter((entry) => entry.source !== 'device');\r\n const groups = new Map<string, DatabaseManifestEntry[]>();\r\n\r\n for (const entry of deviceEntries) {\r\n const groupKey = entry.bundleId\r\n ? `bundle:${entry.bundleId}`\r\n : entry.databaseName\r\n ? `db:${entry.databaseName}`\r\n : `device:${deriveStorageKeyFromEntry(entry)}`;\r\n\r\n const group = groups.get(groupKey) ?? [];\r\n group.push(entry);\r\n groups.set(groupKey, group);\r\n }\r\n\r\n const keptDeviceEntries: DatabaseManifestEntry[] = [];\r\n\r\n for (const group of groups.values()) {\r\n if (group.length === 1) {\r\n keptDeviceEntries.push(group[0]!);\r\n continue;\r\n }\r\n\r\n const preferred = input.preferredDeviceId\r\n ? group.find((entry) => entry.deviceId === input.preferredDeviceId)\r\n : undefined;\r\n\r\n const newest = [...group].sort((left, right) => right.updatedAt - left.updatedAt)[0]!;\r\n keptDeviceEntries.push(preferred ?? newest);\r\n }\r\n\r\n return [...otherEntries, ...keptDeviceEntries].sort((left, right) => right.updatedAt - left.updatedAt);\r\n}\r\n\r\nexport function removedManifestEntries(\r\n before: DatabaseManifestEntry[],\r\n after: DatabaseManifestEntry[],\r\n): DatabaseManifestEntry[] {\r\n const afterIds = new Set(after.map((entry) => entry.id));\r\n return before.filter((entry) => !afterIds.has(entry.id));\r\n}\r\n","import { readFile, rm, stat, writeFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport {\r\n DEFAULT_DATABASE_RELATIVE_PATH,\r\n readManifest,\r\n resolveProjectPaths,\r\n writeManifest,\r\n type DatabaseManifest,\r\n type ProjectDevToolsConfig,\r\n} from './projectData';\r\n\r\nconst NORMALIZED_CONFIG: ProjectDevToolsConfig = {\r\n deviceSync: {\r\n promoteLatestToActive: false,\r\n },\r\n};\r\n\r\nexport function stripLegacyActiveManifest(manifest: DatabaseManifest): DatabaseManifest {\r\n const entries = manifest.entries.filter(\r\n (entry) =>\r\n entry.source !== 'active' &&\r\n entry.id !== 'active' &&\r\n !entry.id.startsWith('import:'),\r\n );\r\n\r\n return {\r\n version: 1,\r\n entries,\r\n };\r\n}\r\n\r\nexport function normalizeProjectConfig(config: ProjectDevToolsConfig): ProjectDevToolsConfig {\r\n return {\r\n ...NORMALIZED_CONFIG,\r\n deviceSync: {\r\n ...NORMALIZED_CONFIG.deviceSync,\r\n promoteLatestToActive: false,\r\n },\r\n };\r\n}\r\n\r\nexport async function migrateLegacyActiveDatabase(dataDir: string): Promise<boolean> {\r\n const { configPath } = resolveProjectPaths(dataDir);\r\n const manifest = await readManifest(dataDir);\r\n const stripped = stripLegacyActiveManifest(manifest);\r\n const activeDbPath = path.join(dataDir, DEFAULT_DATABASE_RELATIVE_PATH);\r\n\r\n let changed =\r\n stripped.entries.length !== manifest.entries.length || Boolean(manifest.activeDatabase);\r\n\r\n if (changed) {\r\n await writeManifest(dataDir, stripped);\r\n }\r\n\r\n try {\r\n await stat(activeDbPath);\r\n const hasDeviceExports = stripped.entries.some((entry) => entry.source === 'device');\r\n\r\n if (hasDeviceExports || manifest.entries.some((entry) => entry.source === 'active')) {\r\n await rm(activeDbPath, { force: true });\r\n changed = true;\r\n }\r\n } catch {\r\n // active.db not present\r\n }\r\n\r\n try {\r\n const raw = await readFile(configPath, 'utf8');\r\n const parsed = JSON.parse(raw) as ProjectDevToolsConfig;\r\n\r\n if (parsed.defaultDatabase || parsed.deviceSync?.promoteLatestToActive) {\r\n await writeFile(\r\n configPath,\r\n `${JSON.stringify(normalizeProjectConfig(parsed), null, 2)}\\n`,\r\n 'utf8',\r\n );\r\n changed = true;\r\n }\r\n } catch {\r\n // config will be created on next export\r\n }\r\n\r\n const importsDir = path.join(dataDir, 'databases', 'imports');\r\n\r\n try {\r\n await stat(importsDir);\r\n await rm(importsDir, { recursive: true, force: true });\r\n changed = true;\r\n } catch {\r\n // imports directory not present\r\n }\r\n\r\n return changed;\r\n}\r\n","import { mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { SQLITE_SNAPSHOT_MIME_TYPE } from '../types/snapshot';\r\nimport {\r\n dedupeListedDeviceExports,\r\n findManifestEntryByDeviceId,\r\n reconcileLegacyManifestEntries,\r\n removedManifestEntries,\r\n selectDeviceExportEntriesToPrune,\r\n} from './deviceExportStorage';\r\nimport { migrateLegacyActiveDatabase } from './migrateLegacyActiveDb';\r\nimport {\r\n deviceDatabaseRelativePath,\r\n deviceLatestRelativePath,\r\n deviceStorageManifestId,\r\n deviceStorageRelativePath,\r\n ensureProjectDirectories,\r\n isPersistenceEnabled,\r\n readManifest,\r\n resolveDataDir,\r\n resolveDeviceStorageKey,\r\n resolveProjectPaths,\r\n sanitizePathSegment,\r\n upsertManifestEntry,\r\n writeDefaultProjectConfig,\r\n writeManifest,\r\n type DatabaseManifestEntry,\r\n type PersistDeviceSnapshotInput,\r\n type PersistDeviceSnapshotResult,\r\n} from './projectData';\r\n\r\nexport type ProjectDatabaseMeta = {\r\n exists: boolean;\r\n relativePath?: string;\r\n absolutePath?: string;\r\n kind?: string;\r\n mimeType?: string;\r\n databaseName?: string;\r\n size?: number;\r\n updatedAt?: number;\r\n source?: DatabaseManifestEntry['source'];\r\n deviceId?: string;\r\n};\r\n\r\nexport type ListedProjectDatabase = {\r\n id: string;\r\n label: string;\r\n relativePath: string;\r\n source: DatabaseManifestEntry['source'];\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n databaseName?: string;\r\n size: number;\r\n updatedAt: number;\r\n};\r\n\r\nexport class SnapshotFileStore {\r\n private readonly dataDir: string;\r\n private readonly enabled: boolean;\r\n\r\n constructor(options?: { dataDir?: string; enabled?: boolean }) {\r\n this.dataDir = resolveDataDir(options?.dataDir);\r\n this.enabled = options?.enabled ?? isPersistenceEnabled();\r\n }\r\n\r\n getDataDir(): string {\r\n return this.dataDir;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n async persistDeviceSnapshot(\r\n input: PersistDeviceSnapshotInput,\r\n ): Promise<PersistDeviceSnapshotResult | null> {\r\n if (!this.enabled) {\r\n return null;\r\n }\r\n\r\n await writeDefaultProjectConfig(this.dataDir);\r\n await ensureProjectDirectories(this.dataDir);\r\n\r\n const storageKey = resolveDeviceStorageKey({\r\n bundleId: input.bundleId,\r\n deviceId: input.deviceId,\r\n });\r\n const deviceRelativePath = deviceStorageRelativePath(storageKey);\r\n const deviceAbsolutePath = path.join(this.dataDir, deviceRelativePath);\r\n const exportedAt = Date.now();\r\n\r\n await this.pruneDeviceExports({\r\n keepStorageKey: storageKey,\r\n keepDeviceId: input.deviceId,\r\n bundleId: input.bundleId,\r\n databaseName: input.databaseName,\r\n });\r\n\r\n await mkdir(path.dirname(deviceAbsolutePath), { recursive: true });\r\n await writeFile(deviceAbsolutePath, input.bytes);\r\n\r\n const manifest = await readManifest(this.dataDir);\r\n\r\n const deviceEntry: DatabaseManifestEntry = {\r\n id: deviceStorageManifestId(storageKey),\r\n label: input.databaseName ?? `Device ${input.deviceId}`,\r\n relativePath: deviceRelativePath.replace(/\\\\/g, '/'),\r\n source: 'device',\r\n deviceId: input.deviceId,\r\n bundleId: input.bundleId,\r\n storageKey,\r\n kind: input.kind,\r\n mimeType: input.mimeType,\r\n databaseName: input.databaseName,\r\n size: input.bytes.byteLength,\r\n updatedAt: exportedAt,\r\n };\r\n\r\n const nextManifest = upsertManifestEntry(manifest, deviceEntry);\r\n\r\n await writeManifest(this.dataDir, nextManifest);\r\n\r\n return {\r\n deviceRelativePath: deviceRelativePath.replace(/\\\\/g, '/'),\r\n exportedAt,\r\n size: input.bytes.byteLength,\r\n };\r\n }\r\n\r\n async reconcileOnMobileConnect(input: {\r\n deviceId: string;\r\n bundleId?: string;\r\n }): Promise<void> {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n await this.reconcileLegacyExports(input.deviceId);\r\n\r\n const storageKey = resolveDeviceStorageKey({\r\n bundleId: input.bundleId,\r\n deviceId: input.deviceId,\r\n });\r\n const manifest = await readManifest(this.dataDir);\r\n const canonicalEntry = manifest.entries.find(\r\n (entry) => entry.source === 'device' && entry.storageKey === storageKey,\r\n );\r\n\r\n if (canonicalEntry && canonicalEntry.deviceId !== input.deviceId) {\r\n const updated = upsertManifestEntry(manifest, {\r\n ...canonicalEntry,\r\n deviceId: input.deviceId,\r\n bundleId: input.bundleId ?? canonicalEntry.bundleId,\r\n updatedAt: Date.now(),\r\n });\r\n\r\n await writeManifest(this.dataDir, updated);\r\n }\r\n\r\n await this.pruneDeviceExports({\r\n keepStorageKey: storageKey,\r\n keepDeviceId: input.deviceId,\r\n bundleId: input.bundleId,\r\n databaseName: canonicalEntry?.databaseName,\r\n });\r\n }\r\n\r\n async readDeviceSnapshot(deviceId: string): Promise<Buffer | undefined> {\r\n return this.readDeviceDatabase(deviceId);\r\n }\r\n\r\n async readDeviceDatabase(deviceId: string): Promise<Buffer | undefined> {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n\r\n const resolved = await this.resolveDeviceDatabaseFile(deviceId);\r\n\r\n if (!resolved) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return await readFile(resolved.absolutePath);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n async getDeviceDatabaseMeta(deviceId: string): Promise<ProjectDatabaseMeta> {\r\n if (!this.enabled) {\r\n return { exists: false, deviceId };\r\n }\r\n\r\n const resolved = await this.resolveDeviceDatabaseFile(deviceId);\r\n\r\n if (!resolved) {\r\n return { exists: false, deviceId };\r\n }\r\n\r\n try {\r\n const fileStat = await stat(resolved.absolutePath);\r\n const manifest = await readManifest(this.dataDir);\r\n const entry = manifest.entries.find(\r\n (item) => item.deviceId === deviceId && item.source === 'device',\r\n );\r\n\r\n return {\r\n exists: true,\r\n relativePath: resolved.relativePath,\r\n absolutePath: resolved.absolutePath,\r\n kind: entry?.kind ?? 'sqlite',\r\n mimeType: entry?.mimeType ?? SQLITE_SNAPSHOT_MIME_TYPE,\r\n databaseName: entry?.databaseName ?? path.basename(resolved.absolutePath),\r\n size: fileStat.size,\r\n updatedAt: entry?.updatedAt ?? fileStat.mtimeMs,\r\n source: 'device',\r\n deviceId,\r\n };\r\n } catch {\r\n return { exists: false, deviceId, relativePath: resolved.relativePath };\r\n }\r\n }\r\n\r\n async listDeviceExports(): Promise<ListedProjectDatabase[]> {\r\n await this.reconcileLegacyExports();\r\n const databases = await this.listDatabases();\r\n const deviceExports = databases.filter((entry) => entry.source === 'device' && entry.deviceId);\r\n return dedupeListedDeviceExports(deviceExports);\r\n }\r\n\r\n private async reconcileLegacyExports(preferredDeviceId?: string): Promise<void> {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n await migrateLegacyActiveDatabase(this.dataDir);\r\n\r\n const manifest = await readManifest(this.dataDir);\r\n const nextEntries = reconcileLegacyManifestEntries({\r\n entries: manifest.entries,\r\n preferredDeviceId,\r\n });\r\n\r\n if (nextEntries.length === manifest.entries.length) {\r\n const sameOrder = nextEntries.every((entry, index) => entry.id === manifest.entries[index]?.id);\r\n\r\n if (sameOrder) {\r\n return;\r\n }\r\n }\r\n\r\n const removed = removedManifestEntries(manifest.entries, nextEntries);\r\n\r\n for (const entry of removed) {\r\n await this.deleteEntryFiles(entry);\r\n }\r\n\r\n await writeManifest(this.dataDir, {\r\n ...manifest,\r\n entries: nextEntries,\r\n });\r\n }\r\n\r\n private async pruneDeviceExports(input: {\r\n keepStorageKey: string;\r\n keepDeviceId: string;\r\n bundleId?: string;\r\n databaseName?: string;\r\n }): Promise<void> {\r\n const manifest = await readManifest(this.dataDir);\r\n const removed = selectDeviceExportEntriesToPrune(manifest.entries, input);\r\n\r\n if (removed.length === 0) {\r\n return;\r\n }\r\n\r\n for (const entry of removed) {\r\n await this.deleteEntryFiles(entry);\r\n }\r\n\r\n const removedIds = new Set(removed.map((entry) => entry.id));\r\n\r\n await writeManifest(this.dataDir, {\r\n ...manifest,\r\n entries: manifest.entries.filter((entry) => !removedIds.has(entry.id)),\r\n });\r\n }\r\n\r\n private async deleteEntryFiles(entry: DatabaseManifestEntry): Promise<void> {\r\n const absolutePath = path.join(this.dataDir, entry.relativePath);\r\n\r\n try {\r\n await rm(absolutePath, { force: true });\r\n } catch {\r\n // ignore missing files\r\n }\r\n\r\n try {\r\n await rm(path.dirname(absolutePath), { recursive: true, force: true });\r\n } catch {\r\n // ignore cleanup failures\r\n }\r\n }\r\n\r\n private manifestEntryToListed(entry: DatabaseManifestEntry, fileStat: { size: number }): ListedProjectDatabase {\r\n return {\r\n id: entry.id,\r\n label: entry.label,\r\n relativePath: entry.relativePath,\r\n source: entry.source,\r\n deviceId: entry.deviceId,\r\n bundleId: entry.bundleId,\r\n storageKey: entry.storageKey,\r\n databaseName: entry.databaseName,\r\n size: fileStat.size,\r\n updatedAt: entry.updatedAt,\r\n };\r\n }\r\n\r\n private async resolveDeviceDatabaseFile(\r\n deviceId: string,\r\n ): Promise<{ relativePath: string; absolutePath: string } | undefined> {\r\n const manifest = await readManifest(this.dataDir);\r\n const manifestEntry = findManifestEntryByDeviceId(manifest.entries, deviceId);\r\n\r\n if (manifestEntry) {\r\n const absolutePath = path.join(this.dataDir, manifestEntry.relativePath);\r\n\r\n try {\r\n await stat(absolutePath);\r\n return { relativePath: manifestEntry.relativePath, absolutePath };\r\n } catch {\r\n // fall through to legacy paths\r\n }\r\n }\r\n\r\n const candidates = [\r\n deviceDatabaseRelativePath(deviceId),\r\n deviceLatestRelativePath(deviceId),\r\n ];\r\n\r\n for (const relativePath of candidates) {\r\n const absolutePath = path.join(this.dataDir, relativePath);\r\n\r\n try {\r\n await stat(absolutePath);\r\n return { relativePath, absolutePath };\r\n } catch {\r\n // try next candidate\r\n }\r\n }\r\n\r\n if (!manifestEntry) {\r\n return undefined;\r\n }\r\n\r\n const absolutePath = path.join(this.dataDir, manifestEntry.relativePath);\r\n\r\n try {\r\n await stat(absolutePath);\r\n return { relativePath: manifestEntry.relativePath, absolutePath };\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n /** @deprecated Proxies to the newest device export for backward-compatible API callers. */\r\n async readActiveDatabase(): Promise<Buffer | undefined> {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n\r\n const meta = await this.getActiveDatabaseMeta();\r\n\r\n if (!meta.exists || !meta.deviceId) {\r\n return undefined;\r\n }\r\n\r\n return this.readDeviceDatabase(meta.deviceId);\r\n }\r\n\r\n /** @deprecated Proxies to the newest device export for backward-compatible API callers. */\r\n async getActiveDatabaseMeta(): Promise<ProjectDatabaseMeta> {\r\n if (!this.enabled) {\r\n return { exists: false };\r\n }\r\n\r\n await migrateLegacyActiveDatabase(this.dataDir);\r\n\r\n const exports = await this.listDeviceExports();\r\n const latest = exports[0];\r\n\r\n if (!latest?.deviceId) {\r\n return { exists: false };\r\n }\r\n\r\n return this.getDeviceDatabaseMeta(latest.deviceId);\r\n }\r\n\r\n async listDatabases(): Promise<ListedProjectDatabase[]> {\r\n if (!this.enabled) {\r\n return [];\r\n }\r\n\r\n await ensureProjectDirectories(this.dataDir);\r\n await this.reconcileLegacyExports();\r\n\r\n const manifest = await readManifest(this.dataDir);\r\n const listed = new Map<string, ListedProjectDatabase>();\r\n\r\n for (const entry of manifest.entries) {\r\n if (entry.source === 'active' || entry.id.startsWith('import:')) {\r\n continue;\r\n }\r\n\r\n const absolutePath = path.join(this.dataDir, entry.relativePath);\r\n\r\n try {\r\n const fileStat = await stat(absolutePath);\r\n\r\n listed.set(entry.id, this.manifestEntryToListed(entry, fileStat));\r\n } catch {\r\n // Ignore missing files from manifest.\r\n }\r\n }\r\n\r\n return [...listed.values()].sort((left, right) => right.updatedAt - left.updatedAt);\r\n }\r\n\r\n async readDatabaseByRelativePath(relativePath: string): Promise<Buffer | undefined> {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n\r\n const normalized = relativePath.replace(/\\\\/g, '/');\r\n const absolutePath = path.resolve(this.dataDir, normalized);\r\n const dataDirResolved = path.resolve(this.dataDir);\r\n\r\n if (!absolutePath.startsWith(dataDirResolved)) {\r\n return undefined;\r\n }\r\n\r\n if (!normalized.toLowerCase().endsWith('.db')) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return await readFile(absolutePath);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n getDeviceDirectoryName(deviceId: string): string {\r\n return sanitizePathSegment(deviceId);\r\n }\r\n}\r\n","export type StoredSnapshot = {\r\n deviceId: string;\r\n bytes: Buffer;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n exportedAt: number;\r\n};\r\n\r\nexport class SnapshotStore {\r\n private readonly snapshots = new Map<string, StoredSnapshot>();\r\n\r\n set(\r\n deviceId: string,\r\n bytes: Buffer,\r\n metadata: { kind: string; mimeType: string; databaseName?: string },\r\n ): StoredSnapshot {\r\n const stored: StoredSnapshot = {\r\n deviceId,\r\n bytes,\r\n kind: metadata.kind,\r\n mimeType: metadata.mimeType,\r\n databaseName: metadata.databaseName,\r\n exportedAt: Date.now(),\r\n };\r\n\r\n this.snapshots.set(deviceId, stored);\r\n return stored;\r\n }\r\n\r\n get(deviceId: string): StoredSnapshot | undefined {\r\n return this.snapshots.get(deviceId);\r\n }\r\n\r\n getBytes(deviceId: string): Buffer | undefined {\r\n return this.snapshots.get(deviceId)?.bytes;\r\n }\r\n}\r\n","import type { WebSocket } from 'ws';\r\nimport {\r\n createMessage,\r\n DevToolsRole,\r\n MessageType,\r\n type BeginTransactionMessage,\r\n type BeginTransactionRequestMessage,\r\n type CommitTransactionMessage,\r\n type CommitTransactionRequestMessage,\r\n type ExecuteWriteMessage,\r\n type RollbackTransactionMessage,\r\n type RollbackTransactionRequestMessage,\r\n type TransactionAckMessage,\r\n type TransactionStatusMessage,\r\n type WriteAckMessage,\r\n type WriteErrorCode,\r\n type WriteErrorMessage,\r\n type WriteRequestMessage,\r\n type WriteResultMessage,\r\n} from '../types/protocol';\r\nimport { logger } from '../utils/logger';\r\nimport type { ConnectionManager } from './connectionManager';\r\nimport type { MessageRouter } from './messageRouter';\r\nimport type { WriteSessionManager, WriteSession } from './writeSessionManager';\r\n\r\nexport class WriteCoordinator {\r\n constructor(\r\n private readonly connectionManager: ConnectionManager,\r\n private readonly router: MessageRouter,\r\n private readonly sessions: WriteSessionManager,\r\n ) {}\r\n\r\n handleBeginTransactionRequest(\r\n browserSocket: WebSocket,\r\n message: BeginTransactionRequestMessage,\r\n ): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER) {\r\n return;\r\n }\r\n\r\n const mobile = this.connectionManager.getByDeviceId(message.deviceId);\r\n\r\n if (!mobile) {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'DEVICE_OFFLINE',\r\n message: `Device ${message.deviceId} is not connected`,\r\n });\r\n return;\r\n }\r\n\r\n if (this.sessions.getActiveForDevice(message.deviceId)) {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'TRANSACTION_BUSY',\r\n message: 'A transaction is already open for this device',\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.create({\r\n transactionId: message.transactionId,\r\n deviceId: message.deviceId,\r\n browserConnectionId: browser.connectionId,\r\n });\r\n\r\n logger.syncStarted(message.transactionId, message.deviceId);\r\n\r\n this.router.sendToMobile(\r\n message.deviceId,\r\n createMessage<BeginTransactionMessage>({\r\n type: MessageType.BEGIN_TRANSACTION,\r\n transactionId: message.transactionId,\r\n }),\r\n );\r\n }\r\n\r\n handleCommitTransactionRequest(\r\n browserSocket: WebSocket,\r\n message: CommitTransactionRequestMessage,\r\n ): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER || !session) {\r\n return;\r\n }\r\n\r\n if (session.browserConnectionId !== browser.connectionId) {\r\n return;\r\n }\r\n\r\n if (session.state !== 'open') {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'NO_TRANSACTION',\r\n message: 'Transaction is not open',\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.setState(message.transactionId, 'committing');\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<CommitTransactionMessage>({\r\n type: MessageType.COMMIT_TRANSACTION,\r\n transactionId: message.transactionId,\r\n }),\r\n );\r\n }\r\n\r\n handleRollbackTransactionRequest(\r\n browserSocket: WebSocket,\r\n message: RollbackTransactionRequestMessage,\r\n ): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER || !session) {\r\n return;\r\n }\r\n\r\n if (session.browserConnectionId !== browser.connectionId) {\r\n return;\r\n }\r\n\r\n if (session.state !== 'open' && session.state !== 'committing') {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'NO_TRANSACTION',\r\n message: 'Transaction is not open',\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.setState(message.transactionId, 'rolling_back');\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<RollbackTransactionMessage>({\r\n type: MessageType.ROLLBACK_TRANSACTION,\r\n transactionId: message.transactionId,\r\n }),\r\n );\r\n }\r\n\r\n handleWriteRequest(browserSocket: WebSocket, message: WriteRequestMessage): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER || !session) {\r\n return;\r\n }\r\n\r\n if (session.browserConnectionId !== browser.connectionId) {\r\n return;\r\n }\r\n\r\n if (session.state !== 'open') {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n writeId: message.writeId,\r\n code: 'NO_TRANSACTION',\r\n message: 'Transaction is not open',\r\n });\r\n return;\r\n }\r\n\r\n const mobile = this.connectionManager.getByDeviceId(session.deviceId);\r\n\r\n if (!mobile) {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n writeId: message.writeId,\r\n code: 'DEVICE_OFFLINE',\r\n message: `Device ${session.deviceId} is not connected`,\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.incrementPendingWrites(message.transactionId);\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<ExecuteWriteMessage>({\r\n type: MessageType.EXECUTE_WRITE,\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n operation: message.operation,\r\n }),\r\n );\r\n }\r\n\r\n handleTransactionAck(message: TransactionAckMessage): void {\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!session) {\r\n return;\r\n }\r\n\r\n if (!message.ok) {\r\n this.sessions.setState(message.transactionId, 'failed');\r\n this.sendWriteError(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n code: message.action === 'begin' ? 'ADAPTER_ERROR' : 'WRITE_FAILED',\r\n message: message.message ?? `Transaction ${message.action} failed`,\r\n });\r\n this.sessions.remove(message.transactionId);\r\n return;\r\n }\r\n\r\n if (message.action === 'begin') {\r\n this.sendTransactionStatus(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n deviceId: session.deviceId,\r\n state: 'open',\r\n });\r\n return;\r\n }\r\n\r\n if (message.action === 'commit') {\r\n this.sendTransactionStatus(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n deviceId: session.deviceId,\r\n state: 'idle',\r\n });\r\n this.sessions.remove(message.transactionId);\r\n return;\r\n }\r\n\r\n this.sendTransactionStatus(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n deviceId: session.deviceId,\r\n state: 'idle',\r\n message: message.message,\r\n });\r\n this.sessions.remove(message.transactionId);\r\n }\r\n\r\n handleWriteAck(message: WriteAckMessage): void {\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!session) {\r\n return;\r\n }\r\n\r\n this.sessions.decrementPendingWrites(message.transactionId);\r\n\r\n if (!message.ok) {\r\n this.sendWriteError(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n writeId: message.writeId,\r\n code: 'WRITE_FAILED',\r\n message: message.message ?? 'Write operation failed',\r\n });\r\n return;\r\n }\r\n\r\n this.router.sendToBrowser(\r\n session.browserConnectionId,\r\n createMessage<WriteResultMessage>({\r\n type: MessageType.WRITE_RESULT,\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n rowsAffected: message.rowsAffected ?? 0,\r\n }),\r\n );\r\n }\r\n\r\n checkTimeouts(): void {\r\n for (const session of this.sessions.getExpired()) {\r\n this.rollbackSession(session, 'TIMEOUT', 'Write transaction timed out');\r\n }\r\n }\r\n\r\n rollbackSessionsOnBrowserDisconnect(browserConnectionId: string): void {\r\n for (const session of this.sessions.getByBrowserConnectionId(browserConnectionId)) {\r\n this.rollbackSession(session, 'NO_TRANSACTION', 'Browser disconnected');\r\n }\r\n }\r\n\r\n rollbackSessionsForDevice(deviceId: string): void {\r\n for (const session of this.sessions.getByDeviceId(deviceId)) {\r\n this.rollbackSession(session, 'NO_TRANSACTION', 'Device disconnected');\r\n }\r\n }\r\n\r\n private rollbackSession(\r\n session: WriteSession,\r\n code: WriteErrorCode,\r\n message: string,\r\n ): void {\r\n logger.syncFailed(session.transactionId, code, message);\r\n\r\n this.sendWriteError(session.browserConnectionId, {\r\n transactionId: session.transactionId,\r\n code,\r\n message,\r\n });\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<RollbackTransactionMessage>({\r\n type: MessageType.ROLLBACK_TRANSACTION,\r\n transactionId: session.transactionId,\r\n }),\r\n );\r\n\r\n this.sessions.remove(session.transactionId);\r\n }\r\n\r\n private sendTransactionStatus(\r\n browserConnectionId: string,\r\n payload: Omit<TransactionStatusMessage, 'type' | 'timestamp'>,\r\n ): void {\r\n this.router.sendToBrowser(\r\n browserConnectionId,\r\n createMessage<TransactionStatusMessage>({\r\n type: MessageType.TRANSACTION_STATUS,\r\n ...payload,\r\n }),\r\n );\r\n }\r\n\r\n private sendWriteError(\r\n browserConnectionId: string,\r\n payload: {\r\n transactionId: string;\r\n writeId?: string;\r\n code: WriteErrorCode;\r\n message: string;\r\n },\r\n ): void {\r\n this.router.sendToBrowser(\r\n browserConnectionId,\r\n createMessage<WriteErrorMessage>({\r\n type: MessageType.WRITE_ERROR,\r\n ...payload,\r\n }),\r\n );\r\n }\r\n}\r\n","import type { TransactionStatusState } from '../types/protocol';\r\nimport { WRITE_TRANSACTION_TIMEOUT_MS } from '../types/protocol';\r\n\r\nexport type WriteSession = {\r\n transactionId: string;\r\n deviceId: string;\r\n browserConnectionId: string;\r\n state: TransactionStatusState;\r\n pendingWrites: number;\r\n createdAt: number;\r\n};\r\n\r\nexport class WriteSessionManager {\r\n private readonly sessions = new Map<string, WriteSession>();\r\n private readonly activeByDevice = new Map<string, string>();\r\n\r\n create(input: {\r\n transactionId: string;\r\n deviceId: string;\r\n browserConnectionId: string;\r\n }): WriteSession {\r\n const session: WriteSession = {\r\n transactionId: input.transactionId,\r\n deviceId: input.deviceId,\r\n browserConnectionId: input.browserConnectionId,\r\n state: 'opening',\r\n pendingWrites: 0,\r\n createdAt: Date.now(),\r\n };\r\n\r\n this.sessions.set(input.transactionId, session);\r\n this.activeByDevice.set(input.deviceId, input.transactionId);\r\n return session;\r\n }\r\n\r\n get(transactionId: string): WriteSession | undefined {\r\n return this.sessions.get(transactionId);\r\n }\r\n\r\n getActiveForDevice(deviceId: string): WriteSession | undefined {\r\n const transactionId = this.activeByDevice.get(deviceId);\r\n\r\n if (!transactionId) {\r\n return undefined;\r\n }\r\n\r\n return this.sessions.get(transactionId);\r\n }\r\n\r\n setState(transactionId: string, state: TransactionStatusState): WriteSession | undefined {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return undefined;\r\n }\r\n\r\n session.state = state;\r\n return session;\r\n }\r\n\r\n incrementPendingWrites(transactionId: string): WriteSession | undefined {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return undefined;\r\n }\r\n\r\n session.pendingWrites += 1;\r\n return session;\r\n }\r\n\r\n decrementPendingWrites(transactionId: string): WriteSession | undefined {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return undefined;\r\n }\r\n\r\n session.pendingWrites = Math.max(0, session.pendingWrites - 1);\r\n return session;\r\n }\r\n\r\n remove(transactionId: string): void {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return;\r\n }\r\n\r\n if (this.activeByDevice.get(session.deviceId) === transactionId) {\r\n this.activeByDevice.delete(session.deviceId);\r\n }\r\n\r\n this.sessions.delete(transactionId);\r\n }\r\n\r\n getExpired(now = Date.now()): WriteSession[] {\r\n return [...this.sessions.values()].filter((session) => {\r\n if (session.state === 'idle' || session.state === 'failed') {\r\n return false;\r\n }\r\n\r\n return now - session.createdAt >= WRITE_TRANSACTION_TIMEOUT_MS;\r\n });\r\n }\r\n\r\n getByBrowserConnectionId(browserConnectionId: string): WriteSession[] {\r\n return [...this.sessions.values()].filter(\r\n (session) => session.browserConnectionId === browserConnectionId,\r\n );\r\n }\r\n\r\n getByDeviceId(deviceId: string): WriteSession[] {\r\n return [...this.sessions.values()].filter((session) => session.deviceId === deviceId);\r\n }\r\n}\r\n","import express from 'express';\r\nimport { createServer, type Server } from 'node:http';\r\nimport {\r\n DEFAULT_DEVTOOLS_HOST,\r\n DEFAULT_DEVTOOLS_PORT,\r\n DEVICE_SNAPSHOT_API_PATH,\r\n MAX_SNAPSHOT_BYTES,\r\n PROJECT_DATABASE_API_PATH,\r\n PROJECT_DATABASE_META_API_PATH,\r\n PROJECT_DATABASES_API_PATH,\r\n PROJECT_DEVICE_EXPORTS_API_PATH,\r\n buildDevToolsHttpUrl,\r\n buildDevToolsWsUrl,\r\n} from '../types/protocol';\r\nimport { SNAPSHOT_KIND_HEADER, SNAPSHOT_MIME_HEADER, SNAPSHOT_NAME_HEADER, SQLITE_SNAPSHOT_MIME_TYPE } from '../types/snapshot';\r\nimport { logger } from '../utils/logger';\r\nimport { attachWebUi } from './attachWebUi';\r\nimport { attachWebSocket } from './attachWebSocket';\r\nimport { ConnectionManager } from './connectionManager';\r\nimport { createCorsMiddleware } from './cors';\r\nimport { DeviceRegistry } from './deviceRegistry';\r\nimport { Heartbeat } from './heartbeat';\r\nimport { MessageRouter } from './messageRouter';\r\nimport { PendingRefreshStore } from './pendingRefreshStore';\r\nimport { RefreshCoordinator } from './refreshCoordinator';\r\nimport { SnapshotFileStore } from './snapshotFileStore';\r\nimport { SnapshotStore } from './snapshotStore';\r\nimport { WriteCoordinator } from './writeCoordinator';\r\nimport { WriteSessionManager } from './writeSessionManager';\r\n\r\nexport type DevToolsServerOptions = {\r\n host?: string;\r\n port?: number;\r\n dataDir?: string;\r\n snapshotPersistence?: boolean;\r\n webDistPath?: string;\r\n};\r\n\r\nexport type DevToolsServerUrls = {\r\n httpUrl: string;\r\n wsUrl: string;\r\n webUiEnabled: boolean;\r\n};\r\n\r\nexport type DevToolsServer = {\r\n app: express.Express;\r\n httpServer: Server;\r\n connectionManager: ConnectionManager;\r\n deviceRegistry: DeviceRegistry;\r\n router: MessageRouter;\r\n heartbeat: Heartbeat;\r\n snapshotStore: SnapshotStore;\r\n snapshotFileStore: SnapshotFileStore;\r\n pendingRefreshStore: PendingRefreshStore;\r\n writeSessions: WriteSessionManager;\r\n refreshCoordinator: RefreshCoordinator;\r\n writeCoordinator: WriteCoordinator;\r\n urls: DevToolsServerUrls;\r\n close: () => Promise<void>;\r\n};\r\n\r\nexport async function createDevToolsServer(\r\n options: DevToolsServerOptions = {},\r\n): Promise<DevToolsServer> {\r\n const host = options.host ?? DEFAULT_DEVTOOLS_HOST;\r\n const port = options.port ?? DEFAULT_DEVTOOLS_PORT;\r\n\r\n const app = express();\r\n const connectionManager = new ConnectionManager();\r\n const deviceRegistry = new DeviceRegistry(connectionManager);\r\n const router = new MessageRouter(connectionManager, deviceRegistry);\r\n const heartbeat = new Heartbeat(connectionManager, router);\r\n const snapshotStore = new SnapshotStore();\r\n const snapshotFileStore = new SnapshotFileStore({\r\n dataDir: options.dataDir,\r\n enabled: options.snapshotPersistence,\r\n });\r\n const pendingRefreshStore = new PendingRefreshStore();\r\n const writeSessions = new WriteSessionManager();\r\n\r\n const refreshCoordinator = new RefreshCoordinator(\r\n connectionManager,\r\n router,\r\n pendingRefreshStore,\r\n snapshotStore,\r\n snapshotFileStore,\r\n );\r\n const writeCoordinator = new WriteCoordinator(connectionManager, router, writeSessions);\r\n\r\n app.use(createCorsMiddleware());\r\n\r\n app.get('/health', (_request, response) => {\r\n response.json({ ok: true, ...deviceRegistry.snapshot() });\r\n });\r\n\r\n app.post(\r\n `${DEVICE_SNAPSHOT_API_PATH}/:deviceId/snapshot`,\r\n express.raw({ type: 'application/octet-stream', limit: MAX_SNAPSHOT_BYTES }),\r\n async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const body = request.body;\r\n\r\n if (!Buffer.isBuffer(body) || body.length === 0) {\r\n response.status(400).json({ ok: false, error: 'Empty snapshot body' });\r\n return;\r\n }\r\n\r\n const kindHeader = request.header(SNAPSHOT_KIND_HEADER);\r\n const mimeHeader = request.header(SNAPSHOT_MIME_HEADER);\r\n const nameHeader = request.header(SNAPSHOT_NAME_HEADER);\r\n\r\n const result = await refreshCoordinator.handleSnapshotUpload(deviceId, body, {\r\n kind: typeof kindHeader === 'string' ? kindHeader : undefined,\r\n mimeType: typeof mimeHeader === 'string' ? mimeHeader : undefined,\r\n databaseName: typeof nameHeader === 'string' ? nameHeader : undefined,\r\n });\r\n\r\n if (!result.ok) {\r\n response.status(result.code === 'SNAPSHOT_NOT_FOUND' ? 404 : 400).json({\r\n ok: false,\r\n error: result.code,\r\n });\r\n return;\r\n }\r\n\r\n response.status(201).json({ ok: true, deviceId, size: body.byteLength });\r\n },\r\n );\r\n\r\n app.get(`${DEVICE_SNAPSHOT_API_PATH}/:deviceId/snapshot`, async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const snapshot = await refreshCoordinator.getSnapshotAsync(deviceId);\r\n\r\n if (!snapshot) {\r\n response.status(404).json({ ok: false, error: 'SNAPSHOT_NOT_FOUND' });\r\n return;\r\n }\r\n\r\n response\r\n .status(200)\r\n .set('Content-Type', 'application/octet-stream')\r\n .send(snapshot);\r\n });\r\n\r\n app.get(PROJECT_DATABASE_META_API_PATH, async (_request, response) => {\r\n const meta = await snapshotFileStore.getActiveDatabaseMeta();\r\n response.json(meta);\r\n });\r\n\r\n app.get(PROJECT_DATABASES_API_PATH, async (_request, response) => {\r\n const databases = await snapshotFileStore.listDatabases();\r\n response.json({ databases });\r\n });\r\n\r\n app.get(PROJECT_DEVICE_EXPORTS_API_PATH, async (_request, response) => {\r\n const devices = await snapshotFileStore.listDeviceExports();\r\n response.json({ devices });\r\n });\r\n\r\n app.get(`${PROJECT_DEVICE_EXPORTS_API_PATH}/:deviceId/database/meta`, async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const meta = await snapshotFileStore.getDeviceDatabaseMeta(deviceId);\r\n response.json(meta);\r\n });\r\n\r\n app.get(`${PROJECT_DEVICE_EXPORTS_API_PATH}/:deviceId/database`, async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const meta = await snapshotFileStore.getDeviceDatabaseMeta(deviceId);\r\n\r\n if (!meta.exists) {\r\n response.status(404).json({ ok: false, error: 'DEVICE_DATABASE_NOT_FOUND', deviceId });\r\n return;\r\n }\r\n\r\n const bytes = await snapshotFileStore.readDeviceDatabase(deviceId);\r\n\r\n if (!bytes) {\r\n response.status(404).json({ ok: false, error: 'DEVICE_DATABASE_NOT_FOUND', deviceId });\r\n return;\r\n }\r\n\r\n response\r\n .status(200)\r\n .set('Content-Type', meta.mimeType ?? SQLITE_SNAPSHOT_MIME_TYPE)\r\n .send(bytes);\r\n });\r\n\r\n app.get(PROJECT_DATABASE_API_PATH, async (_request, response) => {\r\n const meta = await snapshotFileStore.getActiveDatabaseMeta();\r\n\r\n if (!meta.exists) {\r\n response.status(404).json({ ok: false, error: 'PROJECT_DATABASE_NOT_FOUND' });\r\n return;\r\n }\r\n\r\n const bytes = await snapshotFileStore.readActiveDatabase();\r\n\r\n if (!bytes) {\r\n response.status(404).json({ ok: false, error: 'PROJECT_DATABASE_NOT_FOUND' });\r\n return;\r\n }\r\n\r\n response\r\n .status(200)\r\n .set('Content-Type', meta.mimeType ?? SQLITE_SNAPSHOT_MIME_TYPE)\r\n .send(bytes);\r\n });\r\n\r\n if (options.webDistPath) {\r\n attachWebUi(app, options.webDistPath);\r\n }\r\n\r\n const httpServer = createServer(app);\r\n attachWebSocket(\r\n httpServer,\r\n connectionManager,\r\n router,\r\n heartbeat,\r\n refreshCoordinator,\r\n writeCoordinator,\r\n { snapshotFileStore },\r\n );\r\n\r\n const refreshTimeoutInterval = setInterval(() => {\r\n refreshCoordinator.checkTimeouts();\r\n writeCoordinator.checkTimeouts();\r\n }, 5_000);\r\n\r\n if (snapshotFileStore.isEnabled()) {\r\n await snapshotFileStore.listDeviceExports();\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n httpServer.once('error', reject);\r\n httpServer.listen(port, host, () => resolve());\r\n });\r\n\r\n const displayHost = host === '0.0.0.0' ? 'localhost' : host;\r\n const httpUrl = buildDevToolsHttpUrl(displayHost, port);\r\n const wsUrl = buildDevToolsWsUrl(displayHost, port);\r\n const webUiEnabled = Boolean(options.webDistPath);\r\n\r\n logger.serverStarted(httpUrl, wsUrl, webUiEnabled);\r\n\r\n return {\r\n app,\r\n httpServer,\r\n connectionManager,\r\n deviceRegistry,\r\n router,\r\n heartbeat,\r\n snapshotStore,\r\n snapshotFileStore,\r\n pendingRefreshStore,\r\n writeSessions,\r\n refreshCoordinator,\r\n writeCoordinator,\r\n urls: {\r\n httpUrl,\r\n wsUrl,\r\n webUiEnabled,\r\n },\r\n close: () =>\r\n new Promise((resolve, reject) => {\r\n clearInterval(refreshTimeoutInterval);\r\n heartbeat.stop();\r\n httpServer.close((error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n\r\n resolve();\r\n });\r\n }),\r\n };\r\n}\r\n"]}
1
+ {"version":3,"sources":["../src/types/protocol.ts","../src/types/adapter.ts","../src/types/kind.ts","../src/types/snapshot.ts","../src/adapter/errors.ts","../src/adapter/registry.ts","../src/adapters/sqlite/buildWriteSql.ts","../src/adapters/sqlite/createExpoSqliteAdapter.ts","../src/adapters/sqlite/detect.ts","../src/adapters/sqlite/register.ts","../src/adapter/registerBuiltins.ts","../src/adapter/resolveAdapter.ts","../src/inspector/registry.ts","../src/utils/ids.ts","../src/utils/reconnect.ts","../src/client/createDevToolsClient.ts","../src/client/fetchSnapshot.ts","../src/client/resolveDeviceDatabaseUrl.ts","../src/client/deviceDatabase.ts","../src/client/resolveProjectDatabaseUrl.ts","../src/client/projectDatabase.ts","../src/client/snapshotUpload.ts","../src/client/handleDeviceSnapshot.ts","../src/client/handleWriteOperations.ts","../src/utils/isDevToolsEnabled.ts","../src/client/formatSyncError.ts","../src/hooks/useDevTools.ts","../src/utils/resolveDevToolsHost.ts","../src/utils/resolveDeviceMetadata.ts","../src/utils/resolveServerUrl.ts","../src/utils/persistDeviceId.ts","../src/utils/sqlSafety.ts","../src/mobile/sqliteTableQuery.ts","../src/mobile/createExpoSqliteInspector.ts","../src/components/DevToolsProvider.tsx","../src/components/ConnectionStatusBadge.tsx","../src/components/DevToolsLauncherModal.tsx","../src/components/DevToolsSettingsModal.tsx","../src/utils/floatingButtonPosition.ts","../src/components/FloatingDevToolsButton.tsx","../src/components/mobile/mobileExplorerStyles.ts","../src/components/mobile/ExplorerOverviewTab.tsx","../src/mobile/constants.ts","../src/mobile/computeColumnWidths.ts","../src/mobile/copyToClipboard.ts","../src/components/mobile/MobileDataCardList.tsx","../src/components/mobile/MobileDataTable.tsx","../src/components/mobile/MobileDataView.tsx","../src/components/mobile/ExplorerSqlTab.tsx","../src/components/mobile/ExplorerTableDetail.tsx","../src/components/mobile/ExplorerTablesTab.tsx","../src/components/mobile/MobileDatabaseExplorer.tsx","../src/components/DatabaseDevTools.tsx","../src/utils/logger.ts","../src/server/attachWebUi.ts","../src/server/attachWebSocket.ts","../src/server/connectionManager.ts","../src/server/cors.ts","../src/server/deviceRegistry.ts","../src/server/heartbeat.ts","../src/server/messageRouter.ts","../src/server/pendingRefreshStore.ts","../src/server/refreshCoordinator.ts","../src/server/projectData.ts","../src/server/deviceExportStorage.ts","../src/server/migrateLegacyActiveDb.ts","../src/server/snapshotFileStore.ts","../src/server/snapshotStore.ts","../src/server/writeCoordinator.ts","../src/server/writeSessionManager.ts","../src/server/createDevToolsServer.ts"],"names":["resolveApiBase","createContext","useContext","Platform","Constants","NativeModules","AsyncStorage","quoteIdentifier","useState","useMemo","useRef","useCallback","useEffect","client","jsx","jsxs","View","Text","StyleSheet","Modal","styles","Pressable","ActivityIndicator","ScrollView","TextInput","Fragment","useWindowDimensions","PanResponder","MaterialCommunityIcons","FlatList","formatValue","path","existsSync","express","WebSocketServer","mkdir","readFile","writeFile","stat","rm","absolutePath","createServer"],"mappings":"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","file":"index.cjs","sourcesContent":["import type { WriteOperation } from './write';\r\n\r\n/** Client and server roles on the WebSocket hub. */\r\nexport const DevToolsRole = {\r\n MOBILE: 'mobile',\r\n BROWSER: 'browser',\r\n} as const;\r\n\r\nexport type DevToolsRole = (typeof DevToolsRole)[keyof typeof DevToolsRole];\r\n\r\n/** All wire message type identifiers. */\r\nexport const MessageType = {\r\n REGISTER: 'register',\r\n PING: 'ping',\r\n PONG: 'pong',\r\n DEVICE_STATUS: 'deviceStatus',\r\n BROADCAST: 'broadcast',\r\n REFRESH_REQUEST: 'refreshRequest',\r\n SNAPSHOT_UPLOAD_REQUESTED: 'snapshotUploadRequested',\r\n REFRESH_STATUS: 'refreshStatus',\r\n SNAPSHOT_READY: 'snapshotReady',\r\n REFRESH_ERROR: 'refreshError',\r\n EXPORT_SNAPSHOT_REQUEST: 'exportSnapshotRequest',\r\n EXPORT_SNAPSHOT_ERROR: 'exportSnapshotError',\r\n BEGIN_TRANSACTION_REQUEST: 'beginTransactionRequest',\r\n COMMIT_TRANSACTION_REQUEST: 'commitTransactionRequest',\r\n ROLLBACK_TRANSACTION_REQUEST: 'rollbackTransactionRequest',\r\n WRITE_REQUEST: 'writeRequest',\r\n BEGIN_TRANSACTION: 'beginTransaction',\r\n COMMIT_TRANSACTION: 'commitTransaction',\r\n ROLLBACK_TRANSACTION: 'rollbackTransaction',\r\n EXECUTE_WRITE: 'executeWrite',\r\n TRANSACTION_ACK: 'transactionAck',\r\n WRITE_ACK: 'writeAck',\r\n TRANSACTION_STATUS: 'transactionStatus',\r\n WRITE_RESULT: 'writeResult',\r\n WRITE_ERROR: 'writeError',\r\n} as const;\r\n\r\nexport type MessageTypeValue = (typeof MessageType)[keyof typeof MessageType];\r\n\r\n/** Shared base for every protocol message. */\r\nexport interface DevToolsMessageBase {\r\n type: MessageTypeValue;\r\n timestamp: number;\r\n}\r\n\r\nexport type DeviceMetadata = {\r\n platform?: string;\r\n appName?: string;\r\n [key: string]: string | undefined;\r\n};\r\n\r\n/** Client → Server: register role on connect. */\r\nexport interface RegisterMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REGISTER;\r\n role: DevToolsRole;\r\n deviceId?: string;\r\n metadata?: DeviceMetadata;\r\n}\r\n\r\n/** Server → Client: heartbeat probe. */\r\nexport interface PingMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.PING;\r\n pingId: string;\r\n}\r\n\r\n/** Client → Server: heartbeat response. */\r\nexport interface PongMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.PONG;\r\n pingId: string;\r\n}\r\n\r\nexport type BrowserConnectionInfo = {\r\n connectionId: string;\r\n connectedAt: number;\r\n};\r\n\r\nexport type MobileDeviceInfo = {\r\n deviceId: string;\r\n connectionId: string;\r\n connectedAt: number;\r\n metadata?: DeviceMetadata;\r\n};\r\n\r\nexport type DeviceStatusPayload = {\r\n browserCount: number;\r\n mobileCount: number;\r\n browsers: BrowserConnectionInfo[];\r\n mobiles: MobileDeviceInfo[];\r\n};\r\n\r\n/** Server → Client: hub snapshot after connect/disconnect. */\r\nexport interface DeviceStatusMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.DEVICE_STATUS;\r\n payload: DeviceStatusPayload;\r\n}\r\n\r\n/** Server → Client: generic routed envelope for future features. */\r\nexport interface BroadcastMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.BROADCAST;\r\n payload: unknown;\r\n}\r\n\r\nexport type RefreshType = 'snapshot';\r\n\r\nexport type RefreshState =\r\n | 'requested'\r\n | 'exporting'\r\n | 'uploading'\r\n | 'ready'\r\n | 'failed'\r\n | 'timeout';\r\n\r\n/** @deprecated Use RefreshState */\r\nexport type SyncState = RefreshState;\r\n\r\nexport type RefreshErrorCode =\r\n | 'DEVICE_OFFLINE'\r\n | 'REFRESH_IN_PROGRESS'\r\n | 'EXPORT_FAILED'\r\n | 'UPLOAD_FAILED'\r\n | 'TIMEOUT'\r\n | 'SNAPSHOT_NOT_FOUND'\r\n | 'INVALID_REQUEST';\r\n\r\n/** @deprecated Use RefreshErrorCode */\r\nexport type SyncErrorCode = RefreshErrorCode;\r\n\r\n/** Browser → Server: request a database snapshot from a mobile device. */\r\nexport interface RefreshRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REFRESH_REQUEST;\r\n deviceId: string;\r\n refreshType: RefreshType;\r\n}\r\n\r\n/** Server → Mobile: export database and upload via REST. */\r\nexport interface SnapshotUploadRequestedMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.SNAPSHOT_UPLOAD_REQUESTED;\r\n deviceId: string;\r\n refreshType: RefreshType;\r\n}\r\n\r\n/** Server → Browser: refresh progress update. */\r\nexport interface RefreshStatusMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REFRESH_STATUS;\r\n deviceId: string;\r\n state: RefreshState;\r\n message?: string;\r\n}\r\n\r\n/** Server → Browser: snapshot uploaded and ready to download. */\r\nexport interface SnapshotReadyMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.SNAPSHOT_READY;\r\n deviceId: string;\r\n size: number;\r\n exportedAt: number;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n}\r\n\r\n/** Server → Browser: refresh failed. */\r\nexport interface RefreshErrorMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.REFRESH_ERROR;\r\n deviceId: string;\r\n code: RefreshErrorCode;\r\n message: string;\r\n}\r\n\r\n/** Mobile → Server: push database snapshot to the web inspector. */\r\nexport interface ExportSnapshotRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.EXPORT_SNAPSHOT_REQUEST;\r\n refreshType: RefreshType;\r\n}\r\n\r\n/** Server → Mobile: export request failed before upload. */\r\nexport interface ExportSnapshotErrorMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.EXPORT_SNAPSHOT_ERROR;\r\n code: RefreshErrorCode;\r\n message: string;\r\n}\r\n\r\nexport type RefreshInitiator = 'browser' | 'mobile';\r\n\r\nexport type TransactionStatusState =\r\n | 'idle'\r\n | 'opening'\r\n | 'open'\r\n | 'committing'\r\n | 'rolling_back'\r\n | 'failed';\r\n\r\nexport type WriteErrorCode =\r\n | 'DEVICE_OFFLINE'\r\n | 'NO_TRANSACTION'\r\n | 'TRANSACTION_BUSY'\r\n | 'INVALID_OPERATION'\r\n | 'WRITE_FAILED'\r\n | 'ADAPTER_ERROR'\r\n | 'TIMEOUT';\r\n\r\n/** Browser → Server: open a write transaction on a device. */\r\nexport interface BeginTransactionRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.BEGIN_TRANSACTION_REQUEST;\r\n transactionId: string;\r\n deviceId: string;\r\n}\r\n\r\n/** Browser → Server: commit the active transaction. */\r\nexport interface CommitTransactionRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.COMMIT_TRANSACTION_REQUEST;\r\n transactionId: string;\r\n deviceId: string;\r\n}\r\n\r\n/** Browser → Server: roll back the active transaction. */\r\nexport interface RollbackTransactionRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.ROLLBACK_TRANSACTION_REQUEST;\r\n transactionId: string;\r\n deviceId: string;\r\n}\r\n\r\n/** Browser → Server: execute a structured write inside a transaction. */\r\nexport interface WriteRequestMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_REQUEST;\r\n writeId: string;\r\n transactionId: string;\r\n deviceId: string;\r\n operation: WriteOperation;\r\n}\r\n\r\n/** Server → Mobile: begin a transaction on the live database. */\r\nexport interface BeginTransactionMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.BEGIN_TRANSACTION;\r\n transactionId: string;\r\n}\r\n\r\n/** Server → Mobile: commit the open transaction. */\r\nexport interface CommitTransactionMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.COMMIT_TRANSACTION;\r\n transactionId: string;\r\n}\r\n\r\n/** Server → Mobile: roll back the open transaction. */\r\nexport interface RollbackTransactionMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.ROLLBACK_TRANSACTION;\r\n transactionId: string;\r\n}\r\n\r\n/** Server → Mobile: run a structured write operation. */\r\nexport interface ExecuteWriteMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.EXECUTE_WRITE;\r\n writeId: string;\r\n transactionId: string;\r\n operation: WriteOperation;\r\n}\r\n\r\n/** Mobile → Server: transaction lifecycle acknowledgement. */\r\nexport interface TransactionAckMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.TRANSACTION_ACK;\r\n transactionId: string;\r\n action: 'begin' | 'commit' | 'rollback';\r\n ok: boolean;\r\n message?: string;\r\n}\r\n\r\n/** Mobile → Server: write operation acknowledgement. */\r\nexport interface WriteAckMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_ACK;\r\n writeId: string;\r\n transactionId: string;\r\n ok: boolean;\r\n rowsAffected?: number;\r\n message?: string;\r\n}\r\n\r\n/** Server → Browser: transaction state update. */\r\nexport interface TransactionStatusMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.TRANSACTION_STATUS;\r\n transactionId: string;\r\n deviceId: string;\r\n state: TransactionStatusState;\r\n message?: string;\r\n}\r\n\r\n/** Server → Browser: write succeeded. */\r\nexport interface WriteResultMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_RESULT;\r\n writeId: string;\r\n transactionId: string;\r\n rowsAffected: number;\r\n}\r\n\r\n/** Server → Browser: write or transaction failed. */\r\nexport interface WriteErrorMessage extends DevToolsMessageBase {\r\n type: typeof MessageType.WRITE_ERROR;\r\n transactionId: string;\r\n writeId?: string;\r\n code: WriteErrorCode;\r\n message: string;\r\n}\r\n\r\nexport type ClientMessage =\r\n | RegisterMessage\r\n | PongMessage\r\n | RefreshRequestMessage\r\n | ExportSnapshotRequestMessage\r\n | BeginTransactionRequestMessage\r\n | CommitTransactionRequestMessage\r\n | RollbackTransactionRequestMessage\r\n | WriteRequestMessage\r\n | TransactionAckMessage\r\n | WriteAckMessage;\r\n\r\nexport type ServerMessage =\r\n | PingMessage\r\n | DeviceStatusMessage\r\n | BroadcastMessage\r\n | SnapshotUploadRequestedMessage\r\n | RefreshStatusMessage\r\n | SnapshotReadyMessage\r\n | RefreshErrorMessage\r\n | ExportSnapshotErrorMessage\r\n | BeginTransactionMessage\r\n | CommitTransactionMessage\r\n | RollbackTransactionMessage\r\n | ExecuteWriteMessage\r\n | TransactionStatusMessage\r\n | WriteResultMessage\r\n | WriteErrorMessage;\r\n\r\nexport type DevToolsMessage = ClientMessage | ServerMessage;\r\n\r\nexport const DEVTOOLS_WS_PATH = '/ws';\r\n\r\nexport const DEFAULT_DEVTOOLS_PORT = 3847;\r\n\r\nexport const DEFAULT_DEVTOOLS_HOST = '0.0.0.0';\r\n\r\nexport const HEARTBEAT_INTERVAL_MS = 30_000;\r\n\r\nexport const HEARTBEAT_TIMEOUT_MS = 10_000;\r\n\r\nexport const DEVICE_SNAPSHOT_API_PATH = '/api/devices';\r\n\r\nexport const PROJECT_DATABASE_API_PATH = '/api/project/database';\r\n\r\nexport const PROJECT_DATABASE_META_API_PATH = '/api/project/database/meta';\r\n\r\nexport const PROJECT_DATABASES_API_PATH = '/api/project/databases';\r\n\r\nexport const PROJECT_DEVICE_EXPORTS_API_PATH = '/api/project/devices';\r\n\r\n/** @deprecated Use DEVICE_SNAPSHOT_API_PATH */\r\nexport const SNAPSHOT_API_PATH = DEVICE_SNAPSHOT_API_PATH;\r\n\r\nexport const REFRESH_TIMEOUT_MS = 60_000;\r\n\r\n/** @deprecated Use REFRESH_TIMEOUT_MS */\r\nexport const SYNC_TIMEOUT_MS = REFRESH_TIMEOUT_MS;\r\n\r\nexport const WRITE_TRANSACTION_TIMEOUT_MS = 5 * 60 * 1000;\r\n\r\nexport const MAX_SNAPSHOT_BYTES = 50 * 1024 * 1024;\r\n\r\nexport function createMessage<T extends DevToolsMessageBase>(\r\n message: Omit<T, 'timestamp'>,\r\n): T {\r\n return { ...message, timestamp: Date.now() } as T;\r\n}\r\n\r\nexport function buildDevToolsHttpUrl(\r\n host = 'localhost',\r\n port = DEFAULT_DEVTOOLS_PORT,\r\n): string {\r\n return `http://${host}:${port}`;\r\n}\r\n\r\nexport function buildDevToolsWsUrl(\r\n host = 'localhost',\r\n port = DEFAULT_DEVTOOLS_PORT,\r\n): string {\r\n return `ws://${host}:${port}${DEVTOOLS_WS_PATH}`;\r\n}\r\n\r\nexport function buildDeviceSnapshotUrl(httpBaseUrl: string, deviceId: string): string {\r\n const base = httpBaseUrl.replace(/\\/$/, '');\r\n return `${base}${DEVICE_SNAPSHOT_API_PATH}/${encodeURIComponent(deviceId)}/snapshot`;\r\n}\r\n\r\n/** @deprecated Use buildDeviceSnapshotUrl */\r\nexport function buildSnapshotUrl(httpBaseUrl: string, deviceId: string): string {\r\n return buildDeviceSnapshotUrl(httpBaseUrl, deviceId);\r\n}\r\n\r\nexport function wsUrlToHttpUrl(wsUrl: string): string {\r\n const url = new URL(wsUrl);\r\n url.protocol = url.protocol === 'wss:' ? 'https:' : 'http:';\r\n url.pathname = '';\r\n url.search = '';\r\n url.hash = '';\r\n return url.toString().replace(/\\/$/, '');\r\n}\r\n\r\nfunction hasMessageType(value: unknown): value is { type: string } {\r\n return typeof value === 'object' && value !== null && typeof (value as { type: unknown }).type === 'string';\r\n}\r\n\r\nexport function isRegisterMessage(value: unknown): value is RegisterMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REGISTER) {\r\n return false;\r\n }\r\n\r\n const message = value as RegisterMessage;\r\n return (\r\n message.role === DevToolsRole.MOBILE || message.role === DevToolsRole.BROWSER\r\n );\r\n}\r\n\r\nexport function isPongMessage(value: unknown): value is PongMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.PONG) {\r\n return false;\r\n }\r\n\r\n const message = value as PongMessage;\r\n return typeof message.pingId === 'string';\r\n}\r\n\r\nexport function isRefreshRequestMessage(value: unknown): value is RefreshRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REFRESH_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as RefreshRequestMessage;\r\n return typeof message.deviceId === 'string' && message.refreshType === 'snapshot';\r\n}\r\n\r\nexport function isSnapshotUploadRequestedMessage(\r\n value: unknown,\r\n): value is SnapshotUploadRequestedMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.SNAPSHOT_UPLOAD_REQUESTED) {\r\n return false;\r\n }\r\n\r\n const message = value as SnapshotUploadRequestedMessage;\r\n return typeof message.deviceId === 'string' && message.refreshType === 'snapshot';\r\n}\r\n\r\nexport function isRefreshStatusMessage(value: unknown): value is RefreshStatusMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REFRESH_STATUS) {\r\n return false;\r\n }\r\n\r\n const message = value as RefreshStatusMessage;\r\n return typeof message.deviceId === 'string' && typeof message.state === 'string';\r\n}\r\n\r\nexport function isSnapshotReadyMessage(value: unknown): value is SnapshotReadyMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.SNAPSHOT_READY) {\r\n return false;\r\n }\r\n\r\n const message = value as SnapshotReadyMessage;\r\n return (\r\n typeof message.deviceId === 'string' &&\r\n typeof message.size === 'number' &&\r\n typeof message.exportedAt === 'number' &&\r\n typeof message.kind === 'string' &&\r\n typeof message.mimeType === 'string'\r\n );\r\n}\r\n\r\nexport function isRefreshErrorMessage(value: unknown): value is RefreshErrorMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.REFRESH_ERROR) {\r\n return false;\r\n }\r\n\r\n const message = value as RefreshErrorMessage;\r\n return typeof message.deviceId === 'string' && typeof message.code === 'string';\r\n}\r\n\r\nexport function isExportSnapshotRequestMessage(\r\n value: unknown,\r\n): value is ExportSnapshotRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.EXPORT_SNAPSHOT_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as ExportSnapshotRequestMessage;\r\n return message.refreshType === 'snapshot';\r\n}\r\n\r\nexport function isExportSnapshotErrorMessage(\r\n value: unknown,\r\n): value is ExportSnapshotErrorMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.EXPORT_SNAPSHOT_ERROR) {\r\n return false;\r\n }\r\n\r\n const message = value as ExportSnapshotErrorMessage;\r\n return typeof message.code === 'string' && typeof message.message === 'string';\r\n}\r\n\r\nexport function isBeginTransactionRequestMessage(\r\n value: unknown,\r\n): value is BeginTransactionRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.BEGIN_TRANSACTION_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as BeginTransactionRequestMessage;\r\n return typeof message.transactionId === 'string' && typeof message.deviceId === 'string';\r\n}\r\n\r\nexport function isCommitTransactionRequestMessage(\r\n value: unknown,\r\n): value is CommitTransactionRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.COMMIT_TRANSACTION_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as CommitTransactionRequestMessage;\r\n return typeof message.transactionId === 'string' && typeof message.deviceId === 'string';\r\n}\r\n\r\nexport function isRollbackTransactionRequestMessage(\r\n value: unknown,\r\n): value is RollbackTransactionRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.ROLLBACK_TRANSACTION_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as RollbackTransactionRequestMessage;\r\n return typeof message.transactionId === 'string' && typeof message.deviceId === 'string';\r\n}\r\n\r\nexport function isWriteRequestMessage(value: unknown): value is WriteRequestMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_REQUEST) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteRequestMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.deviceId === 'string' &&\r\n typeof message.operation === 'object' &&\r\n message.operation !== null\r\n );\r\n}\r\n\r\nexport function isTransactionAckMessage(value: unknown): value is TransactionAckMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.TRANSACTION_ACK) {\r\n return false;\r\n }\r\n\r\n const message = value as TransactionAckMessage;\r\n return (\r\n typeof message.transactionId === 'string' &&\r\n (message.action === 'begin' || message.action === 'commit' || message.action === 'rollback') &&\r\n typeof message.ok === 'boolean'\r\n );\r\n}\r\n\r\nexport function isWriteAckMessage(value: unknown): value is WriteAckMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_ACK) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteAckMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.ok === 'boolean'\r\n );\r\n}\r\n\r\nexport function isClientMessage(value: unknown): value is ClientMessage {\r\n return (\r\n isRegisterMessage(value) ||\r\n isPongMessage(value) ||\r\n isRefreshRequestMessage(value) ||\r\n isExportSnapshotRequestMessage(value) ||\r\n isBeginTransactionRequestMessage(value) ||\r\n isCommitTransactionRequestMessage(value) ||\r\n isRollbackTransactionRequestMessage(value) ||\r\n isWriteRequestMessage(value) ||\r\n isTransactionAckMessage(value) ||\r\n isWriteAckMessage(value)\r\n );\r\n}\r\n\r\nexport function isPingMessage(value: unknown): value is PingMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.PING) {\r\n return false;\r\n }\r\n\r\n const message = value as PingMessage;\r\n return typeof message.pingId === 'string';\r\n}\r\n\r\nexport function isDeviceStatusMessage(value: unknown): value is DeviceStatusMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.DEVICE_STATUS) {\r\n return false;\r\n }\r\n\r\n const message = value as DeviceStatusMessage;\r\n return typeof message.payload === 'object' && message.payload !== null;\r\n}\r\n\r\nexport function isBroadcastMessage(value: unknown): value is BroadcastMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.BROADCAST) {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function isBeginTransactionMessage(value: unknown): value is BeginTransactionMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.BEGIN_TRANSACTION) {\r\n return false;\r\n }\r\n\r\n const message = value as BeginTransactionMessage;\r\n return typeof message.transactionId === 'string';\r\n}\r\n\r\nexport function isCommitTransactionMessage(value: unknown): value is CommitTransactionMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.COMMIT_TRANSACTION) {\r\n return false;\r\n }\r\n\r\n const message = value as CommitTransactionMessage;\r\n return typeof message.transactionId === 'string';\r\n}\r\n\r\nexport function isRollbackTransactionMessage(value: unknown): value is RollbackTransactionMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.ROLLBACK_TRANSACTION) {\r\n return false;\r\n }\r\n\r\n const message = value as RollbackTransactionMessage;\r\n return typeof message.transactionId === 'string';\r\n}\r\n\r\nexport function isExecuteWriteMessage(value: unknown): value is ExecuteWriteMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.EXECUTE_WRITE) {\r\n return false;\r\n }\r\n\r\n const message = value as ExecuteWriteMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.operation === 'object' &&\r\n message.operation !== null\r\n );\r\n}\r\n\r\nexport function isTransactionStatusMessage(value: unknown): value is TransactionStatusMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.TRANSACTION_STATUS) {\r\n return false;\r\n }\r\n\r\n const message = value as TransactionStatusMessage;\r\n return (\r\n typeof message.transactionId === 'string' &&\r\n typeof message.deviceId === 'string' &&\r\n typeof message.state === 'string'\r\n );\r\n}\r\n\r\nexport function isWriteResultMessage(value: unknown): value is WriteResultMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_RESULT) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteResultMessage;\r\n return (\r\n typeof message.writeId === 'string' &&\r\n typeof message.transactionId === 'string' &&\r\n typeof message.rowsAffected === 'number'\r\n );\r\n}\r\n\r\nexport function isWriteErrorMessage(value: unknown): value is WriteErrorMessage {\r\n if (!hasMessageType(value) || value.type !== MessageType.WRITE_ERROR) {\r\n return false;\r\n }\r\n\r\n const message = value as WriteErrorMessage;\r\n return typeof message.transactionId === 'string' && typeof message.code === 'string';\r\n}\r\n\r\nexport function isServerMessage(value: unknown): value is ServerMessage {\r\n return (\r\n isPingMessage(value) ||\r\n isDeviceStatusMessage(value) ||\r\n isBroadcastMessage(value) ||\r\n isSnapshotUploadRequestedMessage(value) ||\r\n isRefreshStatusMessage(value) ||\r\n isSnapshotReadyMessage(value) ||\r\n isRefreshErrorMessage(value) ||\r\n isExportSnapshotErrorMessage(value) ||\r\n isBeginTransactionMessage(value) ||\r\n isCommitTransactionMessage(value) ||\r\n isRollbackTransactionMessage(value) ||\r\n isExecuteWriteMessage(value) ||\r\n isTransactionStatusMessage(value) ||\r\n isWriteResultMessage(value) ||\r\n isWriteErrorMessage(value)\r\n );\r\n}\r\n","import type { AdapterCapabilities } from './capabilities';\r\nimport type { DatabaseKind } from './kind';\r\nimport type { SnapshotExport } from './snapshot';\r\nimport type { WriteOperation } from './write';\r\n\r\n/** Database adapter interface for export and write operations on the live device. */\r\nexport interface DatabaseAdapter {\r\n readonly kind: DatabaseKind;\r\n /** @deprecated Use `kind` instead. */\r\n readonly dialect: DatabaseKind;\r\n readonly id: string;\r\n readonly name: string;\r\n readonly capabilities: AdapterCapabilities;\r\n exportSnapshot(): Promise<SnapshotExport>;\r\n}\r\n\r\nexport type WriteResult = {\r\n rowsAffected: number;\r\n};\r\n\r\n/** Adapter that supports transactional writes on the live device database. */\r\nexport interface WritableDatabaseAdapter extends DatabaseAdapter {\r\n beginTransaction(): Promise<void>;\r\n commitTransaction(): Promise<void>;\r\n rollbackTransaction(): Promise<void>;\r\n executeWrite(operation: WriteOperation): Promise<WriteResult>;\r\n}\r\n\r\n/** @deprecated Use `WritableDatabaseAdapter` instead. */\r\nexport type EditableDatabaseAdapter = WritableDatabaseAdapter;\r\n\r\nexport function isWritableDatabaseAdapter(\r\n adapter: DatabaseAdapter | undefined,\r\n): adapter is WritableDatabaseAdapter {\r\n if (!adapter?.capabilities.transactionalWrites) {\r\n return false;\r\n }\r\n\r\n const candidate = adapter as WritableDatabaseAdapter;\r\n return (\r\n typeof candidate.beginTransaction === 'function' &&\r\n typeof candidate.commitTransaction === 'function' &&\r\n typeof candidate.rollbackTransaction === 'function' &&\r\n typeof candidate.executeWrite === 'function'\r\n );\r\n}\r\n\r\n/** @deprecated Use `isWritableDatabaseAdapter` instead. */\r\nexport const isEditableDatabaseAdapter = isWritableDatabaseAdapter;\r\n","/** Supported database engine identifiers. */\r\nexport type DatabaseKind = 'sqlite' | 'realm' | 'duckdb' | (string & {});\r\n\r\nexport const DATABASE_DEVTOOLS_KIND = Symbol.for('@database-devtools/kind');\r\n\r\nexport function readDatabaseKindMarker(value: unknown): DatabaseKind | undefined {\r\n if (typeof value !== 'object' || value === null) {\r\n return undefined;\r\n }\r\n\r\n const marker = (value as Record<symbol, unknown>)[DATABASE_DEVTOOLS_KIND];\r\n\r\n return typeof marker === 'string' ? (marker as DatabaseKind) : undefined;\r\n}\r\n","import type { DatabaseKind } from '../types/kind';\r\n\r\nexport const SNAPSHOT_KIND_HEADER = 'x-database-kind';\r\nexport const SNAPSHOT_MIME_HEADER = 'x-snapshot-mime-type';\r\nexport const SNAPSHOT_NAME_HEADER = 'x-database-name';\r\n\r\nexport const SQLITE_SNAPSHOT_MIME_TYPE = 'application/x-sqlite3';\r\n\r\nexport type SnapshotExport = {\r\n bytes: Uint8Array;\r\n mimeType: string;\r\n kind: DatabaseKind;\r\n exportedAt?: number;\r\n};\r\n","import type { DatabaseKind } from '../types/kind';\r\n\r\nexport type SupportedDatabase = {\r\n kind: DatabaseKind;\r\n displayName: string;\r\n};\r\n\r\nexport class AdapterResolutionError extends Error {\r\n readonly name = 'AdapterResolutionError';\r\n\r\n constructor(\r\n public readonly supported: SupportedDatabase[],\r\n public readonly hint: 'type' | 'adapter' | 'install-package',\r\n ) {\r\n super(formatAdapterResolutionMessage(supported, hint));\r\n }\r\n}\r\n\r\nexport function formatAdapterResolutionMessage(\r\n supported: SupportedDatabase[],\r\n hint: 'type' | 'adapter' | 'install-package',\r\n): string {\r\n const lines = [\r\n 'Unable to determine the database type.',\r\n '',\r\n 'Supported databases:',\r\n ...supported.map((entry) => ` • ${entry.displayName}`),\r\n '',\r\n 'Try specifying a type:',\r\n ' <DatabaseDevTools database={db} type=\"sqlite\" />',\r\n '',\r\n 'Or provide a custom adapter:',\r\n ' <DatabaseDevTools database={db} adapter={myAdapter} />',\r\n ];\r\n\r\n if (hint === 'install-package') {\r\n lines.push(\r\n '',\r\n 'For SQLite, install expo-sqlite:',\r\n ' npm install expo-sqlite',\r\n );\r\n }\r\n\r\n return lines.join('\\n');\r\n}\r\n","import { readDatabaseKindMarker } from '../types/kind';\r\nimport type { AdapterDefinition } from './types';\r\n\r\nexport class AdapterRegistry {\r\n private readonly definitions = new Map<string, AdapterDefinition>();\r\n\r\n register(definition: AdapterDefinition): void {\r\n this.definitions.set(definition.kind, definition);\r\n }\r\n\r\n get(kind: string): AdapterDefinition | undefined {\r\n return this.definitions.get(kind);\r\n }\r\n\r\n listSupported(): { kind: string; displayName: string }[] {\r\n return [...this.definitions.values()]\r\n .sort((left, right) => left.displayName.localeCompare(right.displayName))\r\n .map((definition) => ({\r\n kind: definition.kind,\r\n displayName: definition.displayName,\r\n }));\r\n }\r\n\r\n detect(database: unknown): AdapterDefinition | undefined {\r\n const markerKind = readDatabaseKindMarker(database);\r\n\r\n if (markerKind) {\r\n const marked = this.definitions.get(markerKind);\r\n\r\n if (marked) {\r\n return marked;\r\n }\r\n }\r\n\r\n const matches = [...this.definitions.values()]\r\n .filter((definition) => {\r\n try {\r\n return definition.detect(database);\r\n } catch {\r\n return false;\r\n }\r\n })\r\n .sort((left, right) => right.priority - left.priority);\r\n\r\n return matches[0];\r\n }\r\n}\r\n\r\nlet globalRegistry: AdapterRegistry | null = null;\r\n\r\nexport function getAdapterRegistry(): AdapterRegistry {\r\n if (!globalRegistry) {\r\n globalRegistry = new AdapterRegistry();\r\n }\r\n\r\n return globalRegistry;\r\n}\r\n\r\nexport function resetAdapterRegistry(): void {\r\n globalRegistry = null;\r\n}\r\n","import type {\r\n DeleteOperation,\r\n InsertOperation,\r\n UpdateOperation,\r\n WriteCellValue,\r\n} from '../../types/write';\r\n\r\nconst IDENTIFIER_PATTERN = /^[A-Za-z_][A-Za-z0-9_]*$/;\r\n\r\nexport function quoteIdentifier(name: string): string {\r\n if (!IDENTIFIER_PATTERN.test(name)) {\r\n throw new Error(`Invalid identifier: ${name}`);\r\n }\r\n\r\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\r\n}\r\n\r\nexport function buildInsertSql(operation: InsertOperation): { sql: string; params: WriteCellValue[] } {\r\n const columns = Object.keys(operation.values);\r\n\r\n if (columns.length === 0) {\r\n throw new Error('Insert requires at least one column value');\r\n }\r\n\r\n const quotedColumns = columns.map(quoteIdentifier).join(', ');\r\n const placeholders = columns.map(() => '?').join(', ');\r\n const sql = `INSERT INTO ${quoteIdentifier(operation.table)} (${quotedColumns}) VALUES (${placeholders})`;\r\n const params = columns.map((column) => operation.values[column] ?? null);\r\n\r\n return { sql, params };\r\n}\r\n\r\nexport function buildUpdateSql(operation: UpdateOperation): { sql: string; params: WriteCellValue[] } {\r\n const valueColumns = Object.keys(operation.values);\r\n const pkColumns = Object.keys(operation.primaryKey);\r\n\r\n if (valueColumns.length === 0) {\r\n throw new Error('Update requires at least one column value');\r\n }\r\n\r\n if (pkColumns.length === 0) {\r\n throw new Error('Update requires a primary key');\r\n }\r\n\r\n const setClause = valueColumns.map((column) => `${quoteIdentifier(column)} = ?`).join(', ');\r\n const whereClause = pkColumns.map((column) => `${quoteIdentifier(column)} = ?`).join(' AND ');\r\n const sql = `UPDATE ${quoteIdentifier(operation.table)} SET ${setClause} WHERE ${whereClause}`;\r\n const params = [\r\n ...valueColumns.map((column) => operation.values[column] ?? null),\r\n ...pkColumns.map((column) => operation.primaryKey[column] ?? null),\r\n ];\r\n\r\n return { sql, params };\r\n}\r\n\r\nexport function buildDeleteSql(operation: DeleteOperation): { sql: string; params: WriteCellValue[] } {\r\n const pkColumns = Object.keys(operation.primaryKey);\r\n\r\n if (pkColumns.length === 0) {\r\n throw new Error('Delete requires a primary key');\r\n }\r\n\r\n const whereClause = pkColumns.map((column) => `${quoteIdentifier(column)} = ?`).join(' AND ');\r\n const sql = `DELETE FROM ${quoteIdentifier(operation.table)} WHERE ${whereClause}`;\r\n const params = pkColumns.map((column) => operation.primaryKey[column] ?? null);\r\n\r\n return { sql, params };\r\n}\r\n","import type { WritableDatabaseAdapter } from '../../types/adapter';\r\nimport type { WriteOperation } from '../../types/write';\r\nimport { SQLITE_SNAPSHOT_MIME_TYPE } from '../../types/snapshot';\r\nimport {\r\n buildDeleteSql,\r\n buildInsertSql,\r\n buildUpdateSql,\r\n} from './buildWriteSql';\r\nimport type { ExpoSqliteDatabase } from './types';\r\n\r\nexport type CreateExpoSqliteAdapterOptions = {\r\n database: ExpoSqliteDatabase;\r\n id?: string;\r\n name?: string;\r\n};\r\n\r\nexport function createExpoSqliteAdapter(\r\n options: CreateExpoSqliteAdapterOptions,\r\n): WritableDatabaseAdapter {\r\n const { database } = options;\r\n let inTransaction = false;\r\n let operationQueue: Promise<void> = Promise.resolve();\r\n\r\n const enqueue = async <T>(operation: () => Promise<T>): Promise<T> => {\r\n const next = operationQueue.then(operation);\r\n operationQueue = next.then(\r\n () => undefined,\r\n () => undefined,\r\n );\r\n return next;\r\n };\r\n\r\n const assertTransaction = (): void => {\r\n if (!inTransaction) {\r\n throw new Error('No open transaction. Call beginTransaction() first.');\r\n }\r\n };\r\n\r\n const runWrite = async (operation: WriteOperation) => {\r\n assertTransaction();\r\n\r\n let sql: string;\r\n let params: unknown[];\r\n\r\n switch (operation.kind) {\r\n case 'insert': {\r\n const built = buildInsertSql(operation);\r\n sql = built.sql;\r\n params = built.params;\r\n break;\r\n }\r\n case 'update': {\r\n const built = buildUpdateSql(operation);\r\n sql = built.sql;\r\n params = built.params;\r\n break;\r\n }\r\n case 'delete': {\r\n const built = buildDeleteSql(operation);\r\n sql = built.sql;\r\n params = built.params;\r\n break;\r\n }\r\n default: {\r\n const exhaustive: never = operation;\r\n throw new Error(`Unsupported write operation: ${(exhaustive as WriteOperation).kind}`);\r\n }\r\n }\r\n\r\n const result = await database.runAsync(sql, params);\r\n return { rowsAffected: result.changes };\r\n };\r\n\r\n return {\r\n kind: 'sqlite',\r\n dialect: 'sqlite',\r\n id: options.id ?? database.databasePath,\r\n name: options.name ?? 'SQLite',\r\n capabilities: {\r\n exportSnapshot: true,\r\n executeQuery: false,\r\n listTables: false,\r\n getSchema: false,\r\n transactionalWrites: true,\r\n observeChanges: false,\r\n importSnapshot: false,\r\n },\r\n async exportSnapshot() {\r\n return enqueue(async () => {\r\n if (inTransaction) {\r\n throw new Error('Cannot export while a write transaction is open');\r\n }\r\n\r\n await database.execAsync('PRAGMA wal_checkpoint(FULL)');\r\n const bytes = await database.serializeAsync();\r\n\r\n return {\r\n bytes,\r\n mimeType: SQLITE_SNAPSHOT_MIME_TYPE,\r\n kind: 'sqlite' as const,\r\n exportedAt: Date.now(),\r\n };\r\n });\r\n },\r\n async beginTransaction() {\r\n return enqueue(async () => {\r\n if (inTransaction) {\r\n throw new Error('Transaction already open');\r\n }\r\n\r\n await database.execAsync('BEGIN IMMEDIATE');\r\n inTransaction = true;\r\n });\r\n },\r\n async commitTransaction() {\r\n return enqueue(async () => {\r\n assertTransaction();\r\n\r\n try {\r\n await database.execAsync('COMMIT');\r\n } finally {\r\n inTransaction = false;\r\n }\r\n });\r\n },\r\n async rollbackTransaction() {\r\n return enqueue(async () => {\r\n if (!inTransaction) {\r\n return;\r\n }\r\n\r\n try {\r\n await database.execAsync('ROLLBACK');\r\n } finally {\r\n inTransaction = false;\r\n }\r\n });\r\n },\r\n executeWrite: (operation) => enqueue(() => runWrite(operation)),\r\n };\r\n}\r\n","import type { ExpoSqliteDatabase, ExpoSqliteInspectableDatabase } from './types';\r\n\r\nexport function detectExpoSqlite(database: unknown): database is ExpoSqliteDatabase {\r\n return (\r\n typeof database === 'object' &&\r\n database !== null &&\r\n typeof (database as ExpoSqliteDatabase).execAsync === 'function' &&\r\n typeof (database as ExpoSqliteDatabase).serializeAsync === 'function' &&\r\n typeof (database as ExpoSqliteDatabase).runAsync === 'function' &&\r\n typeof (database as ExpoSqliteDatabase).databasePath === 'string'\r\n );\r\n}\r\n\r\nexport function detectExpoSqliteInspectable(\r\n database: unknown,\r\n): database is ExpoSqliteInspectableDatabase {\r\n return (\r\n detectExpoSqlite(database) &&\r\n typeof (database as ExpoSqliteInspectableDatabase).getAllAsync === 'function' &&\r\n typeof (database as ExpoSqliteInspectableDatabase).getFirstAsync === 'function'\r\n );\r\n}\r\n","import { getAdapterRegistry } from '../../adapter/registry';\r\nimport type { AdapterDefinition } from '../../adapter/types';\r\nimport { createExpoSqliteAdapter } from './createExpoSqliteAdapter';\r\nimport { detectExpoSqlite } from './detect';\r\nimport type { ExpoSqliteDatabase } from './types';\r\n\r\nexport const sqliteAdapterDefinition: AdapterDefinition = {\r\n kind: 'sqlite',\r\n displayName: 'SQLite',\r\n priority: 100,\r\n detect: detectExpoSqlite,\r\n create: (database) =>\r\n createExpoSqliteAdapter({\r\n database: database as ExpoSqliteDatabase,\r\n name: (database as ExpoSqliteDatabase).databasePath,\r\n }),\r\n};\r\n\r\nexport function registerSqliteAdapter(): void {\r\n getAdapterRegistry().register(sqliteAdapterDefinition);\r\n}\r\n","import { registerSqliteAdapter } from '../adapters/sqlite/register';\r\n\r\nexport async function registerBuiltInAdapters(): Promise<void> {\r\n registerSqliteAdapter();\r\n}\r\n","import type { DatabaseAdapter } from '../types/adapter';\r\nimport { AdapterResolutionError } from './errors';\r\nimport { getAdapterRegistry } from './registry';\r\nimport { registerBuiltInAdapters } from './registerBuiltins';\r\nimport type { ResolveAdapterOptions } from './types';\r\n\r\nexport async function resolveAdapter(\r\n database: unknown,\r\n options: ResolveAdapterOptions = {},\r\n): Promise<DatabaseAdapter> {\r\n if (options.adapter) {\r\n return options.adapter;\r\n }\r\n\r\n if (!database) {\r\n throw new AdapterResolutionError([], 'adapter');\r\n }\r\n\r\n await registerBuiltInAdapters();\r\n\r\n const registry = getAdapterRegistry();\r\n\r\n if (options.type) {\r\n const definition = registry.get(options.type);\r\n\r\n if (!definition) {\r\n throw new AdapterResolutionError(registry.listSupported(), 'type');\r\n }\r\n\r\n return definition.create(database);\r\n }\r\n\r\n const detected = registry.detect(database);\r\n\r\n if (!detected) {\r\n throw new AdapterResolutionError(\r\n registry.listSupported(),\r\n registry.listSupported().length === 0 ? 'install-package' : 'type',\r\n );\r\n }\r\n\r\n return detected.create(database);\r\n}\r\n","import type { DatabaseKind } from '../types/kind';\r\nimport type { DatabaseInspector, InspectorDefinition } from './types';\r\n\r\nexport class InspectorRegistry {\r\n private readonly definitions = new Map<string, InspectorDefinition>();\r\n\r\n register(definition: InspectorDefinition): void {\r\n this.definitions.set(definition.kind, definition);\r\n }\r\n\r\n get(kind: DatabaseKind): InspectorDefinition | undefined {\r\n return this.definitions.get(kind);\r\n }\r\n\r\n listSupported(): { kind: string; displayName: string }[] {\r\n return [...this.definitions.values()]\r\n .sort((left, right) => left.displayName.localeCompare(right.displayName))\r\n .map((definition) => ({\r\n kind: definition.kind,\r\n displayName: definition.displayName,\r\n }));\r\n }\r\n\r\n detectFromBytes(bytes: ArrayBuffer): InspectorDefinition | undefined {\r\n return [...this.definitions.values()].find((definition) => definition.canOpenBytes?.(bytes));\r\n }\r\n\r\n detectFromSnapshot(input: { kind: DatabaseKind; mimeType: string }): InspectorDefinition | undefined {\r\n const byKind = this.definitions.get(input.kind);\r\n\r\n if (byKind) {\r\n return byKind;\r\n }\r\n\r\n return [...this.definitions.values()].find((definition) =>\r\n definition.mimeTypes.includes(input.mimeType),\r\n );\r\n }\r\n}\r\n\r\nlet globalInspectorRegistry: InspectorRegistry | null = null;\r\n\r\nexport function getInspectorRegistry(): InspectorRegistry {\r\n if (!globalInspectorRegistry) {\r\n globalInspectorRegistry = new InspectorRegistry();\r\n }\r\n\r\n return globalInspectorRegistry;\r\n}\r\n\r\nexport function resetInspectorRegistry(): void {\r\n globalInspectorRegistry = null;\r\n}\r\n\r\nexport async function createInspectorForSnapshot(input: {\r\n kind: DatabaseKind;\r\n mimeType: string;\r\n bytes: ArrayBuffer;\r\n}): Promise<DatabaseInspector> {\r\n const registry = getInspectorRegistry();\r\n const definition =\r\n registry.get(input.kind) ??\r\n registry.detectFromBytes(input.bytes) ??\r\n registry.detectFromSnapshot(input);\r\n\r\n if (!definition) {\r\n throw new Error(`No inspector registered for database kind \"${input.kind}\"`);\r\n }\r\n\r\n const inspector = await definition.createInspector();\r\n await inspector.open(input.bytes);\r\n return inspector;\r\n}\r\n","export function generateConnectionId(): string {\r\n return generateUniqueId('conn');\r\n}\r\n\r\nexport function generateDeviceId(): string {\r\n return generateUniqueId('device');\r\n}\r\n\r\nexport function generatePingId(): string {\r\n return generateUniqueId('ping');\r\n}\r\n\r\nexport function generateSyncId(): string {\r\n return generateUniqueId('sync');\r\n}\r\n\r\nexport function generateTransactionId(): string {\r\n return generateUniqueId('txn');\r\n}\r\n\r\nexport function generateWriteId(): string {\r\n return generateUniqueId('write');\r\n}\r\n\r\nfunction generateUniqueId(prefix: string): string {\r\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\r\n return `${prefix}-${crypto.randomUUID()}`;\r\n }\r\n\r\n const random = Math.random().toString(36).slice(2, 10);\r\n return `${prefix}-${Date.now()}-${random}`;\r\n}\r\n","export type ReconnectOptions = {\n baseMs?: number;\n maxMs?: number;\n jitterMs?: number;\n};\n\nconst DEFAULT_BASE_MS = 1_000;\nconst DEFAULT_MAX_MS = 30_000;\nconst DEFAULT_JITTER_MS = 500;\n\nexport function calculateBackoffDelay(attempt: number, options: ReconnectOptions = {}): number {\n const baseMs = options.baseMs ?? DEFAULT_BASE_MS;\n const maxMs = options.maxMs ?? DEFAULT_MAX_MS;\n const jitterMs = options.jitterMs ?? DEFAULT_JITTER_MS;\n\n const exponential = baseMs * 2 ** attempt;\n const capped = Math.min(exponential, maxMs);\n const jitter = Math.floor(Math.random() * jitterMs);\n\n return capped + jitter;\n}\n\nexport type ReconnectSchedulerOptions = ReconnectOptions & {\n onReconnect: () => void;\n};\n\nexport class ReconnectScheduler {\n private attempt = 0;\n private timer: ReturnType<typeof setTimeout> | null = null;\n private readonly onReconnect: () => void;\n private readonly options: ReconnectOptions;\n\n constructor({ onReconnect, ...options }: ReconnectSchedulerOptions) {\n this.onReconnect = onReconnect;\n this.options = options;\n }\n\n schedule(): void {\n if (this.timer !== null) {\n return;\n }\n\n const delay = calculateBackoffDelay(this.attempt, this.options);\n this.attempt += 1;\n\n this.timer = setTimeout(() => {\n this.timer = null;\n this.onReconnect();\n }, delay);\n }\n\n reset(): void {\n this.attempt = 0;\n this.cancel();\n }\n\n cancel(): void {\n if (this.timer !== null) {\n clearTimeout(this.timer);\n this.timer = null;\n }\n }\n}\n","import {\r\n buildDevToolsWsUrl,\r\n DEFAULT_DEVTOOLS_PORT,\r\n DevToolsRole,\r\n isBeginTransactionMessage,\r\n isCommitTransactionMessage,\r\n isDeviceStatusMessage,\r\n isExecuteWriteMessage,\r\n isExportSnapshotErrorMessage,\r\n isPingMessage,\r\n isRefreshErrorMessage,\r\n isRefreshStatusMessage,\r\n isRollbackTransactionMessage,\r\n isSnapshotReadyMessage,\r\n isSnapshotUploadRequestedMessage,\r\n isTransactionStatusMessage,\r\n isWriteErrorMessage,\r\n isWriteResultMessage,\r\n MessageType,\r\n type ClientMessage,\r\n type DeviceMetadata,\r\n type DeviceStatusPayload,\r\n type ExportSnapshotErrorMessage,\r\n type PongMessage,\r\n type RefreshErrorMessage,\r\n type RefreshRequestMessage,\r\n type RefreshStatusMessage,\r\n type RegisterMessage,\r\n type SnapshotReadyMessage,\r\n type SnapshotUploadRequestedMessage,\r\n type TransactionAckMessage,\r\n type TransactionStatusMessage,\r\n type WriteAckMessage,\r\n type WriteErrorMessage,\r\n type WriteResultMessage,\r\n} from '../types/protocol';\r\nimport type { WriteOperation } from '../types/write';\r\nimport { generateDeviceId, generateTransactionId, generateWriteId } from '../utils/ids';\r\nimport { ReconnectScheduler } from '../utils/reconnect';\r\n\r\nexport type ConnectionState = 'connecting' | 'connected' | 'reconnecting' | 'disconnected';\r\n\r\nexport type TransactionState = 'idle' | 'opening' | 'open' | 'committing' | 'rolling_back';\r\n\r\nexport type DevToolsClientOptions = {\r\n serverUrl?: string;\r\n role?: DevToolsRole;\r\n deviceId?: string;\r\n metadata?: DeviceMetadata;\r\n WebSocketImpl?: typeof WebSocket;\r\n onConnect?: () => void;\r\n onDisconnect?: () => void;\r\n onConnectionStateChange?: (state: ConnectionState) => void;\r\n onDeviceStatus?: (status: DeviceStatusPayload) => void;\r\n onSnapshotUploadRequested?: (message: SnapshotUploadRequestedMessage) => void;\r\n onExportSnapshotError?: (message: ExportSnapshotErrorMessage) => void;\r\n onRefreshStatus?: (message: RefreshStatusMessage) => void;\r\n onSnapshotReady?: (message: SnapshotReadyMessage) => void;\r\n onRefreshError?: (message: RefreshErrorMessage) => void;\r\n onBeginTransaction?: (message: import('../types/protocol').BeginTransactionMessage) => void;\r\n onCommitTransaction?: (message: import('../types/protocol').CommitTransactionMessage) => void;\r\n onRollbackTransaction?: (message: import('../types/protocol').RollbackTransactionMessage) => void;\r\n onExecuteWrite?: (message: import('../types/protocol').ExecuteWriteMessage) => void;\r\n onTransactionStatus?: (message: TransactionStatusMessage) => void;\r\n onWriteResult?: (message: WriteResultMessage) => void;\r\n onWriteError?: (message: WriteErrorMessage) => void;\r\n onTransactionStateChange?: (state: TransactionState) => void;\r\n onError?: (error: Error) => void;\r\n};\r\n\r\nexport type DevToolsClient = {\r\n connect: () => void;\r\n disconnect: () => void;\r\n getConnectionState: () => ConnectionState;\r\n getLastConnectionError: () => string | null;\r\n getDeviceStatus: () => DeviceStatusPayload | null;\r\n getDeviceId: () => string | undefined;\r\n getServerUrl: () => string;\r\n setServerUrl: (url: string) => void;\r\n send: (message: ClientMessageInput) => void;\r\n requestRefresh: (deviceId: string) => void;\r\n requestExportSnapshot: () => void;\r\n sendTransactionAck: (message: Omit<TransactionAckMessage, 'timestamp' | 'type'>) => void;\r\n sendWriteAck: (message: Omit<WriteAckMessage, 'timestamp' | 'type'>) => void;\r\n beginTransaction: (deviceId: string) => Promise<void>;\r\n commitTransaction: () => Promise<void>;\r\n rollbackTransaction: () => Promise<void>;\r\n executeWrite: (operation: WriteOperation) => Promise<{ rowsAffected: number }>;\r\n getTransactionState: () => TransactionState;\r\n getActiveTransactionId: () => string | null;\r\n};\r\n\r\ntype ClientMessageInput =\r\n | Omit<RegisterMessage, 'timestamp'>\r\n | Omit<PongMessage, 'timestamp'>\r\n | Omit<RefreshRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').ExportSnapshotRequestMessage, 'timestamp'>\r\n | Omit<TransactionAckMessage, 'timestamp'>\r\n | Omit<WriteAckMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').BeginTransactionRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').CommitTransactionRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').RollbackTransactionRequestMessage, 'timestamp'>\r\n | Omit<import('../types/protocol').WriteRequestMessage, 'timestamp'>;\r\n\r\nconst WRITE_TIMEOUT_MS = 30_000;\r\n\r\nexport function createDevToolsClient(options: DevToolsClientOptions = {}): DevToolsClient {\r\n const role = options.role ?? DevToolsRole.MOBILE;\r\n const WebSocketImpl = options.WebSocketImpl ?? globalThis.WebSocket;\r\n\r\n if (!WebSocketImpl) {\r\n throw new Error('WebSocket is not available in this environment.');\r\n }\r\n\r\n let socket: InstanceType<typeof WebSocketImpl> | null = null;\r\n let deviceStatus: DeviceStatusPayload | null = null;\r\n let connectionState: ConnectionState = 'disconnected';\r\n let lastConnectionError: string | null = null;\r\n let intentionalDisconnect = false;\r\n let transactionState: TransactionState = 'idle';\r\n let activeTransactionId: string | null = null;\r\n let activeDeviceId: string | null = null;\r\n\r\n const pendingTransaction = new Map<\r\n string,\r\n { resolve: () => void; reject: (error: Error) => void; action: 'begin' | 'commit' | 'rollback' }\r\n >();\r\n const pendingWrites = new Map<\r\n string,\r\n { resolve: (result: { rowsAffected: number }) => void; reject: (error: Error) => void }\r\n >();\r\n\r\n const deviceId =\r\n role === DevToolsRole.MOBILE ? (options.deviceId ?? generateDeviceId()) : undefined;\r\n\r\n let wsUrl =\r\n options.serverUrl ?? buildDevToolsWsUrl('localhost', DEFAULT_DEVTOOLS_PORT);\r\n\r\n const setConnectionState = (state: ConnectionState): void => {\r\n if (connectionState === state) {\r\n return;\r\n }\r\n\r\n connectionState = state;\r\n options.onConnectionStateChange?.(state);\r\n };\r\n\r\n const setTransactionState = (state: TransactionState): void => {\r\n if (transactionState === state) {\r\n return;\r\n }\r\n\r\n transactionState = state;\r\n options.onTransactionStateChange?.(state);\r\n };\r\n\r\n const resetTransaction = (): void => {\r\n setTransactionState('idle');\r\n activeTransactionId = null;\r\n activeDeviceId = null;\r\n };\r\n\r\n const rejectPendingTransaction = (transactionId: string, error: Error): void => {\r\n const pending = pendingTransaction.get(transactionId);\r\n\r\n if (pending) {\r\n pending.reject(error);\r\n pendingTransaction.delete(transactionId);\r\n }\r\n };\r\n\r\n const rejectAllPending = (error: Error): void => {\r\n for (const [id, pending] of pendingTransaction) {\r\n pending.reject(error);\r\n pendingTransaction.delete(id);\r\n }\r\n\r\n for (const [id, pending] of pendingWrites) {\r\n pending.reject(error);\r\n pendingWrites.delete(id);\r\n }\r\n\r\n resetTransaction();\r\n };\r\n\r\n const reconnectScheduler = new ReconnectScheduler({\r\n onReconnect: () => {\r\n openSocket();\r\n },\r\n });\r\n\r\n const send = (message: ClientMessageInput): void => {\r\n if (!socket || socket.readyState !== WebSocketImpl.OPEN) {\r\n return;\r\n }\r\n\r\n socket.send(JSON.stringify({ ...message, timestamp: Date.now() }));\r\n };\r\n\r\n const sendRegister = (): void => {\r\n send({\r\n type: MessageType.REGISTER,\r\n role,\r\n ...(deviceId ? { deviceId } : {}),\r\n ...(options.metadata ? { metadata: options.metadata } : {}),\r\n });\r\n };\r\n\r\n const handleServerMessage = (parsed: unknown): void => {\r\n if (isPingMessage(parsed)) {\r\n send({\r\n type: MessageType.PONG,\r\n pingId: parsed.pingId,\r\n });\r\n return;\r\n }\r\n\r\n if (isDeviceStatusMessage(parsed)) {\r\n deviceStatus = parsed.payload;\r\n options.onDeviceStatus?.(parsed.payload);\r\n return;\r\n }\r\n\r\n if (isSnapshotUploadRequestedMessage(parsed)) {\r\n options.onSnapshotUploadRequested?.(parsed);\r\n return;\r\n }\r\n\r\n if (isExportSnapshotErrorMessage(parsed)) {\r\n options.onExportSnapshotError?.(parsed);\r\n return;\r\n }\r\n\r\n if (isRefreshStatusMessage(parsed)) {\r\n options.onRefreshStatus?.(parsed);\r\n return;\r\n }\r\n\r\n if (isSnapshotReadyMessage(parsed)) {\r\n options.onSnapshotReady?.(parsed);\r\n return;\r\n }\r\n\r\n if (isRefreshErrorMessage(parsed)) {\r\n options.onRefreshError?.(parsed);\r\n return;\r\n }\r\n\r\n if (isBeginTransactionMessage(parsed)) {\r\n options.onBeginTransaction?.(parsed);\r\n return;\r\n }\r\n\r\n if (isCommitTransactionMessage(parsed)) {\r\n options.onCommitTransaction?.(parsed);\r\n return;\r\n }\r\n\r\n if (isRollbackTransactionMessage(parsed)) {\r\n options.onRollbackTransaction?.(parsed);\r\n return;\r\n }\r\n\r\n if (isExecuteWriteMessage(parsed)) {\r\n options.onExecuteWrite?.(parsed);\r\n return;\r\n }\r\n\r\n if (isTransactionStatusMessage(parsed)) {\r\n options.onTransactionStatus?.(parsed);\r\n\r\n if (role !== DevToolsRole.BROWSER) {\r\n return;\r\n }\r\n\r\n const pending = pendingTransaction.get(parsed.transactionId);\r\n\r\n if (parsed.state === 'open' && pending?.action === 'begin') {\r\n setTransactionState('open');\r\n activeTransactionId = parsed.transactionId;\r\n activeDeviceId = parsed.deviceId;\r\n pending.resolve();\r\n pendingTransaction.delete(parsed.transactionId);\r\n return;\r\n }\r\n\r\n if (parsed.state === 'idle' && pending && (pending.action === 'commit' || pending.action === 'rollback')) {\r\n resetTransaction();\r\n pending.resolve();\r\n pendingTransaction.delete(parsed.transactionId);\r\n return;\r\n }\r\n\r\n if (parsed.state === 'failed') {\r\n rejectPendingTransaction(\r\n parsed.transactionId,\r\n new Error(parsed.message ?? 'Transaction failed'),\r\n );\r\n resetTransaction();\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (isWriteResultMessage(parsed)) {\r\n options.onWriteResult?.(parsed);\r\n\r\n const pending = pendingWrites.get(parsed.writeId);\r\n\r\n if (pending) {\r\n pending.resolve({ rowsAffected: parsed.rowsAffected });\r\n pendingWrites.delete(parsed.writeId);\r\n }\r\n\r\n return;\r\n }\r\n\r\n if (isWriteErrorMessage(parsed)) {\r\n options.onWriteError?.(parsed);\r\n\r\n const error = new Error(parsed.message);\r\n\r\n if (parsed.writeId) {\r\n const pendingWrite = pendingWrites.get(parsed.writeId);\r\n\r\n if (pendingWrite) {\r\n pendingWrite.reject(error);\r\n pendingWrites.delete(parsed.writeId);\r\n }\r\n } else {\r\n rejectPendingTransaction(parsed.transactionId, error);\r\n resetTransaction();\r\n }\r\n }\r\n };\r\n\r\n const openSocket = (): void => {\r\n if (\r\n socket &&\r\n (socket.readyState === WebSocketImpl.OPEN || socket.readyState === WebSocketImpl.CONNECTING)\r\n ) {\r\n return;\r\n }\r\n\r\n setConnectionState(intentionalDisconnect ? 'disconnected' : connectionState === 'disconnected' ? 'connecting' : 'reconnecting');\r\n\r\n socket = new WebSocketImpl(wsUrl);\r\n\r\n socket.addEventListener('open', () => {\r\n reconnectScheduler.reset();\r\n lastConnectionError = null;\r\n setConnectionState('connected');\r\n options.onConnect?.();\r\n sendRegister();\r\n });\r\n\r\n socket.addEventListener('message', (event) => {\r\n let parsed: unknown;\r\n\r\n try {\r\n parsed = JSON.parse(String(event.data));\r\n } catch {\r\n return;\r\n }\r\n\r\n handleServerMessage(parsed);\r\n });\r\n\r\n socket.addEventListener('close', () => {\r\n socket = null;\r\n options.onDisconnect?.();\r\n rejectAllPending(new Error('Disconnected from DevTools hub'));\r\n\r\n if (intentionalDisconnect) {\r\n setConnectionState('disconnected');\r\n return;\r\n }\r\n\r\n setConnectionState('reconnecting');\r\n reconnectScheduler.schedule();\r\n });\r\n\r\n socket.addEventListener('error', () => {\r\n const error = new Error(`WebSocket connection failed: ${wsUrl}`);\r\n lastConnectionError = error.message;\r\n options.onError?.(error);\r\n });\r\n };\r\n\r\n const connect = (): void => {\r\n intentionalDisconnect = false;\r\n openSocket();\r\n };\r\n\r\n const disconnect = (): void => {\r\n intentionalDisconnect = true;\r\n reconnectScheduler.cancel();\r\n socket?.close();\r\n socket = null;\r\n rejectAllPending(new Error('Disconnected'));\r\n setConnectionState('disconnected');\r\n };\r\n\r\n const setServerUrl = (url: string): void => {\r\n wsUrl = url;\r\n const wasConnected =\r\n connectionState === 'connected' ||\r\n connectionState === 'connecting' ||\r\n connectionState === 'reconnecting';\r\n\r\n disconnect();\r\n intentionalDisconnect = false;\r\n\r\n if (wasConnected) {\r\n connect();\r\n }\r\n };\r\n\r\n const requestRefresh = (targetDeviceId: string): void => {\r\n send({\r\n type: MessageType.REFRESH_REQUEST,\r\n deviceId: targetDeviceId,\r\n refreshType: 'snapshot',\r\n });\r\n };\r\n\r\n const requestExportSnapshot = (): void => {\r\n send({\r\n type: MessageType.EXPORT_SNAPSHOT_REQUEST,\r\n refreshType: 'snapshot',\r\n });\r\n };\r\n\r\n const sendTransactionAck = (message: Omit<TransactionAckMessage, 'timestamp' | 'type'>): void => {\r\n send({\r\n type: MessageType.TRANSACTION_ACK,\r\n ...message,\r\n });\r\n };\r\n\r\n const sendWriteAck = (message: Omit<WriteAckMessage, 'timestamp' | 'type'>): void => {\r\n send({\r\n type: MessageType.WRITE_ACK,\r\n ...message,\r\n });\r\n };\r\n\r\n const waitForTransaction = (\r\n transactionId: string,\r\n action: 'begin' | 'commit' | 'rollback',\r\n ): Promise<void> => {\r\n return new Promise((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n pendingTransaction.delete(transactionId);\r\n reject(new Error(`Transaction ${action} timed out`));\r\n }, WRITE_TIMEOUT_MS);\r\n\r\n pendingTransaction.set(transactionId, {\r\n action,\r\n resolve: () => {\r\n clearTimeout(timer);\r\n resolve();\r\n },\r\n reject: (error) => {\r\n clearTimeout(timer);\r\n reject(error);\r\n },\r\n });\r\n });\r\n };\r\n\r\n const beginTransaction = async (targetDeviceId: string): Promise<void> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('beginTransaction is only available for browser clients');\r\n }\r\n\r\n if (transactionState !== 'idle') {\r\n throw new Error('A transaction is already active');\r\n }\r\n\r\n const transactionId = generateTransactionId();\r\n setTransactionState('opening');\r\n activeTransactionId = transactionId;\r\n activeDeviceId = targetDeviceId;\r\n\r\n const promise = waitForTransaction(transactionId, 'begin');\r\n\r\n send({\r\n type: MessageType.BEGIN_TRANSACTION_REQUEST,\r\n transactionId,\r\n deviceId: targetDeviceId,\r\n });\r\n\r\n await promise;\r\n };\r\n\r\n const commitTransaction = async (): Promise<void> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('commitTransaction is only available for browser clients');\r\n }\r\n\r\n if (!activeTransactionId || !activeDeviceId || transactionState !== 'open') {\r\n throw new Error('No open transaction');\r\n }\r\n\r\n const transactionId = activeTransactionId;\r\n const deviceIdForCommit = activeDeviceId;\r\n setTransactionState('committing');\r\n\r\n const promise = waitForTransaction(transactionId, 'commit');\r\n\r\n send({\r\n type: MessageType.COMMIT_TRANSACTION_REQUEST,\r\n transactionId,\r\n deviceId: deviceIdForCommit,\r\n });\r\n\r\n await promise;\r\n };\r\n\r\n const rollbackTransaction = async (): Promise<void> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('rollbackTransaction is only available for browser clients');\r\n }\r\n\r\n if (!activeTransactionId || !activeDeviceId) {\r\n throw new Error('No active transaction');\r\n }\r\n\r\n const transactionId = activeTransactionId;\r\n const deviceIdForRollback = activeDeviceId;\r\n setTransactionState('rolling_back');\r\n\r\n const promise = waitForTransaction(transactionId, 'rollback');\r\n\r\n send({\r\n type: MessageType.ROLLBACK_TRANSACTION_REQUEST,\r\n transactionId,\r\n deviceId: deviceIdForRollback,\r\n });\r\n\r\n await promise;\r\n };\r\n\r\n const executeWrite = async (operation: WriteOperation): Promise<{ rowsAffected: number }> => {\r\n if (role !== DevToolsRole.BROWSER) {\r\n throw new Error('executeWrite is only available for browser clients');\r\n }\r\n\r\n if (!activeTransactionId || !activeDeviceId || transactionState !== 'open') {\r\n throw new Error('No open transaction');\r\n }\r\n\r\n const writeId = generateWriteId();\r\n\r\n const promise = new Promise<{ rowsAffected: number }>((resolve, reject) => {\r\n const timer = setTimeout(() => {\r\n pendingWrites.delete(writeId);\r\n reject(new Error('Write operation timed out'));\r\n }, WRITE_TIMEOUT_MS);\r\n\r\n pendingWrites.set(writeId, {\r\n resolve: (result) => {\r\n clearTimeout(timer);\r\n resolve(result);\r\n },\r\n reject: (error) => {\r\n clearTimeout(timer);\r\n reject(error);\r\n },\r\n });\r\n });\r\n\r\n send({\r\n type: MessageType.WRITE_REQUEST,\r\n writeId,\r\n transactionId: activeTransactionId,\r\n deviceId: activeDeviceId,\r\n operation,\r\n });\r\n\r\n return promise;\r\n };\r\n\r\n return {\r\n connect,\r\n disconnect,\r\n getConnectionState: () => connectionState,\r\n getLastConnectionError: () => lastConnectionError,\r\n getDeviceStatus: () => deviceStatus,\r\n getDeviceId: () => deviceId,\r\n getServerUrl: () => wsUrl,\r\n setServerUrl,\r\n send,\r\n requestRefresh,\r\n requestExportSnapshot,\r\n sendTransactionAck,\r\n sendWriteAck,\r\n beginTransaction,\r\n commitTransaction,\r\n rollbackTransaction,\r\n executeWrite,\r\n getTransactionState: () => transactionState,\r\n getActiveTransactionId: () => activeTransactionId,\r\n };\r\n}\r\n","export async function fetchSnapshot(downloadUrl: string): Promise<ArrayBuffer> {\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(downloadUrl);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(\r\n `Network error fetching snapshot from ${downloadUrl}. ${networkMessage} If the web UI runs on a different port than the hub, ensure CORS is enabled on the hub HTTP API.`,\r\n );\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch snapshot from ${downloadUrl}: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n\r\n return response.arrayBuffer();\r\n}\r\n","import {\r\n PROJECT_DEVICE_EXPORTS_API_PATH,\r\n wsUrlToHttpUrl,\r\n} from '../types/protocol';\r\nimport type { ResolveProjectDatabaseUrlOptions } from './resolveProjectDatabaseUrl';\r\n\r\nfunction resolveApiBase(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string {\r\n if (options?.useSameOriginApi && typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n\r\n if (serverUrl.startsWith('ws://') || serverUrl.startsWith('wss://')) {\r\n return wsUrlToHttpUrl(serverUrl);\r\n }\r\n\r\n return serverUrl.replace(/\\/$/, '');\r\n}\r\n\r\nexport function resolveDeviceExportDatabaseUrl(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n const base = resolveApiBase(serverUrl, options);\r\n return `${base}${PROJECT_DEVICE_EXPORTS_API_PATH}/${encodeURIComponent(deviceId)}/database`;\r\n}\r\n\r\nexport function resolveDeviceExportDatabaseMetaUrl(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n const base = resolveApiBase(serverUrl, options);\r\n return `${base}${PROJECT_DEVICE_EXPORTS_API_PATH}/${encodeURIComponent(deviceId)}/database/meta`;\r\n}\r\n\r\nexport function resolveDeviceExportsUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n const base = resolveApiBase(serverUrl, options);\r\n return `${base}${PROJECT_DEVICE_EXPORTS_API_PATH}`;\r\n}\r\n","import { fetchSnapshot } from './fetchSnapshot';\r\nimport type { ListedProjectDatabase, ProjectDatabaseMeta } from './projectDatabase';\r\nimport {\r\n resolveDeviceExportDatabaseMetaUrl,\r\n resolveDeviceExportDatabaseUrl,\r\n resolveDeviceExportsUrl,\r\n} from './resolveDeviceDatabaseUrl';\r\nimport type { ResolveProjectDatabaseUrlOptions } from './resolveProjectDatabaseUrl';\r\n\r\nexport type DeviceExportMeta = ProjectDatabaseMeta;\r\nexport type ListedDeviceExport = ListedProjectDatabase;\r\n\r\nasync function fetchJson<T>(url: string, errorLabel: string): Promise<T> {\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Network error fetching ${errorLabel} from ${url}. ${networkMessage}`);\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(`Failed to fetch ${errorLabel} from ${url}: ${response.status} ${response.statusText}`);\r\n }\r\n\r\n return (await response.json()) as T;\r\n}\r\n\r\nexport async function fetchDeviceExportMeta(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<DeviceExportMeta> {\r\n const url = resolveDeviceExportDatabaseMetaUrl(serverUrl, deviceId, options);\r\n return fetchJson<DeviceExportMeta>(url, 'device export metadata');\r\n}\r\n\r\nexport async function fetchDeviceExportDatabase(\r\n serverUrl: string,\r\n deviceId: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ArrayBuffer> {\r\n const url = resolveDeviceExportDatabaseUrl(serverUrl, deviceId, options);\r\n return fetchSnapshot(url);\r\n}\r\n\r\nexport async function fetchDeviceExports(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ListedDeviceExport[]> {\r\n const url = resolveDeviceExportsUrl(serverUrl, options);\r\n const payload = await fetchJson<{ devices?: ListedDeviceExport[] }>(url, 'device exports');\r\n return payload.devices ?? [];\r\n}\r\n","import {\r\n PROJECT_DATABASE_API_PATH,\r\n PROJECT_DATABASE_META_API_PATH,\r\n PROJECT_DATABASES_API_PATH,\r\n wsUrlToHttpUrl,\r\n} from '../types/protocol';\r\n\r\nexport type ResolveProjectDatabaseUrlOptions = {\r\n useSameOriginApi?: boolean;\r\n};\r\n\r\nfunction resolveApiBase(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string {\r\n if (options?.useSameOriginApi && typeof window !== 'undefined') {\r\n return window.location.origin;\r\n }\r\n\r\n if (serverUrl.startsWith('ws://') || serverUrl.startsWith('wss://')) {\r\n return wsUrlToHttpUrl(serverUrl);\r\n }\r\n\r\n return serverUrl.replace(/\\/$/, '');\r\n}\r\n\r\nexport function resolveProjectDatabaseUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n return `${resolveApiBase(serverUrl, options)}${PROJECT_DATABASE_API_PATH}`;\r\n}\r\n\r\nexport function resolveProjectDatabaseMetaUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n return `${resolveApiBase(serverUrl, options)}${PROJECT_DATABASE_META_API_PATH}`;\r\n}\r\n\r\nexport function resolveProjectDatabasesUrl(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): string {\r\n return `${resolveApiBase(serverUrl, options)}${PROJECT_DATABASES_API_PATH}`;\r\n}\r\n","import { fetchSnapshot } from './fetchSnapshot';\r\nimport {\r\n resolveProjectDatabaseMetaUrl,\r\n resolveProjectDatabaseUrl,\r\n resolveProjectDatabasesUrl,\r\n type ResolveProjectDatabaseUrlOptions,\r\n} from './resolveProjectDatabaseUrl';\r\n\r\nexport type ProjectDatabaseMeta = {\r\n exists: boolean;\r\n relativePath?: string;\r\n absolutePath?: string;\r\n kind?: string;\r\n mimeType?: string;\r\n databaseName?: string;\r\n size?: number;\r\n updatedAt?: number;\r\n source?: 'active' | 'device';\r\n deviceId?: string;\r\n};\r\n\r\nexport type ListedProjectDatabase = {\r\n id: string;\r\n label: string;\r\n relativePath: string;\r\n source: 'active' | 'device';\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n databaseName?: string;\r\n size: number;\r\n updatedAt: number;\r\n};\r\n\r\n/** @deprecated Use device-scoped `fetchDeviceExportMeta` instead. Proxies to the newest device export. */\r\nexport async function fetchProjectDatabaseMeta(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ProjectDatabaseMeta> {\r\n const url = resolveProjectDatabaseMetaUrl(serverUrl, options);\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Network error fetching project database metadata from ${url}. ${networkMessage}`);\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch project database metadata from ${url}: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n\r\n return (await response.json()) as ProjectDatabaseMeta;\r\n}\r\n\r\n/** @deprecated Use device-scoped `fetchDeviceExportDatabase` instead. Proxies to the newest device export. */\r\nexport async function fetchProjectDatabase(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ArrayBuffer> {\r\n const url = resolveProjectDatabaseUrl(serverUrl, options);\r\n return fetchSnapshot(url);\r\n}\r\n\r\n/** @deprecated Use `fetchDeviceExports` instead. */\r\nexport async function fetchProjectDatabases(\r\n serverUrl: string,\r\n options?: ResolveProjectDatabaseUrlOptions,\r\n): Promise<ListedProjectDatabase[]> {\r\n const url = resolveProjectDatabasesUrl(serverUrl, options);\r\n let response: Response;\r\n\r\n try {\r\n response = await fetch(url);\r\n } catch (error) {\r\n const networkMessage = error instanceof Error ? error.message : String(error);\r\n throw new Error(`Network error fetching project databases from ${url}. ${networkMessage}`);\r\n }\r\n\r\n if (!response.ok) {\r\n throw new Error(\r\n `Failed to fetch project databases from ${url}: ${response.status} ${response.statusText}`,\r\n );\r\n }\r\n\r\n const payload = (await response.json()) as { databases?: ListedProjectDatabase[] };\r\n return payload.databases ?? [];\r\n}\r\n","import { wsUrlToHttpUrl } from '../types/protocol';\r\n\r\n/**\r\n * React Native fetch does not support `new Blob([ArrayBuffer])`.\r\n * Pass the Uint8Array directly as the request body.\r\n */\r\nexport function createSnapshotUploadBody(bytes: Uint8Array): Uint8Array {\r\n return bytes;\r\n}\r\n\r\n/**\r\n * The hub advertises snapshot URLs using its bind address (often localhost).\r\n * Mobile clients reach the hub via a different host (10.0.2.2, LAN IP, etc.).\r\n * Rewrite the upload URL to match the WebSocket hub URL the device already uses.\r\n */\r\nexport function resolveSnapshotUploadUrl(uploadUrl: string, hubWsUrl: string): string {\r\n const hubHttpBase = wsUrlToHttpUrl(hubWsUrl);\r\n const target = new URL(uploadUrl);\r\n const hub = new URL(hubHttpBase.endsWith('/') ? hubHttpBase : `${hubHttpBase}/`);\r\n\r\n target.protocol = hub.protocol;\r\n target.hostname = hub.hostname;\r\n target.port = hub.port;\r\n\r\n return target.toString();\r\n}\r\n\r\nexport type UploadSnapshotOptions = {\r\n kind: string;\r\n mimeType: string;\r\n kindHeader: string;\r\n mimeHeader: string;\r\n databaseName?: string;\r\n nameHeader?: string;\r\n};\r\n\r\nexport async function uploadSnapshot(\r\n uploadUrl: string,\r\n bytes: Uint8Array,\r\n options: UploadSnapshotOptions,\r\n): Promise<void> {\r\n const headers: Record<string, string> = {\r\n 'Content-Type': 'application/octet-stream',\r\n [options.kindHeader]: options.kind,\r\n [options.mimeHeader]: options.mimeType,\r\n };\r\n\r\n if (options.databaseName && options.nameHeader) {\r\n headers[options.nameHeader] = options.databaseName;\r\n }\r\n\r\n const response = await fetch(uploadUrl, {\r\n method: 'POST',\r\n headers,\r\n body: createSnapshotUploadBody(bytes) as BodyInit,\r\n });\r\n\r\n if (!response.ok) {\r\n throw new Error(`Upload failed with status ${response.status}`);\r\n }\r\n}\r\n","import type { DatabaseAdapter } from '../types/adapter';\r\nimport {\r\n buildDeviceSnapshotUrl,\r\n wsUrlToHttpUrl,\r\n type SnapshotUploadRequestedMessage,\r\n} from '../types/protocol';\r\nimport { SNAPSHOT_KIND_HEADER, SNAPSHOT_MIME_HEADER, SNAPSHOT_NAME_HEADER } from '../types/snapshot';\r\nimport { uploadSnapshot } from './snapshotUpload';\r\n\r\nexport type HandleDeviceSnapshotOptions = {\r\n /** WebSocket URL of the connected hub — used to build the upload URL on mobile. */\r\n hubServerUrl?: string;\r\n /** This mobile client's device ID — upload is ignored when it does not match. */\r\n deviceId?: string;\r\n};\r\n\r\nexport async function handleDeviceSnapshotUpload(\r\n database: DatabaseAdapter | undefined,\r\n message: SnapshotUploadRequestedMessage,\r\n options: HandleDeviceSnapshotOptions = {},\r\n): Promise<void> {\r\n if (options.deviceId && message.deviceId !== options.deviceId) {\r\n return;\r\n }\r\n\r\n if (!database) {\r\n throw new Error('No database adapter configured');\r\n }\r\n\r\n if (!options.hubServerUrl) {\r\n throw new Error('hubServerUrl is required to upload a device snapshot');\r\n }\r\n\r\n const snapshot = await database.exportSnapshot();\r\n const hubHttp = wsUrlToHttpUrl(options.hubServerUrl);\r\n const uploadUrl = buildDeviceSnapshotUrl(hubHttp, message.deviceId);\r\n\r\n await uploadSnapshot(uploadUrl, snapshot.bytes, {\r\n kind: snapshot.kind,\r\n mimeType: snapshot.mimeType,\r\n kindHeader: SNAPSHOT_KIND_HEADER,\r\n mimeHeader: SNAPSHOT_MIME_HEADER,\r\n databaseName: database.name,\r\n nameHeader: SNAPSHOT_NAME_HEADER,\r\n });\r\n}\r\n","import type { DatabaseAdapter } from '../types/adapter';\r\nimport { isWritableDatabaseAdapter } from '../types/adapter';\r\nimport type {\r\n BeginTransactionMessage,\r\n CommitTransactionMessage,\r\n ExecuteWriteMessage,\r\n RollbackTransactionMessage,\r\n TransactionAckMessage,\r\n WriteAckMessage,\r\n} from '../types/protocol';\r\n\r\nexport type TransactionAckReporter = (\r\n message: Omit<TransactionAckMessage, 'timestamp' | 'type'>,\r\n) => void;\r\nexport type WriteAckReporter = (message: Omit<WriteAckMessage, 'timestamp' | 'type'>) => void;\r\n\r\nexport async function handleBeginTransaction(\r\n adapter: DatabaseAdapter | undefined,\r\n message: BeginTransactionMessage,\r\n report: TransactionAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'begin',\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.beginTransaction();\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'begin',\r\n ok: true,\r\n });\r\n } catch (error) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'begin',\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Failed to begin transaction',\r\n });\r\n }\r\n}\r\n\r\nexport async function handleCommitTransaction(\r\n adapter: DatabaseAdapter | undefined,\r\n message: CommitTransactionMessage,\r\n report: TransactionAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'commit',\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.commitTransaction();\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'commit',\r\n ok: true,\r\n });\r\n } catch (error) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'commit',\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Failed to commit transaction',\r\n });\r\n }\r\n}\r\n\r\nexport async function handleRollbackTransaction(\r\n adapter: DatabaseAdapter | undefined,\r\n message: RollbackTransactionMessage,\r\n report: TransactionAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'rollback',\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.rollbackTransaction();\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'rollback',\r\n ok: true,\r\n });\r\n } catch (error) {\r\n report({\r\n transactionId: message.transactionId,\r\n action: 'rollback',\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Failed to roll back transaction',\r\n });\r\n }\r\n}\r\n\r\nexport async function handleExecuteWrite(\r\n adapter: DatabaseAdapter | undefined,\r\n message: ExecuteWriteMessage,\r\n report: WriteAckReporter,\r\n): Promise<void> {\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n report({\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n ok: false,\r\n message: 'Database adapter does not support writes',\r\n });\r\n return;\r\n }\r\n\r\n try {\r\n const result = await adapter.executeWrite(message.operation);\r\n report({\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n ok: true,\r\n rowsAffected: result.rowsAffected,\r\n });\r\n } catch (error) {\r\n report({\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n ok: false,\r\n message: error instanceof Error ? error.message : 'Write operation failed',\r\n });\r\n }\r\n}\r\n","export function isDevToolsEnabled(enabled?: boolean): boolean {\n if (enabled === false) {\n return false;\n }\n\n if (enabled === true) {\n return true;\n }\n\n return typeof __DEV__ !== 'undefined' && __DEV__;\n}\n","import type { RefreshErrorCode } from '../types/protocol';\r\n\r\n/** @deprecated Use formatRefreshErrorMessage */\r\nexport function formatSyncErrorMessage(code: RefreshErrorCode, message: string): string {\r\n return formatRefreshErrorMessage(code, message);\r\n}\r\n\r\nexport function formatRefreshErrorMessage(code: RefreshErrorCode, message: string): string {\r\n switch (code) {\r\n case 'DEVICE_OFFLINE':\r\n return 'Selected device disconnected. Reconnect the mobile app and try again.';\r\n case 'REFRESH_IN_PROGRESS':\r\n return 'A refresh is already in progress for this device.';\r\n case 'EXPORT_FAILED':\r\n return `Device failed to export or upload snapshot: ${message}`;\r\n case 'UPLOAD_FAILED':\r\n return `Snapshot upload failed on the hub: ${message}`;\r\n case 'TIMEOUT':\r\n return 'Timed out waiting for the device to upload a snapshot.';\r\n case 'SNAPSHOT_NOT_FOUND':\r\n return 'Snapshot expired or was not found. Click Refresh again.';\r\n case 'INVALID_REQUEST':\r\n return `Invalid refresh request: ${message}`;\r\n default:\r\n return message;\r\n }\r\n}\r\n","import { createContext, useContext } from 'react';\r\nimport type { ConnectionState } from '../client/createDevToolsClient';\r\nimport type { DatabaseAdapter } from '../types/adapter';\r\nimport type { DeviceMetadata } from '../types/protocol';\r\nimport type { MobileDatabaseInspector } from '../mobile/types';\r\n\r\nexport type ExportState = 'idle' | 'exporting' | 'success' | 'error';\r\n\r\nexport type DevToolsContextValue = {\r\n connectionState: ConnectionState;\r\n connectionError: string | null;\r\n connectionHint: string | null;\r\n deviceId: string | undefined;\r\n serverUrl: string;\r\n metadata: DeviceMetadata;\r\n database: DatabaseAdapter | undefined;\r\n adapterError: string | null;\r\n mobileInspector: MobileDatabaseInspector | null;\r\n launcherVisible: boolean;\r\n openLauncher: () => void;\r\n closeLauncher: () => void;\r\n explorerVisible: boolean;\r\n openExplorer: () => void;\r\n closeExplorer: () => void;\r\n settingsVisible: boolean;\r\n openSettings: () => void;\r\n closeSettings: () => void;\r\n reconnect: (url: string) => void;\r\n exportState: ExportState;\r\n exportError: string | null;\r\n exportDatabase: () => Promise<void>;\r\n};\r\n\r\nexport const DevToolsContext = createContext<DevToolsContextValue | null>(null);\r\n\r\nexport function useDevTools(): DevToolsContextValue {\r\n const context = useContext(DevToolsContext);\r\n\r\n if (!context) {\r\n throw new Error('useDevTools must be used within DevToolsProvider');\r\n }\r\n\r\n return context;\r\n}\r\n","import { Platform } from 'react-native';\r\nimport Constants from 'expo-constants';\r\n\r\n/** Host loopback aliases that do not reach the dev machine from Android. */\r\nconst ANDROID_LOOPBACK_HOSTS = new Set(['localhost', '127.0.0.1', '::1']);\r\n\r\n/** Special alias from the Android emulator to the host machine. */\r\nexport const ANDROID_EMULATOR_HOST = '10.0.2.2';\r\n\r\ntype ExpoConstantsShape = {\r\n expoConfig?: { hostUri?: string };\r\n expoGoConfig?: { debuggerHost?: string };\r\n manifest2?: { extra?: { expoGo?: { debuggerHost?: string } } };\r\n manifest?: { debuggerHost?: string };\r\n};\r\n\r\nexport function isAndroidLoopbackHost(host: string): boolean {\r\n return ANDROID_LOOPBACK_HOSTS.has(host.toLowerCase());\r\n}\r\n\r\nexport function readMetroDevHostFromConstants(\r\n constants: ExpoConstantsShape | undefined,\r\n): string | undefined {\r\n const hostUri =\r\n constants?.expoConfig?.hostUri ??\r\n constants?.expoGoConfig?.debuggerHost ??\r\n constants?.manifest2?.extra?.expoGo?.debuggerHost ??\r\n constants?.manifest?.debuggerHost;\r\n\r\n if (typeof hostUri !== 'string' || hostUri.length === 0) {\r\n return undefined;\r\n }\r\n\r\n return hostUri.split(':')[0];\r\n}\r\n\r\n/**\r\n * Picks a dev-machine hostname that mobile clients can reach.\r\n * - Physical devices: Metro debugger host (LAN IP).\r\n * - Android emulator: 10.0.2.2 when Metro reports loopback.\r\n * - iOS simulator / default: localhost.\r\n */\r\nexport function resolveDevToolsHostFromInputs(\r\n platformOs: string,\r\n metroHost?: string,\r\n): string {\r\n if (platformOs === 'android') {\r\n if (metroHost && !isAndroidLoopbackHost(metroHost)) {\r\n return metroHost;\r\n }\r\n\r\n return ANDROID_EMULATOR_HOST;\r\n }\r\n\r\n if (metroHost) {\r\n return metroHost;\r\n }\r\n\r\n return 'localhost';\r\n}\r\n\r\nexport function getConnectionHintForPlatform(\r\n platformOs: string,\r\n serverUrl: string,\r\n): string | null {\r\n try {\r\n const parsed = new URL(serverUrl);\r\n const host = parsed.hostname.toLowerCase();\r\n\r\n if (platformOs === 'android' && isAndroidLoopbackHost(host)) {\r\n return `On Android, \"${host}\" refers to the device itself. Use ${ANDROID_EMULATOR_HOST} (emulator) or your PC's LAN IP (physical device).`;\r\n }\r\n\r\n if (parsed.protocol !== 'ws:' && parsed.protocol !== 'wss:') {\r\n return 'Server URL must start with ws:// or wss://';\r\n }\r\n } catch {\r\n return 'Invalid WebSocket URL.';\r\n }\r\n\r\n return null;\r\n}\r\n\r\nfunction getPlatformOs(): string {\r\n return Platform.OS;\r\n}\r\n\r\nfunction readMetroDevHostRuntime(): string | undefined {\r\n return readMetroDevHostFromConstants(Constants);\r\n}\r\n\r\nexport function readMetroDevHost(): string | undefined {\r\n return readMetroDevHostRuntime();\r\n}\r\n\r\nexport function resolveDevToolsHost(): string {\r\n return resolveDevToolsHostFromInputs(getPlatformOs(), readMetroDevHostRuntime());\r\n}\r\n\r\nexport function getConnectionHint(serverUrl: string): string | null {\r\n return getConnectionHintForPlatform(getPlatformOs(), serverUrl);\r\n}\r\n","import { Platform } from 'react-native';\nimport Constants from 'expo-constants';\nimport type { DeviceMetadata } from '../types/protocol';\n\ntype ExpoConstants = {\n expoConfig?: {\n name?: string;\n version?: string;\n ios?: { bundleIdentifier?: string };\n android?: { package?: string };\n };\n};\n\nfunction getExpoConstants(): ExpoConstants | undefined {\n return Constants;\n}\n\nexport function resolveDeviceMetadata(): DeviceMetadata {\n const constants = getExpoConstants();\n const config = constants?.expoConfig;\n\n const metadata: DeviceMetadata = {\n platform: Platform.OS,\n appName: config?.name ?? 'React Native App',\n };\n\n if (config?.version) {\n metadata.appVersion = config.version;\n }\n\n const bundleId = config?.ios?.bundleIdentifier ?? config?.android?.package;\n\n if (bundleId) {\n metadata.bundleId = bundleId;\n }\n\n return metadata;\n}\n","import { buildDevToolsWsUrl, DEFAULT_DEVTOOLS_PORT } from '../types/protocol';\r\nimport { resolveDevToolsHost } from './resolveDevToolsHost';\r\n\r\nexport function normalizeServerUrl(url: string): string {\r\n const trimmed = url.trim();\r\n\r\n if (trimmed.startsWith('ws://') || trimmed.startsWith('wss://')) {\r\n return trimmed;\r\n }\r\n\r\n return buildDevToolsWsUrl(trimmed.replace(/^https?:\\/\\//, ''), DEFAULT_DEVTOOLS_PORT);\r\n}\r\n\r\nexport function resolveServerUrl(serverUrl?: string): string {\r\n if (serverUrl) {\r\n return normalizeServerUrl(serverUrl);\r\n }\r\n\r\n const envUrl =\r\n typeof process !== 'undefined'\r\n ? process.env.EXPO_PUBLIC_DATABASE_DEVTOOLS_URL\r\n : undefined;\r\n\r\n if (envUrl) {\r\n return normalizeServerUrl(envUrl);\r\n }\r\n\r\n return buildDevToolsWsUrl(resolveDevToolsHost(), DEFAULT_DEVTOOLS_PORT);\r\n}\r\n","import AsyncStorage from '@react-native-async-storage/async-storage';\r\nimport { NativeModules } from 'react-native';\r\n\r\nimport { generateDeviceId } from './ids';\r\n\r\nexport const PERSISTED_DEVICE_ID_STORAGE_KEY = '@database-devtools/device-id';\r\n\r\nexport type DeviceIdStorage = {\r\n getItem: (key: string) => Promise<string | null>;\r\n setItem: (key: string, value: string) => Promise<void>;\r\n};\r\n\r\nlet memoryDeviceId: string | null = null;\r\n\r\nfunction hasAsyncStorageNativeModule(): boolean {\r\n return Boolean(\r\n NativeModules.RNCAsyncStorage ??\r\n NativeModules.RNC_AsyncSQLiteDBStoragePassThru ??\r\n NativeModules.PlatformLocalStorage,\r\n );\r\n}\r\n\r\nexport function createAsyncStorageDeviceIdStore(): DeviceIdStorage | null {\r\n if (!hasAsyncStorageNativeModule()) {\r\n return null;\r\n }\r\n\r\n return AsyncStorage;\r\n}\r\n\r\nfunction loadOrCreateMemoryDeviceId(): string {\r\n if (!memoryDeviceId) {\r\n memoryDeviceId = generateDeviceId();\r\n }\r\n\r\n return memoryDeviceId;\r\n}\r\n\r\nexport async function loadOrCreateDeviceId(\r\n storage: DeviceIdStorage | null = createAsyncStorageDeviceIdStore(),\r\n): Promise<string> {\r\n if (storage) {\r\n try {\r\n const stored = await storage.getItem(PERSISTED_DEVICE_ID_STORAGE_KEY);\r\n\r\n if (stored) {\r\n return stored;\r\n }\r\n\r\n const created = generateDeviceId();\r\n await storage.setItem(PERSISTED_DEVICE_ID_STORAGE_KEY, created);\r\n return created;\r\n } catch {\r\n // Expo Go / missing native module — use an in-memory id for this session.\r\n }\r\n }\r\n\r\n return loadOrCreateMemoryDeviceId();\r\n}\r\n/** @internal Test helper */\r\nexport function resetMemoryDeviceIdForTests(): void {\r\n memoryDeviceId = null;\r\n}\r\n","const BLOCKED_KEYWORDS =\r\n /\\b(INSERT|UPDATE|DELETE|DROP|ALTER|CREATE|REPLACE|ATTACH|DETACH|REINDEX|VACUUM|TRUNCATE)\\b/i;\r\n\r\nexport function validateReadOnlySql(sql: string): void {\r\n const trimmed = sql.trim();\r\n\r\n if (!trimmed) {\r\n throw new Error('SQL query is empty');\r\n }\r\n\r\n if (BLOCKED_KEYWORDS.test(trimmed)) {\r\n throw new Error(\r\n 'DevTools is read-only; only SELECT, PRAGMA, EXPLAIN, and WITH queries are allowed',\r\n );\r\n }\r\n\r\n const statements = trimmed\r\n .split(';')\r\n .map((statement) => statement.trim())\r\n .filter(Boolean);\r\n\r\n for (const statement of statements) {\r\n const leading = statement.replace(/^\\s*(--[^\\n]*\\n|\\/\\*[\\s\\S]*?\\*\\/\\s*)*/g, '').trim();\r\n const keyword = leading.split(/\\s+/)[0]?.toUpperCase();\r\n\r\n if (!keyword) {\r\n continue;\r\n }\r\n\r\n if (\r\n keyword !== 'SELECT' &&\r\n keyword !== 'PRAGMA' &&\r\n keyword !== 'EXPLAIN' &&\r\n keyword !== 'WITH'\r\n ) {\r\n throw new Error(`DevTools is read-only; \"${keyword}\" statements are not allowed`);\r\n }\r\n }\r\n}\r\n","import type { ColumnInfo } from '../types/inspection';\r\n\r\nexport function quoteIdentifier(name: string): string {\r\n return `\"${name.replace(/\"/g, '\"\"')}\"`;\r\n}\r\n\r\nexport function buildSearchClause(\r\n columns: ColumnInfo[],\r\n search: string | undefined,\r\n): { clause: string; params: string[] } {\r\n const term = search?.trim();\r\n\r\n if (!term || columns.length === 0) {\r\n return { clause: '', params: [] };\r\n }\r\n\r\n const pattern = `%${term}%`;\r\n const conditions = columns.map(\r\n (column) => `CAST(${quoteIdentifier(column.name)} AS TEXT) LIKE ?`,\r\n );\r\n\r\n return {\r\n clause: ` WHERE (${conditions.join(' OR ')})`,\r\n params: columns.map(() => pattern),\r\n };\r\n}\r\n\r\nexport function resolveSortColumn(\r\n columns: ColumnInfo[],\r\n sortColumn: string | null | undefined,\r\n): string | null {\r\n if (!sortColumn) {\r\n return null;\r\n }\r\n\r\n return columns.some((column) => column.name === sortColumn) ? sortColumn : null;\r\n}\r\n","import type { ExpoSqliteInspectableDatabase } from '../adapters/sqlite/types';\r\nimport type {\r\n ColumnInfo,\r\n QueryResult,\r\n SchemaTable,\r\n TableInfo,\r\n TablePageRequest,\r\n TablePageResult,\r\n} from '../types/inspection';\r\nimport { validateReadOnlySql } from '../utils/sqlSafety';\r\nimport type { MobileDatabaseInfo, MobileDatabaseInspector } from './types';\r\nimport { buildSearchClause, quoteIdentifier, resolveSortColumn } from './sqliteTableQuery';\r\n\r\ntype PragmaTableInfoRow = {\r\n name: string;\r\n type: string;\r\n notnull: number;\r\n dflt_value: string | number | null;\r\n pk: number;\r\n};\r\n\r\nfunction normalizeCell(cell: unknown): string | number | null {\r\n if (cell === null || cell === undefined) {\r\n return null;\r\n }\r\n\r\n if (typeof cell === 'number' || typeof cell === 'string') {\r\n return cell;\r\n }\r\n\r\n if (typeof cell === 'boolean') {\r\n return cell ? 1 : 0;\r\n }\r\n\r\n if (cell instanceof Uint8Array) {\r\n return `[BLOB ${cell.byteLength} bytes]`;\r\n }\r\n\r\n return String(cell);\r\n}\r\n\r\nfunction objectRowsToMatrix(rows: Record<string, unknown>[]): {\r\n columns: string[];\r\n matrix: (string | number | null)[][];\r\n} {\r\n if (rows.length === 0) {\r\n return { columns: [], matrix: [] };\r\n }\r\n\r\n const columns = Object.keys(rows[0]!);\r\n\r\n return {\r\n columns,\r\n matrix: rows.map((row) => columns.map((column) => normalizeCell(row[column]))),\r\n };\r\n}\r\n\r\nexport function createExpoSqliteInspector(\r\n database: ExpoSqliteInspectableDatabase,\r\n): MobileDatabaseInspector {\r\n let operationQueue: Promise<void> = Promise.resolve();\r\n\r\n const enqueue = async <T>(operation: () => Promise<T>): Promise<T> => {\r\n const next = operationQueue.then(operation);\r\n operationQueue = next.then(\r\n () => undefined,\r\n () => undefined,\r\n );\r\n return next;\r\n };\r\n\r\n const listTablesInternal = async (): Promise<TableInfo[]> => {\r\n const masterRows = await database.getAllAsync<{ name: string }>(\r\n `SELECT name FROM sqlite_master\r\n WHERE type = 'table' AND name NOT LIKE 'sqlite_%'\r\n ORDER BY name`,\r\n );\r\n\r\n const tables: TableInfo[] = [];\r\n\r\n for (const row of masterRows) {\r\n const countRow = await database.getFirstAsync<{ count: number }>(\r\n `SELECT COUNT(*) AS count FROM ${quoteIdentifier(row.name)}`,\r\n );\r\n\r\n tables.push({\r\n name: row.name,\r\n rowCount: Number(countRow?.count ?? 0),\r\n });\r\n }\r\n\r\n return tables;\r\n };\r\n\r\n const getTableColumnsInternal = async (table: string): Promise<ColumnInfo[]> => {\r\n const rows = await database.getAllAsync<PragmaTableInfoRow>(\r\n `PRAGMA table_info(${quoteIdentifier(table)})`,\r\n );\r\n\r\n return rows.map((row) => ({\r\n name: row.name,\r\n type: row.type || 'ANY',\r\n notNull: row.notnull === 1,\r\n pk: row.pk === 1,\r\n defaultValue:\r\n row.dflt_value === null || row.dflt_value === undefined\r\n ? null\r\n : String(row.dflt_value),\r\n }));\r\n };\r\n\r\n return {\r\n listTables: () => enqueue(listTablesInternal),\r\n\r\n getSchema: () =>\r\n enqueue(async () => {\r\n const tables = await listTablesInternal();\r\n\r\n return Promise.all(\r\n tables.map(async (table) => ({\r\n name: table.name,\r\n columns: await getTableColumnsInternal(table.name),\r\n })),\r\n );\r\n }),\r\n\r\n getTableColumns: (table) => enqueue(() => getTableColumnsInternal(table)),\r\n\r\n getDatabaseInfo: () =>\r\n enqueue(async () => {\r\n const tables = await listTablesInternal();\r\n const versionRow = await database.getFirstAsync<{ version: string }>(\r\n 'SELECT sqlite_version() AS version',\r\n );\r\n const pageRow = await database.getFirstAsync<{ page_size: number; page_count: number }>(\r\n 'SELECT page_size, page_count FROM pragma_page_size(), pragma_page_count()',\r\n );\r\n const pageSize = Number(pageRow?.page_size ?? 0);\r\n const pageCount = Number(pageRow?.page_count ?? 0);\r\n\r\n return {\r\n name: database.databasePath.split('/').pop() ?? database.databasePath,\r\n path: database.databasePath,\r\n tableCount: tables.length,\r\n sqliteVersion: versionRow?.version ?? 'unknown',\r\n pageSize,\r\n pageCount,\r\n estimatedSizeBytes: pageSize * pageCount,\r\n } satisfies MobileDatabaseInfo;\r\n }),\r\n\r\n fetchTablePage: (request) =>\r\n enqueue(async () => {\r\n const columns = await getTableColumnsInternal(request.table);\r\n const { clause, params: searchParams } = buildSearchClause(columns, request.search);\r\n const quotedTable = quoteIdentifier(request.table);\r\n const countRow = await database.getFirstAsync<{ count: number }>(\r\n `SELECT COUNT(*) AS count FROM ${quotedTable}${clause}`,\r\n searchParams,\r\n );\r\n const totalCount = Number(countRow?.count ?? 0);\r\n const pageSize = Math.max(1, request.pageSize);\r\n const page = Math.max(1, request.page);\r\n const offset = (page - 1) * pageSize;\r\n const sortColumn = resolveSortColumn(columns, request.sortColumn);\r\n const orderClause = sortColumn\r\n ? ` ORDER BY ${quoteIdentifier(sortColumn)} ${request.sortDir === 'desc' ? 'DESC' : 'ASC'}`\r\n : '';\r\n const rows = await database.getAllAsync<Record<string, unknown>>(\r\n `SELECT * FROM ${quotedTable}${clause}${orderClause} LIMIT ? OFFSET ?`,\r\n [...searchParams, pageSize, offset],\r\n );\r\n const { columns: resultColumns, matrix } = objectRowsToMatrix(rows);\r\n\r\n return {\r\n columns: resultColumns,\r\n rows: matrix,\r\n totalCount,\r\n page,\r\n pageSize,\r\n } satisfies TablePageResult;\r\n }),\r\n\r\n executeQuery: (sql) =>\r\n enqueue(async () => {\r\n validateReadOnlySql(sql);\r\n const started = Date.now();\r\n const rows = await database.getAllAsync<Record<string, unknown>>(sql);\r\n const { columns, matrix } = objectRowsToMatrix(rows);\r\n\r\n return {\r\n columns,\r\n rows: matrix,\r\n rowCount: matrix.length,\r\n durationMs: Date.now() - started,\r\n } satisfies QueryResult;\r\n }),\r\n };\r\n}\r\n","import { useCallback, useEffect, useMemo, useRef, useState, type ReactNode } from 'react';\r\nimport { resolveAdapter } from '../adapter/resolveAdapter';\r\nimport { detectExpoSqliteInspectable } from '../adapters/sqlite/detect';\r\nimport { isWritableDatabaseAdapter } from '../types/adapter';\r\nimport {\r\n createDevToolsClient,\r\n type ConnectionState,\r\n} from '../client/createDevToolsClient';\r\nimport { formatRefreshErrorMessage } from '../client/formatSyncError';\r\nimport { handleDeviceSnapshotUpload } from '../client/handleDeviceSnapshot';\r\nimport {\r\n handleBeginTransaction,\r\n handleCommitTransaction,\r\n handleExecuteWrite,\r\n handleRollbackTransaction,\r\n} from '../client/handleWriteOperations';\r\nimport { DevToolsContext, type ExportState } from '../hooks/useDevTools';\r\nimport type { DatabaseAdapter } from '../types/adapter';\r\nimport type { DatabaseKind } from '../types/kind';\r\nimport { DevToolsRole, REFRESH_TIMEOUT_MS } from '../types/protocol';\r\nimport { getConnectionHint } from '../utils/resolveDevToolsHost';\r\nimport { resolveDeviceMetadata } from '../utils/resolveDeviceMetadata';\r\nimport { normalizeServerUrl, resolveServerUrl } from '../utils/resolveServerUrl';\r\nimport { loadOrCreateDeviceId } from '../utils/persistDeviceId';\r\nimport { createExpoSqliteInspector } from '../mobile/createExpoSqliteInspector';\r\nimport type { MobileDatabaseInspector } from '../mobile/types';\r\n\r\nexport type DevToolsProviderProps = {\r\n children: ReactNode;\r\n database?: unknown;\r\n type?: DatabaseKind;\r\n adapter?: DatabaseAdapter;\r\n serverUrl?: string;\r\n onConnectionStateChange?: (state: ConnectionState) => void;\r\n};\r\n\r\ntype ExportWaiters = {\r\n resolve: () => void;\r\n reject: (error: Error) => void;\r\n};\r\n\r\nexport function DevToolsProvider({\r\n children,\r\n database,\r\n type,\r\n adapter: explicitAdapter,\r\n serverUrl: initialServerUrl,\r\n onConnectionStateChange,\r\n}: DevToolsProviderProps) {\r\n const [connectionState, setConnectionState] = useState<ConnectionState>('connecting');\r\n const [connectionError, setConnectionError] = useState<string | null>(null);\r\n const [serverUrl, setServerUrl] = useState(() => resolveServerUrl(initialServerUrl));\r\n const [deviceId, setDeviceId] = useState<string | undefined>();\r\n const [deviceIdReady, setDeviceIdReady] = useState(false);\r\n const [settingsVisible, setSettingsVisible] = useState(false);\r\n const [launcherVisible, setLauncherVisible] = useState(false);\r\n const [explorerVisible, setExplorerVisible] = useState(false);\r\n const [mobileInspector, setMobileInspector] = useState<MobileDatabaseInspector | null>(null);\r\n const [resolvedAdapter, setResolvedAdapter] = useState<DatabaseAdapter | undefined>(explicitAdapter);\r\n const [adapterError, setAdapterError] = useState<string | null>(null);\r\n const [exportState, setExportState] = useState<ExportState>('idle');\r\n const [exportError, setExportError] = useState<string | null>(null);\r\n\r\n const metadata = useMemo(() => resolveDeviceMetadata(), []);\r\n const clientRef = useRef<ReturnType<typeof createDevToolsClient> | null>(null);\r\n const onConnectionStateChangeRef = useRef(onConnectionStateChange);\r\n const databaseRef = useRef(resolvedAdapter);\r\n const rollbackOpenTransactionRef = useRef<(() => Promise<void>) | null>(null);\r\n const exportWaitersRef = useRef<ExportWaiters | null>(null);\r\n const exportTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n const exportSuccessTimeoutRef = useRef<ReturnType<typeof setTimeout> | null>(null);\r\n\r\n const clearExportWaiters = useCallback(() => {\r\n if (exportTimeoutRef.current) {\r\n clearTimeout(exportTimeoutRef.current);\r\n exportTimeoutRef.current = null;\r\n }\r\n\r\n exportWaitersRef.current = null;\r\n }, []);\r\n\r\n const resetExportSuccessLater = useCallback(() => {\r\n if (exportSuccessTimeoutRef.current) {\r\n clearTimeout(exportSuccessTimeoutRef.current);\r\n }\r\n\r\n exportSuccessTimeoutRef.current = setTimeout(() => {\r\n setExportState((current) => (current === 'success' ? 'idle' : current));\r\n exportSuccessTimeoutRef.current = null;\r\n }, 3000);\r\n }, []);\r\n\r\n const finishExportSuccess = useCallback(() => {\r\n clearExportWaiters();\r\n setExportState('success');\r\n setExportError(null);\r\n resetExportSuccessLater();\r\n }, [clearExportWaiters, resetExportSuccessLater]);\r\n\r\n const finishExportFailure = useCallback(\r\n (message: string) => {\r\n clearExportWaiters();\r\n setExportState('error');\r\n setExportError(message);\r\n },\r\n [clearExportWaiters],\r\n );\r\n\r\n useEffect(() => {\r\n onConnectionStateChangeRef.current = onConnectionStateChange;\r\n }, [onConnectionStateChange]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n async function resolveDatabaseAdapter(): Promise<void> {\r\n if (explicitAdapter) {\r\n setResolvedAdapter(explicitAdapter);\r\n setAdapterError(null);\r\n return;\r\n }\r\n\r\n if (!database) {\r\n setResolvedAdapter(undefined);\r\n setAdapterError(null);\r\n return;\r\n }\r\n\r\n try {\r\n const nextAdapter = await resolveAdapter(database, { type });\r\n if (!cancelled) {\r\n setResolvedAdapter(nextAdapter);\r\n setAdapterError(null);\r\n }\r\n } catch (error) {\r\n if (!cancelled) {\r\n setResolvedAdapter(undefined);\r\n setAdapterError(error instanceof Error ? error.message : 'Failed to resolve database adapter');\r\n }\r\n }\r\n }\r\n\r\n void resolveDatabaseAdapter();\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, [database, type, explicitAdapter]);\r\n\r\n useEffect(() => {\r\n if (detectExpoSqliteInspectable(database)) {\r\n setMobileInspector(createExpoSqliteInspector(database));\r\n return;\r\n }\r\n\r\n setMobileInspector(null);\r\n }, [database]);\r\n\r\n useEffect(() => {\r\n databaseRef.current = resolvedAdapter;\r\n }, [resolvedAdapter]);\r\n\r\n useEffect(() => {\r\n rollbackOpenTransactionRef.current = async () => {\r\n const adapter = databaseRef.current;\r\n\r\n if (!isWritableDatabaseAdapter(adapter)) {\r\n return;\r\n }\r\n\r\n try {\r\n await adapter.rollbackTransaction();\r\n } catch {\r\n // Best-effort cleanup when the provider unmounts or reconnects.\r\n }\r\n };\r\n }, [resolvedAdapter]);\r\n\r\n useEffect(() => {\r\n let cancelled = false;\r\n\r\n void loadOrCreateDeviceId()\r\n .then((persistedId) => {\r\n if (!cancelled) {\r\n setDeviceId(persistedId);\r\n setDeviceIdReady(true);\r\n }\r\n })\r\n .catch(() => {\r\n if (!cancelled) {\r\n setDeviceIdReady(true);\r\n }\r\n });\r\n\r\n return () => {\r\n cancelled = true;\r\n };\r\n }, []);\r\n\r\n useEffect(() => {\r\n if (!deviceIdReady || !deviceId) {\r\n return;\r\n }\r\n\r\n const client = createDevToolsClient({\r\n serverUrl,\r\n role: DevToolsRole.MOBILE,\r\n deviceId,\r\n metadata,\r\n onConnect: () => {\r\n setConnectionError(null);\r\n },\r\n onConnectionStateChange: (state) => {\r\n setConnectionState(state);\r\n onConnectionStateChangeRef.current?.(state);\r\n },\r\n onError: (error) => {\r\n setConnectionError(error.message);\r\n },\r\n onSnapshotUploadRequested: async (message) => {\r\n try {\r\n await handleDeviceSnapshotUpload(databaseRef.current, message, {\r\n hubServerUrl: serverUrl,\r\n deviceId: clientRef.current?.getDeviceId(),\r\n });\r\n\r\n if (exportWaitersRef.current) {\r\n exportWaitersRef.current.resolve();\r\n clearExportWaiters();\r\n }\r\n } catch (error) {\r\n const errorMessage =\r\n error instanceof Error ? error.message : 'Database export or upload failed';\r\n\r\n if (exportWaitersRef.current) {\r\n exportWaitersRef.current.reject(new Error(errorMessage));\r\n clearExportWaiters();\r\n return;\r\n }\r\n\r\n console.error('[database-devtools] Snapshot export or upload failed:', errorMessage);\r\n }\r\n },\r\n onExportSnapshotError: (message) => {\r\n const errorMessage = formatRefreshErrorMessage(message.code, message.message);\r\n\r\n if (exportWaitersRef.current) {\r\n exportWaitersRef.current.reject(new Error(errorMessage));\r\n clearExportWaiters();\r\n }\r\n },\r\n onBeginTransaction: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleBeginTransaction(databaseRef.current, message, (ack) => {\r\n client.sendTransactionAck(ack);\r\n });\r\n },\r\n onCommitTransaction: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleCommitTransaction(databaseRef.current, message, (ack) => {\r\n client.sendTransactionAck(ack);\r\n });\r\n },\r\n onRollbackTransaction: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleRollbackTransaction(databaseRef.current, message, (ack) => {\r\n client.sendTransactionAck(ack);\r\n });\r\n },\r\n onExecuteWrite: async (message) => {\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n await handleExecuteWrite(databaseRef.current, message, (ack) => {\r\n client.sendWriteAck(ack);\r\n });\r\n },\r\n });\r\n\r\n clientRef.current = client;\r\n setDeviceId(client.getDeviceId());\r\n client.connect();\r\n\r\n return () => {\r\n void rollbackOpenTransactionRef.current?.();\r\n client.disconnect();\r\n clientRef.current = null;\r\n clearExportWaiters();\r\n\r\n if (exportSuccessTimeoutRef.current) {\r\n clearTimeout(exportSuccessTimeoutRef.current);\r\n exportSuccessTimeoutRef.current = null;\r\n }\r\n };\r\n }, [serverUrl, metadata, clearExportWaiters, deviceIdReady, deviceId]);\r\n\r\n const openLauncher = useCallback(() => {\r\n setLauncherVisible(true);\r\n }, []);\r\n\r\n const closeLauncher = useCallback(() => {\r\n setLauncherVisible(false);\r\n }, []);\r\n\r\n const openExplorer = useCallback(() => {\r\n setLauncherVisible(false);\r\n setExplorerVisible(true);\r\n }, []);\r\n\r\n const closeExplorer = useCallback(() => {\r\n setExplorerVisible(false);\r\n }, []);\r\n\r\n const openSettings = useCallback(() => {\r\n setLauncherVisible(false);\r\n setSettingsVisible(true);\r\n }, []);\r\n\r\n const closeSettings = useCallback(() => {\r\n setSettingsVisible(false);\r\n }, []);\r\n\r\n const reconnect = useCallback((url: string) => {\r\n setConnectionError(null);\r\n setServerUrl(normalizeServerUrl(url));\r\n }, []);\r\n\r\n const exportDatabase = useCallback(async () => {\r\n if (exportState === 'exporting') {\r\n return;\r\n }\r\n\r\n if (connectionState !== 'connected') {\r\n finishExportFailure('Connect to the DevTools hub first');\r\n return;\r\n }\r\n\r\n if (!resolvedAdapter) {\r\n finishExportFailure(adapterError ?? 'No database adapter connected');\r\n return;\r\n }\r\n\r\n const client = clientRef.current;\r\n\r\n if (!client) {\r\n finishExportFailure('DevTools client is not ready');\r\n return;\r\n }\r\n\r\n setExportState('exporting');\r\n setExportError(null);\r\n\r\n try {\r\n await new Promise<void>((resolve, reject) => {\r\n exportWaitersRef.current = { resolve, reject };\r\n exportTimeoutRef.current = setTimeout(() => {\r\n exportWaitersRef.current?.reject(new Error('Export timed out'));\r\n clearExportWaiters();\r\n }, REFRESH_TIMEOUT_MS);\r\n\r\n client.requestExportSnapshot();\r\n });\r\n\r\n finishExportSuccess();\r\n } catch (error) {\r\n const message = error instanceof Error ? error.message : 'Export failed';\r\n finishExportFailure(message);\r\n }\r\n }, [\r\n adapterError,\r\n connectionState,\r\n exportState,\r\n finishExportFailure,\r\n resolvedAdapter,\r\n ]);\r\n\r\n const connectionHint = useMemo(() => getConnectionHint(serverUrl), [serverUrl]);\r\n\r\n const value = useMemo(\r\n () => ({\r\n connectionState,\r\n connectionError,\r\n connectionHint,\r\n deviceId,\r\n serverUrl,\r\n metadata,\r\n database: resolvedAdapter,\r\n adapterError,\r\n mobileInspector,\r\n launcherVisible,\r\n openLauncher,\r\n closeLauncher,\r\n explorerVisible,\r\n openExplorer,\r\n closeExplorer,\r\n settingsVisible,\r\n openSettings,\r\n closeSettings,\r\n reconnect,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n }),\r\n [\r\n connectionState,\r\n connectionError,\r\n connectionHint,\r\n deviceId,\r\n serverUrl,\r\n metadata,\r\n resolvedAdapter,\r\n adapterError,\r\n mobileInspector,\r\n launcherVisible,\r\n openLauncher,\r\n closeLauncher,\r\n explorerVisible,\r\n openExplorer,\r\n closeExplorer,\r\n settingsVisible,\r\n openSettings,\r\n closeSettings,\r\n reconnect,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n ],\r\n );\r\n\r\n return <DevToolsContext.Provider value={value}>{children}</DevToolsContext.Provider>;\r\n}\r\n","import { StyleSheet, Text, View } from 'react-native';\nimport type { ConnectionState } from '../client/createDevToolsClient';\n\nexport type ConnectionStatusBadgeProps = {\n state: ConnectionState;\n};\n\ntype StatusConfig = {\n label: string;\n color: string;\n backgroundColor: string;\n};\n\nfunction getStatusConfig(state: ConnectionState): StatusConfig {\n switch (state) {\n case 'connected':\n return { label: 'Connected', color: '#166534', backgroundColor: '#dcfce7' };\n case 'reconnecting':\n return { label: 'Reconnecting', color: '#92400e', backgroundColor: '#fef3c7' };\n case 'connecting':\n return { label: 'Connecting', color: '#92400e', backgroundColor: '#fef3c7' };\n case 'disconnected':\n return { label: 'Disconnected', color: '#991b1b', backgroundColor: '#fee2e2' };\n }\n}\n\nexport function getConnectionDotColor(state: ConnectionState): string {\n switch (state) {\n case 'connected':\n return '#22c55e';\n case 'reconnecting':\n case 'connecting':\n return '#eab308';\n case 'disconnected':\n return '#ef4444';\n }\n}\n\nexport function ConnectionStatusBadge({ state }: ConnectionStatusBadgeProps) {\n const config = getStatusConfig(state);\n\n return (\n <View style={[styles.badge, { backgroundColor: config.backgroundColor }]}>\n <View style={[styles.dot, { backgroundColor: getConnectionDotColor(state) }]} />\n <Text style={[styles.label, { color: config.color }]}>{config.label}</Text>\n </View>\n );\n}\n\nconst styles = StyleSheet.create({\n badge: {\n flexDirection: 'row',\n alignItems: 'center',\n alignSelf: 'flex-start',\n paddingHorizontal: 10,\n paddingVertical: 6,\n borderRadius: 999,\n gap: 6,\n },\n dot: {\n width: 8,\n height: 8,\n borderRadius: 4,\n },\n label: {\n fontSize: 13,\n fontWeight: '600',\n },\n});\n","import {\r\n ActivityIndicator,\r\n Modal,\r\n Pressable,\r\n ScrollView,\r\n StyleSheet,\r\n Text,\r\n View,\r\n} from 'react-native';\r\nimport { useDevTools } from '../hooks/useDevTools';\r\nimport { ConnectionStatusBadge } from './ConnectionStatusBadge';\r\n\r\nexport function DevToolsLauncherModal() {\r\n const {\r\n launcherVisible,\r\n closeLauncher,\r\n openExplorer,\r\n openSettings,\r\n connectionState,\r\n mobileInspector,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n database,\r\n adapterError,\r\n } = useDevTools();\r\n\r\n const isExporting = exportState === 'exporting';\r\n const exportDisabled =\r\n connectionState !== 'connected' || !database || isExporting || Boolean(adapterError);\r\n\r\n return (\r\n <Modal\r\n animationType=\"slide\"\r\n onRequestClose={closeLauncher}\r\n transparent\r\n visible={launcherVisible}\r\n >\r\n <View style={styles.overlay}>\r\n <View style={styles.sheet}>\r\n <View style={styles.header}>\r\n <Text style={styles.title}>Database DevTools</Text>\r\n <Pressable accessibilityLabel=\"Close launcher\" onPress={closeLauncher}>\r\n <Text style={styles.closeButton}>Close</Text>\r\n </Pressable>\r\n </View>\r\n\r\n <View style={styles.body}>\r\n <ConnectionStatusBadge state={connectionState} />\r\n <Text style={styles.hint}>\r\n Browse and query the on-device database, or connect to the web inspector.\r\n </Text>\r\n\r\n <Pressable\r\n accessibilityLabel=\"View database on device\"\r\n disabled={!mobileInspector}\r\n onPress={openExplorer}\r\n style={[styles.primaryButton, !mobileInspector && styles.primaryButtonDisabled]}\r\n >\r\n <Text style={styles.primaryLabel}>View Database</Text>\r\n </Pressable>\r\n {!mobileInspector ? (\r\n <Text style={styles.warning}>\r\n On-device explorer requires an Expo SQLite database instance.\r\n </Text>\r\n ) : null}\r\n\r\n <Pressable\r\n accessibilityLabel=\"Open DevTools settings\"\r\n onPress={openSettings}\r\n style={styles.secondaryButton}\r\n >\r\n <Text style={styles.secondaryLabel}>DevTools Settings</Text>\r\n </Pressable>\r\n\r\n <Pressable\r\n accessibilityLabel=\"Export database to web inspector\"\r\n accessibilityState={{ busy: isExporting, disabled: exportDisabled }}\r\n disabled={exportDisabled}\r\n onPress={() => void exportDatabase()}\r\n style={[styles.ghostButton, exportDisabled && !isExporting && styles.buttonDisabled]}\r\n >\r\n <View style={styles.exportContent}>\r\n {isExporting ? <ActivityIndicator color=\"#0f172a\" size=\"small\" /> : null}\r\n <Text style={styles.ghostLabel}>\r\n {isExporting ? 'Exporting…' : 'Export to Web Inspector'}\r\n </Text>\r\n </View>\r\n </Pressable>\r\n\r\n {connectionState !== 'connected' ? (\r\n <Text style={styles.hint}>Connect to the hub in settings before exporting.</Text>\r\n ) : null}\r\n {exportState === 'success' ? (\r\n <Text style={styles.success}>Sent to web inspector</Text>\r\n ) : null}\r\n {exportError ? <Text style={styles.error}>{exportError}</Text> : null}\r\n {adapterError ? <Text style={styles.error}>{adapterError}</Text> : null}\r\n </View>\r\n </View>\r\n </View>\r\n </Modal>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n overlay: {\r\n flex: 1,\r\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\r\n justifyContent: 'flex-end',\r\n },\r\n sheet: {\r\n backgroundColor: '#ffffff',\r\n borderTopLeftRadius: 16,\r\n borderTopRightRadius: 16,\r\n overflow: 'hidden',\r\n },\r\n header: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingHorizontal: 20,\r\n paddingVertical: 16,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: '#e2e8f0',\r\n },\r\n title: {\r\n fontSize: 18,\r\n fontWeight: '700',\r\n color: '#0f172a',\r\n },\r\n closeButton: {\r\n fontSize: 16,\r\n color: '#2563eb',\r\n fontWeight: '600',\r\n },\r\n body: {\r\n padding: 20,\r\n gap: 12,\r\n },\r\n hint: {\r\n fontSize: 13,\r\n color: '#64748b',\r\n lineHeight: 20,\r\n },\r\n warning: {\r\n fontSize: 12,\r\n color: '#b45309',\r\n marginTop: -4,\r\n },\r\n primaryButton: {\r\n backgroundColor: '#2563eb',\r\n borderRadius: 8,\r\n paddingVertical: 14,\r\n alignItems: 'center',\r\n },\r\n primaryButtonDisabled: {\r\n opacity: 0.5,\r\n },\r\n primaryLabel: {\r\n color: '#f8fafc',\r\n fontSize: 16,\r\n fontWeight: '700',\r\n },\r\n secondaryButton: {\r\n backgroundColor: '#1e293b',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n },\r\n secondaryLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n ghostButton: {\r\n borderWidth: 1,\r\n borderColor: '#cbd5e1',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n },\r\n buttonDisabled: {\r\n opacity: 0.5,\r\n },\r\n ghostLabel: {\r\n color: '#0f172a',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n exportContent: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n gap: 8,\r\n },\r\n success: {\r\n fontSize: 13,\r\n color: '#15803d',\r\n },\r\n error: {\r\n fontSize: 13,\r\n color: '#dc2626',\r\n },\r\n});\r\n","import { useEffect, useState, type ReactNode } from 'react';\r\nimport {\r\n ActivityIndicator,\r\n Modal,\r\n Pressable,\r\n ScrollView,\r\n StyleSheet,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport { useDevTools } from '../hooks/useDevTools';\r\nimport { ConnectionStatusBadge } from './ConnectionStatusBadge';\r\n\r\nexport function DevToolsSettingsModal() {\r\n const {\r\n settingsVisible,\r\n closeSettings,\r\n connectionState,\r\n connectionError,\r\n connectionHint,\r\n deviceId,\r\n serverUrl,\r\n metadata,\r\n database,\r\n adapterError,\r\n reconnect,\r\n exportState,\r\n exportError,\r\n exportDatabase,\r\n } = useDevTools();\r\n\r\n const [draftUrl, setDraftUrl] = useState(serverUrl);\r\n\r\n useEffect(() => {\r\n if (settingsVisible) {\r\n setDraftUrl(serverUrl);\r\n }\r\n }, [settingsVisible, serverUrl]);\r\n\r\n const handleReconnect = () => {\r\n const trimmed = draftUrl.trim();\r\n\r\n if (trimmed) {\r\n reconnect(trimmed);\r\n }\r\n };\r\n\r\n const handleExportDatabase = () => {\r\n void exportDatabase();\r\n };\r\n\r\n const isExporting = exportState === 'exporting';\r\n const exportDisabled =\r\n connectionState !== 'connected' || !database || isExporting;\r\n\r\n return (\r\n <Modal\r\n animationType=\"slide\"\r\n onRequestClose={closeSettings}\r\n transparent\r\n visible={settingsVisible}\r\n >\r\n <View style={styles.overlay}>\r\n <View style={styles.sheet}>\r\n <View style={styles.header}>\r\n <Text style={styles.title}>Database DevTools</Text>\r\n <Pressable accessibilityLabel=\"Close settings\" onPress={closeSettings}>\r\n <Text style={styles.closeButton}>Close</Text>\r\n </Pressable>\r\n </View>\r\n\r\n <ScrollView\r\n contentContainerStyle={styles.content}\r\n style={styles.scrollBody}\r\n >\r\n <Section title=\"Connection\">\r\n <ConnectionStatusBadge state={connectionState} />\r\n <InfoRow label=\"Server URL\" value={serverUrl} mono />\r\n {connectionError ? (\r\n <Text style={styles.errorText}>{connectionError}</Text>\r\n ) : null}\r\n {connectionHint ? (\r\n <Text style={styles.hintText}>{connectionHint}</Text>\r\n ) : null}\r\n {connectionState === 'reconnecting' ? (\r\n <Text style={styles.hintText}>\r\n Ensure the inspector hub is running (npx database-devtools) and the URL reaches\r\n your development machine — not the phone itself.\r\n </Text>\r\n ) : null}\r\n </Section>\r\n\r\n <Section title=\"Device\">\r\n <InfoRow label=\"Device ID\" value={deviceId ?? '—'} mono />\r\n <InfoRow label=\"Platform\" value={metadata.platform ?? '—'} />\r\n <InfoRow label=\"App\" value={metadata.appName ?? '—'} />\r\n {metadata.appVersion ? (\r\n <InfoRow label=\"Version\" value={metadata.appVersion} />\r\n ) : null}\r\n {metadata.bundleId ? (\r\n <InfoRow label=\"Bundle ID\" value={metadata.bundleId} mono />\r\n ) : null}\r\n </Section>\r\n\r\n <Section title=\"Server\">\r\n <Text style={styles.fieldLabel}>WebSocket URL</Text>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n onChangeText={setDraftUrl}\r\n placeholder=\"ws://10.0.2.2:3847/ws\"\r\n style={styles.input}\r\n value={draftUrl}\r\n />\r\n <Pressable onPress={handleReconnect} style={styles.reconnectButton}>\r\n <Text style={styles.reconnectLabel}>Reconnect</Text>\r\n </Pressable>\r\n </Section>\r\n\r\n <Section title=\"Database\">\r\n {database ? (\r\n <>\r\n <InfoRow label=\"Kind\" value={database.kind} />\r\n <InfoRow label=\"Name\" value={database.name} />\r\n <InfoRow label=\"ID\" value={database.id} mono />\r\n </>\r\n ) : (\r\n <Text style={styles.placeholder}>\r\n {adapterError ? 'Adapter not connected' : 'No adapter connected'}\r\n </Text>\r\n )}\r\n </Section>\r\n </ScrollView>\r\n\r\n <View style={styles.exportFooter}>\r\n {adapterError ? <Text style={styles.errorText}>{adapterError}</Text> : null}\r\n {database ? (\r\n <>\r\n <Pressable\r\n accessibilityLabel=\"Export database to web inspector\"\r\n accessibilityState={{ busy: isExporting, disabled: exportDisabled }}\r\n disabled={exportDisabled}\r\n onPress={handleExportDatabase}\r\n style={[\r\n styles.exportButton,\r\n exportDisabled && !isExporting && styles.exportButtonDisabled,\r\n ]}\r\n >\r\n <View style={styles.exportButtonContent}>\r\n {isExporting ? (\r\n <ActivityIndicator color=\"#f8fafc\" size=\"small\" />\r\n ) : null}\r\n <Text style={styles.exportLabel}>\r\n {isExporting ? 'Exporting…' : 'Export Database'}\r\n </Text>\r\n </View>\r\n </Pressable>\r\n {connectionState !== 'connected' ? (\r\n <Text style={styles.hintText}>Connect to the hub before exporting.</Text>\r\n ) : null}\r\n {exportState === 'success' ? (\r\n <Text style={styles.successText}>Sent to web inspector</Text>\r\n ) : null}\r\n {exportError ? <Text style={styles.errorText}>{exportError}</Text> : null}\r\n </>\r\n ) : (\r\n <Text style={styles.placeholder}>\r\n {adapterError ? 'Adapter not connected' : 'No adapter connected'}\r\n </Text>\r\n )}\r\n </View>\r\n </View>\r\n </View>\r\n </Modal>\r\n );\r\n}\r\n\r\nfunction Section({ title, children }: { title: string; children: ReactNode }) {\r\n return (\r\n <View style={styles.section}>\r\n <Text style={styles.sectionTitle}>{title}</Text>\r\n {children}\r\n </View>\r\n );\r\n}\r\n\r\nfunction InfoRow({\r\n label,\r\n value,\r\n mono = false,\r\n}: {\r\n label: string;\r\n value: string;\r\n mono?: boolean;\r\n}) {\r\n return (\r\n <View style={styles.infoRow}>\r\n <Text style={styles.infoLabel}>{label}</Text>\r\n <Text style={[styles.infoValue, mono && styles.mono]} selectable>\r\n {value}\r\n </Text>\r\n </View>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n overlay: {\r\n flex: 1,\r\n backgroundColor: 'rgba(0, 0, 0, 0.45)',\r\n justifyContent: 'flex-end',\r\n },\r\n sheet: {\r\n backgroundColor: '#ffffff',\r\n borderTopLeftRadius: 16,\r\n borderTopRightRadius: 16,\r\n maxHeight: '85%',\r\n overflow: 'hidden',\r\n },\r\n scrollBody: {\r\n flexGrow: 0,\r\n flexShrink: 1,\r\n },\r\n header: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingHorizontal: 20,\r\n paddingVertical: 16,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: '#e2e8f0',\r\n },\r\n title: {\r\n fontSize: 18,\r\n fontWeight: '700',\r\n color: '#0f172a',\r\n },\r\n closeButton: {\r\n fontSize: 16,\r\n color: '#2563eb',\r\n fontWeight: '600',\r\n },\r\n exportFooter: {\r\n paddingHorizontal: 20,\r\n paddingTop: 12,\r\n paddingBottom: 20,\r\n gap: 8,\r\n borderTopWidth: StyleSheet.hairlineWidth,\r\n borderTopColor: '#e2e8f0',\r\n backgroundColor: '#ffffff',\r\n },\r\n content: {\r\n padding: 20,\r\n gap: 20,\r\n },\r\n section: {\r\n gap: 10,\r\n },\r\n sectionTitle: {\r\n fontSize: 13,\r\n fontWeight: '600',\r\n color: '#64748b',\r\n textTransform: 'uppercase',\r\n letterSpacing: 0.5,\r\n },\r\n infoRow: {\r\n gap: 2,\r\n },\r\n infoLabel: {\r\n fontSize: 12,\r\n color: '#94a3b8',\r\n },\r\n infoValue: {\r\n fontSize: 14,\r\n color: '#0f172a',\r\n },\r\n mono: {\r\n fontFamily: 'monospace',\r\n fontSize: 12,\r\n },\r\n fieldLabel: {\r\n fontSize: 12,\r\n color: '#64748b',\r\n marginBottom: 4,\r\n },\r\n input: {\r\n borderWidth: 1,\r\n borderColor: '#cbd5e1',\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 14,\r\n color: '#0f172a',\r\n fontFamily: 'monospace',\r\n },\r\n reconnectButton: {\r\n marginTop: 8,\r\n backgroundColor: '#1e293b',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n },\r\n reconnectLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n exportButton: {\r\n backgroundColor: '#2563eb',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n paddingHorizontal: 16,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n },\r\n exportButtonContent: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n gap: 8,\r\n },\r\n exportButtonDisabled: {\r\n opacity: 0.5,\r\n },\r\n exportLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n successText: {\r\n fontSize: 13,\r\n color: '#15803d',\r\n },\r\n placeholder: {\r\n fontSize: 14,\r\n color: '#94a3b8',\r\n fontStyle: 'italic',\r\n },\r\n errorText: {\r\n fontSize: 13,\r\n color: '#dc2626',\r\n marginBottom: 8,\r\n },\r\n hintText: {\r\n fontSize: 12,\r\n color: '#b45309',\r\n lineHeight: 18,\r\n },\r\n});\r\n","export type FloatingButtonCorner = 'bottom-right' | 'bottom-left';\r\n\r\nexport type FloatingButtonPosition = {\r\n x: number;\r\n y: number;\r\n};\r\n\r\nexport type FloatingButtonLayout = {\r\n windowWidth: number;\r\n windowHeight: number;\r\n buttonSize: number;\r\n margin: number;\r\n};\r\n\r\nexport const FLOATING_BUTTON_SIZE = 48;\r\nexport const FLOATING_BUTTON_MARGIN = 16;\r\nexport const FLOATING_BUTTON_BOTTOM = 24;\r\nexport const FLOATING_BUTTON_TAP_THRESHOLD = 8;\r\n\r\nexport function getCornerPosition(\r\n corner: FloatingButtonCorner,\r\n layout: FloatingButtonLayout,\r\n bottomInset = FLOATING_BUTTON_BOTTOM,\r\n): FloatingButtonPosition {\r\n const { windowWidth, windowHeight, buttonSize, margin } = layout;\r\n const y = windowHeight - bottomInset - buttonSize;\r\n\r\n return {\r\n x: corner === 'bottom-right' ? windowWidth - margin - buttonSize : margin,\r\n y,\r\n };\r\n}\r\n\r\nexport function clampFloatingPosition(\r\n position: FloatingButtonPosition,\r\n layout: FloatingButtonLayout,\r\n): FloatingButtonPosition {\r\n const { windowWidth, windowHeight, buttonSize, margin } = layout;\r\n\r\n return {\r\n x: Math.min(Math.max(margin, position.x), windowWidth - margin - buttonSize),\r\n y: Math.min(Math.max(margin, position.y), windowHeight - margin - buttonSize),\r\n };\r\n}\r\n\r\nexport function snapFloatingPositionToEdges(\r\n position: FloatingButtonPosition,\r\n layout: FloatingButtonLayout,\r\n): FloatingButtonPosition {\r\n const { windowWidth, windowHeight, buttonSize, margin } = layout;\r\n const clamped = clampFloatingPosition(position, layout);\r\n const centerX = clamped.x + buttonSize / 2;\r\n const centerY = clamped.y + buttonSize / 2;\r\n\r\n let x = centerX < windowWidth / 2 ? margin : windowWidth - margin - buttonSize;\r\n let y = clamped.y;\r\n\r\n if (centerY < windowHeight * 0.2) {\r\n y = margin;\r\n } else if (centerY > windowHeight * 0.8) {\r\n y = windowHeight - margin - buttonSize;\r\n }\r\n\r\n return { x, y };\r\n}\r\n\r\nexport function isFloatingButtonTap(totalMovement: number): boolean {\r\n return totalMovement < FLOATING_BUTTON_TAP_THRESHOLD;\r\n}\r\n","import MaterialCommunityIcons from '@expo/vector-icons/MaterialCommunityIcons';\r\nimport { useCallback, useEffect, useMemo, useRef, useState } from 'react';\r\nimport {\r\n PanResponder,\r\n Pressable,\r\n StyleSheet,\r\n View,\r\n useWindowDimensions,\r\n type StyleProp,\r\n type TextStyle,\r\n} from 'react-native';\r\nimport { useDevTools } from '../hooks/useDevTools';\r\nimport {\r\n FLOATING_BUTTON_MARGIN,\r\n FLOATING_BUTTON_SIZE,\r\n clampFloatingPosition,\r\n getCornerPosition,\r\n isFloatingButtonTap,\r\n snapFloatingPositionToEdges,\r\n type FloatingButtonCorner,\r\n type FloatingButtonPosition,\r\n} from '../utils/floatingButtonPosition';\r\nimport { getConnectionDotColor } from './ConnectionStatusBadge';\r\n\r\nconst DEFAULT_ICON_SIZE = 22;\r\nconst DEFAULT_ICON_COLOR = '#f8fafc';\r\n\r\nexport type FloatingDevToolsButtonProps = {\r\n position?: FloatingButtonCorner;\r\n iconStyle?: StyleProp<TextStyle>;\r\n draggable?: boolean;\r\n snapToEdges?: boolean;\r\n floatingPosition?: FloatingButtonPosition;\r\n onFloatingPositionChange?: (position: FloatingButtonPosition) => void;\r\n};\r\n\r\nexport function FloatingDevToolsButton({\r\n position = 'bottom-right',\r\n iconStyle,\r\n draggable = true,\r\n snapToEdges = true,\r\n floatingPosition,\r\n onFloatingPositionChange,\r\n}: FloatingDevToolsButtonProps) {\r\n const { connectionState, openLauncher } = useDevTools();\r\n const { width: windowWidth, height: windowHeight } = useWindowDimensions();\r\n const [internalPosition, setInternalPosition] = useState<FloatingButtonPosition | null>(null);\r\n const [dragPosition, setDragPosition] = useState<FloatingButtonPosition | null>(null);\r\n const dragOrigin = useRef<FloatingButtonPosition>({ x: 0, y: 0 });\r\n const hasInitialized = useRef(false);\r\n const onFloatingPositionChangeRef = useRef(onFloatingPositionChange);\r\n\r\n useEffect(() => {\r\n onFloatingPositionChangeRef.current = onFloatingPositionChange;\r\n }, [onFloatingPositionChange]);\r\n\r\n const layout = useMemo(\r\n () => ({\r\n windowWidth,\r\n windowHeight,\r\n buttonSize: FLOATING_BUTTON_SIZE,\r\n margin: FLOATING_BUTTON_MARGIN,\r\n }),\r\n [windowWidth, windowHeight],\r\n );\r\n\r\n const committedPosition = floatingPosition ?? internalPosition;\r\n const renderedPosition = dragPosition ?? committedPosition;\r\n\r\n const commitPosition = useCallback(\r\n (next: FloatingButtonPosition) => {\r\n const clamped = clampFloatingPosition(next, layout);\r\n\r\n if (!floatingPosition) {\r\n setInternalPosition(clamped);\r\n }\r\n\r\n onFloatingPositionChangeRef.current?.(clamped);\r\n return clamped;\r\n },\r\n [floatingPosition, layout],\r\n );\r\n\r\n useEffect(() => {\r\n if (windowWidth <= 0 || windowHeight <= 0) {\r\n return;\r\n }\r\n\r\n if (floatingPosition) {\r\n hasInitialized.current = true;\r\n return;\r\n }\r\n\r\n if (!hasInitialized.current) {\r\n setInternalPosition(getCornerPosition(position, layout));\r\n hasInitialized.current = true;\r\n }\r\n }, [floatingPosition, layout, position, windowHeight, windowWidth]);\r\n\r\n useEffect(() => {\r\n if (!committedPosition || windowWidth <= 0 || windowHeight <= 0) {\r\n return;\r\n }\r\n\r\n const clamped = clampFloatingPosition(committedPosition, layout);\r\n\r\n if (clamped.x !== committedPosition.x || clamped.y !== committedPosition.y) {\r\n commitPosition(clamped);\r\n }\r\n }, [commitPosition, committedPosition, layout, windowHeight, windowWidth]);\r\n\r\n const panResponder = useMemo(\r\n () =>\r\n PanResponder.create({\r\n onStartShouldSetPanResponder: () => draggable,\r\n onMoveShouldSetPanResponder: (_, gesture) =>\r\n draggable && (Math.abs(gesture.dx) > 2 || Math.abs(gesture.dy) > 2),\r\n onPanResponderGrant: () => {\r\n if (!committedPosition) {\r\n return;\r\n }\r\n\r\n dragOrigin.current = committedPosition;\r\n },\r\n onPanResponderMove: (_, gesture) => {\r\n setDragPosition(\r\n clampFloatingPosition(\r\n {\r\n x: dragOrigin.current.x + gesture.dx,\r\n y: dragOrigin.current.y + gesture.dy,\r\n },\r\n layout,\r\n ),\r\n );\r\n },\r\n onPanResponderRelease: (_, gesture) => {\r\n setDragPosition(null);\r\n\r\n const movement = Math.hypot(gesture.dx, gesture.dy);\r\n\r\n if (isFloatingButtonTap(movement)) {\r\n openLauncher();\r\n return;\r\n }\r\n\r\n const raw = {\r\n x: dragOrigin.current.x + gesture.dx,\r\n y: dragOrigin.current.y + gesture.dy,\r\n };\r\n const next = snapToEdges\r\n ? snapFloatingPositionToEdges(raw, layout)\r\n : clampFloatingPosition(raw, layout);\r\n\r\n commitPosition(next);\r\n },\r\n onPanResponderTerminate: () => {\r\n setDragPosition(null);\r\n },\r\n }),\r\n [commitPosition, committedPosition, draggable, layout, openLauncher, snapToEdges],\r\n );\r\n\r\n if (!renderedPosition) {\r\n return null;\r\n }\r\n\r\n const buttonContent = (\r\n <>\r\n <MaterialCommunityIcons\r\n color={DEFAULT_ICON_COLOR}\r\n name=\"database\"\r\n size={DEFAULT_ICON_SIZE}\r\n style={iconStyle}\r\n />\r\n <View\r\n style={[styles.statusDot, { backgroundColor: getConnectionDotColor(connectionState) }]}\r\n />\r\n </>\r\n );\r\n\r\n if (!draggable) {\r\n const positionStyle = position === 'bottom-left' ? styles.bottomLeft : styles.bottomRight;\r\n\r\n return (\r\n <View style={[styles.fixedContainer, positionStyle]} pointerEvents=\"box-none\">\r\n <Pressable\r\n accessibilityLabel=\"Open Database DevTools\"\r\n accessibilityRole=\"button\"\r\n onPress={openLauncher}\r\n style={({ pressed }) => [styles.button, pressed && styles.buttonPressed]}\r\n >\r\n {buttonContent}\r\n </Pressable>\r\n </View>\r\n );\r\n }\r\n\r\n return (\r\n <View\r\n pointerEvents=\"box-none\"\r\n style={[\r\n styles.draggableContainer,\r\n {\r\n transform: [\r\n { translateX: renderedPosition.x },\r\n { translateY: renderedPosition.y },\r\n ],\r\n },\r\n ]}\r\n {...panResponder.panHandlers}\r\n >\r\n <View\r\n accessibilityHint=\"Drag to move. Tap to open DevTools launcher.\"\r\n accessibilityLabel=\"Open Database DevTools\"\r\n accessibilityRole=\"button\"\r\n style={[styles.button, dragPosition && styles.buttonDragging]}\r\n >\r\n {buttonContent}\r\n </View>\r\n </View>\r\n );\r\n}\r\n\r\nconst styles = StyleSheet.create({\r\n fixedContainer: {\r\n position: 'absolute',\r\n bottom: 24,\r\n zIndex: 9999,\r\n },\r\n bottomRight: {\r\n right: 16,\r\n },\r\n bottomLeft: {\r\n left: 16,\r\n },\r\n draggableContainer: {\r\n position: 'absolute',\r\n top: 0,\r\n left: 0,\r\n zIndex: 9999,\r\n },\r\n button: {\r\n width: FLOATING_BUTTON_SIZE,\r\n height: FLOATING_BUTTON_SIZE,\r\n borderRadius: FLOATING_BUTTON_SIZE / 2,\r\n backgroundColor: '#1e293b',\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n shadowColor: '#000',\r\n shadowOffset: { width: 0, height: 2 },\r\n shadowOpacity: 0.25,\r\n shadowRadius: 4,\r\n elevation: 6,\r\n },\r\n buttonPressed: {\r\n opacity: 0.85,\r\n },\r\n buttonDragging: {\r\n opacity: 0.92,\r\n transform: [{ scale: 1.04 }],\r\n },\r\n statusDot: {\r\n position: 'absolute',\r\n top: 2,\r\n right: 2,\r\n width: 10,\r\n height: 10,\r\n borderRadius: 5,\r\n borderWidth: 2,\r\n borderColor: '#1e293b',\r\n },\r\n});\r\n","import { StyleSheet } from 'react-native';\r\n\r\nexport const explorerColors = {\r\n background: '#ffffff',\r\n surface: '#f8fafc',\r\n border: '#e2e8f0',\r\n text: '#0f172a',\r\n muted: '#64748b',\r\n subtle: '#94a3b8',\r\n accent: '#2563eb',\r\n accentSoft: '#dbeafe',\r\n error: '#dc2626',\r\n success: '#15803d',\r\n overlay: 'rgba(0, 0, 0, 0.45)',\r\n};\r\n\r\nexport const explorerStyles = StyleSheet.create({\r\n fullScreen: {\r\n flex: 1,\r\n backgroundColor: explorerColors.background,\r\n },\r\n header: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingHorizontal: 16,\r\n paddingVertical: 14,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n backgroundColor: explorerColors.background,\r\n },\r\n headerTitle: {\r\n fontSize: 17,\r\n fontWeight: '700',\r\n color: explorerColors.text,\r\n },\r\n headerAction: {\r\n fontSize: 16,\r\n color: explorerColors.accent,\r\n fontWeight: '600',\r\n },\r\n tabRow: {\r\n flexDirection: 'row',\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n backgroundColor: explorerColors.surface,\r\n },\r\n tab: {\r\n flex: 1,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n borderBottomWidth: 2,\r\n borderBottomColor: 'transparent',\r\n },\r\n tabActive: {\r\n borderBottomColor: explorerColors.accent,\r\n },\r\n tabLabel: {\r\n fontSize: 14,\r\n color: explorerColors.muted,\r\n fontWeight: '500',\r\n },\r\n tabLabelActive: {\r\n color: explorerColors.accent,\r\n fontWeight: '700',\r\n },\r\n content: {\r\n flex: 1,\r\n padding: 16,\r\n },\r\n sectionTitle: {\r\n fontSize: 12,\r\n fontWeight: '600',\r\n color: explorerColors.muted,\r\n textTransform: 'uppercase',\r\n letterSpacing: 0.5,\r\n marginBottom: 8,\r\n },\r\n infoRow: {\r\n marginBottom: 10,\r\n },\r\n infoLabel: {\r\n fontSize: 12,\r\n color: explorerColors.subtle,\r\n marginBottom: 2,\r\n },\r\n infoValue: {\r\n fontSize: 14,\r\n color: explorerColors.text,\r\n },\r\n mono: {\r\n fontFamily: 'monospace',\r\n fontSize: 12,\r\n },\r\n listItem: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingVertical: 12,\r\n paddingHorizontal: 12,\r\n borderRadius: 8,\r\n backgroundColor: explorerColors.surface,\r\n marginBottom: 8,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n },\r\n listItemTitle: {\r\n fontSize: 15,\r\n fontWeight: '600',\r\n color: explorerColors.text,\r\n fontFamily: 'monospace',\r\n },\r\n listItemMeta: {\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n },\r\n searchInput: {\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 14,\r\n color: explorerColors.text,\r\n backgroundColor: explorerColors.background,\r\n marginBottom: 12,\r\n },\r\n primaryButton: {\r\n backgroundColor: explorerColors.accent,\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n },\r\n primaryButtonDisabled: {\r\n opacity: 0.5,\r\n },\r\n primaryButtonLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n secondaryButton: {\r\n backgroundColor: '#1e293b',\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n },\r\n secondaryButtonLabel: {\r\n color: '#f8fafc',\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n ghostButton: {\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingVertical: 12,\r\n alignItems: 'center',\r\n justifyContent: 'center',\r\n minHeight: 44,\r\n backgroundColor: explorerColors.background,\r\n },\r\n ghostButtonLabel: {\r\n color: explorerColors.text,\r\n fontSize: 15,\r\n fontWeight: '600',\r\n },\r\n errorText: {\r\n fontSize: 13,\r\n color: explorerColors.error,\r\n marginTop: 8,\r\n },\r\n hintText: {\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n marginTop: 8,\r\n lineHeight: 18,\r\n },\r\n placeholder: {\r\n fontSize: 14,\r\n color: explorerColors.subtle,\r\n fontStyle: 'italic',\r\n textAlign: 'center',\r\n marginTop: 24,\r\n },\r\n sqlInput: {\r\n minHeight: 120,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 13,\r\n fontFamily: 'monospace',\r\n color: explorerColors.text,\r\n textAlignVertical: 'top',\r\n backgroundColor: explorerColors.surface,\r\n },\r\n sqlTabRoot: {\r\n flex: 1,\r\n minHeight: 0,\r\n },\r\n sqlQueryPane: {\r\n flexShrink: 0,\r\n paddingHorizontal: 16,\r\n paddingTop: 16,\r\n paddingBottom: 12,\r\n gap: 12,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n backgroundColor: explorerColors.background,\r\n },\r\n sqlInputCompact: {\r\n minHeight: 96,\r\n maxHeight: 120,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n paddingHorizontal: 12,\r\n paddingVertical: 10,\r\n fontSize: 13,\r\n fontFamily: 'monospace',\r\n color: explorerColors.text,\r\n textAlignVertical: 'top',\r\n backgroundColor: explorerColors.surface,\r\n },\r\n sqlResultsPane: {\r\n flex: 1,\r\n minHeight: 0,\r\n paddingHorizontal: 16,\r\n paddingTop: 8,\r\n paddingBottom: 16,\r\n },\r\n sqlResultsEmpty: {\r\n flex: 1,\r\n justifyContent: 'center',\r\n paddingHorizontal: 16,\r\n },\r\n subTabRow: {\r\n flexDirection: 'row',\r\n gap: 8,\r\n marginBottom: 12,\r\n },\r\n subTab: {\r\n paddingHorizontal: 12,\r\n paddingVertical: 6,\r\n borderRadius: 999,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n backgroundColor: explorerColors.background,\r\n },\r\n subTabActive: {\r\n borderColor: explorerColors.accent,\r\n backgroundColor: explorerColors.accentSoft,\r\n },\r\n subTabLabel: {\r\n fontSize: 13,\r\n color: explorerColors.muted,\r\n },\r\n subTabLabelActive: {\r\n color: explorerColors.accent,\r\n fontWeight: '600',\r\n },\r\n paginationRow: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n paddingVertical: 12,\r\n borderTopWidth: StyleSheet.hairlineWidth,\r\n borderTopColor: explorerColors.border,\r\n },\r\n paginationLabel: {\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n },\r\n});\r\n\r\nexport const tableStyles = StyleSheet.create({\r\n viewRoot: {\r\n flex: 1,\r\n minHeight: 0,\r\n },\r\n viewToolbar: {\r\n flexDirection: 'row',\r\n alignItems: 'center',\r\n justifyContent: 'space-between',\r\n gap: 8,\r\n marginBottom: 8,\r\n flexWrap: 'wrap',\r\n },\r\n viewMeta: {\r\n flex: 1,\r\n fontSize: 12,\r\n color: explorerColors.muted,\r\n },\r\n viewToggle: {\r\n flexDirection: 'row',\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n overflow: 'hidden',\r\n },\r\n viewToggleButton: {\r\n paddingHorizontal: 10,\r\n paddingVertical: 6,\r\n backgroundColor: explorerColors.background,\r\n },\r\n viewToggleButtonActive: {\r\n backgroundColor: explorerColors.accentSoft,\r\n },\r\n viewToggleLabel: {\r\n fontSize: 12,\r\n fontWeight: '600',\r\n color: explorerColors.muted,\r\n },\r\n viewToggleLabelActive: {\r\n color: explorerColors.accent,\r\n },\r\n footerHint: {\r\n flexShrink: 0,\r\n marginTop: 8,\r\n fontSize: 11,\r\n color: explorerColors.subtle,\r\n textAlign: 'center',\r\n },\r\n tableContainer: {\r\n flex: 1,\r\n minHeight: 0,\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n overflow: 'hidden',\r\n backgroundColor: explorerColors.background,\r\n },\r\n horizontalScroll: {\r\n flex: 1,\r\n },\r\n scrollHint: {\r\n paddingHorizontal: 10,\r\n paddingVertical: 6,\r\n fontSize: 11,\r\n color: explorerColors.muted,\r\n backgroundColor: explorerColors.surface,\r\n borderBottomWidth: StyleSheet.hairlineWidth,\r\n borderBottomColor: explorerColors.border,\r\n },\r\n headerRow: {\r\n flexDirection: 'row',\r\n backgroundColor: '#f1f5f9',\r\n borderBottomWidth: 1,\r\n borderBottomColor: explorerColors.border,\r\n },\r\n headerCell: {\r\n backgroundColor: '#f1f5f9',\r\n },\r\n headerText: {\r\n fontSize: 12,\r\n fontWeight: '700',\r\n color: explorerColors.text,\r\n fontFamily: 'monospace',\r\n },\r\n bodyList: {\r\n flex: 1,\r\n },\r\n dataRow: {\r\n flexDirection: 'row',\r\n backgroundColor: explorerColors.background,\r\n },\r\n dataRowAlt: {\r\n backgroundColor: explorerColors.surface,\r\n },\r\n cell: {\r\n paddingHorizontal: 10,\r\n paddingVertical: 8,\r\n borderRightWidth: 1,\r\n borderBottomWidth: 1,\r\n borderColor: explorerColors.border,\r\n justifyContent: 'center',\r\n },\r\n cellText: {\r\n fontSize: 13,\r\n color: explorerColors.text,\r\n },\r\n cellTextMono: {\r\n fontFamily: 'monospace',\r\n fontSize: 12,\r\n },\r\n cellNull: {\r\n color: explorerColors.subtle,\r\n fontStyle: 'italic',\r\n },\r\n copiedHint: {\r\n marginTop: 2,\r\n fontSize: 10,\r\n color: explorerColors.accent,\r\n fontWeight: '600',\r\n },\r\n cardList: {\r\n paddingBottom: 8,\r\n gap: 8,\r\n },\r\n card: {\r\n borderWidth: 1,\r\n borderColor: explorerColors.border,\r\n borderRadius: 8,\r\n backgroundColor: explorerColors.surface,\r\n padding: 12,\r\n gap: 10,\r\n },\r\n cardField: {\r\n gap: 2,\r\n },\r\n cardLabel: {\r\n fontSize: 11,\r\n fontWeight: '600',\r\n color: explorerColors.muted,\r\n textTransform: 'uppercase',\r\n letterSpacing: 0.4,\r\n },\r\n cardValue: {\r\n fontSize: 14,\r\n color: explorerColors.text,\r\n },\r\n cardValueMono: {\r\n fontFamily: 'monospace',\r\n fontSize: 13,\r\n },\r\n detailBody: {\r\n flex: 1,\r\n minHeight: 0,\r\n paddingHorizontal: 16,\r\n },\r\n detailDataPane: {\r\n flex: 1,\r\n minHeight: 0,\r\n },\r\n});\r\n","import { Pressable, ScrollView, Text, View } from 'react-native';\r\nimport type { MobileDatabaseInfo } from '../../mobile/types';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerOverviewTabProps = {\r\n info: MobileDatabaseInfo | null;\r\n loading: boolean;\r\n error: string | null;\r\n onOpenTables: () => void;\r\n onOpenSql: () => void;\r\n};\r\n\r\nfunction formatBytes(bytes: number): string {\r\n if (bytes < 1024) {\r\n return `${bytes} B`;\r\n }\r\n\r\n if (bytes < 1024 * 1024) {\r\n return `${(bytes / 1024).toFixed(1)} KB`;\r\n }\r\n\r\n return `${(bytes / (1024 * 1024)).toFixed(1)} MB`;\r\n}\r\n\r\nexport function ExplorerOverviewTab({\r\n info,\r\n loading,\r\n error,\r\n onOpenTables,\r\n onOpenSql,\r\n}: ExplorerOverviewTabProps) {\r\n if (loading) {\r\n return <Text style={explorerStyles.placeholder}>Loading database info…</Text>;\r\n }\r\n\r\n if (error) {\r\n return <Text style={explorerStyles.errorText}>{error}</Text>;\r\n }\r\n\r\n if (!info) {\r\n return <Text style={explorerStyles.placeholder}>No database information available.</Text>;\r\n }\r\n\r\n return (\r\n <ScrollView contentContainerStyle={explorerStyles.content}>\r\n <Text style={explorerStyles.sectionTitle}>Database</Text>\r\n <Info label=\"Name\" value={info.name} />\r\n <Info label=\"Path\" value={info.path} mono />\r\n <Info label=\"SQLite version\" value={info.sqliteVersion} />\r\n <Info label=\"Tables\" value={String(info.tableCount)} />\r\n <Info label=\"Estimated size\" value={formatBytes(info.estimatedSizeBytes)} />\r\n <Info\r\n label=\"Pages\"\r\n value={`${info.pageCount.toLocaleString()} × ${info.pageSize} bytes`}\r\n />\r\n\r\n <View style={{ height: 16 }} />\r\n <Text style={explorerStyles.sectionTitle}>Quick actions</Text>\r\n <View style={{ gap: 8 }}>\r\n <ActionButton label=\"Browse tables\" onPress={onOpenTables} />\r\n <ActionButton label=\"Run SQL query\" onPress={onOpenSql} />\r\n </View>\r\n </ScrollView>\r\n );\r\n}\r\n\r\nfunction Info({ label, value, mono = false }: { label: string; value: string; mono?: boolean }) {\r\n return (\r\n <View style={explorerStyles.infoRow}>\r\n <Text style={explorerStyles.infoLabel}>{label}</Text>\r\n <Text style={[explorerStyles.infoValue, mono && explorerStyles.mono]} selectable>\r\n {value}\r\n </Text>\r\n </View>\r\n );\r\n}\r\n\r\nfunction ActionButton({ label, onPress }: { label: string; onPress: () => void }) {\r\n return (\r\n <Pressable onPress={onPress} style={explorerStyles.ghostButton}>\r\n <Text style={explorerStyles.ghostButtonLabel}>{label}</Text>\r\n </Pressable>\r\n );\r\n}\r\n","export const DEFAULT_MOBILE_SQL = '';\r\n\r\nexport const DEFAULT_PAGE_SIZE = 50;\r\n","const CHAR_WIDTH = 7.5;\r\nconst CELL_PADDING = 24;\r\nconst MIN_COLUMN_WIDTH = 72;\r\nconst MAX_COLUMN_WIDTH = 280;\r\nconst SAMPLE_ROW_LIMIT = 20;\r\n\r\nfunction hintMinWidth(columnName: string): number {\r\n const lower = columnName.toLowerCase();\r\n\r\n if (lower === 'id' || lower.endsWith('_id')) {\r\n return 80;\r\n }\r\n\r\n if (lower.includes('email')) {\r\n return 168;\r\n }\r\n\r\n if (lower.includes('created_at') || lower.includes('updated_at') || lower.endsWith('_at')) {\r\n return 188;\r\n }\r\n\r\n if (lower === 'name' || lower.includes('title')) {\r\n return 128;\r\n }\r\n\r\n if (lower === 'status' || lower === 'type') {\r\n return 96;\r\n }\r\n\r\n return MIN_COLUMN_WIDTH;\r\n}\r\n\r\nfunction measureText(text: string): number {\r\n return Math.ceil(text.length * CHAR_WIDTH) + CELL_PADDING;\r\n}\r\n\r\nfunction formatCellValue(value: string | number | null): string {\r\n if (value === null) {\r\n return 'NULL';\r\n }\r\n\r\n return String(value);\r\n}\r\n\r\nexport function computeColumnWidths(\r\n columns: string[],\r\n rows: (string | number | null)[][],\r\n): number[] {\r\n const sampleRows = rows.slice(0, SAMPLE_ROW_LIMIT);\r\n\r\n return columns.map((column, columnIndex) => {\r\n let maxWidth = measureText(column);\r\n\r\n for (const row of sampleRows) {\r\n const cell = formatCellValue(row[columnIndex] ?? null);\r\n maxWidth = Math.max(maxWidth, measureText(cell));\r\n }\r\n\r\n maxWidth = Math.max(maxWidth, hintMinWidth(column));\r\n\r\n return Math.min(MAX_COLUMN_WIDTH, Math.max(MIN_COLUMN_WIDTH, maxWidth));\r\n });\r\n}\r\n\r\nexport function totalTableWidth(columnWidths: number[]): number {\r\n return columnWidths.reduce((sum, width) => sum + width, 0);\r\n}\r\n\r\nexport function defaultMobileDataViewMode(): 'table' {\r\n return 'table';\r\n}\r\n\r\nexport function isMonospaceColumn(columnName: string): boolean {\r\n const lower = columnName.toLowerCase();\r\n\r\n return (\r\n lower === 'id' ||\r\n lower.endsWith('_id') ||\r\n lower.includes('created_at') ||\r\n lower.includes('updated_at') ||\r\n lower.endsWith('_at') ||\r\n lower.includes('date') ||\r\n lower.includes('time')\r\n );\r\n}\r\n","/** Web / Node fallback — clipboard is provided by the native module. */\r\nexport async function copyToClipboard(_text: string): Promise<boolean> {\r\n return false;\r\n}\r\n","import { useState } from 'react';\r\nimport { FlatList, Pressable, Text, View } from 'react-native';\r\nimport { isMonospaceColumn } from '../../mobile/computeColumnWidths';\r\nimport { copyToClipboard } from '../../mobile/copyToClipboard';\r\nimport { tableStyles } from './mobileExplorerStyles';\r\n\r\ntype MobileDataCardListProps = {\r\n columns: string[];\r\n rows: (string | number | null)[][];\r\n};\r\n\r\nfunction formatValue(value: string | number | null): string {\r\n return value === null ? 'NULL' : String(value);\r\n}\r\n\r\nexport function MobileDataCardList({ columns, rows }: MobileDataCardListProps) {\r\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\r\n\r\n const copyValue = async (value: string, key: string) => {\r\n await copyToClipboard(value);\r\n setCopiedKey(key);\r\n setTimeout(() => setCopiedKey(null), 1500);\r\n };\r\n\r\n return (\r\n <FlatList\r\n data={rows}\r\n keyExtractor={(_, index) => String(index)}\r\n contentContainerStyle={tableStyles.cardList}\r\n style={tableStyles.bodyList}\r\n renderItem={({ item: row, index: rowIndex }) => (\r\n <View style={tableStyles.card}>\r\n {columns.map((column, columnIndex) => {\r\n const value = formatValue(row[columnIndex] ?? null);\r\n const key = `${rowIndex}-${column}`;\r\n const isNull = row[columnIndex] === null;\r\n\r\n return (\r\n <Pressable\r\n key={key}\r\n onPress={() => void copyValue(value, key)}\r\n style={tableStyles.cardField}\r\n >\r\n <Text style={tableStyles.cardLabel}>{column}</Text>\r\n <Text\r\n style={[\r\n tableStyles.cardValue,\r\n isMonospaceColumn(column) && tableStyles.cardValueMono,\r\n isNull && tableStyles.cellNull,\r\n ]}\r\n >\r\n {value}\r\n </Text>\r\n {copiedKey === key && <Text style={tableStyles.copiedHint}>Copied</Text>}\r\n </Pressable>\r\n );\r\n })}\r\n </View>\r\n )}\r\n />\r\n );\r\n}\r\n","import { useMemo, useState } from 'react';\r\nimport {\r\n FlatList,\r\n Pressable,\r\n ScrollView,\r\n Text,\r\n useWindowDimensions,\r\n View,\r\n} from 'react-native';\r\nimport {\r\n computeColumnWidths,\r\n isMonospaceColumn,\r\n totalTableWidth,\r\n} from '../../mobile/computeColumnWidths';\r\nimport { copyToClipboard } from '../../mobile/copyToClipboard';\r\nimport { tableStyles } from './mobileExplorerStyles';\r\n\r\ntype MobileDataTableProps = {\r\n columns: string[];\r\n rows: (string | number | null)[][];\r\n columnWidths?: number[];\r\n};\r\n\r\nfunction formatValue(value: string | number | null): string {\r\n return value === null ? 'NULL' : String(value);\r\n}\r\n\r\nexport function MobileDataTable({ columns, rows, columnWidths: columnWidthsProp }: MobileDataTableProps) {\r\n const { width: windowWidth } = useWindowDimensions();\r\n const [copiedKey, setCopiedKey] = useState<string | null>(null);\r\n\r\n const columnWidths = useMemo(\r\n () => columnWidthsProp ?? computeColumnWidths(columns, rows),\r\n [columnWidthsProp, columns, rows],\r\n );\r\n\r\n const tableWidth = useMemo(() => totalTableWidth(columnWidths), [columnWidths]);\r\n const showScrollHint = tableWidth > windowWidth - 32;\r\n\r\n const copyCell = async (value: string, key: string) => {\r\n await copyToClipboard(value);\r\n setCopiedKey(key);\r\n setTimeout(() => setCopiedKey(null), 1500);\r\n };\r\n\r\n if (columns.length === 0) {\r\n return null;\r\n }\r\n\r\n const headerRow = (\r\n <View style={tableStyles.headerRow}>\r\n {columns.map((column, index) => (\r\n <View\r\n key={column}\r\n style={[tableStyles.cell, tableStyles.headerCell, { width: columnWidths[index] }]}\r\n >\r\n <Text style={tableStyles.headerText}>{column}</Text>\r\n </View>\r\n ))}\r\n </View>\r\n );\r\n\r\n return (\r\n <View style={tableStyles.tableContainer}>\r\n {showScrollHint && (\r\n <Text style={tableStyles.scrollHint}>Swipe horizontally for more columns</Text>\r\n )}\r\n <ScrollView\r\n horizontal\r\n bounces={false}\r\n nestedScrollEnabled\r\n showsHorizontalScrollIndicator\r\n style={tableStyles.horizontalScroll}\r\n >\r\n <View style={{ width: tableWidth, flex: 1 }}>\r\n {headerRow}\r\n <FlatList\r\n data={rows}\r\n keyExtractor={(_, index) => String(index)}\r\n nestedScrollEnabled\r\n style={tableStyles.bodyList}\r\n renderItem={({ item: row, index: rowIndex }) => (\r\n <View style={[tableStyles.dataRow, rowIndex % 2 === 1 && tableStyles.dataRowAlt]}>\r\n {row.map((cell, cellIndex) => {\r\n const column = columns[cellIndex]!;\r\n const display = formatValue(cell);\r\n const key = `${rowIndex}-${cellIndex}`;\r\n const isNull = cell === null;\r\n\r\n return (\r\n <Pressable\r\n key={key}\r\n onPress={() => void copyCell(display, key)}\r\n style={[tableStyles.cell, { width: columnWidths[cellIndex] }]}\r\n >\r\n <Text\r\n numberOfLines={2}\r\n selectable\r\n style={[\r\n tableStyles.cellText,\r\n isMonospaceColumn(column) && tableStyles.cellTextMono,\r\n isNull && tableStyles.cellNull,\r\n ]}\r\n >\r\n {display}\r\n </Text>\r\n {copiedKey === key && <Text style={tableStyles.copiedHint}>Copied</Text>}\r\n </Pressable>\r\n );\r\n })}\r\n </View>\r\n )}\r\n />\r\n </View>\r\n </ScrollView>\r\n </View>\r\n );\r\n}\r\n","import { useEffect, useMemo, useState } from 'react';\r\nimport { Pressable, Text, View } from 'react-native';\r\nimport {\r\n computeColumnWidths,\r\n totalTableWidth,\r\n} from '../../mobile/computeColumnWidths';\r\nimport { MobileDataCardList } from './MobileDataCardList';\r\nimport { MobileDataTable } from './MobileDataTable';\r\nimport { explorerStyles, tableStyles } from './mobileExplorerStyles';\r\n\r\nexport type MobileDataViewMode = 'table' | 'cards';\r\n\r\ntype MobileDataViewProps = {\r\n columns: string[];\r\n rows: (string | number | null)[][];\r\n metaSuffix?: string;\r\n defaultMode?: MobileDataViewMode;\r\n dataKey?: string;\r\n};\r\n\r\nexport function MobileDataView({\r\n columns,\r\n rows,\r\n metaSuffix,\r\n defaultMode = 'table',\r\n dataKey,\r\n}: MobileDataViewProps) {\r\n const [mode, setMode] = useState<MobileDataViewMode>(defaultMode);\r\n\r\n const columnWidths = useMemo(() => computeColumnWidths(columns, rows), [columns, rows]);\r\n const tableWidth = useMemo(() => totalTableWidth(columnWidths), [columnWidths]);\r\n const columnsKey = columns.join('|');\r\n\r\n useEffect(() => {\r\n setMode(defaultMode);\r\n }, [columnsKey, dataKey, defaultMode, rows.length]);\r\n\r\n if (columns.length === 0) {\r\n return <Text style={explorerStyles.placeholder}>No rows to display.</Text>;\r\n }\r\n\r\n const meta = `${rows.length} row${rows.length === 1 ? '' : 's'} · ${columns.length} column${\r\n columns.length === 1 ? '' : 's'\r\n }${metaSuffix ? ` · ${metaSuffix}` : ''}`;\r\n\r\n return (\r\n <View style={tableStyles.viewRoot}>\r\n <View style={tableStyles.viewToolbar}>\r\n <Text style={tableStyles.viewMeta}>{meta}</Text>\r\n <View style={tableStyles.viewToggle}>\r\n <Pressable\r\n onPress={() => setMode('cards')}\r\n style={[tableStyles.viewToggleButton, mode === 'cards' && tableStyles.viewToggleButtonActive]}\r\n >\r\n <Text\r\n style={[tableStyles.viewToggleLabel, mode === 'cards' && tableStyles.viewToggleLabelActive]}\r\n >\r\n Cards\r\n </Text>\r\n </Pressable>\r\n <Pressable\r\n onPress={() => setMode('table')}\r\n style={[tableStyles.viewToggleButton, mode === 'table' && tableStyles.viewToggleButtonActive]}\r\n >\r\n <Text\r\n style={[tableStyles.viewToggleLabel, mode === 'table' && tableStyles.viewToggleLabelActive]}\r\n >\r\n Table\r\n </Text>\r\n </Pressable>\r\n </View>\r\n </View>\r\n\r\n {mode === 'cards' ? (\r\n <MobileDataCardList columns={columns} rows={rows} />\r\n ) : (\r\n <MobileDataTable columnWidths={columnWidths} columns={columns} rows={rows} />\r\n )}\r\n\r\n {mode === 'table' && tableWidth > 320 && (\r\n <Text style={tableStyles.footerHint}>Tap a cell to copy its value</Text>\r\n )}\r\n {mode === 'cards' && (\r\n <Text style={tableStyles.footerHint}>Tap a field to copy its value</Text>\r\n )}\r\n </View>\r\n );\r\n}\r\n","import { useState } from 'react';\r\nimport {\r\n ActivityIndicator,\r\n Pressable,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport type { QueryResult } from '../../types/inspection';\r\nimport type { MobileDatabaseInspector } from '../../mobile/types';\r\nimport { DEFAULT_MOBILE_SQL } from '../../mobile/constants';\r\nimport { MobileDataView } from './MobileDataView';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerSqlTabProps = {\r\n inspector: MobileDatabaseInspector;\r\n};\r\n\r\nexport function ExplorerSqlTab({ inspector }: ExplorerSqlTabProps) {\r\n const [sql, setSql] = useState(DEFAULT_MOBILE_SQL);\r\n const [result, setResult] = useState<QueryResult | null>(null);\r\n const [error, setError] = useState<string | null>(null);\r\n const [running, setRunning] = useState(false);\r\n const [panel, setPanel] = useState<'results' | 'output'>('results');\r\n const [resultKey, setResultKey] = useState(0);\r\n\r\n const runQuery = async () => {\r\n setRunning(true);\r\n setError(null);\r\n\r\n try {\r\n const queryResult = await inspector.executeQuery(sql);\r\n setResult(queryResult);\r\n setResultKey((current) => current + 1);\r\n setPanel('results');\r\n } catch (runError) {\r\n const message = runError instanceof Error ? runError.message : 'Query failed';\r\n setError(message);\r\n setResult(null);\r\n setPanel('output');\r\n } finally {\r\n setRunning(false);\r\n }\r\n };\r\n\r\n const renderResultsContent = () => {\r\n if (panel === 'output') {\r\n if (error) {\r\n return <Text style={explorerStyles.errorText}>{error}</Text>;\r\n }\r\n\r\n if (result) {\r\n return (\r\n <Text style={explorerStyles.infoValue}>\r\n Query executed successfully. {result.rowCount} row\r\n {result.rowCount === 1 ? '' : 's'} in {result.durationMs.toFixed(1)} ms.\r\n </Text>\r\n );\r\n }\r\n\r\n return <Text style={explorerStyles.placeholder}>Messages and errors appear here.</Text>;\r\n }\r\n\r\n if (!result) {\r\n return (\r\n <View style={explorerStyles.sqlResultsEmpty}>\r\n <Text style={[explorerStyles.placeholder, { marginTop: 0 }]}>\r\n Run a query to see results.\r\n </Text>\r\n </View>\r\n );\r\n }\r\n\r\n if (result.columns.length === 0) {\r\n return (\r\n <View style={explorerStyles.sqlResultsEmpty}>\r\n <Text style={[explorerStyles.placeholder, { marginTop: 0 }]}>\r\n Query completed with no result set ({result.durationMs.toFixed(1)} ms).\r\n </Text>\r\n </View>\r\n );\r\n }\r\n\r\n return (\r\n <MobileDataView\r\n columns={result.columns}\r\n dataKey={String(resultKey)}\r\n defaultMode=\"table\"\r\n metaSuffix={`${result.durationMs.toFixed(1)} ms`}\r\n rows={result.rows}\r\n />\r\n );\r\n };\r\n\r\n return (\r\n <View style={explorerStyles.sqlTabRoot}>\r\n <View style={explorerStyles.sqlQueryPane}>\r\n <Text style={explorerStyles.sectionTitle}>SQL (read-only)</Text>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n multiline\r\n onChangeText={setSql}\r\n scrollEnabled\r\n style={explorerStyles.sqlInputCompact}\r\n value={sql}\r\n />\r\n <Pressable\r\n disabled={running}\r\n onPress={() => void runQuery()}\r\n style={[explorerStyles.primaryButton, running && explorerStyles.primaryButtonDisabled]}\r\n >\r\n {running ? (\r\n <ActivityIndicator color=\"#f8fafc\" />\r\n ) : (\r\n <Text style={explorerStyles.primaryButtonLabel}>Run query</Text>\r\n )}\r\n </Pressable>\r\n <Text style={[explorerStyles.hintText, { marginTop: 0 }]}>\r\n Allowed: SELECT, PRAGMA, EXPLAIN, WITH. Writes are blocked in DevTools.\r\n </Text>\r\n </View>\r\n\r\n <View style={[explorerStyles.tabRow, { flexShrink: 0 }]}>\r\n <Pressable\r\n onPress={() => setPanel('results')}\r\n style={[explorerStyles.tab, panel === 'results' && explorerStyles.tabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.tabLabel, panel === 'results' && explorerStyles.tabLabelActive]}\r\n >\r\n Results{result ? ` (${result.rowCount})` : ''}\r\n </Text>\r\n </Pressable>\r\n <Pressable\r\n onPress={() => setPanel('output')}\r\n style={[explorerStyles.tab, panel === 'output' && explorerStyles.tabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.tabLabel, panel === 'output' && explorerStyles.tabLabelActive]}\r\n >\r\n Output\r\n </Text>\r\n </Pressable>\r\n </View>\r\n\r\n <View style={explorerStyles.sqlResultsPane}>{renderResultsContent()}</View>\r\n </View>\r\n );\r\n}\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport {\r\n ActivityIndicator,\r\n Pressable,\r\n ScrollView,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport type { ColumnInfo, TablePageResult } from '../../types/inspection';\r\nimport type { MobileDatabaseInspector } from '../../mobile/types';\r\nimport { DEFAULT_PAGE_SIZE } from '../../mobile/constants';\r\nimport { MobileDataView } from './MobileDataView';\r\nimport { explorerStyles, tableStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerTableDetailProps = {\r\n inspector: MobileDatabaseInspector;\r\n tableName: string;\r\n onBack: () => void;\r\n};\r\n\r\ntype DetailView = 'data' | 'schema';\r\n\r\nexport function ExplorerTableDetail({ inspector, tableName, onBack }: ExplorerTableDetailProps) {\r\n const [view, setView] = useState<DetailView>('data');\r\n const [columns, setColumns] = useState<ColumnInfo[]>([]);\r\n const [pageResult, setPageResult] = useState<TablePageResult | null>(null);\r\n const [search, setSearch] = useState('');\r\n const [page, setPage] = useState(1);\r\n const [loading, setLoading] = useState(true);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadData = useCallback(async () => {\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const nextColumns = await inspector.getTableColumns(tableName);\r\n setColumns(nextColumns);\r\n\r\n const result = await inspector.fetchTablePage({\r\n table: tableName,\r\n page,\r\n pageSize: DEFAULT_PAGE_SIZE,\r\n search,\r\n });\r\n\r\n setPageResult(result);\r\n } catch (loadError) {\r\n setError(loadError instanceof Error ? loadError.message : 'Failed to load table');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [inspector, page, search, tableName]);\r\n\r\n useEffect(() => {\r\n void loadData();\r\n }, [loadData]);\r\n\r\n const totalPages = pageResult\r\n ? Math.max(1, Math.ceil(pageResult.totalCount / pageResult.pageSize))\r\n : 1;\r\n\r\n return (\r\n <View style={explorerStyles.fullScreen}>\r\n <View style={explorerStyles.header}>\r\n <Pressable onPress={onBack}>\r\n <Text style={explorerStyles.headerAction}>← Back</Text>\r\n </Pressable>\r\n <Text style={explorerStyles.headerTitle}>{tableName}</Text>\r\n <View style={{ width: 48 }} />\r\n </View>\r\n\r\n <View style={[explorerStyles.subTabRow, { paddingHorizontal: 16, paddingTop: 12 }]}>\r\n <Pressable\r\n onPress={() => setView('data')}\r\n style={[explorerStyles.subTab, view === 'data' && explorerStyles.subTabActive]}\r\n >\r\n <Text style={[explorerStyles.subTabLabel, view === 'data' && explorerStyles.subTabLabelActive]}>\r\n Data\r\n </Text>\r\n </Pressable>\r\n <Pressable\r\n onPress={() => setView('schema')}\r\n style={[explorerStyles.subTab, view === 'schema' && explorerStyles.subTabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.subTabLabel, view === 'schema' && explorerStyles.subTabLabelActive]}\r\n >\r\n Schema\r\n </Text>\r\n </Pressable>\r\n </View>\r\n\r\n {view === 'data' ? (\r\n <View style={tableStyles.detailBody}>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n onChangeText={(value) => {\r\n setSearch(value);\r\n setPage(1);\r\n }}\r\n placeholder=\"Search rows…\"\r\n style={explorerStyles.searchInput}\r\n value={search}\r\n />\r\n\r\n {loading ? (\r\n <ActivityIndicator style={{ marginTop: 24 }} />\r\n ) : error ? (\r\n <Text style={explorerStyles.errorText}>{error}</Text>\r\n ) : pageResult ? (\r\n <>\r\n <View style={tableStyles.detailDataPane}>\r\n <MobileDataView\r\n columns={pageResult.columns}\r\n dataKey={`${tableName}-${page}-${search}`}\r\n defaultMode=\"table\"\r\n metaSuffix={`page ${page} of ${totalPages}`}\r\n rows={pageResult.rows}\r\n />\r\n </View>\r\n <View style={explorerStyles.paginationRow}>\r\n <Pressable disabled={page <= 1} onPress={() => setPage((current) => current - 1)}>\r\n <Text style={explorerStyles.headerAction}>Previous</Text>\r\n </Pressable>\r\n <Text style={explorerStyles.paginationLabel}>\r\n Page {page} of {totalPages} · {pageResult.totalCount.toLocaleString()} rows\r\n </Text>\r\n <Pressable\r\n disabled={page >= totalPages}\r\n onPress={() => setPage((current) => current + 1)}\r\n >\r\n <Text style={explorerStyles.headerAction}>Next</Text>\r\n </Pressable>\r\n </View>\r\n </>\r\n ) : null}\r\n </View>\r\n ) : (\r\n <ScrollView contentContainerStyle={explorerStyles.content}>\r\n {columns.length === 0 ? (\r\n <Text style={explorerStyles.placeholder}>No schema information.</Text>\r\n ) : (\r\n columns.map((column) => (\r\n <View key={column.name} style={explorerStyles.listItem}>\r\n <View style={{ flex: 1 }}>\r\n <Text style={explorerStyles.listItemTitle}>{column.name}</Text>\r\n <Text style={explorerStyles.listItemMeta}>\r\n {column.type}\r\n {column.pk ? ' · PK' : ''}\r\n {column.notNull ? ' · NOT NULL' : ''}\r\n {column.defaultValue ? ` · DEFAULT ${column.defaultValue}` : ''}\r\n </Text>\r\n </View>\r\n </View>\r\n ))\r\n )}\r\n </ScrollView>\r\n )}\r\n </View>\r\n );\r\n}\r\n","import { useMemo, useState } from 'react';\r\nimport {\r\n FlatList,\r\n Pressable,\r\n Text,\r\n TextInput,\r\n View,\r\n} from 'react-native';\r\nimport type { TableInfo } from '../../types/inspection';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerTablesTabProps = {\r\n tables: TableInfo[];\r\n loading: boolean;\r\n error: string | null;\r\n onSelectTable: (tableName: string) => void;\r\n};\r\n\r\nexport function ExplorerTablesTab({\r\n tables,\r\n loading,\r\n error,\r\n onSelectTable,\r\n}: ExplorerTablesTabProps) {\r\n const [search, setSearch] = useState('');\r\n\r\n const filtered = useMemo(() => {\r\n const term = search.trim().toLowerCase();\r\n\r\n if (!term) {\r\n return tables;\r\n }\r\n\r\n return tables.filter((table) => table.name.toLowerCase().includes(term));\r\n }, [search, tables]);\r\n\r\n if (loading) {\r\n return <Text style={explorerStyles.placeholder}>Loading tables…</Text>;\r\n }\r\n\r\n if (error) {\r\n return <Text style={explorerStyles.errorText}>{error}</Text>;\r\n }\r\n\r\n return (\r\n <View style={{ flex: 1, padding: 16 }}>\r\n <TextInput\r\n autoCapitalize=\"none\"\r\n autoCorrect={false}\r\n onChangeText={setSearch}\r\n placeholder=\"Filter tables…\"\r\n style={explorerStyles.searchInput}\r\n value={search}\r\n />\r\n\r\n {filtered.length === 0 ? (\r\n <Text style={explorerStyles.placeholder}>No tables match your search.</Text>\r\n ) : (\r\n <FlatList\r\n data={filtered}\r\n keyExtractor={(item) => item.name}\r\n style={{ flex: 1 }}\r\n renderItem={({ item }) => (\r\n <Pressable onPress={() => onSelectTable(item.name)} style={explorerStyles.listItem}>\r\n <View>\r\n <Text style={explorerStyles.listItemTitle}>{item.name}</Text>\r\n <Text style={explorerStyles.listItemMeta}>\r\n {item.rowCount.toLocaleString()} row{item.rowCount === 1 ? '' : 's'}\r\n </Text>\r\n </View>\r\n <Text style={explorerStyles.listItemMeta}>›</Text>\r\n </Pressable>\r\n )}\r\n />\r\n )}\r\n </View>\r\n );\r\n}\r\n","import { useCallback, useEffect, useState } from 'react';\r\nimport { Modal, Pressable, Text, View } from 'react-native';\r\nimport { useDevTools } from '../../hooks/useDevTools';\r\nimport type { MobileDatabaseInfo } from '../../mobile/types';\r\nimport type { TableInfo } from '../../types/inspection';\r\nimport { ExplorerOverviewTab } from './ExplorerOverviewTab';\r\nimport { ExplorerSqlTab } from './ExplorerSqlTab';\r\nimport { ExplorerTableDetail } from './ExplorerTableDetail';\r\nimport { ExplorerTablesTab } from './ExplorerTablesTab';\r\nimport { explorerStyles } from './mobileExplorerStyles';\r\n\r\ntype ExplorerTab = 'overview' | 'tables' | 'sql';\r\n\r\ntype ExplorerScreen =\r\n | { kind: 'tabs' }\r\n | { kind: 'table'; tableName: string };\r\n\r\nexport function MobileDatabaseExplorer() {\r\n const { explorerVisible, closeExplorer, mobileInspector } = useDevTools();\r\n const [tab, setTab] = useState<ExplorerTab>('overview');\r\n const [screen, setScreen] = useState<ExplorerScreen>({ kind: 'tabs' });\r\n const [info, setInfo] = useState<MobileDatabaseInfo | null>(null);\r\n const [tables, setTables] = useState<TableInfo[]>([]);\r\n const [loading, setLoading] = useState(false);\r\n const [error, setError] = useState<string | null>(null);\r\n\r\n const loadOverview = useCallback(async () => {\r\n if (!mobileInspector) {\r\n return;\r\n }\r\n\r\n setLoading(true);\r\n setError(null);\r\n\r\n try {\r\n const [nextInfo, nextTables] = await Promise.all([\r\n mobileInspector.getDatabaseInfo(),\r\n mobileInspector.listTables(),\r\n ]);\r\n setInfo(nextInfo);\r\n setTables(nextTables);\r\n } catch (loadError) {\r\n setError(loadError instanceof Error ? loadError.message : 'Failed to load database');\r\n } finally {\r\n setLoading(false);\r\n }\r\n }, [mobileInspector]);\r\n\r\n useEffect(() => {\r\n if (!explorerVisible) {\r\n setScreen({ kind: 'tabs' });\r\n setTab('overview');\r\n return;\r\n }\r\n\r\n void loadOverview();\r\n }, [explorerVisible, loadOverview]);\r\n\r\n if (!mobileInspector) {\r\n return null;\r\n }\r\n\r\n return (\r\n <Modal animationType=\"slide\" onRequestClose={closeExplorer} visible={explorerVisible}>\r\n {screen.kind === 'table' ? (\r\n <ExplorerTableDetail\r\n inspector={mobileInspector}\r\n onBack={() => setScreen({ kind: 'tabs' })}\r\n tableName={screen.tableName}\r\n />\r\n ) : (\r\n <View style={explorerStyles.fullScreen}>\r\n <View style={explorerStyles.header}>\r\n <Text style={explorerStyles.headerTitle}>Database Explorer</Text>\r\n <Pressable accessibilityLabel=\"Close database explorer\" onPress={closeExplorer}>\r\n <Text style={explorerStyles.headerAction}>Close</Text>\r\n </Pressable>\r\n </View>\r\n\r\n <View style={explorerStyles.tabRow}>\r\n {(['overview', 'tables', 'sql'] as ExplorerTab[]).map((item) => (\r\n <Pressable\r\n key={item}\r\n onPress={() => setTab(item)}\r\n style={[explorerStyles.tab, tab === item && explorerStyles.tabActive]}\r\n >\r\n <Text\r\n style={[explorerStyles.tabLabel, tab === item && explorerStyles.tabLabelActive]}\r\n >\r\n {item === 'overview' ? 'Overview' : item === 'tables' ? 'Tables' : 'SQL'}\r\n </Text>\r\n </Pressable>\r\n ))}\r\n </View>\r\n\r\n <View style={{ flex: 1 }}>\r\n {tab === 'overview' && (\r\n <ExplorerOverviewTab\r\n error={error}\r\n info={info}\r\n loading={loading}\r\n onOpenSql={() => setTab('sql')}\r\n onOpenTables={() => setTab('tables')}\r\n />\r\n )}\r\n {tab === 'tables' && (\r\n <ExplorerTablesTab\r\n error={error}\r\n loading={loading}\r\n onSelectTable={(tableName) => setScreen({ kind: 'table', tableName })}\r\n tables={tables}\r\n />\r\n )}\r\n {tab === 'sql' && <ExplorerSqlTab inspector={mobileInspector} />}\r\n </View>\r\n </View>\r\n )}\r\n </Modal>\r\n );\r\n}\r\n","import { StyleSheet, View, type StyleProp, type TextStyle } from 'react-native';\r\nimport type { ConnectionState } from '../client/createDevToolsClient';\r\nimport type { DatabaseAdapter } from '../types/adapter';\r\nimport type { DatabaseKind } from '../types/kind';\r\nimport type { FloatingButtonPosition } from '../utils/floatingButtonPosition';\r\nimport { isDevToolsEnabled } from '../utils/isDevToolsEnabled';\r\nimport { DevToolsProvider } from './DevToolsProvider';\r\nimport { DevToolsLauncherModal } from './DevToolsLauncherModal';\r\nimport { DevToolsSettingsModal } from './DevToolsSettingsModal';\r\nimport { FloatingDevToolsButton } from './FloatingDevToolsButton';\r\nimport { MobileDatabaseExplorer } from './mobile/MobileDatabaseExplorer';\r\n\r\nexport type { ConnectionState };\r\nexport type { FloatingButtonPosition };\r\n\r\nexport type DatabaseDevToolsProps = {\r\n /** Raw database instance (auto-detected) or a resolved adapter. */\r\n database?: unknown;\r\n /** Explicit database kind override. */\r\n type?: DatabaseKind;\r\n /** Custom adapter override (advanced). */\r\n adapter?: DatabaseAdapter;\r\n serverUrl?: string;\r\n enabled?: boolean;\r\n position?: 'bottom-right' | 'bottom-left';\r\n /** Allow dragging the floating button around the screen. */\r\n draggable?: boolean;\r\n /** Snap the button to screen edges after dragging. */\r\n snapToEdges?: boolean;\r\n /** Controlled floating button position. */\r\n floatingPosition?: FloatingButtonPosition;\r\n /** Called when the user drags the floating button to a new position. */\r\n onFloatingPositionChange?: (position: FloatingButtonPosition) => void;\r\n /** Optional style for the floating button database icon. */\r\n style?: StyleProp<TextStyle>;\r\n onConnectionStateChange?: (state: ConnectionState) => void;\r\n};\r\n\r\nexport function DatabaseDevTools({\r\n database,\r\n type,\r\n adapter,\r\n serverUrl,\r\n enabled,\r\n position = 'bottom-right',\r\n draggable = true,\r\n snapToEdges = true,\r\n floatingPosition,\r\n onFloatingPositionChange,\r\n style,\r\n onConnectionStateChange,\r\n}: DatabaseDevToolsProps) {\r\n if (!isDevToolsEnabled(enabled)) {\r\n return null;\r\n }\r\n\r\n return (\r\n <DevToolsProvider\r\n adapter={adapter}\r\n database={database}\r\n onConnectionStateChange={onConnectionStateChange}\r\n serverUrl={serverUrl}\r\n type={type}\r\n >\r\n <View pointerEvents=\"box-none\" style={StyleSheet.absoluteFill}>\r\n <FloatingDevToolsButton\r\n draggable={draggable}\r\n floatingPosition={floatingPosition}\r\n iconStyle={style}\r\n onFloatingPositionChange={onFloatingPositionChange}\r\n position={position}\r\n snapToEdges={snapToEdges}\r\n />\r\n <DevToolsLauncherModal />\r\n <DevToolsSettingsModal />\r\n <MobileDatabaseExplorer />\r\n </View>\r\n </DevToolsProvider>\r\n );\r\n}\r\n","const RESET = '\\x1b[0m';\r\nconst GREEN = '\\x1b[32m';\r\nconst YELLOW = '\\x1b[33m';\r\nconst CYAN = '\\x1b[36m';\r\nconst RED = '\\x1b[31m';\r\nconst DIM = '\\x1b[2m';\r\n\r\nconst PREFIX = `${DIM}[database-devtools]${RESET}`;\r\n\r\nfunction log(color: string, symbol: string, message: string): void {\r\n console.log(`${PREFIX} ${color}${symbol}${RESET} ${message}`);\r\n}\r\n\r\nexport const logger = {\r\n browserConnected(connectionId?: string): void {\r\n const suffix = connectionId ? ` ${DIM}(${connectionId})${RESET}` : '';\r\n log(GREEN, '✓', `Browser Connected${suffix}`);\r\n },\r\n\r\n browserDisconnected(connectionId?: string): void {\r\n const suffix = connectionId ? ` ${DIM}(${connectionId})${RESET}` : '';\r\n log(YELLOW, '✓', `Browser Disconnected${suffix}`);\r\n },\r\n\r\n mobileConnected(deviceId?: string): void {\r\n const suffix = deviceId ? ` ${DIM}(deviceId: ${deviceId})${RESET}` : '';\r\n log(GREEN, '✓', `Mobile Connected${suffix}`);\r\n },\r\n\r\n mobileDisconnected(deviceId?: string): void {\r\n const suffix = deviceId ? ` ${DIM}(deviceId: ${deviceId})${RESET}` : '';\r\n log(YELLOW, '✓', `Mobile Disconnected${suffix}`);\r\n },\r\n\r\n broadcastSent(target?: string): void {\r\n const suffix = target ? ` ${DIM}→ ${target}${RESET}` : '';\r\n log(CYAN, '✓', `Broadcast Sent${suffix}`);\r\n },\r\n\r\n serverStarted(url: string, wsUrl: string, webUiEnabled = false): void {\r\n log(GREEN, '✓', `Server started at ${url}`);\r\n log(GREEN, '✓', `WebSocket endpoint ${wsUrl}`);\r\n\r\n if (webUiEnabled) {\r\n log(GREEN, '✓', `Browser UI available at ${url}`);\r\n }\r\n },\r\n\r\n heartbeatTimeout(connectionId: string): void {\r\n log(RED, '✓', `Heartbeat timeout — removing ${connectionId}`);\r\n },\r\n\r\n refreshStarted(deviceId: string): void {\r\n log(CYAN, '↻', `Refresh started ${DIM}(${deviceId})${RESET}`);\r\n },\r\n\r\n refreshUploaded(deviceId: string, bytes: number): void {\r\n log(GREEN, '↻', `Snapshot uploaded ${DIM}(${deviceId}, ${bytes} bytes)${RESET}`);\r\n },\r\n\r\n refreshFailed(deviceId: string, code: string, message: string): void {\r\n log(RED, '↻', `Refresh failed ${DIM}(${deviceId}: ${code})${RESET} ${message}`);\r\n },\r\n\r\n /** @deprecated Use refreshStarted */\r\n syncStarted(syncId: string, deviceId: string): void {\r\n this.refreshStarted(deviceId);\r\n },\r\n\r\n /** @deprecated Use refreshUploaded */\r\n syncUploaded(syncId: string, bytes: number): void {\r\n this.refreshUploaded(syncId, bytes);\r\n },\r\n\r\n /** @deprecated Use refreshFailed */\r\n syncFailed(syncId: string, code: string, message: string): void {\r\n this.refreshFailed(syncId, code, message);\r\n },\r\n\r\n error(message: string): void {\r\n log(RED, '✗', message);\r\n },\r\n};\r\n","import { existsSync } from 'node:fs';\r\nimport path from 'node:path';\r\nimport type { Express, Request, Response } from 'express';\r\nimport express from 'express';\r\n\r\nfunction shouldServeSpa(request: Request): boolean {\r\n if (request.method !== 'GET' && request.method !== 'HEAD') {\r\n return false;\r\n }\r\n\r\n if (request.path.startsWith('/api')) {\r\n return false;\r\n }\r\n\r\n if (request.path === '/health') {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function attachWebUi(app: Express, webDistPath: string): void {\r\n const indexPath = path.join(webDistPath, 'index.html');\r\n\r\n if (!existsSync(indexPath)) {\r\n return;\r\n }\r\n\r\n app.use(\r\n express.static(webDistPath, {\r\n index: false,\r\n setHeaders(response, filePath) {\r\n if (filePath.endsWith('.wasm')) {\r\n response.setHeader('Content-Type', 'application/wasm');\r\n }\r\n },\r\n }),\r\n );\r\n\r\n app.get('*', (request: Request, response: Response, next) => {\r\n if (!shouldServeSpa(request)) {\r\n next();\r\n return;\r\n }\r\n\r\n response.sendFile(indexPath);\r\n });\r\n}\r\n","import type { Server } from 'node:http';\r\nimport { WebSocketServer, type WebSocket } from 'ws';\r\nimport {\r\n DEVTOOLS_WS_PATH,\r\n DevToolsRole,\r\n isBeginTransactionRequestMessage,\r\n isCommitTransactionRequestMessage,\r\n isExportSnapshotRequestMessage,\r\n isPongMessage,\r\n isRefreshRequestMessage,\r\n isRegisterMessage,\r\n isRollbackTransactionRequestMessage,\r\n isTransactionAckMessage,\r\n isWriteAckMessage,\r\n isWriteRequestMessage,\r\n} from '../types/protocol';\r\nimport { logger } from '../utils/logger';\r\nimport type { ConnectionManager } from './connectionManager';\r\nimport type { Heartbeat } from './heartbeat';\r\nimport type { MessageRouter } from './messageRouter';\r\nimport type { RefreshCoordinator } from './refreshCoordinator';\r\nimport type { SnapshotFileStore } from './snapshotFileStore';\r\nimport type { WriteCoordinator } from './writeCoordinator';\r\n\r\nexport type AttachWebSocketOptions = {\r\n snapshotFileStore?: SnapshotFileStore;\r\n};\r\n\r\nexport type AttachWebSocketResult = {\r\n wss: WebSocketServer;\r\n};\r\n\r\nexport function attachWebSocket(\r\n httpServer: Server,\r\n connectionManager: ConnectionManager,\r\n router: MessageRouter,\r\n heartbeat: Heartbeat,\r\n refreshCoordinator: RefreshCoordinator,\r\n writeCoordinator: WriteCoordinator,\r\n options?: AttachWebSocketOptions,\r\n): AttachWebSocketResult {\r\n const wss = new WebSocketServer({ server: httpServer, path: DEVTOOLS_WS_PATH });\r\n\r\n const handleDisconnect = (socket: WebSocket): void => {\r\n const client = connectionManager.remove(socket);\r\n\r\n if (!client) {\r\n return;\r\n }\r\n\r\n if (client.role === DevToolsRole.MOBILE) {\r\n if (client.deviceId) {\r\n writeCoordinator.rollbackSessionsForDevice(client.deviceId);\r\n }\r\n\r\n logger.mobileDisconnected(client.deviceId);\r\n } else {\r\n writeCoordinator.rollbackSessionsOnBrowserDisconnect(client.connectionId);\r\n logger.browserDisconnected(client.connectionId);\r\n }\r\n\r\n router.broadcastDeviceStatus();\r\n };\r\n\r\n wss.on('connection', (socket: WebSocket) => {\r\n socket.on('message', (raw) => {\r\n let parsed: unknown;\r\n\r\n try {\r\n parsed = JSON.parse(String(raw));\r\n } catch {\r\n return;\r\n }\r\n\r\n if (isRegisterMessage(parsed)) {\r\n const existing = connectionManager.getBySocket(socket);\r\n\r\n if (existing) {\r\n return;\r\n }\r\n\r\n const client = connectionManager.add({\r\n socket,\r\n role: parsed.role,\r\n deviceId: parsed.deviceId,\r\n metadata: parsed.metadata,\r\n });\r\n\r\n if (client.role === DevToolsRole.MOBILE) {\r\n logger.mobileConnected(client.deviceId);\r\n\r\n if (client.deviceId && options?.snapshotFileStore) {\r\n void options.snapshotFileStore\r\n .reconcileOnMobileConnect({\r\n deviceId: client.deviceId,\r\n bundleId: client.metadata?.bundleId,\r\n })\r\n .finally(() => {\r\n router.broadcastDeviceStatus();\r\n });\r\n return;\r\n }\r\n } else {\r\n logger.browserConnected(client.connectionId);\r\n }\r\n\r\n router.broadcastDeviceStatus();\r\n return;\r\n }\r\n\r\n if (isPongMessage(parsed)) {\r\n connectionManager.updateLastPong(socket);\r\n return;\r\n }\r\n\r\n if (isRefreshRequestMessage(parsed)) {\r\n refreshCoordinator.handleRefreshRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isExportSnapshotRequestMessage(parsed)) {\r\n refreshCoordinator.handleMobileExportRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isBeginTransactionRequestMessage(parsed)) {\r\n writeCoordinator.handleBeginTransactionRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isCommitTransactionRequestMessage(parsed)) {\r\n writeCoordinator.handleCommitTransactionRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isRollbackTransactionRequestMessage(parsed)) {\r\n writeCoordinator.handleRollbackTransactionRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isWriteRequestMessage(parsed)) {\r\n writeCoordinator.handleWriteRequest(socket, parsed);\r\n return;\r\n }\r\n\r\n if (isTransactionAckMessage(parsed)) {\r\n writeCoordinator.handleTransactionAck(parsed);\r\n return;\r\n }\r\n\r\n if (isWriteAckMessage(parsed)) {\r\n writeCoordinator.handleWriteAck(parsed);\r\n }\r\n });\r\n\r\n socket.on('close', () => {\r\n handleDisconnect(socket);\r\n });\r\n\r\n socket.on('error', () => {\r\n handleDisconnect(socket);\r\n });\r\n });\r\n\r\n heartbeat.start();\r\n\r\n return { wss };\r\n}\r\n","import type { WebSocket } from 'ws';\nimport type { DevToolsRole, DeviceMetadata } from '../types/protocol';\nimport { generateConnectionId } from '../utils/ids';\n\nexport type ConnectedClient = {\n socket: WebSocket;\n connectionId: string;\n role: DevToolsRole;\n deviceId?: string;\n metadata?: DeviceMetadata;\n connectedAt: number;\n lastPongAt: number;\n};\n\nexport type RegisterClientInput = {\n socket: WebSocket;\n role: DevToolsRole;\n deviceId?: string;\n metadata?: DeviceMetadata;\n};\n\nexport class ConnectionManager {\n private readonly clients = new Map<WebSocket, ConnectedClient>();\n\n add(input: RegisterClientInput): ConnectedClient {\n const now = Date.now();\n const client: ConnectedClient = {\n socket: input.socket,\n connectionId: generateConnectionId(),\n role: input.role,\n deviceId: input.deviceId,\n metadata: input.metadata,\n connectedAt: now,\n lastPongAt: now,\n };\n\n this.clients.set(input.socket, client);\n return client;\n }\n\n remove(socket: WebSocket): ConnectedClient | undefined {\n const client = this.clients.get(socket);\n\n if (client) {\n this.clients.delete(socket);\n }\n\n return client;\n }\n\n getBySocket(socket: WebSocket): ConnectedClient | undefined {\n return this.clients.get(socket);\n }\n\n getByConnectionId(connectionId: string): ConnectedClient | undefined {\n for (const client of this.clients.values()) {\n if (client.connectionId === connectionId) {\n return client;\n }\n }\n\n return undefined;\n }\n\n getByDeviceId(deviceId: string): ConnectedClient | undefined {\n for (const client of this.clients.values()) {\n if (client.deviceId === deviceId) {\n return client;\n }\n }\n\n return undefined;\n }\n\n getByRole(role: DevToolsRole): ConnectedClient[] {\n return [...this.clients.values()].filter((client) => client.role === role);\n }\n\n updateLastPong(socket: WebSocket): void {\n const client = this.clients.get(socket);\n\n if (client) {\n client.lastPongAt = Date.now();\n }\n }\n\n getAll(): ConnectedClient[] {\n return [...this.clients.values()];\n }\n}\n","import type { NextFunction, Request, Response } from 'express';\r\nimport {\r\n SNAPSHOT_KIND_HEADER,\r\n SNAPSHOT_MIME_HEADER,\r\n SNAPSHOT_NAME_HEADER,\r\n} from '../types/snapshot';\r\n\r\nconst ALLOWED_METHODS = 'GET, POST, OPTIONS';\r\n\r\nconst ALLOWED_HEADERS = [\r\n 'Content-Type',\r\n SNAPSHOT_KIND_HEADER,\r\n SNAPSHOT_MIME_HEADER,\r\n SNAPSHOT_NAME_HEADER,\r\n].join(', ');\r\n\r\nexport type CorsOptions = {\r\n /** Fixed origin, or `*` when request has no Origin header. */\r\n allowedOrigin?: string;\r\n};\r\n\r\nexport function resolveCorsOrigin(\r\n requestOrigin: string | undefined,\r\n configuredOrigin?: string,\r\n): string {\r\n if (configuredOrigin) {\r\n return configuredOrigin;\r\n }\r\n\r\n if (!requestOrigin) {\r\n return '*';\r\n }\r\n\r\n try {\r\n const url = new URL(requestOrigin);\r\n const isLocalDev =\r\n url.hostname === 'localhost' ||\r\n url.hostname === '127.0.0.1' ||\r\n url.hostname === '10.0.2.2';\r\n\r\n if (isLocalDev) {\r\n return requestOrigin;\r\n }\r\n } catch {\r\n return '*';\r\n }\r\n\r\n return '*';\r\n}\r\n\r\nexport function createCorsMiddleware(options: CorsOptions = {}) {\r\n const configuredOrigin = options.allowedOrigin ?? process.env.DATABASE_DEVTOOLS_CORS_ORIGIN;\r\n\r\n return (request: Request, response: Response, next: NextFunction): void => {\r\n const origin = resolveCorsOrigin(request.header('origin'), configuredOrigin);\r\n\r\n response.setHeader('Access-Control-Allow-Origin', origin);\r\n response.setHeader('Access-Control-Allow-Methods', ALLOWED_METHODS);\r\n response.setHeader('Access-Control-Allow-Headers', ALLOWED_HEADERS);\r\n response.setHeader('Vary', 'Origin');\r\n\r\n if (request.method === 'OPTIONS') {\r\n response.status(204).end();\r\n return;\r\n }\r\n\r\n next();\r\n };\r\n}\r\n","import type { ConnectionManager } from './connectionManager';\nimport type { DeviceStatusPayload } from '../types/protocol';\nimport { DevToolsRole } from '../types/protocol';\n\nexport class DeviceRegistry {\n constructor(private readonly connectionManager: ConnectionManager) {}\n\n snapshot(): DeviceStatusPayload {\n const browsers = this.connectionManager\n .getByRole(DevToolsRole.BROWSER)\n .map((client) => ({\n connectionId: client.connectionId,\n connectedAt: client.connectedAt,\n }));\n\n const mobiles = this.connectionManager\n .getByRole(DevToolsRole.MOBILE)\n .map((client) => ({\n deviceId: client.deviceId ?? client.connectionId,\n connectionId: client.connectionId,\n connectedAt: client.connectedAt,\n metadata: client.metadata,\n }));\n\n return {\n browserCount: browsers.length,\n mobileCount: mobiles.length,\n browsers,\n mobiles,\n };\n }\n}\n","import {\n createMessage,\n HEARTBEAT_INTERVAL_MS,\n HEARTBEAT_TIMEOUT_MS,\n MessageType,\n type PingMessage,\n} from '../types/protocol';\nimport { generatePingId } from '../utils/ids';\nimport { logger } from '../utils/logger';\nimport type { ConnectionManager } from './connectionManager';\nimport type { MessageRouter } from './messageRouter';\n\nexport class Heartbeat {\n private interval: ReturnType<typeof setInterval> | null = null;\n\n constructor(\n private readonly connectionManager: ConnectionManager,\n private readonly router: MessageRouter,\n ) {}\n\n start(): void {\n if (this.interval !== null) {\n return;\n }\n\n this.interval = setInterval(() => {\n this.pingAll();\n this.removeStaleConnections();\n }, HEARTBEAT_INTERVAL_MS);\n }\n\n stop(): void {\n if (this.interval !== null) {\n clearInterval(this.interval);\n this.interval = null;\n }\n }\n\n private pingAll(): void {\n const pingId = generatePingId();\n const message = createMessage<PingMessage>({\n type: MessageType.PING,\n pingId,\n });\n\n for (const client of this.connectionManager.getAll()) {\n this.router.sendToSocket(client.socket, message);\n }\n }\n\n private removeStaleConnections(): void {\n const now = Date.now();\n\n for (const client of this.connectionManager.getAll()) {\n if (now - client.lastPongAt > HEARTBEAT_INTERVAL_MS + HEARTBEAT_TIMEOUT_MS) {\n logger.heartbeatTimeout(client.connectionId);\n client.socket.terminate();\n this.connectionManager.remove(client.socket);\n }\n }\n }\n}\n","import type { WebSocket } from 'ws';\nimport {\n createMessage,\n DevToolsRole,\n MessageType,\n type BroadcastMessage,\n type DeviceStatusMessage,\n type ServerMessage,\n} from '../types/protocol';\nimport { logger } from '../utils/logger';\nimport type { ConnectionManager } from './connectionManager';\nimport type { DeviceRegistry } from './deviceRegistry';\n\nexport type OutboundMessage = ServerMessage;\n\nexport class MessageRouter {\n constructor(\n private readonly connectionManager: ConnectionManager,\n private readonly deviceRegistry: DeviceRegistry,\n ) {}\n\n sendToSocket(socket: WebSocket, message: OutboundMessage): void {\n if (socket.readyState === socket.OPEN) {\n socket.send(JSON.stringify(message));\n }\n }\n\n sendToBrowser(connectionId: string, message: OutboundMessage): void {\n const client = this.connectionManager.getByConnectionId(connectionId);\n\n if (client?.role === DevToolsRole.BROWSER) {\n this.sendToSocket(client.socket, message);\n }\n }\n\n sendToMobile(deviceId: string, message: OutboundMessage): void {\n const client = this.connectionManager.getByDeviceId(deviceId);\n\n if (client?.role === DevToolsRole.MOBILE) {\n this.sendToSocket(client.socket, message);\n }\n }\n\n broadcastToBrowsers(message: OutboundMessage): void {\n for (const client of this.connectionManager.getByRole(DevToolsRole.BROWSER)) {\n this.sendToSocket(client.socket, message);\n }\n\n logger.broadcastSent('browsers');\n }\n\n broadcastToMobiles(message: OutboundMessage): void {\n for (const client of this.connectionManager.getByRole(DevToolsRole.MOBILE)) {\n this.sendToSocket(client.socket, message);\n }\n\n logger.broadcastSent('mobiles');\n }\n\n broadcastToAll(message: OutboundMessage): void {\n for (const client of this.connectionManager.getAll()) {\n this.sendToSocket(client.socket, message);\n }\n\n logger.broadcastSent('all');\n }\n\n broadcast(message: unknown, target: 'browsers' | 'mobiles' | 'all' = 'all'): void {\n const broadcastMessage = createMessage<BroadcastMessage>({\n type: MessageType.BROADCAST,\n payload: message,\n });\n\n if (target === 'browsers') {\n this.broadcastToBrowsers(broadcastMessage);\n return;\n }\n\n if (target === 'mobiles') {\n this.broadcastToMobiles(broadcastMessage);\n return;\n }\n\n this.broadcastToAll(broadcastMessage);\n }\n\n broadcastDeviceStatus(): void {\n const message = createMessage<DeviceStatusMessage>({\n type: MessageType.DEVICE_STATUS,\n payload: this.deviceRegistry.snapshot(),\n });\n\n this.broadcastToAll(message);\n }\n}\n","import type { RefreshInitiator, RefreshType } from '../types/protocol';\r\nimport { REFRESH_TIMEOUT_MS } from '../types/protocol';\r\n\r\nexport type PendingRefresh = {\r\n deviceId: string;\r\n refreshType: RefreshType;\r\n startedAt: number;\r\n initiator: RefreshInitiator;\r\n browserConnectionId?: string;\r\n notifyAllBrowsers?: boolean;\r\n};\r\n\r\nexport class PendingRefreshStore {\r\n private readonly pendingByDevice = new Map<string, PendingRefresh>();\r\n\r\n create(input: PendingRefresh): void {\r\n this.pendingByDevice.set(input.deviceId, input);\r\n }\r\n\r\n get(deviceId: string): PendingRefresh | undefined {\r\n return this.pendingByDevice.get(deviceId);\r\n }\r\n\r\n has(deviceId: string): boolean {\r\n return this.pendingByDevice.has(deviceId);\r\n }\r\n\r\n remove(deviceId: string): void {\r\n this.pendingByDevice.delete(deviceId);\r\n }\r\n\r\n getExpired(now = Date.now()): PendingRefresh[] {\r\n return [...this.pendingByDevice.values()].filter(\r\n (pending) => now - pending.startedAt >= REFRESH_TIMEOUT_MS,\r\n );\r\n }\r\n}\r\n","import type { WebSocket } from 'ws';\r\nimport {\r\n createMessage,\r\n DevToolsRole,\r\n MessageType,\r\n type ExportSnapshotErrorMessage,\r\n type ExportSnapshotRequestMessage,\r\n type RefreshErrorCode,\r\n type RefreshErrorMessage,\r\n type RefreshRequestMessage,\r\n type RefreshState,\r\n type RefreshStatusMessage,\r\n type SnapshotReadyMessage,\r\n type SnapshotUploadRequestedMessage,\r\n} from '../types/protocol';\r\nimport { logger } from '../utils/logger';\r\nimport type { ConnectionManager } from './connectionManager';\r\nimport type { MessageRouter } from './messageRouter';\r\nimport type { PendingRefreshStore } from './pendingRefreshStore';\r\nimport type { SnapshotFileStore } from './snapshotFileStore';\r\nimport type { SnapshotStore } from './snapshotStore';\r\n\r\nexport class RefreshCoordinator {\r\n constructor(\r\n private readonly connectionManager: ConnectionManager,\r\n private readonly router: MessageRouter,\r\n private readonly pending: PendingRefreshStore,\r\n private readonly snapshots: SnapshotStore,\r\n private readonly snapshotFiles?: SnapshotFileStore,\r\n ) {}\r\n\r\n handleRefreshRequest(browserSocket: WebSocket, message: RefreshRequestMessage): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER) {\r\n return;\r\n }\r\n\r\n if (message.refreshType !== 'snapshot') {\r\n this.sendRefreshError(browser.connectionId, {\r\n deviceId: message.deviceId,\r\n code: 'INVALID_REQUEST',\r\n message: `Unsupported refresh type: ${message.refreshType}`,\r\n });\r\n return;\r\n }\r\n\r\n const mobile = this.connectionManager.getByDeviceId(message.deviceId);\r\n\r\n if (!mobile) {\r\n this.sendRefreshError(browser.connectionId, {\r\n deviceId: message.deviceId,\r\n code: 'DEVICE_OFFLINE',\r\n message: `Device ${message.deviceId} is not connected`,\r\n });\r\n return;\r\n }\r\n\r\n if (this.pending.has(message.deviceId)) {\r\n this.sendRefreshError(browser.connectionId, {\r\n deviceId: message.deviceId,\r\n code: 'REFRESH_IN_PROGRESS',\r\n message: 'A refresh is already in progress for this device',\r\n });\r\n return;\r\n }\r\n\r\n this.pending.create({\r\n deviceId: message.deviceId,\r\n initiator: 'browser',\r\n browserConnectionId: browser.connectionId,\r\n refreshType: message.refreshType,\r\n startedAt: Date.now(),\r\n });\r\n\r\n logger.refreshStarted(message.deviceId);\r\n\r\n this.sendRefreshStatus(browser.connectionId, message.deviceId, 'requested');\r\n this.sendRefreshStatus(browser.connectionId, message.deviceId, 'exporting');\r\n\r\n this.requestMobileUpload(message.deviceId, message.refreshType);\r\n }\r\n\r\n handleMobileExportRequest(mobileSocket: WebSocket, message: ExportSnapshotRequestMessage): void {\r\n const mobile = this.connectionManager.getBySocket(mobileSocket);\r\n\r\n if (!mobile || mobile.role !== DevToolsRole.MOBILE || !mobile.deviceId) {\r\n return;\r\n }\r\n\r\n if (message.refreshType !== 'snapshot') {\r\n this.sendExportSnapshotError(mobileSocket, {\r\n code: 'INVALID_REQUEST',\r\n message: `Unsupported refresh type: ${message.refreshType}`,\r\n });\r\n return;\r\n }\r\n\r\n if (this.pending.has(mobile.deviceId)) {\r\n this.sendExportSnapshotError(mobileSocket, {\r\n code: 'REFRESH_IN_PROGRESS',\r\n message: 'An export is already in progress for this device',\r\n });\r\n return;\r\n }\r\n\r\n this.pending.create({\r\n deviceId: mobile.deviceId,\r\n initiator: 'mobile',\r\n notifyAllBrowsers: true,\r\n refreshType: message.refreshType,\r\n startedAt: Date.now(),\r\n });\r\n\r\n logger.refreshStarted(mobile.deviceId);\r\n\r\n this.requestMobileUpload(mobile.deviceId, message.refreshType);\r\n }\r\n\r\n async handleSnapshotUpload(\r\n deviceId: string,\r\n body: Buffer,\r\n metadata?: { kind?: string; mimeType?: string; databaseName?: string },\r\n ): Promise<{ ok: true; stored: SnapshotReadyMessage } | { ok: false; code: RefreshErrorCode }> {\r\n const pending = this.pending.get(deviceId);\r\n\r\n if (!pending) {\r\n return { ok: false, code: 'SNAPSHOT_NOT_FOUND' };\r\n }\r\n\r\n if (pending.browserConnectionId) {\r\n this.sendRefreshStatus(pending.browserConnectionId, deviceId, 'uploading');\r\n }\r\n\r\n const stored = this.snapshots.set(deviceId, body, {\r\n kind: metadata?.kind ?? 'sqlite',\r\n mimeType: metadata?.mimeType ?? 'application/x-sqlite3',\r\n databaseName: metadata?.databaseName,\r\n });\r\n\r\n const mobile = this.connectionManager.getByDeviceId(deviceId);\r\n\r\n await this.snapshotFiles?.persistDeviceSnapshot({\r\n deviceId,\r\n bytes: body,\r\n kind: stored.kind,\r\n mimeType: stored.mimeType,\r\n databaseName: stored.databaseName,\r\n bundleId: mobile?.metadata?.bundleId,\r\n });\r\n\r\n logger.refreshUploaded(deviceId, body.byteLength);\r\n\r\n const readyMessage = createMessage<SnapshotReadyMessage>({\r\n type: MessageType.SNAPSHOT_READY,\r\n deviceId,\r\n size: body.byteLength,\r\n exportedAt: stored.exportedAt,\r\n kind: stored.kind,\r\n mimeType: stored.mimeType,\r\n ...(stored.databaseName ? { databaseName: stored.databaseName } : {}),\r\n });\r\n\r\n if (pending.notifyAllBrowsers) {\r\n this.router.broadcastToBrowsers(readyMessage);\r\n } else if (pending.browserConnectionId) {\r\n this.sendRefreshStatus(pending.browserConnectionId, deviceId, 'ready');\r\n this.router.sendToBrowser(pending.browserConnectionId, readyMessage);\r\n }\r\n\r\n this.pending.remove(deviceId);\r\n\r\n return { ok: true, stored: readyMessage };\r\n }\r\n\r\n getSnapshot(deviceId: string): Buffer | undefined {\r\n return this.snapshots.getBytes(deviceId);\r\n }\r\n\r\n async getSnapshotAsync(deviceId: string): Promise<Buffer | undefined> {\r\n if (this.snapshotFiles) {\r\n const fromDisk = await this.snapshotFiles.readDeviceSnapshot(deviceId);\r\n\r\n if (fromDisk) {\r\n return fromDisk;\r\n }\r\n }\r\n\r\n return this.snapshots.getBytes(deviceId);\r\n }\r\n\r\n checkTimeouts(): void {\r\n for (const pending of this.pending.getExpired()) {\r\n if (pending.initiator === 'mobile') {\r\n this.failMobileExport(\r\n pending.deviceId,\r\n 'TIMEOUT',\r\n 'Export timed out waiting for device upload',\r\n );\r\n continue;\r\n }\r\n\r\n if (pending.browserConnectionId) {\r\n this.failRefresh(\r\n pending.deviceId,\r\n pending.browserConnectionId,\r\n 'TIMEOUT',\r\n 'Refresh timed out waiting for device upload',\r\n );\r\n } else {\r\n this.pending.remove(pending.deviceId);\r\n }\r\n }\r\n }\r\n\r\n private requestMobileUpload(deviceId: string, refreshType: 'snapshot'): void {\r\n this.router.sendToMobile(\r\n deviceId,\r\n createMessage<SnapshotUploadRequestedMessage>({\r\n type: MessageType.SNAPSHOT_UPLOAD_REQUESTED,\r\n deviceId,\r\n refreshType,\r\n }),\r\n );\r\n }\r\n\r\n private failRefresh(\r\n deviceId: string,\r\n browserConnectionId: string,\r\n code: RefreshErrorCode,\r\n message: string,\r\n ): void {\r\n logger.refreshFailed(deviceId, code, message);\r\n\r\n this.sendRefreshError(browserConnectionId, {\r\n deviceId,\r\n code,\r\n message,\r\n });\r\n\r\n this.pending.remove(deviceId);\r\n }\r\n\r\n private failMobileExport(\r\n deviceId: string,\r\n code: RefreshErrorCode,\r\n message: string,\r\n ): void {\r\n logger.refreshFailed(deviceId, code, message);\r\n\r\n const mobile = this.connectionManager.getByDeviceId(deviceId);\r\n\r\n if (mobile) {\r\n this.sendExportSnapshotError(mobile.socket, { code, message });\r\n }\r\n\r\n const refreshError = createMessage<RefreshErrorMessage>({\r\n type: MessageType.REFRESH_ERROR,\r\n deviceId,\r\n code,\r\n message,\r\n });\r\n\r\n this.router.broadcastToBrowsers(refreshError);\r\n this.pending.remove(deviceId);\r\n }\r\n\r\n private sendRefreshStatus(\r\n browserConnectionId: string,\r\n deviceId: string,\r\n state: RefreshState,\r\n ): void {\r\n const statusMessage = createMessage<RefreshStatusMessage>({\r\n type: MessageType.REFRESH_STATUS,\r\n deviceId,\r\n state,\r\n });\r\n\r\n this.router.sendToBrowser(browserConnectionId, statusMessage);\r\n }\r\n\r\n private sendRefreshError(\r\n browserConnectionId: string,\r\n input: {\r\n deviceId: string;\r\n code: RefreshErrorCode;\r\n message: string;\r\n },\r\n ): void {\r\n const message = createMessage<RefreshErrorMessage>({\r\n type: MessageType.REFRESH_ERROR,\r\n deviceId: input.deviceId,\r\n code: input.code,\r\n message: input.message,\r\n });\r\n\r\n this.router.sendToBrowser(browserConnectionId, message);\r\n logger.refreshFailed(input.deviceId, input.code, input.message);\r\n }\r\n\r\n private sendExportSnapshotError(\r\n mobileSocket: WebSocket,\r\n input: {\r\n code: RefreshErrorCode;\r\n message: string;\r\n },\r\n ): void {\r\n const message = createMessage<ExportSnapshotErrorMessage>({\r\n type: MessageType.EXPORT_SNAPSHOT_ERROR,\r\n code: input.code,\r\n message: input.message,\r\n });\r\n\r\n this.router.sendToSocket(mobileSocket, message);\r\n }\r\n}\r\n","import { mkdir, readFile, writeFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\n\r\nexport const DEFAULT_DATA_DIR = '.devtools';\r\n\r\n/** @deprecated Legacy single-database path. Removed — use per-device exports instead. */\r\nexport const DEFAULT_DATABASE_RELATIVE_PATH = 'databases/active.db';\r\n\r\nexport type ProjectDevToolsConfig = {\r\n /** @deprecated No longer used. */\r\n defaultDatabase?: string;\r\n deviceSync?: {\r\n /** @deprecated Ignored — active.db is no longer written. */\r\n promoteLatestToActive?: boolean;\r\n };\r\n};\r\n\r\nexport type DatabaseManifestEntry = {\r\n id: string;\r\n label: string;\r\n relativePath: string;\r\n source: 'active' | 'device';\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n size: number;\r\n updatedAt: number;\r\n};\r\n\r\nexport type DatabaseManifest = {\r\n version: 1;\r\n /** @deprecated No longer written. */\r\n activeDatabase?: string;\r\n entries: DatabaseManifestEntry[];\r\n};\r\n\r\nexport type PersistDeviceSnapshotInput = {\r\n deviceId: string;\r\n bytes: Buffer;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n bundleId?: string;\r\n};\r\n\r\nexport type PersistDeviceSnapshotResult = {\r\n deviceRelativePath: string;\r\n exportedAt: number;\r\n size: number;\r\n};\r\n\r\nconst DEFAULT_CONFIG: ProjectDevToolsConfig = {\r\n deviceSync: {\r\n promoteLatestToActive: false,\r\n },\r\n};\r\n\r\nexport function resolveDataDir(explicitDir?: string): string {\r\n const fromEnv = process.env.DATABASE_DEVTOOLS_DATA_DIR?.trim();\r\n\r\n if (explicitDir?.trim()) {\r\n return path.resolve(explicitDir.trim());\r\n }\r\n\r\n if (fromEnv) {\r\n return path.resolve(fromEnv);\r\n }\r\n\r\n return path.resolve(process.cwd(), DEFAULT_DATA_DIR);\r\n}\r\n\r\nexport function isPersistenceEnabled(): boolean {\r\n const flag = process.env.DATABASE_DEVTOOLS_SNAPSHOT_PERSIST?.trim().toLowerCase();\r\n\r\n if (flag === '0' || flag === 'false' || flag === 'off') {\r\n return false;\r\n }\r\n\r\n return true;\r\n}\r\n\r\nexport function sanitizePathSegment(value: string): string {\r\n return value.replace(/[^a-zA-Z0-9._-]+/g, '_');\r\n}\r\n\r\nexport function resolveProjectPaths(dataDir: string) {\r\n const databasesDir = path.join(dataDir, 'databases');\r\n const devicesDir = path.join(databasesDir, 'devices');\r\n const configPath = path.join(dataDir, 'devtools.json');\r\n const manifestPath = path.join(dataDir, 'manifest.json');\r\n\r\n return {\r\n dataDir,\r\n databasesDir,\r\n devicesDir,\r\n configPath,\r\n manifestPath,\r\n };\r\n}\r\n\r\nexport async function ensureProjectDirectories(dataDir: string): Promise<void> {\r\n const paths = resolveProjectPaths(dataDir);\r\n\r\n await mkdir(paths.devicesDir, { recursive: true });\r\n}\r\n\r\nexport async function loadProjectConfig(dataDir: string): Promise<ProjectDevToolsConfig> {\r\n const { configPath } = resolveProjectPaths(dataDir);\r\n\r\n try {\r\n const raw = await readFile(configPath, 'utf8');\r\n const parsed = JSON.parse(raw) as ProjectDevToolsConfig;\r\n\r\n return {\r\n ...DEFAULT_CONFIG,\r\n ...parsed,\r\n deviceSync: {\r\n promoteLatestToActive: false,\r\n },\r\n };\r\n } catch {\r\n return { ...DEFAULT_CONFIG };\r\n }\r\n}\r\n\r\nexport async function writeDefaultProjectConfig(dataDir: string): Promise<void> {\r\n const { configPath } = resolveProjectPaths(dataDir);\r\n\r\n try {\r\n await readFile(configPath, 'utf8');\r\n } catch {\r\n await mkdir(dataDir, { recursive: true });\r\n await writeFile(configPath, `${JSON.stringify(DEFAULT_CONFIG, null, 2)}\\n`, 'utf8');\r\n }\r\n}\r\n\r\nexport function resolveActiveDatabasePath(dataDir: string, config: ProjectDevToolsConfig): string {\r\n const relative = config.defaultDatabase ?? DEFAULT_DATABASE_RELATIVE_PATH;\r\n return path.join(dataDir, relative);\r\n}\r\n\r\nexport function deviceDatabaseFileName(deviceId: string): string {\r\n return `Database-${sanitizePathSegment(deviceId)}.db`;\r\n}\r\n\r\nexport const DEVICE_EXPORT_FILE_NAME = 'database.db';\r\n\r\nexport function resolveDeviceStorageKey(input: { bundleId?: string; deviceId: string }): string {\r\n const bundleId = input.bundleId?.trim();\r\n\r\n if (bundleId) {\r\n return sanitizePathSegment(bundleId);\r\n }\r\n\r\n return sanitizePathSegment(input.deviceId);\r\n}\r\n\r\nexport function deviceStorageManifestId(storageKey: string): string {\r\n return `device:${storageKey}`;\r\n}\r\n\r\nexport function deviceStorageRelativePath(storageKey: string): string {\r\n return path\r\n .join('databases', 'devices', storageKey, DEVICE_EXPORT_FILE_NAME)\r\n .replace(/\\\\/g, '/');\r\n}\r\n\r\nexport function deviceDatabaseRelativePath(deviceId: string): string {\r\n const segment = sanitizePathSegment(deviceId);\r\n return path\r\n .join('databases', 'devices', segment, deviceDatabaseFileName(deviceId))\r\n .replace(/\\\\/g, '/');\r\n}\r\n\r\n/** @deprecated Legacy path — migrated reads still check this location. */\r\nexport function deviceLatestRelativePath(deviceId: string): string {\r\n return path.join('databases', 'devices', sanitizePathSegment(deviceId), 'latest.db').replace(/\\\\/g, '/');\r\n}\r\n\r\nexport async function readManifest(dataDir: string): Promise<DatabaseManifest> {\r\n const { manifestPath } = resolveProjectPaths(dataDir);\r\n\r\n try {\r\n const raw = await readFile(manifestPath, 'utf8');\r\n const parsed = JSON.parse(raw) as DatabaseManifest;\r\n\r\n if (parsed.version !== 1 || !Array.isArray(parsed.entries)) {\r\n return { version: 1, entries: [] };\r\n }\r\n\r\n return parsed;\r\n } catch {\r\n return { version: 1, entries: [] };\r\n }\r\n}\r\n\r\nexport async function writeManifest(dataDir: string, manifest: DatabaseManifest): Promise<void> {\r\n const { manifestPath } = resolveProjectPaths(dataDir);\r\n\r\n await mkdir(dataDir, { recursive: true });\r\n await writeFile(manifestPath, `${JSON.stringify(manifest, null, 2)}\\n`, 'utf8');\r\n}\r\n\r\nexport function upsertManifestEntry(\r\n manifest: DatabaseManifest,\r\n entry: DatabaseManifestEntry,\r\n): DatabaseManifest {\r\n const entries = manifest.entries.filter((item) => item.id !== entry.id);\r\n entries.push(entry);\r\n\r\n entries.sort((left, right) => right.updatedAt - left.updatedAt);\r\n\r\n return {\r\n version: manifest.version,\r\n entries,\r\n };\r\n}\r\n","import type { DatabaseManifestEntry } from './projectData';\r\nimport { deviceStorageManifestId, sanitizePathSegment } from './projectData';\r\n\r\nexport type ListedDeviceExportLike = {\r\n id: string;\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n databaseName?: string;\r\n updatedAt: number;\r\n};\r\n\r\nexport function deriveStorageKeyFromEntry(entry: DatabaseManifestEntry): string {\r\n if (entry.storageKey) {\r\n return entry.storageKey;\r\n }\r\n\r\n if (entry.bundleId) {\r\n return sanitizePathSegment(entry.bundleId);\r\n }\r\n\r\n const match = entry.relativePath.match(/databases\\/devices\\/([^/]+)\\//);\r\n\r\n if (match?.[1]) {\r\n return match[1];\r\n }\r\n\r\n if (entry.deviceId) {\r\n return sanitizePathSegment(entry.deviceId);\r\n }\r\n\r\n return entry.id;\r\n}\r\n\r\nexport function findManifestEntryByDeviceId(\r\n entries: DatabaseManifestEntry[],\r\n deviceId: string,\r\n): DatabaseManifestEntry | undefined {\r\n return entries.find((entry) => entry.source === 'device' && entry.deviceId === deviceId);\r\n}\r\n\r\nexport type PruneDeviceExportsInput = {\r\n keepStorageKey: string;\r\n keepDeviceId: string;\r\n bundleId?: string;\r\n databaseName?: string;\r\n};\r\n\r\nexport function selectDeviceExportEntriesToPrune(\r\n entries: DatabaseManifestEntry[],\r\n keep: PruneDeviceExportsInput,\r\n): DatabaseManifestEntry[] {\r\n const keepManifestId = deviceStorageManifestId(keep.keepStorageKey);\r\n\r\n return entries.filter((entry) => {\r\n if (entry.source !== 'device') {\r\n return false;\r\n }\r\n\r\n if (entry.id === keepManifestId) {\r\n return false;\r\n }\r\n\r\n const entryStorageKey = deriveStorageKeyFromEntry(entry);\r\n\r\n if (entryStorageKey === keep.keepStorageKey) {\r\n return true;\r\n }\r\n\r\n if (keep.bundleId && entry.bundleId === keep.bundleId) {\r\n return true;\r\n }\r\n\r\n if (\r\n keep.bundleId &&\r\n keep.databaseName &&\r\n !entry.bundleId &&\r\n entry.databaseName === keep.databaseName\r\n ) {\r\n return true;\r\n }\r\n\r\n if (\r\n !keep.bundleId &&\r\n keep.databaseName &&\r\n entry.databaseName === keep.databaseName &&\r\n entry.deviceId !== keep.keepDeviceId\r\n ) {\r\n return true;\r\n }\r\n\r\n return false;\r\n });\r\n}\r\n\r\nexport function dedupeListedDeviceExports<T extends ListedDeviceExportLike>(entries: T[]): T[] {\r\n const byStorageKey = new Map<string, T>();\r\n\r\n for (const entry of entries) {\r\n const storageKey = entry.storageKey\r\n ? entry.storageKey\r\n : entry.bundleId\r\n ? sanitizePathSegment(entry.bundleId)\r\n : entry.deviceId\r\n ? sanitizePathSegment(entry.deviceId)\r\n : entry.id;\r\n\r\n const existing = byStorageKey.get(storageKey);\r\n\r\n if (!existing || entry.updatedAt > existing.updatedAt) {\r\n byStorageKey.set(storageKey, entry);\r\n }\r\n }\r\n\r\n return [...byStorageKey.values()].sort((left, right) => right.updatedAt - left.updatedAt);\r\n}\r\n\r\nexport type ReconcileLegacyExportsInput = {\r\n entries: DatabaseManifestEntry[];\r\n preferredDeviceId?: string;\r\n};\r\n\r\nexport function reconcileLegacyManifestEntries(\r\n input: ReconcileLegacyExportsInput,\r\n): DatabaseManifestEntry[] {\r\n const deviceEntries = input.entries.filter((entry) => entry.source === 'device');\r\n const otherEntries = input.entries.filter((entry) => entry.source !== 'device');\r\n const groups = new Map<string, DatabaseManifestEntry[]>();\r\n\r\n for (const entry of deviceEntries) {\r\n const groupKey = entry.bundleId\r\n ? `bundle:${entry.bundleId}`\r\n : entry.databaseName\r\n ? `db:${entry.databaseName}`\r\n : `device:${deriveStorageKeyFromEntry(entry)}`;\r\n\r\n const group = groups.get(groupKey) ?? [];\r\n group.push(entry);\r\n groups.set(groupKey, group);\r\n }\r\n\r\n const keptDeviceEntries: DatabaseManifestEntry[] = [];\r\n\r\n for (const group of groups.values()) {\r\n if (group.length === 1) {\r\n keptDeviceEntries.push(group[0]!);\r\n continue;\r\n }\r\n\r\n const preferred = input.preferredDeviceId\r\n ? group.find((entry) => entry.deviceId === input.preferredDeviceId)\r\n : undefined;\r\n\r\n const newest = [...group].sort((left, right) => right.updatedAt - left.updatedAt)[0]!;\r\n keptDeviceEntries.push(preferred ?? newest);\r\n }\r\n\r\n return [...otherEntries, ...keptDeviceEntries].sort((left, right) => right.updatedAt - left.updatedAt);\r\n}\r\n\r\nexport function removedManifestEntries(\r\n before: DatabaseManifestEntry[],\r\n after: DatabaseManifestEntry[],\r\n): DatabaseManifestEntry[] {\r\n const afterIds = new Set(after.map((entry) => entry.id));\r\n return before.filter((entry) => !afterIds.has(entry.id));\r\n}\r\n","import { readFile, rm, stat, writeFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport {\r\n DEFAULT_DATABASE_RELATIVE_PATH,\r\n readManifest,\r\n resolveProjectPaths,\r\n writeManifest,\r\n type DatabaseManifest,\r\n type ProjectDevToolsConfig,\r\n} from './projectData';\r\n\r\nconst NORMALIZED_CONFIG: ProjectDevToolsConfig = {\r\n deviceSync: {\r\n promoteLatestToActive: false,\r\n },\r\n};\r\n\r\nexport function stripLegacyActiveManifest(manifest: DatabaseManifest): DatabaseManifest {\r\n const entries = manifest.entries.filter(\r\n (entry) =>\r\n entry.source !== 'active' &&\r\n entry.id !== 'active' &&\r\n !entry.id.startsWith('import:'),\r\n );\r\n\r\n return {\r\n version: 1,\r\n entries,\r\n };\r\n}\r\n\r\nexport function normalizeProjectConfig(config: ProjectDevToolsConfig): ProjectDevToolsConfig {\r\n return {\r\n ...NORMALIZED_CONFIG,\r\n deviceSync: {\r\n ...NORMALIZED_CONFIG.deviceSync,\r\n promoteLatestToActive: false,\r\n },\r\n };\r\n}\r\n\r\nexport async function migrateLegacyActiveDatabase(dataDir: string): Promise<boolean> {\r\n const { configPath } = resolveProjectPaths(dataDir);\r\n const manifest = await readManifest(dataDir);\r\n const stripped = stripLegacyActiveManifest(manifest);\r\n const activeDbPath = path.join(dataDir, DEFAULT_DATABASE_RELATIVE_PATH);\r\n\r\n let changed =\r\n stripped.entries.length !== manifest.entries.length || Boolean(manifest.activeDatabase);\r\n\r\n if (changed) {\r\n await writeManifest(dataDir, stripped);\r\n }\r\n\r\n try {\r\n await stat(activeDbPath);\r\n const hasDeviceExports = stripped.entries.some((entry) => entry.source === 'device');\r\n\r\n if (hasDeviceExports || manifest.entries.some((entry) => entry.source === 'active')) {\r\n await rm(activeDbPath, { force: true });\r\n changed = true;\r\n }\r\n } catch {\r\n // active.db not present\r\n }\r\n\r\n try {\r\n const raw = await readFile(configPath, 'utf8');\r\n const parsed = JSON.parse(raw) as ProjectDevToolsConfig;\r\n\r\n if (parsed.defaultDatabase || parsed.deviceSync?.promoteLatestToActive) {\r\n await writeFile(\r\n configPath,\r\n `${JSON.stringify(normalizeProjectConfig(parsed), null, 2)}\\n`,\r\n 'utf8',\r\n );\r\n changed = true;\r\n }\r\n } catch {\r\n // config will be created on next export\r\n }\r\n\r\n const importsDir = path.join(dataDir, 'databases', 'imports');\r\n\r\n try {\r\n await stat(importsDir);\r\n await rm(importsDir, { recursive: true, force: true });\r\n changed = true;\r\n } catch {\r\n // imports directory not present\r\n }\r\n\r\n return changed;\r\n}\r\n","import { mkdir, readFile, rm, stat, writeFile } from 'node:fs/promises';\r\nimport path from 'node:path';\r\nimport { SQLITE_SNAPSHOT_MIME_TYPE } from '../types/snapshot';\r\nimport {\r\n dedupeListedDeviceExports,\r\n findManifestEntryByDeviceId,\r\n reconcileLegacyManifestEntries,\r\n removedManifestEntries,\r\n selectDeviceExportEntriesToPrune,\r\n} from './deviceExportStorage';\r\nimport { migrateLegacyActiveDatabase } from './migrateLegacyActiveDb';\r\nimport {\r\n deviceDatabaseRelativePath,\r\n deviceLatestRelativePath,\r\n deviceStorageManifestId,\r\n deviceStorageRelativePath,\r\n ensureProjectDirectories,\r\n isPersistenceEnabled,\r\n readManifest,\r\n resolveDataDir,\r\n resolveDeviceStorageKey,\r\n resolveProjectPaths,\r\n sanitizePathSegment,\r\n upsertManifestEntry,\r\n writeDefaultProjectConfig,\r\n writeManifest,\r\n type DatabaseManifestEntry,\r\n type PersistDeviceSnapshotInput,\r\n type PersistDeviceSnapshotResult,\r\n} from './projectData';\r\n\r\nexport type ProjectDatabaseMeta = {\r\n exists: boolean;\r\n relativePath?: string;\r\n absolutePath?: string;\r\n kind?: string;\r\n mimeType?: string;\r\n databaseName?: string;\r\n size?: number;\r\n updatedAt?: number;\r\n source?: DatabaseManifestEntry['source'];\r\n deviceId?: string;\r\n};\r\n\r\nexport type ListedProjectDatabase = {\r\n id: string;\r\n label: string;\r\n relativePath: string;\r\n source: DatabaseManifestEntry['source'];\r\n deviceId?: string;\r\n bundleId?: string;\r\n storageKey?: string;\r\n databaseName?: string;\r\n size: number;\r\n updatedAt: number;\r\n};\r\n\r\nexport class SnapshotFileStore {\r\n private readonly dataDir: string;\r\n private readonly enabled: boolean;\r\n\r\n constructor(options?: { dataDir?: string; enabled?: boolean }) {\r\n this.dataDir = resolveDataDir(options?.dataDir);\r\n this.enabled = options?.enabled ?? isPersistenceEnabled();\r\n }\r\n\r\n getDataDir(): string {\r\n return this.dataDir;\r\n }\r\n\r\n isEnabled(): boolean {\r\n return this.enabled;\r\n }\r\n\r\n async persistDeviceSnapshot(\r\n input: PersistDeviceSnapshotInput,\r\n ): Promise<PersistDeviceSnapshotResult | null> {\r\n if (!this.enabled) {\r\n return null;\r\n }\r\n\r\n await writeDefaultProjectConfig(this.dataDir);\r\n await ensureProjectDirectories(this.dataDir);\r\n\r\n const storageKey = resolveDeviceStorageKey({\r\n bundleId: input.bundleId,\r\n deviceId: input.deviceId,\r\n });\r\n const deviceRelativePath = deviceStorageRelativePath(storageKey);\r\n const deviceAbsolutePath = path.join(this.dataDir, deviceRelativePath);\r\n const exportedAt = Date.now();\r\n\r\n await this.pruneDeviceExports({\r\n keepStorageKey: storageKey,\r\n keepDeviceId: input.deviceId,\r\n bundleId: input.bundleId,\r\n databaseName: input.databaseName,\r\n });\r\n\r\n await mkdir(path.dirname(deviceAbsolutePath), { recursive: true });\r\n await writeFile(deviceAbsolutePath, input.bytes);\r\n\r\n const manifest = await readManifest(this.dataDir);\r\n\r\n const deviceEntry: DatabaseManifestEntry = {\r\n id: deviceStorageManifestId(storageKey),\r\n label: input.databaseName ?? `Device ${input.deviceId}`,\r\n relativePath: deviceRelativePath.replace(/\\\\/g, '/'),\r\n source: 'device',\r\n deviceId: input.deviceId,\r\n bundleId: input.bundleId,\r\n storageKey,\r\n kind: input.kind,\r\n mimeType: input.mimeType,\r\n databaseName: input.databaseName,\r\n size: input.bytes.byteLength,\r\n updatedAt: exportedAt,\r\n };\r\n\r\n const nextManifest = upsertManifestEntry(manifest, deviceEntry);\r\n\r\n await writeManifest(this.dataDir, nextManifest);\r\n\r\n return {\r\n deviceRelativePath: deviceRelativePath.replace(/\\\\/g, '/'),\r\n exportedAt,\r\n size: input.bytes.byteLength,\r\n };\r\n }\r\n\r\n async reconcileOnMobileConnect(input: {\r\n deviceId: string;\r\n bundleId?: string;\r\n }): Promise<void> {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n await this.reconcileLegacyExports(input.deviceId);\r\n\r\n const storageKey = resolveDeviceStorageKey({\r\n bundleId: input.bundleId,\r\n deviceId: input.deviceId,\r\n });\r\n const manifest = await readManifest(this.dataDir);\r\n const canonicalEntry = manifest.entries.find(\r\n (entry) => entry.source === 'device' && entry.storageKey === storageKey,\r\n );\r\n\r\n if (canonicalEntry && canonicalEntry.deviceId !== input.deviceId) {\r\n const updated = upsertManifestEntry(manifest, {\r\n ...canonicalEntry,\r\n deviceId: input.deviceId,\r\n bundleId: input.bundleId ?? canonicalEntry.bundleId,\r\n updatedAt: Date.now(),\r\n });\r\n\r\n await writeManifest(this.dataDir, updated);\r\n }\r\n\r\n await this.pruneDeviceExports({\r\n keepStorageKey: storageKey,\r\n keepDeviceId: input.deviceId,\r\n bundleId: input.bundleId,\r\n databaseName: canonicalEntry?.databaseName,\r\n });\r\n }\r\n\r\n async readDeviceSnapshot(deviceId: string): Promise<Buffer | undefined> {\r\n return this.readDeviceDatabase(deviceId);\r\n }\r\n\r\n async readDeviceDatabase(deviceId: string): Promise<Buffer | undefined> {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n\r\n const resolved = await this.resolveDeviceDatabaseFile(deviceId);\r\n\r\n if (!resolved) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return await readFile(resolved.absolutePath);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n async getDeviceDatabaseMeta(deviceId: string): Promise<ProjectDatabaseMeta> {\r\n if (!this.enabled) {\r\n return { exists: false, deviceId };\r\n }\r\n\r\n const resolved = await this.resolveDeviceDatabaseFile(deviceId);\r\n\r\n if (!resolved) {\r\n return { exists: false, deviceId };\r\n }\r\n\r\n try {\r\n const fileStat = await stat(resolved.absolutePath);\r\n const manifest = await readManifest(this.dataDir);\r\n const entry = manifest.entries.find(\r\n (item) => item.deviceId === deviceId && item.source === 'device',\r\n );\r\n\r\n return {\r\n exists: true,\r\n relativePath: resolved.relativePath,\r\n absolutePath: resolved.absolutePath,\r\n kind: entry?.kind ?? 'sqlite',\r\n mimeType: entry?.mimeType ?? SQLITE_SNAPSHOT_MIME_TYPE,\r\n databaseName: entry?.databaseName ?? path.basename(resolved.absolutePath),\r\n size: fileStat.size,\r\n updatedAt: entry?.updatedAt ?? fileStat.mtimeMs,\r\n source: 'device',\r\n deviceId,\r\n };\r\n } catch {\r\n return { exists: false, deviceId, relativePath: resolved.relativePath };\r\n }\r\n }\r\n\r\n async listDeviceExports(): Promise<ListedProjectDatabase[]> {\r\n await this.reconcileLegacyExports();\r\n const databases = await this.listDatabases();\r\n const deviceExports = databases.filter((entry) => entry.source === 'device' && entry.deviceId);\r\n return dedupeListedDeviceExports(deviceExports);\r\n }\r\n\r\n private async reconcileLegacyExports(preferredDeviceId?: string): Promise<void> {\r\n if (!this.enabled) {\r\n return;\r\n }\r\n\r\n await migrateLegacyActiveDatabase(this.dataDir);\r\n\r\n const manifest = await readManifest(this.dataDir);\r\n const nextEntries = reconcileLegacyManifestEntries({\r\n entries: manifest.entries,\r\n preferredDeviceId,\r\n });\r\n\r\n if (nextEntries.length === manifest.entries.length) {\r\n const sameOrder = nextEntries.every((entry, index) => entry.id === manifest.entries[index]?.id);\r\n\r\n if (sameOrder) {\r\n return;\r\n }\r\n }\r\n\r\n const removed = removedManifestEntries(manifest.entries, nextEntries);\r\n\r\n for (const entry of removed) {\r\n await this.deleteEntryFiles(entry);\r\n }\r\n\r\n await writeManifest(this.dataDir, {\r\n ...manifest,\r\n entries: nextEntries,\r\n });\r\n }\r\n\r\n private async pruneDeviceExports(input: {\r\n keepStorageKey: string;\r\n keepDeviceId: string;\r\n bundleId?: string;\r\n databaseName?: string;\r\n }): Promise<void> {\r\n const manifest = await readManifest(this.dataDir);\r\n const removed = selectDeviceExportEntriesToPrune(manifest.entries, input);\r\n\r\n if (removed.length === 0) {\r\n return;\r\n }\r\n\r\n for (const entry of removed) {\r\n await this.deleteEntryFiles(entry);\r\n }\r\n\r\n const removedIds = new Set(removed.map((entry) => entry.id));\r\n\r\n await writeManifest(this.dataDir, {\r\n ...manifest,\r\n entries: manifest.entries.filter((entry) => !removedIds.has(entry.id)),\r\n });\r\n }\r\n\r\n private async deleteEntryFiles(entry: DatabaseManifestEntry): Promise<void> {\r\n const absolutePath = path.join(this.dataDir, entry.relativePath);\r\n\r\n try {\r\n await rm(absolutePath, { force: true });\r\n } catch {\r\n // ignore missing files\r\n }\r\n\r\n try {\r\n await rm(path.dirname(absolutePath), { recursive: true, force: true });\r\n } catch {\r\n // ignore cleanup failures\r\n }\r\n }\r\n\r\n private manifestEntryToListed(entry: DatabaseManifestEntry, fileStat: { size: number }): ListedProjectDatabase {\r\n return {\r\n id: entry.id,\r\n label: entry.label,\r\n relativePath: entry.relativePath,\r\n source: entry.source,\r\n deviceId: entry.deviceId,\r\n bundleId: entry.bundleId,\r\n storageKey: entry.storageKey,\r\n databaseName: entry.databaseName,\r\n size: fileStat.size,\r\n updatedAt: entry.updatedAt,\r\n };\r\n }\r\n\r\n private async resolveDeviceDatabaseFile(\r\n deviceId: string,\r\n ): Promise<{ relativePath: string; absolutePath: string } | undefined> {\r\n const manifest = await readManifest(this.dataDir);\r\n const manifestEntry = findManifestEntryByDeviceId(manifest.entries, deviceId);\r\n\r\n if (manifestEntry) {\r\n const absolutePath = path.join(this.dataDir, manifestEntry.relativePath);\r\n\r\n try {\r\n await stat(absolutePath);\r\n return { relativePath: manifestEntry.relativePath, absolutePath };\r\n } catch {\r\n // fall through to legacy paths\r\n }\r\n }\r\n\r\n const candidates = [\r\n deviceDatabaseRelativePath(deviceId),\r\n deviceLatestRelativePath(deviceId),\r\n ];\r\n\r\n for (const relativePath of candidates) {\r\n const absolutePath = path.join(this.dataDir, relativePath);\r\n\r\n try {\r\n await stat(absolutePath);\r\n return { relativePath, absolutePath };\r\n } catch {\r\n // try next candidate\r\n }\r\n }\r\n\r\n if (!manifestEntry) {\r\n return undefined;\r\n }\r\n\r\n const absolutePath = path.join(this.dataDir, manifestEntry.relativePath);\r\n\r\n try {\r\n await stat(absolutePath);\r\n return { relativePath: manifestEntry.relativePath, absolutePath };\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n /** @deprecated Proxies to the newest device export for backward-compatible API callers. */\r\n async readActiveDatabase(): Promise<Buffer | undefined> {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n\r\n const meta = await this.getActiveDatabaseMeta();\r\n\r\n if (!meta.exists || !meta.deviceId) {\r\n return undefined;\r\n }\r\n\r\n return this.readDeviceDatabase(meta.deviceId);\r\n }\r\n\r\n /** @deprecated Proxies to the newest device export for backward-compatible API callers. */\r\n async getActiveDatabaseMeta(): Promise<ProjectDatabaseMeta> {\r\n if (!this.enabled) {\r\n return { exists: false };\r\n }\r\n\r\n await migrateLegacyActiveDatabase(this.dataDir);\r\n\r\n const exports = await this.listDeviceExports();\r\n const latest = exports[0];\r\n\r\n if (!latest?.deviceId) {\r\n return { exists: false };\r\n }\r\n\r\n return this.getDeviceDatabaseMeta(latest.deviceId);\r\n }\r\n\r\n async listDatabases(): Promise<ListedProjectDatabase[]> {\r\n if (!this.enabled) {\r\n return [];\r\n }\r\n\r\n await ensureProjectDirectories(this.dataDir);\r\n await this.reconcileLegacyExports();\r\n\r\n const manifest = await readManifest(this.dataDir);\r\n const listed = new Map<string, ListedProjectDatabase>();\r\n\r\n for (const entry of manifest.entries) {\r\n if (entry.source === 'active' || entry.id.startsWith('import:')) {\r\n continue;\r\n }\r\n\r\n const absolutePath = path.join(this.dataDir, entry.relativePath);\r\n\r\n try {\r\n const fileStat = await stat(absolutePath);\r\n\r\n listed.set(entry.id, this.manifestEntryToListed(entry, fileStat));\r\n } catch {\r\n // Ignore missing files from manifest.\r\n }\r\n }\r\n\r\n return [...listed.values()].sort((left, right) => right.updatedAt - left.updatedAt);\r\n }\r\n\r\n async readDatabaseByRelativePath(relativePath: string): Promise<Buffer | undefined> {\r\n if (!this.enabled) {\r\n return undefined;\r\n }\r\n\r\n const normalized = relativePath.replace(/\\\\/g, '/');\r\n const absolutePath = path.resolve(this.dataDir, normalized);\r\n const dataDirResolved = path.resolve(this.dataDir);\r\n\r\n if (!absolutePath.startsWith(dataDirResolved)) {\r\n return undefined;\r\n }\r\n\r\n if (!normalized.toLowerCase().endsWith('.db')) {\r\n return undefined;\r\n }\r\n\r\n try {\r\n return await readFile(absolutePath);\r\n } catch {\r\n return undefined;\r\n }\r\n }\r\n\r\n getDeviceDirectoryName(deviceId: string): string {\r\n return sanitizePathSegment(deviceId);\r\n }\r\n}\r\n","export type StoredSnapshot = {\r\n deviceId: string;\r\n bytes: Buffer;\r\n kind: string;\r\n mimeType: string;\r\n databaseName?: string;\r\n exportedAt: number;\r\n};\r\n\r\nexport class SnapshotStore {\r\n private readonly snapshots = new Map<string, StoredSnapshot>();\r\n\r\n set(\r\n deviceId: string,\r\n bytes: Buffer,\r\n metadata: { kind: string; mimeType: string; databaseName?: string },\r\n ): StoredSnapshot {\r\n const stored: StoredSnapshot = {\r\n deviceId,\r\n bytes,\r\n kind: metadata.kind,\r\n mimeType: metadata.mimeType,\r\n databaseName: metadata.databaseName,\r\n exportedAt: Date.now(),\r\n };\r\n\r\n this.snapshots.set(deviceId, stored);\r\n return stored;\r\n }\r\n\r\n get(deviceId: string): StoredSnapshot | undefined {\r\n return this.snapshots.get(deviceId);\r\n }\r\n\r\n getBytes(deviceId: string): Buffer | undefined {\r\n return this.snapshots.get(deviceId)?.bytes;\r\n }\r\n}\r\n","import type { WebSocket } from 'ws';\r\nimport {\r\n createMessage,\r\n DevToolsRole,\r\n MessageType,\r\n type BeginTransactionMessage,\r\n type BeginTransactionRequestMessage,\r\n type CommitTransactionMessage,\r\n type CommitTransactionRequestMessage,\r\n type ExecuteWriteMessage,\r\n type RollbackTransactionMessage,\r\n type RollbackTransactionRequestMessage,\r\n type TransactionAckMessage,\r\n type TransactionStatusMessage,\r\n type WriteAckMessage,\r\n type WriteErrorCode,\r\n type WriteErrorMessage,\r\n type WriteRequestMessage,\r\n type WriteResultMessage,\r\n} from '../types/protocol';\r\nimport { logger } from '../utils/logger';\r\nimport type { ConnectionManager } from './connectionManager';\r\nimport type { MessageRouter } from './messageRouter';\r\nimport type { WriteSessionManager, WriteSession } from './writeSessionManager';\r\n\r\nexport class WriteCoordinator {\r\n constructor(\r\n private readonly connectionManager: ConnectionManager,\r\n private readonly router: MessageRouter,\r\n private readonly sessions: WriteSessionManager,\r\n ) {}\r\n\r\n handleBeginTransactionRequest(\r\n browserSocket: WebSocket,\r\n message: BeginTransactionRequestMessage,\r\n ): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER) {\r\n return;\r\n }\r\n\r\n const mobile = this.connectionManager.getByDeviceId(message.deviceId);\r\n\r\n if (!mobile) {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'DEVICE_OFFLINE',\r\n message: `Device ${message.deviceId} is not connected`,\r\n });\r\n return;\r\n }\r\n\r\n if (this.sessions.getActiveForDevice(message.deviceId)) {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'TRANSACTION_BUSY',\r\n message: 'A transaction is already open for this device',\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.create({\r\n transactionId: message.transactionId,\r\n deviceId: message.deviceId,\r\n browserConnectionId: browser.connectionId,\r\n });\r\n\r\n logger.syncStarted(message.transactionId, message.deviceId);\r\n\r\n this.router.sendToMobile(\r\n message.deviceId,\r\n createMessage<BeginTransactionMessage>({\r\n type: MessageType.BEGIN_TRANSACTION,\r\n transactionId: message.transactionId,\r\n }),\r\n );\r\n }\r\n\r\n handleCommitTransactionRequest(\r\n browserSocket: WebSocket,\r\n message: CommitTransactionRequestMessage,\r\n ): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER || !session) {\r\n return;\r\n }\r\n\r\n if (session.browserConnectionId !== browser.connectionId) {\r\n return;\r\n }\r\n\r\n if (session.state !== 'open') {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'NO_TRANSACTION',\r\n message: 'Transaction is not open',\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.setState(message.transactionId, 'committing');\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<CommitTransactionMessage>({\r\n type: MessageType.COMMIT_TRANSACTION,\r\n transactionId: message.transactionId,\r\n }),\r\n );\r\n }\r\n\r\n handleRollbackTransactionRequest(\r\n browserSocket: WebSocket,\r\n message: RollbackTransactionRequestMessage,\r\n ): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER || !session) {\r\n return;\r\n }\r\n\r\n if (session.browserConnectionId !== browser.connectionId) {\r\n return;\r\n }\r\n\r\n if (session.state !== 'open' && session.state !== 'committing') {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n code: 'NO_TRANSACTION',\r\n message: 'Transaction is not open',\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.setState(message.transactionId, 'rolling_back');\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<RollbackTransactionMessage>({\r\n type: MessageType.ROLLBACK_TRANSACTION,\r\n transactionId: message.transactionId,\r\n }),\r\n );\r\n }\r\n\r\n handleWriteRequest(browserSocket: WebSocket, message: WriteRequestMessage): void {\r\n const browser = this.connectionManager.getBySocket(browserSocket);\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!browser || browser.role !== DevToolsRole.BROWSER || !session) {\r\n return;\r\n }\r\n\r\n if (session.browserConnectionId !== browser.connectionId) {\r\n return;\r\n }\r\n\r\n if (session.state !== 'open') {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n writeId: message.writeId,\r\n code: 'NO_TRANSACTION',\r\n message: 'Transaction is not open',\r\n });\r\n return;\r\n }\r\n\r\n const mobile = this.connectionManager.getByDeviceId(session.deviceId);\r\n\r\n if (!mobile) {\r\n this.sendWriteError(browser.connectionId, {\r\n transactionId: message.transactionId,\r\n writeId: message.writeId,\r\n code: 'DEVICE_OFFLINE',\r\n message: `Device ${session.deviceId} is not connected`,\r\n });\r\n return;\r\n }\r\n\r\n this.sessions.incrementPendingWrites(message.transactionId);\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<ExecuteWriteMessage>({\r\n type: MessageType.EXECUTE_WRITE,\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n operation: message.operation,\r\n }),\r\n );\r\n }\r\n\r\n handleTransactionAck(message: TransactionAckMessage): void {\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!session) {\r\n return;\r\n }\r\n\r\n if (!message.ok) {\r\n this.sessions.setState(message.transactionId, 'failed');\r\n this.sendWriteError(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n code: message.action === 'begin' ? 'ADAPTER_ERROR' : 'WRITE_FAILED',\r\n message: message.message ?? `Transaction ${message.action} failed`,\r\n });\r\n this.sessions.remove(message.transactionId);\r\n return;\r\n }\r\n\r\n if (message.action === 'begin') {\r\n this.sendTransactionStatus(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n deviceId: session.deviceId,\r\n state: 'open',\r\n });\r\n return;\r\n }\r\n\r\n if (message.action === 'commit') {\r\n this.sendTransactionStatus(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n deviceId: session.deviceId,\r\n state: 'idle',\r\n });\r\n this.sessions.remove(message.transactionId);\r\n return;\r\n }\r\n\r\n this.sendTransactionStatus(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n deviceId: session.deviceId,\r\n state: 'idle',\r\n message: message.message,\r\n });\r\n this.sessions.remove(message.transactionId);\r\n }\r\n\r\n handleWriteAck(message: WriteAckMessage): void {\r\n const session = this.sessions.get(message.transactionId);\r\n\r\n if (!session) {\r\n return;\r\n }\r\n\r\n this.sessions.decrementPendingWrites(message.transactionId);\r\n\r\n if (!message.ok) {\r\n this.sendWriteError(session.browserConnectionId, {\r\n transactionId: message.transactionId,\r\n writeId: message.writeId,\r\n code: 'WRITE_FAILED',\r\n message: message.message ?? 'Write operation failed',\r\n });\r\n return;\r\n }\r\n\r\n this.router.sendToBrowser(\r\n session.browserConnectionId,\r\n createMessage<WriteResultMessage>({\r\n type: MessageType.WRITE_RESULT,\r\n writeId: message.writeId,\r\n transactionId: message.transactionId,\r\n rowsAffected: message.rowsAffected ?? 0,\r\n }),\r\n );\r\n }\r\n\r\n checkTimeouts(): void {\r\n for (const session of this.sessions.getExpired()) {\r\n this.rollbackSession(session, 'TIMEOUT', 'Write transaction timed out');\r\n }\r\n }\r\n\r\n rollbackSessionsOnBrowserDisconnect(browserConnectionId: string): void {\r\n for (const session of this.sessions.getByBrowserConnectionId(browserConnectionId)) {\r\n this.rollbackSession(session, 'NO_TRANSACTION', 'Browser disconnected');\r\n }\r\n }\r\n\r\n rollbackSessionsForDevice(deviceId: string): void {\r\n for (const session of this.sessions.getByDeviceId(deviceId)) {\r\n this.rollbackSession(session, 'NO_TRANSACTION', 'Device disconnected');\r\n }\r\n }\r\n\r\n private rollbackSession(\r\n session: WriteSession,\r\n code: WriteErrorCode,\r\n message: string,\r\n ): void {\r\n logger.syncFailed(session.transactionId, code, message);\r\n\r\n this.sendWriteError(session.browserConnectionId, {\r\n transactionId: session.transactionId,\r\n code,\r\n message,\r\n });\r\n\r\n this.router.sendToMobile(\r\n session.deviceId,\r\n createMessage<RollbackTransactionMessage>({\r\n type: MessageType.ROLLBACK_TRANSACTION,\r\n transactionId: session.transactionId,\r\n }),\r\n );\r\n\r\n this.sessions.remove(session.transactionId);\r\n }\r\n\r\n private sendTransactionStatus(\r\n browserConnectionId: string,\r\n payload: Omit<TransactionStatusMessage, 'type' | 'timestamp'>,\r\n ): void {\r\n this.router.sendToBrowser(\r\n browserConnectionId,\r\n createMessage<TransactionStatusMessage>({\r\n type: MessageType.TRANSACTION_STATUS,\r\n ...payload,\r\n }),\r\n );\r\n }\r\n\r\n private sendWriteError(\r\n browserConnectionId: string,\r\n payload: {\r\n transactionId: string;\r\n writeId?: string;\r\n code: WriteErrorCode;\r\n message: string;\r\n },\r\n ): void {\r\n this.router.sendToBrowser(\r\n browserConnectionId,\r\n createMessage<WriteErrorMessage>({\r\n type: MessageType.WRITE_ERROR,\r\n ...payload,\r\n }),\r\n );\r\n }\r\n}\r\n","import type { TransactionStatusState } from '../types/protocol';\r\nimport { WRITE_TRANSACTION_TIMEOUT_MS } from '../types/protocol';\r\n\r\nexport type WriteSession = {\r\n transactionId: string;\r\n deviceId: string;\r\n browserConnectionId: string;\r\n state: TransactionStatusState;\r\n pendingWrites: number;\r\n createdAt: number;\r\n};\r\n\r\nexport class WriteSessionManager {\r\n private readonly sessions = new Map<string, WriteSession>();\r\n private readonly activeByDevice = new Map<string, string>();\r\n\r\n create(input: {\r\n transactionId: string;\r\n deviceId: string;\r\n browserConnectionId: string;\r\n }): WriteSession {\r\n const session: WriteSession = {\r\n transactionId: input.transactionId,\r\n deviceId: input.deviceId,\r\n browserConnectionId: input.browserConnectionId,\r\n state: 'opening',\r\n pendingWrites: 0,\r\n createdAt: Date.now(),\r\n };\r\n\r\n this.sessions.set(input.transactionId, session);\r\n this.activeByDevice.set(input.deviceId, input.transactionId);\r\n return session;\r\n }\r\n\r\n get(transactionId: string): WriteSession | undefined {\r\n return this.sessions.get(transactionId);\r\n }\r\n\r\n getActiveForDevice(deviceId: string): WriteSession | undefined {\r\n const transactionId = this.activeByDevice.get(deviceId);\r\n\r\n if (!transactionId) {\r\n return undefined;\r\n }\r\n\r\n return this.sessions.get(transactionId);\r\n }\r\n\r\n setState(transactionId: string, state: TransactionStatusState): WriteSession | undefined {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return undefined;\r\n }\r\n\r\n session.state = state;\r\n return session;\r\n }\r\n\r\n incrementPendingWrites(transactionId: string): WriteSession | undefined {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return undefined;\r\n }\r\n\r\n session.pendingWrites += 1;\r\n return session;\r\n }\r\n\r\n decrementPendingWrites(transactionId: string): WriteSession | undefined {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return undefined;\r\n }\r\n\r\n session.pendingWrites = Math.max(0, session.pendingWrites - 1);\r\n return session;\r\n }\r\n\r\n remove(transactionId: string): void {\r\n const session = this.sessions.get(transactionId);\r\n\r\n if (!session) {\r\n return;\r\n }\r\n\r\n if (this.activeByDevice.get(session.deviceId) === transactionId) {\r\n this.activeByDevice.delete(session.deviceId);\r\n }\r\n\r\n this.sessions.delete(transactionId);\r\n }\r\n\r\n getExpired(now = Date.now()): WriteSession[] {\r\n return [...this.sessions.values()].filter((session) => {\r\n if (session.state === 'idle' || session.state === 'failed') {\r\n return false;\r\n }\r\n\r\n return now - session.createdAt >= WRITE_TRANSACTION_TIMEOUT_MS;\r\n });\r\n }\r\n\r\n getByBrowserConnectionId(browserConnectionId: string): WriteSession[] {\r\n return [...this.sessions.values()].filter(\r\n (session) => session.browserConnectionId === browserConnectionId,\r\n );\r\n }\r\n\r\n getByDeviceId(deviceId: string): WriteSession[] {\r\n return [...this.sessions.values()].filter((session) => session.deviceId === deviceId);\r\n }\r\n}\r\n","import express from 'express';\r\nimport { createServer, type Server } from 'node:http';\r\nimport {\r\n DEFAULT_DEVTOOLS_HOST,\r\n DEFAULT_DEVTOOLS_PORT,\r\n DEVICE_SNAPSHOT_API_PATH,\r\n MAX_SNAPSHOT_BYTES,\r\n PROJECT_DATABASE_API_PATH,\r\n PROJECT_DATABASE_META_API_PATH,\r\n PROJECT_DATABASES_API_PATH,\r\n PROJECT_DEVICE_EXPORTS_API_PATH,\r\n buildDevToolsHttpUrl,\r\n buildDevToolsWsUrl,\r\n} from '../types/protocol';\r\nimport { SNAPSHOT_KIND_HEADER, SNAPSHOT_MIME_HEADER, SNAPSHOT_NAME_HEADER, SQLITE_SNAPSHOT_MIME_TYPE } from '../types/snapshot';\r\nimport { logger } from '../utils/logger';\r\nimport { attachWebUi } from './attachWebUi';\r\nimport { attachWebSocket } from './attachWebSocket';\r\nimport { ConnectionManager } from './connectionManager';\r\nimport { createCorsMiddleware } from './cors';\r\nimport { DeviceRegistry } from './deviceRegistry';\r\nimport { Heartbeat } from './heartbeat';\r\nimport { MessageRouter } from './messageRouter';\r\nimport { PendingRefreshStore } from './pendingRefreshStore';\r\nimport { RefreshCoordinator } from './refreshCoordinator';\r\nimport { SnapshotFileStore } from './snapshotFileStore';\r\nimport { SnapshotStore } from './snapshotStore';\r\nimport { WriteCoordinator } from './writeCoordinator';\r\nimport { WriteSessionManager } from './writeSessionManager';\r\n\r\nexport type DevToolsServerOptions = {\r\n host?: string;\r\n port?: number;\r\n dataDir?: string;\r\n snapshotPersistence?: boolean;\r\n webDistPath?: string;\r\n};\r\n\r\nexport type DevToolsServerUrls = {\r\n httpUrl: string;\r\n wsUrl: string;\r\n webUiEnabled: boolean;\r\n};\r\n\r\nexport type DevToolsServer = {\r\n app: express.Express;\r\n httpServer: Server;\r\n connectionManager: ConnectionManager;\r\n deviceRegistry: DeviceRegistry;\r\n router: MessageRouter;\r\n heartbeat: Heartbeat;\r\n snapshotStore: SnapshotStore;\r\n snapshotFileStore: SnapshotFileStore;\r\n pendingRefreshStore: PendingRefreshStore;\r\n writeSessions: WriteSessionManager;\r\n refreshCoordinator: RefreshCoordinator;\r\n writeCoordinator: WriteCoordinator;\r\n urls: DevToolsServerUrls;\r\n close: () => Promise<void>;\r\n};\r\n\r\nexport async function createDevToolsServer(\r\n options: DevToolsServerOptions = {},\r\n): Promise<DevToolsServer> {\r\n const host = options.host ?? DEFAULT_DEVTOOLS_HOST;\r\n const port = options.port ?? DEFAULT_DEVTOOLS_PORT;\r\n\r\n const app = express();\r\n const connectionManager = new ConnectionManager();\r\n const deviceRegistry = new DeviceRegistry(connectionManager);\r\n const router = new MessageRouter(connectionManager, deviceRegistry);\r\n const heartbeat = new Heartbeat(connectionManager, router);\r\n const snapshotStore = new SnapshotStore();\r\n const snapshotFileStore = new SnapshotFileStore({\r\n dataDir: options.dataDir,\r\n enabled: options.snapshotPersistence,\r\n });\r\n const pendingRefreshStore = new PendingRefreshStore();\r\n const writeSessions = new WriteSessionManager();\r\n\r\n const refreshCoordinator = new RefreshCoordinator(\r\n connectionManager,\r\n router,\r\n pendingRefreshStore,\r\n snapshotStore,\r\n snapshotFileStore,\r\n );\r\n const writeCoordinator = new WriteCoordinator(connectionManager, router, writeSessions);\r\n\r\n app.use(createCorsMiddleware());\r\n\r\n app.get('/health', (_request, response) => {\r\n response.json({ ok: true, ...deviceRegistry.snapshot() });\r\n });\r\n\r\n app.post(\r\n `${DEVICE_SNAPSHOT_API_PATH}/:deviceId/snapshot`,\r\n express.raw({ type: 'application/octet-stream', limit: MAX_SNAPSHOT_BYTES }),\r\n async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const body = request.body;\r\n\r\n if (!Buffer.isBuffer(body) || body.length === 0) {\r\n response.status(400).json({ ok: false, error: 'Empty snapshot body' });\r\n return;\r\n }\r\n\r\n const kindHeader = request.header(SNAPSHOT_KIND_HEADER);\r\n const mimeHeader = request.header(SNAPSHOT_MIME_HEADER);\r\n const nameHeader = request.header(SNAPSHOT_NAME_HEADER);\r\n\r\n const result = await refreshCoordinator.handleSnapshotUpload(deviceId, body, {\r\n kind: typeof kindHeader === 'string' ? kindHeader : undefined,\r\n mimeType: typeof mimeHeader === 'string' ? mimeHeader : undefined,\r\n databaseName: typeof nameHeader === 'string' ? nameHeader : undefined,\r\n });\r\n\r\n if (!result.ok) {\r\n response.status(result.code === 'SNAPSHOT_NOT_FOUND' ? 404 : 400).json({\r\n ok: false,\r\n error: result.code,\r\n });\r\n return;\r\n }\r\n\r\n response.status(201).json({ ok: true, deviceId, size: body.byteLength });\r\n },\r\n );\r\n\r\n app.get(`${DEVICE_SNAPSHOT_API_PATH}/:deviceId/snapshot`, async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const snapshot = await refreshCoordinator.getSnapshotAsync(deviceId);\r\n\r\n if (!snapshot) {\r\n response.status(404).json({ ok: false, error: 'SNAPSHOT_NOT_FOUND' });\r\n return;\r\n }\r\n\r\n response\r\n .status(200)\r\n .set('Content-Type', 'application/octet-stream')\r\n .send(snapshot);\r\n });\r\n\r\n app.get(PROJECT_DATABASE_META_API_PATH, async (_request, response) => {\r\n const meta = await snapshotFileStore.getActiveDatabaseMeta();\r\n response.json(meta);\r\n });\r\n\r\n app.get(PROJECT_DATABASES_API_PATH, async (_request, response) => {\r\n const databases = await snapshotFileStore.listDatabases();\r\n response.json({ databases });\r\n });\r\n\r\n app.get(PROJECT_DEVICE_EXPORTS_API_PATH, async (_request, response) => {\r\n const devices = await snapshotFileStore.listDeviceExports();\r\n response.json({ devices });\r\n });\r\n\r\n app.get(`${PROJECT_DEVICE_EXPORTS_API_PATH}/:deviceId/database/meta`, async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const meta = await snapshotFileStore.getDeviceDatabaseMeta(deviceId);\r\n response.json(meta);\r\n });\r\n\r\n app.get(`${PROJECT_DEVICE_EXPORTS_API_PATH}/:deviceId/database`, async (request, response) => {\r\n const deviceId = decodeURIComponent(request.params.deviceId);\r\n const meta = await snapshotFileStore.getDeviceDatabaseMeta(deviceId);\r\n\r\n if (!meta.exists) {\r\n response.status(404).json({ ok: false, error: 'DEVICE_DATABASE_NOT_FOUND', deviceId });\r\n return;\r\n }\r\n\r\n const bytes = await snapshotFileStore.readDeviceDatabase(deviceId);\r\n\r\n if (!bytes) {\r\n response.status(404).json({ ok: false, error: 'DEVICE_DATABASE_NOT_FOUND', deviceId });\r\n return;\r\n }\r\n\r\n response\r\n .status(200)\r\n .set('Content-Type', meta.mimeType ?? SQLITE_SNAPSHOT_MIME_TYPE)\r\n .send(bytes);\r\n });\r\n\r\n app.get(PROJECT_DATABASE_API_PATH, async (_request, response) => {\r\n const meta = await snapshotFileStore.getActiveDatabaseMeta();\r\n\r\n if (!meta.exists) {\r\n response.status(404).json({ ok: false, error: 'PROJECT_DATABASE_NOT_FOUND' });\r\n return;\r\n }\r\n\r\n const bytes = await snapshotFileStore.readActiveDatabase();\r\n\r\n if (!bytes) {\r\n response.status(404).json({ ok: false, error: 'PROJECT_DATABASE_NOT_FOUND' });\r\n return;\r\n }\r\n\r\n response\r\n .status(200)\r\n .set('Content-Type', meta.mimeType ?? SQLITE_SNAPSHOT_MIME_TYPE)\r\n .send(bytes);\r\n });\r\n\r\n if (options.webDistPath) {\r\n attachWebUi(app, options.webDistPath);\r\n }\r\n\r\n const httpServer = createServer(app);\r\n attachWebSocket(\r\n httpServer,\r\n connectionManager,\r\n router,\r\n heartbeat,\r\n refreshCoordinator,\r\n writeCoordinator,\r\n { snapshotFileStore },\r\n );\r\n\r\n const refreshTimeoutInterval = setInterval(() => {\r\n refreshCoordinator.checkTimeouts();\r\n writeCoordinator.checkTimeouts();\r\n }, 5_000);\r\n\r\n if (snapshotFileStore.isEnabled()) {\r\n await snapshotFileStore.listDeviceExports();\r\n }\r\n\r\n await new Promise<void>((resolve, reject) => {\r\n httpServer.once('error', reject);\r\n httpServer.listen(port, host, () => resolve());\r\n });\r\n\r\n const displayHost = host === '0.0.0.0' ? 'localhost' : host;\r\n const httpUrl = buildDevToolsHttpUrl(displayHost, port);\r\n const wsUrl = buildDevToolsWsUrl(displayHost, port);\r\n const webUiEnabled = Boolean(options.webDistPath);\r\n\r\n logger.serverStarted(httpUrl, wsUrl, webUiEnabled);\r\n\r\n return {\r\n app,\r\n httpServer,\r\n connectionManager,\r\n deviceRegistry,\r\n router,\r\n heartbeat,\r\n snapshotStore,\r\n snapshotFileStore,\r\n pendingRefreshStore,\r\n writeSessions,\r\n refreshCoordinator,\r\n writeCoordinator,\r\n urls: {\r\n httpUrl,\r\n wsUrl,\r\n webUiEnabled,\r\n },\r\n close: () =>\r\n new Promise((resolve, reject) => {\r\n clearInterval(refreshTimeoutInterval);\r\n heartbeat.stop();\r\n httpServer.close((error) => {\r\n if (error) {\r\n reject(error);\r\n return;\r\n }\r\n\r\n resolve();\r\n });\r\n }),\r\n };\r\n}\r\n"]}