database-devtools 0.1.0

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.
Files changed (94) hide show
  1. package/LICENSE +5 -0
  2. package/dist/adapter/index.cjs +314 -0
  3. package/dist/adapter/index.cjs.map +1 -0
  4. package/dist/adapter/index.d.cts +34 -0
  5. package/dist/adapter/index.d.ts +34 -0
  6. package/dist/adapter/index.js +6 -0
  7. package/dist/adapter/index.js.map +1 -0
  8. package/dist/adapter-BjJm71wW.d.cts +30 -0
  9. package/dist/adapter-DJSjDewg.d.ts +30 -0
  10. package/dist/adapters/sqlite/index.cjs +251 -0
  11. package/dist/adapters/sqlite/index.cjs.map +1 -0
  12. package/dist/adapters/sqlite/index.d.cts +21 -0
  13. package/dist/adapters/sqlite/index.d.ts +21 -0
  14. package/dist/adapters/sqlite/index.js +6 -0
  15. package/dist/adapters/sqlite/index.js.map +1 -0
  16. package/dist/chunk-2JGL2JVD.js +52 -0
  17. package/dist/chunk-2JGL2JVD.js.map +1 -0
  18. package/dist/chunk-AZECU6D7.js +27 -0
  19. package/dist/chunk-AZECU6D7.js.map +1 -0
  20. package/dist/chunk-BLOSGEQV.js +71 -0
  21. package/dist/chunk-BLOSGEQV.js.map +1 -0
  22. package/dist/chunk-CPVVIH5G.js +258 -0
  23. package/dist/chunk-CPVVIH5G.js.map +1 -0
  24. package/dist/chunk-DGUM43GV.js +10 -0
  25. package/dist/chunk-DGUM43GV.js.map +1 -0
  26. package/dist/chunk-HIDZTOJ3.js +9 -0
  27. package/dist/chunk-HIDZTOJ3.js.map +1 -0
  28. package/dist/chunk-I65IM47D.js +243 -0
  29. package/dist/chunk-I65IM47D.js.map +1 -0
  30. package/dist/chunk-MXVIGMVT.js +3 -0
  31. package/dist/chunk-MXVIGMVT.js.map +1 -0
  32. package/dist/chunk-O6AO7KHA.js +3 -0
  33. package/dist/chunk-O6AO7KHA.js.map +1 -0
  34. package/dist/chunk-TNDOAHT5.js +1784 -0
  35. package/dist/chunk-TNDOAHT5.js.map +1 -0
  36. package/dist/chunk-ZS5MZR75.js +655 -0
  37. package/dist/chunk-ZS5MZR75.js.map +1 -0
  38. package/dist/cli.cjs +2053 -0
  39. package/dist/cli.cjs.map +1 -0
  40. package/dist/client/index.cjs +947 -0
  41. package/dist/client/index.cjs.map +1 -0
  42. package/dist/client/index.d.cts +75 -0
  43. package/dist/client/index.d.ts +75 -0
  44. package/dist/client/index.js +98 -0
  45. package/dist/client/index.js.map +1 -0
  46. package/dist/createDevToolsServer-B7NQ_5H4.d.cts +292 -0
  47. package/dist/createDevToolsServer-DlNMoCJR.d.ts +292 -0
  48. package/dist/handleDeviceSnapshot-CR-4QMdk.d.ts +116 -0
  49. package/dist/handleDeviceSnapshot-cYGuitSc.d.cts +116 -0
  50. package/dist/index.cjs +5877 -0
  51. package/dist/index.cjs.map +1 -0
  52. package/dist/index.d.cts +61 -0
  53. package/dist/index.d.ts +61 -0
  54. package/dist/index.js +2748 -0
  55. package/dist/index.js.map +1 -0
  56. package/dist/inspector/index.cjs +57 -0
  57. package/dist/inspector/index.cjs.map +1 -0
  58. package/dist/inspector/index.d.cts +26 -0
  59. package/dist/inspector/index.d.ts +26 -0
  60. package/dist/inspector/index.js +5 -0
  61. package/dist/inspector/index.js.map +1 -0
  62. package/dist/inspectors/sqlite/index.cjs +306 -0
  63. package/dist/inspectors/sqlite/index.cjs.map +1 -0
  64. package/dist/inspectors/sqlite/index.d.cts +53 -0
  65. package/dist/inspectors/sqlite/index.d.ts +53 -0
  66. package/dist/inspectors/sqlite/index.js +260 -0
  67. package/dist/inspectors/sqlite/index.js.map +1 -0
  68. package/dist/register-BuicFu9L.d.cts +32 -0
  69. package/dist/register-aITLN9Q9.d.ts +32 -0
  70. package/dist/server/index.cjs +1948 -0
  71. package/dist/server/index.cjs.map +1 -0
  72. package/dist/server/index.d.cts +15 -0
  73. package/dist/server/index.d.ts +15 -0
  74. package/dist/server/index.js +7 -0
  75. package/dist/server/index.js.map +1 -0
  76. package/dist/snapshot-Dhyecgo2.d.cts +33 -0
  77. package/dist/snapshot-Dhyecgo2.d.ts +33 -0
  78. package/dist/types/protocol.cjs +309 -0
  79. package/dist/types/protocol.cjs.map +1 -0
  80. package/dist/types/protocol.d.cts +291 -0
  81. package/dist/types/protocol.d.ts +291 -0
  82. package/dist/types/protocol.js +4 -0
  83. package/dist/types/protocol.js.map +1 -0
  84. package/dist/types-BRLJdBRY.d.cts +16 -0
  85. package/dist/types-CF6qEU-_.d.ts +16 -0
  86. package/dist/types-CIA11diJ.d.cts +62 -0
  87. package/dist/types-CKVRCX-e.d.ts +62 -0
  88. package/dist/web/assets/index-CLEaIsUd.css +1 -0
  89. package/dist/web/assets/index-DQrPRTOy.js +100 -0
  90. package/dist/web/assets/sql-wasm-UFUCzYNW.wasm +0 -0
  91. package/dist/web/index.html +26 -0
  92. package/dist/write-C3toEIMs.d.cts +21 -0
  93. package/dist/write-C3toEIMs.d.ts +21 -0
  94. package/package.json +137 -0
@@ -0,0 +1,292 @@
1
+ import express from 'express';
2
+ import { Server } from 'node:http';
3
+ import { WebSocket } from 'ws';
4
+ import { DevToolsRole, DeviceMetadata, DeviceStatusPayload, ServerMessage, RefreshType, RefreshInitiator, RefreshRequestMessage, ExportSnapshotRequestMessage, SnapshotReadyMessage, RefreshErrorCode, TransactionStatusState, BeginTransactionRequestMessage, CommitTransactionRequestMessage, RollbackTransactionRequestMessage, WriteRequestMessage, TransactionAckMessage, WriteAckMessage } from './types/protocol.cjs';
5
+
6
+ type ConnectedClient = {
7
+ socket: WebSocket;
8
+ connectionId: string;
9
+ role: DevToolsRole;
10
+ deviceId?: string;
11
+ metadata?: DeviceMetadata;
12
+ connectedAt: number;
13
+ lastPongAt: number;
14
+ };
15
+ type RegisterClientInput = {
16
+ socket: WebSocket;
17
+ role: DevToolsRole;
18
+ deviceId?: string;
19
+ metadata?: DeviceMetadata;
20
+ };
21
+ declare class ConnectionManager {
22
+ private readonly clients;
23
+ add(input: RegisterClientInput): ConnectedClient;
24
+ remove(socket: WebSocket): ConnectedClient | undefined;
25
+ getBySocket(socket: WebSocket): ConnectedClient | undefined;
26
+ getByConnectionId(connectionId: string): ConnectedClient | undefined;
27
+ getByDeviceId(deviceId: string): ConnectedClient | undefined;
28
+ getByRole(role: DevToolsRole): ConnectedClient[];
29
+ updateLastPong(socket: WebSocket): void;
30
+ getAll(): ConnectedClient[];
31
+ }
32
+
33
+ declare class DeviceRegistry {
34
+ private readonly connectionManager;
35
+ constructor(connectionManager: ConnectionManager);
36
+ snapshot(): DeviceStatusPayload;
37
+ }
38
+
39
+ type OutboundMessage = ServerMessage;
40
+ declare class MessageRouter {
41
+ private readonly connectionManager;
42
+ private readonly deviceRegistry;
43
+ constructor(connectionManager: ConnectionManager, deviceRegistry: DeviceRegistry);
44
+ sendToSocket(socket: WebSocket, message: OutboundMessage): void;
45
+ sendToBrowser(connectionId: string, message: OutboundMessage): void;
46
+ sendToMobile(deviceId: string, message: OutboundMessage): void;
47
+ broadcastToBrowsers(message: OutboundMessage): void;
48
+ broadcastToMobiles(message: OutboundMessage): void;
49
+ broadcastToAll(message: OutboundMessage): void;
50
+ broadcast(message: unknown, target?: 'browsers' | 'mobiles' | 'all'): void;
51
+ broadcastDeviceStatus(): void;
52
+ }
53
+
54
+ declare class Heartbeat {
55
+ private readonly connectionManager;
56
+ private readonly router;
57
+ private interval;
58
+ constructor(connectionManager: ConnectionManager, router: MessageRouter);
59
+ start(): void;
60
+ stop(): void;
61
+ private pingAll;
62
+ private removeStaleConnections;
63
+ }
64
+
65
+ type PendingRefresh = {
66
+ deviceId: string;
67
+ refreshType: RefreshType;
68
+ startedAt: number;
69
+ initiator: RefreshInitiator;
70
+ browserConnectionId?: string;
71
+ notifyAllBrowsers?: boolean;
72
+ };
73
+ declare class PendingRefreshStore {
74
+ private readonly pendingByDevice;
75
+ create(input: PendingRefresh): void;
76
+ get(deviceId: string): PendingRefresh | undefined;
77
+ has(deviceId: string): boolean;
78
+ remove(deviceId: string): void;
79
+ getExpired(now?: number): PendingRefresh[];
80
+ }
81
+
82
+ type DatabaseManifestEntry = {
83
+ id: string;
84
+ label: string;
85
+ relativePath: string;
86
+ source: 'active' | 'device';
87
+ deviceId?: string;
88
+ bundleId?: string;
89
+ storageKey?: string;
90
+ kind: string;
91
+ mimeType: string;
92
+ databaseName?: string;
93
+ size: number;
94
+ updatedAt: number;
95
+ };
96
+ type PersistDeviceSnapshotInput = {
97
+ deviceId: string;
98
+ bytes: Buffer;
99
+ kind: string;
100
+ mimeType: string;
101
+ databaseName?: string;
102
+ bundleId?: string;
103
+ };
104
+ type PersistDeviceSnapshotResult = {
105
+ deviceRelativePath: string;
106
+ exportedAt: number;
107
+ size: number;
108
+ };
109
+
110
+ type ProjectDatabaseMeta = {
111
+ exists: boolean;
112
+ relativePath?: string;
113
+ absolutePath?: string;
114
+ kind?: string;
115
+ mimeType?: string;
116
+ databaseName?: string;
117
+ size?: number;
118
+ updatedAt?: number;
119
+ source?: DatabaseManifestEntry['source'];
120
+ deviceId?: string;
121
+ };
122
+ type ListedProjectDatabase = {
123
+ id: string;
124
+ label: string;
125
+ relativePath: string;
126
+ source: DatabaseManifestEntry['source'];
127
+ deviceId?: string;
128
+ bundleId?: string;
129
+ storageKey?: string;
130
+ databaseName?: string;
131
+ size: number;
132
+ updatedAt: number;
133
+ };
134
+ declare class SnapshotFileStore {
135
+ private readonly dataDir;
136
+ private readonly enabled;
137
+ constructor(options?: {
138
+ dataDir?: string;
139
+ enabled?: boolean;
140
+ });
141
+ getDataDir(): string;
142
+ isEnabled(): boolean;
143
+ persistDeviceSnapshot(input: PersistDeviceSnapshotInput): Promise<PersistDeviceSnapshotResult | null>;
144
+ reconcileOnMobileConnect(input: {
145
+ deviceId: string;
146
+ bundleId?: string;
147
+ }): Promise<void>;
148
+ readDeviceSnapshot(deviceId: string): Promise<Buffer | undefined>;
149
+ readDeviceDatabase(deviceId: string): Promise<Buffer | undefined>;
150
+ getDeviceDatabaseMeta(deviceId: string): Promise<ProjectDatabaseMeta>;
151
+ listDeviceExports(): Promise<ListedProjectDatabase[]>;
152
+ private reconcileLegacyExports;
153
+ private pruneDeviceExports;
154
+ private deleteEntryFiles;
155
+ private manifestEntryToListed;
156
+ private resolveDeviceDatabaseFile;
157
+ /** @deprecated Proxies to the newest device export for backward-compatible API callers. */
158
+ readActiveDatabase(): Promise<Buffer | undefined>;
159
+ /** @deprecated Proxies to the newest device export for backward-compatible API callers. */
160
+ getActiveDatabaseMeta(): Promise<ProjectDatabaseMeta>;
161
+ listDatabases(): Promise<ListedProjectDatabase[]>;
162
+ readDatabaseByRelativePath(relativePath: string): Promise<Buffer | undefined>;
163
+ getDeviceDirectoryName(deviceId: string): string;
164
+ }
165
+
166
+ type StoredSnapshot = {
167
+ deviceId: string;
168
+ bytes: Buffer;
169
+ kind: string;
170
+ mimeType: string;
171
+ databaseName?: string;
172
+ exportedAt: number;
173
+ };
174
+ declare class SnapshotStore {
175
+ private readonly snapshots;
176
+ set(deviceId: string, bytes: Buffer, metadata: {
177
+ kind: string;
178
+ mimeType: string;
179
+ databaseName?: string;
180
+ }): StoredSnapshot;
181
+ get(deviceId: string): StoredSnapshot | undefined;
182
+ getBytes(deviceId: string): Buffer | undefined;
183
+ }
184
+
185
+ declare class RefreshCoordinator {
186
+ private readonly connectionManager;
187
+ private readonly router;
188
+ private readonly pending;
189
+ private readonly snapshots;
190
+ private readonly snapshotFiles?;
191
+ constructor(connectionManager: ConnectionManager, router: MessageRouter, pending: PendingRefreshStore, snapshots: SnapshotStore, snapshotFiles?: SnapshotFileStore | undefined);
192
+ handleRefreshRequest(browserSocket: WebSocket, message: RefreshRequestMessage): void;
193
+ handleMobileExportRequest(mobileSocket: WebSocket, message: ExportSnapshotRequestMessage): void;
194
+ handleSnapshotUpload(deviceId: string, body: Buffer, metadata?: {
195
+ kind?: string;
196
+ mimeType?: string;
197
+ databaseName?: string;
198
+ }): Promise<{
199
+ ok: true;
200
+ stored: SnapshotReadyMessage;
201
+ } | {
202
+ ok: false;
203
+ code: RefreshErrorCode;
204
+ }>;
205
+ getSnapshot(deviceId: string): Buffer | undefined;
206
+ getSnapshotAsync(deviceId: string): Promise<Buffer | undefined>;
207
+ checkTimeouts(): void;
208
+ private requestMobileUpload;
209
+ private failRefresh;
210
+ private failMobileExport;
211
+ private sendRefreshStatus;
212
+ private sendRefreshError;
213
+ private sendExportSnapshotError;
214
+ }
215
+
216
+ type WriteSession = {
217
+ transactionId: string;
218
+ deviceId: string;
219
+ browserConnectionId: string;
220
+ state: TransactionStatusState;
221
+ pendingWrites: number;
222
+ createdAt: number;
223
+ };
224
+ declare class WriteSessionManager {
225
+ private readonly sessions;
226
+ private readonly activeByDevice;
227
+ create(input: {
228
+ transactionId: string;
229
+ deviceId: string;
230
+ browserConnectionId: string;
231
+ }): WriteSession;
232
+ get(transactionId: string): WriteSession | undefined;
233
+ getActiveForDevice(deviceId: string): WriteSession | undefined;
234
+ setState(transactionId: string, state: TransactionStatusState): WriteSession | undefined;
235
+ incrementPendingWrites(transactionId: string): WriteSession | undefined;
236
+ decrementPendingWrites(transactionId: string): WriteSession | undefined;
237
+ remove(transactionId: string): void;
238
+ getExpired(now?: number): WriteSession[];
239
+ getByBrowserConnectionId(browserConnectionId: string): WriteSession[];
240
+ getByDeviceId(deviceId: string): WriteSession[];
241
+ }
242
+
243
+ declare class WriteCoordinator {
244
+ private readonly connectionManager;
245
+ private readonly router;
246
+ private readonly sessions;
247
+ constructor(connectionManager: ConnectionManager, router: MessageRouter, sessions: WriteSessionManager);
248
+ handleBeginTransactionRequest(browserSocket: WebSocket, message: BeginTransactionRequestMessage): void;
249
+ handleCommitTransactionRequest(browserSocket: WebSocket, message: CommitTransactionRequestMessage): void;
250
+ handleRollbackTransactionRequest(browserSocket: WebSocket, message: RollbackTransactionRequestMessage): void;
251
+ handleWriteRequest(browserSocket: WebSocket, message: WriteRequestMessage): void;
252
+ handleTransactionAck(message: TransactionAckMessage): void;
253
+ handleWriteAck(message: WriteAckMessage): void;
254
+ checkTimeouts(): void;
255
+ rollbackSessionsOnBrowserDisconnect(browserConnectionId: string): void;
256
+ rollbackSessionsForDevice(deviceId: string): void;
257
+ private rollbackSession;
258
+ private sendTransactionStatus;
259
+ private sendWriteError;
260
+ }
261
+
262
+ type DevToolsServerOptions = {
263
+ host?: string;
264
+ port?: number;
265
+ dataDir?: string;
266
+ snapshotPersistence?: boolean;
267
+ webDistPath?: string;
268
+ };
269
+ type DevToolsServerUrls = {
270
+ httpUrl: string;
271
+ wsUrl: string;
272
+ webUiEnabled: boolean;
273
+ };
274
+ type DevToolsServer = {
275
+ app: express.Express;
276
+ httpServer: Server;
277
+ connectionManager: ConnectionManager;
278
+ deviceRegistry: DeviceRegistry;
279
+ router: MessageRouter;
280
+ heartbeat: Heartbeat;
281
+ snapshotStore: SnapshotStore;
282
+ snapshotFileStore: SnapshotFileStore;
283
+ pendingRefreshStore: PendingRefreshStore;
284
+ writeSessions: WriteSessionManager;
285
+ refreshCoordinator: RefreshCoordinator;
286
+ writeCoordinator: WriteCoordinator;
287
+ urls: DevToolsServerUrls;
288
+ close: () => Promise<void>;
289
+ };
290
+ declare function createDevToolsServer(options?: DevToolsServerOptions): Promise<DevToolsServer>;
291
+
292
+ export { type ConnectedClient as C, type DevToolsServer as D, Heartbeat as H, MessageRouter as M, type OutboundMessage as O, type PendingRefresh as P, RefreshCoordinator as R, SnapshotStore as S, ConnectionManager as a, type DevToolsServerOptions as b, DeviceRegistry as c, PendingRefreshStore as d, type StoredSnapshot as e, createDevToolsServer as f };
@@ -0,0 +1,292 @@
1
+ import express from 'express';
2
+ import { Server } from 'node:http';
3
+ import { WebSocket } from 'ws';
4
+ import { DevToolsRole, DeviceMetadata, DeviceStatusPayload, ServerMessage, RefreshType, RefreshInitiator, RefreshRequestMessage, ExportSnapshotRequestMessage, SnapshotReadyMessage, RefreshErrorCode, TransactionStatusState, BeginTransactionRequestMessage, CommitTransactionRequestMessage, RollbackTransactionRequestMessage, WriteRequestMessage, TransactionAckMessage, WriteAckMessage } from './types/protocol.js';
5
+
6
+ type ConnectedClient = {
7
+ socket: WebSocket;
8
+ connectionId: string;
9
+ role: DevToolsRole;
10
+ deviceId?: string;
11
+ metadata?: DeviceMetadata;
12
+ connectedAt: number;
13
+ lastPongAt: number;
14
+ };
15
+ type RegisterClientInput = {
16
+ socket: WebSocket;
17
+ role: DevToolsRole;
18
+ deviceId?: string;
19
+ metadata?: DeviceMetadata;
20
+ };
21
+ declare class ConnectionManager {
22
+ private readonly clients;
23
+ add(input: RegisterClientInput): ConnectedClient;
24
+ remove(socket: WebSocket): ConnectedClient | undefined;
25
+ getBySocket(socket: WebSocket): ConnectedClient | undefined;
26
+ getByConnectionId(connectionId: string): ConnectedClient | undefined;
27
+ getByDeviceId(deviceId: string): ConnectedClient | undefined;
28
+ getByRole(role: DevToolsRole): ConnectedClient[];
29
+ updateLastPong(socket: WebSocket): void;
30
+ getAll(): ConnectedClient[];
31
+ }
32
+
33
+ declare class DeviceRegistry {
34
+ private readonly connectionManager;
35
+ constructor(connectionManager: ConnectionManager);
36
+ snapshot(): DeviceStatusPayload;
37
+ }
38
+
39
+ type OutboundMessage = ServerMessage;
40
+ declare class MessageRouter {
41
+ private readonly connectionManager;
42
+ private readonly deviceRegistry;
43
+ constructor(connectionManager: ConnectionManager, deviceRegistry: DeviceRegistry);
44
+ sendToSocket(socket: WebSocket, message: OutboundMessage): void;
45
+ sendToBrowser(connectionId: string, message: OutboundMessage): void;
46
+ sendToMobile(deviceId: string, message: OutboundMessage): void;
47
+ broadcastToBrowsers(message: OutboundMessage): void;
48
+ broadcastToMobiles(message: OutboundMessage): void;
49
+ broadcastToAll(message: OutboundMessage): void;
50
+ broadcast(message: unknown, target?: 'browsers' | 'mobiles' | 'all'): void;
51
+ broadcastDeviceStatus(): void;
52
+ }
53
+
54
+ declare class Heartbeat {
55
+ private readonly connectionManager;
56
+ private readonly router;
57
+ private interval;
58
+ constructor(connectionManager: ConnectionManager, router: MessageRouter);
59
+ start(): void;
60
+ stop(): void;
61
+ private pingAll;
62
+ private removeStaleConnections;
63
+ }
64
+
65
+ type PendingRefresh = {
66
+ deviceId: string;
67
+ refreshType: RefreshType;
68
+ startedAt: number;
69
+ initiator: RefreshInitiator;
70
+ browserConnectionId?: string;
71
+ notifyAllBrowsers?: boolean;
72
+ };
73
+ declare class PendingRefreshStore {
74
+ private readonly pendingByDevice;
75
+ create(input: PendingRefresh): void;
76
+ get(deviceId: string): PendingRefresh | undefined;
77
+ has(deviceId: string): boolean;
78
+ remove(deviceId: string): void;
79
+ getExpired(now?: number): PendingRefresh[];
80
+ }
81
+
82
+ type DatabaseManifestEntry = {
83
+ id: string;
84
+ label: string;
85
+ relativePath: string;
86
+ source: 'active' | 'device';
87
+ deviceId?: string;
88
+ bundleId?: string;
89
+ storageKey?: string;
90
+ kind: string;
91
+ mimeType: string;
92
+ databaseName?: string;
93
+ size: number;
94
+ updatedAt: number;
95
+ };
96
+ type PersistDeviceSnapshotInput = {
97
+ deviceId: string;
98
+ bytes: Buffer;
99
+ kind: string;
100
+ mimeType: string;
101
+ databaseName?: string;
102
+ bundleId?: string;
103
+ };
104
+ type PersistDeviceSnapshotResult = {
105
+ deviceRelativePath: string;
106
+ exportedAt: number;
107
+ size: number;
108
+ };
109
+
110
+ type ProjectDatabaseMeta = {
111
+ exists: boolean;
112
+ relativePath?: string;
113
+ absolutePath?: string;
114
+ kind?: string;
115
+ mimeType?: string;
116
+ databaseName?: string;
117
+ size?: number;
118
+ updatedAt?: number;
119
+ source?: DatabaseManifestEntry['source'];
120
+ deviceId?: string;
121
+ };
122
+ type ListedProjectDatabase = {
123
+ id: string;
124
+ label: string;
125
+ relativePath: string;
126
+ source: DatabaseManifestEntry['source'];
127
+ deviceId?: string;
128
+ bundleId?: string;
129
+ storageKey?: string;
130
+ databaseName?: string;
131
+ size: number;
132
+ updatedAt: number;
133
+ };
134
+ declare class SnapshotFileStore {
135
+ private readonly dataDir;
136
+ private readonly enabled;
137
+ constructor(options?: {
138
+ dataDir?: string;
139
+ enabled?: boolean;
140
+ });
141
+ getDataDir(): string;
142
+ isEnabled(): boolean;
143
+ persistDeviceSnapshot(input: PersistDeviceSnapshotInput): Promise<PersistDeviceSnapshotResult | null>;
144
+ reconcileOnMobileConnect(input: {
145
+ deviceId: string;
146
+ bundleId?: string;
147
+ }): Promise<void>;
148
+ readDeviceSnapshot(deviceId: string): Promise<Buffer | undefined>;
149
+ readDeviceDatabase(deviceId: string): Promise<Buffer | undefined>;
150
+ getDeviceDatabaseMeta(deviceId: string): Promise<ProjectDatabaseMeta>;
151
+ listDeviceExports(): Promise<ListedProjectDatabase[]>;
152
+ private reconcileLegacyExports;
153
+ private pruneDeviceExports;
154
+ private deleteEntryFiles;
155
+ private manifestEntryToListed;
156
+ private resolveDeviceDatabaseFile;
157
+ /** @deprecated Proxies to the newest device export for backward-compatible API callers. */
158
+ readActiveDatabase(): Promise<Buffer | undefined>;
159
+ /** @deprecated Proxies to the newest device export for backward-compatible API callers. */
160
+ getActiveDatabaseMeta(): Promise<ProjectDatabaseMeta>;
161
+ listDatabases(): Promise<ListedProjectDatabase[]>;
162
+ readDatabaseByRelativePath(relativePath: string): Promise<Buffer | undefined>;
163
+ getDeviceDirectoryName(deviceId: string): string;
164
+ }
165
+
166
+ type StoredSnapshot = {
167
+ deviceId: string;
168
+ bytes: Buffer;
169
+ kind: string;
170
+ mimeType: string;
171
+ databaseName?: string;
172
+ exportedAt: number;
173
+ };
174
+ declare class SnapshotStore {
175
+ private readonly snapshots;
176
+ set(deviceId: string, bytes: Buffer, metadata: {
177
+ kind: string;
178
+ mimeType: string;
179
+ databaseName?: string;
180
+ }): StoredSnapshot;
181
+ get(deviceId: string): StoredSnapshot | undefined;
182
+ getBytes(deviceId: string): Buffer | undefined;
183
+ }
184
+
185
+ declare class RefreshCoordinator {
186
+ private readonly connectionManager;
187
+ private readonly router;
188
+ private readonly pending;
189
+ private readonly snapshots;
190
+ private readonly snapshotFiles?;
191
+ constructor(connectionManager: ConnectionManager, router: MessageRouter, pending: PendingRefreshStore, snapshots: SnapshotStore, snapshotFiles?: SnapshotFileStore | undefined);
192
+ handleRefreshRequest(browserSocket: WebSocket, message: RefreshRequestMessage): void;
193
+ handleMobileExportRequest(mobileSocket: WebSocket, message: ExportSnapshotRequestMessage): void;
194
+ handleSnapshotUpload(deviceId: string, body: Buffer, metadata?: {
195
+ kind?: string;
196
+ mimeType?: string;
197
+ databaseName?: string;
198
+ }): Promise<{
199
+ ok: true;
200
+ stored: SnapshotReadyMessage;
201
+ } | {
202
+ ok: false;
203
+ code: RefreshErrorCode;
204
+ }>;
205
+ getSnapshot(deviceId: string): Buffer | undefined;
206
+ getSnapshotAsync(deviceId: string): Promise<Buffer | undefined>;
207
+ checkTimeouts(): void;
208
+ private requestMobileUpload;
209
+ private failRefresh;
210
+ private failMobileExport;
211
+ private sendRefreshStatus;
212
+ private sendRefreshError;
213
+ private sendExportSnapshotError;
214
+ }
215
+
216
+ type WriteSession = {
217
+ transactionId: string;
218
+ deviceId: string;
219
+ browserConnectionId: string;
220
+ state: TransactionStatusState;
221
+ pendingWrites: number;
222
+ createdAt: number;
223
+ };
224
+ declare class WriteSessionManager {
225
+ private readonly sessions;
226
+ private readonly activeByDevice;
227
+ create(input: {
228
+ transactionId: string;
229
+ deviceId: string;
230
+ browserConnectionId: string;
231
+ }): WriteSession;
232
+ get(transactionId: string): WriteSession | undefined;
233
+ getActiveForDevice(deviceId: string): WriteSession | undefined;
234
+ setState(transactionId: string, state: TransactionStatusState): WriteSession | undefined;
235
+ incrementPendingWrites(transactionId: string): WriteSession | undefined;
236
+ decrementPendingWrites(transactionId: string): WriteSession | undefined;
237
+ remove(transactionId: string): void;
238
+ getExpired(now?: number): WriteSession[];
239
+ getByBrowserConnectionId(browserConnectionId: string): WriteSession[];
240
+ getByDeviceId(deviceId: string): WriteSession[];
241
+ }
242
+
243
+ declare class WriteCoordinator {
244
+ private readonly connectionManager;
245
+ private readonly router;
246
+ private readonly sessions;
247
+ constructor(connectionManager: ConnectionManager, router: MessageRouter, sessions: WriteSessionManager);
248
+ handleBeginTransactionRequest(browserSocket: WebSocket, message: BeginTransactionRequestMessage): void;
249
+ handleCommitTransactionRequest(browserSocket: WebSocket, message: CommitTransactionRequestMessage): void;
250
+ handleRollbackTransactionRequest(browserSocket: WebSocket, message: RollbackTransactionRequestMessage): void;
251
+ handleWriteRequest(browserSocket: WebSocket, message: WriteRequestMessage): void;
252
+ handleTransactionAck(message: TransactionAckMessage): void;
253
+ handleWriteAck(message: WriteAckMessage): void;
254
+ checkTimeouts(): void;
255
+ rollbackSessionsOnBrowserDisconnect(browserConnectionId: string): void;
256
+ rollbackSessionsForDevice(deviceId: string): void;
257
+ private rollbackSession;
258
+ private sendTransactionStatus;
259
+ private sendWriteError;
260
+ }
261
+
262
+ type DevToolsServerOptions = {
263
+ host?: string;
264
+ port?: number;
265
+ dataDir?: string;
266
+ snapshotPersistence?: boolean;
267
+ webDistPath?: string;
268
+ };
269
+ type DevToolsServerUrls = {
270
+ httpUrl: string;
271
+ wsUrl: string;
272
+ webUiEnabled: boolean;
273
+ };
274
+ type DevToolsServer = {
275
+ app: express.Express;
276
+ httpServer: Server;
277
+ connectionManager: ConnectionManager;
278
+ deviceRegistry: DeviceRegistry;
279
+ router: MessageRouter;
280
+ heartbeat: Heartbeat;
281
+ snapshotStore: SnapshotStore;
282
+ snapshotFileStore: SnapshotFileStore;
283
+ pendingRefreshStore: PendingRefreshStore;
284
+ writeSessions: WriteSessionManager;
285
+ refreshCoordinator: RefreshCoordinator;
286
+ writeCoordinator: WriteCoordinator;
287
+ urls: DevToolsServerUrls;
288
+ close: () => Promise<void>;
289
+ };
290
+ declare function createDevToolsServer(options?: DevToolsServerOptions): Promise<DevToolsServer>;
291
+
292
+ export { type ConnectedClient as C, type DevToolsServer as D, Heartbeat as H, MessageRouter as M, type OutboundMessage as O, type PendingRefresh as P, RefreshCoordinator as R, SnapshotStore as S, ConnectionManager as a, type DevToolsServerOptions as b, DeviceRegistry as c, PendingRefreshStore as d, type StoredSnapshot as e, createDevToolsServer as f };
@@ -0,0 +1,116 @@
1
+ import { DeviceStatusPayload, RegisterMessage, PongMessage, RefreshRequestMessage, ExportSnapshotRequestMessage, TransactionAckMessage, WriteAckMessage, BeginTransactionRequestMessage, CommitTransactionRequestMessage, RollbackTransactionRequestMessage, WriteRequestMessage, DevToolsRole, DeviceMetadata, SnapshotUploadRequestedMessage, ExportSnapshotErrorMessage, RefreshStatusMessage, SnapshotReadyMessage, RefreshErrorMessage, BeginTransactionMessage, CommitTransactionMessage, RollbackTransactionMessage, ExecuteWriteMessage, TransactionStatusMessage, WriteResultMessage, WriteErrorMessage } from './types/protocol.js';
2
+ import { a as WriteOperation } from './write-C3toEIMs.js';
3
+ import { D as DatabaseAdapter } from './adapter-DJSjDewg.js';
4
+
5
+ type ConnectionState = 'connecting' | 'connected' | 'reconnecting' | 'disconnected';
6
+ type TransactionState = 'idle' | 'opening' | 'open' | 'committing' | 'rolling_back';
7
+ type DevToolsClientOptions = {
8
+ serverUrl?: string;
9
+ role?: DevToolsRole;
10
+ deviceId?: string;
11
+ metadata?: DeviceMetadata;
12
+ WebSocketImpl?: typeof WebSocket;
13
+ onConnect?: () => void;
14
+ onDisconnect?: () => void;
15
+ onConnectionStateChange?: (state: ConnectionState) => void;
16
+ onDeviceStatus?: (status: DeviceStatusPayload) => void;
17
+ onSnapshotUploadRequested?: (message: SnapshotUploadRequestedMessage) => void;
18
+ onExportSnapshotError?: (message: ExportSnapshotErrorMessage) => void;
19
+ onRefreshStatus?: (message: RefreshStatusMessage) => void;
20
+ onSnapshotReady?: (message: SnapshotReadyMessage) => void;
21
+ onRefreshError?: (message: RefreshErrorMessage) => void;
22
+ onBeginTransaction?: (message: BeginTransactionMessage) => void;
23
+ onCommitTransaction?: (message: CommitTransactionMessage) => void;
24
+ onRollbackTransaction?: (message: RollbackTransactionMessage) => void;
25
+ onExecuteWrite?: (message: ExecuteWriteMessage) => void;
26
+ onTransactionStatus?: (message: TransactionStatusMessage) => void;
27
+ onWriteResult?: (message: WriteResultMessage) => void;
28
+ onWriteError?: (message: WriteErrorMessage) => void;
29
+ onTransactionStateChange?: (state: TransactionState) => void;
30
+ onError?: (error: Error) => void;
31
+ };
32
+ type DevToolsClient = {
33
+ connect: () => void;
34
+ disconnect: () => void;
35
+ getConnectionState: () => ConnectionState;
36
+ getLastConnectionError: () => string | null;
37
+ getDeviceStatus: () => DeviceStatusPayload | null;
38
+ getDeviceId: () => string | undefined;
39
+ getServerUrl: () => string;
40
+ setServerUrl: (url: string) => void;
41
+ send: (message: ClientMessageInput) => void;
42
+ requestRefresh: (deviceId: string) => void;
43
+ requestExportSnapshot: () => void;
44
+ sendTransactionAck: (message: Omit<TransactionAckMessage, 'timestamp' | 'type'>) => void;
45
+ sendWriteAck: (message: Omit<WriteAckMessage, 'timestamp' | 'type'>) => void;
46
+ beginTransaction: (deviceId: string) => Promise<void>;
47
+ commitTransaction: () => Promise<void>;
48
+ rollbackTransaction: () => Promise<void>;
49
+ executeWrite: (operation: WriteOperation) => Promise<{
50
+ rowsAffected: number;
51
+ }>;
52
+ getTransactionState: () => TransactionState;
53
+ getActiveTransactionId: () => string | null;
54
+ };
55
+ type ClientMessageInput = Omit<RegisterMessage, 'timestamp'> | Omit<PongMessage, 'timestamp'> | Omit<RefreshRequestMessage, 'timestamp'> | Omit<ExportSnapshotRequestMessage, 'timestamp'> | Omit<TransactionAckMessage, 'timestamp'> | Omit<WriteAckMessage, 'timestamp'> | Omit<BeginTransactionRequestMessage, 'timestamp'> | Omit<CommitTransactionRequestMessage, 'timestamp'> | Omit<RollbackTransactionRequestMessage, 'timestamp'> | Omit<WriteRequestMessage, 'timestamp'>;
56
+ declare function createDevToolsClient(options?: DevToolsClientOptions): DevToolsClient;
57
+
58
+ type ResolveProjectDatabaseUrlOptions = {
59
+ useSameOriginApi?: boolean;
60
+ };
61
+ declare function resolveProjectDatabaseUrl(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string;
62
+ declare function resolveProjectDatabaseMetaUrl(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string;
63
+ declare function resolveProjectDatabasesUrl(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string;
64
+
65
+ type ProjectDatabaseMeta = {
66
+ exists: boolean;
67
+ relativePath?: string;
68
+ absolutePath?: string;
69
+ kind?: string;
70
+ mimeType?: string;
71
+ databaseName?: string;
72
+ size?: number;
73
+ updatedAt?: number;
74
+ source?: 'active' | 'device';
75
+ deviceId?: string;
76
+ };
77
+ type ListedProjectDatabase = {
78
+ id: string;
79
+ label: string;
80
+ relativePath: string;
81
+ source: 'active' | 'device';
82
+ deviceId?: string;
83
+ bundleId?: string;
84
+ storageKey?: string;
85
+ databaseName?: string;
86
+ size: number;
87
+ updatedAt: number;
88
+ };
89
+ /** @deprecated Use device-scoped `fetchDeviceExportMeta` instead. Proxies to the newest device export. */
90
+ declare function fetchProjectDatabaseMeta(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): Promise<ProjectDatabaseMeta>;
91
+ /** @deprecated Use device-scoped `fetchDeviceExportDatabase` instead. Proxies to the newest device export. */
92
+ declare function fetchProjectDatabase(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): Promise<ArrayBuffer>;
93
+ /** @deprecated Use `fetchDeviceExports` instead. */
94
+ declare function fetchProjectDatabases(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): Promise<ListedProjectDatabase[]>;
95
+
96
+ type DeviceExportMeta = ProjectDatabaseMeta;
97
+ type ListedDeviceExport = ListedProjectDatabase;
98
+ declare function fetchDeviceExportMeta(serverUrl: string, deviceId: string, options?: ResolveProjectDatabaseUrlOptions): Promise<DeviceExportMeta>;
99
+ declare function fetchDeviceExportDatabase(serverUrl: string, deviceId: string, options?: ResolveProjectDatabaseUrlOptions): Promise<ArrayBuffer>;
100
+ declare function fetchDeviceExports(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): Promise<ListedDeviceExport[]>;
101
+
102
+ declare function resolveDeviceExportDatabaseUrl(serverUrl: string, deviceId: string, options?: ResolveProjectDatabaseUrlOptions): string;
103
+ declare function resolveDeviceExportDatabaseMetaUrl(serverUrl: string, deviceId: string, options?: ResolveProjectDatabaseUrlOptions): string;
104
+ declare function resolveDeviceExportsUrl(serverUrl: string, options?: ResolveProjectDatabaseUrlOptions): string;
105
+
106
+ declare function fetchSnapshot(downloadUrl: string): Promise<ArrayBuffer>;
107
+
108
+ type HandleDeviceSnapshotOptions = {
109
+ /** WebSocket URL of the connected hub — used to build the upload URL on mobile. */
110
+ hubServerUrl?: string;
111
+ /** This mobile client's device ID — upload is ignored when it does not match. */
112
+ deviceId?: string;
113
+ };
114
+ declare function handleDeviceSnapshotUpload(database: DatabaseAdapter | undefined, message: SnapshotUploadRequestedMessage, options?: HandleDeviceSnapshotOptions): Promise<void>;
115
+
116
+ export { type ConnectionState as C, type DevToolsClient as D, type HandleDeviceSnapshotOptions as H, type ListedDeviceExport as L, type ProjectDatabaseMeta as P, type ResolveProjectDatabaseUrlOptions as R, type TransactionState as T, type DevToolsClientOptions as a, type DeviceExportMeta as b, type ListedProjectDatabase as c, createDevToolsClient as d, fetchDeviceExportMeta as e, fetchDeviceExportDatabase as f, fetchDeviceExports as g, fetchProjectDatabase as h, fetchProjectDatabaseMeta as i, fetchProjectDatabases as j, fetchSnapshot as k, handleDeviceSnapshotUpload as l, resolveDeviceExportDatabaseUrl as m, resolveDeviceExportsUrl as n, resolveProjectDatabaseMetaUrl as o, resolveProjectDatabaseUrl as p, resolveProjectDatabasesUrl as q, resolveDeviceExportDatabaseMetaUrl as r };