@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.
Files changed (108) hide show
  1. package/README.md +37 -35
  2. package/dist/{commonjs/client → client}/index.d.ts +12 -4
  3. package/dist/client/index.d.ts.map +1 -0
  4. package/dist/{esm/client → client}/index.js +13 -0
  5. package/dist/client/index.js.map +1 -0
  6. package/dist/component/_generated/api.d.ts +36 -0
  7. package/dist/component/_generated/api.d.ts.map +1 -0
  8. package/{src → dist}/component/_generated/api.js +11 -3
  9. package/dist/component/_generated/api.js.map +1 -0
  10. package/dist/component/_generated/component.d.ts +47 -0
  11. package/dist/component/_generated/component.d.ts.map +1 -0
  12. package/dist/component/_generated/component.js +11 -0
  13. package/dist/component/_generated/component.js.map +1 -0
  14. package/dist/component/_generated/dataModel.d.ts +46 -0
  15. package/dist/component/_generated/dataModel.d.ts.map +1 -0
  16. package/dist/component/_generated/dataModel.js +11 -0
  17. package/dist/component/_generated/dataModel.js.map +1 -0
  18. package/{src → dist}/component/_generated/server.d.ts +10 -38
  19. package/dist/component/_generated/server.d.ts.map +1 -0
  20. package/dist/{commonjs/component → component}/_generated/server.js +9 -5
  21. package/dist/component/_generated/server.js.map +1 -0
  22. package/dist/component/convex.config.d.ts.map +1 -0
  23. package/dist/component/convex.config.js.map +1 -0
  24. package/dist/component/crons.d.ts.map +1 -0
  25. package/dist/{commonjs/component → component}/crons.js +1 -1
  26. package/dist/component/crons.js.map +1 -0
  27. package/dist/{commonjs/component → component}/lib.d.ts +7 -0
  28. package/dist/component/lib.d.ts.map +1 -0
  29. package/dist/{commonjs/component → component}/lib.js +45 -2
  30. package/dist/component/lib.js.map +1 -0
  31. package/dist/{commonjs/component → component}/schema.d.ts +1 -1
  32. package/dist/component/schema.d.ts.map +1 -0
  33. package/dist/component/schema.js.map +1 -0
  34. package/dist/{commonjs/react → react}/index.d.ts +2 -2
  35. package/dist/react/index.d.ts.map +1 -0
  36. package/dist/{commonjs/react → react}/index.js +10 -2
  37. package/dist/react/index.js.map +1 -0
  38. package/package.json +68 -54
  39. package/src/client/index.ts +29 -13
  40. package/src/component/_generated/api.ts +52 -0
  41. package/src/component/_generated/component.ts +70 -0
  42. package/src/component/_generated/{dataModel.d.ts → dataModel.ts} +1 -1
  43. package/src/component/_generated/server.ts +156 -0
  44. package/src/component/crons.ts +2 -2
  45. package/src/component/lib.ts +51 -4
  46. package/src/component/schema.ts +2 -2
  47. package/src/react/index.ts +17 -9
  48. package/src/test.ts +18 -0
  49. package/dist/commonjs/client/index.d.ts.map +0 -1
  50. package/dist/commonjs/client/index.js +0 -146
  51. package/dist/commonjs/client/index.js.map +0 -1
  52. package/dist/commonjs/component/_generated/api.d.ts +0 -12
  53. package/dist/commonjs/component/_generated/api.d.ts.map +0 -1
  54. package/dist/commonjs/component/_generated/api.js +0 -22
  55. package/dist/commonjs/component/_generated/api.js.map +0 -1
  56. package/dist/commonjs/component/_generated/server.d.ts +0 -64
  57. package/dist/commonjs/component/_generated/server.d.ts.map +0 -1
  58. package/dist/commonjs/component/_generated/server.js.map +0 -1
  59. package/dist/commonjs/component/convex.config.d.ts.map +0 -1
  60. package/dist/commonjs/component/convex.config.js.map +0 -1
  61. package/dist/commonjs/component/crons.d.ts.map +0 -1
  62. package/dist/commonjs/component/crons.js.map +0 -1
  63. package/dist/commonjs/component/lib.d.ts.map +0 -1
  64. package/dist/commonjs/component/lib.js.map +0 -1
  65. package/dist/commonjs/component/schema.d.ts.map +0 -1
  66. package/dist/commonjs/component/schema.js.map +0 -1
  67. package/dist/commonjs/package.json +0 -3
  68. package/dist/commonjs/react/index.d.ts.map +0 -1
  69. package/dist/commonjs/react/index.js.map +0 -1
  70. package/dist/esm/client/index.d.ts +0 -89
  71. package/dist/esm/client/index.d.ts.map +0 -1
  72. package/dist/esm/client/index.js.map +0 -1
  73. package/dist/esm/component/_generated/api.d.ts +0 -12
  74. package/dist/esm/component/_generated/api.d.ts.map +0 -1
  75. package/dist/esm/component/_generated/api.js +0 -22
  76. package/dist/esm/component/_generated/api.js.map +0 -1
  77. package/dist/esm/component/_generated/server.d.ts +0 -64
  78. package/dist/esm/component/_generated/server.d.ts.map +0 -1
  79. package/dist/esm/component/_generated/server.js +0 -74
  80. package/dist/esm/component/_generated/server.js.map +0 -1
  81. package/dist/esm/component/convex.config.d.ts +0 -3
  82. package/dist/esm/component/convex.config.d.ts.map +0 -1
  83. package/dist/esm/component/convex.config.js +0 -3
  84. package/dist/esm/component/convex.config.js.map +0 -1
  85. package/dist/esm/component/crons.d.ts +0 -3
  86. package/dist/esm/component/crons.d.ts.map +0 -1
  87. package/dist/esm/component/crons.js +0 -7
  88. package/dist/esm/component/crons.js.map +0 -1
  89. package/dist/esm/component/lib.d.ts +0 -21
  90. package/dist/esm/component/lib.d.ts.map +0 -1
  91. package/dist/esm/component/lib.js +0 -134
  92. package/dist/esm/component/lib.js.map +0 -1
  93. package/dist/esm/component/schema.d.ts +0 -23
  94. package/dist/esm/component/schema.d.ts.map +0 -1
  95. package/dist/esm/component/schema.js +0 -13
  96. package/dist/esm/component/schema.js.map +0 -1
  97. package/dist/esm/package.json +0 -3
  98. package/dist/esm/react/index.d.ts +0 -26
  99. package/dist/esm/react/index.d.ts.map +0 -1
  100. package/dist/esm/react/index.js +0 -133
  101. package/dist/esm/react/index.js.map +0 -1
  102. package/react/package.json +0 -5
  103. package/src/component/_generated/api.d.ts +0 -81
  104. package/src/component/_generated/server.js +0 -90
  105. /package/dist/{commonjs/component → component}/convex.config.d.ts +0 -0
  106. /package/dist/{commonjs/component → component}/convex.config.js +0 -0
  107. /package/dist/{commonjs/component → component}/crons.d.ts +0 -0
  108. /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 { internalMutation, mutation, query } from "./_generated/server";
3
- import { streamStatusValidator } from "./schema";
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, streamId, streamEnded]);
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
- }, [driven, streamId, setStreamEnded, streamStarted]);
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.2.4",
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
- "build": "npm run build:esm && npm run build:cjs",
19
- "build:esm": "tsc --project ./esm.json && echo '{\\n \"type\": \"module\"\\n}' > dist/esm/package.json",
20
- "build:cjs": "tsc --project ./commonjs.json && echo '{\\n \"type\": \"commonjs\"\\n}' > dist/commonjs/package.json",
21
- "dev": "cd example; npm run dev",
22
- "typecheck": "tsc --noEmit",
23
- "prepare": "npm run build",
24
- "prepack": "node node10stubs.mjs",
25
- "postpack": "node node10stubs.mjs --cleanup",
26
- "alpha": "rm -rf dist && npm run build && npm run test && npm version prerelease --preid alpha && npm publish --tag alpha && git push --tags",
27
- "release": "rm -rf dist && npm run build && npm run test && npm version patch && npm publish && git push --tags",
28
- "test": "vitest run",
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
- "import": {
41
- "@convex-dev/component-source": "./src/client/index.ts",
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
- "import": {
53
- "@convex-dev/component-source": "./src/react/index.ts",
54
- "types": "./dist/esm/react/index.d.ts",
55
- "default": "./dist/esm/react/index.js"
56
- },
57
- "require": {
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
- "import": {
65
- "@convex-dev/component-source": "./src/component/convex.config.ts",
66
- "types": "./dist/esm/component/convex.config.d.ts",
67
- "default": "./dist/esm/component/convex.config.js"
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": ">=1.23.0 <1.35.0",
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
- "@eslint/js": "^9.9.1",
78
- "@types/node": "^18.17.0",
79
- "@types/react": "^19.0.10",
80
- "convex-test": "^0.0.36",
81
- "eslint": "^9.9.1",
82
- "globals": "^15.9.0",
83
- "prettier": "3.2.5",
84
- "typescript": "~5.0.3",
85
- "typescript-eslint": "^8.4.0",
86
- "vitest": "^3.1.4"
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
- "main": "./dist/commonjs/client/index.js",
89
- "types": "./dist/commonjs/client/index.d.ts",
90
- "module": "./dist/esm/client/index.js"
100
+ "types": "./dist/client/index.d.ts",
101
+ "module": "./dist/client/index.js",
102
+ "dependencies": {
103
+ "convex-helpers": "^0.1.114"
104
+ }
91
105
  }
@@ -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 { GenericId, v } from "convex/values";
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 = writable.getWriter() as WritableStreamDefaultWriter<Uint8Array> | null;
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("Will skip writing to stream but continue database updates");
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.