{"_id":"@convex-dev/batch-worker","_rev":"21-9157790aecb1a259506f647d7b157c2b","name":"@convex-dev/batch-worker","dist-tags":{"alpha":"0.2.2-alpha.0","v0-2":"0.2.2","latest":"0.3.6"},"versions":{"0.1.0":{"name":"@convex-dev/batch-worker","version":"0.1.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.1.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"2080489eb8d3a117e7cae5dfbf20ef02753d8c91","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.1.0.tgz","fileCount":88,"integrity":"sha512-bOXbfO66tCLDzhJf0tXBRqPGcixqFr1fdKfZJk87mWXqnS8MMtd3eo2xNoWjzMeOWPmfcUfG8nrDtaNyHANCDA==","signatures":[{"sig":"MEUCIFxLlYnrULoj/XU++jpNtZn5+SOMnJ7hhaJo9/krqnMqAiEAs+uF7DnZRNe4bw/7Qwob9NUFQe8QV7i1AekRdJBYQ8I=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187423},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.41.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.51","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.1.0_1781806593496_0.03264937112185429","host":"s3://npm-registry-packages-npm-production"}},"0.2.0":{"name":"@convex-dev/batch-worker","version":"0.2.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.2.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"349776e58e414448064dc81e39447c7c09d46fd0","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.2.0.tgz","fileCount":88,"integrity":"sha512-dn0L/5jqufXHzgzAhWqjGBmDGXbwRA0S6YVV5Z66y4pMXZ+YL3M4aHCk9iBInPp5zOtEPgVbfo/BYMxhLxVP+w==","signatures":[{"sig":"MEYCIQDuww719fwEns1WIzxRpGp5CTGu4wFrQ8Wok5JxSnDJGgIhAJlUgincRUhLtyaZ9JfCwQCJYJdyNCHRgegda+KS1PBG","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":177994},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"8090d09bdd38c5a30aa8a40732dc56cdb7ff5e2c","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.41.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.51","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.2.0_1781829639619_0.12223099748666755","host":"s3://npm-registry-packages-npm-production"}},"0.2.1-alpha.0":{"name":"@convex-dev/batch-worker","version":"0.2.1-alpha.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.2.1-alpha.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"df6351dee449015a38ffed3c80937dbe46b07e16","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.2.1-alpha.0.tgz","fileCount":88,"integrity":"sha512-Czq35OmvirZGcjd012PP1B4NeAHmperRcbdWACvKmDux2bdoxJbUv2IsmKZQOmFbAUMMuteGvF4KONavi5nQMg==","signatures":[{"sig":"MEUCIQCqoDc9ueb1u5vdhPIBw/ve2B1+fY4qcQywgsQpYizF0QIgDGKZk+OXWSc6SvaqLhDsWLHQvTeTkKHZTE9zpqPIuCY=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259689},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.119"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.43.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.42.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.2.1-alpha.0_1786152932540_0.27939942204219204","host":"s3://npm-registry-packages-npm-production"}},"0.3.0":{"name":"@convex-dev/batch-worker","version":"0.3.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.3.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"d8058eba69bfa0a3e137b5d298a8218ba6f88c15","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.0.tgz","fileCount":88,"integrity":"sha512-9CNwrhooFw59vRFEBiibD2/S0VEe6BiPDyJPlvybVkxEzeCKHjGwzaHtez6FuD6wIJ+GglWGqvlu4fOAEh9+pg==","signatures":[{"sig":"MEUCIQCnt5UKRCq8kxHnTeR1Dow/A3wCqw7Y5ngW5fORxup1MQIgY1XOssjZPmYLiW8bkNRrgCTORNdOpgXjiMz4X0m9Hu0=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":259681},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"56b860833429f01d87eec1cacbefe04a91c45626","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.119"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.43.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.43.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.3.0_1786408430968_0.6006784846731339","host":"s3://npm-registry-packages-npm-production"}},"0.3.1-alpha.0":{"name":"@convex-dev/batch-worker","version":"0.3.1-alpha.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.3.1-alpha.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"f5647f825f9d30f9f823c85700cb3b7faf8ed449","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.1-alpha.0.tgz","fileCount":88,"integrity":"sha512-8K5wrC+Jj3hxh9xPIWjWarjnREcu3KI7EZSqYIkotcOI4dz8QukyqFZcPDYwSEi7eulOAdfqKT14fnWvhzN7/w==","signatures":[{"sig":"MEQCIB8WR41hP189plX5APl0NFePYMCUUCZ8tmcuu42oarTIAiB7sAYZAjOTzu2dGfr1MobEB42WOo4s8wwKfbGFP0wI4w==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":267698},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.119"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.43.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.43.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.3.1-alpha.0_1787190122372_0.3953834994554979","host":"s3://npm-registry-packages-npm-production"}},"0.2.1-alpha.1":{"name":"@convex-dev/batch-worker","version":"0.2.1-alpha.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.2.1-alpha.1","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"1e7dcc1de9c1202f67d989339636c38df28904a7","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.2.1-alpha.1.tgz","fileCount":88,"integrity":"sha512-S3zdn57va9tSjOWtIuvdNVYeoZQicJEeI38WgbQ6aJS+w3zRB+TjOqjJpVyWM92luqqkfPkqZRjRUpISfVxNnw==","signatures":[{"sig":"MEQCIB0p/u127REjdn3cN5pB1dKK76wGQzQtOIwyZ77D5lX5AiBFNQbSiJkRH0ue11H24MOG1JZmw7ktiogwZO54DP+tyg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185986},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.41.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.51","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.2.1-alpha.1_1787190750912_0.17317467316029767","host":"s3://npm-registry-packages-npm-production"}},"0.2.1":{"name":"@convex-dev/batch-worker","version":"0.2.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.2.1","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"a33fc32b1c2551dad8776e1fd5213de404c34251","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.2.1.tgz","fileCount":88,"integrity":"sha512-QEDW6XmT+SmBJAmNqyl0QAEmJ4yMKJAIoJ+LntsA8KY5gYP+UhSFvTEMCvo177RZxOR/cfkZ3R+4S/UBaj/JnQ==","signatures":[{"sig":"MEUCIDBLzWKBdd1ND6uaSO/BGN1G2Dhc8wMXAEca9nMOY4X+AiEAl/bVhM+wshpS852yI9G1LqExGZW/CZ9axvxJ2wCEbKA=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":185978},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"efc85094a545b695bb62dc533783a6b97135cf00","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.41.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.51","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.2.1_1787260331429_0.09592640574553934","host":"s3://npm-registry-packages-npm-production"}},"0.3.1":{"name":"@convex-dev/batch-worker","version":"0.3.1","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.3.1","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"51dfafb18145d929af42b2869126b5211cc62399","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.1.tgz","fileCount":88,"integrity":"sha512-H6ticinIx/U2dOC/lIjigYRWcQXrNrn5q2KsOOqfJ7oRg8oG5s0dpoVe4uZdRgq7fEmTpntzrr1WYc4/GHhxgA==","signatures":[{"sig":"MEYCIQDbwohPo7H6g0ygxoAtc6XpJocpTIEH+zP2bLP/9+sX0gIhAL6/dPmODXJx+72XjouwySDg3OvG0gbC5ucq3LIBgoQ7","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":267690},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"327ac12cb94eee3764ec4ca4748d72a84e3a53fe","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.119"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.43.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.43.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.3.1_1787260576476_0.33657015264855894","host":"s3://npm-registry-packages-npm-production"}},"0.3.2":{"name":"@convex-dev/batch-worker","version":"0.3.2","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.3.2","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"5326f7ff54de15c0f495f5cc6c8ac23168c2f527","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.2.tgz","fileCount":88,"integrity":"sha512-mvruYwRV6oJJFgN1x2JaHeuN9CyjpA1FAk0iOTta4kvN6GWHSUDOxGMjFQ2L20edCgPXilqMVB6Ua5enjXqHlA==","signatures":[{"sig":"MEYCIQCWIzv4gqbVg84pfBJHmvlAZ/EvU7l//uDmhqRIiDM2UAIhAL08gsBMbQ9br/EEIEqIKJv0VVWMmc5gKONfxczhHZdx","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":275114},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"607262786d4981a6f6aaa1b97e7c02a63e5ffe3e","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.119"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.43.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.43.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.3.2_1787273203661_0.38619625459370965","host":"s3://npm-registry-packages-npm-production"}},"0.2.2-alpha.0":{"name":"@convex-dev/batch-worker","version":"0.2.2-alpha.0","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.2.2-alpha.0","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"db9a01cb5d8ce5b1b24a4349ac939b6de4249ab2","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.2.2-alpha.0.tgz","fileCount":88,"integrity":"sha512-gcBmIVFRp65d5gy4pJG0HyIYYb/wrSshUKPYBdTFpXWA4oMIoNr/d4GFwGpsgh068V284ACnNg7JsYC/QbXFEA==","signatures":[{"sig":"MEUCIQCfrY1kfOm9DcTTRRwWkltog/0L5Q+d22nmPDJrwIkrHgIgfoGPdVnnHYObhusPXRHJh+dk581w80r85URDtcsJwQ4=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187897},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.41.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.51","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.2.2-alpha.0_1788240258111_0.22455218618228145","host":"s3://npm-registry-packages-npm-production"}},"0.2.2":{"name":"@convex-dev/batch-worker","version":"0.2.2","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.2.2","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"c27c346c767bd2a70d011c3170653c3e8e2f86a7","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.2.2.tgz","fileCount":88,"integrity":"sha512-3knigElzTVhWw1sN28EYkGBTdrJZ03vMj2PJPuFq3V0Tg41i7tcv/EWDBFQWcUaKzBWWVw693hcJtxCF3CRtEw==","signatures":[{"sig":"MEQCIAb/pXTWxt6N4BBGJom9yG5u8UswHC5h0ht4/DVBD76rAiBd6CXAk2fhBWIJwV0m1n0c+quWPpxIe3+dUX+DDMwIEQ==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":187889},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"vite":"8.0.9","react":"^19.2.5","convex":"1.41.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.51","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.36.1"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.2.2_1788241888326_0.0005829081278434511","host":"s3://npm-registry-packages-npm-production"}},"0.3.3":{"name":"@convex-dev/batch-worker","version":"0.3.3","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.3.3","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"75581b3266885cbb0b6c9dd4ae4b766405e7e80d","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.3.tgz","fileCount":88,"integrity":"sha512-A9mOhSqITtdF6TR9bVZjTy+eES6/r/8ZvMWnNdKsATg8EOn5JMzDplibjaHCjQ57FjVeizbuKJ8GlnMs1RWF0g==","signatures":[{"sig":"MEUCIQDTQ23mIbxRByGpBj1tDlEa6IYpb2cdhSljwZBaGz25JAIgISqMbRaKWINrn058y/Pm/AWZY+V7ieudgECM7P/5QWM=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277805},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./react":{"types":"./dist/react/index.d.ts","default":"./dist/react/index.js"},"./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"e15f377887828c4a793641e852aa74fa055aa677","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.119"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.43.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","eslint-plugin-react":"^7.37.5","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"react":"^18.3.1 || ^19.0.0","convex":"^1.43.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.3.3_1788243961656_0.9252159766286994","host":"s3://npm-registry-packages-npm-production"}},"0.3.4":{"name":"@convex-dev/batch-worker","version":"0.3.4","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.3.4","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"emmaling27","email":"emma@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"7c9256679b1755291ca7cda24dc8debf9cf40399","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.4.tgz","fileCount":83,"integrity":"sha512-CKeOrPFsPoIKozMNP/qKExSwE6vd63QDKbZIbchK+P3S7fyGuFjRLbTg6+QmC/mzOjn6I5N8zo+k/SdXqeaA2g==","signatures":[{"sig":"MEUCIDbbSM/sZnszaQTYlUi9n3wZ64dWF9yv1v4uhoCL5REwAiEAoNmty81CI929MtHWAsrT/Iu6TXHAKxd8zjcEIvSn2zU=","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":276738},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"9ac0917e3f73c1fd5b4f9abfe3c5dcb78defae31","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.119"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.43.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"convex":"^1.43.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.3.4_1788576271120_0.7517698802594119","host":"s3://npm-registry-packages-npm-production"}},"0.3.5":{"name":"@convex-dev/batch-worker","version":"0.3.5","keywords":["convex","component"],"license":"Apache-2.0","_id":"@convex-dev/batch-worker@0.3.5","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"timdoug-convex","email":"timdoug@convex.dev"},{"name":"ayushdewanconvex","email":"ayush@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"mikewheaton","email":"mike@wheaton.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"homepage":"https://github.com/get-convex/batch-worker#readme","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"7a5f3ced3918639dea05b8344b9357b4eae468bf","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.5.tgz","fileCount":83,"integrity":"sha512-kTxLGy1TXRN6WLcENcoRWWnvPshv1sIZp2EpPqGqCB4FxDI7m8tEHUr+jCLdhGtSZT1UHkWtb1w8YYuEzTxHWQ==","signatures":[{"sig":"MEYCIQDgrTJQbWop7IHpJhG5GuRt+CqYP2qxAvP8391ZiITThAIhANthTvweo2k+rBba3IlBeGjKGOa9WbY8RMoZ9M3X3BaL","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"sig":"MEYCIQCcTdWm06uKerx65LWJEfO1zT6GG3iyrddEcSeepUy2GgIhAPu0eEg2InOmk6IRf9m/RuJPhHQAq1qgT3ZP1rz1mrR4","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"}],"unpackedSize":277187},"type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"91473fb55fc90d1fdfd6be7c78da235154722ee8","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.127"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.46.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.55-alpha.0","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"convex":"^1.43.0"},"_npmOperationalInternal":{"tmp":"tmp/batch-worker_0.3.5_1791326785211_0.4489738566835806","host":"s3://npm-registry-packages-npm-production"}},"0.3.6":{"_id":"@convex-dev/batch-worker@0.3.6","bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"dist":{"shasum":"48d1d85ee66069e9da367d7f972a3783ebc47fe2","tarball":"https://registry.npmjs.org/@convex-dev/batch-worker/-/batch-worker-0.3.6.tgz","fileCount":77,"integrity":"sha512-tR+9DaHR3jG3oqkIFX0ok/6944h7UHEQgT6HTmiuxU+lERYuYMsxA2IWwFD5yTFbCpO3YJhqXU4QdGY90sgUqQ==","signatures":[{"sig":"MEQCIEg1k308Ppbod3uAUhjgD+kg/e6bMaRVjHa1c8H28WGBAiBOwq+efMWcz1R+3efWyoxqdA7PV73DDoiA8WsHxYFQrg==","keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U"},{"keyid":"SHA256:DhQ8wR5APBvFHLF/+Tc+AYvPOdTpcIDqOhxsBHRwC7U","sig":"MEUCIQCYFOrgfIlayZMczfr6USI7g6gn5W1xo6Ar1NPArSqWjAIgJgXruW9lCXrUQQzLr56Qdv5A/EPraa6fiAhErv1oAyI="}],"unpackedSize":275832},"name":"@convex-dev/batch-worker","type":"module","types":"./dist/client/index.d.ts","module":"./dist/client/index.js","exports":{".":{"types":"./dist/client/index.d.ts","default":"./dist/client/index.js"},"./test":"./src/test.ts","./package.json":"./package.json","./convex.config":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./convex.config.js":{"types":"./dist/component/convex.config.d.ts","default":"./dist/component/convex.config.js"},"./_generated/component":{"types":"./dist/component/_generated/component.d.ts"},"./_generated/component.js":{"types":"./dist/component/_generated/component.d.ts"}},"gitHead":"b4d649559f11594ad1dee1f16db0cdf489ea6d00","license":"Apache-2.0","scripts":{"dev":"convex dev --start 'npm run dev:build'","lint":"eslint .","test":"vitest run --typecheck","alpha":"npm version prerelease --preid alpha && npm publish --tag alpha && git push --follow-tags","build":"tsc --project ./tsconfig.build.json","predev":"convex init && npm run build:codegen","prepare":"npm run build","release":"npm version patch && npm publish && git push --follow-tags","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","dev:build":"chokidar 'tsconfig*.json' 'src/**/*.ts' -i '**/*.test.ts' -c 'npm run build:codegen' --initial","typecheck":"tsc --noEmit && tsc -p example && tsc -p example/convex","preversion":"npm ci && npm run build:clean && npm run test && npm run lint && npm run typecheck","test:debug":"vitest --inspect-brk --no-file-parallelism","test:watch":"vitest --typecheck --clearScreen false","build:clean":"rm -rf dist *.tsbuildinfo && npx convex init && npm run build:codegen","dev:frontend":"cd example && vite","build:codegen":"npx convex codegen --component-dir ./src/component && npm run build","test:coverage":"vitest run --coverage --coverage.reporter=text"},"version":"0.3.6","_npmUser":{"name":"ianatconvex","email":"ian@convex.dev"},"homepage":"https://github.com/get-convex/batch-worker#readme","keywords":["convex","component"],"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"_npmVersion":"11.11.0","description":"A batch worker component for Convex.","directories":{},"maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"timdoug-convex","email":"timdoug@convex.dev"},{"name":"ayushdewanconvex","email":"ayush@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"_nodeVersion":"22.22.2","dependencies":{"convex-helpers":"^0.1.127"},"_hasShrinkwrap":false,"devDependencies":{"vite":"8.1.5","react":"^19.2.5","convex":"1.46.0","eslint":"9.39.4","vitest":"4.1.4","globals":"^17.5.0","prettier":"3.8.3","react-dom":"^19.2.5","@eslint/js":"9.39.4","pkg-pr-new":"^0.0.66","typescript":"6.0.3","@types/node":"^24.12.2","convex-test":"0.0.61","@types/react":"^19.2.14","chokidar-cli":"3.0.0","@edge-runtime/vm":"^5.0.0","@eslint/eslintrc":"^3.3.5","@types/react-dom":"^19.2.3","typescript-eslint":"8.58.2","@vitejs/plugin-react":"^6.0.2","@convex-dev/rate-limiter":"^0.3.2","@convex-dev/eslint-plugin":"^2.0.0","eslint-plugin-react-hooks":"^7.1.1","@convex-dev/static-hosting":"^0.2.0-alpha.2","eslint-plugin-react-refresh":"^0.5.2"},"peerDependencies":{"convex":"^1.43.0"},"_npmOperationalInternal":{"host":"s3://npm-registry-packages-npm-production","tmp":"tmp/batch-worker_0.3.6_1791594102155_0.7355840570642209"}}},"time":{"created":"2026-06-18T18:16:33.399Z","modified":"2026-10-10T01:01:42.446Z","0.1.0":"2026-06-18T18:16:33.733Z","0.2.0":"2026-06-19T00:40:39.819Z","0.2.1-alpha.0":"2026-08-08T01:35:32.676Z","0.3.0":"2026-08-11T00:33:51.128Z","0.3.1-alpha.0":"2026-08-20T01:42:02.569Z","0.2.1-alpha.1":"2026-08-20T01:52:31.052Z","0.2.1":"2026-08-20T21:12:11.578Z","0.3.1":"2026-08-20T21:16:16.622Z","0.3.2":"2026-08-21T00:46:43.808Z","0.2.2-alpha.0":"2026-09-01T05:24:18.241Z","0.2.2":"2026-09-01T05:51:28.461Z","0.3.3":"2026-09-01T06:26:01.846Z","0.3.4":"2026-09-05T02:44:31.241Z","0.3.5":"2026-10-06T22:46:25.302Z","0.3.6":"2026-10-10T01:01:42.252Z"},"bugs":{"url":"https://github.com/get-convex/batch-worker/issues"},"license":"Apache-2.0","homepage":"https://github.com/get-convex/batch-worker#readme","keywords":["convex","component"],"repository":{"url":"git+https://github.com/get-convex/batch-worker.git","type":"git"},"description":"A batch worker component for Convex.","maintainers":[{"name":"cowling","email":"james@convex.dev"},{"name":"jordanhunt","email":"jordan@convex.dev"},{"name":"gautamg795","email":"gautam@convex.dev"},{"name":"nipunn","email":"nipunn1313@gmail.com"},{"name":"aritrakh","email":"aritrakh@gmail.com"},{"name":"ianatconvex","email":"ian@convex.dev"},{"name":"dowski-convex","email":"christian@convex.dev"},{"name":"reece-convex","email":"reece@convex.dev"},{"name":"timdoug-convex","email":"timdoug@convex.dev"},{"name":"ayushdewanconvex","email":"ayush@convex.dev"},{"name":"erquhart","email":"shawn@erquh.art"},{"name":"sethconvex","email":"seth@convex.dev"},{"name":"andycai-convex","email":"andy@convex.dev"},{"name":"jamwt","email":"jamwt@convex.dev"},{"name":"nicolapps","email":"nicolas@ettlin.dev"}],"readme":"# Batch Worker\n\n[![npm version](https://badge.fury.io/js/@convex-dev%2Fbatch-worker.svg)](https://badge.fury.io/js/@convex-dev/batch-worker)\n[![Convex Component](https://www.convex.dev/components/badge/batch-worker)](https://www.convex.dev/components/batch-worker)\n\n<!-- START: Include on https://convex.dev/components -->\n\nProcess batches of work in your own tables by defining workers that loop\nautomatically, with scheduling, debouncing, and recovery built in.\n\nYou bring two functions:\n\n- A **work query** that returns the next batch of work, or explicitly go idle.\n- A **worker mutation** that processes that batch.\n\nAfter inserting work, call `ping(...)`. The component takes care of the rest:\n\n- Runs exactly one loop at a time per named Worker.\n- Supports debouncing bursts so they batch together.\n- Keeps the loop \"warm\" with a short polling cooldown so a trickle of new work\n  does not thrash the running status.\n- Uses snapshot reads while draining so concurrent inserts don't cause OCC\n  retries, and confirms with a real read before going idle so nothing is lost.\n- Goes idle when the queue drains, and restarts automatically the next time you\n  ping.\n- Monitors the loop and **restarts it if it ever dies** (e.g. an unexpected\n  error), logging the failure so you can alert on it.\n\nThis is the pattern behind components like\n[Workpool](https://github.com/get-convex/workpool), extracted so you can build\nyour own \"process a queue\" components.\n\nFound a bug? Feature request?\n[File it here](https://github.com/get-convex/batch-worker/issues).\n\n## Installation\n\nCreate a `convex.config.ts` file in your app's `convex/` folder and install the\ncomponent by calling `use`:\n\n```ts\n// convex/convex.config.ts\nimport { defineApp } from \"convex/server\";\nimport batchWorker from \"@convex-dev/batch-worker/convex.config.js\";\n\nconst app = defineApp();\napp.use(batchWorker, { env: { LOG_LEVEL: \"REPORT\" } });\n\nexport default app;\n```\n\nThe `env` option is optional, defaults shown above. The default mount name is\n`batchWorker` (i.e. `components.batchWorker`). This works inside another\ncomponent too: call `component.use(batchWorker)` in your component's\n`convex.config.ts`.\n\n## Usage\n\nInsert work into your own table, then call `ping`. Provide a query that returns\nthe next batch or `idle`, and a mutation that processes it. To ensure that the\nbatch shape always matches between the query and the mutation, use\n`defineBatchWorkerValidators` to obtain all four argument and return validators.\n(`kind: \"work\"` is optional — returning `{ batch }` alone also works.)\n\nAlongside the batch, the query returns a **cursor** saying how far it got. The\ncomponent commits it with the batch and hands it back as `args.cursor` next\ntime, so each scan resumes where the last one stopped. See\n[why that matters](#why-is-a-cursor-necessary).\n\n```ts\nimport { v } from \"convex/values\";\nimport { defineBatchWorkerValidators, ping } from \"@convex-dev/batch-worker\";\nimport { components, internal } from \"./_generated/api\";\nimport { internalMutation, internalQuery, mutation } from \"./_generated/server\";\n\nconst BATCH_SIZE = 10;\n\n// Insert work, then make sure the loop is running.\nexport const addEvent = mutation({\n  args: { value: v.number() },\n  handler: async (ctx, { value }) => {\n    // `db.vars.commitTs` resolves at commit to an int64 ordered by commit\n    // order — that's what makes it safe to use as a cursor. See below.\n    await ctx.db.insert(\"events\", { value, insertedAt: ctx.db.vars.commitTs });\n    await ping(ctx, components.batchWorker, {\n      name: \"events\", // distinct names give you independent queues\n      workQuery: internal.example.getBatch,\n      workerMutation: internal.example.processBatch,\n    });\n  },\n});\n\nconst vEvents = v.array(v.object({ id: v.id(\"events\"), value: v.number() }));\n\n// One declaration gives the query's args (`{ name, cursor? }`) and returns,\n// plus the mutation's args. `cursor` defaults to a commit timestamp.\nconst { vQueryArgs, vQueryReturns, vMutationArgs } =\n  defineBatchWorkerValidators({ batch: { events: vEvents } });\n\n// Return the next batch of work, or `idle` when there's nothing to do.\nexport const getBatch = internalQuery({\n  args: vQueryArgs, // `name` lets one query serve many queues\n  returns: vQueryReturns,\n  handler: async (ctx, { cursor }) => {\n    // Resume where the last batch stopped.\n    const events = await ctx.db\n      .query(\"events\")\n      .withIndex(\"insertedAt\", (q) => q.gte(\"insertedAt\", cursor ?? 0n))\n      .take(BATCH_SIZE);\n    if (events.length === 0) {\n      return { kind: \"idle\" as const };\n      // Or, if you know when the next item is due:\n      // return { kind: \"idle\" as const, timeoutMs: 30_000 };\n    }\n    return {\n      kind: \"work\" as const,\n      batch: { events: events.map((e) => ({ id: e._id, value: e.value })) },\n      // Rows come back in commit order, so the last one is how far we got.\n      cursor: events.at(-1)!.insertedAt,\n    };\n  },\n});\n\n// Process one batch. The worker owns cleanup — delete what you process!\nexport const processBatch = internalMutation({\n  args: vMutationArgs,\n  handler: async (ctx, { events }) => {\n    for (const { value, id } of events) {\n      // ... do the work (sum, call an API, schedule downstream jobs, etc.) ...\n\n      // Clean up the work you processed.\n      await ctx.db.delete(\"events\", id);\n    }\n    // Returning nothing re-runs immediately to drain the rest.\n  },\n});\n```\n\nThe component **does not clean up your work for you** — your worker mutation is\nresponsible for deleting (or marking complete / advancing past) the rows it\nprocessed, otherwise the next query will return them again.\n\n### Fetch work in the query, process it in the mutation\n\nThink of the work query and the worker mutation as **two separate transactions**\n(under the hood they run against the same database snapshot, but they behave\nindependently for conflict purposes). This split enables concurrent processing\nwithout database conflicts on work being added while being fetched.\n\n- The **work query** runs as a snapshot read that takes **no read\n  dependencies**. It can scan the queue (`.take(BATCH_SIZE)` over an index)\n  alongside concurrent inserts.\n- The **worker mutation** is a normal transaction: every range it reads becomes\n  a read dependency. If it re-queries the range of work in the queue, concurrent\n  inserts would conflict, so do range reads in the work query only.\n\nSo: **fetch the batch in the query, and pass everything the mutation needs\nthrough `batch`**, so the mutation doesn't need to re-fetch it. Note: when the\nmutation updates rows by `_id`, it will depend on those documents, so it is\nprotected against concurrent changes to those documents.\n\n```ts\n// ✅ Query scans; mutation gets the data handed to it.\nreturn {\n  kind: \"work\" as const,\n  batch: { events: rows.map((e) => ({ id: e._id, value: e.value })) },\n};\n```\n\n### Steering the loop dynamically\n\nYour worker mutation may return `{ debounceMs }` to throttle the loop, and a\n`cursor` to override the query's (see [The cursor](#the-cursor)):\n\n```ts\nreturn {\n  // Don't run again — and ignore pings — for at least this long (debounce).\n  debounceMs: 30_000,\n};\n```\n\n(This return value spaces out batches while the loop is running; the ping's\n`config.debounceMs` below is the delay when waking from idle, so a burst of\ninserts can accumulate into one batch.) A ping \"missed\" during a debounce is\nharmless: when the debounce elapses, the loop always re-runs your work query, so\nanything inserted meanwhile is picked up.\n\nSimilarly, when there's no work your query can return\n`{ kind: \"idle\", timeoutMs }` to ensure it wakes up after some time even if\n`ping` is not called. A ping still wakes it immediately.\n\n```ts\nreturn {\n  kind: \"idle\",\n  // Keep polling this long before transitioning to idle.\n  cooldownMs: 10_000,\n  // How often to poll while cooling down.\n  pollIntervalMs: 250,\n  // After cooling down, wake again after at most this long even if no ping\n  // arrives. Measured from this query response, so re-run it each query if you\n  // want it to track a fixed deadline. A ping still wakes it sooner.\n  timeoutMs: 60_000,\n};\n```\n\n### Ping\n\nPing ensures the worker is running.\n\nOptions:\n\n- `name`: The name of the queue to ping. You can give each queue a distinct\n  `name`. The name is passed to your query as `args.name`, so one query/mutation\n  pair can serve many queues. Usually there is only one worker with a static\n  name.\n- `workQuery`: The query that returns the next batch of work, or `idle`.\n- `workerMutation`: The mutation that processes a batch.\n- `config`: Optional configuration for the worker. It's stored on the worker and\n  refreshed when it changes.\n\n```ts\nawait ping(ctx, components.batchWorker, {\n  name: \"events\",\n  workQuery: internal.example.getBatch,\n  workerMutation: internal.example.processBatch,\n  config: {\n    // wait before the first batch so a burst accumulates\n    debounceMs: 100,\n  },\n});\n```\n\n### The cursor\n\nThe component stores the cursor for you: whatever your work query returns\nalongside a batch comes back as `args.cursor` on the next call. It's committed\nin the same transaction as the batch, so if your worker mutation throws, the\ncursor stays where it was and the batch is handed out again.\n\nThe default cursor type is a\n[commit timestamp](https://docs.convex.dev/database/advanced/commit-timestamp)\n(Convex ≥ 1.43), which avoids having to handle out-of-order commits. Add a\n`v.commitTs()` field to the table the worker scans, index it, and write\n`ctx.db.vars.commitTs` to it on every insert or patch:\n\n```ts\n// convex/schema.ts\nmyWork: defineTable({\n  updatedAt: v.commitTs(), // resolves at commit to an int64 in commit order\n  ...fields\n}).index(\"updatedAt\", [\"updatedAt\"]),\n```\n\n```ts\nawait ctx.db.insert(\"myWork\", { updatedAt: ctx.db.vars.commitTs, ... });\nawait ctx.db.patch(\"myWork\", id, { updatedAt: ctx.db.vars.commitTs, ... });\n```\n\nDo **not** use `_creationTime`. It's assigned when a mutation _starts_, so a row\ninserted by a slow mutation can land _behind_ rows the worker has already\nqueried past.\n\n**Scan with `gte`.** Everything a single mutation inserts shares one commit\ntimestamp, so a batch can end in the middle of such a tie and the next scan has\nto start at the tie to pick up the rest. Re-reading from the tie costs at most\none mutation's worth of already-processed rows.\n\nTo end each batch on a tie boundary instead, read the remaining documents at\nthat commit timestamp into the batch and scan with `gt`. That also processes\nwork added \"at once\" together, as long as it fits in one transaction. See\n[the aggregate example](./example/convex/aggregates.ts).\n\n#### Other cursor types\n\nThe cursor can be any Convex value, for instance a `paginator` cursor from\n`convex-helpers`, which captures the index range\n`[commitTs, _creationTime, _id]` so you know exactly where you left off. Pass\n`cursor` to `defineBatchWorkerValidators` and all four validators pick it up:\n\n```ts\nconst { vQueryArgs, vQueryReturns, vMutationArgs, vMutationReturns } =\n  defineBatchWorkerValidators({\n    batch: { ids: v.array(v.id(\"myWork\")) },\n    cursor: v.string(),\n  });\n```\n\n`ping` takes the cursor's type from the work query's `cursor` arg and checks\nboth return types against it, so a mismatch points at one place.\n\n#### Adjusting the cursor from the worker mutation\n\nThe worker mutation can return a `cursor` that overrides the query's. Use it\nwhen the batch made partial progress and you can work out how far it got, e.g.\nfrom a per-item timestamp carried in the batch:\n\n```ts\nreturn { cursor: lastProcessed.updatedAt };\n```\n\nIf it is not returned, it will defer to the cursor returned by the work query,\nif one was returned, or keep the old value. Note: if the cursor does not advance\nand you did not update anything the query read, you may end up in an infinite\nloop.\n\n#### Reading and resetting the cursor\n\nThe work query receives the cursor in its args. To read it elsewhere, say from a\nquery counting pending work, call the component like `status`:\n\n```ts\nconst from = ((await ctx.runQuery(components.batchWorker.lib.getCursor, {\n  name: \"events\",\n})) ?? 0n) as bigint;\n```\n\n`lib.setCursor` overwrites it, and clears it when `cursor` is omitted, so the\nnext scan starts from the front. Use it for migrations and recovery: the loop\nwrites that document every iteration, so a call made while the worker is busy is\nliable to conflict. It throws if the worker doesn't exist yet (`ping` creates\nit).\n\n#### Why is a cursor necessary?\n\nThe reason is due to a technical nuance of how Convex tracks document changes.\nInternally, Convex stores previous versions of documents in indexes for some\ntime (~minutes). Old values will not be returned in results to JS, but it can\nslow down queries if they have to scan and discard thousands of these entries.\n\nIn the simple example above, a `.take(BATCH_SIZE)` from the front of a table\nfollowed by deleting all of those documents results in the beinning of the\ntable's index to be full of deleted documents, which the next query then scans\nbefore reaching the next batch of work.\n\nThe solution is to keep a cursor to track your progress, and make your next\nquery starting at the cursor, allowing it to skip over the region of the index\nfull of previous versions or previously-handled work.\n\n### Use Case: Updating denormalized aggregates\n\nTo keep a denormalized aggregate (like a count or sum) up to date, you can use a\nBatchWorker to process updates in the background, avoiding write conflicts.\n\nFor a full runnable example, see\n[aggregates.ts](./example/convex/aggregates.ts).\n\nNote: this pattern means that the aggregate document does not immediately\nreflect the changes, so you need to be ok with slightly stale data when reading\nthe value. If you need the fully-up-to-date value, you have a couple options:\n\n1. Start out by updating the value immediately and revisit a lazy approach\n   if/when it turns out to be a real scaling issue. Convex already retries\n   database conflicts a number of times, so you may be fine with the simpler\n   approach.\n2. Read all the updates and combine them with the stale value dynamically. When\n   done from a query, it will stay consistent and reactive. Downside: it may\n   require reading a lot of updates.\n3. Use something like the Sharded Counter component, which parallelizes writes\n   to a fixed number of documents, and reads all of the shards for the count.\n   This is immediately consistent, but requires reading every shard, and needs\n   to be manually tuned to avoid conflicts.\n\n### Use Case: Batching work with actions\n\nThe worker mutation is a transaction, so it can't call external APIs itself. To\nbatch work that requires `fetch`— calling an LLM, hitting a third-party API —\nhave the worker mutation _claim_ a batch (mark the rows started so the query\nwon't hand them out again) and then schedule the action, or enqueue it in a\nWorkpool. The action does the work and calls a mutation to commit the results\nback.\n\nFull working code is in [rateLimited.ts](./example/convex/rateLimited.ts). It\nalso rate-limits the batches, covered next.\n\nTip: if you use a Workpool, you can configure retries on the action, and commit\nthe results or handle any error in the `onComplete` handler, which has the nice\nproperty of being called exactly once. You can pass through information about\nthe batch in the `context` for the `onComplete` handler so you can update them\neven in the case of failure. It will also help you manage parallelism of async\nwork, so live-site requests aren't impacted by spikey workloads.\n\nIf you don't use a Workpool, you can detect failure of the scheduled job and\nmanage retries yourself.\n\n### Rate limiting strategy\n\nYou can use Batch Worker with the\n[Rate Limiter component](https://www.convex.dev/components/rate-limiter) to\nbound how fast the loop does work, for example to respect an external API limit.\n\nFull working code is in [rateLimited.ts](./example/convex/rateLimited.ts).\n\nTips for rate-limiting LLM calls:\n\n- You can use the tokens returned from the previous LLM request to get accurate\n  token counts of the previous messages.\n- Consuming a rate limit after the request is a good trade-off for APIs that\n  have some grace around bursts of requests, and where you don't know the full\n  usage up-front. The post-request adjustment serves to delay future requests so\n  that your overall usage matches the rate limit, even if you temporarily go\n  above it.\n- By using the rate limiter's **reserve** functionality, it can avoid trial and\n  error: a reservation never rejects, but rather reserves future capacity if\n  necessary. It returns a `retryAfter` value instructing you how long to wait\n  before executing your request.\n- Use `retryAfter` two ways — to schedule the call for when you're actually\n  allowed to make it, and as `debounceMs` to delay assembling the next batch.\n- The simplest version of this is to use `rateLimiter.check(ctx, name)` to\n  determine any necessary delay to account for previous requests, then consume\n  the limit based on the full usage using\n  `rateLimiter.limit(ctx, name, { count: totalTokens, reserve: true })` after\n  the request completes.\n- For more accurate tracking, you can reserve capacity before the request based\n  on **input** token estimations, then account for the **output** tokens\n  afterwards, making a call with `reserve: true` from both places.\n- If you'd rather delay the worker mutation until there's enough capacity, the\n  work query can call `rateLimiter.check(...)` (read-only) and return\n  `{ kind: \"idle\", timeoutMs: retryAfter }` instead.\n\n### Failure handling\n\nIf your work query or worker mutation throws, the loop dies and the liveness\nmonitor restarts it after ~`monitorLagMs`. The unprocessed rows are still in\nyour table and the cursor stayed where it was, so the query hands out the **same\nbatch again**. That gives you at-least-once processing, but it also means one\npoison item that always throws can wedge the queue. For work that can fail per\nitem, catch errors inside the worker mutation, and isolate bad docs in a table\nfor async debugging.\n\nThis is a low-level primitive, relative to components like Workpool or Workflow,\nso you have to handle exceptional cases yourself.\n\n### Stopping & resuming\n\n`stop` halts processing entirely: the loop stops and `ping` is ignored, so no\nnew work is picked up. `start` resumes it (reusing the last `ping`ed\nquery/mutation). Call them on the component:\n\n```ts\nawait ctx.runMutation(components.batchWorker.lib.stop, { name: \"events\" });\n// ...later, when you want it processing again:\nawait ctx.runMutation(components.batchWorker.lib.start, { name: \"events\" });\n```\n\n`status` reports the run state, including whether the worker is `stopped`.\n\n### `ping` vs `start`\n\n- **`ping`** creates the worker on first call and resumes it when it's idle. It\n  also wakes a loop that's sleeping on an idle `timeoutMs`. A ping is a no-op\n  when it's already running, the next run is imminent (within ~1s), during a\n  `debounceMs` window (the work gets picked up when the debounce elapses), or\n  when the worker is stopped.\n- **`start`** resumes a `stopped` worker. Ping will not resume when `stopped`.\n\n### Testing with `convex-test`\n\nRegister the component in your test setup with the helper exported from\n`@convex-dev/batch-worker/test`:\n\n```ts\n/// <reference types=\"vite/client\" />\nimport { convexTest } from \"convex-test\";\nimport schema from \"./schema\";\nimport batchWorker from \"@convex-dev/batch-worker/test\";\n\nconst modules = import.meta.glob(\"./**/*.*s\");\n\nexport function initConvexTest() {\n  const t = convexTest(schema, modules);\n  batchWorker.register(t); // pass a name if you mounted it under one\n  return t;\n}\n```\n\n`ping` itself returns immediately — the loop runs via scheduled functions — so\nnothing processes until you drive the scheduler. Run the loop (and everything it\nschedules) to completion with fake timers:\n\n```ts\nvi.useFakeTimers();\nawait t.mutation(api.example.addEvent, { value: 5 });\nawait t.finishAllScheduledFunctions(vi.runAllTimers);\n```\n\nSee [example.test.ts](./example/convex/example.test.ts) and\n[setup.test.ts](./example/convex/setup.test.ts).\n\nNote: Use `convex-test` (≥ 0.0.55-alpha.0) for `v.commitTs()` support.\n\nSee the full working examples in the example app:\n[example.ts](./example/convex/example.ts) (basic queue),\n[aggregates.ts](./example/convex/aggregates.ts) (denormalized aggregates), and\n[rateLimited.ts](./example/convex/rateLimited.ts) (async LLM batches).\n\n<!-- END: Include on https://convex.dev/components -->\n\n## Development\n\nRun the example app with a file watcher that rebuilds the component:\n\n```sh\nnpm i\nnpm run dev\n```\n\nRun `npm run dev:frontend` (in a second terminal) to interact with it through\nthe Vite demo UI in [`example/src`](./example/src). It exercises all three\nworkers — the basic queue, the live scoreboard, and the async LLM batches.\n\nThe demo is hosted on Convex itself via\n[`@convex-dev/static-hosting`](https://github.com/get-convex/static-hosting),\npublished to `https://<deployment>.convex.site`. See\n[example/README.md](./example/README.md#deploy) for the deploy commands.\n\n### How it works\n\n| Table         | Written by                          | Read by                 |\n| ------------- | ----------------------------------- | ----------------------- |\n| `workers`     | `ping`/`start`/`loop` (transitions) | `ping`/`start`, monitor |\n| `workerState` | `loop` (every iteration)            | `loop`, monitor         |\n\nThe high-churn loop state lives in `workerState` (generation, heartbeat, the\nscheduled runner, the monitor, and the cursor, which rides along on a patch the\nloop already does every iteration), separate from the rarely-written `workers`\ndoc (which holds the handles, config, and run-status: `idle` / `running` /\n`stopped`, plus a pointer to its `workerState`). That lets `ping`/`start` —\nwhich you call on every insert — read `workers` and return without conflicting\n(OCC) with the fast-looping loop. A monotonic `generation` (in `workerState`)\nguarantees only one loop chain runs at a time: a superseded loop sees a\nmismatched generation and exits. The liveness monitor is scheduled\n~`monitorLagMs` _after_ the loop's next run and pushed back as the loop keeps\nrunning, so it only fires (and restarts the loop) if the loop actually died.\n","readmeFilename":"README.md"}