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.
- package/LICENSE.txt +759 -759
- package/README.md +211 -211
- package/dist/angular/index.cjs.map +1 -1
- package/dist/angular/index.mjs.map +1 -1
- package/dist/browser/angular/index.mjs.map +1 -1
- package/dist/browser/react/index.mjs +129 -57
- package/dist/browser/react/index.mjs.map +1 -1
- package/dist/browser/solid/index.mjs +120 -50
- package/dist/browser/solid/index.mjs.map +1 -1
- package/dist/browser/svelte/index.mjs.map +1 -1
- package/dist/browser/vue/index.mjs.map +1 -1
- package/dist/index.browser.mjs +10 -2
- package/dist/index.browser.mjs.map +1 -1
- package/dist/index.cjs +10 -2
- package/dist/index.cjs.map +1 -1
- package/dist/index.mjs +10 -2
- package/dist/index.mjs.map +1 -1
- package/dist/min/index.browser.mjs +1 -1
- package/dist/min/index.browser.mjs.map +1 -1
- package/dist/min/react/index.mjs +1 -1
- package/dist/min/react/index.mjs.map +1 -1
- package/dist/min/sdk/index.browser.mjs +1 -1
- package/dist/min/sdk/index.browser.mjs.map +1 -1
- package/dist/react/index.cjs +129 -57
- package/dist/react/index.cjs.map +1 -1
- package/dist/react/index.mjs +129 -57
- package/dist/react/index.mjs.map +1 -1
- package/dist/react/useTable.d.ts.map +1 -1
- package/dist/sdk/connection_manager.d.ts +8 -0
- package/dist/sdk/connection_manager.d.ts.map +1 -1
- package/dist/sdk/db_connection_impl.d.ts +7 -0
- package/dist/sdk/db_connection_impl.d.ts.map +1 -1
- package/dist/sdk/index.browser.mjs +10 -2
- package/dist/sdk/index.browser.mjs.map +1 -1
- package/dist/sdk/index.cjs +10 -2
- package/dist/sdk/index.cjs.map +1 -1
- package/dist/sdk/index.mjs +10 -2
- package/dist/sdk/index.mjs.map +1 -1
- package/dist/sdk/websocket_test_adapter.d.ts +2 -1
- package/dist/sdk/websocket_test_adapter.d.ts.map +1 -1
- package/dist/server/index.mjs.map +1 -1
- package/dist/server/runtime.d.ts.map +1 -1
- package/dist/solid/index.cjs +120 -50
- package/dist/solid/index.cjs.map +1 -1
- package/dist/solid/index.mjs +120 -50
- package/dist/solid/index.mjs.map +1 -1
- package/dist/svelte/index.cjs.map +1 -1
- package/dist/svelte/index.mjs.map +1 -1
- package/dist/tanstack/index.cjs +120 -50
- package/dist/tanstack/index.cjs.map +1 -1
- package/dist/tanstack/index.mjs +120 -50
- package/dist/tanstack/index.mjs.map +1 -1
- package/dist/vue/index.cjs.map +1 -1
- package/dist/vue/index.mjs.map +1 -1
- package/package.json +1 -1
- package/src/angular/connection_state.ts +19 -19
- package/src/angular/index.ts +3 -3
- package/src/angular/injectors/index.ts +4 -4
- package/src/angular/injectors/inject-reducer.ts +62 -62
- package/src/angular/injectors/inject-spacetimedb-connected.ts +13 -13
- package/src/angular/injectors/inject-spacetimedb.ts +10 -10
- package/src/angular/injectors/inject-table.ts +234 -234
- package/src/angular/providers/index.ts +1 -1
- package/src/angular/providers/provide-spacetimedb.ts +96 -96
- package/src/index.ts +16 -16
- package/src/lib/algebraic_type.ts +819 -819
- package/src/lib/algebraic_type_variants.ts +26 -26
- package/src/lib/algebraic_value.ts +10 -10
- package/src/lib/autogen/types.ts +746 -746
- package/src/lib/binary_reader.ts +188 -188
- package/src/lib/binary_writer.ts +213 -213
- package/src/lib/connection_id.ts +102 -102
- package/src/lib/constraints.ts +48 -48
- package/src/lib/errors.ts +26 -26
- package/src/lib/filter.ts +195 -195
- package/src/lib/identity.ts +83 -83
- package/src/lib/indexes.ts +251 -251
- package/src/lib/option.ts +34 -34
- package/src/lib/query.ts +1019 -1019
- package/src/lib/reducer_schema.ts +38 -38
- package/src/lib/reducers.ts +116 -116
- package/src/lib/result.ts +36 -36
- package/src/lib/schedule_at.ts +86 -86
- package/src/lib/schema.ts +420 -420
- package/src/lib/table.ts +548 -548
- package/src/lib/table_schema.ts +64 -64
- package/src/lib/time_duration.ts +77 -77
- package/src/lib/timestamp.ts +148 -148
- package/src/lib/type_builders.test-d.ts +128 -128
- package/src/lib/type_builders.ts +4014 -4014
- package/src/lib/type_util.ts +124 -124
- package/src/lib/util.ts +196 -196
- package/src/lib/uuid.ts +337 -337
- package/src/react/SpacetimeDBProvider.ts +84 -84
- package/src/react/connection_state.ts +6 -6
- package/src/react/index.ts +5 -5
- package/src/react/useProcedure.ts +60 -60
- package/src/react/useReducer.ts +53 -53
- package/src/react/useSpacetimeDB.ts +18 -18
- package/src/react/useTable.ts +256 -251
- package/src/sdk/client_api/index.ts +114 -114
- package/src/sdk/client_api/types/procedures.ts +8 -8
- package/src/sdk/client_api/types/reducers.ts +8 -8
- package/src/sdk/client_api/types.ts +288 -288
- package/src/sdk/client_cache.ts +129 -129
- package/src/sdk/client_table.ts +179 -179
- package/src/sdk/connection_manager.ts +352 -237
- package/src/sdk/db_connection_builder.ts +290 -290
- package/src/sdk/db_connection_impl.ts +1356 -1347
- package/src/sdk/db_context.ts +28 -28
- package/src/sdk/db_view.ts +12 -12
- package/src/sdk/decompress.ts +51 -51
- package/src/sdk/event.ts +18 -18
- package/src/sdk/event_context.ts +51 -51
- package/src/sdk/event_emitter.ts +32 -32
- package/src/sdk/index.ts +14 -14
- package/src/sdk/internal.ts +2 -2
- package/src/sdk/json_api.ts +46 -46
- package/src/sdk/logger.ts +134 -134
- package/src/sdk/message_types.ts +46 -46
- package/src/sdk/procedures.ts +83 -83
- package/src/sdk/reducer_event.ts +20 -20
- package/src/sdk/reducer_handle.ts +12 -12
- package/src/sdk/reducers.ts +159 -159
- package/src/sdk/schema.ts +45 -45
- package/src/sdk/spacetime_module.ts +28 -28
- package/src/sdk/subscription_builder_impl.ts +275 -275
- package/src/sdk/table_cache.ts +581 -581
- package/src/sdk/type_utils.ts +19 -19
- package/src/sdk/version.ts +133 -133
- package/src/sdk/websocket_decompress_adapter.ts +63 -63
- package/src/sdk/websocket_protocols.ts +25 -25
- package/src/sdk/websocket_test_adapter.ts +107 -100
- package/src/sdk/websocket_v3_frames.ts +126 -126
- package/src/sdk/ws.ts +105 -105
- package/src/server/console.ts +81 -81
- package/src/server/db_view.ts +21 -21
- package/src/server/errors.ts +138 -138
- package/src/server/http.test-d.ts +80 -80
- package/src/server/http.ts +14 -14
- package/src/server/http_handlers.ts +413 -413
- package/src/server/http_internal.ts +79 -79
- package/src/server/http_shared.ts +186 -186
- package/src/server/index.ts +37 -37
- package/src/server/polyfills.ts +4 -4
- package/src/server/procedures.ts +239 -239
- package/src/server/query.ts +1 -1
- package/src/server/range.ts +53 -53
- package/src/server/reducers.ts +113 -113
- package/src/server/rng.ts +113 -113
- package/src/server/runtime.ts +1102 -1102
- package/src/server/schema.test-d.ts +99 -99
- package/src/server/schema.ts +663 -663
- package/src/server/sys.d.ts +125 -125
- package/src/server/view.test-d.ts +194 -194
- package/src/server/views.ts +340 -340
- package/src/solid/SpacetimeDBProvider.ts +97 -97
- package/src/solid/connection_state.ts +6 -6
- package/src/solid/index.ts +5 -5
- package/src/solid/useProcedure.ts +57 -57
- package/src/solid/useReducer.ts +50 -50
- package/src/solid/useSpacetimeDB.ts +18 -18
- package/src/solid/useTable.ts +203 -203
- package/src/svelte/SpacetimeDBProvider.ts +101 -101
- package/src/svelte/connection_state.ts +16 -16
- package/src/svelte/index.ts +4 -4
- package/src/svelte/useReducer.ts +61 -61
- package/src/svelte/useSpacetimeDB.ts +22 -22
- package/src/svelte/useTable.ts +218 -218
- package/src/tanstack/SpacetimeDBQueryClient.ts +330 -330
- package/src/tanstack/hooks.ts +83 -83
- package/src/tanstack/index.ts +16 -16
- package/src/util-stub.ts +1 -1
- package/src/vue/SpacetimeDBProvider.ts +157 -157
- package/src/vue/connection_state.ts +19 -19
- package/src/vue/index.ts +5 -5
- package/src/vue/useProcedure.ts +62 -62
- package/src/vue/useReducer.ts +55 -55
- package/src/vue/useSpacetimeDB.ts +18 -18
- package/src/vue/useTable.ts +229 -229
package/src/sdk/client_cache.ts
CHANGED
|
@@ -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
|
+
}
|
package/src/sdk/client_table.ts
CHANGED
|
@@ -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
|
+
: {}));
|