hazo_notify 3.1.0 → 5.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 (244) 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 +37 -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 +142 -0
  127. package/dist/lib/inbox/storage.d.ts.map +1 -0
  128. package/dist/lib/inbox/storage.js +345 -0
  129. package/dist/lib/inbox/storage.js.map +1 -0
  130. package/dist/lib/inbox/types.d.ts +94 -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 +58 -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/index.d.ts.map +1 -1
  176. package/dist/lib/template_manager/handlers/index.js +2 -4
  177. package/dist/lib/template_manager/handlers/index.js.map +1 -1
  178. package/dist/lib/template_manager/seed/sync.d.ts.map +1 -1
  179. package/dist/lib/template_manager/seed/sync.js +20 -4
  180. package/dist/lib/template_manager/seed/sync.js.map +1 -1
  181. package/dist/lib/template_manager/template_manager.d.ts.map +1 -1
  182. package/dist/lib/template_manager/template_manager.js +67 -26
  183. package/dist/lib/template_manager/template_manager.js.map +1 -1
  184. package/dist/lib/template_manager/types.d.ts +59 -9
  185. package/dist/lib/template_manager/types.d.ts.map +1 -1
  186. package/dist/lib/template_manager/utils/index.d.ts +1 -1
  187. package/dist/lib/template_manager/utils/index.d.ts.map +1 -1
  188. package/dist/lib/template_manager/utils/index.js +1 -1
  189. package/dist/lib/template_manager/utils/index.js.map +1 -1
  190. package/dist/lib/template_manager/utils/validation.d.ts +12 -11
  191. package/dist/lib/template_manager/utils/validation.d.ts.map +1 -1
  192. package/dist/lib/template_manager/utils/validation.js +15 -22
  193. package/dist/lib/template_manager/utils/validation.js.map +1 -1
  194. package/migrations/003_create_notifications_table.sql +48 -0
  195. package/migrations/004_inbox_upsert_rpc.sql +63 -0
  196. package/migrations/005_inbox_v4_refactor.pg.sql +53 -0
  197. package/migrations/005_inbox_v4_refactor.sqlite.sql +30 -0
  198. package/migrations/006_channel_deliveries.pg.sql +61 -0
  199. package/migrations/006_channel_deliveries.sqlite.sql +26 -0
  200. package/migrations/007_templates_bodies_jsonb.pg.sql +17 -0
  201. package/migrations/007_templates_bodies_jsonb.sqlite.sql +18 -0
  202. package/package.json +55 -13
  203. package/dist/lib/emailer/emailer.d.ts.map +0 -1
  204. package/dist/lib/emailer/emailer.js.map +0 -1
  205. package/dist/lib/emailer/index.d.ts +0 -12
  206. package/dist/lib/emailer/index.d.ts.map +0 -1
  207. package/dist/lib/emailer/index.js +0 -13
  208. package/dist/lib/emailer/index.js.map +0 -1
  209. package/dist/lib/emailer/providers/index.d.ts.map +0 -1
  210. package/dist/lib/emailer/providers/index.js.map +0 -1
  211. package/dist/lib/emailer/providers/pop3_provider.d.ts.map +0 -1
  212. package/dist/lib/emailer/providers/pop3_provider.js.map +0 -1
  213. package/dist/lib/emailer/providers/smtp_provider.d.ts.map +0 -1
  214. package/dist/lib/emailer/providers/smtp_provider.js.map +0 -1
  215. package/dist/lib/emailer/providers/zeptomail_provider.d.ts.map +0 -1
  216. package/dist/lib/emailer/providers/zeptomail_provider.js.map +0 -1
  217. package/dist/lib/emailer/types.d.ts.map +0 -1
  218. package/dist/lib/emailer/types.js.map +0 -1
  219. package/dist/lib/emailer/utils/constants.d.ts.map +0 -1
  220. package/dist/lib/emailer/utils/constants.js.map +0 -1
  221. package/dist/lib/emailer/utils/index.d.ts.map +0 -1
  222. package/dist/lib/emailer/utils/index.js.map +0 -1
  223. package/dist/lib/emailer/utils/logger.d.ts.map +0 -1
  224. package/dist/lib/emailer/utils/logger.js.map +0 -1
  225. package/dist/lib/emailer/utils/validation.d.ts.map +0 -1
  226. package/dist/lib/emailer/utils/validation.js.map +0 -1
  227. /package/dist/lib/{emailer → adapters/email}/providers/index.d.ts +0 -0
  228. /package/dist/lib/{emailer → adapters/email}/providers/index.js +0 -0
  229. /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.d.ts +0 -0
  230. /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.js +0 -0
  231. /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.d.ts +0 -0
  232. /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.js +0 -0
  233. /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.d.ts +0 -0
  234. /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.js +0 -0
  235. /package/dist/lib/{emailer → adapters/email}/types.d.ts +0 -0
  236. /package/dist/lib/{emailer → adapters/email}/types.js +0 -0
  237. /package/dist/lib/{emailer → adapters/email}/utils/constants.d.ts +0 -0
  238. /package/dist/lib/{emailer → adapters/email}/utils/constants.js +0 -0
  239. /package/dist/lib/{emailer → adapters/email}/utils/index.d.ts +0 -0
  240. /package/dist/lib/{emailer → adapters/email}/utils/index.js +0 -0
  241. /package/dist/lib/{emailer → adapters/email}/utils/logger.d.ts +0 -0
  242. /package/dist/lib/{emailer → adapters/email}/utils/logger.js +0 -0
  243. /package/dist/lib/{emailer → adapters/email}/utils/validation.d.ts +0 -0
  244. /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":"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"}
@@ -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"}