Key-Value Database
Setup
Here is how to use the Key-Value Database service of the Crewdle SDK. Each user wanting to join must open a database with the same name and provide a layout.
To generate a layout you can either do it in JSON format or use our LayoutBuilder.
Both layout and layoutJSON are valid ways to write a layout in the Crewdle SDK and both return the same thing.
import { DatabaseEvent, IValueType } from '@crewdle/web-sdk-types';
import { LayoutBuilder, QueryBuilder } from '@crewdle/web-sdk';
const layout = LayoutBuilder.layout(4)
layout
.table('first-table')
.index('secondary-key')
layout
.table('second-table')
.index('secondary-key')
.index('additional-index')
const layoutJSON = {
tables: {
'first-table': {
indexes: [
{ keyPath: 'secondary-key' },
],
},
'second-table': {
indexes: [
{ keyPath: 'secondary-key' },
{ keyPath: 'addtional-index' }
],
},
},
version: 4,
}
const keyValueDB = await cluster.openKeyValueDatabase('keyValueDatabase', layout);
You can then subscribe to database events.
keyValueDB.subscribe(async (event) => {
switch (event.event) {
case DatabaseEvent.SyncComplete:
console.log('SyncComplete')
break;
}
});
When you no longer need to interact with the database, you can either unsubscribe from the Key-Value database or close it altogether.
keyValueDB.unsubscribe(); keyValueDB.close();
Interact with a table
You can retrieve tables from the Key-Value Database. The interface must extend IValueType as is it a Base interface for all value types. Value types define the value of objects in a IDatabaseTable.
interface FirstTableType extends IValueType {
secondaryKey: string;
data: string | string[]
}
const firstTable = keyValueDB.getTable<FirstTableType>('first-table');
And then subscribe to the changes in the table.
firstTable.subscribe((event) => {
switch (event.action) {
case 'add':
console.log('AddAction');
break;
case 'update':
console.log('UpdateAction');
break;
case 'delete':
console.log('DeleteAction');
break;
}
});
In the following snippet, query will list values where their 'secondary-key' index equals 'crewdle-key' and will give you a limit of 3 results in ascending order, ignoring the first result due to the offset. queryJSON is equivalent but in JSON format. The SDK accepts both syntaxes.
const query = QueryBuilder
.index('secondary-key')
.where('==', 'crewdle-key')
.orderBy('asc')
.limit(3)
.offset(1);
const queryJSON = {
where: {
key: 'secondary-key',
operator: '==',
value: 'crewdle-key'
},
orderBy: {
key: 'secondary-key',
direction: 'asc'
},
limit: 3,
offset: 1,
}
const value = { secondaryKey: 'crewdle-key', data: 'Entering data in the database' };
const key = 'secondary-key';
// Add a value to the first table
const firstObject = await firstTable.add(value);
// Get the object by ID in the first table
const findObjectID = await firstTable.get(firstObject.id);
// Set to the variable value the value at a specified key
await firstTable.set(key, value);
// List the correct values according to a specified query
await firstTable.list(query);
// Count the number of keys in the first table
await firstTable.count();
// Delete a specified key
await firstTable.delete(key);
// Clear the first table
await firstTable.clear();
When you no longer need to interact with the table, you can unsubscribe from it.
firstTable.unsubscribe();
Additional Resources
See the Getting Started section for more information about initiating the SDK and a cluster.
To see a full example of a Key-Value Database being used, checkout our Key-Value Database sample. For more information on the services used in this page, head to our SDK reference