notifkit 0.1.3 → 0.1.4
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 +95 -79
- package/dist/index.d.mts +199 -135
- package/dist/index.d.mts.map +1 -1
- package/dist/index.mjs +1 -1
- package/dist/index.mjs.map +1 -1
- package/dist/{main-DtHWhueo.mjs → main-40zwq6b0.mjs} +28 -3
- package/dist/{main-DtHWhueo.mjs.map → main-40zwq6b0.mjs.map} +1 -1
- package/dist/{main-DyfbnJc3.mjs → main-BFre2-HQ.mjs} +2 -2
- package/dist/{main-DyfbnJc3.mjs.map → main-BFre2-HQ.mjs.map} +1 -1
- package/dist/{main-CAH0_Q6d.mjs → main-BNJtzY61.mjs} +3 -3
- package/dist/main-BNJtzY61.mjs.map +1 -0
- package/dist/{main-B561M1d3.mjs → main-BOPMYqsW.mjs} +2 -2
- package/dist/{main-B561M1d3.mjs.map → main-BOPMYqsW.mjs.map} +1 -1
- package/dist/{main-CCfc45ev.mjs → main-CiigNpsP.mjs} +7 -4
- package/dist/main-CiigNpsP.mjs.map +1 -0
- package/dist/{main-Ce9dcrsg.mjs → main-DeNFQ-UL.mjs} +6 -3
- package/dist/{main-Ce9dcrsg.mjs.map → main-DeNFQ-UL.mjs.map} +1 -1
- package/dist/{main-B-jwm8ED.mjs → main-DmCPcxOc.mjs} +2 -2
- package/dist/{main-B-jwm8ED.mjs.map → main-DmCPcxOc.mjs.map} +1 -1
- package/dist/{main-C45e7grq.mjs → main-DvgJSm11.mjs} +2 -2
- package/dist/{main-C45e7grq.mjs.map → main-DvgJSm11.mjs.map} +1 -1
- package/dist/{src-C-PfEDMY.mjs → src-vG79L-8m.mjs} +57 -26
- package/dist/src-vG79L-8m.mjs.map +1 -0
- package/drizzle/0002_wide_colleen_wing.sql +2 -0
- package/drizzle/0003_skinny_daimon_hellstrom.sql +1 -0
- package/drizzle/0004_pretty_bruce_banner.sql +1 -0
- package/drizzle/meta/0002_snapshot.json +1460 -0
- package/drizzle/meta/0003_snapshot.json +1460 -0
- package/drizzle/meta/0004_snapshot.json +1470 -0
- package/drizzle/meta/_journal.json +21 -0
- package/package.json +2 -1
- package/src/client.ts +412 -0
- package/src/config/index.ts +107 -0
- package/src/contracts/common.ts +28 -0
- package/src/contracts/envelope.ts +31 -0
- package/src/contracts/events/notification-ai-pending.ts +18 -0
- package/src/contracts/events/notification-canceled.ts +7 -0
- package/src/contracts/events/notification-created.ts +14 -0
- package/src/contracts/events/notification-delivered.ts +17 -0
- package/src/contracts/events/notification-dispatched.ts +45 -0
- package/src/contracts/events/notification-enriched.ts +46 -0
- package/src/contracts/events/notification-failed.ts +19 -0
- package/src/contracts/events/notification-requested.ts +36 -0
- package/src/contracts/events/notification-scheduled.ts +9 -0
- package/src/contracts/events/notification-skipped.ts +9 -0
- package/src/contracts/helpers.ts +21 -0
- package/src/contracts/index.ts +46 -0
- package/src/contracts/metadata.ts +10 -0
- package/src/contracts/registry.ts +88 -0
- package/src/contracts/sdk.ts +242 -0
- package/src/contracts/streams.ts +62 -0
- package/src/db/index.ts +69 -0
- package/src/db/schema.ts +412 -0
- package/src/idempotency/index.ts +50 -0
- package/src/index.ts +19 -0
- package/src/logger/index.ts +60 -0
- package/src/metrics/index.ts +53 -0
- package/src/queue/index.ts +501 -0
- package/src/rate-limiter/index.ts +210 -0
- package/src/redis/index.ts +89 -0
- package/src/repositories/index.ts +1246 -0
- package/src/server.ts +277 -0
- package/src/services/ai/main.ts +404 -0
- package/src/services/api/handlers.ts +1734 -0
- package/src/services/api/http.ts +64 -0
- package/src/services/api/main.ts +693 -0
- package/src/services/api/router.ts +82 -0
- package/src/services/delivery/main.ts +842 -0
- package/src/services/delivery/throttle.ts +71 -0
- package/src/services/engine/main.ts +827 -0
- package/src/services/enricher/main.ts +594 -0
- package/src/services/events/main.ts +365 -0
- package/src/services/scheduler/main.ts +319 -0
- package/src/services/workflow/main.ts +627 -0
- package/src/shared/batch-processor.ts +67 -0
- package/src/shared/cache.ts +47 -0
- package/src/shared/circuit-breaker.ts +74 -0
- package/src/shared/dataloader.ts +41 -0
- package/src/shared/events.ts +3 -0
- package/src/shared/index.ts +39 -0
- package/src/shared/semaphore.ts +33 -0
- package/src/shared/utils.ts +64 -0
- package/src/templates/cache.ts +32 -0
- package/src/templates/index.ts +69 -0
- package/src/templates/render.ts +128 -0
- package/src/transport/index.ts +96 -0
- package/src/unsubscribe/index.ts +127 -0
- package/src/workers/health.ts +31 -0
- package/src/workers/index.ts +266 -0
- package/src/workflows/index.ts +2 -0
- package/src/workflows/registry.ts +21 -0
- package/src/workflows/sdk.ts +106 -0
- package/dist/main-CAH0_Q6d.mjs.map +0 -1
- package/dist/main-CCfc45ev.mjs.map +0 -1
- package/dist/src-C-PfEDMY.mjs.map +0 -1
|
@@ -0,0 +1,89 @@
|
|
|
1
|
+
import { Redis, type RedisOptions } from "ioredis";
|
|
2
|
+
import type { Logger } from "@/index.js";
|
|
3
|
+
|
|
4
|
+
export interface RedisClientOptions {
|
|
5
|
+
url: string;
|
|
6
|
+
name?: string;
|
|
7
|
+
logger?: Logger;
|
|
8
|
+
redisOptions?: Partial<RedisOptions>;
|
|
9
|
+
}
|
|
10
|
+
|
|
11
|
+
export class RedisClient {
|
|
12
|
+
readonly native: Redis;
|
|
13
|
+
|
|
14
|
+
private readonly logger?: Logger;
|
|
15
|
+
private isClosing = false;
|
|
16
|
+
|
|
17
|
+
constructor({ url, name = "notifkit", logger, redisOptions }: RedisClientOptions) {
|
|
18
|
+
this.logger = logger;
|
|
19
|
+
|
|
20
|
+
this.native = new Redis(url, {
|
|
21
|
+
maxRetriesPerRequest: null,
|
|
22
|
+
enableReadyCheck: true,
|
|
23
|
+
lazyConnect: false,
|
|
24
|
+
connectionName: name,
|
|
25
|
+
...redisOptions,
|
|
26
|
+
});
|
|
27
|
+
|
|
28
|
+
this.native.on("connect", () => {
|
|
29
|
+
this.logger?.info({ url: redactUrl(url) }, "redis connected");
|
|
30
|
+
});
|
|
31
|
+
|
|
32
|
+
this.native.on("ready", () => {
|
|
33
|
+
this.logger?.debug("redis ready");
|
|
34
|
+
});
|
|
35
|
+
|
|
36
|
+
this.native.on("error", (err: Error) => {
|
|
37
|
+
this.logger?.error({ err }, "redis client error");
|
|
38
|
+
});
|
|
39
|
+
|
|
40
|
+
this.native.on("close", () => {
|
|
41
|
+
if (!this.isClosing) {
|
|
42
|
+
this.logger?.warn("redis connection closed unexpectedly");
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
|
|
46
|
+
this.native.on("reconnecting", () => {
|
|
47
|
+
this.logger?.warn("redis reconnecting");
|
|
48
|
+
});
|
|
49
|
+
}
|
|
50
|
+
|
|
51
|
+
async healthCheck(): Promise<boolean> {
|
|
52
|
+
try {
|
|
53
|
+
const pong = await this.native.ping();
|
|
54
|
+
return pong === "PONG";
|
|
55
|
+
} catch {
|
|
56
|
+
return false;
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
|
|
60
|
+
async disconnect(): Promise<void> {
|
|
61
|
+
if (this.isClosing) return;
|
|
62
|
+
this.isClosing = true;
|
|
63
|
+
this.logger?.info("disconnecting redis");
|
|
64
|
+
try {
|
|
65
|
+
if (this.native.status !== "end" && this.native.status !== "close") {
|
|
66
|
+
await this.native.quit();
|
|
67
|
+
}
|
|
68
|
+
} catch {
|
|
69
|
+
try {
|
|
70
|
+
this.native.disconnect();
|
|
71
|
+
} catch {
|
|
72
|
+
// ignore errors on forced disconnect
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
this.logger?.info("redis disconnected");
|
|
76
|
+
}
|
|
77
|
+
}
|
|
78
|
+
|
|
79
|
+
function redactUrl(url: string): string {
|
|
80
|
+
try {
|
|
81
|
+
const parsed = new URL(url);
|
|
82
|
+
if (parsed.password) parsed.password = "***";
|
|
83
|
+
return parsed.toString();
|
|
84
|
+
} catch {
|
|
85
|
+
return "[invalid-url]";
|
|
86
|
+
}
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
export { Redis, type RedisOptions };
|