{"version":3,"sources":["../../src/types/protocol.ts"],"names":[],"mappings":"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","file":"protocol.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"]}