workerstack 0.1.0-beta.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (605) hide show
  1. package/CHANGELOG.md +13 -0
  2. package/LICENSE +21 -0
  3. package/README.md +138 -0
  4. package/dist/access.d.ts +131 -0
  5. package/dist/access.d.ts.map +1 -0
  6. package/dist/access.js +333 -0
  7. package/dist/access.js.map +1 -0
  8. package/dist/api/builder.d.ts +457 -0
  9. package/dist/api/builder.d.ts.map +1 -0
  10. package/dist/api/builder.js +45 -0
  11. package/dist/api/builder.js.map +1 -0
  12. package/dist/api/catalog.d.ts +8 -0
  13. package/dist/api/catalog.d.ts.map +1 -0
  14. package/dist/api/catalog.js +56 -0
  15. package/dist/api/catalog.js.map +1 -0
  16. package/dist/api/context.d.ts +47 -0
  17. package/dist/api/context.d.ts.map +1 -0
  18. package/dist/api/context.js +40 -0
  19. package/dist/api/context.js.map +1 -0
  20. package/dist/api/crud-router.d.ts +476 -0
  21. package/dist/api/crud-router.d.ts.map +1 -0
  22. package/dist/api/crud-router.js +354 -0
  23. package/dist/api/crud-router.js.map +1 -0
  24. package/dist/api/list-input-schema.d.ts +37 -0
  25. package/dist/api/list-input-schema.d.ts.map +1 -0
  26. package/dist/api/list-input-schema.js +63 -0
  27. package/dist/api/list-input-schema.js.map +1 -0
  28. package/dist/api/list-spec.d.ts +44 -0
  29. package/dist/api/list-spec.d.ts.map +1 -0
  30. package/dist/api/list-spec.js +49 -0
  31. package/dist/api/list-spec.js.map +1 -0
  32. package/dist/api/live-view.d.ts +14 -0
  33. package/dist/api/live-view.d.ts.map +1 -0
  34. package/dist/api/live-view.js +42 -0
  35. package/dist/api/live-view.js.map +1 -0
  36. package/dist/api/live-window.d.ts +40 -0
  37. package/dist/api/live-window.d.ts.map +1 -0
  38. package/dist/api/live-window.js +93 -0
  39. package/dist/api/live-window.js.map +1 -0
  40. package/dist/api/openapi.d.ts +6 -0
  41. package/dist/api/openapi.d.ts.map +1 -0
  42. package/dist/api/openapi.js +146 -0
  43. package/dist/api/openapi.js.map +1 -0
  44. package/dist/api/realtime-router.d.ts +94 -0
  45. package/dist/api/realtime-router.d.ts.map +1 -0
  46. package/dist/api/realtime-router.js +45 -0
  47. package/dist/api/realtime-router.js.map +1 -0
  48. package/dist/api/registry.d.ts +30 -0
  49. package/dist/api/registry.d.ts.map +1 -0
  50. package/dist/api/registry.js +236 -0
  51. package/dist/api/registry.js.map +1 -0
  52. package/dist/api/router.d.ts +15 -0
  53. package/dist/api/router.d.ts.map +1 -0
  54. package/dist/api/router.js +32 -0
  55. package/dist/api/router.js.map +1 -0
  56. package/dist/api/storage-router.d.ts +349 -0
  57. package/dist/api/storage-router.d.ts.map +1 -0
  58. package/dist/api/storage-router.js +155 -0
  59. package/dist/api/storage-router.js.map +1 -0
  60. package/dist/api/types.d.ts +55 -0
  61. package/dist/api/types.d.ts.map +1 -0
  62. package/dist/api/types.js +2 -0
  63. package/dist/api/types.js.map +1 -0
  64. package/dist/auth-password.d.ts +27 -0
  65. package/dist/auth-password.d.ts.map +1 -0
  66. package/dist/auth-password.js +60 -0
  67. package/dist/auth-password.js.map +1 -0
  68. package/dist/auth.d.ts +59 -0
  69. package/dist/auth.d.ts.map +1 -0
  70. package/dist/auth.js +146 -0
  71. package/dist/auth.js.map +1 -0
  72. package/dist/backend-internals.d.ts +35 -0
  73. package/dist/backend-internals.d.ts.map +1 -0
  74. package/dist/backend-internals.js +2 -0
  75. package/dist/backend-internals.js.map +1 -0
  76. package/dist/backend.d.ts +63 -0
  77. package/dist/backend.d.ts.map +1 -0
  78. package/dist/backend.js +59 -0
  79. package/dist/backend.js.map +1 -0
  80. package/dist/blueprint-generator.d.ts +21 -0
  81. package/dist/blueprint-generator.d.ts.map +1 -0
  82. package/dist/blueprint-generator.js +199 -0
  83. package/dist/blueprint-generator.js.map +1 -0
  84. package/dist/blueprint.d.ts +99 -0
  85. package/dist/blueprint.d.ts.map +1 -0
  86. package/dist/blueprint.js +257 -0
  87. package/dist/blueprint.js.map +1 -0
  88. package/dist/cli-skills.d.ts +16 -0
  89. package/dist/cli-skills.d.ts.map +1 -0
  90. package/dist/cli-skills.js +108 -0
  91. package/dist/cli-skills.js.map +1 -0
  92. package/dist/cli.d.ts +18 -0
  93. package/dist/cli.d.ts.map +1 -0
  94. package/dist/cli.js +205 -0
  95. package/dist/cli.js.map +1 -0
  96. package/dist/client/client.d.ts +53 -0
  97. package/dist/client/client.d.ts.map +1 -0
  98. package/dist/client/client.js +111 -0
  99. package/dist/client/client.js.map +1 -0
  100. package/dist/client/index.d.ts +4 -0
  101. package/dist/client/index.d.ts.map +1 -0
  102. package/dist/client/index.js +4 -0
  103. package/dist/client/index.js.map +1 -0
  104. package/dist/client/live-view.d.ts +49 -0
  105. package/dist/client/live-view.d.ts.map +1 -0
  106. package/dist/client/live-view.js +184 -0
  107. package/dist/client/live-view.js.map +1 -0
  108. package/dist/client/react.d.ts +4 -0
  109. package/dist/client/react.d.ts.map +1 -0
  110. package/dist/client/react.js +6 -0
  111. package/dist/client/react.js.map +1 -0
  112. package/dist/client/realtime.d.ts +54 -0
  113. package/dist/client/realtime.d.ts.map +1 -0
  114. package/dist/client/realtime.js +105 -0
  115. package/dist/client/realtime.js.map +1 -0
  116. package/dist/client/rest.d.ts +2 -0
  117. package/dist/client/rest.d.ts.map +1 -0
  118. package/dist/client/rest.js +2 -0
  119. package/dist/client/rest.js.map +1 -0
  120. package/dist/client/rpc-client.d.ts +38 -0
  121. package/dist/client/rpc-client.d.ts.map +1 -0
  122. package/dist/client/rpc-client.js +59 -0
  123. package/dist/client/rpc-client.js.map +1 -0
  124. package/dist/client/solid.d.ts +7 -0
  125. package/dist/client/solid.d.ts.map +1 -0
  126. package/dist/client/solid.js +21 -0
  127. package/dist/client/solid.js.map +1 -0
  128. package/dist/client/svelte.d.ts +6 -0
  129. package/dist/client/svelte.d.ts.map +1 -0
  130. package/dist/client/svelte.js +9 -0
  131. package/dist/client/svelte.js.map +1 -0
  132. package/dist/client/vue.d.ts +5 -0
  133. package/dist/client/vue.d.ts.map +1 -0
  134. package/dist/client/vue.js +11 -0
  135. package/dist/client/vue.js.map +1 -0
  136. package/dist/codegen.d.ts +36 -0
  137. package/dist/codegen.d.ts.map +1 -0
  138. package/dist/codegen.js +235 -0
  139. package/dist/codegen.js.map +1 -0
  140. package/dist/config.d.ts +129 -0
  141. package/dist/config.d.ts.map +1 -0
  142. package/dist/config.js +75 -0
  143. package/dist/config.js.map +1 -0
  144. package/dist/cron.d.ts +4 -0
  145. package/dist/cron.d.ts.map +1 -0
  146. package/dist/cron.js +3 -0
  147. package/dist/cron.js.map +1 -0
  148. package/dist/crud-operations.d.ts +43 -0
  149. package/dist/crud-operations.d.ts.map +1 -0
  150. package/dist/crud-operations.js +249 -0
  151. package/dist/crud-operations.js.map +1 -0
  152. package/dist/database/adapter.d.ts +26 -0
  153. package/dist/database/adapter.d.ts.map +1 -0
  154. package/dist/database/adapter.js +2 -0
  155. package/dist/database/adapter.js.map +1 -0
  156. package/dist/database/libsql.d.ts +3 -0
  157. package/dist/database/libsql.d.ts.map +1 -0
  158. package/dist/database/libsql.js +39 -0
  159. package/dist/database/libsql.js.map +1 -0
  160. package/dist/db.d.ts +15 -0
  161. package/dist/db.d.ts.map +1 -0
  162. package/dist/db.js +8 -0
  163. package/dist/db.js.map +1 -0
  164. package/dist/dev/binaries.d.ts +22 -0
  165. package/dist/dev/binaries.d.ts.map +1 -0
  166. package/dist/dev/binaries.js +119 -0
  167. package/dist/dev/binaries.js.map +1 -0
  168. package/dist/dev/env.d.ts +11 -0
  169. package/dist/dev/env.d.ts.map +1 -0
  170. package/dist/dev/env.js +71 -0
  171. package/dist/dev/env.js.map +1 -0
  172. package/dist/dev/index.d.ts +39 -0
  173. package/dist/dev/index.d.ts.map +1 -0
  174. package/dist/dev/index.js +273 -0
  175. package/dist/dev/index.js.map +1 -0
  176. package/dist/dev/processes.d.ts +37 -0
  177. package/dist/dev/processes.d.ts.map +1 -0
  178. package/dist/dev/processes.js +104 -0
  179. package/dist/dev/processes.js.map +1 -0
  180. package/dist/dev/push.d.ts +2 -0
  181. package/dist/dev/push.d.ts.map +1 -0
  182. package/dist/dev/push.js +30 -0
  183. package/dist/dev/push.js.map +1 -0
  184. package/dist/dialect.d.ts +17 -0
  185. package/dist/dialect.d.ts.map +1 -0
  186. package/dist/dialect.js +12 -0
  187. package/dist/dialect.js.map +1 -0
  188. package/dist/email/smtp.d.ts +20 -0
  189. package/dist/email/smtp.d.ts.map +1 -0
  190. package/dist/email/smtp.js +31 -0
  191. package/dist/email/smtp.js.map +1 -0
  192. package/dist/email.d.ts +26 -0
  193. package/dist/email.d.ts.map +1 -0
  194. package/dist/email.js +2 -0
  195. package/dist/email.js.map +1 -0
  196. package/dist/env-probe.d.ts +9 -0
  197. package/dist/env-probe.d.ts.map +1 -0
  198. package/dist/env-probe.js +72 -0
  199. package/dist/env-probe.js.map +1 -0
  200. package/dist/env.d.ts +62 -0
  201. package/dist/env.d.ts.map +1 -0
  202. package/dist/env.js +86 -0
  203. package/dist/env.js.map +1 -0
  204. package/dist/errors.d.ts +153 -0
  205. package/dist/errors.d.ts.map +1 -0
  206. package/dist/errors.js +106 -0
  207. package/dist/errors.js.map +1 -0
  208. package/dist/handler.d.ts +11 -0
  209. package/dist/handler.d.ts.map +1 -0
  210. package/dist/handler.js +21 -0
  211. package/dist/handler.js.map +1 -0
  212. package/dist/hosted-contract.d.ts +11 -0
  213. package/dist/hosted-contract.d.ts.map +1 -0
  214. package/dist/hosted-contract.js +50 -0
  215. package/dist/hosted-contract.js.map +1 -0
  216. package/dist/idempotency.d.ts +17 -0
  217. package/dist/idempotency.d.ts.map +1 -0
  218. package/dist/idempotency.js +65 -0
  219. package/dist/idempotency.js.map +1 -0
  220. package/dist/index.d.ts +41 -0
  221. package/dist/index.d.ts.map +1 -0
  222. package/dist/index.js +18 -0
  223. package/dist/index.js.map +1 -0
  224. package/dist/inspect.d.ts +15 -0
  225. package/dist/inspect.d.ts.map +1 -0
  226. package/dist/inspect.js +44 -0
  227. package/dist/inspect.js.map +1 -0
  228. package/dist/internal-tables.d.ts +1767 -0
  229. package/dist/internal-tables.d.ts.map +1 -0
  230. package/dist/internal-tables.js +114 -0
  231. package/dist/internal-tables.js.map +1 -0
  232. package/dist/jobs/cron.d.ts +15 -0
  233. package/dist/jobs/cron.d.ts.map +1 -0
  234. package/dist/jobs/cron.js +74 -0
  235. package/dist/jobs/cron.js.map +1 -0
  236. package/dist/jobs/define.d.ts +186 -0
  237. package/dist/jobs/define.d.ts.map +1 -0
  238. package/dist/jobs/define.js +99 -0
  239. package/dist/jobs/define.js.map +1 -0
  240. package/dist/jobs/index.d.ts +9 -0
  241. package/dist/jobs/index.d.ts.map +1 -0
  242. package/dist/jobs/index.js +7 -0
  243. package/dist/jobs/index.js.map +1 -0
  244. package/dist/jobs/queue.d.ts +13 -0
  245. package/dist/jobs/queue.d.ts.map +1 -0
  246. package/dist/jobs/queue.js +71 -0
  247. package/dist/jobs/queue.js.map +1 -0
  248. package/dist/jobs/slots.d.ts +30 -0
  249. package/dist/jobs/slots.d.ts.map +1 -0
  250. package/dist/jobs/slots.js +53 -0
  251. package/dist/jobs/slots.js.map +1 -0
  252. package/dist/jobs/worker.d.ts +45 -0
  253. package/dist/jobs/worker.d.ts.map +1 -0
  254. package/dist/jobs/worker.js +605 -0
  255. package/dist/jobs/worker.js.map +1 -0
  256. package/dist/lifecycle.d.ts +10 -0
  257. package/dist/lifecycle.d.ts.map +1 -0
  258. package/dist/lifecycle.js +37 -0
  259. package/dist/lifecycle.js.map +1 -0
  260. package/dist/list-query.d.ts +62 -0
  261. package/dist/list-query.d.ts.map +1 -0
  262. package/dist/list-query.js +190 -0
  263. package/dist/list-query.js.map +1 -0
  264. package/dist/live/apply.d.ts +13 -0
  265. package/dist/live/apply.d.ts.map +1 -0
  266. package/dist/live/apply.js +32 -0
  267. package/dist/live/apply.js.map +1 -0
  268. package/dist/live/index.d.ts +48 -0
  269. package/dist/live/index.d.ts.map +1 -0
  270. package/dist/live/index.js +108 -0
  271. package/dist/live/index.js.map +1 -0
  272. package/dist/live/protocol.d.ts +47 -0
  273. package/dist/live/protocol.d.ts.map +1 -0
  274. package/dist/live/protocol.js +12 -0
  275. package/dist/live/protocol.js.map +1 -0
  276. package/dist/live/sse.d.ts +22 -0
  277. package/dist/live/sse.d.ts.map +1 -0
  278. package/dist/live/sse.js +41 -0
  279. package/dist/live/sse.js.map +1 -0
  280. package/dist/logging.d.ts +8 -0
  281. package/dist/logging.d.ts.map +1 -0
  282. package/dist/logging.js +6 -0
  283. package/dist/logging.js.map +1 -0
  284. package/dist/manifest-diff.d.ts +6 -0
  285. package/dist/manifest-diff.d.ts.map +1 -0
  286. package/dist/manifest-diff.js +42 -0
  287. package/dist/manifest-diff.js.map +1 -0
  288. package/dist/manifest.d.ts +87 -0
  289. package/dist/manifest.d.ts.map +1 -0
  290. package/dist/manifest.js +237 -0
  291. package/dist/manifest.js.map +1 -0
  292. package/dist/messaging/email.d.ts +16 -0
  293. package/dist/messaging/email.d.ts.map +1 -0
  294. package/dist/messaging/email.js +8 -0
  295. package/dist/messaging/email.js.map +1 -0
  296. package/dist/messaging/index.d.ts +8 -0
  297. package/dist/messaging/index.d.ts.map +1 -0
  298. package/dist/messaging/index.js +4 -0
  299. package/dist/messaging/index.js.map +1 -0
  300. package/dist/messaging/journal.d.ts +4 -0
  301. package/dist/messaging/journal.d.ts.map +1 -0
  302. package/dist/messaging/journal.js +19 -0
  303. package/dist/messaging/journal.js.map +1 -0
  304. package/dist/messaging/runtime.d.ts +16 -0
  305. package/dist/messaging/runtime.d.ts.map +1 -0
  306. package/dist/messaging/runtime.js +213 -0
  307. package/dist/messaging/runtime.js.map +1 -0
  308. package/dist/messaging/standalone.d.ts +27 -0
  309. package/dist/messaging/standalone.d.ts.map +1 -0
  310. package/dist/messaging/standalone.js +18 -0
  311. package/dist/messaging/standalone.js.map +1 -0
  312. package/dist/messaging/telegram.d.ts +16 -0
  313. package/dist/messaging/telegram.d.ts.map +1 -0
  314. package/dist/messaging/telegram.js +5 -0
  315. package/dist/messaging/telegram.js.map +1 -0
  316. package/dist/messaging/types.d.ts +22 -0
  317. package/dist/messaging/types.d.ts.map +1 -0
  318. package/dist/messaging/types.js +17 -0
  319. package/dist/messaging/types.js.map +1 -0
  320. package/dist/platform.d.ts +25 -0
  321. package/dist/platform.d.ts.map +1 -0
  322. package/dist/platform.js +24 -0
  323. package/dist/platform.js.map +1 -0
  324. package/dist/provision-internals.d.ts +23 -0
  325. package/dist/provision-internals.d.ts.map +1 -0
  326. package/dist/provision-internals.js +7 -0
  327. package/dist/provision-internals.js.map +1 -0
  328. package/dist/provision-runtime.d.ts +6 -0
  329. package/dist/provision-runtime.d.ts.map +1 -0
  330. package/dist/provision-runtime.js +41 -0
  331. package/dist/provision-runtime.js.map +1 -0
  332. package/dist/provision-schema.d.ts +16 -0
  333. package/dist/provision-schema.d.ts.map +1 -0
  334. package/dist/provision-schema.js +59 -0
  335. package/dist/provision-schema.js.map +1 -0
  336. package/dist/provision.d.ts +8 -0
  337. package/dist/provision.d.ts.map +1 -0
  338. package/dist/provision.js +16 -0
  339. package/dist/provision.js.map +1 -0
  340. package/dist/query/api.d.ts +10 -0
  341. package/dist/query/api.d.ts.map +1 -0
  342. package/dist/query/api.js +7 -0
  343. package/dist/query/api.js.map +1 -0
  344. package/dist/query/client.d.ts +28 -0
  345. package/dist/query/client.d.ts.map +1 -0
  346. package/dist/query/client.js +87 -0
  347. package/dist/query/client.js.map +1 -0
  348. package/dist/query/fetch.d.ts +3 -0
  349. package/dist/query/fetch.d.ts.map +1 -0
  350. package/dist/query/fetch.js +4 -0
  351. package/dist/query/fetch.js.map +1 -0
  352. package/dist/query/index.d.ts +8 -0
  353. package/dist/query/index.d.ts.map +1 -0
  354. package/dist/query/index.js +4 -0
  355. package/dist/query/index.js.map +1 -0
  356. package/dist/query/infer.d.ts +25 -0
  357. package/dist/query/infer.d.ts.map +1 -0
  358. package/dist/query/infer.js +2 -0
  359. package/dist/query/infer.js.map +1 -0
  360. package/dist/query/react.d.ts +3 -0
  361. package/dist/query/react.d.ts.map +1 -0
  362. package/dist/query/react.js +2 -0
  363. package/dist/query/react.js.map +1 -0
  364. package/dist/query/realtime-flush.d.ts +26 -0
  365. package/dist/query/realtime-flush.d.ts.map +1 -0
  366. package/dist/query/realtime-flush.js +45 -0
  367. package/dist/query/realtime-flush.js.map +1 -0
  368. package/dist/query/realtime-stream.d.ts +3 -0
  369. package/dist/query/realtime-stream.d.ts.map +1 -0
  370. package/dist/query/realtime-stream.js +3 -0
  371. package/dist/query/realtime-stream.js.map +1 -0
  372. package/dist/query/realtime.d.ts +88 -0
  373. package/dist/query/realtime.d.ts.map +1 -0
  374. package/dist/query/realtime.js +255 -0
  375. package/dist/query/realtime.js.map +1 -0
  376. package/dist/rate-limit.d.ts +8 -0
  377. package/dist/rate-limit.d.ts.map +1 -0
  378. package/dist/rate-limit.js +46 -0
  379. package/dist/rate-limit.js.map +1 -0
  380. package/dist/readiness-probes.d.ts +4 -0
  381. package/dist/readiness-probes.d.ts.map +1 -0
  382. package/dist/readiness-probes.js +23 -0
  383. package/dist/readiness-probes.js.map +1 -0
  384. package/dist/readiness.d.ts +39 -0
  385. package/dist/readiness.d.ts.map +1 -0
  386. package/dist/readiness.js +72 -0
  387. package/dist/readiness.js.map +1 -0
  388. package/dist/realtime/facade.d.ts +20 -0
  389. package/dist/realtime/facade.d.ts.map +1 -0
  390. package/dist/realtime/facade.js +37 -0
  391. package/dist/realtime/facade.js.map +1 -0
  392. package/dist/realtime/filter.d.ts +42 -0
  393. package/dist/realtime/filter.d.ts.map +1 -0
  394. package/dist/realtime/filter.js +86 -0
  395. package/dist/realtime/filter.js.map +1 -0
  396. package/dist/realtime/heartbeat.d.ts +20 -0
  397. package/dist/realtime/heartbeat.d.ts.map +1 -0
  398. package/dist/realtime/heartbeat.js +64 -0
  399. package/dist/realtime/heartbeat.js.map +1 -0
  400. package/dist/realtime/publisher.d.ts +19 -0
  401. package/dist/realtime/publisher.d.ts.map +1 -0
  402. package/dist/realtime/publisher.js +8 -0
  403. package/dist/realtime/publisher.js.map +1 -0
  404. package/dist/runtime.d.ts +141 -0
  405. package/dist/runtime.d.ts.map +1 -0
  406. package/dist/runtime.js +463 -0
  407. package/dist/runtime.js.map +1 -0
  408. package/dist/schema-export.d.ts +2 -0
  409. package/dist/schema-export.d.ts.map +1 -0
  410. package/dist/schema-export.js +2 -0
  411. package/dist/schema-export.js.map +1 -0
  412. package/dist/scope.d.ts +4 -0
  413. package/dist/scope.d.ts.map +1 -0
  414. package/dist/scope.js +13 -0
  415. package/dist/scope.js.map +1 -0
  416. package/dist/standard-schema.d.ts +13 -0
  417. package/dist/standard-schema.d.ts.map +1 -0
  418. package/dist/standard-schema.js +34 -0
  419. package/dist/standard-schema.js.map +1 -0
  420. package/dist/start/auth-client.d.ts +11 -0
  421. package/dist/start/auth-client.d.ts.map +1 -0
  422. package/dist/start/auth-client.js +15 -0
  423. package/dist/start/auth-client.js.map +1 -0
  424. package/dist/start/create-start-worker.d.ts +16 -0
  425. package/dist/start/create-start-worker.d.ts.map +1 -0
  426. package/dist/start/create-start-worker.js +24 -0
  427. package/dist/start/create-start-worker.js.map +1 -0
  428. package/dist/start/index.d.ts +66 -0
  429. package/dist/start/index.d.ts.map +1 -0
  430. package/dist/start/index.js +49 -0
  431. package/dist/start/index.js.map +1 -0
  432. package/dist/start/isomorphic-fetch.d.ts +22 -0
  433. package/dist/start/isomorphic-fetch.d.ts.map +1 -0
  434. package/dist/start/isomorphic-fetch.js +49 -0
  435. package/dist/start/isomorphic-fetch.js.map +1 -0
  436. package/dist/start/server-entry.d.ts +7 -0
  437. package/dist/start/server-entry.d.ts.map +1 -0
  438. package/dist/start/server-entry.js +8 -0
  439. package/dist/start/server-entry.js.map +1 -0
  440. package/dist/storage/background.d.ts +3 -0
  441. package/dist/storage/background.d.ts.map +1 -0
  442. package/dist/storage/background.js +3 -0
  443. package/dist/storage/background.js.map +1 -0
  444. package/dist/storage/buckets.d.ts +78 -0
  445. package/dist/storage/buckets.d.ts.map +1 -0
  446. package/dist/storage/buckets.js +177 -0
  447. package/dist/storage/buckets.js.map +1 -0
  448. package/dist/storage/delete.d.ts +8 -0
  449. package/dist/storage/delete.d.ts.map +1 -0
  450. package/dist/storage/delete.js +10 -0
  451. package/dist/storage/delete.js.map +1 -0
  452. package/dist/storage/file-meta.d.ts +37 -0
  453. package/dist/storage/file-meta.d.ts.map +1 -0
  454. package/dist/storage/file-meta.js +166 -0
  455. package/dist/storage/file-meta.js.map +1 -0
  456. package/dist/storage/index.d.ts +28 -0
  457. package/dist/storage/index.d.ts.map +1 -0
  458. package/dist/storage/index.js +5 -0
  459. package/dist/storage/index.js.map +1 -0
  460. package/dist/storage/local.d.ts +15 -0
  461. package/dist/storage/local.d.ts.map +1 -0
  462. package/dist/storage/local.js +56 -0
  463. package/dist/storage/local.js.map +1 -0
  464. package/dist/storage/operations.d.ts +54 -0
  465. package/dist/storage/operations.d.ts.map +1 -0
  466. package/dist/storage/operations.js +212 -0
  467. package/dist/storage/operations.js.map +1 -0
  468. package/dist/storage/registry.d.ts +11 -0
  469. package/dist/storage/registry.d.ts.map +1 -0
  470. package/dist/storage/registry.js +23 -0
  471. package/dist/storage/registry.js.map +1 -0
  472. package/dist/storage/s3.d.ts +35 -0
  473. package/dist/storage/s3.d.ts.map +1 -0
  474. package/dist/storage/s3.js +125 -0
  475. package/dist/storage/s3.js.map +1 -0
  476. package/dist/storage/sigv4.d.ts +24 -0
  477. package/dist/storage/sigv4.d.ts.map +1 -0
  478. package/dist/storage/sigv4.js +107 -0
  479. package/dist/storage/sigv4.js.map +1 -0
  480. package/dist/storage/sweep.d.ts +9 -0
  481. package/dist/storage/sweep.d.ts.map +1 -0
  482. package/dist/storage/sweep.js +17 -0
  483. package/dist/storage/sweep.js.map +1 -0
  484. package/dist/sync/collection.d.ts +106 -0
  485. package/dist/sync/collection.d.ts.map +1 -0
  486. package/dist/sync/collection.js +258 -0
  487. package/dist/sync/collection.js.map +1 -0
  488. package/dist/sync/index.d.ts +8 -0
  489. package/dist/sync/index.d.ts.map +1 -0
  490. package/dist/sync/index.js +4 -0
  491. package/dist/sync/index.js.map +1 -0
  492. package/dist/sync/realtime-sync.d.ts +31 -0
  493. package/dist/sync/realtime-sync.d.ts.map +1 -0
  494. package/dist/sync/realtime-sync.js +46 -0
  495. package/dist/sync/realtime-sync.js.map +1 -0
  496. package/dist/sync/sync-client.d.ts +28 -0
  497. package/dist/sync/sync-client.d.ts.map +1 -0
  498. package/dist/sync/sync-client.js +52 -0
  499. package/dist/sync/sync-client.js.map +1 -0
  500. package/dist/sync/update-queue.d.ts +27 -0
  501. package/dist/sync/update-queue.d.ts.map +1 -0
  502. package/dist/sync/update-queue.js +66 -0
  503. package/dist/sync/update-queue.js.map +1 -0
  504. package/dist/testing/auth.d.ts +85 -0
  505. package/dist/testing/auth.d.ts.map +1 -0
  506. package/dist/testing/auth.js +140 -0
  507. package/dist/testing/auth.js.map +1 -0
  508. package/dist/testing/client.d.ts +6 -0
  509. package/dist/testing/client.d.ts.map +1 -0
  510. package/dist/testing/client.js +9 -0
  511. package/dist/testing/client.js.map +1 -0
  512. package/dist/testing/database.d.ts +6 -0
  513. package/dist/testing/database.d.ts.map +1 -0
  514. package/dist/testing/database.js +8 -0
  515. package/dist/testing/database.js.map +1 -0
  516. package/dist/testing/email.d.ts +15 -0
  517. package/dist/testing/email.d.ts.map +1 -0
  518. package/dist/testing/email.js +32 -0
  519. package/dist/testing/email.js.map +1 -0
  520. package/dist/testing/fixture.d.ts +51 -0
  521. package/dist/testing/fixture.d.ts.map +1 -0
  522. package/dist/testing/fixture.js +177 -0
  523. package/dist/testing/fixture.js.map +1 -0
  524. package/dist/testing/jobs.d.ts +40 -0
  525. package/dist/testing/jobs.d.ts.map +1 -0
  526. package/dist/testing/jobs.js +76 -0
  527. package/dist/testing/jobs.js.map +1 -0
  528. package/dist/testing/logs.d.ts +18 -0
  529. package/dist/testing/logs.d.ts.map +1 -0
  530. package/dist/testing/logs.js +53 -0
  531. package/dist/testing/logs.js.map +1 -0
  532. package/dist/testing/messaging.d.ts +21 -0
  533. package/dist/testing/messaging.d.ts.map +1 -0
  534. package/dist/testing/messaging.js +34 -0
  535. package/dist/testing/messaging.js.map +1 -0
  536. package/dist/testing/storage.d.ts +7 -0
  537. package/dist/testing/storage.d.ts.map +1 -0
  538. package/dist/testing/storage.js +29 -0
  539. package/dist/testing/storage.js.map +1 -0
  540. package/dist/testing/workers-fakes.d.ts +17 -0
  541. package/dist/testing/workers-fakes.d.ts.map +1 -0
  542. package/dist/testing/workers-fakes.js +98 -0
  543. package/dist/testing/workers-fakes.js.map +1 -0
  544. package/dist/testing.d.ts +12 -0
  545. package/dist/testing.d.ts.map +1 -0
  546. package/dist/testing.js +5 -0
  547. package/dist/testing.js.map +1 -0
  548. package/dist/typeid.d.ts +46 -0
  549. package/dist/typeid.d.ts.map +1 -0
  550. package/dist/typeid.js +130 -0
  551. package/dist/typeid.js.map +1 -0
  552. package/dist/vite.d.ts +26 -0
  553. package/dist/vite.d.ts.map +1 -0
  554. package/dist/vite.js +100 -0
  555. package/dist/vite.js.map +1 -0
  556. package/dist/worker-plan.d.ts +37 -0
  557. package/dist/worker-plan.d.ts.map +1 -0
  558. package/dist/worker-plan.js +63 -0
  559. package/dist/worker-plan.js.map +1 -0
  560. package/dist/workers/app.d.ts +19 -0
  561. package/dist/workers/app.d.ts.map +1 -0
  562. package/dist/workers/app.js +56 -0
  563. package/dist/workers/app.js.map +1 -0
  564. package/dist/workers/entry.d.ts +7 -0
  565. package/dist/workers/entry.d.ts.map +1 -0
  566. package/dist/workers/entry.js +8 -0
  567. package/dist/workers/entry.js.map +1 -0
  568. package/dist/workers/index.d.ts +23 -0
  569. package/dist/workers/index.d.ts.map +1 -0
  570. package/dist/workers/index.js +39 -0
  571. package/dist/workers/index.js.map +1 -0
  572. package/dist/workers/r2.d.ts +24 -0
  573. package/dist/workers/r2.d.ts.map +1 -0
  574. package/dist/workers/r2.js +76 -0
  575. package/dist/workers/r2.js.map +1 -0
  576. package/dist/workers/rate-limiter.d.ts +9 -0
  577. package/dist/workers/rate-limiter.d.ts.map +1 -0
  578. package/dist/workers/rate-limiter.js +22 -0
  579. package/dist/workers/rate-limiter.js.map +1 -0
  580. package/dist/workers/realtime-hub.d.ts +20 -0
  581. package/dist/workers/realtime-hub.d.ts.map +1 -0
  582. package/dist/workers/realtime-hub.js +117 -0
  583. package/dist/workers/realtime-hub.js.map +1 -0
  584. package/dist/workers/registry.d.ts +13 -0
  585. package/dist/workers/registry.d.ts.map +1 -0
  586. package/dist/workers/registry.js +19 -0
  587. package/dist/workers/registry.js.map +1 -0
  588. package/dist/workers/scheduler.d.ts +13 -0
  589. package/dist/workers/scheduler.d.ts.map +1 -0
  590. package/dist/workers/scheduler.js +71 -0
  591. package/dist/workers/scheduler.js.map +1 -0
  592. package/dist/workers/types.d.ts +55 -0
  593. package/dist/workers/types.d.ts.map +1 -0
  594. package/dist/workers/types.js +4 -0
  595. package/dist/workers/types.js.map +1 -0
  596. package/dist/workers/wrangler.d.ts +62 -0
  597. package/dist/workers/wrangler.d.ts.map +1 -0
  598. package/dist/workers/wrangler.js +90 -0
  599. package/dist/workers/wrangler.js.map +1 -0
  600. package/package.json +286 -0
  601. package/skills/creating-workerstack-apps/SKILL.md +45 -0
  602. package/skills/creating-workerstack-apps/agents/openai.yaml +4 -0
  603. package/skills/creating-workerstack-apps/references/application-structure.md +219 -0
  604. package/skills/creating-workerstack-apps/references/runtime-integrations.md +96 -0
  605. package/skills/creating-workerstack-apps/references/verification.md +29 -0
@@ -0,0 +1,605 @@
1
+ // src/jobs/worker.ts — the queue worker. One `tick()` is a full cycle:
2
+ // recover expired leases → reap old succeeded rows → claim and run queue jobs.
3
+ import { and, desc, eq, inArray, isNotNull, lt, lte, sql } from 'drizzle-orm';
4
+ import { workerstackJobs } from '../internal-tables.js';
5
+ import { consoleLogger } from '../logging.js';
6
+ import { validateStandardSchema } from '../standard-schema.js';
7
+ import { parseCron } from './cron.js';
8
+ import { backoffMs, DEFAULT_RETRIES, leaseDurationFor } from './define.js';
9
+ import { enqueueJob } from './queue.js';
10
+ import { CRON_PREFIX, floorSlot, nextCronSlot, slotsDue, SLOT_MS, } from './slots.js';
11
+ const CLAIM_BATCH = 10;
12
+ const SUCCEEDED_RETENTION_MS = 24 * 60 * 60 * 1000;
13
+ const REAP_INTERVAL_MS = 60 * 60_000;
14
+ class JobExecutionTimeoutError extends Error {
15
+ constructor(maxRuntime) {
16
+ super(`execution timed out after ${maxRuntime}ms`);
17
+ this.name = 'JobExecutionTimeoutError';
18
+ }
19
+ }
20
+ class JobLeaseLostError extends Error {
21
+ constructor() {
22
+ super('job lease ownership was lost');
23
+ this.name = 'JobLeaseLostError';
24
+ }
25
+ }
26
+ function jobEvent(event, row, fields = {}) {
27
+ return {
28
+ source: 'workerstack.jobs',
29
+ event,
30
+ jobId: row.id,
31
+ jobType: row.type,
32
+ attempt: Number(row.attempts),
33
+ ...fields,
34
+ };
35
+ }
36
+ function capacityFor(def) {
37
+ return def.kind === 'job' && def.concurrency !== undefined
38
+ ? def.concurrency
39
+ : CLAIM_BATCH;
40
+ }
41
+ function toError(err) {
42
+ return err instanceof Error ? err : new Error(String(err));
43
+ }
44
+ function maxAttempts(def) {
45
+ return 1 + (def.retries ?? DEFAULT_RETRIES);
46
+ }
47
+ /** Resolve a stored row type back to its definition. Cron rows carry the
48
+ * reserved prefix; queue rows use the definition key verbatim. */
49
+ function definitionFor(defs, type) {
50
+ if (type.startsWith(CRON_PREFIX)) {
51
+ const def = defs[type.slice(CRON_PREFIX.length)];
52
+ return def?.kind === 'cron' ? def : undefined;
53
+ }
54
+ const def = defs[type];
55
+ return def?.kind === 'job' ? def : undefined;
56
+ }
57
+ /** Queue jobs release terminal dedupe keys; cron slots retain durable ownership. */
58
+ function terminalPatch(def) {
59
+ return def.kind === 'cron' ? {} : { dedupeKey: null };
60
+ }
61
+ /** `dedupeUntil: 'start'` releases the key at claim; everything else keeps it
62
+ * until a terminal state, so the claim patch stays unchanged for them. */
63
+ function claimPatch(def) {
64
+ return def.kind === 'job' && def.dedupeUntil === 'start'
65
+ ? { dedupeKey: null }
66
+ : {};
67
+ }
68
+ export function createJobRunner(deps) {
69
+ const { db, defs } = deps;
70
+ const logger = deps.logger ?? consoleLogger;
71
+ const t = workerstackJobs;
72
+ const ctx = { ...deps.ctx };
73
+ let lastReapAt = 0;
74
+ const active = new Map();
75
+ const cronCursors = new Map();
76
+ function ownershipPredicate(id, owner) {
77
+ return and(eq(t.id, id), eq(t.status, 'running'), eq(t.attempts, owner.attempt), eq(t.lockedUntil, owner.lockedUntil));
78
+ }
79
+ function startLeaseHeartbeat(args) {
80
+ const owner = args.owner;
81
+ const intervalMs = Math.max(10, Math.floor(leaseDurationFor(args.def) / 3));
82
+ let stopped = false;
83
+ let resolveLost;
84
+ const lost = new Promise((resolve) => {
85
+ resolveLost = resolve;
86
+ });
87
+ let chain = Promise.resolve();
88
+ const lose = () => {
89
+ if (stopped)
90
+ return;
91
+ stopped = true;
92
+ clearInterval(timer);
93
+ resolveLost();
94
+ args.onLost();
95
+ };
96
+ const renew = () => {
97
+ chain = chain
98
+ .then(async () => {
99
+ if (stopped)
100
+ return;
101
+ const nextLockedUntil = Date.now() + leaseDurationFor(args.def);
102
+ const updated = await db
103
+ .update(t)
104
+ .set({ lockedUntil: nextLockedUntil })
105
+ .where(ownershipPredicate(args.row.id, owner))
106
+ .returning({ id: t.id });
107
+ if (!updated[0])
108
+ return lose();
109
+ owner.lockedUntil = nextLockedUntil;
110
+ })
111
+ .catch(() => lose());
112
+ };
113
+ const timer = setInterval(renew, intervalMs);
114
+ return {
115
+ owner,
116
+ lost,
117
+ async stop() {
118
+ stopped = true;
119
+ clearInterval(timer);
120
+ await chain;
121
+ },
122
+ };
123
+ }
124
+ /** Cron rows carry no payload — their handler input is the slot itself. */
125
+ function resolveInput(def, row) {
126
+ if (def.kind === 'cron') {
127
+ return { scheduledFor: new Date(Number(row.runAt)) };
128
+ }
129
+ const raw = JSON.parse(row.payloadJson);
130
+ return def.input
131
+ ? validateStandardSchema(def.input, raw, 'job payload')
132
+ : undefined;
133
+ }
134
+ /** Hydrate each cron cursor once, then advance it in this worker's memory. */
135
+ async function cronCursor(type, now) {
136
+ const cached = cronCursors.get(type);
137
+ if (cached)
138
+ return cached;
139
+ const rows = await db
140
+ .select({ runAt: t.runAt })
141
+ .from(t)
142
+ .where(eq(t.type, type))
143
+ .orderBy(desc(t.runAt))
144
+ .limit(1);
145
+ const cursor = {
146
+ checkedThrough: rows[0]?.runAt == null
147
+ ? floorSlot(now) - SLOT_MS
148
+ : Number(rows[0].runAt),
149
+ };
150
+ cronCursors.set(type, cursor);
151
+ return cursor;
152
+ }
153
+ /** Enqueue a row per due slot. The unique(type, dedupeKey) constraint makes
154
+ * this safe to run concurrently in any number of processes. */
155
+ async function materializeCronSlots(now) {
156
+ const through = floorSlot(now);
157
+ for (const [name, def] of Object.entries(defs)) {
158
+ if (def.kind !== 'cron')
159
+ continue;
160
+ const type = `${CRON_PREFIX}${name}`;
161
+ const cursor = await cronCursor(type, now);
162
+ const slots = slotsDue({
163
+ cron: parseCron(def.schedule),
164
+ from: cursor.checkedThrough,
165
+ to: through,
166
+ catchUp: def.catchUp,
167
+ catchUpWindowMs: def.catchUpWindow,
168
+ });
169
+ for (const slot of slots) {
170
+ await enqueueJob(db, defs, name, null, {
171
+ runAt: slot,
172
+ dedupeKey: String(slot),
173
+ });
174
+ cursor.checkedThrough = slot;
175
+ }
176
+ cursor.checkedThrough = Math.max(cursor.checkedThrough, through);
177
+ }
178
+ }
179
+ async function fireOnFailed(def, input, error) {
180
+ if (!def.onFailed)
181
+ return;
182
+ try {
183
+ await def.onFailed(input, error, ctx);
184
+ }
185
+ catch (hookErr) {
186
+ logger.error('[workerstack] onFailed hook threw:', hookErr);
187
+ }
188
+ }
189
+ /** running rows whose lease expired → pending (or failed when exhausted). */
190
+ async function recoverExpiredLeases(now) {
191
+ const expired = await db
192
+ .select({
193
+ id: t.id,
194
+ type: t.type,
195
+ payloadJson: t.payloadJson,
196
+ attempts: t.attempts,
197
+ lastError: t.lastError,
198
+ runAt: t.runAt,
199
+ lockedUntil: t.lockedUntil,
200
+ })
201
+ .from(t)
202
+ .where(and(eq(t.status, 'running'), isNotNull(t.lockedUntil), lt(t.lockedUntil, now)));
203
+ for (const row of expired) {
204
+ const owner = {
205
+ attempt: Number(row.attempts),
206
+ lockedUntil: Number(row.lockedUntil),
207
+ };
208
+ const def = definitionFor(defs, row.type);
209
+ const error = new Error('lease expired (worker crashed or timed out)');
210
+ if (!def) {
211
+ await db
212
+ .update(t)
213
+ .set({
214
+ status: 'failed',
215
+ finishedAt: now,
216
+ lockedUntil: null,
217
+ lastError: `unknown job type "${row.type}"`,
218
+ dedupeKey: null,
219
+ })
220
+ .where(ownershipPredicate(row.id, owner));
221
+ continue;
222
+ }
223
+ if (Number(row.attempts) >= maxAttempts(def)) {
224
+ const updated = await db
225
+ .update(t)
226
+ .set({
227
+ status: 'failed',
228
+ finishedAt: now,
229
+ lockedUntil: null,
230
+ lastError: error.message,
231
+ ...terminalPatch(def),
232
+ })
233
+ .where(ownershipPredicate(row.id, owner))
234
+ .returning({ id: t.id });
235
+ if (updated[0])
236
+ await fireOnFailed(def, resolveInput(def, row), error);
237
+ }
238
+ else {
239
+ await db
240
+ .update(t)
241
+ .set({
242
+ status: 'pending',
243
+ lockedUntil: null,
244
+ runAt: now + backoffMs(def, Number(row.attempts)),
245
+ lastError: error.message,
246
+ })
247
+ .where(ownershipPredicate(row.id, owner));
248
+ }
249
+ }
250
+ }
251
+ async function reapSucceeded(now) {
252
+ await db
253
+ .delete(t)
254
+ .where(and(eq(t.status, 'succeeded'), lt(t.finishedAt, now - SUCCEEDED_RETENTION_MS)));
255
+ }
256
+ /** Atomically claim up to `limit` runnable jobs of one type. */
257
+ async function claim(type, def, limit, now, leaseUntil) {
258
+ const pendingIds = db
259
+ .select({ id: t.id })
260
+ .from(t)
261
+ .where(and(eq(t.type, type), eq(t.status, 'pending'), lte(t.runAt, now)))
262
+ .orderBy(t.runAt)
263
+ .limit(limit);
264
+ // SQLite's single-writer model makes the one-statement UPDATE atomic.
265
+ const sub = pendingIds;
266
+ const rows = await db
267
+ .update(t)
268
+ .set({
269
+ status: 'running',
270
+ lockedUntil: leaseUntil,
271
+ attempts: sql `${t.attempts} + 1`,
272
+ ...claimPatch(def),
273
+ })
274
+ .where(and(inArray(t.id, sub), eq(t.status, 'pending')))
275
+ .returning({
276
+ id: t.id,
277
+ type: t.type,
278
+ payloadJson: t.payloadJson,
279
+ attempts: t.attempts,
280
+ runAt: t.runAt,
281
+ });
282
+ return rows;
283
+ }
284
+ async function claimAvailable(type, def, now) {
285
+ const runningRows = await db
286
+ .select({ id: t.id })
287
+ .from(t)
288
+ .where(and(eq(t.type, type), eq(t.status, 'running')));
289
+ let available = capacityFor(def) - runningRows.length;
290
+ if (available <= 0)
291
+ return [];
292
+ const leaseUntil = now + leaseDurationFor(def);
293
+ const work = [];
294
+ while (available > 0) {
295
+ const limit = Math.min(CLAIM_BATCH, available);
296
+ const rows = await claim(type, def, limit, now, leaseUntil);
297
+ for (const row of rows) {
298
+ work.push({
299
+ row,
300
+ def,
301
+ owner: { attempt: Number(row.attempts), lockedUntil: leaseUntil },
302
+ });
303
+ }
304
+ available -= rows.length;
305
+ if (rows.length < limit)
306
+ break;
307
+ }
308
+ return work;
309
+ }
310
+ // `now` is the tick's injected clock: retry runAt math uses it so tests can
311
+ // drive backoff deterministically. finishedAt uses the real clock (a handler
312
+ // may run long past the tick's start).
313
+ async function runJob(row, def, now, owner) {
314
+ const startedAt = Date.now();
315
+ let input;
316
+ try {
317
+ input = resolveInput(def, row);
318
+ }
319
+ catch (err) {
320
+ // Stored payload no longer parses (schema drift): retrying can't help.
321
+ const e = toError(err);
322
+ const updated = await db
323
+ .update(t)
324
+ .set({
325
+ status: 'failed',
326
+ finishedAt: Date.now(),
327
+ lockedUntil: null,
328
+ lastError: e.message,
329
+ ...terminalPatch(def),
330
+ })
331
+ .where(ownershipPredicate(row.id, owner))
332
+ .returning({ id: t.id });
333
+ if (!updated[0])
334
+ return 'lost';
335
+ await fireOnFailed(def, undefined, e);
336
+ return 'failed';
337
+ }
338
+ const controller = new AbortController();
339
+ const handlerCtx = { ...ctx, signal: controller.signal };
340
+ logger.info(JSON.stringify(jobEvent('job.claimed', row)));
341
+ let lost = false;
342
+ const heartbeat = startLeaseHeartbeat({
343
+ row,
344
+ def,
345
+ owner,
346
+ onLost: () => {
347
+ lost = true;
348
+ controller.abort(new JobLeaseLostError());
349
+ logger.warn(JSON.stringify(jobEvent('job.lease_lost', row, {
350
+ durationMs: Date.now() - startedAt,
351
+ })));
352
+ },
353
+ });
354
+ const deadline = def.maxRuntime === undefined
355
+ ? undefined
356
+ : setTimeout(() => {
357
+ controller.abort(new JobExecutionTimeoutError(def.maxRuntime));
358
+ logger.warn(JSON.stringify(jobEvent('job.execution_timed_out', row, {
359
+ durationMs: Date.now() - startedAt,
360
+ })));
361
+ }, def.maxRuntime);
362
+ try {
363
+ await def.handler(input, handlerCtx);
364
+ if (controller.signal.reason instanceof JobExecutionTimeoutError) {
365
+ throw controller.signal.reason;
366
+ }
367
+ if (deadline)
368
+ clearTimeout(deadline);
369
+ await heartbeat.stop();
370
+ if (lost)
371
+ return 'lost';
372
+ const updated = await db
373
+ .update(t)
374
+ .set({
375
+ status: 'succeeded',
376
+ finishedAt: Date.now(),
377
+ lockedUntil: null,
378
+ ...terminalPatch(def),
379
+ })
380
+ .where(ownershipPredicate(row.id, owner))
381
+ .returning({ id: t.id });
382
+ if (!updated[0])
383
+ return 'lost';
384
+ logger.info(JSON.stringify(jobEvent('job.completed', row, {
385
+ durationMs: Date.now() - startedAt,
386
+ })));
387
+ return 'ran';
388
+ }
389
+ catch (err) {
390
+ if (deadline)
391
+ clearTimeout(deadline);
392
+ const e = controller.signal.reason instanceof JobExecutionTimeoutError
393
+ ? controller.signal.reason
394
+ : toError(err);
395
+ await heartbeat.stop();
396
+ if (lost)
397
+ return 'lost';
398
+ if (Number(row.attempts) < maxAttempts(def)) {
399
+ const updated = await db
400
+ .update(t)
401
+ .set({
402
+ status: 'pending',
403
+ lockedUntil: null,
404
+ runAt: now + backoffMs(def, Number(row.attempts)),
405
+ lastError: e.message,
406
+ })
407
+ .where(ownershipPredicate(row.id, owner))
408
+ .returning({ id: t.id });
409
+ if (!updated[0])
410
+ return 'lost';
411
+ logger.warn(JSON.stringify(jobEvent('job.retrying', row, {
412
+ durationMs: Date.now() - startedAt,
413
+ error: e.message,
414
+ })));
415
+ }
416
+ else {
417
+ const updated = await db
418
+ .update(t)
419
+ .set({
420
+ status: 'failed',
421
+ finishedAt: Date.now(),
422
+ lockedUntil: null,
423
+ lastError: e.message,
424
+ ...terminalPatch(def),
425
+ })
426
+ .where(ownershipPredicate(row.id, owner))
427
+ .returning({ id: t.id });
428
+ if (!updated[0])
429
+ return 'lost';
430
+ logger.error(JSON.stringify(jobEvent('job.failed', row, {
431
+ durationMs: Date.now() - startedAt,
432
+ error: e.message,
433
+ })));
434
+ await fireOnFailed(def, input, e);
435
+ }
436
+ return 'failed';
437
+ }
438
+ }
439
+ async function runClaimable(now) {
440
+ const claimedWork = [];
441
+ let totalClaimed = 0;
442
+ for (const [name, def] of Object.entries(defs)) {
443
+ const type = def.kind === 'cron' ? `${CRON_PREFIX}${name}` : name;
444
+ const claimed = await claimAvailable(type, def, now);
445
+ totalClaimed += claimed.length;
446
+ claimedWork.push(...claimed);
447
+ }
448
+ // Claim the whole tick snapshot before starting any handler. Work enqueued
449
+ // by a handler therefore belongs to the next tick, regardless of the
450
+ // declaration order of its target job type.
451
+ const outcomes = await Promise.all(claimedWork.map(({ row, def, owner }) => runJob(row, def, now, owner)));
452
+ let ran = 0;
453
+ let failed = 0;
454
+ for (const outcome of outcomes) {
455
+ if (outcome === 'ran')
456
+ ran++;
457
+ else if (outcome === 'failed')
458
+ failed++;
459
+ }
460
+ return { claimed: totalClaimed, ran, failed };
461
+ }
462
+ async function maintain(now) {
463
+ await materializeCronSlots(now);
464
+ await recoverExpiredLeases(now);
465
+ if (now - lastReapAt >= REAP_INTERVAL_MS) {
466
+ lastReapAt = now;
467
+ await reapSucceeded(now);
468
+ }
469
+ }
470
+ function startWork(type, work, claimedAt) {
471
+ let tasks = active.get(type);
472
+ if (!tasks) {
473
+ tasks = new Set();
474
+ active.set(type, tasks);
475
+ }
476
+ let task;
477
+ task = runJob(work.row, work.def, claimedAt, work.owner)
478
+ .then(() => undefined)
479
+ .catch((error) => {
480
+ logger.error('[workerstack] background job execution failed:', error);
481
+ })
482
+ .finally(() => {
483
+ tasks.delete(task);
484
+ if (tasks.size === 0)
485
+ active.delete(type);
486
+ });
487
+ tasks.add(task);
488
+ return task;
489
+ }
490
+ async function pump(now = Date.now()) {
491
+ await maintain(now);
492
+ for (const [name, def] of Object.entries(defs)) {
493
+ const type = def.kind === 'cron' ? `${CRON_PREFIX}${name}` : name;
494
+ const work = await claimAvailable(type, def, now);
495
+ for (const item of work)
496
+ startWork(type, item, now);
497
+ }
498
+ const snapshot = [...active.values()].flatMap((tasks) => [...tasks]);
499
+ return snapshot.length === 0
500
+ ? {}
501
+ : { wake: Promise.race(snapshot).then(() => undefined) };
502
+ }
503
+ async function drain() {
504
+ const snapshot = [...active.values()].flatMap((tasks) => [...tasks]);
505
+ await Promise.allSettled(snapshot);
506
+ }
507
+ return {
508
+ async tick(now = Date.now()) {
509
+ await maintain(now);
510
+ return runClaimable(now);
511
+ },
512
+ pump,
513
+ drain,
514
+ /**
515
+ * The earliest time that has work: a pending run_at, a running lease end,
516
+ * or a cron slot not yet materialized. Never earlier than `now`; null when
517
+ * nothing is due before `until`.
518
+ */
519
+ async nextDueAt(now, until) {
520
+ const candidates = [];
521
+ const [pending] = await db
522
+ .select({ at: sql `min(${t.runAt})` })
523
+ .from(t)
524
+ .where(eq(t.status, 'pending'));
525
+ if (pending?.at != null)
526
+ candidates.push(Number(pending.at));
527
+ const [running] = await db
528
+ .select({ at: sql `min(${t.lockedUntil})` })
529
+ .from(t)
530
+ .where(eq(t.status, 'running'));
531
+ if (running?.at != null)
532
+ candidates.push(Number(running.at));
533
+ for (const [name, def] of Object.entries(defs)) {
534
+ if (def.kind !== 'cron')
535
+ continue;
536
+ const cursor = await cronCursor(`${CRON_PREFIX}${name}`, now);
537
+ const slot = nextCronSlot(parseCron(def.schedule), cursor.checkedThrough, until);
538
+ if (slot !== null)
539
+ candidates.push(slot);
540
+ }
541
+ if (candidates.length === 0)
542
+ return null;
543
+ return Math.max(now, Math.min(...candidates));
544
+ },
545
+ async inspect(now) {
546
+ const runnableRows = await db
547
+ .select({ id: t.id })
548
+ .from(t)
549
+ .where(and(eq(t.status, 'pending'), lte(t.runAt, now)));
550
+ const failed = await db
551
+ .select({
552
+ id: t.id,
553
+ type: t.type,
554
+ attempts: t.attempts,
555
+ lastError: t.lastError,
556
+ })
557
+ .from(t)
558
+ .where(eq(t.status, 'failed'));
559
+ const rows = await db
560
+ .select({
561
+ id: t.id,
562
+ type: t.type,
563
+ status: t.status,
564
+ attempts: t.attempts,
565
+ runAt: t.runAt,
566
+ dedupeKey: t.dedupeKey,
567
+ lastError: t.lastError,
568
+ createdAt: t.createdAt,
569
+ })
570
+ .from(t);
571
+ return {
572
+ runnable: runnableRows.length,
573
+ failed: failed.map((row) => ({
574
+ id: String(row.id),
575
+ name: row.type.startsWith(CRON_PREFIX)
576
+ ? row.type.slice(CRON_PREFIX.length)
577
+ : row.type,
578
+ attempts: Number(row.attempts),
579
+ lastError: row.lastError,
580
+ })),
581
+ jobs: rows
582
+ .sort((left, right) => Number(left.createdAt) - Number(right.createdAt) ||
583
+ String(left.id).localeCompare(String(right.id)))
584
+ .map((row) => ({
585
+ id: String(row.id),
586
+ name: row.type.startsWith(CRON_PREFIX)
587
+ ? row.type.slice(CRON_PREFIX.length)
588
+ : row.type,
589
+ kind: row.type.startsWith(CRON_PREFIX)
590
+ ? 'cron'
591
+ : 'job',
592
+ status: row.status,
593
+ attempts: Number(row.attempts),
594
+ runAt: Number(row.runAt),
595
+ dedupeKey: row.dedupeKey,
596
+ lastError: row.lastError,
597
+ })),
598
+ };
599
+ },
600
+ setJobsFacade(f) {
601
+ ctx.jobs = f;
602
+ },
603
+ };
604
+ }
605
+ //# sourceMappingURL=worker.js.map