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 @@
1
+ {"version":3,"file":"client.js","sourceRoot":"","sources":["../../src/client/client.ts"],"names":[],"mappings":"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","sourcesContent":["import { OPERATION_ID_HEADER, type CallOptions, type Fetch } from './rpc-client'\n\nexport type RouteOperation<\n TMethod extends string,\n TPath extends string,\n TQuery = undefined,\n TBody = undefined,\n TOutput = undefined,\n TStream extends boolean = false,\n> = {\n method: TMethod\n path: TPath\n query?: TQuery\n body?: TBody\n output?: TOutput\n stream?: TStream\n}\n\ntype AnyOperation = {\n method: string\n path: string\n query?: unknown\n body?: unknown\n output?: unknown\n stream?: boolean\n}\n\ntype QueryOf<O extends AnyOperation> = NonNullable<O['query']>\ntype BodyOf<O extends AnyOperation> = NonNullable<O['body']>\ntype OutputOf<O extends AnyOperation> = NonNullable<O['output']>\n\nexport type RouteCallOptions = CallOptions\n\ntype PathParamNames<TPath extends string> =\n TPath extends `${string}{${infer TParam}}${infer TRest}`\n ? TParam extends `+${infer TName}`\n ? TName | PathParamNames<TRest>\n : TParam | PathParamNames<TRest>\n : never\n\ntype PathArgs<O extends AnyOperation> = [PathParamNames<O['path']>] extends [\n never,\n]\n ? object\n : { params: Record<PathParamNames<O['path']>, string> }\n\ntype QueryArgs<O extends AnyOperation> = [O['query']] extends [undefined]\n ? object\n : { query?: QueryOf<O> }\n\ntype BodyArgs<O extends AnyOperation> = [O['body']] extends [undefined]\n ? object\n : { body: BodyOf<O> }\n\ntype CallArgs<O extends AnyOperation> = PathArgs<O> & QueryArgs<O> & BodyArgs<O>\n\ntype HasRequiredArgs<O extends AnyOperation> = [\n PathParamNames<O['path']>,\n] extends [never]\n ? [O['body']] extends [undefined]\n ? false\n : true\n : true\n\nexport type RouteMethod<O extends AnyOperation> = (\n ...args: true extends HasRequiredArgs<O>\n ? [args: CallArgs<O>, options?: RouteCallOptions]\n : [args?: CallArgs<O>, options?: RouteCallOptions]\n) => true extends O['stream']\n ? AsyncIterable<OutputOf<O>>\n : Promise<OutputOf<O>>\n\nexport type ClientOf<TRoutes> = {\n [K in keyof TRoutes]: TRoutes[K] extends AnyOperation\n ? RouteMethod<TRoutes[K]>\n : never\n}\n\nexport type RestClientOptions = {\n baseUrl?: string\n fetch?: Fetch\n}\n\ntype RouteDescriptor = { method: string; path: string; stream?: boolean }\n\nfunction joinUrl(baseUrl: string | undefined, path: string): string {\n if (!baseUrl) return path\n return `${baseUrl.replace(/\\/$/, '')}/${path.replace(/^\\//, '')}`\n}\n\nfunction fillPath(\n path: string,\n params: Record<string, string> | undefined,\n): string {\n return path.replace(/\\{(\\+?)([^}]+)\\}/g, (_, catchAll, name: string) => {\n const value = params?.[name]\n if (value === undefined) throw new Error(`Missing path parameter: ${name}`)\n if (catchAll) return value.split('/').map(encodeURIComponent).join('/')\n return encodeURIComponent(value)\n })\n}\n\nfunction buildUrl(\n baseUrl: string | undefined,\n path: string,\n query: Record<string, unknown> | undefined,\n): string {\n const url = joinUrl(baseUrl, path)\n if (!query) return url\n const params = new URLSearchParams()\n for (const [key, value] of Object.entries(query)) {\n if (value === undefined) continue\n params.set(key, typeof value === 'string' ? value : JSON.stringify(value))\n }\n return params.size ? `${url}?${params}` : url\n}\n\nasync function requestJson(\n fetcher: Fetch,\n url: string,\n init: RequestInit,\n): Promise<unknown> {\n const response = await fetcher(url, init)\n if (!response.ok)\n throw new Error(`${response.status} ${await response.text()}`)\n if (response.status === 204) return undefined\n return response.json()\n}\n\nasync function* streamJsonEvents(\n fetcher: Fetch,\n url: string,\n init: RequestInit,\n): AsyncGenerator<unknown> {\n const response = await fetcher(url, init)\n if (!response.ok || !response.body) {\n throw new Error(`Stream request failed (${response.status})`)\n }\n const reader = response.body.pipeThrough(new TextDecoderStream()).getReader()\n let buffer = ''\n let data: string[] = []\n const flush = () => {\n if (!data.length) return undefined\n const value = JSON.parse(data.join('\\n')) as unknown\n data = []\n return value\n }\n try {\n while (true) {\n const { done, value } = await reader.read()\n if (done) break\n buffer += value\n let newline = buffer.indexOf('\\n')\n while (newline !== -1) {\n const line = buffer.slice(0, newline).replace(/\\r$/, '')\n buffer = buffer.slice(newline + 1)\n if (line === '') {\n const event = flush()\n if (event !== undefined) yield event\n } else if (line.startsWith('data:')) {\n data.push(line.slice(5).replace(/^ /, ''))\n }\n newline = buffer.indexOf('\\n')\n }\n }\n const event = flush()\n if (event !== undefined) yield event\n } finally {\n await reader.cancel().catch(() => {})\n }\n}\n\nexport function createRestClient<TRoutes>(\n routes: Record<string, RouteDescriptor>,\n options: RestClientOptions = {},\n): ClientOf<TRoutes> {\n const fetcher = options.fetch ?? globalThis.fetch\n const client: Record<string, unknown> = {}\n for (const [name, route] of Object.entries(routes)) {\n client[name] = (\n args: {\n params?: Record<string, string>\n query?: Record<string, unknown>\n body?: unknown\n } = {},\n callOptions: RouteCallOptions = {},\n ) => {\n const path = fillPath(route.path, args.params)\n const url = buildUrl(options.baseUrl, path, args.query)\n const headers = new Headers(callOptions.headers)\n if (callOptions.operationId)\n headers.set(OPERATION_ID_HEADER, callOptions.operationId)\n if (route.stream) {\n headers.set('accept', 'text/event-stream')\n return streamJsonEvents(fetcher, url, {\n method: route.method,\n signal: callOptions.signal,\n headers,\n })\n }\n if (args.body !== undefined)\n headers.set('content-type', 'application/json')\n return requestJson(fetcher, url, {\n method: route.method,\n signal: callOptions.signal,\n headers,\n ...(args.body === undefined ? {} : { body: JSON.stringify(args.body) }),\n })\n }\n }\n return client as ClientOf<TRoutes>\n}\n"]}
@@ -0,0 +1,4 @@
1
+ export { createClient, createRpcClient, OPERATION_ID_HEADER, type AnyWorkerstackApp, type WorkerstackClient, type CallOptions, type ClientOptions, type ClientCarrier, type DirectClient, type Fetch, type InferApiRouter, type RpcClient, } from './rpc-client.js';
2
+ export { createLiveView, type LiveView, type LiveViewFrame, type LiveViewOptions, type LiveViewSnapshot, type LiveViewStatus, type MutationMethod, } from './live-view.js';
3
+ export { DEFAULT_KEEPALIVE_MS, DEFAULT_LIVENESS_FACTOR, isRealtimeHeartbeat, openRealtimeStream, type RealtimeAction, type RealtimeChange, type RealtimeClock, type RealtimeEvent, type RealtimeHeartbeat, type RealtimeProcedure, type RealtimeStreamOptions, type RealtimeSyncHandle, } from './realtime.js';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,mBAAmB,EACnB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,WAAW,EAChB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,YAAY,EACjB,KAAK,KAAK,EACV,KAAK,cAAc,EACnB,KAAK,SAAS,GACf,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,EACd,KAAK,QAAQ,EACb,KAAK,aAAa,EAClB,KAAK,eAAe,EACpB,KAAK,gBAAgB,EACrB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,EAClB,KAAK,cAAc,EACnB,KAAK,cAAc,EACnB,KAAK,aAAa,EAClB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACtB,KAAK,iBAAiB,EACtB,KAAK,qBAAqB,EAC1B,KAAK,kBAAkB,GACxB,MAAM,YAAY,CAAA"}
@@ -0,0 +1,4 @@
1
+ export { createClient, createRpcClient, OPERATION_ID_HEADER, } from './rpc-client.js';
2
+ export { createLiveView, } from './live-view.js';
3
+ export { DEFAULT_KEEPALIVE_MS, DEFAULT_LIVENESS_FACTOR, isRealtimeHeartbeat, openRealtimeStream, } from './realtime.js';
4
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/client/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,YAAY,EACZ,eAAe,EACf,mBAAmB,GAUpB,MAAM,cAAc,CAAA;AACrB,OAAO,EACL,cAAc,GAOf,MAAM,aAAa,CAAA;AACpB,OAAO,EACL,oBAAoB,EACpB,uBAAuB,EACvB,mBAAmB,EACnB,kBAAkB,GASnB,MAAM,YAAY,CAAA","sourcesContent":["export {\n createClient,\n createRpcClient,\n OPERATION_ID_HEADER,\n type AnyWorkerstackApp,\n type WorkerstackClient,\n type CallOptions,\n type ClientOptions,\n type ClientCarrier,\n type DirectClient,\n type Fetch,\n type InferApiRouter,\n type RpcClient,\n} from './rpc-client'\nexport {\n createLiveView,\n type LiveView,\n type LiveViewFrame,\n type LiveViewOptions,\n type LiveViewSnapshot,\n type LiveViewStatus,\n type MutationMethod,\n} from './live-view'\nexport {\n DEFAULT_KEEPALIVE_MS,\n DEFAULT_LIVENESS_FACTOR,\n isRealtimeHeartbeat,\n openRealtimeStream,\n type RealtimeAction,\n type RealtimeChange,\n type RealtimeClock,\n type RealtimeEvent,\n type RealtimeHeartbeat,\n type RealtimeProcedure,\n type RealtimeStreamOptions,\n type RealtimeSyncHandle,\n} from './realtime'\n"]}
@@ -0,0 +1,49 @@
1
+ import type { CallOptions } from './rpc-client.js';
2
+ export type LiveViewFrame<T> = {
3
+ type: 'snapshot';
4
+ items: T[];
5
+ operationId?: string;
6
+ } | {
7
+ type: 'upsert';
8
+ record: T;
9
+ afterId?: string | null;
10
+ operationId?: string;
11
+ } | {
12
+ type: 'remove';
13
+ id: string;
14
+ operationId?: string;
15
+ } | {
16
+ type: 'heartbeat';
17
+ intervalMs?: number;
18
+ };
19
+ export type LiveViewStatus = 'connecting' | 'ready' | 'reconnecting' | 'error' | 'closed';
20
+ export type LiveViewSnapshot<T> = {
21
+ readonly items: readonly T[];
22
+ readonly status: LiveViewStatus;
23
+ readonly error: unknown;
24
+ };
25
+ export type LiveViewOptions<T> = {
26
+ subscribe: (options: {
27
+ signal: AbortSignal;
28
+ }) => AsyncIterable<LiveViewFrame<T>> | Promise<AsyncIterable<LiveViewFrame<T>>>;
29
+ getKey?: (record: T) => string;
30
+ createOperationId?: () => string;
31
+ retryMs?: number;
32
+ /** Reconnect after this multiple of the server heartbeat interval is silent. */
33
+ livenessFactor?: number;
34
+ /** Maximum wait after HTTP success for the matching live frame. */
35
+ ackTimeoutMs?: number;
36
+ };
37
+ export type MutationMethod<TArgs, TResult> = (args: TArgs, options: CallOptions & {
38
+ operationId: string;
39
+ }) => Promise<TResult>;
40
+ export type LiveView<T> = {
41
+ getSnapshot(): LiveViewSnapshot<T>;
42
+ subscribe(listener: () => void): () => void;
43
+ mutate<TArgs, TResult>(method: MutationMethod<TArgs, TResult>, args: TArgs, options?: Omit<CallOptions, 'operationId'>): Promise<TResult>;
44
+ resync(): void;
45
+ close(): void;
46
+ readonly done: Promise<void>;
47
+ };
48
+ export declare function createLiveView<T>(options: LiveViewOptions<T>): LiveView<T>;
49
+ //# sourceMappingURL=live-view.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-view.d.ts","sourceRoot":"","sources":["../../src/client/live-view.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AAE/C,MAAM,MAAM,aAAa,CAAC,CAAC,IACvB;IAAE,IAAI,EAAE,UAAU,CAAC;IAAC,KAAK,EAAE,CAAC,EAAE,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACtD;IACE,IAAI,EAAE,QAAQ,CAAA;IACd,MAAM,EAAE,CAAC,CAAA;IACT,OAAO,CAAC,EAAE,MAAM,GAAG,IAAI,CAAA;IACvB,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,GACD;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,EAAE,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,GACpD;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAE9C,MAAM,MAAM,cAAc,GACtB,YAAY,GACZ,OAAO,GACP,cAAc,GACd,OAAO,GACP,QAAQ,CAAA;AAEZ,MAAM,MAAM,gBAAgB,CAAC,CAAC,IAAI;IAChC,QAAQ,CAAC,KAAK,EAAE,SAAS,CAAC,EAAE,CAAA;IAC5B,QAAQ,CAAC,MAAM,EAAE,cAAc,CAAA;IAC/B,QAAQ,CAAC,KAAK,EAAE,OAAO,CAAA;CACxB,CAAA;AAED,MAAM,MAAM,eAAe,CAAC,CAAC,IAAI;IAC/B,SAAS,EAAE,CAAC,OAAO,EAAE;QACnB,MAAM,EAAE,WAAW,CAAA;KACpB,KACG,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,GAC/B,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAC,CAAC,CAAC,CAAA;IAC5C,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAK,MAAM,CAAA;IAC9B,iBAAiB,CAAC,EAAE,MAAM,MAAM,CAAA;IAChC,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,gFAAgF;IAChF,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,mEAAmE;IACnE,YAAY,CAAC,EAAE,MAAM,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,KAAK,EAAE,OAAO,IAAI,CAC3C,IAAI,EAAE,KAAK,EACX,OAAO,EAAE,WAAW,GAAG;IAAE,WAAW,EAAE,MAAM,CAAA;CAAE,KAC3C,OAAO,CAAC,OAAO,CAAC,CAAA;AAErB,MAAM,MAAM,QAAQ,CAAC,CAAC,IAAI;IACxB,WAAW,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAA;IAClC,SAAS,CAAC,QAAQ,EAAE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAA;IAC3C,MAAM,CAAC,KAAK,EAAE,OAAO,EACnB,MAAM,EAAE,cAAc,CAAC,KAAK,EAAE,OAAO,CAAC,EACtC,IAAI,EAAE,KAAK,EACX,OAAO,CAAC,EAAE,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,GACzC,OAAO,CAAC,OAAO,CAAC,CAAA;IACnB,MAAM,IAAI,IAAI,CAAA;IACd,KAAK,IAAI,IAAI,CAAA;IACb,QAAQ,CAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAC7B,CAAA;AAQD,wBAAgB,cAAc,CAAC,CAAC,EAAE,OAAO,EAAE,eAAe,CAAC,CAAC,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAqL1E"}
@@ -0,0 +1,184 @@
1
+ export function createLiveView(options) {
2
+ const controller = new AbortController();
3
+ const listeners = new Set();
4
+ const waiters = new Map();
5
+ const getKey = options.getKey ?? ((record) => String(record.id));
6
+ let current;
7
+ let forceReconnect = false;
8
+ let hasSnapshot = false;
9
+ let snapshot = {
10
+ items: [],
11
+ status: 'connecting',
12
+ error: undefined,
13
+ };
14
+ const publish = (next) => {
15
+ snapshot = next;
16
+ for (const listener of listeners)
17
+ listener();
18
+ };
19
+ const apply = (frame) => {
20
+ if (frame.type !== 'heartbeat') {
21
+ let items;
22
+ if (frame.type === 'snapshot') {
23
+ hasSnapshot = true;
24
+ items = [...frame.items];
25
+ }
26
+ else if (frame.type === 'remove') {
27
+ items = snapshot.items.filter((record) => getKey(record) !== String(frame.id));
28
+ }
29
+ else {
30
+ const key = getKey(frame.record);
31
+ const index = snapshot.items.findIndex((record) => getKey(record) === key);
32
+ const next = snapshot.items.filter((record) => getKey(record) !== key);
33
+ if (frame.afterId === undefined) {
34
+ if (index === -1)
35
+ next.push(frame.record);
36
+ else
37
+ next.splice(index, 0, frame.record);
38
+ }
39
+ else {
40
+ const anchor = frame.afterId === null
41
+ ? -1
42
+ : next.findIndex((record) => getKey(record) === String(frame.afterId));
43
+ const placement = frame.afterId !== null && anchor === -1 ? next.length : anchor + 1;
44
+ next.splice(placement, 0, frame.record);
45
+ }
46
+ items = next;
47
+ }
48
+ publish({ items, status: 'ready', error: undefined });
49
+ if (frame.type === 'snapshot') {
50
+ // A fresh snapshot is authoritative. Once the write request succeeded,
51
+ // it safely settles operations whose matching event was lost while the
52
+ // live connection was down.
53
+ for (const [operationId, waiter] of waiters) {
54
+ if (!waiter.httpSucceeded)
55
+ continue;
56
+ waiter.resolve();
57
+ waiters.delete(operationId);
58
+ }
59
+ }
60
+ }
61
+ if ('operationId' in frame && frame.operationId) {
62
+ waiters.get(frame.operationId)?.resolve();
63
+ waiters.delete(frame.operationId);
64
+ }
65
+ };
66
+ const done = (async () => {
67
+ let attempt = 0;
68
+ while (!controller.signal.aborted) {
69
+ current = new AbortController();
70
+ const signal = AbortSignal.any([controller.signal, current.signal]);
71
+ let heartbeatIntervalMs;
72
+ let livenessTimer;
73
+ const armLivenessTimer = () => {
74
+ if (livenessTimer)
75
+ clearTimeout(livenessTimer);
76
+ if (!heartbeatIntervalMs)
77
+ return;
78
+ livenessTimer = setTimeout(() => current?.abort(), heartbeatIntervalMs * (options.livenessFactor ?? 2.5));
79
+ };
80
+ try {
81
+ const frames = await options.subscribe({ signal });
82
+ for await (const frame of frames) {
83
+ if (signal.aborted)
84
+ break;
85
+ attempt = 0;
86
+ apply(frame);
87
+ if (frame.type === 'heartbeat' && frame.intervalMs) {
88
+ heartbeatIntervalMs = frame.intervalMs;
89
+ }
90
+ armLivenessTimer();
91
+ }
92
+ if (!signal.aborted)
93
+ throw new Error('Live view closed');
94
+ }
95
+ catch (error) {
96
+ if (controller.signal.aborted)
97
+ break;
98
+ publish({
99
+ ...snapshot,
100
+ status: hasSnapshot ? 'reconnecting' : 'error',
101
+ error: hasSnapshot ? undefined : error,
102
+ });
103
+ }
104
+ finally {
105
+ if (livenessTimer)
106
+ clearTimeout(livenessTimer);
107
+ }
108
+ if (!controller.signal.aborted) {
109
+ const delayMs = forceReconnect
110
+ ? 0
111
+ : Math.min(30_000, (options.retryMs ?? 1_000) * 2 ** attempt++);
112
+ forceReconnect = false;
113
+ if (delayMs > 0) {
114
+ await new Promise((resolve) => {
115
+ const timer = setTimeout(done, delayMs);
116
+ function done() {
117
+ clearTimeout(timer);
118
+ controller.signal.removeEventListener('abort', done);
119
+ resolve();
120
+ }
121
+ controller.signal.addEventListener('abort', done, { once: true });
122
+ });
123
+ }
124
+ }
125
+ }
126
+ if (controller.signal.aborted) {
127
+ publish({ ...snapshot, status: 'closed' });
128
+ }
129
+ })();
130
+ return {
131
+ getSnapshot: () => snapshot,
132
+ subscribe(listener) {
133
+ listeners.add(listener);
134
+ return () => listeners.delete(listener);
135
+ },
136
+ async mutate(method, args, callOptions = {}) {
137
+ const operationId = options.createOperationId?.() ?? crypto.randomUUID();
138
+ let waiter;
139
+ const acknowledged = new Promise((resolve, reject) => {
140
+ waiter = { httpSucceeded: false, resolve, reject };
141
+ });
142
+ // The HTTP request may fail before this promise is awaited. Attaching a
143
+ // handler now prevents that rejection from surfacing as unhandled.
144
+ void acknowledged.catch(() => { });
145
+ waiters.set(operationId, waiter);
146
+ let timer;
147
+ try {
148
+ const result = await method(args, { ...callOptions, operationId });
149
+ waiter.httpSucceeded = true;
150
+ const timedOut = new Promise((_resolve, reject) => {
151
+ timer = setTimeout(() => {
152
+ const error = new Error(`Operation ${operationId} acknowledgement timed out`);
153
+ waiters.delete(operationId);
154
+ reject(error);
155
+ }, options.ackTimeoutMs ?? 30_000);
156
+ });
157
+ await Promise.race([acknowledged, timedOut]);
158
+ return result;
159
+ }
160
+ catch (error) {
161
+ waiters.delete(operationId);
162
+ waiter.reject(error);
163
+ throw error;
164
+ }
165
+ finally {
166
+ if (timer)
167
+ clearTimeout(timer);
168
+ }
169
+ },
170
+ resync() {
171
+ forceReconnect = true;
172
+ current?.abort();
173
+ },
174
+ close() {
175
+ controller.abort();
176
+ const error = new DOMException('Live view closed', 'AbortError');
177
+ for (const waiter of waiters.values())
178
+ waiter.reject(error);
179
+ waiters.clear();
180
+ },
181
+ done,
182
+ };
183
+ }
184
+ //# sourceMappingURL=live-view.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"live-view.js","sourceRoot":"","sources":["../../src/client/live-view.ts"],"names":[],"mappings":"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","sourcesContent":["import type { CallOptions } from './rpc-client'\n\nexport type LiveViewFrame<T> =\n | { type: 'snapshot'; items: T[]; operationId?: string }\n | {\n type: 'upsert'\n record: T\n afterId?: string | null\n operationId?: string\n }\n | { type: 'remove'; id: string; operationId?: string }\n | { type: 'heartbeat'; intervalMs?: number }\n\nexport type LiveViewStatus =\n | 'connecting'\n | 'ready'\n | 'reconnecting'\n | 'error'\n | 'closed'\n\nexport type LiveViewSnapshot<T> = {\n readonly items: readonly T[]\n readonly status: LiveViewStatus\n readonly error: unknown\n}\n\nexport type LiveViewOptions<T> = {\n subscribe: (options: {\n signal: AbortSignal\n }) =>\n | AsyncIterable<LiveViewFrame<T>>\n | Promise<AsyncIterable<LiveViewFrame<T>>>\n getKey?: (record: T) => string\n createOperationId?: () => string\n retryMs?: number\n /** Reconnect after this multiple of the server heartbeat interval is silent. */\n livenessFactor?: number\n /** Maximum wait after HTTP success for the matching live frame. */\n ackTimeoutMs?: number\n}\n\nexport type MutationMethod<TArgs, TResult> = (\n args: TArgs,\n options: CallOptions & { operationId: string },\n) => Promise<TResult>\n\nexport type LiveView<T> = {\n getSnapshot(): LiveViewSnapshot<T>\n subscribe(listener: () => void): () => void\n mutate<TArgs, TResult>(\n method: MutationMethod<TArgs, TResult>,\n args: TArgs,\n options?: Omit<CallOptions, 'operationId'>,\n ): Promise<TResult>\n resync(): void\n close(): void\n readonly done: Promise<void>\n}\n\ntype Waiter = {\n httpSucceeded: boolean\n resolve: () => void\n reject: (error: unknown) => void\n}\n\nexport function createLiveView<T>(options: LiveViewOptions<T>): LiveView<T> {\n const controller = new AbortController()\n const listeners = new Set<() => void>()\n const waiters = new Map<string, Waiter>()\n const getKey =\n options.getKey ?? ((record: T) => String((record as { id: unknown }).id))\n let current: AbortController | undefined\n let forceReconnect = false\n let hasSnapshot = false\n let snapshot: LiveViewSnapshot<T> = {\n items: [],\n status: 'connecting',\n error: undefined,\n }\n\n const publish = (next: LiveViewSnapshot<T>) => {\n snapshot = next\n for (const listener of listeners) listener()\n }\n\n const apply = (frame: LiveViewFrame<T>) => {\n if (frame.type !== 'heartbeat') {\n let items: readonly T[]\n if (frame.type === 'snapshot') {\n hasSnapshot = true\n items = [...frame.items]\n } else if (frame.type === 'remove') {\n items = snapshot.items.filter(\n (record) => getKey(record) !== String(frame.id),\n )\n } else {\n const key = getKey(frame.record)\n const index = snapshot.items.findIndex(\n (record) => getKey(record) === key,\n )\n const next = snapshot.items.filter((record) => getKey(record) !== key)\n if (frame.afterId === undefined) {\n if (index === -1) next.push(frame.record)\n else next.splice(index, 0, frame.record)\n } else {\n const anchor =\n frame.afterId === null\n ? -1\n : next.findIndex(\n (record) => getKey(record) === String(frame.afterId),\n )\n const placement =\n frame.afterId !== null && anchor === -1 ? next.length : anchor + 1\n next.splice(placement, 0, frame.record)\n }\n items = next\n }\n publish({ items, status: 'ready', error: undefined })\n if (frame.type === 'snapshot') {\n // A fresh snapshot is authoritative. Once the write request succeeded,\n // it safely settles operations whose matching event was lost while the\n // live connection was down.\n for (const [operationId, waiter] of waiters) {\n if (!waiter.httpSucceeded) continue\n waiter.resolve()\n waiters.delete(operationId)\n }\n }\n }\n if ('operationId' in frame && frame.operationId) {\n waiters.get(frame.operationId)?.resolve()\n waiters.delete(frame.operationId)\n }\n }\n\n const done = (async () => {\n let attempt = 0\n while (!controller.signal.aborted) {\n current = new AbortController()\n const signal = AbortSignal.any([controller.signal, current.signal])\n let heartbeatIntervalMs: number | undefined\n let livenessTimer: ReturnType<typeof setTimeout> | undefined\n const armLivenessTimer = () => {\n if (livenessTimer) clearTimeout(livenessTimer)\n if (!heartbeatIntervalMs) return\n livenessTimer = setTimeout(\n () => current?.abort(),\n heartbeatIntervalMs * (options.livenessFactor ?? 2.5),\n )\n }\n try {\n const frames = await options.subscribe({ signal })\n for await (const frame of frames) {\n if (signal.aborted) break\n attempt = 0\n apply(frame)\n if (frame.type === 'heartbeat' && frame.intervalMs) {\n heartbeatIntervalMs = frame.intervalMs\n }\n armLivenessTimer()\n }\n if (!signal.aborted) throw new Error('Live view closed')\n } catch (error) {\n if (controller.signal.aborted) break\n publish({\n ...snapshot,\n status: hasSnapshot ? 'reconnecting' : 'error',\n error: hasSnapshot ? undefined : error,\n })\n } finally {\n if (livenessTimer) clearTimeout(livenessTimer)\n }\n if (!controller.signal.aborted) {\n const delayMs = forceReconnect\n ? 0\n : Math.min(30_000, (options.retryMs ?? 1_000) * 2 ** attempt++)\n forceReconnect = false\n if (delayMs > 0) {\n await new Promise<void>((resolve) => {\n const timer = setTimeout(done, delayMs)\n function done() {\n clearTimeout(timer)\n controller.signal.removeEventListener('abort', done)\n resolve()\n }\n controller.signal.addEventListener('abort', done, { once: true })\n })\n }\n }\n }\n if (controller.signal.aborted) {\n publish({ ...snapshot, status: 'closed' })\n }\n })()\n\n return {\n getSnapshot: () => snapshot,\n subscribe(listener) {\n listeners.add(listener)\n return () => listeners.delete(listener)\n },\n async mutate(method, args, callOptions = {}) {\n const operationId = options.createOperationId?.() ?? crypto.randomUUID()\n let waiter!: Waiter\n const acknowledged = new Promise<void>((resolve, reject) => {\n waiter = { httpSucceeded: false, resolve, reject }\n })\n // The HTTP request may fail before this promise is awaited. Attaching a\n // handler now prevents that rejection from surfacing as unhandled.\n void acknowledged.catch(() => {})\n waiters.set(operationId, waiter)\n let timer: ReturnType<typeof setTimeout> | undefined\n try {\n const result = await method(args, { ...callOptions, operationId })\n waiter.httpSucceeded = true\n const timedOut = new Promise<never>((_resolve, reject) => {\n timer = setTimeout(() => {\n const error = new Error(\n `Operation ${operationId} acknowledgement timed out`,\n )\n waiters.delete(operationId)\n reject(error)\n }, options.ackTimeoutMs ?? 30_000)\n })\n await Promise.race([acknowledged, timedOut])\n return result\n } catch (error) {\n waiters.delete(operationId)\n waiter.reject(error)\n throw error\n } finally {\n if (timer) clearTimeout(timer)\n }\n },\n resync() {\n forceReconnect = true\n current?.abort()\n },\n close() {\n controller.abort()\n const error = new DOMException('Live view closed', 'AbortError')\n for (const waiter of waiters.values()) waiter.reject(error)\n waiters.clear()\n },\n done,\n }\n}\n"]}
@@ -0,0 +1,4 @@
1
+ import type { LiveView, LiveViewSnapshot } from './live-view.js';
2
+ /** React owns scheduling; the shared LiveView remains an external store. */
3
+ export declare function useLiveView<T>(view: LiveView<T>): LiveViewSnapshot<T>;
4
+ //# sourceMappingURL=react.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.d.ts","sourceRoot":"","sources":["../../src/client/react.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,aAAa,CAAA;AAE7D,4EAA4E;AAC5E,wBAAgB,WAAW,CAAC,CAAC,EAAE,IAAI,EAAE,QAAQ,CAAC,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,CAAC,CAMrE"}
@@ -0,0 +1,6 @@
1
+ import { useSyncExternalStore } from 'react';
2
+ /** React owns scheduling; the shared LiveView remains an external store. */
3
+ export function useLiveView(view) {
4
+ return useSyncExternalStore(view.subscribe, view.getSnapshot, view.getSnapshot);
5
+ }
6
+ //# sourceMappingURL=react.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"react.js","sourceRoot":"","sources":["../../src/client/react.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,EAAE,MAAM,OAAO,CAAA;AAI5C,4EAA4E;AAC5E,MAAM,UAAU,WAAW,CAAI,IAAiB;IAC9C,OAAO,oBAAoB,CACzB,IAAI,CAAC,SAAS,EACd,IAAI,CAAC,WAAW,EAChB,IAAI,CAAC,WAAW,CACjB,CAAA;AACH,CAAC","sourcesContent":["import { useSyncExternalStore } from 'react'\n\nimport type { LiveView, LiveViewSnapshot } from './live-view'\n\n/** React owns scheduling; the shared LiveView remains an external store. */\nexport function useLiveView<T>(view: LiveView<T>): LiveViewSnapshot<T> {\n return useSyncExternalStore(\n view.subscribe,\n view.getSnapshot,\n view.getSnapshot,\n )\n}\n"]}
@@ -0,0 +1,54 @@
1
+ export type RealtimeAction = 'create' | 'update' | 'delete';
2
+ export type RealtimeChange = {
3
+ table: string;
4
+ action: RealtimeAction;
5
+ record: Record<string, unknown>;
6
+ operationId?: string;
7
+ };
8
+ export type RealtimeHeartbeat = {
9
+ type: 'heartbeat';
10
+ intervalMs?: number;
11
+ };
12
+ export type RealtimeEvent = RealtimeChange | RealtimeHeartbeat;
13
+ export type RealtimeProcedure = {
14
+ call(input: {
15
+ tables: string[];
16
+ }, options?: {
17
+ signal?: AbortSignal;
18
+ lastEventId?: string;
19
+ }): Promise<AsyncIterable<RealtimeEvent>>;
20
+ };
21
+ export type RealtimeSyncHandle = {
22
+ close(): void;
23
+ done: Promise<void>;
24
+ };
25
+ export type RealtimeClock = {
26
+ setTimeout(fn: () => void, ms: number): unknown;
27
+ clearTimeout(handle: unknown): void;
28
+ };
29
+ export declare const DEFAULT_KEEPALIVE_MS = 5000;
30
+ export declare const DEFAULT_LIVENESS_FACTOR = 2.5;
31
+ export type RealtimeStreamOptions = {
32
+ subscribe: (options: {
33
+ signal: AbortSignal;
34
+ lastEventId?: string;
35
+ }) => Promise<AsyncIterable<RealtimeEvent>>;
36
+ onChange: (change: RealtimeChange) => void;
37
+ onReconnect: () => void | Promise<void>;
38
+ onError?: (error: unknown) => void;
39
+ onRetry?: (retry: {
40
+ attempt: number;
41
+ delayMs: number;
42
+ }) => void;
43
+ signal: AbortSignal;
44
+ retryMs?: number;
45
+ maxRetryMs?: number;
46
+ livenessFactor?: number;
47
+ defaultKeepaliveMs?: number;
48
+ clock?: RealtimeClock;
49
+ random?: () => number;
50
+ };
51
+ export declare function isRealtimeHeartbeat(event: RealtimeEvent): event is RealtimeHeartbeat;
52
+ /** Shared reconnecting transport used by LiveView, Query, and DB adapters. */
53
+ export declare function openRealtimeStream(options: RealtimeStreamOptions): RealtimeSyncHandle;
54
+ //# sourceMappingURL=realtime.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.d.ts","sourceRoot":"","sources":["../../src/client/realtime.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,cAAc,GAAG,QAAQ,GAAG,QAAQ,GAAG,QAAQ,CAAA;AAC3D,MAAM,MAAM,cAAc,GAAG;IAC3B,KAAK,EAAE,MAAM,CAAA;IACb,MAAM,EAAE,cAAc,CAAA;IACtB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;IAC/B,WAAW,CAAC,EAAE,MAAM,CAAA;CACrB,CAAA;AACD,MAAM,MAAM,iBAAiB,GAAG;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,UAAU,CAAC,EAAE,MAAM,CAAA;CAAE,CAAA;AAC1E,MAAM,MAAM,aAAa,GAAG,cAAc,GAAG,iBAAiB,CAAA;AAC9D,MAAM,MAAM,iBAAiB,GAAG;IAC9B,IAAI,CACF,KAAK,EAAE;QAAE,MAAM,EAAE,MAAM,EAAE,CAAA;KAAE,EAC3B,OAAO,CAAC,EAAE;QAAE,MAAM,CAAC,EAAE,WAAW,CAAC;QAAC,WAAW,CAAC,EAAE,MAAM,CAAA;KAAE,GACvD,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAA;CACzC,CAAA;AACD,MAAM,MAAM,kBAAkB,GAAG;IAAE,KAAK,IAAI,IAAI,CAAC;IAAC,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,CAAA;CAAE,CAAA;AACvE,MAAM,MAAM,aAAa,GAAG;IAC1B,UAAU,CAAC,EAAE,EAAE,MAAM,IAAI,EAAE,EAAE,EAAE,MAAM,GAAG,OAAO,CAAA;IAC/C,YAAY,CAAC,MAAM,EAAE,OAAO,GAAG,IAAI,CAAA;CACpC,CAAA;AACD,eAAO,MAAM,oBAAoB,OAAQ,CAAA;AACzC,eAAO,MAAM,uBAAuB,MAAM,CAAA;AAQ1C,MAAM,MAAM,qBAAqB,GAAG;IAClC,SAAS,EAAE,CAAC,OAAO,EAAE;QACnB,MAAM,EAAE,WAAW,CAAA;QACnB,WAAW,CAAC,EAAE,MAAM,CAAA;KACrB,KAAK,OAAO,CAAC,aAAa,CAAC,aAAa,CAAC,CAAC,CAAA;IAC3C,QAAQ,EAAE,CAAC,MAAM,EAAE,cAAc,KAAK,IAAI,CAAA;IAC1C,WAAW,EAAE,MAAM,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAA;IACvC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE,OAAO,KAAK,IAAI,CAAA;IAClC,OAAO,CAAC,EAAE,CAAC,KAAK,EAAE;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,KAAK,IAAI,CAAA;IAC/D,MAAM,EAAE,WAAW,CAAA;IACnB,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,UAAU,CAAC,EAAE,MAAM,CAAA;IACnB,cAAc,CAAC,EAAE,MAAM,CAAA;IACvB,kBAAkB,CAAC,EAAE,MAAM,CAAA;IAC3B,KAAK,CAAC,EAAE,aAAa,CAAA;IACrB,MAAM,CAAC,EAAE,MAAM,MAAM,CAAA;CACtB,CAAA;AAED,wBAAgB,mBAAmB,CACjC,KAAK,EAAE,aAAa,GACnB,KAAK,IAAI,iBAAiB,CAE5B;AAID,8EAA8E;AAC9E,wBAAgB,kBAAkB,CAChC,OAAO,EAAE,qBAAqB,GAC7B,kBAAkB,CAqFpB"}
@@ -0,0 +1,105 @@
1
+ import { getEventMeta } from '@standardserver/core';
2
+ export const DEFAULT_KEEPALIVE_MS = 5_000;
3
+ export const DEFAULT_LIVENESS_FACTOR = 2.5;
4
+ const systemClock = {
5
+ setTimeout: (fn, ms) => setTimeout(fn, ms),
6
+ clearTimeout: (handle) => clearTimeout(handle),
7
+ };
8
+ export function isRealtimeHeartbeat(event) {
9
+ return 'type' in event && event.type === 'heartbeat';
10
+ }
11
+ const LIVENESS_ABORT = 'workerstack: realtime stream went silent';
12
+ /** Shared reconnecting transport used by LiveView, Query, and DB adapters. */
13
+ export function openRealtimeStream(options) {
14
+ const controller = new AbortController();
15
+ const signal = AbortSignal.any([controller.signal, options.signal]);
16
+ const clock = options.clock ?? systemClock;
17
+ const random = options.random ?? Math.random;
18
+ const retryMs = Math.max(0, options.retryMs ?? 1_000);
19
+ const maxRetryMs = Math.max(retryMs, options.maxRetryMs ?? 30_000);
20
+ const livenessFactor = options.livenessFactor ?? DEFAULT_LIVENESS_FACTOR;
21
+ let keepaliveMs = options.defaultKeepaliveMs ?? DEFAULT_KEEPALIVE_MS;
22
+ const wait = (ms) => new Promise((resolve) => {
23
+ if (signal.aborted)
24
+ return resolve();
25
+ const timer = clock.setTimeout(done, ms);
26
+ function done() {
27
+ clock.clearTimeout(timer);
28
+ signal.removeEventListener('abort', done);
29
+ resolve();
30
+ }
31
+ signal.addEventListener('abort', done, { once: true });
32
+ });
33
+ const done = (async () => {
34
+ let connected = false;
35
+ let lastEventId;
36
+ let retryAttempt = 0;
37
+ while (!signal.aborted) {
38
+ const attempt = new AbortController();
39
+ const attemptSignal = AbortSignal.any([signal, attempt.signal]);
40
+ let timer;
41
+ let wentSilent = false;
42
+ const disarm = () => {
43
+ if (timer === undefined)
44
+ return;
45
+ clock.clearTimeout(timer);
46
+ timer = undefined;
47
+ };
48
+ const arm = () => {
49
+ disarm();
50
+ timer = clock.setTimeout(() => {
51
+ wentSilent = true;
52
+ attempt.abort(new Error(LIVENESS_ABORT));
53
+ }, keepaliveMs * livenessFactor);
54
+ };
55
+ try {
56
+ const events = await options.subscribe({
57
+ signal: attemptSignal,
58
+ lastEventId,
59
+ });
60
+ arm();
61
+ if (connected)
62
+ await options.onReconnect();
63
+ connected = true;
64
+ for await (const event of events) {
65
+ retryAttempt = 0;
66
+ if (isRealtimeHeartbeat(event)) {
67
+ if (typeof event.intervalMs === 'number' && event.intervalMs > 0)
68
+ keepaliveMs = event.intervalMs;
69
+ arm();
70
+ continue;
71
+ }
72
+ arm();
73
+ const id = getEventMeta(event)?.id;
74
+ if (id)
75
+ lastEventId = id;
76
+ try {
77
+ options.onChange(event);
78
+ }
79
+ catch (error) {
80
+ options.onError?.(error);
81
+ }
82
+ if (signal.aborted)
83
+ break;
84
+ }
85
+ }
86
+ catch (error) {
87
+ if (!signal.aborted && !wentSilent)
88
+ options.onError?.(error);
89
+ }
90
+ finally {
91
+ disarm();
92
+ }
93
+ if (!signal.aborted) {
94
+ const attemptNumber = retryAttempt + 1;
95
+ const ceiling = Math.min(maxRetryMs, retryMs * 2 ** retryAttempt);
96
+ const delayMs = Math.floor(random() * ceiling);
97
+ retryAttempt = attemptNumber;
98
+ options.onRetry?.({ attempt: attemptNumber, delayMs });
99
+ await wait(delayMs);
100
+ }
101
+ }
102
+ })();
103
+ return { close: () => controller.abort(), done };
104
+ }
105
+ //# sourceMappingURL=realtime.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"realtime.js","sourceRoot":"","sources":["../../src/client/realtime.ts"],"names":[],"mappings":"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","sourcesContent":["import { getEventMeta } from '@standardserver/core'\n\nexport type RealtimeAction = 'create' | 'update' | 'delete'\nexport type RealtimeChange = {\n table: string\n action: RealtimeAction\n record: Record<string, unknown>\n operationId?: string\n}\nexport type RealtimeHeartbeat = { type: 'heartbeat'; intervalMs?: number }\nexport type RealtimeEvent = RealtimeChange | RealtimeHeartbeat\nexport type RealtimeProcedure = {\n call(\n input: { tables: string[] },\n options?: { signal?: AbortSignal; lastEventId?: string },\n ): Promise<AsyncIterable<RealtimeEvent>>\n}\nexport type RealtimeSyncHandle = { close(): void; done: Promise<void> }\nexport type RealtimeClock = {\n setTimeout(fn: () => void, ms: number): unknown\n clearTimeout(handle: unknown): void\n}\nexport const DEFAULT_KEEPALIVE_MS = 5_000\nexport const DEFAULT_LIVENESS_FACTOR = 2.5\n\nconst systemClock: RealtimeClock = {\n setTimeout: (fn, ms) => setTimeout(fn, ms),\n clearTimeout: (handle) =>\n clearTimeout(handle as ReturnType<typeof setTimeout>),\n}\n\nexport type RealtimeStreamOptions = {\n subscribe: (options: {\n signal: AbortSignal\n lastEventId?: string\n }) => Promise<AsyncIterable<RealtimeEvent>>\n onChange: (change: RealtimeChange) => void\n onReconnect: () => void | Promise<void>\n onError?: (error: unknown) => void\n onRetry?: (retry: { attempt: number; delayMs: number }) => void\n signal: AbortSignal\n retryMs?: number\n maxRetryMs?: number\n livenessFactor?: number\n defaultKeepaliveMs?: number\n clock?: RealtimeClock\n random?: () => number\n}\n\nexport function isRealtimeHeartbeat(\n event: RealtimeEvent,\n): event is RealtimeHeartbeat {\n return 'type' in event && event.type === 'heartbeat'\n}\n\nconst LIVENESS_ABORT = 'workerstack: realtime stream went silent'\n\n/** Shared reconnecting transport used by LiveView, Query, and DB adapters. */\nexport function openRealtimeStream(\n options: RealtimeStreamOptions,\n): RealtimeSyncHandle {\n const controller = new AbortController()\n const signal = AbortSignal.any([controller.signal, options.signal])\n const clock = options.clock ?? systemClock\n const random = options.random ?? Math.random\n const retryMs = Math.max(0, options.retryMs ?? 1_000)\n const maxRetryMs = Math.max(retryMs, options.maxRetryMs ?? 30_000)\n const livenessFactor = options.livenessFactor ?? DEFAULT_LIVENESS_FACTOR\n let keepaliveMs = options.defaultKeepaliveMs ?? DEFAULT_KEEPALIVE_MS\n\n const wait = (ms: number) =>\n new Promise<void>((resolve) => {\n if (signal.aborted) return resolve()\n const timer = clock.setTimeout(done, ms)\n function done() {\n clock.clearTimeout(timer)\n signal.removeEventListener('abort', done)\n resolve()\n }\n signal.addEventListener('abort', done, { once: true })\n })\n\n const done = (async () => {\n let connected = false\n let lastEventId: string | undefined\n let retryAttempt = 0\n while (!signal.aborted) {\n const attempt = new AbortController()\n const attemptSignal = AbortSignal.any([signal, attempt.signal])\n let timer: unknown\n let wentSilent = false\n const disarm = () => {\n if (timer === undefined) return\n clock.clearTimeout(timer)\n timer = undefined\n }\n const arm = () => {\n disarm()\n timer = clock.setTimeout(() => {\n wentSilent = true\n attempt.abort(new Error(LIVENESS_ABORT))\n }, keepaliveMs * livenessFactor)\n }\n try {\n const events = await options.subscribe({\n signal: attemptSignal,\n lastEventId,\n })\n arm()\n if (connected) await options.onReconnect()\n connected = true\n for await (const event of events) {\n retryAttempt = 0\n if (isRealtimeHeartbeat(event)) {\n if (typeof event.intervalMs === 'number' && event.intervalMs > 0)\n keepaliveMs = event.intervalMs\n arm()\n continue\n }\n arm()\n const id = getEventMeta(event)?.id\n if (id) lastEventId = id\n try {\n options.onChange(event)\n } catch (error) {\n options.onError?.(error)\n }\n if (signal.aborted) break\n }\n } catch (error) {\n if (!signal.aborted && !wentSilent) options.onError?.(error)\n } finally {\n disarm()\n }\n if (!signal.aborted) {\n const attemptNumber = retryAttempt + 1\n const ceiling = Math.min(maxRetryMs, retryMs * 2 ** retryAttempt)\n const delayMs = Math.floor(random() * ceiling)\n retryAttempt = attemptNumber\n options.onRetry?.({ attempt: attemptNumber, delayMs })\n await wait(delayMs)\n }\n }\n })()\n return { close: () => controller.abort(), done }\n}\n"]}
@@ -0,0 +1,2 @@
1
+ export { createRestClient, type ClientOf, type RestClientOptions, type RouteCallOptions, type RouteMethod, type RouteOperation, } from './client.js';
2
+ //# sourceMappingURL=rest.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../src/client/rest.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,EAChB,KAAK,QAAQ,EACb,KAAK,iBAAiB,EACtB,KAAK,gBAAgB,EACrB,KAAK,WAAW,EAChB,KAAK,cAAc,GACpB,MAAM,UAAU,CAAA"}
@@ -0,0 +1,2 @@
1
+ export { createRestClient, } from './client.js';
2
+ //# sourceMappingURL=rest.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rest.js","sourceRoot":"","sources":["../../src/client/rest.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,gBAAgB,GAMjB,MAAM,UAAU,CAAA","sourcesContent":["export {\n createRestClient,\n type ClientOf,\n type RestClientOptions,\n type RouteCallOptions,\n type RouteMethod,\n type RouteOperation,\n} from './client'\n"]}
@@ -0,0 +1,38 @@
1
+ import type { AnyRouter, RouterClient } from '@orpc/server';
2
+ export declare const OPERATION_ID_HEADER = "x-workerstack-operation-id";
3
+ export type Fetch = (input: RequestInfo | URL, init?: RequestInit) => Promise<Response>;
4
+ export type ClientOptions = {
5
+ baseUrl?: string;
6
+ fetch?: Fetch;
7
+ headers?: HeadersInit | (() => HeadersInit | Promise<HeadersInit>);
8
+ };
9
+ export type CallOptions = {
10
+ signal?: AbortSignal;
11
+ lastEventId?: string;
12
+ operationId?: string;
13
+ headers?: HeadersInit;
14
+ };
15
+ export type ClientCarrier = {
16
+ api: AnyRouter;
17
+ buckets: string;
18
+ };
19
+ export type AnyWorkerstackApp = {
20
+ $inferClient?: ClientCarrier | undefined;
21
+ };
22
+ export type InferApiRouter<TApp extends AnyWorkerstackApp> = NonNullable<TApp['$inferClient']>['api'];
23
+ type RpcContext = {
24
+ operationId?: string;
25
+ headers?: HeadersInit;
26
+ };
27
+ type AdaptCallArgs<TArgs extends unknown[]> = {
28
+ [K in keyof TArgs]: K extends 1 | '1' ? CallOptions : TArgs[K];
29
+ };
30
+ export type DirectClient<T> = T extends (...args: infer TArgs) => infer TResult ? (...args: AdaptCallArgs<TArgs>) => TResult : {
31
+ [K in keyof T]: DirectClient<T[K]>;
32
+ };
33
+ export type RpcClient<TRouter extends AnyRouter> = DirectClient<RouterClient<TRouter, RpcContext>>;
34
+ export type WorkerstackClient<TApp extends AnyWorkerstackApp> = RpcClient<InferApiRouter<TApp>>;
35
+ export declare function createRpcClient<TRouter extends AnyRouter>(options?: ClientOptions): RpcClient<TRouter>;
36
+ export declare function createClient<TApp extends AnyWorkerstackApp>(options?: ClientOptions): WorkerstackClient<TApp>;
37
+ export {};
38
+ //# sourceMappingURL=rpc-client.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rpc-client.d.ts","sourceRoot":"","sources":["../../src/client/rpc-client.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,SAAS,EAAE,YAAY,EAAE,MAAM,cAAc,CAAA;AAK3D,eAAO,MAAM,mBAAmB,+BAA+B,CAAA;AAE/D,MAAM,MAAM,KAAK,GAAG,CAClB,KAAK,EAAE,WAAW,GAAG,GAAG,EACxB,IAAI,CAAC,EAAE,WAAW,KACf,OAAO,CAAC,QAAQ,CAAC,CAAA;AAEtB,MAAM,MAAM,aAAa,GAAG;IAC1B,OAAO,CAAC,EAAE,MAAM,CAAA;IAChB,KAAK,CAAC,EAAE,KAAK,CAAA;IACb,OAAO,CAAC,EAAE,WAAW,GAAG,CAAC,MAAM,WAAW,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC,CAAA;CACnE,CAAA;AAED,MAAM,MAAM,WAAW,GAAG;IACxB,MAAM,CAAC,EAAE,WAAW,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB,CAAA;AAED,MAAM,MAAM,aAAa,GAAG;IAC1B,GAAG,EAAE,SAAS,CAAA;IACd,OAAO,EAAE,MAAM,CAAA;CAChB,CAAA;AAED,MAAM,MAAM,iBAAiB,GAAG;IAC9B,YAAY,CAAC,EAAE,aAAa,GAAG,SAAS,CAAA;CACzC,CAAA;AAED,MAAM,MAAM,cAAc,CAAC,IAAI,SAAS,iBAAiB,IAAI,WAAW,CACtE,IAAI,CAAC,cAAc,CAAC,CACrB,CAAC,KAAK,CAAC,CAAA;AAER,KAAK,UAAU,GAAG;IAChB,WAAW,CAAC,EAAE,MAAM,CAAA;IACpB,OAAO,CAAC,EAAE,WAAW,CAAA;CACtB,CAAA;AAED,KAAK,aAAa,CAAC,KAAK,SAAS,OAAO,EAAE,IAAI;KAC3C,CAAC,IAAI,MAAM,KAAK,GAAG,CAAC,SAAS,CAAC,GAAG,GAAG,GAAG,WAAW,GAAG,KAAK,CAAC,CAAC,CAAC;CAC/D,CAAA;AAED,MAAM,MAAM,YAAY,CAAC,CAAC,IAAI,CAAC,SAAS,CAAC,GAAG,IAAI,EAAE,MAAM,KAAK,KAAK,MAAM,OAAO,GAC3E,CAAC,GAAG,IAAI,EAAE,aAAa,CAAC,KAAK,CAAC,KAAK,OAAO,GAC1C;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAE1C,MAAM,MAAM,SAAS,CAAC,OAAO,SAAS,SAAS,IAAI,YAAY,CAC7D,YAAY,CAAC,OAAO,EAAE,UAAU,CAAC,CAClC,CAAA;AAED,MAAM,MAAM,iBAAiB,CAAC,IAAI,SAAS,iBAAiB,IAAI,SAAS,CACvE,cAAc,CAAC,IAAI,CAAC,CACrB,CAAA;AA6CD,wBAAgB,eAAe,CAAC,OAAO,SAAS,SAAS,EACvD,OAAO,GAAE,aAAkB,GAC1B,SAAS,CAAC,OAAO,CAAC,CAuBpB;AAED,wBAAgB,YAAY,CAAC,IAAI,SAAS,iBAAiB,EACzD,OAAO,GAAE,aAAkB,GAC1B,iBAAiB,CAAC,IAAI,CAAC,CAEzB"}