database-devtools 0.1.1 → 0.1.3
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.
- package/dist/DatabaseDevTools-CdpQJBqG.d.ts +39 -0
- package/dist/DatabaseDevTools-sw1wX5nW.d.cts +39 -0
- package/dist/adapter/index.d.cts +3 -3
- package/dist/adapter/index.d.ts +3 -3
- package/dist/adapter/index.js +0 -1
- package/dist/{adapter-BjJm71wW.d.cts → adapter-DQyQ5ycj.d.cts} +1 -1
- package/dist/{adapter-DJSjDewg.d.ts → adapter-cIF5P6qI.d.ts} +1 -1
- package/dist/adapters/sqlite/index.d.cts +4 -4
- package/dist/adapters/sqlite/index.d.ts +4 -4
- package/dist/adapters/sqlite/index.js +0 -1
- package/dist/chunk-NHHA5CZP.js +2730 -0
- package/dist/chunk-NHHA5CZP.js.map +1 -0
- package/dist/chunk-S4Z7A4TW.js +116 -0
- package/dist/chunk-S4Z7A4TW.js.map +1 -0
- package/dist/{chunk-ZS5MZR75.js → chunk-UNVCJMJK.js} +4 -114
- package/dist/chunk-UNVCJMJK.js.map +1 -0
- package/dist/client/index.d.cts +4 -3
- package/dist/client/index.d.ts +4 -3
- package/dist/client/index.js +2 -2
- package/dist/{createDevToolsServer-B7NQ_5H4.d.cts → createDevToolsServer-Cqb7xzIv.d.cts} +1 -1
- package/dist/{createDevToolsServer-DlNMoCJR.d.ts → createDevToolsServer-D3QnP8Yb.d.ts} +1 -1
- package/dist/{handleDeviceSnapshot-cYGuitSc.d.cts → handleDeviceSnapshot-CIZ_00fE.d.cts} +2 -50
- package/dist/{handleDeviceSnapshot-CR-4QMdk.d.ts → handleDeviceSnapshot-DF9sS1Pm.d.ts} +2 -50
- package/dist/index.cjs +30 -43
- package/dist/index.cjs.map +1 -1
- package/dist/index.d.cts +13 -45
- package/dist/index.d.ts +13 -45
- package/dist/index.js +7 -2741
- package/dist/index.js.map +1 -1
- package/dist/inspector/index.d.cts +2 -2
- package/dist/inspector/index.d.ts +2 -2
- package/dist/inspector/index.js +0 -1
- package/dist/inspectors/sqlite/index.d.cts +2 -2
- package/dist/inspectors/sqlite/index.d.ts +2 -2
- package/dist/inspectors/sqlite/index.js +0 -1
- package/dist/inspectors/sqlite/index.js.map +1 -1
- package/dist/native.cjs +3933 -0
- package/dist/native.cjs.map +1 -0
- package/dist/native.d.cts +37 -0
- package/dist/native.d.ts +37 -0
- package/dist/native.js +12 -0
- package/dist/native.js.map +1 -0
- package/dist/{register-BuicFu9L.d.cts → register-DEZ0kK1p.d.cts} +2 -2
- package/dist/{register-aITLN9Q9.d.ts → register-Dawue1_L.d.ts} +2 -2
- package/dist/resolveDeviceDatabaseUrl-DhRP-h1Y.d.cts +49 -0
- package/dist/resolveDeviceDatabaseUrl-DhRP-h1Y.d.ts +49 -0
- package/dist/server/index.d.cts +1 -1
- package/dist/server/index.d.ts +1 -1
- package/dist/server/index.js +0 -1
- package/dist/{snapshot-Dhyecgo2.d.cts → snapshot-Dknp_qP1.d.cts} +1 -1
- package/dist/{snapshot-Dhyecgo2.d.ts → snapshot-Dknp_qP1.d.ts} +1 -1
- package/dist/types/protocol.js +0 -1
- package/dist/{types-CKVRCX-e.d.ts → types-6nco_RRp.d.ts} +2 -2
- package/dist/{types-CIA11diJ.d.cts → types-BQHZtFwx.d.cts} +2 -2
- package/dist/{types-CF6qEU-_.d.ts → types-DkVlU6t-.d.ts} +2 -2
- package/dist/{types-BRLJdBRY.d.cts → types-gT3gDw_T.d.cts} +2 -2
- package/dist/web/assets/{index-DQrPRTOy.js → index-DogMAkgu.js} +1 -1
- package/dist/web/index.html +1 -1
- package/package.json +8 -6
- package/dist/chunk-DGUM43GV.js +0 -10
- package/dist/chunk-DGUM43GV.js.map +0 -1
- package/dist/chunk-ZS5MZR75.js.map +0 -1
package/dist/web/index.html
CHANGED
|
@@ -17,7 +17,7 @@
|
|
|
17
17
|
document.documentElement.setAttribute('data-theme', theme);
|
|
18
18
|
})();
|
|
19
19
|
</script>
|
|
20
|
-
<script type="module" crossorigin src="/assets/index-
|
|
20
|
+
<script type="module" crossorigin src="/assets/index-DogMAkgu.js"></script>
|
|
21
21
|
<link rel="stylesheet" crossorigin href="/assets/index-CLEaIsUd.css">
|
|
22
22
|
</head>
|
|
23
23
|
<body>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "database-devtools",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.3",
|
|
4
4
|
"description": "Inspect SQLite in React Native & Expo from your browser — browse tables, run SQL, edit data. DevTools for mobile databases.",
|
|
5
5
|
"license": "MIT",
|
|
6
6
|
"author": "Rajkumar Tamang",
|
|
@@ -17,10 +17,10 @@
|
|
|
17
17
|
"type": "module",
|
|
18
18
|
"main": "./dist/index.js",
|
|
19
19
|
"types": "./dist/index.d.ts",
|
|
20
|
-
"react-native": "./
|
|
20
|
+
"react-native": "./dist/native.js",
|
|
21
21
|
"exports": {
|
|
22
22
|
".": {
|
|
23
|
-
"react-native": "./
|
|
23
|
+
"react-native": "./dist/native.js",
|
|
24
24
|
"types": "./dist/index.d.ts",
|
|
25
25
|
"import": "./dist/index.js",
|
|
26
26
|
"require": "./dist/index.cjs",
|
|
@@ -42,7 +42,7 @@
|
|
|
42
42
|
"default": "./dist/types/protocol.js"
|
|
43
43
|
},
|
|
44
44
|
"./adapter": {
|
|
45
|
-
"react-native": "./
|
|
45
|
+
"react-native": "./dist/adapter/index.js",
|
|
46
46
|
"types": "./dist/adapter/index.d.ts",
|
|
47
47
|
"import": "./dist/adapter/index.js",
|
|
48
48
|
"require": "./dist/adapter/index.cjs",
|
|
@@ -59,7 +59,7 @@
|
|
|
59
59
|
"default": "./dist/inspectors/sqlite/index.js"
|
|
60
60
|
},
|
|
61
61
|
"./adapters/sqlite": {
|
|
62
|
-
"react-native": "./
|
|
62
|
+
"react-native": "./dist/adapters/sqlite/index.js",
|
|
63
63
|
"types": "./dist/adapters/sqlite/index.d.ts",
|
|
64
64
|
"import": "./dist/adapters/sqlite/index.js",
|
|
65
65
|
"require": "./dist/adapters/sqlite/index.cjs",
|
|
@@ -79,6 +79,7 @@
|
|
|
79
79
|
"react-native": ">=0.73",
|
|
80
80
|
"@react-native-async-storage/async-storage": ">=1.23",
|
|
81
81
|
"@expo/vector-icons": ">=14",
|
|
82
|
+
"expo-constants": ">=15",
|
|
82
83
|
"expo-sqlite": ">=15",
|
|
83
84
|
"expo-clipboard": ">=7",
|
|
84
85
|
"sql.js": ">=1.13"
|
|
@@ -113,8 +114,9 @@
|
|
|
113
114
|
"@types/react": "~19.1.0",
|
|
114
115
|
"@types/sql.js": "^1.4.9",
|
|
115
116
|
"@types/ws": "^8.5.13",
|
|
116
|
-
"expo-
|
|
117
|
+
"expo-constants": "~18.0.13",
|
|
117
118
|
"expo-clipboard": "~8.0.8",
|
|
119
|
+
"expo-sqlite": "~16.0.10",
|
|
118
120
|
"react": "19.1.0",
|
|
119
121
|
"sql.js": "^1.13.0",
|
|
120
122
|
"tsup": "^8.3.5",
|
package/dist/chunk-DGUM43GV.js
DELETED
|
@@ -1,10 +0,0 @@
|
|
|
1
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
export { __require };
|
|
9
|
-
//# sourceMappingURL=chunk-DGUM43GV.js.map
|
|
10
|
-
//# sourceMappingURL=chunk-DGUM43GV.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":[],"names":[],"mappings":"","file":"chunk-DGUM43GV.js"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"sources":["../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/formatSyncError.ts"],"names":["resolveApiBase"],"mappings":"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","file":"chunk-ZS5MZR75.js","sourcesContent":["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 { 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"]}
|