@yaghmori/notification-service 0.1.1

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 ADDED
@@ -0,0 +1,20 @@
1
+ # @yaghmori/notification-service
2
+
3
+ Configurable client for **notification-service** (HTTP inbox · Nest TCP · Kafka delivery).
4
+
5
+ ## Docs
6
+
7
+ - **[docs/PROTOCOL_GUIDE.md](./docs/PROTOCOL_GUIDE.md)** — full HTTP / TCP / Kafka for Node and .NET
8
+ - **[docs/USAGE.md](./docs/USAGE.md)** — practical usage
9
+ - **[docs/NUGET_TRUSTED_PUBLISHING.md](./docs/NUGET_TRUSTED_PUBLISHING.md)** — publish `Yaghmori.NotificationService` without API keys
10
+
11
+ SDKs: npm · `sdk/dotnet`
12
+
13
+ ```ts
14
+ import { createNotificationHttpClient } from '@yaghmori/notification-service';
15
+
16
+ const notifications = createNotificationHttpClient({
17
+ baseUrl: process.env.NOTIFICATION_SERVICE_URL,
18
+ auth: { apiKey: process.env.NOTIFICATION_SERVICE_API_KEY! },
19
+ });
20
+ ```
package/contracts.json ADDED
@@ -0,0 +1,45 @@
1
+ {
2
+ "name": "notification-service",
3
+ "npmPackage": "@yaghmori/notification-service",
4
+ "nugetPackage": "Yaghmori.NotificationService",
5
+ "dockerImage": "ghcr.io/yaghmori/notification-service",
6
+ "description": "Client SDK for notification-service (TCP, Kafka, HTTP inbox/SSE)",
7
+ "ports": { "tcp": 4004, "http": 3000 },
8
+ "injectionToken": "NOTIFICATION_SERVICE",
9
+ "env": {
10
+ "httpBaseUrl": "NOTIFICATION_SERVICE_URL",
11
+ "host": "NOTIFICATION_SERVICE_HOST",
12
+ "tcpPort": "NOTIFICATION_SERVICE_TCP_PORT",
13
+ "httpPort": "NOTIFICATION_SERVICE_HTTP_PORT"
14
+ },
15
+ "patterns": {
16
+ "GET_NOTIFICATIONS": "notification.get_notifications",
17
+ "GET_NOTIFICATION_BY_ID": "notification.get_notification_by_id",
18
+ "CREATE_NOTIFICATION": "notification.create_notification",
19
+ "MARK_AS_READ": "notification.mark_as_read",
20
+ "MARK_ALL_AS_READ": "notification.mark_all_as_read",
21
+ "ARCHIVE_NOTIFICATION": "notification.archive_notification",
22
+ "DELETE_NOTIFICATION": "notification.delete_notification",
23
+ "HEALTH_CHECK": "health.check"
24
+ },
25
+ "httpPaths": {
26
+ "LIST": "/notifications",
27
+ "STREAM": "/notifications/stream",
28
+ "MARK_READ": "/notifications/{id}/read",
29
+ "MARK_READ_ALL": "/notifications/read-all",
30
+ "ARCHIVE": "/notifications/{id}/archive",
31
+ "ARCHIVE_ALL": "/notifications/archive-all",
32
+ "DELETE": "/notifications/{id}",
33
+ "HEALTH": "/health"
34
+ },
35
+ "topics": {
36
+ "SEND_REQUESTED": "notification.send.requested",
37
+ "SENT": "notification.sent",
38
+ "FAILED": "notification.failed"
39
+ },
40
+ "eventTypes": {
41
+ "SEND": "evt.notification.message.send.v1",
42
+ "SENT": "evt.notification.message.sent.v1",
43
+ "FAILED": "evt.notification.message.failed.v1"
44
+ }
45
+ }
package/dist/auth.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ export type ClientAuth = {
2
+ type: 'apiKey';
3
+ apiKey: string;
4
+ } | {
5
+ type: 'bearer';
6
+ token: string;
7
+ } | {
8
+ apiKey: string;
9
+ bearerToken?: never;
10
+ } | {
11
+ bearerToken: string;
12
+ apiKey?: never;
13
+ } | {
14
+ apiKey?: string;
15
+ bearerToken?: string;
16
+ };
17
+ export declare const AUTH_HEADERS: {
18
+ readonly apiKey: "x-api-key";
19
+ readonly authorization: "authorization";
20
+ };
21
+ export declare function buildAuthHeaders(auth?: ClientAuth | string, envApiKeyVar?: string): Record<string, string>;
22
+ //# sourceMappingURL=auth.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.d.ts","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":"AAAA,MAAM,MAAM,UAAU,GAClB;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,GAClC;IAAE,IAAI,EAAE,QAAQ,CAAC;IAAC,KAAK,EAAE,MAAM,CAAA;CAAE,GACjC;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,KAAK,CAAA;CAAE,GACvC;IAAE,WAAW,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,KAAK,CAAA;CAAE,GACvC;IAAE,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,WAAW,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC;AAE9C,eAAO,MAAM,YAAY;;;CAGf,CAAC;AAEX,wBAAgB,gBAAgB,CAC9B,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,EAC1B,YAAY,SAAiC,GAC5C,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CA0BxB"}
package/dist/auth.js ADDED
@@ -0,0 +1,36 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.AUTH_HEADERS = void 0;
4
+ exports.buildAuthHeaders = buildAuthHeaders;
5
+ exports.AUTH_HEADERS = {
6
+ apiKey: 'x-api-key',
7
+ authorization: 'authorization',
8
+ };
9
+ function buildAuthHeaders(auth, envApiKeyVar = 'NOTIFICATION_SERVICE_API_KEY') {
10
+ if (!auth) {
11
+ const fromEnv = process.env[envApiKeyVar] ||
12
+ process.env.SERVICE_API_KEY ||
13
+ process.env.API_KEY;
14
+ if (fromEnv)
15
+ return { [exports.AUTH_HEADERS.apiKey]: fromEnv };
16
+ const bearer = process.env.NOTIFICATION_SERVICE_BEARER || process.env.SERVICE_BEARER_TOKEN;
17
+ if (bearer)
18
+ return { [exports.AUTH_HEADERS.authorization]: `Bearer ${bearer}` };
19
+ return {};
20
+ }
21
+ if (typeof auth === 'string') {
22
+ return { [exports.AUTH_HEADERS.apiKey]: auth };
23
+ }
24
+ if ('type' in auth) {
25
+ if (auth.type === 'apiKey')
26
+ return { [exports.AUTH_HEADERS.apiKey]: auth.apiKey };
27
+ return { [exports.AUTH_HEADERS.authorization]: `Bearer ${auth.token}` };
28
+ }
29
+ const headers = {};
30
+ if (auth.apiKey)
31
+ headers[exports.AUTH_HEADERS.apiKey] = auth.apiKey;
32
+ if (auth.bearerToken)
33
+ headers[exports.AUTH_HEADERS.authorization] = `Bearer ${auth.bearerToken}`;
34
+ return headers;
35
+ }
36
+ //# sourceMappingURL=auth.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"auth.js","sourceRoot":"","sources":["../src/auth.ts"],"names":[],"mappings":";;;AAYA,4CA6BC;AAlCY,QAAA,YAAY,GAAG;IAC1B,MAAM,EAAE,WAAW;IACnB,aAAa,EAAE,eAAe;CACtB,CAAC;AAEX,SAAgB,gBAAgB,CAC9B,IAA0B,EAC1B,YAAY,GAAG,8BAA8B;IAE7C,IAAI,CAAC,IAAI,EAAE,CAAC;QACV,MAAM,OAAO,GACX,OAAO,CAAC,GAAG,CAAC,YAAY,CAAC;YACzB,OAAO,CAAC,GAAG,CAAC,eAAe;YAC3B,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC;QACtB,IAAI,OAAO;YAAE,OAAO,EAAE,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,OAAO,EAAE,CAAC;QACvD,MAAM,MAAM,GACV,OAAO,CAAC,GAAG,CAAC,2BAA2B,IAAI,OAAO,CAAC,GAAG,CAAC,oBAAoB,CAAC;QAC9E,IAAI,MAAM;YAAE,OAAO,EAAE,CAAC,oBAAY,CAAC,aAAa,CAAC,EAAE,UAAU,MAAM,EAAE,EAAE,CAAC;QACxE,OAAO,EAAE,CAAC;IACZ,CAAC;IAED,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;QAC7B,OAAO,EAAE,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,IAAI,EAAE,CAAC;IACzC,CAAC;IAED,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;QACnB,IAAI,IAAI,CAAC,IAAI,KAAK,QAAQ;YAAE,OAAO,EAAE,CAAC,oBAAY,CAAC,MAAM,CAAC,EAAE,IAAI,CAAC,MAAM,EAAE,CAAC;QAC1E,OAAO,EAAE,CAAC,oBAAY,CAAC,aAAa,CAAC,EAAE,UAAU,IAAI,CAAC,KAAK,EAAE,EAAE,CAAC;IAClE,CAAC;IAED,MAAM,OAAO,GAA2B,EAAE,CAAC;IAC3C,IAAI,IAAI,CAAC,MAAM;QAAE,OAAO,CAAC,oBAAY,CAAC,MAAM,CAAC,GAAG,IAAI,CAAC,MAAM,CAAC;IAC5D,IAAI,IAAI,CAAC,WAAW;QAAE,OAAO,CAAC,oBAAY,CAAC,aAAa,CAAC,GAAG,UAAU,IAAI,CAAC,WAAW,EAAE,CAAC;IACzF,OAAO,OAAO,CAAC;AACjB,CAAC"}
@@ -0,0 +1,14 @@
1
+ export type ServiceEndpoint = {
2
+ baseUrl?: string;
3
+ host?: string;
4
+ port?: number;
5
+ protocol?: 'http' | 'https';
6
+ };
7
+ export declare function resolveHttpBaseUrl(options?: ServiceEndpoint): string;
8
+ export declare function resolveTcpEndpoint(options?: ServiceEndpoint): {
9
+ host: string;
10
+ port: number;
11
+ };
12
+ export declare function joinUrl(base: string, path: string): string;
13
+ export declare function fillPath(template: string, params: Record<string, string | number>): string;
14
+ //# sourceMappingURL=config.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.d.ts","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"AAEA,MAAM,MAAM,eAAe,GAAG;IAC5B,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,QAAQ,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC;CAC7B,CAAC;AAOF,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,GAAG,MAAM,CAiBxE;AAED,wBAAgB,kBAAkB,CAAC,OAAO,GAAE,eAAoB,GAAG;IACjE,IAAI,EAAE,MAAM,CAAC;IACb,IAAI,EAAE,MAAM,CAAC;CACd,CAUA;AAED,wBAAgB,OAAO,CAAC,IAAI,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAI1D;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,MAAM,CAAC,GAAG,MAAM,CAK1F"}
package/dist/config.js ADDED
@@ -0,0 +1,48 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.resolveHttpBaseUrl = resolveHttpBaseUrl;
4
+ exports.resolveTcpEndpoint = resolveTcpEndpoint;
5
+ exports.joinUrl = joinUrl;
6
+ exports.fillPath = fillPath;
7
+ const generated_1 = require("./generated");
8
+ function env(name) {
9
+ const v = process.env[name];
10
+ return v && v.length > 0 ? v : undefined;
11
+ }
12
+ function resolveHttpBaseUrl(options = {}) {
13
+ if (options.baseUrl)
14
+ return options.baseUrl.replace(/\/$/, '');
15
+ const fromEnv = env(generated_1.ENV_KEYS.httpBaseUrl) ?? env('NOTIFICATION_SERVICE_URL');
16
+ if (fromEnv)
17
+ return fromEnv.replace(/\/$/, '');
18
+ const host = options.host ?? env(generated_1.ENV_KEYS.host) ?? env('NOTIFICATION_HOST') ?? '127.0.0.1';
19
+ const port = Number(options.port ??
20
+ env(generated_1.ENV_KEYS.httpPort) ??
21
+ env('NOTIFICATION_HTTP_PORT') ??
22
+ generated_1.PORTS.http);
23
+ const protocol = options.protocol ?? (port === 443 ? 'https' : 'http');
24
+ const defaultPort = protocol === 'https' ? 443 : 80;
25
+ const authority = port === defaultPort ? host : `${host}:${port}`;
26
+ return `${protocol}://${authority}`;
27
+ }
28
+ function resolveTcpEndpoint(options = {}) {
29
+ const host = options.host ?? env(generated_1.ENV_KEYS.host) ?? env('NOTIFICATION_HOST') ?? '127.0.0.1';
30
+ const port = Number(options.port ??
31
+ env(generated_1.ENV_KEYS.tcpPort) ??
32
+ env('NOTIFICATION_TCP_PORT') ??
33
+ generated_1.PORTS.tcp);
34
+ return { host, port };
35
+ }
36
+ function joinUrl(base, path) {
37
+ const b = base.replace(/\/$/, '');
38
+ const p = path.startsWith('/') ? path : `/${path}`;
39
+ return `${b}${p}`;
40
+ }
41
+ function fillPath(template, params) {
42
+ return template.replace(/\{(\w+)\}/g, (_, key) => {
43
+ if (params[key] === undefined)
44
+ throw new Error(`Missing path param: ${key}`);
45
+ return encodeURIComponent(String(params[key]));
46
+ });
47
+ }
48
+ //# sourceMappingURL=config.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"config.js","sourceRoot":"","sources":["../src/config.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,93 @@
1
+ export declare const PORTS: {
2
+ readonly tcp: 4004;
3
+ readonly http: 3000;
4
+ };
5
+ export declare const INJECTION_TOKEN: "NOTIFICATION_SERVICE";
6
+ export declare const DOCKER_IMAGE: "ghcr.io/yaghmori/notification-service";
7
+ export declare const SERVICE_NAME: "notification-service";
8
+ export declare const ENV_KEYS: {
9
+ readonly httpBaseUrl: "NOTIFICATION_SERVICE_URL";
10
+ readonly host: "NOTIFICATION_SERVICE_HOST";
11
+ readonly tcpPort: "NOTIFICATION_SERVICE_TCP_PORT";
12
+ readonly httpPort: "NOTIFICATION_SERVICE_HTTP_PORT";
13
+ };
14
+ export declare const PATTERNS: {
15
+ readonly GET_NOTIFICATIONS: "notification.get_notifications";
16
+ readonly GET_NOTIFICATION_BY_ID: "notification.get_notification_by_id";
17
+ readonly CREATE_NOTIFICATION: "notification.create_notification";
18
+ readonly MARK_AS_READ: "notification.mark_as_read";
19
+ readonly MARK_ALL_AS_READ: "notification.mark_all_as_read";
20
+ readonly ARCHIVE_NOTIFICATION: "notification.archive_notification";
21
+ readonly DELETE_NOTIFICATION: "notification.delete_notification";
22
+ readonly HEALTH_CHECK: "health.check";
23
+ };
24
+ export declare const HTTP_PATHS: {
25
+ readonly LIST: "/notifications";
26
+ readonly STREAM: "/notifications/stream";
27
+ readonly MARK_READ: "/notifications/{id}/read";
28
+ readonly MARK_READ_ALL: "/notifications/read-all";
29
+ readonly ARCHIVE: "/notifications/{id}/archive";
30
+ readonly ARCHIVE_ALL: "/notifications/archive-all";
31
+ readonly DELETE: "/notifications/{id}";
32
+ readonly HEALTH: "/health";
33
+ };
34
+ export declare const TOPICS: {
35
+ readonly SEND_REQUESTED: "notification.send.requested";
36
+ readonly SENT: "notification.sent";
37
+ readonly FAILED: "notification.failed";
38
+ };
39
+ export declare const EVENT_TYPES: {
40
+ readonly SEND: "evt.notification.message.send.v1";
41
+ readonly SENT: "evt.notification.message.sent.v1";
42
+ readonly FAILED: "evt.notification.message.failed.v1";
43
+ };
44
+ export type NotificationPattern = (typeof PATTERNS)[keyof typeof PATTERNS];
45
+ export type NotificationTopic = (typeof TOPICS)[keyof typeof TOPICS];
46
+ export type NotificationEventType = (typeof EVENT_TYPES)[keyof typeof EVENT_TYPES];
47
+ export type NotificationHttpPath = (typeof HTTP_PATHS)[keyof typeof HTTP_PATHS];
48
+ export declare const NotificationService: {
49
+ readonly name: "notification-service";
50
+ readonly token: "NOTIFICATION_SERVICE";
51
+ readonly image: "ghcr.io/yaghmori/notification-service";
52
+ readonly ports: {
53
+ readonly tcp: 4004;
54
+ readonly http: 3000;
55
+ };
56
+ readonly env: {
57
+ readonly httpBaseUrl: "NOTIFICATION_SERVICE_URL";
58
+ readonly host: "NOTIFICATION_SERVICE_HOST";
59
+ readonly tcpPort: "NOTIFICATION_SERVICE_TCP_PORT";
60
+ readonly httpPort: "NOTIFICATION_SERVICE_HTTP_PORT";
61
+ };
62
+ readonly patterns: {
63
+ readonly GET_NOTIFICATIONS: "notification.get_notifications";
64
+ readonly GET_NOTIFICATION_BY_ID: "notification.get_notification_by_id";
65
+ readonly CREATE_NOTIFICATION: "notification.create_notification";
66
+ readonly MARK_AS_READ: "notification.mark_as_read";
67
+ readonly MARK_ALL_AS_READ: "notification.mark_all_as_read";
68
+ readonly ARCHIVE_NOTIFICATION: "notification.archive_notification";
69
+ readonly DELETE_NOTIFICATION: "notification.delete_notification";
70
+ readonly HEALTH_CHECK: "health.check";
71
+ };
72
+ readonly httpPaths: {
73
+ readonly LIST: "/notifications";
74
+ readonly STREAM: "/notifications/stream";
75
+ readonly MARK_READ: "/notifications/{id}/read";
76
+ readonly MARK_READ_ALL: "/notifications/read-all";
77
+ readonly ARCHIVE: "/notifications/{id}/archive";
78
+ readonly ARCHIVE_ALL: "/notifications/archive-all";
79
+ readonly DELETE: "/notifications/{id}";
80
+ readonly HEALTH: "/health";
81
+ };
82
+ readonly topics: {
83
+ readonly SEND_REQUESTED: "notification.send.requested";
84
+ readonly SENT: "notification.sent";
85
+ readonly FAILED: "notification.failed";
86
+ };
87
+ readonly eventTypes: {
88
+ readonly SEND: "evt.notification.message.send.v1";
89
+ readonly SENT: "evt.notification.message.sent.v1";
90
+ readonly FAILED: "evt.notification.message.failed.v1";
91
+ };
92
+ };
93
+ //# sourceMappingURL=generated.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated.d.ts","sourceRoot":"","sources":["../src/generated.ts"],"names":[],"mappings":"AACA,eAAO,MAAM,KAAK;;;CAGR,CAAC;AAEX,eAAO,MAAM,eAAe,EAAG,sBAA+B,CAAC;AAE/D,eAAO,MAAM,YAAY,EAAG,uCAAgD,CAAC;AAE7E,eAAO,MAAM,YAAY,EAAG,sBAA+B,CAAC;AAE5D,eAAO,MAAM,QAAQ;;;;;CAKX,CAAC;AAEX,eAAO,MAAM,QAAQ;;;;;;;;;CASX,CAAC;AAEX,eAAO,MAAM,UAAU;;;;;;;;;CASb,CAAC;AAEX,eAAO,MAAM,MAAM;;;;CAIT,CAAC;AAEX,eAAO,MAAM,WAAW;;;;CAId,CAAC;AAEX,MAAM,MAAM,mBAAmB,GAAG,CAAC,OAAO,QAAQ,CAAC,CAAC,MAAM,OAAO,QAAQ,CAAC,CAAC;AAC3E,MAAM,MAAM,iBAAiB,GAAG,CAAC,OAAO,MAAM,CAAC,CAAC,MAAM,OAAO,MAAM,CAAC,CAAC;AACrE,MAAM,MAAM,qBAAqB,GAAG,CAAC,OAAO,WAAW,CAAC,CAAC,MAAM,OAAO,WAAW,CAAC,CAAC;AACnF,MAAM,MAAM,oBAAoB,GAAG,CAAC,OAAO,UAAU,CAAC,CAAC,MAAM,OAAO,UAAU,CAAC,CAAC;AAEhF,eAAO,MAAM,mBAAmB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAUtB,CAAC"}
@@ -0,0 +1,59 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotificationService = exports.EVENT_TYPES = exports.TOPICS = exports.HTTP_PATHS = exports.PATTERNS = exports.ENV_KEYS = exports.SERVICE_NAME = exports.DOCKER_IMAGE = exports.INJECTION_TOKEN = exports.PORTS = void 0;
4
+ /* AUTO-GENERATED from contracts.json - do not edit by hand. Run: pnpm run codegen */
5
+ exports.PORTS = {
6
+ tcp: 4004,
7
+ http: 3000,
8
+ };
9
+ exports.INJECTION_TOKEN = "NOTIFICATION_SERVICE";
10
+ exports.DOCKER_IMAGE = "ghcr.io/yaghmori/notification-service";
11
+ exports.SERVICE_NAME = "notification-service";
12
+ exports.ENV_KEYS = {
13
+ httpBaseUrl: "NOTIFICATION_SERVICE_URL",
14
+ host: "NOTIFICATION_SERVICE_HOST",
15
+ tcpPort: "NOTIFICATION_SERVICE_TCP_PORT",
16
+ httpPort: "NOTIFICATION_SERVICE_HTTP_PORT",
17
+ };
18
+ exports.PATTERNS = {
19
+ GET_NOTIFICATIONS: "notification.get_notifications",
20
+ GET_NOTIFICATION_BY_ID: "notification.get_notification_by_id",
21
+ CREATE_NOTIFICATION: "notification.create_notification",
22
+ MARK_AS_READ: "notification.mark_as_read",
23
+ MARK_ALL_AS_READ: "notification.mark_all_as_read",
24
+ ARCHIVE_NOTIFICATION: "notification.archive_notification",
25
+ DELETE_NOTIFICATION: "notification.delete_notification",
26
+ HEALTH_CHECK: "health.check",
27
+ };
28
+ exports.HTTP_PATHS = {
29
+ LIST: "/notifications",
30
+ STREAM: "/notifications/stream",
31
+ MARK_READ: "/notifications/{id}/read",
32
+ MARK_READ_ALL: "/notifications/read-all",
33
+ ARCHIVE: "/notifications/{id}/archive",
34
+ ARCHIVE_ALL: "/notifications/archive-all",
35
+ DELETE: "/notifications/{id}",
36
+ HEALTH: "/health",
37
+ };
38
+ exports.TOPICS = {
39
+ SEND_REQUESTED: "notification.send.requested",
40
+ SENT: "notification.sent",
41
+ FAILED: "notification.failed",
42
+ };
43
+ exports.EVENT_TYPES = {
44
+ SEND: "evt.notification.message.send.v1",
45
+ SENT: "evt.notification.message.sent.v1",
46
+ FAILED: "evt.notification.message.failed.v1",
47
+ };
48
+ exports.NotificationService = {
49
+ name: exports.SERVICE_NAME,
50
+ token: exports.INJECTION_TOKEN,
51
+ image: exports.DOCKER_IMAGE,
52
+ ports: exports.PORTS,
53
+ env: exports.ENV_KEYS,
54
+ patterns: exports.PATTERNS,
55
+ httpPaths: exports.HTTP_PATHS,
56
+ topics: exports.TOPICS,
57
+ eventTypes: exports.EVENT_TYPES,
58
+ };
59
+ //# sourceMappingURL=generated.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generated.js","sourceRoot":"","sources":["../src/generated.ts"],"names":[],"mappings":";;;AAAA,qFAAqF;AACxE,QAAA,KAAK,GAAG;IACnB,GAAG,EAAE,IAAI;IACT,IAAI,EAAE,IAAI;CACF,CAAC;AAEE,QAAA,eAAe,GAAG,sBAA+B,CAAC;AAElD,QAAA,YAAY,GAAG,uCAAgD,CAAC;AAEhE,QAAA,YAAY,GAAG,sBAA+B,CAAC;AAE/C,QAAA,QAAQ,GAAG;IACtB,WAAW,EAAE,0BAA0B;IACvC,IAAI,EAAE,2BAA2B;IACjC,OAAO,EAAE,+BAA+B;IACxC,QAAQ,EAAE,gCAAgC;CAClC,CAAC;AAEE,QAAA,QAAQ,GAAG;IACtB,iBAAiB,EAAE,gCAAgC;IACnD,sBAAsB,EAAE,qCAAqC;IAC7D,mBAAmB,EAAE,kCAAkC;IACvD,YAAY,EAAE,2BAA2B;IACzC,gBAAgB,EAAE,+BAA+B;IACjD,oBAAoB,EAAE,mCAAmC;IACzD,mBAAmB,EAAE,kCAAkC;IACvD,YAAY,EAAE,cAAc;CACpB,CAAC;AAEE,QAAA,UAAU,GAAG;IACxB,IAAI,EAAE,gBAAgB;IACtB,MAAM,EAAE,uBAAuB;IAC/B,SAAS,EAAE,0BAA0B;IACrC,aAAa,EAAE,yBAAyB;IACxC,OAAO,EAAE,6BAA6B;IACtC,WAAW,EAAE,4BAA4B;IACzC,MAAM,EAAE,qBAAqB;IAC7B,MAAM,EAAE,SAAS;CACT,CAAC;AAEE,QAAA,MAAM,GAAG;IACpB,cAAc,EAAE,6BAA6B;IAC7C,IAAI,EAAE,mBAAmB;IACzB,MAAM,EAAE,qBAAqB;CACrB,CAAC;AAEE,QAAA,WAAW,GAAG;IACzB,IAAI,EAAE,kCAAkC;IACxC,IAAI,EAAE,kCAAkC;IACxC,MAAM,EAAE,oCAAoC;CACpC,CAAC;AAOE,QAAA,mBAAmB,GAAG;IACjC,IAAI,EAAE,oBAAY;IAClB,KAAK,EAAE,uBAAe;IACtB,KAAK,EAAE,oBAAY;IACnB,KAAK,EAAE,aAAK;IACZ,GAAG,EAAE,gBAAQ;IACb,QAAQ,EAAE,gBAAQ;IAClB,SAAS,EAAE,kBAAU;IACrB,MAAM,EAAE,cAAM;IACd,UAAU,EAAE,mBAAW;CACf,CAAC"}
package/dist/http.d.ts ADDED
@@ -0,0 +1,22 @@
1
+ import { type ServiceEndpoint } from './config';
2
+ import { type ClientAuth } from './auth';
3
+ import { type ListNotificationsRequest } from './schemas';
4
+ export type NotificationHttpClientOptions = ServiceEndpoint & {
5
+ auth?: ClientAuth | string;
6
+ /** @deprecated use auth.apiKey — still maps to x-api-key */
7
+ apiKey?: string;
8
+ headers?: Record<string, string>;
9
+ fetch?: typeof fetch;
10
+ };
11
+ export declare class NotificationHttpClient {
12
+ readonly baseUrl: string;
13
+ private readonly headers;
14
+ private readonly fetchImpl;
15
+ constructor(options?: NotificationHttpClientOptions);
16
+ list(query?: ListNotificationsRequest): Promise<unknown>;
17
+ markRead(id: string): Promise<unknown>;
18
+ health(): Promise<unknown>;
19
+ private request;
20
+ }
21
+ export declare function createNotificationHttpClient(options?: NotificationHttpClientOptions): NotificationHttpClient;
22
+ //# sourceMappingURL=http.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.d.ts","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"AAAA,OAAO,EAIL,KAAK,eAAe,EACrB,MAAM,UAAU,CAAC;AAClB,OAAO,EAAoB,KAAK,UAAU,EAAE,MAAM,QAAQ,CAAC;AAE3D,OAAO,EAEL,KAAK,wBAAwB,EAC9B,MAAM,WAAW,CAAC;AAEnB,MAAM,MAAM,6BAA6B,GAAG,eAAe,GAAG;IAC5D,IAAI,CAAC,EAAE,UAAU,GAAG,MAAM,CAAC;IAC3B,4DAA4D;IAC5D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,OAAO,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACjC,KAAK,CAAC,EAAE,OAAO,KAAK,CAAC;CACtB,CAAC;AAEF,qBAAa,sBAAsB;IACjC,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,OAAO,CAAC,QAAQ,CAAC,OAAO,CAAyB;IACjD,OAAO,CAAC,QAAQ,CAAC,SAAS,CAAe;gBAE7B,OAAO,GAAE,6BAAkC;IAYjD,IAAI,CAAC,KAAK,GAAE,wBAA6B,GAAG,OAAO,CAAC,OAAO,CAAC;IAY5D,QAAQ,CAAC,EAAE,EAAE,MAAM,GAAG,OAAO,CAAC,OAAO,CAAC;IAItC,MAAM,IAAI,OAAO,CAAC,OAAO,CAAC;YAIlB,OAAO;CAatB;AAED,wBAAgB,4BAA4B,CAC1C,OAAO,CAAC,EAAE,6BAA6B,GACtC,sBAAsB,CAExB"}
package/dist/http.js ADDED
@@ -0,0 +1,61 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotificationHttpClient = void 0;
4
+ exports.createNotificationHttpClient = createNotificationHttpClient;
5
+ const config_1 = require("./config");
6
+ const auth_1 = require("./auth");
7
+ const generated_1 = require("./generated");
8
+ const schemas_1 = require("./schemas");
9
+ class NotificationHttpClient {
10
+ constructor(options = {}) {
11
+ this.baseUrl = (0, config_1.resolveHttpBaseUrl)(options);
12
+ this.fetchImpl = options.fetch ?? globalThis.fetch.bind(globalThis);
13
+ const auth = options.auth ?? (options.apiKey ? { apiKey: options.apiKey } : undefined);
14
+ this.headers = {
15
+ 'content-type': 'application/json',
16
+ accept: 'application/json',
17
+ ...(0, auth_1.buildAuthHeaders)(auth, 'NOTIFICATION_SERVICE_API_KEY'),
18
+ ...options.headers,
19
+ };
20
+ }
21
+ async list(query = {}) {
22
+ const parsed = schemas_1.listNotificationsRequestSchema.parse(query);
23
+ const params = new URLSearchParams();
24
+ if (parsed.userId)
25
+ params.set('userId', parsed.userId);
26
+ if (parsed.limit != null)
27
+ params.set('limit', String(parsed.limit));
28
+ if (parsed.offset != null)
29
+ params.set('offset', String(parsed.offset));
30
+ if (parsed.unreadOnly != null)
31
+ params.set('unreadOnly', String(parsed.unreadOnly));
32
+ const qs = params.toString();
33
+ const path = qs ? `${generated_1.HTTP_PATHS.LIST}?${qs}` : generated_1.HTTP_PATHS.LIST;
34
+ return this.request('GET', path);
35
+ }
36
+ async markRead(id) {
37
+ return this.request('POST', (0, config_1.fillPath)(generated_1.HTTP_PATHS.MARK_READ, { id }));
38
+ }
39
+ async health() {
40
+ return this.request('GET', generated_1.HTTP_PATHS.HEALTH);
41
+ }
42
+ async request(method, path, body) {
43
+ const res = await this.fetchImpl((0, config_1.joinUrl)(this.baseUrl, path), {
44
+ method,
45
+ headers: this.headers,
46
+ body: body === undefined ? undefined : JSON.stringify(body),
47
+ });
48
+ if (!res.ok) {
49
+ const text = await res.text().catch(() => '');
50
+ throw new Error(`notification-service HTTP ${res.status} ${method} ${path}: ${text}`);
51
+ }
52
+ if (res.status === 204)
53
+ return undefined;
54
+ return (await res.json());
55
+ }
56
+ }
57
+ exports.NotificationHttpClient = NotificationHttpClient;
58
+ function createNotificationHttpClient(options) {
59
+ return new NotificationHttpClient(options);
60
+ }
61
+ //# sourceMappingURL=http.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"http.js","sourceRoot":"","sources":["../src/http.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export { NotificationService, PORTS, PATTERNS, HTTP_PATHS, TOPICS, EVENT_TYPES, ENV_KEYS, INJECTION_TOKEN, DOCKER_IMAGE, SERVICE_NAME, } from './generated';
2
+ export type { NotificationPattern, NotificationTopic, NotificationEventType, NotificationHttpPath, } from './generated';
3
+ export * from './schemas';
4
+ export { resolveHttpBaseUrl, resolveTcpEndpoint, joinUrl, fillPath, } from './config';
5
+ export type { ServiceEndpoint } from './config';
6
+ export { buildAuthHeaders, AUTH_HEADERS } from './auth';
7
+ export type { ClientAuth } from './auth';
8
+ export { NotificationHttpClient, createNotificationHttpClient, } from './http';
9
+ export type { NotificationHttpClientOptions } from './http';
10
+ export { NotificationKafka, resolveKafkaConnection } from './kafka';
11
+ export type { KafkaConnectionEnv } from './kafka';
12
+ export { notificationTcpClient } from './nest';
13
+ export type { NotificationTcpClientOptions } from './nest';
14
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,mBAAmB,EACnB,KAAK,EACL,QAAQ,EACR,UAAU,EACV,MAAM,EACN,WAAW,EACX,QAAQ,EACR,eAAe,EACf,YAAY,EACZ,YAAY,GACb,MAAM,aAAa,CAAC;AACrB,YAAY,EACV,mBAAmB,EACnB,iBAAiB,EACjB,qBAAqB,EACrB,oBAAoB,GACrB,MAAM,aAAa,CAAC;AAErB,cAAc,WAAW,CAAC;AAC1B,OAAO,EACL,kBAAkB,EAClB,kBAAkB,EAClB,OAAO,EACP,QAAQ,GACT,MAAM,UAAU,CAAC;AAClB,YAAY,EAAE,eAAe,EAAE,MAAM,UAAU,CAAC;AAEhD,OAAO,EAAE,gBAAgB,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AACxD,YAAY,EAAE,UAAU,EAAE,MAAM,QAAQ,CAAC;AAEzC,OAAO,EACL,sBAAsB,EACtB,4BAA4B,GAC7B,MAAM,QAAQ,CAAC;AAChB,YAAY,EAAE,6BAA6B,EAAE,MAAM,QAAQ,CAAC;AAE5D,OAAO,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,SAAS,CAAC;AACpE,YAAY,EAAE,kBAAkB,EAAE,MAAM,SAAS,CAAC;AAElD,OAAO,EAAE,qBAAqB,EAAE,MAAM,QAAQ,CAAC;AAC/C,YAAY,EAAE,4BAA4B,EAAE,MAAM,QAAQ,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,46 @@
1
+ "use strict";
2
+ var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
3
+ if (k2 === undefined) k2 = k;
4
+ var desc = Object.getOwnPropertyDescriptor(m, k);
5
+ if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
6
+ desc = { enumerable: true, get: function() { return m[k]; } };
7
+ }
8
+ Object.defineProperty(o, k2, desc);
9
+ }) : (function(o, m, k, k2) {
10
+ if (k2 === undefined) k2 = k;
11
+ o[k2] = m[k];
12
+ }));
13
+ var __exportStar = (this && this.__exportStar) || function(m, exports) {
14
+ for (var p in m) if (p !== "default" && !Object.prototype.hasOwnProperty.call(exports, p)) __createBinding(exports, m, p);
15
+ };
16
+ Object.defineProperty(exports, "__esModule", { value: true });
17
+ exports.notificationTcpClient = exports.resolveKafkaConnection = exports.NotificationKafka = exports.createNotificationHttpClient = exports.NotificationHttpClient = exports.AUTH_HEADERS = exports.buildAuthHeaders = exports.fillPath = exports.joinUrl = exports.resolveTcpEndpoint = exports.resolveHttpBaseUrl = exports.SERVICE_NAME = exports.DOCKER_IMAGE = exports.INJECTION_TOKEN = exports.ENV_KEYS = exports.EVENT_TYPES = exports.TOPICS = exports.HTTP_PATHS = exports.PATTERNS = exports.PORTS = exports.NotificationService = void 0;
18
+ var generated_1 = require("./generated");
19
+ Object.defineProperty(exports, "NotificationService", { enumerable: true, get: function () { return generated_1.NotificationService; } });
20
+ Object.defineProperty(exports, "PORTS", { enumerable: true, get: function () { return generated_1.PORTS; } });
21
+ Object.defineProperty(exports, "PATTERNS", { enumerable: true, get: function () { return generated_1.PATTERNS; } });
22
+ Object.defineProperty(exports, "HTTP_PATHS", { enumerable: true, get: function () { return generated_1.HTTP_PATHS; } });
23
+ Object.defineProperty(exports, "TOPICS", { enumerable: true, get: function () { return generated_1.TOPICS; } });
24
+ Object.defineProperty(exports, "EVENT_TYPES", { enumerable: true, get: function () { return generated_1.EVENT_TYPES; } });
25
+ Object.defineProperty(exports, "ENV_KEYS", { enumerable: true, get: function () { return generated_1.ENV_KEYS; } });
26
+ Object.defineProperty(exports, "INJECTION_TOKEN", { enumerable: true, get: function () { return generated_1.INJECTION_TOKEN; } });
27
+ Object.defineProperty(exports, "DOCKER_IMAGE", { enumerable: true, get: function () { return generated_1.DOCKER_IMAGE; } });
28
+ Object.defineProperty(exports, "SERVICE_NAME", { enumerable: true, get: function () { return generated_1.SERVICE_NAME; } });
29
+ __exportStar(require("./schemas"), exports);
30
+ var config_1 = require("./config");
31
+ Object.defineProperty(exports, "resolveHttpBaseUrl", { enumerable: true, get: function () { return config_1.resolveHttpBaseUrl; } });
32
+ Object.defineProperty(exports, "resolveTcpEndpoint", { enumerable: true, get: function () { return config_1.resolveTcpEndpoint; } });
33
+ Object.defineProperty(exports, "joinUrl", { enumerable: true, get: function () { return config_1.joinUrl; } });
34
+ Object.defineProperty(exports, "fillPath", { enumerable: true, get: function () { return config_1.fillPath; } });
35
+ var auth_1 = require("./auth");
36
+ Object.defineProperty(exports, "buildAuthHeaders", { enumerable: true, get: function () { return auth_1.buildAuthHeaders; } });
37
+ Object.defineProperty(exports, "AUTH_HEADERS", { enumerable: true, get: function () { return auth_1.AUTH_HEADERS; } });
38
+ var http_1 = require("./http");
39
+ Object.defineProperty(exports, "NotificationHttpClient", { enumerable: true, get: function () { return http_1.NotificationHttpClient; } });
40
+ Object.defineProperty(exports, "createNotificationHttpClient", { enumerable: true, get: function () { return http_1.createNotificationHttpClient; } });
41
+ var kafka_1 = require("./kafka");
42
+ Object.defineProperty(exports, "NotificationKafka", { enumerable: true, get: function () { return kafka_1.NotificationKafka; } });
43
+ Object.defineProperty(exports, "resolveKafkaConnection", { enumerable: true, get: function () { return kafka_1.resolveKafkaConnection; } });
44
+ var nest_1 = require("./nest");
45
+ Object.defineProperty(exports, "notificationTcpClient", { enumerable: true, get: function () { return nest_1.notificationTcpClient; } });
46
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;AAAA,yCAWqB;AAVnB,gHAAA,mBAAmB,OAAA;AACnB,kGAAA,KAAK,OAAA;AACL,qGAAA,QAAQ,OAAA;AACR,uGAAA,UAAU,OAAA;AACV,mGAAA,MAAM,OAAA;AACN,wGAAA,WAAW,OAAA;AACX,qGAAA,QAAQ,OAAA;AACR,4GAAA,eAAe,OAAA;AACf,yGAAA,YAAY,OAAA;AACZ,yGAAA,YAAY,OAAA;AASd,4CAA0B;AAC1B,mCAKkB;AAJhB,4GAAA,kBAAkB,OAAA;AAClB,4GAAA,kBAAkB,OAAA;AAClB,iGAAA,OAAO,OAAA;AACP,kGAAA,QAAQ,OAAA;AAIV,+BAAwD;AAA/C,wGAAA,gBAAgB,OAAA;AAAE,oGAAA,YAAY,OAAA;AAGvC,+BAGgB;AAFd,8GAAA,sBAAsB,OAAA;AACtB,oHAAA,4BAA4B,OAAA;AAI9B,iCAAoE;AAA3D,0GAAA,iBAAiB,OAAA;AAAE,+GAAA,sBAAsB,OAAA;AAGlD,+BAA+C;AAAtC,6GAAA,qBAAqB,OAAA"}
@@ -0,0 +1,32 @@
1
+ export type KafkaConnectionEnv = {
2
+ brokers: string[];
3
+ clientId: string;
4
+ ssl?: boolean;
5
+ sasl?: {
6
+ mechanism: 'plain' | 'scram-sha-256' | 'scram-sha-512';
7
+ username: string;
8
+ password: string;
9
+ };
10
+ };
11
+ /**
12
+ * Read common Kafka env (`KAFKA_BROKERS`, SASL/SSL).
13
+ * Does not create a client — returns config for kafkajs / Confluent / etc.
14
+ */
15
+ export declare function resolveKafkaConnection(env?: NodeJS.ProcessEnv): KafkaConnectionEnv;
16
+ /** Topics / event type ids this service owns */
17
+ export declare const NotificationKafka: {
18
+ readonly topics: {
19
+ readonly SEND_REQUESTED: "notification.send.requested";
20
+ readonly SENT: "notification.sent";
21
+ readonly FAILED: "notification.failed";
22
+ };
23
+ readonly eventTypes: {
24
+ readonly SEND: "evt.notification.message.send.v1";
25
+ readonly SENT: "evt.notification.message.sent.v1";
26
+ readonly FAILED: "evt.notification.message.failed.v1";
27
+ };
28
+ /** Primary command topic to request a notification send */
29
+ readonly sendRequested: "notification.send.requested";
30
+ readonly connection: typeof resolveKafkaConnection;
31
+ };
32
+ //# sourceMappingURL=kafka.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka.d.ts","sourceRoot":"","sources":["../src/kafka.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,EAAE,MAAM,CAAC;IACjB,GAAG,CAAC,EAAE,OAAO,CAAC;IACd,IAAI,CAAC,EAAE;QACL,SAAS,EAAE,OAAO,GAAG,eAAe,GAAG,eAAe,CAAC;QACvD,QAAQ,EAAE,MAAM,CAAC;QACjB,QAAQ,EAAE,MAAM,CAAC;KAClB,CAAC;CACH,CAAC;AAEF;;;GAGG;AACH,wBAAgB,sBAAsB,CACpC,GAAG,GAAE,MAAM,CAAC,UAAwB,GACnC,kBAAkB,CAwBpB;AAED,gDAAgD;AAChD,eAAO,MAAM,iBAAiB;;;;;;;;;;;IAG5B,2DAA2D;;;CAGnD,CAAC"}
package/dist/kafka.js ADDED
@@ -0,0 +1,41 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.NotificationKafka = void 0;
4
+ exports.resolveKafkaConnection = resolveKafkaConnection;
5
+ /**
6
+ * Kafka helpers — topic/event names come from the package; brokers/auth from your env.
7
+ * Consumer apps configure kafkajs (or similar) themselves; this avoids drift on topic strings.
8
+ */
9
+ const generated_1 = require("./generated");
10
+ /**
11
+ * Read common Kafka env (`KAFKA_BROKERS`, SASL/SSL).
12
+ * Does not create a client — returns config for kafkajs / Confluent / etc.
13
+ */
14
+ function resolveKafkaConnection(env = process.env) {
15
+ const brokers = (env.KAFKA_BROKERS || env.KAFKA_BOOTSTRAP_SERVERS || 'localhost:9092')
16
+ .split(',')
17
+ .map((s) => s.trim())
18
+ .filter(Boolean);
19
+ const clientId = env.KAFKA_CLIENT_ID || 'notification-service-client';
20
+ const ssl = env.KAFKA_SSL === 'true' || env.KAFKA_SSL === '1';
21
+ const username = env.KAFKA_SASL_USERNAME || env.KAFKA_USERNAME;
22
+ const password = env.KAFKA_SASL_PASSWORD || env.KAFKA_PASSWORD;
23
+ const mechanism = (env.KAFKA_SASL_MECHANISM || 'plain').toLowerCase();
24
+ return {
25
+ brokers,
26
+ clientId,
27
+ ...(ssl ? { ssl: true } : {}),
28
+ ...(username && password
29
+ ? { sasl: { mechanism, username, password } }
30
+ : {}),
31
+ };
32
+ }
33
+ /** Topics / event type ids this service owns */
34
+ exports.NotificationKafka = {
35
+ topics: generated_1.TOPICS,
36
+ eventTypes: generated_1.EVENT_TYPES,
37
+ /** Primary command topic to request a notification send */
38
+ sendRequested: generated_1.TOPICS.SEND_REQUESTED,
39
+ connection: resolveKafkaConnection,
40
+ };
41
+ //# sourceMappingURL=kafka.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka.js","sourceRoot":"","sources":["../src/kafka.ts"],"names":[],"mappings":";;;AAqBA,wDA0BC;AA/CD;;;GAGG;AACH,2CAAkD;AAalD;;;GAGG;AACH,SAAgB,sBAAsB,CACpC,MAAyB,OAAO,CAAC,GAAG;IAEpC,MAAM,OAAO,GAAG,CAAC,GAAG,CAAC,aAAa,IAAI,GAAG,CAAC,uBAAuB,IAAI,gBAAgB,CAAC;SACnF,KAAK,CAAC,GAAG,CAAC;SACV,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;SACpB,MAAM,CAAC,OAAO,CAAC,CAAC;IAEnB,MAAM,QAAQ,GAAG,GAAG,CAAC,eAAe,IAAI,6BAA6B,CAAC;IACtE,MAAM,GAAG,GAAG,GAAG,CAAC,SAAS,KAAK,MAAM,IAAI,GAAG,CAAC,SAAS,KAAK,GAAG,CAAC;IAE9D,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,cAAc,CAAC;IAC/D,MAAM,QAAQ,GAAG,GAAG,CAAC,mBAAmB,IAAI,GAAG,CAAC,cAAc,CAAC;IAC/D,MAAM,SAAS,GAAG,CAAC,GAAG,CAAC,oBAAoB,IAAI,OAAO,CAAC,CAAC,WAAW,EAGhD,CAAC;IAEpB,OAAO;QACL,OAAO;QACP,QAAQ;QACR,GAAG,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,GAAG,EAAE,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC7B,GAAG,CAAC,QAAQ,IAAI,QAAQ;YACtB,CAAC,CAAC,EAAE,IAAI,EAAE,EAAE,SAAS,EAAE,QAAQ,EAAE,QAAQ,EAAE,EAAE;YAC7C,CAAC,CAAC,EAAE,CAAC;KACR,CAAC;AACJ,CAAC;AAED,gDAAgD;AACnC,QAAA,iBAAiB,GAAG;IAC/B,MAAM,EAAE,kBAAM;IACd,UAAU,EAAE,uBAAW;IACvB,2DAA2D;IAC3D,aAAa,EAAE,kBAAM,CAAC,cAAc;IACpC,UAAU,EAAE,sBAAsB;CAC1B,CAAC"}
package/dist/nest.d.ts ADDED
@@ -0,0 +1,7 @@
1
+ import type { ClientProviderOptions } from '@nestjs/microservices';
2
+ import { type ServiceEndpoint } from './config';
3
+ export type NotificationTcpClientOptions = ServiceEndpoint & {
4
+ name?: string | symbol;
5
+ };
6
+ export declare function notificationTcpClient(options?: NotificationTcpClientOptions): ClientProviderOptions;
7
+ //# sourceMappingURL=nest.d.ts.map