spacetimedb 2.4.1 → 2.6.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 (194) hide show
  1. package/LICENSE.txt +759 -759
  2. package/README.md +211 -120
  3. package/dist/angular/index.cjs.map +1 -1
  4. package/dist/angular/index.mjs.map +1 -1
  5. package/dist/browser/angular/index.mjs.map +1 -1
  6. package/dist/browser/react/index.mjs +129 -57
  7. package/dist/browser/react/index.mjs.map +1 -1
  8. package/dist/browser/solid/index.mjs +1933 -0
  9. package/dist/browser/solid/index.mjs.map +1 -0
  10. package/dist/browser/svelte/index.mjs.map +1 -1
  11. package/dist/browser/vue/index.mjs.map +1 -1
  12. package/dist/index.browser.mjs +10 -2
  13. package/dist/index.browser.mjs.map +1 -1
  14. package/dist/index.cjs +10 -2
  15. package/dist/index.cjs.map +1 -1
  16. package/dist/index.mjs +10 -2
  17. package/dist/index.mjs.map +1 -1
  18. package/dist/min/index.browser.mjs +1 -1
  19. package/dist/min/index.browser.mjs.map +1 -1
  20. package/dist/min/react/index.mjs +1 -1
  21. package/dist/min/react/index.mjs.map +1 -1
  22. package/dist/min/sdk/index.browser.mjs +1 -1
  23. package/dist/min/sdk/index.browser.mjs.map +1 -1
  24. package/dist/react/index.cjs +129 -57
  25. package/dist/react/index.cjs.map +1 -1
  26. package/dist/react/index.mjs +129 -57
  27. package/dist/react/index.mjs.map +1 -1
  28. package/dist/react/useTable.d.ts.map +1 -1
  29. package/dist/sdk/connection_manager.d.ts +8 -0
  30. package/dist/sdk/connection_manager.d.ts.map +1 -1
  31. package/dist/sdk/db_connection_impl.d.ts +7 -0
  32. package/dist/sdk/db_connection_impl.d.ts.map +1 -1
  33. package/dist/sdk/index.browser.mjs +10 -2
  34. package/dist/sdk/index.browser.mjs.map +1 -1
  35. package/dist/sdk/index.cjs +10 -2
  36. package/dist/sdk/index.cjs.map +1 -1
  37. package/dist/sdk/index.mjs +10 -2
  38. package/dist/sdk/index.mjs.map +1 -1
  39. package/dist/sdk/websocket_test_adapter.d.ts +2 -1
  40. package/dist/sdk/websocket_test_adapter.d.ts.map +1 -1
  41. package/dist/server/index.mjs.map +1 -1
  42. package/dist/server/runtime.d.ts.map +1 -1
  43. package/dist/solid/SpacetimeDBProvider.d.ts +7 -0
  44. package/dist/solid/SpacetimeDBProvider.d.ts.map +1 -0
  45. package/dist/solid/connection_state.d.ts +6 -0
  46. package/dist/solid/connection_state.d.ts.map +1 -0
  47. package/dist/solid/index.cjs +1939 -0
  48. package/dist/solid/index.cjs.map +1 -0
  49. package/dist/solid/index.d.ts +6 -0
  50. package/dist/solid/index.d.ts.map +1 -0
  51. package/dist/solid/index.mjs +1933 -0
  52. package/dist/solid/index.mjs.map +1 -0
  53. package/dist/solid/useProcedure.d.ts +4 -0
  54. package/dist/solid/useProcedure.d.ts.map +1 -0
  55. package/dist/solid/useReducer.d.ts +4 -0
  56. package/dist/solid/useReducer.d.ts.map +1 -0
  57. package/dist/solid/useSpacetimeDB.d.ts +4 -0
  58. package/dist/solid/useSpacetimeDB.d.ts.map +1 -0
  59. package/dist/solid/useTable.d.ts +32 -0
  60. package/dist/solid/useTable.d.ts.map +1 -0
  61. package/dist/svelte/index.cjs.map +1 -1
  62. package/dist/svelte/index.mjs.map +1 -1
  63. package/dist/tanstack/index.cjs +120 -50
  64. package/dist/tanstack/index.cjs.map +1 -1
  65. package/dist/tanstack/index.mjs +120 -50
  66. package/dist/tanstack/index.mjs.map +1 -1
  67. package/dist/vue/index.cjs.map +1 -1
  68. package/dist/vue/index.mjs.map +1 -1
  69. package/package.json +13 -3
  70. package/src/angular/connection_state.ts +19 -19
  71. package/src/angular/index.ts +3 -3
  72. package/src/angular/injectors/index.ts +4 -4
  73. package/src/angular/injectors/inject-reducer.ts +62 -62
  74. package/src/angular/injectors/inject-spacetimedb-connected.ts +13 -13
  75. package/src/angular/injectors/inject-spacetimedb.ts +10 -10
  76. package/src/angular/injectors/inject-table.ts +234 -234
  77. package/src/angular/providers/index.ts +1 -1
  78. package/src/angular/providers/provide-spacetimedb.ts +96 -96
  79. package/src/index.ts +16 -16
  80. package/src/lib/algebraic_type.ts +819 -819
  81. package/src/lib/algebraic_type_variants.ts +26 -26
  82. package/src/lib/algebraic_value.ts +10 -10
  83. package/src/lib/autogen/types.ts +746 -746
  84. package/src/lib/binary_reader.ts +188 -188
  85. package/src/lib/binary_writer.ts +213 -213
  86. package/src/lib/connection_id.ts +102 -102
  87. package/src/lib/constraints.ts +48 -48
  88. package/src/lib/errors.ts +26 -26
  89. package/src/lib/filter.ts +195 -195
  90. package/src/lib/identity.ts +83 -83
  91. package/src/lib/indexes.ts +251 -251
  92. package/src/lib/option.ts +34 -34
  93. package/src/lib/query.ts +1019 -1019
  94. package/src/lib/reducer_schema.ts +38 -38
  95. package/src/lib/reducers.ts +116 -116
  96. package/src/lib/result.ts +36 -36
  97. package/src/lib/schedule_at.ts +86 -86
  98. package/src/lib/schema.ts +420 -420
  99. package/src/lib/table.ts +548 -548
  100. package/src/lib/table_schema.ts +64 -64
  101. package/src/lib/time_duration.ts +77 -77
  102. package/src/lib/timestamp.ts +148 -148
  103. package/src/lib/type_builders.test-d.ts +128 -128
  104. package/src/lib/type_builders.ts +4014 -4014
  105. package/src/lib/type_util.ts +124 -124
  106. package/src/lib/util.ts +196 -196
  107. package/src/lib/uuid.ts +337 -337
  108. package/src/react/SpacetimeDBProvider.ts +84 -84
  109. package/src/react/connection_state.ts +6 -6
  110. package/src/react/index.ts +5 -5
  111. package/src/react/useProcedure.ts +60 -60
  112. package/src/react/useReducer.ts +53 -53
  113. package/src/react/useSpacetimeDB.ts +18 -18
  114. package/src/react/useTable.ts +256 -251
  115. package/src/sdk/client_api/index.ts +114 -114
  116. package/src/sdk/client_api/types/procedures.ts +8 -8
  117. package/src/sdk/client_api/types/reducers.ts +8 -8
  118. package/src/sdk/client_api/types.ts +288 -288
  119. package/src/sdk/client_cache.ts +129 -129
  120. package/src/sdk/client_table.ts +179 -179
  121. package/src/sdk/connection_manager.ts +352 -237
  122. package/src/sdk/db_connection_builder.ts +290 -290
  123. package/src/sdk/db_connection_impl.ts +1356 -1347
  124. package/src/sdk/db_context.ts +28 -28
  125. package/src/sdk/db_view.ts +12 -12
  126. package/src/sdk/decompress.ts +51 -51
  127. package/src/sdk/event.ts +18 -18
  128. package/src/sdk/event_context.ts +51 -51
  129. package/src/sdk/event_emitter.ts +32 -32
  130. package/src/sdk/index.ts +14 -14
  131. package/src/sdk/internal.ts +2 -2
  132. package/src/sdk/json_api.ts +46 -46
  133. package/src/sdk/logger.ts +134 -134
  134. package/src/sdk/message_types.ts +46 -46
  135. package/src/sdk/procedures.ts +83 -83
  136. package/src/sdk/reducer_event.ts +20 -20
  137. package/src/sdk/reducer_handle.ts +12 -12
  138. package/src/sdk/reducers.ts +159 -159
  139. package/src/sdk/schema.ts +45 -45
  140. package/src/sdk/spacetime_module.ts +28 -28
  141. package/src/sdk/subscription_builder_impl.ts +275 -275
  142. package/src/sdk/table_cache.ts +581 -581
  143. package/src/sdk/type_utils.ts +19 -19
  144. package/src/sdk/version.ts +133 -133
  145. package/src/sdk/websocket_decompress_adapter.ts +63 -63
  146. package/src/sdk/websocket_protocols.ts +25 -25
  147. package/src/sdk/websocket_test_adapter.ts +107 -100
  148. package/src/sdk/websocket_v3_frames.ts +126 -126
  149. package/src/sdk/ws.ts +105 -105
  150. package/src/server/console.ts +81 -81
  151. package/src/server/db_view.ts +21 -21
  152. package/src/server/errors.ts +138 -138
  153. package/src/server/http.test-d.ts +80 -80
  154. package/src/server/http.ts +14 -14
  155. package/src/server/http_handlers.ts +413 -413
  156. package/src/server/http_internal.ts +79 -79
  157. package/src/server/http_shared.ts +186 -186
  158. package/src/server/index.ts +37 -37
  159. package/src/server/polyfills.ts +4 -4
  160. package/src/server/procedures.ts +239 -239
  161. package/src/server/query.ts +1 -1
  162. package/src/server/range.ts +53 -53
  163. package/src/server/reducers.ts +113 -113
  164. package/src/server/rng.ts +113 -113
  165. package/src/server/runtime.ts +1102 -1102
  166. package/src/server/schema.test-d.ts +99 -99
  167. package/src/server/schema.ts +663 -663
  168. package/src/server/sys.d.ts +125 -125
  169. package/src/server/view.test-d.ts +194 -194
  170. package/src/server/views.ts +340 -340
  171. package/src/solid/SpacetimeDBProvider.ts +97 -0
  172. package/src/solid/connection_state.ts +6 -0
  173. package/src/solid/index.ts +5 -0
  174. package/src/solid/useProcedure.ts +57 -0
  175. package/src/solid/useReducer.ts +50 -0
  176. package/src/solid/useSpacetimeDB.ts +18 -0
  177. package/src/solid/useTable.ts +203 -0
  178. package/src/svelte/SpacetimeDBProvider.ts +101 -101
  179. package/src/svelte/connection_state.ts +16 -16
  180. package/src/svelte/index.ts +4 -4
  181. package/src/svelte/useReducer.ts +61 -61
  182. package/src/svelte/useSpacetimeDB.ts +22 -22
  183. package/src/svelte/useTable.ts +218 -218
  184. package/src/tanstack/SpacetimeDBQueryClient.ts +330 -330
  185. package/src/tanstack/hooks.ts +83 -83
  186. package/src/tanstack/index.ts +16 -16
  187. package/src/util-stub.ts +1 -1
  188. package/src/vue/SpacetimeDBProvider.ts +157 -157
  189. package/src/vue/connection_state.ts +19 -19
  190. package/src/vue/index.ts +5 -5
  191. package/src/vue/useProcedure.ts +62 -62
  192. package/src/vue/useReducer.ts +55 -55
  193. package/src/vue/useSpacetimeDB.ts +18 -18
  194. package/src/vue/useTable.ts +229 -229
@@ -1,129 +1,129 @@
1
- import type { TableNamesOf, UntypedSchemaDef } from '../lib/schema.ts';
2
- import type { UntypedTableDef } from '../lib/table.ts';
3
- import type { Values } from '../lib/type_util.ts';
4
- import type { UntypedRemoteModule } from './spacetime_module.ts';
5
- import { type TableCache, TableCacheImpl } from './table_cache.ts';
6
-
7
- type TableName<SchemaDef> = [SchemaDef] extends [UntypedSchemaDef]
8
- ? TableNamesOf<SchemaDef>
9
- : string;
10
-
11
- export type TableDefForTableName<
12
- SchemaDef extends UntypedSchemaDef,
13
- N extends TableName<SchemaDef>,
14
- > = [SchemaDef] extends [UntypedSchemaDef]
15
- ? Values<SchemaDef['tables']> & { accessorName: N }
16
- : UntypedTableDef & { accessorName: N };
17
-
18
- type TableCacheForTableName<
19
- RemoteModule extends UntypedRemoteModule,
20
- TableName extends TableNamesOf<RemoteModule>,
21
- > = TableCache<RemoteModule, TableName>;
22
-
23
- /**
24
- * This is a helper class that provides a mapping from table names to their corresponding TableCache instances
25
- * while preserving the correspondence between the key and value type.
26
- */
27
- class TableMap<RemoteModule extends UntypedRemoteModule> {
28
- private readonly map: Map<
29
- string,
30
- TableCacheForTableName<RemoteModule, TableName<RemoteModule>>
31
- > = new Map();
32
-
33
- get<K extends TableName<RemoteModule>>(
34
- key: K
35
- ): TableCacheForTableName<RemoteModule, K> | undefined {
36
- // Cast required: a Map<string, Union> can't refine the union to the exact K-specific member on get<K>(key: K).
37
- return this.map.get(key) as
38
- | TableCacheForTableName<RemoteModule, K>
39
- | undefined;
40
- }
41
-
42
- set<K extends TableName<RemoteModule>>(
43
- key: K,
44
- value: TableCacheForTableName<RemoteModule, K>
45
- ): this {
46
- this.map.set(key, value);
47
- return this;
48
- }
49
-
50
- has(key: TableName<RemoteModule>): boolean {
51
- return this.map.has(key);
52
- }
53
-
54
- delete(key: TableName<RemoteModule>): boolean {
55
- return this.map.delete(key);
56
- }
57
-
58
- // optional: iteration stays broadly typed (cannot express per-key relation here)
59
- keys(): IterableIterator<string> {
60
- return this.map.keys();
61
- }
62
- values(): IterableIterator<
63
- TableCacheForTableName<RemoteModule, TableName<RemoteModule>>
64
- > {
65
- return this.map.values();
66
- }
67
- entries(): IterableIterator<
68
- [string, TableCacheForTableName<RemoteModule, TableName<RemoteModule>>]
69
- > {
70
- return this.map.entries();
71
- }
72
- [Symbol.iterator]() {
73
- return this.entries();
74
- }
75
- }
76
-
77
- /**
78
- * ClientCache maintains a cache of TableCache instances for each table in the database.
79
- * It provides methods to get or create TableCache instances by table name,
80
- * ensuring type safety based on the provided SchemaDef.
81
- */
82
- export class ClientCache<RemoteModule extends UntypedRemoteModule> {
83
- /**
84
- * The tables in the database.
85
- */
86
- readonly tables = new TableMap<RemoteModule>();
87
-
88
- /**
89
- * Returns the table with the given name.
90
- * - If SchemaDef is a concrete schema, `name` is constrained to known table names,
91
- * and the return type matches that table.
92
- * - If SchemaDef is undefined, `name` is string and the return type is untyped.
93
- */
94
- getTable<N extends TableName<RemoteModule>>(
95
- name: N
96
- ): TableCacheForTableName<RemoteModule, N> {
97
- const table = this.tables.get(name);
98
- if (!table) {
99
- console.error(
100
- 'The table has not been registered for this client. Please register the table before using it. If you have registered global tables using the SpacetimeDBClient.registerTables() or `registerTable()` method, please make sure that is executed first!'
101
- );
102
- throw new Error(`Table ${String(name)} does not exist`);
103
- }
104
- return table;
105
- }
106
-
107
- /**
108
- * Returns the table with the given name, creating it if needed.
109
- * - Typed mode: `tableTypeInfo.tableName` is constrained to known names and
110
- * the return type matches that table.
111
- * - Untyped mode: accepts any string and returns an untyped TableCache.
112
- */
113
- getOrCreateTable<N extends TableName<RemoteModule>>(
114
- tableDef: TableDefForTableName<RemoteModule, N>
115
- ): TableCacheForTableName<RemoteModule, N> {
116
- const name = tableDef.accessorName;
117
-
118
- const table = this.tables.get(name);
119
- if (table) {
120
- return table;
121
- }
122
-
123
- const newTable = new TableCacheImpl<RemoteModule, N>(
124
- tableDef
125
- ) as TableCache<RemoteModule, N>;
126
- this.tables.set(name, newTable);
127
- return newTable;
128
- }
129
- }
1
+ import type { TableNamesOf, UntypedSchemaDef } from '../lib/schema.ts';
2
+ import type { UntypedTableDef } from '../lib/table.ts';
3
+ import type { Values } from '../lib/type_util.ts';
4
+ import type { UntypedRemoteModule } from './spacetime_module.ts';
5
+ import { type TableCache, TableCacheImpl } from './table_cache.ts';
6
+
7
+ type TableName<SchemaDef> = [SchemaDef] extends [UntypedSchemaDef]
8
+ ? TableNamesOf<SchemaDef>
9
+ : string;
10
+
11
+ export type TableDefForTableName<
12
+ SchemaDef extends UntypedSchemaDef,
13
+ N extends TableName<SchemaDef>,
14
+ > = [SchemaDef] extends [UntypedSchemaDef]
15
+ ? Values<SchemaDef['tables']> & { accessorName: N }
16
+ : UntypedTableDef & { accessorName: N };
17
+
18
+ type TableCacheForTableName<
19
+ RemoteModule extends UntypedRemoteModule,
20
+ TableName extends TableNamesOf<RemoteModule>,
21
+ > = TableCache<RemoteModule, TableName>;
22
+
23
+ /**
24
+ * This is a helper class that provides a mapping from table names to their corresponding TableCache instances
25
+ * while preserving the correspondence between the key and value type.
26
+ */
27
+ class TableMap<RemoteModule extends UntypedRemoteModule> {
28
+ private readonly map: Map<
29
+ string,
30
+ TableCacheForTableName<RemoteModule, TableName<RemoteModule>>
31
+ > = new Map();
32
+
33
+ get<K extends TableName<RemoteModule>>(
34
+ key: K
35
+ ): TableCacheForTableName<RemoteModule, K> | undefined {
36
+ // Cast required: a Map<string, Union> can't refine the union to the exact K-specific member on get<K>(key: K).
37
+ return this.map.get(key) as
38
+ | TableCacheForTableName<RemoteModule, K>
39
+ | undefined;
40
+ }
41
+
42
+ set<K extends TableName<RemoteModule>>(
43
+ key: K,
44
+ value: TableCacheForTableName<RemoteModule, K>
45
+ ): this {
46
+ this.map.set(key, value);
47
+ return this;
48
+ }
49
+
50
+ has(key: TableName<RemoteModule>): boolean {
51
+ return this.map.has(key);
52
+ }
53
+
54
+ delete(key: TableName<RemoteModule>): boolean {
55
+ return this.map.delete(key);
56
+ }
57
+
58
+ // optional: iteration stays broadly typed (cannot express per-key relation here)
59
+ keys(): IterableIterator<string> {
60
+ return this.map.keys();
61
+ }
62
+ values(): IterableIterator<
63
+ TableCacheForTableName<RemoteModule, TableName<RemoteModule>>
64
+ > {
65
+ return this.map.values();
66
+ }
67
+ entries(): IterableIterator<
68
+ [string, TableCacheForTableName<RemoteModule, TableName<RemoteModule>>]
69
+ > {
70
+ return this.map.entries();
71
+ }
72
+ [Symbol.iterator]() {
73
+ return this.entries();
74
+ }
75
+ }
76
+
77
+ /**
78
+ * ClientCache maintains a cache of TableCache instances for each table in the database.
79
+ * It provides methods to get or create TableCache instances by table name,
80
+ * ensuring type safety based on the provided SchemaDef.
81
+ */
82
+ export class ClientCache<RemoteModule extends UntypedRemoteModule> {
83
+ /**
84
+ * The tables in the database.
85
+ */
86
+ readonly tables = new TableMap<RemoteModule>();
87
+
88
+ /**
89
+ * Returns the table with the given name.
90
+ * - If SchemaDef is a concrete schema, `name` is constrained to known table names,
91
+ * and the return type matches that table.
92
+ * - If SchemaDef is undefined, `name` is string and the return type is untyped.
93
+ */
94
+ getTable<N extends TableName<RemoteModule>>(
95
+ name: N
96
+ ): TableCacheForTableName<RemoteModule, N> {
97
+ const table = this.tables.get(name);
98
+ if (!table) {
99
+ console.error(
100
+ 'The table has not been registered for this client. Please register the table before using it. If you have registered global tables using the SpacetimeDBClient.registerTables() or `registerTable()` method, please make sure that is executed first!'
101
+ );
102
+ throw new Error(`Table ${String(name)} does not exist`);
103
+ }
104
+ return table;
105
+ }
106
+
107
+ /**
108
+ * Returns the table with the given name, creating it if needed.
109
+ * - Typed mode: `tableTypeInfo.tableName` is constrained to known names and
110
+ * the return type matches that table.
111
+ * - Untyped mode: accepts any string and returns an untyped TableCache.
112
+ */
113
+ getOrCreateTable<N extends TableName<RemoteModule>>(
114
+ tableDef: TableDefForTableName<RemoteModule, N>
115
+ ): TableCacheForTableName<RemoteModule, N> {
116
+ const name = tableDef.accessorName;
117
+
118
+ const table = this.tables.get(name);
119
+ if (table) {
120
+ return table;
121
+ }
122
+
123
+ const newTable = new TableCacheImpl<RemoteModule, N>(
124
+ tableDef
125
+ ) as TableCache<RemoteModule, N>;
126
+ this.tables.set(name, newTable);
127
+ return newTable;
128
+ }
129
+ }
@@ -1,179 +1,179 @@
1
- import type { ReadonlyIndexes } from '../lib/indexes';
2
- import type { TableNamesOf } from '../lib/schema';
3
- import type {
4
- ReadonlyTableMethods,
5
- RowType,
6
- TableIndexes,
7
- UntypedTableDef,
8
- } from '../lib/table';
9
- import type { ColumnBuilder } from '../lib/type_builders';
10
- import type { Prettify } from '../lib/type_util';
11
- import type { TableDefForTableName } from './client_cache';
12
- import type { EventContextInterface } from './event_context';
13
- import type { UntypedRemoteModule } from './spacetime_module';
14
-
15
- export type ClientTablePrimaryKeyMethods<
16
- RemoteModule extends UntypedRemoteModule,
17
- TableName extends TableNamesOf<RemoteModule>,
18
- > = {
19
- /**
20
- * Registers a callback to be invoked when a row is updated in the table.
21
- * Requires that the table has a primary key defined.
22
- * @param cb The callback to invoke when a row is updated.
23
- */
24
- onUpdate(
25
- cb: (
26
- ctx: EventContextInterface<RemoteModule>,
27
- oldRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>,
28
- newRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
29
- ) => void
30
- ): void;
31
-
32
- /**
33
- * Removes a previously registered update event listener.
34
- * @param cb The callback to remove from the update event listeners.
35
- */
36
- removeOnUpdate(
37
- cb: (
38
- ctx: EventContextInterface<RemoteModule>,
39
- oldRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>,
40
- newRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
41
- ) => void
42
- ): void;
43
- };
44
-
45
- export type ClientTableInsertMethods<
46
- RemoteModule extends UntypedRemoteModule,
47
- TableName extends TableNamesOf<RemoteModule>,
48
- > = {
49
- /**
50
- * Registers a callback to be invoked when a row is inserted into the table.
51
- */
52
- onInsert(
53
- cb: (
54
- ctx: EventContextInterface<RemoteModule>,
55
- row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
56
- ) => void
57
- ): void;
58
-
59
- /**
60
- * Removes a previously registered insert event listener.
61
- * @param cb The callback to remove from the insert event listeners.
62
- */
63
- removeOnInsert(
64
- cb: (
65
- ctx: EventContextInterface<RemoteModule>,
66
- row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
67
- ) => void
68
- ): void;
69
- };
70
-
71
- export type ClientTableDeleteMethods<
72
- RemoteModule extends UntypedRemoteModule,
73
- TableName extends TableNamesOf<RemoteModule>,
74
- > = {
75
- /**
76
- * Registers a callback to be invoked when a row is deleted from the table.
77
- */
78
- onDelete(
79
- cb: (
80
- ctx: EventContextInterface<RemoteModule>,
81
- row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
82
- ) => void
83
- ): void;
84
-
85
- /**
86
- * Removes a previously registered delete event listener.
87
- * @param cb The callback to remove from the delete event listeners.
88
- */
89
- removeOnDelete(
90
- cb: (
91
- ctx: EventContextInterface<RemoteModule>,
92
- row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
93
- ) => void
94
- ): void;
95
- };
96
-
97
- export type ClientTableMethods<
98
- RemoteModule extends UntypedRemoteModule,
99
- TableName extends TableNamesOf<RemoteModule>,
100
- > = ClientTableInsertMethods<RemoteModule, TableName> &
101
- ClientTableDeleteMethods<RemoteModule, TableName>;
102
-
103
- /**
104
- * Table<Row, UniqueConstraintViolation = never, AutoIncOverflow = never>
105
- *
106
- * - Row: row shape
107
- * - UCV: unique-constraint violation error type (never if none)
108
- * - AIO: auto-increment overflow error type (never if none)
109
- */
110
- export type ClientTable<
111
- RemoteModule extends UntypedRemoteModule,
112
- TableName extends TableNamesOf<RemoteModule>,
113
- > = Prettify<
114
- ClientTableCore<RemoteModule, TableName> &
115
- ReadonlyIndexes<
116
- TableDefForTableName<RemoteModule, TableName>,
117
- TableIndexes<TableDefForTableName<RemoteModule, TableName>>
118
- >
119
- >;
120
-
121
- type IsEventTable<TableDef extends UntypedTableDef> = TableDef extends {
122
- isEvent: true;
123
- }
124
- ? true
125
- : false;
126
-
127
- type HasPrimaryKey<TableDef extends UntypedTableDef> = ColumnsHavePrimaryKey<
128
- TableDef['columns']
129
- >;
130
-
131
- type ColumnsHavePrimaryKey<
132
- Cs extends Record<string, ColumnBuilder<any, any, any>>,
133
- > = {
134
- [K in keyof Cs]: Cs[K] extends ColumnBuilder<any, any, infer M>
135
- ? M extends { isPrimaryKey: true }
136
- ? true
137
- : never
138
- : never;
139
- }[keyof Cs] extends true
140
- ? true
141
- : false;
142
-
143
- type MaybePKMethods<
144
- RemoteModule extends UntypedRemoteModule,
145
- TableName extends TableNamesOf<RemoteModule>,
146
- > = Partial<ClientTablePrimaryKeyMethods<RemoteModule, TableName>>;
147
-
148
- /**
149
- * A variant of ClientTableCore where the primary key methods are always optional,
150
- * allowing for classes like TableCache to implement this interface
151
- */
152
- export type ClientTableCoreImplementable<
153
- RemoteModule extends UntypedRemoteModule,
154
- TableName extends TableNamesOf<RemoteModule>,
155
- > = ReadonlyTableMethods<TableDefForTableName<RemoteModule, TableName>> &
156
- ClientTableMethods<RemoteModule, TableName> &
157
- // always present but optional -> statically known member set
158
- MaybePKMethods<RemoteModule, TableName>;
159
-
160
- /**
161
- * Core methods of ClientTable, without the indexes mixed in.
162
- * Includes only statically known methods.
163
- *
164
- * Event tables only expose insert callbacks (no delete or update),
165
- * matching the Rust SDK's `EventTable` trait.
166
- */
167
- export type ClientTableCore<
168
- RemoteModule extends UntypedRemoteModule,
169
- TableName extends TableNamesOf<RemoteModule>,
170
- > = ReadonlyTableMethods<TableDefForTableName<RemoteModule, TableName>> &
171
- ClientTableInsertMethods<RemoteModule, TableName> &
172
- (IsEventTable<TableDefForTableName<RemoteModule, TableName>> extends true
173
- ? {}
174
- : ClientTableDeleteMethods<RemoteModule, TableName> &
175
- (HasPrimaryKey<
176
- TableDefForTableName<RemoteModule, TableName>
177
- > extends true
178
- ? ClientTablePrimaryKeyMethods<RemoteModule, TableName>
179
- : {}));
1
+ import type { ReadonlyIndexes } from '../lib/indexes';
2
+ import type { TableNamesOf } from '../lib/schema';
3
+ import type {
4
+ ReadonlyTableMethods,
5
+ RowType,
6
+ TableIndexes,
7
+ UntypedTableDef,
8
+ } from '../lib/table';
9
+ import type { ColumnBuilder } from '../lib/type_builders';
10
+ import type { Prettify } from '../lib/type_util';
11
+ import type { TableDefForTableName } from './client_cache';
12
+ import type { EventContextInterface } from './event_context';
13
+ import type { UntypedRemoteModule } from './spacetime_module';
14
+
15
+ export type ClientTablePrimaryKeyMethods<
16
+ RemoteModule extends UntypedRemoteModule,
17
+ TableName extends TableNamesOf<RemoteModule>,
18
+ > = {
19
+ /**
20
+ * Registers a callback to be invoked when a row is updated in the table.
21
+ * Requires that the table has a primary key defined.
22
+ * @param cb The callback to invoke when a row is updated.
23
+ */
24
+ onUpdate(
25
+ cb: (
26
+ ctx: EventContextInterface<RemoteModule>,
27
+ oldRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>,
28
+ newRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
29
+ ) => void
30
+ ): void;
31
+
32
+ /**
33
+ * Removes a previously registered update event listener.
34
+ * @param cb The callback to remove from the update event listeners.
35
+ */
36
+ removeOnUpdate(
37
+ cb: (
38
+ ctx: EventContextInterface<RemoteModule>,
39
+ oldRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>,
40
+ newRow: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
41
+ ) => void
42
+ ): void;
43
+ };
44
+
45
+ export type ClientTableInsertMethods<
46
+ RemoteModule extends UntypedRemoteModule,
47
+ TableName extends TableNamesOf<RemoteModule>,
48
+ > = {
49
+ /**
50
+ * Registers a callback to be invoked when a row is inserted into the table.
51
+ */
52
+ onInsert(
53
+ cb: (
54
+ ctx: EventContextInterface<RemoteModule>,
55
+ row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
56
+ ) => void
57
+ ): void;
58
+
59
+ /**
60
+ * Removes a previously registered insert event listener.
61
+ * @param cb The callback to remove from the insert event listeners.
62
+ */
63
+ removeOnInsert(
64
+ cb: (
65
+ ctx: EventContextInterface<RemoteModule>,
66
+ row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
67
+ ) => void
68
+ ): void;
69
+ };
70
+
71
+ export type ClientTableDeleteMethods<
72
+ RemoteModule extends UntypedRemoteModule,
73
+ TableName extends TableNamesOf<RemoteModule>,
74
+ > = {
75
+ /**
76
+ * Registers a callback to be invoked when a row is deleted from the table.
77
+ */
78
+ onDelete(
79
+ cb: (
80
+ ctx: EventContextInterface<RemoteModule>,
81
+ row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
82
+ ) => void
83
+ ): void;
84
+
85
+ /**
86
+ * Removes a previously registered delete event listener.
87
+ * @param cb The callback to remove from the delete event listeners.
88
+ */
89
+ removeOnDelete(
90
+ cb: (
91
+ ctx: EventContextInterface<RemoteModule>,
92
+ row: Prettify<RowType<TableDefForTableName<RemoteModule, TableName>>>
93
+ ) => void
94
+ ): void;
95
+ };
96
+
97
+ export type ClientTableMethods<
98
+ RemoteModule extends UntypedRemoteModule,
99
+ TableName extends TableNamesOf<RemoteModule>,
100
+ > = ClientTableInsertMethods<RemoteModule, TableName> &
101
+ ClientTableDeleteMethods<RemoteModule, TableName>;
102
+
103
+ /**
104
+ * Table<Row, UniqueConstraintViolation = never, AutoIncOverflow = never>
105
+ *
106
+ * - Row: row shape
107
+ * - UCV: unique-constraint violation error type (never if none)
108
+ * - AIO: auto-increment overflow error type (never if none)
109
+ */
110
+ export type ClientTable<
111
+ RemoteModule extends UntypedRemoteModule,
112
+ TableName extends TableNamesOf<RemoteModule>,
113
+ > = Prettify<
114
+ ClientTableCore<RemoteModule, TableName> &
115
+ ReadonlyIndexes<
116
+ TableDefForTableName<RemoteModule, TableName>,
117
+ TableIndexes<TableDefForTableName<RemoteModule, TableName>>
118
+ >
119
+ >;
120
+
121
+ type IsEventTable<TableDef extends UntypedTableDef> = TableDef extends {
122
+ isEvent: true;
123
+ }
124
+ ? true
125
+ : false;
126
+
127
+ type HasPrimaryKey<TableDef extends UntypedTableDef> = ColumnsHavePrimaryKey<
128
+ TableDef['columns']
129
+ >;
130
+
131
+ type ColumnsHavePrimaryKey<
132
+ Cs extends Record<string, ColumnBuilder<any, any, any>>,
133
+ > = {
134
+ [K in keyof Cs]: Cs[K] extends ColumnBuilder<any, any, infer M>
135
+ ? M extends { isPrimaryKey: true }
136
+ ? true
137
+ : never
138
+ : never;
139
+ }[keyof Cs] extends true
140
+ ? true
141
+ : false;
142
+
143
+ type MaybePKMethods<
144
+ RemoteModule extends UntypedRemoteModule,
145
+ TableName extends TableNamesOf<RemoteModule>,
146
+ > = Partial<ClientTablePrimaryKeyMethods<RemoteModule, TableName>>;
147
+
148
+ /**
149
+ * A variant of ClientTableCore where the primary key methods are always optional,
150
+ * allowing for classes like TableCache to implement this interface
151
+ */
152
+ export type ClientTableCoreImplementable<
153
+ RemoteModule extends UntypedRemoteModule,
154
+ TableName extends TableNamesOf<RemoteModule>,
155
+ > = ReadonlyTableMethods<TableDefForTableName<RemoteModule, TableName>> &
156
+ ClientTableMethods<RemoteModule, TableName> &
157
+ // always present but optional -> statically known member set
158
+ MaybePKMethods<RemoteModule, TableName>;
159
+
160
+ /**
161
+ * Core methods of ClientTable, without the indexes mixed in.
162
+ * Includes only statically known methods.
163
+ *
164
+ * Event tables only expose insert callbacks (no delete or update),
165
+ * matching the Rust SDK's `EventTable` trait.
166
+ */
167
+ export type ClientTableCore<
168
+ RemoteModule extends UntypedRemoteModule,
169
+ TableName extends TableNamesOf<RemoteModule>,
170
+ > = ReadonlyTableMethods<TableDefForTableName<RemoteModule, TableName>> &
171
+ ClientTableInsertMethods<RemoteModule, TableName> &
172
+ (IsEventTable<TableDefForTableName<RemoteModule, TableName>> extends true
173
+ ? {}
174
+ : ClientTableDeleteMethods<RemoteModule, TableName> &
175
+ (HasPrimaryKey<
176
+ TableDefForTableName<RemoteModule, TableName>
177
+ > extends true
178
+ ? ClientTablePrimaryKeyMethods<RemoteModule, TableName>
179
+ : {}));