notifkit 0.1.8 → 0.1.10

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 (33) hide show
  1. package/README.md +66 -72
  2. package/dist/index.d.mts +22 -4
  3. package/dist/index.d.mts.map +1 -1
  4. package/dist/index.mjs +1 -1
  5. package/dist/{main-BAO4kKce.mjs → main-39DtKrX4.mjs} +142 -28
  6. package/dist/main-39DtKrX4.mjs.map +1 -0
  7. package/dist/{main-B0BcY_JJ.mjs → main-B3iQrl3t.mjs} +2 -2
  8. package/dist/{main-B0BcY_JJ.mjs.map → main-B3iQrl3t.mjs.map} +1 -1
  9. package/dist/{main-7KMlWnDx.mjs → main-BM8DH3v3.mjs} +2 -2
  10. package/dist/{main-7KMlWnDx.mjs.map → main-BM8DH3v3.mjs.map} +1 -1
  11. package/dist/{main-BtXITy0k.mjs → main-BgmT1MPe.mjs} +2 -2
  12. package/dist/{main-BtXITy0k.mjs.map → main-BgmT1MPe.mjs.map} +1 -1
  13. package/dist/{main-BxqAXTr6.mjs → main-BiFiOX9D.mjs} +2 -2
  14. package/dist/{main-BxqAXTr6.mjs.map → main-BiFiOX9D.mjs.map} +1 -1
  15. package/dist/{main-0FHNtN5g.mjs → main-C9s-2ArH.mjs} +2 -2
  16. package/dist/{main-0FHNtN5g.mjs.map → main-C9s-2ArH.mjs.map} +1 -1
  17. package/dist/{main-zCpvA9Rx.mjs → main-Cqo3rSb5.mjs} +2 -2
  18. package/dist/{main-zCpvA9Rx.mjs.map → main-Cqo3rSb5.mjs.map} +1 -1
  19. package/dist/{main-BjXgGJBd.mjs → main-Dz2sUh3c.mjs} +2 -2
  20. package/dist/{main-BjXgGJBd.mjs.map → main-Dz2sUh3c.mjs.map} +1 -1
  21. package/dist/{src-DkvHYM3y.mjs → src-QiTu5e_a.mjs} +30 -18
  22. package/dist/src-QiTu5e_a.mjs.map +1 -0
  23. package/package.json +1 -1
  24. package/scripts/create-admin.mjs +8 -11
  25. package/src/config/index.ts +9 -0
  26. package/src/server.ts +10 -0
  27. package/src/services/api/admin-static.ts +3 -2
  28. package/src/services/api/handlers.ts +102 -28
  29. package/src/services/api/main.ts +112 -11
  30. package/src/services/api/router.ts +7 -1
  31. package/src/services/auth/index.ts +8 -0
  32. package/dist/main-BAO4kKce.mjs.map +0 -1
  33. package/dist/src-DkvHYM3y.mjs.map +0 -1
@@ -90,7 +90,16 @@ const baseConfigSchema = z.object({
90
90
  * permanent: a dead link means the recipient reaches for the spam button
91
91
  * instead, which costs far more than the key ever protected.
92
92
  */
93
- UNSUBSCRIBE_SECRET: z.string().min(16).optional()
93
+ UNSUBSCRIBE_SECRET: z.string().min(16).optional(),
94
+ /**
95
+ * When true, trusts X-Forwarded-For headers from reverse proxies for client IP resolution.
96
+ * Defaults to false to prevent client-spoofed headers from bypassing rate limits.
97
+ */
98
+ TRUST_PROXY: z.coerce.boolean().default(false),
99
+ /**
100
+ * Comma-separated list of allowed origins for CORS on session-authenticated admin routes.
101
+ */
102
+ CORS_ORIGIN: z.string().optional()
94
103
  });
95
104
  let globalConfig = null;
96
105
  function setGlobalConfig(config) {
@@ -3410,6 +3419,9 @@ var NotifkitServer = class extends EventEmitter {
3410
3419
  if (this.options.port) process.env.PORT = String(this.options.port);
3411
3420
  if (this.options.logLevel) process.env.LOG_LEVEL = this.options.logLevel;
3412
3421
  if (this.options.nodeEnv) process.env.NODE_ENV = this.options.nodeEnv;
3422
+ if (this.options.adminUser?.email) process.env.ADMIN_EMAIL = this.options.adminUser.email;
3423
+ if (this.options.adminUser?.password) process.env.ADMIN_PASSWORD = this.options.adminUser.password;
3424
+ if (this.options.adminUser?.username) process.env.ADMIN_USERNAME = this.options.adminUser.username;
3413
3425
  if (this.options.workerConcurrency) process.env.WORKER_CONCURRENCY = String(this.options.workerConcurrency);
3414
3426
  if (this.options.redisOptions?.maxQueueLength) process.env.QUEUE_MAX_LEN = String(this.options.redisOptions.maxQueueLength);
3415
3427
  if (this.options.dbOptions?.maxConnections) process.env.DB_MAX_CONNECTIONS = String(this.options.dbOptions.maxConnections);
@@ -3459,35 +3471,35 @@ var NotifkitServer = class extends EventEmitter {
3459
3471
  }
3460
3472
  const startupPromises = [];
3461
3473
  if (services.includes("api")) {
3462
- const { startApiServer } = await import("./main-BAO4kKce.mjs");
3474
+ const { startApiServer } = await import("./main-39DtKrX4.mjs");
3463
3475
  startupPromises.push(startApiServer());
3464
3476
  }
3465
3477
  if (services.includes("delivery")) {
3466
- const { startDeliveryWorker } = await import("./main-7KMlWnDx.mjs");
3478
+ const { startDeliveryWorker } = await import("./main-BM8DH3v3.mjs");
3467
3479
  startupPromises.push(startDeliveryWorker());
3468
3480
  }
3469
3481
  if (services.includes("engine")) {
3470
- const { startEngineWorker } = await import("./main-BxqAXTr6.mjs");
3482
+ const { startEngineWorker } = await import("./main-BiFiOX9D.mjs");
3471
3483
  startupPromises.push(startEngineWorker());
3472
3484
  }
3473
3485
  if (services.includes("enricher")) {
3474
- const { startEnricherWorker } = await import("./main-B0BcY_JJ.mjs");
3486
+ const { startEnricherWorker } = await import("./main-B3iQrl3t.mjs");
3475
3487
  startupPromises.push(startEnricherWorker());
3476
3488
  }
3477
3489
  if (services.includes("scheduler")) {
3478
- const { startSchedulerWorker } = await import("./main-zCpvA9Rx.mjs");
3490
+ const { startSchedulerWorker } = await import("./main-Cqo3rSb5.mjs");
3479
3491
  startupPromises.push(startSchedulerWorker());
3480
3492
  }
3481
3493
  if (services.includes("ai")) {
3482
- const { startAiWorker } = await import("./main-0FHNtN5g.mjs");
3494
+ const { startAiWorker } = await import("./main-C9s-2ArH.mjs");
3483
3495
  startupPromises.push(startAiWorker());
3484
3496
  }
3485
3497
  if (services.includes("workflow")) {
3486
- const { startWorkflowWorker } = await import("./main-BtXITy0k.mjs");
3498
+ const { startWorkflowWorker } = await import("./main-BgmT1MPe.mjs");
3487
3499
  startupPromises.push(startWorkflowWorker());
3488
3500
  }
3489
3501
  if (services.includes("events")) {
3490
- const { startEventWorker } = await import("./main-BjXgGJBd.mjs");
3502
+ const { startEventWorker } = await import("./main-Dz2sUh3c.mjs");
3491
3503
  startupPromises.push(startEventWorker());
3492
3504
  }
3493
3505
  const handleSignal = async (signal) => {
@@ -3527,35 +3539,35 @@ var NotifkitServer = class extends EventEmitter {
3527
3539
  "events"
3528
3540
  ] : this.options.services;
3529
3541
  if (services.includes("api")) {
3530
- const { stopApiServer } = await import("./main-BAO4kKce.mjs");
3542
+ const { stopApiServer } = await import("./main-39DtKrX4.mjs");
3531
3543
  await stopApiServer();
3532
3544
  }
3533
3545
  if (services.includes("delivery")) {
3534
- const { stopDeliveryWorker } = await import("./main-7KMlWnDx.mjs");
3546
+ const { stopDeliveryWorker } = await import("./main-BM8DH3v3.mjs");
3535
3547
  await stopDeliveryWorker();
3536
3548
  }
3537
3549
  if (services.includes("engine")) {
3538
- const { stopEngineWorker } = await import("./main-BxqAXTr6.mjs");
3550
+ const { stopEngineWorker } = await import("./main-BiFiOX9D.mjs");
3539
3551
  await stopEngineWorker();
3540
3552
  }
3541
3553
  if (services.includes("enricher")) {
3542
- const { stopEnricherWorker } = await import("./main-B0BcY_JJ.mjs");
3554
+ const { stopEnricherWorker } = await import("./main-B3iQrl3t.mjs");
3543
3555
  await stopEnricherWorker();
3544
3556
  }
3545
3557
  if (services.includes("scheduler")) {
3546
- const { stopSchedulerWorker } = await import("./main-zCpvA9Rx.mjs");
3558
+ const { stopSchedulerWorker } = await import("./main-Cqo3rSb5.mjs");
3547
3559
  await stopSchedulerWorker();
3548
3560
  }
3549
3561
  if (services.includes("ai")) {
3550
- const { stopAiWorker } = await import("./main-0FHNtN5g.mjs");
3562
+ const { stopAiWorker } = await import("./main-C9s-2ArH.mjs");
3551
3563
  await stopAiWorker();
3552
3564
  }
3553
3565
  if (services.includes("workflow")) {
3554
- const { stopWorkflowWorker } = await import("./main-BtXITy0k.mjs");
3566
+ const { stopWorkflowWorker } = await import("./main-BgmT1MPe.mjs");
3555
3567
  await stopWorkflowWorker();
3556
3568
  }
3557
3569
  if (services.includes("events")) {
3558
- const { stopEventWorker } = await import("./main-BjXgGJBd.mjs");
3570
+ const { stopEventWorker } = await import("./main-Dz2sUh3c.mjs");
3559
3571
  await stopEventWorker();
3560
3572
  }
3561
3573
  if (this.pgContainer) {
@@ -3571,4 +3583,4 @@ var NotifkitServer = class extends EventEmitter {
3571
3583
  //#endregion
3572
3584
  export { metrics as $, ENRICHED_STREAMS as $t, RedisClient as A, NotificationCreatedPayloadSchema as At, AsyncSemaphore as B, NotifyRequestSchema as Bt, PreferenceRepository as C, NotificationDeliveredPayloadSchema as Ct, UserRepository as D, NotificationScheduledPayloadSchema as Dt, TemplateRepository as E, RenderedContentSchema as Et, generateId as F, BatchAddContactsSchema as Ft, getPriorityBucket as G, TriggerWorkflowSchema as Gt, LUA_RENEW_LOCK as H, QuietHoursSchema as Ht, sleep as I, ContactChannelSchema as It, globalEmitter as J, UserContactInputSchema as Jt, normaliseTarget as K, UpdateProjectSchema as Kt, DataLoader as L, CreateWorkflowSchema as Lt, UserThrottle as M, NotificationTargetSchema as Mt, AppError as N, AddContactSchema as Nt, WorkflowRepository as O, NotificationEnrichedPayloadSchema as Ot, ValidationError as P, AddUserSchema as Pt, getMetricsRegistry as Q, CONSUMER_GROUPS as Qt, CircuitBreaker as R, IngestEventSchema as Rt, ContactRepository as S, NotificationFailedPayloadSchema as St, SegmentRepository as T, NotificationDispatchedPayloadSchema as Tt, LUA_SCHEDULER_CLAIM as U, SyncTemplatesSchema as Ut, LUA_RELEASE_LOCK as V, PreferencesSchema as Vt, LUA_SCHEDULER_POLL as W, TemplateSchema as Wt, StreamConsumer as X, WorkflowStepSchema as Xt, PendingMessageScanner as Y, WorkflowNotifyPayloadSchema as Yt, StreamProducer as Z, buildStreamEvent as Zt, escapeHeader as _, parseConfig as _n, workflowSteps as _t, SuspendExecutionError as a, StreamEventMetadataSchema as an, createDatabase as at, renderWithTemplate as b, setGlobalConfig as bn, NotificationCanceledPayloadSchema as bt, BaseWorker as c, registry as cn, messageLogs as ct, buildUnsubscribeHeaders as d, NotificationPrioritySchema as dn, scheduledPayloads as dt, INBOUND_STREAMS as en, childLogger as et, signUnsubscribeToken as f, NotificationStatusSchema as fn, suppressions as ft, TemplateCache as g, loadEnv as gn, workflowInstances as gt, templateRegistry as h, getAiConfig as hn, workflowDefinitions as ht, workflowRegistry as i, EventEnvelopeSchema as in, IdempotencyGuard as it, ProjectSettingsCache as j, NotificationRequestedPayloadSchema as jt, Redis as k, RecipientProfileSchema as kt, NonRetryableError as l, EventMetadataSchema as ln, projectApiKeys as lt, renderTemplate as m, baseConfigSchema as mn, users as mt, NotifkitClient as n, PUBSUB_CHANNELS as nn, withContext as nt, buildStepNotifyPayload as o, StreamEventSchema as on, runMigrations as ot, verifyUnsubscribeToken as p, AI_DEFAULTS as pn, userTopicPreferences as pt, LRUCache as q, UpdateUserSchema as qt, workflow as r, STREAMS as rn, withRequestId as rt, resolveStepTarget as s, EventRegistry as sn, deliveryOutbox as st, NotifkitServer as t, OUTBOUND_STREAMS as tn, createLogger as tt, startHealthReporter as u, NotificationChannelSchema as un, projects as ut, escapeHtml as v, readBaseConfig as vn, workflowWaiters as vt, ProjectRepository as w, DeliveryOptionsSchema as wt, AdminUserRepository as x, NotificationSkippedPayloadSchema as xt, interpolate as y, setAiConfig as yn, NotificationAiPendingPayloadSchema as yt, BatchProcessor as z, InlineUserSchema as zt };
3573
3585
 
3574
- //# sourceMappingURL=src-DkvHYM3y.mjs.map
3586
+ //# sourceMappingURL=src-QiTu5e_a.mjs.map