hazo_notify 3.0.0 → 4.0.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +122 -17
- package/config/hazo_notify_config.ini +37 -0
- package/dist/components/notification_banner/index.d.ts +27 -0
- package/dist/components/notification_banner/index.d.ts.map +1 -0
- package/dist/components/notification_banner/index.js +42 -0
- package/dist/components/notification_banner/index.js.map +1 -0
- package/dist/components/notification_bell/index.d.ts +56 -0
- package/dist/components/notification_bell/index.d.ts.map +1 -0
- package/dist/components/notification_bell/index.js +73 -0
- package/dist/components/notification_bell/index.js.map +1 -0
- package/dist/components/template_manager/template_editor.js +3 -3
- package/dist/components/template_manager/template_editor.js.map +1 -1
- package/dist/components/template_manager/template_manager_admin.d.ts.map +1 -1
- package/dist/components/template_manager/template_manager_admin.js +3 -4
- package/dist/components/template_manager/template_manager_admin.js.map +1 -1
- package/dist/lib/adapters/email/adapter.d.ts +49 -0
- package/dist/lib/adapters/email/adapter.d.ts.map +1 -0
- package/dist/lib/adapters/email/adapter.js +87 -0
- package/dist/lib/adapters/email/adapter.js.map +1 -0
- package/dist/lib/adapters/email/config.d.ts +15 -0
- package/dist/lib/adapters/email/config.d.ts.map +1 -0
- package/dist/lib/{emailer/emailer.js → adapters/email/config.js} +7 -113
- package/dist/lib/adapters/email/config.js.map +1 -0
- package/dist/lib/adapters/email/envelope.d.ts +29 -0
- package/dist/lib/adapters/email/envelope.d.ts.map +1 -0
- package/dist/lib/adapters/email/envelope.js +46 -0
- package/dist/lib/adapters/email/envelope.js.map +1 -0
- package/dist/lib/adapters/email/index.d.ts +12 -0
- package/dist/lib/adapters/email/index.d.ts.map +1 -0
- package/dist/lib/adapters/email/index.js +11 -0
- package/dist/lib/adapters/email/index.js.map +1 -0
- package/dist/lib/adapters/email/providers/index.d.ts.map +1 -0
- package/dist/lib/adapters/email/providers/index.js.map +1 -0
- package/dist/lib/adapters/email/providers/pop3_provider.d.ts.map +1 -0
- package/dist/lib/adapters/email/providers/pop3_provider.js.map +1 -0
- package/dist/lib/adapters/email/providers/smtp_provider.d.ts.map +1 -0
- package/dist/lib/adapters/email/providers/smtp_provider.js.map +1 -0
- package/dist/lib/adapters/email/providers/zeptomail_provider.d.ts.map +1 -0
- package/dist/lib/adapters/email/providers/zeptomail_provider.js.map +1 -0
- package/dist/lib/{emailer/emailer.d.ts → adapters/email/send_email.d.ts} +9 -10
- package/dist/lib/adapters/email/send_email.d.ts.map +1 -0
- package/dist/lib/adapters/email/send_email.js +122 -0
- package/dist/lib/adapters/email/send_email.js.map +1 -0
- package/dist/lib/adapters/email/types.d.ts.map +1 -0
- package/dist/lib/adapters/email/types.js.map +1 -0
- package/dist/lib/adapters/email/utils/constants.d.ts.map +1 -0
- package/dist/lib/adapters/email/utils/constants.js.map +1 -0
- package/dist/lib/adapters/email/utils/index.d.ts.map +1 -0
- package/dist/lib/adapters/email/utils/index.js.map +1 -0
- package/dist/lib/adapters/email/utils/logger.d.ts.map +1 -0
- package/dist/lib/adapters/email/utils/logger.js.map +1 -0
- package/dist/lib/adapters/email/utils/validation.d.ts.map +1 -0
- package/dist/lib/adapters/email/utils/validation.js.map +1 -0
- package/dist/lib/adapters/telegram/adapter.d.ts +25 -0
- package/dist/lib/adapters/telegram/adapter.d.ts.map +1 -0
- package/dist/lib/adapters/telegram/adapter.js +75 -0
- package/dist/lib/adapters/telegram/adapter.js.map +1 -0
- package/dist/lib/adapters/telegram/config.d.ts +22 -0
- package/dist/lib/adapters/telegram/config.d.ts.map +1 -0
- package/dist/lib/adapters/telegram/config.js +60 -0
- package/dist/lib/adapters/telegram/config.js.map +1 -0
- package/dist/lib/adapters/telegram/index.d.ts +8 -0
- package/dist/lib/adapters/telegram/index.d.ts.map +1 -0
- package/dist/lib/adapters/telegram/index.js +5 -0
- package/dist/lib/adapters/telegram/index.js.map +1 -0
- package/dist/lib/adapters/telegram/splitter.d.ts +7 -0
- package/dist/lib/adapters/telegram/splitter.d.ts.map +1 -0
- package/dist/lib/adapters/telegram/splitter.js +47 -0
- package/dist/lib/adapters/telegram/splitter.js.map +1 -0
- package/dist/lib/adapters/telegram/transport.d.ts +31 -0
- package/dist/lib/adapters/telegram/transport.d.ts.map +1 -0
- package/dist/lib/adapters/telegram/transport.js +112 -0
- package/dist/lib/adapters/telegram/transport.js.map +1 -0
- package/dist/lib/api/banner.d.ts +41 -0
- package/dist/lib/api/banner.d.ts.map +1 -0
- package/dist/lib/api/banner.js +53 -0
- package/dist/lib/api/banner.js.map +1 -0
- package/dist/lib/api/inbox.d.ts +33 -0
- package/dist/lib/api/inbox.d.ts.map +1 -0
- package/dist/lib/api/inbox.js +52 -0
- package/dist/lib/api/inbox.js.map +1 -0
- package/dist/lib/channels/index.d.ts +3 -0
- package/dist/lib/channels/index.d.ts.map +1 -0
- package/dist/lib/channels/index.js +3 -0
- package/dist/lib/channels/index.js.map +1 -0
- package/dist/lib/channels/registry.d.ts +7 -0
- package/dist/lib/channels/registry.d.ts.map +1 -0
- package/dist/lib/channels/registry.js +24 -0
- package/dist/lib/channels/registry.js.map +1 -0
- package/dist/lib/channels/types.d.ts +82 -0
- package/dist/lib/channels/types.d.ts.map +1 -0
- package/dist/lib/channels/types.js +8 -0
- package/dist/lib/channels/types.js.map +1 -0
- package/dist/lib/dispatcher/batch-key.d.ts +15 -0
- package/dist/lib/dispatcher/batch-key.d.ts.map +1 -0
- package/dist/lib/dispatcher/batch-key.js +19 -0
- package/dist/lib/dispatcher/batch-key.js.map +1 -0
- package/dist/lib/dispatcher/index.d.ts +4 -0
- package/dist/lib/dispatcher/index.d.ts.map +1 -0
- package/dist/lib/dispatcher/index.js +73 -0
- package/dist/lib/dispatcher/index.js.map +1 -0
- package/dist/lib/inbox/connection.d.ts +19 -0
- package/dist/lib/inbox/connection.d.ts.map +1 -0
- package/dist/lib/inbox/connection.js +34 -0
- package/dist/lib/inbox/connection.js.map +1 -0
- package/dist/lib/inbox/dialects/index.d.ts +10 -0
- package/dist/lib/inbox/dialects/index.d.ts.map +1 -0
- package/dist/lib/inbox/dialects/index.js +13 -0
- package/dist/lib/inbox/dialects/index.js.map +1 -0
- package/dist/lib/inbox/dialects/postgres.d.ts +3 -0
- package/dist/lib/inbox/dialects/postgres.d.ts.map +1 -0
- package/dist/lib/inbox/dialects/postgres.js +110 -0
- package/dist/lib/inbox/dialects/postgres.js.map +1 -0
- package/dist/lib/inbox/dialects/sqlite.d.ts +3 -0
- package/dist/lib/inbox/dialects/sqlite.d.ts.map +1 -0
- package/dist/lib/inbox/dialects/sqlite.js +120 -0
- package/dist/lib/inbox/dialects/sqlite.js.map +1 -0
- package/dist/lib/inbox/dialects/types.d.ts +53 -0
- package/dist/lib/inbox/dialects/types.d.ts.map +1 -0
- package/dist/lib/inbox/dialects/types.js +2 -0
- package/dist/lib/inbox/dialects/types.js.map +1 -0
- package/dist/lib/inbox/index.d.ts +9 -0
- package/dist/lib/inbox/index.d.ts.map +1 -0
- package/dist/lib/inbox/index.js +6 -0
- package/dist/lib/inbox/index.js.map +1 -0
- package/dist/lib/inbox/storage.d.ts +21 -0
- package/dist/lib/inbox/storage.d.ts.map +1 -0
- package/dist/lib/inbox/storage.js +94 -0
- package/dist/lib/inbox/storage.js.map +1 -0
- package/dist/lib/inbox/types.d.ts +57 -0
- package/dist/lib/inbox/types.d.ts.map +1 -0
- package/dist/lib/inbox/types.js +2 -0
- package/dist/lib/inbox/types.js.map +1 -0
- package/dist/lib/inbox/worker/cleanup.d.ts +14 -0
- package/dist/lib/inbox/worker/cleanup.d.ts.map +1 -0
- package/dist/lib/inbox/worker/cleanup.js +37 -0
- package/dist/lib/inbox/worker/cleanup.js.map +1 -0
- package/dist/lib/inbox/worker/flush.d.ts +31 -0
- package/dist/lib/inbox/worker/flush.d.ts.map +1 -0
- package/dist/lib/inbox/worker/flush.js +97 -0
- package/dist/lib/inbox/worker/flush.js.map +1 -0
- package/dist/lib/inbox/worker/render.d.ts +23 -0
- package/dist/lib/inbox/worker/render.d.ts.map +1 -0
- package/dist/lib/inbox/worker/render.js +42 -0
- package/dist/lib/inbox/worker/render.js.map +1 -0
- package/dist/lib/inbox/worker/start.d.ts +29 -0
- package/dist/lib/inbox/worker/start.d.ts.map +1 -0
- package/dist/lib/inbox/worker/start.js +100 -0
- package/dist/lib/inbox/worker/start.js.map +1 -0
- package/dist/lib/index.d.ts +1 -6
- package/dist/lib/index.d.ts.map +1 -1
- package/dist/lib/index.js +4 -6
- package/dist/lib/index.js.map +1 -1
- package/dist/lib/jobs/handler.d.ts +25 -0
- package/dist/lib/jobs/handler.d.ts.map +1 -0
- package/dist/lib/jobs/handler.js +36 -0
- package/dist/lib/jobs/handler.js.map +1 -0
- package/dist/lib/jobs/index.d.ts +16 -0
- package/dist/lib/jobs/index.d.ts.map +1 -0
- package/dist/lib/jobs/index.js +13 -0
- package/dist/lib/jobs/index.js.map +1 -0
- package/dist/lib/jobs/submit.d.ts +20 -0
- package/dist/lib/jobs/submit.d.ts.map +1 -0
- package/dist/lib/jobs/submit.js +25 -0
- package/dist/lib/jobs/submit.js.map +1 -0
- package/dist/lib/jobs/types.d.ts +42 -0
- package/dist/lib/jobs/types.d.ts.map +1 -0
- package/dist/lib/jobs/types.js +12 -0
- package/dist/lib/jobs/types.js.map +1 -0
- package/dist/lib/template_manager/db/template_repository.d.ts.map +1 -1
- package/dist/lib/template_manager/db/template_repository.js +16 -31
- package/dist/lib/template_manager/db/template_repository.js.map +1 -1
- package/dist/lib/template_manager/engine/variable_resolver.js +4 -4
- package/dist/lib/template_manager/engine/variable_resolver.js.map +1 -1
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts +20 -0
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.d.ts.map +1 -0
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.js +46 -0
- package/dist/lib/template_manager/handlers/adapters/hazo_auth.js.map +1 -0
- package/dist/lib/template_manager/handlers/auth.d.ts +47 -0
- package/dist/lib/template_manager/handlers/auth.d.ts.map +1 -0
- package/dist/lib/template_manager/handlers/auth.js +67 -0
- package/dist/lib/template_manager/handlers/auth.js.map +1 -0
- package/dist/lib/template_manager/handlers/index.d.ts +67 -0
- package/dist/lib/template_manager/handlers/index.d.ts.map +1 -0
- package/dist/lib/template_manager/handlers/index.js +282 -0
- package/dist/lib/template_manager/handlers/index.js.map +1 -0
- package/dist/lib/template_manager/seed/sync.d.ts.map +1 -1
- package/dist/lib/template_manager/seed/sync.js +20 -4
- package/dist/lib/template_manager/seed/sync.js.map +1 -1
- package/dist/lib/template_manager/template_manager.d.ts.map +1 -1
- package/dist/lib/template_manager/template_manager.js +67 -26
- package/dist/lib/template_manager/template_manager.js.map +1 -1
- package/dist/lib/template_manager/types.d.ts +35 -9
- package/dist/lib/template_manager/types.d.ts.map +1 -1
- package/dist/lib/template_manager/utils/index.d.ts +1 -1
- package/dist/lib/template_manager/utils/index.d.ts.map +1 -1
- package/dist/lib/template_manager/utils/index.js +1 -1
- package/dist/lib/template_manager/utils/index.js.map +1 -1
- package/dist/lib/template_manager/utils/validation.d.ts +12 -11
- package/dist/lib/template_manager/utils/validation.d.ts.map +1 -1
- package/dist/lib/template_manager/utils/validation.js +15 -22
- package/dist/lib/template_manager/utils/validation.js.map +1 -1
- package/migrations/003_create_notifications_table.sql +48 -0
- package/migrations/004_inbox_upsert_rpc.sql +63 -0
- package/migrations/005_inbox_v4_refactor.pg.sql +53 -0
- package/migrations/005_inbox_v4_refactor.sqlite.sql +30 -0
- package/migrations/006_channel_deliveries.pg.sql +61 -0
- package/migrations/006_channel_deliveries.sqlite.sql +26 -0
- package/migrations/007_templates_bodies_jsonb.pg.sql +17 -0
- package/migrations/007_templates_bodies_jsonb.sqlite.sql +18 -0
- package/package.json +63 -14
- package/dist/lib/emailer/emailer.d.ts.map +0 -1
- package/dist/lib/emailer/emailer.js.map +0 -1
- package/dist/lib/emailer/index.d.ts +0 -12
- package/dist/lib/emailer/index.d.ts.map +0 -1
- package/dist/lib/emailer/index.js +0 -13
- package/dist/lib/emailer/index.js.map +0 -1
- package/dist/lib/emailer/providers/index.d.ts.map +0 -1
- package/dist/lib/emailer/providers/index.js.map +0 -1
- package/dist/lib/emailer/providers/pop3_provider.d.ts.map +0 -1
- package/dist/lib/emailer/providers/pop3_provider.js.map +0 -1
- package/dist/lib/emailer/providers/smtp_provider.d.ts.map +0 -1
- package/dist/lib/emailer/providers/smtp_provider.js.map +0 -1
- package/dist/lib/emailer/providers/zeptomail_provider.d.ts.map +0 -1
- package/dist/lib/emailer/providers/zeptomail_provider.js.map +0 -1
- package/dist/lib/emailer/types.d.ts.map +0 -1
- package/dist/lib/emailer/types.js.map +0 -1
- package/dist/lib/emailer/utils/constants.d.ts.map +0 -1
- package/dist/lib/emailer/utils/constants.js.map +0 -1
- package/dist/lib/emailer/utils/index.d.ts.map +0 -1
- package/dist/lib/emailer/utils/index.js.map +0 -1
- package/dist/lib/emailer/utils/logger.d.ts.map +0 -1
- package/dist/lib/emailer/utils/logger.js.map +0 -1
- package/dist/lib/emailer/utils/validation.d.ts.map +0 -1
- package/dist/lib/emailer/utils/validation.js.map +0 -1
- /package/dist/lib/{emailer → adapters/email}/providers/index.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/providers/index.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/providers/pop3_provider.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/providers/smtp_provider.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/providers/zeptomail_provider.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/types.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/types.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/constants.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/constants.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/index.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/index.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/logger.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/logger.js +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/validation.d.ts +0 -0
- /package/dist/lib/{emailer → adapters/email}/utils/validation.js +0 -0
|
@@ -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;AAKH,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,yBAAyB,CAAC;AAE9D;;;;;;;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,42 @@
|
|
|
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 { get_template_by_name } from "../../template_manager/db/index.js";
|
|
11
|
+
import { render_handlebars_string } from "../../template_manager/engine/index.js";
|
|
12
|
+
import { getInboxConnection } from "../connection.js";
|
|
13
|
+
/**
|
|
14
|
+
* Render template bodies for a claimed delivery row.
|
|
15
|
+
*
|
|
16
|
+
* Returns an object keyed by body key (subset of adapter.capabilities.template_body_keys).
|
|
17
|
+
* Returns an empty object when the payload has no template_name (caller used pre-rendered bodies).
|
|
18
|
+
*
|
|
19
|
+
* @throws Error when template_name is specified but not found.
|
|
20
|
+
*/
|
|
21
|
+
export async function renderForChannel(adapter, row) {
|
|
22
|
+
const payload = row.payload;
|
|
23
|
+
if (!payload.template_name)
|
|
24
|
+
return {};
|
|
25
|
+
const conn = getInboxConnection();
|
|
26
|
+
const scope_chain = row.scope_id ? [row.scope_id] : [];
|
|
27
|
+
const result = await get_template_by_name(conn, scope_chain, payload.template_name);
|
|
28
|
+
const template = result.data;
|
|
29
|
+
if (!template)
|
|
30
|
+
throw new Error(`template not found: ${payload.template_name}`);
|
|
31
|
+
const tpl_bodies = template.bodies ?? {};
|
|
32
|
+
const vars = (payload.template_vars ?? {});
|
|
33
|
+
const bodies = {};
|
|
34
|
+
for (const key of adapter.capabilities.template_body_keys) {
|
|
35
|
+
const source = tpl_bodies[key];
|
|
36
|
+
if (typeof source === "string" && source.length > 0) {
|
|
37
|
+
bodies[key] = render_handlebars_string(source, vars);
|
|
38
|
+
}
|
|
39
|
+
}
|
|
40
|
+
return bodies;
|
|
41
|
+
}
|
|
42
|
+
//# 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,oBAAoB,EAAE,MAAM,oCAAoC,CAAC;AAC1E,OAAO,EAAE,wBAAwB,EAAE,MAAM,wCAAwC,CAAC;AAClF,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAGtD;;;;;;;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,kBAAkB,EAAE,CAAC;IAClC,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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"}
|
package/dist/lib/index.d.ts
CHANGED
package/dist/lib/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"
|
|
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
|
-
|
|
3
|
-
|
|
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
|
package/dist/lib/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/lib/index.ts"],"names":[],"mappings":"AAAA
|
|
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;
|
|
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,
|
|
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
|
-
|
|
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:
|
|
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
|
-
|
|
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.
|
|
413
|
-
|
|
414
|
-
|
|
415
|
-
|
|
416
|
-
|
|
417
|
-
|
|
418
|
-
|
|
419
|
-
|
|
420
|
-
|
|
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.
|
|
438
|
-
patch.
|
|
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);
|