Skip to content

Offline Queue ​

The offline queue lets you save failed requests and replay them when connectivity is restored.

Storage Backends ​

BackendEnvironmentPersistence
MemoryStorageNode.js, Browser, EdgeLost on process exit
LocalStorageBackendBrowserSurvives page reloads
CustomAnyImplement QueueStorage interface

Usage ​

typescript
import { OfflineQueue, MemoryStorage, LocalStorageBackend } from 'fetch-smartly';

// Node.js
const queue = new OfflineQueue(new MemoryStorage());

// Browser (persists across reloads)
const queue = new OfflineQueue(new LocalStorageBackend());

Enqueue Failed Requests ​

typescript
import { fetchWithRetry, NetworkError } from 'fetch-smartly';

try {
  await fetchWithRetry({ url: 'https://api.example.com/submit', method: 'POST', body: '{"data":1}' });
} catch (error) {
  if (error instanceof NetworkError) {
    queue.enqueue({ url: 'https://api.example.com/submit', method: 'POST', body: '{"data":1}' });
    console.log('Request queued for later');
  }
}

Replay When Online ​

typescript
const successes = await queue.replay(async (entry) => {
  const res = await fetch(entry.url, {
    method: entry.method,
    headers: entry.headers,
    body: entry.body,
  });
  if (!res.ok) throw new Error(`HTTP ${res.status}`);
});

console.log(`${successes} replayed, ${queue.size} still queued`);

Successful entries are removed automatically. Failed entries remain for the next replay attempt.

Custom Storage ​

typescript
import type { QueueStorage, QueueEntry } from 'fetch-smartly';

class RedisStorage implements QueueStorage {
  getAll(): QueueEntry[] { /* ... */ }
  add(entry: QueueEntry): void { /* ... */ }
  remove(id: string): void { /* ... */ }
  clear(): void { /* ... */ }
}

const queue = new OfflineQueue(new RedisStorage());

API ​

MethodDescription
queue.enqueue(options)Add a request to the queue
queue.getAll()Get all queued entries
queue.sizeNumber of queued requests
queue.remove(id)Remove a specific entry
queue.replay(executor)Replay all, returns success count
queue.clear()Remove all entries

Released under the MIT License.