@instantdb/react 0.22.90-experimental.drewh-ssr.20320632959.1 → 0.22.90-experimental.drewh-ssr.20347747146.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.
- package/dist/commonjs/index.d.ts +2 -2
- package/dist/commonjs/index.d.ts.map +1 -1
- package/dist/commonjs/index.js +1 -2
- package/dist/commonjs/index.js.map +1 -1
- package/dist/commonjs/next-ssr/InstantNextDatabase.d.ts +12 -0
- package/dist/commonjs/next-ssr/InstantNextDatabase.d.ts.map +1 -0
- package/dist/commonjs/next-ssr/InstantNextDatabase.js +43 -0
- package/dist/commonjs/next-ssr/InstantNextDatabase.js.map +1 -0
- package/dist/commonjs/next-ssr/InstantSuspenseProvider.d.ts +28 -0
- package/dist/commonjs/next-ssr/InstantSuspenseProvider.d.ts.map +1 -0
- package/dist/commonjs/next-ssr/InstantSuspenseProvider.js +98 -0
- package/dist/commonjs/next-ssr/InstantSuspenseProvider.js.map +1 -0
- package/dist/commonjs/next-ssr/getUserOnServer.d.ts +2 -0
- package/dist/commonjs/next-ssr/getUserOnServer.d.ts.map +1 -0
- package/dist/commonjs/next-ssr/getUserOnServer.js +21 -0
- package/dist/commonjs/next-ssr/getUserOnServer.js.map +1 -0
- package/dist/commonjs/next-ssr/index.d.ts +6 -28
- package/dist/commonjs/next-ssr/index.d.ts.map +1 -1
- package/dist/commonjs/next-ssr/index.js +11 -129
- package/dist/commonjs/next-ssr/index.js.map +1 -1
- package/dist/esm/index.d.ts +2 -2
- package/dist/esm/index.d.ts.map +1 -1
- package/dist/esm/index.js +2 -2
- package/dist/esm/index.js.map +1 -1
- package/dist/esm/next-ssr/InstantNextDatabase.d.ts +12 -0
- package/dist/esm/next-ssr/InstantNextDatabase.d.ts.map +1 -0
- package/dist/esm/next-ssr/InstantNextDatabase.js +36 -0
- package/dist/esm/next-ssr/InstantNextDatabase.js.map +1 -0
- package/dist/esm/next-ssr/InstantSuspenseProvider.d.ts +28 -0
- package/dist/esm/next-ssr/InstantSuspenseProvider.d.ts.map +1 -0
- package/dist/esm/next-ssr/InstantSuspenseProvider.js +93 -0
- package/dist/esm/next-ssr/InstantSuspenseProvider.js.map +1 -0
- package/dist/esm/next-ssr/getUserOnServer.d.ts +2 -0
- package/dist/esm/next-ssr/getUserOnServer.d.ts.map +1 -0
- package/dist/esm/next-ssr/getUserOnServer.js +17 -0
- package/dist/esm/next-ssr/getUserOnServer.js.map +1 -0
- package/dist/esm/next-ssr/index.d.ts +6 -28
- package/dist/esm/next-ssr/index.d.ts.map +1 -1
- package/dist/esm/next-ssr/index.js +5 -124
- package/dist/esm/next-ssr/index.js.map +1 -1
- package/dist/standalone/index.js +1322 -1383
- package/dist/standalone/index.umd.cjs +13 -13
- package/package.json +4 -4
- package/src/index.ts +0 -2
- package/src/next-ssr/InstantNextDatabase.tsx +57 -0
- package/src/next-ssr/InstantSuspenseProvider.tsx +187 -0
- package/src/next-ssr/getUserOnServer.ts +8 -0
- package/src/next-ssr/index.tsx +6 -227
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@instantdb/react",
|
|
3
|
-
"version": "0.22.90-experimental.drewh-ssr.
|
|
3
|
+
"version": "0.22.90-experimental.drewh-ssr.20347747146.1",
|
|
4
4
|
"description": "Instant DB for React",
|
|
5
5
|
"homepage": "https://github.com/instantdb/instant/tree/main/client/packages/react",
|
|
6
6
|
"repository": {
|
|
@@ -66,9 +66,9 @@
|
|
|
66
66
|
},
|
|
67
67
|
"dependencies": {
|
|
68
68
|
"eventsource": "^4.0.0",
|
|
69
|
-
"@instantdb/core": "0.22.90-experimental.drewh-ssr.
|
|
70
|
-
"@instantdb/react-common": "0.22.90-experimental.drewh-ssr.
|
|
71
|
-
"@instantdb/version": "0.22.90-experimental.drewh-ssr.
|
|
69
|
+
"@instantdb/core": "0.22.90-experimental.drewh-ssr.20347747146.1",
|
|
70
|
+
"@instantdb/react-common": "0.22.90-experimental.drewh-ssr.20347747146.1",
|
|
71
|
+
"@instantdb/version": "0.22.90-experimental.drewh-ssr.20347747146.1"
|
|
72
72
|
},
|
|
73
73
|
"scripts": {
|
|
74
74
|
"test": "vitest",
|
package/src/index.ts
CHANGED
|
@@ -83,7 +83,6 @@ import {
|
|
|
83
83
|
type SyncTableSyncTransaction,
|
|
84
84
|
type SyncTableLoadFromStorage,
|
|
85
85
|
type SyncTableSetupError,
|
|
86
|
-
createInstantRouteHandler,
|
|
87
86
|
} from '@instantdb/core';
|
|
88
87
|
|
|
89
88
|
import { InstantReactAbstractDatabase } from '@instantdb/react-common';
|
|
@@ -97,7 +96,6 @@ export {
|
|
|
97
96
|
lookup,
|
|
98
97
|
init,
|
|
99
98
|
init_experimental,
|
|
100
|
-
createInstantRouteHandler,
|
|
101
99
|
InstantReactWebDatabase,
|
|
102
100
|
Cursors,
|
|
103
101
|
i,
|
|
@@ -0,0 +1,57 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import {
|
|
3
|
+
AuthState,
|
|
4
|
+
InstantSchemaDef,
|
|
5
|
+
InstaQLResponse,
|
|
6
|
+
PageInfoResponse,
|
|
7
|
+
RuleParams,
|
|
8
|
+
ValidQuery,
|
|
9
|
+
} from '@instantdb/core';
|
|
10
|
+
import InstantReactWebDatabase from '../InstantReactWebDatabase.ts';
|
|
11
|
+
import { useContext } from 'react';
|
|
12
|
+
import { SuspsenseQueryContext } from './InstantSuspenseProvider.tsx';
|
|
13
|
+
|
|
14
|
+
export class InstantNextDatabase<
|
|
15
|
+
Schema extends InstantSchemaDef<any, any, any>,
|
|
16
|
+
UseDates extends boolean,
|
|
17
|
+
> extends InstantReactWebDatabase<Schema, UseDates> {
|
|
18
|
+
public useSuspenseQuery = <Q extends ValidQuery<Q, Schema>>(
|
|
19
|
+
q: Q,
|
|
20
|
+
opts?: {
|
|
21
|
+
ruleParams: RuleParams;
|
|
22
|
+
},
|
|
23
|
+
): {
|
|
24
|
+
data: InstaQLResponse<Schema, Q, NonNullable<UseDates>>;
|
|
25
|
+
pageInfo?: PageInfoResponse<Q>;
|
|
26
|
+
} => {
|
|
27
|
+
const ctx = useContext(SuspsenseQueryContext);
|
|
28
|
+
if (!ctx) {
|
|
29
|
+
throw new Error(
|
|
30
|
+
'useSuspenseQuery must be used within a SuspenseQueryProvider',
|
|
31
|
+
);
|
|
32
|
+
}
|
|
33
|
+
return ctx.useSuspenseQuery(q, opts) as any;
|
|
34
|
+
};
|
|
35
|
+
|
|
36
|
+
useAuth = (): AuthState => {
|
|
37
|
+
const ctx = useContext(SuspsenseQueryContext);
|
|
38
|
+
const realAuthResult = this._useAuth();
|
|
39
|
+
if (!ctx) {
|
|
40
|
+
return realAuthResult;
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
const { ssrUser } = ctx;
|
|
44
|
+
if (ssrUser === undefined) {
|
|
45
|
+
return realAuthResult;
|
|
46
|
+
}
|
|
47
|
+
if (realAuthResult.isLoading) {
|
|
48
|
+
return {
|
|
49
|
+
error: undefined,
|
|
50
|
+
isLoading: false,
|
|
51
|
+
user: ssrUser ?? undefined, // null -> undefined for the response
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
|
|
55
|
+
return realAuthResult;
|
|
56
|
+
};
|
|
57
|
+
}
|
|
@@ -0,0 +1,187 @@
|
|
|
1
|
+
'use client';
|
|
2
|
+
import {
|
|
3
|
+
FrameworkClient,
|
|
4
|
+
InstantConfig,
|
|
5
|
+
InstantSchemaDef,
|
|
6
|
+
InstaQLResponse,
|
|
7
|
+
PageInfoResponse,
|
|
8
|
+
RuleParams,
|
|
9
|
+
User,
|
|
10
|
+
ValidQuery,
|
|
11
|
+
} from '@instantdb/core';
|
|
12
|
+
import InstantReactWebDatabase from '../InstantReactWebDatabase.ts';
|
|
13
|
+
import {
|
|
14
|
+
createHydrationStreamProvider,
|
|
15
|
+
isServer,
|
|
16
|
+
} from './HydrationStreamProvider.tsx';
|
|
17
|
+
import { createContext, useContext, useRef, useState } from 'react';
|
|
18
|
+
import { InstantReactAbstractDatabase } from '@instantdb/react-common';
|
|
19
|
+
|
|
20
|
+
type InstantSuspenseProviderProps<
|
|
21
|
+
Schema extends InstantSchemaDef<any, any, any>,
|
|
22
|
+
> = {
|
|
23
|
+
nonce?: string;
|
|
24
|
+
children: React.ReactNode;
|
|
25
|
+
db?: InstantReactWebDatabase<Schema, any>;
|
|
26
|
+
config?: Omit<InstantConfig<any, any>, 'schema'> & {
|
|
27
|
+
schema: string;
|
|
28
|
+
};
|
|
29
|
+
user?: User | null;
|
|
30
|
+
};
|
|
31
|
+
|
|
32
|
+
const stream = createHydrationStreamProvider<any>();
|
|
33
|
+
|
|
34
|
+
type SuspenseQueryContextValue = {
|
|
35
|
+
useSuspenseQuery: (query: any, opts?: SuspenseQueryOpts) => any;
|
|
36
|
+
ssrUser: User | null | undefined;
|
|
37
|
+
};
|
|
38
|
+
|
|
39
|
+
export const SuspsenseQueryContext =
|
|
40
|
+
createContext<SuspenseQueryContextValue | null>(null);
|
|
41
|
+
|
|
42
|
+
// Creates a typed useSuspense hook
|
|
43
|
+
export const createUseSuspenseQuery = <
|
|
44
|
+
Schema extends InstantSchemaDef<any, any, any>,
|
|
45
|
+
UseDates extends boolean,
|
|
46
|
+
>(
|
|
47
|
+
_db: InstantReactWebDatabase<Schema, UseDates>,
|
|
48
|
+
): (<Q extends ValidQuery<Q, Schema>>(
|
|
49
|
+
q: Q,
|
|
50
|
+
opts?: {
|
|
51
|
+
ruleParams: RuleParams;
|
|
52
|
+
},
|
|
53
|
+
) => {
|
|
54
|
+
data: InstaQLResponse<Schema, Q, NonNullable<UseDates>>;
|
|
55
|
+
pageInfo?: PageInfoResponse<Q>;
|
|
56
|
+
}) => {
|
|
57
|
+
return <Q extends ValidQuery<Q, Schema>>(q: any, opts: any) => {
|
|
58
|
+
const ctx = useContext(SuspsenseQueryContext);
|
|
59
|
+
if (!ctx) {
|
|
60
|
+
throw new Error(
|
|
61
|
+
'useSuspenseQuery must be used within a SuspenseQueryProvider',
|
|
62
|
+
);
|
|
63
|
+
}
|
|
64
|
+
return ctx.useSuspenseQuery(q, opts) as any;
|
|
65
|
+
};
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
type SuspenseQueryOpts = {
|
|
69
|
+
ruleParams: RuleParams;
|
|
70
|
+
};
|
|
71
|
+
|
|
72
|
+
export const InstantSuspenseProvider = (
|
|
73
|
+
props: InstantSuspenseProviderProps<any>,
|
|
74
|
+
) => {
|
|
75
|
+
const clientRef = useRef<FrameworkClient | null>(null);
|
|
76
|
+
|
|
77
|
+
if (!props.db) {
|
|
78
|
+
throw new Error(
|
|
79
|
+
'Must provide either a db or config to InstantSuspenseProvider',
|
|
80
|
+
);
|
|
81
|
+
}
|
|
82
|
+
|
|
83
|
+
const db = useRef<InstantReactAbstractDatabase<any, any>>(props.db);
|
|
84
|
+
|
|
85
|
+
const [trackedKeys] = useState(() => new Set<string>());
|
|
86
|
+
|
|
87
|
+
if (!clientRef.current) {
|
|
88
|
+
if (props.user && !props.user.refresh_token) {
|
|
89
|
+
throw new Error(
|
|
90
|
+
'User must have a refresh_token field. Recieved: ' +
|
|
91
|
+
JSON.stringify(props.user, null, 2),
|
|
92
|
+
);
|
|
93
|
+
}
|
|
94
|
+
clientRef.current = new FrameworkClient({
|
|
95
|
+
token: props.user?.refresh_token,
|
|
96
|
+
db: db.current.core,
|
|
97
|
+
});
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
if (isServer) {
|
|
101
|
+
clientRef.current.subscribe((result) => {
|
|
102
|
+
const { queryHash } = result;
|
|
103
|
+
trackedKeys.add(queryHash);
|
|
104
|
+
});
|
|
105
|
+
}
|
|
106
|
+
|
|
107
|
+
const useSuspenseQuery = (query: any, opts: SuspenseQueryOpts) => {
|
|
108
|
+
const nonSuspenseResult = db.current.useQuery(query, {
|
|
109
|
+
...opts,
|
|
110
|
+
});
|
|
111
|
+
|
|
112
|
+
if (nonSuspenseResult.data) {
|
|
113
|
+
return {
|
|
114
|
+
data: nonSuspenseResult.data,
|
|
115
|
+
pageInfo: nonSuspenseResult.pageInfo,
|
|
116
|
+
};
|
|
117
|
+
}
|
|
118
|
+
|
|
119
|
+
// should never happen (typeguard)
|
|
120
|
+
if (!clientRef.current) {
|
|
121
|
+
throw new Error('Client ref not set up');
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
let entry = clientRef.current.getExistingResultForQuery(query, {
|
|
125
|
+
ruleParams: opts?.ruleParams,
|
|
126
|
+
});
|
|
127
|
+
|
|
128
|
+
if (!entry) {
|
|
129
|
+
entry = clientRef.current!.query(query, opts);
|
|
130
|
+
}
|
|
131
|
+
|
|
132
|
+
if (entry.status === 'pending') {
|
|
133
|
+
throw entry.promise;
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
if (entry.status === 'error') {
|
|
137
|
+
throw entry.error;
|
|
138
|
+
}
|
|
139
|
+
|
|
140
|
+
if (entry.status === 'success' && entry.type === 'session') {
|
|
141
|
+
return entry.data;
|
|
142
|
+
}
|
|
143
|
+
|
|
144
|
+
if (entry.status === 'success') {
|
|
145
|
+
const data = entry.data;
|
|
146
|
+
const result = clientRef.current.completeIsomorphic(
|
|
147
|
+
query,
|
|
148
|
+
data.triples,
|
|
149
|
+
data.attrs,
|
|
150
|
+
data.pageInfo,
|
|
151
|
+
);
|
|
152
|
+
|
|
153
|
+
return result;
|
|
154
|
+
}
|
|
155
|
+
};
|
|
156
|
+
|
|
157
|
+
return (
|
|
158
|
+
<SuspsenseQueryContext.Provider
|
|
159
|
+
value={{ useSuspenseQuery, ssrUser: props.user }}
|
|
160
|
+
>
|
|
161
|
+
<stream.Provider
|
|
162
|
+
nonce={props.nonce}
|
|
163
|
+
onFlush={() => {
|
|
164
|
+
const toSend: { queryKey: string; value: any }[] = [];
|
|
165
|
+
for (const [key, value] of clientRef.current!.resultMap.entries()) {
|
|
166
|
+
if (trackedKeys.has(key) && value.status === 'success') {
|
|
167
|
+
toSend.push({
|
|
168
|
+
queryKey: key,
|
|
169
|
+
value: value.data,
|
|
170
|
+
});
|
|
171
|
+
}
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
trackedKeys.clear();
|
|
175
|
+
return toSend;
|
|
176
|
+
}}
|
|
177
|
+
onEntries={(entries) => {
|
|
178
|
+
entries.forEach((entry) => {
|
|
179
|
+
clientRef.current!.addQueryResult(entry.queryKey, entry.value);
|
|
180
|
+
});
|
|
181
|
+
}}
|
|
182
|
+
>
|
|
183
|
+
{props.children}
|
|
184
|
+
</stream.Provider>
|
|
185
|
+
</SuspsenseQueryContext.Provider>
|
|
186
|
+
);
|
|
187
|
+
};
|
package/src/next-ssr/index.tsx
CHANGED
|
@@ -1,195 +1,19 @@
|
|
|
1
|
-
'use client';
|
|
2
1
|
import {
|
|
3
|
-
AuthState,
|
|
4
|
-
FrameworkClient,
|
|
5
2
|
InstantConfig,
|
|
6
3
|
InstantSchemaDef,
|
|
7
4
|
InstantUnknownSchema,
|
|
8
|
-
InstaQLResponse,
|
|
9
|
-
PageInfoResponse,
|
|
10
|
-
RuleParams,
|
|
11
|
-
User,
|
|
12
|
-
ValidQuery,
|
|
13
5
|
} from '@instantdb/core';
|
|
14
|
-
import { createContext, useContext, useRef, useState } from 'react';
|
|
15
|
-
import {
|
|
16
|
-
createHydrationStreamProvider,
|
|
17
|
-
isServer,
|
|
18
|
-
} from './HydrationStreamProvider.tsx';
|
|
19
|
-
import version from '../version.ts';
|
|
20
|
-
|
|
21
|
-
import InstantReactWebDatabase from '../InstantReactWebDatabase.ts';
|
|
22
|
-
import { InstantReactAbstractDatabase } from '@instantdb/react-common';
|
|
23
|
-
|
|
24
|
-
type InstantSuspenseProviderProps<
|
|
25
|
-
Schema extends InstantSchemaDef<any, any, any>,
|
|
26
|
-
> = {
|
|
27
|
-
nonce?: string;
|
|
28
|
-
children: React.ReactNode;
|
|
29
|
-
db?: InstantReactWebDatabase<Schema, any>;
|
|
30
|
-
config?: Omit<InstantConfig<any, any>, 'schema'> & {
|
|
31
|
-
schema: string;
|
|
32
|
-
};
|
|
33
|
-
user?: User | null;
|
|
34
|
-
};
|
|
35
|
-
|
|
36
|
-
const stream = createHydrationStreamProvider<any>();
|
|
37
|
-
|
|
38
|
-
type SuspenseQueryContextValue = {
|
|
39
|
-
useSuspenseQuery: (query: any, opts?: SuspenseQueryOpts) => any;
|
|
40
|
-
ssrUser: User | null | undefined;
|
|
41
|
-
};
|
|
42
|
-
|
|
43
|
-
const SuspsenseQueryContext = createContext<SuspenseQueryContextValue | null>(
|
|
44
|
-
null,
|
|
45
|
-
);
|
|
46
|
-
|
|
47
|
-
// Creates a typed useSuspense hook
|
|
48
|
-
export const createUseSuspenseQuery = <
|
|
49
|
-
Schema extends InstantSchemaDef<any, any, any>,
|
|
50
|
-
UseDates extends boolean,
|
|
51
|
-
>(
|
|
52
|
-
_db: InstantReactWebDatabase<Schema, UseDates>,
|
|
53
|
-
): (<Q extends ValidQuery<Q, Schema>>(
|
|
54
|
-
q: Q,
|
|
55
|
-
opts?: {
|
|
56
|
-
ruleParams: RuleParams;
|
|
57
|
-
},
|
|
58
|
-
) => {
|
|
59
|
-
data: InstaQLResponse<Schema, Q, NonNullable<UseDates>>;
|
|
60
|
-
pageInfo?: PageInfoResponse<Q>;
|
|
61
|
-
}) => {
|
|
62
|
-
return <Q extends ValidQuery<Q, Schema>>(q: any, opts: any) => {
|
|
63
|
-
const ctx = useContext(SuspsenseQueryContext);
|
|
64
|
-
if (!ctx) {
|
|
65
|
-
throw new Error(
|
|
66
|
-
'useSuspenseQuery must be used within a SuspenseQueryProvider',
|
|
67
|
-
);
|
|
68
|
-
}
|
|
69
|
-
return ctx.useSuspenseQuery(q, opts) as any;
|
|
70
|
-
};
|
|
71
|
-
};
|
|
72
|
-
|
|
73
|
-
type SuspenseQueryOpts = {
|
|
74
|
-
ruleParams: RuleParams;
|
|
75
|
-
};
|
|
76
|
-
|
|
77
|
-
export const InstantSuspenseProvider = (
|
|
78
|
-
props: InstantSuspenseProviderProps<any>,
|
|
79
|
-
) => {
|
|
80
|
-
const clientRef = useRef<FrameworkClient | null>(null);
|
|
81
|
-
|
|
82
|
-
if (!props.db) {
|
|
83
|
-
throw new Error(
|
|
84
|
-
'Must provide either a db or config to InstantSuspenseProvider',
|
|
85
|
-
);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
const db = useRef<InstantReactAbstractDatabase<any, any>>(props.db);
|
|
89
|
-
|
|
90
|
-
const [trackedKeys] = useState(() => new Set<string>());
|
|
91
|
-
|
|
92
|
-
if (!clientRef.current) {
|
|
93
|
-
if (props.user && !props.user.refresh_token) {
|
|
94
|
-
throw new Error(
|
|
95
|
-
'User must have a refresh_token field. Recieved: ' +
|
|
96
|
-
JSON.stringify(props.user, null, 2),
|
|
97
|
-
);
|
|
98
|
-
}
|
|
99
|
-
clientRef.current = new FrameworkClient({
|
|
100
|
-
token: props.user?.refresh_token,
|
|
101
|
-
db: db.current.core,
|
|
102
|
-
});
|
|
103
|
-
}
|
|
104
6
|
|
|
105
|
-
|
|
106
|
-
clientRef.current.subscribe((result) => {
|
|
107
|
-
const { queryHash } = result;
|
|
108
|
-
trackedKeys.add(queryHash);
|
|
109
|
-
});
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
const useSuspenseQuery = (query: any, opts: SuspenseQueryOpts) => {
|
|
113
|
-
const nonSuspenseResult = db.current.useQuery(query, {
|
|
114
|
-
...opts,
|
|
115
|
-
});
|
|
116
|
-
|
|
117
|
-
if (nonSuspenseResult.data) {
|
|
118
|
-
return {
|
|
119
|
-
data: nonSuspenseResult.data,
|
|
120
|
-
pageInfo: nonSuspenseResult.pageInfo,
|
|
121
|
-
};
|
|
122
|
-
}
|
|
123
|
-
|
|
124
|
-
// should never happen (typeguard)
|
|
125
|
-
if (!clientRef.current) {
|
|
126
|
-
throw new Error('Client ref not set up');
|
|
127
|
-
}
|
|
128
|
-
|
|
129
|
-
let entry = clientRef.current.getExistingResultForQuery(query, {
|
|
130
|
-
ruleParams: opts?.ruleParams,
|
|
131
|
-
});
|
|
132
|
-
|
|
133
|
-
if (!entry) {
|
|
134
|
-
entry = clientRef.current!.query(query, opts);
|
|
135
|
-
}
|
|
136
|
-
|
|
137
|
-
if (entry.status === 'pending') {
|
|
138
|
-
throw entry.promise;
|
|
139
|
-
}
|
|
140
|
-
|
|
141
|
-
if (entry.status === 'error') {
|
|
142
|
-
throw entry.error;
|
|
143
|
-
}
|
|
144
|
-
|
|
145
|
-
if (entry.status === 'success' && entry.type === 'session') {
|
|
146
|
-
return entry.data;
|
|
147
|
-
}
|
|
7
|
+
import version from '../version.ts';
|
|
148
8
|
|
|
149
|
-
|
|
150
|
-
const data = entry.data;
|
|
151
|
-
const result = clientRef.current.completeIsomorphic(
|
|
152
|
-
query,
|
|
153
|
-
data.triples,
|
|
154
|
-
data.attrs,
|
|
155
|
-
data.pageInfo,
|
|
156
|
-
);
|
|
9
|
+
import { InstantNextDatabase } from './InstantNextDatabase.tsx';
|
|
157
10
|
|
|
158
|
-
|
|
159
|
-
}
|
|
160
|
-
};
|
|
11
|
+
export { getUserOnServer } from './getUserOnServer.ts';
|
|
161
12
|
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
value={{ useSuspenseQuery, ssrUser: props.user }}
|
|
165
|
-
>
|
|
166
|
-
<stream.Provider
|
|
167
|
-
nonce={props.nonce}
|
|
168
|
-
onFlush={() => {
|
|
169
|
-
const toSend: { queryKey: string; value: any }[] = [];
|
|
170
|
-
for (const [key, value] of clientRef.current!.resultMap.entries()) {
|
|
171
|
-
if (trackedKeys.has(key) && value.status === 'success') {
|
|
172
|
-
toSend.push({
|
|
173
|
-
queryKey: key,
|
|
174
|
-
value: value.data,
|
|
175
|
-
});
|
|
176
|
-
}
|
|
177
|
-
}
|
|
13
|
+
export { InstantNextDatabase } from './InstantNextDatabase.tsx';
|
|
14
|
+
export { InstantSuspenseProvider } from './InstantSuspenseProvider.tsx';
|
|
178
15
|
|
|
179
|
-
|
|
180
|
-
return toSend;
|
|
181
|
-
}}
|
|
182
|
-
onEntries={(entries) => {
|
|
183
|
-
entries.forEach((entry) => {
|
|
184
|
-
clientRef.current!.addQueryResult(entry.queryKey, entry.value);
|
|
185
|
-
});
|
|
186
|
-
}}
|
|
187
|
-
>
|
|
188
|
-
{props.children}
|
|
189
|
-
</stream.Provider>
|
|
190
|
-
</SuspsenseQueryContext.Provider>
|
|
191
|
-
);
|
|
192
|
-
};
|
|
16
|
+
export { createInstantRouteHandler } from '@instantdb/core';
|
|
193
17
|
|
|
194
18
|
/**
|
|
195
19
|
*
|
|
@@ -221,48 +45,3 @@ export function init<
|
|
|
221
45
|
'@instantdb/react': version,
|
|
222
46
|
});
|
|
223
47
|
}
|
|
224
|
-
|
|
225
|
-
export class InstantNextDatabase<
|
|
226
|
-
Schema extends InstantSchemaDef<any, any, any>,
|
|
227
|
-
UseDates extends boolean,
|
|
228
|
-
> extends InstantReactWebDatabase<Schema, UseDates> {
|
|
229
|
-
public useSuspenseQuery = <Q extends ValidQuery<Q, Schema>>(
|
|
230
|
-
q: Q,
|
|
231
|
-
opts?: {
|
|
232
|
-
ruleParams: RuleParams;
|
|
233
|
-
},
|
|
234
|
-
): {
|
|
235
|
-
data: InstaQLResponse<Schema, Q, NonNullable<UseDates>>;
|
|
236
|
-
pageInfo?: PageInfoResponse<Q>;
|
|
237
|
-
} => {
|
|
238
|
-
const ctx = useContext(SuspsenseQueryContext);
|
|
239
|
-
if (!ctx) {
|
|
240
|
-
throw new Error(
|
|
241
|
-
'useSuspenseQuery must be used within a SuspenseQueryProvider',
|
|
242
|
-
);
|
|
243
|
-
}
|
|
244
|
-
return ctx.useSuspenseQuery(q, opts) as any;
|
|
245
|
-
};
|
|
246
|
-
|
|
247
|
-
useAuth = (): AuthState => {
|
|
248
|
-
const ctx = useContext(SuspsenseQueryContext);
|
|
249
|
-
const realAuthResult = this._useAuth();
|
|
250
|
-
if (!ctx) {
|
|
251
|
-
return realAuthResult;
|
|
252
|
-
}
|
|
253
|
-
|
|
254
|
-
const { ssrUser } = ctx;
|
|
255
|
-
if (ssrUser === undefined) {
|
|
256
|
-
return realAuthResult;
|
|
257
|
-
}
|
|
258
|
-
if (realAuthResult.isLoading) {
|
|
259
|
-
return {
|
|
260
|
-
error: undefined,
|
|
261
|
-
isLoading: false,
|
|
262
|
-
user: ssrUser ?? undefined, // null -> undefined for the response
|
|
263
|
-
};
|
|
264
|
-
}
|
|
265
|
-
|
|
266
|
-
return realAuthResult;
|
|
267
|
-
};
|
|
268
|
-
}
|