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
|
@@ -1,84 +1,84 @@
|
|
|
1
|
-
import {
|
|
2
|
-
DbConnectionBuilder,
|
|
3
|
-
type DbConnectionImpl,
|
|
4
|
-
} from '../sdk/db_connection_impl';
|
|
5
|
-
import * as React from 'react';
|
|
6
|
-
import { SpacetimeDBContext } from './useSpacetimeDB';
|
|
7
|
-
import type { ConnectionState } from './connection_state';
|
|
8
|
-
import { ConnectionId } from '../lib/connection_id';
|
|
9
|
-
import {
|
|
10
|
-
ConnectionManager,
|
|
11
|
-
type ConnectionState as ManagerConnectionState,
|
|
12
|
-
} from '../sdk/connection_manager';
|
|
13
|
-
|
|
14
|
-
export interface SpacetimeDBProviderProps<
|
|
15
|
-
DbConnection extends DbConnectionImpl<any>,
|
|
16
|
-
> {
|
|
17
|
-
connectionBuilder: DbConnectionBuilder<DbConnection>;
|
|
18
|
-
children?: React.ReactNode;
|
|
19
|
-
}
|
|
20
|
-
|
|
21
|
-
export function SpacetimeDBProvider<
|
|
22
|
-
DbConnection extends DbConnectionImpl<any>,
|
|
23
|
-
>({
|
|
24
|
-
connectionBuilder,
|
|
25
|
-
children,
|
|
26
|
-
}: SpacetimeDBProviderProps<DbConnection>): React.JSX.Element {
|
|
27
|
-
const uri = connectionBuilder.getUri();
|
|
28
|
-
const moduleName = connectionBuilder.getModuleName();
|
|
29
|
-
const key = React.useMemo(
|
|
30
|
-
() => ConnectionManager.getKey(uri, moduleName),
|
|
31
|
-
[uri, moduleName]
|
|
32
|
-
);
|
|
33
|
-
|
|
34
|
-
const fallbackStateRef = React.useRef<ManagerConnectionState>({
|
|
35
|
-
isActive: false,
|
|
36
|
-
identity: undefined,
|
|
37
|
-
token: undefined,
|
|
38
|
-
connectionId: ConnectionId.random(),
|
|
39
|
-
connectionError: undefined,
|
|
40
|
-
});
|
|
41
|
-
|
|
42
|
-
const subscribe = React.useCallback(
|
|
43
|
-
(onStoreChange: () => void) =>
|
|
44
|
-
ConnectionManager.subscribe(key, onStoreChange),
|
|
45
|
-
[key]
|
|
46
|
-
);
|
|
47
|
-
const getSnapshot = React.useCallback(
|
|
48
|
-
() => ConnectionManager.getSnapshot(key) ?? fallbackStateRef.current,
|
|
49
|
-
[key]
|
|
50
|
-
);
|
|
51
|
-
const getServerSnapshot = React.useCallback(
|
|
52
|
-
() => fallbackStateRef.current,
|
|
53
|
-
[]
|
|
54
|
-
);
|
|
55
|
-
|
|
56
|
-
const state = React.useSyncExternalStore(
|
|
57
|
-
subscribe,
|
|
58
|
-
getSnapshot,
|
|
59
|
-
getServerSnapshot
|
|
60
|
-
);
|
|
61
|
-
|
|
62
|
-
const getConnection = React.useCallback(
|
|
63
|
-
() => ConnectionManager.getConnection<DbConnection>(key),
|
|
64
|
-
[key]
|
|
65
|
-
);
|
|
66
|
-
|
|
67
|
-
const contextValue = React.useMemo<ConnectionState>(
|
|
68
|
-
() => ({ ...state, getConnection }),
|
|
69
|
-
[state, getConnection]
|
|
70
|
-
);
|
|
71
|
-
|
|
72
|
-
React.useEffect(() => {
|
|
73
|
-
ConnectionManager.retain(key, connectionBuilder);
|
|
74
|
-
return () => {
|
|
75
|
-
ConnectionManager.release(key);
|
|
76
|
-
};
|
|
77
|
-
}, [key, connectionBuilder]);
|
|
78
|
-
|
|
79
|
-
return React.createElement(
|
|
80
|
-
SpacetimeDBContext.Provider,
|
|
81
|
-
{ value: contextValue },
|
|
82
|
-
children
|
|
83
|
-
);
|
|
84
|
-
}
|
|
1
|
+
import {
|
|
2
|
+
DbConnectionBuilder,
|
|
3
|
+
type DbConnectionImpl,
|
|
4
|
+
} from '../sdk/db_connection_impl';
|
|
5
|
+
import * as React from 'react';
|
|
6
|
+
import { SpacetimeDBContext } from './useSpacetimeDB';
|
|
7
|
+
import type { ConnectionState } from './connection_state';
|
|
8
|
+
import { ConnectionId } from '../lib/connection_id';
|
|
9
|
+
import {
|
|
10
|
+
ConnectionManager,
|
|
11
|
+
type ConnectionState as ManagerConnectionState,
|
|
12
|
+
} from '../sdk/connection_manager';
|
|
13
|
+
|
|
14
|
+
export interface SpacetimeDBProviderProps<
|
|
15
|
+
DbConnection extends DbConnectionImpl<any>,
|
|
16
|
+
> {
|
|
17
|
+
connectionBuilder: DbConnectionBuilder<DbConnection>;
|
|
18
|
+
children?: React.ReactNode;
|
|
19
|
+
}
|
|
20
|
+
|
|
21
|
+
export function SpacetimeDBProvider<
|
|
22
|
+
DbConnection extends DbConnectionImpl<any>,
|
|
23
|
+
>({
|
|
24
|
+
connectionBuilder,
|
|
25
|
+
children,
|
|
26
|
+
}: SpacetimeDBProviderProps<DbConnection>): React.JSX.Element {
|
|
27
|
+
const uri = connectionBuilder.getUri();
|
|
28
|
+
const moduleName = connectionBuilder.getModuleName();
|
|
29
|
+
const key = React.useMemo(
|
|
30
|
+
() => ConnectionManager.getKey(uri, moduleName),
|
|
31
|
+
[uri, moduleName]
|
|
32
|
+
);
|
|
33
|
+
|
|
34
|
+
const fallbackStateRef = React.useRef<ManagerConnectionState>({
|
|
35
|
+
isActive: false,
|
|
36
|
+
identity: undefined,
|
|
37
|
+
token: undefined,
|
|
38
|
+
connectionId: ConnectionId.random(),
|
|
39
|
+
connectionError: undefined,
|
|
40
|
+
});
|
|
41
|
+
|
|
42
|
+
const subscribe = React.useCallback(
|
|
43
|
+
(onStoreChange: () => void) =>
|
|
44
|
+
ConnectionManager.subscribe(key, onStoreChange),
|
|
45
|
+
[key]
|
|
46
|
+
);
|
|
47
|
+
const getSnapshot = React.useCallback(
|
|
48
|
+
() => ConnectionManager.getSnapshot(key) ?? fallbackStateRef.current,
|
|
49
|
+
[key]
|
|
50
|
+
);
|
|
51
|
+
const getServerSnapshot = React.useCallback(
|
|
52
|
+
() => fallbackStateRef.current,
|
|
53
|
+
[]
|
|
54
|
+
);
|
|
55
|
+
|
|
56
|
+
const state = React.useSyncExternalStore(
|
|
57
|
+
subscribe,
|
|
58
|
+
getSnapshot,
|
|
59
|
+
getServerSnapshot
|
|
60
|
+
);
|
|
61
|
+
|
|
62
|
+
const getConnection = React.useCallback(
|
|
63
|
+
() => ConnectionManager.getConnection<DbConnection>(key),
|
|
64
|
+
[key]
|
|
65
|
+
);
|
|
66
|
+
|
|
67
|
+
const contextValue = React.useMemo<ConnectionState>(
|
|
68
|
+
() => ({ ...state, getConnection }),
|
|
69
|
+
[state, getConnection]
|
|
70
|
+
);
|
|
71
|
+
|
|
72
|
+
React.useEffect(() => {
|
|
73
|
+
ConnectionManager.retain(key, connectionBuilder);
|
|
74
|
+
return () => {
|
|
75
|
+
ConnectionManager.release(key);
|
|
76
|
+
};
|
|
77
|
+
}, [key, connectionBuilder]);
|
|
78
|
+
|
|
79
|
+
return React.createElement(
|
|
80
|
+
SpacetimeDBContext.Provider,
|
|
81
|
+
{ value: contextValue },
|
|
82
|
+
children
|
|
83
|
+
);
|
|
84
|
+
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
|
-
import type { DbConnectionImpl } from '../sdk/db_connection_impl';
|
|
2
|
-
import type { ConnectionState as ManagerConnectionState } from '../sdk/connection_manager';
|
|
3
|
-
|
|
4
|
-
export type ConnectionState = ManagerConnectionState & {
|
|
5
|
-
getConnection(): DbConnectionImpl<any> | null;
|
|
6
|
-
};
|
|
1
|
+
import type { DbConnectionImpl } from '../sdk/db_connection_impl';
|
|
2
|
+
import type { ConnectionState as ManagerConnectionState } from '../sdk/connection_manager';
|
|
3
|
+
|
|
4
|
+
export type ConnectionState = ManagerConnectionState & {
|
|
5
|
+
getConnection(): DbConnectionImpl<any> | null;
|
|
6
|
+
};
|
package/src/react/index.ts
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
export * from './SpacetimeDBProvider.ts';
|
|
2
|
-
export { useSpacetimeDB } from './useSpacetimeDB.ts';
|
|
3
|
-
export { useTable } from './useTable.ts';
|
|
4
|
-
export { useReducer } from './useReducer.ts';
|
|
5
|
-
export { useProcedure } from './useProcedure.ts';
|
|
1
|
+
export * from './SpacetimeDBProvider.ts';
|
|
2
|
+
export { useSpacetimeDB } from './useSpacetimeDB.ts';
|
|
3
|
+
export { useTable } from './useTable.ts';
|
|
4
|
+
export { useReducer } from './useReducer.ts';
|
|
5
|
+
export { useProcedure } from './useProcedure.ts';
|
|
@@ -1,60 +1,60 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
-
import type { UntypedProcedureDef } from '../sdk/procedures';
|
|
3
|
-
import { useSpacetimeDB } from './useSpacetimeDB';
|
|
4
|
-
import type {
|
|
5
|
-
ProcedureParamsType,
|
|
6
|
-
ProcedureReturnType,
|
|
7
|
-
} from '../sdk/type_utils';
|
|
8
|
-
|
|
9
|
-
export function useProcedure<ProcedureDef extends UntypedProcedureDef>(
|
|
10
|
-
procedureDef: ProcedureDef
|
|
11
|
-
): (
|
|
12
|
-
...params: ProcedureParamsType<ProcedureDef>
|
|
13
|
-
) => Promise<ProcedureReturnType<ProcedureDef>> {
|
|
14
|
-
const { getConnection, isActive } = useSpacetimeDB();
|
|
15
|
-
const procedureName = procedureDef.accessorName;
|
|
16
|
-
|
|
17
|
-
// Holds calls made before the connection exists
|
|
18
|
-
const queueRef = useRef<
|
|
19
|
-
{
|
|
20
|
-
params: ProcedureParamsType<ProcedureDef>;
|
|
21
|
-
resolve: (val: any) => void;
|
|
22
|
-
reject: (err: unknown) => void;
|
|
23
|
-
}[]
|
|
24
|
-
>([]);
|
|
25
|
-
|
|
26
|
-
// Flush when we finally have a connection
|
|
27
|
-
useEffect(() => {
|
|
28
|
-
const conn = getConnection();
|
|
29
|
-
if (!conn) {
|
|
30
|
-
return;
|
|
31
|
-
}
|
|
32
|
-
const fn = (conn.procedures as any)[procedureName] as (
|
|
33
|
-
...p: ProcedureParamsType<ProcedureDef>
|
|
34
|
-
) => Promise<ProcedureReturnType<ProcedureDef>>;
|
|
35
|
-
if (queueRef.current.length) {
|
|
36
|
-
const pending = queueRef.current.splice(0);
|
|
37
|
-
for (const item of pending) {
|
|
38
|
-
fn(...item.params).then(item.resolve, item.reject);
|
|
39
|
-
}
|
|
40
|
-
}
|
|
41
|
-
}, [getConnection, procedureName, isActive]);
|
|
42
|
-
|
|
43
|
-
return useCallback(
|
|
44
|
-
(...params: ProcedureParamsType<ProcedureDef>) => {
|
|
45
|
-
const conn = getConnection();
|
|
46
|
-
if (!conn) {
|
|
47
|
-
return new Promise<ProcedureReturnType<ProcedureDef>>(
|
|
48
|
-
(resolve, reject) => {
|
|
49
|
-
queueRef.current.push({ params, resolve, reject });
|
|
50
|
-
}
|
|
51
|
-
);
|
|
52
|
-
}
|
|
53
|
-
const fn = (conn.procedures as any)[procedureName] as (
|
|
54
|
-
...p: ProcedureParamsType<ProcedureDef>
|
|
55
|
-
) => Promise<ProcedureReturnType<ProcedureDef>>;
|
|
56
|
-
return fn(...params);
|
|
57
|
-
},
|
|
58
|
-
[getConnection, procedureName]
|
|
59
|
-
);
|
|
60
|
-
}
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import type { UntypedProcedureDef } from '../sdk/procedures';
|
|
3
|
+
import { useSpacetimeDB } from './useSpacetimeDB';
|
|
4
|
+
import type {
|
|
5
|
+
ProcedureParamsType,
|
|
6
|
+
ProcedureReturnType,
|
|
7
|
+
} from '../sdk/type_utils';
|
|
8
|
+
|
|
9
|
+
export function useProcedure<ProcedureDef extends UntypedProcedureDef>(
|
|
10
|
+
procedureDef: ProcedureDef
|
|
11
|
+
): (
|
|
12
|
+
...params: ProcedureParamsType<ProcedureDef>
|
|
13
|
+
) => Promise<ProcedureReturnType<ProcedureDef>> {
|
|
14
|
+
const { getConnection, isActive } = useSpacetimeDB();
|
|
15
|
+
const procedureName = procedureDef.accessorName;
|
|
16
|
+
|
|
17
|
+
// Holds calls made before the connection exists
|
|
18
|
+
const queueRef = useRef<
|
|
19
|
+
{
|
|
20
|
+
params: ProcedureParamsType<ProcedureDef>;
|
|
21
|
+
resolve: (val: any) => void;
|
|
22
|
+
reject: (err: unknown) => void;
|
|
23
|
+
}[]
|
|
24
|
+
>([]);
|
|
25
|
+
|
|
26
|
+
// Flush when we finally have a connection
|
|
27
|
+
useEffect(() => {
|
|
28
|
+
const conn = getConnection();
|
|
29
|
+
if (!conn) {
|
|
30
|
+
return;
|
|
31
|
+
}
|
|
32
|
+
const fn = (conn.procedures as any)[procedureName] as (
|
|
33
|
+
...p: ProcedureParamsType<ProcedureDef>
|
|
34
|
+
) => Promise<ProcedureReturnType<ProcedureDef>>;
|
|
35
|
+
if (queueRef.current.length) {
|
|
36
|
+
const pending = queueRef.current.splice(0);
|
|
37
|
+
for (const item of pending) {
|
|
38
|
+
fn(...item.params).then(item.resolve, item.reject);
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
}, [getConnection, procedureName, isActive]);
|
|
42
|
+
|
|
43
|
+
return useCallback(
|
|
44
|
+
(...params: ProcedureParamsType<ProcedureDef>) => {
|
|
45
|
+
const conn = getConnection();
|
|
46
|
+
if (!conn) {
|
|
47
|
+
return new Promise<ProcedureReturnType<ProcedureDef>>(
|
|
48
|
+
(resolve, reject) => {
|
|
49
|
+
queueRef.current.push({ params, resolve, reject });
|
|
50
|
+
}
|
|
51
|
+
);
|
|
52
|
+
}
|
|
53
|
+
const fn = (conn.procedures as any)[procedureName] as (
|
|
54
|
+
...p: ProcedureParamsType<ProcedureDef>
|
|
55
|
+
) => Promise<ProcedureReturnType<ProcedureDef>>;
|
|
56
|
+
return fn(...params);
|
|
57
|
+
},
|
|
58
|
+
[getConnection, procedureName]
|
|
59
|
+
);
|
|
60
|
+
}
|
package/src/react/useReducer.ts
CHANGED
|
@@ -1,53 +1,53 @@
|
|
|
1
|
-
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
-
import type { UntypedReducerDef } from '../sdk/reducers';
|
|
3
|
-
import { useSpacetimeDB } from './useSpacetimeDB';
|
|
4
|
-
import type { ParamsType } from '../sdk';
|
|
5
|
-
|
|
6
|
-
export function useReducer<ReducerDef extends UntypedReducerDef>(
|
|
7
|
-
reducerDef: ReducerDef
|
|
8
|
-
): (...params: ParamsType<ReducerDef>) => Promise<void> {
|
|
9
|
-
const { getConnection, isActive } = useSpacetimeDB();
|
|
10
|
-
const reducerName = reducerDef.accessorName;
|
|
11
|
-
|
|
12
|
-
// Holds calls made before the connection exists
|
|
13
|
-
const queueRef = useRef<
|
|
14
|
-
{
|
|
15
|
-
params: ParamsType<ReducerDef>;
|
|
16
|
-
resolve: () => void;
|
|
17
|
-
reject: (err: unknown) => void;
|
|
18
|
-
}[]
|
|
19
|
-
>([]);
|
|
20
|
-
|
|
21
|
-
// Flush when we finally have a connection
|
|
22
|
-
useEffect(() => {
|
|
23
|
-
const conn = getConnection();
|
|
24
|
-
if (!conn) {
|
|
25
|
-
return;
|
|
26
|
-
}
|
|
27
|
-
const fn = (conn.reducers as any)[reducerName] as (
|
|
28
|
-
...p: ParamsType<ReducerDef>
|
|
29
|
-
) => Promise<void>;
|
|
30
|
-
if (queueRef.current.length) {
|
|
31
|
-
const pending = queueRef.current.splice(0);
|
|
32
|
-
for (const item of pending) {
|
|
33
|
-
fn(...item.params).then(item.resolve, item.reject);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}, [getConnection, reducerName, isActive]);
|
|
37
|
-
|
|
38
|
-
return useCallback(
|
|
39
|
-
(...params: ParamsType<ReducerDef>) => {
|
|
40
|
-
const conn = getConnection();
|
|
41
|
-
if (!conn) {
|
|
42
|
-
return new Promise<void>((resolve, reject) => {
|
|
43
|
-
queueRef.current.push({ params, resolve, reject });
|
|
44
|
-
});
|
|
45
|
-
}
|
|
46
|
-
const fn = (conn.reducers as any)[reducerName] as (
|
|
47
|
-
...p: ParamsType<ReducerDef>
|
|
48
|
-
) => Promise<void>;
|
|
49
|
-
return fn(...params);
|
|
50
|
-
},
|
|
51
|
-
[getConnection, reducerName]
|
|
52
|
-
);
|
|
53
|
-
}
|
|
1
|
+
import { useCallback, useEffect, useRef } from 'react';
|
|
2
|
+
import type { UntypedReducerDef } from '../sdk/reducers';
|
|
3
|
+
import { useSpacetimeDB } from './useSpacetimeDB';
|
|
4
|
+
import type { ParamsType } from '../sdk';
|
|
5
|
+
|
|
6
|
+
export function useReducer<ReducerDef extends UntypedReducerDef>(
|
|
7
|
+
reducerDef: ReducerDef
|
|
8
|
+
): (...params: ParamsType<ReducerDef>) => Promise<void> {
|
|
9
|
+
const { getConnection, isActive } = useSpacetimeDB();
|
|
10
|
+
const reducerName = reducerDef.accessorName;
|
|
11
|
+
|
|
12
|
+
// Holds calls made before the connection exists
|
|
13
|
+
const queueRef = useRef<
|
|
14
|
+
{
|
|
15
|
+
params: ParamsType<ReducerDef>;
|
|
16
|
+
resolve: () => void;
|
|
17
|
+
reject: (err: unknown) => void;
|
|
18
|
+
}[]
|
|
19
|
+
>([]);
|
|
20
|
+
|
|
21
|
+
// Flush when we finally have a connection
|
|
22
|
+
useEffect(() => {
|
|
23
|
+
const conn = getConnection();
|
|
24
|
+
if (!conn) {
|
|
25
|
+
return;
|
|
26
|
+
}
|
|
27
|
+
const fn = (conn.reducers as any)[reducerName] as (
|
|
28
|
+
...p: ParamsType<ReducerDef>
|
|
29
|
+
) => Promise<void>;
|
|
30
|
+
if (queueRef.current.length) {
|
|
31
|
+
const pending = queueRef.current.splice(0);
|
|
32
|
+
for (const item of pending) {
|
|
33
|
+
fn(...item.params).then(item.resolve, item.reject);
|
|
34
|
+
}
|
|
35
|
+
}
|
|
36
|
+
}, [getConnection, reducerName, isActive]);
|
|
37
|
+
|
|
38
|
+
return useCallback(
|
|
39
|
+
(...params: ParamsType<ReducerDef>) => {
|
|
40
|
+
const conn = getConnection();
|
|
41
|
+
if (!conn) {
|
|
42
|
+
return new Promise<void>((resolve, reject) => {
|
|
43
|
+
queueRef.current.push({ params, resolve, reject });
|
|
44
|
+
});
|
|
45
|
+
}
|
|
46
|
+
const fn = (conn.reducers as any)[reducerName] as (
|
|
47
|
+
...p: ParamsType<ReducerDef>
|
|
48
|
+
) => Promise<void>;
|
|
49
|
+
return fn(...params);
|
|
50
|
+
},
|
|
51
|
+
[getConnection, reducerName]
|
|
52
|
+
);
|
|
53
|
+
}
|
|
@@ -1,18 +1,18 @@
|
|
|
1
|
-
import { createContext, useContext } from 'react';
|
|
2
|
-
import type { ConnectionState } from './connection_state';
|
|
3
|
-
|
|
4
|
-
export const SpacetimeDBContext = createContext<ConnectionState | undefined>(
|
|
5
|
-
undefined
|
|
6
|
-
);
|
|
7
|
-
|
|
8
|
-
// Throws an error if used outside of a SpacetimeDBProvider
|
|
9
|
-
// Error is caught by other hooks like useTable so they can provide better error messages
|
|
10
|
-
export function useSpacetimeDB(): ConnectionState {
|
|
11
|
-
const context = useContext(SpacetimeDBContext) as ConnectionState | undefined;
|
|
12
|
-
if (!context) {
|
|
13
|
-
throw new Error(
|
|
14
|
-
'useSpacetimeDB must be used within a SpacetimeDBProvider component. Did you forget to add a `SpacetimeDBProvider` to your component tree?'
|
|
15
|
-
);
|
|
16
|
-
}
|
|
17
|
-
return context;
|
|
18
|
-
}
|
|
1
|
+
import { createContext, useContext } from 'react';
|
|
2
|
+
import type { ConnectionState } from './connection_state';
|
|
3
|
+
|
|
4
|
+
export const SpacetimeDBContext = createContext<ConnectionState | undefined>(
|
|
5
|
+
undefined
|
|
6
|
+
);
|
|
7
|
+
|
|
8
|
+
// Throws an error if used outside of a SpacetimeDBProvider
|
|
9
|
+
// Error is caught by other hooks like useTable so they can provide better error messages
|
|
10
|
+
export function useSpacetimeDB(): ConnectionState {
|
|
11
|
+
const context = useContext(SpacetimeDBContext) as ConnectionState | undefined;
|
|
12
|
+
if (!context) {
|
|
13
|
+
throw new Error(
|
|
14
|
+
'useSpacetimeDB must be used within a SpacetimeDBProvider component. Did you forget to add a `SpacetimeDBProvider` to your component tree?'
|
|
15
|
+
);
|
|
16
|
+
}
|
|
17
|
+
return context;
|
|
18
|
+
}
|