@convex-dev/persistent-text-streaming 0.3.2 → 0.3.3
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 +26 -0
- package/dist/client/index.d.ts +6 -9
- package/dist/client/index.d.ts.map +1 -1
- package/dist/client/index.js.map +1 -1
- package/dist/component/lib.js +11 -11
- package/dist/component/lib.js.map +1 -1
- package/package.json +27 -28
- package/src/client/index.ts +17 -11
- package/src/component/lib.ts +11 -11
package/README.md
CHANGED
|
@@ -125,6 +125,32 @@ http.route({
|
|
|
125
125
|
method: "POST",
|
|
126
126
|
handler: streamChat,
|
|
127
127
|
});
|
|
128
|
+
|
|
129
|
+
// Handle CORS preflight requests so browsers will allow the POST above when
|
|
130
|
+
// your app is served from a different origin than your Convex deployment.
|
|
131
|
+
http.route({
|
|
132
|
+
path: "/chat-stream",
|
|
133
|
+
method: "OPTIONS",
|
|
134
|
+
handler: httpAction(async (_, request) => {
|
|
135
|
+
const headers = request.headers;
|
|
136
|
+
if (
|
|
137
|
+
headers.get("Origin") !== null &&
|
|
138
|
+
headers.get("Access-Control-Request-Method") !== null &&
|
|
139
|
+
headers.get("Access-Control-Request-Headers") !== null
|
|
140
|
+
) {
|
|
141
|
+
return new Response(null, {
|
|
142
|
+
headers: new Headers({
|
|
143
|
+
"Access-Control-Allow-Origin": "*",
|
|
144
|
+
"Access-Control-Allow-Methods": "POST",
|
|
145
|
+
"Access-Control-Allow-Headers": "Content-Type, Digest, Authorization",
|
|
146
|
+
"Access-Control-Max-Age": "86400",
|
|
147
|
+
}),
|
|
148
|
+
});
|
|
149
|
+
} else {
|
|
150
|
+
return new Response();
|
|
151
|
+
}
|
|
152
|
+
}),
|
|
153
|
+
});
|
|
128
154
|
```
|
|
129
155
|
|
|
130
156
|
Finally, in your app, you can now create chats and them subscribe to them via
|
package/dist/client/index.d.ts
CHANGED
|
@@ -33,7 +33,7 @@ export declare class PersistentTextStreaming {
|
|
|
33
33
|
* });
|
|
34
34
|
* ```
|
|
35
35
|
*/
|
|
36
|
-
createStream(ctx:
|
|
36
|
+
createStream(ctx: MutationCtx | ActionCtx): Promise<StreamId>;
|
|
37
37
|
/**
|
|
38
38
|
* Get the body of a stream. This will return the full text of the stream
|
|
39
39
|
* and the status of the stream.
|
|
@@ -47,7 +47,7 @@ export declare class PersistentTextStreaming {
|
|
|
47
47
|
* const { text, status } = await streaming.getStreamBody(ctx, streamId);
|
|
48
48
|
* ```
|
|
49
49
|
*/
|
|
50
|
-
getStreamBody(ctx:
|
|
50
|
+
getStreamBody(ctx: QueryCtx | MutationCtx | ActionCtx, streamId: StreamId): Promise<StreamBody>;
|
|
51
51
|
/**
|
|
52
52
|
* Inside an HTTP action, this will stream data back to the client while
|
|
53
53
|
* also persisting the final stream in the database.
|
|
@@ -77,16 +77,13 @@ export declare class PersistentTextStreaming {
|
|
|
77
77
|
* @param ctx - A convex context capable of running mutations.
|
|
78
78
|
* @param streamId - The ID of the stream to delete.
|
|
79
79
|
*/
|
|
80
|
-
deleteStream(ctx:
|
|
80
|
+
deleteStream(ctx: MutationCtx | ActionCtx, streamId: StreamId): Promise<void>;
|
|
81
81
|
private addChunk;
|
|
82
82
|
private setStreamStatus;
|
|
83
83
|
}
|
|
84
|
-
type
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
type RunMutationCtx = {
|
|
88
|
-
runMutation: GenericMutationCtx<GenericDataModel>["runMutation"];
|
|
89
|
-
};
|
|
84
|
+
type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;
|
|
85
|
+
type MutationCtx = Pick<GenericMutationCtx<GenericDataModel>, "runQuery" | "runMutation">;
|
|
86
|
+
type ActionCtx = Pick<GenericActionCtx<GenericDataModel>, "runQuery" | "runMutation" | "runAction">;
|
|
90
87
|
export type OpaqueIds<T> = T extends GenericId<infer _T> | string ? string : T extends (infer U)[] ? OpaqueIds<U>[] : T extends ArrayBuffer ? ArrayBuffer : T extends object ? {
|
|
91
88
|
[K in keyof T]: OpaqueIds<T[K]>;
|
|
92
89
|
} : T;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,MAAM,EACN,iBAAiB,EACjB,gBAAgB,EAChB,gBAAgB,EAChB,kBAAkB,EAClB,eAAe,EAChB,MAAM,eAAe,CAAC;AACvB,OAAO,EAAK,KAAK,SAAS,EAAE,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AACrD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,wBAAwB,CAAC;AAE3D,MAAM,MAAM,QAAQ,GAAG,MAAM,GAAG;IAAE,YAAY,EAAE,IAAI,CAAA;CAAE,CAAC;AACvD,eAAO,MAAM,iBAAiB,qDAAa,CAAC;AAC5C,MAAM,MAAM,UAAU,GAAG;IACvB,IAAI,EAAE,MAAM,CAAC;IACb,MAAM,EAAE,YAAY,CAAC;CACtB,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC,IAAI,CAAC,CAAC;AAC5D,MAAM,MAAM,YAAY,CAAC,CAAC,SAAS,gBAAgB,CAAC,gBAAgB,CAAC,IAAI,CACvE,GAAG,EAAE,CAAC,EACN,OAAO,EAAE,OAAO,EAChB,QAAQ,EAAE,QAAQ,EAClB,aAAa,EAAE,aAAa,KACzB,OAAO,CAAC,IAAI,CAAC,CAAC;AAQnB,qBAAa,uBAAuB;IAEzB,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC;IAC7B,OAAO,CAAC,EAAE,MAAM;gBADhB,SAAS,EAAE,MAAM,CAAC,OAAO,GAAG,CAAC,EAC7B,OAAO,CAAC,EAAE,MAAM,YAAA;IAGzB;;;;;;;;;;;;;;;;OAgBG;IAEG,YAAY,CAAC,GAAG,EAAE,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/client/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,CAAC,EAAkB,MAAM,eAAe,CAAC;AAClD,OAAO,EAAE,GAAG,EAAE,MAAM,gCAAgC,CAAC;AAIrD,MAAM,CAAC,MAAM,iBAAiB,GAAG,CAAC,CAAC,MAAM,EAAE,CAAC;AAc5C,+CAA+C;AAC/C,MAAM,YAAY,GAAG,CAAC,IAAY,EAAE,EAAE;IACpC,OAAO,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC;AACxE,CAAC,CAAC;AAEF,2EAA2E;AAC3E,MAAM,OAAO,uBAAuB;IAEzB;IACA;IAFT,YACS,SAA6B,EAC7B,OAAgB;QADhB,cAAS,GAAT,SAAS,CAAoB;QAC7B,YAAO,GAAP,OAAO,CAAS;IACtB,CAAC;IAEJ;;;;;;;;;;;;;;;;OAgBG;IAEH,KAAK,CAAC,YAAY,CAAC,
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"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"}
|
package/dist/component/lib.js
CHANGED
|
@@ -23,12 +23,12 @@ export const addChunk = mutation({
|
|
|
23
23
|
final: v.boolean(),
|
|
24
24
|
},
|
|
25
25
|
handler: async (ctx, args) => {
|
|
26
|
-
const stream = await ctx.db.get(args.streamId);
|
|
26
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
27
27
|
if (!stream) {
|
|
28
28
|
throw new Error("Stream not found");
|
|
29
29
|
}
|
|
30
30
|
if (stream.status === "pending") {
|
|
31
|
-
await ctx.db.patch(args.streamId, {
|
|
31
|
+
await ctx.db.patch("streams", args.streamId, {
|
|
32
32
|
status: "streaming",
|
|
33
33
|
});
|
|
34
34
|
}
|
|
@@ -40,7 +40,7 @@ export const addChunk = mutation({
|
|
|
40
40
|
text: args.text,
|
|
41
41
|
});
|
|
42
42
|
if (args.final) {
|
|
43
|
-
await ctx.db.patch(args.streamId, {
|
|
43
|
+
await ctx.db.patch("streams", args.streamId, {
|
|
44
44
|
status: "done",
|
|
45
45
|
});
|
|
46
46
|
}
|
|
@@ -54,7 +54,7 @@ export const setStreamStatus = mutation({
|
|
|
54
54
|
status: v.union(v.literal("pending"), v.literal("streaming"), v.literal("done"), v.literal("error"), v.literal("timeout")),
|
|
55
55
|
},
|
|
56
56
|
handler: async (ctx, args) => {
|
|
57
|
-
const stream = await ctx.db.get(args.streamId);
|
|
57
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
58
58
|
if (!stream) {
|
|
59
59
|
throw new Error("Stream not found");
|
|
60
60
|
}
|
|
@@ -62,7 +62,7 @@ export const setStreamStatus = mutation({
|
|
|
62
62
|
console.log("Stream is already finalized; ignoring status change", stream);
|
|
63
63
|
return;
|
|
64
64
|
}
|
|
65
|
-
await ctx.db.patch(args.streamId, {
|
|
65
|
+
await ctx.db.patch("streams", args.streamId, {
|
|
66
66
|
status: args.status,
|
|
67
67
|
});
|
|
68
68
|
},
|
|
@@ -74,7 +74,7 @@ export const getStreamStatus = query({
|
|
|
74
74
|
},
|
|
75
75
|
returns: streamStatusValidator,
|
|
76
76
|
handler: async (ctx, args) => {
|
|
77
|
-
const stream = await ctx.db.get(args.streamId);
|
|
77
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
78
78
|
return stream?.status ?? "error";
|
|
79
79
|
},
|
|
80
80
|
});
|
|
@@ -89,7 +89,7 @@ export const getStreamText = query({
|
|
|
89
89
|
status: streamStatusValidator,
|
|
90
90
|
}),
|
|
91
91
|
handler: async (ctx, args) => {
|
|
92
|
-
const stream = await ctx.db.get(args.streamId);
|
|
92
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
93
93
|
if (!stream) {
|
|
94
94
|
throw new Error("Stream not found");
|
|
95
95
|
}
|
|
@@ -118,11 +118,11 @@ export const deleteStream = mutation({
|
|
|
118
118
|
},
|
|
119
119
|
returns: v.null(),
|
|
120
120
|
handler: async (ctx, args) => {
|
|
121
|
-
const stream = await ctx.db.get(args.streamId);
|
|
121
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
122
122
|
if (!stream) {
|
|
123
123
|
throw new Error(`Stream ${args.streamId} not found`);
|
|
124
124
|
}
|
|
125
|
-
await ctx.db.delete(args.streamId);
|
|
125
|
+
await ctx.db.delete("streams", args.streamId);
|
|
126
126
|
await ctx.scheduler.runAfter(0, internal.lib._deleteChunksPage, {
|
|
127
127
|
streamId: args.streamId,
|
|
128
128
|
cursor: null,
|
|
@@ -141,7 +141,7 @@ export const _deleteChunksPage = internalMutation({
|
|
|
141
141
|
.query("chunks")
|
|
142
142
|
.withIndex("byStream", (q) => q.eq("streamId", args.streamId))
|
|
143
143
|
.paginate({ cursor: args.cursor, numItems: DELETE_BATCH_SIZE });
|
|
144
|
-
await Promise.all(result.page.map((chunk) => ctx.db.delete(chunk._id)));
|
|
144
|
+
await Promise.all(result.page.map((chunk) => ctx.db.delete("chunks", chunk._id)));
|
|
145
145
|
if (!result.isDone) {
|
|
146
146
|
await ctx.scheduler.runAfter(0, internal.lib._deleteChunksPage, {
|
|
147
147
|
streamId: args.streamId,
|
|
@@ -167,7 +167,7 @@ export const cleanupExpiredStreams = internalMutation({
|
|
|
167
167
|
for (const stream of [...pendingStreams, ...streamingStreams]) {
|
|
168
168
|
if (now - stream._creationTime > EXPIRATION_TIME) {
|
|
169
169
|
console.log("Cleaning up expired stream", stream._id);
|
|
170
|
-
await ctx.db.patch(stream._id, {
|
|
170
|
+
await ctx.db.patch("streams", stream._id, {
|
|
171
171
|
status: "timeout",
|
|
172
172
|
});
|
|
173
173
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,kCAAkC,CAAC;AAC7D,OAAO,EAAE,CAAC,EAAE,MAAM,eAAe,CAAC;AAClC,OAAO,EAAE,QAAQ,EAAE,MAAM,qBAAqB,CAAC;AAC/C,OAAO,EAAE,gBAAgB,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,wBAAwB,CAAC;AAC3E,OAAO,MAAM,EAAE,EAAE,qBAAqB,EAAE,MAAM,aAAa,CAAC;AAE5D,wCAAwC;AACxC,MAAM,CAAC,MAAM,YAAY,GAAG,QAAQ,CAAC;IACnC,IAAI,EAAE,EAAE;IACR,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,EAAE;QACrB,MAAM,QAAQ,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,MAAM,CAAC,SAAS,EAAE;YAC9C,MAAM,EAAE,SAAS;SAClB,CAAC,CAAC;QACH,OAAO,QAAQ,CAAC;IAClB,CAAC;CACF,CAAC,CAAC;AAEH,2BAA2B;AAC3B,4CAA4C;AAC5C,8DAA8D;AAC9D,MAAM,CAAC,MAAM,QAAQ,GAAG,QAAQ,CAAC;IAC/B,IAAI,EAAE;QACJ,QAAQ,EAAE,CAAC,CAAC,EAAE,CAAC,SAAS,CAAC;QACzB,IAAI,EAAE,CAAC,CAAC,MAAM,EAAE;QAChB,KAAK,EAAE,CAAC,CAAC,OAAO,EAAE;KACnB;IACD,OAAO,EAAE,KAAK,EAAE,GAAG,EAAE,IAAI,EAAE,EAAE;QAC3B,MAAM,MAAM,GAAG,MAAM,GAAG,CAAC,EAAE,CAAC,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"lib.js","sourceRoot":"","sources":["../../src/component/lib.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.3.
|
|
10
|
+
"version": "0.3.3",
|
|
11
11
|
"license": "Apache-2.0",
|
|
12
12
|
"keywords": [
|
|
13
13
|
"convex",
|
|
@@ -15,22 +15,20 @@
|
|
|
15
15
|
],
|
|
16
16
|
"type": "module",
|
|
17
17
|
"scripts": {
|
|
18
|
-
"dev": "
|
|
19
|
-
"dev:backend": "convex dev --typecheck-components",
|
|
18
|
+
"dev": "convex dev --start 'npm run dev:build'",
|
|
20
19
|
"dev:frontend": "cd example && vite --clearScreen false",
|
|
21
20
|
"dev:build": "chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial",
|
|
22
|
-
"predev": "convex init && npm run build",
|
|
21
|
+
"predev": "convex init && npm run build:codegen",
|
|
23
22
|
"build": "tsc --project ./tsconfig.build.json",
|
|
24
23
|
"build:codegen": "npx convex codegen --component-dir ./src/component && npm run build",
|
|
25
24
|
"build:clean": "rm -rf dist *.tsbuildinfo && npm run build:codegen",
|
|
26
25
|
"typecheck": "tsc --noEmit && tsc -p example && tsc -p example/convex",
|
|
27
26
|
"lint": "eslint .",
|
|
28
|
-
"all": "run-p -r 'dev:*' 'test:watch'",
|
|
29
27
|
"test": "vitest run --typecheck",
|
|
30
28
|
"test:watch": "vitest --typecheck --clearScreen false",
|
|
31
29
|
"test:debug": "vitest --inspect-brk --no-file-parallelism",
|
|
32
30
|
"test:coverage": "vitest run --coverage --coverage.reporter=text",
|
|
33
|
-
"preversion": "npm ci && npm run build:clean && run
|
|
31
|
+
"preversion": "npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck",
|
|
34
32
|
"alpha": "npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags",
|
|
35
33
|
"release": "npm version patch && npm publish && git push --follow-tags",
|
|
36
34
|
"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"
|
|
@@ -68,34 +66,35 @@
|
|
|
68
66
|
"react-dom": "~18.3.1 || ^19.0.0"
|
|
69
67
|
},
|
|
70
68
|
"devDependencies": {
|
|
69
|
+
"@convex-dev/eslint-plugin": "^2.0.0",
|
|
71
70
|
"@edge-runtime/vm": "5.0.0",
|
|
72
|
-
"@eslint/eslintrc": "3.3.
|
|
73
|
-
"@eslint/js": "9.
|
|
74
|
-
"@tailwindcss/vite": "4.
|
|
75
|
-
"@types/node": "20.19.
|
|
76
|
-
"@types/react": "19.2.
|
|
77
|
-
"@types/react-dom": "19.2.
|
|
78
|
-
"@vitejs/plugin-react": "
|
|
71
|
+
"@eslint/eslintrc": "3.3.5",
|
|
72
|
+
"@eslint/js": "9.39.4",
|
|
73
|
+
"@tailwindcss/vite": "4.2.2",
|
|
74
|
+
"@types/node": "20.19.39",
|
|
75
|
+
"@types/react": "19.2.14",
|
|
76
|
+
"@types/react-dom": "19.2.3",
|
|
77
|
+
"@vitejs/plugin-react": "6.0.1",
|
|
79
78
|
"chokidar-cli": "3.0.0",
|
|
80
79
|
"clsx": "2.1.1",
|
|
81
|
-
"convex": "1.
|
|
82
|
-
"convex-test": "0.0.
|
|
83
|
-
"eslint": "9.39.
|
|
80
|
+
"convex": "1.35.1",
|
|
81
|
+
"convex-test": "0.0.48",
|
|
82
|
+
"eslint": "9.39.4",
|
|
84
83
|
"eslint-plugin-react-hooks": "7.0.1",
|
|
85
|
-
"eslint-plugin-react-refresh": "0.
|
|
86
|
-
"globals": "
|
|
87
|
-
"
|
|
88
|
-
"
|
|
89
|
-
"prettier": "3.
|
|
90
|
-
"react": "19.2.
|
|
91
|
-
"react-dom": "19.2.
|
|
84
|
+
"eslint-plugin-react-refresh": "0.5.2",
|
|
85
|
+
"globals": "17.5.0",
|
|
86
|
+
"openai": "6.34.0",
|
|
87
|
+
"pkg-pr-new": "0.0.66",
|
|
88
|
+
"prettier": "3.8.3",
|
|
89
|
+
"react": "19.2.5",
|
|
90
|
+
"react-dom": "19.2.5",
|
|
92
91
|
"react-markdown": "10.1.0",
|
|
93
|
-
"tailwind-merge": "3.
|
|
94
|
-
"tailwindcss": "4.
|
|
92
|
+
"tailwind-merge": "3.5.0",
|
|
93
|
+
"tailwindcss": "4.2.2",
|
|
95
94
|
"typescript": "5.9.3",
|
|
96
|
-
"typescript-eslint": "8.
|
|
97
|
-
"vite": "
|
|
98
|
-
"vitest": "
|
|
95
|
+
"typescript-eslint": "8.58.2",
|
|
96
|
+
"vite": "8.0.16",
|
|
97
|
+
"vitest": "4.1.4"
|
|
99
98
|
},
|
|
100
99
|
"types": "./dist/client/index.d.ts",
|
|
101
100
|
"module": "./dist/client/index.js",
|
package/src/client/index.ts
CHANGED
|
@@ -55,7 +55,7 @@ export class PersistentTextStreaming {
|
|
|
55
55
|
* ```
|
|
56
56
|
*/
|
|
57
57
|
|
|
58
|
-
async createStream(ctx:
|
|
58
|
+
async createStream(ctx: MutationCtx | ActionCtx): Promise<StreamId> {
|
|
59
59
|
const id = await ctx.runMutation(this.component.lib.createStream);
|
|
60
60
|
return id as StreamId;
|
|
61
61
|
}
|
|
@@ -74,7 +74,7 @@ export class PersistentTextStreaming {
|
|
|
74
74
|
* ```
|
|
75
75
|
*/
|
|
76
76
|
async getStreamBody(
|
|
77
|
-
ctx:
|
|
77
|
+
ctx: QueryCtx | MutationCtx | ActionCtx,
|
|
78
78
|
streamId: StreamId,
|
|
79
79
|
): Promise<StreamBody> {
|
|
80
80
|
const { text, status } = await ctx.runQuery(
|
|
@@ -180,7 +180,10 @@ export class PersistentTextStreaming {
|
|
|
180
180
|
* @param ctx - A convex context capable of running mutations.
|
|
181
181
|
* @param streamId - The ID of the stream to delete.
|
|
182
182
|
*/
|
|
183
|
-
async deleteStream(
|
|
183
|
+
async deleteStream(
|
|
184
|
+
ctx: MutationCtx | ActionCtx,
|
|
185
|
+
streamId: StreamId,
|
|
186
|
+
): Promise<void> {
|
|
184
187
|
await ctx.runMutation(this.component.lib.deleteStream, {
|
|
185
188
|
streamId,
|
|
186
189
|
});
|
|
@@ -188,7 +191,7 @@ export class PersistentTextStreaming {
|
|
|
188
191
|
|
|
189
192
|
// Internal helper -- add a chunk to the stream.
|
|
190
193
|
private async addChunk(
|
|
191
|
-
ctx:
|
|
194
|
+
ctx: MutationCtx | ActionCtx,
|
|
192
195
|
streamId: StreamId,
|
|
193
196
|
text: string,
|
|
194
197
|
final: boolean,
|
|
@@ -202,7 +205,7 @@ export class PersistentTextStreaming {
|
|
|
202
205
|
|
|
203
206
|
// Internal helper -- set the status of a stream.
|
|
204
207
|
private async setStreamStatus(
|
|
205
|
-
ctx:
|
|
208
|
+
ctx: MutationCtx | ActionCtx,
|
|
206
209
|
streamId: StreamId,
|
|
207
210
|
status: StreamStatus,
|
|
208
211
|
) {
|
|
@@ -215,12 +218,15 @@ export class PersistentTextStreaming {
|
|
|
215
218
|
|
|
216
219
|
/* Type utils follow */
|
|
217
220
|
|
|
218
|
-
type
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
221
|
+
type QueryCtx = Pick<GenericQueryCtx<GenericDataModel>, "runQuery">;
|
|
222
|
+
type MutationCtx = Pick<
|
|
223
|
+
GenericMutationCtx<GenericDataModel>,
|
|
224
|
+
"runQuery" | "runMutation"
|
|
225
|
+
>;
|
|
226
|
+
type ActionCtx = Pick<
|
|
227
|
+
GenericActionCtx<GenericDataModel>,
|
|
228
|
+
"runQuery" | "runMutation" | "runAction"
|
|
229
|
+
>;
|
|
224
230
|
|
|
225
231
|
export type OpaqueIds<T> = T extends GenericId<infer _T> | string
|
|
226
232
|
? string
|
package/src/component/lib.ts
CHANGED
|
@@ -25,12 +25,12 @@ export const addChunk = mutation({
|
|
|
25
25
|
final: v.boolean(),
|
|
26
26
|
},
|
|
27
27
|
handler: async (ctx, args) => {
|
|
28
|
-
const stream = await ctx.db.get(args.streamId);
|
|
28
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
29
29
|
if (!stream) {
|
|
30
30
|
throw new Error("Stream not found");
|
|
31
31
|
}
|
|
32
32
|
if (stream.status === "pending") {
|
|
33
|
-
await ctx.db.patch(args.streamId, {
|
|
33
|
+
await ctx.db.patch("streams", args.streamId, {
|
|
34
34
|
status: "streaming",
|
|
35
35
|
});
|
|
36
36
|
} else if (stream.status !== "streaming") {
|
|
@@ -41,7 +41,7 @@ export const addChunk = mutation({
|
|
|
41
41
|
text: args.text,
|
|
42
42
|
});
|
|
43
43
|
if (args.final) {
|
|
44
|
-
await ctx.db.patch(args.streamId, {
|
|
44
|
+
await ctx.db.patch("streams", args.streamId, {
|
|
45
45
|
status: "done",
|
|
46
46
|
});
|
|
47
47
|
}
|
|
@@ -62,7 +62,7 @@ export const setStreamStatus = mutation({
|
|
|
62
62
|
),
|
|
63
63
|
},
|
|
64
64
|
handler: async (ctx, args) => {
|
|
65
|
-
const stream = await ctx.db.get(args.streamId);
|
|
65
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
66
66
|
if (!stream) {
|
|
67
67
|
throw new Error("Stream not found");
|
|
68
68
|
}
|
|
@@ -73,7 +73,7 @@ export const setStreamStatus = mutation({
|
|
|
73
73
|
);
|
|
74
74
|
return;
|
|
75
75
|
}
|
|
76
|
-
await ctx.db.patch(args.streamId, {
|
|
76
|
+
await ctx.db.patch("streams", args.streamId, {
|
|
77
77
|
status: args.status,
|
|
78
78
|
});
|
|
79
79
|
},
|
|
@@ -86,7 +86,7 @@ export const getStreamStatus = query({
|
|
|
86
86
|
},
|
|
87
87
|
returns: streamStatusValidator,
|
|
88
88
|
handler: async (ctx, args) => {
|
|
89
|
-
const stream = await ctx.db.get(args.streamId);
|
|
89
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
90
90
|
return stream?.status ?? "error";
|
|
91
91
|
},
|
|
92
92
|
});
|
|
@@ -102,7 +102,7 @@ export const getStreamText = query({
|
|
|
102
102
|
status: streamStatusValidator,
|
|
103
103
|
}),
|
|
104
104
|
handler: async (ctx, args) => {
|
|
105
|
-
const stream = await ctx.db.get(args.streamId);
|
|
105
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
106
106
|
if (!stream) {
|
|
107
107
|
throw new Error("Stream not found");
|
|
108
108
|
}
|
|
@@ -133,11 +133,11 @@ export const deleteStream = mutation({
|
|
|
133
133
|
},
|
|
134
134
|
returns: v.null(),
|
|
135
135
|
handler: async (ctx, args) => {
|
|
136
|
-
const stream = await ctx.db.get(args.streamId);
|
|
136
|
+
const stream = await ctx.db.get("streams", args.streamId);
|
|
137
137
|
if (!stream) {
|
|
138
138
|
throw new Error(`Stream ${args.streamId} not found`);
|
|
139
139
|
}
|
|
140
|
-
await ctx.db.delete(args.streamId);
|
|
140
|
+
await ctx.db.delete("streams", args.streamId);
|
|
141
141
|
await ctx.scheduler.runAfter(0, internal.lib._deleteChunksPage, {
|
|
142
142
|
streamId: args.streamId,
|
|
143
143
|
cursor: null,
|
|
@@ -158,7 +158,7 @@ export const _deleteChunksPage = internalMutation({
|
|
|
158
158
|
.withIndex("byStream", (q) => q.eq("streamId", args.streamId))
|
|
159
159
|
.paginate({ cursor: args.cursor, numItems: DELETE_BATCH_SIZE });
|
|
160
160
|
|
|
161
|
-
await Promise.all(result.page.map((chunk) => ctx.db.delete(chunk._id)));
|
|
161
|
+
await Promise.all(result.page.map((chunk) => ctx.db.delete("chunks", chunk._id)));
|
|
162
162
|
|
|
163
163
|
if (!result.isDone) {
|
|
164
164
|
await ctx.scheduler.runAfter(0, internal.lib._deleteChunksPage, {
|
|
@@ -187,7 +187,7 @@ export const cleanupExpiredStreams = internalMutation({
|
|
|
187
187
|
for (const stream of [...pendingStreams, ...streamingStreams]) {
|
|
188
188
|
if (now - stream._creationTime > EXPIRATION_TIME) {
|
|
189
189
|
console.log("Cleaning up expired stream", stream._id);
|
|
190
|
-
await ctx.db.patch(stream._id, {
|
|
190
|
+
await ctx.db.patch("streams", stream._id, {
|
|
191
191
|
status: "timeout",
|
|
192
192
|
});
|
|
193
193
|
}
|