@covenant-rpc/react 0.4.0 → 1.0.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/dist/index.d.ts CHANGED
@@ -1,14 +1,26 @@
1
- import type { ProcedureMap, ChannelMap } from "@covenant-rpc/core";
2
- import { CovenantClient, type MutationKey, type QueryKey } from "@covenant-rpc/client";
1
+ import { CovenantClient, type QueryKey, type MutationKey } from "@covenant-rpc/client";
2
+ import type { ChannelMap, Covenant, ProcedureMap } from "@covenant-rpc/core";
3
3
  import type { InferProcedureInputs, InferProcedureOutputs } from "@covenant-rpc/core/procedure";
4
+ import type { ClientToServerConnection, ClientToSidekickConnection } from "@covenant-rpc/core/interfaces";
5
+ /**
6
+ * Error type returned by React hooks
7
+ */
4
8
  export interface ReactProcedureError {
5
9
  code: number;
6
10
  message: string;
7
11
  }
12
+ /**
13
+ * Async state type returned by hooks
14
+ * Discriminated union representing loading, success, or error states
15
+ */
8
16
  export type AsyncHook<T> = {
9
17
  loading: true;
10
18
  data: null;
11
19
  error: null;
20
+ } | {
21
+ loading: true;
22
+ data: T;
23
+ error: null;
12
24
  } | {
13
25
  loading: false;
14
26
  data: T;
@@ -17,17 +29,79 @@ export type AsyncHook<T> = {
17
29
  loading: false;
18
30
  data: null;
19
31
  error: ReactProcedureError;
32
+ } | {
33
+ loading: false;
34
+ data: null;
35
+ error: null;
20
36
  };
37
+ /**
38
+ * Mutation state and execute function
39
+ */
40
+ export type MutationHook<TInput, TOutput> = [
41
+ (input: TInput) => Promise<void>,
42
+ AsyncHook<TOutput>
43
+ ];
44
+ /**
45
+ * Options for optimistic updates
46
+ */
47
+ export interface OptimisticUpdateOptions<TInput, TOutput> {
48
+ /**
49
+ * Generate optimistic data based on mutation input
50
+ */
51
+ optimisticData?: (input: TInput) => TOutput;
52
+ /**
53
+ * Called when mutation succeeds
54
+ */
55
+ onSuccess?: (data: TOutput) => void;
56
+ /**
57
+ * Called when mutation fails (optimistic update is rolled back)
58
+ */
59
+ onError?: (error: ReactProcedureError) => void;
60
+ }
61
+ /**
62
+ * React client extending CovenantClient with React hooks
63
+ */
21
64
  export declare class CovenantReactClient<P extends ProcedureMap, C extends ChannelMap> extends CovenantClient<P, C> {
22
65
  private cache;
23
- private listenes;
24
- useQuery<Q extends QueryKey<P>>(procedureName: Q, inputs: InferProcedureInputs<P[Q]>): AsyncHook<InferProcedureOutputs<P[Q]>>;
25
- useMutation<Q extends MutationKey<P>>(procedureName: Q, inputs: InferProcedureInputs<P[Q]>): AsyncHook<InferProcedureOutputs<P[Q]>>;
26
- useListenedQuery<Q extends QueryKey<P>>(procedureName: Q, inputs: InferProcedureInputs<P[Q]>): AsyncHook<InferProcedureOutputs<P[Q]>>;
66
+ constructor(covenant: Covenant<P, C>, connections: {
67
+ serverConnection: ClientToServerConnection;
68
+ sidekickConnection: ClientToSidekickConnection;
69
+ });
70
+ /**
71
+ * Hook for executing queries
72
+ * Automatically executes on mount and when inputs change
73
+ */
74
+ useQuery<Q extends QueryKey<P>>(procedure: Q, inputs: InferProcedureInputs<P[Q]>): AsyncHook<InferProcedureOutputs<P[Q]>>;
75
+ /**
76
+ * Hook for executing mutations
77
+ * Returns [mutate, state] pattern - mutation is called manually
78
+ */
79
+ useMutation<M extends MutationKey<P>>(procedure: M, options?: OptimisticUpdateOptions<InferProcedureInputs<P[M]>, InferProcedureOutputs<P[M]>>): MutationHook<InferProcedureInputs<P[M]>, InferProcedureOutputs<P[M]>>;
80
+ /**
81
+ * Hook for queries with automatic refetch on resource invalidation
82
+ * Uses client.listen() for resource tracking
83
+ */
84
+ useListenedQuery<Q extends QueryKey<P>>(procedure: Q, inputs: InferProcedureInputs<P[Q]>, remote?: boolean): AsyncHook<InferProcedureOutputs<P[Q]>>;
85
+ /**
86
+ * Hook for cached queries with shared state across component instances
87
+ * All components using the same procedure+inputs share the same cache entry
88
+ */
89
+ useCachedQuery<Q extends QueryKey<P>>(procedure: Q, inputs: InferProcedureInputs<P[Q]>, remote?: boolean): AsyncHook<InferProcedureOutputs<P[Q]>>;
90
+ /**
91
+ * Invalidate a specific cache entry
92
+ */
93
+ invalidateCache<Q extends QueryKey<P>>(procedure: Q, inputs: InferProcedureInputs<P[Q]>): void;
94
+ /**
95
+ * Clear all cache entries
96
+ */
97
+ clearCache(): void;
98
+ /**
99
+ * Generate a cache key from procedure name and inputs
100
+ */
101
+ private generateCacheKey;
102
+ /**
103
+ * Create a new cached query entry with listener
104
+ */
27
105
  private createCachedQuery;
28
- private getCacheKey;
29
- private addCacheListener;
30
- private removeCacheListener;
31
- useCachedQuery<Q extends QueryKey<P>>(procedureName: Q, inputs: InferProcedureInputs<P[Q]>): AsyncHook<InferProcedureOutputs<P[Q]>>;
32
106
  }
33
107
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AACnE,OAAO,EAAE,cAAc,EAAE,KAAK,WAAW,EAAE,KAAK,QAAQ,EAAE,MAAM,sBAAsB,CAAC;AACvF,OAAO,KAAK,EAAE,oBAAoB,EAAE,qBAAqB,EAAE,MAAM,8BAA8B,CAAC;AAIhG,MAAM,WAAW,mBAAmB;IAClC,IAAI,EAAE,MAAM,CAAC;IACb,OAAO,EAAE,MAAM,CAAC;CACjB;AAED,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACzB,OAAO,EAAE,IAAI,CAAC;IACd,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,IAAI,CAAC;CACb,GAAG;IACF,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,EAAE,CAAC,CAAC;IACR,KAAK,EAAE,IAAI,CAAC;CACb,GAAG;IACF,OAAO,EAAE,KAAK,CAAC;IACf,IAAI,EAAE,IAAI,CAAC;IACX,KAAK,EAAE,mBAAmB,CAAC;CAC5B,CAAA;AAKD,qBAAa,mBAAmB,CAAC,CAAC,SAAS,YAAY,EAAE,CAAC,SAAS,UAAU,CAAE,SAAQ,cAAc,CAAC,CAAC,EAAE,CAAC,CAAC;IAEzG,OAAO,CAAC,KAAK,CAA0C;IACvD,OAAO,CAAC,QAAQ,CAAsC;IAEtD,QAAQ,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAqC7H,WAAW,CAAC,CAAC,SAAS,WAAW,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAqCnI,gBAAgB,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IA+BrI,OAAO,CAAC,iBAAiB;IAsBzB,OAAO,CAAC,WAAW;IAInB,OAAO,CAAC,gBAAgB;IAKxB,OAAO,CAAC,mBAAmB;IAU3B,cAAc,CAAC,CAAC,SAAS,QAAQ,CAAC,CAAC,CAAC,EAAE,aAAa,EAAE,CAAC,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,SAAS,CAAC,qBAAqB,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CA0BpI"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,154 +1,227 @@
1
+ import { useState, useEffect, useCallback, useRef } from "react";
1
2
  import { CovenantClient } from "@covenant-rpc/client";
2
- import { useEffect, useState } from "react";
3
+ /**
4
+ * React client extending CovenantClient with React hooks
5
+ */
3
6
  export class CovenantReactClient extends CovenantClient {
4
- // this is any becuse we have no other choice. You just gotta trust me on this one.
5
7
  cache = new Map();
6
- listenes = new Map();
7
- useQuery(procedureName, inputs) {
8
+ constructor(covenant, connections) {
9
+ super(covenant, connections);
10
+ }
11
+ /**
12
+ * Hook for executing queries
13
+ * Automatically executes on mount and when inputs change
14
+ */
15
+ useQuery(procedure, inputs) {
8
16
  const [state, setState] = useState({
9
17
  loading: true,
10
18
  data: null,
11
19
  error: null,
12
20
  });
21
+ const isMountedRef = useRef(true);
13
22
  useEffect(() => {
14
- const fn = async () => {
15
- setState({
16
- loading: true,
17
- data: null,
18
- error: null,
19
- });
20
- const response = await this.query(procedureName, inputs);
21
- if (response.success) {
22
- setState({
23
- loading: false,
24
- data: response.data,
25
- error: null,
26
- });
23
+ isMountedRef.current = true;
24
+ let cancelled = false;
25
+ setState({ loading: true, data: null, error: null });
26
+ this.query(procedure, inputs).then((result) => {
27
+ if (cancelled || !isMountedRef.current)
28
+ return;
29
+ if (result.success) {
30
+ setState({ loading: false, data: result.data, error: null });
27
31
  }
28
32
  else {
29
33
  setState({
30
34
  loading: false,
31
35
  data: null,
32
- error: response.error,
36
+ error: {
37
+ code: result.error.code,
38
+ message: result.error.message,
39
+ },
33
40
  });
34
41
  }
42
+ });
43
+ return () => {
44
+ cancelled = true;
35
45
  };
36
- fn();
37
- }, [inputs]);
46
+ }, [procedure, JSON.stringify(inputs)]);
47
+ useEffect(() => {
48
+ return () => {
49
+ isMountedRef.current = false;
50
+ };
51
+ }, []);
38
52
  return state;
39
53
  }
40
- useMutation(procedureName, inputs) {
54
+ /**
55
+ * Hook for executing mutations
56
+ * Returns [mutate, state] pattern - mutation is called manually
57
+ */
58
+ useMutation(procedure, options) {
41
59
  const [state, setState] = useState({
42
- loading: true,
60
+ loading: false,
43
61
  data: null,
44
62
  error: null,
45
63
  });
64
+ const isMountedRef = useRef(true);
46
65
  useEffect(() => {
47
- const fn = async () => {
48
- setState({
49
- loading: true,
50
- data: null,
51
- error: null,
52
- });
53
- const response = await this.mutate(procedureName, inputs);
54
- if (response.success) {
55
- setState({
56
- loading: false,
57
- data: response.data,
58
- error: null,
59
- });
60
- }
61
- else {
62
- setState({
63
- loading: false,
64
- data: null,
65
- error: response.error,
66
- });
67
- }
66
+ return () => {
67
+ isMountedRef.current = false;
68
68
  };
69
- fn();
70
- }, [inputs]);
71
- return state;
69
+ }, []);
70
+ const mutate = useCallback(async (input) => {
71
+ // Apply optimistic update if provided
72
+ if (options?.optimisticData) {
73
+ const optimisticData = options.optimisticData(input);
74
+ setState({ loading: true, data: optimisticData, error: null });
75
+ }
76
+ else {
77
+ setState({ loading: true, data: null, error: null });
78
+ }
79
+ const result = await this.mutate(procedure, input);
80
+ if (!isMountedRef.current)
81
+ return;
82
+ if (result.success) {
83
+ setState({ loading: false, data: result.data, error: null });
84
+ options?.onSuccess?.(result.data);
85
+ }
86
+ else {
87
+ const error = {
88
+ code: result.error.code,
89
+ message: result.error.message,
90
+ };
91
+ setState({ loading: false, data: null, error });
92
+ options?.onError?.(error);
93
+ }
94
+ }, [procedure, options]);
95
+ return [mutate, state];
72
96
  }
73
- useListenedQuery(procedureName, inputs) {
97
+ /**
98
+ * Hook for queries with automatic refetch on resource invalidation
99
+ * Uses client.listen() for resource tracking
100
+ */
101
+ useListenedQuery(procedure, inputs, remote = false) {
74
102
  const [state, setState] = useState({
75
103
  loading: true,
76
104
  data: null,
77
105
  error: null,
78
106
  });
107
+ const isMountedRef = useRef(true);
79
108
  useEffect(() => {
80
- return this.listen(procedureName, inputs, ({ data, error }) => {
81
- if (error !== null) {
82
- setState({
83
- loading: false,
84
- error: error,
85
- data: null,
86
- });
109
+ isMountedRef.current = true;
110
+ setState({ loading: true, data: null, error: null });
111
+ const unsubscribe = this.listen(procedure, inputs, (result) => {
112
+ if (!isMountedRef.current)
113
+ return;
114
+ if (result.success) {
115
+ setState({ loading: false, data: result.data, error: null });
87
116
  }
88
117
  else {
89
118
  setState({
90
119
  loading: false,
91
- error: null,
92
- data: data,
120
+ data: null,
121
+ error: {
122
+ code: result.error.code,
123
+ message: result.error.message,
124
+ },
93
125
  });
94
126
  }
95
- });
96
- }, [inputs]);
127
+ }, remote);
128
+ return () => {
129
+ unsubscribe();
130
+ };
131
+ }, [procedure, JSON.stringify(inputs), remote]);
132
+ useEffect(() => {
133
+ return () => {
134
+ isMountedRef.current = false;
135
+ };
136
+ }, []);
97
137
  return state;
98
138
  }
99
- createCachedQuery(procedureName, inputs) {
100
- this.listen(procedureName, inputs, ({ data, error }) => {
101
- const state = error === null ? {
102
- loading: false,
103
- error: null,
104
- data: data
105
- } : {
106
- loading: false,
107
- error: error,
108
- data: null,
139
+ /**
140
+ * Hook for cached queries with shared state across component instances
141
+ * All components using the same procedure+inputs share the same cache entry
142
+ */
143
+ useCachedQuery(procedure, inputs, remote = false) {
144
+ const cacheKey = this.generateCacheKey(procedure, inputs);
145
+ // Get or create cache entry
146
+ if (!this.cache.has(cacheKey)) {
147
+ this.createCachedQuery(procedure, inputs, remote);
148
+ }
149
+ const cacheEntry = this.cache.get(cacheKey);
150
+ const [state, setState] = useState(cacheEntry.data);
151
+ useEffect(() => {
152
+ // Subscribe to cache updates
153
+ const listener = (newData) => {
154
+ setState(newData);
109
155
  };
110
- const key = this.getCacheKey(String(procedureName), inputs);
111
- const listeners = this.listenes.get(key) ?? [];
112
- this.cache.set(key, state);
113
- for (const l of listeners) {
114
- l(state);
115
- }
116
- });
117
- }
118
- getCacheKey(procedureName, inputs) {
119
- return `${procedureName}-${JSON.stringify(inputs)}`;
156
+ cacheEntry.listeners.add(listener);
157
+ // Update state to current cache value in case it changed
158
+ setState(cacheEntry.data);
159
+ return () => {
160
+ cacheEntry.listeners.delete(listener);
161
+ // Clean up cache entry if no more listeners
162
+ if (cacheEntry.listeners.size === 0) {
163
+ cacheEntry.unsubscribe?.();
164
+ this.cache.delete(cacheKey);
165
+ }
166
+ };
167
+ }, [cacheKey]);
168
+ return state;
120
169
  }
121
- addCacheListener(key, l) {
122
- const current = this.listenes.get(key) ?? [];
123
- current.push(l);
124
- this.listenes.set(key, current);
170
+ /**
171
+ * Invalidate a specific cache entry
172
+ */
173
+ invalidateCache(procedure, inputs) {
174
+ const cacheKey = this.generateCacheKey(procedure, inputs);
175
+ const cacheEntry = this.cache.get(cacheKey);
176
+ if (cacheEntry) {
177
+ cacheEntry.unsubscribe?.();
178
+ this.cache.delete(cacheKey);
179
+ }
125
180
  }
126
- removeCacheListener(listener) {
127
- for (const [k, v] of this.listenes) {
128
- if (v.find(l => l === listener) !== undefined) {
129
- const n = v.filter(l => l !== listener);
130
- this.listenes.set(k, n);
131
- }
181
+ /**
182
+ * Clear all cache entries
183
+ */
184
+ clearCache() {
185
+ for (const [, entry] of this.cache) {
186
+ entry.unsubscribe?.();
132
187
  }
188
+ this.cache.clear();
133
189
  }
134
- useCachedQuery(procedureName, inputs) {
135
- const k = this.getCacheKey(String(procedureName), inputs);
136
- const [state, setState] = useState(this.cache.has(k) ? this.cache.get(k) : {
137
- loading: true,
138
- data: null,
139
- error: null,
140
- });
141
- useEffect(() => {
142
- // we have to refetch the key in case inputs changed
143
- const newKey = this.getCacheKey(String(procedureName), inputs);
144
- if (!this.cache.has(k)) {
145
- this.createCachedQuery(procedureName, inputs);
190
+ /**
191
+ * Generate a cache key from procedure name and inputs
192
+ */
193
+ generateCacheKey(procedure, inputs) {
194
+ return `${procedure}:${JSON.stringify(inputs)}`;
195
+ }
196
+ /**
197
+ * Create a new cached query entry with listener
198
+ */
199
+ createCachedQuery(procedure, inputs, remote) {
200
+ const cacheKey = this.generateCacheKey(procedure, inputs);
201
+ const cacheEntry = {
202
+ data: { loading: true, data: null, error: null },
203
+ listeners: new Set(),
204
+ };
205
+ this.cache.set(cacheKey, cacheEntry);
206
+ // Set up listener for automatic refetch
207
+ const unsubscribe = this.listen(procedure, inputs, (result) => {
208
+ const newData = result.success
209
+ ? { loading: false, data: result.data, error: null }
210
+ : {
211
+ loading: false,
212
+ data: null,
213
+ error: {
214
+ code: result.error.code,
215
+ message: result.error.message,
216
+ },
217
+ };
218
+ cacheEntry.data = newData;
219
+ // Notify all listeners
220
+ for (const listener of cacheEntry.listeners) {
221
+ listener(newData);
146
222
  }
147
- const l = (s) => setState(s);
148
- this.addCacheListener(newKey, l);
149
- return () => this.removeCacheListener(l);
150
- }, [setState, inputs]);
151
- return state;
223
+ }, remote);
224
+ cacheEntry.unsubscribe = unsubscribe;
152
225
  }
153
226
  }
154
227
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../index.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -2,7 +2,13 @@
2
2
  "name": "@covenant-rpc/react",
3
3
  "module": "./dist/index.js",
4
4
  "type": "module",
5
- "version": "0.4.0",
5
+ "version": "1.0.0",
6
+ "exports": {
7
+ ".": {
8
+ "types": "./dist/index.d.ts",
9
+ "import": "./dist/index.js"
10
+ }
11
+ },
6
12
  "scripts": {
7
13
  "build": "bun ../../scripts/build-package.ts ."
8
14
  },
@@ -14,8 +20,15 @@
14
20
  },
15
21
  "dependencies": {
16
22
  "react": "^19.1.1",
17
- "@covenant-rpc/core": "^0.4.0",
18
- "@covenant-rpc/client": "^0.4.0"
23
+ "@covenant-rpc/core": "^0.5.0",
24
+ "@covenant-rpc/client": "^0.5.0"
25
+ },
26
+ "devDependencies": {
27
+ "@covenant-rpc/server": "workspace:*",
28
+ "@testing-library/react": "^14.2.1",
29
+ "@types/jsdom": "^27.0.0",
30
+ "jsdom": "^27.4.0",
31
+ "zod": "^3.22.4"
19
32
  },
20
33
  "types": "./dist/index.d.ts",
21
34
  "files": [
package/dist/helpers.d.ts DELETED
@@ -1,8 +0,0 @@
1
- import type { AsyncHook } from ".";
2
- export type CallbackFunction<T> = () => T;
3
- export declare function useDataStream<T>({ initialFetch, connect, disconnect }: {
4
- initialFetch: () => Promise<T[]>;
5
- connect: (callback: CallbackFunction<T>) => Promise<void>;
6
- disconnect: () => void;
7
- }): AsyncHook<T[]>;
8
- //# sourceMappingURL=helpers.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.d.ts","sourceRoot":"","sources":["../helpers.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,GAAG,CAAC;AAkBnC,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI,MAAM,CAAC,CAAC;AAY1C,wBAAgB,aAAa,CAAC,CAAC,EAAE,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAAE,EAAE;IACtE,YAAY,EAAE,MAAM,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC;IACjC,OAAO,EAAE,CAAC,QAAQ,EAAE,gBAAgB,CAAC,CAAC,CAAC,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,UAAU,EAAE,MAAM,IAAI,CAAA;CACvB,GAAG,SAAS,CAAC,CAAC,EAAE,CAAC,CAsEjB"}
package/dist/helpers.js DELETED
@@ -1,73 +0,0 @@
1
- import { useEffect, useState } from "react";
2
- // useDataStream is best described by an example. Let's say we have a chatFunction which has two methods:
3
- //
4
- // getCurrentMessages: () => Promise<Message[]>
5
- // connectToUpdates: (onUpdate: () => Message): Promise<void>
6
- // disconnect: () => void
7
- //
8
- // We want to fetch all messages as well as continue to listen to them. useDataStream should handle this
9
- // as well as various race conditions
10
- export function useDataStream({ initialFetch, connect, disconnect }) {
11
- const [state, setState] = useState({
12
- loading: true,
13
- data: null,
14
- error: null
15
- });
16
- useEffect(() => {
17
- let isMounted = true;
18
- let items = [];
19
- let isConnecting = false;
20
- const handleNewItem = (newItem) => {
21
- if (!isMounted)
22
- return;
23
- // Add new item to the list
24
- items = [...items, newItem];
25
- setState({
26
- loading: false,
27
- data: items,
28
- error: null
29
- });
30
- };
31
- const initialize = async () => {
32
- try {
33
- // Fetch initial data first
34
- const initialData = await initialFetch();
35
- if (!isMounted)
36
- return;
37
- items = initialData;
38
- setState({
39
- loading: false,
40
- data: items,
41
- error: null
42
- });
43
- // Connect to updates
44
- // Note: The type signature indicates CallbackFunction<T> = () => T,
45
- // but the practical use case requires (newItem: T) => void
46
- // Using type assertion to work with the expected runtime behavior
47
- isConnecting = true;
48
- await connect(handleNewItem);
49
- }
50
- catch (error) {
51
- if (!isMounted)
52
- return;
53
- setState({
54
- loading: false,
55
- data: null,
56
- error: {
57
- code: 500,
58
- message: error instanceof Error ? error.message : 'Unknown error'
59
- }
60
- });
61
- }
62
- };
63
- initialize();
64
- return () => {
65
- isMounted = false;
66
- if (isConnecting) {
67
- disconnect();
68
- }
69
- };
70
- }, [initialFetch, connect, disconnect]);
71
- return state;
72
- }
73
- //# sourceMappingURL=helpers.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"helpers.js","sourceRoot":"","sources":["../helpers.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAoB5C,yGAAyG;AACzG,EAAE;AACF,+CAA+C;AAC/C,8DAA8D;AAC9D,yBAAyB;AACzB,EAAE;AACF,wGAAwG;AACxG,qCAAqC;AAErC,MAAM,UAAU,aAAa,CAAI,EAAE,YAAY,EAAE,OAAO,EAAE,UAAU,EAInE;IACC,MAAM,CAAC,KAAK,EAAE,QAAQ,CAAC,GAAG,QAAQ,CAAiB;QACjD,OAAO,EAAE,IAAI;QACb,IAAI,EAAE,IAAI;QACV,KAAK,EAAE,IAAI;KACZ,CAAC,CAAC;IAEH,SAAS,CAAC,GAAG,EAAE;QACb,IAAI,SAAS,GAAG,IAAI,CAAC;QACrB,IAAI,KAAK,GAAQ,EAAE,CAAC;QACpB,IAAI,YAAY,GAAG,KAAK,CAAC;QAEzB,MAAM,aAAa,GAAG,CAAC,OAAU,EAAE,EAAE;YACnC,IAAI,CAAC,SAAS;gBAAE,OAAO;YAEvB,2BAA2B;YAC3B,KAAK,GAAG,CAAC,GAAG,KAAK,EAAE,OAAO,CAAC,CAAC;YAC5B,QAAQ,CAAC;gBACP,OAAO,EAAE,KAAK;gBACd,IAAI,EAAE,KAAK;gBACX,KAAK,EAAE,IAAI;aACZ,CAAC,CAAC;QACL,CAAC,CAAC;QAEF,MAAM,UAAU,GAAG,KAAK,IAAI,EAAE;YAC5B,IAAI,CAAC;gBACH,2BAA2B;gBAC3B,MAAM,WAAW,GAAG,MAAM,YAAY,EAAE,CAAC;gBAEzC,IAAI,CAAC,SAAS;oBAAE,OAAO;gBAEvB,KAAK,GAAG,WAAW,CAAC;gBACpB,QAAQ,CAAC;oBACP,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,KAAK;oBACX,KAAK,EAAE,IAAI;iBACZ,CAAC,CAAC;gBAEH,qBAAqB;gBACrB,oEAAoE;gBACpE,2DAA2D;gBAC3D,kEAAkE;gBAClE,YAAY,GAAG,IAAI,CAAC;gBACpB,MAAM,OAAO,CAAC,aAAoB,CAAC,CAAC;YAEtC,CAAC;YAAC,OAAO,KAAK,EAAE,CAAC;gBACf,IAAI,CAAC,SAAS;oBAAE,OAAO;gBAEvB,QAAQ,CAAC;oBACP,OAAO,EAAE,KAAK;oBACd,IAAI,EAAE,IAAI;oBACV,KAAK,EAAE;wBACL,IAAI,EAAE,GAAG;wBACT,OAAO,EAAE,KAAK,YAAY,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC,eAAe;qBAClE;iBACF,CAAC,CAAC;YACL,CAAC;QACH,CAAC,CAAC;QAEF,UAAU,EAAE,CAAC;QAEb,OAAO,GAAG,EAAE;YACV,SAAS,GAAG,KAAK,CAAC;YAClB,IAAI,YAAY,EAAE,CAAC;gBACjB,UAAU,EAAE,CAAC;YACf,CAAC;QACH,CAAC,CAAC;IACJ,CAAC,EAAE,CAAC,YAAY,EAAE,OAAO,EAAE,UAAU,CAAC,CAAC,CAAC;IAExC,OAAO,KAAK,CAAC;AACf,CAAC"}