spacetimedb 2.6.0 → 2.6.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (172) hide show
  1. package/README.md +211 -211
  2. package/dist/angular/index.cjs.map +1 -1
  3. package/dist/angular/index.mjs.map +1 -1
  4. package/dist/browser/angular/index.mjs.map +1 -1
  5. package/dist/browser/react/index.mjs.map +1 -1
  6. package/dist/browser/solid/index.mjs.map +1 -1
  7. package/dist/browser/svelte/index.mjs.map +1 -1
  8. package/dist/browser/vue/index.mjs.map +1 -1
  9. package/dist/index.browser.mjs.map +1 -1
  10. package/dist/index.cjs.map +1 -1
  11. package/dist/index.mjs.map +1 -1
  12. package/dist/lib/type_builders.d.ts +18 -3
  13. package/dist/lib/type_builders.d.ts.map +1 -1
  14. package/dist/min/index.browser.mjs.map +1 -1
  15. package/dist/min/react/index.mjs.map +1 -1
  16. package/dist/min/sdk/index.browser.mjs.map +1 -1
  17. package/dist/react/index.cjs.map +1 -1
  18. package/dist/react/index.mjs.map +1 -1
  19. package/dist/sdk/db_connection_impl.d.ts.map +1 -1
  20. package/dist/sdk/event_context.d.ts +3 -3
  21. package/dist/sdk/event_context.d.ts.map +1 -1
  22. package/dist/sdk/index.browser.mjs.map +1 -1
  23. package/dist/sdk/index.cjs.map +1 -1
  24. package/dist/sdk/index.mjs.map +1 -1
  25. package/dist/sdk/procedures.d.ts +2 -2
  26. package/dist/sdk/procedures.d.ts.map +1 -1
  27. package/dist/sdk/reducers.d.ts +3 -4
  28. package/dist/sdk/reducers.d.ts.map +1 -1
  29. package/dist/sdk/table_cache.d.ts.map +1 -1
  30. package/dist/sdk/type_utils.d.ts +3 -3
  31. package/dist/sdk/type_utils.d.ts.map +1 -1
  32. package/dist/server/index.mjs.map +1 -1
  33. package/dist/server/runtime.d.ts.map +1 -1
  34. package/dist/server/views.d.ts +4 -2
  35. package/dist/server/views.d.ts.map +1 -1
  36. package/dist/solid/index.cjs.map +1 -1
  37. package/dist/solid/index.mjs.map +1 -1
  38. package/dist/svelte/index.cjs.map +1 -1
  39. package/dist/svelte/index.mjs.map +1 -1
  40. package/dist/svelte/useReducer.d.ts +2 -2
  41. package/dist/svelte/useReducer.d.ts.map +1 -1
  42. package/dist/tanstack/index.cjs.map +1 -1
  43. package/dist/tanstack/index.mjs.map +1 -1
  44. package/dist/vue/index.cjs.map +1 -1
  45. package/dist/vue/index.mjs.map +1 -1
  46. package/package.json +22 -21
  47. package/src/angular/connection_state.ts +19 -19
  48. package/src/angular/index.ts +3 -3
  49. package/src/angular/injectors/index.ts +4 -4
  50. package/src/angular/injectors/inject-reducer.ts +62 -62
  51. package/src/angular/injectors/inject-spacetimedb-connected.ts +13 -13
  52. package/src/angular/injectors/inject-spacetimedb.ts +10 -10
  53. package/src/angular/injectors/inject-table.ts +234 -234
  54. package/src/angular/providers/index.ts +1 -1
  55. package/src/angular/providers/provide-spacetimedb.ts +96 -96
  56. package/src/index.ts +16 -16
  57. package/src/lib/algebraic_type.ts +819 -819
  58. package/src/lib/algebraic_type_variants.ts +26 -26
  59. package/src/lib/algebraic_value.ts +10 -10
  60. package/src/lib/autogen/types.ts +746 -746
  61. package/src/lib/binary_reader.ts +188 -188
  62. package/src/lib/binary_writer.ts +213 -213
  63. package/src/lib/connection_id.ts +102 -102
  64. package/src/lib/constraints.ts +48 -48
  65. package/src/lib/errors.ts +26 -26
  66. package/src/lib/filter.ts +195 -195
  67. package/src/lib/identity.ts +83 -83
  68. package/src/lib/indexes.ts +251 -251
  69. package/src/lib/option.ts +34 -34
  70. package/src/lib/query.ts +1019 -1019
  71. package/src/lib/reducer_schema.ts +38 -38
  72. package/src/lib/reducers.ts +116 -116
  73. package/src/lib/result.ts +36 -36
  74. package/src/lib/schedule_at.ts +86 -86
  75. package/src/lib/schema.ts +420 -420
  76. package/src/lib/table.ts +548 -548
  77. package/src/lib/table_schema.ts +64 -64
  78. package/src/lib/time_duration.ts +77 -77
  79. package/src/lib/timestamp.ts +148 -148
  80. package/src/lib/type_builders.test-d.ts +130 -128
  81. package/src/lib/type_builders.ts +4050 -4014
  82. package/src/lib/type_util.ts +124 -124
  83. package/src/lib/util.ts +196 -196
  84. package/src/lib/uuid.ts +337 -337
  85. package/src/react/SpacetimeDBProvider.ts +84 -84
  86. package/src/react/connection_state.ts +6 -6
  87. package/src/react/index.ts +5 -5
  88. package/src/react/useProcedure.ts +60 -60
  89. package/src/react/useReducer.ts +53 -53
  90. package/src/react/useSpacetimeDB.ts +18 -18
  91. package/src/react/useTable.ts +256 -256
  92. package/src/sdk/client_api/index.ts +114 -114
  93. package/src/sdk/client_api/types/procedures.ts +8 -8
  94. package/src/sdk/client_api/types/reducers.ts +8 -8
  95. package/src/sdk/client_api/types.ts +288 -288
  96. package/src/sdk/client_cache.ts +129 -129
  97. package/src/sdk/client_table.ts +179 -179
  98. package/src/sdk/connection_manager.ts +352 -352
  99. package/src/sdk/db_connection_builder.ts +290 -290
  100. package/src/sdk/db_connection_impl.ts +1363 -1356
  101. package/src/sdk/db_context.ts +28 -28
  102. package/src/sdk/db_view.ts +12 -12
  103. package/src/sdk/decompress.ts +51 -51
  104. package/src/sdk/event.ts +18 -18
  105. package/src/sdk/event_context.ts +51 -51
  106. package/src/sdk/event_emitter.ts +32 -32
  107. package/src/sdk/index.ts +14 -14
  108. package/src/sdk/internal.ts +2 -2
  109. package/src/sdk/json_api.ts +46 -46
  110. package/src/sdk/logger.ts +134 -134
  111. package/src/sdk/message_types.ts +46 -46
  112. package/src/sdk/procedures.ts +87 -83
  113. package/src/sdk/reducer_event.ts +20 -20
  114. package/src/sdk/reducer_handle.ts +12 -12
  115. package/src/sdk/reducers.ts +158 -159
  116. package/src/sdk/schema.ts +45 -45
  117. package/src/sdk/spacetime_module.ts +28 -28
  118. package/src/sdk/subscription_builder_impl.ts +275 -275
  119. package/src/sdk/table_cache.ts +582 -581
  120. package/src/sdk/type_utils.ts +19 -19
  121. package/src/sdk/version.ts +133 -133
  122. package/src/sdk/websocket_decompress_adapter.ts +63 -63
  123. package/src/sdk/websocket_protocols.ts +25 -25
  124. package/src/sdk/websocket_test_adapter.ts +107 -107
  125. package/src/sdk/websocket_v3_frames.ts +126 -126
  126. package/src/sdk/ws.ts +105 -105
  127. package/src/server/console.ts +81 -81
  128. package/src/server/db_view.ts +21 -21
  129. package/src/server/errors.ts +138 -138
  130. package/src/server/http.test-d.ts +80 -80
  131. package/src/server/http.ts +14 -14
  132. package/src/server/http_handlers.ts +413 -413
  133. package/src/server/http_internal.ts +79 -79
  134. package/src/server/http_shared.ts +186 -186
  135. package/src/server/index.ts +37 -37
  136. package/src/server/polyfills.ts +4 -4
  137. package/src/server/procedures.ts +239 -239
  138. package/src/server/query.ts +1 -1
  139. package/src/server/range.ts +53 -53
  140. package/src/server/reducers.ts +113 -113
  141. package/src/server/rng.ts +113 -113
  142. package/src/server/runtime.ts +1102 -1102
  143. package/src/server/schema.test-d.ts +99 -99
  144. package/src/server/schema.ts +663 -663
  145. package/src/server/sys.d.ts +125 -125
  146. package/src/server/view.test-d.ts +194 -194
  147. package/src/server/views.ts +343 -340
  148. package/src/solid/SpacetimeDBProvider.ts +97 -97
  149. package/src/solid/connection_state.ts +6 -6
  150. package/src/solid/index.ts +5 -5
  151. package/src/solid/useProcedure.ts +57 -57
  152. package/src/solid/useReducer.ts +50 -50
  153. package/src/solid/useSpacetimeDB.ts +18 -18
  154. package/src/solid/useTable.ts +203 -203
  155. package/src/svelte/SpacetimeDBProvider.ts +101 -101
  156. package/src/svelte/connection_state.ts +16 -16
  157. package/src/svelte/index.ts +4 -4
  158. package/src/svelte/useReducer.ts +61 -61
  159. package/src/svelte/useSpacetimeDB.ts +22 -22
  160. package/src/svelte/useTable.ts +218 -218
  161. package/src/tanstack/SpacetimeDBQueryClient.ts +330 -330
  162. package/src/tanstack/hooks.ts +83 -83
  163. package/src/tanstack/index.ts +16 -16
  164. package/src/util-stub.ts +1 -1
  165. package/src/vue/SpacetimeDBProvider.ts +157 -157
  166. package/src/vue/connection_state.ts +19 -19
  167. package/src/vue/index.ts +5 -5
  168. package/src/vue/useProcedure.ts +62 -62
  169. package/src/vue/useReducer.ts +55 -55
  170. package/src/vue/useSpacetimeDB.ts +18 -18
  171. package/src/vue/useTable.ts +229 -229
  172. package/LICENSE.txt +0 -759
@@ -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
+ : {}));