tinybase 9.4.0-beta.1 → 9.4.0

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 (239) hide show
  1. package/@types/persisters/index.d.ts +4 -0
  2. package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -2
  3. package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +9 -2
  4. package/@types/persisters/with-schemas/index.d.ts +4 -0
  5. package/@types/queries/index.d.ts +4 -0
  6. package/@types/queries/with-schemas/index.d.ts +4 -0
  7. package/@types/synchronizers/synchronizer-ws-client/index.d.ts +7 -3
  8. package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +7 -3
  9. package/@types/synchronizers/synchronizer-ws-server/index.d.ts +9 -3
  10. package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +9 -3
  11. package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +6 -3
  12. package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +6 -3
  13. package/@types/ui-react-dom/index.d.ts +10 -10
  14. package/@types/ui-react-dom/with-schemas/index.d.ts +10 -10
  15. package/@types/ui-react-dom-charts/index.d.ts +7 -7
  16. package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -7
  17. package/@types/ui-react-inspector/index.d.ts +1 -1
  18. package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -1
  19. package/@types/ui-solid-dom/index.d.ts +10 -10
  20. package/@types/ui-solid-dom/with-schemas/index.d.ts +10 -10
  21. package/@types/ui-solid-inspector/index.d.ts +1 -1
  22. package/@types/ui-solid-inspector/with-schemas/index.d.ts +1 -1
  23. package/@types/ui-svelte-dom/index.d.ts +10 -10
  24. package/@types/ui-svelte-dom/with-schemas/index.d.ts +10 -10
  25. package/@types/ui-svelte-inspector/index.d.ts +1 -1
  26. package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -1
  27. package/index.js +191 -74
  28. package/min/index.js +1 -1
  29. package/min/index.js.gz +0 -0
  30. package/min/omni/index.js +1 -1
  31. package/min/omni/index.js.gz +0 -0
  32. package/min/omni/with-schemas/index.js +1 -1
  33. package/min/omni/with-schemas/index.js.gz +0 -0
  34. package/min/persisters/index.js +1 -1
  35. package/min/persisters/index.js.gz +0 -0
  36. package/min/persisters/persister-automerge/index.js +1 -1
  37. package/min/persisters/persister-automerge/index.js.gz +0 -0
  38. package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
  39. package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
  40. package/min/persisters/persister-browser/index.js +1 -1
  41. package/min/persisters/persister-browser/index.js.gz +0 -0
  42. package/min/persisters/persister-browser/with-schemas/index.js +1 -1
  43. package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
  44. package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
  45. package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
  46. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
  47. package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
  48. package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
  49. package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
  50. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
  51. package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
  52. package/min/persisters/persister-durable-object-storage/index.js +1 -1
  53. package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
  54. package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
  55. package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
  56. package/min/persisters/persister-electric-sql/index.js +1 -1
  57. package/min/persisters/persister-electric-sql/index.js.gz +0 -0
  58. package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
  59. package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
  60. package/min/persisters/persister-expo-sqlite/index.js +1 -1
  61. package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
  62. package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
  63. package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
  64. package/min/persisters/persister-file/index.js +1 -1
  65. package/min/persisters/persister-file/index.js.gz +0 -0
  66. package/min/persisters/persister-file/with-schemas/index.js +1 -1
  67. package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
  68. package/min/persisters/persister-indexed-db/index.js +1 -1
  69. package/min/persisters/persister-indexed-db/index.js.gz +0 -0
  70. package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
  71. package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
  72. package/min/persisters/persister-libsql/index.js +1 -1
  73. package/min/persisters/persister-libsql/index.js.gz +0 -0
  74. package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
  75. package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
  76. package/min/persisters/persister-partykit-client/index.js +1 -1
  77. package/min/persisters/persister-partykit-client/index.js.gz +0 -0
  78. package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
  79. package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
  80. package/min/persisters/persister-pglite/index.js +1 -1
  81. package/min/persisters/persister-pglite/index.js.gz +0 -0
  82. package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
  83. package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
  84. package/min/persisters/persister-postgres/index.js +1 -1
  85. package/min/persisters/persister-postgres/index.js.gz +0 -0
  86. package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
  87. package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
  88. package/min/persisters/persister-powersync/index.js +1 -1
  89. package/min/persisters/persister-powersync/index.js.gz +0 -0
  90. package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
  91. package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
  92. package/min/persisters/persister-react-native-mmkv/index.js +1 -1
  93. package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
  94. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
  95. package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
  96. package/min/persisters/persister-react-native-sqlite/index.js +1 -1
  97. package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
  98. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
  99. package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
  100. package/min/persisters/persister-remote/index.js +1 -1
  101. package/min/persisters/persister-remote/index.js.gz +0 -0
  102. package/min/persisters/persister-remote/with-schemas/index.js +1 -1
  103. package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
  104. package/min/persisters/persister-sqlite-bun/index.js +1 -1
  105. package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
  106. package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
  107. package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
  108. package/min/persisters/persister-sqlite-wasm/index.js +1 -1
  109. package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
  110. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
  111. package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
  112. package/min/persisters/persister-sqlite3/index.js +1 -1
  113. package/min/persisters/persister-sqlite3/index.js.gz +0 -0
  114. package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
  115. package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
  116. package/min/persisters/persister-yjs/index.js +1 -1
  117. package/min/persisters/persister-yjs/index.js.gz +0 -0
  118. package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
  119. package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
  120. package/min/persisters/with-schemas/index.js +1 -1
  121. package/min/persisters/with-schemas/index.js.gz +0 -0
  122. package/min/queries/index.js +1 -1
  123. package/min/queries/index.js.gz +0 -0
  124. package/min/queries/with-schemas/index.js +1 -1
  125. package/min/queries/with-schemas/index.js.gz +0 -0
  126. package/min/synchronizers/index.js +1 -1
  127. package/min/synchronizers/index.js.gz +0 -0
  128. package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
  129. package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
  130. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
  131. package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
  132. package/min/synchronizers/synchronizer-local/index.js +1 -1
  133. package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
  134. package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
  135. package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
  136. package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
  137. package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
  138. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
  139. package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
  140. package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
  141. package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
  142. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
  143. package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
  144. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
  145. package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
  146. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
  147. package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
  148. package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
  149. package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
  150. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
  151. package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
  152. package/min/synchronizers/with-schemas/index.js +1 -1
  153. package/min/synchronizers/with-schemas/index.js.gz +0 -0
  154. package/min/ui-react-inspector/index.js +1 -1
  155. package/min/ui-react-inspector/index.js.gz +0 -0
  156. package/min/ui-react-inspector/with-schemas/index.js +1 -1
  157. package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
  158. package/min/ui-solid-inspector/index.js +1 -1
  159. package/min/ui-solid-inspector/index.js.gz +0 -0
  160. package/min/ui-solid-inspector/with-schemas/index.js +1 -1
  161. package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
  162. package/min/ui-svelte-inspector/index.js +1 -1
  163. package/min/ui-svelte-inspector/index.js.gz +0 -0
  164. package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
  165. package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
  166. package/min/with-schemas/index.js +1 -1
  167. package/min/with-schemas/index.js.gz +0 -0
  168. package/omni/index.js +606 -179
  169. package/omni/with-schemas/index.js +606 -179
  170. package/package.json +12 -8
  171. package/persisters/index.js +49 -10
  172. package/persisters/persister-automerge/index.js +29 -5
  173. package/persisters/persister-automerge/with-schemas/index.js +29 -5
  174. package/persisters/persister-browser/index.js +29 -5
  175. package/persisters/persister-browser/with-schemas/index.js +29 -5
  176. package/persisters/persister-cr-sqlite-wasm/index.js +29 -5
  177. package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -5
  178. package/persisters/persister-durable-object-sql-storage/index.js +44 -8
  179. package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +44 -8
  180. package/persisters/persister-durable-object-storage/index.js +31 -5
  181. package/persisters/persister-durable-object-storage/with-schemas/index.js +31 -5
  182. package/persisters/persister-electric-sql/index.js +29 -5
  183. package/persisters/persister-electric-sql/with-schemas/index.js +29 -5
  184. package/persisters/persister-expo-sqlite/index.js +29 -5
  185. package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -5
  186. package/persisters/persister-file/index.js +31 -5
  187. package/persisters/persister-file/with-schemas/index.js +31 -5
  188. package/persisters/persister-indexed-db/index.js +29 -5
  189. package/persisters/persister-indexed-db/with-schemas/index.js +29 -5
  190. package/persisters/persister-libsql/index.js +29 -5
  191. package/persisters/persister-libsql/with-schemas/index.js +29 -5
  192. package/persisters/persister-partykit-client/index.js +31 -5
  193. package/persisters/persister-partykit-client/with-schemas/index.js +31 -5
  194. package/persisters/persister-pglite/index.js +49 -10
  195. package/persisters/persister-pglite/with-schemas/index.js +49 -10
  196. package/persisters/persister-postgres/index.js +49 -10
  197. package/persisters/persister-postgres/with-schemas/index.js +49 -10
  198. package/persisters/persister-powersync/index.js +29 -5
  199. package/persisters/persister-powersync/with-schemas/index.js +29 -5
  200. package/persisters/persister-react-native-mmkv/index.js +31 -5
  201. package/persisters/persister-react-native-mmkv/with-schemas/index.js +31 -5
  202. package/persisters/persister-react-native-sqlite/index.js +29 -5
  203. package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -5
  204. package/persisters/persister-remote/index.js +31 -5
  205. package/persisters/persister-remote/with-schemas/index.js +31 -5
  206. package/persisters/persister-sqlite-bun/index.js +29 -5
  207. package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -5
  208. package/persisters/persister-sqlite-wasm/index.js +29 -5
  209. package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -5
  210. package/persisters/persister-sqlite3/index.js +29 -5
  211. package/persisters/persister-sqlite3/with-schemas/index.js +29 -5
  212. package/persisters/persister-yjs/index.js +29 -5
  213. package/persisters/persister-yjs/with-schemas/index.js +29 -5
  214. package/persisters/with-schemas/index.js +49 -10
  215. package/queries/index.js +205 -74
  216. package/queries/with-schemas/index.js +205 -74
  217. package/readme.md +14 -14
  218. package/releases.md +84 -67
  219. package/synchronizers/index.js +31 -5
  220. package/synchronizers/synchronizer-broadcast-channel/index.js +39 -13
  221. package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +39 -13
  222. package/synchronizers/synchronizer-local/index.js +31 -5
  223. package/synchronizers/synchronizer-local/with-schemas/index.js +31 -5
  224. package/synchronizers/synchronizer-ws-client/index.js +220 -61
  225. package/synchronizers/synchronizer-ws-client/with-schemas/index.js +220 -61
  226. package/synchronizers/synchronizer-ws-server/index.js +253 -73
  227. package/synchronizers/synchronizer-ws-server/with-schemas/index.js +253 -73
  228. package/synchronizers/synchronizer-ws-server-durable-object/index.js +88 -40
  229. package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +88 -40
  230. package/synchronizers/synchronizer-ws-server-simple/index.js +184 -60
  231. package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +184 -60
  232. package/synchronizers/with-schemas/index.js +31 -5
  233. package/ui-react-inspector/index.js +29 -5
  234. package/ui-react-inspector/with-schemas/index.js +29 -5
  235. package/ui-solid-inspector/index.js +29 -5
  236. package/ui-solid-inspector/with-schemas/index.js +29 -5
  237. package/ui-svelte-inspector/index.js +29 -5
  238. package/ui-svelte-inspector/with-schemas/index.js +29 -5
  239. package/with-schemas/index.js +191 -74
package/package.json CHANGED
@@ -1,8 +1,11 @@
1
1
  {
2
2
  "name": "tinybase",
3
- "version": "9.4.0-beta.1",
3
+ "version": "9.4.0",
4
4
  "author": "jamesgpearce",
5
- "repository": "github:tinyplex/tinybase",
5
+ "repository": {
6
+ "type": "git",
7
+ "url": "git+https://github.com/tinyplex/tinybase.git"
8
+ },
6
9
  "license": "MIT",
7
10
  "homepage": "https://tinybase.org",
8
11
  "description": "A reactive in-memory data store with persistence and synchronization for local-first JavaScript and TypeScript apps.",
@@ -31,7 +34,7 @@
31
34
  "sideEffects": false,
32
35
  "peerDependencies": {
33
36
  "@automerge/automerge-repo": "^2.5.6",
34
- "@cloudflare/workers-types": "^5.20260726.1",
37
+ "@cloudflare/workers-types": "^5.20260807.2",
35
38
  "@electric-sql/pglite": "^0.5.4",
36
39
  "@libsql/client": "^0.17.4",
37
40
  "@powersync/common": "^2.0.0",
@@ -40,9 +43,9 @@
40
43
  "@vlcn.io/crsqlite-wasm": "^0.16.0",
41
44
  "arktype": "^2.2.3",
42
45
  "bun": "^1.3.14",
43
- "effect": "^3.22.0",
46
+ "effect": "^3.22.1",
44
47
  "electric-sql": "^0.12.1",
45
- "expo": "^57.0.8",
48
+ "expo": "^57.0.11",
46
49
  "expo-sqlite": "^57.0.1",
47
50
  "partykit": "^0.0.115",
48
51
  "partysocket": "^1.3.0",
@@ -55,8 +58,8 @@
55
58
  "sqlite3": "^5.1.7",
56
59
  "svelte": "^5.56.8",
57
60
  "valibot": "^1.4.2",
58
- "ws": "^8.21.1",
59
- "yjs": "^13.6.31",
61
+ "ws": "^8.21.3",
62
+ "yjs": "^13.6.32",
60
63
  "zod": "^4.4.3"
61
64
  },
62
65
  "peerDependenciesMeta": {
@@ -148,7 +151,8 @@
148
151
  "overrides": {
149
152
  "@rolldown/plugin-babel": {
150
153
  "@babel/plugin-transform-runtime": "7.29.7"
151
- }
154
+ },
155
+ "better-sqlite3": "$better-sqlite3"
152
156
  },
153
157
  "main": "./index.js",
154
158
  "types": "./@types/index.d.ts",
@@ -653,11 +653,35 @@ const createCustomPersister = (
653
653
  initialContent,
654
654
  startSaveFirst = false,
655
655
  ) => {
656
- const [call1, call2] = startSaveFirst
657
- ? [startAutoSave, startAutoLoad]
658
- : [startAutoLoad, startAutoSave];
659
- await call1(initialContent);
660
- await call2(initialContent);
656
+ const [call1, call2, stop1, stop2] = startSaveFirst
657
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
658
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
659
+ const start1 = call1(initialContent);
660
+ const generation1 = startSaveFirst
661
+ ? autoSaveGeneration
662
+ : autoLoadGeneration;
663
+ await start1;
664
+ const start2 = call2(initialContent);
665
+ const generation2 = startSaveFirst
666
+ ? autoLoadGeneration
667
+ : autoSaveGeneration;
668
+ try {
669
+ await start2;
670
+ } catch (error) {
671
+ if (
672
+ generation2 ==
673
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
674
+ ) {
675
+ await tryCatchIgnore(stop2);
676
+ }
677
+ if (
678
+ generation1 ==
679
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
680
+ ) {
681
+ await tryCatchIgnore(stop1);
682
+ }
683
+ throw error;
684
+ }
661
685
  return persister;
662
686
  };
663
687
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -1566,6 +1590,8 @@ const createTabularPersister = (
1566
1590
  const TABLE_CREATED = 'c';
1567
1591
  const DATA_CHANGED = 'd';
1568
1592
  const EVENT_REGEX = /^([cd]:)(.+)/;
1593
+ const SIMPLE_TABLE_NAME = /^[A-Za-z0-9_]+$/;
1594
+ const POSTGRES_IDENTIFIER_SIZE = 63;
1569
1595
  const listenerResourcesByThing = mapNew();
1570
1596
  const createCustomPostgreSqlPersister = (
1571
1597
  store,
@@ -1638,17 +1664,30 @@ const createCustomPostgreSqlPersister = (
1638
1664
  );
1639
1665
  const addDataChangedTriggers = (tableName, dataChangedFunction) =>
1640
1666
  promiseAll(
1641
- arrayMap([INSERT, DELETE, UPDATE], (action, newOrOldOrBoth) =>
1642
- createTrigger(
1667
+ arrayMap([INSERT, DELETE, UPDATE], (action, newOrOldOrBoth) => {
1668
+ const legacyTriggerId = arrayJoin(
1669
+ [TINYBASE, DATA_CHANGED, configHash, tableName, action],
1670
+ '_',
1671
+ );
1672
+ return createTrigger(
1643
1673
  OR_REPLACE,
1644
- escapeIds(TINYBASE, DATA_CHANGED, configHash, tableName, action),
1674
+ test(SIMPLE_TABLE_NAME, tableName) &&
1675
+ size(legacyTriggerId) <= POSTGRES_IDENTIFIER_SIZE
1676
+ ? escapeId(legacyTriggerId)
1677
+ : escapeIds(
1678
+ TINYBASE,
1679
+ DATA_CHANGED,
1680
+ configHash,
1681
+ action,
1682
+ EMPTY_STRING + getHash(tableName),
1683
+ ),
1645
1684
  `AFTER ${action} ON${escapeId(tableName)}FOR EACH ROW WHEN(${when(
1646
1685
  tableName,
1647
1686
  newOrOldOrBoth,
1648
1687
  )})`,
1649
1688
  dataChangedFunction,
1650
- ),
1651
- ),
1689
+ );
1690
+ }),
1652
1691
  );
1653
1692
  const dropFunctions = async (functionNames) => {
1654
1693
  if (!isEmpty(functionNames)) {
@@ -618,11 +618,35 @@ const createCustomPersister = (
618
618
  initialContent,
619
619
  startSaveFirst = false,
620
620
  ) => {
621
- const [call1, call2] = startSaveFirst
622
- ? [startAutoSave, startAutoLoad]
623
- : [startAutoLoad, startAutoSave];
624
- await call1(initialContent);
625
- await call2(initialContent);
621
+ const [call1, call2, stop1, stop2] = startSaveFirst
622
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
623
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
624
+ const start1 = call1(initialContent);
625
+ const generation1 = startSaveFirst
626
+ ? autoSaveGeneration
627
+ : autoLoadGeneration;
628
+ await start1;
629
+ const start2 = call2(initialContent);
630
+ const generation2 = startSaveFirst
631
+ ? autoLoadGeneration
632
+ : autoSaveGeneration;
633
+ try {
634
+ await start2;
635
+ } catch (error) {
636
+ if (
637
+ generation2 ==
638
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
639
+ ) {
640
+ await tryCatchIgnore(stop2);
641
+ }
642
+ if (
643
+ generation1 ==
644
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
645
+ ) {
646
+ await tryCatchIgnore(stop1);
647
+ }
648
+ throw error;
649
+ }
626
650
  return persister;
627
651
  };
628
652
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -618,11 +618,35 @@ const createCustomPersister = (
618
618
  initialContent,
619
619
  startSaveFirst = false,
620
620
  ) => {
621
- const [call1, call2] = startSaveFirst
622
- ? [startAutoSave, startAutoLoad]
623
- : [startAutoLoad, startAutoSave];
624
- await call1(initialContent);
625
- await call2(initialContent);
621
+ const [call1, call2, stop1, stop2] = startSaveFirst
622
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
623
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
624
+ const start1 = call1(initialContent);
625
+ const generation1 = startSaveFirst
626
+ ? autoSaveGeneration
627
+ : autoLoadGeneration;
628
+ await start1;
629
+ const start2 = call2(initialContent);
630
+ const generation2 = startSaveFirst
631
+ ? autoLoadGeneration
632
+ : autoSaveGeneration;
633
+ try {
634
+ await start2;
635
+ } catch (error) {
636
+ if (
637
+ generation2 ==
638
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
639
+ ) {
640
+ await tryCatchIgnore(stop2);
641
+ }
642
+ if (
643
+ generation1 ==
644
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
645
+ ) {
646
+ await tryCatchIgnore(stop1);
647
+ }
648
+ throw error;
649
+ }
626
650
  return persister;
627
651
  };
628
652
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -623,11 +623,35 @@ const createCustomPersister = (
623
623
  initialContent,
624
624
  startSaveFirst = false,
625
625
  ) => {
626
- const [call1, call2] = startSaveFirst
627
- ? [startAutoSave, startAutoLoad]
628
- : [startAutoLoad, startAutoSave];
629
- await call1(initialContent);
630
- await call2(initialContent);
626
+ const [call1, call2, stop1, stop2] = startSaveFirst
627
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
628
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
629
+ const start1 = call1(initialContent);
630
+ const generation1 = startSaveFirst
631
+ ? autoSaveGeneration
632
+ : autoLoadGeneration;
633
+ await start1;
634
+ const start2 = call2(initialContent);
635
+ const generation2 = startSaveFirst
636
+ ? autoLoadGeneration
637
+ : autoSaveGeneration;
638
+ try {
639
+ await start2;
640
+ } catch (error) {
641
+ if (
642
+ generation2 ==
643
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
644
+ ) {
645
+ await tryCatchIgnore(stop2);
646
+ }
647
+ if (
648
+ generation1 ==
649
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
650
+ ) {
651
+ await tryCatchIgnore(stop1);
652
+ }
653
+ throw error;
654
+ }
631
655
  return persister;
632
656
  };
633
657
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -623,11 +623,35 @@ const createCustomPersister = (
623
623
  initialContent,
624
624
  startSaveFirst = false,
625
625
  ) => {
626
- const [call1, call2] = startSaveFirst
627
- ? [startAutoSave, startAutoLoad]
628
- : [startAutoLoad, startAutoSave];
629
- await call1(initialContent);
630
- await call2(initialContent);
626
+ const [call1, call2, stop1, stop2] = startSaveFirst
627
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
628
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
629
+ const start1 = call1(initialContent);
630
+ const generation1 = startSaveFirst
631
+ ? autoSaveGeneration
632
+ : autoLoadGeneration;
633
+ await start1;
634
+ const start2 = call2(initialContent);
635
+ const generation2 = startSaveFirst
636
+ ? autoLoadGeneration
637
+ : autoSaveGeneration;
638
+ try {
639
+ await start2;
640
+ } catch (error) {
641
+ if (
642
+ generation2 ==
643
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
644
+ ) {
645
+ await tryCatchIgnore(stop2);
646
+ }
647
+ if (
648
+ generation1 ==
649
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
650
+ ) {
651
+ await tryCatchIgnore(stop1);
652
+ }
653
+ throw error;
654
+ }
631
655
  return persister;
632
656
  };
633
657
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -826,11 +826,35 @@ const createCustomPersister = (
826
826
  initialContent,
827
827
  startSaveFirst = false,
828
828
  ) => {
829
- const [call1, call2] = startSaveFirst
830
- ? [startAutoSave, startAutoLoad]
831
- : [startAutoLoad, startAutoSave];
832
- await call1(initialContent);
833
- await call2(initialContent);
829
+ const [call1, call2, stop1, stop2] = startSaveFirst
830
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
831
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
832
+ const start1 = call1(initialContent);
833
+ const generation1 = startSaveFirst
834
+ ? autoSaveGeneration
835
+ : autoLoadGeneration;
836
+ await start1;
837
+ const start2 = call2(initialContent);
838
+ const generation2 = startSaveFirst
839
+ ? autoLoadGeneration
840
+ : autoSaveGeneration;
841
+ try {
842
+ await start2;
843
+ } catch (error) {
844
+ if (
845
+ generation2 ==
846
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
847
+ ) {
848
+ await tryCatchIgnore(stop2);
849
+ }
850
+ if (
851
+ generation1 ==
852
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
853
+ ) {
854
+ await tryCatchIgnore(stop1);
855
+ }
856
+ throw error;
857
+ }
834
858
  return persister;
835
859
  };
836
860
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -826,11 +826,35 @@ const createCustomPersister = (
826
826
  initialContent,
827
827
  startSaveFirst = false,
828
828
  ) => {
829
- const [call1, call2] = startSaveFirst
830
- ? [startAutoSave, startAutoLoad]
831
- : [startAutoLoad, startAutoSave];
832
- await call1(initialContent);
833
- await call2(initialContent);
829
+ const [call1, call2, stop1, stop2] = startSaveFirst
830
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
831
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
832
+ const start1 = call1(initialContent);
833
+ const generation1 = startSaveFirst
834
+ ? autoSaveGeneration
835
+ : autoLoadGeneration;
836
+ await start1;
837
+ const start2 = call2(initialContent);
838
+ const generation2 = startSaveFirst
839
+ ? autoLoadGeneration
840
+ : autoSaveGeneration;
841
+ try {
842
+ await start2;
843
+ } catch (error) {
844
+ if (
845
+ generation2 ==
846
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
847
+ ) {
848
+ await tryCatchIgnore(stop2);
849
+ }
850
+ if (
851
+ generation1 ==
852
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
853
+ ) {
854
+ await tryCatchIgnore(stop1);
855
+ }
856
+ throw error;
857
+ }
834
858
  return persister;
835
859
  };
836
860
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -687,11 +687,35 @@ const createCustomPersister = (
687
687
  initialContent,
688
688
  startSaveFirst = false,
689
689
  ) => {
690
- const [call1, call2] = startSaveFirst
691
- ? [startAutoSave, startAutoLoad]
692
- : [startAutoLoad, startAutoSave];
693
- await call1(initialContent);
694
- await call2(initialContent);
690
+ const [call1, call2, stop1, stop2] = startSaveFirst
691
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
692
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
693
+ const start1 = call1(initialContent);
694
+ const generation1 = startSaveFirst
695
+ ? autoSaveGeneration
696
+ : autoLoadGeneration;
697
+ await start1;
698
+ const start2 = call2(initialContent);
699
+ const generation2 = startSaveFirst
700
+ ? autoLoadGeneration
701
+ : autoSaveGeneration;
702
+ try {
703
+ await start2;
704
+ } catch (error) {
705
+ if (
706
+ generation2 ==
707
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
708
+ ) {
709
+ await tryCatchIgnore(stop2);
710
+ }
711
+ if (
712
+ generation1 ==
713
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
714
+ ) {
715
+ await tryCatchIgnore(stop1);
716
+ }
717
+ throw error;
718
+ }
695
719
  return persister;
696
720
  };
697
721
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -1759,15 +1783,27 @@ const stampNewObjectWithHash = () =>
1759
1783
  stampNewWithHash(objNew(), EMPTY_STRING, 0);
1760
1784
  const escapeGeneratedId = (id) =>
1761
1785
  test(/^[a-zA-Z_][a-zA-Z0-9_]*$/, id) ? id : escapeId(id);
1786
+ const encodeStoragePrefix = (storagePrefix) =>
1787
+ arrayJoin(
1788
+ arrayMap(
1789
+ strSplit(storagePrefix),
1790
+ (character) =>
1791
+ '$' + slice((65536 + character.charCodeAt(0)).toString(16), 1),
1792
+ ),
1793
+ );
1762
1794
  const createDurableObjectFragmentedSqlStoragePersister = (
1763
1795
  store,
1764
1796
  sqlStorage,
1765
1797
  storagePrefix = EMPTY_STRING,
1766
1798
  onIgnoredError,
1767
1799
  ) => {
1768
- const tablePrefix = strReplace(storagePrefix, /[^a-zA-Z0-9_]/g, '_');
1769
- const tablesTable = escapeGeneratedId(`${tablePrefix}tinybase_tables`);
1770
- const valuesTable = escapeGeneratedId(`${tablePrefix}tinybase_values`);
1800
+ const tablePrefix = test(/^[a-z0-9_]*$/, storagePrefix)
1801
+ ? storagePrefix
1802
+ : `$tinybase$${encodeStoragePrefix(storagePrefix)}$`;
1803
+ const tablesTableId = `${tablePrefix}tinybase_tables`;
1804
+ const valuesTableId = `${tablePrefix}tinybase_values`;
1805
+ const tablesTable = escapeGeneratedId(tablesTableId);
1806
+ const valuesTable = escapeGeneratedId(valuesTableId);
1771
1807
  const insertTableSql = `INSERT INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`;
1772
1808
  const insertValueSql = `INSERT INTO ${valuesTable} (value_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?)`;
1773
1809
  const getRowKey = (tableId, rowId) => jsonString([tableId, rowId]);
@@ -687,11 +687,35 @@ const createCustomPersister = (
687
687
  initialContent,
688
688
  startSaveFirst = false,
689
689
  ) => {
690
- const [call1, call2] = startSaveFirst
691
- ? [startAutoSave, startAutoLoad]
692
- : [startAutoLoad, startAutoSave];
693
- await call1(initialContent);
694
- await call2(initialContent);
690
+ const [call1, call2, stop1, stop2] = startSaveFirst
691
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
692
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
693
+ const start1 = call1(initialContent);
694
+ const generation1 = startSaveFirst
695
+ ? autoSaveGeneration
696
+ : autoLoadGeneration;
697
+ await start1;
698
+ const start2 = call2(initialContent);
699
+ const generation2 = startSaveFirst
700
+ ? autoLoadGeneration
701
+ : autoSaveGeneration;
702
+ try {
703
+ await start2;
704
+ } catch (error) {
705
+ if (
706
+ generation2 ==
707
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
708
+ ) {
709
+ await tryCatchIgnore(stop2);
710
+ }
711
+ if (
712
+ generation1 ==
713
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
714
+ ) {
715
+ await tryCatchIgnore(stop1);
716
+ }
717
+ throw error;
718
+ }
695
719
  return persister;
696
720
  };
697
721
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -1759,15 +1783,27 @@ const stampNewObjectWithHash = () =>
1759
1783
  stampNewWithHash(objNew(), EMPTY_STRING, 0);
1760
1784
  const escapeGeneratedId = (id) =>
1761
1785
  test(/^[a-zA-Z_][a-zA-Z0-9_]*$/, id) ? id : escapeId(id);
1786
+ const encodeStoragePrefix = (storagePrefix) =>
1787
+ arrayJoin(
1788
+ arrayMap(
1789
+ strSplit(storagePrefix),
1790
+ (character) =>
1791
+ '$' + slice((65536 + character.charCodeAt(0)).toString(16), 1),
1792
+ ),
1793
+ );
1762
1794
  const createDurableObjectFragmentedSqlStoragePersister = (
1763
1795
  store,
1764
1796
  sqlStorage,
1765
1797
  storagePrefix = EMPTY_STRING,
1766
1798
  onIgnoredError,
1767
1799
  ) => {
1768
- const tablePrefix = strReplace(storagePrefix, /[^a-zA-Z0-9_]/g, '_');
1769
- const tablesTable = escapeGeneratedId(`${tablePrefix}tinybase_tables`);
1770
- const valuesTable = escapeGeneratedId(`${tablePrefix}tinybase_values`);
1800
+ const tablePrefix = test(/^[a-z0-9_]*$/, storagePrefix)
1801
+ ? storagePrefix
1802
+ : `$tinybase$${encodeStoragePrefix(storagePrefix)}$`;
1803
+ const tablesTableId = `${tablePrefix}tinybase_tables`;
1804
+ const valuesTableId = `${tablePrefix}tinybase_values`;
1805
+ const tablesTable = escapeGeneratedId(tablesTableId);
1806
+ const valuesTable = escapeGeneratedId(valuesTableId);
1771
1807
  const insertTableSql = `INSERT INTO ${tablesTable} (type, table_id, row_id, cell_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?, ?, ?, ?)`;
1772
1808
  const insertValueSql = `INSERT INTO ${valuesTable} (value_id, value_data, timestamp, hash) VALUES (?, ?, ?, ?)`;
1773
1809
  const getRowKey = (tableId, rowId) => jsonString([tableId, rowId]);
@@ -66,6 +66,8 @@ const tryCatch = async (action, onError) => {
66
66
  onError?.(error);
67
67
  }
68
68
  };
69
+ const tryCatchIgnore = (action, onIgnoredError) =>
70
+ tryCatch(action, (error) => void tryCatch(() => onIgnoredError?.(error)));
69
71
  const tryCatchSync = (action, onError) => {
70
72
  try {
71
73
  return action();
@@ -637,11 +639,35 @@ const createCustomPersister = (
637
639
  initialContent,
638
640
  startSaveFirst = false,
639
641
  ) => {
640
- const [call1, call2] = startSaveFirst
641
- ? [startAutoSave, startAutoLoad]
642
- : [startAutoLoad, startAutoSave];
643
- await call1(initialContent);
644
- await call2(initialContent);
642
+ const [call1, call2, stop1, stop2] = startSaveFirst
643
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
644
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
645
+ const start1 = call1(initialContent);
646
+ const generation1 = startSaveFirst
647
+ ? autoSaveGeneration
648
+ : autoLoadGeneration;
649
+ await start1;
650
+ const start2 = call2(initialContent);
651
+ const generation2 = startSaveFirst
652
+ ? autoLoadGeneration
653
+ : autoSaveGeneration;
654
+ try {
655
+ await start2;
656
+ } catch (error) {
657
+ if (
658
+ generation2 ==
659
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
660
+ ) {
661
+ await tryCatchIgnore(stop2);
662
+ }
663
+ if (
664
+ generation1 ==
665
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
666
+ ) {
667
+ await tryCatchIgnore(stop1);
668
+ }
669
+ throw error;
670
+ }
645
671
  return persister;
646
672
  };
647
673
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -66,6 +66,8 @@ const tryCatch = async (action, onError) => {
66
66
  onError?.(error);
67
67
  }
68
68
  };
69
+ const tryCatchIgnore = (action, onIgnoredError) =>
70
+ tryCatch(action, (error) => void tryCatch(() => onIgnoredError?.(error)));
69
71
  const tryCatchSync = (action, onError) => {
70
72
  try {
71
73
  return action();
@@ -637,11 +639,35 @@ const createCustomPersister = (
637
639
  initialContent,
638
640
  startSaveFirst = false,
639
641
  ) => {
640
- const [call1, call2] = startSaveFirst
641
- ? [startAutoSave, startAutoLoad]
642
- : [startAutoLoad, startAutoSave];
643
- await call1(initialContent);
644
- await call2(initialContent);
642
+ const [call1, call2, stop1, stop2] = startSaveFirst
643
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
644
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
645
+ const start1 = call1(initialContent);
646
+ const generation1 = startSaveFirst
647
+ ? autoSaveGeneration
648
+ : autoLoadGeneration;
649
+ await start1;
650
+ const start2 = call2(initialContent);
651
+ const generation2 = startSaveFirst
652
+ ? autoLoadGeneration
653
+ : autoSaveGeneration;
654
+ try {
655
+ await start2;
656
+ } catch (error) {
657
+ if (
658
+ generation2 ==
659
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
660
+ ) {
661
+ await tryCatchIgnore(stop2);
662
+ }
663
+ if (
664
+ generation1 ==
665
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
666
+ ) {
667
+ await tryCatchIgnore(stop1);
668
+ }
669
+ throw error;
670
+ }
645
671
  return persister;
646
672
  };
647
673
  const stopAutoPersisting = async (stopSaveFirst = false) => {
@@ -826,11 +826,35 @@ const createCustomPersister = (
826
826
  initialContent,
827
827
  startSaveFirst = false,
828
828
  ) => {
829
- const [call1, call2] = startSaveFirst
830
- ? [startAutoSave, startAutoLoad]
831
- : [startAutoLoad, startAutoSave];
832
- await call1(initialContent);
833
- await call2(initialContent);
829
+ const [call1, call2, stop1, stop2] = startSaveFirst
830
+ ? [startAutoSave, startAutoLoad, stopAutoSave, stopAutoLoad]
831
+ : [startAutoLoad, startAutoSave, stopAutoLoad, stopAutoSave];
832
+ const start1 = call1(initialContent);
833
+ const generation1 = startSaveFirst
834
+ ? autoSaveGeneration
835
+ : autoLoadGeneration;
836
+ await start1;
837
+ const start2 = call2(initialContent);
838
+ const generation2 = startSaveFirst
839
+ ? autoLoadGeneration
840
+ : autoSaveGeneration;
841
+ try {
842
+ await start2;
843
+ } catch (error) {
844
+ if (
845
+ generation2 ==
846
+ (startSaveFirst ? autoLoadGeneration : autoSaveGeneration)
847
+ ) {
848
+ await tryCatchIgnore(stop2);
849
+ }
850
+ if (
851
+ generation1 ==
852
+ (startSaveFirst ? autoSaveGeneration : autoLoadGeneration)
853
+ ) {
854
+ await tryCatchIgnore(stop1);
855
+ }
856
+ throw error;
857
+ }
834
858
  return persister;
835
859
  };
836
860
  const stopAutoPersisting = async (stopSaveFirst = false) => {