@convex-dev/persistent-text-streaming 0.2.1 → 0.2.3-alpha.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/commonjs/react/index.d.ts +4 -1
- package/dist/commonjs/react/index.d.ts.map +1 -1
- package/dist/commonjs/react/index.js +9 -4
- package/dist/commonjs/react/index.js.map +1 -1
- package/dist/esm/react/index.d.ts +4 -1
- package/dist/esm/react/index.d.ts.map +1 -1
- package/dist/esm/react/index.js +9 -4
- package/dist/esm/react/index.js.map +1 -1
- package/package.json +3 -3
- package/src/react/index.ts +25 -8
|
@@ -19,5 +19,8 @@ import { FunctionReference } from "convex/server";
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function useStream(getPersistentBody: FunctionReference<"query", "public", {
|
|
21
21
|
streamId: string;
|
|
22
|
-
}, StreamBody>, streamUrl: URL, driven: boolean, streamId
|
|
22
|
+
}, StreamBody>, streamUrl: URL, driven: boolean, streamId: StreamId | undefined, opts?: {
|
|
23
|
+
authToken?: string | null;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
}): StreamBody;
|
|
23
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAMlD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CACvB,iBAAiB,EAAE,iBAAiB,CAClC,OAAO,EACP,QAAQ,EACR;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EACpB,UAAU,CACX,EACD,SAAS,EAAE,GAAG,EACd,MAAM,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAMlD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CACvB,iBAAiB,EAAE,iBAAiB,CAClC,OAAO,EACP,QAAQ,EACR;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EACpB,UAAU,CACX,EACD,SAAS,EAAE,GAAG,EACd,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,IAAI,CAAC,EAAE;IAEL,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,cA0EF"}
|
|
@@ -21,7 +21,7 @@ if (typeof window === "undefined") {
|
|
|
21
21
|
* `pending`.
|
|
22
22
|
* @returns The body and status of the stream.
|
|
23
23
|
*/
|
|
24
|
-
export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
24
|
+
export function useStream(getPersistentBody, streamUrl, driven, streamId, opts) {
|
|
25
25
|
const [streamEnded, setStreamEnded] = useState(null);
|
|
26
26
|
// Used to prevent strict mode from causing multiple streams to be started.
|
|
27
27
|
const streamStarted = useRef(false);
|
|
@@ -38,7 +38,7 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
|
38
38
|
return false;
|
|
39
39
|
}, [driven, streamId, streamEnded]);
|
|
40
40
|
// console.log("usePersistence", usePersistence);
|
|
41
|
-
const persistentBody = useQuery(getPersistentBody, usePersistence && streamId ? { streamId
|
|
41
|
+
const persistentBody = useQuery(getPersistentBody, usePersistence && streamId ? { streamId } : "skip");
|
|
42
42
|
const [streamBody, setStreamBody] = useState("");
|
|
43
43
|
useEffect(() => {
|
|
44
44
|
if (driven && streamId && !streamStarted.current) {
|
|
@@ -46,6 +46,11 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
|
46
46
|
void (async () => {
|
|
47
47
|
const success = await startStreaming(streamUrl, streamId, (text) => {
|
|
48
48
|
setStreamBody((prev) => prev + text);
|
|
49
|
+
}, {
|
|
50
|
+
...opts?.headers,
|
|
51
|
+
...(opts?.authToken
|
|
52
|
+
? { Authorization: `Bearer ${opts.authToken}` }
|
|
53
|
+
: {}),
|
|
49
54
|
});
|
|
50
55
|
setStreamEnded(success);
|
|
51
56
|
})();
|
|
@@ -91,13 +96,13 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
|
91
96
|
* CORS fails, or an exception is raised, or the stream is already running
|
|
92
97
|
* or finished, etc.
|
|
93
98
|
*/
|
|
94
|
-
async function startStreaming(url, streamId, onUpdate) {
|
|
99
|
+
async function startStreaming(url, streamId, onUpdate, headers) {
|
|
95
100
|
const response = await fetch(url, {
|
|
96
101
|
method: "POST",
|
|
97
102
|
body: JSON.stringify({
|
|
98
103
|
streamId: streamId,
|
|
99
104
|
}),
|
|
100
|
-
headers: { "Content-Type": "application/json" },
|
|
105
|
+
headers: { "Content-Type": "application/json", ...headers },
|
|
101
106
|
});
|
|
102
107
|
// Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams
|
|
103
108
|
if (response.status === 205) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAIb,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG7D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;CAC5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,SAAS,CACvB,iBAKC,EACD,SAAc,EACd,MAAe,EACf,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -19,5 +19,8 @@ import { FunctionReference } from "convex/server";
|
|
|
19
19
|
*/
|
|
20
20
|
export declare function useStream(getPersistentBody: FunctionReference<"query", "public", {
|
|
21
21
|
streamId: string;
|
|
22
|
-
}, StreamBody>, streamUrl: URL, driven: boolean, streamId
|
|
22
|
+
}, StreamBody>, streamUrl: URL, driven: boolean, streamId: StreamId | undefined, opts?: {
|
|
23
|
+
authToken?: string | null;
|
|
24
|
+
headers?: Record<string, string>;
|
|
25
|
+
}): StreamBody;
|
|
23
26
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAMlD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CACvB,iBAAiB,EAAE,iBAAiB,CAClC,OAAO,EACP,QAAQ,EACR;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EACpB,UAAU,CACX,EACD,SAAS,EAAE,GAAG,EACd,MAAM,EAAE,OAAO,EACf,QAAQ,CAAC,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,WAAW,CAAC;AAEjD,OAAO,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAMlD;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,SAAS,CACvB,iBAAiB,EAAE,iBAAiB,CAClC,OAAO,EACP,QAAQ,EACR;IAAE,QAAQ,EAAE,MAAM,CAAA;CAAE,EACpB,UAAU,CACX,EACD,SAAS,EAAE,GAAG,EACd,MAAM,EAAE,OAAO,EACf,QAAQ,EAAE,QAAQ,GAAG,SAAS,EAC9B,IAAI,CAAC,EAAE;IAEL,SAAS,CAAC,EAAE,MAAM,GAAG,IAAI,CAAC;IAE1B,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;CAClC,cA0EF"}
|
package/dist/esm/react/index.js
CHANGED
|
@@ -21,7 +21,7 @@ if (typeof window === "undefined") {
|
|
|
21
21
|
* `pending`.
|
|
22
22
|
* @returns The body and status of the stream.
|
|
23
23
|
*/
|
|
24
|
-
export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
24
|
+
export function useStream(getPersistentBody, streamUrl, driven, streamId, opts) {
|
|
25
25
|
const [streamEnded, setStreamEnded] = useState(null);
|
|
26
26
|
// Used to prevent strict mode from causing multiple streams to be started.
|
|
27
27
|
const streamStarted = useRef(false);
|
|
@@ -38,7 +38,7 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
|
38
38
|
return false;
|
|
39
39
|
}, [driven, streamId, streamEnded]);
|
|
40
40
|
// console.log("usePersistence", usePersistence);
|
|
41
|
-
const persistentBody = useQuery(getPersistentBody, usePersistence && streamId ? { streamId
|
|
41
|
+
const persistentBody = useQuery(getPersistentBody, usePersistence && streamId ? { streamId } : "skip");
|
|
42
42
|
const [streamBody, setStreamBody] = useState("");
|
|
43
43
|
useEffect(() => {
|
|
44
44
|
if (driven && streamId && !streamStarted.current) {
|
|
@@ -46,6 +46,11 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
|
46
46
|
void (async () => {
|
|
47
47
|
const success = await startStreaming(streamUrl, streamId, (text) => {
|
|
48
48
|
setStreamBody((prev) => prev + text);
|
|
49
|
+
}, {
|
|
50
|
+
...opts?.headers,
|
|
51
|
+
...(opts?.authToken
|
|
52
|
+
? { Authorization: `Bearer ${opts.authToken}` }
|
|
53
|
+
: {}),
|
|
49
54
|
});
|
|
50
55
|
setStreamEnded(success);
|
|
51
56
|
})();
|
|
@@ -91,13 +96,13 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId) {
|
|
|
91
96
|
* CORS fails, or an exception is raised, or the stream is already running
|
|
92
97
|
* or finished, etc.
|
|
93
98
|
*/
|
|
94
|
-
async function startStreaming(url, streamId, onUpdate) {
|
|
99
|
+
async function startStreaming(url, streamId, onUpdate, headers) {
|
|
95
100
|
const response = await fetch(url, {
|
|
96
101
|
method: "POST",
|
|
97
102
|
body: JSON.stringify({
|
|
98
103
|
streamId: streamId,
|
|
99
104
|
}),
|
|
100
|
-
headers: { "Content-Type": "application/json" },
|
|
105
|
+
headers: { "Content-Type": "application/json", ...headers },
|
|
101
106
|
});
|
|
102
107
|
// Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams
|
|
103
108
|
if (response.status === 205) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"AAAA,YAAY,CAAC;AAIb,OAAO,EAAE,QAAQ,EAAE,MAAM,cAAc,CAAC;AAExC,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,OAAO,CAAC;AAG7D,IAAI,OAAO,MAAM,KAAK,WAAW,EAAE;IACjC,MAAM,IAAI,KAAK,CAAC,yDAAyD,CAAC,CAAC;CAC5E;AAED;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,SAAS,CACvB,iBAKC,EACD,SAAc,EACd,MAAe,EACf,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/react/index.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -7,7 +7,7 @@
|
|
|
7
7
|
"email": "support@convex.dev",
|
|
8
8
|
"url": "https://github.com/get-convex/persistent-text-streaming/issues"
|
|
9
9
|
},
|
|
10
|
-
"version": "0.2.
|
|
10
|
+
"version": "0.2.3-alpha.0",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"convex",
|
|
@@ -70,8 +70,8 @@
|
|
|
70
70
|
},
|
|
71
71
|
"peerDependencies": {
|
|
72
72
|
"convex": ">=1.23.0 <1.35.0",
|
|
73
|
-
"react": "~18.3.1 ||
|
|
74
|
-
"react-dom": "~18.3.1 ||
|
|
73
|
+
"react": "~18.3.1 || ^19.0.0",
|
|
74
|
+
"react-dom": "~18.3.1 || ^19.0.0"
|
|
75
75
|
},
|
|
76
76
|
"devDependencies": {
|
|
77
77
|
"@eslint/js": "^9.9.1",
|
package/src/react/index.ts
CHANGED
|
@@ -37,7 +37,13 @@ export function useStream(
|
|
|
37
37
|
>,
|
|
38
38
|
streamUrl: URL,
|
|
39
39
|
driven: boolean,
|
|
40
|
-
streamId
|
|
40
|
+
streamId: StreamId | undefined,
|
|
41
|
+
opts?: {
|
|
42
|
+
// If provided, this will be passed as the Authorization header.
|
|
43
|
+
authToken?: string | null;
|
|
44
|
+
// If provided, these will be passed as additional headers.
|
|
45
|
+
headers?: Record<string, string>;
|
|
46
|
+
}
|
|
41
47
|
) {
|
|
42
48
|
const [streamEnded, setStreamEnded] = useState(null as boolean | null);
|
|
43
49
|
|
|
@@ -56,10 +62,10 @@ export function useStream(
|
|
|
56
62
|
// Otherwise, we'll try to drive the stream and use the HTTP response.
|
|
57
63
|
return false;
|
|
58
64
|
}, [driven, streamId, streamEnded]);
|
|
59
|
-
// console.log("usePersistence", usePersistence);
|
|
65
|
+
// console.log("usePersistence", usePersistence);
|
|
60
66
|
const persistentBody = useQuery(
|
|
61
67
|
getPersistentBody,
|
|
62
|
-
usePersistence && streamId ? { streamId
|
|
68
|
+
usePersistence && streamId ? { streamId } : "skip"
|
|
63
69
|
);
|
|
64
70
|
const [streamBody, setStreamBody] = useState<string>("");
|
|
65
71
|
|
|
@@ -67,9 +73,19 @@ export function useStream(
|
|
|
67
73
|
if (driven && streamId && !streamStarted.current) {
|
|
68
74
|
// Kick off HTTP action.
|
|
69
75
|
void (async () => {
|
|
70
|
-
const success = await startStreaming(
|
|
71
|
-
|
|
72
|
-
|
|
76
|
+
const success = await startStreaming(
|
|
77
|
+
streamUrl,
|
|
78
|
+
streamId,
|
|
79
|
+
(text) => {
|
|
80
|
+
setStreamBody((prev) => prev + text);
|
|
81
|
+
},
|
|
82
|
+
{
|
|
83
|
+
...opts?.headers,
|
|
84
|
+
...(opts?.authToken
|
|
85
|
+
? { Authorization: `Bearer ${opts.authToken}` }
|
|
86
|
+
: {}),
|
|
87
|
+
}
|
|
88
|
+
);
|
|
73
89
|
setStreamEnded(success);
|
|
74
90
|
})();
|
|
75
91
|
// If we get remounted, we don't want to start a new stream.
|
|
@@ -119,14 +135,15 @@ export function useStream(
|
|
|
119
135
|
async function startStreaming(
|
|
120
136
|
url: URL,
|
|
121
137
|
streamId: StreamId,
|
|
122
|
-
onUpdate: (text: string) => void
|
|
138
|
+
onUpdate: (text: string) => void,
|
|
139
|
+
headers: Record<string, string>
|
|
123
140
|
) {
|
|
124
141
|
const response = await fetch(url, {
|
|
125
142
|
method: "POST",
|
|
126
143
|
body: JSON.stringify({
|
|
127
144
|
streamId: streamId,
|
|
128
145
|
}),
|
|
129
|
-
headers: { "Content-Type": "application/json" },
|
|
146
|
+
headers: { "Content-Type": "application/json", ...headers },
|
|
130
147
|
});
|
|
131
148
|
// Adapted from https://developer.mozilla.org/en-US/docs/Web/API/Streams_API/Using_readable_streams
|
|
132
149
|
if (response.status === 205) {
|