@shware/workflow 0.0.0-stage → 0.0.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 (442) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +154 -2
  3. package/dist/_virtual/_rolldown/runtime.cjs +23 -0
  4. package/dist/apns-relay.cjs +105 -0
  5. package/dist/apns-relay.cjs.map +1 -0
  6. package/dist/apns-relay.d.cts +28 -0
  7. package/dist/apns-relay.d.cts.map +1 -0
  8. package/dist/apns-relay.d.mts +28 -0
  9. package/dist/apns-relay.d.mts.map +1 -0
  10. package/dist/apns-relay.mjs +104 -0
  11. package/dist/apns-relay.mjs.map +1 -0
  12. package/dist/apns.cjs +121 -0
  13. package/dist/apns.cjs.map +1 -0
  14. package/dist/apns.d.cts +63 -0
  15. package/dist/apns.d.cts.map +1 -0
  16. package/dist/apns.d.mts +63 -0
  17. package/dist/apns.d.mts.map +1 -0
  18. package/dist/apns.mjs +116 -0
  19. package/dist/apns.mjs.map +1 -0
  20. package/dist/client.cjs +125 -0
  21. package/dist/client.cjs.map +1 -0
  22. package/dist/client.d.cts +108 -0
  23. package/dist/client.d.cts.map +1 -0
  24. package/dist/client.d.mts +108 -0
  25. package/dist/client.d.mts.map +1 -0
  26. package/dist/client.mjs +122 -0
  27. package/dist/client.mjs.map +1 -0
  28. package/dist/cloudflare/bindings.cjs +28 -0
  29. package/dist/cloudflare/bindings.cjs.map +1 -0
  30. package/dist/cloudflare/bindings.d.cts +144 -0
  31. package/dist/cloudflare/bindings.d.cts.map +1 -0
  32. package/dist/cloudflare/bindings.d.mts +144 -0
  33. package/dist/cloudflare/bindings.d.mts.map +1 -0
  34. package/dist/cloudflare/bindings.mjs +25 -0
  35. package/dist/cloudflare/bindings.mjs.map +1 -0
  36. package/dist/cloudflare/channels.cjs +164 -0
  37. package/dist/cloudflare/channels.cjs.map +1 -0
  38. package/dist/cloudflare/channels.d.cts +29 -0
  39. package/dist/cloudflare/channels.d.cts.map +1 -0
  40. package/dist/cloudflare/channels.d.mts +29 -0
  41. package/dist/cloudflare/channels.d.mts.map +1 -0
  42. package/dist/cloudflare/channels.mjs +161 -0
  43. package/dist/cloudflare/channels.mjs.map +1 -0
  44. package/dist/cloudflare/d1-env.cjs +17 -0
  45. package/dist/cloudflare/d1-env.cjs.map +1 -0
  46. package/dist/cloudflare/d1-env.d.cts +12 -0
  47. package/dist/cloudflare/d1-env.d.cts.map +1 -0
  48. package/dist/cloudflare/d1-env.d.mts +12 -0
  49. package/dist/cloudflare/d1-env.d.mts.map +1 -0
  50. package/dist/cloudflare/d1-env.mjs +16 -0
  51. package/dist/cloudflare/d1-env.mjs.map +1 -0
  52. package/dist/cloudflare/index.cjs +54 -0
  53. package/dist/cloudflare/index.d.cts +19 -0
  54. package/dist/cloudflare/index.d.mts +19 -0
  55. package/dist/cloudflare/index.mjs +16 -0
  56. package/dist/cloudflare/router.cjs +516 -0
  57. package/dist/cloudflare/router.cjs.map +1 -0
  58. package/dist/cloudflare/router.d.cts +157 -0
  59. package/dist/cloudflare/router.d.cts.map +1 -0
  60. package/dist/cloudflare/router.d.mts +157 -0
  61. package/dist/cloudflare/router.d.mts.map +1 -0
  62. package/dist/cloudflare/router.mjs +503 -0
  63. package/dist/cloudflare/router.mjs.map +1 -0
  64. package/dist/cloudflare/runner.cjs +225 -0
  65. package/dist/cloudflare/runner.cjs.map +1 -0
  66. package/dist/cloudflare/runner.d.cts +73 -0
  67. package/dist/cloudflare/runner.d.cts.map +1 -0
  68. package/dist/cloudflare/runner.d.mts +73 -0
  69. package/dist/cloudflare/runner.d.mts.map +1 -0
  70. package/dist/cloudflare/runner.mjs +224 -0
  71. package/dist/cloudflare/runner.mjs.map +1 -0
  72. package/dist/cloudflare/schema.sql +127 -0
  73. package/dist/cloudflare/senders.cjs +114 -0
  74. package/dist/cloudflare/senders.cjs.map +1 -0
  75. package/dist/cloudflare/senders.d.cts +68 -0
  76. package/dist/cloudflare/senders.d.cts.map +1 -0
  77. package/dist/cloudflare/senders.d.mts +68 -0
  78. package/dist/cloudflare/senders.d.mts.map +1 -0
  79. package/dist/cloudflare/senders.mjs +108 -0
  80. package/dist/cloudflare/senders.mjs.map +1 -0
  81. package/dist/cloudflare/worker.cjs +228 -0
  82. package/dist/cloudflare/worker.cjs.map +1 -0
  83. package/dist/cloudflare/worker.d.cts +92 -0
  84. package/dist/cloudflare/worker.d.cts.map +1 -0
  85. package/dist/cloudflare/worker.d.mts +92 -0
  86. package/dist/cloudflare/worker.d.mts.map +1 -0
  87. package/dist/cloudflare/worker.mjs +224 -0
  88. package/dist/cloudflare/worker.mjs.map +1 -0
  89. package/dist/cloudflare/workers.d.cjs +0 -0
  90. package/dist/cloudflare/workers.d.cts +44 -0
  91. package/dist/cloudflare/workers.d.cts.map +1 -0
  92. package/dist/cloudflare/workers.d.mts +44 -0
  93. package/dist/cloudflare/workers.d.mts.map +1 -0
  94. package/dist/config.cjs +151 -0
  95. package/dist/config.cjs.map +1 -0
  96. package/dist/config.d.cts +149 -0
  97. package/dist/config.d.cts.map +1 -0
  98. package/dist/config.d.mts +149 -0
  99. package/dist/config.d.mts.map +1 -0
  100. package/dist/config.mjs +143 -0
  101. package/dist/config.mjs.map +1 -0
  102. package/dist/contract.cjs +212 -0
  103. package/dist/contract.cjs.map +1 -0
  104. package/dist/contract.d.cts +90 -0
  105. package/dist/contract.d.cts.map +1 -0
  106. package/dist/contract.d.mts +90 -0
  107. package/dist/contract.d.mts.map +1 -0
  108. package/dist/contract.mjs +206 -0
  109. package/dist/contract.mjs.map +1 -0
  110. package/dist/dsl/action.cjs +29 -0
  111. package/dist/dsl/action.cjs.map +1 -0
  112. package/dist/dsl/action.d.cts +64 -0
  113. package/dist/dsl/action.d.cts.map +1 -0
  114. package/dist/dsl/action.d.mts +64 -0
  115. package/dist/dsl/action.d.mts.map +1 -0
  116. package/dist/dsl/action.mjs +28 -0
  117. package/dist/dsl/action.mjs.map +1 -0
  118. package/dist/dsl/base.cjs +34 -0
  119. package/dist/dsl/base.cjs.map +1 -0
  120. package/dist/dsl/base.d.cts +45 -0
  121. package/dist/dsl/base.d.cts.map +1 -0
  122. package/dist/dsl/base.d.mts +45 -0
  123. package/dist/dsl/base.d.mts.map +1 -0
  124. package/dist/dsl/base.mjs +30 -0
  125. package/dist/dsl/base.mjs.map +1 -0
  126. package/dist/dsl/bundle.cjs +207 -0
  127. package/dist/dsl/bundle.cjs.map +1 -0
  128. package/dist/dsl/bundle.d.cts +19 -0
  129. package/dist/dsl/bundle.d.cts.map +1 -0
  130. package/dist/dsl/bundle.d.mts +19 -0
  131. package/dist/dsl/bundle.d.mts.map +1 -0
  132. package/dist/dsl/bundle.mjs +206 -0
  133. package/dist/dsl/bundle.mjs.map +1 -0
  134. package/dist/dsl/condition.cjs +177 -0
  135. package/dist/dsl/condition.cjs.map +1 -0
  136. package/dist/dsl/condition.d.cts +140 -0
  137. package/dist/dsl/condition.d.cts.map +1 -0
  138. package/dist/dsl/condition.d.mts +140 -0
  139. package/dist/dsl/condition.d.mts.map +1 -0
  140. package/dist/dsl/condition.mjs +156 -0
  141. package/dist/dsl/condition.mjs.map +1 -0
  142. package/dist/dsl/flow.cjs +228 -0
  143. package/dist/dsl/flow.cjs.map +1 -0
  144. package/dist/dsl/flow.d.cts +223 -0
  145. package/dist/dsl/flow.d.cts.map +1 -0
  146. package/dist/dsl/flow.d.mts +223 -0
  147. package/dist/dsl/flow.d.mts.map +1 -0
  148. package/dist/dsl/flow.mjs +226 -0
  149. package/dist/dsl/flow.mjs.map +1 -0
  150. package/dist/dsl/index.cjs +38 -0
  151. package/dist/dsl/index.d.cts +10 -0
  152. package/dist/dsl/index.d.mts +10 -0
  153. package/dist/dsl/index.mjs +9 -0
  154. package/dist/dsl/refs.cjs +59 -0
  155. package/dist/dsl/refs.cjs.map +1 -0
  156. package/dist/dsl/refs.d.cts +88 -0
  157. package/dist/dsl/refs.d.cts.map +1 -0
  158. package/dist/dsl/refs.d.mts +88 -0
  159. package/dist/dsl/refs.d.mts.map +1 -0
  160. package/dist/dsl/refs.mjs +55 -0
  161. package/dist/dsl/refs.mjs.map +1 -0
  162. package/dist/dsl/template.cjs +65 -0
  163. package/dist/dsl/template.cjs.map +1 -0
  164. package/dist/dsl/template.d.cts +75 -0
  165. package/dist/dsl/template.d.cts.map +1 -0
  166. package/dist/dsl/template.d.mts +75 -0
  167. package/dist/dsl/template.d.mts.map +1 -0
  168. package/dist/dsl/template.mjs +63 -0
  169. package/dist/dsl/template.mjs.map +1 -0
  170. package/dist/dsl/trigger.cjs +40 -0
  171. package/dist/dsl/trigger.cjs.map +1 -0
  172. package/dist/dsl/trigger.d.cts +65 -0
  173. package/dist/dsl/trigger.d.cts.map +1 -0
  174. package/dist/dsl/trigger.d.mts +65 -0
  175. package/dist/dsl/trigger.d.mts.map +1 -0
  176. package/dist/dsl/trigger.mjs +39 -0
  177. package/dist/dsl/trigger.mjs.map +1 -0
  178. package/dist/dsl/workflow.cjs +121 -0
  179. package/dist/dsl/workflow.cjs.map +1 -0
  180. package/dist/dsl/workflow.d.cts +59 -0
  181. package/dist/dsl/workflow.d.cts.map +1 -0
  182. package/dist/dsl/workflow.d.mts +59 -0
  183. package/dist/dsl/workflow.d.mts.map +1 -0
  184. package/dist/dsl/workflow.mjs +120 -0
  185. package/dist/dsl/workflow.mjs.map +1 -0
  186. package/dist/engine/actions.cjs +27 -0
  187. package/dist/engine/actions.cjs.map +1 -0
  188. package/dist/engine/actions.d.cts +40 -0
  189. package/dist/engine/actions.d.cts.map +1 -0
  190. package/dist/engine/actions.d.mts +40 -0
  191. package/dist/engine/actions.d.mts.map +1 -0
  192. package/dist/engine/actions.mjs +26 -0
  193. package/dist/engine/actions.mjs.map +1 -0
  194. package/dist/engine/bucket.cjs +72 -0
  195. package/dist/engine/bucket.cjs.map +1 -0
  196. package/dist/engine/bucket.d.cts +32 -0
  197. package/dist/engine/bucket.d.cts.map +1 -0
  198. package/dist/engine/bucket.d.mts +32 -0
  199. package/dist/engine/bucket.d.mts.map +1 -0
  200. package/dist/engine/bucket.mjs +69 -0
  201. package/dist/engine/bucket.mjs.map +1 -0
  202. package/dist/engine/condition.cjs +166 -0
  203. package/dist/engine/condition.cjs.map +1 -0
  204. package/dist/engine/condition.d.cts +52 -0
  205. package/dist/engine/condition.d.cts.map +1 -0
  206. package/dist/engine/condition.d.mts +52 -0
  207. package/dist/engine/condition.d.mts.map +1 -0
  208. package/dist/engine/condition.mjs +161 -0
  209. package/dist/engine/condition.mjs.map +1 -0
  210. package/dist/engine/index.cjs +20 -0
  211. package/dist/engine/index.d.cts +8 -0
  212. package/dist/engine/index.d.mts +8 -0
  213. package/dist/engine/index.mjs +7 -0
  214. package/dist/engine/interpreter.cjs +428 -0
  215. package/dist/engine/interpreter.cjs.map +1 -0
  216. package/dist/engine/interpreter.d.cts +6 -0
  217. package/dist/engine/interpreter.d.cts.map +1 -0
  218. package/dist/engine/interpreter.d.mts +6 -0
  219. package/dist/engine/interpreter.d.mts.map +1 -0
  220. package/dist/engine/interpreter.mjs +427 -0
  221. package/dist/engine/interpreter.mjs.map +1 -0
  222. package/dist/engine/ports.cjs +0 -0
  223. package/dist/engine/ports.d.cts +252 -0
  224. package/dist/engine/ports.d.cts.map +1 -0
  225. package/dist/engine/ports.d.mts +252 -0
  226. package/dist/engine/ports.d.mts.map +1 -0
  227. package/dist/engine/ports.mjs +1 -0
  228. package/dist/engine/recipient.cjs +23 -0
  229. package/dist/engine/recipient.cjs.map +1 -0
  230. package/dist/engine/recipient.d.cts +13 -0
  231. package/dist/engine/recipient.d.cts.map +1 -0
  232. package/dist/engine/recipient.d.mts +13 -0
  233. package/dist/engine/recipient.d.mts.map +1 -0
  234. package/dist/engine/recipient.mjs +22 -0
  235. package/dist/engine/recipient.mjs.map +1 -0
  236. package/dist/engine/time-scale.cjs +54 -0
  237. package/dist/engine/time-scale.cjs.map +1 -0
  238. package/dist/engine/time-scale.d.cts +31 -0
  239. package/dist/engine/time-scale.d.cts.map +1 -0
  240. package/dist/engine/time-scale.d.mts +31 -0
  241. package/dist/engine/time-scale.d.mts.map +1 -0
  242. package/dist/engine/time-scale.mjs +52 -0
  243. package/dist/engine/time-scale.mjs.map +1 -0
  244. package/dist/engine/time-window.cjs +149 -0
  245. package/dist/engine/time-window.cjs.map +1 -0
  246. package/dist/engine/time-window.d.cts +22 -0
  247. package/dist/engine/time-window.d.cts.map +1 -0
  248. package/dist/engine/time-window.d.mts +22 -0
  249. package/dist/engine/time-window.d.mts.map +1 -0
  250. package/dist/engine/time-window.mjs +147 -0
  251. package/dist/engine/time-window.mjs.map +1 -0
  252. package/dist/fcm.cjs +125 -0
  253. package/dist/fcm.cjs.map +1 -0
  254. package/dist/fcm.d.cts +48 -0
  255. package/dist/fcm.d.cts.map +1 -0
  256. package/dist/fcm.d.mts +48 -0
  257. package/dist/fcm.d.mts.map +1 -0
  258. package/dist/fcm.mjs +121 -0
  259. package/dist/fcm.mjs.map +1 -0
  260. package/dist/hash.cjs +245 -0
  261. package/dist/hash.cjs.map +1 -0
  262. package/dist/hash.d.cts +30 -0
  263. package/dist/hash.d.cts.map +1 -0
  264. package/dist/hash.d.mts +30 -0
  265. package/dist/hash.d.mts.map +1 -0
  266. package/dist/hash.mjs +239 -0
  267. package/dist/hash.mjs.map +1 -0
  268. package/dist/index.cjs +100 -0
  269. package/dist/index.d.cts +18 -0
  270. package/dist/index.d.mts +18 -0
  271. package/dist/index.mjs +17 -0
  272. package/dist/ir.cjs +366 -0
  273. package/dist/ir.cjs.map +1 -0
  274. package/dist/ir.d.cts +486 -0
  275. package/dist/ir.d.cts.map +1 -0
  276. package/dist/ir.d.mts +486 -0
  277. package/dist/ir.d.mts.map +1 -0
  278. package/dist/ir.mjs +344 -0
  279. package/dist/ir.mjs.map +1 -0
  280. package/dist/jwt.cjs +22 -0
  281. package/dist/jwt.cjs.map +1 -0
  282. package/dist/jwt.d.cts +9 -0
  283. package/dist/jwt.d.cts.map +1 -0
  284. package/dist/jwt.d.mts +9 -0
  285. package/dist/jwt.d.mts.map +1 -0
  286. package/dist/jwt.mjs +20 -0
  287. package/dist/jwt.mjs.map +1 -0
  288. package/dist/plan.cjs +223 -0
  289. package/dist/plan.cjs.map +1 -0
  290. package/dist/plan.d.cts +68 -0
  291. package/dist/plan.d.cts.map +1 -0
  292. package/dist/plan.d.mts +68 -0
  293. package/dist/plan.d.mts.map +1 -0
  294. package/dist/plan.mjs +221 -0
  295. package/dist/plan.mjs.map +1 -0
  296. package/dist/postgres-js.cjs +42 -0
  297. package/dist/postgres-js.cjs.map +1 -0
  298. package/dist/postgres-js.d.cts +28 -0
  299. package/dist/postgres-js.d.cts.map +1 -0
  300. package/dist/postgres-js.d.mts +28 -0
  301. package/dist/postgres-js.d.mts.map +1 -0
  302. package/dist/postgres-js.mjs +38 -0
  303. package/dist/postgres-js.mjs.map +1 -0
  304. package/dist/provenance.cjs +67 -0
  305. package/dist/provenance.cjs.map +1 -0
  306. package/dist/provenance.d.cts +41 -0
  307. package/dist/provenance.d.cts.map +1 -0
  308. package/dist/provenance.d.mts +41 -0
  309. package/dist/provenance.d.mts.map +1 -0
  310. package/dist/provenance.mjs +65 -0
  311. package/dist/provenance.mjs.map +1 -0
  312. package/dist/push.cjs +14 -0
  313. package/dist/push.cjs.map +1 -0
  314. package/dist/push.d.cts +16 -0
  315. package/dist/push.d.cts.map +1 -0
  316. package/dist/push.d.mts +16 -0
  317. package/dist/push.d.mts.map +1 -0
  318. package/dist/push.mjs +13 -0
  319. package/dist/push.mjs.map +1 -0
  320. package/dist/react-email.cjs +48 -0
  321. package/dist/react-email.cjs.map +1 -0
  322. package/dist/react-email.d.cts +7 -0
  323. package/dist/react-email.d.cts.map +1 -0
  324. package/dist/react-email.d.mts +7 -0
  325. package/dist/react-email.d.mts.map +1 -0
  326. package/dist/react-email.mjs +47 -0
  327. package/dist/react-email.mjs.map +1 -0
  328. package/dist/reporting/classify.cjs +42 -0
  329. package/dist/reporting/classify.cjs.map +1 -0
  330. package/dist/reporting/classify.d.cts +60 -0
  331. package/dist/reporting/classify.d.cts.map +1 -0
  332. package/dist/reporting/classify.d.mts +60 -0
  333. package/dist/reporting/classify.d.mts.map +1 -0
  334. package/dist/reporting/classify.mjs +38 -0
  335. package/dist/reporting/classify.mjs.map +1 -0
  336. package/dist/reporting/observer.cjs +63 -0
  337. package/dist/reporting/observer.cjs.map +1 -0
  338. package/dist/reporting/observer.d.cts +18 -0
  339. package/dist/reporting/observer.d.cts.map +1 -0
  340. package/dist/reporting/observer.d.mts +18 -0
  341. package/dist/reporting/observer.d.mts.map +1 -0
  342. package/dist/reporting/observer.mjs +62 -0
  343. package/dist/reporting/observer.mjs.map +1 -0
  344. package/dist/reporting/tracking.cjs +153 -0
  345. package/dist/reporting/tracking.cjs.map +1 -0
  346. package/dist/reporting/tracking.d.cts +43 -0
  347. package/dist/reporting/tracking.d.cts.map +1 -0
  348. package/dist/reporting/tracking.d.mts +43 -0
  349. package/dist/reporting/tracking.d.mts.map +1 -0
  350. package/dist/reporting/tracking.mjs +151 -0
  351. package/dist/reporting/tracking.mjs.map +1 -0
  352. package/dist/runtime.cjs +19 -0
  353. package/dist/runtime.cjs.map +1 -0
  354. package/dist/runtime.d.cts +30 -0
  355. package/dist/runtime.d.cts.map +1 -0
  356. package/dist/runtime.d.mts +30 -0
  357. package/dist/runtime.d.mts.map +1 -0
  358. package/dist/runtime.mjs +18 -0
  359. package/dist/runtime.mjs.map +1 -0
  360. package/dist/store/d1.cjs +185 -0
  361. package/dist/store/d1.cjs.map +1 -0
  362. package/dist/store/d1.d.cts +55 -0
  363. package/dist/store/d1.d.cts.map +1 -0
  364. package/dist/store/d1.d.mts +55 -0
  365. package/dist/store/d1.d.mts.map +1 -0
  366. package/dist/store/d1.mjs +184 -0
  367. package/dist/store/d1.mjs.map +1 -0
  368. package/dist/store/facts.cjs +60 -0
  369. package/dist/store/facts.cjs.map +1 -0
  370. package/dist/store/facts.d.cts +38 -0
  371. package/dist/store/facts.d.cts.map +1 -0
  372. package/dist/store/facts.d.mts +38 -0
  373. package/dist/store/facts.d.mts.map +1 -0
  374. package/dist/store/facts.mjs +58 -0
  375. package/dist/store/facts.mjs.map +1 -0
  376. package/dist/store/index.cjs +31 -0
  377. package/dist/store/index.cjs.map +1 -0
  378. package/dist/store/index.d.cts +291 -0
  379. package/dist/store/index.d.cts.map +1 -0
  380. package/dist/store/index.d.mts +291 -0
  381. package/dist/store/index.d.mts.map +1 -0
  382. package/dist/store/index.mjs +22 -0
  383. package/dist/store/index.mjs.map +1 -0
  384. package/dist/store/postgres-reporting.cjs +213 -0
  385. package/dist/store/postgres-reporting.cjs.map +1 -0
  386. package/dist/store/postgres-reporting.d.cts +63 -0
  387. package/dist/store/postgres-reporting.d.cts.map +1 -0
  388. package/dist/store/postgres-reporting.d.mts +63 -0
  389. package/dist/store/postgres-reporting.d.mts.map +1 -0
  390. package/dist/store/postgres-reporting.mjs +212 -0
  391. package/dist/store/postgres-reporting.mjs.map +1 -0
  392. package/dist/store/postgres.cjs +309 -0
  393. package/dist/store/postgres.cjs.map +1 -0
  394. package/dist/store/postgres.d.cts +77 -0
  395. package/dist/store/postgres.d.cts.map +1 -0
  396. package/dist/store/postgres.d.mts +77 -0
  397. package/dist/store/postgres.d.mts.map +1 -0
  398. package/dist/store/postgres.mjs +306 -0
  399. package/dist/store/postgres.mjs.map +1 -0
  400. package/dist/store/sql.cjs +24 -0
  401. package/dist/store/sql.cjs.map +1 -0
  402. package/dist/store/sql.d.cts +25 -0
  403. package/dist/store/sql.d.cts.map +1 -0
  404. package/dist/store/sql.d.mts +25 -0
  405. package/dist/store/sql.d.mts.map +1 -0
  406. package/dist/store/sql.mjs +23 -0
  407. package/dist/store/sql.mjs.map +1 -0
  408. package/dist/store/tables.cjs +404 -0
  409. package/dist/store/tables.cjs.map +1 -0
  410. package/dist/store/tables.d.cts +81 -0
  411. package/dist/store/tables.d.cts.map +1 -0
  412. package/dist/store/tables.d.mts +81 -0
  413. package/dist/store/tables.d.mts.map +1 -0
  414. package/dist/store/tables.mjs +399 -0
  415. package/dist/store/tables.mjs.map +1 -0
  416. package/dist/templates.cjs +247 -0
  417. package/dist/templates.cjs.map +1 -0
  418. package/dist/templates.d.cts +187 -0
  419. package/dist/templates.d.cts.map +1 -0
  420. package/dist/templates.d.mts +187 -0
  421. package/dist/templates.d.mts.map +1 -0
  422. package/dist/templates.mjs +230 -0
  423. package/dist/templates.mjs.map +1 -0
  424. package/dist/webhooks.cjs +96 -0
  425. package/dist/webhooks.cjs.map +1 -0
  426. package/dist/webhooks.d.cts +25 -0
  427. package/dist/webhooks.d.cts.map +1 -0
  428. package/dist/webhooks.d.mts +25 -0
  429. package/dist/webhooks.d.mts.map +1 -0
  430. package/dist/webhooks.mjs +94 -0
  431. package/dist/webhooks.mjs.map +1 -0
  432. package/dist/webpush.cjs +180 -0
  433. package/dist/webpush.cjs.map +1 -0
  434. package/dist/webpush.d.cts +53 -0
  435. package/dist/webpush.d.cts.map +1 -0
  436. package/dist/webpush.d.mts +53 -0
  437. package/dist/webpush.d.mts.map +1 -0
  438. package/dist/webpush.mjs +175 -0
  439. package/dist/webpush.mjs.map +1 -0
  440. package/package.json +189 -3
  441. package/src/cloudflare/schema.sql +127 -0
  442. package/src/cloudflare/workers.d.ts +44 -0
@@ -0,0 +1,164 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_apns = require("../apns.cjs");
3
+ const require_templates = require("../templates.cjs");
4
+ const require_config = require("../config.cjs");
5
+ const require_fcm = require("../fcm.cjs");
6
+ const require_runtime = require("../runtime.cjs");
7
+ const require_push = require("../push.cjs");
8
+ const require_react_email = require("../react-email.cjs");
9
+ const require_webhooks = require("../webhooks.cjs");
10
+ const require_webpush = require("../webpush.cjs");
11
+ const require_cloudflare_router = require("./router.cjs");
12
+ const require_cloudflare_senders = require("./senders.cjs");
13
+ //#region src/cloudflare/channels.ts
14
+ /**
15
+ * The outlets a `JourneyConfig` describes, assembled against the environment:
16
+ * email through the `EMAIL` binding with the configured addresses, iOS pushes
17
+ * straight to APNs with the configured key (the `.p8` from
18
+ * `APNS_PRIVATE_KEY_BASE64`), Android pushes through FCM with the service
19
+ * account from `GOOGLE_APPLICATION_CREDENTIALS_BASE64`. A channel the config
20
+ * leaves out is simply absent, and a journey that sends on it fails that step
21
+ * with a message saying so — rather than the host having to spell out every
22
+ * sender by hand.
23
+ */
24
+ /** Which config entry applies: wrangler's `ENVIRONMENT` var, production when unset. */
25
+ function journeyMode(env) {
26
+ return env.ENVIRONMENT ?? "production";
27
+ }
28
+ /** The runtime options for this environment's mode. */
29
+ function runtimeFromConfig(config, env) {
30
+ return require_runtime.resolveRuntime(config?.runtime, journeyMode(env));
31
+ }
32
+ /** A sender that fails every message with the reason the channel cannot deliver. */
33
+ function unavailable(reason) {
34
+ return { async send(message) {
35
+ throw new Error(`cannot send '${message.template}' on ${message.channel}: ${reason}`);
36
+ } };
37
+ }
38
+ function requireSecret(env, name) {
39
+ const value = env[name];
40
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${name} is not set: the environment must hold it for the configured channel`);
41
+ return value;
42
+ }
43
+ /**
44
+ * A sender built on its first message. A platform's secret is only required
45
+ * when something is actually sent there: a journey that only emails must not
46
+ * fail because the APNs key is missing from a local `.dev.vars`.
47
+ */
48
+ function lazy(build) {
49
+ let sender;
50
+ return { async send(message) {
51
+ sender ??= build();
52
+ return sender.send(message);
53
+ } };
54
+ }
55
+ function channelsFromConfig(config, env, options = {}) {
56
+ const mode = journeyMode(env);
57
+ const email = () => {
58
+ const registry = config.templates?.email;
59
+ if (registry === void 0) return unavailable("no email templates are registered");
60
+ if (env.EMAIL === void 0) return unavailable("no EMAIL (send_email) binding");
61
+ if (config.emails === void 0) return unavailable("emails.from is not configured");
62
+ return new require_cloudflare_senders.CfEmailSender({
63
+ binding: env.EMAIL,
64
+ from: config.emails.from,
65
+ ...config.emails.replyTo === void 0 ? {} : { replyTo: config.emails.replyTo },
66
+ render: require_react_email.registryRenderer(registry)
67
+ });
68
+ };
69
+ const push = () => {
70
+ const registry = config.templates?.push;
71
+ if (registry === void 0) return unavailable("no push templates are registered");
72
+ const render = require_push.registryPushRenderer(registry);
73
+ const onUnregistered = async (message) => {
74
+ if (message.device !== void 0 && options.store !== void 0) await require_cloudflare_router.removeDevice(env, message.device.token, options.store);
75
+ };
76
+ const platforms = {};
77
+ const apns = config.apns;
78
+ if (apns !== void 0) platforms.ios = lazy(() => new require_apns.ApnsPushSender({
79
+ keyId: apns.keyId,
80
+ teamId: apns.teamId,
81
+ privateKey: require_apns.apnsKeyFromBase64(requireSecret(env, "APNS_PRIVATE_KEY_BASE64")),
82
+ topic: apns.topic,
83
+ environment: require_config.apnsEnvironment(apns, mode),
84
+ render,
85
+ onUnregistered,
86
+ ...env.APNS_RELAY_ORIGIN === void 0 ? {} : { origin: env.APNS_RELAY_ORIGIN },
87
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
88
+ }));
89
+ const fcm = config.fcm;
90
+ if (fcm !== void 0) platforms.android = lazy(() => new require_fcm.FcmPushSender({
91
+ serviceAccount: require_fcm.serviceAccountFromBase64(requireSecret(env, "GOOGLE_APPLICATION_CREDENTIALS_BASE64")),
92
+ render,
93
+ onUnregistered,
94
+ ...fcm.androidChannelId === void 0 ? {} : { android: { channel_id: fcm.androidChannelId } },
95
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
96
+ }));
97
+ const webPush = config.webPush;
98
+ if (webPush !== void 0) platforms.web = lazy(() => new require_webpush.WebPushSender({
99
+ vapid: {
100
+ subject: webPush.subject,
101
+ publicKey: requireSecret(env, "VAPID_PUBLIC_KEY"),
102
+ privateKey: requireSecret(env, "VAPID_PRIVATE_KEY")
103
+ },
104
+ render,
105
+ onUnregistered,
106
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
107
+ }));
108
+ if (Object.keys(platforms).length === 0) return unavailable("none of apns, fcm or webPush is configured");
109
+ return require_cloudflare_senders.routeByPlatform(platforms);
110
+ };
111
+ /**
112
+ * A webhook template's URL, read from the environment the Worker validated at startup (its
113
+ * `env` schema): a template whose variable is unset fails the step, naming the template.
114
+ */
115
+ const webhookUrl = (channel, key, template) => {
116
+ const url = template.webhook(env);
117
+ if (typeof url !== "string" || url === "") throw new Error(`${channel} template '${key}': its webhook URL is not set in the environment`);
118
+ return url;
119
+ };
120
+ const lookupTemplate = (registry, channel, key) => {
121
+ if (!Object.hasOwn(registry, key)) throw new Error(`unknown ${channel} template: ${key}`);
122
+ return registry[key];
123
+ };
124
+ const discord = () => {
125
+ const registry = config.templates?.discord;
126
+ if (registry === void 0) return unavailable("no discord templates are registered");
127
+ return new require_webhooks.DiscordWebhookSender({
128
+ render: (key, props) => {
129
+ const template = lookupTemplate(registry, "discord", key);
130
+ return {
131
+ url: webhookUrl("discord", key, template),
132
+ content: require_templates.renderDiscordContent(template, key, props)
133
+ };
134
+ },
135
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
136
+ });
137
+ };
138
+ const slack = () => {
139
+ const registry = config.templates?.slack;
140
+ if (registry === void 0) return unavailable("no slack templates are registered");
141
+ return new require_webhooks.SlackWebhookSender({
142
+ render: (key, props) => {
143
+ const template = lookupTemplate(registry, "slack", key);
144
+ return {
145
+ url: webhookUrl("slack", key, template),
146
+ content: require_templates.renderSlackContent(template, key, props)
147
+ };
148
+ },
149
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
150
+ });
151
+ };
152
+ return require_cloudflare_senders.routeByChannel({
153
+ email: email(),
154
+ push: push(),
155
+ discord: discord(),
156
+ slack: slack()
157
+ });
158
+ }
159
+ //#endregion
160
+ exports.channelsFromConfig = channelsFromConfig;
161
+ exports.journeyMode = journeyMode;
162
+ exports.runtimeFromConfig = runtimeFromConfig;
163
+
164
+ //# sourceMappingURL=channels.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.cjs","names":["resolveRuntime","CfEmailSender","registryRenderer","registryPushRenderer","removeDevice","ApnsPushSender","apnsKeyFromBase64","apnsEnvironment","FcmPushSender","serviceAccountFromBase64","WebPushSender","routeByPlatform","DiscordWebhookSender","renderDiscordContent","SlackWebhookSender","renderSlackContent","routeByChannel"],"sources":["../../src/cloudflare/channels.ts"],"sourcesContent":["import { ApnsPushSender, apnsKeyFromBase64 } from '../apns';\nimport { type JourneyConfig, apnsEnvironment } from '../config';\nimport type { MessageSender, OutboundMessage } from '../engine/ports';\nimport { FcmPushSender, serviceAccountFromBase64 } from '../fcm';\nimport { registryPushRenderer } from '../push';\nimport { registryRenderer } from '../react-email';\nimport { type JourneyMode, type JourneyRuntimeOptions, resolveRuntime } from '../runtime';\nimport type { JourneyStore } from '../store/index';\nimport {\n type DiscordTemplate,\n type SlackTemplate,\n renderDiscordContent,\n renderSlackContent,\n} from '../templates';\nimport { DiscordWebhookSender, SlackWebhookSender } from '../webhooks';\nimport { WebPushSender } from '../webpush';\nimport type { JourneyEnv } from './bindings';\nimport { removeDevice } from './router';\nimport { CfEmailSender, routeByChannel, routeByPlatform } from './senders';\n\n/**\n * The outlets a `JourneyConfig` describes, assembled against the environment:\n * email through the `EMAIL` binding with the configured addresses, iOS pushes\n * straight to APNs with the configured key (the `.p8` from\n * `APNS_PRIVATE_KEY_BASE64`), Android pushes through FCM with the service\n * account from `GOOGLE_APPLICATION_CREDENTIALS_BASE64`. A channel the config\n * leaves out is simply absent, and a journey that sends on it fails that step\n * with a message saying so — rather than the host having to spell out every\n * sender by hand.\n */\n\n/** Which config entry applies: wrangler's `ENVIRONMENT` var, production when unset. */\nexport function journeyMode(env: JourneyEnv): JourneyMode {\n return env.ENVIRONMENT ?? 'production';\n}\n\n/** The runtime options for this environment's mode. */\nexport function runtimeFromConfig(\n config: Pick<JourneyConfig, 'runtime'> | undefined,\n env: JourneyEnv\n): Required<JourneyRuntimeOptions> {\n return resolveRuntime(config?.runtime, journeyMode(env));\n}\n\n/** A sender that fails every message with the reason the channel cannot deliver. */\nfunction unavailable(reason: string): MessageSender {\n return {\n async send(message) {\n throw new Error(`cannot send '${message.template}' on ${message.channel}: ${reason}`);\n },\n };\n}\n\nfunction requireSecret(\n env: JourneyEnv,\n name:\n | 'APNS_PRIVATE_KEY_BASE64'\n | 'GOOGLE_APPLICATION_CREDENTIALS_BASE64'\n | 'VAPID_PUBLIC_KEY'\n | 'VAPID_PRIVATE_KEY'\n): string {\n const value = env[name];\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${name} is not set: the environment must hold it for the configured channel`);\n }\n return value;\n}\n\n/**\n * A sender built on its first message. A platform's secret is only required\n * when something is actually sent there: a journey that only emails must not\n * fail because the APNs key is missing from a local `.dev.vars`.\n */\nfunction lazy(build: () => MessageSender): MessageSender {\n let sender: MessageSender | undefined;\n return {\n async send(message) {\n sender ??= build();\n return sender.send(message);\n },\n };\n}\n\n/** The channels slice of the config — what `channelsFromConfig` reads. */\nexport type ChannelsConfig = Pick<\n JourneyConfig,\n 'templates' | 'emails' | 'apns' | 'fcm' | 'webPush' | 'runtime'\n>;\n\nexport function channelsFromConfig(\n config: ChannelsConfig,\n env: JourneyEnv,\n options: {\n /** The store a token APNs / FCM / a push service reports as gone is removed from. */\n store?: JourneyStore | undefined;\n fetch?: typeof fetch;\n } = {}\n): MessageSender {\n const mode = journeyMode(env);\n\n const email = (): MessageSender => {\n const registry = config.templates?.email;\n if (registry === undefined) return unavailable('no email templates are registered');\n if (env.EMAIL === undefined) return unavailable('no EMAIL (send_email) binding');\n if (config.emails === undefined) return unavailable('emails.from is not configured');\n return new CfEmailSender({\n binding: env.EMAIL,\n from: config.emails.from,\n ...(config.emails.replyTo === undefined ? {} : { replyTo: config.emails.replyTo }),\n render: registryRenderer(registry),\n });\n };\n\n const push = (): MessageSender => {\n const registry = config.templates?.push;\n if (registry === undefined) return unavailable('no push templates are registered');\n const render = registryPushRenderer(registry);\n // A token the provider reports as gone is forgotten (nothing left to deliver to), waking the\n // waits that read devices, as a removal through the API does\n const onUnregistered = async (message: OutboundMessage) => {\n if (message.device !== undefined && options.store !== undefined) {\n await removeDevice(env, message.device.token, options.store);\n }\n };\n const platforms: Record<string, MessageSender> = {};\n const apns = config.apns;\n if (apns !== undefined) {\n platforms.ios = lazy(\n () =>\n new ApnsPushSender({\n keyId: apns.keyId,\n teamId: apns.teamId,\n privateKey: apnsKeyFromBase64(requireSecret(env, 'APNS_PRIVATE_KEY_BASE64')),\n topic: apns.topic,\n environment: apnsEnvironment(apns, mode),\n render,\n onUnregistered,\n ...(env.APNS_RELAY_ORIGIN === undefined ? {} : { origin: env.APNS_RELAY_ORIGIN }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n })\n );\n }\n const fcm = config.fcm;\n if (fcm !== undefined) {\n platforms.android = lazy(\n () =>\n new FcmPushSender({\n serviceAccount: serviceAccountFromBase64(\n requireSecret(env, 'GOOGLE_APPLICATION_CREDENTIALS_BASE64')\n ),\n render,\n onUnregistered,\n ...(fcm.androidChannelId === undefined\n ? {}\n : { android: { channel_id: fcm.androidChannelId } }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n })\n );\n }\n const webPush = config.webPush;\n if (webPush !== undefined) {\n platforms.web = lazy(\n () =>\n new WebPushSender({\n vapid: {\n subject: webPush.subject,\n publicKey: requireSecret(env, 'VAPID_PUBLIC_KEY'),\n privateKey: requireSecret(env, 'VAPID_PRIVATE_KEY'),\n },\n render,\n onUnregistered,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n })\n );\n }\n if (Object.keys(platforms).length === 0)\n return unavailable('none of apns, fcm or webPush is configured');\n return routeByPlatform(platforms);\n };\n\n /**\n * A webhook template's URL, read from the environment the Worker validated at startup (its\n * `env` schema): a template whose variable is unset fails the step, naming the template.\n */\n const webhookUrl = (\n channel: 'discord' | 'slack',\n key: string,\n template: DiscordTemplate | SlackTemplate\n ) => {\n const url = template.webhook(env as unknown as Record<string, unknown>);\n if (typeof url !== 'string' || url === '') {\n throw new Error(\n `${channel} template '${key}': its webhook URL is not set in the environment`\n );\n }\n return url;\n };\n const lookupTemplate = <T>(\n registry: Readonly<Record<string, T>>,\n channel: string,\n key: string\n ) => {\n if (!Object.hasOwn(registry, key)) throw new Error(`unknown ${channel} template: ${key}`);\n return registry[key];\n };\n\n const discord = (): MessageSender => {\n const registry = config.templates?.discord;\n if (registry === undefined) return unavailable('no discord templates are registered');\n return new DiscordWebhookSender({\n render: (key, props) => {\n const template = lookupTemplate(registry, 'discord', key) as DiscordTemplate;\n return {\n url: webhookUrl('discord', key, template),\n content: renderDiscordContent(template, key, props),\n };\n },\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n };\n\n const slack = (): MessageSender => {\n const registry = config.templates?.slack;\n if (registry === undefined) return unavailable('no slack templates are registered');\n return new SlackWebhookSender({\n render: (key, props) => {\n const template = lookupTemplate(registry, 'slack', key) as SlackTemplate;\n return {\n url: webhookUrl('slack', key, template),\n content: renderSlackContent(template, key, props),\n };\n },\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n };\n\n return routeByChannel({ email: email(), push: push(), discord: discord(), slack: slack() });\n}\n"],"mappings":"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"}
@@ -0,0 +1,29 @@
1
+ import { MessageSender } from "../engine/ports.cjs";
2
+ import { JourneyMode, JourneyRuntimeOptions } from "../runtime.cjs";
3
+ import { JourneyConfig } from "../config.cjs";
4
+ import { JourneyEnv } from "./bindings.cjs";
5
+ import { JourneyStore } from "../store/index.cjs";
6
+ //#region src/cloudflare/channels.d.ts
7
+ /**
8
+ * The outlets a `JourneyConfig` describes, assembled against the environment:
9
+ * email through the `EMAIL` binding with the configured addresses, iOS pushes
10
+ * straight to APNs with the configured key (the `.p8` from
11
+ * `APNS_PRIVATE_KEY_BASE64`), Android pushes through FCM with the service
12
+ * account from `GOOGLE_APPLICATION_CREDENTIALS_BASE64`. A channel the config
13
+ * leaves out is simply absent, and a journey that sends on it fails that step
14
+ * with a message saying so — rather than the host having to spell out every
15
+ * sender by hand.
16
+ */
17
+ /** Which config entry applies: wrangler's `ENVIRONMENT` var, production when unset. */
18
+ export declare function journeyMode(env: JourneyEnv): JourneyMode;
19
+ /** The runtime options for this environment's mode. */
20
+ export declare function runtimeFromConfig(config: Pick<JourneyConfig, 'runtime'> | undefined, env: JourneyEnv): Required<JourneyRuntimeOptions>;
21
+ /** The channels slice of the config — what `channelsFromConfig` reads. */
22
+ export type ChannelsConfig = Pick<JourneyConfig, 'templates' | 'emails' | 'apns' | 'fcm' | 'webPush' | 'runtime'>;
23
+ export declare function channelsFromConfig(config: ChannelsConfig, env: JourneyEnv, options?: {
24
+ /** The store a token APNs / FCM / a push service reports as gone is removed from. */
25
+ store?: JourneyStore | undefined;
26
+ fetch?: typeof fetch;
27
+ }): MessageSender;
28
+ //#endregion
29
+ //# sourceMappingURL=channels.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.cts","names":[],"sources":["../../src/cloudflare/channels.ts"],"mappings":";;;;;;;;;;;;;;;;;wBAgCgB,YAAY,KAAK,aAAa;;wBAK9B,kBACd,QAAQ,KAAK,uCACb,KAAK,aACJ,SAAS;;YA4CA,iBAAiB,KAC3B;wBAIc,mBACd,QAAQ,gBACR,KAAK,YACL;;EAEE,QAAQ;EACR,eAAe;IAEhB"}
@@ -0,0 +1,29 @@
1
+ import { MessageSender } from "../engine/ports.mjs";
2
+ import { JourneyMode, JourneyRuntimeOptions } from "../runtime.mjs";
3
+ import { JourneyConfig } from "../config.mjs";
4
+ import { JourneyEnv } from "./bindings.mjs";
5
+ import { JourneyStore } from "../store/index.mjs";
6
+ //#region src/cloudflare/channels.d.ts
7
+ /**
8
+ * The outlets a `JourneyConfig` describes, assembled against the environment:
9
+ * email through the `EMAIL` binding with the configured addresses, iOS pushes
10
+ * straight to APNs with the configured key (the `.p8` from
11
+ * `APNS_PRIVATE_KEY_BASE64`), Android pushes through FCM with the service
12
+ * account from `GOOGLE_APPLICATION_CREDENTIALS_BASE64`. A channel the config
13
+ * leaves out is simply absent, and a journey that sends on it fails that step
14
+ * with a message saying so — rather than the host having to spell out every
15
+ * sender by hand.
16
+ */
17
+ /** Which config entry applies: wrangler's `ENVIRONMENT` var, production when unset. */
18
+ export declare function journeyMode(env: JourneyEnv): JourneyMode;
19
+ /** The runtime options for this environment's mode. */
20
+ export declare function runtimeFromConfig(config: Pick<JourneyConfig, 'runtime'> | undefined, env: JourneyEnv): Required<JourneyRuntimeOptions>;
21
+ /** The channels slice of the config — what `channelsFromConfig` reads. */
22
+ export type ChannelsConfig = Pick<JourneyConfig, 'templates' | 'emails' | 'apns' | 'fcm' | 'webPush' | 'runtime'>;
23
+ export declare function channelsFromConfig(config: ChannelsConfig, env: JourneyEnv, options?: {
24
+ /** The store a token APNs / FCM / a push service reports as gone is removed from. */
25
+ store?: JourneyStore | undefined;
26
+ fetch?: typeof fetch;
27
+ }): MessageSender;
28
+ //#endregion
29
+ //# sourceMappingURL=channels.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.d.mts","names":[],"sources":["../../src/cloudflare/channels.ts"],"mappings":";;;;;;;;;;;;;;;;;wBAgCgB,YAAY,KAAK,aAAa;;wBAK9B,kBACd,QAAQ,KAAK,uCACb,KAAK,aACJ,SAAS;;YA4CA,iBAAiB,KAC3B;wBAIc,mBACd,QAAQ,gBACR,KAAK,YACL;;EAEE,QAAQ;EACR,eAAe;IAEhB"}
@@ -0,0 +1,161 @@
1
+ import { ApnsPushSender, apnsKeyFromBase64 } from "../apns.mjs";
2
+ import { renderDiscordContent, renderSlackContent } from "../templates.mjs";
3
+ import { apnsEnvironment } from "../config.mjs";
4
+ import { FcmPushSender, serviceAccountFromBase64 } from "../fcm.mjs";
5
+ import { resolveRuntime } from "../runtime.mjs";
6
+ import { registryPushRenderer } from "../push.mjs";
7
+ import { registryRenderer } from "../react-email.mjs";
8
+ import { DiscordWebhookSender, SlackWebhookSender } from "../webhooks.mjs";
9
+ import { WebPushSender } from "../webpush.mjs";
10
+ import { removeDevice } from "./router.mjs";
11
+ import { CfEmailSender, routeByChannel, routeByPlatform } from "./senders.mjs";
12
+ //#region src/cloudflare/channels.ts
13
+ /**
14
+ * The outlets a `JourneyConfig` describes, assembled against the environment:
15
+ * email through the `EMAIL` binding with the configured addresses, iOS pushes
16
+ * straight to APNs with the configured key (the `.p8` from
17
+ * `APNS_PRIVATE_KEY_BASE64`), Android pushes through FCM with the service
18
+ * account from `GOOGLE_APPLICATION_CREDENTIALS_BASE64`. A channel the config
19
+ * leaves out is simply absent, and a journey that sends on it fails that step
20
+ * with a message saying so — rather than the host having to spell out every
21
+ * sender by hand.
22
+ */
23
+ /** Which config entry applies: wrangler's `ENVIRONMENT` var, production when unset. */
24
+ function journeyMode(env) {
25
+ return env.ENVIRONMENT ?? "production";
26
+ }
27
+ /** The runtime options for this environment's mode. */
28
+ function runtimeFromConfig(config, env) {
29
+ return resolveRuntime(config?.runtime, journeyMode(env));
30
+ }
31
+ /** A sender that fails every message with the reason the channel cannot deliver. */
32
+ function unavailable(reason) {
33
+ return { async send(message) {
34
+ throw new Error(`cannot send '${message.template}' on ${message.channel}: ${reason}`);
35
+ } };
36
+ }
37
+ function requireSecret(env, name) {
38
+ const value = env[name];
39
+ if (typeof value !== "string" || value.length === 0) throw new Error(`${name} is not set: the environment must hold it for the configured channel`);
40
+ return value;
41
+ }
42
+ /**
43
+ * A sender built on its first message. A platform's secret is only required
44
+ * when something is actually sent there: a journey that only emails must not
45
+ * fail because the APNs key is missing from a local `.dev.vars`.
46
+ */
47
+ function lazy(build) {
48
+ let sender;
49
+ return { async send(message) {
50
+ sender ??= build();
51
+ return sender.send(message);
52
+ } };
53
+ }
54
+ function channelsFromConfig(config, env, options = {}) {
55
+ const mode = journeyMode(env);
56
+ const email = () => {
57
+ const registry = config.templates?.email;
58
+ if (registry === void 0) return unavailable("no email templates are registered");
59
+ if (env.EMAIL === void 0) return unavailable("no EMAIL (send_email) binding");
60
+ if (config.emails === void 0) return unavailable("emails.from is not configured");
61
+ return new CfEmailSender({
62
+ binding: env.EMAIL,
63
+ from: config.emails.from,
64
+ ...config.emails.replyTo === void 0 ? {} : { replyTo: config.emails.replyTo },
65
+ render: registryRenderer(registry)
66
+ });
67
+ };
68
+ const push = () => {
69
+ const registry = config.templates?.push;
70
+ if (registry === void 0) return unavailable("no push templates are registered");
71
+ const render = registryPushRenderer(registry);
72
+ const onUnregistered = async (message) => {
73
+ if (message.device !== void 0 && options.store !== void 0) await removeDevice(env, message.device.token, options.store);
74
+ };
75
+ const platforms = {};
76
+ const apns = config.apns;
77
+ if (apns !== void 0) platforms.ios = lazy(() => new ApnsPushSender({
78
+ keyId: apns.keyId,
79
+ teamId: apns.teamId,
80
+ privateKey: apnsKeyFromBase64(requireSecret(env, "APNS_PRIVATE_KEY_BASE64")),
81
+ topic: apns.topic,
82
+ environment: apnsEnvironment(apns, mode),
83
+ render,
84
+ onUnregistered,
85
+ ...env.APNS_RELAY_ORIGIN === void 0 ? {} : { origin: env.APNS_RELAY_ORIGIN },
86
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
87
+ }));
88
+ const fcm = config.fcm;
89
+ if (fcm !== void 0) platforms.android = lazy(() => new FcmPushSender({
90
+ serviceAccount: serviceAccountFromBase64(requireSecret(env, "GOOGLE_APPLICATION_CREDENTIALS_BASE64")),
91
+ render,
92
+ onUnregistered,
93
+ ...fcm.androidChannelId === void 0 ? {} : { android: { channel_id: fcm.androidChannelId } },
94
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
95
+ }));
96
+ const webPush = config.webPush;
97
+ if (webPush !== void 0) platforms.web = lazy(() => new WebPushSender({
98
+ vapid: {
99
+ subject: webPush.subject,
100
+ publicKey: requireSecret(env, "VAPID_PUBLIC_KEY"),
101
+ privateKey: requireSecret(env, "VAPID_PRIVATE_KEY")
102
+ },
103
+ render,
104
+ onUnregistered,
105
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
106
+ }));
107
+ if (Object.keys(platforms).length === 0) return unavailable("none of apns, fcm or webPush is configured");
108
+ return routeByPlatform(platforms);
109
+ };
110
+ /**
111
+ * A webhook template's URL, read from the environment the Worker validated at startup (its
112
+ * `env` schema): a template whose variable is unset fails the step, naming the template.
113
+ */
114
+ const webhookUrl = (channel, key, template) => {
115
+ const url = template.webhook(env);
116
+ if (typeof url !== "string" || url === "") throw new Error(`${channel} template '${key}': its webhook URL is not set in the environment`);
117
+ return url;
118
+ };
119
+ const lookupTemplate = (registry, channel, key) => {
120
+ if (!Object.hasOwn(registry, key)) throw new Error(`unknown ${channel} template: ${key}`);
121
+ return registry[key];
122
+ };
123
+ const discord = () => {
124
+ const registry = config.templates?.discord;
125
+ if (registry === void 0) return unavailable("no discord templates are registered");
126
+ return new DiscordWebhookSender({
127
+ render: (key, props) => {
128
+ const template = lookupTemplate(registry, "discord", key);
129
+ return {
130
+ url: webhookUrl("discord", key, template),
131
+ content: renderDiscordContent(template, key, props)
132
+ };
133
+ },
134
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
135
+ });
136
+ };
137
+ const slack = () => {
138
+ const registry = config.templates?.slack;
139
+ if (registry === void 0) return unavailable("no slack templates are registered");
140
+ return new SlackWebhookSender({
141
+ render: (key, props) => {
142
+ const template = lookupTemplate(registry, "slack", key);
143
+ return {
144
+ url: webhookUrl("slack", key, template),
145
+ content: renderSlackContent(template, key, props)
146
+ };
147
+ },
148
+ ...options.fetch === void 0 ? {} : { fetch: options.fetch }
149
+ });
150
+ };
151
+ return routeByChannel({
152
+ email: email(),
153
+ push: push(),
154
+ discord: discord(),
155
+ slack: slack()
156
+ });
157
+ }
158
+ //#endregion
159
+ export { channelsFromConfig, journeyMode, runtimeFromConfig };
160
+
161
+ //# sourceMappingURL=channels.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"channels.mjs","names":[],"sources":["../../src/cloudflare/channels.ts"],"sourcesContent":["import { ApnsPushSender, apnsKeyFromBase64 } from '../apns';\nimport { type JourneyConfig, apnsEnvironment } from '../config';\nimport type { MessageSender, OutboundMessage } from '../engine/ports';\nimport { FcmPushSender, serviceAccountFromBase64 } from '../fcm';\nimport { registryPushRenderer } from '../push';\nimport { registryRenderer } from '../react-email';\nimport { type JourneyMode, type JourneyRuntimeOptions, resolveRuntime } from '../runtime';\nimport type { JourneyStore } from '../store/index';\nimport {\n type DiscordTemplate,\n type SlackTemplate,\n renderDiscordContent,\n renderSlackContent,\n} from '../templates';\nimport { DiscordWebhookSender, SlackWebhookSender } from '../webhooks';\nimport { WebPushSender } from '../webpush';\nimport type { JourneyEnv } from './bindings';\nimport { removeDevice } from './router';\nimport { CfEmailSender, routeByChannel, routeByPlatform } from './senders';\n\n/**\n * The outlets a `JourneyConfig` describes, assembled against the environment:\n * email through the `EMAIL` binding with the configured addresses, iOS pushes\n * straight to APNs with the configured key (the `.p8` from\n * `APNS_PRIVATE_KEY_BASE64`), Android pushes through FCM with the service\n * account from `GOOGLE_APPLICATION_CREDENTIALS_BASE64`. A channel the config\n * leaves out is simply absent, and a journey that sends on it fails that step\n * with a message saying so — rather than the host having to spell out every\n * sender by hand.\n */\n\n/** Which config entry applies: wrangler's `ENVIRONMENT` var, production when unset. */\nexport function journeyMode(env: JourneyEnv): JourneyMode {\n return env.ENVIRONMENT ?? 'production';\n}\n\n/** The runtime options for this environment's mode. */\nexport function runtimeFromConfig(\n config: Pick<JourneyConfig, 'runtime'> | undefined,\n env: JourneyEnv\n): Required<JourneyRuntimeOptions> {\n return resolveRuntime(config?.runtime, journeyMode(env));\n}\n\n/** A sender that fails every message with the reason the channel cannot deliver. */\nfunction unavailable(reason: string): MessageSender {\n return {\n async send(message) {\n throw new Error(`cannot send '${message.template}' on ${message.channel}: ${reason}`);\n },\n };\n}\n\nfunction requireSecret(\n env: JourneyEnv,\n name:\n | 'APNS_PRIVATE_KEY_BASE64'\n | 'GOOGLE_APPLICATION_CREDENTIALS_BASE64'\n | 'VAPID_PUBLIC_KEY'\n | 'VAPID_PRIVATE_KEY'\n): string {\n const value = env[name];\n if (typeof value !== 'string' || value.length === 0) {\n throw new Error(`${name} is not set: the environment must hold it for the configured channel`);\n }\n return value;\n}\n\n/**\n * A sender built on its first message. A platform's secret is only required\n * when something is actually sent there: a journey that only emails must not\n * fail because the APNs key is missing from a local `.dev.vars`.\n */\nfunction lazy(build: () => MessageSender): MessageSender {\n let sender: MessageSender | undefined;\n return {\n async send(message) {\n sender ??= build();\n return sender.send(message);\n },\n };\n}\n\n/** The channels slice of the config — what `channelsFromConfig` reads. */\nexport type ChannelsConfig = Pick<\n JourneyConfig,\n 'templates' | 'emails' | 'apns' | 'fcm' | 'webPush' | 'runtime'\n>;\n\nexport function channelsFromConfig(\n config: ChannelsConfig,\n env: JourneyEnv,\n options: {\n /** The store a token APNs / FCM / a push service reports as gone is removed from. */\n store?: JourneyStore | undefined;\n fetch?: typeof fetch;\n } = {}\n): MessageSender {\n const mode = journeyMode(env);\n\n const email = (): MessageSender => {\n const registry = config.templates?.email;\n if (registry === undefined) return unavailable('no email templates are registered');\n if (env.EMAIL === undefined) return unavailable('no EMAIL (send_email) binding');\n if (config.emails === undefined) return unavailable('emails.from is not configured');\n return new CfEmailSender({\n binding: env.EMAIL,\n from: config.emails.from,\n ...(config.emails.replyTo === undefined ? {} : { replyTo: config.emails.replyTo }),\n render: registryRenderer(registry),\n });\n };\n\n const push = (): MessageSender => {\n const registry = config.templates?.push;\n if (registry === undefined) return unavailable('no push templates are registered');\n const render = registryPushRenderer(registry);\n // A token the provider reports as gone is forgotten (nothing left to deliver to), waking the\n // waits that read devices, as a removal through the API does\n const onUnregistered = async (message: OutboundMessage) => {\n if (message.device !== undefined && options.store !== undefined) {\n await removeDevice(env, message.device.token, options.store);\n }\n };\n const platforms: Record<string, MessageSender> = {};\n const apns = config.apns;\n if (apns !== undefined) {\n platforms.ios = lazy(\n () =>\n new ApnsPushSender({\n keyId: apns.keyId,\n teamId: apns.teamId,\n privateKey: apnsKeyFromBase64(requireSecret(env, 'APNS_PRIVATE_KEY_BASE64')),\n topic: apns.topic,\n environment: apnsEnvironment(apns, mode),\n render,\n onUnregistered,\n ...(env.APNS_RELAY_ORIGIN === undefined ? {} : { origin: env.APNS_RELAY_ORIGIN }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n })\n );\n }\n const fcm = config.fcm;\n if (fcm !== undefined) {\n platforms.android = lazy(\n () =>\n new FcmPushSender({\n serviceAccount: serviceAccountFromBase64(\n requireSecret(env, 'GOOGLE_APPLICATION_CREDENTIALS_BASE64')\n ),\n render,\n onUnregistered,\n ...(fcm.androidChannelId === undefined\n ? {}\n : { android: { channel_id: fcm.androidChannelId } }),\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n })\n );\n }\n const webPush = config.webPush;\n if (webPush !== undefined) {\n platforms.web = lazy(\n () =>\n new WebPushSender({\n vapid: {\n subject: webPush.subject,\n publicKey: requireSecret(env, 'VAPID_PUBLIC_KEY'),\n privateKey: requireSecret(env, 'VAPID_PRIVATE_KEY'),\n },\n render,\n onUnregistered,\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n })\n );\n }\n if (Object.keys(platforms).length === 0)\n return unavailable('none of apns, fcm or webPush is configured');\n return routeByPlatform(platforms);\n };\n\n /**\n * A webhook template's URL, read from the environment the Worker validated at startup (its\n * `env` schema): a template whose variable is unset fails the step, naming the template.\n */\n const webhookUrl = (\n channel: 'discord' | 'slack',\n key: string,\n template: DiscordTemplate | SlackTemplate\n ) => {\n const url = template.webhook(env as unknown as Record<string, unknown>);\n if (typeof url !== 'string' || url === '') {\n throw new Error(\n `${channel} template '${key}': its webhook URL is not set in the environment`\n );\n }\n return url;\n };\n const lookupTemplate = <T>(\n registry: Readonly<Record<string, T>>,\n channel: string,\n key: string\n ) => {\n if (!Object.hasOwn(registry, key)) throw new Error(`unknown ${channel} template: ${key}`);\n return registry[key];\n };\n\n const discord = (): MessageSender => {\n const registry = config.templates?.discord;\n if (registry === undefined) return unavailable('no discord templates are registered');\n return new DiscordWebhookSender({\n render: (key, props) => {\n const template = lookupTemplate(registry, 'discord', key) as DiscordTemplate;\n return {\n url: webhookUrl('discord', key, template),\n content: renderDiscordContent(template, key, props),\n };\n },\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n };\n\n const slack = (): MessageSender => {\n const registry = config.templates?.slack;\n if (registry === undefined) return unavailable('no slack templates are registered');\n return new SlackWebhookSender({\n render: (key, props) => {\n const template = lookupTemplate(registry, 'slack', key) as SlackTemplate;\n return {\n url: webhookUrl('slack', key, template),\n content: renderSlackContent(template, key, props),\n };\n },\n ...(options.fetch === undefined ? {} : { fetch: options.fetch }),\n });\n };\n\n return routeByChannel({ email: email(), push: push(), discord: discord(), slack: slack() });\n}\n"],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_store_d1 = require("../store/d1.cjs");
3
+ //#region src/cloudflare/d1-env.ts
4
+ /**
5
+ * The default store: D1 + KV from the env's bindings. Every router function
6
+ * and the runner fall back to it when no store is passed, so a Worker that
7
+ * declares `DB` and `WORKFLOW_KV` needs no wiring; one on another store (say
8
+ * PostgresJourneyStore) passes its own and may omit those bindings entirely.
9
+ */
10
+ function d1Store(env) {
11
+ if (env.DB === void 0 || env.WORKFLOW_KV === void 0) throw new Error("JourneyStore not configured: declare the DB and WORKFLOW_KV bindings for the default D1 store, or pass a store explicitly");
12
+ return new require_store_d1.D1JourneyStore(env.DB, env.WORKFLOW_KV);
13
+ }
14
+ //#endregion
15
+ exports.d1Store = d1Store;
16
+
17
+ //# sourceMappingURL=d1-env.cjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1-env.cjs","names":["D1JourneyStore"],"sources":["../../src/cloudflare/d1-env.ts"],"sourcesContent":["import { D1JourneyStore } from '../store/d1';\nimport type { JourneyStore } from '../store/index';\nimport type { JourneyEnv } from './bindings';\n\n/**\n * The default store: D1 + KV from the env's bindings. Every router function\n * and the runner fall back to it when no store is passed, so a Worker that\n * declares `DB` and `WORKFLOW_KV` needs no wiring; one on another store (say\n * PostgresJourneyStore) passes its own and may omit those bindings entirely.\n */\nexport function d1Store(env: JourneyEnv): JourneyStore {\n if (env.DB === undefined || env.WORKFLOW_KV === undefined) {\n throw new Error(\n 'JourneyStore not configured: declare the DB and WORKFLOW_KV bindings for the default D1 store, or pass a store explicitly'\n );\n }\n return new D1JourneyStore(env.DB, env.WORKFLOW_KV);\n}\n"],"mappings":";;;;;;;;;AAUA,SAAgB,QAAQ,KAA+B;CACrD,IAAI,IAAI,OAAO,KAAA,KAAa,IAAI,gBAAgB,KAAA,GAC9C,MAAM,IAAI,MACR,2HACF;CAEF,OAAO,IAAIA,iBAAAA,eAAe,IAAI,IAAI,IAAI,WAAW;AACnD"}
@@ -0,0 +1,12 @@
1
+ import { JourneyEnv } from "./bindings.cjs";
2
+ import { JourneyStore } from "../store/index.cjs";
3
+ //#region src/cloudflare/d1-env.d.ts
4
+ /**
5
+ * The default store: D1 + KV from the env's bindings. Every router function
6
+ * and the runner fall back to it when no store is passed, so a Worker that
7
+ * declares `DB` and `WORKFLOW_KV` needs no wiring; one on another store (say
8
+ * PostgresJourneyStore) passes its own and may omit those bindings entirely.
9
+ */
10
+ export declare function d1Store(env: JourneyEnv): JourneyStore;
11
+ //#endregion
12
+ //# sourceMappingURL=d1-env.d.cts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1-env.d.cts","names":[],"sources":["../../src/cloudflare/d1-env.ts"],"mappings":";;;;;;;;;wBAUgB,QAAQ,KAAK,aAAa"}
@@ -0,0 +1,12 @@
1
+ import { JourneyEnv } from "./bindings.mjs";
2
+ import { JourneyStore } from "../store/index.mjs";
3
+ //#region src/cloudflare/d1-env.d.ts
4
+ /**
5
+ * The default store: D1 + KV from the env's bindings. Every router function
6
+ * and the runner fall back to it when no store is passed, so a Worker that
7
+ * declares `DB` and `WORKFLOW_KV` needs no wiring; one on another store (say
8
+ * PostgresJourneyStore) passes its own and may omit those bindings entirely.
9
+ */
10
+ export declare function d1Store(env: JourneyEnv): JourneyStore;
11
+ //#endregion
12
+ //# sourceMappingURL=d1-env.d.mts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1-env.d.mts","names":[],"sources":["../../src/cloudflare/d1-env.ts"],"mappings":";;;;;;;;;wBAUgB,QAAQ,KAAK,aAAa"}
@@ -0,0 +1,16 @@
1
+ import { D1JourneyStore } from "../store/d1.mjs";
2
+ //#region src/cloudflare/d1-env.ts
3
+ /**
4
+ * The default store: D1 + KV from the env's bindings. Every router function
5
+ * and the runner fall back to it when no store is passed, so a Worker that
6
+ * declares `DB` and `WORKFLOW_KV` needs no wiring; one on another store (say
7
+ * PostgresJourneyStore) passes its own and may omit those bindings entirely.
8
+ */
9
+ function d1Store(env) {
10
+ if (env.DB === void 0 || env.WORKFLOW_KV === void 0) throw new Error("JourneyStore not configured: declare the DB and WORKFLOW_KV bindings for the default D1 store, or pass a store explicitly");
11
+ return new D1JourneyStore(env.DB, env.WORKFLOW_KV);
12
+ }
13
+ //#endregion
14
+ export { d1Store };
15
+
16
+ //# sourceMappingURL=d1-env.mjs.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"d1-env.mjs","names":[],"sources":["../../src/cloudflare/d1-env.ts"],"sourcesContent":["import { D1JourneyStore } from '../store/d1';\nimport type { JourneyStore } from '../store/index';\nimport type { JourneyEnv } from './bindings';\n\n/**\n * The default store: D1 + KV from the env's bindings. Every router function\n * and the runner fall back to it when no store is passed, so a Worker that\n * declares `DB` and `WORKFLOW_KV` needs no wiring; one on another store (say\n * PostgresJourneyStore) passes its own and may omit those bindings entirely.\n */\nexport function d1Store(env: JourneyEnv): JourneyStore {\n if (env.DB === undefined || env.WORKFLOW_KV === undefined) {\n throw new Error(\n 'JourneyStore not configured: declare the DB and WORKFLOW_KV bindings for the default D1 store, or pass a store explicitly'\n );\n }\n return new D1JourneyStore(env.DB, env.WORKFLOW_KV);\n}\n"],"mappings":";;;;;;;;AAUA,SAAgB,QAAQ,KAA+B;CACrD,IAAI,IAAI,OAAO,KAAA,KAAa,IAAI,gBAAgB,KAAA,GAC9C,MAAM,IAAI,MACR,2HACF;CAEF,OAAO,IAAI,eAAe,IAAI,IAAI,IAAI,WAAW;AACnD"}
@@ -0,0 +1,54 @@
1
+ Object.defineProperty(exports, Symbol.toStringTag, { value: "Module" });
2
+ const require_store_postgres_reporting = require("../store/postgres-reporting.cjs");
3
+ const require_store_postgres = require("../store/postgres.cjs");
4
+ const require_cloudflare_bindings = require("./bindings.cjs");
5
+ const require_reporting_classify = require("../reporting/classify.cjs");
6
+ const require_reporting_tracking = require("../reporting/tracking.cjs");
7
+ const require_store_facts = require("../store/facts.cjs");
8
+ const require_store_d1 = require("../store/d1.cjs");
9
+ const require_store_index = require("../store/index.cjs");
10
+ const require_cloudflare_d1_env = require("./d1-env.cjs");
11
+ const require_cloudflare_router = require("./router.cjs");
12
+ const require_cloudflare_senders = require("./senders.cjs");
13
+ const require_cloudflare_channels = require("./channels.cjs");
14
+ const require_cloudflare_runner = require("./runner.cjs");
15
+ const require_reporting_observer = require("../reporting/observer.cjs");
16
+ const require_cloudflare_worker = require("./worker.cjs");
17
+ exports.BURST_WINDOW_MS = require_reporting_classify.BURST_WINDOW_MS;
18
+ exports.BundleIntegrityError = require_cloudflare_router.BundleIntegrityError;
19
+ exports.CfEmailSender = require_cloudflare_senders.CfEmailSender;
20
+ exports.D1JourneyStore = require_store_d1.D1JourneyStore;
21
+ exports.DEFAULT_QUICK_MS = require_reporting_classify.DEFAULT_QUICK_MS;
22
+ exports.EnvValidationError = require_cloudflare_worker.EnvValidationError;
23
+ exports.JourneyFactSource = require_store_facts.JourneyFactSource;
24
+ exports.JourneyRunner = require_cloudflare_runner.JourneyRunner;
25
+ exports.LogMessageSender = require_cloudflare_senders.LogMessageSender;
26
+ exports.PostgresJourneyStore = require_store_postgres.PostgresJourneyStore;
27
+ exports.PostgresReporting = require_store_postgres_reporting.PostgresReporting;
28
+ exports.SchemaMismatchError = require_store_index.SchemaMismatchError;
29
+ exports.WAKE_EVENT_TYPE = require_cloudflare_bindings.WAKE_EVENT_TYPE;
30
+ exports.WAKE_TIMEOUT_TOLERANCE_MS = require_cloudflare_bindings.WAKE_TIMEOUT_TOLERANCE_MS;
31
+ exports.WebhookMessageSender = require_cloudflare_senders.WebhookMessageSender;
32
+ exports.channelsFromConfig = require_cloudflare_channels.channelsFromConfig;
33
+ exports.classifyClick = require_reporting_classify.classifyClick;
34
+ exports.classifyOpen = require_reporting_classify.classifyOpen;
35
+ exports.d1Store = require_cloudflare_d1_env.d1Store;
36
+ exports.deployBundle = require_cloudflare_router.deployBundle;
37
+ exports.forgetUser = require_cloudflare_router.forgetUser;
38
+ exports.handleRequest = require_cloudflare_router.handleRequest;
39
+ exports.handleTracking = require_reporting_tracking.handleTracking;
40
+ exports.identifyUser = require_cloudflare_router.identifyUser;
41
+ exports.ingestEvent = require_cloudflare_router.ingestEvent;
42
+ exports.journeyMode = require_cloudflare_channels.journeyMode;
43
+ exports.journeyWorker = require_cloudflare_worker.journeyWorker;
44
+ exports.recordPushOpen = require_reporting_tracking.recordPushOpen;
45
+ exports.registerDevice = require_cloudflare_router.registerDevice;
46
+ exports.removeDevice = require_cloudflare_router.removeDevice;
47
+ exports.reportingObserver = require_reporting_observer.reportingObserver;
48
+ exports.routeByChannel = require_cloudflare_senders.routeByChannel;
49
+ exports.routeByPlatform = require_cloudflare_senders.routeByPlatform;
50
+ exports.runtimeFromConfig = require_cloudflare_channels.runtimeFromConfig;
51
+ exports.sweepSegments = require_cloudflare_router.sweepSegments;
52
+ exports.trackEmail = require_cloudflare_senders.trackEmail;
53
+ exports.unbindDevice = require_cloudflare_router.unbindDevice;
54
+ exports.wakeExpired = require_cloudflare_bindings.wakeExpired;
@@ -0,0 +1,19 @@
1
+ import { JourneyObserver, MessageTracking, OutboundMessage, PushDevice, SendResult } from "../engine/ports.cjs";
2
+ import { EmailAddress } from "../config.cjs";
3
+ import { D1DatabaseLike, EmailBindingLike, JourneyEnv, JourneyParams, KVNamespaceLike, WAKE_EVENT_TYPE, WAKE_TIMEOUT_TOLERANCE_MS, WorkflowBindingLike, WorkflowInstanceLike, wakeExpired } from "./bindings.cjs";
4
+ import { D1JourneyStore } from "../store/d1.cjs";
5
+ import { JourneyFactSource } from "../store/facts.cjs";
6
+ import { SqlClientLike } from "../store/sql.cjs";
7
+ import { PostgresJourneyStore, PostgresJourneyStoreOptions } from "../store/postgres.cjs";
8
+ import { PostgresReporting } from "../store/postgres-reporting.cjs";
9
+ import { Engagement, EntryInput, EntryOutcome, EventInput, JourneyReporting, JourneyStore, MessageRecord, ProfileProps, SchemaMismatchError, SegmentTriggerRoute, StoreLease, TriggerRoute } from "../store/index.cjs";
10
+ import { d1Store } from "./d1-env.cjs";
11
+ import { BundleIntegrityError, DeployResult, DeviceRegistration, IdentifyResult, IngestInput, IngestResult, SweepResult, deployBundle, forgetUser, handleRequest, identifyUser, ingestEvent, registerDevice, removeDevice, sweepSegments, unbindDevice } from "./router.cjs";
12
+ import { JourneyRunner } from "./runner.cjs";
13
+ import { CfEmailOptions, CfEmailSender, EmailRenderer, LogMessageSender, WebhookMessageSender, routeByChannel, routeByPlatform, trackEmail } from "./senders.cjs";
14
+ import { ChannelsConfig, channelsFromConfig, journeyMode, runtimeFromConfig } from "./channels.cjs";
15
+ import { reportingObserver } from "../reporting/observer.cjs";
16
+ import { TrackingOptions, handleTracking, recordPushOpen } from "../reporting/tracking.cjs";
17
+ import { BURST_WINDOW_MS, ClassifyOptions, ClickFacts, DEFAULT_QUICK_MS, RequestFacts, Verdict, classifyClick, classifyOpen } from "../reporting/classify.cjs";
18
+ import { EnvValidationError, ExecutionContextLike, JourneyWorker, JourneyWorkerOptions, journeyWorker } from "./worker.cjs";
19
+ export { BURST_WINDOW_MS, BundleIntegrityError, type CfEmailOptions, CfEmailSender, type ChannelsConfig, type ClassifyOptions, type ClickFacts, type D1DatabaseLike, D1JourneyStore, DEFAULT_QUICK_MS, type DeployResult, type DeviceRegistration, type EmailAddress, type EmailBindingLike, type EmailRenderer, type Engagement, type EntryInput, type EntryOutcome, EnvValidationError, type EventInput, type ExecutionContextLike, type IdentifyResult, type IngestInput, type IngestResult, type JourneyEnv, JourneyFactSource, type JourneyObserver, type JourneyParams, type JourneyReporting, JourneyRunner, type JourneyStore, type JourneyWorker, type JourneyWorkerOptions, type KVNamespaceLike, LogMessageSender, type MessageRecord, type MessageTracking, type OutboundMessage, PostgresJourneyStore, type PostgresJourneyStoreOptions, PostgresReporting, type ProfileProps, type PushDevice, type RequestFacts, SchemaMismatchError, type SegmentTriggerRoute, type SendResult, type SqlClientLike, type StoreLease, type SweepResult, type TrackingOptions, type TriggerRoute, type Verdict, WAKE_EVENT_TYPE, WAKE_TIMEOUT_TOLERANCE_MS, WebhookMessageSender, type WorkflowBindingLike, type WorkflowInstanceLike, channelsFromConfig, classifyClick, classifyOpen, d1Store, deployBundle, forgetUser, handleRequest, handleTracking, identifyUser, ingestEvent, journeyMode, journeyWorker, recordPushOpen, registerDevice, removeDevice, reportingObserver, routeByChannel, routeByPlatform, runtimeFromConfig, sweepSegments, trackEmail, unbindDevice, wakeExpired };