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":"flush.js","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/flush.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Template body renderer for channel adapters (worker side).
3
+ *
4
+ * Called by the worker before handing a row to an adapter. Pre-renders
5
+ * template bodies so adapters receive `ctx.rendered_bodies` already
6
+ * populated — adapters never import template_manager themselves.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { ChannelAdapter } from "../../channels/types.js";
11
+ /**
12
+ * Render template bodies for a claimed delivery row.
13
+ *
14
+ * Returns an object keyed by body key (subset of adapter.capabilities.template_body_keys).
15
+ * Returns an empty object when the payload has no template_name (caller used pre-rendered bodies).
16
+ *
17
+ * @throws Error when template_name is specified but not found.
18
+ */
19
+ export declare function renderForChannel(adapter: ChannelAdapter, row: {
20
+ scope_id: string;
21
+ payload: Record<string, unknown>;
22
+ }): Promise<Record<string, string>>;
23
+ //# sourceMappingURL=render.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.d.ts","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAOH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAmB9D;;;;;;;GAOG;AACH,wBAAsB,gBAAgB,CACpC,OAAO,EAAE,cAAc,EACvB,GAAG,EAAE;IAAE,QAAQ,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAAE,GAC1D,OAAO,CAAC,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CA2BjC"}
@@ -0,0 +1,58 @@
1
+ /**
2
+ * Template body renderer for channel adapters (worker side).
3
+ *
4
+ * Called by the worker before handing a row to an adapter. Pre-renders
5
+ * template bodies so adapters receive `ctx.rendered_bodies` already
6
+ * populated — adapters never import template_manager themselves.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { QueryBuilder } from "hazo_connect/server";
11
+ import { get_template_by_name } from "../../template_manager/db/index.js";
12
+ import { render_handlebars_string } from "../../template_manager/engine/index.js";
13
+ import { getInboxConnection } from "../connection.js";
14
+ // Bridge inbox's HazoConnectAdapter to template_manager's HazoConnectInstance facade.
15
+ // template_manager only calls .query()/.list() on this; other facade methods are unused
16
+ // in this path. The HazoConnectInstance contract is preserved as an internal facade
17
+ // for template_manager (see template_manager/types.ts JSDoc).
18
+ function asTemplateManagerInstance(adapter) {
19
+ return {
20
+ query: () => new QueryBuilder(),
21
+ list: async (qb) => (await adapter.query(qb, "GET")),
22
+ findById: async () => { throw new Error("asTemplateManagerInstance: findById not implemented"); },
23
+ findBy: async () => { throw new Error("asTemplateManagerInstance: findBy not implemented"); },
24
+ insert: async () => { throw new Error("asTemplateManagerInstance: insert not implemented"); },
25
+ updateById: async () => { throw new Error("asTemplateManagerInstance: updateById not implemented"); },
26
+ deleteById: async () => { throw new Error("asTemplateManagerInstance: deleteById not implemented"); },
27
+ };
28
+ }
29
+ /**
30
+ * Render template bodies for a claimed delivery row.
31
+ *
32
+ * Returns an object keyed by body key (subset of adapter.capabilities.template_body_keys).
33
+ * Returns an empty object when the payload has no template_name (caller used pre-rendered bodies).
34
+ *
35
+ * @throws Error when template_name is specified but not found.
36
+ */
37
+ export async function renderForChannel(adapter, row) {
38
+ const payload = row.payload;
39
+ if (!payload.template_name)
40
+ return {};
41
+ const conn = asTemplateManagerInstance(getInboxConnection());
42
+ const scope_chain = row.scope_id ? [row.scope_id] : [];
43
+ const result = await get_template_by_name(conn, scope_chain, payload.template_name);
44
+ const template = result.data;
45
+ if (!template)
46
+ throw new Error(`template not found: ${payload.template_name}`);
47
+ const tpl_bodies = template.bodies ?? {};
48
+ const vars = (payload.template_vars ?? {});
49
+ const bodies = {};
50
+ for (const key of adapter.capabilities.template_body_keys) {
51
+ const source = tpl_bodies[key];
52
+ if (typeof source === "string" && source.length > 0) {
53
+ bodies[key] = render_handlebars_string(source, vars);
54
+ }
55
+ }
56
+ return bodies;
57
+ }
58
+ //# sourceMappingURL=render.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"render.js","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/render.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,YAAY,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,EAAE,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAItD,sFAAsF;AACtF,wFAAwF;AACxF,oFAAoF;AACpF,8DAA8D;AAC9D,SAAS,yBAAyB,CAAC,OAA2B;IAC5D,OAAO;QACL,KAAK,EAAE,GAAG,EAAE,CAAC,IAAI,YAAY,EAAyD;QACtF,IAAI,EAAE,KAAK,EAAK,EAAW,EAAE,EAAE,CAAC,CAAC,MAAM,OAAO,CAAC,KAAK,CAAC,EAAkB,EAAE,KAAK,CAAC,CAAQ;QACvF,QAAQ,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,qDAAqD,CAAC,CAAC,CAAC,CAAC;QACjG,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC;QAC7F,MAAM,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,mDAAmD,CAAC,CAAC,CAAC,CAAC;QAC7F,UAAU,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC,CAAC;QACrG,UAAU,EAAE,KAAK,IAAI,EAAE,GAAG,MAAM,IAAI,KAAK,CAAC,uDAAuD,CAAC,CAAC,CAAC,CAAC;KACtG,CAAC;AACJ,CAAC;AAED;;;;;;;GAOG;AACH,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACpC,OAAuB,EACvB,GAA2D;IAE3D,MAAM,OAAO,GAAG,GAAG,CAAC,OAGnB,CAAC;IAEF,IAAI,CAAC,OAAO,CAAC,aAAa;QAAE,OAAO,EAAE,CAAC;IAEtC,MAAM,IAAI,GAAG,yBAAyB,CAAC,kBAAkB,EAAE,CAAC,CAAC;IAC7D,MAAM,WAAW,GAAG,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACvD,MAAM,MAAM,GAAG,MAAM,oBAAoB,CAAC,IAAI,EAAE,WAAW,EAAE,OAAO,CAAC,aAAa,CAAC,CAAC;IAEpF,MAAM,QAAQ,GAAI,MAA+C,CAAC,IAAI,CAAC;IACvE,IAAI,CAAC,QAAQ;QAAE,MAAM,IAAI,KAAK,CAAC,uBAAuB,OAAO,CAAC,aAAa,EAAE,CAAC,CAAC;IAE/E,MAAM,UAAU,GAAI,QAAgD,CAAC,MAAM,IAAI,EAAE,CAAC;IAClF,MAAM,IAAI,GAAG,CAAC,OAAO,CAAC,aAAa,IAAI,EAAE,CAA4B,CAAC;IACtE,MAAM,MAAM,GAA2B,EAAE,CAAC;IAE1C,KAAK,MAAM,GAAG,IAAI,OAAO,CAAC,YAAY,CAAC,kBAAkB,EAAE,CAAC;QAC1D,MAAM,MAAM,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC;QAC/B,IAAI,OAAO,MAAM,KAAK,QAAQ,IAAI,MAAM,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;YACpD,MAAM,CAAC,GAAG,CAAC,GAAG,wBAAwB,CAAC,MAAM,EAAE,IAA8B,CAAC,CAAC;QACjF,CAAC;IACH,CAAC;IAED,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,29 @@
1
+ /**
2
+ * Boot-time inbox worker. Spawns one sub-worker timer per registered channel,
3
+ * a batch-close sweep timer, and a cleanup sweep timer.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ import { type FlushResult } from "./flush.js";
8
+ import type { ChannelLogger, ScopeBranding } from "../../channels/types.js";
9
+ export interface StartInboxWorkerOptions {
10
+ resolveRecipient: (user_id: string, scope_id: string, channel_id: string) => Promise<string | null>;
11
+ resolveScopeBranding?: (scope_id: string) => Promise<ScopeBranding | null>;
12
+ channel_overrides?: Record<string, {
13
+ interval_ms?: number;
14
+ batch_size?: number;
15
+ concurrency?: number;
16
+ }>;
17
+ default_batch_window_ms?: number;
18
+ batch_close_sweep_ms?: number;
19
+ cleanup_interval_ms?: number;
20
+ read_inbox_retention_ms?: number;
21
+ failed_delivery_retention_ms?: number;
22
+ logger?: ChannelLogger;
23
+ }
24
+ export interface WorkerHandle {
25
+ stop(): Promise<void>;
26
+ tickOnce(channel_id: string): Promise<FlushResult>;
27
+ }
28
+ export declare function startInboxWorker(opts: StartInboxWorkerOptions): WorkerHandle;
29
+ //# sourceMappingURL=start.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.d.ts","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/start.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,EAAoB,KAAK,WAAW,EAAE,MAAM,YAAY,CAAC;AAGhE,OAAO,KAAK,EAAE,aAAa,EAAE,aAAa,EAAE,MAAM,yBAAyB,CAAC;AAa5E,MAAM,WAAW,uBAAuB;IACtC,gBAAgB,EAAE,CAAC,OAAO,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,KAAK,OAAO,CAAC,MAAM,GAAG,IAAI,CAAC,CAAC;IACpG,oBAAoB,CAAC,EAAE,CAAC,QAAQ,EAAE,MAAM,KAAK,OAAO,CAAC,aAAa,GAAG,IAAI,CAAC,CAAC;IAC3E,iBAAiB,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE;QACjC,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,UAAU,CAAC,EAAE,MAAM,CAAC;QACpB,WAAW,CAAC,EAAE,MAAM,CAAC;KACtB,CAAC,CAAC;IACH,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IAC9B,mBAAmB,CAAC,EAAE,MAAM,CAAC;IAC7B,uBAAuB,CAAC,EAAE,MAAM,CAAC;IACjC,4BAA4B,CAAC,EAAE,MAAM,CAAC;IACtC,MAAM,CAAC,EAAE,aAAa,CAAC;CACxB;AAED,MAAM,WAAW,YAAY;IAC3B,IAAI,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;IACtB,QAAQ,CAAC,UAAU,EAAE,MAAM,GAAG,OAAO,CAAC,WAAW,CAAC,CAAC;CACpD;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,uBAAuB,GAAG,YAAY,CAsF5E"}
@@ -0,0 +1,100 @@
1
+ /**
2
+ * Boot-time inbox worker. Spawns one sub-worker timer per registered channel,
3
+ * a batch-close sweep timer, and a cleanup sweep timer.
4
+ *
5
+ * @packageDocumentation
6
+ */
7
+ import { flushChannelOnce } from "./flush.js";
8
+ import { runBatchCloseSweep, runCleanupSweep } from "./cleanup.js";
9
+ import { getRegisteredChannels } from "../../channels/registry.js";
10
+ const DEFAULTS = {
11
+ interval_ms: 30000,
12
+ batch_size: 50,
13
+ concurrency: 1,
14
+ batch_close_sweep_ms: 60000,
15
+ cleanup_interval_ms: 3600000,
16
+ read_inbox_retention_ms: 30 * 24 * 60 * 60 * 1000,
17
+ failed_delivery_retention_ms: 30 * 24 * 60 * 60 * 1000,
18
+ default_batch_window_ms: 5 * 60000,
19
+ };
20
+ export function startInboxWorker(opts) {
21
+ const log = opts.logger ?? console;
22
+ const channels = getRegisteredChannels();
23
+ if (channels.length === 0) {
24
+ log.error("inbox.worker_started_with_no_channels");
25
+ }
26
+ const timers = [];
27
+ const inflight = new Set();
28
+ let stopped = false;
29
+ // Per-channel sub-workers
30
+ for (const ch of channels) {
31
+ const o = opts.channel_overrides?.[ch.capabilities.channel_id] ?? {};
32
+ const interval_ms = o.interval_ms ?? DEFAULTS.interval_ms;
33
+ const batch_size = o.batch_size ?? DEFAULTS.batch_size;
34
+ const concurrency = o.concurrency ?? DEFAULTS.concurrency;
35
+ let polling = false;
36
+ const timer = setInterval(() => {
37
+ if (stopped || polling)
38
+ return;
39
+ polling = true;
40
+ const p = flushChannelOnce(ch.capabilities.channel_id, {
41
+ batchSize: batch_size,
42
+ concurrency,
43
+ resolveRecipient: opts.resolveRecipient,
44
+ resolveScopeBranding: opts.resolveScopeBranding,
45
+ logger: log,
46
+ })
47
+ .then(r => {
48
+ if (r.processed > 0) {
49
+ log.info("inbox.flush", { channel: ch.capabilities.channel_id, ...r });
50
+ }
51
+ })
52
+ .catch(e => log.error("inbox.flush_unhandled", {
53
+ channel: ch.capabilities.channel_id,
54
+ error: e instanceof Error ? e.message : String(e),
55
+ }))
56
+ .finally(() => { polling = false; });
57
+ inflight.add(p);
58
+ p.finally(() => inflight.delete(p));
59
+ }, interval_ms);
60
+ timers.push(timer);
61
+ }
62
+ // Batch-close sweep
63
+ const window_ms = opts.default_batch_window_ms ?? DEFAULTS.default_batch_window_ms;
64
+ timers.push(setInterval(() => {
65
+ if (stopped)
66
+ return;
67
+ const p = runBatchCloseSweep(window_ms, log);
68
+ inflight.add(p);
69
+ p.finally(() => inflight.delete(p));
70
+ }, opts.batch_close_sweep_ms ?? DEFAULTS.batch_close_sweep_ms));
71
+ // Cleanup sweep
72
+ timers.push(setInterval(() => {
73
+ if (stopped)
74
+ return;
75
+ const p = runCleanupSweep(opts.read_inbox_retention_ms ?? DEFAULTS.read_inbox_retention_ms, opts.failed_delivery_retention_ms ?? DEFAULTS.failed_delivery_retention_ms, log);
76
+ inflight.add(p);
77
+ p.finally(() => inflight.delete(p));
78
+ }, opts.cleanup_interval_ms ?? DEFAULTS.cleanup_interval_ms));
79
+ log.info("inbox.worker_started", {
80
+ channels: channels.map(c => c.capabilities.channel_id),
81
+ });
82
+ return {
83
+ async stop() {
84
+ stopped = true;
85
+ timers.forEach(t => clearInterval(t));
86
+ await Promise.all([...inflight]);
87
+ log.info("inbox.worker_stopped");
88
+ },
89
+ async tickOnce(channel_id) {
90
+ return flushChannelOnce(channel_id, {
91
+ batchSize: 100,
92
+ concurrency: 1,
93
+ resolveRecipient: opts.resolveRecipient,
94
+ resolveScopeBranding: opts.resolveScopeBranding,
95
+ logger: log,
96
+ });
97
+ },
98
+ };
99
+ }
100
+ //# sourceMappingURL=start.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"start.js","sourceRoot":"","sources":["../../../../src/lib/inbox/worker/start.ts"],"names":[],"mappings":"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"}
@@ -1,7 +1,2 @@
1
- /**
2
- * Main library exports
3
- * Entry point for the hazo_notify library
4
- */
5
- export * from './emailer/index.js';
6
- export * from './template_manager/index.js';
1
+ export * from "./template_manager/index.js";
7
2
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAGA,cAAc,6BAA6B,CAAC"}
package/dist/lib/index.js CHANGED
@@ -1,7 +1,5 @@
1
- /**
2
- * Main library exports
3
- * Entry point for the hazo_notify library
4
- */
5
- export * from './emailer/index.js';
6
- export * from './template_manager/index.js';
1
+ // src/lib/index.ts — v4.0.0
2
+ // send_email() is removed. Use dispatch() or instantiate EmailChannel directly.
3
+ // Template manager re-exports are kept for the existing subpath.
4
+ export * from "./template_manager/index.js";
7
5
  //# sourceMappingURL=index.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,cAAc,oBAAoB,CAAC;AACnC,cAAc,6BAA6B,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA,4BAA4B;AAC5B,gFAAgF;AAChF,iEAAiE;AACjE,cAAc,6BAA6B,CAAC"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Inbox flush job handler factory.
3
+ *
4
+ * Wraps `flushChannelOnce` in a hazo_jobs-compatible handler. The consuming
5
+ * app registers this handler against `INBOX_FLUSH_JOB_TYPE` when constructing
6
+ * their hazo_jobs worker process.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { FlushOptions, FlushResult } from "../inbox/worker/flush.js";
11
+ import type { HazoJobHandler, InboxFlushJobPayload } from "./types.js";
12
+ export interface CreateInboxFlushHandlerOptions {
13
+ /** Resolves the channel-specific recipient address for a (user, scope, channel). */
14
+ resolveRecipient: FlushOptions["resolveRecipient"];
15
+ /** Optional scope branding resolver (used by email envelope wrapping). */
16
+ resolveScopeBranding?: FlushOptions["resolveScopeBranding"];
17
+ /** Default batch size when the payload omits one. Defaults to 50. */
18
+ batch_size?: number;
19
+ /** Concurrency inside one flush tick. Defaults to 4. */
20
+ concurrency?: number;
21
+ /** Optional logger forwarded to the channel adapter. */
22
+ logger?: FlushOptions["logger"];
23
+ }
24
+ export declare function createInboxFlushHandler(opts: CreateInboxFlushHandlerOptions): HazoJobHandler<InboxFlushJobPayload, FlushResult>;
25
+ //# sourceMappingURL=handler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.d.ts","sourceRoot":"","sources":["../../../src/lib/jobs/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EAAE,YAAY,EAAE,WAAW,EAAE,MAAM,0BAA0B,CAAC;AAC1E,OAAO,KAAK,EACV,cAAc,EACd,oBAAoB,EACrB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,8BAA8B;IAC7C,oFAAoF;IACpF,gBAAgB,EAAE,YAAY,CAAC,kBAAkB,CAAC,CAAC;IACnD,0EAA0E;IAC1E,oBAAoB,CAAC,EAAE,YAAY,CAAC,sBAAsB,CAAC,CAAC;IAC5D,qEAAqE;IACrE,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB,wDAAwD;IACxD,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wDAAwD;IACxD,MAAM,CAAC,EAAE,YAAY,CAAC,QAAQ,CAAC,CAAC;CACjC;AAED,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,8BAA8B,GACnC,cAAc,CAAC,oBAAoB,EAAE,WAAW,CAAC,CAiCnD"}
@@ -0,0 +1,36 @@
1
+ /**
2
+ * Inbox flush job handler factory.
3
+ *
4
+ * Wraps `flushChannelOnce` in a hazo_jobs-compatible handler. The consuming
5
+ * app registers this handler against `INBOX_FLUSH_JOB_TYPE` when constructing
6
+ * their hazo_jobs worker process.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { flushChannelOnce } from "../inbox/worker/flush.js";
11
+ export function createInboxFlushHandler(opts) {
12
+ const default_batch_size = opts.batch_size ?? 50;
13
+ const concurrency = opts.concurrency ?? 4;
14
+ return async function inbox_flush_handler(job, log) {
15
+ // SQLite-backed hazo_jobs stores payload as a JSON string and does not
16
+ // currently deserialize it before invoking handlers. Parse defensively so
17
+ // the handler works on both SQLite (string payload) and Postgres (JSONB
18
+ // object payload).
19
+ const payload = typeof job.payload === "string"
20
+ ? JSON.parse(job.payload)
21
+ : job.payload;
22
+ const channel_id = payload.channel_id;
23
+ const batchSize = payload.batch_size ?? default_batch_size;
24
+ log?.info?.(`[hazo_notify] inbox_flush start channel=${channel_id} batchSize=${batchSize}`);
25
+ const result = await flushChannelOnce(channel_id, {
26
+ batchSize,
27
+ concurrency,
28
+ resolveRecipient: opts.resolveRecipient,
29
+ resolveScopeBranding: opts.resolveScopeBranding,
30
+ logger: opts.logger,
31
+ });
32
+ log?.info?.(`[hazo_notify] inbox_flush done channel=${channel_id} processed=${result.processed} sent=${result.sent} failed=${result.failed} retried=${result.retried}`);
33
+ return result;
34
+ };
35
+ }
36
+ //# sourceMappingURL=handler.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"handler.js","sourceRoot":"","sources":["../../../src/lib/jobs/handler.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,gBAAgB,EAAE,MAAM,0BAA0B,CAAC;AAoB5D,MAAM,UAAU,uBAAuB,CACrC,IAAoC;IAEpC,MAAM,kBAAkB,GAAG,IAAI,CAAC,UAAU,IAAI,EAAE,CAAC;IACjD,MAAM,WAAW,GAAG,IAAI,CAAC,WAAW,IAAI,CAAC,CAAC;IAE1C,OAAO,KAAK,UAAU,mBAAmB,CAAC,GAAG,EAAE,GAAG;QAChD,uEAAuE;QACvE,0EAA0E;QAC1E,wEAAwE;QACxE,mBAAmB;QACnB,MAAM,OAAO,GACX,OAAO,GAAG,CAAC,OAAO,KAAK,QAAQ;YAC7B,CAAC,CAAE,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,OAAO,CAA0B;YACnD,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC;QAClB,MAAM,UAAU,GAAG,OAAO,CAAC,UAAU,CAAC;QACtC,MAAM,SAAS,GAAG,OAAO,CAAC,UAAU,IAAI,kBAAkB,CAAC;QAE3D,GAAG,EAAE,IAAI,EAAE,CACT,2CAA2C,UAAU,cAAc,SAAS,EAAE,CAC/E,CAAC;QAEF,MAAM,MAAM,GAAG,MAAM,gBAAgB,CAAC,UAAU,EAAE;YAChD,SAAS;YACT,WAAW;YACX,gBAAgB,EAAE,IAAI,CAAC,gBAAgB;YACvC,oBAAoB,EAAE,IAAI,CAAC,oBAAoB;YAC/C,MAAM,EAAE,IAAI,CAAC,MAAM;SACpB,CAAC,CAAC;QAEH,GAAG,EAAE,IAAI,EAAE,CACT,0CAA0C,UAAU,cAAc,MAAM,CAAC,SAAS,SAAS,MAAM,CAAC,IAAI,WAAW,MAAM,CAAC,MAAM,YAAY,MAAM,CAAC,OAAO,EAAE,CAC3J,CAAC;QACF,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;AACJ,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * hazo_notify/jobs — hazo_jobs integration surface.
3
+ *
4
+ * Consumers register `createInboxFlushHandler(...)` with their hazo_jobs
5
+ * worker for job type `INBOX_FLUSH_JOB_TYPE`, then call
6
+ * `submitInboxFlushJobs(jobsClient, ...)` to enqueue work.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ export { INBOX_FLUSH_JOB_TYPE, } from "./types.js";
11
+ export type { InboxFlushJobPayload, HazoJob, HazoJobLogger, HazoJobHandler, HazoJobsSubmitter, } from "./types.js";
12
+ export { createInboxFlushHandler } from "./handler.js";
13
+ export type { CreateInboxFlushHandlerOptions } from "./handler.js";
14
+ export { submitInboxFlushJobs } from "./submit.js";
15
+ export type { SubmitInboxFlushJobsParams } from "./submit.js";
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/lib/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,oBAAoB,GACrB,MAAM,YAAY,CAAC;AACpB,YAAY,EACV,oBAAoB,EACpB,OAAO,EACP,aAAa,EACb,cAAc,EACd,iBAAiB,GAClB,MAAM,YAAY,CAAC;AACpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AACvD,YAAY,EAAE,8BAA8B,EAAE,MAAM,cAAc,CAAC;AACnE,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,0BAA0B,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * hazo_notify/jobs — hazo_jobs integration surface.
3
+ *
4
+ * Consumers register `createInboxFlushHandler(...)` with their hazo_jobs
5
+ * worker for job type `INBOX_FLUSH_JOB_TYPE`, then call
6
+ * `submitInboxFlushJobs(jobsClient, ...)` to enqueue work.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ export { INBOX_FLUSH_JOB_TYPE, } from "./types.js";
11
+ export { createInboxFlushHandler } from "./handler.js";
12
+ export { submitInboxFlushJobs } from "./submit.js";
13
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/lib/jobs/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EACL,oBAAoB,GACrB,MAAM,YAAY,CAAC;AAQpB,OAAO,EAAE,uBAAuB,EAAE,MAAM,cAAc,CAAC;AAEvD,OAAO,EAAE,oBAAoB,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * Helper to enqueue inbox-flush jobs.
3
+ *
4
+ * Consumers call this immediately after `dispatch(...)` so a flush job is
5
+ * queued for every enabled channel. The worker process — registered with
6
+ * `createInboxFlushHandler` — picks the jobs up.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import type { HazoJobsSubmitter } from "./types.js";
11
+ export interface SubmitInboxFlushJobsParams {
12
+ /** Channel ids to flush (e.g. ["email", "telegram"]). */
13
+ channels: string[];
14
+ /** Optional batch size hint forwarded to the handler. */
15
+ batch_size?: number;
16
+ }
17
+ export declare function submitInboxFlushJobs(jobs: HazoJobsSubmitter, params: SubmitInboxFlushJobsParams): Promise<{
18
+ jobIds: string[];
19
+ }>;
20
+ //# sourceMappingURL=submit.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.d.ts","sourceRoot":"","sources":["../../../src/lib/jobs/submit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAGH,OAAO,KAAK,EACV,iBAAiB,EAElB,MAAM,YAAY,CAAC;AAEpB,MAAM,WAAW,0BAA0B;IACzC,yDAAyD;IACzD,QAAQ,EAAE,MAAM,EAAE,CAAC;IACnB,yDAAyD;IACzD,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,wBAAsB,oBAAoB,CACxC,IAAI,EAAE,iBAAiB,EACvB,MAAM,EAAE,0BAA0B,GACjC,OAAO,CAAC;IAAE,MAAM,EAAE,MAAM,EAAE,CAAA;CAAE,CAAC,CAc/B"}
@@ -0,0 +1,25 @@
1
+ /**
2
+ * Helper to enqueue inbox-flush jobs.
3
+ *
4
+ * Consumers call this immediately after `dispatch(...)` so a flush job is
5
+ * queued for every enabled channel. The worker process — registered with
6
+ * `createInboxFlushHandler` — picks the jobs up.
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ import { INBOX_FLUSH_JOB_TYPE } from "./types.js";
11
+ export async function submitInboxFlushJobs(jobs, params) {
12
+ const jobIds = [];
13
+ for (const channel_id of params.channels) {
14
+ const payload = params.batch_size != null
15
+ ? { channel_id, batch_size: params.batch_size }
16
+ : { channel_id };
17
+ const { jobId } = await jobs.submit({
18
+ type: INBOX_FLUSH_JOB_TYPE,
19
+ payload,
20
+ });
21
+ jobIds.push(jobId);
22
+ }
23
+ return { jobIds };
24
+ }
25
+ //# sourceMappingURL=submit.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"submit.js","sourceRoot":"","sources":["../../../src/lib/jobs/submit.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAalD,MAAM,CAAC,KAAK,UAAU,oBAAoB,CACxC,IAAuB,EACvB,MAAkC;IAElC,MAAM,MAAM,GAAa,EAAE,CAAC;IAC5B,KAAK,MAAM,UAAU,IAAI,MAAM,CAAC,QAAQ,EAAE,CAAC;QACzC,MAAM,OAAO,GACX,MAAM,CAAC,UAAU,IAAI,IAAI;YACvB,CAAC,CAAC,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,CAAC,UAAU,EAAE;YAC/C,CAAC,CAAC,EAAE,UAAU,EAAE,CAAC;QACrB,MAAM,EAAE,KAAK,EAAE,GAAG,MAAM,IAAI,CAAC,MAAM,CAAC;YAClC,IAAI,EAAE,oBAAoB;YAC1B,OAAO;SACR,CAAC,CAAC;QACH,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;IACrB,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,CAAC;AACpB,CAAC"}
@@ -0,0 +1,42 @@
1
+ /**
2
+ * hazo_jobs integration types.
3
+ *
4
+ * Job types and structural interfaces for `hazo_jobs` compatibility. Declared
5
+ * locally so the package does not require a runtime `import` of `hazo_jobs`
6
+ * (which is an optional peer dep).
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ /** Stable job type registered with hazo_jobs. */
11
+ export declare const INBOX_FLUSH_JOB_TYPE = "hazo_notify.inbox_flush";
12
+ /** Payload shape submitted by `submitInboxFlushJobs`. */
13
+ export interface InboxFlushJobPayload {
14
+ channel_id: string;
15
+ batch_size?: number;
16
+ }
17
+ /** Minimal hazo_jobs `Job` shape the handler receives. */
18
+ export interface HazoJob<P = unknown> {
19
+ id: string;
20
+ payload: P;
21
+ }
22
+ /** Minimal hazo_jobs `Logger` shape (optional second arg to handlers). */
23
+ export interface HazoJobLogger {
24
+ info?: (...args: unknown[]) => void;
25
+ warn?: (...args: unknown[]) => void;
26
+ error?: (...args: unknown[]) => void;
27
+ }
28
+ /** Structural match for hazo_jobs `JobHandler<P, R>`. */
29
+ export type HazoJobHandler<P = unknown, R = unknown> = (job: HazoJob<P>, log?: HazoJobLogger) => Promise<R>;
30
+ /** Structural subset of hazo_jobs `JobsClient.submit`. */
31
+ export interface HazoJobsSubmitter {
32
+ submit(opts: {
33
+ type: string;
34
+ payload?: unknown;
35
+ priority?: number;
36
+ maxAttempts?: number;
37
+ expiresInSec?: number;
38
+ }): Promise<{
39
+ jobId: string;
40
+ }>;
41
+ }
42
+ //# sourceMappingURL=types.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../../../src/lib/jobs/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iDAAiD;AACjD,eAAO,MAAM,oBAAoB,4BAA4B,CAAC;AAE9D,yDAAyD;AACzD,MAAM,WAAW,oBAAoB;IACnC,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,CAAC,EAAE,MAAM,CAAC;CACrB;AAED,0DAA0D;AAC1D,MAAM,WAAW,OAAO,CAAC,CAAC,GAAG,OAAO;IAClC,EAAE,EAAE,MAAM,CAAC;IACX,OAAO,EAAE,CAAC,CAAC;CACZ;AAED,0EAA0E;AAC1E,MAAM,WAAW,aAAa;IAC5B,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,IAAI,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;IACpC,KAAK,CAAC,EAAE,CAAC,GAAG,IAAI,EAAE,OAAO,EAAE,KAAK,IAAI,CAAC;CACtC;AAED,yDAAyD;AACzD,MAAM,MAAM,cAAc,CAAC,CAAC,GAAG,OAAO,EAAE,CAAC,GAAG,OAAO,IAAI,CACrD,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,EACf,GAAG,CAAC,EAAE,aAAa,KAChB,OAAO,CAAC,CAAC,CAAC,CAAC;AAEhB,0DAA0D;AAC1D,MAAM,WAAW,iBAAiB;IAChC,MAAM,CAAC,IAAI,EAAE;QACX,IAAI,EAAE,MAAM,CAAC;QACb,OAAO,CAAC,EAAE,OAAO,CAAC;QAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;QAClB,WAAW,CAAC,EAAE,MAAM,CAAC;QACrB,YAAY,CAAC,EAAE,MAAM,CAAC;KACvB,GAAG,OAAO,CAAC;QAAE,KAAK,EAAE,MAAM,CAAA;KAAE,CAAC,CAAC;CAChC"}
@@ -0,0 +1,12 @@
1
+ /**
2
+ * hazo_jobs integration types.
3
+ *
4
+ * Job types and structural interfaces for `hazo_jobs` compatibility. Declared
5
+ * locally so the package does not require a runtime `import` of `hazo_jobs`
6
+ * (which is an optional peer dep).
7
+ *
8
+ * @packageDocumentation
9
+ */
10
+ /** Stable job type registered with hazo_jobs. */
11
+ export const INBOX_FLUSH_JOB_TYPE = "hazo_notify.inbox_flush";
12
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../src/lib/jobs/types.ts"],"names":[],"mappings":"AAAA;;;;;;;;GAQG;AAEH,iDAAiD;AACjD,MAAM,CAAC,MAAM,oBAAoB,GAAG,yBAAyB,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"template_repository.d.ts","sourceRoot":"","sources":["../../../../src/lib/template_manager/db/template_repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAarB;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,mBAAmB,EACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,yBAAyB,CAAC,aAAa,EAAE,CAAC,CAAC,CA8DrD;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,yBAAyB,CAAC,aAAa,EAAE,CAAC,CAAC,CAoErD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,mBAAmB,EACjC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CA4CnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,MAAM,EAAE,EACrB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CAgFnD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,mBAAmB,EACjC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CAuFnD;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,mBAAmB,EACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CA8GnD;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,mBAAmB,EACjC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CA8C7C"}
1
+ {"version":3,"file":"template_repository.d.ts","sourceRoot":"","sources":["../../../../src/lib/template_manager/db/template_repository.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAEH,OAAO,KAAK,EACV,mBAAmB,EACnB,aAAa,EACb,kBAAkB,EAClB,mBAAmB,EACnB,yBAAyB,EAC1B,MAAM,aAAa,CAAC;AAYrB;;;;;;;;GAQG;AACH,wBAAsB,cAAc,CAClC,YAAY,EAAE,mBAAmB,EACjC,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,yBAAyB,CAAC,aAAa,EAAE,CAAC,CAAC,CA8DrD;AAED;;;;;;GAMG;AACH,wBAAsB,0BAA0B,CAC9C,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,MAAM,EACnB,QAAQ,CAAC,EAAE,MAAM,GAAG,IAAI,GACvB,OAAO,CAAC,yBAAyB,CAAC,aAAa,EAAE,CAAC,CAAC,CAoErD;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAChC,YAAY,EAAE,mBAAmB,EACjC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CA4CnD;AAED;;;;;;;;;;;GAWG;AACH,wBAAsB,oBAAoB,CACxC,YAAY,EAAE,mBAAmB,EACjC,WAAW,EAAE,MAAM,EAAE,EACrB,aAAa,EAAE,MAAM,GACpB,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CAgFnD;AAED;;;;;;GAMG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,mBAAmB,EACjC,IAAI,EAAE,kBAAkB,GACvB,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CA+EnD;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,mBAAmB,EACjC,EAAE,EAAE,MAAM,EACV,IAAI,EAAE,mBAAmB,GACxB,OAAO,CAAC,yBAAyB,CAAC,aAAa,CAAC,CAAC,CAgGnD;AAED;;;;;;;GAOG;AACH,wBAAsB,eAAe,CACnC,YAAY,EAAE,mBAAmB,EACjC,EAAE,EAAE,MAAM,GACT,OAAO,CAAC,yBAAyB,CAAC,OAAO,CAAC,CAAC,CA8C7C"}
@@ -5,7 +5,7 @@
5
5
  * Uses scope_id (null = global) for hierarchical template resolution.
6
6
  */
7
7
  import { TABLE_TEMPLATES, TABLE_TEMPLATE_CATEGORY, ERROR_MESSAGES, } from '../config/constants.js';
8
- import { validate_template_name, validate_uuid, validate_template_html_size, validate_template_text_size, } from '../utils/validation.js';
8
+ import { validate_template_name, validate_uuid, validate_template_bodies_size, } from '../utils/validation.js';
9
9
  /**
10
10
  * List all templates visible for a given scope (scoped rows + global rows).
11
11
  * When scope_id is provided, scoped rows override global rows with the same
@@ -314,18 +314,12 @@ export async function create_template(hazo_connect, data) {
314
314
  message: 'Invalid category ID format',
315
315
  };
316
316
  }
317
- if (!validate_template_html_size(data.template_html)) {
317
+ const bodies_check = validate_template_bodies_size(data.bodies);
318
+ if (!bodies_check.ok) {
318
319
  return {
319
320
  success: false,
320
321
  error: ERROR_MESSAGES.TEMPLATE_HTML_TOO_LARGE,
321
- message: ERROR_MESSAGES.TEMPLATE_HTML_TOO_LARGE,
322
- };
323
- }
324
- if (!validate_template_text_size(data.template_text)) {
325
- return {
326
- success: false,
327
- error: ERROR_MESSAGES.TEMPLATE_TEXT_TOO_LARGE,
328
- message: ERROR_MESSAGES.TEMPLATE_TEXT_TOO_LARGE,
322
+ message: `Template body "${bodies_check.offending_key}" exceeds size limit`,
329
323
  };
330
324
  }
331
325
  // Check that the category exists
@@ -342,8 +336,7 @@ export async function create_template(hazo_connect, data) {
342
336
  template_category_id: data.template_category_id,
343
337
  template_variables: data.template_variables || [],
344
338
  template_name: data.template_name.trim(),
345
- template_html: data.template_html,
346
- template_text: data.template_text,
339
+ bodies: data.bodies,
347
340
  is_modified: false,
348
341
  });
349
342
  return {
@@ -409,21 +402,15 @@ export async function update_template(hazo_connect, id, data) {
409
402
  message: 'Invalid category ID format',
410
403
  };
411
404
  }
412
- if (data.template_html !== undefined &&
413
- !validate_template_html_size(data.template_html)) {
414
- return {
415
- success: false,
416
- error: ERROR_MESSAGES.TEMPLATE_HTML_TOO_LARGE,
417
- message: ERROR_MESSAGES.TEMPLATE_HTML_TOO_LARGE,
418
- };
419
- }
420
- if (data.template_text !== undefined &&
421
- !validate_template_text_size(data.template_text)) {
422
- return {
423
- success: false,
424
- error: ERROR_MESSAGES.TEMPLATE_TEXT_TOO_LARGE,
425
- message: ERROR_MESSAGES.TEMPLATE_TEXT_TOO_LARGE,
426
- };
405
+ if (data.bodies !== undefined) {
406
+ const bodies_check = validate_template_bodies_size(data.bodies);
407
+ if (!bodies_check.ok) {
408
+ return {
409
+ success: false,
410
+ error: ERROR_MESSAGES.TEMPLATE_HTML_TOO_LARGE,
411
+ message: `Template body "${bodies_check.offending_key}" exceeds size limit`,
412
+ };
413
+ }
427
414
  }
428
415
  const patch = {
429
416
  changed_at: new Date().toISOString(),
@@ -434,10 +421,8 @@ export async function update_template(hazo_connect, id, data) {
434
421
  patch.template_category_id = data.template_category_id;
435
422
  if (data.template_variables !== undefined)
436
423
  patch.template_variables = data.template_variables;
437
- if (data.template_html !== undefined)
438
- patch.template_html = data.template_html;
439
- if (data.template_text !== undefined)
440
- patch.template_text = data.template_text;
424
+ if (data.bodies !== undefined)
425
+ patch.bodies = data.bodies;
441
426
  if (data.is_modified !== undefined)
442
427
  patch.is_modified = data.is_modified;
443
428
  const template = await hazo_connect.updateById(TABLE_TEMPLATES, id, patch);