@agentuity/react 0.0.69 → 0.0.70
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/api.d.ts +196 -0
- package/dist/api.d.ts.map +1 -0
- package/dist/api.js +325 -0
- package/dist/api.js.map +1 -0
- package/dist/env.d.ts.map +1 -1
- package/dist/env.js +3 -0
- package/dist/env.js.map +1 -1
- package/dist/eventstream.d.ts +52 -13
- package/dist/eventstream.d.ts.map +1 -1
- package/dist/eventstream.js +45 -13
- package/dist/eventstream.js.map +1 -1
- package/dist/index.d.ts +2 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +2 -1
- package/dist/index.js.map +1 -1
- package/dist/memo.d.ts +7 -0
- package/dist/memo.d.ts.map +1 -0
- package/dist/memo.js +32 -0
- package/dist/memo.js.map +1 -0
- package/dist/serialization.d.ts.map +1 -1
- package/dist/serialization.js +5 -7
- package/dist/serialization.js.map +1 -1
- package/dist/types.d.ts +10 -25
- package/dist/types.d.ts.map +1 -1
- package/dist/url.d.ts.map +1 -1
- package/dist/url.js +6 -0
- package/dist/url.js.map +1 -1
- package/dist/websocket.d.ts +60 -13
- package/dist/websocket.d.ts.map +1 -1
- package/dist/websocket.js +47 -13
- package/dist/websocket.js.map +1 -1
- package/package.json +3 -2
- package/src/api.ts +529 -0
- package/src/env.ts +3 -0
- package/src/eventstream.ts +87 -40
- package/src/index.ts +2 -1
- package/src/memo.ts +32 -0
- package/src/serialization.ts +4 -6
- package/src/types.ts +19 -29
- package/src/url.ts +7 -0
- package/src/websocket.ts +109 -43
- package/dist/run.d.ts +0 -34
- package/dist/run.d.ts.map +0 -1
- package/dist/run.js +0 -68
- package/dist/run.js.map +0 -1
- package/src/run.ts +0 -119
package/dist/eventstream.js
CHANGED
|
@@ -3,7 +3,8 @@ import { AgentuityContext } from './context';
|
|
|
3
3
|
import { buildUrl } from './url';
|
|
4
4
|
import { deserializeData } from './serialization';
|
|
5
5
|
import { createReconnectManager } from './reconnect';
|
|
6
|
-
|
|
6
|
+
import { jsonEqual } from './memo';
|
|
7
|
+
const useEventStreamInternal = (path, options) => {
|
|
7
8
|
const context = useContext(AgentuityContext);
|
|
8
9
|
if (!context) {
|
|
9
10
|
throw new Error('useEventStream must be used within a AgentuityProvider');
|
|
@@ -15,7 +16,8 @@ export const useEventStream = (path, options) => {
|
|
|
15
16
|
const reconnectManagerRef = useRef(undefined);
|
|
16
17
|
const [data, setData] = useState();
|
|
17
18
|
const [error, setError] = useState(null);
|
|
18
|
-
const [
|
|
19
|
+
const [isError, setIsError] = useState(false);
|
|
20
|
+
const [isConnected, setIsConnected] = useState(false);
|
|
19
21
|
const esUrl = useMemo(() => buildUrl(context.baseUrl, path, options?.subpath, options?.query), [context.baseUrl, path, options?.subpath, options?.query?.toString()]);
|
|
20
22
|
const connect = useCallback(() => {
|
|
21
23
|
if (manualClose.current)
|
|
@@ -24,12 +26,14 @@ export const useEventStream = (path, options) => {
|
|
|
24
26
|
let firstMessageReceived = false;
|
|
25
27
|
esRef.current.onopen = () => {
|
|
26
28
|
reconnectManagerRef.current?.recordSuccess();
|
|
27
|
-
|
|
29
|
+
setIsConnected(true);
|
|
28
30
|
setError(null);
|
|
31
|
+
setIsError(false);
|
|
29
32
|
};
|
|
30
33
|
esRef.current.onerror = () => {
|
|
31
34
|
setError(new Error('EventStream error'));
|
|
32
|
-
|
|
35
|
+
setIsError(true);
|
|
36
|
+
setIsConnected(false);
|
|
33
37
|
if (manualClose.current) {
|
|
34
38
|
return;
|
|
35
39
|
}
|
|
@@ -51,7 +55,8 @@ export const useEventStream = (path, options) => {
|
|
|
51
55
|
firstMessageReceived = true;
|
|
52
56
|
}
|
|
53
57
|
const payload = deserializeData(event.data);
|
|
54
|
-
|
|
58
|
+
// Use JSON memoization to prevent re-renders when data hasn't changed
|
|
59
|
+
setData((prev) => (prev !== undefined && jsonEqual(prev, payload) ? prev : payload));
|
|
55
60
|
if (handler.current) {
|
|
56
61
|
handler.current(payload);
|
|
57
62
|
}
|
|
@@ -85,7 +90,7 @@ export const useEventStream = (path, options) => {
|
|
|
85
90
|
esRef.current = undefined;
|
|
86
91
|
handler.current = undefined;
|
|
87
92
|
pending.current = [];
|
|
88
|
-
|
|
93
|
+
setIsConnected(false);
|
|
89
94
|
}, []);
|
|
90
95
|
useEffect(() => {
|
|
91
96
|
manualClose.current = false;
|
|
@@ -105,7 +110,10 @@ export const useEventStream = (path, options) => {
|
|
|
105
110
|
};
|
|
106
111
|
}
|
|
107
112
|
}, [options?.signal, cleanup]);
|
|
108
|
-
const reset = () =>
|
|
113
|
+
const reset = () => {
|
|
114
|
+
setError(null);
|
|
115
|
+
setIsError(false);
|
|
116
|
+
};
|
|
109
117
|
const setHandler = useCallback((h) => {
|
|
110
118
|
handler.current = h;
|
|
111
119
|
pending.current.forEach(h);
|
|
@@ -115,28 +123,52 @@ export const useEventStream = (path, options) => {
|
|
|
115
123
|
cleanup();
|
|
116
124
|
};
|
|
117
125
|
return {
|
|
118
|
-
|
|
126
|
+
isConnected,
|
|
119
127
|
close,
|
|
120
128
|
data,
|
|
121
129
|
error,
|
|
130
|
+
isError,
|
|
122
131
|
setHandler,
|
|
123
132
|
reset,
|
|
124
133
|
readyState: esRef.current?.readyState ?? EventSource.CLOSED,
|
|
125
134
|
};
|
|
126
135
|
};
|
|
127
|
-
|
|
136
|
+
/**
|
|
137
|
+
* Type-safe EventStream (SSE) hook for connecting to SSE routes.
|
|
138
|
+
*
|
|
139
|
+
* Provides automatic type inference for route outputs based on
|
|
140
|
+
* the SSERouteRegistry generated from your routes.
|
|
141
|
+
*
|
|
142
|
+
* @template TRoute - SSE route key from SSERouteRegistry (e.g., '/events', '/notifications')
|
|
143
|
+
*
|
|
144
|
+
* @example Simple SSE connection
|
|
145
|
+
* ```typescript
|
|
146
|
+
* const { isConnected, data } = useEventStream('/events');
|
|
147
|
+
*
|
|
148
|
+
* // data is fully typed based on route output schema!
|
|
149
|
+
* ```
|
|
150
|
+
*
|
|
151
|
+
* @example SSE with query parameters
|
|
152
|
+
* ```typescript
|
|
153
|
+
* const { isConnected, data } = useEventStream('/notifications', {
|
|
154
|
+
* query: new URLSearchParams({ userId: '123' })
|
|
155
|
+
* });
|
|
156
|
+
* ```
|
|
157
|
+
*/
|
|
158
|
+
export function useEventStream(route, options) {
|
|
128
159
|
const [data, setData] = useState();
|
|
129
|
-
const {
|
|
160
|
+
const { isConnected, close, setHandler, readyState, error, isError, reset } = useEventStreamInternal(route, options);
|
|
130
161
|
useEffect(() => {
|
|
131
162
|
setHandler(setData);
|
|
132
|
-
}, [
|
|
163
|
+
}, [route, setHandler]);
|
|
133
164
|
return {
|
|
134
|
-
|
|
165
|
+
isConnected,
|
|
135
166
|
close,
|
|
136
167
|
data,
|
|
137
168
|
error,
|
|
169
|
+
isError,
|
|
138
170
|
reset,
|
|
139
171
|
readyState,
|
|
140
172
|
};
|
|
141
|
-
}
|
|
173
|
+
}
|
|
142
174
|
//# sourceMappingURL=eventstream.js.map
|
package/dist/eventstream.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"eventstream.js","sourceRoot":"","sources":["../src/eventstream.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"eventstream.js","sourceRoot":"","sources":["../src/eventstream.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC"}
|
package/dist/index.js
CHANGED
package/dist/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,WAAW,CAAC;AAC1B,cAAc,aAAa,CAAC;AAC5B,cAAc,eAAe,CAAC;AAC9B,cAAc,SAAS,CAAC;AACxB,cAAc,OAAO,CAAC;AACtB,cAAc,QAAQ,CAAC"}
|
package/dist/memo.d.ts
ADDED
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple JSON-based equality check for memoization.
|
|
3
|
+
* Compares stringified JSON to avoid deep equality overhead.
|
|
4
|
+
*/
|
|
5
|
+
export declare function jsonEqual<T>(a: T, b: T): boolean;
|
|
6
|
+
export declare function useJsonMemo<T>(value: T): T;
|
|
7
|
+
//# sourceMappingURL=memo.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memo.d.ts","sourceRoot":"","sources":["../src/memo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,wBAAgB,SAAS,CAAC,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,OAAO,CAWhD;AAQD,wBAAgB,WAAW,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,GAAG,CAAC,CAQ1C"}
|
package/dist/memo.js
ADDED
|
@@ -0,0 +1,32 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Simple JSON-based equality check for memoization.
|
|
3
|
+
* Compares stringified JSON to avoid deep equality overhead.
|
|
4
|
+
*/
|
|
5
|
+
export function jsonEqual(a, b) {
|
|
6
|
+
if (a === b)
|
|
7
|
+
return true;
|
|
8
|
+
if (a === undefined || b === undefined)
|
|
9
|
+
return false;
|
|
10
|
+
if (a === null || b === null)
|
|
11
|
+
return a === b;
|
|
12
|
+
try {
|
|
13
|
+
return JSON.stringify(a) === JSON.stringify(b);
|
|
14
|
+
}
|
|
15
|
+
catch {
|
|
16
|
+
// Fallback for non-serializable values
|
|
17
|
+
return false;
|
|
18
|
+
}
|
|
19
|
+
}
|
|
20
|
+
/**
|
|
21
|
+
* Hook to memoize a value based on JSON equality instead of reference equality.
|
|
22
|
+
* Prevents unnecessary re-renders when data hasn't actually changed.
|
|
23
|
+
*/
|
|
24
|
+
import { useRef } from 'react';
|
|
25
|
+
export function useJsonMemo(value) {
|
|
26
|
+
const ref = useRef(value);
|
|
27
|
+
if (!jsonEqual(ref.current, value)) {
|
|
28
|
+
ref.current = value;
|
|
29
|
+
}
|
|
30
|
+
return ref.current;
|
|
31
|
+
}
|
|
32
|
+
//# sourceMappingURL=memo.js.map
|
package/dist/memo.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"memo.js","sourceRoot":"","sources":["../src/memo.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,UAAU,SAAS,CAAI,CAAI,EAAE,CAAI;IACtC,IAAI,CAAC,KAAK,CAAC;QAAE,OAAO,IAAI,CAAC;IACzB,IAAI,CAAC,KAAK,SAAS,IAAI,CAAC,KAAK,SAAS;QAAE,OAAO,KAAK,CAAC;IACrD,IAAI,CAAC,KAAK,IAAI,IAAI,CAAC,KAAK,IAAI;QAAE,OAAO,CAAC,KAAK,CAAC,CAAC;IAE7C,IAAI,CAAC;QACJ,OAAO,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,KAAK,IAAI,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;IAChD,CAAC;IAAC,MAAM,CAAC;QACR,uCAAuC;QACvC,OAAO,KAAK,CAAC;IACd,CAAC;AACF,CAAC;AAED;;;GAGG;AACH,OAAO,EAAE,MAAM,EAAE,MAAM,OAAO,CAAC;AAE/B,MAAM,UAAU,WAAW,CAAI,KAAQ;IACtC,MAAM,GAAG,GAAG,MAAM,CAAI,KAAK,CAAC,CAAC;IAE7B,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,OAAO,EAAE,KAAK,CAAC,EAAE,CAAC;QACpC,GAAG,CAAC,OAAO,GAAG,KAAK,CAAC;IACrB,CAAC;IAED,OAAO,GAAG,CAAC,OAAO,CAAC;AACpB,CAAC"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,MAAM,MAAM,KAAG,
|
|
1
|
+
{"version":3,"file":"serialization.d.ts","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,eAAO,MAAM,eAAe,GAAI,CAAC,EAAE,MAAM,MAAM,KAAG,CASjD,CAAC"}
|
package/dist/serialization.js
CHANGED
|
@@ -4,13 +4,11 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export const deserializeData = (data) => {
|
|
6
6
|
if (data) {
|
|
7
|
-
|
|
8
|
-
|
|
9
|
-
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
console.error('error parsing data as JSON', ex, data);
|
|
13
|
-
}
|
|
7
|
+
try {
|
|
8
|
+
return JSON.parse(data);
|
|
9
|
+
}
|
|
10
|
+
catch {
|
|
11
|
+
/* */
|
|
14
12
|
}
|
|
15
13
|
}
|
|
16
14
|
return data;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAI,IAAY,EAAK,EAAE;IACrD,IAAI,IAAI,EAAE,CAAC;QACV,IAAI,
|
|
1
|
+
{"version":3,"file":"serialization.js","sourceRoot":"","sources":["../src/serialization.ts"],"names":[],"mappings":"AAAA;;;GAGG;AACH,MAAM,CAAC,MAAM,eAAe,GAAG,CAAI,IAAY,EAAK,EAAE;IACrD,IAAI,IAAI,EAAE,CAAC;QACV,IAAI,CAAC;YACJ,OAAO,IAAI,CAAC,KAAK,CAAC,IAAI,CAAM,CAAC;QAC9B,CAAC;QAAC,MAAM,CAAC;YACR,KAAK;QACN,CAAC;IACF,CAAC;IACD,OAAO,IAAS,CAAC;AAClB,CAAC,CAAC"}
|
package/dist/types.d.ts
CHANGED
|
@@ -1,34 +1,19 @@
|
|
|
1
|
-
import type { StandardSchemaV1 } from '@agentuity/core';
|
|
2
1
|
/**
|
|
3
|
-
*
|
|
2
|
+
* Route registry containing all typed API routes in the application.
|
|
3
|
+
* Auto-generated by the build tool from routes that use validator() middleware.
|
|
4
4
|
*/
|
|
5
|
-
export interface
|
|
6
|
-
inputSchema: TInput;
|
|
7
|
-
outputSchema: TOutput;
|
|
5
|
+
export interface RouteRegistry {
|
|
8
6
|
}
|
|
9
7
|
/**
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* Example usage in generated code (.agentuity/types.d.ts):
|
|
14
|
-
* ```typescript
|
|
15
|
-
* import type { Agent } from '@agentuity/react';
|
|
16
|
-
* import type { MyInputSchema, MyOutputSchema } from './schemas';
|
|
17
|
-
*
|
|
18
|
-
* declare module '@agentuity/react' {
|
|
19
|
-
* interface AgentRegistry {
|
|
20
|
-
* 'my-agent': Agent<MyInputSchema, MyOutputSchema>;
|
|
21
|
-
* 'another-agent': Agent<AnotherInput, AnotherOutput>;
|
|
22
|
-
* }
|
|
23
|
-
* }
|
|
24
|
-
* ```
|
|
8
|
+
* WebSocket route registry containing all typed WebSocket routes in the application.
|
|
9
|
+
* Auto-generated by the build tool from routes that use validator() middleware.
|
|
25
10
|
*/
|
|
26
|
-
export interface
|
|
11
|
+
export interface WebSocketRouteRegistry {
|
|
27
12
|
}
|
|
28
13
|
/**
|
|
29
|
-
*
|
|
30
|
-
*
|
|
31
|
-
* After augmentation, this becomes a strict union of agent names for full type safety.
|
|
14
|
+
* SSE route registry containing all typed SSE routes in the application.
|
|
15
|
+
* Auto-generated by the build tool from routes that use validator() middleware.
|
|
32
16
|
*/
|
|
33
|
-
export
|
|
17
|
+
export interface SSERouteRegistry {
|
|
18
|
+
}
|
|
34
19
|
//# sourceMappingURL=types.d.ts.map
|
package/dist/types.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA
|
|
1
|
+
{"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,MAAM,WAAW,aAAa;CAG7B;AAED;;;GAGG;AAEH,MAAM,WAAW,sBAAsB;CAGtC;AAED;;;GAGG;AAEH,MAAM,WAAW,gBAAgB;CAGhC"}
|
package/dist/url.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,UAAU,MAAM,EAChB,QAAQ,eAAe,KACrB,MAWF,CAAC;
|
|
1
|
+
{"version":3,"file":"url.d.ts","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAEA,eAAO,MAAM,QAAQ,GACpB,MAAM,MAAM,EACZ,MAAM,MAAM,EACZ,UAAU,MAAM,EAChB,QAAQ,eAAe,KACrB,MAWF,CAAC;AAQF,eAAO,MAAM,cAAc,EAAE,MAKL,CAAC"}
|
package/dist/url.js
CHANGED
|
@@ -11,8 +11,14 @@ export const buildUrl = (base, path, subpath, query) => {
|
|
|
11
11
|
}
|
|
12
12
|
return url;
|
|
13
13
|
};
|
|
14
|
+
const tryOrigin = () => {
|
|
15
|
+
if (typeof window !== 'undefined') {
|
|
16
|
+
return window.location.origin;
|
|
17
|
+
}
|
|
18
|
+
};
|
|
14
19
|
export const defaultBaseUrl = getProcessEnv('NEXT_PUBLIC_AGENTUITY_URL') ||
|
|
15
20
|
getProcessEnv('VITE_AGENTUITY_URL') ||
|
|
16
21
|
getProcessEnv('AGENTUITY_URL') ||
|
|
22
|
+
tryOrigin() ||
|
|
17
23
|
'http://localhost:3500';
|
|
18
24
|
//# sourceMappingURL=url.js.map
|
package/dist/url.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,QAAQ,GAAG,CACvB,IAAY,EACZ,IAAY,EACZ,OAAgB,EAChB,KAAuB,EACd,EAAE;IACX,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAChD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAC5D,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACX,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAC1B,aAAa,CAAC,2BAA2B,CAAC;IAC1C,aAAa,CAAC,oBAAoB,CAAC;IACnC,aAAa,CAAC,eAAe,CAAC;IAC9B,uBAAuB,CAAC"}
|
|
1
|
+
{"version":3,"file":"url.js","sourceRoot":"","sources":["../src/url.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,aAAa,EAAE,MAAM,OAAO,CAAC;AAEtC,MAAM,CAAC,MAAM,QAAQ,GAAG,CACvB,IAAY,EACZ,IAAY,EACZ,OAAgB,EAChB,KAAuB,EACd,EAAE;IACX,IAAI,GAAG,IAAI,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;IAChD,IAAI,GAAG,GAAG,IAAI,CAAC,OAAO,CAAC,KAAK,EAAE,EAAE,CAAC,GAAG,IAAI,CAAC;IACzC,IAAI,OAAO,EAAE,CAAC;QACb,OAAO,GAAG,OAAO,CAAC,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,IAAI,OAAO,EAAE,CAAC;QAC5D,GAAG,IAAI,IAAI,OAAO,EAAE,CAAC;IACtB,CAAC;IACD,IAAI,KAAK,EAAE,CAAC;QACX,GAAG,IAAI,IAAI,KAAK,CAAC,QAAQ,EAAE,EAAE,CAAC;IAC/B,CAAC;IACD,OAAO,GAAG,CAAC;AACZ,CAAC,CAAC;AAEF,MAAM,SAAS,GAAG,GAAG,EAAE;IACtB,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE,CAAC;QACnC,OAAO,MAAM,CAAC,QAAQ,CAAC,MAAM,CAAC;IAC/B,CAAC;AACF,CAAC,CAAC;AAEF,MAAM,CAAC,MAAM,cAAc,GAC1B,aAAa,CAAC,2BAA2B,CAAC;IAC1C,aAAa,CAAC,oBAAoB,CAAC;IACnC,aAAa,CAAC,eAAe,CAAC;IAC9B,SAAS,EAAE;IACX,uBAAuB,CAAC"}
|
package/dist/websocket.d.ts
CHANGED
|
@@ -1,13 +1,32 @@
|
|
|
1
1
|
import type { InferInput, InferOutput } from '@agentuity/core';
|
|
2
|
-
import type {
|
|
2
|
+
import type { WebSocketRouteRegistry } from './types';
|
|
3
3
|
type onMessageHandler<T = unknown> = (data: T) => void;
|
|
4
|
-
|
|
4
|
+
/**
|
|
5
|
+
* Extract WebSocket route keys (e.g., '/ws', '/chat')
|
|
6
|
+
*/
|
|
7
|
+
export type WebSocketRouteKey = keyof WebSocketRouteRegistry;
|
|
8
|
+
/**
|
|
9
|
+
* Extract input type for a WebSocket route
|
|
10
|
+
*/
|
|
11
|
+
export type WebSocketRouteInput<TRoute extends WebSocketRouteKey> = TRoute extends keyof WebSocketRouteRegistry ? WebSocketRouteRegistry[TRoute] extends {
|
|
12
|
+
inputSchema: infer TSchema;
|
|
13
|
+
} ? TSchema extends undefined | never ? never : InferInput<TSchema> : never : never;
|
|
14
|
+
/**
|
|
15
|
+
* Extract output type for a WebSocket route
|
|
16
|
+
*/
|
|
17
|
+
export type WebSocketRouteOutput<TRoute extends WebSocketRouteKey> = TRoute extends keyof WebSocketRouteRegistry ? WebSocketRouteRegistry[TRoute] extends {
|
|
18
|
+
outputSchema: infer TSchema;
|
|
19
|
+
} ? TSchema extends undefined | never ? void : InferOutput<TSchema> : void : void;
|
|
20
|
+
/**
|
|
21
|
+
* Options for WebSocket hooks
|
|
22
|
+
*/
|
|
23
|
+
export interface WebsocketOptions {
|
|
5
24
|
/**
|
|
6
25
|
* Optional query parameters to append to the websocket URL
|
|
7
26
|
*/
|
|
8
27
|
query?: URLSearchParams;
|
|
9
28
|
/**
|
|
10
|
-
* Optional subpath to append to the
|
|
29
|
+
* Optional subpath to append to the websocket path
|
|
11
30
|
*/
|
|
12
31
|
subpath?: string;
|
|
13
32
|
/**
|
|
@@ -15,23 +34,51 @@ interface WebsocketArgs {
|
|
|
15
34
|
*/
|
|
16
35
|
signal?: AbortSignal;
|
|
17
36
|
}
|
|
18
|
-
interface
|
|
19
|
-
connected
|
|
37
|
+
interface WebsocketResponseInternal<TInput, TOutput> {
|
|
38
|
+
/** Whether WebSocket is currently connected */
|
|
39
|
+
isConnected: boolean;
|
|
40
|
+
/** Most recent data received from WebSocket */
|
|
20
41
|
data?: TOutput;
|
|
42
|
+
/** Error if connection or message failed */
|
|
21
43
|
error: Error | null;
|
|
44
|
+
/** Whether an error has occurred */
|
|
45
|
+
isError: boolean;
|
|
46
|
+
/** Send data through the WebSocket */
|
|
22
47
|
send: (data: TInput) => void;
|
|
48
|
+
/** Set handler for incoming messages (use data property instead) */
|
|
23
49
|
setHandler: (handler: onMessageHandler<TOutput>) => void;
|
|
50
|
+
/** WebSocket connection state (CONNECTING=0, OPEN=1, CLOSING=2, CLOSED=3) */
|
|
24
51
|
readyState: WebSocket['readyState'];
|
|
52
|
+
/** Close the WebSocket connection */
|
|
25
53
|
close: () => void;
|
|
54
|
+
/** Reset state to initial values */
|
|
26
55
|
reset: () => void;
|
|
27
56
|
}
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
35
|
-
|
|
57
|
+
/**
|
|
58
|
+
* Type-safe WebSocket hook for connecting to WebSocket routes.
|
|
59
|
+
*
|
|
60
|
+
* Provides automatic type inference for route inputs and outputs based on
|
|
61
|
+
* the WebSocketRouteRegistry generated from your routes.
|
|
62
|
+
*
|
|
63
|
+
* @template TRoute - WebSocket route key from WebSocketRouteRegistry (e.g., '/ws', '/chat')
|
|
64
|
+
*
|
|
65
|
+
* @example Simple WebSocket connection
|
|
66
|
+
* ```typescript
|
|
67
|
+
* const { isConnected, data, send } = useWebsocket('/ws');
|
|
68
|
+
*
|
|
69
|
+
* // Send typed data
|
|
70
|
+
* send({ message: 'Hello' }); // Fully typed based on route schema!
|
|
71
|
+
* ```
|
|
72
|
+
*
|
|
73
|
+
* @example WebSocket with query parameters
|
|
74
|
+
* ```typescript
|
|
75
|
+
* const { isConnected, data, send } = useWebsocket('/chat', {
|
|
76
|
+
* query: new URLSearchParams({ room: 'general' })
|
|
77
|
+
* });
|
|
78
|
+
* ```
|
|
79
|
+
*/
|
|
80
|
+
export declare function useWebsocket<TRoute extends WebSocketRouteKey>(route: TRoute, options?: WebsocketOptions): Omit<WebsocketResponseInternal<WebSocketRouteInput<TRoute>, WebSocketRouteOutput<TRoute>>, 'setHandler'> & {
|
|
81
|
+
data?: WebSocketRouteOutput<TRoute>;
|
|
82
|
+
};
|
|
36
83
|
export {};
|
|
37
84
|
//# sourceMappingURL=websocket.d.ts.map
|
package/dist/websocket.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket.d.ts","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,UAAU,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AAM/D,OAAO,KAAK,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AAEtD,KAAK,gBAAgB,CAAC,CAAC,GAAG,OAAO,IAAI,CAAC,IAAI,EAAE,CAAC,KAAK,IAAI,CAAC;AAEvD;;GAEG;AACH,MAAM,MAAM,iBAAiB,GAAG,MAAM,sBAAsB,CAAC;AAE7D;;GAEG;AACH,MAAM,MAAM,mBAAmB,CAAC,MAAM,SAAS,iBAAiB,IAC/D,MAAM,SAAS,MAAM,sBAAsB,GACxC,sBAAsB,CAAC,MAAM,CAAC,SAAS;IAAE,WAAW,EAAE,MAAM,OAAO,CAAA;CAAE,GACpE,OAAO,SAAS,SAAS,GAAG,KAAK,GAChC,KAAK,GACL,UAAU,CAAC,OAAO,CAAC,GACpB,KAAK,GACN,KAAK,CAAC;AAEV;;GAEG;AACH,MAAM,MAAM,oBAAoB,CAAC,MAAM,SAAS,iBAAiB,IAChE,MAAM,SAAS,MAAM,sBAAsB,GACxC,sBAAsB,CAAC,MAAM,CAAC,SAAS;IAAE,YAAY,EAAE,MAAM,OAAO,CAAA;CAAE,GACrE,OAAO,SAAS,SAAS,GAAG,KAAK,GAChC,IAAI,GACJ,WAAW,CAAC,OAAO,CAAC,GACrB,IAAI,GACL,IAAI,CAAC;AAET;;GAEG;AACH,MAAM,WAAW,gBAAgB;IAChC;;OAEG;IACH,KAAK,CAAC,EAAE,eAAe,CAAC;IACxB;;OAEG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;OAEG;IACH,MAAM,CAAC,EAAE,WAAW,CAAC;CACrB;AAiBD,UAAU,yBAAyB,CAAC,MAAM,EAAE,OAAO;IAClD,+CAA+C;IAC/C,WAAW,EAAE,OAAO,CAAC;IACrB,+CAA+C;IAC/C,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,4CAA4C;IAC5C,KAAK,EAAE,KAAK,GAAG,IAAI,CAAC;IACpB,oCAAoC;IACpC,OAAO,EAAE,OAAO,CAAC;IACjB,sCAAsC;IACtC,IAAI,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,CAAC;IAC7B,oEAAoE;IACpE,UAAU,EAAE,CAAC,OAAO,EAAE,gBAAgB,CAAC,OAAO,CAAC,KAAK,IAAI,CAAC;IACzD,6EAA6E;IAC7E,UAAU,EAAE,SAAS,CAAC,YAAY,CAAC,CAAC;IACpC,qCAAqC;IACrC,KAAK,EAAE,MAAM,IAAI,CAAC;IAClB,oCAAoC;IACpC,KAAK,EAAE,MAAM,IAAI,CAAC;CAClB;AAuKD;;;;;;;;;;;;;;;;;;;;;;GAsBG;AACH,wBAAgB,YAAY,CAAC,MAAM,SAAS,iBAAiB,EAC5D,KAAK,EAAE,MAAM,EACb,OAAO,CAAC,EAAE,gBAAgB,GACxB,IAAI,CACN,yBAAyB,CAAC,mBAAmB,CAAC,MAAM,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC,EACpF,YAAY,CACZ,GAAG;IACH,IAAI,CAAC,EAAE,oBAAoB,CAAC,MAAM,CAAC,CAAC;CACpC,CAsBA"}
|
package/dist/websocket.js
CHANGED
|
@@ -3,6 +3,7 @@ import { AgentuityContext } from './context';
|
|
|
3
3
|
import { buildUrl } from './url';
|
|
4
4
|
import { deserializeData } from './serialization';
|
|
5
5
|
import { createReconnectManager } from './reconnect';
|
|
6
|
+
import { jsonEqual } from './memo';
|
|
6
7
|
const serializeWSData = (data) => {
|
|
7
8
|
if (typeof data === 'string') {
|
|
8
9
|
return data;
|
|
@@ -15,7 +16,7 @@ const serializeWSData = (data) => {
|
|
|
15
16
|
}
|
|
16
17
|
throw new Error('unsupported data type for websocket: ' + typeof data);
|
|
17
18
|
};
|
|
18
|
-
|
|
19
|
+
const useWebsocketInternal = (path, options) => {
|
|
19
20
|
const context = useContext(AgentuityContext);
|
|
20
21
|
if (!context) {
|
|
21
22
|
throw new Error('useWebsocket must be used within a AgentuityProvider');
|
|
@@ -28,7 +29,8 @@ export const useWebsocket = (path, options) => {
|
|
|
28
29
|
const reconnectManagerRef = useRef(undefined);
|
|
29
30
|
const [data, setData] = useState();
|
|
30
31
|
const [error, setError] = useState(null);
|
|
31
|
-
const [
|
|
32
|
+
const [isError, setIsError] = useState(false);
|
|
33
|
+
const [isConnected, setIsConnected] = useState(false);
|
|
32
34
|
const wsUrl = useMemo(() => {
|
|
33
35
|
const base = context.baseUrl;
|
|
34
36
|
const wsBase = base.replace(/^http(s?):/, 'ws$1:');
|
|
@@ -40,8 +42,9 @@ export const useWebsocket = (path, options) => {
|
|
|
40
42
|
wsRef.current = new WebSocket(wsUrl);
|
|
41
43
|
wsRef.current.onopen = () => {
|
|
42
44
|
reconnectManagerRef.current?.recordSuccess();
|
|
43
|
-
|
|
45
|
+
setIsConnected(true);
|
|
44
46
|
setError(null);
|
|
47
|
+
setIsError(false);
|
|
45
48
|
if (queued.current.length > 0) {
|
|
46
49
|
queued.current.forEach((msg) => wsRef.current.send(serializeWSData(msg)));
|
|
47
50
|
queued.current = [];
|
|
@@ -49,22 +52,25 @@ export const useWebsocket = (path, options) => {
|
|
|
49
52
|
};
|
|
50
53
|
wsRef.current.onerror = () => {
|
|
51
54
|
setError(new Error('WebSocket error'));
|
|
55
|
+
setIsError(true);
|
|
52
56
|
};
|
|
53
57
|
wsRef.current.onclose = (evt) => {
|
|
54
58
|
wsRef.current = undefined;
|
|
55
|
-
|
|
59
|
+
setIsConnected(false);
|
|
56
60
|
if (manualClose.current) {
|
|
57
61
|
queued.current = [];
|
|
58
62
|
return;
|
|
59
63
|
}
|
|
60
64
|
if (evt.code !== 1000) {
|
|
61
65
|
setError(new Error(`WebSocket closed: ${evt.code} ${evt.reason || ''}`));
|
|
66
|
+
setIsError(true);
|
|
62
67
|
}
|
|
63
68
|
reconnectManagerRef.current?.recordFailure();
|
|
64
69
|
};
|
|
65
70
|
wsRef.current.onmessage = (event) => {
|
|
66
71
|
const payload = deserializeData(event.data);
|
|
67
|
-
|
|
72
|
+
// Use JSON memoization to prevent re-renders when data hasn't changed
|
|
73
|
+
setData((prev) => (prev !== undefined && jsonEqual(prev, payload) ? prev : payload));
|
|
68
74
|
if (handler.current) {
|
|
69
75
|
handler.current(payload);
|
|
70
76
|
}
|
|
@@ -100,7 +106,7 @@ export const useWebsocket = (path, options) => {
|
|
|
100
106
|
handler.current = undefined;
|
|
101
107
|
pending.current = [];
|
|
102
108
|
queued.current = [];
|
|
103
|
-
|
|
109
|
+
setIsConnected(false);
|
|
104
110
|
}, []);
|
|
105
111
|
useEffect(() => {
|
|
106
112
|
manualClose.current = false;
|
|
@@ -120,7 +126,10 @@ export const useWebsocket = (path, options) => {
|
|
|
120
126
|
};
|
|
121
127
|
}
|
|
122
128
|
}, [options?.signal, cleanup]);
|
|
123
|
-
const reset = () =>
|
|
129
|
+
const reset = () => {
|
|
130
|
+
setError(null);
|
|
131
|
+
setIsError(false);
|
|
132
|
+
};
|
|
124
133
|
const send = (data) => {
|
|
125
134
|
if (wsRef.current?.readyState === WebSocket.OPEN) {
|
|
126
135
|
wsRef.current.send(serializeWSData(data));
|
|
@@ -138,30 +147,55 @@ export const useWebsocket = (path, options) => {
|
|
|
138
147
|
cleanup();
|
|
139
148
|
};
|
|
140
149
|
return {
|
|
141
|
-
|
|
150
|
+
isConnected,
|
|
142
151
|
close,
|
|
143
152
|
data,
|
|
144
153
|
error,
|
|
154
|
+
isError,
|
|
145
155
|
send,
|
|
146
156
|
setHandler,
|
|
147
157
|
reset,
|
|
148
158
|
readyState: wsRef.current?.readyState ?? WebSocket.CLOSED,
|
|
149
159
|
};
|
|
150
160
|
};
|
|
151
|
-
|
|
161
|
+
/**
|
|
162
|
+
* Type-safe WebSocket hook for connecting to WebSocket routes.
|
|
163
|
+
*
|
|
164
|
+
* Provides automatic type inference for route inputs and outputs based on
|
|
165
|
+
* the WebSocketRouteRegistry generated from your routes.
|
|
166
|
+
*
|
|
167
|
+
* @template TRoute - WebSocket route key from WebSocketRouteRegistry (e.g., '/ws', '/chat')
|
|
168
|
+
*
|
|
169
|
+
* @example Simple WebSocket connection
|
|
170
|
+
* ```typescript
|
|
171
|
+
* const { isConnected, data, send } = useWebsocket('/ws');
|
|
172
|
+
*
|
|
173
|
+
* // Send typed data
|
|
174
|
+
* send({ message: 'Hello' }); // Fully typed based on route schema!
|
|
175
|
+
* ```
|
|
176
|
+
*
|
|
177
|
+
* @example WebSocket with query parameters
|
|
178
|
+
* ```typescript
|
|
179
|
+
* const { isConnected, data, send } = useWebsocket('/chat', {
|
|
180
|
+
* query: new URLSearchParams({ room: 'general' })
|
|
181
|
+
* });
|
|
182
|
+
* ```
|
|
183
|
+
*/
|
|
184
|
+
export function useWebsocket(route, options) {
|
|
152
185
|
const [data, setData] = useState();
|
|
153
|
-
const {
|
|
186
|
+
const { isConnected, close, send, setHandler, readyState, error, isError, reset } = useWebsocketInternal(route, options);
|
|
154
187
|
useEffect(() => {
|
|
155
188
|
setHandler(setData);
|
|
156
|
-
}, [
|
|
189
|
+
}, [route, setHandler]);
|
|
157
190
|
return {
|
|
158
|
-
|
|
191
|
+
isConnected,
|
|
159
192
|
close,
|
|
160
193
|
data,
|
|
161
194
|
error,
|
|
195
|
+
isError,
|
|
162
196
|
reset,
|
|
163
197
|
send,
|
|
164
198
|
readyState,
|
|
165
199
|
};
|
|
166
|
-
}
|
|
200
|
+
}
|
|
167
201
|
//# sourceMappingURL=websocket.js.map
|
package/dist/websocket.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,UAAU,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAEtF,OAAO,EAAE,gBAAgB,EAAE,MAAM,WAAW,CAAC;AAC7C,OAAO,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;
|
|
1
|
+
{"version":3,"file":"websocket.js","sourceRoot":"","sources":["../src/websocket.ts"],"names":[],"mappings":"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"}
|