hazo_notify 3.0.0 → 4.0.2

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 (253) hide show
  1. package/README.md +122 -17
  2. package/config/hazo_notify_config.ini +37 -0
  3. package/dist/components/notification_banner/index.d.ts +27 -0
  4. package/dist/components/notification_banner/index.d.ts.map +1 -0
  5. package/dist/components/notification_banner/index.js +42 -0
  6. package/dist/components/notification_banner/index.js.map +1 -0
  7. package/dist/components/notification_bell/index.d.ts +56 -0
  8. package/dist/components/notification_bell/index.d.ts.map +1 -0
  9. package/dist/components/notification_bell/index.js +73 -0
  10. package/dist/components/notification_bell/index.js.map +1 -0
  11. package/dist/components/template_manager/template_editor.js +3 -3
  12. package/dist/components/template_manager/template_editor.js.map +1 -1
  13. package/dist/components/template_manager/template_manager_admin.d.ts.map +1 -1
  14. package/dist/components/template_manager/template_manager_admin.js +3 -4
  15. package/dist/components/template_manager/template_manager_admin.js.map +1 -1
  16. package/dist/lib/adapters/email/adapter.d.ts +49 -0
  17. package/dist/lib/adapters/email/adapter.d.ts.map +1 -0
  18. package/dist/lib/adapters/email/adapter.js +87 -0
  19. package/dist/lib/adapters/email/adapter.js.map +1 -0
  20. package/dist/lib/adapters/email/config.d.ts +15 -0
  21. package/dist/lib/adapters/email/config.d.ts.map +1 -0
  22. package/dist/lib/{emailer/emailer.js → adapters/email/config.js} +7 -113
  23. package/dist/lib/adapters/email/config.js.map +1 -0
  24. package/dist/lib/adapters/email/envelope.d.ts +29 -0
  25. package/dist/lib/adapters/email/envelope.d.ts.map +1 -0
  26. package/dist/lib/adapters/email/envelope.js +46 -0
  27. package/dist/lib/adapters/email/envelope.js.map +1 -0
  28. package/dist/lib/adapters/email/index.d.ts +12 -0
  29. package/dist/lib/adapters/email/index.d.ts.map +1 -0
  30. package/dist/lib/adapters/email/index.js +11 -0
  31. package/dist/lib/adapters/email/index.js.map +1 -0
  32. package/dist/lib/adapters/email/providers/index.d.ts.map +1 -0
  33. package/dist/lib/adapters/email/providers/index.js.map +1 -0
  34. package/dist/lib/adapters/email/providers/pop3_provider.d.ts.map +1 -0
  35. package/dist/lib/adapters/email/providers/pop3_provider.js.map +1 -0
  36. package/dist/lib/adapters/email/providers/smtp_provider.d.ts.map +1 -0
  37. package/dist/lib/adapters/email/providers/smtp_provider.js.map +1 -0
  38. package/dist/lib/adapters/email/providers/zeptomail_provider.d.ts.map +1 -0
  39. package/dist/lib/adapters/email/providers/zeptomail_provider.js.map +1 -0
  40. package/dist/lib/{emailer/emailer.d.ts → adapters/email/send_email.d.ts} +9 -10
  41. package/dist/lib/adapters/email/send_email.d.ts.map +1 -0
  42. package/dist/lib/adapters/email/send_email.js +122 -0
  43. package/dist/lib/adapters/email/send_email.js.map +1 -0
  44. package/dist/lib/adapters/email/types.d.ts.map +1 -0
  45. package/dist/lib/adapters/email/types.js.map +1 -0
  46. package/dist/lib/adapters/email/utils/constants.d.ts.map +1 -0
  47. package/dist/lib/adapters/email/utils/constants.js.map +1 -0
  48. package/dist/lib/adapters/email/utils/index.d.ts.map +1 -0
  49. package/dist/lib/adapters/email/utils/index.js.map +1 -0
  50. package/dist/lib/adapters/email/utils/logger.d.ts.map +1 -0
  51. package/dist/lib/adapters/email/utils/logger.js.map +1 -0
  52. package/dist/lib/adapters/email/utils/validation.d.ts.map +1 -0
  53. package/dist/lib/adapters/email/utils/validation.js.map +1 -0
  54. package/dist/lib/adapters/telegram/adapter.d.ts +25 -0
  55. package/dist/lib/adapters/telegram/adapter.d.ts.map +1 -0
  56. package/dist/lib/adapters/telegram/adapter.js +75 -0
  57. package/dist/lib/adapters/telegram/adapter.js.map +1 -0
  58. package/dist/lib/adapters/telegram/config.d.ts +22 -0
  59. package/dist/lib/adapters/telegram/config.d.ts.map +1 -0
  60. package/dist/lib/adapters/telegram/config.js +60 -0
  61. package/dist/lib/adapters/telegram/config.js.map +1 -0
  62. package/dist/lib/adapters/telegram/index.d.ts +8 -0
  63. package/dist/lib/adapters/telegram/index.d.ts.map +1 -0
  64. package/dist/lib/adapters/telegram/index.js +5 -0
  65. package/dist/lib/adapters/telegram/index.js.map +1 -0
  66. package/dist/lib/adapters/telegram/splitter.d.ts +7 -0
  67. package/dist/lib/adapters/telegram/splitter.d.ts.map +1 -0
  68. package/dist/lib/adapters/telegram/splitter.js +47 -0
  69. package/dist/lib/adapters/telegram/splitter.js.map +1 -0
  70. package/dist/lib/adapters/telegram/transport.d.ts +31 -0
  71. package/dist/lib/adapters/telegram/transport.d.ts.map +1 -0
  72. package/dist/lib/adapters/telegram/transport.js +112 -0
  73. package/dist/lib/adapters/telegram/transport.js.map +1 -0
  74. package/dist/lib/api/banner.d.ts +41 -0
  75. package/dist/lib/api/banner.d.ts.map +1 -0
  76. package/dist/lib/api/banner.js +53 -0
  77. package/dist/lib/api/banner.js.map +1 -0
  78. package/dist/lib/api/inbox.d.ts +33 -0
  79. package/dist/lib/api/inbox.d.ts.map +1 -0
  80. package/dist/lib/api/inbox.js +52 -0
  81. package/dist/lib/api/inbox.js.map +1 -0
  82. package/dist/lib/channels/index.d.ts +3 -0
  83. package/dist/lib/channels/index.d.ts.map +1 -0
  84. package/dist/lib/channels/index.js +3 -0
  85. package/dist/lib/channels/index.js.map +1 -0
  86. package/dist/lib/channels/registry.d.ts +7 -0
  87. package/dist/lib/channels/registry.d.ts.map +1 -0
  88. package/dist/lib/channels/registry.js +24 -0
  89. package/dist/lib/channels/registry.js.map +1 -0
  90. package/dist/lib/channels/types.d.ts +82 -0
  91. package/dist/lib/channels/types.d.ts.map +1 -0
  92. package/dist/lib/channels/types.js +8 -0
  93. package/dist/lib/channels/types.js.map +1 -0
  94. package/dist/lib/dispatcher/batch-key.d.ts +15 -0
  95. package/dist/lib/dispatcher/batch-key.d.ts.map +1 -0
  96. package/dist/lib/dispatcher/batch-key.js +19 -0
  97. package/dist/lib/dispatcher/batch-key.js.map +1 -0
  98. package/dist/lib/dispatcher/index.d.ts +4 -0
  99. package/dist/lib/dispatcher/index.d.ts.map +1 -0
  100. package/dist/lib/dispatcher/index.js +73 -0
  101. package/dist/lib/dispatcher/index.js.map +1 -0
  102. package/dist/lib/inbox/connection.d.ts +19 -0
  103. package/dist/lib/inbox/connection.d.ts.map +1 -0
  104. package/dist/lib/inbox/connection.js +34 -0
  105. package/dist/lib/inbox/connection.js.map +1 -0
  106. package/dist/lib/inbox/dialects/index.d.ts +10 -0
  107. package/dist/lib/inbox/dialects/index.d.ts.map +1 -0
  108. package/dist/lib/inbox/dialects/index.js +13 -0
  109. package/dist/lib/inbox/dialects/index.js.map +1 -0
  110. package/dist/lib/inbox/dialects/postgres.d.ts +3 -0
  111. package/dist/lib/inbox/dialects/postgres.d.ts.map +1 -0
  112. package/dist/lib/inbox/dialects/postgres.js +110 -0
  113. package/dist/lib/inbox/dialects/postgres.js.map +1 -0
  114. package/dist/lib/inbox/dialects/sqlite.d.ts +3 -0
  115. package/dist/lib/inbox/dialects/sqlite.d.ts.map +1 -0
  116. package/dist/lib/inbox/dialects/sqlite.js +120 -0
  117. package/dist/lib/inbox/dialects/sqlite.js.map +1 -0
  118. package/dist/lib/inbox/dialects/types.d.ts +53 -0
  119. package/dist/lib/inbox/dialects/types.d.ts.map +1 -0
  120. package/dist/lib/inbox/dialects/types.js +2 -0
  121. package/dist/lib/inbox/dialects/types.js.map +1 -0
  122. package/dist/lib/inbox/index.d.ts +9 -0
  123. package/dist/lib/inbox/index.d.ts.map +1 -0
  124. package/dist/lib/inbox/index.js +6 -0
  125. package/dist/lib/inbox/index.js.map +1 -0
  126. package/dist/lib/inbox/storage.d.ts +21 -0
  127. package/dist/lib/inbox/storage.d.ts.map +1 -0
  128. package/dist/lib/inbox/storage.js +94 -0
  129. package/dist/lib/inbox/storage.js.map +1 -0
  130. package/dist/lib/inbox/types.d.ts +57 -0
  131. package/dist/lib/inbox/types.d.ts.map +1 -0
  132. package/dist/lib/inbox/types.js +2 -0
  133. package/dist/lib/inbox/types.js.map +1 -0
  134. package/dist/lib/inbox/worker/cleanup.d.ts +14 -0
  135. package/dist/lib/inbox/worker/cleanup.d.ts.map +1 -0
  136. package/dist/lib/inbox/worker/cleanup.js +37 -0
  137. package/dist/lib/inbox/worker/cleanup.js.map +1 -0
  138. package/dist/lib/inbox/worker/flush.d.ts +31 -0
  139. package/dist/lib/inbox/worker/flush.d.ts.map +1 -0
  140. package/dist/lib/inbox/worker/flush.js +97 -0
  141. package/dist/lib/inbox/worker/flush.js.map +1 -0
  142. package/dist/lib/inbox/worker/render.d.ts +23 -0
  143. package/dist/lib/inbox/worker/render.d.ts.map +1 -0
  144. package/dist/lib/inbox/worker/render.js +42 -0
  145. package/dist/lib/inbox/worker/render.js.map +1 -0
  146. package/dist/lib/inbox/worker/start.d.ts +29 -0
  147. package/dist/lib/inbox/worker/start.d.ts.map +1 -0
  148. package/dist/lib/inbox/worker/start.js +100 -0
  149. package/dist/lib/inbox/worker/start.js.map +1 -0
  150. package/dist/lib/index.d.ts +1 -6
  151. package/dist/lib/index.d.ts.map +1 -1
  152. package/dist/lib/index.js +4 -6
  153. package/dist/lib/index.js.map +1 -1
  154. package/dist/lib/jobs/handler.d.ts +25 -0
  155. package/dist/lib/jobs/handler.d.ts.map +1 -0
  156. package/dist/lib/jobs/handler.js +36 -0
  157. package/dist/lib/jobs/handler.js.map +1 -0
  158. package/dist/lib/jobs/index.d.ts +16 -0
  159. package/dist/lib/jobs/index.d.ts.map +1 -0
  160. package/dist/lib/jobs/index.js +13 -0
  161. package/dist/lib/jobs/index.js.map +1 -0
  162. package/dist/lib/jobs/submit.d.ts +20 -0
  163. package/dist/lib/jobs/submit.d.ts.map +1 -0
  164. package/dist/lib/jobs/submit.js +25 -0
  165. package/dist/lib/jobs/submit.js.map +1 -0
  166. package/dist/lib/jobs/types.d.ts +42 -0
  167. package/dist/lib/jobs/types.d.ts.map +1 -0
  168. package/dist/lib/jobs/types.js +12 -0
  169. package/dist/lib/jobs/types.js.map +1 -0
  170. package/dist/lib/template_manager/db/template_repository.d.ts.map +1 -1
  171. package/dist/lib/template_manager/db/template_repository.js +16 -31
  172. package/dist/lib/template_manager/db/template_repository.js.map +1 -1
  173. package/dist/lib/template_manager/engine/variable_resolver.js +4 -4
  174. package/dist/lib/template_manager/engine/variable_resolver.js.map +1 -1
  175. package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts +20 -0
  176. package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts.map +1 -0
  177. package/dist/lib/template_manager/handlers/adapters/hazo_auth.js +46 -0
  178. package/dist/lib/template_manager/handlers/adapters/hazo_auth.js.map +1 -0
  179. package/dist/lib/template_manager/handlers/auth.d.ts +47 -0
  180. package/dist/lib/template_manager/handlers/auth.d.ts.map +1 -0
  181. package/dist/lib/template_manager/handlers/auth.js +67 -0
  182. package/dist/lib/template_manager/handlers/auth.js.map +1 -0
  183. package/dist/lib/template_manager/handlers/index.d.ts +67 -0
  184. package/dist/lib/template_manager/handlers/index.d.ts.map +1 -0
  185. package/dist/lib/template_manager/handlers/index.js +282 -0
  186. package/dist/lib/template_manager/handlers/index.js.map +1 -0
  187. package/dist/lib/template_manager/seed/sync.d.ts.map +1 -1
  188. package/dist/lib/template_manager/seed/sync.js +20 -4
  189. package/dist/lib/template_manager/seed/sync.js.map +1 -1
  190. package/dist/lib/template_manager/template_manager.d.ts.map +1 -1
  191. package/dist/lib/template_manager/template_manager.js +67 -26
  192. package/dist/lib/template_manager/template_manager.js.map +1 -1
  193. package/dist/lib/template_manager/types.d.ts +35 -9
  194. package/dist/lib/template_manager/types.d.ts.map +1 -1
  195. package/dist/lib/template_manager/utils/index.d.ts +1 -1
  196. package/dist/lib/template_manager/utils/index.d.ts.map +1 -1
  197. package/dist/lib/template_manager/utils/index.js +1 -1
  198. package/dist/lib/template_manager/utils/index.js.map +1 -1
  199. package/dist/lib/template_manager/utils/validation.d.ts +12 -11
  200. package/dist/lib/template_manager/utils/validation.d.ts.map +1 -1
  201. package/dist/lib/template_manager/utils/validation.js +15 -22
  202. package/dist/lib/template_manager/utils/validation.js.map +1 -1
  203. package/migrations/003_create_notifications_table.sql +48 -0
  204. package/migrations/004_inbox_upsert_rpc.sql +63 -0
  205. package/migrations/005_inbox_v4_refactor.pg.sql +53 -0
  206. package/migrations/005_inbox_v4_refactor.sqlite.sql +30 -0
  207. package/migrations/006_channel_deliveries.pg.sql +61 -0
  208. package/migrations/006_channel_deliveries.sqlite.sql +26 -0
  209. package/migrations/007_templates_bodies_jsonb.pg.sql +17 -0
  210. package/migrations/007_templates_bodies_jsonb.sqlite.sql +18 -0
  211. package/package.json +63 -14
  212. package/dist/lib/emailer/emailer.d.ts.map +0 -1
  213. package/dist/lib/emailer/emailer.js.map +0 -1
  214. package/dist/lib/emailer/index.d.ts +0 -12
  215. package/dist/lib/emailer/index.d.ts.map +0 -1
  216. package/dist/lib/emailer/index.js +0 -13
  217. package/dist/lib/emailer/index.js.map +0 -1
  218. package/dist/lib/emailer/providers/index.d.ts.map +0 -1
  219. package/dist/lib/emailer/providers/index.js.map +0 -1
  220. package/dist/lib/emailer/providers/pop3_provider.d.ts.map +0 -1
  221. package/dist/lib/emailer/providers/pop3_provider.js.map +0 -1
  222. package/dist/lib/emailer/providers/smtp_provider.d.ts.map +0 -1
  223. package/dist/lib/emailer/providers/smtp_provider.js.map +0 -1
  224. package/dist/lib/emailer/providers/zeptomail_provider.d.ts.map +0 -1
  225. package/dist/lib/emailer/providers/zeptomail_provider.js.map +0 -1
  226. package/dist/lib/emailer/types.d.ts.map +0 -1
  227. package/dist/lib/emailer/types.js.map +0 -1
  228. package/dist/lib/emailer/utils/constants.d.ts.map +0 -1
  229. package/dist/lib/emailer/utils/constants.js.map +0 -1
  230. package/dist/lib/emailer/utils/index.d.ts.map +0 -1
  231. package/dist/lib/emailer/utils/index.js.map +0 -1
  232. package/dist/lib/emailer/utils/logger.d.ts.map +0 -1
  233. package/dist/lib/emailer/utils/logger.js.map +0 -1
  234. package/dist/lib/emailer/utils/validation.d.ts.map +0 -1
  235. package/dist/lib/emailer/utils/validation.js.map +0 -1
  236. /package/dist/lib/{emailer → adapters/email}/providers/index.d.ts +0 -0
  237. /package/dist/lib/{emailer → adapters/email}/providers/index.js +0 -0
  238. /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.d.ts +0 -0
  239. /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.js +0 -0
  240. /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.d.ts +0 -0
  241. /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.js +0 -0
  242. /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.d.ts +0 -0
  243. /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.js +0 -0
  244. /package/dist/lib/{emailer → adapters/email}/types.d.ts +0 -0
  245. /package/dist/lib/{emailer → adapters/email}/types.js +0 -0
  246. /package/dist/lib/{emailer → adapters/email}/utils/constants.d.ts +0 -0
  247. /package/dist/lib/{emailer → adapters/email}/utils/constants.js +0 -0
  248. /package/dist/lib/{emailer → adapters/email}/utils/index.d.ts +0 -0
  249. /package/dist/lib/{emailer → adapters/email}/utils/index.js +0 -0
  250. /package/dist/lib/{emailer → adapters/email}/utils/logger.d.ts +0 -0
  251. /package/dist/lib/{emailer → adapters/email}/utils/logger.js +0 -0
  252. /package/dist/lib/{emailer → adapters/email}/utils/validation.d.ts +0 -0
  253. /package/dist/lib/{emailer → adapters/email}/utils/validation.js +0 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../../../../src/lib/adapters/email/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,aAAa,CAAC;AAE1C;;;;;;GAMG;AACH,wBAAgB,sBAAsB,CAAC,YAAY,GAAE,MAAsB,GAAG,MAAM,CAgCnF;AAED;;;;;GAKG;AACH,wBAAgB,UAAU,CAAC,MAAM,CAAC,EAAE,MAAM,GAAG,MAAM,CAElD;AAOD;;GAEG;AACH,UAAU,QAAQ;IAChB,QAAQ,EAAE,MAAM,CAAC;IACjB,aAAa,EAAE,MAAM,CAAC;IACtB,WAAW,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;IAC9B,OAAO,EAAE,MAAM,CAAC;IAChB,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB;AAED;;GAEG;AACH,wBAAgB,SAAS,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQ/C;AAED;;GAEG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQ9C;AAED;;GAEG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,QAAQ,GAAG,IAAI,CAQjD;AAED;;GAEG;AACH,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,MAAM,EAChB,aAAa,EAAE,MAAM,EACrB,OAAO,EAAE,MAAM,EACf,eAAe,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACxC,QAAQ,CAOV"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.js","sourceRoot":"","sources":["../../../../../src/lib/adapters/email/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;;;GAMG;AACH,MAAM,UAAU,sBAAsB,CAAC,eAAuB,aAAa;IACzE,MAAM,gBAAgB,GAAG,CACvB,KAAa,EACb,OAAe,EACf,IAA8B,EACtB,EAAE;QACV,OAAO,IAAI,CAAC,SAAS,CAAC;YACpB,KAAK;YACL,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;YACnC,OAAO,EAAE,YAAY;YACrB,OAAO;YACP,GAAG,CAAC,IAAI,IAAI,EAAE,CAAC;SAChB,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,OAAe,EAAE,IAA8B;YACnD,OAAO,CAAC,KAAK,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QAC1D,CAAC;QACD,IAAI,CAAC,OAAe,EAAE,IAA8B;YAClD,OAAO,CAAC,IAAI,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACxD,CAAC;QACD,IAAI,CAAC,OAAe,EAAE,IAA8B;YAClD,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,MAAM,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;QACvD,CAAC;QACD,KAAK,CAAC,OAAe,EAAE,IAA8B;YACnD,gDAAgD;YAChD,IAAI,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY,EAAE,CAAC;gBAC1C,OAAO,CAAC,GAAG,CAAC,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,IAAI,CAAC,CAAC,CAAC;YACxD,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,UAAU,CAAC,MAAe;IACxC,OAAO,MAAM,IAAI,sBAAsB,EAAE,CAAC;AAC5C,CAAC;AAkBD;;GAEG;AACH,MAAM,UAAU,SAAS,CAAC,KAAe;IACvC,OAAO,CAAC,KAAK,CACX,IAAI,CAAC,SAAS,CAAC;QACb,KAAK,EAAE,OAAO;QACd,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,KAAK;KACT,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,KAAe;IACtC,OAAO,CAAC,GAAG,CACT,IAAI,CAAC,SAAS,CAAC;QACb,KAAK,EAAE,MAAM;QACb,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,KAAK;KACT,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,WAAW,CAAC,KAAe;IACzC,OAAO,CAAC,IAAI,CACV,IAAI,CAAC,SAAS,CAAC;QACb,KAAK,EAAE,SAAS;QAChB,SAAS,EAAE,IAAI,IAAI,EAAE,CAAC,WAAW,EAAE;QACnC,GAAG,KAAK;KACT,CAAC,CACH,CAAC;AACJ,CAAC;AAED;;GAEG;AACH,MAAM,UAAU,gBAAgB,CAC9B,QAAgB,EAChB,aAAqB,EACrB,OAAe,EACf,eAAyC;IAEzC,OAAO;QACL,QAAQ;QACR,aAAa;QACb,OAAO;QACP,GAAG,CAAC,eAAe,IAAI,EAAE,CAAC;KAC3B,CAAC;AACJ,CAAC"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../../../../src/lib/adapters/email/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH;;;;GAIG;AACH,wBAAgB,sBAAsB,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAO7D;AAED;;;;;GAKG;AACH,wBAAgB,qBAAqB,CAAC,KAAK,EAAE,MAAM,GAAG,MAAM,CAM3D;AAED;;;;GAIG;AACH,wBAAgB,uBAAuB,CAAC,OAAO,EAAE,MAAM,GAAG,OAAO,CAKhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO,CAO1D;AAED;;;;;GAKG;AACH,wBAAgB,wBAAwB,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,GAAG,OAAO,CAUnF"}
@@ -0,0 +1 @@
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../../../../src/lib/adapters/email/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEvF;;;;GAIG;AACH,MAAM,UAAU,sBAAsB,CAAC,KAAa;IAClD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,wCAAwC;IACxC,MAAM,WAAW,GAAG,sIAAsI,CAAC;IAC3J,OAAO,WAAW,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,KAAK,CAAC,MAAM,IAAI,gBAAgB,CAAC;AACrE,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,qBAAqB,CAAC,KAAa;IACjD,IAAI,CAAC,KAAK,IAAI,OAAO,KAAK,KAAK,QAAQ,EAAE,CAAC;QACxC,OAAO,EAAE,CAAC;IACZ,CAAC;IACD,kEAAkE;IAClE,OAAO,KAAK,CAAC,OAAO,CAAC,6BAA6B,EAAE,EAAE,CAAC,CAAC,IAAI,EAAE,CAAC;AACjE,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,uBAAuB,CAAC,OAAe;IACrD,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,OAAO,OAAO,CAAC,MAAM,IAAI,kBAAkB,CAAC;AAC9C,CAAC;AAED;;;;GAIG;AACH,MAAM,UAAU,oBAAoB,CAAC,IAAY;IAC/C,IAAI,CAAC,IAAI,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QACtC,OAAO,KAAK,CAAC;IACf,CAAC;IACD,yCAAyC;IACzC,MAAM,WAAW,GAAG,MAAM,CAAC,IAAI,CAAC,IAAI,EAAE,MAAM,CAAC,CAAC,MAAM,CAAC;IACrD,OAAO,WAAW,IAAI,eAAe,CAAC;AACxC,CAAC;AAED;;;;;GAKG;AACH,MAAM,UAAU,wBAAwB,CAAC,OAAe,EAAE,QAAgB;IACxE,IAAI,CAAC,OAAO,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC5C,OAAO,KAAK,CAAC;IACf,CAAC;IACD,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,MAAM,CAAC,IAAI,CAAC,OAAO,EAAE,QAAQ,CAAC,CAAC,MAAM,CAAC;QACnD,OAAO,IAAI,IAAI,QAAQ,CAAC;IAC1B,CAAC;IAAC,OAAO,KAAK,EAAE,CAAC;QACf,OAAO,KAAK,CAAC;IACf,CAAC;AACH,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { ChannelAdapter, ChannelCapabilities, ChannelSendContext, ChannelSendResult, ChannelValidationResult } from "../../channels/types.js";
2
+ import { type TelegramConfig } from "./config.js";
3
+ export interface TelegramPayload {
4
+ text?: string;
5
+ parse_mode?: "HTML" | "Markdown" | "MarkdownV2";
6
+ disable_web_page_preview?: boolean;
7
+ chat_id?: string;
8
+ template_name?: string;
9
+ template_vars?: Record<string, unknown>;
10
+ }
11
+ export declare class TelegramChannel implements ChannelAdapter<TelegramPayload> {
12
+ private readonly opts;
13
+ readonly capabilities: ChannelCapabilities;
14
+ constructor(opts?: {
15
+ config?: TelegramConfig;
16
+ });
17
+ validate(p: TelegramPayload): ChannelValidationResult;
18
+ send(p: TelegramPayload, ctx: ChannelSendContext): Promise<ChannelSendResult>;
19
+ }
20
+ declare module "../../channels/types.js" {
21
+ interface ChannelPayloadMap {
22
+ telegram: TelegramPayload;
23
+ }
24
+ }
25
+ //# sourceMappingURL=adapter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/adapter.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,cAAc,EAAE,mBAAmB,EACnC,kBAAkB,EAAE,iBAAiB,EAAE,uBAAuB,EAC/D,MAAM,yBAAyB,CAAC;AACjC,OAAO,EAAwB,KAAK,cAAc,EAAE,MAAM,aAAa,CAAC;AAIxE,MAAM,WAAW,eAAe;IAC9B,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,UAAU,CAAC,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAChD,wBAAwB,CAAC,EAAE,OAAO,CAAC;IACnC,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,aAAa,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;CACzC;AAYD,qBAAa,eAAgB,YAAW,cAAc,CAAC,eAAe,CAAC;IAczD,OAAO,CAAC,QAAQ,CAAC,IAAI;IAbjC,QAAQ,CAAC,YAAY,EAAE,mBAAmB,CAWxC;gBAE2B,IAAI,GAAE;QAAE,MAAM,CAAC,EAAE,cAAc,CAAA;KAAO;IAEnE,QAAQ,CAAC,CAAC,EAAE,eAAe,GAAG,uBAAuB;IAS/C,IAAI,CAAC,CAAC,EAAE,eAAe,EAAE,GAAG,EAAE,kBAAkB,GAAG,OAAO,CAAC,iBAAiB,CAAC;CAqCpF;AAED,OAAO,QAAQ,yBAAyB,CAAC;IACvC,UAAU,iBAAiB;QACzB,QAAQ,EAAE,eAAe,CAAC;KAC3B;CACF"}
@@ -0,0 +1,75 @@
1
+ import { load_telegram_config } from "./config.js";
2
+ import { makeTransport } from "./transport.js";
3
+ import { splitMessage, MAX_TG_LEN } from "./splitter.js";
4
+ const sleep = (ms) => new Promise(resolve => setTimeout(resolve, ms));
5
+ function pickBody(rendered, p) {
6
+ for (const k of ["telegram_html", "html", "markdown", "text"]) {
7
+ const v = rendered[k];
8
+ if (typeof v === "string" && v.length > 0)
9
+ return v;
10
+ }
11
+ return p.text ?? "";
12
+ }
13
+ export class TelegramChannel {
14
+ constructor(opts = {}) {
15
+ this.opts = opts;
16
+ this.capabilities = {
17
+ channel_id: "telegram",
18
+ display_name: "Telegram",
19
+ template_body_keys: ["telegram_html", "html", "markdown", "text"],
20
+ max_text_length: null,
21
+ splits_long_messages: true,
22
+ supports_explicit_recipient: true,
23
+ retry: {
24
+ max_attempts: 5,
25
+ backoff_ms: (n, hint) => hint ?? Math.min(60000, 2000 * Math.pow(2, Math.max(0, n - 1))),
26
+ },
27
+ };
28
+ }
29
+ validate(p) {
30
+ const errors = [];
31
+ if (p.parse_mode && !["HTML", "Markdown", "MarkdownV2"].includes(p.parse_mode)) {
32
+ errors.push(`parse_mode invalid: ${p.parse_mode}`);
33
+ }
34
+ if (!p.text && !p.template_name)
35
+ errors.push("text or template_name required");
36
+ return errors.length > 0 ? { ok: false, errors } : { ok: true };
37
+ }
38
+ async send(p, ctx) {
39
+ const config = this.opts.config ?? load_telegram_config();
40
+ const text = pickBody(ctx.rendered_bodies, p);
41
+ if (!text)
42
+ return { ok: false, error: "no body to send", retryable: false };
43
+ const chunks = splitMessage(text, MAX_TG_LEN);
44
+ const transport = makeTransport(config.transport);
45
+ const url = `${config.api_base_url}/bot${config.bot_token}/sendMessage`;
46
+ let last_message_id;
47
+ for (let i = 0; i < chunks.length; i++) {
48
+ const r = await transport.send({
49
+ url,
50
+ body: {
51
+ chat_id: p.chat_id ?? ctx.recipient,
52
+ text: chunks[i],
53
+ parse_mode: p.parse_mode ?? config.parse_mode,
54
+ disable_web_page_preview: p.disable_web_page_preview ?? config.disable_web_page_preview,
55
+ },
56
+ timeout_ms: config.request_timeout_ms,
57
+ });
58
+ if (!r.ok) {
59
+ return {
60
+ ok: false,
61
+ error: r.error ?? `telegram status ${r.status}`,
62
+ retryable: r.network_error === true ||
63
+ r.status === 429 ||
64
+ (r.status >= 500 && r.status < 600),
65
+ retry_after_ms: r.retry_after_ms,
66
+ };
67
+ }
68
+ last_message_id = r.message_id;
69
+ if (i < chunks.length - 1)
70
+ await sleep(1000);
71
+ }
72
+ return { ok: true, message_id: last_message_id };
73
+ }
74
+ }
75
+ //# sourceMappingURL=adapter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"adapter.js","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/adapter.ts"],"names":[],"mappings":"AAIA,OAAO,EAAE,oBAAoB,EAAuB,MAAM,aAAa,CAAC;AACxE,OAAO,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAC/C,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAWzD,MAAM,KAAK,GAAG,CAAC,EAAU,EAAE,EAAE,CAAC,IAAI,OAAO,CAAO,OAAO,CAAC,EAAE,CAAC,UAAU,CAAC,OAAO,EAAE,EAAE,CAAC,CAAC,CAAC;AAEpF,SAAS,QAAQ,CAAC,QAAgC,EAAE,CAAkB;IACpE,KAAK,MAAM,CAAC,IAAI,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAU,EAAE,CAAC;QACvE,MAAM,CAAC,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAC;QACtB,IAAI,OAAO,CAAC,KAAK,QAAQ,IAAI,CAAC,CAAC,MAAM,GAAG,CAAC;YAAE,OAAO,CAAC,CAAC;IACtD,CAAC;IACD,OAAO,CAAC,CAAC,IAAI,IAAI,EAAE,CAAC;AACtB,CAAC;AAED,MAAM,OAAO,eAAe;IAc1B,YAA6B,OAAoC,EAAE;QAAtC,SAAI,GAAJ,IAAI,CAAkC;QAb1D,iBAAY,GAAwB;YAC3C,UAAU,EAAE,UAAU;YACtB,YAAY,EAAE,UAAU;YACxB,kBAAkB,EAAE,CAAC,eAAe,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,CAAC;YACjE,eAAe,EAAE,IAAI;YACrB,oBAAoB,EAAE,IAAI;YAC1B,2BAA2B,EAAE,IAAI;YACjC,KAAK,EAAE;gBACL,YAAY,EAAE,CAAC;gBACf,UAAU,EAAE,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,CAAC,IAAI,IAAI,IAAI,CAAC,GAAG,CAAC,KAAM,EAAE,IAAK,GAAG,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;aAC3F;SACF,CAAC;IAEoE,CAAC;IAEvE,QAAQ,CAAC,CAAkB;QACzB,MAAM,MAAM,GAAa,EAAE,CAAC;QAC5B,IAAI,CAAC,CAAC,UAAU,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,EAAE,CAAC;YAC/E,MAAM,CAAC,IAAI,CAAC,uBAAuB,CAAC,CAAC,UAAU,EAAE,CAAC,CAAC;QACrD,CAAC;QACD,IAAI,CAAC,CAAC,CAAC,IAAI,IAAI,CAAC,CAAC,CAAC,aAAa;YAAE,MAAM,CAAC,IAAI,CAAC,gCAAgC,CAAC,CAAC;QAC/E,OAAO,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,KAAK,EAAE,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC;IAClE,CAAC;IAED,KAAK,CAAC,IAAI,CAAC,CAAkB,EAAE,GAAuB;QACpD,MAAM,MAAM,GAAG,IAAI,CAAC,IAAI,CAAC,MAAM,IAAI,oBAAoB,EAAE,CAAC;QAC1D,MAAM,IAAI,GAAG,QAAQ,CAAC,GAAG,CAAC,eAAe,EAAE,CAAC,CAAC,CAAC;QAC9C,IAAI,CAAC,IAAI;YAAE,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,KAAK,EAAE,iBAAiB,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC;QAE5E,MAAM,MAAM,GAAG,YAAY,CAAC,IAAI,EAAE,UAAU,CAAC,CAAC;QAC9C,MAAM,SAAS,GAAG,aAAa,CAAC,MAAM,CAAC,SAAS,CAAC,CAAC;QAClD,MAAM,GAAG,GAAG,GAAG,MAAM,CAAC,YAAY,OAAO,MAAM,CAAC,SAAS,cAAc,CAAC;QAExE,IAAI,eAAmC,CAAC;QACxC,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,MAAM,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACvC,MAAM,CAAC,GAAG,MAAM,SAAS,CAAC,IAAI,CAAC;gBAC7B,GAAG;gBACH,IAAI,EAAE;oBACJ,OAAO,EAAE,CAAC,CAAC,OAAO,IAAI,GAAG,CAAC,SAAS;oBACnC,IAAI,EAAE,MAAM,CAAC,CAAC,CAAC;oBACf,UAAU,EAAE,CAAC,CAAC,UAAU,IAAI,MAAM,CAAC,UAAU;oBAC7C,wBAAwB,EAAE,CAAC,CAAC,wBAAwB,IAAI,MAAM,CAAC,wBAAwB;iBACxF;gBACD,UAAU,EAAE,MAAM,CAAC,kBAAkB;aACtC,CAAC,CAAC;YACH,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC;gBACV,OAAO;oBACL,EAAE,EAAE,KAAK;oBACT,KAAK,EAAE,CAAC,CAAC,KAAK,IAAI,mBAAmB,CAAC,CAAC,MAAM,EAAE;oBAC/C,SAAS,EACP,CAAC,CAAC,aAAa,KAAK,IAAI;wBACxB,CAAC,CAAC,MAAM,KAAK,GAAG;wBAChB,CAAC,CAAC,CAAC,MAAM,IAAI,GAAG,IAAI,CAAC,CAAC,MAAM,GAAG,GAAG,CAAC;oBACrC,cAAc,EAAE,CAAC,CAAC,cAAc;iBACjC,CAAC;YACJ,CAAC;YACD,eAAe,GAAG,CAAC,CAAC,UAAU,CAAC;YAC/B,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,GAAG,CAAC;gBAAE,MAAM,KAAK,CAAC,IAAK,CAAC,CAAC;QAChD,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,IAAI,EAAE,UAAU,EAAE,eAAe,EAAE,CAAC;IACnD,CAAC;CACF"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Telegram channel configuration loader.
3
+ *
4
+ * Reads the [telegram] section from config/hazo_notify_config.ini via hazo_config.
5
+ * Supports env-var overrides for secrets (bot_token, default_chat_id).
6
+ * Validates parse_mode and transport against known values.
7
+ * Handles missing [telegram] section gracefully — defaults everything except bot_token.
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import type { TransportMode } from "./transport.js";
12
+ export interface TelegramConfig {
13
+ bot_token: string;
14
+ default_chat_id: string;
15
+ parse_mode: "HTML" | "Markdown" | "MarkdownV2";
16
+ disable_web_page_preview: boolean;
17
+ transport: TransportMode;
18
+ request_timeout_ms: number;
19
+ api_base_url: string;
20
+ }
21
+ export declare function load_telegram_config(): TelegramConfig;
22
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAIH,OAAO,KAAK,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAC;AAEpD,MAAM,WAAW,cAAc;IAC7B,SAAS,EAAE,MAAM,CAAC;IAClB,eAAe,EAAE,MAAM,CAAC;IACxB,UAAU,EAAE,MAAM,GAAG,UAAU,GAAG,YAAY,CAAC;IAC/C,wBAAwB,EAAE,OAAO,CAAC;IAClC,SAAS,EAAE,aAAa,CAAC;IACzB,kBAAkB,EAAE,MAAM,CAAC;IAC3B,YAAY,EAAE,MAAM,CAAC;CACtB;AAUD,wBAAgB,oBAAoB,IAAI,cAAc,CAoDrD"}
@@ -0,0 +1,60 @@
1
+ /**
2
+ * Telegram channel configuration loader.
3
+ *
4
+ * Reads the [telegram] section from config/hazo_notify_config.ini via hazo_config.
5
+ * Supports env-var overrides for secrets (bot_token, default_chat_id).
6
+ * Validates parse_mode and transport against known values.
7
+ * Handles missing [telegram] section gracefully — defaults everything except bot_token.
8
+ *
9
+ * @packageDocumentation
10
+ */
11
+ import { HazoConfig } from "hazo_config/server";
12
+ import { join } from "path";
13
+ const DEFAULTS = {
14
+ parse_mode: "HTML",
15
+ disable_web_page_preview: true,
16
+ transport: "direct",
17
+ request_timeout_ms: 10000,
18
+ api_base_url: "https://api.telegram.org",
19
+ };
20
+ export function load_telegram_config() {
21
+ const filename = "config.ts";
22
+ try {
23
+ const path = join(process.cwd(), "config", "hazo_notify_config.ini");
24
+ const cfg = new HazoConfig({ filePath: path });
25
+ const s = cfg.getSection("telegram") ?? {};
26
+ const bot_token = process.env.HAZO_NOTIFY_TELEGRAM_BOT_TOKEN ?? s.bot_token ?? "";
27
+ if (!bot_token) {
28
+ throw new Error("telegram bot_token required (set HAZO_NOTIFY_TELEGRAM_BOT_TOKEN env or bot_token in [telegram])");
29
+ }
30
+ const default_chat_id = process.env.HAZO_NOTIFY_TELEGRAM_DEFAULT_CHAT_ID ??
31
+ s.default_chat_id ??
32
+ "";
33
+ const parse_mode = s.parse_mode ?? DEFAULTS.parse_mode;
34
+ const transport = s.transport ?? DEFAULTS.transport;
35
+ if (!["HTML", "Markdown", "MarkdownV2"].includes(parse_mode)) {
36
+ throw new Error(`telegram parse_mode invalid: ${parse_mode}`);
37
+ }
38
+ if (!["direct", "browser-tab", "auto"].includes(transport)) {
39
+ throw new Error(`telegram transport invalid: ${transport}`);
40
+ }
41
+ return {
42
+ bot_token,
43
+ default_chat_id,
44
+ parse_mode,
45
+ transport,
46
+ disable_web_page_preview: parseBoolean(s.disable_web_page_preview, DEFAULTS.disable_web_page_preview),
47
+ request_timeout_ms: parseInt(s.request_timeout_ms ?? String(DEFAULTS.request_timeout_ms), 10),
48
+ api_base_url: s.api_base_url ?? DEFAULTS.api_base_url,
49
+ };
50
+ }
51
+ catch (e) {
52
+ throw new Error(`Failed to load telegram config (${filename}): ${e instanceof Error ? e.message : String(e)}`);
53
+ }
54
+ }
55
+ function parseBoolean(v, fallback) {
56
+ if (typeof v !== "string")
57
+ return fallback;
58
+ return v.toLowerCase() === "true";
59
+ }
60
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/config.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,oBAAoB,CAAC;AAChD,OAAO,EAAE,IAAI,EAAE,MAAM,MAAM,CAAC;AAa5B,MAAM,QAAQ,GAAG;IACf,UAAU,EAAE,MAAe;IAC3B,wBAAwB,EAAE,IAAI;IAC9B,SAAS,EAAE,QAAyB;IACpC,kBAAkB,EAAE,KAAM;IAC1B,YAAY,EAAE,0BAA0B;CACzC,CAAC;AAEF,MAAM,UAAU,oBAAoB;IAClC,MAAM,QAAQ,GAAG,WAAW,CAAC;IAC7B,IAAI,CAAC;QACH,MAAM,IAAI,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,EAAE,EAAE,QAAQ,EAAE,wBAAwB,CAAC,CAAC;QACrE,MAAM,GAAG,GAAG,IAAI,UAAU,CAAC,EAAE,QAAQ,EAAE,IAAI,EAAE,CAAC,CAAC;QAC/C,MAAM,CAAC,GAAG,GAAG,CAAC,UAAU,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC;QAE3C,MAAM,SAAS,GACb,OAAO,CAAC,GAAG,CAAC,8BAA8B,IAAI,CAAC,CAAC,SAAS,IAAI,EAAE,CAAC;QAClE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,KAAK,CACb,iGAAiG,CAClG,CAAC;QACJ,CAAC;QAED,MAAM,eAAe,GACnB,OAAO,CAAC,GAAG,CAAC,oCAAoC;YAChD,CAAC,CAAC,eAAe;YACjB,EAAE,CAAC;QAEL,MAAM,UAAU,GACb,CAAC,CAAC,UAA2C,IAAI,QAAQ,CAAC,UAAU,CAAC;QACxE,MAAM,SAAS,GACZ,CAAC,CAAC,SAA2B,IAAI,QAAQ,CAAC,SAAS,CAAC;QAEvD,IAAI,CAAC,CAAC,MAAM,EAAE,UAAU,EAAE,YAAY,CAAC,CAAC,QAAQ,CAAC,UAAU,CAAC,EAAE,CAAC;YAC7D,MAAM,IAAI,KAAK,CAAC,gCAAgC,UAAU,EAAE,CAAC,CAAC;QAChE,CAAC;QACD,IAAI,CAAC,CAAC,QAAQ,EAAE,aAAa,EAAE,MAAM,CAAC,CAAC,QAAQ,CAAC,SAAS,CAAC,EAAE,CAAC;YAC3D,MAAM,IAAI,KAAK,CAAC,+BAA+B,SAAS,EAAE,CAAC,CAAC;QAC9D,CAAC;QAED,OAAO;YACL,SAAS;YACT,eAAe;YACf,UAAU;YACV,SAAS;YACT,wBAAwB,EAAE,YAAY,CACpC,CAAC,CAAC,wBAAwB,EAC1B,QAAQ,CAAC,wBAAwB,CAClC;YACD,kBAAkB,EAAE,QAAQ,CAC1B,CAAC,CAAC,kBAAkB,IAAI,MAAM,CAAC,QAAQ,CAAC,kBAAkB,CAAC,EAC3D,EAAE,CACH;YACD,YAAY,EAAE,CAAC,CAAC,YAAY,IAAI,QAAQ,CAAC,YAAY;SACtD,CAAC;IACJ,CAAC;IAAC,OAAO,CAAC,EAAE,CAAC;QACX,MAAM,IAAI,KAAK,CACb,mCAAmC,QAAQ,MAAM,CAAC,YAAY,KAAK,CAAC,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,CAC9F,CAAC;IACJ,CAAC;AACH,CAAC;AAED,SAAS,YAAY,CAAC,CAAU,EAAE,QAAiB;IACjD,IAAI,OAAO,CAAC,KAAK,QAAQ;QAAE,OAAO,QAAQ,CAAC;IAC3C,OAAO,CAAC,CAAC,WAAW,EAAE,KAAK,MAAM,CAAC;AACpC,CAAC"}
@@ -0,0 +1,8 @@
1
+ export { TelegramChannel } from "./adapter.js";
2
+ export type { TelegramPayload } from "./adapter.js";
3
+ export { load_telegram_config } from "./config.js";
4
+ export type { TelegramConfig } from "./config.js";
5
+ export { makeTransport, setTelegramBrowserTransport, __resetTelegramBrowserTransport, } from "./transport.js";
6
+ export type { TransportMode, TransportRequest, TransportResponse, Transport } from "./transport.js";
7
+ export { splitMessage, MAX_TG_LEN } from "./splitter.js";
8
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,cAAc,EAAE,MAAM,aAAa,CAAC;AAClD,OAAO,EACL,aAAa,EAAE,2BAA2B,EAC1C,+BAA+B,GAChC,MAAM,gBAAgB,CAAC;AACxB,YAAY,EAAE,aAAa,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AACpG,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,5 @@
1
+ export { TelegramChannel } from "./adapter.js";
2
+ export { load_telegram_config } from "./config.js";
3
+ export { makeTransport, setTelegramBrowserTransport, __resetTelegramBrowserTransport, } from "./transport.js";
4
+ export { splitMessage, MAX_TG_LEN } from "./splitter.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAE/C,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AAEnD,OAAO,EACL,aAAa,EAAE,2BAA2B,EAC1C,+BAA+B,GAChC,MAAM,gBAAgB,CAAC;AAExB,OAAO,EAAE,YAAY,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,7 @@
1
+ export declare const MAX_TG_LEN = 4096;
2
+ /**
3
+ * Split text into chunks no larger than `max`. Tries blank line > newline >
4
+ * sentence-period > space, hard-cuts as last resort.
5
+ */
6
+ export declare function splitMessage(text: string, max?: number): string[];
7
+ //# sourceMappingURL=splitter.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/splitter.ts"],"names":[],"mappings":"AAGA,eAAO,MAAM,UAAU,OAAO,CAAC;AAgB/B;;;GAGG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,GAAG,SAAa,GAAG,MAAM,EAAE,CAsBrE"}
@@ -0,0 +1,47 @@
1
+ // splitter.ts — Split long text into Telegram-safe chunks (≤ MAX_TG_LEN chars).
2
+ // Prefers blank-line > newline > sentence-period > space > hard cut.
3
+ export const MAX_TG_LEN = 4096;
4
+ /**
5
+ * Separators tried in priority order.
6
+ * `advance` is how far past the separator start to begin the next chunk.
7
+ * For ". " we advance 1 (past the period only), leaving the space at the
8
+ * start of the next chunk — that way trimEnd on the left chunk + the
9
+ * preserved leading space ensures the joined text round-trips correctly.
10
+ */
11
+ const SEPARATORS = [
12
+ ["\n\n", 2],
13
+ ["\n", 1],
14
+ [". ", 1],
15
+ [" ", 1],
16
+ ];
17
+ /**
18
+ * Split text into chunks no larger than `max`. Tries blank line > newline >
19
+ * sentence-period > space, hard-cuts as last resort.
20
+ */
21
+ export function splitMessage(text, max = MAX_TG_LEN) {
22
+ if (text.length <= max)
23
+ return [text];
24
+ const out = [];
25
+ let rest = text;
26
+ while (rest.length > max) {
27
+ let cut = -1;
28
+ for (const [sep, advance] of SEPARATORS) {
29
+ const idx = rest.lastIndexOf(sep, max);
30
+ if (idx > 0) {
31
+ cut = idx + advance;
32
+ break;
33
+ }
34
+ }
35
+ if (cut <= 0)
36
+ cut = max; // hard cut — no separator found
37
+ // trimEnd the chunk (removes trailing whitespace / newlines from separator).
38
+ // Do NOT trimStart the next chunk — the leading space from ". " must survive
39
+ // so that out.join("") reconstructs the original text faithfully.
40
+ out.push(rest.slice(0, cut).trimEnd());
41
+ rest = rest.slice(cut);
42
+ }
43
+ if (rest.length > 0)
44
+ out.push(rest);
45
+ return out;
46
+ }
47
+ //# sourceMappingURL=splitter.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"splitter.js","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/splitter.ts"],"names":[],"mappings":"AAAA,gFAAgF;AAChF,qEAAqE;AAErE,MAAM,CAAC,MAAM,UAAU,GAAG,IAAI,CAAC;AAE/B;;;;;;GAMG;AACH,MAAM,UAAU,GAAuB;IACrC,CAAC,MAAM,EAAE,CAAC,CAAC;IACX,CAAC,IAAI,EAAE,CAAC,CAAC;IACT,CAAC,IAAI,EAAE,CAAC,CAAC;IACT,CAAC,GAAG,EAAE,CAAC,CAAC;CACT,CAAC;AAEF;;;GAGG;AACH,MAAM,UAAU,YAAY,CAAC,IAAY,EAAE,GAAG,GAAG,UAAU;IACzD,IAAI,IAAI,CAAC,MAAM,IAAI,GAAG;QAAE,OAAO,CAAC,IAAI,CAAC,CAAC;IACtC,MAAM,GAAG,GAAa,EAAE,CAAC;IACzB,IAAI,IAAI,GAAG,IAAI,CAAC;IAChB,OAAO,IAAI,CAAC,MAAM,GAAG,GAAG,EAAE,CAAC;QACzB,IAAI,GAAG,GAAG,CAAC,CAAC,CAAC;QACb,KAAK,MAAM,CAAC,GAAG,EAAE,OAAO,CAAC,IAAI,UAAU,EAAE,CAAC;YACxC,MAAM,GAAG,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,EAAE,GAAG,CAAC,CAAC;YACvC,IAAI,GAAG,GAAG,CAAC,EAAE,CAAC;gBACZ,GAAG,GAAG,GAAG,GAAG,OAAO,CAAC;gBACpB,MAAM;YACR,CAAC;QACH,CAAC;QACD,IAAI,GAAG,IAAI,CAAC;YAAE,GAAG,GAAG,GAAG,CAAC,CAAE,gCAAgC;QAC1D,6EAA6E;QAC7E,6EAA6E;QAC7E,kEAAkE;QAClE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,EAAE,GAAG,CAAC,CAAC,OAAO,EAAE,CAAC,CAAC;QACvC,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;IACzB,CAAC;IACD,IAAI,IAAI,CAAC,MAAM,GAAG,CAAC;QAAE,GAAG,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;IACpC,OAAO,GAAG,CAAC;AACb,CAAC"}
@@ -0,0 +1,31 @@
1
+ export type TransportMode = "direct" | "browser-tab" | "auto";
2
+ export interface TransportRequest {
3
+ url: string;
4
+ body: Record<string, unknown>;
5
+ timeout_ms?: number;
6
+ }
7
+ export interface TransportResponse {
8
+ ok: boolean;
9
+ status: number;
10
+ message_id?: string;
11
+ error?: string;
12
+ retry_after_ms?: number;
13
+ network_error?: boolean;
14
+ }
15
+ export interface Transport {
16
+ send(req: TransportRequest): Promise<TransportResponse>;
17
+ }
18
+ /**
19
+ * Register a host-provided callback used by browser-tab and auto transports.
20
+ * Call this at boot time in the host application.
21
+ */
22
+ export declare function setTelegramBrowserTransport(cb: (req: TransportRequest) => Promise<TransportResponse>): void;
23
+ /**
24
+ * Reset the registered browser transport. Used in tests only.
25
+ */
26
+ export declare function __resetTelegramBrowserTransport(): void;
27
+ /**
28
+ * Create a Transport instance for the given mode.
29
+ */
30
+ export declare function makeTransport(mode: TransportMode): Transport;
31
+ //# sourceMappingURL=transport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.d.ts","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/transport.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,aAAa,GAAG,QAAQ,GAAG,aAAa,GAAG,MAAM,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,GAAG,EAAE,MAAM,CAAC;IACZ,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC9B,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,MAAM,WAAW,iBAAiB;IAChC,EAAE,EAAE,OAAO,CAAC;IACZ,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,cAAc,CAAC,EAAE,MAAM,CAAC;IACxB,aAAa,CAAC,EAAE,OAAO,CAAC;CACzB;AAED,MAAM,WAAW,SAAS;IACxB,IAAI,CAAC,GAAG,EAAE,gBAAgB,GAAG,OAAO,CAAC,iBAAiB,CAAC,CAAC;CACzD;AAID;;;GAGG;AACH,wBAAgB,2BAA2B,CACzC,EAAE,EAAE,CAAC,GAAG,EAAE,gBAAgB,KAAK,OAAO,CAAC,iBAAiB,CAAC,GACxD,IAAI,CAEN;AAED;;GAEG;AACH,wBAAgB,+BAA+B,IAAI,IAAI,CAEtD;AAgFD;;GAEG;AACH,wBAAgB,aAAa,CAAC,IAAI,EAAE,aAAa,GAAG,SAAS,CAM5D"}
@@ -0,0 +1,112 @@
1
+ // telegram/transport.ts
2
+ // Transport abstraction for Telegram API calls.
3
+ // Supports three modes: direct (fetch to api.telegram.org), browser-tab
4
+ // (delegates to a host-registered callback), and auto (direct first,
5
+ // falls back to browser-tab on network errors).
6
+ let _browserTransport = null;
7
+ /**
8
+ * Register a host-provided callback used by browser-tab and auto transports.
9
+ * Call this at boot time in the host application.
10
+ */
11
+ export function setTelegramBrowserTransport(cb) {
12
+ _browserTransport = cb;
13
+ }
14
+ /**
15
+ * Reset the registered browser transport. Used in tests only.
16
+ */
17
+ export function __resetTelegramBrowserTransport() {
18
+ _browserTransport = null;
19
+ }
20
+ class DirectTransport {
21
+ async send(req) {
22
+ try {
23
+ const controller = new AbortController();
24
+ const timer = req.timeout_ms
25
+ ? setTimeout(() => controller.abort(), req.timeout_ms)
26
+ : null;
27
+ try {
28
+ const r = await fetch(req.url, {
29
+ method: "POST",
30
+ headers: { "content-type": "application/json" },
31
+ body: JSON.stringify(req.body),
32
+ signal: controller.signal,
33
+ });
34
+ const body = await r.json().catch(() => ({}));
35
+ if (!r.ok) {
36
+ const retry_s = body.parameters?.retry_after;
37
+ return {
38
+ ok: false,
39
+ status: r.status,
40
+ error: body.description ?? r.statusText,
41
+ retry_after_ms: typeof retry_s === "number" ? retry_s * 1000 : undefined,
42
+ };
43
+ }
44
+ const mid = body.result?.message_id;
45
+ return {
46
+ ok: true,
47
+ status: r.status,
48
+ message_id: mid != null ? String(mid) : undefined,
49
+ };
50
+ }
51
+ finally {
52
+ if (timer)
53
+ clearTimeout(timer);
54
+ }
55
+ }
56
+ catch (e) {
57
+ return {
58
+ ok: false,
59
+ status: 0,
60
+ error: e instanceof Error ? e.message : String(e),
61
+ network_error: true,
62
+ };
63
+ }
64
+ }
65
+ }
66
+ class BrowserTabTransport {
67
+ async send(req) {
68
+ if (!_browserTransport) {
69
+ return {
70
+ ok: false,
71
+ status: 0,
72
+ error: "browser-tab transport not registered (call setTelegramBrowserTransport(cb) at boot)",
73
+ };
74
+ }
75
+ try {
76
+ return await _browserTransport(req);
77
+ }
78
+ catch (e) {
79
+ return {
80
+ ok: false,
81
+ status: 0,
82
+ error: e instanceof Error ? e.message : String(e),
83
+ network_error: true,
84
+ };
85
+ }
86
+ }
87
+ }
88
+ class AutoTransport {
89
+ constructor() {
90
+ this.direct = new DirectTransport();
91
+ this.browser = new BrowserTabTransport();
92
+ }
93
+ async send(req) {
94
+ const r1 = await this.direct.send(req);
95
+ if (r1.ok || !r1.network_error)
96
+ return r1;
97
+ if (!_browserTransport)
98
+ return r1;
99
+ return await this.browser.send(req);
100
+ }
101
+ }
102
+ /**
103
+ * Create a Transport instance for the given mode.
104
+ */
105
+ export function makeTransport(mode) {
106
+ switch (mode) {
107
+ case "direct": return new DirectTransport();
108
+ case "browser-tab": return new BrowserTabTransport();
109
+ case "auto": return new AutoTransport();
110
+ }
111
+ }
112
+ //# sourceMappingURL=transport.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transport.js","sourceRoot":"","sources":["../../../../src/lib/adapters/telegram/transport.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,41 @@
1
+ /**
2
+ * Route factories for the client-portal banner.
3
+ *
4
+ * Client portal auth uses `code` path param (not session). Caller supplies
5
+ * `resolveClientByCode` which returns the underlying user_id + scope_id.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ interface SimpleRequest {
10
+ url: string;
11
+ }
12
+ interface SimpleResponse {
13
+ status: number;
14
+ json(): Promise<unknown>;
15
+ }
16
+ export interface CreateBannerRoutesOptions {
17
+ resolveClientByCode: (code: string) => Promise<{
18
+ user_id: string;
19
+ scope_id: string;
20
+ } | null>;
21
+ }
22
+ export declare function createBannerRoutes(opts: CreateBannerRoutesOptions): {
23
+ summaryHandler(req: SimpleRequest, ctx: {
24
+ params: {
25
+ code: string;
26
+ };
27
+ }): Promise<SimpleResponse>;
28
+ listHandler(req: SimpleRequest, ctx: {
29
+ params: {
30
+ code: string;
31
+ };
32
+ }): Promise<SimpleResponse>;
33
+ markReadHandler(req: SimpleRequest, ctx: {
34
+ params: {
35
+ code: string;
36
+ id: string;
37
+ };
38
+ }): Promise<SimpleResponse>;
39
+ };
40
+ export {};
41
+ //# sourceMappingURL=banner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.d.ts","sourceRoot":"","sources":["../../../src/lib/api/banner.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAIH,UAAU,aAAa;IAAG,GAAG,EAAE,MAAM,CAAA;CAAE;AACvC,UAAU,cAAc;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE;AAMrE,MAAM,WAAW,yBAAyB;IACxC,mBAAmB,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CAC9F;AAED,wBAAgB,kBAAkB,CAAC,IAAI,EAAE,yBAAyB;wBAEpC,aAAa,OAAO;QAAE,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;qBAoB7E,aAAa,OAAO;QAAE,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAAG,OAAO,CAAC,cAAc,CAAC;yBAU1F,aAAa,OACb;QAAE,MAAM,EAAE;YAAE,IAAI,EAAE,MAAM,CAAC;YAAC,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAC5C,OAAO,CAAC,cAAc,CAAC;EAO7B"}
@@ -0,0 +1,53 @@
1
+ /**
2
+ * Route factories for the client-portal banner.
3
+ *
4
+ * Client portal auth uses `code` path param (not session). Caller supplies
5
+ * `resolveClientByCode` which returns the underlying user_id + scope_id.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ import { listUnreadForUser, markRead, unreadCount } from "../inbox/storage.js";
10
+ function json(body, status = 200) {
11
+ return { status, json: async () => body };
12
+ }
13
+ export function createBannerRoutes(opts) {
14
+ return {
15
+ async summaryHandler(req, ctx) {
16
+ const id = await opts.resolveClientByCode(ctx.params.code);
17
+ if (!id)
18
+ return json({ error: "Not found" }, 404);
19
+ const [latestRows, unread] = await Promise.all([
20
+ listUnreadForUser(id.user_id, id.scope_id, { limit: 1, surface: "banner" }),
21
+ unreadCount(id.user_id, id.scope_id),
22
+ ]);
23
+ return json({
24
+ unread_count: unread,
25
+ latest: latestRows[0]
26
+ ? {
27
+ id: latestRows[0].id,
28
+ in_app_text: latestRows[0].in_app_text,
29
+ deep_link: latestRows[0].deep_link,
30
+ created_at: latestRows[0].created_at,
31
+ }
32
+ : null,
33
+ });
34
+ },
35
+ async listHandler(req, ctx) {
36
+ const id = await opts.resolveClientByCode(ctx.params.code);
37
+ if (!id)
38
+ return json({ error: "Not found" }, 404);
39
+ const url = new URL(req.url);
40
+ const limit = Math.min(Number(url.searchParams.get("limit") ?? 20), 100);
41
+ const items = await listUnreadForUser(id.user_id, id.scope_id, { limit, surface: "banner" });
42
+ return json({ items, unread_count: items.length });
43
+ },
44
+ async markReadHandler(req, ctx) {
45
+ const id = await opts.resolveClientByCode(ctx.params.code);
46
+ if (!id)
47
+ return json({ error: "Not found" }, 404);
48
+ const ok = await markRead(ctx.params.id, id.user_id);
49
+ return ok ? json({ ok: true }) : json({ error: "Not found" }, 404);
50
+ },
51
+ };
52
+ }
53
+ //# sourceMappingURL=banner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"banner.js","sourceRoot":"","sources":["../../../src/lib/api/banner.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,33 @@
1
+ /**
2
+ * Route factories for the office portal's in-app bell.
3
+ *
4
+ * Consumer mounts these under `app/api/notifications/` in their Next.js
5
+ * routes. Auth is injected — package never trusts path params for identity.
6
+ *
7
+ * @packageDocumentation
8
+ */
9
+ interface SimpleRequest {
10
+ url: string;
11
+ }
12
+ interface SimpleResponse {
13
+ status: number;
14
+ json(): Promise<unknown>;
15
+ }
16
+ export interface CreateInboxRoutesOptions {
17
+ getAuth: (req: SimpleRequest) => Promise<{
18
+ user_id: string;
19
+ scope_id: string;
20
+ } | null>;
21
+ }
22
+ export declare function createInboxRoutes(opts: CreateInboxRoutesOptions): {
23
+ listHandler(req: SimpleRequest): Promise<SimpleResponse>;
24
+ unreadCountHandler(req: SimpleRequest): Promise<SimpleResponse>;
25
+ markReadHandler(req: SimpleRequest, ctx: {
26
+ params: {
27
+ id: string;
28
+ };
29
+ }): Promise<SimpleResponse>;
30
+ markAllReadHandler(req: SimpleRequest): Promise<SimpleResponse>;
31
+ };
32
+ export {};
33
+ //# sourceMappingURL=inbox.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"inbox.d.ts","sourceRoot":"","sources":["../../../src/lib/api/inbox.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AASH,UAAU,aAAa;IAAG,GAAG,EAAE,MAAM,CAAA;CAAE;AACvC,UAAU,cAAc;IAAG,MAAM,EAAE,MAAM,CAAC;IAAC,IAAI,IAAI,OAAO,CAAC,OAAO,CAAC,CAAA;CAAE;AAMrE,MAAM,WAAW,wBAAwB;IACvC,OAAO,EAAE,CAAC,GAAG,EAAE,aAAa,KAAK,OAAO,CAAC;QAAE,OAAO,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE,GAAG,IAAI,CAAC,CAAC;CACxF;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,wBAAwB;qBAErC,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;4BAiBhC,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;yBAQ9D,aAAa,OACb;QAAE,MAAM,EAAE;YAAE,EAAE,EAAE,MAAM,CAAA;SAAE,CAAA;KAAE,GAC9B,OAAO,CAAC,cAAc,CAAC;4BAOI,aAAa,GAAG,OAAO,CAAC,cAAc,CAAC;EAOxE"}