Skip to main content

Version 1.0

Description — Quick reference for all API changes in cbl-reactnative version 1.0
Related Content — Release Notes | Using Logs

AT A GLANCE

Version 1.0 introduces several API changes:

  1. Log Sink API - Replaces Database.setLogLevel() with LogSinks API
  2. Listener Token API - New token.remove() replaces removeChangeListener()
  3. New ReplicatorConfiguration - Collections passed in constructor

Breaking Changes

Listener Token Return Type (TypeScript)

We changed all addChangeListener functions to return a ListenerToken instead of a string, enabling the new token.remove() API and aligning with other platforms.

This is a breaking change only for TypeScript code that explicitly typed the token as string. JavaScript users and untyped TypeScript won't be affected.

TypeScript Migration Example:

// BEFORE (TypeScript compilation error in 1.0)
const token: string = await collection.addChangeListener(listener);

// AFTER
const token: ListenerToken = await collection.addChangeListener(listener);
token.remove();

The existing removeChangeListener(token) methods remain available for backward compatibility but are deprecated.


Deprecated APIs

1. Logging API

The old Database.setLogLevel() API is deprecated and replaced with the new LogSinks API.

OLD (Deprecated):

// This API is deprecated
await db.setLogLevel(LogDomain.ALL, LogLevel.VERBOSE);
await Database.setLogLevel(LogDomain.DATABASE, LogLevel.INFO);

NEW (Required in 1.0):

import { LogSinks, LogLevel, LogDomain } from 'cbl-reactnative';

await LogSinks.setConsole({
level: LogLevel.VERBOSE,
domains: [LogDomain.ALL]
});
Important

The old and new logging APIs cannot be used in tandem. If you are migrating to version 1.0, you must replace all instances of Database.setLogLevel() with LogSinks.setConsole().

Migration: Search your code for setLogLevel and replace with LogSinks.setConsole.

See: Using Logs


2. ReplicatorConfiguration API

The old constructor pattern using addCollection() is deprecated.

OLD (Deprecated):

const config = new ReplicatorConfiguration(endpoint);
config.addCollection(collection);
const replicator = await Replicator.create(config);

NEW (Recommended in 1.0):

import { CollectionConfiguration } from 'cbl-reactnative';

const collectionConfig = new CollectionConfiguration(collection);
const config = new ReplicatorConfiguration([collectionConfig], endpoint);
const replicator = await Replicator.create(config);

This method is deprecated. It remains available for backward compatibility, but new applications should use the new constructor pattern. Existing applications are strongly encouraged to migrate.

See: Remote Sync


3. Listener Removal Methods (Deprecated)

OLD (Deprecated in 1.0):

await collection.removeChangeListener(token);
await query.removeChangeListener(token);
await replicator.removeChangeListener(token);

NEW (Recommended in 1.0):

await token.remove();

This method is deprecated. It remains available for backward compatibility, but new applications should use token.remove(). Existing applications are strongly encouraged to migrate.


New Features in 1.0

1. Three Log Sink Types

// Console Sink - for development
await LogSinks.setConsole({
level: LogLevel.VERBOSE,
domains: [LogDomain.ALL]
});

// File Sink - for production logging
await LogSinks.setFile({
level: LogLevel.WARNING,
directory: logDir,
maxKeptFiles: 5,
maxFileSize: 1024 * 1024,
usePlaintext: true
});

// Custom Sink - for analytics
await LogSinks.setCustom({
level: LogLevel.ERROR,
domains: [LogDomain.ALL],
callback: (level, domain, message) => {
Analytics.log({ level, domain, message });
}
});

See: Using Logs


2. All 5 Change Listener Types

Now fully documented with examples:

// 1. Collection Change Listener
const token1 = await collection.addChangeListener((change) => {
console.log('Changed docs:', change.documentIDs); // Capital IDs!
});

// 2. Document Change Listener
const token2 = await collection.addDocumentChangeListener('doc-id', (change) => {
console.log('Doc changed:', change.documentId); // Lowercase Id!
});

// 3. Query Change Listener (Live Query)
const token3 = await query.addChangeListener((change) => {
console.log('Results:', change.results);
});

// 4. Replicator Status Listener
const token4 = await replicator.addChangeListener((change) => {
const status = change.status;
console.log('Level:', status.getActivityLevel());
console.log('Progress:', status.getProgress().getCompleted());
});

// 5. Replicator Document Listener
const token5 = await replicator.addDocumentChangeListener((change) => {
console.log('Direction:', change.isPush ? 'Push' : 'Pull');
});

// All use same removal pattern
await token1.remove();

See: Scopes and Collections | Documents | Live Queries | Remote Sync


3. Collection.fullName()

const fullName = await collection.fullName();
console.log(fullName); // "production.users"

See: Scopes and Collections


Quick Migration Steps

Step 1: Update Logging (Required)

Find and replace in your code:

# Search for old API
grep -r "setLogLevel" .

# Replace with LogSinks.setConsole

Step 2: Update ReplicatorConfiguration (Recommended)

// Old (deprecated)
const config = new ReplicatorConfiguration(endpoint);
config.addCollection(collection);

// New (recommended)
const collectionConfig = new CollectionConfiguration(collection);
const config = new ReplicatorConfiguration([collectionConfig], endpoint);

Step 3: Update Listener Cleanup (Recommended)

// Old (deprecated)
await collection.removeChangeListener(token);

// New (recommended)
await token.remove();

Important Property Names

Listener TypePropertyCorrectWrong
Collection ChangeDocument IDsdocumentIDsdocumentIds
Document ChangeDocument IDdocumentIddocumentID
Collection ChangeDatabasecollection.databasedatabase
Document ChangeDatabasedatabaseN/A
Replicator ProgressCompletedgetCompleted()completed
Replicator ProgressTotalgetTotal()total

Need Help?