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