expo-offline-sync 1.0.0 → 1.0.1
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/README.md +76 -0
- package/dist/index.cjs.map +1 -1
- package/dist/index.js.map +1 -1
- package/package.json +1 -1
package/README.md
CHANGED
|
@@ -182,6 +182,82 @@ await syncClient.enqueueHttp({
|
|
|
182
182
|
|
|
183
183
|
---
|
|
184
184
|
|
|
185
|
+
## 🔌 Integrations & Recipes
|
|
186
|
+
|
|
187
|
+
### 1. TanStack Query (React Query) Integration
|
|
188
|
+
Combine the caching power of TanStack Query with `expo-offline-sync`'s persistent SQLite queue:
|
|
189
|
+
|
|
190
|
+
```typescript
|
|
191
|
+
import { useMutation, useQueryClient } from '@tanstack/react-query';
|
|
192
|
+
import { useOfflineSync } from 'expo-offline-sync';
|
|
193
|
+
|
|
194
|
+
export function useOfflineCreateTodo() {
|
|
195
|
+
const queryClient = useQueryClient();
|
|
196
|
+
const offlineSync = useOfflineSync();
|
|
197
|
+
|
|
198
|
+
return useMutation({
|
|
199
|
+
mutationFn: async (newTodo: { title: string }) => {
|
|
200
|
+
// Enqueues into durable SQLite and executes when online
|
|
201
|
+
return offlineSync.enqueue({
|
|
202
|
+
type: 'CREATE_TODO',
|
|
203
|
+
payload: newTodo,
|
|
204
|
+
scope: 'todos',
|
|
205
|
+
});
|
|
206
|
+
},
|
|
207
|
+
onMutate: async (newTodo) => {
|
|
208
|
+
// Cancel outgoing refetches and update local query cache optimistically
|
|
209
|
+
await queryClient.cancelQueries({ queryKey: ['todos'] });
|
|
210
|
+
const previousTodos = queryClient.getQueryData(['todos']);
|
|
211
|
+
|
|
212
|
+
queryClient.setQueryData(['todos'], (old: any[] = []) => [
|
|
213
|
+
{ id: 'temp-' + Date.now(), ...newTodo, isPending: true },
|
|
214
|
+
...old,
|
|
215
|
+
]);
|
|
216
|
+
|
|
217
|
+
return { previousTodos };
|
|
218
|
+
},
|
|
219
|
+
onError: (err, newTodo, context) => {
|
|
220
|
+
// Rollback cache if mutation failed
|
|
221
|
+
queryClient.setQueryData(['todos'], context?.previousTodos);
|
|
222
|
+
},
|
|
223
|
+
});
|
|
224
|
+
}
|
|
225
|
+
```
|
|
226
|
+
|
|
227
|
+
### 2. Zustand Store Integration
|
|
228
|
+
Trigger offline mutations directly inside your Zustand store actions:
|
|
229
|
+
|
|
230
|
+
```typescript
|
|
231
|
+
import { create } from 'zustand';
|
|
232
|
+
import { syncClient } from './syncClient';
|
|
233
|
+
|
|
234
|
+
interface CartState {
|
|
235
|
+
items: string[];
|
|
236
|
+
addToCart: (item: string) => Promise<void>;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
export const useCartStore = create<CartState>((set) => ({
|
|
240
|
+
items: [],
|
|
241
|
+
addToCart: async (item) => {
|
|
242
|
+
// 1. Instant local store update
|
|
243
|
+
set((state) => ({ items: [...state.items, item] }));
|
|
244
|
+
|
|
245
|
+
// 2. Queue persistent server sync
|
|
246
|
+
await syncClient.enqueue({
|
|
247
|
+
type: 'ADD_TO_CART',
|
|
248
|
+
payload: { item },
|
|
249
|
+
scope: 'cart',
|
|
250
|
+
onRollback: () => {
|
|
251
|
+
// Rollback state if server rejects
|
|
252
|
+
set((state) => ({ items: state.items.filter((i) => i !== item) }));
|
|
253
|
+
},
|
|
254
|
+
});
|
|
255
|
+
},
|
|
256
|
+
}));
|
|
257
|
+
```
|
|
258
|
+
|
|
259
|
+
---
|
|
260
|
+
|
|
185
261
|
## 🎛 Queue Monitoring & Status (`useQueueStatus`)
|
|
186
262
|
|
|
187
263
|
Track real-time queue counts and trigger manual syncs:
|
package/dist/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/network/NetInfoNetworkMonitor.ts","../src/storage/MemoryAdapter.ts","../src/storage/SQLiteAdapter.ts","../src/core/EventEmitter.ts","../src/core/HttpExecutor.ts","../src/core/QueueManager.ts","../src/core/Registry.ts","../src/core/Scheduler.ts","../src/core/OfflineSyncClient.ts","../src/network/NetworkMonitor.ts","../src/react/OfflineSyncProvider.tsx","../src/react/useOfflineMutation.ts","../src/react/useQueueStatus.ts","../src/react/useIsOnline.ts","../src/plugins/backgroundSync.ts"],"names":["state","contentType","createContext","useState","useEffect","useMemo","useContext","useRef","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NetworkMonitor } from '../types';\n\nexport class NetInfoNetworkMonitor implements NetworkMonitor {\n private _isOnline = true;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n private unsubscribeNetInfo: (() => void) | null = null;\n private unsubscribeAppState: (() => void) | null = null;\n\n constructor() {\n this.init();\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n private async init() {\n // 1. Try to initialize @react-native-community/netinfo\n let NetInfo: any = null;\n try {\n NetInfo = (await import('@react-native-community/netinfo')).default;\n } catch {\n // NetInfo not available (e.g. running in web or test environment)\n }\n\n if (NetInfo && typeof NetInfo.addEventListener === 'function') {\n const state = await NetInfo.fetch();\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n\n this.unsubscribeNetInfo = NetInfo.addEventListener((state: any) => {\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n });\n } else if (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n // Web fallback\n this.updateStatus(navigator.onLine);\n const onOnline = () => this.updateStatus(true);\n const onOffline = () => this.updateStatus(false);\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this.unsubscribeNetInfo = () => {\n window.removeEventListener('online', onOnline);\n window.removeEventListener('offline', onOffline);\n };\n }\n\n // 2. Listen to React Native AppState for foreground resume sync\n try {\n const { AppState } = await import('react-native');\n if (AppState && typeof AppState.addEventListener === 'function') {\n const subscription = AppState.addEventListener('change', async (nextState: string) => {\n if (nextState === 'active') {\n await this.check();\n }\n });\n this.unsubscribeAppState = () => subscription?.remove?.();\n }\n } catch {\n // Running outside React Native\n }\n }\n\n private updateStatus(newStatus: boolean) {\n if (this._isOnline !== newStatus) {\n this._isOnline = newStatus;\n for (const listener of this.listeners) {\n listener(newStatus);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n try {\n const NetInfo = (await import('@react-native-community/netinfo')).default;\n if (NetInfo && typeof NetInfo.fetch === 'function') {\n const state = await NetInfo.fetch();\n const online = Boolean(state.isConnected && state.isInternetReachable !== false);\n this.updateStatus(online);\n return online;\n }\n } catch {\n // Fallback\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean') {\n this.updateStatus(navigator.onLine);\n return navigator.onLine;\n }\n\n return this._isOnline;\n }\n\n destroy(): void {\n if (this.unsubscribeNetInfo) {\n this.unsubscribeNetInfo();\n this.unsubscribeNetInfo = null;\n }\n if (this.unsubscribeAppState) {\n this.unsubscribeAppState();\n this.unsubscribeAppState = null;\n }\n this.listeners.clear();\n }\n}\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\n/**\n * In-memory storage adapter for testing, mocking, and environments without SQLite\n */\nexport class MemoryAdapter implements StorageAdapter {\n private items: Map<string, MutationItem> = new Map();\n\n async init(): Promise<void> {\n // No-op for in-memory\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n // Clone item to avoid mutation by reference\n this.items.set(item.id, JSON.parse(JSON.stringify(item)));\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n const list = Array.from(this.items.values()).filter((item) => {\n const isPending = item.status === 'pending' || item.status === 'syncing';\n if (!isPending) return false;\n if (scope && item.scope !== scope) return false;\n return true;\n });\n\n // Sort by priority (higher first), then createdAt (older first / FIFO)\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n const item = this.items.get(id);\n if (!item) return null;\n return JSON.parse(JSON.stringify(item));\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n const existing = this.items.get(id);\n if (!existing) return;\n\n const updated: MutationItem = {\n ...existing,\n ...updates,\n updatedAt: Date.now(),\n };\n this.items.set(id, updated);\n }\n\n async remove(id: string): Promise<void> {\n this.items.delete(id);\n }\n\n async clear(scope?: string): Promise<void> {\n if (!scope) {\n this.items.clear();\n return;\n }\n\n for (const [id, item] of this.items.entries()) {\n if (item.scope === scope) {\n this.items.delete(id);\n }\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n let list = Array.from(this.items.values());\n\n if (filter?.status) {\n list = list.filter((i) => i.status === filter.status);\n }\n if (filter?.scope) {\n list = list.filter((i) => i.scope === filter.scope);\n }\n\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getStats(): Promise<QueueStats> {\n const all = Array.from(this.items.values());\n const scopes = new Set<string>();\n\n let pending = 0;\n let syncing = 0;\n let failed = 0;\n let completed = 0;\n\n for (const item of all) {\n scopes.add(item.scope);\n if (item.status === 'pending') pending++;\n else if (item.status === 'syncing') syncing++;\n else if (item.status === 'failed') failed++;\n else if (item.status === 'completed') completed++;\n }\n\n return {\n total: all.length,\n pending,\n syncing,\n failed,\n completed,\n scopes: Array.from(scopes),\n };\n }\n}\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\nexport interface SQLiteAdapterOptions {\n /**\n * Database filename (defaults to 'expo_offline_sync.db')\n */\n databaseName?: string;\n /**\n * Table name for the queue (defaults to 'offline_mutation_queue')\n */\n tableName?: string;\n /**\n * Direct SQLite database instance (e.g. from useSQLiteContext() or SQLite.openDatabaseAsync)\n */\n database?: any;\n}\n\ninterface RawMutationRow {\n id: string;\n type: string;\n scope: string;\n payload: string;\n meta: string | null;\n status: string;\n attempt_count: number;\n max_retries: number;\n created_at: number;\n updated_at: number;\n last_error: string | null;\n idempotency_key: string;\n priority: number;\n}\n\n/**\n * High-performance Expo SQLite Storage Adapter\n * Compatible with modern Expo SDK 51/52+ SQLite API\n */\nexport class SQLiteAdapter implements StorageAdapter {\n private db: any = null;\n private databaseName: string;\n private tableName: string;\n private initPromise: Promise<void> | null = null;\n\n constructor(options: SQLiteAdapterOptions = {}) {\n this.databaseName = options.databaseName ?? 'expo_offline_sync.db';\n this.tableName = options.tableName ?? 'offline_mutation_queue';\n if (options.database) {\n this.db = options.database;\n }\n }\n\n async init(): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n if (!this.db) {\n let SQLite: any;\n try {\n SQLite = await import('expo-sqlite');\n } catch {\n throw new Error(\n '[expo-offline-sync] expo-sqlite package is not installed. Please run \"npx expo install expo-sqlite\" or provide a custom StorageAdapter (e.g. MemoryAdapter).'\n );\n }\n\n if (typeof SQLite.openDatabaseAsync === 'function') {\n this.db = await SQLite.openDatabaseAsync(this.databaseName);\n } else if (typeof SQLite.openDatabaseSync === 'function') {\n this.db = SQLite.openDatabaseSync(this.databaseName);\n } else {\n throw new Error(\n '[expo-offline-sync] Incompatible expo-sqlite version detected. Please upgrade to Expo SDK 51 or newer.'\n );\n }\n }\n\n // Configure WAL mode for high concurrency\n await this.db.execAsync(`\n PRAGMA journal_mode = WAL;\n CREATE TABLE IF NOT EXISTS ${this.tableName} (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n scope TEXT NOT NULL,\n payload TEXT NOT NULL,\n meta TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n attempt_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 5,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_error TEXT,\n idempotency_key TEXT NOT NULL,\n priority INTEGER DEFAULT 0\n );\n CREATE INDEX IF NOT EXISTS idx_${this.tableName}_lookup \n ON ${this.tableName}(status, scope, priority DESC, created_at ASC);\n `);\n })();\n\n return this.initPromise;\n }\n\n private rowToItem(row: RawMutationRow): MutationItem {\n let payload: any = null;\n try {\n payload = JSON.parse(row.payload);\n } catch {\n payload = row.payload;\n }\n\n let meta: any = undefined;\n if (row.meta) {\n try {\n meta = JSON.parse(row.meta);\n } catch {\n meta = undefined;\n }\n }\n\n let lastError: any = undefined;\n if (row.last_error) {\n try {\n lastError = JSON.parse(row.last_error);\n } catch {\n lastError = { message: row.last_error };\n }\n }\n\n return {\n id: row.id,\n type: row.type,\n scope: row.scope,\n payload,\n meta,\n status: row.status as MutationStatus,\n attemptCount: row.attempt_count,\n maxRetries: row.max_retries,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n lastError,\n idempotencyKey: row.idempotency_key,\n priority: row.priority,\n };\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n await this.init();\n\n const sql = `\n INSERT OR REPLACE INTO ${this.tableName} (\n id, type, scope, payload, meta, status,\n attempt_count, max_retries, created_at, updated_at,\n last_error, idempotency_key, priority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n const params = [\n item.id,\n item.type,\n item.scope,\n JSON.stringify(item.payload),\n item.meta !== undefined ? JSON.stringify(item.meta) : null,\n item.status,\n item.attemptCount,\n item.maxRetries,\n item.createdAt,\n item.updatedAt,\n item.lastError ? JSON.stringify(item.lastError) : null,\n item.idempotencyKey,\n item.priority ?? 0,\n ];\n\n await this.db.runAsync(sql, params);\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `\n SELECT * FROM ${this.tableName}\n WHERE status IN ('pending', 'syncing')\n `;\n const params: any[] = [];\n\n if (scope) {\n sql += ` AND scope = ?`;\n params.push(scope);\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n await this.init();\n\n const sql = `SELECT * FROM ${this.tableName} WHERE id = ?`;\n const row: RawMutationRow | null = await this.db.getFirstAsync(sql, [id]);\n if (!row) return null;\n\n return this.rowToItem(row);\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n await this.init();\n\n const fields: string[] = [];\n const values: any[] = [];\n\n if (updates.status !== undefined) {\n fields.push('status = ?');\n values.push(updates.status);\n }\n if (updates.attemptCount !== undefined) {\n fields.push('attempt_count = ?');\n values.push(updates.attemptCount);\n }\n if (updates.lastError !== undefined) {\n fields.push('last_error = ?');\n values.push(updates.lastError ? JSON.stringify(updates.lastError) : null);\n }\n if (updates.payload !== undefined) {\n fields.push('payload = ?');\n values.push(JSON.stringify(updates.payload));\n }\n if (updates.meta !== undefined) {\n fields.push('meta = ?');\n values.push(updates.meta ? JSON.stringify(updates.meta) : null);\n }\n if (updates.priority !== undefined) {\n fields.push('priority = ?');\n values.push(updates.priority);\n }\n\n fields.push('updated_at = ?');\n values.push(Date.now());\n\n values.push(id);\n\n const sql = `UPDATE ${this.tableName} SET ${fields.join(', ')} WHERE id = ?`;\n await this.db.runAsync(sql, values);\n }\n\n async remove(id: string): Promise<void> {\n await this.init();\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE id = ?`, [id]);\n }\n\n async clear(scope?: string): Promise<void> {\n await this.init();\n if (scope) {\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE scope = ?`, [scope]);\n } else {\n await this.db.runAsync(`DELETE FROM ${this.tableName}`);\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `SELECT * FROM ${this.tableName}`;\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (filter?.status) {\n conditions.push('status = ?');\n params.push(filter.status);\n }\n if (filter?.scope) {\n conditions.push('scope = ?');\n params.push(filter.scope);\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getStats(): Promise<QueueStats> {\n await this.init();\n\n const sql = `\n SELECT \n COUNT(*) as total,\n SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,\n SUM(CASE WHEN status = 'syncing' THEN 1 ELSE 0 END) as syncing,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed\n FROM ${this.tableName}\n `;\n\n const row: any = await this.db.getFirstAsync(sql);\n\n const scopesRows: { scope: string }[] = await this.db.getAllAsync(\n `SELECT DISTINCT scope FROM ${this.tableName}`\n );\n\n return {\n total: row?.total ?? 0,\n pending: row?.pending ?? 0,\n syncing: row?.syncing ?? 0,\n failed: row?.failed ?? 0,\n completed: row?.completed ?? 0,\n scopes: scopesRows.map((s) => s.scope),\n };\n }\n}\n","type Listener<T extends any[] = any[]> = (...args: T) => void;\n\n/**\n * Lightweight, zero-dependency, typed EventEmitter compatible with React Native & Hermes\n */\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Listener>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Events[K]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n const set = this.listeners.get(event)!;\n set.add(listener as Listener);\n\n return () => {\n this.off(event, listener);\n };\n }\n\n off<K extends keyof Events>(event: K, listener: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as Listener);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n\n for (const listener of Array.from(set)) {\n try {\n listener(...args);\n } catch (err) {\n console.error(`[expo-offline-sync] Error in event listener for \"${String(event)}\":`, err);\n }\n }\n }\n\n removeAllListeners(event?: keyof Events): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n listenerCount(event: keyof Events): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","import { HttpMutationPayload, MutationContext } from '../types';\n\nexport const HTTP_MUTATION_TYPE = '__EXPO_OFFLINE_SYNC_HTTP__';\n\nexport class HttpError extends Error {\n status: number;\n statusText: string;\n data: any;\n\n constructor(status: number, statusText: string, data: any) {\n super(`HTTP Request failed with status ${status}: ${statusText}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.data = data;\n }\n}\n\nexport interface HttpExecutorOptions {\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\n/**\n * Built-in executor for direct HTTP requests\n */\nexport class HttpExecutor {\n private getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n\n constructor(options: HttpExecutorOptions = {}) {\n this.getHeaders = options.getHeaders;\n }\n\n async execute(payload: HttpMutationPayload, context: MutationContext): Promise<any> {\n const { url, method = 'POST', headers = {}, body, timeoutMs = 30000 } = payload;\n\n // 1. Resolve dynamic headers (e.g. fresh auth token)\n let dynamicHeaders: Record<string, string> = {};\n if (this.getHeaders) {\n try {\n dynamicHeaders = await this.getHeaders();\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to resolve dynamic headers:', err);\n }\n }\n\n const mergedHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': context.idempotencyKey,\n ...dynamicHeaders,\n ...headers,\n };\n\n // 2. Setup timeout controller\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n // Link context signal if aborted externally\n if (context.signal) {\n context.signal.addEventListener('abort', () => controller.abort());\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers: mergedHeaders,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n let responseData: any;\n const contentType = response.headers.get('content-type') || '';\n try {\n if (contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n } catch {\n responseData = null;\n }\n\n throw new HttpError(response.status, response.statusText, responseData);\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return await response.json();\n }\n return await response.text();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","import {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationItem,\n MutationStatus,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE } from './HttpExecutor';\n\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport interface QueueManagerOptions {\n storage: StorageAdapter;\n events: TypedEventEmitter<any>;\n defaultScope?: string;\n defaultMaxRetries?: number;\n}\n\nexport class QueueManager {\n private storage: StorageAdapter;\n private events: TypedEventEmitter<any>;\n private defaultScope: string;\n private defaultMaxRetries: number;\n\n constructor(options: QueueManagerOptions) {\n this.storage = options.storage;\n this.events = options.events;\n this.defaultScope = options.defaultScope ?? 'default';\n this.defaultMaxRetries = options.defaultMaxRetries ?? 5;\n }\n\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const now = Date.now();\n const id = generateUUID();\n const idempotencyKey = options.idempotencyKey ?? generateUUID();\n const scope = options.scope ?? this.defaultScope;\n const maxRetries = options.maxRetries ?? this.defaultMaxRetries;\n\n const item: MutationItem<TPayload, TMeta> = {\n id,\n type: options.type,\n scope,\n payload: options.payload,\n meta: options.meta,\n status: 'pending',\n attemptCount: 0,\n maxRetries,\n createdAt: now,\n updatedAt: now,\n idempotencyKey,\n priority: options.priority ?? 0,\n };\n\n // Save to durable storage\n await this.storage.enqueue(item);\n\n // Call optimistic callback immediately\n if (options.onOptimistic) {\n try {\n options.onOptimistic(item);\n } catch (err) {\n console.error('[expo-offline-sync] Error in onOptimistic callback:', err);\n }\n }\n\n // Emit event\n this.events.emit('enqueued', item);\n\n return item;\n }\n\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const payload: HttpMutationPayload = {\n url: options.url,\n method: options.method ?? 'POST',\n headers: options.headers,\n body: options.body,\n timeoutMs: options.timeoutMs,\n };\n\n return this.enqueue<HttpMutationPayload, TMeta>({\n type: HTTP_MUTATION_TYPE,\n payload,\n scope: options.scope,\n meta: options.meta,\n maxRetries: options.maxRetries,\n idempotencyKey: options.idempotencyKey,\n onOptimistic: options.onOptimistic,\n onRollback: options.onRollback,\n onSuccess: options.onSuccess,\n });\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.storage.getPending(scope);\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n return this.storage.getById(id);\n }\n\n async markSyncing(id: string): Promise<void> {\n await this.storage.update(id, {\n status: 'syncing',\n });\n }\n\n async markCompleted(id: string): Promise<void> {\n // We remove completed items to keep storage lean and fast\n await this.storage.remove(id);\n }\n\n async markFailed(id: string, error: Error, willRetry: boolean, attemptCount: number): Promise<void> {\n const status: MutationStatus = willRetry ? 'pending' : 'failed';\n const lastError = {\n message: error.message || 'Unknown error',\n code: (error as any).code || (error as any).status,\n stack: error.stack,\n };\n\n await this.storage.update(id, {\n status,\n attemptCount,\n lastError,\n });\n }\n\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.storage.getById(id);\n if (!item) return null;\n\n await this.storage.update(id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n\n return this.storage.getById(id);\n }\n\n async retryScope(scope?: string): Promise<void> {\n const failedItems = await this.storage.getAll({\n status: 'failed',\n scope,\n });\n\n for (const item of failedItems) {\n await this.storage.update(item.id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n }\n }\n\n async cancel(id: string): Promise<boolean> {\n const item = await this.storage.getById(id);\n if (!item) return false;\n\n await this.storage.remove(id);\n return true;\n }\n\n async clear(scope?: string): Promise<void> {\n await this.storage.clear(scope);\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.storage.getAll(filter);\n }\n\n async getStats(): Promise<QueueStats> {\n return this.storage.getStats();\n }\n}\n","import { MutationHandler } from '../types';\n\n/**\n * Mutation Registry for registering and retrieving type-safe mutation handlers\n */\nexport class Registry {\n private handlers: Map<string, MutationHandler<any, any, any>> = new Map();\n\n /**\n * Register a mutation handler for a given mutation type\n * @param type Unique mutation identifier (e.g. 'SEND_MESSAGE', 'UPDATE_PROFILE')\n * @param handler Async function to execute the mutation\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): void {\n if (this.handlers.has(type)) {\n console.warn(\n `[expo-offline-sync] Handler for mutation type \"${type}\" was already registered and has been overwritten.`\n );\n }\n this.handlers.set(type, handler);\n }\n\n /**\n * Get a registered handler by type\n */\n get<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string\n ): MutationHandler<TPayload, TResult, TMeta> | undefined {\n return this.handlers.get(type);\n }\n\n /**\n * Check if a handler is registered\n */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /**\n * Unregister a mutation handler\n */\n unregister(type: string): boolean {\n return this.handlers.delete(type);\n }\n\n /**\n * Clear all registered handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n","import {\n MutationContext,\n MutationItem,\n NetworkMonitor,\n RetryPolicy,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HttpError } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\n\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 5,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffFactor: 2,\n jitter: true,\n shouldRetry: (error: any) => {\n if (error instanceof HttpError || (error && typeof error.status === 'number')) {\n const status = error.status;\n // Do not retry 4xx errors except 401 (auth issue), 408 (timeout), 429 (rate limit)\n if (status >= 400 && status < 500 && status !== 401 && status !== 408 && status !== 429) {\n return false;\n }\n }\n return true;\n },\n};\n\nexport interface SchedulerOptions {\n queueManager: QueueManager;\n registry: Registry;\n networkMonitor: NetworkMonitor;\n events: TypedEventEmitter<any>;\n retryPolicy?: Partial<RetryPolicy>;\n maxConcurrentScopes?: number;\n onRequest?: (item: MutationItem) => Promise<void> | void;\n onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n}\n\nexport class Scheduler {\n private queueManager: QueueManager;\n private registry: Registry;\n private networkMonitor: NetworkMonitor;\n private events: TypedEventEmitter<any>;\n private retryPolicy: RetryPolicy;\n private maxConcurrentScopes: number;\n private activeScopeMap: Map<string, Promise<void>> = new Map();\n private isPaused = false;\n private isSyncing = false;\n private abortController: AbortController = new AbortController();\n\n get syncing(): boolean {\n return this.isSyncing;\n }\n\n private onRequest?: (item: MutationItem) => Promise<void> | void;\n private onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n private onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n\n constructor(options: SchedulerOptions) {\n this.queueManager = options.queueManager;\n this.registry = options.registry;\n this.networkMonitor = options.networkMonitor;\n this.events = options.events;\n this.retryPolicy = { ...DEFAULT_RETRY_POLICY, ...options.retryPolicy };\n this.maxConcurrentScopes = options.maxConcurrentScopes ?? 3;\n this.onRequest = options.onRequest;\n this.onResponse = options.onResponse;\n this.onRollback = options.onRollback;\n }\n\n calculateBackoff(attemptCount: number): number {\n const { initialDelayMs, maxDelayMs, backoffFactor, jitter } = this.retryPolicy;\n const baseDelay = initialDelayMs * Math.pow(backoffFactor, Math.max(0, attemptCount - 1));\n const cappedDelay = Math.min(baseDelay, maxDelayMs);\n\n if (jitter) {\n // 0.8x to 1.2x randomization to prevent thundering herd\n const factor = 0.8 + Math.random() * 0.4;\n return Math.floor(cappedDelay * factor);\n }\n\n return Math.floor(cappedDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n this.abortController.signal.addEventListener('abort', () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n pause(): void {\n this.isPaused = true;\n }\n\n resume(): void {\n this.isPaused = false;\n this.processQueue();\n }\n\n /**\n * Main entry point to process pending queue across scopes\n */\n async processQueue(): Promise<void> {\n if (this.isPaused) return;\n if (!this.networkMonitor.isOnline) return;\n\n const stats = await this.queueManager.getStats();\n if (stats.pending === 0 && stats.syncing === 0) {\n this.events.emit('syncComplete');\n return;\n }\n\n this.isSyncing = true;\n const promises: Promise<void>[] = [];\n\n // Process available scopes up to maxConcurrentScopes\n for (const scope of stats.scopes) {\n if (this.activeScopeMap.size >= this.maxConcurrentScopes) {\n break;\n }\n\n if (!this.activeScopeMap.has(scope)) {\n const promise = this.processScope(scope).finally(() => {\n this.activeScopeMap.delete(scope);\n if (this.activeScopeMap.size === 0) {\n this.isSyncing = false;\n this.events.emit('syncComplete');\n }\n });\n this.activeScopeMap.set(scope, promise);\n promises.push(promise);\n } else {\n const existingPromise = this.activeScopeMap.get(scope);\n if (existingPromise) {\n promises.push(existingPromise);\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Sequentially process items for a specific scope (Deterministic FIFO)\n */\n private async processScope(scope: string): Promise<void> {\n while (!this.isPaused && this.networkMonitor.isOnline) {\n const pendingItems = await this.queueManager.getPending(scope);\n if (pendingItems.length === 0) {\n break;\n }\n\n const item = pendingItems[0];\n const success = await this.executeItem(item);\n\n if (!success) {\n // If execution failed and requires retry, break out of this scope loop\n // so it doesn't spin infinitely; it will be retried on next backoff or queue sync\n break;\n }\n }\n }\n\n /**\n * Executes a single mutation item\n * Returns true if completed or definitively failed, false if waiting for backoff retry\n */\n async executeItem(item: MutationItem): Promise<boolean> {\n if (this.isPaused || !this.networkMonitor.isOnline) {\n return false;\n }\n\n const handler = this.registry.get(item.type);\n if (!handler) {\n const err = new Error(\n `[expo-offline-sync] No mutation handler registered for type \"${item.type}\". Please call client.register(\"${item.type}\", handler)`\n );\n await this.queueManager.markFailed(item.id, err, false, item.attemptCount);\n this.events.emit('syncError', item, err);\n this.events.emit('rollback', item, err);\n if (this.onRollback) {\n try {\n await this.onRollback(item, err);\n } catch {}\n }\n return true; // Mark as resolved (unrecoverable error)\n }\n\n // Mark syncing\n await this.queueManager.markSyncing(item.id);\n this.events.emit('syncStart', item);\n\n if (this.onRequest) {\n try {\n await this.onRequest(item);\n } catch (err) {\n console.warn('[expo-offline-sync] Error in onRequest hook:', err);\n }\n }\n\n const context: MutationContext = {\n mutationId: item.id,\n type: item.type,\n scope: item.scope,\n attemptCount: item.attemptCount + 1,\n meta: item.meta,\n idempotencyKey: item.idempotencyKey,\n signal: this.abortController.signal,\n };\n\n try {\n const result = await handler(item.payload, context);\n\n // Successfully processed\n await this.queueManager.markCompleted(item.id);\n\n if (this.onResponse) {\n try {\n await this.onResponse(item, result);\n } catch {}\n }\n\n this.events.emit('syncSuccess', item, result);\n return true;\n } catch (err: any) {\n const error: Error = err instanceof Error ? err : new Error(String(err));\n const nextAttempt = item.attemptCount + 1;\n const maxRetries = item.maxRetries ?? this.retryPolicy.maxRetries;\n\n let shouldRetry = nextAttempt < maxRetries;\n if (shouldRetry && this.retryPolicy.shouldRetry) {\n try {\n shouldRetry = Boolean(await this.retryPolicy.shouldRetry(err, item));\n } catch {\n shouldRetry = true;\n }\n }\n\n if (shouldRetry) {\n // Will retry: mark pending with incremented attempt\n await this.queueManager.markFailed(item.id, error, true, nextAttempt);\n this.events.emit('syncError', item, error);\n\n const delay = this.calculateBackoff(nextAttempt);\n await this.sleep(delay);\n\n return false; // Scope will retry later\n } else {\n // Fatal / Exceeded max retries: mark permanently failed and trigger rollback\n await this.queueManager.markFailed(item.id, error, false, nextAttempt);\n this.events.emit('syncError', item, error);\n this.events.emit('rollback', item, error);\n\n if (this.onRollback) {\n try {\n await this.onRollback(item, error);\n } catch {}\n }\n\n return true; // Proceed to next item in scope to prevent deadlock\n }\n }\n }\n\n destroy(): void {\n this.pause();\n this.abortController.abort();\n this.activeScopeMap.clear();\n }\n}\n","import { NetInfoNetworkMonitor } from '../network/NetInfoNetworkMonitor';\nimport { MemoryAdapter } from '../storage/MemoryAdapter';\nimport { SQLiteAdapter } from '../storage/SQLiteAdapter';\nimport {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationHandler,\n MutationItem,\n MutationStatus,\n NetworkMonitor,\n OfflineSyncEventMap,\n OfflineSyncOptions,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE, HttpExecutor } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\nimport { Scheduler } from './Scheduler';\n\nexport class OfflineSyncClient {\n readonly storage: StorageAdapter;\n readonly network: NetworkMonitor;\n readonly registry: Registry;\n readonly queue: QueueManager;\n readonly scheduler: Scheduler;\n readonly events: TypedEventEmitter<OfflineSyncEventMap>;\n\n private httpExecutor: HttpExecutor;\n private autoSync: boolean;\n private unsubscribeNetwork: (() => void) | null = null;\n private isDestroyed = false;\n\n constructor(options: OfflineSyncOptions = {}) {\n this.events = new TypedEventEmitter<OfflineSyncEventMap>();\n this.autoSync = options.autoSync ?? true;\n\n // 1. Initialize Storage Adapter\n if (options.storage) {\n this.storage = options.storage;\n } else {\n // Default to SQLiteAdapter, fallback to MemoryAdapter\n try {\n this.storage = new SQLiteAdapter();\n } catch {\n this.storage = new MemoryAdapter();\n }\n }\n\n // 2. Initialize Network Monitor\n if (options.networkMonitor) {\n this.network = options.networkMonitor;\n } else {\n this.network = new NetInfoNetworkMonitor();\n }\n\n // 3. Initialize Registry\n this.registry = new Registry();\n\n // 4. Initialize Built-in HTTP Executor and register handler\n this.httpExecutor = new HttpExecutor({\n getHeaders: options.getHeaders,\n });\n this.registry.register<HttpMutationPayload>(HTTP_MUTATION_TYPE, async (payload, context) => {\n return this.httpExecutor.execute(payload, context);\n });\n\n // 5. Initialize Queue Manager\n this.queue = new QueueManager({\n storage: this.storage,\n events: this.events,\n defaultScope: options.defaultScope,\n defaultMaxRetries: options.retryPolicy?.maxRetries,\n });\n\n // 6. Initialize Scheduler\n this.scheduler = new Scheduler({\n queueManager: this.queue,\n registry: this.registry,\n networkMonitor: this.network,\n events: this.events,\n retryPolicy: options.retryPolicy,\n maxConcurrentScopes: options.maxConcurrentScopes,\n onRequest: options.onRequest,\n onResponse: options.onResponse,\n onRollback: options.onRollback,\n });\n\n // 7. Setup AutoSync on Network Reconnection\n this.unsubscribeNetwork = this.network.subscribe((isOnline) => {\n this.events.emit('onlineChange', isOnline);\n if (isOnline && this.autoSync) {\n this.sync();\n }\n });\n\n // Initial check and optional immediate sync\n if (this.autoSync && this.network.isOnline) {\n setTimeout(() => this.sync(), 0);\n }\n }\n\n get isOnline(): boolean {\n return this.network.isOnline;\n }\n\n get isSyncing(): boolean {\n return this.scheduler.syncing;\n }\n\n /**\n * Register a typed mutation handler\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): this {\n this.registry.register(type, handler);\n return this;\n }\n\n /**\n * Enqueue a custom typed mutation\n */\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const item = await this.queue.enqueue<TPayload, TMeta>(options);\n\n // Auto-sync if online\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Enqueue a direct HTTP request (zero-boilerplate REST mutation)\n */\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const item = await this.queue.enqueueHttp<TMeta>(options);\n\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Manually trigger queue processing\n */\n async sync(): Promise<void> {\n if (this.isDestroyed) return;\n return this.scheduler.processQueue();\n }\n\n /**\n * Pause queue processing\n */\n pause(): void {\n this.scheduler.pause();\n }\n\n /**\n * Resume queue processing\n */\n resume(): void {\n this.scheduler.resume();\n }\n\n /**\n * Manually retry a specific failed mutation\n */\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.queue.retryItem(id);\n if (item && this.autoSync && this.network.isOnline) {\n this.sync();\n }\n return item;\n }\n\n /**\n * Manually retry all failed mutations in a scope (or globally)\n */\n async retryScope(scope?: string): Promise<void> {\n await this.queue.retryScope(scope);\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n }\n\n /**\n * Cancel and remove an item from the queue\n */\n async cancel(id: string): Promise<boolean> {\n return this.queue.cancel(id);\n }\n\n /**\n * Clear all items or a specific scope\n */\n async clear(scope?: string): Promise<void> {\n await this.queue.clear(scope);\n }\n\n /**\n * Get pending items\n */\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.queue.getPending(scope);\n }\n\n /**\n * Get all items matching filter\n */\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.queue.getAll(filter);\n }\n\n /**\n * Get queue statistics\n */\n async getStats(): Promise<QueueStats> {\n return this.queue.getStats();\n }\n\n /**\n * Subscribe to client lifecycle events\n */\n on<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): () => void {\n return this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from client lifecycle events\n */\n off<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): void {\n this.events.off(event, listener);\n }\n\n /**\n * Destroy client and clean up listeners\n */\n destroy(): void {\n this.isDestroyed = true;\n if (this.unsubscribeNetwork) {\n this.unsubscribeNetwork();\n this.unsubscribeNetwork = null;\n }\n this.scheduler.destroy();\n this.events.removeAllListeners();\n }\n}\n","import { NetworkMonitor } from '../types';\n\n/**\n * Controllable manual network monitor for testing, mocks, or custom connectivity checks\n */\nexport class ManualNetworkMonitor implements NetworkMonitor {\n private _isOnline: boolean;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n\n constructor(initialOnline = true) {\n this._isOnline = initialOnline;\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n setOnline(status: boolean): void {\n if (this._isOnline !== status) {\n this._isOnline = status;\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n return this._isOnline;\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { OfflineSyncClient } from '../core/OfflineSyncClient';\nimport { OfflineSyncOptions } from '../types';\n\nconst OfflineSyncContext = createContext<OfflineSyncClient | null>(null);\n\nexport interface OfflineSyncProviderProps {\n client?: OfflineSyncClient;\n options?: OfflineSyncOptions;\n children: React.ReactNode;\n}\n\nexport const OfflineSyncProvider: React.FC<OfflineSyncProviderProps> = ({\n client: externalClient,\n options,\n children,\n}) => {\n const [internalClient, setInternalClient] = useState<OfflineSyncClient | null>(null);\n\n useEffect(() => {\n if (!externalClient) {\n const client = new OfflineSyncClient(options);\n setInternalClient(client);\n return () => {\n client.destroy();\n };\n }\n return undefined;\n }, [externalClient]);\n\n const activeClient = useMemo(() => {\n return externalClient || internalClient;\n }, [externalClient, internalClient]);\n\n if (!activeClient) {\n return null;\n }\n\n return (\n <OfflineSyncContext.Provider value={activeClient}>\n {children}\n </OfflineSyncContext.Provider>\n );\n};\n\nexport function useOfflineSync(): OfflineSyncClient {\n const context = useContext(OfflineSyncContext);\n if (!context) {\n throw new Error(\n '[expo-offline-sync] useOfflineSync must be used within an <OfflineSyncProvider>'\n );\n }\n return context;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { MutationItem } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseOfflineMutationOptions<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n type: string;\n scope?: string;\n maxRetries?: number;\n priority?: number;\n meta?: TMeta;\n /**\n * Called immediately upon queueing for instantaneous optimistic UI updates\n */\n onMutate?: (payload: TPayload, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation finishes successfully\n */\n onSuccess?: (result: TResult, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation permanently fails (max retries exceeded or unrecoverable error)\n */\n onError?: (error: Error, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n}\n\nexport interface UseOfflineMutationResult<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n mutate: (payload: TPayload, overrideMeta?: TMeta) => void;\n mutateAsync: (payload: TPayload, overrideMeta?: TMeta) => Promise<MutationItem<TPayload, TMeta>>;\n status: 'idle' | 'pending' | 'success' | 'error';\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n error: Error | null;\n data: TResult | null;\n reset: () => void;\n}\n\nexport function useOfflineMutation<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n options: UseOfflineMutationOptions<TPayload, TResult, TMeta>\n): UseOfflineMutationResult<TPayload, TResult, TMeta> {\n const client = useOfflineSync();\n const [status, setStatus] = useState<'idle' | 'pending' | 'success' | 'error'>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<TResult | null>(null);\n\n // Store active item IDs from this hook instance to match events\n const pendingItemIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n const unsubSuccess = client.on('syncSuccess', (item, result) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('success');\n setData(result);\n if (options.onSuccess) {\n options.onSuccess(result, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n const unsubRollback = client.on('rollback', (item, err) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('error');\n setError(err);\n if (options.onError) {\n options.onError(err, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n return () => {\n unsubSuccess();\n unsubRollback();\n };\n }, [client, options]);\n\n const mutateAsync = useCallback(\n async (payload: TPayload, overrideMeta?: TMeta): Promise<MutationItem<TPayload, TMeta>> => {\n setStatus('pending');\n setError(null);\n\n const mergedMeta = { ...options.meta, ...overrideMeta } as TMeta;\n\n const item = await client.enqueue<TPayload, TMeta>({\n type: options.type,\n payload,\n scope: options.scope,\n meta: mergedMeta,\n maxRetries: options.maxRetries,\n priority: options.priority,\n onOptimistic: (enqueuedItem) => {\n pendingItemIdsRef.current.add(enqueuedItem.id);\n if (options.onMutate) {\n options.onMutate(payload, enqueuedItem);\n }\n },\n });\n\n return item;\n },\n [client, options]\n );\n\n const mutate = useCallback(\n (payload: TPayload, overrideMeta?: TMeta) => {\n mutateAsync(payload, overrideMeta).catch((err) => {\n console.error('[expo-offline-sync] mutate error:', err);\n });\n },\n [mutateAsync]\n );\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n pendingItemIdsRef.current.clear();\n }, []);\n\n return {\n mutate,\n mutateAsync,\n status,\n isPending: status === 'pending',\n isSuccess: status === 'success',\n isError: status === 'error',\n error,\n data,\n reset,\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { QueueStats } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseQueueStatusResult {\n isOnline: boolean;\n isSyncing: boolean;\n stats: QueueStats;\n sync: () => Promise<void>;\n retryAll: (scope?: string) => Promise<void>;\n clear: (scope?: string) => Promise<void>;\n}\n\nexport function useQueueStatus(): UseQueueStatusResult {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n const [isSyncing, setIsSyncing] = useState<boolean>(false);\n const [stats, setStats] = useState<QueueStats>({\n total: 0,\n pending: 0,\n syncing: 0,\n failed: 0,\n completed: 0,\n scopes: [],\n });\n\n const refreshStats = useCallback(async () => {\n try {\n const currentStats = await client.getStats();\n setStats(currentStats);\n } catch {}\n }, [client]);\n\n useEffect(() => {\n refreshStats();\n\n const unsubOnline = client.on('onlineChange', (online) => {\n setIsOnline(online);\n refreshStats();\n });\n\n const unsubEnqueued = client.on('enqueued', () => {\n refreshStats();\n });\n\n const unsubStart = client.on('syncStart', () => {\n setIsSyncing(true);\n refreshStats();\n });\n\n const unsubSuccess = client.on('syncSuccess', () => {\n refreshStats();\n });\n\n const unsubError = client.on('syncError', () => {\n refreshStats();\n });\n\n const unsubComplete = client.on('syncComplete', () => {\n setIsSyncing(false);\n refreshStats();\n });\n\n return () => {\n unsubOnline();\n unsubEnqueued();\n unsubStart();\n unsubSuccess();\n unsubError();\n unsubComplete();\n };\n }, [client, refreshStats]);\n\n const sync = useCallback(async () => {\n await client.sync();\n await refreshStats();\n }, [client, refreshStats]);\n\n const retryAll = useCallback(\n async (scope?: string) => {\n await client.retryScope(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n const clear = useCallback(\n async (scope?: string) => {\n await client.clear(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n return {\n isOnline,\n isSyncing,\n stats,\n sync,\n retryAll,\n clear,\n };\n}\n","import { useEffect, useState } from 'react';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport function useIsOnline(): boolean {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n\n useEffect(() => {\n setIsOnline(client.isOnline);\n return client.on('onlineChange', (online) => {\n setIsOnline(online);\n });\n }, [client]);\n\n return isOnline;\n}\n","import { OfflineSyncClient } from '../core/OfflineSyncClient';\n\nexport const DEFAULT_BACKGROUND_TASK_NAME = 'EXPO_OFFLINE_SYNC_BACKGROUND_TASK';\n\nexport interface BackgroundSyncOptions {\n taskName?: string;\n minimumInterval?: number; // In seconds (default: 15 minutes = 900 seconds)\n stopOnTerminate?: boolean;\n startOnBoot?: boolean;\n}\n\n/**\n * Registers background synchronization using expo-background-fetch and expo-task-manager\n * Automatically replays pending offline mutations even when the app is in the background or killed\n */\nexport async function registerBackgroundSync(\n client: OfflineSyncClient,\n options: BackgroundSyncOptions = {}\n): Promise<void> {\n const taskName = options.taskName ?? DEFAULT_BACKGROUND_TASK_NAME;\n const minimumInterval = options.minimumInterval ?? 15 * 60; // 15 mins\n const stopOnTerminate = options.stopOnTerminate ?? false;\n const startOnBoot = options.startOnBoot ?? true;\n\n let TaskManager: any;\n let BackgroundFetch: any;\n\n try {\n TaskManager = await import('expo-task-manager');\n BackgroundFetch = await import('expo-background-fetch');\n } catch {\n throw new Error(\n '[expo-offline-sync] Background sync requires \"expo-task-manager\" and \"expo-background-fetch\". Please run: npx expo install expo-task-manager expo-background-fetch'\n );\n }\n\n // 1. Define the background task if not already defined\n if (!TaskManager.isTaskDefined(taskName)) {\n TaskManager.defineTask(taskName, async () => {\n try {\n const stats = await client.getStats();\n if (stats.pending > 0 || stats.syncing > 0) {\n await client.sync();\n return BackgroundFetch.BackgroundFetchResult.NewData;\n }\n return BackgroundFetch.BackgroundFetchResult.NoData;\n } catch (err) {\n console.error('[expo-offline-sync] Background sync error:', err);\n return BackgroundFetch.BackgroundFetchResult.Failed;\n }\n });\n }\n\n // 2. Register with BackgroundFetch\n await BackgroundFetch.registerTaskAsync(taskName, {\n minimumInterval,\n stopOnTerminate,\n startOnBoot,\n });\n}\n\n/**\n * Unregisters the background sync task\n */\nexport async function unregisterBackgroundSync(taskName = DEFAULT_BACKGROUND_TASK_NAME): Promise<void> {\n try {\n const BackgroundFetch = await import('expo-background-fetch');\n const TaskManager = await import('expo-task-manager');\n const isRegistered = await TaskManager.isTaskRegisteredAsync(taskName);\n if (isRegistered) {\n await BackgroundFetch.unregisterTaskAsync(taskName);\n }\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to unregister background task:', err);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/network/NetInfoNetworkMonitor.ts","../src/storage/MemoryAdapter.ts","../src/storage/SQLiteAdapter.ts","../src/core/EventEmitter.ts","../src/core/HttpExecutor.ts","../src/core/QueueManager.ts","../src/core/Registry.ts","../src/core/Scheduler.ts","../src/core/OfflineSyncClient.ts","../src/network/NetworkMonitor.ts","../src/react/OfflineSyncProvider.tsx","../src/react/useOfflineMutation.ts","../src/react/useQueueStatus.ts","../src/react/useIsOnline.ts","../src/plugins/backgroundSync.ts"],"names":["state","contentType","createContext","useState","useEffect","useMemo","useContext","useRef","useCallback"],"mappings":"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","file":"index.cjs","sourcesContent":["import { NetworkMonitor } from '../types';\n\nexport class NetInfoNetworkMonitor implements NetworkMonitor {\n private _isOnline = true;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n private unsubscribeNetInfo: (() => void) | null = null;\n private unsubscribeAppState: (() => void) | null = null;\n\n constructor() {\n this.init();\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n private async init() {\n // 1. Try to initialize @react-native-community/netinfo\n let NetInfo: any = null;\n try {\n NetInfo = (await import('@react-native-community/netinfo')).default;\n } catch {\n // NetInfo not available (e.g. running in web or test environment)\n }\n\n if (NetInfo && typeof NetInfo.addEventListener === 'function') {\n const state = await NetInfo.fetch();\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n\n this.unsubscribeNetInfo = NetInfo.addEventListener((state: any) => {\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n });\n } else if (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n // Web fallback\n this.updateStatus(navigator.onLine);\n const onOnline = () => this.updateStatus(true);\n const onOffline = () => this.updateStatus(false);\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this.unsubscribeNetInfo = () => {\n window.removeEventListener('online', onOnline);\n window.removeEventListener('offline', onOffline);\n };\n }\n\n // 2. Listen to React Native AppState for foreground resume sync\n try {\n const { AppState } = await import('react-native');\n if (AppState && typeof AppState.addEventListener === 'function') {\n const subscription = AppState.addEventListener('change', async (nextState: string) => {\n if (nextState === 'active') {\n await this.check();\n }\n });\n this.unsubscribeAppState = () => subscription?.remove?.();\n }\n } catch {\n // Running outside React Native\n }\n }\n\n private updateStatus(newStatus: boolean) {\n if (this._isOnline !== newStatus) {\n this._isOnline = newStatus;\n for (const listener of this.listeners) {\n listener(newStatus);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n try {\n const NetInfo = (await import('@react-native-community/netinfo')).default;\n if (NetInfo && typeof NetInfo.fetch === 'function') {\n const state = await NetInfo.fetch();\n const online = Boolean(state.isConnected && state.isInternetReachable !== false);\n this.updateStatus(online);\n return online;\n }\n } catch {\n // Fallback\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean') {\n this.updateStatus(navigator.onLine);\n return navigator.onLine;\n }\n\n return this._isOnline;\n }\n\n destroy(): void {\n if (this.unsubscribeNetInfo) {\n this.unsubscribeNetInfo();\n this.unsubscribeNetInfo = null;\n }\n if (this.unsubscribeAppState) {\n this.unsubscribeAppState();\n this.unsubscribeAppState = null;\n }\n this.listeners.clear();\n }\n}\n\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\n/**\n * In-memory storage adapter for testing, mocking, and environments without SQLite\n */\nexport class MemoryAdapter implements StorageAdapter {\n private items: Map<string, MutationItem> = new Map();\n\n async init(): Promise<void> {\n // No-op for in-memory\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n // Clone item to avoid mutation by reference\n this.items.set(item.id, JSON.parse(JSON.stringify(item)));\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n const list = Array.from(this.items.values()).filter((item) => {\n const isPending = item.status === 'pending' || item.status === 'syncing';\n if (!isPending) return false;\n if (scope && item.scope !== scope) return false;\n return true;\n });\n\n // Sort by priority (higher first), then createdAt (older first / FIFO)\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n const item = this.items.get(id);\n if (!item) return null;\n return JSON.parse(JSON.stringify(item));\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n const existing = this.items.get(id);\n if (!existing) return;\n\n const updated: MutationItem = {\n ...existing,\n ...updates,\n updatedAt: Date.now(),\n };\n this.items.set(id, updated);\n }\n\n async remove(id: string): Promise<void> {\n this.items.delete(id);\n }\n\n async clear(scope?: string): Promise<void> {\n if (!scope) {\n this.items.clear();\n return;\n }\n\n for (const [id, item] of this.items.entries()) {\n if (item.scope === scope) {\n this.items.delete(id);\n }\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n let list = Array.from(this.items.values());\n\n if (filter?.status) {\n list = list.filter((i) => i.status === filter.status);\n }\n if (filter?.scope) {\n list = list.filter((i) => i.scope === filter.scope);\n }\n\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getStats(): Promise<QueueStats> {\n const all = Array.from(this.items.values());\n const scopes = new Set<string>();\n\n let pending = 0;\n let syncing = 0;\n let failed = 0;\n let completed = 0;\n\n for (const item of all) {\n scopes.add(item.scope);\n if (item.status === 'pending') pending++;\n else if (item.status === 'syncing') syncing++;\n else if (item.status === 'failed') failed++;\n else if (item.status === 'completed') completed++;\n }\n\n return {\n total: all.length,\n pending,\n syncing,\n failed,\n completed,\n scopes: Array.from(scopes),\n };\n }\n}\n\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\nexport interface SQLiteAdapterOptions {\n /**\n * Database filename (defaults to 'expo_offline_sync.db')\n */\n databaseName?: string;\n /**\n * Table name for the queue (defaults to 'offline_mutation_queue')\n */\n tableName?: string;\n /**\n * Direct SQLite database instance (e.g. from useSQLiteContext() or SQLite.openDatabaseAsync)\n */\n database?: any;\n}\n\ninterface RawMutationRow {\n id: string;\n type: string;\n scope: string;\n payload: string;\n meta: string | null;\n status: string;\n attempt_count: number;\n max_retries: number;\n created_at: number;\n updated_at: number;\n last_error: string | null;\n idempotency_key: string;\n priority: number;\n}\n\n/**\n * High-performance Expo SQLite Storage Adapter\n * Compatible with modern Expo SDK 51/52+ SQLite API\n */\nexport class SQLiteAdapter implements StorageAdapter {\n private db: any = null;\n private databaseName: string;\n private tableName: string;\n private initPromise: Promise<void> | null = null;\n\n constructor(options: SQLiteAdapterOptions = {}) {\n this.databaseName = options.databaseName ?? 'expo_offline_sync.db';\n this.tableName = options.tableName ?? 'offline_mutation_queue';\n if (options.database) {\n this.db = options.database;\n }\n }\n\n async init(): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n if (!this.db) {\n let SQLite: any;\n try {\n SQLite = await import('expo-sqlite');\n } catch {\n throw new Error(\n '[expo-offline-sync] expo-sqlite package is not installed. Please run \"npx expo install expo-sqlite\" or provide a custom StorageAdapter (e.g. MemoryAdapter).'\n );\n }\n\n if (typeof SQLite.openDatabaseAsync === 'function') {\n this.db = await SQLite.openDatabaseAsync(this.databaseName);\n } else if (typeof SQLite.openDatabaseSync === 'function') {\n this.db = SQLite.openDatabaseSync(this.databaseName);\n } else {\n throw new Error(\n '[expo-offline-sync] Incompatible expo-sqlite version detected. Please upgrade to Expo SDK 51 or newer.'\n );\n }\n }\n\n // Configure WAL mode for high concurrency\n await this.db.execAsync(`\n PRAGMA journal_mode = WAL;\n CREATE TABLE IF NOT EXISTS ${this.tableName} (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n scope TEXT NOT NULL,\n payload TEXT NOT NULL,\n meta TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n attempt_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 5,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_error TEXT,\n idempotency_key TEXT NOT NULL,\n priority INTEGER DEFAULT 0\n );\n CREATE INDEX IF NOT EXISTS idx_${this.tableName}_lookup \n ON ${this.tableName}(status, scope, priority DESC, created_at ASC);\n `);\n })();\n\n return this.initPromise;\n }\n\n private rowToItem(row: RawMutationRow): MutationItem {\n let payload: any = null;\n try {\n payload = JSON.parse(row.payload);\n } catch {\n payload = row.payload;\n }\n\n let meta: any = undefined;\n if (row.meta) {\n try {\n meta = JSON.parse(row.meta);\n } catch {\n meta = undefined;\n }\n }\n\n let lastError: any = undefined;\n if (row.last_error) {\n try {\n lastError = JSON.parse(row.last_error);\n } catch {\n lastError = { message: row.last_error };\n }\n }\n\n return {\n id: row.id,\n type: row.type,\n scope: row.scope,\n payload,\n meta,\n status: row.status as MutationStatus,\n attemptCount: row.attempt_count,\n maxRetries: row.max_retries,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n lastError,\n idempotencyKey: row.idempotency_key,\n priority: row.priority,\n };\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n await this.init();\n\n const sql = `\n INSERT OR REPLACE INTO ${this.tableName} (\n id, type, scope, payload, meta, status,\n attempt_count, max_retries, created_at, updated_at,\n last_error, idempotency_key, priority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n const params = [\n item.id,\n item.type,\n item.scope,\n JSON.stringify(item.payload),\n item.meta !== undefined ? JSON.stringify(item.meta) : null,\n item.status,\n item.attemptCount,\n item.maxRetries,\n item.createdAt,\n item.updatedAt,\n item.lastError ? JSON.stringify(item.lastError) : null,\n item.idempotencyKey,\n item.priority ?? 0,\n ];\n\n await this.db.runAsync(sql, params);\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `\n SELECT * FROM ${this.tableName}\n WHERE status IN ('pending', 'syncing')\n `;\n const params: any[] = [];\n\n if (scope) {\n sql += ` AND scope = ?`;\n params.push(scope);\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n await this.init();\n\n const sql = `SELECT * FROM ${this.tableName} WHERE id = ?`;\n const row: RawMutationRow | null = await this.db.getFirstAsync(sql, [id]);\n if (!row) return null;\n\n return this.rowToItem(row);\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n await this.init();\n\n const fields: string[] = [];\n const values: any[] = [];\n\n if (updates.status !== undefined) {\n fields.push('status = ?');\n values.push(updates.status);\n }\n if (updates.attemptCount !== undefined) {\n fields.push('attempt_count = ?');\n values.push(updates.attemptCount);\n }\n if (updates.lastError !== undefined) {\n fields.push('last_error = ?');\n values.push(updates.lastError ? JSON.stringify(updates.lastError) : null);\n }\n if (updates.payload !== undefined) {\n fields.push('payload = ?');\n values.push(JSON.stringify(updates.payload));\n }\n if (updates.meta !== undefined) {\n fields.push('meta = ?');\n values.push(updates.meta ? JSON.stringify(updates.meta) : null);\n }\n if (updates.priority !== undefined) {\n fields.push('priority = ?');\n values.push(updates.priority);\n }\n\n fields.push('updated_at = ?');\n values.push(Date.now());\n\n values.push(id);\n\n const sql = `UPDATE ${this.tableName} SET ${fields.join(', ')} WHERE id = ?`;\n await this.db.runAsync(sql, values);\n }\n\n async remove(id: string): Promise<void> {\n await this.init();\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE id = ?`, [id]);\n }\n\n async clear(scope?: string): Promise<void> {\n await this.init();\n if (scope) {\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE scope = ?`, [scope]);\n } else {\n await this.db.runAsync(`DELETE FROM ${this.tableName}`);\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `SELECT * FROM ${this.tableName}`;\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (filter?.status) {\n conditions.push('status = ?');\n params.push(filter.status);\n }\n if (filter?.scope) {\n conditions.push('scope = ?');\n params.push(filter.scope);\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getStats(): Promise<QueueStats> {\n await this.init();\n\n const sql = `\n SELECT \n COUNT(*) as total,\n SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,\n SUM(CASE WHEN status = 'syncing' THEN 1 ELSE 0 END) as syncing,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed\n FROM ${this.tableName}\n `;\n\n const row: any = await this.db.getFirstAsync(sql);\n\n const scopesRows: { scope: string }[] = await this.db.getAllAsync(\n `SELECT DISTINCT scope FROM ${this.tableName}`\n );\n\n return {\n total: row?.total ?? 0,\n pending: row?.pending ?? 0,\n syncing: row?.syncing ?? 0,\n failed: row?.failed ?? 0,\n completed: row?.completed ?? 0,\n scopes: scopesRows.map((s) => s.scope),\n };\n }\n}\n\n","type Listener<T extends any[] = any[]> = (...args: T) => void;\n\n/**\n * Lightweight, zero-dependency, typed EventEmitter compatible with React Native & Hermes\n */\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Listener>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Events[K]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n const set = this.listeners.get(event)!;\n set.add(listener as Listener);\n\n return () => {\n this.off(event, listener);\n };\n }\n\n off<K extends keyof Events>(event: K, listener: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as Listener);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n\n for (const listener of Array.from(set)) {\n try {\n listener(...args);\n } catch (err) {\n console.error(`[expo-offline-sync] Error in event listener for \"${String(event)}\":`, err);\n }\n }\n }\n\n removeAllListeners(event?: keyof Events): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n listenerCount(event: keyof Events): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n\n","import { HttpMutationPayload, MutationContext } from '../types';\n\nexport const HTTP_MUTATION_TYPE = '__EXPO_OFFLINE_SYNC_HTTP__';\n\nexport class HttpError extends Error {\n status: number;\n statusText: string;\n data: any;\n\n constructor(status: number, statusText: string, data: any) {\n super(`HTTP Request failed with status ${status}: ${statusText}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.data = data;\n }\n}\n\nexport interface HttpExecutorOptions {\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\n/**\n * Built-in executor for direct HTTP requests\n */\nexport class HttpExecutor {\n private getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n\n constructor(options: HttpExecutorOptions = {}) {\n this.getHeaders = options.getHeaders;\n }\n\n async execute(payload: HttpMutationPayload, context: MutationContext): Promise<any> {\n const { url, method = 'POST', headers = {}, body, timeoutMs = 30000 } = payload;\n\n // 1. Resolve dynamic headers (e.g. fresh auth token)\n let dynamicHeaders: Record<string, string> = {};\n if (this.getHeaders) {\n try {\n dynamicHeaders = await this.getHeaders();\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to resolve dynamic headers:', err);\n }\n }\n\n const mergedHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': context.idempotencyKey,\n ...dynamicHeaders,\n ...headers,\n };\n\n // 2. Setup timeout controller\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n // Link context signal if aborted externally\n if (context.signal) {\n context.signal.addEventListener('abort', () => controller.abort());\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers: mergedHeaders,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n let responseData: any;\n const contentType = response.headers.get('content-type') || '';\n try {\n if (contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n } catch {\n responseData = null;\n }\n\n throw new HttpError(response.status, response.statusText, responseData);\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return await response.json();\n }\n return await response.text();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n\n","import {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationItem,\n MutationStatus,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE } from './HttpExecutor';\n\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport interface QueueManagerOptions {\n storage: StorageAdapter;\n events: TypedEventEmitter<any>;\n defaultScope?: string;\n defaultMaxRetries?: number;\n}\n\nexport class QueueManager {\n private storage: StorageAdapter;\n private events: TypedEventEmitter<any>;\n private defaultScope: string;\n private defaultMaxRetries: number;\n\n constructor(options: QueueManagerOptions) {\n this.storage = options.storage;\n this.events = options.events;\n this.defaultScope = options.defaultScope ?? 'default';\n this.defaultMaxRetries = options.defaultMaxRetries ?? 5;\n }\n\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const now = Date.now();\n const id = generateUUID();\n const idempotencyKey = options.idempotencyKey ?? generateUUID();\n const scope = options.scope ?? this.defaultScope;\n const maxRetries = options.maxRetries ?? this.defaultMaxRetries;\n\n const item: MutationItem<TPayload, TMeta> = {\n id,\n type: options.type,\n scope,\n payload: options.payload,\n meta: options.meta,\n status: 'pending',\n attemptCount: 0,\n maxRetries,\n createdAt: now,\n updatedAt: now,\n idempotencyKey,\n priority: options.priority ?? 0,\n };\n\n // Save to durable storage\n await this.storage.enqueue(item);\n\n // Call optimistic callback immediately\n if (options.onOptimistic) {\n try {\n options.onOptimistic(item);\n } catch (err) {\n console.error('[expo-offline-sync] Error in onOptimistic callback:', err);\n }\n }\n\n // Emit event\n this.events.emit('enqueued', item);\n\n return item;\n }\n\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const payload: HttpMutationPayload = {\n url: options.url,\n method: options.method ?? 'POST',\n headers: options.headers,\n body: options.body,\n timeoutMs: options.timeoutMs,\n };\n\n return this.enqueue<HttpMutationPayload, TMeta>({\n type: HTTP_MUTATION_TYPE,\n payload,\n scope: options.scope,\n meta: options.meta,\n maxRetries: options.maxRetries,\n idempotencyKey: options.idempotencyKey,\n onOptimistic: options.onOptimistic,\n onRollback: options.onRollback,\n onSuccess: options.onSuccess,\n });\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.storage.getPending(scope);\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n return this.storage.getById(id);\n }\n\n async markSyncing(id: string): Promise<void> {\n await this.storage.update(id, {\n status: 'syncing',\n });\n }\n\n async markCompleted(id: string): Promise<void> {\n // We remove completed items to keep storage lean and fast\n await this.storage.remove(id);\n }\n\n async markFailed(id: string, error: Error, willRetry: boolean, attemptCount: number): Promise<void> {\n const status: MutationStatus = willRetry ? 'pending' : 'failed';\n const lastError = {\n message: error.message || 'Unknown error',\n code: (error as any).code || (error as any).status,\n stack: error.stack,\n };\n\n await this.storage.update(id, {\n status,\n attemptCount,\n lastError,\n });\n }\n\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.storage.getById(id);\n if (!item) return null;\n\n await this.storage.update(id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n\n return this.storage.getById(id);\n }\n\n async retryScope(scope?: string): Promise<void> {\n const failedItems = await this.storage.getAll({\n status: 'failed',\n scope,\n });\n\n for (const item of failedItems) {\n await this.storage.update(item.id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n }\n }\n\n async cancel(id: string): Promise<boolean> {\n const item = await this.storage.getById(id);\n if (!item) return false;\n\n await this.storage.remove(id);\n return true;\n }\n\n async clear(scope?: string): Promise<void> {\n await this.storage.clear(scope);\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.storage.getAll(filter);\n }\n\n async getStats(): Promise<QueueStats> {\n return this.storage.getStats();\n }\n}\n\n","import { MutationHandler } from '../types';\n\n/**\n * Mutation Registry for registering and retrieving type-safe mutation handlers\n */\nexport class Registry {\n private handlers: Map<string, MutationHandler<any, any, any>> = new Map();\n\n /**\n * Register a mutation handler for a given mutation type\n * @param type Unique mutation identifier (e.g. 'SEND_MESSAGE', 'UPDATE_PROFILE')\n * @param handler Async function to execute the mutation\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): void {\n if (this.handlers.has(type)) {\n console.warn(\n `[expo-offline-sync] Handler for mutation type \"${type}\" was already registered and has been overwritten.`\n );\n }\n this.handlers.set(type, handler);\n }\n\n /**\n * Get a registered handler by type\n */\n get<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string\n ): MutationHandler<TPayload, TResult, TMeta> | undefined {\n return this.handlers.get(type);\n }\n\n /**\n * Check if a handler is registered\n */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /**\n * Unregister a mutation handler\n */\n unregister(type: string): boolean {\n return this.handlers.delete(type);\n }\n\n /**\n * Clear all registered handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","import {\n MutationContext,\n MutationItem,\n NetworkMonitor,\n RetryPolicy,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HttpError } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\n\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 5,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffFactor: 2,\n jitter: true,\n shouldRetry: (error: any) => {\n if (error instanceof HttpError || (error && typeof error.status === 'number')) {\n const status = error.status;\n // Do not retry 4xx errors except 401 (auth issue), 408 (timeout), 429 (rate limit)\n if (status >= 400 && status < 500 && status !== 401 && status !== 408 && status !== 429) {\n return false;\n }\n }\n return true;\n },\n};\n\nexport interface SchedulerOptions {\n queueManager: QueueManager;\n registry: Registry;\n networkMonitor: NetworkMonitor;\n events: TypedEventEmitter<any>;\n retryPolicy?: Partial<RetryPolicy>;\n maxConcurrentScopes?: number;\n onRequest?: (item: MutationItem) => Promise<void> | void;\n onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n}\n\nexport class Scheduler {\n private queueManager: QueueManager;\n private registry: Registry;\n private networkMonitor: NetworkMonitor;\n private events: TypedEventEmitter<any>;\n private retryPolicy: RetryPolicy;\n private maxConcurrentScopes: number;\n private activeScopeMap: Map<string, Promise<void>> = new Map();\n private isPaused = false;\n private isSyncing = false;\n private abortController: AbortController = new AbortController();\n\n get syncing(): boolean {\n return this.isSyncing;\n }\n\n private onRequest?: (item: MutationItem) => Promise<void> | void;\n private onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n private onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n\n constructor(options: SchedulerOptions) {\n this.queueManager = options.queueManager;\n this.registry = options.registry;\n this.networkMonitor = options.networkMonitor;\n this.events = options.events;\n this.retryPolicy = { ...DEFAULT_RETRY_POLICY, ...options.retryPolicy };\n this.maxConcurrentScopes = options.maxConcurrentScopes ?? 3;\n this.onRequest = options.onRequest;\n this.onResponse = options.onResponse;\n this.onRollback = options.onRollback;\n }\n\n calculateBackoff(attemptCount: number): number {\n const { initialDelayMs, maxDelayMs, backoffFactor, jitter } = this.retryPolicy;\n const baseDelay = initialDelayMs * Math.pow(backoffFactor, Math.max(0, attemptCount - 1));\n const cappedDelay = Math.min(baseDelay, maxDelayMs);\n\n if (jitter) {\n // 0.8x to 1.2x randomization to prevent thundering herd\n const factor = 0.8 + Math.random() * 0.4;\n return Math.floor(cappedDelay * factor);\n }\n\n return Math.floor(cappedDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n this.abortController.signal.addEventListener('abort', () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n pause(): void {\n this.isPaused = true;\n }\n\n resume(): void {\n this.isPaused = false;\n this.processQueue();\n }\n\n /**\n * Main entry point to process pending queue across scopes\n */\n async processQueue(): Promise<void> {\n if (this.isPaused) return;\n if (!this.networkMonitor.isOnline) return;\n\n const stats = await this.queueManager.getStats();\n if (stats.pending === 0 && stats.syncing === 0) {\n this.events.emit('syncComplete');\n return;\n }\n\n this.isSyncing = true;\n const promises: Promise<void>[] = [];\n\n // Process available scopes up to maxConcurrentScopes\n for (const scope of stats.scopes) {\n if (this.activeScopeMap.size >= this.maxConcurrentScopes) {\n break;\n }\n\n if (!this.activeScopeMap.has(scope)) {\n const promise = this.processScope(scope).finally(() => {\n this.activeScopeMap.delete(scope);\n if (this.activeScopeMap.size === 0) {\n this.isSyncing = false;\n this.events.emit('syncComplete');\n }\n });\n this.activeScopeMap.set(scope, promise);\n promises.push(promise);\n } else {\n const existingPromise = this.activeScopeMap.get(scope);\n if (existingPromise) {\n promises.push(existingPromise);\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Sequentially process items for a specific scope (Deterministic FIFO)\n */\n private async processScope(scope: string): Promise<void> {\n while (!this.isPaused && this.networkMonitor.isOnline) {\n const pendingItems = await this.queueManager.getPending(scope);\n if (pendingItems.length === 0) {\n break;\n }\n\n const item = pendingItems[0];\n const success = await this.executeItem(item);\n\n if (!success) {\n // If execution failed and requires retry, break out of this scope loop\n // so it doesn't spin infinitely; it will be retried on next backoff or queue sync\n break;\n }\n }\n }\n\n /**\n * Executes a single mutation item\n * Returns true if completed or definitively failed, false if waiting for backoff retry\n */\n async executeItem(item: MutationItem): Promise<boolean> {\n if (this.isPaused || !this.networkMonitor.isOnline) {\n return false;\n }\n\n const handler = this.registry.get(item.type);\n if (!handler) {\n const err = new Error(\n `[expo-offline-sync] No mutation handler registered for type \"${item.type}\". Please call client.register(\"${item.type}\", handler)`\n );\n await this.queueManager.markFailed(item.id, err, false, item.attemptCount);\n this.events.emit('syncError', item, err);\n this.events.emit('rollback', item, err);\n if (this.onRollback) {\n try {\n await this.onRollback(item, err);\n } catch {}\n }\n return true; // Mark as resolved (unrecoverable error)\n }\n\n // Mark syncing\n await this.queueManager.markSyncing(item.id);\n this.events.emit('syncStart', item);\n\n if (this.onRequest) {\n try {\n await this.onRequest(item);\n } catch (err) {\n console.warn('[expo-offline-sync] Error in onRequest hook:', err);\n }\n }\n\n const context: MutationContext = {\n mutationId: item.id,\n type: item.type,\n scope: item.scope,\n attemptCount: item.attemptCount + 1,\n meta: item.meta,\n idempotencyKey: item.idempotencyKey,\n signal: this.abortController.signal,\n };\n\n try {\n const result = await handler(item.payload, context);\n\n // Successfully processed\n await this.queueManager.markCompleted(item.id);\n\n if (this.onResponse) {\n try {\n await this.onResponse(item, result);\n } catch {}\n }\n\n this.events.emit('syncSuccess', item, result);\n return true;\n } catch (err: any) {\n const error: Error = err instanceof Error ? err : new Error(String(err));\n const nextAttempt = item.attemptCount + 1;\n const maxRetries = item.maxRetries ?? this.retryPolicy.maxRetries;\n\n let shouldRetry = nextAttempt < maxRetries;\n if (shouldRetry && this.retryPolicy.shouldRetry) {\n try {\n shouldRetry = Boolean(await this.retryPolicy.shouldRetry(err, item));\n } catch {\n shouldRetry = true;\n }\n }\n\n if (shouldRetry) {\n // Will retry: mark pending with incremented attempt\n await this.queueManager.markFailed(item.id, error, true, nextAttempt);\n this.events.emit('syncError', item, error);\n\n const delay = this.calculateBackoff(nextAttempt);\n await this.sleep(delay);\n\n return false; // Scope will retry later\n } else {\n // Fatal / Exceeded max retries: mark permanently failed and trigger rollback\n await this.queueManager.markFailed(item.id, error, false, nextAttempt);\n this.events.emit('syncError', item, error);\n this.events.emit('rollback', item, error);\n\n if (this.onRollback) {\n try {\n await this.onRollback(item, error);\n } catch {}\n }\n\n return true; // Proceed to next item in scope to prevent deadlock\n }\n }\n }\n\n destroy(): void {\n this.pause();\n this.abortController.abort();\n this.activeScopeMap.clear();\n }\n}\n","import { NetInfoNetworkMonitor } from '../network/NetInfoNetworkMonitor';\nimport { MemoryAdapter } from '../storage/MemoryAdapter';\nimport { SQLiteAdapter } from '../storage/SQLiteAdapter';\nimport {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationHandler,\n MutationItem,\n MutationStatus,\n NetworkMonitor,\n OfflineSyncEventMap,\n OfflineSyncOptions,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE, HttpExecutor } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\nimport { Scheduler } from './Scheduler';\n\nexport class OfflineSyncClient {\n readonly storage: StorageAdapter;\n readonly network: NetworkMonitor;\n readonly registry: Registry;\n readonly queue: QueueManager;\n readonly scheduler: Scheduler;\n readonly events: TypedEventEmitter<OfflineSyncEventMap>;\n\n private httpExecutor: HttpExecutor;\n private autoSync: boolean;\n private unsubscribeNetwork: (() => void) | null = null;\n private isDestroyed = false;\n\n constructor(options: OfflineSyncOptions = {}) {\n this.events = new TypedEventEmitter<OfflineSyncEventMap>();\n this.autoSync = options.autoSync ?? true;\n\n // 1. Initialize Storage Adapter\n if (options.storage) {\n this.storage = options.storage;\n } else {\n // Default to SQLiteAdapter, fallback to MemoryAdapter\n try {\n this.storage = new SQLiteAdapter();\n } catch {\n this.storage = new MemoryAdapter();\n }\n }\n\n // 2. Initialize Network Monitor\n if (options.networkMonitor) {\n this.network = options.networkMonitor;\n } else {\n this.network = new NetInfoNetworkMonitor();\n }\n\n // 3. Initialize Registry\n this.registry = new Registry();\n\n // 4. Initialize Built-in HTTP Executor and register handler\n this.httpExecutor = new HttpExecutor({\n getHeaders: options.getHeaders,\n });\n this.registry.register<HttpMutationPayload>(HTTP_MUTATION_TYPE, async (payload, context) => {\n return this.httpExecutor.execute(payload, context);\n });\n\n // 5. Initialize Queue Manager\n this.queue = new QueueManager({\n storage: this.storage,\n events: this.events,\n defaultScope: options.defaultScope,\n defaultMaxRetries: options.retryPolicy?.maxRetries,\n });\n\n // 6. Initialize Scheduler\n this.scheduler = new Scheduler({\n queueManager: this.queue,\n registry: this.registry,\n networkMonitor: this.network,\n events: this.events,\n retryPolicy: options.retryPolicy,\n maxConcurrentScopes: options.maxConcurrentScopes,\n onRequest: options.onRequest,\n onResponse: options.onResponse,\n onRollback: options.onRollback,\n });\n\n // 7. Setup AutoSync on Network Reconnection\n this.unsubscribeNetwork = this.network.subscribe((isOnline) => {\n this.events.emit('onlineChange', isOnline);\n if (isOnline && this.autoSync) {\n this.sync();\n }\n });\n\n // Initial check and optional immediate sync\n if (this.autoSync && this.network.isOnline) {\n setTimeout(() => this.sync(), 0);\n }\n }\n\n get isOnline(): boolean {\n return this.network.isOnline;\n }\n\n get isSyncing(): boolean {\n return this.scheduler.syncing;\n }\n\n /**\n * Register a typed mutation handler\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): this {\n this.registry.register(type, handler);\n return this;\n }\n\n /**\n * Enqueue a custom typed mutation\n */\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const item = await this.queue.enqueue<TPayload, TMeta>(options);\n\n // Auto-sync if online\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Enqueue a direct HTTP request (zero-boilerplate REST mutation)\n */\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const item = await this.queue.enqueueHttp<TMeta>(options);\n\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Manually trigger queue processing\n */\n async sync(): Promise<void> {\n if (this.isDestroyed) return;\n return this.scheduler.processQueue();\n }\n\n /**\n * Pause queue processing\n */\n pause(): void {\n this.scheduler.pause();\n }\n\n /**\n * Resume queue processing\n */\n resume(): void {\n this.scheduler.resume();\n }\n\n /**\n * Manually retry a specific failed mutation\n */\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.queue.retryItem(id);\n if (item && this.autoSync && this.network.isOnline) {\n this.sync();\n }\n return item;\n }\n\n /**\n * Manually retry all failed mutations in a scope (or globally)\n */\n async retryScope(scope?: string): Promise<void> {\n await this.queue.retryScope(scope);\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n }\n\n /**\n * Cancel and remove an item from the queue\n */\n async cancel(id: string): Promise<boolean> {\n return this.queue.cancel(id);\n }\n\n /**\n * Clear all items or a specific scope\n */\n async clear(scope?: string): Promise<void> {\n await this.queue.clear(scope);\n }\n\n /**\n * Get pending items\n */\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.queue.getPending(scope);\n }\n\n /**\n * Get all items matching filter\n */\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.queue.getAll(filter);\n }\n\n /**\n * Get queue statistics\n */\n async getStats(): Promise<QueueStats> {\n return this.queue.getStats();\n }\n\n /**\n * Subscribe to client lifecycle events\n */\n on<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): () => void {\n return this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from client lifecycle events\n */\n off<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): void {\n this.events.off(event, listener);\n }\n\n /**\n * Destroy client and clean up listeners\n */\n destroy(): void {\n this.isDestroyed = true;\n if (this.unsubscribeNetwork) {\n this.unsubscribeNetwork();\n this.unsubscribeNetwork = null;\n }\n this.scheduler.destroy();\n this.events.removeAllListeners();\n }\n}\n","import { NetworkMonitor } from '../types';\n\n/**\n * Controllable manual network monitor for testing, mocks, or custom connectivity checks\n */\nexport class ManualNetworkMonitor implements NetworkMonitor {\n private _isOnline: boolean;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n\n constructor(initialOnline = true) {\n this._isOnline = initialOnline;\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n setOnline(status: boolean): void {\n if (this._isOnline !== status) {\n this._isOnline = status;\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n return this._isOnline;\n }\n}\n\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { OfflineSyncClient } from '../core/OfflineSyncClient';\nimport { OfflineSyncOptions } from '../types';\n\nconst OfflineSyncContext = createContext<OfflineSyncClient | null>(null);\n\nexport interface OfflineSyncProviderProps {\n client?: OfflineSyncClient;\n options?: OfflineSyncOptions;\n children: React.ReactNode;\n}\n\nexport const OfflineSyncProvider: React.FC<OfflineSyncProviderProps> = ({\n client: externalClient,\n options,\n children,\n}) => {\n const [internalClient, setInternalClient] = useState<OfflineSyncClient | null>(null);\n\n useEffect(() => {\n if (!externalClient) {\n const client = new OfflineSyncClient(options);\n setInternalClient(client);\n return () => {\n client.destroy();\n };\n }\n return undefined;\n }, [externalClient]);\n\n const activeClient = useMemo(() => {\n return externalClient || internalClient;\n }, [externalClient, internalClient]);\n\n if (!activeClient) {\n return null;\n }\n\n return (\n <OfflineSyncContext.Provider value={activeClient}>\n {children}\n </OfflineSyncContext.Provider>\n );\n};\n\nexport function useOfflineSync(): OfflineSyncClient {\n const context = useContext(OfflineSyncContext);\n if (!context) {\n throw new Error(\n '[expo-offline-sync] useOfflineSync must be used within an <OfflineSyncProvider>'\n );\n }\n return context;\n}\n\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { MutationItem } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseOfflineMutationOptions<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n type: string;\n scope?: string;\n maxRetries?: number;\n priority?: number;\n meta?: TMeta;\n /**\n * Called immediately upon queueing for instantaneous optimistic UI updates\n */\n onMutate?: (payload: TPayload, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation finishes successfully\n */\n onSuccess?: (result: TResult, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation permanently fails (max retries exceeded or unrecoverable error)\n */\n onError?: (error: Error, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n}\n\nexport interface UseOfflineMutationResult<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n mutate: (payload: TPayload, overrideMeta?: TMeta) => void;\n mutateAsync: (payload: TPayload, overrideMeta?: TMeta) => Promise<MutationItem<TPayload, TMeta>>;\n status: 'idle' | 'pending' | 'success' | 'error';\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n error: Error | null;\n data: TResult | null;\n reset: () => void;\n}\n\nexport function useOfflineMutation<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n options: UseOfflineMutationOptions<TPayload, TResult, TMeta>\n): UseOfflineMutationResult<TPayload, TResult, TMeta> {\n const client = useOfflineSync();\n const [status, setStatus] = useState<'idle' | 'pending' | 'success' | 'error'>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<TResult | null>(null);\n\n // Store active item IDs from this hook instance to match events\n const pendingItemIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n const unsubSuccess = client.on('syncSuccess', (item, result) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('success');\n setData(result);\n if (options.onSuccess) {\n options.onSuccess(result, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n const unsubRollback = client.on('rollback', (item, err) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('error');\n setError(err);\n if (options.onError) {\n options.onError(err, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n return () => {\n unsubSuccess();\n unsubRollback();\n };\n }, [client, options]);\n\n const mutateAsync = useCallback(\n async (payload: TPayload, overrideMeta?: TMeta): Promise<MutationItem<TPayload, TMeta>> => {\n setStatus('pending');\n setError(null);\n\n const mergedMeta = { ...options.meta, ...overrideMeta } as TMeta;\n\n const item = await client.enqueue<TPayload, TMeta>({\n type: options.type,\n payload,\n scope: options.scope,\n meta: mergedMeta,\n maxRetries: options.maxRetries,\n priority: options.priority,\n onOptimistic: (enqueuedItem) => {\n pendingItemIdsRef.current.add(enqueuedItem.id);\n if (options.onMutate) {\n options.onMutate(payload, enqueuedItem);\n }\n },\n });\n\n return item;\n },\n [client, options]\n );\n\n const mutate = useCallback(\n (payload: TPayload, overrideMeta?: TMeta) => {\n mutateAsync(payload, overrideMeta).catch((err) => {\n console.error('[expo-offline-sync] mutate error:', err);\n });\n },\n [mutateAsync]\n );\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n pendingItemIdsRef.current.clear();\n }, []);\n\n return {\n mutate,\n mutateAsync,\n status,\n isPending: status === 'pending',\n isSuccess: status === 'success',\n isError: status === 'error',\n error,\n data,\n reset,\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { QueueStats } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseQueueStatusResult {\n isOnline: boolean;\n isSyncing: boolean;\n stats: QueueStats;\n sync: () => Promise<void>;\n retryAll: (scope?: string) => Promise<void>;\n clear: (scope?: string) => Promise<void>;\n}\n\nexport function useQueueStatus(): UseQueueStatusResult {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n const [isSyncing, setIsSyncing] = useState<boolean>(false);\n const [stats, setStats] = useState<QueueStats>({\n total: 0,\n pending: 0,\n syncing: 0,\n failed: 0,\n completed: 0,\n scopes: [],\n });\n\n const refreshStats = useCallback(async () => {\n try {\n const currentStats = await client.getStats();\n setStats(currentStats);\n } catch {}\n }, [client]);\n\n useEffect(() => {\n refreshStats();\n\n const unsubOnline = client.on('onlineChange', (online) => {\n setIsOnline(online);\n refreshStats();\n });\n\n const unsubEnqueued = client.on('enqueued', () => {\n refreshStats();\n });\n\n const unsubStart = client.on('syncStart', () => {\n setIsSyncing(true);\n refreshStats();\n });\n\n const unsubSuccess = client.on('syncSuccess', () => {\n refreshStats();\n });\n\n const unsubError = client.on('syncError', () => {\n refreshStats();\n });\n\n const unsubComplete = client.on('syncComplete', () => {\n setIsSyncing(false);\n refreshStats();\n });\n\n return () => {\n unsubOnline();\n unsubEnqueued();\n unsubStart();\n unsubSuccess();\n unsubError();\n unsubComplete();\n };\n }, [client, refreshStats]);\n\n const sync = useCallback(async () => {\n await client.sync();\n await refreshStats();\n }, [client, refreshStats]);\n\n const retryAll = useCallback(\n async (scope?: string) => {\n await client.retryScope(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n const clear = useCallback(\n async (scope?: string) => {\n await client.clear(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n return {\n isOnline,\n isSyncing,\n stats,\n sync,\n retryAll,\n clear,\n };\n}\n\n","import { useEffect, useState } from 'react';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport function useIsOnline(): boolean {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n\n useEffect(() => {\n setIsOnline(client.isOnline);\n return client.on('onlineChange', (online) => {\n setIsOnline(online);\n });\n }, [client]);\n\n return isOnline;\n}\n\n","import { OfflineSyncClient } from '../core/OfflineSyncClient';\n\nexport const DEFAULT_BACKGROUND_TASK_NAME = 'EXPO_OFFLINE_SYNC_BACKGROUND_TASK';\n\nexport interface BackgroundSyncOptions {\n taskName?: string;\n minimumInterval?: number; // In seconds (default: 15 minutes = 900 seconds)\n stopOnTerminate?: boolean;\n startOnBoot?: boolean;\n}\n\n/**\n * Registers background synchronization using expo-background-fetch and expo-task-manager\n * Automatically replays pending offline mutations even when the app is in the background or killed\n */\nexport async function registerBackgroundSync(\n client: OfflineSyncClient,\n options: BackgroundSyncOptions = {}\n): Promise<void> {\n const taskName = options.taskName ?? DEFAULT_BACKGROUND_TASK_NAME;\n const minimumInterval = options.minimumInterval ?? 15 * 60; // 15 mins\n const stopOnTerminate = options.stopOnTerminate ?? false;\n const startOnBoot = options.startOnBoot ?? true;\n\n let TaskManager: any;\n let BackgroundFetch: any;\n\n try {\n TaskManager = await import('expo-task-manager');\n BackgroundFetch = await import('expo-background-fetch');\n } catch {\n throw new Error(\n '[expo-offline-sync] Background sync requires \"expo-task-manager\" and \"expo-background-fetch\". Please run: npx expo install expo-task-manager expo-background-fetch'\n );\n }\n\n // 1. Define the background task if not already defined\n if (!TaskManager.isTaskDefined(taskName)) {\n TaskManager.defineTask(taskName, async () => {\n try {\n const stats = await client.getStats();\n if (stats.pending > 0 || stats.syncing > 0) {\n await client.sync();\n return BackgroundFetch.BackgroundFetchResult.NewData;\n }\n return BackgroundFetch.BackgroundFetchResult.NoData;\n } catch (err) {\n console.error('[expo-offline-sync] Background sync error:', err);\n return BackgroundFetch.BackgroundFetchResult.Failed;\n }\n });\n }\n\n // 2. Register with BackgroundFetch\n await BackgroundFetch.registerTaskAsync(taskName, {\n minimumInterval,\n stopOnTerminate,\n startOnBoot,\n });\n}\n\n/**\n * Unregisters the background sync task\n */\nexport async function unregisterBackgroundSync(taskName = DEFAULT_BACKGROUND_TASK_NAME): Promise<void> {\n try {\n const BackgroundFetch = await import('expo-background-fetch');\n const TaskManager = await import('expo-task-manager');\n const isRegistered = await TaskManager.isTaskRegisteredAsync(taskName);\n if (isRegistered) {\n await BackgroundFetch.unregisterTaskAsync(taskName);\n }\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to unregister background task:', err);\n }\n}\n"]}
|
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../src/network/NetInfoNetworkMonitor.ts","../src/storage/MemoryAdapter.ts","../src/storage/SQLiteAdapter.ts","../src/core/EventEmitter.ts","../src/core/HttpExecutor.ts","../src/core/QueueManager.ts","../src/core/Registry.ts","../src/core/Scheduler.ts","../src/core/OfflineSyncClient.ts","../src/network/NetworkMonitor.ts","../src/react/OfflineSyncProvider.tsx","../src/react/useOfflineMutation.ts","../src/react/useQueueStatus.ts","../src/react/useIsOnline.ts","../src/plugins/backgroundSync.ts"],"names":["state","contentType","useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import { NetworkMonitor } from '../types';\n\nexport class NetInfoNetworkMonitor implements NetworkMonitor {\n private _isOnline = true;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n private unsubscribeNetInfo: (() => void) | null = null;\n private unsubscribeAppState: (() => void) | null = null;\n\n constructor() {\n this.init();\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n private async init() {\n // 1. Try to initialize @react-native-community/netinfo\n let NetInfo: any = null;\n try {\n NetInfo = (await import('@react-native-community/netinfo')).default;\n } catch {\n // NetInfo not available (e.g. running in web or test environment)\n }\n\n if (NetInfo && typeof NetInfo.addEventListener === 'function') {\n const state = await NetInfo.fetch();\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n\n this.unsubscribeNetInfo = NetInfo.addEventListener((state: any) => {\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n });\n } else if (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n // Web fallback\n this.updateStatus(navigator.onLine);\n const onOnline = () => this.updateStatus(true);\n const onOffline = () => this.updateStatus(false);\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this.unsubscribeNetInfo = () => {\n window.removeEventListener('online', onOnline);\n window.removeEventListener('offline', onOffline);\n };\n }\n\n // 2. Listen to React Native AppState for foreground resume sync\n try {\n const { AppState } = await import('react-native');\n if (AppState && typeof AppState.addEventListener === 'function') {\n const subscription = AppState.addEventListener('change', async (nextState: string) => {\n if (nextState === 'active') {\n await this.check();\n }\n });\n this.unsubscribeAppState = () => subscription?.remove?.();\n }\n } catch {\n // Running outside React Native\n }\n }\n\n private updateStatus(newStatus: boolean) {\n if (this._isOnline !== newStatus) {\n this._isOnline = newStatus;\n for (const listener of this.listeners) {\n listener(newStatus);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n try {\n const NetInfo = (await import('@react-native-community/netinfo')).default;\n if (NetInfo && typeof NetInfo.fetch === 'function') {\n const state = await NetInfo.fetch();\n const online = Boolean(state.isConnected && state.isInternetReachable !== false);\n this.updateStatus(online);\n return online;\n }\n } catch {\n // Fallback\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean') {\n this.updateStatus(navigator.onLine);\n return navigator.onLine;\n }\n\n return this._isOnline;\n }\n\n destroy(): void {\n if (this.unsubscribeNetInfo) {\n this.unsubscribeNetInfo();\n this.unsubscribeNetInfo = null;\n }\n if (this.unsubscribeAppState) {\n this.unsubscribeAppState();\n this.unsubscribeAppState = null;\n }\n this.listeners.clear();\n }\n}\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\n/**\n * In-memory storage adapter for testing, mocking, and environments without SQLite\n */\nexport class MemoryAdapter implements StorageAdapter {\n private items: Map<string, MutationItem> = new Map();\n\n async init(): Promise<void> {\n // No-op for in-memory\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n // Clone item to avoid mutation by reference\n this.items.set(item.id, JSON.parse(JSON.stringify(item)));\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n const list = Array.from(this.items.values()).filter((item) => {\n const isPending = item.status === 'pending' || item.status === 'syncing';\n if (!isPending) return false;\n if (scope && item.scope !== scope) return false;\n return true;\n });\n\n // Sort by priority (higher first), then createdAt (older first / FIFO)\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n const item = this.items.get(id);\n if (!item) return null;\n return JSON.parse(JSON.stringify(item));\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n const existing = this.items.get(id);\n if (!existing) return;\n\n const updated: MutationItem = {\n ...existing,\n ...updates,\n updatedAt: Date.now(),\n };\n this.items.set(id, updated);\n }\n\n async remove(id: string): Promise<void> {\n this.items.delete(id);\n }\n\n async clear(scope?: string): Promise<void> {\n if (!scope) {\n this.items.clear();\n return;\n }\n\n for (const [id, item] of this.items.entries()) {\n if (item.scope === scope) {\n this.items.delete(id);\n }\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n let list = Array.from(this.items.values());\n\n if (filter?.status) {\n list = list.filter((i) => i.status === filter.status);\n }\n if (filter?.scope) {\n list = list.filter((i) => i.scope === filter.scope);\n }\n\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getStats(): Promise<QueueStats> {\n const all = Array.from(this.items.values());\n const scopes = new Set<string>();\n\n let pending = 0;\n let syncing = 0;\n let failed = 0;\n let completed = 0;\n\n for (const item of all) {\n scopes.add(item.scope);\n if (item.status === 'pending') pending++;\n else if (item.status === 'syncing') syncing++;\n else if (item.status === 'failed') failed++;\n else if (item.status === 'completed') completed++;\n }\n\n return {\n total: all.length,\n pending,\n syncing,\n failed,\n completed,\n scopes: Array.from(scopes),\n };\n }\n}\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\nexport interface SQLiteAdapterOptions {\n /**\n * Database filename (defaults to 'expo_offline_sync.db')\n */\n databaseName?: string;\n /**\n * Table name for the queue (defaults to 'offline_mutation_queue')\n */\n tableName?: string;\n /**\n * Direct SQLite database instance (e.g. from useSQLiteContext() or SQLite.openDatabaseAsync)\n */\n database?: any;\n}\n\ninterface RawMutationRow {\n id: string;\n type: string;\n scope: string;\n payload: string;\n meta: string | null;\n status: string;\n attempt_count: number;\n max_retries: number;\n created_at: number;\n updated_at: number;\n last_error: string | null;\n idempotency_key: string;\n priority: number;\n}\n\n/**\n * High-performance Expo SQLite Storage Adapter\n * Compatible with modern Expo SDK 51/52+ SQLite API\n */\nexport class SQLiteAdapter implements StorageAdapter {\n private db: any = null;\n private databaseName: string;\n private tableName: string;\n private initPromise: Promise<void> | null = null;\n\n constructor(options: SQLiteAdapterOptions = {}) {\n this.databaseName = options.databaseName ?? 'expo_offline_sync.db';\n this.tableName = options.tableName ?? 'offline_mutation_queue';\n if (options.database) {\n this.db = options.database;\n }\n }\n\n async init(): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n if (!this.db) {\n let SQLite: any;\n try {\n SQLite = await import('expo-sqlite');\n } catch {\n throw new Error(\n '[expo-offline-sync] expo-sqlite package is not installed. Please run \"npx expo install expo-sqlite\" or provide a custom StorageAdapter (e.g. MemoryAdapter).'\n );\n }\n\n if (typeof SQLite.openDatabaseAsync === 'function') {\n this.db = await SQLite.openDatabaseAsync(this.databaseName);\n } else if (typeof SQLite.openDatabaseSync === 'function') {\n this.db = SQLite.openDatabaseSync(this.databaseName);\n } else {\n throw new Error(\n '[expo-offline-sync] Incompatible expo-sqlite version detected. Please upgrade to Expo SDK 51 or newer.'\n );\n }\n }\n\n // Configure WAL mode for high concurrency\n await this.db.execAsync(`\n PRAGMA journal_mode = WAL;\n CREATE TABLE IF NOT EXISTS ${this.tableName} (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n scope TEXT NOT NULL,\n payload TEXT NOT NULL,\n meta TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n attempt_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 5,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_error TEXT,\n idempotency_key TEXT NOT NULL,\n priority INTEGER DEFAULT 0\n );\n CREATE INDEX IF NOT EXISTS idx_${this.tableName}_lookup \n ON ${this.tableName}(status, scope, priority DESC, created_at ASC);\n `);\n })();\n\n return this.initPromise;\n }\n\n private rowToItem(row: RawMutationRow): MutationItem {\n let payload: any = null;\n try {\n payload = JSON.parse(row.payload);\n } catch {\n payload = row.payload;\n }\n\n let meta: any = undefined;\n if (row.meta) {\n try {\n meta = JSON.parse(row.meta);\n } catch {\n meta = undefined;\n }\n }\n\n let lastError: any = undefined;\n if (row.last_error) {\n try {\n lastError = JSON.parse(row.last_error);\n } catch {\n lastError = { message: row.last_error };\n }\n }\n\n return {\n id: row.id,\n type: row.type,\n scope: row.scope,\n payload,\n meta,\n status: row.status as MutationStatus,\n attemptCount: row.attempt_count,\n maxRetries: row.max_retries,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n lastError,\n idempotencyKey: row.idempotency_key,\n priority: row.priority,\n };\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n await this.init();\n\n const sql = `\n INSERT OR REPLACE INTO ${this.tableName} (\n id, type, scope, payload, meta, status,\n attempt_count, max_retries, created_at, updated_at,\n last_error, idempotency_key, priority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n const params = [\n item.id,\n item.type,\n item.scope,\n JSON.stringify(item.payload),\n item.meta !== undefined ? JSON.stringify(item.meta) : null,\n item.status,\n item.attemptCount,\n item.maxRetries,\n item.createdAt,\n item.updatedAt,\n item.lastError ? JSON.stringify(item.lastError) : null,\n item.idempotencyKey,\n item.priority ?? 0,\n ];\n\n await this.db.runAsync(sql, params);\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `\n SELECT * FROM ${this.tableName}\n WHERE status IN ('pending', 'syncing')\n `;\n const params: any[] = [];\n\n if (scope) {\n sql += ` AND scope = ?`;\n params.push(scope);\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n await this.init();\n\n const sql = `SELECT * FROM ${this.tableName} WHERE id = ?`;\n const row: RawMutationRow | null = await this.db.getFirstAsync(sql, [id]);\n if (!row) return null;\n\n return this.rowToItem(row);\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n await this.init();\n\n const fields: string[] = [];\n const values: any[] = [];\n\n if (updates.status !== undefined) {\n fields.push('status = ?');\n values.push(updates.status);\n }\n if (updates.attemptCount !== undefined) {\n fields.push('attempt_count = ?');\n values.push(updates.attemptCount);\n }\n if (updates.lastError !== undefined) {\n fields.push('last_error = ?');\n values.push(updates.lastError ? JSON.stringify(updates.lastError) : null);\n }\n if (updates.payload !== undefined) {\n fields.push('payload = ?');\n values.push(JSON.stringify(updates.payload));\n }\n if (updates.meta !== undefined) {\n fields.push('meta = ?');\n values.push(updates.meta ? JSON.stringify(updates.meta) : null);\n }\n if (updates.priority !== undefined) {\n fields.push('priority = ?');\n values.push(updates.priority);\n }\n\n fields.push('updated_at = ?');\n values.push(Date.now());\n\n values.push(id);\n\n const sql = `UPDATE ${this.tableName} SET ${fields.join(', ')} WHERE id = ?`;\n await this.db.runAsync(sql, values);\n }\n\n async remove(id: string): Promise<void> {\n await this.init();\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE id = ?`, [id]);\n }\n\n async clear(scope?: string): Promise<void> {\n await this.init();\n if (scope) {\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE scope = ?`, [scope]);\n } else {\n await this.db.runAsync(`DELETE FROM ${this.tableName}`);\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `SELECT * FROM ${this.tableName}`;\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (filter?.status) {\n conditions.push('status = ?');\n params.push(filter.status);\n }\n if (filter?.scope) {\n conditions.push('scope = ?');\n params.push(filter.scope);\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getStats(): Promise<QueueStats> {\n await this.init();\n\n const sql = `\n SELECT \n COUNT(*) as total,\n SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,\n SUM(CASE WHEN status = 'syncing' THEN 1 ELSE 0 END) as syncing,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed\n FROM ${this.tableName}\n `;\n\n const row: any = await this.db.getFirstAsync(sql);\n\n const scopesRows: { scope: string }[] = await this.db.getAllAsync(\n `SELECT DISTINCT scope FROM ${this.tableName}`\n );\n\n return {\n total: row?.total ?? 0,\n pending: row?.pending ?? 0,\n syncing: row?.syncing ?? 0,\n failed: row?.failed ?? 0,\n completed: row?.completed ?? 0,\n scopes: scopesRows.map((s) => s.scope),\n };\n }\n}\n","type Listener<T extends any[] = any[]> = (...args: T) => void;\n\n/**\n * Lightweight, zero-dependency, typed EventEmitter compatible with React Native & Hermes\n */\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Listener>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Events[K]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n const set = this.listeners.get(event)!;\n set.add(listener as Listener);\n\n return () => {\n this.off(event, listener);\n };\n }\n\n off<K extends keyof Events>(event: K, listener: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as Listener);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n\n for (const listener of Array.from(set)) {\n try {\n listener(...args);\n } catch (err) {\n console.error(`[expo-offline-sync] Error in event listener for \"${String(event)}\":`, err);\n }\n }\n }\n\n removeAllListeners(event?: keyof Events): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n listenerCount(event: keyof Events): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n","import { HttpMutationPayload, MutationContext } from '../types';\n\nexport const HTTP_MUTATION_TYPE = '__EXPO_OFFLINE_SYNC_HTTP__';\n\nexport class HttpError extends Error {\n status: number;\n statusText: string;\n data: any;\n\n constructor(status: number, statusText: string, data: any) {\n super(`HTTP Request failed with status ${status}: ${statusText}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.data = data;\n }\n}\n\nexport interface HttpExecutorOptions {\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\n/**\n * Built-in executor for direct HTTP requests\n */\nexport class HttpExecutor {\n private getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n\n constructor(options: HttpExecutorOptions = {}) {\n this.getHeaders = options.getHeaders;\n }\n\n async execute(payload: HttpMutationPayload, context: MutationContext): Promise<any> {\n const { url, method = 'POST', headers = {}, body, timeoutMs = 30000 } = payload;\n\n // 1. Resolve dynamic headers (e.g. fresh auth token)\n let dynamicHeaders: Record<string, string> = {};\n if (this.getHeaders) {\n try {\n dynamicHeaders = await this.getHeaders();\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to resolve dynamic headers:', err);\n }\n }\n\n const mergedHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': context.idempotencyKey,\n ...dynamicHeaders,\n ...headers,\n };\n\n // 2. Setup timeout controller\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n // Link context signal if aborted externally\n if (context.signal) {\n context.signal.addEventListener('abort', () => controller.abort());\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers: mergedHeaders,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n let responseData: any;\n const contentType = response.headers.get('content-type') || '';\n try {\n if (contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n } catch {\n responseData = null;\n }\n\n throw new HttpError(response.status, response.statusText, responseData);\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return await response.json();\n }\n return await response.text();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n","import {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationItem,\n MutationStatus,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE } from './HttpExecutor';\n\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport interface QueueManagerOptions {\n storage: StorageAdapter;\n events: TypedEventEmitter<any>;\n defaultScope?: string;\n defaultMaxRetries?: number;\n}\n\nexport class QueueManager {\n private storage: StorageAdapter;\n private events: TypedEventEmitter<any>;\n private defaultScope: string;\n private defaultMaxRetries: number;\n\n constructor(options: QueueManagerOptions) {\n this.storage = options.storage;\n this.events = options.events;\n this.defaultScope = options.defaultScope ?? 'default';\n this.defaultMaxRetries = options.defaultMaxRetries ?? 5;\n }\n\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const now = Date.now();\n const id = generateUUID();\n const idempotencyKey = options.idempotencyKey ?? generateUUID();\n const scope = options.scope ?? this.defaultScope;\n const maxRetries = options.maxRetries ?? this.defaultMaxRetries;\n\n const item: MutationItem<TPayload, TMeta> = {\n id,\n type: options.type,\n scope,\n payload: options.payload,\n meta: options.meta,\n status: 'pending',\n attemptCount: 0,\n maxRetries,\n createdAt: now,\n updatedAt: now,\n idempotencyKey,\n priority: options.priority ?? 0,\n };\n\n // Save to durable storage\n await this.storage.enqueue(item);\n\n // Call optimistic callback immediately\n if (options.onOptimistic) {\n try {\n options.onOptimistic(item);\n } catch (err) {\n console.error('[expo-offline-sync] Error in onOptimistic callback:', err);\n }\n }\n\n // Emit event\n this.events.emit('enqueued', item);\n\n return item;\n }\n\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const payload: HttpMutationPayload = {\n url: options.url,\n method: options.method ?? 'POST',\n headers: options.headers,\n body: options.body,\n timeoutMs: options.timeoutMs,\n };\n\n return this.enqueue<HttpMutationPayload, TMeta>({\n type: HTTP_MUTATION_TYPE,\n payload,\n scope: options.scope,\n meta: options.meta,\n maxRetries: options.maxRetries,\n idempotencyKey: options.idempotencyKey,\n onOptimistic: options.onOptimistic,\n onRollback: options.onRollback,\n onSuccess: options.onSuccess,\n });\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.storage.getPending(scope);\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n return this.storage.getById(id);\n }\n\n async markSyncing(id: string): Promise<void> {\n await this.storage.update(id, {\n status: 'syncing',\n });\n }\n\n async markCompleted(id: string): Promise<void> {\n // We remove completed items to keep storage lean and fast\n await this.storage.remove(id);\n }\n\n async markFailed(id: string, error: Error, willRetry: boolean, attemptCount: number): Promise<void> {\n const status: MutationStatus = willRetry ? 'pending' : 'failed';\n const lastError = {\n message: error.message || 'Unknown error',\n code: (error as any).code || (error as any).status,\n stack: error.stack,\n };\n\n await this.storage.update(id, {\n status,\n attemptCount,\n lastError,\n });\n }\n\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.storage.getById(id);\n if (!item) return null;\n\n await this.storage.update(id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n\n return this.storage.getById(id);\n }\n\n async retryScope(scope?: string): Promise<void> {\n const failedItems = await this.storage.getAll({\n status: 'failed',\n scope,\n });\n\n for (const item of failedItems) {\n await this.storage.update(item.id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n }\n }\n\n async cancel(id: string): Promise<boolean> {\n const item = await this.storage.getById(id);\n if (!item) return false;\n\n await this.storage.remove(id);\n return true;\n }\n\n async clear(scope?: string): Promise<void> {\n await this.storage.clear(scope);\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.storage.getAll(filter);\n }\n\n async getStats(): Promise<QueueStats> {\n return this.storage.getStats();\n }\n}\n","import { MutationHandler } from '../types';\n\n/**\n * Mutation Registry for registering and retrieving type-safe mutation handlers\n */\nexport class Registry {\n private handlers: Map<string, MutationHandler<any, any, any>> = new Map();\n\n /**\n * Register a mutation handler for a given mutation type\n * @param type Unique mutation identifier (e.g. 'SEND_MESSAGE', 'UPDATE_PROFILE')\n * @param handler Async function to execute the mutation\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): void {\n if (this.handlers.has(type)) {\n console.warn(\n `[expo-offline-sync] Handler for mutation type \"${type}\" was already registered and has been overwritten.`\n );\n }\n this.handlers.set(type, handler);\n }\n\n /**\n * Get a registered handler by type\n */\n get<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string\n ): MutationHandler<TPayload, TResult, TMeta> | undefined {\n return this.handlers.get(type);\n }\n\n /**\n * Check if a handler is registered\n */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /**\n * Unregister a mutation handler\n */\n unregister(type: string): boolean {\n return this.handlers.delete(type);\n }\n\n /**\n * Clear all registered handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n","import {\n MutationContext,\n MutationItem,\n NetworkMonitor,\n RetryPolicy,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HttpError } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\n\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 5,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffFactor: 2,\n jitter: true,\n shouldRetry: (error: any) => {\n if (error instanceof HttpError || (error && typeof error.status === 'number')) {\n const status = error.status;\n // Do not retry 4xx errors except 401 (auth issue), 408 (timeout), 429 (rate limit)\n if (status >= 400 && status < 500 && status !== 401 && status !== 408 && status !== 429) {\n return false;\n }\n }\n return true;\n },\n};\n\nexport interface SchedulerOptions {\n queueManager: QueueManager;\n registry: Registry;\n networkMonitor: NetworkMonitor;\n events: TypedEventEmitter<any>;\n retryPolicy?: Partial<RetryPolicy>;\n maxConcurrentScopes?: number;\n onRequest?: (item: MutationItem) => Promise<void> | void;\n onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n}\n\nexport class Scheduler {\n private queueManager: QueueManager;\n private registry: Registry;\n private networkMonitor: NetworkMonitor;\n private events: TypedEventEmitter<any>;\n private retryPolicy: RetryPolicy;\n private maxConcurrentScopes: number;\n private activeScopeMap: Map<string, Promise<void>> = new Map();\n private isPaused = false;\n private isSyncing = false;\n private abortController: AbortController = new AbortController();\n\n get syncing(): boolean {\n return this.isSyncing;\n }\n\n private onRequest?: (item: MutationItem) => Promise<void> | void;\n private onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n private onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n\n constructor(options: SchedulerOptions) {\n this.queueManager = options.queueManager;\n this.registry = options.registry;\n this.networkMonitor = options.networkMonitor;\n this.events = options.events;\n this.retryPolicy = { ...DEFAULT_RETRY_POLICY, ...options.retryPolicy };\n this.maxConcurrentScopes = options.maxConcurrentScopes ?? 3;\n this.onRequest = options.onRequest;\n this.onResponse = options.onResponse;\n this.onRollback = options.onRollback;\n }\n\n calculateBackoff(attemptCount: number): number {\n const { initialDelayMs, maxDelayMs, backoffFactor, jitter } = this.retryPolicy;\n const baseDelay = initialDelayMs * Math.pow(backoffFactor, Math.max(0, attemptCount - 1));\n const cappedDelay = Math.min(baseDelay, maxDelayMs);\n\n if (jitter) {\n // 0.8x to 1.2x randomization to prevent thundering herd\n const factor = 0.8 + Math.random() * 0.4;\n return Math.floor(cappedDelay * factor);\n }\n\n return Math.floor(cappedDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n this.abortController.signal.addEventListener('abort', () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n pause(): void {\n this.isPaused = true;\n }\n\n resume(): void {\n this.isPaused = false;\n this.processQueue();\n }\n\n /**\n * Main entry point to process pending queue across scopes\n */\n async processQueue(): Promise<void> {\n if (this.isPaused) return;\n if (!this.networkMonitor.isOnline) return;\n\n const stats = await this.queueManager.getStats();\n if (stats.pending === 0 && stats.syncing === 0) {\n this.events.emit('syncComplete');\n return;\n }\n\n this.isSyncing = true;\n const promises: Promise<void>[] = [];\n\n // Process available scopes up to maxConcurrentScopes\n for (const scope of stats.scopes) {\n if (this.activeScopeMap.size >= this.maxConcurrentScopes) {\n break;\n }\n\n if (!this.activeScopeMap.has(scope)) {\n const promise = this.processScope(scope).finally(() => {\n this.activeScopeMap.delete(scope);\n if (this.activeScopeMap.size === 0) {\n this.isSyncing = false;\n this.events.emit('syncComplete');\n }\n });\n this.activeScopeMap.set(scope, promise);\n promises.push(promise);\n } else {\n const existingPromise = this.activeScopeMap.get(scope);\n if (existingPromise) {\n promises.push(existingPromise);\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Sequentially process items for a specific scope (Deterministic FIFO)\n */\n private async processScope(scope: string): Promise<void> {\n while (!this.isPaused && this.networkMonitor.isOnline) {\n const pendingItems = await this.queueManager.getPending(scope);\n if (pendingItems.length === 0) {\n break;\n }\n\n const item = pendingItems[0];\n const success = await this.executeItem(item);\n\n if (!success) {\n // If execution failed and requires retry, break out of this scope loop\n // so it doesn't spin infinitely; it will be retried on next backoff or queue sync\n break;\n }\n }\n }\n\n /**\n * Executes a single mutation item\n * Returns true if completed or definitively failed, false if waiting for backoff retry\n */\n async executeItem(item: MutationItem): Promise<boolean> {\n if (this.isPaused || !this.networkMonitor.isOnline) {\n return false;\n }\n\n const handler = this.registry.get(item.type);\n if (!handler) {\n const err = new Error(\n `[expo-offline-sync] No mutation handler registered for type \"${item.type}\". Please call client.register(\"${item.type}\", handler)`\n );\n await this.queueManager.markFailed(item.id, err, false, item.attemptCount);\n this.events.emit('syncError', item, err);\n this.events.emit('rollback', item, err);\n if (this.onRollback) {\n try {\n await this.onRollback(item, err);\n } catch {}\n }\n return true; // Mark as resolved (unrecoverable error)\n }\n\n // Mark syncing\n await this.queueManager.markSyncing(item.id);\n this.events.emit('syncStart', item);\n\n if (this.onRequest) {\n try {\n await this.onRequest(item);\n } catch (err) {\n console.warn('[expo-offline-sync] Error in onRequest hook:', err);\n }\n }\n\n const context: MutationContext = {\n mutationId: item.id,\n type: item.type,\n scope: item.scope,\n attemptCount: item.attemptCount + 1,\n meta: item.meta,\n idempotencyKey: item.idempotencyKey,\n signal: this.abortController.signal,\n };\n\n try {\n const result = await handler(item.payload, context);\n\n // Successfully processed\n await this.queueManager.markCompleted(item.id);\n\n if (this.onResponse) {\n try {\n await this.onResponse(item, result);\n } catch {}\n }\n\n this.events.emit('syncSuccess', item, result);\n return true;\n } catch (err: any) {\n const error: Error = err instanceof Error ? err : new Error(String(err));\n const nextAttempt = item.attemptCount + 1;\n const maxRetries = item.maxRetries ?? this.retryPolicy.maxRetries;\n\n let shouldRetry = nextAttempt < maxRetries;\n if (shouldRetry && this.retryPolicy.shouldRetry) {\n try {\n shouldRetry = Boolean(await this.retryPolicy.shouldRetry(err, item));\n } catch {\n shouldRetry = true;\n }\n }\n\n if (shouldRetry) {\n // Will retry: mark pending with incremented attempt\n await this.queueManager.markFailed(item.id, error, true, nextAttempt);\n this.events.emit('syncError', item, error);\n\n const delay = this.calculateBackoff(nextAttempt);\n await this.sleep(delay);\n\n return false; // Scope will retry later\n } else {\n // Fatal / Exceeded max retries: mark permanently failed and trigger rollback\n await this.queueManager.markFailed(item.id, error, false, nextAttempt);\n this.events.emit('syncError', item, error);\n this.events.emit('rollback', item, error);\n\n if (this.onRollback) {\n try {\n await this.onRollback(item, error);\n } catch {}\n }\n\n return true; // Proceed to next item in scope to prevent deadlock\n }\n }\n }\n\n destroy(): void {\n this.pause();\n this.abortController.abort();\n this.activeScopeMap.clear();\n }\n}\n","import { NetInfoNetworkMonitor } from '../network/NetInfoNetworkMonitor';\nimport { MemoryAdapter } from '../storage/MemoryAdapter';\nimport { SQLiteAdapter } from '../storage/SQLiteAdapter';\nimport {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationHandler,\n MutationItem,\n MutationStatus,\n NetworkMonitor,\n OfflineSyncEventMap,\n OfflineSyncOptions,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE, HttpExecutor } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\nimport { Scheduler } from './Scheduler';\n\nexport class OfflineSyncClient {\n readonly storage: StorageAdapter;\n readonly network: NetworkMonitor;\n readonly registry: Registry;\n readonly queue: QueueManager;\n readonly scheduler: Scheduler;\n readonly events: TypedEventEmitter<OfflineSyncEventMap>;\n\n private httpExecutor: HttpExecutor;\n private autoSync: boolean;\n private unsubscribeNetwork: (() => void) | null = null;\n private isDestroyed = false;\n\n constructor(options: OfflineSyncOptions = {}) {\n this.events = new TypedEventEmitter<OfflineSyncEventMap>();\n this.autoSync = options.autoSync ?? true;\n\n // 1. Initialize Storage Adapter\n if (options.storage) {\n this.storage = options.storage;\n } else {\n // Default to SQLiteAdapter, fallback to MemoryAdapter\n try {\n this.storage = new SQLiteAdapter();\n } catch {\n this.storage = new MemoryAdapter();\n }\n }\n\n // 2. Initialize Network Monitor\n if (options.networkMonitor) {\n this.network = options.networkMonitor;\n } else {\n this.network = new NetInfoNetworkMonitor();\n }\n\n // 3. Initialize Registry\n this.registry = new Registry();\n\n // 4. Initialize Built-in HTTP Executor and register handler\n this.httpExecutor = new HttpExecutor({\n getHeaders: options.getHeaders,\n });\n this.registry.register<HttpMutationPayload>(HTTP_MUTATION_TYPE, async (payload, context) => {\n return this.httpExecutor.execute(payload, context);\n });\n\n // 5. Initialize Queue Manager\n this.queue = new QueueManager({\n storage: this.storage,\n events: this.events,\n defaultScope: options.defaultScope,\n defaultMaxRetries: options.retryPolicy?.maxRetries,\n });\n\n // 6. Initialize Scheduler\n this.scheduler = new Scheduler({\n queueManager: this.queue,\n registry: this.registry,\n networkMonitor: this.network,\n events: this.events,\n retryPolicy: options.retryPolicy,\n maxConcurrentScopes: options.maxConcurrentScopes,\n onRequest: options.onRequest,\n onResponse: options.onResponse,\n onRollback: options.onRollback,\n });\n\n // 7. Setup AutoSync on Network Reconnection\n this.unsubscribeNetwork = this.network.subscribe((isOnline) => {\n this.events.emit('onlineChange', isOnline);\n if (isOnline && this.autoSync) {\n this.sync();\n }\n });\n\n // Initial check and optional immediate sync\n if (this.autoSync && this.network.isOnline) {\n setTimeout(() => this.sync(), 0);\n }\n }\n\n get isOnline(): boolean {\n return this.network.isOnline;\n }\n\n get isSyncing(): boolean {\n return this.scheduler.syncing;\n }\n\n /**\n * Register a typed mutation handler\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): this {\n this.registry.register(type, handler);\n return this;\n }\n\n /**\n * Enqueue a custom typed mutation\n */\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const item = await this.queue.enqueue<TPayload, TMeta>(options);\n\n // Auto-sync if online\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Enqueue a direct HTTP request (zero-boilerplate REST mutation)\n */\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const item = await this.queue.enqueueHttp<TMeta>(options);\n\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Manually trigger queue processing\n */\n async sync(): Promise<void> {\n if (this.isDestroyed) return;\n return this.scheduler.processQueue();\n }\n\n /**\n * Pause queue processing\n */\n pause(): void {\n this.scheduler.pause();\n }\n\n /**\n * Resume queue processing\n */\n resume(): void {\n this.scheduler.resume();\n }\n\n /**\n * Manually retry a specific failed mutation\n */\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.queue.retryItem(id);\n if (item && this.autoSync && this.network.isOnline) {\n this.sync();\n }\n return item;\n }\n\n /**\n * Manually retry all failed mutations in a scope (or globally)\n */\n async retryScope(scope?: string): Promise<void> {\n await this.queue.retryScope(scope);\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n }\n\n /**\n * Cancel and remove an item from the queue\n */\n async cancel(id: string): Promise<boolean> {\n return this.queue.cancel(id);\n }\n\n /**\n * Clear all items or a specific scope\n */\n async clear(scope?: string): Promise<void> {\n await this.queue.clear(scope);\n }\n\n /**\n * Get pending items\n */\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.queue.getPending(scope);\n }\n\n /**\n * Get all items matching filter\n */\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.queue.getAll(filter);\n }\n\n /**\n * Get queue statistics\n */\n async getStats(): Promise<QueueStats> {\n return this.queue.getStats();\n }\n\n /**\n * Subscribe to client lifecycle events\n */\n on<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): () => void {\n return this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from client lifecycle events\n */\n off<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): void {\n this.events.off(event, listener);\n }\n\n /**\n * Destroy client and clean up listeners\n */\n destroy(): void {\n this.isDestroyed = true;\n if (this.unsubscribeNetwork) {\n this.unsubscribeNetwork();\n this.unsubscribeNetwork = null;\n }\n this.scheduler.destroy();\n this.events.removeAllListeners();\n }\n}\n","import { NetworkMonitor } from '../types';\n\n/**\n * Controllable manual network monitor for testing, mocks, or custom connectivity checks\n */\nexport class ManualNetworkMonitor implements NetworkMonitor {\n private _isOnline: boolean;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n\n constructor(initialOnline = true) {\n this._isOnline = initialOnline;\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n setOnline(status: boolean): void {\n if (this._isOnline !== status) {\n this._isOnline = status;\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n return this._isOnline;\n }\n}\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { OfflineSyncClient } from '../core/OfflineSyncClient';\nimport { OfflineSyncOptions } from '../types';\n\nconst OfflineSyncContext = createContext<OfflineSyncClient | null>(null);\n\nexport interface OfflineSyncProviderProps {\n client?: OfflineSyncClient;\n options?: OfflineSyncOptions;\n children: React.ReactNode;\n}\n\nexport const OfflineSyncProvider: React.FC<OfflineSyncProviderProps> = ({\n client: externalClient,\n options,\n children,\n}) => {\n const [internalClient, setInternalClient] = useState<OfflineSyncClient | null>(null);\n\n useEffect(() => {\n if (!externalClient) {\n const client = new OfflineSyncClient(options);\n setInternalClient(client);\n return () => {\n client.destroy();\n };\n }\n return undefined;\n }, [externalClient]);\n\n const activeClient = useMemo(() => {\n return externalClient || internalClient;\n }, [externalClient, internalClient]);\n\n if (!activeClient) {\n return null;\n }\n\n return (\n <OfflineSyncContext.Provider value={activeClient}>\n {children}\n </OfflineSyncContext.Provider>\n );\n};\n\nexport function useOfflineSync(): OfflineSyncClient {\n const context = useContext(OfflineSyncContext);\n if (!context) {\n throw new Error(\n '[expo-offline-sync] useOfflineSync must be used within an <OfflineSyncProvider>'\n );\n }\n return context;\n}\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { MutationItem } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseOfflineMutationOptions<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n type: string;\n scope?: string;\n maxRetries?: number;\n priority?: number;\n meta?: TMeta;\n /**\n * Called immediately upon queueing for instantaneous optimistic UI updates\n */\n onMutate?: (payload: TPayload, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation finishes successfully\n */\n onSuccess?: (result: TResult, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation permanently fails (max retries exceeded or unrecoverable error)\n */\n onError?: (error: Error, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n}\n\nexport interface UseOfflineMutationResult<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n mutate: (payload: TPayload, overrideMeta?: TMeta) => void;\n mutateAsync: (payload: TPayload, overrideMeta?: TMeta) => Promise<MutationItem<TPayload, TMeta>>;\n status: 'idle' | 'pending' | 'success' | 'error';\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n error: Error | null;\n data: TResult | null;\n reset: () => void;\n}\n\nexport function useOfflineMutation<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n options: UseOfflineMutationOptions<TPayload, TResult, TMeta>\n): UseOfflineMutationResult<TPayload, TResult, TMeta> {\n const client = useOfflineSync();\n const [status, setStatus] = useState<'idle' | 'pending' | 'success' | 'error'>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<TResult | null>(null);\n\n // Store active item IDs from this hook instance to match events\n const pendingItemIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n const unsubSuccess = client.on('syncSuccess', (item, result) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('success');\n setData(result);\n if (options.onSuccess) {\n options.onSuccess(result, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n const unsubRollback = client.on('rollback', (item, err) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('error');\n setError(err);\n if (options.onError) {\n options.onError(err, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n return () => {\n unsubSuccess();\n unsubRollback();\n };\n }, [client, options]);\n\n const mutateAsync = useCallback(\n async (payload: TPayload, overrideMeta?: TMeta): Promise<MutationItem<TPayload, TMeta>> => {\n setStatus('pending');\n setError(null);\n\n const mergedMeta = { ...options.meta, ...overrideMeta } as TMeta;\n\n const item = await client.enqueue<TPayload, TMeta>({\n type: options.type,\n payload,\n scope: options.scope,\n meta: mergedMeta,\n maxRetries: options.maxRetries,\n priority: options.priority,\n onOptimistic: (enqueuedItem) => {\n pendingItemIdsRef.current.add(enqueuedItem.id);\n if (options.onMutate) {\n options.onMutate(payload, enqueuedItem);\n }\n },\n });\n\n return item;\n },\n [client, options]\n );\n\n const mutate = useCallback(\n (payload: TPayload, overrideMeta?: TMeta) => {\n mutateAsync(payload, overrideMeta).catch((err) => {\n console.error('[expo-offline-sync] mutate error:', err);\n });\n },\n [mutateAsync]\n );\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n pendingItemIdsRef.current.clear();\n }, []);\n\n return {\n mutate,\n mutateAsync,\n status,\n isPending: status === 'pending',\n isSuccess: status === 'success',\n isError: status === 'error',\n error,\n data,\n reset,\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { QueueStats } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseQueueStatusResult {\n isOnline: boolean;\n isSyncing: boolean;\n stats: QueueStats;\n sync: () => Promise<void>;\n retryAll: (scope?: string) => Promise<void>;\n clear: (scope?: string) => Promise<void>;\n}\n\nexport function useQueueStatus(): UseQueueStatusResult {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n const [isSyncing, setIsSyncing] = useState<boolean>(false);\n const [stats, setStats] = useState<QueueStats>({\n total: 0,\n pending: 0,\n syncing: 0,\n failed: 0,\n completed: 0,\n scopes: [],\n });\n\n const refreshStats = useCallback(async () => {\n try {\n const currentStats = await client.getStats();\n setStats(currentStats);\n } catch {}\n }, [client]);\n\n useEffect(() => {\n refreshStats();\n\n const unsubOnline = client.on('onlineChange', (online) => {\n setIsOnline(online);\n refreshStats();\n });\n\n const unsubEnqueued = client.on('enqueued', () => {\n refreshStats();\n });\n\n const unsubStart = client.on('syncStart', () => {\n setIsSyncing(true);\n refreshStats();\n });\n\n const unsubSuccess = client.on('syncSuccess', () => {\n refreshStats();\n });\n\n const unsubError = client.on('syncError', () => {\n refreshStats();\n });\n\n const unsubComplete = client.on('syncComplete', () => {\n setIsSyncing(false);\n refreshStats();\n });\n\n return () => {\n unsubOnline();\n unsubEnqueued();\n unsubStart();\n unsubSuccess();\n unsubError();\n unsubComplete();\n };\n }, [client, refreshStats]);\n\n const sync = useCallback(async () => {\n await client.sync();\n await refreshStats();\n }, [client, refreshStats]);\n\n const retryAll = useCallback(\n async (scope?: string) => {\n await client.retryScope(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n const clear = useCallback(\n async (scope?: string) => {\n await client.clear(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n return {\n isOnline,\n isSyncing,\n stats,\n sync,\n retryAll,\n clear,\n };\n}\n","import { useEffect, useState } from 'react';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport function useIsOnline(): boolean {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n\n useEffect(() => {\n setIsOnline(client.isOnline);\n return client.on('onlineChange', (online) => {\n setIsOnline(online);\n });\n }, [client]);\n\n return isOnline;\n}\n","import { OfflineSyncClient } from '../core/OfflineSyncClient';\n\nexport const DEFAULT_BACKGROUND_TASK_NAME = 'EXPO_OFFLINE_SYNC_BACKGROUND_TASK';\n\nexport interface BackgroundSyncOptions {\n taskName?: string;\n minimumInterval?: number; // In seconds (default: 15 minutes = 900 seconds)\n stopOnTerminate?: boolean;\n startOnBoot?: boolean;\n}\n\n/**\n * Registers background synchronization using expo-background-fetch and expo-task-manager\n * Automatically replays pending offline mutations even when the app is in the background or killed\n */\nexport async function registerBackgroundSync(\n client: OfflineSyncClient,\n options: BackgroundSyncOptions = {}\n): Promise<void> {\n const taskName = options.taskName ?? DEFAULT_BACKGROUND_TASK_NAME;\n const minimumInterval = options.minimumInterval ?? 15 * 60; // 15 mins\n const stopOnTerminate = options.stopOnTerminate ?? false;\n const startOnBoot = options.startOnBoot ?? true;\n\n let TaskManager: any;\n let BackgroundFetch: any;\n\n try {\n TaskManager = await import('expo-task-manager');\n BackgroundFetch = await import('expo-background-fetch');\n } catch {\n throw new Error(\n '[expo-offline-sync] Background sync requires \"expo-task-manager\" and \"expo-background-fetch\". Please run: npx expo install expo-task-manager expo-background-fetch'\n );\n }\n\n // 1. Define the background task if not already defined\n if (!TaskManager.isTaskDefined(taskName)) {\n TaskManager.defineTask(taskName, async () => {\n try {\n const stats = await client.getStats();\n if (stats.pending > 0 || stats.syncing > 0) {\n await client.sync();\n return BackgroundFetch.BackgroundFetchResult.NewData;\n }\n return BackgroundFetch.BackgroundFetchResult.NoData;\n } catch (err) {\n console.error('[expo-offline-sync] Background sync error:', err);\n return BackgroundFetch.BackgroundFetchResult.Failed;\n }\n });\n }\n\n // 2. Register with BackgroundFetch\n await BackgroundFetch.registerTaskAsync(taskName, {\n minimumInterval,\n stopOnTerminate,\n startOnBoot,\n });\n}\n\n/**\n * Unregisters the background sync task\n */\nexport async function unregisterBackgroundSync(taskName = DEFAULT_BACKGROUND_TASK_NAME): Promise<void> {\n try {\n const BackgroundFetch = await import('expo-background-fetch');\n const TaskManager = await import('expo-task-manager');\n const isRegistered = await TaskManager.isTaskRegisteredAsync(taskName);\n if (isRegistered) {\n await BackgroundFetch.unregisterTaskAsync(taskName);\n }\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to unregister background task:', err);\n }\n}\n"]}
|
|
1
|
+
{"version":3,"sources":["../src/network/NetInfoNetworkMonitor.ts","../src/storage/MemoryAdapter.ts","../src/storage/SQLiteAdapter.ts","../src/core/EventEmitter.ts","../src/core/HttpExecutor.ts","../src/core/QueueManager.ts","../src/core/Registry.ts","../src/core/Scheduler.ts","../src/core/OfflineSyncClient.ts","../src/network/NetworkMonitor.ts","../src/react/OfflineSyncProvider.tsx","../src/react/useOfflineMutation.ts","../src/react/useQueueStatus.ts","../src/react/useIsOnline.ts","../src/plugins/backgroundSync.ts"],"names":["state","contentType","useState","useEffect","useCallback"],"mappings":"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","file":"index.js","sourcesContent":["import { NetworkMonitor } from '../types';\n\nexport class NetInfoNetworkMonitor implements NetworkMonitor {\n private _isOnline = true;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n private unsubscribeNetInfo: (() => void) | null = null;\n private unsubscribeAppState: (() => void) | null = null;\n\n constructor() {\n this.init();\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n private async init() {\n // 1. Try to initialize @react-native-community/netinfo\n let NetInfo: any = null;\n try {\n NetInfo = (await import('@react-native-community/netinfo')).default;\n } catch {\n // NetInfo not available (e.g. running in web or test environment)\n }\n\n if (NetInfo && typeof NetInfo.addEventListener === 'function') {\n const state = await NetInfo.fetch();\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n\n this.unsubscribeNetInfo = NetInfo.addEventListener((state: any) => {\n this.updateStatus(Boolean(state.isConnected && state.isInternetReachable !== false));\n });\n } else if (typeof window !== 'undefined' && typeof window.addEventListener === 'function') {\n // Web fallback\n this.updateStatus(navigator.onLine);\n const onOnline = () => this.updateStatus(true);\n const onOffline = () => this.updateStatus(false);\n window.addEventListener('online', onOnline);\n window.addEventListener('offline', onOffline);\n this.unsubscribeNetInfo = () => {\n window.removeEventListener('online', onOnline);\n window.removeEventListener('offline', onOffline);\n };\n }\n\n // 2. Listen to React Native AppState for foreground resume sync\n try {\n const { AppState } = await import('react-native');\n if (AppState && typeof AppState.addEventListener === 'function') {\n const subscription = AppState.addEventListener('change', async (nextState: string) => {\n if (nextState === 'active') {\n await this.check();\n }\n });\n this.unsubscribeAppState = () => subscription?.remove?.();\n }\n } catch {\n // Running outside React Native\n }\n }\n\n private updateStatus(newStatus: boolean) {\n if (this._isOnline !== newStatus) {\n this._isOnline = newStatus;\n for (const listener of this.listeners) {\n listener(newStatus);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n try {\n const NetInfo = (await import('@react-native-community/netinfo')).default;\n if (NetInfo && typeof NetInfo.fetch === 'function') {\n const state = await NetInfo.fetch();\n const online = Boolean(state.isConnected && state.isInternetReachable !== false);\n this.updateStatus(online);\n return online;\n }\n } catch {\n // Fallback\n }\n\n if (typeof navigator !== 'undefined' && typeof navigator.onLine === 'boolean') {\n this.updateStatus(navigator.onLine);\n return navigator.onLine;\n }\n\n return this._isOnline;\n }\n\n destroy(): void {\n if (this.unsubscribeNetInfo) {\n this.unsubscribeNetInfo();\n this.unsubscribeNetInfo = null;\n }\n if (this.unsubscribeAppState) {\n this.unsubscribeAppState();\n this.unsubscribeAppState = null;\n }\n this.listeners.clear();\n }\n}\n\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\n/**\n * In-memory storage adapter for testing, mocking, and environments without SQLite\n */\nexport class MemoryAdapter implements StorageAdapter {\n private items: Map<string, MutationItem> = new Map();\n\n async init(): Promise<void> {\n // No-op for in-memory\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n // Clone item to avoid mutation by reference\n this.items.set(item.id, JSON.parse(JSON.stringify(item)));\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n const list = Array.from(this.items.values()).filter((item) => {\n const isPending = item.status === 'pending' || item.status === 'syncing';\n if (!isPending) return false;\n if (scope && item.scope !== scope) return false;\n return true;\n });\n\n // Sort by priority (higher first), then createdAt (older first / FIFO)\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n const item = this.items.get(id);\n if (!item) return null;\n return JSON.parse(JSON.stringify(item));\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n const existing = this.items.get(id);\n if (!existing) return;\n\n const updated: MutationItem = {\n ...existing,\n ...updates,\n updatedAt: Date.now(),\n };\n this.items.set(id, updated);\n }\n\n async remove(id: string): Promise<void> {\n this.items.delete(id);\n }\n\n async clear(scope?: string): Promise<void> {\n if (!scope) {\n this.items.clear();\n return;\n }\n\n for (const [id, item] of this.items.entries()) {\n if (item.scope === scope) {\n this.items.delete(id);\n }\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n let list = Array.from(this.items.values());\n\n if (filter?.status) {\n list = list.filter((i) => i.status === filter.status);\n }\n if (filter?.scope) {\n list = list.filter((i) => i.scope === filter.scope);\n }\n\n return list.sort((a, b) => {\n const priorityDiff = (b.priority ?? 0) - (a.priority ?? 0);\n if (priorityDiff !== 0) return priorityDiff;\n return a.createdAt - b.createdAt;\n });\n }\n\n async getStats(): Promise<QueueStats> {\n const all = Array.from(this.items.values());\n const scopes = new Set<string>();\n\n let pending = 0;\n let syncing = 0;\n let failed = 0;\n let completed = 0;\n\n for (const item of all) {\n scopes.add(item.scope);\n if (item.status === 'pending') pending++;\n else if (item.status === 'syncing') syncing++;\n else if (item.status === 'failed') failed++;\n else if (item.status === 'completed') completed++;\n }\n\n return {\n total: all.length,\n pending,\n syncing,\n failed,\n completed,\n scopes: Array.from(scopes),\n };\n }\n}\n\n","import { MutationItem, MutationStatus, QueueStats, StorageAdapter } from '../types';\n\nexport interface SQLiteAdapterOptions {\n /**\n * Database filename (defaults to 'expo_offline_sync.db')\n */\n databaseName?: string;\n /**\n * Table name for the queue (defaults to 'offline_mutation_queue')\n */\n tableName?: string;\n /**\n * Direct SQLite database instance (e.g. from useSQLiteContext() or SQLite.openDatabaseAsync)\n */\n database?: any;\n}\n\ninterface RawMutationRow {\n id: string;\n type: string;\n scope: string;\n payload: string;\n meta: string | null;\n status: string;\n attempt_count: number;\n max_retries: number;\n created_at: number;\n updated_at: number;\n last_error: string | null;\n idempotency_key: string;\n priority: number;\n}\n\n/**\n * High-performance Expo SQLite Storage Adapter\n * Compatible with modern Expo SDK 51/52+ SQLite API\n */\nexport class SQLiteAdapter implements StorageAdapter {\n private db: any = null;\n private databaseName: string;\n private tableName: string;\n private initPromise: Promise<void> | null = null;\n\n constructor(options: SQLiteAdapterOptions = {}) {\n this.databaseName = options.databaseName ?? 'expo_offline_sync.db';\n this.tableName = options.tableName ?? 'offline_mutation_queue';\n if (options.database) {\n this.db = options.database;\n }\n }\n\n async init(): Promise<void> {\n if (this.initPromise) return this.initPromise;\n\n this.initPromise = (async () => {\n if (!this.db) {\n let SQLite: any;\n try {\n SQLite = await import('expo-sqlite');\n } catch {\n throw new Error(\n '[expo-offline-sync] expo-sqlite package is not installed. Please run \"npx expo install expo-sqlite\" or provide a custom StorageAdapter (e.g. MemoryAdapter).'\n );\n }\n\n if (typeof SQLite.openDatabaseAsync === 'function') {\n this.db = await SQLite.openDatabaseAsync(this.databaseName);\n } else if (typeof SQLite.openDatabaseSync === 'function') {\n this.db = SQLite.openDatabaseSync(this.databaseName);\n } else {\n throw new Error(\n '[expo-offline-sync] Incompatible expo-sqlite version detected. Please upgrade to Expo SDK 51 or newer.'\n );\n }\n }\n\n // Configure WAL mode for high concurrency\n await this.db.execAsync(`\n PRAGMA journal_mode = WAL;\n CREATE TABLE IF NOT EXISTS ${this.tableName} (\n id TEXT PRIMARY KEY,\n type TEXT NOT NULL,\n scope TEXT NOT NULL,\n payload TEXT NOT NULL,\n meta TEXT,\n status TEXT NOT NULL DEFAULT 'pending',\n attempt_count INTEGER NOT NULL DEFAULT 0,\n max_retries INTEGER NOT NULL DEFAULT 5,\n created_at INTEGER NOT NULL,\n updated_at INTEGER NOT NULL,\n last_error TEXT,\n idempotency_key TEXT NOT NULL,\n priority INTEGER DEFAULT 0\n );\n CREATE INDEX IF NOT EXISTS idx_${this.tableName}_lookup \n ON ${this.tableName}(status, scope, priority DESC, created_at ASC);\n `);\n })();\n\n return this.initPromise;\n }\n\n private rowToItem(row: RawMutationRow): MutationItem {\n let payload: any = null;\n try {\n payload = JSON.parse(row.payload);\n } catch {\n payload = row.payload;\n }\n\n let meta: any = undefined;\n if (row.meta) {\n try {\n meta = JSON.parse(row.meta);\n } catch {\n meta = undefined;\n }\n }\n\n let lastError: any = undefined;\n if (row.last_error) {\n try {\n lastError = JSON.parse(row.last_error);\n } catch {\n lastError = { message: row.last_error };\n }\n }\n\n return {\n id: row.id,\n type: row.type,\n scope: row.scope,\n payload,\n meta,\n status: row.status as MutationStatus,\n attemptCount: row.attempt_count,\n maxRetries: row.max_retries,\n createdAt: row.created_at,\n updatedAt: row.updated_at,\n lastError,\n idempotencyKey: row.idempotency_key,\n priority: row.priority,\n };\n }\n\n async enqueue<P = any, M = any>(item: MutationItem<P, M>): Promise<void> {\n await this.init();\n\n const sql = `\n INSERT OR REPLACE INTO ${this.tableName} (\n id, type, scope, payload, meta, status,\n attempt_count, max_retries, created_at, updated_at,\n last_error, idempotency_key, priority\n ) VALUES (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)\n `;\n\n const params = [\n item.id,\n item.type,\n item.scope,\n JSON.stringify(item.payload),\n item.meta !== undefined ? JSON.stringify(item.meta) : null,\n item.status,\n item.attemptCount,\n item.maxRetries,\n item.createdAt,\n item.updatedAt,\n item.lastError ? JSON.stringify(item.lastError) : null,\n item.idempotencyKey,\n item.priority ?? 0,\n ];\n\n await this.db.runAsync(sql, params);\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `\n SELECT * FROM ${this.tableName}\n WHERE status IN ('pending', 'syncing')\n `;\n const params: any[] = [];\n\n if (scope) {\n sql += ` AND scope = ?`;\n params.push(scope);\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n await this.init();\n\n const sql = `SELECT * FROM ${this.tableName} WHERE id = ?`;\n const row: RawMutationRow | null = await this.db.getFirstAsync(sql, [id]);\n if (!row) return null;\n\n return this.rowToItem(row);\n }\n\n async update(id: string, updates: Partial<MutationItem>): Promise<void> {\n await this.init();\n\n const fields: string[] = [];\n const values: any[] = [];\n\n if (updates.status !== undefined) {\n fields.push('status = ?');\n values.push(updates.status);\n }\n if (updates.attemptCount !== undefined) {\n fields.push('attempt_count = ?');\n values.push(updates.attemptCount);\n }\n if (updates.lastError !== undefined) {\n fields.push('last_error = ?');\n values.push(updates.lastError ? JSON.stringify(updates.lastError) : null);\n }\n if (updates.payload !== undefined) {\n fields.push('payload = ?');\n values.push(JSON.stringify(updates.payload));\n }\n if (updates.meta !== undefined) {\n fields.push('meta = ?');\n values.push(updates.meta ? JSON.stringify(updates.meta) : null);\n }\n if (updates.priority !== undefined) {\n fields.push('priority = ?');\n values.push(updates.priority);\n }\n\n fields.push('updated_at = ?');\n values.push(Date.now());\n\n values.push(id);\n\n const sql = `UPDATE ${this.tableName} SET ${fields.join(', ')} WHERE id = ?`;\n await this.db.runAsync(sql, values);\n }\n\n async remove(id: string): Promise<void> {\n await this.init();\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE id = ?`, [id]);\n }\n\n async clear(scope?: string): Promise<void> {\n await this.init();\n if (scope) {\n await this.db.runAsync(`DELETE FROM ${this.tableName} WHERE scope = ?`, [scope]);\n } else {\n await this.db.runAsync(`DELETE FROM ${this.tableName}`);\n }\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n await this.init();\n\n let sql = `SELECT * FROM ${this.tableName}`;\n const conditions: string[] = [];\n const params: any[] = [];\n\n if (filter?.status) {\n conditions.push('status = ?');\n params.push(filter.status);\n }\n if (filter?.scope) {\n conditions.push('scope = ?');\n params.push(filter.scope);\n }\n\n if (conditions.length > 0) {\n sql += ` WHERE ${conditions.join(' AND ')}`;\n }\n\n sql += ` ORDER BY priority DESC, created_at ASC`;\n\n const rows: RawMutationRow[] = await this.db.getAllAsync(sql, params);\n return rows.map((r) => this.rowToItem(r));\n }\n\n async getStats(): Promise<QueueStats> {\n await this.init();\n\n const sql = `\n SELECT \n COUNT(*) as total,\n SUM(CASE WHEN status = 'pending' THEN 1 ELSE 0 END) as pending,\n SUM(CASE WHEN status = 'syncing' THEN 1 ELSE 0 END) as syncing,\n SUM(CASE WHEN status = 'failed' THEN 1 ELSE 0 END) as failed,\n SUM(CASE WHEN status = 'completed' THEN 1 ELSE 0 END) as completed\n FROM ${this.tableName}\n `;\n\n const row: any = await this.db.getFirstAsync(sql);\n\n const scopesRows: { scope: string }[] = await this.db.getAllAsync(\n `SELECT DISTINCT scope FROM ${this.tableName}`\n );\n\n return {\n total: row?.total ?? 0,\n pending: row?.pending ?? 0,\n syncing: row?.syncing ?? 0,\n failed: row?.failed ?? 0,\n completed: row?.completed ?? 0,\n scopes: scopesRows.map((s) => s.scope),\n };\n }\n}\n\n","type Listener<T extends any[] = any[]> = (...args: T) => void;\n\n/**\n * Lightweight, zero-dependency, typed EventEmitter compatible with React Native & Hermes\n */\nexport class TypedEventEmitter<Events extends Record<string, any>> {\n private listeners: Map<keyof Events, Set<Listener>> = new Map();\n\n on<K extends keyof Events>(event: K, listener: Events[K]): () => void {\n if (!this.listeners.has(event)) {\n this.listeners.set(event, new Set());\n }\n const set = this.listeners.get(event)!;\n set.add(listener as Listener);\n\n return () => {\n this.off(event, listener);\n };\n }\n\n off<K extends keyof Events>(event: K, listener: Events[K]): void {\n const set = this.listeners.get(event);\n if (set) {\n set.delete(listener as Listener);\n if (set.size === 0) {\n this.listeners.delete(event);\n }\n }\n }\n\n emit<K extends keyof Events>(event: K, ...args: Parameters<Events[K]>): void {\n const set = this.listeners.get(event);\n if (!set) return;\n\n for (const listener of Array.from(set)) {\n try {\n listener(...args);\n } catch (err) {\n console.error(`[expo-offline-sync] Error in event listener for \"${String(event)}\":`, err);\n }\n }\n }\n\n removeAllListeners(event?: keyof Events): void {\n if (event) {\n this.listeners.delete(event);\n } else {\n this.listeners.clear();\n }\n }\n\n listenerCount(event: keyof Events): number {\n return this.listeners.get(event)?.size ?? 0;\n }\n}\n\n","import { HttpMutationPayload, MutationContext } from '../types';\n\nexport const HTTP_MUTATION_TYPE = '__EXPO_OFFLINE_SYNC_HTTP__';\n\nexport class HttpError extends Error {\n status: number;\n statusText: string;\n data: any;\n\n constructor(status: number, statusText: string, data: any) {\n super(`HTTP Request failed with status ${status}: ${statusText}`);\n this.name = 'HttpError';\n this.status = status;\n this.statusText = statusText;\n this.data = data;\n }\n}\n\nexport interface HttpExecutorOptions {\n getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n}\n\n/**\n * Built-in executor for direct HTTP requests\n */\nexport class HttpExecutor {\n private getHeaders?: () => Record<string, string> | Promise<Record<string, string>>;\n\n constructor(options: HttpExecutorOptions = {}) {\n this.getHeaders = options.getHeaders;\n }\n\n async execute(payload: HttpMutationPayload, context: MutationContext): Promise<any> {\n const { url, method = 'POST', headers = {}, body, timeoutMs = 30000 } = payload;\n\n // 1. Resolve dynamic headers (e.g. fresh auth token)\n let dynamicHeaders: Record<string, string> = {};\n if (this.getHeaders) {\n try {\n dynamicHeaders = await this.getHeaders();\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to resolve dynamic headers:', err);\n }\n }\n\n const mergedHeaders: Record<string, string> = {\n 'Content-Type': 'application/json',\n 'Idempotency-Key': context.idempotencyKey,\n ...dynamicHeaders,\n ...headers,\n };\n\n // 2. Setup timeout controller\n const controller = new AbortController();\n const timeoutId = setTimeout(() => controller.abort(), timeoutMs);\n\n // Link context signal if aborted externally\n if (context.signal) {\n context.signal.addEventListener('abort', () => controller.abort());\n }\n\n try {\n const fetchOptions: RequestInit = {\n method,\n headers: mergedHeaders,\n signal: controller.signal,\n };\n\n if (body !== undefined && method !== 'GET') {\n fetchOptions.body = typeof body === 'string' ? body : JSON.stringify(body);\n }\n\n const response = await fetch(url, fetchOptions);\n\n if (!response.ok) {\n let responseData: any;\n const contentType = response.headers.get('content-type') || '';\n try {\n if (contentType.includes('application/json')) {\n responseData = await response.json();\n } else {\n responseData = await response.text();\n }\n } catch {\n responseData = null;\n }\n\n throw new HttpError(response.status, response.statusText, responseData);\n }\n\n const contentType = response.headers.get('content-type') || '';\n if (contentType.includes('application/json')) {\n return await response.json();\n }\n return await response.text();\n } finally {\n clearTimeout(timeoutId);\n }\n }\n}\n\n","import {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationItem,\n MutationStatus,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE } from './HttpExecutor';\n\nexport function generateUUID(): string {\n if (typeof crypto !== 'undefined' && typeof crypto.randomUUID === 'function') {\n return crypto.randomUUID();\n }\n return 'xxxxxxxx-xxxx-4xxx-yxxx-xxxxxxxxxxxx'.replace(/[xy]/g, (c) => {\n const r = (Math.random() * 16) | 0;\n const v = c === 'x' ? r : (r & 0x3) | 0x8;\n return v.toString(16);\n });\n}\n\nexport interface QueueManagerOptions {\n storage: StorageAdapter;\n events: TypedEventEmitter<any>;\n defaultScope?: string;\n defaultMaxRetries?: number;\n}\n\nexport class QueueManager {\n private storage: StorageAdapter;\n private events: TypedEventEmitter<any>;\n private defaultScope: string;\n private defaultMaxRetries: number;\n\n constructor(options: QueueManagerOptions) {\n this.storage = options.storage;\n this.events = options.events;\n this.defaultScope = options.defaultScope ?? 'default';\n this.defaultMaxRetries = options.defaultMaxRetries ?? 5;\n }\n\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const now = Date.now();\n const id = generateUUID();\n const idempotencyKey = options.idempotencyKey ?? generateUUID();\n const scope = options.scope ?? this.defaultScope;\n const maxRetries = options.maxRetries ?? this.defaultMaxRetries;\n\n const item: MutationItem<TPayload, TMeta> = {\n id,\n type: options.type,\n scope,\n payload: options.payload,\n meta: options.meta,\n status: 'pending',\n attemptCount: 0,\n maxRetries,\n createdAt: now,\n updatedAt: now,\n idempotencyKey,\n priority: options.priority ?? 0,\n };\n\n // Save to durable storage\n await this.storage.enqueue(item);\n\n // Call optimistic callback immediately\n if (options.onOptimistic) {\n try {\n options.onOptimistic(item);\n } catch (err) {\n console.error('[expo-offline-sync] Error in onOptimistic callback:', err);\n }\n }\n\n // Emit event\n this.events.emit('enqueued', item);\n\n return item;\n }\n\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const payload: HttpMutationPayload = {\n url: options.url,\n method: options.method ?? 'POST',\n headers: options.headers,\n body: options.body,\n timeoutMs: options.timeoutMs,\n };\n\n return this.enqueue<HttpMutationPayload, TMeta>({\n type: HTTP_MUTATION_TYPE,\n payload,\n scope: options.scope,\n meta: options.meta,\n maxRetries: options.maxRetries,\n idempotencyKey: options.idempotencyKey,\n onOptimistic: options.onOptimistic,\n onRollback: options.onRollback,\n onSuccess: options.onSuccess,\n });\n }\n\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.storage.getPending(scope);\n }\n\n async getById(id: string): Promise<MutationItem | null> {\n return this.storage.getById(id);\n }\n\n async markSyncing(id: string): Promise<void> {\n await this.storage.update(id, {\n status: 'syncing',\n });\n }\n\n async markCompleted(id: string): Promise<void> {\n // We remove completed items to keep storage lean and fast\n await this.storage.remove(id);\n }\n\n async markFailed(id: string, error: Error, willRetry: boolean, attemptCount: number): Promise<void> {\n const status: MutationStatus = willRetry ? 'pending' : 'failed';\n const lastError = {\n message: error.message || 'Unknown error',\n code: (error as any).code || (error as any).status,\n stack: error.stack,\n };\n\n await this.storage.update(id, {\n status,\n attemptCount,\n lastError,\n });\n }\n\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.storage.getById(id);\n if (!item) return null;\n\n await this.storage.update(id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n\n return this.storage.getById(id);\n }\n\n async retryScope(scope?: string): Promise<void> {\n const failedItems = await this.storage.getAll({\n status: 'failed',\n scope,\n });\n\n for (const item of failedItems) {\n await this.storage.update(item.id, {\n status: 'pending',\n attemptCount: 0,\n lastError: undefined,\n });\n }\n }\n\n async cancel(id: string): Promise<boolean> {\n const item = await this.storage.getById(id);\n if (!item) return false;\n\n await this.storage.remove(id);\n return true;\n }\n\n async clear(scope?: string): Promise<void> {\n await this.storage.clear(scope);\n }\n\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.storage.getAll(filter);\n }\n\n async getStats(): Promise<QueueStats> {\n return this.storage.getStats();\n }\n}\n\n","import { MutationHandler } from '../types';\n\n/**\n * Mutation Registry for registering and retrieving type-safe mutation handlers\n */\nexport class Registry {\n private handlers: Map<string, MutationHandler<any, any, any>> = new Map();\n\n /**\n * Register a mutation handler for a given mutation type\n * @param type Unique mutation identifier (e.g. 'SEND_MESSAGE', 'UPDATE_PROFILE')\n * @param handler Async function to execute the mutation\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): void {\n if (this.handlers.has(type)) {\n console.warn(\n `[expo-offline-sync] Handler for mutation type \"${type}\" was already registered and has been overwritten.`\n );\n }\n this.handlers.set(type, handler);\n }\n\n /**\n * Get a registered handler by type\n */\n get<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string\n ): MutationHandler<TPayload, TResult, TMeta> | undefined {\n return this.handlers.get(type);\n }\n\n /**\n * Check if a handler is registered\n */\n has(type: string): boolean {\n return this.handlers.has(type);\n }\n\n /**\n * Unregister a mutation handler\n */\n unregister(type: string): boolean {\n return this.handlers.delete(type);\n }\n\n /**\n * Clear all registered handlers\n */\n clear(): void {\n this.handlers.clear();\n }\n}\n\n","import {\n MutationContext,\n MutationItem,\n NetworkMonitor,\n RetryPolicy,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HttpError } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\n\nexport const DEFAULT_RETRY_POLICY: RetryPolicy = {\n maxRetries: 5,\n initialDelayMs: 1000,\n maxDelayMs: 30000,\n backoffFactor: 2,\n jitter: true,\n shouldRetry: (error: any) => {\n if (error instanceof HttpError || (error && typeof error.status === 'number')) {\n const status = error.status;\n // Do not retry 4xx errors except 401 (auth issue), 408 (timeout), 429 (rate limit)\n if (status >= 400 && status < 500 && status !== 401 && status !== 408 && status !== 429) {\n return false;\n }\n }\n return true;\n },\n};\n\nexport interface SchedulerOptions {\n queueManager: QueueManager;\n registry: Registry;\n networkMonitor: NetworkMonitor;\n events: TypedEventEmitter<any>;\n retryPolicy?: Partial<RetryPolicy>;\n maxConcurrentScopes?: number;\n onRequest?: (item: MutationItem) => Promise<void> | void;\n onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n}\n\nexport class Scheduler {\n private queueManager: QueueManager;\n private registry: Registry;\n private networkMonitor: NetworkMonitor;\n private events: TypedEventEmitter<any>;\n private retryPolicy: RetryPolicy;\n private maxConcurrentScopes: number;\n private activeScopeMap: Map<string, Promise<void>> = new Map();\n private isPaused = false;\n private isSyncing = false;\n private abortController: AbortController = new AbortController();\n\n get syncing(): boolean {\n return this.isSyncing;\n }\n\n private onRequest?: (item: MutationItem) => Promise<void> | void;\n private onResponse?: (item: MutationItem, response: any) => Promise<void> | void;\n private onRollback?: (item: MutationItem, error: Error) => Promise<void> | void;\n\n constructor(options: SchedulerOptions) {\n this.queueManager = options.queueManager;\n this.registry = options.registry;\n this.networkMonitor = options.networkMonitor;\n this.events = options.events;\n this.retryPolicy = { ...DEFAULT_RETRY_POLICY, ...options.retryPolicy };\n this.maxConcurrentScopes = options.maxConcurrentScopes ?? 3;\n this.onRequest = options.onRequest;\n this.onResponse = options.onResponse;\n this.onRollback = options.onRollback;\n }\n\n calculateBackoff(attemptCount: number): number {\n const { initialDelayMs, maxDelayMs, backoffFactor, jitter } = this.retryPolicy;\n const baseDelay = initialDelayMs * Math.pow(backoffFactor, Math.max(0, attemptCount - 1));\n const cappedDelay = Math.min(baseDelay, maxDelayMs);\n\n if (jitter) {\n // 0.8x to 1.2x randomization to prevent thundering herd\n const factor = 0.8 + Math.random() * 0.4;\n return Math.floor(cappedDelay * factor);\n }\n\n return Math.floor(cappedDelay);\n }\n\n private sleep(ms: number): Promise<void> {\n return new Promise((resolve) => {\n const timer = setTimeout(resolve, ms);\n this.abortController.signal.addEventListener('abort', () => {\n clearTimeout(timer);\n resolve();\n });\n });\n }\n\n pause(): void {\n this.isPaused = true;\n }\n\n resume(): void {\n this.isPaused = false;\n this.processQueue();\n }\n\n /**\n * Main entry point to process pending queue across scopes\n */\n async processQueue(): Promise<void> {\n if (this.isPaused) return;\n if (!this.networkMonitor.isOnline) return;\n\n const stats = await this.queueManager.getStats();\n if (stats.pending === 0 && stats.syncing === 0) {\n this.events.emit('syncComplete');\n return;\n }\n\n this.isSyncing = true;\n const promises: Promise<void>[] = [];\n\n // Process available scopes up to maxConcurrentScopes\n for (const scope of stats.scopes) {\n if (this.activeScopeMap.size >= this.maxConcurrentScopes) {\n break;\n }\n\n if (!this.activeScopeMap.has(scope)) {\n const promise = this.processScope(scope).finally(() => {\n this.activeScopeMap.delete(scope);\n if (this.activeScopeMap.size === 0) {\n this.isSyncing = false;\n this.events.emit('syncComplete');\n }\n });\n this.activeScopeMap.set(scope, promise);\n promises.push(promise);\n } else {\n const existingPromise = this.activeScopeMap.get(scope);\n if (existingPromise) {\n promises.push(existingPromise);\n }\n }\n }\n\n await Promise.all(promises);\n }\n\n /**\n * Sequentially process items for a specific scope (Deterministic FIFO)\n */\n private async processScope(scope: string): Promise<void> {\n while (!this.isPaused && this.networkMonitor.isOnline) {\n const pendingItems = await this.queueManager.getPending(scope);\n if (pendingItems.length === 0) {\n break;\n }\n\n const item = pendingItems[0];\n const success = await this.executeItem(item);\n\n if (!success) {\n // If execution failed and requires retry, break out of this scope loop\n // so it doesn't spin infinitely; it will be retried on next backoff or queue sync\n break;\n }\n }\n }\n\n /**\n * Executes a single mutation item\n * Returns true if completed or definitively failed, false if waiting for backoff retry\n */\n async executeItem(item: MutationItem): Promise<boolean> {\n if (this.isPaused || !this.networkMonitor.isOnline) {\n return false;\n }\n\n const handler = this.registry.get(item.type);\n if (!handler) {\n const err = new Error(\n `[expo-offline-sync] No mutation handler registered for type \"${item.type}\". Please call client.register(\"${item.type}\", handler)`\n );\n await this.queueManager.markFailed(item.id, err, false, item.attemptCount);\n this.events.emit('syncError', item, err);\n this.events.emit('rollback', item, err);\n if (this.onRollback) {\n try {\n await this.onRollback(item, err);\n } catch {}\n }\n return true; // Mark as resolved (unrecoverable error)\n }\n\n // Mark syncing\n await this.queueManager.markSyncing(item.id);\n this.events.emit('syncStart', item);\n\n if (this.onRequest) {\n try {\n await this.onRequest(item);\n } catch (err) {\n console.warn('[expo-offline-sync] Error in onRequest hook:', err);\n }\n }\n\n const context: MutationContext = {\n mutationId: item.id,\n type: item.type,\n scope: item.scope,\n attemptCount: item.attemptCount + 1,\n meta: item.meta,\n idempotencyKey: item.idempotencyKey,\n signal: this.abortController.signal,\n };\n\n try {\n const result = await handler(item.payload, context);\n\n // Successfully processed\n await this.queueManager.markCompleted(item.id);\n\n if (this.onResponse) {\n try {\n await this.onResponse(item, result);\n } catch {}\n }\n\n this.events.emit('syncSuccess', item, result);\n return true;\n } catch (err: any) {\n const error: Error = err instanceof Error ? err : new Error(String(err));\n const nextAttempt = item.attemptCount + 1;\n const maxRetries = item.maxRetries ?? this.retryPolicy.maxRetries;\n\n let shouldRetry = nextAttempt < maxRetries;\n if (shouldRetry && this.retryPolicy.shouldRetry) {\n try {\n shouldRetry = Boolean(await this.retryPolicy.shouldRetry(err, item));\n } catch {\n shouldRetry = true;\n }\n }\n\n if (shouldRetry) {\n // Will retry: mark pending with incremented attempt\n await this.queueManager.markFailed(item.id, error, true, nextAttempt);\n this.events.emit('syncError', item, error);\n\n const delay = this.calculateBackoff(nextAttempt);\n await this.sleep(delay);\n\n return false; // Scope will retry later\n } else {\n // Fatal / Exceeded max retries: mark permanently failed and trigger rollback\n await this.queueManager.markFailed(item.id, error, false, nextAttempt);\n this.events.emit('syncError', item, error);\n this.events.emit('rollback', item, error);\n\n if (this.onRollback) {\n try {\n await this.onRollback(item, error);\n } catch {}\n }\n\n return true; // Proceed to next item in scope to prevent deadlock\n }\n }\n }\n\n destroy(): void {\n this.pause();\n this.abortController.abort();\n this.activeScopeMap.clear();\n }\n}\n","import { NetInfoNetworkMonitor } from '../network/NetInfoNetworkMonitor';\nimport { MemoryAdapter } from '../storage/MemoryAdapter';\nimport { SQLiteAdapter } from '../storage/SQLiteAdapter';\nimport {\n EnqueueHttpOptions,\n EnqueueOptions,\n HttpMutationPayload,\n MutationHandler,\n MutationItem,\n MutationStatus,\n NetworkMonitor,\n OfflineSyncEventMap,\n OfflineSyncOptions,\n QueueStats,\n StorageAdapter,\n} from '../types';\nimport { TypedEventEmitter } from './EventEmitter';\nimport { HTTP_MUTATION_TYPE, HttpExecutor } from './HttpExecutor';\nimport { QueueManager } from './QueueManager';\nimport { Registry } from './Registry';\nimport { Scheduler } from './Scheduler';\n\nexport class OfflineSyncClient {\n readonly storage: StorageAdapter;\n readonly network: NetworkMonitor;\n readonly registry: Registry;\n readonly queue: QueueManager;\n readonly scheduler: Scheduler;\n readonly events: TypedEventEmitter<OfflineSyncEventMap>;\n\n private httpExecutor: HttpExecutor;\n private autoSync: boolean;\n private unsubscribeNetwork: (() => void) | null = null;\n private isDestroyed = false;\n\n constructor(options: OfflineSyncOptions = {}) {\n this.events = new TypedEventEmitter<OfflineSyncEventMap>();\n this.autoSync = options.autoSync ?? true;\n\n // 1. Initialize Storage Adapter\n if (options.storage) {\n this.storage = options.storage;\n } else {\n // Default to SQLiteAdapter, fallback to MemoryAdapter\n try {\n this.storage = new SQLiteAdapter();\n } catch {\n this.storage = new MemoryAdapter();\n }\n }\n\n // 2. Initialize Network Monitor\n if (options.networkMonitor) {\n this.network = options.networkMonitor;\n } else {\n this.network = new NetInfoNetworkMonitor();\n }\n\n // 3. Initialize Registry\n this.registry = new Registry();\n\n // 4. Initialize Built-in HTTP Executor and register handler\n this.httpExecutor = new HttpExecutor({\n getHeaders: options.getHeaders,\n });\n this.registry.register<HttpMutationPayload>(HTTP_MUTATION_TYPE, async (payload, context) => {\n return this.httpExecutor.execute(payload, context);\n });\n\n // 5. Initialize Queue Manager\n this.queue = new QueueManager({\n storage: this.storage,\n events: this.events,\n defaultScope: options.defaultScope,\n defaultMaxRetries: options.retryPolicy?.maxRetries,\n });\n\n // 6. Initialize Scheduler\n this.scheduler = new Scheduler({\n queueManager: this.queue,\n registry: this.registry,\n networkMonitor: this.network,\n events: this.events,\n retryPolicy: options.retryPolicy,\n maxConcurrentScopes: options.maxConcurrentScopes,\n onRequest: options.onRequest,\n onResponse: options.onResponse,\n onRollback: options.onRollback,\n });\n\n // 7. Setup AutoSync on Network Reconnection\n this.unsubscribeNetwork = this.network.subscribe((isOnline) => {\n this.events.emit('onlineChange', isOnline);\n if (isOnline && this.autoSync) {\n this.sync();\n }\n });\n\n // Initial check and optional immediate sync\n if (this.autoSync && this.network.isOnline) {\n setTimeout(() => this.sync(), 0);\n }\n }\n\n get isOnline(): boolean {\n return this.network.isOnline;\n }\n\n get isSyncing(): boolean {\n return this.scheduler.syncing;\n }\n\n /**\n * Register a typed mutation handler\n */\n register<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n type: string,\n handler: MutationHandler<TPayload, TResult, TMeta>\n ): this {\n this.registry.register(type, handler);\n return this;\n }\n\n /**\n * Enqueue a custom typed mutation\n */\n async enqueue<TPayload = any, TMeta = Record<string, any>>(\n options: EnqueueOptions<TPayload, TMeta>\n ): Promise<MutationItem<TPayload, TMeta>> {\n const item = await this.queue.enqueue<TPayload, TMeta>(options);\n\n // Auto-sync if online\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Enqueue a direct HTTP request (zero-boilerplate REST mutation)\n */\n async enqueueHttp<TMeta = Record<string, any>>(\n options: EnqueueHttpOptions<TMeta>\n ): Promise<MutationItem<HttpMutationPayload, TMeta>> {\n const item = await this.queue.enqueueHttp<TMeta>(options);\n\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n\n return item;\n }\n\n /**\n * Manually trigger queue processing\n */\n async sync(): Promise<void> {\n if (this.isDestroyed) return;\n return this.scheduler.processQueue();\n }\n\n /**\n * Pause queue processing\n */\n pause(): void {\n this.scheduler.pause();\n }\n\n /**\n * Resume queue processing\n */\n resume(): void {\n this.scheduler.resume();\n }\n\n /**\n * Manually retry a specific failed mutation\n */\n async retryItem(id: string): Promise<MutationItem | null> {\n const item = await this.queue.retryItem(id);\n if (item && this.autoSync && this.network.isOnline) {\n this.sync();\n }\n return item;\n }\n\n /**\n * Manually retry all failed mutations in a scope (or globally)\n */\n async retryScope(scope?: string): Promise<void> {\n await this.queue.retryScope(scope);\n if (this.autoSync && this.network.isOnline) {\n this.sync();\n }\n }\n\n /**\n * Cancel and remove an item from the queue\n */\n async cancel(id: string): Promise<boolean> {\n return this.queue.cancel(id);\n }\n\n /**\n * Clear all items or a specific scope\n */\n async clear(scope?: string): Promise<void> {\n await this.queue.clear(scope);\n }\n\n /**\n * Get pending items\n */\n async getPending(scope?: string): Promise<MutationItem[]> {\n return this.queue.getPending(scope);\n }\n\n /**\n * Get all items matching filter\n */\n async getAll(filter?: { status?: MutationStatus; scope?: string }): Promise<MutationItem[]> {\n return this.queue.getAll(filter);\n }\n\n /**\n * Get queue statistics\n */\n async getStats(): Promise<QueueStats> {\n return this.queue.getStats();\n }\n\n /**\n * Subscribe to client lifecycle events\n */\n on<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): () => void {\n return this.events.on(event, listener);\n }\n\n /**\n * Unsubscribe from client lifecycle events\n */\n off<K extends keyof OfflineSyncEventMap>(event: K, listener: OfflineSyncEventMap[K]): void {\n this.events.off(event, listener);\n }\n\n /**\n * Destroy client and clean up listeners\n */\n destroy(): void {\n this.isDestroyed = true;\n if (this.unsubscribeNetwork) {\n this.unsubscribeNetwork();\n this.unsubscribeNetwork = null;\n }\n this.scheduler.destroy();\n this.events.removeAllListeners();\n }\n}\n","import { NetworkMonitor } from '../types';\n\n/**\n * Controllable manual network monitor for testing, mocks, or custom connectivity checks\n */\nexport class ManualNetworkMonitor implements NetworkMonitor {\n private _isOnline: boolean;\n private listeners: Set<(isOnline: boolean) => void> = new Set();\n\n constructor(initialOnline = true) {\n this._isOnline = initialOnline;\n }\n\n get isOnline(): boolean {\n return this._isOnline;\n }\n\n setOnline(status: boolean): void {\n if (this._isOnline !== status) {\n this._isOnline = status;\n for (const listener of this.listeners) {\n listener(status);\n }\n }\n }\n\n subscribe(listener: (isOnline: boolean) => void): () => void {\n this.listeners.add(listener);\n return () => {\n this.listeners.delete(listener);\n };\n }\n\n async check(): Promise<boolean> {\n return this._isOnline;\n }\n}\n\n","import React, { createContext, useContext, useEffect, useMemo, useState } from 'react';\nimport { OfflineSyncClient } from '../core/OfflineSyncClient';\nimport { OfflineSyncOptions } from '../types';\n\nconst OfflineSyncContext = createContext<OfflineSyncClient | null>(null);\n\nexport interface OfflineSyncProviderProps {\n client?: OfflineSyncClient;\n options?: OfflineSyncOptions;\n children: React.ReactNode;\n}\n\nexport const OfflineSyncProvider: React.FC<OfflineSyncProviderProps> = ({\n client: externalClient,\n options,\n children,\n}) => {\n const [internalClient, setInternalClient] = useState<OfflineSyncClient | null>(null);\n\n useEffect(() => {\n if (!externalClient) {\n const client = new OfflineSyncClient(options);\n setInternalClient(client);\n return () => {\n client.destroy();\n };\n }\n return undefined;\n }, [externalClient]);\n\n const activeClient = useMemo(() => {\n return externalClient || internalClient;\n }, [externalClient, internalClient]);\n\n if (!activeClient) {\n return null;\n }\n\n return (\n <OfflineSyncContext.Provider value={activeClient}>\n {children}\n </OfflineSyncContext.Provider>\n );\n};\n\nexport function useOfflineSync(): OfflineSyncClient {\n const context = useContext(OfflineSyncContext);\n if (!context) {\n throw new Error(\n '[expo-offline-sync] useOfflineSync must be used within an <OfflineSyncProvider>'\n );\n }\n return context;\n}\n\n","import { useCallback, useEffect, useRef, useState } from 'react';\nimport { MutationItem } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseOfflineMutationOptions<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n type: string;\n scope?: string;\n maxRetries?: number;\n priority?: number;\n meta?: TMeta;\n /**\n * Called immediately upon queueing for instantaneous optimistic UI updates\n */\n onMutate?: (payload: TPayload, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation finishes successfully\n */\n onSuccess?: (result: TResult, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n /**\n * Called when mutation permanently fails (max retries exceeded or unrecoverable error)\n */\n onError?: (error: Error, item: MutationItem<TPayload, TMeta>) => void | Promise<void>;\n}\n\nexport interface UseOfflineMutationResult<TPayload = any, TResult = any, TMeta = Record<string, any>> {\n mutate: (payload: TPayload, overrideMeta?: TMeta) => void;\n mutateAsync: (payload: TPayload, overrideMeta?: TMeta) => Promise<MutationItem<TPayload, TMeta>>;\n status: 'idle' | 'pending' | 'success' | 'error';\n isPending: boolean;\n isSuccess: boolean;\n isError: boolean;\n error: Error | null;\n data: TResult | null;\n reset: () => void;\n}\n\nexport function useOfflineMutation<TPayload = any, TResult = any, TMeta = Record<string, any>>(\n options: UseOfflineMutationOptions<TPayload, TResult, TMeta>\n): UseOfflineMutationResult<TPayload, TResult, TMeta> {\n const client = useOfflineSync();\n const [status, setStatus] = useState<'idle' | 'pending' | 'success' | 'error'>('idle');\n const [error, setError] = useState<Error | null>(null);\n const [data, setData] = useState<TResult | null>(null);\n\n // Store active item IDs from this hook instance to match events\n const pendingItemIdsRef = useRef<Set<string>>(new Set());\n\n useEffect(() => {\n const unsubSuccess = client.on('syncSuccess', (item, result) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('success');\n setData(result);\n if (options.onSuccess) {\n options.onSuccess(result, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n const unsubRollback = client.on('rollback', (item, err) => {\n if (pendingItemIdsRef.current.has(item.id)) {\n pendingItemIdsRef.current.delete(item.id);\n setStatus('error');\n setError(err);\n if (options.onError) {\n options.onError(err, item as MutationItem<TPayload, TMeta>);\n }\n }\n });\n\n return () => {\n unsubSuccess();\n unsubRollback();\n };\n }, [client, options]);\n\n const mutateAsync = useCallback(\n async (payload: TPayload, overrideMeta?: TMeta): Promise<MutationItem<TPayload, TMeta>> => {\n setStatus('pending');\n setError(null);\n\n const mergedMeta = { ...options.meta, ...overrideMeta } as TMeta;\n\n const item = await client.enqueue<TPayload, TMeta>({\n type: options.type,\n payload,\n scope: options.scope,\n meta: mergedMeta,\n maxRetries: options.maxRetries,\n priority: options.priority,\n onOptimistic: (enqueuedItem) => {\n pendingItemIdsRef.current.add(enqueuedItem.id);\n if (options.onMutate) {\n options.onMutate(payload, enqueuedItem);\n }\n },\n });\n\n return item;\n },\n [client, options]\n );\n\n const mutate = useCallback(\n (payload: TPayload, overrideMeta?: TMeta) => {\n mutateAsync(payload, overrideMeta).catch((err) => {\n console.error('[expo-offline-sync] mutate error:', err);\n });\n },\n [mutateAsync]\n );\n\n const reset = useCallback(() => {\n setStatus('idle');\n setError(null);\n setData(null);\n pendingItemIdsRef.current.clear();\n }, []);\n\n return {\n mutate,\n mutateAsync,\n status,\n isPending: status === 'pending',\n isSuccess: status === 'success',\n isError: status === 'error',\n error,\n data,\n reset,\n };\n}\n","import { useCallback, useEffect, useState } from 'react';\nimport { QueueStats } from '../types';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport interface UseQueueStatusResult {\n isOnline: boolean;\n isSyncing: boolean;\n stats: QueueStats;\n sync: () => Promise<void>;\n retryAll: (scope?: string) => Promise<void>;\n clear: (scope?: string) => Promise<void>;\n}\n\nexport function useQueueStatus(): UseQueueStatusResult {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n const [isSyncing, setIsSyncing] = useState<boolean>(false);\n const [stats, setStats] = useState<QueueStats>({\n total: 0,\n pending: 0,\n syncing: 0,\n failed: 0,\n completed: 0,\n scopes: [],\n });\n\n const refreshStats = useCallback(async () => {\n try {\n const currentStats = await client.getStats();\n setStats(currentStats);\n } catch {}\n }, [client]);\n\n useEffect(() => {\n refreshStats();\n\n const unsubOnline = client.on('onlineChange', (online) => {\n setIsOnline(online);\n refreshStats();\n });\n\n const unsubEnqueued = client.on('enqueued', () => {\n refreshStats();\n });\n\n const unsubStart = client.on('syncStart', () => {\n setIsSyncing(true);\n refreshStats();\n });\n\n const unsubSuccess = client.on('syncSuccess', () => {\n refreshStats();\n });\n\n const unsubError = client.on('syncError', () => {\n refreshStats();\n });\n\n const unsubComplete = client.on('syncComplete', () => {\n setIsSyncing(false);\n refreshStats();\n });\n\n return () => {\n unsubOnline();\n unsubEnqueued();\n unsubStart();\n unsubSuccess();\n unsubError();\n unsubComplete();\n };\n }, [client, refreshStats]);\n\n const sync = useCallback(async () => {\n await client.sync();\n await refreshStats();\n }, [client, refreshStats]);\n\n const retryAll = useCallback(\n async (scope?: string) => {\n await client.retryScope(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n const clear = useCallback(\n async (scope?: string) => {\n await client.clear(scope);\n await refreshStats();\n },\n [client, refreshStats]\n );\n\n return {\n isOnline,\n isSyncing,\n stats,\n sync,\n retryAll,\n clear,\n };\n}\n\n","import { useEffect, useState } from 'react';\nimport { useOfflineSync } from './OfflineSyncProvider';\n\nexport function useIsOnline(): boolean {\n const client = useOfflineSync();\n const [isOnline, setIsOnline] = useState<boolean>(client.isOnline);\n\n useEffect(() => {\n setIsOnline(client.isOnline);\n return client.on('onlineChange', (online) => {\n setIsOnline(online);\n });\n }, [client]);\n\n return isOnline;\n}\n\n","import { OfflineSyncClient } from '../core/OfflineSyncClient';\n\nexport const DEFAULT_BACKGROUND_TASK_NAME = 'EXPO_OFFLINE_SYNC_BACKGROUND_TASK';\n\nexport interface BackgroundSyncOptions {\n taskName?: string;\n minimumInterval?: number; // In seconds (default: 15 minutes = 900 seconds)\n stopOnTerminate?: boolean;\n startOnBoot?: boolean;\n}\n\n/**\n * Registers background synchronization using expo-background-fetch and expo-task-manager\n * Automatically replays pending offline mutations even when the app is in the background or killed\n */\nexport async function registerBackgroundSync(\n client: OfflineSyncClient,\n options: BackgroundSyncOptions = {}\n): Promise<void> {\n const taskName = options.taskName ?? DEFAULT_BACKGROUND_TASK_NAME;\n const minimumInterval = options.minimumInterval ?? 15 * 60; // 15 mins\n const stopOnTerminate = options.stopOnTerminate ?? false;\n const startOnBoot = options.startOnBoot ?? true;\n\n let TaskManager: any;\n let BackgroundFetch: any;\n\n try {\n TaskManager = await import('expo-task-manager');\n BackgroundFetch = await import('expo-background-fetch');\n } catch {\n throw new Error(\n '[expo-offline-sync] Background sync requires \"expo-task-manager\" and \"expo-background-fetch\". Please run: npx expo install expo-task-manager expo-background-fetch'\n );\n }\n\n // 1. Define the background task if not already defined\n if (!TaskManager.isTaskDefined(taskName)) {\n TaskManager.defineTask(taskName, async () => {\n try {\n const stats = await client.getStats();\n if (stats.pending > 0 || stats.syncing > 0) {\n await client.sync();\n return BackgroundFetch.BackgroundFetchResult.NewData;\n }\n return BackgroundFetch.BackgroundFetchResult.NoData;\n } catch (err) {\n console.error('[expo-offline-sync] Background sync error:', err);\n return BackgroundFetch.BackgroundFetchResult.Failed;\n }\n });\n }\n\n // 2. Register with BackgroundFetch\n await BackgroundFetch.registerTaskAsync(taskName, {\n minimumInterval,\n stopOnTerminate,\n startOnBoot,\n });\n}\n\n/**\n * Unregisters the background sync task\n */\nexport async function unregisterBackgroundSync(taskName = DEFAULT_BACKGROUND_TASK_NAME): Promise<void> {\n try {\n const BackgroundFetch = await import('expo-background-fetch');\n const TaskManager = await import('expo-task-manager');\n const isRegistered = await TaskManager.isTaskRegisteredAsync(taskName);\n if (isRegistered) {\n await BackgroundFetch.unregisterTaskAsync(taskName);\n }\n } catch (err) {\n console.warn('[expo-offline-sync] Failed to unregister background task:', err);\n }\n}\n"]}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "expo-offline-sync",
|
|
3
|
-
"version": "1.0.
|
|
3
|
+
"version": "1.0.1",
|
|
4
4
|
"description": "Deterministic, scoped, engine-agnostic offline mutation & request queue for Expo & React Native with SQLite persistence, optimistic updates, and background sync.",
|
|
5
5
|
"main": "./dist/index.cjs",
|
|
6
6
|
"module": "./dist/index.js",
|