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.
- package/@types/persisters/index.d.ts +4 -0
- package/@types/persisters/persister-durable-object-sql-storage/index.d.ts +9 -2
- package/@types/persisters/persister-durable-object-sql-storage/with-schemas/index.d.ts +9 -2
- package/@types/persisters/with-schemas/index.d.ts +4 -0
- package/@types/queries/index.d.ts +4 -0
- package/@types/queries/with-schemas/index.d.ts +4 -0
- package/@types/synchronizers/synchronizer-ws-client/index.d.ts +7 -3
- package/@types/synchronizers/synchronizer-ws-client/with-schemas/index.d.ts +7 -3
- package/@types/synchronizers/synchronizer-ws-server/index.d.ts +9 -3
- package/@types/synchronizers/synchronizer-ws-server/with-schemas/index.d.ts +9 -3
- package/@types/synchronizers/synchronizer-ws-server-simple/index.d.ts +6 -3
- package/@types/synchronizers/synchronizer-ws-server-simple/with-schemas/index.d.ts +6 -3
- package/@types/ui-react-dom/index.d.ts +10 -10
- package/@types/ui-react-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-react-dom-charts/index.d.ts +7 -7
- package/@types/ui-react-dom-charts/with-schemas/index.d.ts +7 -7
- package/@types/ui-react-inspector/index.d.ts +1 -1
- package/@types/ui-react-inspector/with-schemas/index.d.ts +1 -1
- package/@types/ui-solid-dom/index.d.ts +10 -10
- package/@types/ui-solid-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-solid-inspector/index.d.ts +1 -1
- package/@types/ui-solid-inspector/with-schemas/index.d.ts +1 -1
- package/@types/ui-svelte-dom/index.d.ts +10 -10
- package/@types/ui-svelte-dom/with-schemas/index.d.ts +10 -10
- package/@types/ui-svelte-inspector/index.d.ts +1 -1
- package/@types/ui-svelte-inspector/with-schemas/index.d.ts +1 -1
- package/index.js +191 -74
- package/min/index.js +1 -1
- package/min/index.js.gz +0 -0
- package/min/omni/index.js +1 -1
- package/min/omni/index.js.gz +0 -0
- package/min/omni/with-schemas/index.js +1 -1
- package/min/omni/with-schemas/index.js.gz +0 -0
- package/min/persisters/index.js +1 -1
- package/min/persisters/index.js.gz +0 -0
- package/min/persisters/persister-automerge/index.js +1 -1
- package/min/persisters/persister-automerge/index.js.gz +0 -0
- package/min/persisters/persister-automerge/with-schemas/index.js +1 -1
- package/min/persisters/persister-automerge/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-browser/index.js +1 -1
- package/min/persisters/persister-browser/index.js.gz +0 -0
- package/min/persisters/persister-browser/with-schemas/index.js +1 -1
- package/min/persisters/persister-browser/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-cr-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-sql-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/index.js.gz +0 -0
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js +1 -1
- package/min/persisters/persister-durable-object-storage/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/index.js +1 -1
- package/min/persisters/persister-electric-sql/index.js.gz +0 -0
- package/min/persisters/persister-electric-sql/with-schemas/index.js +1 -1
- package/min/persisters/persister-electric-sql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-expo-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-file/index.js +1 -1
- package/min/persisters/persister-file/index.js.gz +0 -0
- package/min/persisters/persister-file/with-schemas/index.js +1 -1
- package/min/persisters/persister-file/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/index.js +1 -1
- package/min/persisters/persister-indexed-db/index.js.gz +0 -0
- package/min/persisters/persister-indexed-db/with-schemas/index.js +1 -1
- package/min/persisters/persister-indexed-db/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-libsql/index.js +1 -1
- package/min/persisters/persister-libsql/index.js.gz +0 -0
- package/min/persisters/persister-libsql/with-schemas/index.js +1 -1
- package/min/persisters/persister-libsql/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/index.js +1 -1
- package/min/persisters/persister-partykit-client/index.js.gz +0 -0
- package/min/persisters/persister-partykit-client/with-schemas/index.js +1 -1
- package/min/persisters/persister-partykit-client/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-pglite/index.js +1 -1
- package/min/persisters/persister-pglite/index.js.gz +0 -0
- package/min/persisters/persister-pglite/with-schemas/index.js +1 -1
- package/min/persisters/persister-pglite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-postgres/index.js +1 -1
- package/min/persisters/persister-postgres/index.js.gz +0 -0
- package/min/persisters/persister-postgres/with-schemas/index.js +1 -1
- package/min/persisters/persister-postgres/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-powersync/index.js +1 -1
- package/min/persisters/persister-powersync/index.js.gz +0 -0
- package/min/persisters/persister-powersync/with-schemas/index.js +1 -1
- package/min/persisters/persister-powersync/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/index.js +1 -1
- package/min/persisters/persister-react-native-mmkv/index.js.gz +0 -0
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-mmkv/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/index.js.gz +0 -0
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js +1 -1
- package/min/persisters/persister-react-native-sqlite/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-remote/index.js +1 -1
- package/min/persisters/persister-remote/index.js.gz +0 -0
- package/min/persisters/persister-remote/with-schemas/index.js +1 -1
- package/min/persisters/persister-remote/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-bun/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/index.js.gz +0 -0
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite-wasm/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/index.js +1 -1
- package/min/persisters/persister-sqlite3/index.js.gz +0 -0
- package/min/persisters/persister-sqlite3/with-schemas/index.js +1 -1
- package/min/persisters/persister-sqlite3/with-schemas/index.js.gz +0 -0
- package/min/persisters/persister-yjs/index.js +1 -1
- package/min/persisters/persister-yjs/index.js.gz +0 -0
- package/min/persisters/persister-yjs/with-schemas/index.js +1 -1
- package/min/persisters/persister-yjs/with-schemas/index.js.gz +0 -0
- package/min/persisters/with-schemas/index.js +1 -1
- package/min/persisters/with-schemas/index.js.gz +0 -0
- package/min/queries/index.js +1 -1
- package/min/queries/index.js.gz +0 -0
- package/min/queries/with-schemas/index.js +1 -1
- package/min/queries/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/index.js +1 -1
- package/min/synchronizers/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/index.js +1 -1
- package/min/synchronizers/synchronizer-local/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-local/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-local/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-client/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/index.js.gz +0 -0
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +1 -1
- package/min/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js.gz +0 -0
- package/min/synchronizers/with-schemas/index.js +1 -1
- package/min/synchronizers/with-schemas/index.js.gz +0 -0
- package/min/ui-react-inspector/index.js +1 -1
- package/min/ui-react-inspector/index.js.gz +0 -0
- package/min/ui-react-inspector/with-schemas/index.js +1 -1
- package/min/ui-react-inspector/with-schemas/index.js.gz +0 -0
- package/min/ui-solid-inspector/index.js +1 -1
- package/min/ui-solid-inspector/index.js.gz +0 -0
- package/min/ui-solid-inspector/with-schemas/index.js +1 -1
- package/min/ui-solid-inspector/with-schemas/index.js.gz +0 -0
- package/min/ui-svelte-inspector/index.js +1 -1
- package/min/ui-svelte-inspector/index.js.gz +0 -0
- package/min/ui-svelte-inspector/with-schemas/index.js +1 -1
- package/min/ui-svelte-inspector/with-schemas/index.js.gz +0 -0
- package/min/with-schemas/index.js +1 -1
- package/min/with-schemas/index.js.gz +0 -0
- package/omni/index.js +606 -179
- package/omni/with-schemas/index.js +606 -179
- package/package.json +12 -8
- package/persisters/index.js +49 -10
- package/persisters/persister-automerge/index.js +29 -5
- package/persisters/persister-automerge/with-schemas/index.js +29 -5
- package/persisters/persister-browser/index.js +29 -5
- package/persisters/persister-browser/with-schemas/index.js +29 -5
- package/persisters/persister-cr-sqlite-wasm/index.js +29 -5
- package/persisters/persister-cr-sqlite-wasm/with-schemas/index.js +29 -5
- package/persisters/persister-durable-object-sql-storage/index.js +44 -8
- package/persisters/persister-durable-object-sql-storage/with-schemas/index.js +44 -8
- package/persisters/persister-durable-object-storage/index.js +31 -5
- package/persisters/persister-durable-object-storage/with-schemas/index.js +31 -5
- package/persisters/persister-electric-sql/index.js +29 -5
- package/persisters/persister-electric-sql/with-schemas/index.js +29 -5
- package/persisters/persister-expo-sqlite/index.js +29 -5
- package/persisters/persister-expo-sqlite/with-schemas/index.js +29 -5
- package/persisters/persister-file/index.js +31 -5
- package/persisters/persister-file/with-schemas/index.js +31 -5
- package/persisters/persister-indexed-db/index.js +29 -5
- package/persisters/persister-indexed-db/with-schemas/index.js +29 -5
- package/persisters/persister-libsql/index.js +29 -5
- package/persisters/persister-libsql/with-schemas/index.js +29 -5
- package/persisters/persister-partykit-client/index.js +31 -5
- package/persisters/persister-partykit-client/with-schemas/index.js +31 -5
- package/persisters/persister-pglite/index.js +49 -10
- package/persisters/persister-pglite/with-schemas/index.js +49 -10
- package/persisters/persister-postgres/index.js +49 -10
- package/persisters/persister-postgres/with-schemas/index.js +49 -10
- package/persisters/persister-powersync/index.js +29 -5
- package/persisters/persister-powersync/with-schemas/index.js +29 -5
- package/persisters/persister-react-native-mmkv/index.js +31 -5
- package/persisters/persister-react-native-mmkv/with-schemas/index.js +31 -5
- package/persisters/persister-react-native-sqlite/index.js +29 -5
- package/persisters/persister-react-native-sqlite/with-schemas/index.js +29 -5
- package/persisters/persister-remote/index.js +31 -5
- package/persisters/persister-remote/with-schemas/index.js +31 -5
- package/persisters/persister-sqlite-bun/index.js +29 -5
- package/persisters/persister-sqlite-bun/with-schemas/index.js +29 -5
- package/persisters/persister-sqlite-wasm/index.js +29 -5
- package/persisters/persister-sqlite-wasm/with-schemas/index.js +29 -5
- package/persisters/persister-sqlite3/index.js +29 -5
- package/persisters/persister-sqlite3/with-schemas/index.js +29 -5
- package/persisters/persister-yjs/index.js +29 -5
- package/persisters/persister-yjs/with-schemas/index.js +29 -5
- package/persisters/with-schemas/index.js +49 -10
- package/queries/index.js +205 -74
- package/queries/with-schemas/index.js +205 -74
- package/readme.md +14 -14
- package/releases.md +84 -67
- package/synchronizers/index.js +31 -5
- package/synchronizers/synchronizer-broadcast-channel/index.js +39 -13
- package/synchronizers/synchronizer-broadcast-channel/with-schemas/index.js +39 -13
- package/synchronizers/synchronizer-local/index.js +31 -5
- package/synchronizers/synchronizer-local/with-schemas/index.js +31 -5
- package/synchronizers/synchronizer-ws-client/index.js +220 -61
- package/synchronizers/synchronizer-ws-client/with-schemas/index.js +220 -61
- package/synchronizers/synchronizer-ws-server/index.js +253 -73
- package/synchronizers/synchronizer-ws-server/with-schemas/index.js +253 -73
- package/synchronizers/synchronizer-ws-server-durable-object/index.js +88 -40
- package/synchronizers/synchronizer-ws-server-durable-object/with-schemas/index.js +88 -40
- package/synchronizers/synchronizer-ws-server-simple/index.js +184 -60
- package/synchronizers/synchronizer-ws-server-simple/with-schemas/index.js +184 -60
- package/synchronizers/with-schemas/index.js +31 -5
- package/ui-react-inspector/index.js +29 -5
- package/ui-react-inspector/with-schemas/index.js +29 -5
- package/ui-solid-inspector/index.js +29 -5
- package/ui-solid-inspector/with-schemas/index.js +29 -5
- package/ui-svelte-inspector/index.js +29 -5
- package/ui-svelte-inspector/with-schemas/index.js +29 -5
- package/with-schemas/index.js +191 -74
|
@@ -1340,6 +1340,10 @@ export interface Persister<Persist extends Persists = Persists.StoreOnly> {
|
|
|
1340
1340
|
* This simply runs the startAutoLoad and startAutoSave methods in sequence,
|
|
1341
1341
|
* and returns a Promise that resolves when both have completed.
|
|
1342
1342
|
*
|
|
1343
|
+
* If the second method fails after either half has partially started, both
|
|
1344
|
+
* halves are stopped again before this method rejects. The original startup
|
|
1345
|
+
* error is preserved if that cleanup also fails.
|
|
1346
|
+
*
|
|
1343
1347
|
* This method can take `initialContent` to pass to the startAutoLoad method.
|
|
1344
1348
|
* See its documentation for more details.
|
|
1345
1349
|
*
|
|
@@ -78,8 +78,15 @@ export type DpcFragmented = {
|
|
|
78
78
|
* This is useful when you have multiple stores or applications sharing the
|
|
79
79
|
* same Durable Object SQL storage and want to avoid table name conflicts.
|
|
80
80
|
*
|
|
81
|
-
*
|
|
82
|
-
* underscores.
|
|
81
|
+
* Empty prefixes and those containing only lower-case ASCII letters, digits,
|
|
82
|
+
* and underscores are used as-is. Other prefixes are encoded so that distinct
|
|
83
|
+
* prefixes cannot resolve to the same tables, including under SQLite's
|
|
84
|
+
* case-insensitive identifier rules.
|
|
85
|
+
*
|
|
86
|
+
* Tables created for prefixes that are now encoded, including uppercase
|
|
87
|
+
* prefixes and those previously changed by lossy sanitization, are not copied
|
|
88
|
+
* automatically because their names may legitimately belong to another
|
|
89
|
+
* prefix. Migrate those tables explicitly before using the new prefix.
|
|
83
90
|
* @example
|
|
84
91
|
* This example shows a configuration using the storagePrefix setting. With a
|
|
85
92
|
* `storagePrefix` of 'user_data_', it creates `user_data_tinybase_tables` and
|
|
@@ -86,8 +86,15 @@ export type DpcFragmented = {
|
|
|
86
86
|
* This is useful when you have multiple stores or applications sharing the
|
|
87
87
|
* same Durable Object SQL storage and want to avoid table name conflicts.
|
|
88
88
|
*
|
|
89
|
-
*
|
|
90
|
-
* underscores.
|
|
89
|
+
* Empty prefixes and those containing only lower-case ASCII letters, digits,
|
|
90
|
+
* and underscores are used as-is. Other prefixes are encoded so that distinct
|
|
91
|
+
* prefixes cannot resolve to the same tables, including under SQLite's
|
|
92
|
+
* case-insensitive identifier rules.
|
|
93
|
+
*
|
|
94
|
+
* Tables created for prefixes that are now encoded, including uppercase
|
|
95
|
+
* prefixes and those previously changed by lossy sanitization, are not copied
|
|
96
|
+
* automatically because their names may legitimately belong to another
|
|
97
|
+
* prefix. Migrate those tables explicitly before using the new prefix.
|
|
91
98
|
* @example
|
|
92
99
|
* This example shows a configuration using the storagePrefix setting. With a
|
|
93
100
|
* `storagePrefix` of 'user_data_', it creates `user_data_tinybase_tables` and
|
|
@@ -1461,6 +1461,10 @@ export interface Persister<
|
|
|
1461
1461
|
* This simply runs the startAutoLoad and startAutoSave methods in sequence,
|
|
1462
1462
|
* and returns a Promise that resolves when both have completed.
|
|
1463
1463
|
*
|
|
1464
|
+
* If the second method fails after either half has partially started, both
|
|
1465
|
+
* halves are stopped again before this method rejects. The original startup
|
|
1466
|
+
* error is preserved if that cleanup also fails.
|
|
1467
|
+
*
|
|
1464
1468
|
* This method can take `initialContent` to pass to the startAutoLoad method.
|
|
1465
1469
|
* See its documentation for more details.
|
|
1466
1470
|
*
|
|
@@ -1039,6 +1039,10 @@ export type CellIdMapper = (cellId: Id) => Id;
|
|
|
1039
1039
|
* is expanded into individual selections. The query is rebuilt if this union
|
|
1040
1040
|
* changes, and any selected Cell that is not grouped becomes a grouping
|
|
1041
1041
|
* dimension as usual.
|
|
1042
|
+
*
|
|
1043
|
+
* A cycle between query results is allowed when every SelectAll clause retains
|
|
1044
|
+
* its source Cell Ids. A prefix or CellIdMapper callback in such a cycle is
|
|
1045
|
+
* rejected because it could expand Cell Ids indefinitely.
|
|
1042
1046
|
* @category Definition
|
|
1043
1047
|
* @since v9.4.0
|
|
1044
1048
|
*/
|
|
@@ -1186,6 +1186,10 @@ export type CellIdMapper<CellId extends Id = Id> = (cellId: CellId) => Id;
|
|
|
1186
1186
|
* is expanded into individual selections. The query is rebuilt if this union
|
|
1187
1187
|
* changes, and any selected Cell that is not grouped becomes a grouping
|
|
1188
1188
|
* dimension as usual.
|
|
1189
|
+
*
|
|
1190
|
+
* A cycle between query results is allowed when every SelectAll clause retains
|
|
1191
|
+
* its source Cell Ids. A prefix or CellIdMapper callback in such a cycle is
|
|
1192
|
+
* rejected because it could expand Cell Ids indefinitely.
|
|
1189
1193
|
* @category Definition
|
|
1190
1194
|
* @since v9.4.0
|
|
1191
1195
|
*/
|
|
@@ -177,7 +177,9 @@ export function createWsSynchronizer<WebSocketType extends WebSocketTypes>(
|
|
|
177
177
|
* Construct the WebSocket with the `tinybase` subprotocol and provide a
|
|
178
178
|
* channel Id as the third argument. The channel Id is appended to the
|
|
179
179
|
* WebSocket URL path to form the server path; it is not taken from the
|
|
180
|
-
* MergeableStore Id.
|
|
180
|
+
* MergeableStore Id. It can contain at most 1,024 UTF-8 bytes, and one shared
|
|
181
|
+
* WebSocket can have at most 100 channels. Creating a 101st channel is
|
|
182
|
+
* rejected without closing the existing shared WebSocket.
|
|
181
183
|
*
|
|
182
184
|
* Destroying the WsSynchronizer unsubscribes its channel. The shared
|
|
183
185
|
* WebSocket is closed only when the last WsSynchronizer using it is
|
|
@@ -188,8 +190,10 @@ export function createWsSynchronizer<WebSocketType extends WebSocketTypes>(
|
|
|
188
190
|
* later. It is not supported by WsServerDurableObject.
|
|
189
191
|
* @param store The MergeableStore to synchronize.
|
|
190
192
|
* @param webSocket The shared WebSocket to send synchronization messages
|
|
191
|
-
* over, constructed with the `tinybase` subprotocol
|
|
192
|
-
*
|
|
193
|
+
* over, constructed with the `tinybase` subprotocol and shared by at most 100
|
|
194
|
+
* channels.
|
|
195
|
+
* @param channelId The channel Id to append to the WebSocket URL path, with
|
|
196
|
+
* at most 1,024 UTF-8 bytes.
|
|
193
197
|
* @param requestTimeoutSeconds An optional time in seconds that the
|
|
194
198
|
* Synchronizer will wait for responses to request messages, defaulting to 1.
|
|
195
199
|
* @param onSend An optional handler for the messages that this Synchronizer
|
|
@@ -211,7 +211,9 @@ export function createWsSynchronizer<
|
|
|
211
211
|
* Construct the WebSocket with the `tinybase` subprotocol and provide a
|
|
212
212
|
* channel Id as the third argument. The channel Id is appended to the
|
|
213
213
|
* WebSocket URL path to form the server path; it is not taken from the
|
|
214
|
-
* MergeableStore Id.
|
|
214
|
+
* MergeableStore Id. It can contain at most 1,024 UTF-8 bytes, and one shared
|
|
215
|
+
* WebSocket can have at most 100 channels. Creating a 101st channel is
|
|
216
|
+
* rejected without closing the existing shared WebSocket.
|
|
215
217
|
*
|
|
216
218
|
* Destroying the WsSynchronizer unsubscribes its channel. The shared
|
|
217
219
|
* WebSocket is closed only when the last WsSynchronizer using it is
|
|
@@ -222,8 +224,10 @@ export function createWsSynchronizer<
|
|
|
222
224
|
* later. It is not supported by WsServerDurableObject.
|
|
223
225
|
* @param store The MergeableStore to synchronize.
|
|
224
226
|
* @param webSocket The shared WebSocket to send synchronization messages
|
|
225
|
-
* over, constructed with the `tinybase` subprotocol
|
|
226
|
-
*
|
|
227
|
+
* over, constructed with the `tinybase` subprotocol and shared by at most 100
|
|
228
|
+
* channels.
|
|
229
|
+
* @param channelId The channel Id to append to the WebSocket URL path, with
|
|
230
|
+
* at most 1,024 UTF-8 bytes.
|
|
227
231
|
* @param requestTimeoutSeconds An optional time in seconds that the
|
|
228
232
|
* Synchronizer will wait for responses to request messages, defaulting to 1.
|
|
229
233
|
* @param onSend An optional handler for the messages that this Synchronizer
|
|
@@ -519,7 +519,11 @@ export interface WsServer {
|
|
|
519
519
|
* Since v9.3, multiple WsSynchronizer instances can share one WebSocket by
|
|
520
520
|
* using channel Ids. Each channel Id is appended to the WebSocket URL path and
|
|
521
521
|
* treated as an ordinary server path. This means a multiplexed channel can
|
|
522
|
-
* interoperate with legacy clients connected directly to that full path.
|
|
522
|
+
* interoperate with legacy clients connected directly to that full path. A
|
|
523
|
+
* channel Id can contain at most 1,024 UTF-8 bytes, and each multiplexed
|
|
524
|
+
* WebSocket can have at most 100 subscribed channels. Pending setup and
|
|
525
|
+
* teardown resources are also bounded. Fragment reassembly and traffic
|
|
526
|
+
* buffered while paths start share limits across the physical WebSocket.
|
|
523
527
|
*
|
|
524
528
|
* The WsServer does not authenticate or authorize URL paths or channel Ids.
|
|
525
529
|
* Once a client WebSocket is accepted on a base path, it can subscribe to any
|
|
@@ -608,7 +612,7 @@ export interface WsServer {
|
|
|
608
612
|
* client connects, it picks up the data the previous two were using.
|
|
609
613
|
*
|
|
610
614
|
* ```js
|
|
611
|
-
* import {rmSync} from 'fs';
|
|
615
|
+
* import {mkdirSync, rmSync} from 'fs';
|
|
612
616
|
* import {createMergeableStore} from 'tinybase';
|
|
613
617
|
* import {createFilePersister} from 'tinybase/persisters/persister-file';
|
|
614
618
|
* import {createWsSynchronizer} from 'tinybase/synchronizers/synchronizer-ws-client';
|
|
@@ -616,6 +620,7 @@ export interface WsServer {
|
|
|
616
620
|
* import {WebSocket, WebSocketServer} from 'ws';
|
|
617
621
|
*
|
|
618
622
|
* // Server
|
|
623
|
+
* mkdirSync('./tmp', {recursive: true});
|
|
619
624
|
* const server = createWsServer(
|
|
620
625
|
* new WebSocketServer({port: 8047}),
|
|
621
626
|
* (pathId) =>
|
|
@@ -679,7 +684,7 @@ export interface WsServer {
|
|
|
679
684
|
* data once synchronization has started.
|
|
680
685
|
*
|
|
681
686
|
* ```js
|
|
682
|
-
* import {rmSync} from 'fs';
|
|
687
|
+
* import {mkdirSync, rmSync} from 'fs';
|
|
683
688
|
* import {createMergeableStore} from 'tinybase';
|
|
684
689
|
* import {createFilePersister} from 'tinybase/persisters/persister-file';
|
|
685
690
|
* import {createWsSynchronizer} from 'tinybase/synchronizers/synchronizer-ws-client';
|
|
@@ -687,6 +692,7 @@ export interface WsServer {
|
|
|
687
692
|
* import {WebSocket, WebSocketServer} from 'ws';
|
|
688
693
|
*
|
|
689
694
|
* // Server
|
|
695
|
+
* mkdirSync('./tmp', {recursive: true});
|
|
690
696
|
* const server = createWsServer(
|
|
691
697
|
* new WebSocketServer({port: 8047}),
|
|
692
698
|
* (pathId) => [
|
|
@@ -548,7 +548,11 @@ export interface WsServer {
|
|
|
548
548
|
* Since v9.3, multiple WsSynchronizer instances can share one WebSocket by
|
|
549
549
|
* using channel Ids. Each channel Id is appended to the WebSocket URL path and
|
|
550
550
|
* treated as an ordinary server path. This means a multiplexed channel can
|
|
551
|
-
* interoperate with legacy clients connected directly to that full path.
|
|
551
|
+
* interoperate with legacy clients connected directly to that full path. A
|
|
552
|
+
* channel Id can contain at most 1,024 UTF-8 bytes, and each multiplexed
|
|
553
|
+
* WebSocket can have at most 100 subscribed channels. Pending setup and
|
|
554
|
+
* teardown resources are also bounded. Fragment reassembly and traffic
|
|
555
|
+
* buffered while paths start share limits across the physical WebSocket.
|
|
552
556
|
*
|
|
553
557
|
* The WsServer does not authenticate or authorize URL paths or channel Ids.
|
|
554
558
|
* Once a client WebSocket is accepted on a base path, it can subscribe to any
|
|
@@ -637,7 +641,7 @@ export interface WsServer {
|
|
|
637
641
|
* client connects, it picks up the data the previous two were using.
|
|
638
642
|
*
|
|
639
643
|
* ```js
|
|
640
|
-
* import {rmSync} from 'fs';
|
|
644
|
+
* import {mkdirSync, rmSync} from 'fs';
|
|
641
645
|
* import {createMergeableStore} from 'tinybase';
|
|
642
646
|
* import {createFilePersister} from 'tinybase/persisters/persister-file';
|
|
643
647
|
* import {createWsSynchronizer} from 'tinybase/synchronizers/synchronizer-ws-client';
|
|
@@ -645,6 +649,7 @@ export interface WsServer {
|
|
|
645
649
|
* import {WebSocket, WebSocketServer} from 'ws';
|
|
646
650
|
*
|
|
647
651
|
* // Server
|
|
652
|
+
* mkdirSync('./tmp', {recursive: true});
|
|
648
653
|
* const server = createWsServer(
|
|
649
654
|
* new WebSocketServer({port: 8047}),
|
|
650
655
|
* (pathId) =>
|
|
@@ -708,7 +713,7 @@ export interface WsServer {
|
|
|
708
713
|
* data once synchronization has started.
|
|
709
714
|
*
|
|
710
715
|
* ```js
|
|
711
|
-
* import {rmSync} from 'fs';
|
|
716
|
+
* import {mkdirSync, rmSync} from 'fs';
|
|
712
717
|
* import {createMergeableStore} from 'tinybase';
|
|
713
718
|
* import {createFilePersister} from 'tinybase/persisters/persister-file';
|
|
714
719
|
* import {createWsSynchronizer} from 'tinybase/synchronizers/synchronizer-ws-client';
|
|
@@ -716,6 +721,7 @@ export interface WsServer {
|
|
|
716
721
|
* import {WebSocket, WebSocketServer} from 'ws';
|
|
717
722
|
*
|
|
718
723
|
* // Server
|
|
724
|
+
* mkdirSync('./tmp', {recursive: true});
|
|
719
725
|
* const server = createWsServer(
|
|
720
726
|
* new WebSocketServer({port: 8047}),
|
|
721
727
|
* (pathId) => [
|
|
@@ -96,9 +96,12 @@ export interface WsServerSimple {
|
|
|
96
96
|
* Since v9.3, it also supports multiple channel-based WsSynchronizer instances
|
|
97
97
|
* sharing one WebSocket. Once a client WebSocket is accepted on a base path,
|
|
98
98
|
* it can subscribe to any valid channel beneath that path: WsServerSimple does
|
|
99
|
-
* not authenticate or authorize channel Ids.
|
|
100
|
-
*
|
|
101
|
-
*
|
|
99
|
+
* not authenticate or authorize channel Ids. A channel Id can contain at most
|
|
100
|
+
* 1,024 UTF-8 bytes, and each multiplexed WebSocket can have at most 100
|
|
101
|
+
* subscribed channels. Pending channel cleanup is also bounded, and fragment
|
|
102
|
+
* reassembly limits are shared across the physical WebSocket. For untrusted
|
|
103
|
+
* clients, use a separate authenticated WebSocket for each authorized path
|
|
104
|
+
* unless access to all descendants is acceptable.
|
|
102
105
|
* @param webSocketServer A WebSocketServer object from your server environment.
|
|
103
106
|
* @returns A reference to the new WsServerSimple object.
|
|
104
107
|
* @example
|
|
@@ -96,9 +96,12 @@ export interface WsServerSimple {
|
|
|
96
96
|
* Since v9.3, it also supports multiple channel-based WsSynchronizer instances
|
|
97
97
|
* sharing one WebSocket. Once a client WebSocket is accepted on a base path,
|
|
98
98
|
* it can subscribe to any valid channel beneath that path: WsServerSimple does
|
|
99
|
-
* not authenticate or authorize channel Ids.
|
|
100
|
-
*
|
|
101
|
-
*
|
|
99
|
+
* not authenticate or authorize channel Ids. A channel Id can contain at most
|
|
100
|
+
* 1,024 UTF-8 bytes, and each multiplexed WebSocket can have at most 100
|
|
101
|
+
* subscribed channels. Pending channel cleanup is also bounded, and fragment
|
|
102
|
+
* reassembly limits are shared across the physical WebSocket. For untrusted
|
|
103
|
+
* clients, use a separate authenticated WebSocket for each authorized path
|
|
104
|
+
* unless access to all descendants is acceptable.
|
|
102
105
|
* @param webSocketServer A WebSocketServer object from your server environment.
|
|
103
106
|
* @returns A reference to the new WsServerSimple object.
|
|
104
107
|
* @example
|
|
@@ -692,7 +692,7 @@ export type SortedTablePaginatorProps = {
|
|
|
692
692
|
*
|
|
693
693
|
* See the <TableInHtmlTable /> (React) demo for this component in action:
|
|
694
694
|
*
|
|
695
|
-
* 
|
|
697
697
|
*
|
|
698
698
|
* The component's props identify which Table to render based on Table Id, and
|
|
@@ -838,7 +838,7 @@ export function TableInHtmlTable(
|
|
|
838
838
|
* See the <SortedTableInHtmlTable /> (React) demo for this component in
|
|
839
839
|
* action:
|
|
840
840
|
*
|
|
841
|
-
* 
|
|
843
843
|
*
|
|
844
844
|
* The component's props identify which Table to render based on Table Id, and
|
|
@@ -1011,7 +1011,7 @@ export function SortedTableInHtmlTable(
|
|
|
1011
1011
|
*
|
|
1012
1012
|
* See the <ValuesInHtmlTable /> (React) demo for this component in action:
|
|
1013
1013
|
*
|
|
1014
|
-
* 
|
|
1016
1016
|
*
|
|
1017
1017
|
* The component's props identify which Row to render based on Table Id, Row Id,
|
|
@@ -1142,7 +1142,7 @@ export function ValuesInHtmlTable(
|
|
|
1142
1142
|
*
|
|
1143
1143
|
* See the <SliceInHtmlTable /> (React) demo for this component in action:
|
|
1144
1144
|
*
|
|
1145
|
-
* 
|
|
1147
1147
|
*
|
|
1148
1148
|
* The component's props identify which Slice to render based on Index Id, Slice
|
|
@@ -1300,7 +1300,7 @@ export function SliceInHtmlTable(
|
|
|
1300
1300
|
* See the <RelationshipInHtmlTable /> (React) demo for this component in
|
|
1301
1301
|
* action:
|
|
1302
1302
|
*
|
|
1303
|
-
* 
|
|
1305
1305
|
*
|
|
1306
1306
|
* The component's props identify which Relationship to render based on
|
|
@@ -1478,7 +1478,7 @@ export function RelationshipInHtmlTable(
|
|
|
1478
1478
|
* See the <ResultTableInHtmlTable /> (React) demo for this component in
|
|
1479
1479
|
* action:
|
|
1480
1480
|
*
|
|
1481
|
-
* 
|
|
1483
1483
|
*
|
|
1484
1484
|
* The component's props identify which ResultTable to render based on query Id,
|
|
@@ -1631,7 +1631,7 @@ export function ResultTableInHtmlTable(
|
|
|
1631
1631
|
* See the <ResultSortedTableInHtmlTable /> (React) demo for this component in
|
|
1632
1632
|
* action:
|
|
1633
1633
|
*
|
|
1634
|
-
* 
|
|
1636
1636
|
*
|
|
1637
1637
|
* The component's props identify which ResultTable to render based on query Id,
|
|
@@ -1805,7 +1805,7 @@ export function ResultSortedTableInHtmlTable(
|
|
|
1805
1805
|
*
|
|
1806
1806
|
* See the <EditableCellView /> (React) demo for this component in action:
|
|
1807
1807
|
*
|
|
1808
|
-
* 
|
|
1810
1810
|
*
|
|
1811
1811
|
* The component's props identify which Cell to render based on Table Id, Row
|
|
@@ -1876,7 +1876,7 @@ export function EditableCellView(
|
|
|
1876
1876
|
*
|
|
1877
1877
|
* See the <EditableValueView /> (React) demo for this component in action:
|
|
1878
1878
|
*
|
|
1879
|
-
* 
|
|
1881
1881
|
*
|
|
1882
1882
|
* The component's props identify which Value to render based on Table Id, Row
|
|
@@ -1947,7 +1947,7 @@ export function EditableValueView(
|
|
|
1947
1947
|
* See the <SortedTableInHtmlTable /> (React) demo for this component in
|
|
1948
1948
|
* action:
|
|
1949
1949
|
*
|
|
1950
|
-
* 
|
|
1952
1952
|
*
|
|
1953
1953
|
* The component displays 'previous' and 'next' buttons for paging through the
|
|
@@ -668,7 +668,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
668
668
|
*
|
|
669
669
|
* See the <TableInHtmlTable /> (React) demo for this component in action:
|
|
670
670
|
*
|
|
671
|
-
* 
|
|
673
673
|
*
|
|
674
674
|
* The component's props identify which Table to render based on Table Id, and
|
|
@@ -822,7 +822,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
822
822
|
* See the <SortedTableInHtmlTable /> (React) demo for this component in
|
|
823
823
|
* action:
|
|
824
824
|
*
|
|
825
|
-
* 
|
|
827
827
|
*
|
|
828
828
|
* The component's props identify which Table to render based on Table Id, and
|
|
@@ -1003,7 +1003,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1003
1003
|
*
|
|
1004
1004
|
* See the <ValuesInHtmlTable /> (React) demo for this component in action:
|
|
1005
1005
|
*
|
|
1006
|
-
* 
|
|
1008
1008
|
*
|
|
1009
1009
|
* The component's props identify which Row to render based on Table Id, Row Id,
|
|
@@ -1142,7 +1142,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1142
1142
|
*
|
|
1143
1143
|
* See the <SliceInHtmlTable /> (React) demo for this component in action:
|
|
1144
1144
|
*
|
|
1145
|
-
* 
|
|
1147
1147
|
*
|
|
1148
1148
|
* The component's props identify which Slice to render based on Index Id, Slice
|
|
@@ -1308,7 +1308,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1308
1308
|
* See the <RelationshipInHtmlTable /> (React) demo for this component in
|
|
1309
1309
|
* action:
|
|
1310
1310
|
*
|
|
1311
|
-
* 
|
|
1313
1313
|
*
|
|
1314
1314
|
* The component's props identify which Relationship to render based on
|
|
@@ -1494,7 +1494,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1494
1494
|
* See the <ResultTableInHtmlTable /> (React) demo for this component in
|
|
1495
1495
|
* action:
|
|
1496
1496
|
*
|
|
1497
|
-
* 
|
|
1499
1499
|
*
|
|
1500
1500
|
* The component's props identify which ResultTable to render based on query Id,
|
|
@@ -1655,7 +1655,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1655
1655
|
* See the <ResultSortedTableInHtmlTable /> (React) demo for this component in
|
|
1656
1656
|
* action:
|
|
1657
1657
|
*
|
|
1658
|
-
* 
|
|
1660
1660
|
*
|
|
1661
1661
|
* The component's props identify which ResultTable to render based on query Id,
|
|
@@ -1837,7 +1837,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1837
1837
|
*
|
|
1838
1838
|
* See the <EditableCellView /> (React) demo for this component in action:
|
|
1839
1839
|
*
|
|
1840
|
-
* 
|
|
1842
1842
|
*
|
|
1843
1843
|
* The component's props identify which Cell to render based on Table Id, Row
|
|
@@ -1922,7 +1922,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1922
1922
|
*
|
|
1923
1923
|
* See the <EditableValueView /> (React) demo for this component in action:
|
|
1924
1924
|
*
|
|
1925
|
-
* 
|
|
1927
1927
|
*
|
|
1928
1928
|
* The component's props identify which Value to render based on Table Id, Row
|
|
@@ -1993,7 +1993,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
1993
1993
|
* See the <SortedTableInHtmlTable /> (React) demo for this component in
|
|
1994
1994
|
* action:
|
|
1995
1995
|
*
|
|
1996
|
-
* 
|
|
1998
1998
|
*
|
|
1999
1999
|
* The component displays 'previous' and 'next' buttons for paging through the
|
|
@@ -483,7 +483,7 @@ export type YAxisProps = {
|
|
|
483
483
|
*
|
|
484
484
|
* See the Composing Charts (React) demo for this component in action:
|
|
485
485
|
*
|
|
486
|
-
* 
|
|
488
488
|
*
|
|
489
489
|
* The series children declare their own xCellId and yCellId bindings. The
|
|
@@ -542,7 +542,7 @@ export function CartesianChart(
|
|
|
542
542
|
*
|
|
543
543
|
* See the Axis Overrides (React) demo for this component in action:
|
|
544
544
|
*
|
|
545
|
-
* 
|
|
547
547
|
* @category Store components
|
|
548
548
|
* @since v8.5.0
|
|
@@ -558,7 +558,7 @@ export function XAxis(props: XAxisProps): ComponentReturnType;
|
|
|
558
558
|
*
|
|
559
559
|
* See the Axis Overrides (React) demo for this component in action:
|
|
560
560
|
*
|
|
561
|
-
* 
|
|
563
563
|
* @category Store components
|
|
564
564
|
* @since v8.5.0
|
|
@@ -574,7 +574,7 @@ export function YAxis(props: YAxisProps): ComponentReturnType;
|
|
|
574
574
|
*
|
|
575
575
|
* See the Composing Charts (React) demo for this component in action:
|
|
576
576
|
*
|
|
577
|
-
* 
|
|
579
579
|
* @category Store components
|
|
580
580
|
* @since v8.5.0
|
|
@@ -590,7 +590,7 @@ export function LineSeries(props: SeriesProps): ComponentReturnType;
|
|
|
590
590
|
*
|
|
591
591
|
* See the Composing Charts (React) demo for this component in action:
|
|
592
592
|
*
|
|
593
|
-
* 
|
|
595
595
|
* @category Store components
|
|
596
596
|
* @since v8.5.0
|
|
@@ -607,7 +607,7 @@ export function BarSeries(props: SeriesProps): ComponentReturnType;
|
|
|
607
607
|
*
|
|
608
608
|
* See the <LineChart /> (React) demo for this component in action:
|
|
609
609
|
*
|
|
610
|
-
* 
|
|
612
612
|
* @category Store components
|
|
613
613
|
* @since v8.5.0
|
|
@@ -660,7 +660,7 @@ export function LineChart(
|
|
|
660
660
|
*
|
|
661
661
|
* See the Sorting And Types (React) demo for this component in action:
|
|
662
662
|
*
|
|
663
|
-
* 
|
|
665
665
|
* @category Store components
|
|
666
666
|
* @since v8.5.0
|
|
@@ -544,7 +544,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
544
544
|
*
|
|
545
545
|
* See the Composing Charts (React) demo for this component in action:
|
|
546
546
|
*
|
|
547
|
-
* 
|
|
549
549
|
*
|
|
550
550
|
* The series children declare their own xCellId and yCellId bindings. The
|
|
@@ -609,7 +609,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
609
609
|
*
|
|
610
610
|
* See the Axis Overrides (React) demo for this component in action:
|
|
611
611
|
*
|
|
612
|
-
* 
|
|
614
614
|
* @category Store components
|
|
615
615
|
* @since v8.5.0
|
|
@@ -625,7 +625,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
625
625
|
*
|
|
626
626
|
* See the Axis Overrides (React) demo for this component in action:
|
|
627
627
|
*
|
|
628
|
-
* 
|
|
630
630
|
* @category Store components
|
|
631
631
|
* @since v8.5.0
|
|
@@ -641,7 +641,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
641
641
|
*
|
|
642
642
|
* See the Composing Charts (React) demo for this component in action:
|
|
643
643
|
*
|
|
644
|
-
* 
|
|
646
646
|
* @category Store components
|
|
647
647
|
* @since v8.5.0
|
|
@@ -657,7 +657,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
657
657
|
*
|
|
658
658
|
* See the Composing Charts (React) demo for this component in action:
|
|
659
659
|
*
|
|
660
|
-
* 
|
|
662
662
|
* @category Store components
|
|
663
663
|
* @since v8.5.0
|
|
@@ -684,7 +684,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
684
684
|
*
|
|
685
685
|
* See the <LineChart /> (React) demo for this component in action:
|
|
686
686
|
*
|
|
687
|
-
* 
|
|
689
689
|
* @category Store components
|
|
690
690
|
* @since v8.5.0
|
|
@@ -750,7 +750,7 @@ export type WithSchemas<Schemas extends OptionalSchemas> = {
|
|
|
750
750
|
*
|
|
751
751
|
* See the Sorting And Types (React) demo for this component in action:
|
|
752
752
|
*
|
|
753
|
-
* 
|
|
755
755
|
* @category Store components
|
|
756
756
|
* @since v8.5.0
|
|
@@ -46,7 +46,7 @@ export type InspectorProps = {
|
|
|
46
46
|
*
|
|
47
47
|
* See the <Inspector /> (React) demo for this component in action:
|
|
48
48
|
*
|
|
49
|
-
* 
|
|
51
51
|
*
|
|
52
52
|
* The component displays a nub in the corner of the screen which you may then
|
|
@@ -46,7 +46,7 @@ export type InspectorProps = {
|
|
|
46
46
|
*
|
|
47
47
|
* See the <Inspector /> (React) demo for this component in action:
|
|
48
48
|
*
|
|
49
|
-
* 
|
|
51
51
|
*
|
|
52
52
|
* The component displays a nub in the corner of the screen which you may then
|