@convex-dev/persistent-text-streaming 0.2.4 → 0.3.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/README.md +37 -35
- package/dist/{commonjs/client → client}/index.d.ts +12 -4
- package/dist/client/index.d.ts.map +1 -0
- package/dist/{esm/client → client}/index.js +13 -0
- package/dist/client/index.js.map +1 -0
- package/dist/component/_generated/api.d.ts +36 -0
- package/dist/component/_generated/api.d.ts.map +1 -0
- package/{src → dist}/component/_generated/api.js +11 -3
- package/dist/component/_generated/api.js.map +1 -0
- package/dist/component/_generated/component.d.ts +47 -0
- package/dist/component/_generated/component.d.ts.map +1 -0
- package/dist/component/_generated/component.js +11 -0
- package/dist/component/_generated/component.js.map +1 -0
- package/dist/component/_generated/dataModel.d.ts +46 -0
- package/dist/component/_generated/dataModel.d.ts.map +1 -0
- package/dist/component/_generated/dataModel.js +11 -0
- package/dist/component/_generated/dataModel.js.map +1 -0
- package/{src → dist}/component/_generated/server.d.ts +10 -38
- package/dist/component/_generated/server.d.ts.map +1 -0
- package/dist/{commonjs/component → component}/_generated/server.js +9 -5
- package/dist/component/_generated/server.js.map +1 -0
- package/dist/component/convex.config.d.ts.map +1 -0
- package/dist/component/convex.config.js.map +1 -0
- package/dist/component/crons.d.ts.map +1 -0
- package/dist/{commonjs/component → component}/crons.js +1 -1
- package/dist/component/crons.js.map +1 -0
- package/dist/{commonjs/component → component}/lib.d.ts +7 -0
- package/dist/component/lib.d.ts.map +1 -0
- package/dist/{commonjs/component → component}/lib.js +45 -2
- package/dist/component/lib.js.map +1 -0
- package/dist/{commonjs/component → component}/schema.d.ts +1 -1
- package/dist/component/schema.d.ts.map +1 -0
- package/dist/component/schema.js.map +1 -0
- package/dist/{commonjs/react → react}/index.d.ts +2 -2
- package/dist/react/index.d.ts.map +1 -0
- package/dist/{commonjs/react → react}/index.js +10 -2
- package/dist/react/index.js.map +1 -0
- package/package.json +68 -54
- package/src/client/index.ts +29 -13
- package/src/component/_generated/api.ts +52 -0
- package/src/component/_generated/component.ts +70 -0
- package/src/component/_generated/{dataModel.d.ts → dataModel.ts} +1 -1
- package/src/component/_generated/server.ts +156 -0
- package/src/component/crons.ts +2 -2
- package/src/component/lib.ts +51 -4
- package/src/component/schema.ts +2 -2
- package/src/react/index.ts +17 -9
- package/src/test.ts +18 -0
- package/dist/commonjs/client/index.d.ts.map +0 -1
- package/dist/commonjs/client/index.js +0 -146
- package/dist/commonjs/client/index.js.map +0 -1
- package/dist/commonjs/component/_generated/api.d.ts +0 -12
- package/dist/commonjs/component/_generated/api.d.ts.map +0 -1
- package/dist/commonjs/component/_generated/api.js +0 -22
- package/dist/commonjs/component/_generated/api.js.map +0 -1
- package/dist/commonjs/component/_generated/server.d.ts +0 -64
- package/dist/commonjs/component/_generated/server.d.ts.map +0 -1
- package/dist/commonjs/component/_generated/server.js.map +0 -1
- package/dist/commonjs/component/convex.config.d.ts.map +0 -1
- package/dist/commonjs/component/convex.config.js.map +0 -1
- package/dist/commonjs/component/crons.d.ts.map +0 -1
- package/dist/commonjs/component/crons.js.map +0 -1
- package/dist/commonjs/component/lib.d.ts.map +0 -1
- package/dist/commonjs/component/lib.js.map +0 -1
- package/dist/commonjs/component/schema.d.ts.map +0 -1
- package/dist/commonjs/component/schema.js.map +0 -1
- package/dist/commonjs/package.json +0 -3
- package/dist/commonjs/react/index.d.ts.map +0 -1
- package/dist/commonjs/react/index.js.map +0 -1
- package/dist/esm/client/index.d.ts +0 -89
- package/dist/esm/client/index.d.ts.map +0 -1
- package/dist/esm/client/index.js.map +0 -1
- package/dist/esm/component/_generated/api.d.ts +0 -12
- package/dist/esm/component/_generated/api.d.ts.map +0 -1
- package/dist/esm/component/_generated/api.js +0 -22
- package/dist/esm/component/_generated/api.js.map +0 -1
- package/dist/esm/component/_generated/server.d.ts +0 -64
- package/dist/esm/component/_generated/server.d.ts.map +0 -1
- package/dist/esm/component/_generated/server.js +0 -74
- package/dist/esm/component/_generated/server.js.map +0 -1
- package/dist/esm/component/convex.config.d.ts +0 -3
- package/dist/esm/component/convex.config.d.ts.map +0 -1
- package/dist/esm/component/convex.config.js +0 -3
- package/dist/esm/component/convex.config.js.map +0 -1
- package/dist/esm/component/crons.d.ts +0 -3
- package/dist/esm/component/crons.d.ts.map +0 -1
- package/dist/esm/component/crons.js +0 -7
- package/dist/esm/component/crons.js.map +0 -1
- package/dist/esm/component/lib.d.ts +0 -21
- package/dist/esm/component/lib.d.ts.map +0 -1
- package/dist/esm/component/lib.js +0 -134
- package/dist/esm/component/lib.js.map +0 -1
- package/dist/esm/component/schema.d.ts +0 -23
- package/dist/esm/component/schema.d.ts.map +0 -1
- package/dist/esm/component/schema.js +0 -13
- package/dist/esm/component/schema.js.map +0 -1
- package/dist/esm/package.json +0 -3
- package/dist/esm/react/index.d.ts +0 -26
- package/dist/esm/react/index.d.ts.map +0 -1
- package/dist/esm/react/index.js +0 -133
- package/dist/esm/react/index.js.map +0 -1
- package/react/package.json +0 -5
- package/src/component/_generated/api.d.ts +0 -81
- package/src/component/_generated/server.js +0 -90
- /package/dist/{commonjs/component → component}/convex.config.d.ts +0 -0
- /package/dist/{commonjs/component → component}/convex.config.js +0 -0
- /package/dist/{commonjs/component → component}/crons.d.ts +0 -0
- /package/dist/{commonjs/component → component}/schema.js +0 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.d.ts","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"AAOA,eAAO,MAAM,YAAY,iHAQvB,CAAC;AAKH,eAAO,MAAM,QAAQ;;;;iBA4BnB,CAAC;AAIH,eAAO,MAAM,eAAe;;;iBA2B1B,CAAC;AAGH,eAAO,MAAM,eAAe;;mEAS1B,CAAC;AAIH,eAAO,MAAM,aAAa;;;;;GA0BxB,CAAC;AAQH,eAAO,MAAM,YAAY;;iBAgBvB,CAAC;AAGH,eAAO,MAAM,iBAAiB;;;iBAqB5B,CAAC;AAIH,eAAO,MAAM,qBAAqB,2EAsBhC,CAAC"}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { paginator } from "convex-helpers/server/pagination";
|
|
1
2
|
import { v } from "convex/values";
|
|
2
|
-
import {
|
|
3
|
-
import {
|
|
3
|
+
import { internal } from "./_generated/api.js";
|
|
4
|
+
import { internalMutation, mutation, query } from "./_generated/server.js";
|
|
5
|
+
import schema, { streamStatusValidator } from "./schema.js";
|
|
4
6
|
// Create a new stream with zero chunks.
|
|
5
7
|
export const createStream = mutation({
|
|
6
8
|
args: {},
|
|
@@ -107,6 +109,47 @@ export const getStreamText = query({
|
|
|
107
109
|
});
|
|
108
110
|
const EXPIRATION_TIME = 20 * 60 * 1000; // 20 minutes in milliseconds
|
|
109
111
|
const BATCH_SIZE = 100;
|
|
112
|
+
const DELETE_BATCH_SIZE = 64;
|
|
113
|
+
// Delete a stream and all its chunks.
|
|
114
|
+
// The stream is deleted immediately; chunks are cleaned up asynchronously.
|
|
115
|
+
export const deleteStream = mutation({
|
|
116
|
+
args: {
|
|
117
|
+
streamId: v.id("streams"),
|
|
118
|
+
},
|
|
119
|
+
returns: v.null(),
|
|
120
|
+
handler: async (ctx, args) => {
|
|
121
|
+
const stream = await ctx.db.get(args.streamId);
|
|
122
|
+
if (!stream) {
|
|
123
|
+
throw new Error(`Stream ${args.streamId} not found`);
|
|
124
|
+
}
|
|
125
|
+
await ctx.db.delete(args.streamId);
|
|
126
|
+
await ctx.scheduler.runAfter(0, internal.lib._deleteChunksPage, {
|
|
127
|
+
streamId: args.streamId,
|
|
128
|
+
cursor: null,
|
|
129
|
+
});
|
|
130
|
+
},
|
|
131
|
+
});
|
|
132
|
+
// Internal: delete a page of chunks for a deleted stream, re-scheduling if more remain.
|
|
133
|
+
export const _deleteChunksPage = internalMutation({
|
|
134
|
+
args: {
|
|
135
|
+
streamId: v.id("streams"),
|
|
136
|
+
cursor: v.union(v.string(), v.null()),
|
|
137
|
+
},
|
|
138
|
+
returns: v.null(),
|
|
139
|
+
handler: async (ctx, args) => {
|
|
140
|
+
const result = await paginator(ctx.db, schema)
|
|
141
|
+
.query("chunks")
|
|
142
|
+
.withIndex("byStream", (q) => q.eq("streamId", args.streamId))
|
|
143
|
+
.paginate({ cursor: args.cursor, numItems: DELETE_BATCH_SIZE });
|
|
144
|
+
await Promise.all(result.page.map((chunk) => ctx.db.delete(chunk._id)));
|
|
145
|
+
if (!result.isDone) {
|
|
146
|
+
await ctx.scheduler.runAfter(0, internal.lib._deleteChunksPage, {
|
|
147
|
+
streamId: args.streamId,
|
|
148
|
+
cursor: result.continueCursor,
|
|
149
|
+
});
|
|
150
|
+
}
|
|
151
|
+
},
|
|
152
|
+
});
|
|
110
153
|
// If the last chunk of a stream was added more than 20 minutes ago,
|
|
111
154
|
// set the stream to timeout. The action feeding it has to be dead.
|
|
112
155
|
export const cleanupExpiredStreams = internalMutation({
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import { Infer } from "convex/values";
|
|
1
|
+
import { type Infer } from "convex/values";
|
|
2
2
|
export declare const streamStatusValidator: import("convex/values").VUnion<"pending" | "streaming" | "done" | "error" | "timeout", [import("convex/values").VLiteral<"pending", "required">, import("convex/values").VLiteral<"streaming", "required">, import("convex/values").VLiteral<"done", "required">, import("convex/values").VLiteral<"error", "required">, import("convex/values").VLiteral<"timeout", "required">], "required", never>;
|
|
3
3
|
export type StreamStatus = Infer<typeof streamStatusValidator>;
|
|
4
4
|
declare const _default: import("convex/server").SchemaDefinition<{
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.d.ts","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AACA,OAAO,EAAK,KAAK,KAAK,EAAE,MAAM,eAAe,CAAC;AAE9C,eAAO,MAAM,qBAAqB,uYAMjC,CAAC;AACF,MAAM,MAAM,YAAY,GAAG,KAAK,CAAC,OAAO,qBAAqB,CAAC,CAAC;;;;;;;;;;;;;;;;;;;AAE/D,wBAQG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"schema.js","sourceRoot":"","sources":["../../src/component/schema.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAC1D,OAAO,EAAE,CAAC,EAAc,MAAM,eAAe,CAAC;AAE9C,MAAM,CAAC,MAAM,qBAAqB,GAAG,CAAC,CAAC,KAAK,CAC1C,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,EACpB,CAAC,CAAC,OAAO,CAAC,WAAW,CAAC,EACtB,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,EACjB,CAAC,CAAC,OAAO,CAAC,OAAO,CAAC,EAClB,CAAC,CAAC,OAAO,CAAC,SAAS,CAAC,CACrB,CAAC;AAGF,eAAe,YAAY,CAAC;IAC1B,OAAO,EAAE,WAAW,CAAC;QACnB,MAAM,EAAE,qBAAqB;KAC9B,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,QAAQ,CAAC,CAAC;IAChC,MAAM,EAAE,WAAW,CAAC;QAClB,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;KACjB,CAAC,CAAC,KAAK,CAAC,UAAU,EAAE,CAAC,UAAU,CAAC,CAAC;CACnC,CAAC,CAAC"}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
|
-
import { StreamBody, StreamId } from "../client";
|
|
2
|
-
import { FunctionReference } from "convex/server";
|
|
1
|
+
import type { StreamBody, StreamId } from "../client/index.js";
|
|
2
|
+
import type { FunctionReference } from "convex/server";
|
|
3
3
|
/**
|
|
4
4
|
* React hook for persistent text streaming.
|
|
5
5
|
*
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/react/index.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,EAAE,UAAU,EAAE,QAAQ,EAAE,MAAM,oBAAoB,CAAC;AAE/D,OAAO,KAAK,EAAE,iBAAiB,EAAE,MAAM,eAAe,CAAC;AAEvD;;;;;;;;;;;;;;;;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,cAkFF"}
|
|
@@ -33,7 +33,7 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId, opts)
|
|
|
33
33
|
}
|
|
34
34
|
// Otherwise, we'll try to drive the stream and use the HTTP response.
|
|
35
35
|
return false;
|
|
36
|
-
}, [driven,
|
|
36
|
+
}, [driven, streamEnded]);
|
|
37
37
|
// console.log("usePersistence", usePersistence);
|
|
38
38
|
const persistentBody = useQuery(getPersistentBody, usePersistence && streamId ? { streamId } : "skip");
|
|
39
39
|
const [streamBody, setStreamBody] = useState("");
|
|
@@ -56,7 +56,15 @@ export function useStream(getPersistentBody, streamUrl, driven, streamId, opts)
|
|
|
56
56
|
streamStarted.current = true;
|
|
57
57
|
};
|
|
58
58
|
}
|
|
59
|
-
|
|
59
|
+
// eslint-disable-next-line react-hooks/exhaustive-deps
|
|
60
|
+
}, [
|
|
61
|
+
driven,
|
|
62
|
+
streamUrl,
|
|
63
|
+
streamId,
|
|
64
|
+
setStreamEnded,
|
|
65
|
+
streamStarted,
|
|
66
|
+
opts?.authToken,
|
|
67
|
+
]);
|
|
60
68
|
const body = useMemo(() => {
|
|
61
69
|
// console.log(
|
|
62
70
|
// "body info p vs. s",
|
|
@@ -0,0 +1 @@
|
|
|
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.
|
|
10
|
+
"version": "0.3.1",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"convex",
|
|
@@ -15,77 +15,91 @@
|
|
|
15
15
|
],
|
|
16
16
|
"type": "module",
|
|
17
17
|
"scripts": {
|
|
18
|
-
"
|
|
19
|
-
"
|
|
20
|
-
"
|
|
21
|
-
"dev": "
|
|
22
|
-
"
|
|
23
|
-
"
|
|
24
|
-
"
|
|
25
|
-
"
|
|
26
|
-
"
|
|
27
|
-
"
|
|
28
|
-
"
|
|
18
|
+
"dev": "run-p -r 'dev:*'",
|
|
19
|
+
"dev:backend": "convex dev --typecheck-components",
|
|
20
|
+
"dev:frontend": "cd example && vite --clearScreen false",
|
|
21
|
+
"dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial",
|
|
22
|
+
"predev": "convex init && npm run build",
|
|
23
|
+
"build": "tsc --project ./tsconfig.build.json",
|
|
24
|
+
"build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
|
|
25
|
+
"build:clean": "rm -rf dist *.tsbuildinfo && npm run build:codegen",
|
|
26
|
+
"typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
|
|
27
|
+
"lint": "eslint .",
|
|
28
|
+
"all": "run-p -r 'dev:*' 'test:watch'",
|
|
29
|
+
"test": "vitest run --typecheck",
|
|
30
|
+
"test:watch": "vitest --typecheck --clearScreen false",
|
|
29
31
|
"test:debug": "vitest --inspect-brk --no-file-parallelism",
|
|
30
|
-
"test:coverage": "vitest run --coverage --coverage.reporter=text"
|
|
32
|
+
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
33
|
+
"preversion": "npm ci && npm run build:clean && run-p test lint typecheck",
|
|
34
|
+
"alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
|
|
35
|
+
"release": "npm version patch && npm publish && git push --follow-tags",
|
|
36
|
+
"version": "(npm whoami || npm login) && vim -c 'normal o' -c 'normal o## '$npm_package_version CHANGELOG.md && prettier -w CHANGELOG.md && git add CHANGELOG.md"
|
|
31
37
|
},
|
|
32
38
|
"files": [
|
|
33
39
|
"dist",
|
|
34
|
-
"src"
|
|
35
|
-
"react"
|
|
40
|
+
"src"
|
|
36
41
|
],
|
|
37
42
|
"exports": {
|
|
38
43
|
"./package.json": "./package.json",
|
|
39
44
|
".": {
|
|
40
|
-
"
|
|
41
|
-
|
|
42
|
-
"types": "./dist/esm/client/index.d.ts",
|
|
43
|
-
"default": "./dist/esm/client/index.js"
|
|
44
|
-
},
|
|
45
|
-
"require": {
|
|
46
|
-
"@convex-dev/component-source": "./src/client/index.ts",
|
|
47
|
-
"types": "./dist/commonjs/client/index.d.ts",
|
|
48
|
-
"default": "./dist/commonjs/client/index.js"
|
|
49
|
-
}
|
|
45
|
+
"types": "./dist/client/index.d.ts",
|
|
46
|
+
"default": "./dist/client/index.js"
|
|
50
47
|
},
|
|
51
48
|
"./react": {
|
|
52
|
-
"
|
|
53
|
-
|
|
54
|
-
|
|
55
|
-
|
|
56
|
-
|
|
57
|
-
"
|
|
58
|
-
"@convex-dev/component-source": "./src/react/index.ts",
|
|
59
|
-
"types": "./dist/commonjs/react/index.d.ts",
|
|
60
|
-
"default": "./dist/commonjs/react/index.js"
|
|
61
|
-
}
|
|
49
|
+
"types": "./dist/react/index.d.ts",
|
|
50
|
+
"default": "./dist/react/index.js"
|
|
51
|
+
},
|
|
52
|
+
"./test": "./src/test.ts",
|
|
53
|
+
"./_generated/component.js": {
|
|
54
|
+
"types": "./dist/component/_generated/component.d.ts"
|
|
62
55
|
},
|
|
63
56
|
"./convex.config": {
|
|
64
|
-
"
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
57
|
+
"types": "./dist/component/convex.config.d.ts",
|
|
58
|
+
"default": "./dist/component/convex.config.js"
|
|
59
|
+
},
|
|
60
|
+
"./convex.config.js": {
|
|
61
|
+
"types": "./dist/component/convex.config.d.ts",
|
|
62
|
+
"default": "./dist/component/convex.config.js"
|
|
69
63
|
}
|
|
70
64
|
},
|
|
71
65
|
"peerDependencies": {
|
|
72
|
-
"convex": "
|
|
66
|
+
"convex": "^1.32.0",
|
|
73
67
|
"react": "~18.3.1 || ^19.0.0",
|
|
74
68
|
"react-dom": "~18.3.1 || ^19.0.0"
|
|
75
69
|
},
|
|
76
70
|
"devDependencies": {
|
|
77
|
-
"@
|
|
78
|
-
"@
|
|
79
|
-
"@
|
|
80
|
-
"
|
|
81
|
-
"
|
|
82
|
-
"
|
|
83
|
-
"
|
|
84
|
-
"
|
|
85
|
-
"
|
|
86
|
-
"
|
|
71
|
+
"@edge-runtime/vm": "5.0.0",
|
|
72
|
+
"@eslint/eslintrc": "3.3.1",
|
|
73
|
+
"@eslint/js": "9.38.0",
|
|
74
|
+
"@tailwindcss/vite": "4.1.16",
|
|
75
|
+
"@types/node": "20.19.24",
|
|
76
|
+
"@types/react": "19.2.2",
|
|
77
|
+
"@types/react-dom": "19.2.2",
|
|
78
|
+
"@vitejs/plugin-react": "5.1.0",
|
|
79
|
+
"chokidar-cli": "3.0.0",
|
|
80
|
+
"clsx": "2.1.1",
|
|
81
|
+
"convex": "1.34.1",
|
|
82
|
+
"convex-test": "0.0.38",
|
|
83
|
+
"eslint": "9.39.1",
|
|
84
|
+
"eslint-plugin-react-hooks": "7.0.1",
|
|
85
|
+
"eslint-plugin-react-refresh": "0.4.24",
|
|
86
|
+
"globals": "15.15.0",
|
|
87
|
+
"npm-run-all2": "8.0.4",
|
|
88
|
+
"openai": "6.8.0",
|
|
89
|
+
"prettier": "3.6.2",
|
|
90
|
+
"react": "19.2.0",
|
|
91
|
+
"react-dom": "19.2.0",
|
|
92
|
+
"react-markdown": "10.1.0",
|
|
93
|
+
"tailwind-merge": "3.3.1",
|
|
94
|
+
"tailwindcss": "4.1.16",
|
|
95
|
+
"typescript": "5.9.3",
|
|
96
|
+
"typescript-eslint": "8.46.2",
|
|
97
|
+
"vite": "6.4.1",
|
|
98
|
+
"vitest": "3.2.4"
|
|
87
99
|
},
|
|
88
|
-
"
|
|
89
|
-
"
|
|
90
|
-
"
|
|
100
|
+
"types": "./dist/client/index.d.ts",
|
|
101
|
+
"module": "./dist/client/index.js",
|
|
102
|
+
"dependencies": {
|
|
103
|
+
"convex-helpers": "^0.1.114"
|
|
104
|
+
}
|
|
91
105
|
}
|
package/src/client/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import type {
|
|
2
2
|
Expand,
|
|
3
3
|
FunctionReference,
|
|
4
4
|
GenericActionCtx,
|
|
@@ -6,9 +6,9 @@ import {
|
|
|
6
6
|
GenericMutationCtx,
|
|
7
7
|
GenericQueryCtx,
|
|
8
8
|
} from "convex/server";
|
|
9
|
-
import {
|
|
10
|
-
import { api } from "../component/_generated/api";
|
|
11
|
-
import { StreamStatus } from "../component/schema";
|
|
9
|
+
import { v, type GenericId } from "convex/values";
|
|
10
|
+
import { api } from "../component/_generated/api.js";
|
|
11
|
+
import type { StreamStatus } from "../component/schema.js";
|
|
12
12
|
|
|
13
13
|
export type StreamId = string & { __isStreamId: true };
|
|
14
14
|
export const StreamIdValidator = v.string();
|
|
@@ -22,7 +22,7 @@ export type StreamWriter<A extends GenericActionCtx<GenericDataModel>> = (
|
|
|
22
22
|
ctx: A,
|
|
23
23
|
request: Request,
|
|
24
24
|
streamId: StreamId,
|
|
25
|
-
chunkAppender: ChunkAppender
|
|
25
|
+
chunkAppender: ChunkAppender,
|
|
26
26
|
) => Promise<void>;
|
|
27
27
|
|
|
28
28
|
// TODO -- make more flexible. # of bytes, etc?
|
|
@@ -34,7 +34,7 @@ const hasDelimeter = (text: string) => {
|
|
|
34
34
|
export class PersistentTextStreaming {
|
|
35
35
|
constructor(
|
|
36
36
|
public component: UseApi<typeof api>,
|
|
37
|
-
public options?: object
|
|
37
|
+
public options?: object,
|
|
38
38
|
) {}
|
|
39
39
|
|
|
40
40
|
/**
|
|
@@ -75,11 +75,11 @@ export class PersistentTextStreaming {
|
|
|
75
75
|
*/
|
|
76
76
|
async getStreamBody(
|
|
77
77
|
ctx: RunQueryCtx,
|
|
78
|
-
streamId: StreamId
|
|
78
|
+
streamId: StreamId,
|
|
79
79
|
): Promise<StreamBody> {
|
|
80
80
|
const { text, status } = await ctx.runQuery(
|
|
81
81
|
this.component.lib.getStreamText,
|
|
82
|
-
{ streamId }
|
|
82
|
+
{ streamId },
|
|
83
83
|
);
|
|
84
84
|
return { text, status: status as StreamStatus };
|
|
85
85
|
}
|
|
@@ -109,7 +109,7 @@ export class PersistentTextStreaming {
|
|
|
109
109
|
ctx: A,
|
|
110
110
|
request: Request,
|
|
111
111
|
streamId: StreamId,
|
|
112
|
-
streamWriter: StreamWriter<A
|
|
112
|
+
streamWriter: StreamWriter<A>,
|
|
113
113
|
) {
|
|
114
114
|
const streamState = await ctx.runQuery(this.component.lib.getStreamStatus, {
|
|
115
115
|
streamId,
|
|
@@ -122,7 +122,8 @@ export class PersistentTextStreaming {
|
|
|
122
122
|
}
|
|
123
123
|
// Create a TransformStream to handle streaming data
|
|
124
124
|
const { readable, writable } = new TransformStream();
|
|
125
|
-
let writer =
|
|
125
|
+
let writer =
|
|
126
|
+
writable.getWriter() as WritableStreamDefaultWriter<Uint8Array> | null;
|
|
126
127
|
const textEncoder = new TextEncoder();
|
|
127
128
|
let pending = "";
|
|
128
129
|
|
|
@@ -134,7 +135,9 @@ export class PersistentTextStreaming {
|
|
|
134
135
|
await writer.write(textEncoder.encode(text));
|
|
135
136
|
} catch (e) {
|
|
136
137
|
console.error("Error writing to stream", e);
|
|
137
|
-
console.error(
|
|
138
|
+
console.error(
|
|
139
|
+
"Will skip writing to stream but continue database updates",
|
|
140
|
+
);
|
|
138
141
|
writer = null;
|
|
139
142
|
}
|
|
140
143
|
}
|
|
@@ -170,12 +173,25 @@ export class PersistentTextStreaming {
|
|
|
170
173
|
return new Response(readable);
|
|
171
174
|
}
|
|
172
175
|
|
|
176
|
+
/**
|
|
177
|
+
* Delete a stream and all its chunks. Deletion happens asynchronously
|
|
178
|
+
* in batches, so this returns immediately.
|
|
179
|
+
*
|
|
180
|
+
* @param ctx - A convex context capable of running mutations.
|
|
181
|
+
* @param streamId - The ID of the stream to delete.
|
|
182
|
+
*/
|
|
183
|
+
async deleteStream(ctx: RunMutationCtx, streamId: StreamId): Promise<void> {
|
|
184
|
+
await ctx.runMutation(this.component.lib.deleteStream, {
|
|
185
|
+
streamId,
|
|
186
|
+
});
|
|
187
|
+
}
|
|
188
|
+
|
|
173
189
|
// Internal helper -- add a chunk to the stream.
|
|
174
190
|
private async addChunk(
|
|
175
191
|
ctx: RunMutationCtx,
|
|
176
192
|
streamId: StreamId,
|
|
177
193
|
text: string,
|
|
178
|
-
final: boolean
|
|
194
|
+
final: boolean,
|
|
179
195
|
) {
|
|
180
196
|
await ctx.runMutation(this.component.lib.addChunk, {
|
|
181
197
|
streamId,
|
|
@@ -188,7 +204,7 @@ export class PersistentTextStreaming {
|
|
|
188
204
|
private async setStreamStatus(
|
|
189
205
|
ctx: RunMutationCtx,
|
|
190
206
|
streamId: StreamId,
|
|
191
|
-
status: StreamStatus
|
|
207
|
+
status: StreamStatus,
|
|
192
208
|
) {
|
|
193
209
|
await ctx.runMutation(this.component.lib.setStreamStatus, {
|
|
194
210
|
streamId,
|
|
@@ -0,0 +1,52 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* Generated `api` utility.
|
|
4
|
+
*
|
|
5
|
+
* THIS CODE IS AUTOMATICALLY GENERATED.
|
|
6
|
+
*
|
|
7
|
+
* To regenerate, run `npx convex dev`.
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type * as crons from "../crons.js";
|
|
12
|
+
import type * as lib from "../lib.js";
|
|
13
|
+
|
|
14
|
+
import type {
|
|
15
|
+
ApiFromModules,
|
|
16
|
+
FilterApi,
|
|
17
|
+
FunctionReference,
|
|
18
|
+
} from "convex/server";
|
|
19
|
+
import { anyApi, componentsGeneric } from "convex/server";
|
|
20
|
+
|
|
21
|
+
const fullApi: ApiFromModules<{
|
|
22
|
+
crons: typeof crons;
|
|
23
|
+
lib: typeof lib;
|
|
24
|
+
}> = anyApi as any;
|
|
25
|
+
|
|
26
|
+
/**
|
|
27
|
+
* A utility for referencing Convex functions in your app's public API.
|
|
28
|
+
*
|
|
29
|
+
* Usage:
|
|
30
|
+
* ```js
|
|
31
|
+
* const myFunctionReference = api.myModule.myFunction;
|
|
32
|
+
* ```
|
|
33
|
+
*/
|
|
34
|
+
export const api: FilterApi<
|
|
35
|
+
typeof fullApi,
|
|
36
|
+
FunctionReference<any, "public">
|
|
37
|
+
> = anyApi as any;
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* A utility for referencing Convex functions in your app's internal API.
|
|
41
|
+
*
|
|
42
|
+
* Usage:
|
|
43
|
+
* ```js
|
|
44
|
+
* const myFunctionReference = internal.myModule.myFunction;
|
|
45
|
+
* ```
|
|
46
|
+
*/
|
|
47
|
+
export const internal: FilterApi<
|
|
48
|
+
typeof fullApi,
|
|
49
|
+
FunctionReference<any, "internal">
|
|
50
|
+
> = anyApi as any;
|
|
51
|
+
|
|
52
|
+
export const components = componentsGeneric() as unknown as {};
|
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/* eslint-disable */
|
|
2
|
+
/**
|
|
3
|
+
* Generated `ComponentApi` utility.
|
|
4
|
+
*
|
|
5
|
+
* THIS CODE IS AUTOMATICALLY GENERATED.
|
|
6
|
+
*
|
|
7
|
+
* To regenerate, run `npx convex dev`.
|
|
8
|
+
* @module
|
|
9
|
+
*/
|
|
10
|
+
|
|
11
|
+
import type { FunctionReference } from "convex/server";
|
|
12
|
+
|
|
13
|
+
/**
|
|
14
|
+
* A utility for referencing a Convex component's exposed API.
|
|
15
|
+
*
|
|
16
|
+
* Useful when expecting a parameter like `components.myComponent`.
|
|
17
|
+
* Usage:
|
|
18
|
+
* ```ts
|
|
19
|
+
* async function myFunction(ctx: QueryCtx, component: ComponentApi) {
|
|
20
|
+
* return ctx.runQuery(component.someFile.someQuery, { ...args });
|
|
21
|
+
* }
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export type ComponentApi<Name extends string | undefined = string | undefined> =
|
|
25
|
+
{
|
|
26
|
+
lib: {
|
|
27
|
+
addChunk: FunctionReference<
|
|
28
|
+
"mutation",
|
|
29
|
+
"internal",
|
|
30
|
+
{ final: boolean; streamId: string; text: string },
|
|
31
|
+
any,
|
|
32
|
+
Name
|
|
33
|
+
>;
|
|
34
|
+
createStream: FunctionReference<"mutation", "internal", {}, any, Name>;
|
|
35
|
+
deleteStream: FunctionReference<
|
|
36
|
+
"mutation",
|
|
37
|
+
"internal",
|
|
38
|
+
{ streamId: string },
|
|
39
|
+
null,
|
|
40
|
+
Name
|
|
41
|
+
>;
|
|
42
|
+
getStreamStatus: FunctionReference<
|
|
43
|
+
"query",
|
|
44
|
+
"internal",
|
|
45
|
+
{ streamId: string },
|
|
46
|
+
"pending" | "streaming" | "done" | "error" | "timeout",
|
|
47
|
+
Name
|
|
48
|
+
>;
|
|
49
|
+
getStreamText: FunctionReference<
|
|
50
|
+
"query",
|
|
51
|
+
"internal",
|
|
52
|
+
{ streamId: string },
|
|
53
|
+
{
|
|
54
|
+
status: "pending" | "streaming" | "done" | "error" | "timeout";
|
|
55
|
+
text: string;
|
|
56
|
+
},
|
|
57
|
+
Name
|
|
58
|
+
>;
|
|
59
|
+
setStreamStatus: FunctionReference<
|
|
60
|
+
"mutation",
|
|
61
|
+
"internal",
|
|
62
|
+
{
|
|
63
|
+
status: "pending" | "streaming" | "done" | "error" | "timeout";
|
|
64
|
+
streamId: string;
|
|
65
|
+
},
|
|
66
|
+
any,
|
|
67
|
+
Name
|
|
68
|
+
>;
|
|
69
|
+
};
|
|
70
|
+
};
|
|
@@ -38,7 +38,7 @@ export type Doc<TableName extends TableNames> = DocumentByName<
|
|
|
38
38
|
* Convex documents are uniquely identified by their `Id`, which is accessible
|
|
39
39
|
* on the `_id` field. To learn more, see [Document IDs](https://docs.convex.dev/using/document-ids).
|
|
40
40
|
*
|
|
41
|
-
* Documents can be loaded using `db.get(id)` in query and mutation functions.
|
|
41
|
+
* Documents can be loaded using `db.get(tableName, id)` in query and mutation functions.
|
|
42
42
|
*
|
|
43
43
|
* IDs are just strings at runtime, but this type can be used to distinguish them from other
|
|
44
44
|
* strings when type checking.
|