Skip to content

Commit 75632fb

Browse files
acoreyjjamesgpearce
authored andcommitted
update docs
1 parent 3a0225d commit 75632fb

File tree

5 files changed

+53
-120
lines changed

5 files changed

+53
-120
lines changed

site/guides/06_integrations/1_cloudflare_durable_objects.md

Lines changed: 9 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -208,7 +208,7 @@ createPersister() {
208208
// ...
209209
```
210210
211-
**Key-Value Mode**: Stores each table, row, cell, and value as separate database
211+
**Fragmented Mode**: Stores each table, row, cell, and value as separate database
212212
rows. Use this mode if you're concerned about hitting Cloudflare's 2MB row
213213
limit with large stores in JSON mode. This mode creates more database writes
214214
but avoids row size limitations:
@@ -219,7 +219,7 @@ createPersister() {
219219
return createDurableObjectSqlStoragePersister(
220220
createMergeableStore(),
221221
this.ctx.storage.sql,
222-
'key-value',
222+
{mode: 'fragmented'},
223223
);
224224
}
225225
// ...
@@ -243,7 +243,7 @@ createPersister() {
243243
// ...
244244
```
245245
246-
- **Key-value mode with custom prefix**: You can use key-value mode with a
246+
- **Fragmented mode with custom prefix**: You can use fragmented mode with a
247247
custom storage prefix:
248248
249249
```js yolo
@@ -252,28 +252,7 @@ createPersister() {
252252
return createDurableObjectSqlStoragePersister(
253253
createMergeableStore(),
254254
this.ctx.storage.sql,
255-
{mode: 'key-value', storagePrefix: 'my_app_'},
256-
);
257-
}
258-
// ...
259-
```
260-
261-
- **Tabular mode**: For direct table-to-table mapping instead of JSON
262-
serialization:
263-
264-
```js yolo
265-
// ...
266-
createPersister() {
267-
return createDurableObjectSqlStoragePersister(
268-
createMergeableStore(),
269-
this.ctx.storage.sql,
270-
{
271-
mode: 'tabular',
272-
tables: {
273-
load: {users: 'users', posts: 'posts'},
274-
save: {users: 'users', posts: 'posts'},
275-
},
276-
},
255+
{mode: 'fragmented', storagePrefix: 'my_app_'},
277256
);
278257
}
279258
// ...
@@ -331,20 +310,18 @@ configuration options:
331310
- **SQLite storage** (recommended): Uses SQL tables to store TinyBase data with
332311
structured tables for tables and values, including proper CRDT metadata. This
333312
provides better performance and pricing. The SQLite persister supports JSON
334-
serialization mode (default), key-value mode for avoiding the 2MB row limit,
335-
and tabular mode for direct table mapping. It also supports both regular Store
336-
and MergeableStore objects.
313+
serialization mode (default), fragmented mode for avoiding the 2MB row limit.
337314
338315
- **Key-value storage** (legacy): Has limitations on the data that can be stored
339316
in each key. The DurableObjectStoragePersister uses one key per TinyBase
340317
Value, one key per Cell, one key per Row, and one key per Table. The main
341318
caution is to ensure that each individual TinyBase Cell and Value data does
342319
not exceed the 128 KiB limit.
343320
344-
**When to use Key-Value Mode**: If you have a large TinyBase Store that might
345-
approach or exceed Cloudflare's 2MB row limit when serialized as JSON, use
346-
key-value mode. JSON mode uses significantly fewer database writes and is more
347-
efficient for smaller stores, but key-value mode provides better scalability
321+
**When to use SQLite Fragmented Mode**: If you have a large TinyBase Store that might
322+
approach or exceed Cloudflare's 2MB row limit when serialized as JSON, use SQLite storage in
323+
fragmented mode. JSON mode uses significantly fewer database writes and is more
324+
efficient for smaller stores, but fragmented mode provides better scalability
348325
for very large datasets by storing each piece of data in separate rows.
349326
350327
The WsServerDurableObject is an overridden implementation of the DurableObject

src/@types/persisters/persister-durable-object-sql-storage/docs.js

Lines changed: 24 additions & 64 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,7 @@
1818
/// persister-durable-object-sql-storage
1919

2020
/**
21-
* The DpcKeyValue type represents the configuration for key-value persistence mode
21+
* The DpcFragmented type represents the configuration for fragmented persistence mode
2222
* in a DurableObjectSqlStoragePersister.
2323
*
2424
* This mode stores each table, row, cell, and value as separate database rows,
@@ -28,11 +28,11 @@
2828
*
2929
* @example
3030
* This example shows how to configure a DurableObjectSqlStoragePersister to use
31-
* key-value mode with a custom storage prefix:
31+
* fragmented mode with a custom storage prefix:
3232
*
3333
* ```js
3434
* const config = {
35-
* mode: 'key-value',
35+
* mode: 'fragmented',
3636
* storagePrefix: 'my_app_'
3737
* };
3838
*
@@ -46,16 +46,16 @@
4646
* @category Configuration
4747
* @since v6.2.0
4848
*/
49-
/// DpcKeyValue
49+
/// DpcFragmented
5050
{
5151
/**
52-
* The mode property must be set to 'key-value' to enable key-value persistence mode.
52+
* The mode property must be set to 'fragmented' to enable fragmented persistence mode.
5353
* @since v6.2.0
5454
*/
55-
/// DpcKeyValue.mode
55+
/// DpcFragmented.mode
5656
/**
5757
* The storagePrefix property lets you specify an optional prefix for the database
58-
* table names used in key-value mode.
58+
* table names used in fragmented mode.
5959
*
6060
* This is useful when you have multiple stores or applications sharing the same
6161
* Durable Object SQL storage and want to avoid table name conflicts.
@@ -71,14 +71,14 @@
7171
* // Creates tables: user_data_tinybase_tables, user_data_tinybase_values
7272
*
7373
* const config = {
74-
* mode: 'key-value',
74+
* mode: 'fragmented',
7575
* storagePrefix: 'user_data_'
7676
* };
7777
* ```
7878
*
7979
* @since v6.2.0
8080
*/
81-
/// DpcKeyValue.storagePrefix
81+
/// DpcFragmented.storagePrefix
8282
}
8383

8484
/**
@@ -87,8 +87,7 @@
8787
*
8888
* This allows the persister to support multiple persistence modes:
8989
* - JSON mode (via DpcJson): Stores the entire Store as JSON in a single row
90-
* - Key-value mode (via DpcKeyValue): Stores each piece of data as separate rows
91-
* - Tabular mode (via DpcTabular): Maps TinyBase tables to database tables
90+
* - Fragmented mode (via DpcFragmented): Stores each piece of data as separate rows
9291
*
9392
* @example
9493
* This example shows the different configuration options:
@@ -100,20 +99,12 @@
10099
* storeTableName: 'my_store'
101100
* };
102101
*
103-
* // Key-value mode
104-
* const kvConfig = {
105-
* mode: 'key-value',
102+
* // Fragmented mode
103+
* const fragmentedConfig = {
104+
* mode: 'fragmented',
106105
* storagePrefix: 'app_'
107106
* };
108107
*
109-
* // Tabular mode
110-
* const tabularConfig = {
111-
* mode: 'tabular',
112-
* tables: {
113-
* load: {pets: 'pets_table'},
114-
* save: {pets: 'pets_table'}
115-
* }
116-
* };
117108
* ```
118109
*
119110
* @category Configuration
@@ -208,33 +199,26 @@
208199
* For more details on Durable Object migrations, see the
209200
* {@link https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/ | Cloudflare documentation}.
210201
*
211-
* A DurableObjectSqlStoragePersister supports both regular Store objects and
212-
* MergeableStore objects. When used with a MergeableStore, it can persist the
213-
* complete CRDT metadata required for proper merging operations.
214-
*
215-
* A database Persister uses one of three modes: either a JSON serialization of
216-
* the whole Store stored in a single row of a table (the default), a key-value
202+
* A database Persister uses one of two modes: either a JSON serialization of
203+
* the whole Store stored in a single row of a table (the default), a fragmented
217204
* mode that stores each piece of data separately to avoid Cloudflare's 2MB row
218-
* limit, or a tabular mapping of Table Ids to database table names and vice-versa).
205+
* limit.
219206
*
220207
* **JSON Mode (Default)**: Stores the entire Store as JSON in a single database
221208
* row. This is efficient for smaller stores but may hit Cloudflare's 2MB row
222209
* limit for very large stores. Uses fewer database writes.
223210
*
224-
* **Key-Value Mode**: Stores each table, row, cell, and value as separate database
211+
* **Fragmented Mode**: Stores each table, row, cell, and value as separate database
225212
* rows. Use this mode if you're concerned about hitting Cloudflare's 2MB row
226213
* limit with large stores in JSON mode. This mode creates more database writes
227214
* but avoids row size limitations.
228215
*
229-
* **Tabular Mode**: Maps TinyBase tables directly to database tables for
230-
* traditional relational database usage.
231-
*
232216
* The third argument is a DatabasePersisterConfig object that configures which
233217
* of those modes to use, and settings for each. If the third argument is simply
234218
* a string, it is used as the `storeTableName` property of the JSON
235-
* serialization. If it is the string 'key-value', it enables key-value mode.
219+
* serialization. If it is the string 'fragmented', it enables fragmented mode.
236220
*
237-
* See the documentation for the DpcJson, DpcKeyValue, and DpcTabular types for more
221+
* See the documentation for the DpcJson, DpcFragmented, and DpcTabular types for more
238222
* information on how all of those modes can be configured.
239223
*
240224
* As well as providing a reference to the Store or MergeableStore to persist, you must
@@ -244,7 +228,7 @@
244228
* @param sqlStorage The Durable Object SQL storage to persist the Store to.
245229
* @param configOrStoreTableName A DatabasePersisterConfig to configure the
246230
* persistence mode (or a string to set the `storeTableName` property of the
247-
* JSON serialization, or 'key-value' to enable key-value mode).
231+
* JSON serialization).
248232
* @param onSqlCommand An optional handler called every time the Persister
249233
* executes a SQL command or query. This is suitable for logging persistence
250234
* behavior in a development environment.
@@ -298,7 +282,7 @@
298282
* }
299283
* ```
300284
* @example
301-
* This example creates a DurableObjectSqlStoragePersister object using key-value
285+
* This example creates a DurableObjectSqlStoragePersister object using fragmented
302286
* mode to avoid Cloudflare's 2MB row limit for large stores.
303287
*
304288
* ```js yolo
@@ -312,14 +296,14 @@
312296
* const persister = createDurableObjectSqlStoragePersister(
313297
* store,
314298
* this.ctx.storage.sql,
315-
* 'key-value',
299+
* {mode: 'fragmented'},
316300
* );
317301
* return persister;
318302
* }
319303
* }
320304
* ```
321305
* @example
322-
* This example creates a DurableObjectSqlStoragePersister object using key-value
306+
* This example creates a DurableObjectSqlStoragePersister object using fragmented
323307
* mode with a custom storage prefix.
324308
*
325309
* ```js yolo
@@ -333,31 +317,7 @@
333317
* const persister = createDurableObjectSqlStoragePersister(
334318
* store,
335319
* this.ctx.storage.sql,
336-
* {mode: 'key-value', storagePrefix: 'my_app_'},
337-
* );
338-
* return persister;
339-
* }
340-
* }
341-
* ```
342-
* @example
343-
* This example creates a DurableObjectSqlStoragePersister object with tabular
344-
* mapping configuration for direct table-to-table persistence.
345-
*
346-
* ```js yolo
347-
* import {createMergeableStore} from 'tinybase';
348-
* import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
349-
* import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
350-
*
351-
* export class MyDurableObject extends WsServerDurableObject {
352-
* createPersister() {
353-
* const store = createMergeableStore();
354-
* const persister = createDurableObjectSqlStoragePersister(
355-
* store,
356-
* this.ctx.storage.sql,
357-
* {
358-
* mode: 'tabular',
359-
* tables: {load: {pets: 'pets'}, save: {pets: 'pets'}},
360-
* },
320+
* {mode: 'fragmented', storagePrefix: 'my_app_'},
361321
* );
362322
* return persister;
363323
* }

src/@types/persisters/persister-durable-object-sql-storage/index.d.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -2,16 +2,16 @@
22
import type {MergeableStore} from '../../mergeable-store/index.d.ts';
33
import type {DpcJson, Persister, Persists} from '../index.d.ts';
44

5-
/// DpcKeyValue
6-
export type DpcKeyValue = {
7-
/// DpcKeyValue.mode
8-
mode: 'key-value';
9-
/// DpcKeyValue.storagePrefix
5+
/// DpcFragmented
6+
export type DpcFragmented = {
7+
/// DpcFragmented.mode
8+
mode: 'fragmented';
9+
/// DpcFragmented.storagePrefix
1010
storagePrefix?: string;
1111
};
1212

1313
/// DurableObjectSqlDatabasePersisterConfig
14-
export type DurableObjectSqlDatabasePersisterConfig = DpcJson | DpcKeyValue;
14+
export type DurableObjectSqlDatabasePersisterConfig = DpcJson | DpcFragmented;
1515

1616
/// DurableObjectSqlStoragePersister
1717
export interface DurableObjectSqlStoragePersister

src/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -10,18 +10,18 @@ import type {
1010
Persists,
1111
} from '../../with-schemas/index.d.ts';
1212

13-
/// DpcKeyValue
14-
export type DpcKeyValue = {
15-
/// DpcKeyValue.mode
16-
mode: 'key-value';
17-
/// DpcKeyValue.storagePrefix
13+
/// DpcFragmented
14+
export type DpcFragmented = {
15+
/// DpcFragmented.mode
16+
mode: 'fragmented';
17+
/// DpcFragmented.storagePrefix
1818
storagePrefix?: string;
1919
};
2020

2121
/// DurableObjectSqlDatabasePersisterConfig
2222
export type DurableObjectSqlDatabasePersisterConfig<
2323
Schemas extends OptionalSchemas,
24-
> = DatabasePersisterConfig<Schemas> | DpcKeyValue;
24+
> = DatabasePersisterConfig<Schemas> | DpcFragmented;
2525

2626
/// DurableObjectSqlStoragePersister
2727
export interface DurableObjectSqlStoragePersister<

src/persisters/persister-durable-object-sql-storage/index.ts

Lines changed: 8 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@ import type {
1414
} from '../../@types/persisters/index.d.ts';
1515
import type {
1616
createDurableObjectSqlStoragePersister as createDurableObjectSqlStoragePersisterDecl,
17+
DpcFragmented,
1718
DurableObjectSqlStoragePersister,
1819
} from '../../@types/persisters/persister-durable-object-sql-storage/index.d.ts';
1920
import {IdObj, objEnsure, objForEach} from '../../common/obj.ts';
@@ -24,12 +25,8 @@ import {createCustomPersister} from '../common/create.ts';
2425
import {createCustomSqlitePersister} from '../common/database/sqlite.ts';
2526

2627
type UnsubscribeFunction = () => void;
27-
export type DpcKeyValue = {
28-
/// DpcJson.mode
29-
mode: 'key-value';
30-
storagePrefix?: string;
31-
};
32-
export type DurableObjectSqlDatabasePersisterConfig = DpcJson | DpcKeyValue;
28+
29+
export type DurableObjectSqlDatabasePersisterConfig = DpcJson | DpcFragmented;
3330

3431
export const createDurableObjectSqlStoragePersister = (
3532
store: MergeableStore,
@@ -39,14 +36,13 @@ export const createDurableObjectSqlStoragePersister = (
3936
onIgnoredError?: (error: any) => void,
4037
): DurableObjectSqlStoragePersister => {
4138
if (
42-
configOrStoreTableName === 'key-value' ||
43-
(typeof configOrStoreTableName === 'object' &&
44-
configOrStoreTableName.mode === 'key-value')
39+
typeof configOrStoreTableName === 'object' &&
40+
configOrStoreTableName.mode === 'fragmented'
4541
) {
46-
return createDurableObjectKeyValueSqlStoragePersister(
42+
return createDurableObjectFragmentedSqlStoragePersister(
4743
store,
4844
sqlStorage,
49-
(configOrStoreTableName as DpcKeyValue)?.storagePrefix ?? EMPTY_STRING,
45+
(configOrStoreTableName as DpcFragmented)?.storagePrefix ?? EMPTY_STRING,
5046
onIgnoredError,
5147
);
5248
}
@@ -74,7 +70,7 @@ export const createDurableObjectSqlStoragePersister = (
7470

7571
const stampNewObjectWithHash = () => stampNewWithHash({}, EMPTY_STRING, 0);
7672

77-
const createDurableObjectKeyValueSqlStoragePersister = ((
73+
const createDurableObjectFragmentedSqlStoragePersister = ((
7874
store: MergeableStore,
7975
sqlStorage: SqlStorage,
8076
storagePrefix: string = EMPTY_STRING,

0 commit comments

Comments
 (0)