tinybase 6.2.1 → 6.3.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.
Files changed (204) hide show
  1. package/@types/mergeable-store/index.d.ts +1 -0
  2. package/@types/mergeable-store/with-schemas/index.d.ts +1 -0
  3. package/@types/omni/index.d.ts +1 -0
  4. package/@types/omni/with-schemas/index.d.ts +1 -0
  5. package/@types/persisters/index.d.ts +5 -2
  6. package/@types/persisters/persister-browser/index.d.ts +2 -0
  7. package/@types/persisters/persister-browser/with-schemas/index.d.ts +2 -0
  8. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +349 -0
  9. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +382 -0
  10. package/@types/persisters/persister-pglite/index.d.ts +1 -0
  11. package/@types/persisters/persister-pglite/with-schemas/index.d.ts +1 -0
  12. package/@types/persisters/persister-sqlite-wasm/index.d.ts +1 -0
  13. package/@types/persisters/persister-sqlite-wasm/with-schemas/index.d.ts +1 -0
  14. package/@types/persisters/with-schemas/index.d.ts +5 -2
  15. package/@types/queries/index.d.ts +1 -1
  16. package/@types/queries/with-schemas/index.d.ts +1 -1
  17. package/@types/store/index.d.ts +13 -0
  18. package/@types/store/with-schemas/index.d.ts +13 -0
  19. package/@types/synchronizers/index.d.ts +1 -0
  20. package/@types/synchronizers/synchronizer-ws-client/index.d.ts +1 -0
  21. package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +1 -0
  22. package/@types/synchronizers/synchronizer-ws-server-durable-object/index.d.ts +1 -0
  23. package/@types/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.d.ts +1 -0
  24. package/@types/synchronizers/with-schemas/index.d.ts +1 -0
  25. package/@types/ui-react/index.d.ts +5 -0
  26. package/@types/ui-react/with-schemas/index.d.ts +5 -0
  27. package/@types/ui-react-inspector/index.d.ts +1 -0
  28. package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -0
  29. package/LICENSE +1 -1
  30. package/min/checkpoints/index.js +1 -1
  31. package/min/checkpoints/index.js.gz +0 -0
  32. package/min/checkpoints/with-schemas/index.js +1 -1
  33. package/min/checkpoints/with-schemas/index.js.gz +0 -0
  34. package/min/common/index.js +1 -1
  35. package/min/common/index.js.gz +0 -0
  36. package/min/common/with-schemas/index.js +1 -1
  37. package/min/common/with-schemas/index.js.gz +0 -0
  38. package/min/index.js +1 -1
  39. package/min/index.js.gz +0 -0
  40. package/min/indexes/index.js +1 -1
  41. package/min/indexes/index.js.gz +0 -0
  42. package/min/indexes/with-schemas/index.js +1 -1
  43. package/min/indexes/with-schemas/index.js.gz +0 -0
  44. package/min/mergeable-store/index.js +1 -1
  45. package/min/mergeable-store/index.js.gz +0 -0
  46. package/min/mergeable-store/with-schemas/index.js +1 -1
  47. package/min/mergeable-store/with-schemas/index.js.gz +0 -0
  48. package/min/metrics/index.js +1 -1
  49. package/min/metrics/index.js.gz +0 -0
  50. package/min/metrics/with-schemas/index.js +1 -1
  51. package/min/metrics/with-schemas/index.js.gz +0 -0
  52. package/min/omni/index.js +1 -1
  53. package/min/omni/index.js.gz +0 -0
  54. package/min/omni/with-schemas/index.js +1 -1
  55. package/min/omni/with-schemas/index.js.gz +0 -0
  56. package/min/persisters/index.js +1 -1
  57. package/min/persisters/index.js.gz +0 -0
  58. package/min/persisters/persister-automerge/index.js +1 -1
  59. package/min/persisters/persister-automerge/index.js.gz +0 -0
  60. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  61. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  62. package/min/persisters/persister-browser/index.js +1 -1
  63. package/min/persisters/persister-browser/index.js.gz +0 -0
  64. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  65. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  66. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  67. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  68. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  69. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  70. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -0
  71. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  72. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -0
  73. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  74. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  75. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  76. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  77. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  78. package/min/persisters/persister-electric-sql/index.js +1 -1
  79. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  80. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  81. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  82. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  83. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  84. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  85. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  86. package/min/persisters/persister-file/index.js +1 -1
  87. package/min/persisters/persister-file/index.js.gz +0 -0
  88. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  89. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  90. package/min/persisters/persister-indexed-db/index.js +1 -1
  91. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  92. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  93. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  94. package/min/persisters/persister-libsql/index.js +1 -1
  95. package/min/persisters/persister-libsql/index.js.gz +0 -0
  96. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  97. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  98. package/min/persisters/persister-partykit-client/index.js +1 -1
  99. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  100. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  101. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  102. package/min/persisters/persister-partykit-server/index.js +1 -1
  103. package/min/persisters/persister-partykit-server/index.js.gz +0 -0
  104. package/min/persisters/persister-partykit-server/with-schemas/index.js +1 -1
  105. package/min/persisters/persister-partykit-server/with-schemas/index.js.gz +0 -0
  106. package/min/persisters/persister-pglite/index.js +1 -1
  107. package/min/persisters/persister-pglite/index.js.gz +0 -0
  108. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  109. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  110. package/min/persisters/persister-postgres/index.js +1 -1
  111. package/min/persisters/persister-postgres/index.js.gz +0 -0
  112. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  113. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  114. package/min/persisters/persister-powersync/index.js +1 -1
  115. package/min/persisters/persister-powersync/index.js.gz +0 -0
  116. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  117. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  118. package/min/persisters/persister-remote/index.js +1 -1
  119. package/min/persisters/persister-remote/index.js.gz +0 -0
  120. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  121. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  122. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  123. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  124. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  125. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  126. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  127. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  128. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  129. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  130. package/min/persisters/persister-sqlite3/index.js +1 -1
  131. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  132. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  133. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  134. package/min/persisters/persister-yjs/index.js +1 -1
  135. package/min/persisters/persister-yjs/index.js.gz +0 -0
  136. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  137. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  138. package/min/persisters/with-schemas/index.js +1 -1
  139. package/min/persisters/with-schemas/index.js.gz +0 -0
  140. package/min/queries/index.js +1 -1
  141. package/min/queries/index.js.gz +0 -0
  142. package/min/queries/with-schemas/index.js +1 -1
  143. package/min/queries/with-schemas/index.js.gz +0 -0
  144. package/min/relationships/index.js +1 -1
  145. package/min/relationships/index.js.gz +0 -0
  146. package/min/relationships/with-schemas/index.js +1 -1
  147. package/min/relationships/with-schemas/index.js.gz +0 -0
  148. package/min/store/index.js +1 -1
  149. package/min/store/index.js.gz +0 -0
  150. package/min/store/with-schemas/index.js +1 -1
  151. package/min/store/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/index.js +1 -1
  153. package/min/synchronizers/index.js.gz +0 -0
  154. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  155. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  156. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  157. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  158. package/min/synchronizers/synchronizer-local/index.js +1 -1
  159. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  160. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  161. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  162. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  163. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  164. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  165. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  166. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  167. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  168. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  169. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  170. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  171. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  172. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  173. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  174. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  175. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  176. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  177. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  178. package/min/synchronizers/with-schemas/index.js +1 -1
  179. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  180. package/min/ui-react/index.js +1 -1
  181. package/min/ui-react/index.js.gz +0 -0
  182. package/min/ui-react/with-schemas/index.js +1 -1
  183. package/min/ui-react/with-schemas/index.js.gz +0 -0
  184. package/min/ui-react-dom/index.js +1 -1
  185. package/min/ui-react-dom/index.js.gz +0 -0
  186. package/min/ui-react-dom/with-schemas/index.js +1 -1
  187. package/min/ui-react-dom/with-schemas/index.js.gz +0 -0
  188. package/min/ui-react-inspector/index.js +1 -1
  189. package/min/ui-react-inspector/index.js.gz +0 -0
  190. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  191. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  192. package/min/with-schemas/index.js +1 -1
  193. package/min/with-schemas/index.js.gz +0 -0
  194. package/omni/index.js +4 -1
  195. package/omni/with-schemas/index.js +4 -1
  196. package/package.json +44 -8
  197. package/persisters/persister-browser/index.js +4 -1
  198. package/persisters/persister-browser/with-schemas/index.js +4 -1
  199. package/persisters/persister-durable-object-sql-storage/index.js +1391 -0
  200. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1391 -0
  201. package/readme.md +8 -8
  202. package/releases.md +50 -25
  203. package/ui-react-inspector/index.js +4 -1
  204. package/ui-react-inspector/with-schemas/index.js +4 -1
@@ -1115,6 +1115,7 @@ export interface MergeableStore extends Store {
1115
1115
  * ];
1116
1116
  * ```
1117
1117
  * @category Creation
1118
+ * @essential Creating stores
1118
1119
  * @since v5.0.0
1119
1120
  */
1120
1121
  export function createMergeableStore(
@@ -1607,6 +1607,7 @@ export interface MergeableStore<Schemas extends OptionalSchemas>
1607
1607
  * ];
1608
1608
  * ```
1609
1609
  * @category Creation
1610
+ * @essential Creating stores
1610
1611
  * @since v5.0.0
1611
1612
  */
1612
1613
  export function createMergeableStore(
@@ -23,6 +23,7 @@ export * from '../persisters/index.d.ts';
23
23
  export * from '../persisters/persister-automerge/index.d.ts';
24
24
  export * from '../persisters/persister-browser/index.d.ts';
25
25
  export * from '../persisters/persister-cr-sqlite-wasm/index.d.ts';
26
+ export * from '../persisters/persister-durable-object-sql-storage/index.d.ts';
26
27
  export * from '../persisters/persister-durable-object-storage/index.d.ts';
27
28
  export * from '../persisters/persister-electric-sql/index.d.ts';
28
29
  export * from '../persisters/persister-expo-sqlite/index.d.ts';
@@ -22,6 +22,7 @@ export * from '../../metrics/with-schemas/index.d.ts';
22
22
  export * from '../../persisters/persister-automerge/with-schemas/index.d.ts';
23
23
  export * from '../../persisters/persister-browser/with-schemas/index.d.ts';
24
24
  export * from '../../persisters/persister-cr-sqlite-wasm/with-schemas/index.d.ts';
25
+ export * from '../../persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts';
25
26
  export * from '../../persisters/persister-durable-object-storage/with-schemas/index.d.ts';
26
27
  export * from '../../persisters/persister-electric-sql/with-schemas/index.d.ts';
27
28
  export * from '../../persisters/persister-expo-sqlite/with-schemas/index.d.ts';
@@ -6,8 +6,8 @@
6
6
  * Many entry points are provided (in separately installed modules), each of
7
7
  * which returns different types of Persister that can load and save a Store.
8
8
  * Between them, these allow you to store your TinyBase data locally, remotely,
9
- * to SQLite and PostgreSQL databases, and across synchronization boundaries
10
- * with CRDT frameworks.
9
+ * to a Durable Object, to SQLite and PostgreSQL databases, and across
10
+ * synchronization boundaries with CRDT frameworks.
11
11
  *
12
12
  * |Persister|Storage|Store|MergeableStore
13
13
  * |-|-|-|-|
@@ -16,6 +16,8 @@
16
16
  * |FilePersister|Local file (where possible)|Yes|Yes
17
17
  * |IndexedDbPersister|Browser IndexedDB|Yes|No
18
18
  * |RemotePersister|Remote server|Yes|No
19
+ * |DurableObjectStoragePersister|Cloudflare Durable Object (KV)|No|Yes
20
+ * |DurableObjectSqlStoragePersister|Cloudflare Durable Object (SQLite)|No|Yes
19
21
  * |Sqlite3Persister|SQLite in Node, via [sqlite3](https://github.com/TryGhost/node-sqlite3)|Yes|Yes*
20
22
  * |SqliteBunPersister| SQLite in Bun, via [bun:sqlite](https://bun.sh/docs/api/sqlite)|Yes|Yes*
21
23
  * |SqliteWasmPersister|SQLite in a browser, via [sqlite-wasm](https://github.com/tomayac/sqlite-wasm)|Yes|Yes*
@@ -954,6 +956,7 @@ export type DpcTabularValues = {
954
956
  * sessionStorage.clear();
955
957
  * ```
956
958
  * @category Persister
959
+ * @essential Persisting stores
957
960
  * @since v1.0.0
958
961
  */
959
962
  export interface Persister<Persist extends Persists = Persists.StoreOnly> {
@@ -134,6 +134,7 @@ export interface LocalPersister
134
134
  * sessionStorage.clear();
135
135
  * ```
136
136
  * @category Creation
137
+ * @essential Persisting stores
137
138
  * @since v1.0.0
138
139
  */
139
140
  export function createSessionPersister(
@@ -176,6 +177,7 @@ export function createSessionPersister(
176
177
  * localStorage.clear();
177
178
  * ```
178
179
  * @category Creation
180
+ * @essential Persisting stores
179
181
  * @since v1.0.0
180
182
  */
181
183
  export function createLocalPersister(
@@ -147,6 +147,7 @@ export interface LocalPersister<Schemas extends OptionalSchemas>
147
147
  * sessionStorage.clear();
148
148
  * ```
149
149
  * @category Creation
150
+ * @essential Persisting stores
150
151
  * @since v1.0.0
151
152
  */
152
153
  export function createSessionPersister<Schemas extends OptionalSchemas>(
@@ -199,6 +200,7 @@ export function createSessionPersister<Schemas extends OptionalSchemas>(
199
200
  * localStorage.clear();
200
201
  * ```
201
202
  * @category Creation
203
+ * @essential Persisting stores
202
204
  * @since v1.0.0
203
205
  */
204
206
  export function createLocalPersister<Schemas extends OptionalSchemas>(
@@ -0,0 +1,349 @@
1
+ /**
2
+ * The persister-durable-object-sql-storage module of the TinyBase project lets
3
+ * you save and load Store data to and from Cloudflare Durable Object SQLite
4
+ * storage (in an appropriate environment).
5
+ *
6
+ * Cloudflare's SQLite storage backend for Durable Objects offers significantly
7
+ * better pricing compared to the key-value storage backend. The SQLite storage
8
+ * backend is Cloudflare's recommended storage option for new Durable Object
9
+ * namespaces.
10
+ *
11
+ * **Important:** Before using this persister, you must configure your Durable
12
+ * Object class to use SQLite storage by adding a migration to your
13
+ * `wrangler.toml` or `wrangler.json` configuration file. Use
14
+ * `new_sqlite_classes` in your migration configuration to enable SQLite storage
15
+ * for your Durable Object class.
16
+ *
17
+ * See [Cloudflare's
18
+ * documentation](https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/)
19
+ * for more details.
20
+ * @see Cloudflare Durable Objects guide
21
+ * @see Persistence guides
22
+ * @packageDocumentation
23
+ * @module persister-durable-object-sql-storage
24
+ * @since v6.3.0
25
+ */
26
+ import type {MergeableStore} from '../../mergeable-store/index.d.ts';
27
+ import type {DpcJson, Persister, Persists} from '../index.d.ts';
28
+
29
+ /**
30
+ * The DpcFragmented type represents the configuration for fragmented
31
+ * persistence mode in a DurableObjectSqlStoragePersister.
32
+ *
33
+ * This mode stores each table, row, cell, and value as separate database rows,
34
+ * avoiding Cloudflare's 2MB row limit that can be hit with large stores in JSON
35
+ * mode. While this creates more database writes, it provides better scalability
36
+ * for larger datasets.
37
+ * @example
38
+ * This example shows how to configure a DurableObjectSqlStoragePersister to use
39
+ * fragmented mode with a custom storage prefix.
40
+ *
41
+ * ```js yolo
42
+ * import {createMergeableStore} from 'tinybase';
43
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
44
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
45
+ *
46
+ * const config = {
47
+ * mode: 'fragmented',
48
+ * storagePrefix: 'my_app_',
49
+ * };
50
+ *
51
+ * export class MyDurableObject extends WsServerDurableObject {
52
+ * createPersister() {
53
+ * const store = createMergeableStore();
54
+ * const persister = createDurableObjectSqlStoragePersister(
55
+ * store,
56
+ * this.ctx.storage.sql,
57
+ * config,
58
+ * );
59
+ * return persister;
60
+ * }
61
+ * }
62
+ * ```
63
+ * @category Configuration
64
+ * @since v6.3.0
65
+ */
66
+ export type DpcFragmented = {
67
+ /**
68
+ * The mode property must be set to 'fragmented' to enable fragmented
69
+ * persistence mode.
70
+ * @category Configuration
71
+ * @since v6.3.0
72
+ */
73
+ mode: 'fragmented';
74
+ /**
75
+ * The storagePrefix property lets you specify an optional prefix for the
76
+ * database table names used in fragmented mode.
77
+ *
78
+ * This is useful when you have multiple stores or applications sharing the
79
+ * same Durable Object SQL storage and want to avoid table name conflicts.
80
+ *
81
+ * The prefix will be sanitized to only include alphanumeric characters and
82
+ * underscores. For example, a prefix of 'my-app!' becomes 'my_app_'.
83
+ * @example
84
+ * This example shows a configuration using the storagePrefix setting. With a
85
+ * `storagePrefix` of 'user_data_', it creates `user_data_tinybase_tables` and
86
+ * `user_data_tinybase_values` tables.
87
+ * ```json
88
+ * {
89
+ * mode: 'fragmented',
90
+ * storagePrefix: 'user_data_',
91
+ * };
92
+ * ```
93
+ * @category Configuration
94
+ * @since v6.3.0
95
+ */
96
+ storagePrefix?: string;
97
+ };
98
+
99
+ /**
100
+ * The DurableObjectSqlDatabasePersisterConfig type represents the union of all
101
+ * possible configuration types for a DurableObjectSqlStoragePersister.
102
+ *
103
+ * This allows the persister to support multiple persistence modes.
104
+ * - JSON mode (via DpcJson): Stores the entire Store as JSON in a single row.
105
+ * - Fragmented mode (via DpcFragmented): Stores each piece of data as separate
106
+ * rows.
107
+ * @example
108
+ * These examples show some different configuration options.
109
+ * ```json
110
+ * // JSON mode (default)
111
+ * {
112
+ * mode: 'json',
113
+ * storeTableName: 'my_store',
114
+ * };
115
+ *
116
+ * // Fragmented mode
117
+ * {
118
+ * mode: 'fragmented',
119
+ * storagePrefix: 'app_',
120
+ * };
121
+ * ```
122
+ * @category Configuration
123
+ * @since v6.3.0
124
+ */
125
+ export type DurableObjectSqlDatabasePersisterConfig = DpcJson | DpcFragmented;
126
+
127
+ /**
128
+ * The DurableObjectSqlStoragePersister interface represents a Persister that
129
+ * lets you save and load Store data to and from Cloudflare Durable Object SQL
130
+ * storage.
131
+ *
132
+ * You should use the createDurableObjectSqlStoragePersister function to create
133
+ * a DurableObjectSqlStoragePersister object, most likely within the
134
+ * createPersister method of a WsServerDurableObject.
135
+ *
136
+ * It is a minor extension to the Persister interface and simply provides an
137
+ * extra getSqlStorage method for accessing a reference to the SQL storage that
138
+ * the Store is being persisted to.
139
+ * @category Persister
140
+ * @since v6.3.0
141
+ */
142
+ export interface DurableObjectSqlStoragePersister
143
+ extends Persister<Persists.MergeableStoreOnly> {
144
+ /**
145
+ * The getSqlStorage method returns a reference to the SQL storage that the
146
+ * Store is being persisted to.
147
+ * @returns The reference to the SQL storage.
148
+ * @example
149
+ * This example creates a Persister object against a newly-created Store
150
+ * (within the createPersister method of a WsServerDurableObject instance) and
151
+ * then gets the SQL storage reference back out again.
152
+ *
153
+ * ```js yolo
154
+ * import {createMergeableStore} from 'tinybase';
155
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
156
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
157
+ *
158
+ * export class MyDurableObject extends WsServerDurableObject {
159
+ * createPersister() {
160
+ * const store = createMergeableStore();
161
+ * const persister = createDurableObjectSqlStoragePersister(
162
+ * store,
163
+ * this.ctx.storage.sql,
164
+ * );
165
+ * console.log(persister.getSqlStorage() == this.ctx.storage.sql);
166
+ * // -> true
167
+ *
168
+ * return persister;
169
+ * }
170
+ * }
171
+ * ```
172
+ * @category Getter
173
+ * @since v6.3.0
174
+ */
175
+ getSqlStorage(): SqlStorage;
176
+ }
177
+
178
+ /**
179
+ * The createDurableObjectSqlStoragePersister function creates a
180
+ * DurableObjectSqlStoragePersister object that can persist the Store to and
181
+ * from Cloudflare Durable Object SQLite storage.
182
+ *
183
+ * You will mostly use this within the createPersister method of a
184
+ * WsServerDurableObject.
185
+ *
186
+ * This persister uses Cloudflare's SQLite storage backend, which provides
187
+ * better pricing and performance compared to the legacy Key-value storage
188
+ * backend.
189
+ *
190
+ * **Important Prerequisites:** Before using this persister, you must configure
191
+ * your Durable Object class to use SQLite storage by adding a migration to your
192
+ * Wrangler configuration file. In your `wrangler.toml`, add the following.
193
+ * ```toml
194
+ * [[migrations]]
195
+ * tag = "v1"
196
+ * new_sqlite_classes = ["YourDurableObjectClass"]
197
+ * ```
198
+ *
199
+ * Or in your `wrangler.json`, add:
200
+ *
201
+ * ```json
202
+ * {
203
+ * "migrations": [
204
+ * {
205
+ * "tag": "v1",
206
+ * "new_sqlite_classes": ["YourDurableObjectClass"]
207
+ * }
208
+ * ]
209
+ * }
210
+ * ```
211
+ *
212
+ * For more details on Durable Object migrations, see the [Cloudflare
213
+ * documentation](https://developers.cloudflare.com/durable-objects/reference/durable-objects-migrations/).
214
+ *
215
+ * A database Persister uses one of two modes: either a JSON serialization of
216
+ * the whole Store stored in a single row of a table (the default), a fragmented
217
+ * mode that stores each piece of data separately to avoid Cloudflare's 2MB row
218
+ * limit.
219
+ *
220
+ * - **JSON Mode (Default)**: Stores the entire Store as JSON in a single
221
+ * database row. This is efficient for smaller stores but may hit Cloudflare's
222
+ * 2MB row limit for very large stores and uses fewer database writes.
223
+ *
224
+ * - **Fragmented Mode**: Stores each table, row, cell, and value as separate
225
+ * database rows. Use this mode if you're concerned about hitting Cloudflare's
226
+ * 2MB row limit with large stores in JSON mode. This mode creates more
227
+ * database writes but avoids row size limitations.
228
+ *
229
+ * The third argument is a DatabasePersisterConfig object that configures which
230
+ * of those modes to use, and settings for each. If the third argument is simply
231
+ * a string, it is used as the `storeTableName` property of the JSON
232
+ * serialization. If it is the string 'fragmented', it enables fragmented mode.
233
+ *
234
+ * See the documentation for the DpcJson, DpcFragmented, and DpcTabular types
235
+ * for more information on how all of those modes can be configured.
236
+ *
237
+ * As well as providing a reference to the Store or MergeableStore to persist,
238
+ * you must provide a `sqlStorage` parameter which identifies the Durable Object
239
+ * SQLite storage to persist it to.
240
+ * @param store The Store or MergeableStore to persist.
241
+ * @param sqlStorage The Durable Object SQL storage to persist the Store to.
242
+ * @param configOrStoreTableName A DatabasePersisterConfig to configure the
243
+ * persistence mode (or a string to set the `storeTableName` property of the
244
+ * JSON serialization).
245
+ * @param onSqlCommand An optional handler called every time the Persister
246
+ * executes a SQL command or query. This is suitable for logging persistence
247
+ * behavior in a development environment.
248
+ * @param onIgnoredError An optional handler for the errors that the Persister
249
+ * would otherwise ignore when trying to save or load data. This is suitable for
250
+ * debugging persistence issues in a development environment.
251
+ * @returns A reference to the new DurableObjectSqlStoragePersister object.
252
+ * @example
253
+ * This example creates a DurableObjectSqlStoragePersister object and persists
254
+ * the Store to Durable Object SQLite storage as a JSON serialization into the
255
+ * default `tinybase` table. It uses this within the createPersister method of a
256
+ * WsServerDurableObject instance.
257
+ *
258
+ * ```js yolo
259
+ * import {createMergeableStore} from 'tinybase';
260
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
261
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
262
+ *
263
+ * export class MyDurableObject extends WsServerDurableObject {
264
+ * createPersister() {
265
+ * const store = createMergeableStore();
266
+ * const persister = createDurableObjectSqlStoragePersister(
267
+ * store,
268
+ * this.ctx.storage.sql,
269
+ * );
270
+ * return persister;
271
+ * }
272
+ * }
273
+ * ```
274
+ * @example
275
+ * This example creates a DurableObjectSqlStoragePersister object with a custom
276
+ * table name and SQL command logging for debugging.
277
+ *
278
+ * ```js yolo
279
+ * import {createMergeableStore} from 'tinybase';
280
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
281
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
282
+ *
283
+ * export class MyDurableObject extends WsServerDurableObject {
284
+ * createPersister() {
285
+ * const store = createMergeableStore();
286
+ * const persister = createDurableObjectSqlStoragePersister(
287
+ * store,
288
+ * this.ctx.storage.sql,
289
+ * 'my_app_store',
290
+ * (sql, params) => console.log('SQL:', sql, params),
291
+ * (error) => console.error('Persistence error:', error),
292
+ * );
293
+ * return persister;
294
+ * }
295
+ * }
296
+ * ```
297
+ * @example
298
+ * This example creates a DurableObjectSqlStoragePersister object using
299
+ * fragmented mode to avoid Cloudflare's 2MB row limit for large stores.
300
+ *
301
+ * ```js yolo
302
+ * import {createMergeableStore} from 'tinybase';
303
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
304
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
305
+ *
306
+ * export class MyDurableObject extends WsServerDurableObject {
307
+ * createPersister() {
308
+ * const store = createMergeableStore();
309
+ * const persister = createDurableObjectSqlStoragePersister(
310
+ * store,
311
+ * this.ctx.storage.sql,
312
+ * {mode: 'fragmented'},
313
+ * );
314
+ * return persister;
315
+ * }
316
+ * }
317
+ * ```
318
+ * @example
319
+ * This example creates a DurableObjectSqlStoragePersister object using
320
+ * fragmented mode with a custom storage prefix.
321
+ *
322
+ * ```js yolo
323
+ * import {createMergeableStore} from 'tinybase';
324
+ * import {createDurableObjectSqlStoragePersister} from 'tinybase/persisters/persister-durable-object-sql-storage';
325
+ * import {WsServerDurableObject} from 'tinybase/synchronizers/synchronizer-ws-server-durable-object';
326
+ *
327
+ * export class MyDurableObject extends WsServerDurableObject {
328
+ * createPersister() {
329
+ * const store = createMergeableStore();
330
+ * const persister = createDurableObjectSqlStoragePersister(
331
+ * store,
332
+ * this.ctx.storage.sql,
333
+ * {mode: 'fragmented', storagePrefix: 'my_app_'},
334
+ * );
335
+ * return persister;
336
+ * }
337
+ * }
338
+ * ```
339
+ * @category Creation
340
+ * @essential Persisting stores
341
+ * @since v6.3.0
342
+ */
343
+ export function createDurableObjectSqlStoragePersister(
344
+ store: MergeableStore,
345
+ sqlStorage: SqlStorage,
346
+ configOrStoreTableName?: DurableObjectSqlDatabasePersisterConfig | string,
347
+ onSqlCommand?: (sql: string, params?: any[]) => void,
348
+ onIgnoredError?: (error: any) => void,
349
+ ): DurableObjectSqlStoragePersister;