@tunnlo/core 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (57) hide show
  1. package/dist/bus.d.ts +19 -0
  2. package/dist/bus.d.ts.map +1 -0
  3. package/dist/bus.js +45 -0
  4. package/dist/bus.js.map +1 -0
  5. package/dist/bus.test.d.ts +2 -0
  6. package/dist/bus.test.d.ts.map +1 -0
  7. package/dist/bus.test.js +48 -0
  8. package/dist/bus.test.js.map +1 -0
  9. package/dist/event.d.ts +16 -0
  10. package/dist/event.d.ts.map +1 -0
  11. package/dist/event.js +83 -0
  12. package/dist/event.js.map +1 -0
  13. package/dist/event.test.d.ts +2 -0
  14. package/dist/event.test.d.ts.map +1 -0
  15. package/dist/event.test.js +40 -0
  16. package/dist/event.test.js.map +1 -0
  17. package/dist/fast-bus.d.ts +25 -0
  18. package/dist/fast-bus.d.ts.map +1 -0
  19. package/dist/fast-bus.js +114 -0
  20. package/dist/fast-bus.js.map +1 -0
  21. package/dist/fast-bus.test.d.ts +2 -0
  22. package/dist/fast-bus.test.d.ts.map +1 -0
  23. package/dist/fast-bus.test.js +63 -0
  24. package/dist/fast-bus.test.js.map +1 -0
  25. package/dist/index.d.ts +16 -0
  26. package/dist/index.d.ts.map +1 -0
  27. package/dist/index.js +9 -0
  28. package/dist/index.js.map +1 -0
  29. package/dist/kafka-bus.d.ts +27 -0
  30. package/dist/kafka-bus.d.ts.map +1 -0
  31. package/dist/kafka-bus.js +142 -0
  32. package/dist/kafka-bus.js.map +1 -0
  33. package/dist/logger.d.ts +30 -0
  34. package/dist/logger.d.ts.map +1 -0
  35. package/dist/logger.js +125 -0
  36. package/dist/logger.js.map +1 -0
  37. package/dist/pipeline.d.ts +54 -0
  38. package/dist/pipeline.d.ts.map +1 -0
  39. package/dist/pipeline.js +209 -0
  40. package/dist/pipeline.js.map +1 -0
  41. package/dist/pipeline.test.d.ts +2 -0
  42. package/dist/pipeline.test.d.ts.map +1 -0
  43. package/dist/pipeline.test.js +114 -0
  44. package/dist/pipeline.test.js.map +1 -0
  45. package/dist/redis-bus.d.ts +25 -0
  46. package/dist/redis-bus.d.ts.map +1 -0
  47. package/dist/redis-bus.js +140 -0
  48. package/dist/redis-bus.js.map +1 -0
  49. package/dist/state-store.d.ts +12 -0
  50. package/dist/state-store.d.ts.map +1 -0
  51. package/dist/state-store.js +36 -0
  52. package/dist/state-store.js.map +1 -0
  53. package/dist/types.d.ts +118 -0
  54. package/dist/types.d.ts.map +1 -0
  55. package/dist/types.js +2 -0
  56. package/dist/types.js.map +1 -0
  57. package/package.json +27 -0
package/dist/bus.d.ts ADDED
@@ -0,0 +1,19 @@
1
+ import type { TunnloEvent } from './types.js';
2
+ export type EventCallback = (event: TunnloEvent) => void | Promise<void>;
3
+ export interface MessageBus {
4
+ publish(topic: string, event: TunnloEvent): Promise<void>;
5
+ subscribe(topic: string, callback: EventCallback): void;
6
+ unsubscribe(topic: string, callback: EventCallback): void;
7
+ close(): Promise<void>;
8
+ }
9
+ export declare class InMemoryBus implements MessageBus {
10
+ private subscribers;
11
+ private queue;
12
+ private processing;
13
+ private closed;
14
+ publish(topic: string, event: TunnloEvent): Promise<void>;
15
+ subscribe(topic: string, callback: EventCallback): void;
16
+ unsubscribe(topic: string, callback: EventCallback): void;
17
+ close(): Promise<void>;
18
+ }
19
+ //# sourceMappingURL=bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.d.ts","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAG9C,MAAM,MAAM,aAAa,GAAG,CAAC,KAAK,EAAE,WAAW,KAAK,IAAI,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;AAEzE,MAAM,WAAW,UAAU;IACzB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC,CAAC;IAC1D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IACxD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI,CAAC;IAC1D,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC,CAAC;CACxB;AAED,qBAAa,WAAY,YAAW,UAAU;IAC5C,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,KAAK,CAAoD;IACjE,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,MAAM,CAAS;IAEjB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB/D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAOvD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAInD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;CAK7B"}
package/dist/bus.js ADDED
@@ -0,0 +1,45 @@
1
+ import { getLogger } from './logger.js';
2
+ export class InMemoryBus {
3
+ subscribers = new Map();
4
+ queue = [];
5
+ processing = false;
6
+ closed = false;
7
+ async publish(topic, event) {
8
+ if (this.closed)
9
+ return;
10
+ this.queue.push({ topic, event });
11
+ if (!this.processing) {
12
+ this.processing = true;
13
+ while (this.queue.length > 0) {
14
+ const item = this.queue.shift();
15
+ const subs = this.subscribers.get(item.topic);
16
+ if (subs) {
17
+ for (const cb of subs) {
18
+ try {
19
+ await cb(item.event);
20
+ }
21
+ catch (err) {
22
+ getLogger().error(`[tunnlo:bus] subscriber error on topic "${item.topic}":`, err);
23
+ }
24
+ }
25
+ }
26
+ }
27
+ this.processing = false;
28
+ }
29
+ }
30
+ subscribe(topic, callback) {
31
+ if (!this.subscribers.has(topic)) {
32
+ this.subscribers.set(topic, new Set());
33
+ }
34
+ this.subscribers.get(topic).add(callback);
35
+ }
36
+ unsubscribe(topic, callback) {
37
+ this.subscribers.get(topic)?.delete(callback);
38
+ }
39
+ async close() {
40
+ this.closed = true;
41
+ this.subscribers.clear();
42
+ this.queue.length = 0;
43
+ }
44
+ }
45
+ //# sourceMappingURL=bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.js","sourceRoot":"","sources":["../src/bus.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAWxC,MAAM,OAAO,WAAW;IACd,WAAW,GAAG,IAAI,GAAG,EAA8B,CAAC;IACpD,KAAK,GAAiD,EAAE,CAAC;IACzD,UAAU,GAAG,KAAK,CAAC;IACnB,MAAM,GAAG,KAAK,CAAC;IAEvB,KAAK,CAAC,OAAO,CAAC,KAAa,EAAE,KAAkB;QAC7C,IAAI,IAAI,CAAC,MAAM;YAAE,OAAO;QACxB,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC,CAAC;QAClC,IAAI,CAAC,IAAI,CAAC,UAAU,EAAE,CAAC;YACrB,IAAI,CAAC,UAAU,GAAG,IAAI,CAAC;YACvB,OAAO,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBAC7B,MAAM,IAAI,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,EAAG,CAAC;gBACjC,MAAM,IAAI,GAAG,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;gBAC9C,IAAI,IAAI,EAAE,CAAC;oBACT,KAAK,MAAM,EAAE,IAAI,IAAI,EAAE,CAAC;wBACtB,IAAI,CAAC;4BACH,MAAM,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;wBACvB,CAAC;wBAAC,OAAO,GAAG,EAAE,CAAC;4BACb,SAAS,EAAE,CAAC,KAAK,CAAC,2CAA2C,IAAI,CAAC,KAAK,IAAI,EAAE,GAAG,CAAC,CAAC;wBACpF,CAAC;oBACH,CAAC;gBACH,CAAC;YACH,CAAC;YACD,IAAI,CAAC,UAAU,GAAG,KAAK,CAAC;QAC1B,CAAC;IACH,CAAC;IAED,SAAS,CAAC,KAAa,EAAE,QAAuB;QAC9C,IAAI,CAAC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;YACjC,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACzC,CAAC;QACD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAE,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC7C,CAAC;IAED,WAAW,CAAC,KAAa,EAAE,QAAuB;QAChD,IAAI,CAAC,WAAW,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC,QAAQ,CAAC,CAAC;IAChD,CAAC;IAED,KAAK,CAAC,KAAK;QACT,IAAI,CAAC,MAAM,GAAG,IAAI,CAAC;QACnB,IAAI,CAAC,WAAW,CAAC,KAAK,EAAE,CAAC;QACzB,IAAI,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC;IACxB,CAAC;CACF"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=bus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.test.d.ts","sourceRoot":"","sources":["../src/bus.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,48 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { InMemoryBus } from './bus.js';
3
+ import { createEvent } from './event.js';
4
+ describe('InMemoryBus', () => {
5
+ it('delivers events to subscribers', async () => {
6
+ const bus = new InMemoryBus();
7
+ const received = [];
8
+ bus.subscribe('test', (event) => {
9
+ received.push(event.event_id);
10
+ });
11
+ const event = createEvent('src', 'DATA', { msg: 'hi' });
12
+ await bus.publish('test', event);
13
+ expect(received).toEqual([event.event_id]);
14
+ await bus.close();
15
+ });
16
+ it('only delivers to matching topic', async () => {
17
+ const bus = new InMemoryBus();
18
+ const received = [];
19
+ bus.subscribe('topicA', (event) => {
20
+ received.push(event.event_id);
21
+ });
22
+ const event = createEvent('src', 'DATA', { msg: 'hi' });
23
+ await bus.publish('topicB', event);
24
+ expect(received).toEqual([]);
25
+ await bus.close();
26
+ });
27
+ it('supports unsubscribe', async () => {
28
+ const bus = new InMemoryBus();
29
+ const received = [];
30
+ const cb = (event) => { received.push(event.event_id); };
31
+ bus.subscribe('test', cb);
32
+ bus.unsubscribe('test', cb);
33
+ await bus.publish('test', createEvent('src', 'DATA', {}));
34
+ expect(received).toEqual([]);
35
+ await bus.close();
36
+ });
37
+ it('stops delivering after close', async () => {
38
+ const bus = new InMemoryBus();
39
+ const received = [];
40
+ bus.subscribe('test', (event) => {
41
+ received.push(event.event_id);
42
+ });
43
+ await bus.close();
44
+ await bus.publish('test', createEvent('src', 'DATA', {}));
45
+ expect(received).toEqual([]);
46
+ });
47
+ });
48
+ //# sourceMappingURL=bus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bus.test.js","sourceRoot":"","sources":["../src/bus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ import type { TunnloEvent, EventType } from './types.js';
2
+ /**
3
+ * Validates a URL is safe for outbound requests (blocks SSRF to internal networks).
4
+ * Throws if the URL targets localhost, private IPs, or cloud metadata endpoints.
5
+ */
6
+ export declare function validateOutboundUrl(url: string): void;
7
+ export declare function createEvent(source_id: string, event_type: EventType, payload: Record<string, any>, options?: {
8
+ priority?: number;
9
+ metadata?: Record<string, any>;
10
+ raw?: string | Buffer;
11
+ }): TunnloEvent;
12
+ export declare function eventKey(event: TunnloEvent, fields: string[]): string;
13
+ /** Validates a parsed object has the required TunnloEvent fields. */
14
+ export declare function validateEvent(obj: unknown): obj is TunnloEvent;
15
+ export declare function getNestedValue(obj: any, path: string): any;
16
+ //# sourceMappingURL=event.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.d.ts","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EAAE,WAAW,EAAE,SAAS,EAAE,MAAM,YAAY,CAAC;AAIzD;;;GAGG;AACH,wBAAgB,mBAAmB,CAAC,GAAG,EAAE,MAAM,GAAG,IAAI,CAgCrD;AAED,wBAAgB,WAAW,CACzB,SAAS,EAAE,MAAM,EACjB,UAAU,EAAE,SAAS,EACrB,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,EAC5B,OAAO,CAAC,EAAE;IACR,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;IAC/B,GAAG,CAAC,EAAE,MAAM,GAAG,MAAM,CAAC;CACvB,GACA,WAAW,CAWb;AAED,wBAAgB,QAAQ,CAAC,KAAK,EAAE,WAAW,EAAE,MAAM,EAAE,MAAM,EAAE,GAAG,MAAM,CAMrE;AAID,qEAAqE;AACrE,wBAAgB,aAAa,CAAC,GAAG,EAAE,OAAO,GAAG,GAAG,IAAI,WAAW,CAY9D;AAID,wBAAgB,cAAc,CAAC,GAAG,EAAE,GAAG,EAAE,IAAI,EAAE,MAAM,GAAG,GAAG,CAU1D"}
package/dist/event.js ADDED
@@ -0,0 +1,83 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ const BLOCKED_HOSTNAMES = new Set(['localhost', '127.0.0.1', '::1', '0.0.0.0', '[::1]']);
3
+ /**
4
+ * Validates a URL is safe for outbound requests (blocks SSRF to internal networks).
5
+ * Throws if the URL targets localhost, private IPs, or cloud metadata endpoints.
6
+ */
7
+ export function validateOutboundUrl(url) {
8
+ let parsed;
9
+ try {
10
+ parsed = new URL(url);
11
+ }
12
+ catch {
13
+ throw new Error(`Invalid URL: ${url}`);
14
+ }
15
+ if (parsed.protocol !== 'http:' && parsed.protocol !== 'https:') {
16
+ throw new Error(`Blocked URL: only http/https protocols are allowed, got ${parsed.protocol}`);
17
+ }
18
+ const hostname = parsed.hostname.replace(/^\[|\]$/g, '');
19
+ if (BLOCKED_HOSTNAMES.has(hostname)) {
20
+ throw new Error(`Blocked URL: requests to ${hostname} are not allowed`);
21
+ }
22
+ // Block private/internal IP ranges
23
+ const parts = hostname.split('.').map(Number);
24
+ if (parts.length === 4 && parts.every((n) => !isNaN(n))) {
25
+ const [a, b] = parts;
26
+ if (a === 10 ||
27
+ (a === 172 && b >= 16 && b <= 31) ||
28
+ (a === 192 && b === 168) ||
29
+ (a === 169 && b === 254) ||
30
+ a === 0) {
31
+ throw new Error(`Blocked URL: requests to private IP ${hostname} are not allowed`);
32
+ }
33
+ }
34
+ }
35
+ export function createEvent(source_id, event_type, payload, options) {
36
+ return {
37
+ event_id: randomUUID(),
38
+ source_id,
39
+ timestamp: new Date().toISOString(),
40
+ event_type,
41
+ priority: options?.priority ?? 3,
42
+ payload,
43
+ metadata: options?.metadata,
44
+ raw: options?.raw,
45
+ };
46
+ }
47
+ export function eventKey(event, fields) {
48
+ const parts = fields.map((field) => {
49
+ const value = getNestedValue(event, field);
50
+ return value !== undefined ? String(value) : '';
51
+ });
52
+ return parts.join('|');
53
+ }
54
+ const VALID_EVENT_TYPES = new Set(['DATA', 'ALERT', 'METRIC', 'HEARTBEAT', 'ERROR']);
55
+ /** Validates a parsed object has the required TunnloEvent fields. */
56
+ export function validateEvent(obj) {
57
+ if (obj == null || typeof obj !== 'object')
58
+ return false;
59
+ const e = obj;
60
+ return (typeof e.event_id === 'string' &&
61
+ typeof e.source_id === 'string' &&
62
+ typeof e.timestamp === 'string' &&
63
+ typeof e.event_type === 'string' &&
64
+ VALID_EVENT_TYPES.has(e.event_type) &&
65
+ e.payload != null &&
66
+ typeof e.payload === 'object');
67
+ }
68
+ const BLOCKED_KEYS = new Set(['__proto__', 'constructor', 'prototype']);
69
+ export function getNestedValue(obj, path) {
70
+ const parts = path.split('.');
71
+ let current = obj;
72
+ for (const part of parts) {
73
+ if (current == null)
74
+ return undefined;
75
+ if (BLOCKED_KEYS.has(part))
76
+ return undefined;
77
+ if (!Object.prototype.hasOwnProperty.call(current, part))
78
+ return undefined;
79
+ current = current[part];
80
+ }
81
+ return current;
82
+ }
83
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sourceRoot":"","sources":["../src/event.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=event.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.test.d.ts","sourceRoot":"","sources":["../src/event.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,40 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { createEvent, eventKey, getNestedValue } from './event.js';
3
+ describe('createEvent', () => {
4
+ it('creates an event with required fields', () => {
5
+ const event = createEvent('test-source', 'DATA', { message: 'hello' });
6
+ expect(event.event_id).toBeDefined();
7
+ expect(event.source_id).toBe('test-source');
8
+ expect(event.event_type).toBe('DATA');
9
+ expect(event.payload).toEqual({ message: 'hello' });
10
+ expect(event.timestamp).toBeDefined();
11
+ expect(event.priority).toBe(3);
12
+ });
13
+ it('accepts optional fields', () => {
14
+ const event = createEvent('src', 'ALERT', { x: 1 }, {
15
+ priority: 1,
16
+ metadata: { tag: 'urgent' },
17
+ raw: 'raw data',
18
+ });
19
+ expect(event.priority).toBe(1);
20
+ expect(event.metadata).toEqual({ tag: 'urgent' });
21
+ expect(event.raw).toBe('raw data');
22
+ });
23
+ });
24
+ describe('getNestedValue', () => {
25
+ it('resolves nested paths', () => {
26
+ const obj = { a: { b: { c: 42 } } };
27
+ expect(getNestedValue(obj, 'a.b.c')).toBe(42);
28
+ });
29
+ it('returns undefined for missing paths', () => {
30
+ expect(getNestedValue({}, 'a.b')).toBeUndefined();
31
+ });
32
+ });
33
+ describe('eventKey', () => {
34
+ it('generates a key from specified fields', () => {
35
+ const event = createEvent('src', 'DATA', { src_ip: '10.0.0.1', dst_port: 443 });
36
+ const key = eventKey(event, ['payload.src_ip', 'payload.dst_port']);
37
+ expect(key).toBe('10.0.0.1|443');
38
+ });
39
+ });
40
+ //# sourceMappingURL=event.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.test.js","sourceRoot":"","sources":["../src/event.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,MAAM,QAAQ,CAAC;AAC9C,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAEnE,QAAQ,CAAC,aAAa,EAAE,GAAG,EAAE;IAC3B,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,aAAa,EAAE,MAAM,EAAE,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QAEvE,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,WAAW,EAAE,CAAC;QACrC,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,IAAI,CAAC,aAAa,CAAC,CAAC;QAC5C,MAAM,CAAC,KAAK,CAAC,UAAU,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,OAAO,CAAC,EAAE,OAAO,EAAE,OAAO,EAAE,CAAC,CAAC;QACpD,MAAM,CAAC,KAAK,CAAC,SAAS,CAAC,CAAC,WAAW,EAAE,CAAC;QACtC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;IACjC,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,yBAAyB,EAAE,GAAG,EAAE;QACjC,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,OAAO,EAAE,EAAE,CAAC,EAAE,CAAC,EAAE,EAAE;YAClD,QAAQ,EAAE,CAAC;YACX,QAAQ,EAAE,EAAE,GAAG,EAAE,QAAQ,EAAE;YAC3B,GAAG,EAAE,UAAU;SAChB,CAAC,CAAC;QAEH,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC;QAC/B,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,OAAO,CAAC,EAAE,GAAG,EAAE,QAAQ,EAAE,CAAC,CAAC;QAClD,MAAM,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,UAAU,CAAC,CAAC;IACrC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,gBAAgB,EAAE,GAAG,EAAE;IAC9B,EAAE,CAAC,uBAAuB,EAAE,GAAG,EAAE;QAC/B,MAAM,GAAG,GAAG,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,CAAC,EAAE,EAAE,EAAE,EAAE,EAAE,CAAC;QACpC,MAAM,CAAC,cAAc,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;IAChD,CAAC,CAAC,CAAC;IAEH,EAAE,CAAC,qCAAqC,EAAE,GAAG,EAAE;QAC7C,MAAM,CAAC,cAAc,CAAC,EAAE,EAAE,KAAK,CAAC,CAAC,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC;AAEH,QAAQ,CAAC,UAAU,EAAE,GAAG,EAAE;IACxB,EAAE,CAAC,uCAAuC,EAAE,GAAG,EAAE;QAC/C,MAAM,KAAK,GAAG,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE,MAAM,EAAE,UAAU,EAAE,QAAQ,EAAE,GAAG,EAAE,CAAC,CAAC;QAChF,MAAM,GAAG,GAAG,QAAQ,CAAC,KAAK,EAAE,CAAC,gBAAgB,EAAE,kBAAkB,CAAC,CAAC,CAAC;QACpE,MAAM,CAAC,GAAG,CAAC,CAAC,IAAI,CAAC,cAAc,CAAC,CAAC;IACnC,CAAC,CAAC,CAAC;AACL,CAAC,CAAC,CAAC"}
@@ -0,0 +1,25 @@
1
+ import type { TunnloEvent } from './types.js';
2
+ import type { EventCallback, MessageBus } from './bus.js';
3
+ export interface FastBusConfig {
4
+ batchSize?: number;
5
+ flushIntervalMs?: number;
6
+ maxQueueSize?: number;
7
+ }
8
+ export declare class FastBus implements MessageBus {
9
+ private subscribers;
10
+ private queues;
11
+ private closed;
12
+ private batchSize;
13
+ private flushIntervalMs;
14
+ private maxQueueSize;
15
+ private flushTimers;
16
+ private processing;
17
+ constructor(config?: FastBusConfig);
18
+ publish(topic: string, event: TunnloEvent): Promise<void>;
19
+ subscribe(topic: string, callback: EventCallback): void;
20
+ unsubscribe(topic: string, callback: EventCallback): void;
21
+ close(): Promise<void>;
22
+ private flush;
23
+ get queueSize(): number;
24
+ }
25
+ //# sourceMappingURL=fast-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-bus.d.ts","sourceRoot":"","sources":["../src/fast-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG1D,MAAM,WAAW,aAAa;IAC5B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,MAAM,CAAC;IACzB,YAAY,CAAC,EAAE,MAAM,CAAC;CACvB;AAED,qBAAa,OAAQ,YAAW,UAAU;IACxC,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,MAAM,CAAoC;IAClD,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,eAAe,CAAS;IAChC,OAAO,CAAC,YAAY,CAAS;IAC7B,OAAO,CAAC,WAAW,CAAqD;IACxE,OAAO,CAAC,UAAU,CAAqB;gBAE3B,MAAM,GAAE,aAAkB;IAMhC,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAsB/D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAiBvD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAenD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAiBd,KAAK;IA4BnB,IAAI,SAAS,IAAI,MAAM,CAMtB;CACF"}
@@ -0,0 +1,114 @@
1
+ import { getLogger } from './logger.js';
2
+ export class FastBus {
3
+ subscribers = new Map();
4
+ queues = new Map();
5
+ closed = false;
6
+ batchSize;
7
+ flushIntervalMs;
8
+ maxQueueSize;
9
+ flushTimers = new Map();
10
+ processing = new Set();
11
+ constructor(config = {}) {
12
+ this.batchSize = config.batchSize ?? 100;
13
+ this.flushIntervalMs = config.flushIntervalMs ?? 10;
14
+ this.maxQueueSize = config.maxQueueSize ?? 50_000;
15
+ }
16
+ async publish(topic, event) {
17
+ if (this.closed)
18
+ return;
19
+ let queue = this.queues.get(topic);
20
+ if (!queue) {
21
+ queue = [];
22
+ this.queues.set(topic, queue);
23
+ }
24
+ // Drop events if queue is full (backpressure)
25
+ if (queue.length >= this.maxQueueSize) {
26
+ return;
27
+ }
28
+ queue.push(event);
29
+ // Flush immediately if batch size reached
30
+ if (queue.length >= this.batchSize) {
31
+ await this.flush(topic);
32
+ }
33
+ }
34
+ subscribe(topic, callback) {
35
+ if (!this.subscribers.has(topic)) {
36
+ this.subscribers.set(topic, new Set());
37
+ }
38
+ this.subscribers.get(topic).add(callback);
39
+ // Start periodic flush for this topic
40
+ if (!this.flushTimers.has(topic)) {
41
+ const timer = setInterval(() => {
42
+ this.flush(topic).catch((err) => {
43
+ getLogger().error(`[tunnlo:fast-bus] flush error on "${topic}":`, err);
44
+ });
45
+ }, this.flushIntervalMs);
46
+ this.flushTimers.set(topic, timer);
47
+ }
48
+ }
49
+ unsubscribe(topic, callback) {
50
+ const subs = this.subscribers.get(topic);
51
+ if (subs) {
52
+ subs.delete(callback);
53
+ // Clean up timer when last subscriber is removed
54
+ if (subs.size === 0) {
55
+ const timer = this.flushTimers.get(topic);
56
+ if (timer) {
57
+ clearInterval(timer);
58
+ this.flushTimers.delete(topic);
59
+ }
60
+ }
61
+ }
62
+ }
63
+ async close() {
64
+ this.closed = true;
65
+ // Flush remaining events
66
+ for (const topic of this.queues.keys()) {
67
+ await this.flush(topic);
68
+ }
69
+ // Clear timers
70
+ for (const timer of this.flushTimers.values()) {
71
+ clearInterval(timer);
72
+ }
73
+ this.flushTimers.clear();
74
+ this.subscribers.clear();
75
+ this.queues.clear();
76
+ }
77
+ async flush(topic) {
78
+ if (this.processing.has(topic))
79
+ return;
80
+ this.processing.add(topic);
81
+ try {
82
+ const queue = this.queues.get(topic);
83
+ if (!queue || queue.length === 0)
84
+ return;
85
+ // Take the batch
86
+ const batch = queue.splice(0, this.batchSize);
87
+ const subs = this.subscribers.get(topic);
88
+ if (!subs || subs.size === 0)
89
+ return;
90
+ // Deliver batch to subscribers
91
+ for (const event of batch) {
92
+ for (const cb of subs) {
93
+ try {
94
+ await cb(event);
95
+ }
96
+ catch (err) {
97
+ getLogger().error(`[tunnlo:fast-bus] subscriber error:`, err);
98
+ }
99
+ }
100
+ }
101
+ }
102
+ finally {
103
+ this.processing.delete(topic);
104
+ }
105
+ }
106
+ get queueSize() {
107
+ let total = 0;
108
+ for (const queue of this.queues.values()) {
109
+ total += queue.length;
110
+ }
111
+ return total;
112
+ }
113
+ }
114
+ //# sourceMappingURL=fast-bus.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-bus.js","sourceRoot":"","sources":["../src/fast-bus.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=fast-bus.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-bus.test.d.ts","sourceRoot":"","sources":["../src/fast-bus.test.ts"],"names":[],"mappings":""}
@@ -0,0 +1,63 @@
1
+ import { describe, it, expect } from 'vitest';
2
+ import { createEvent } from './event.js';
3
+ import { FastBus } from './fast-bus.js';
4
+ describe('FastBus', () => {
5
+ it('delivers events to subscribers', async () => {
6
+ const bus = new FastBus({ batchSize: 1, flushIntervalMs: 1000 });
7
+ const received = [];
8
+ bus.subscribe('test', (event) => {
9
+ received.push(event);
10
+ });
11
+ const event = createEvent('src', 'DATA', { msg: 'hello' });
12
+ await bus.publish('test', event);
13
+ // batchSize=1 triggers immediate flush
14
+ expect(received.length).toBe(1);
15
+ expect(received[0].payload.msg).toBe('hello');
16
+ await bus.close();
17
+ });
18
+ it('batches events until batch size is reached', async () => {
19
+ const bus = new FastBus({ batchSize: 3, flushIntervalMs: 60000 });
20
+ const received = [];
21
+ bus.subscribe('test', (event) => {
22
+ received.push(event);
23
+ });
24
+ await bus.publish('test', createEvent('src', 'DATA', { n: 1 }));
25
+ await bus.publish('test', createEvent('src', 'DATA', { n: 2 }));
26
+ expect(received.length).toBe(0);
27
+ await bus.publish('test', createEvent('src', 'DATA', { n: 3 }));
28
+ expect(received.length).toBe(3);
29
+ await bus.close();
30
+ });
31
+ it('drops events when queue is full', async () => {
32
+ const bus = new FastBus({ batchSize: 100, flushIntervalMs: 60000, maxQueueSize: 2 });
33
+ // No subscriber, so events queue up
34
+ await bus.publish('test', createEvent('src', 'DATA', { n: 1 }));
35
+ await bus.publish('test', createEvent('src', 'DATA', { n: 2 }));
36
+ await bus.publish('test', createEvent('src', 'DATA', { n: 3 })); // should be dropped
37
+ expect(bus.queueSize).toBe(2);
38
+ await bus.close();
39
+ });
40
+ it('flushes remaining events on close', async () => {
41
+ const bus = new FastBus({ batchSize: 100, flushIntervalMs: 60000 });
42
+ const received = [];
43
+ bus.subscribe('test', (event) => {
44
+ received.push(event);
45
+ });
46
+ await bus.publish('test', createEvent('src', 'DATA', { n: 1 }));
47
+ await bus.publish('test', createEvent('src', 'DATA', { n: 2 }));
48
+ expect(received.length).toBe(0);
49
+ await bus.close();
50
+ expect(received.length).toBe(2);
51
+ });
52
+ it('unsubscribe stops delivery', async () => {
53
+ const bus = new FastBus({ batchSize: 1, flushIntervalMs: 60000 });
54
+ const received = [];
55
+ const cb = (event) => { received.push(event); };
56
+ bus.subscribe('test', cb);
57
+ bus.unsubscribe('test', cb);
58
+ await bus.publish('test', createEvent('src', 'DATA', { n: 1 }));
59
+ expect(received.length).toBe(0);
60
+ await bus.close();
61
+ });
62
+ });
63
+ //# sourceMappingURL=fast-bus.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"fast-bus.test.js","sourceRoot":"","sources":["../src/fast-bus.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,16 @@
1
+ export type { TunnloEvent, EventType, Adapter, AdapterConfig, AdapterHealth, AdapterStatus, RawEvent, CursorState, StateStore, Filter, AgentBridge, AgentResponse, ActionRequest, ActionHandler, ActionResult, ActionConfig, AgentConfig, TokenBudget, BehaviorConfig, BusConfig, DashboardConfig, PipelineConfig, FilterConfig, OutputConfig, } from './types.js';
2
+ export { createEvent, eventKey, getNestedValue, validateOutboundUrl, validateEvent } from './event.js';
3
+ export { InMemoryBus } from './bus.js';
4
+ export type { MessageBus, EventCallback } from './bus.js';
5
+ export { JsonFileStateStore } from './state-store.js';
6
+ export { Pipeline } from './pipeline.js';
7
+ export type { PipelineOptions, MetricsPort } from './pipeline.js';
8
+ export { Logger, getLogger, setGlobalLogger } from './logger.js';
9
+ export type { LogLevel, LogFormat, LoggerOptions } from './logger.js';
10
+ export { RedisStreamsBus } from './redis-bus.js';
11
+ export type { RedisBusConfig } from './redis-bus.js';
12
+ export { KafkaBus } from './kafka-bus.js';
13
+ export type { KafkaBusConfig } from './kafka-bus.js';
14
+ export { FastBus } from './fast-bus.js';
15
+ export type { FastBusConfig } from './fast-bus.js';
16
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,YAAY,EACV,WAAW,EACX,SAAS,EACT,OAAO,EACP,aAAa,EACb,aAAa,EACb,aAAa,EACb,QAAQ,EACR,WAAW,EACX,UAAU,EACV,MAAM,EACN,WAAW,EACX,aAAa,EACb,aAAa,EACb,aAAa,EACb,YAAY,EACZ,YAAY,EACZ,WAAW,EACX,WAAW,EACX,cAAc,EACd,SAAS,EACT,eAAe,EACf,cAAc,EACd,YAAY,EACZ,YAAY,GACb,MAAM,YAAY,CAAC;AAEpB,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvG,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AACvC,YAAY,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAC1D,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AACzC,YAAY,EAAE,eAAe,EAAE,WAAW,EAAE,MAAM,eAAe,CAAC;AAClE,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AACjE,YAAY,EAAE,QAAQ,EAAE,SAAS,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AACtE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AACjD,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAC1C,YAAY,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AACrD,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC;AACxC,YAAY,EAAE,aAAa,EAAE,MAAM,eAAe,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,9 @@
1
+ export { createEvent, eventKey, getNestedValue, validateOutboundUrl, validateEvent } from './event.js';
2
+ export { InMemoryBus } from './bus.js';
3
+ export { JsonFileStateStore } from './state-store.js';
4
+ export { Pipeline } from './pipeline.js';
5
+ export { Logger, getLogger, setGlobalLogger } from './logger.js';
6
+ export { RedisStreamsBus } from './redis-bus.js';
7
+ export { KafkaBus } from './kafka-bus.js';
8
+ export { FastBus } from './fast-bus.js';
9
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AA2BA,OAAO,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,EAAE,mBAAmB,EAAE,aAAa,EAAE,MAAM,YAAY,CAAC;AACvG,OAAO,EAAE,WAAW,EAAE,MAAM,UAAU,CAAC;AAEvC,OAAO,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AACtD,OAAO,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAC;AAEzC,OAAO,EAAE,MAAM,EAAE,SAAS,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAEjE,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAEjD,OAAO,EAAE,QAAQ,EAAE,MAAM,gBAAgB,CAAC;AAE1C,OAAO,EAAE,OAAO,EAAE,MAAM,eAAe,CAAC"}
@@ -0,0 +1,27 @@
1
+ import type { TunnloEvent } from './types.js';
2
+ import type { EventCallback, MessageBus } from './bus.js';
3
+ export interface KafkaBusConfig {
4
+ brokers: string[];
5
+ clientId?: string;
6
+ groupId?: string;
7
+ maxBatchSize?: number;
8
+ lingerMs?: number;
9
+ }
10
+ export declare class KafkaBus implements MessageBus {
11
+ private subscribers;
12
+ private closed;
13
+ private connected;
14
+ private kafka;
15
+ private producer;
16
+ private consumers;
17
+ private config;
18
+ constructor(config: KafkaBusConfig);
19
+ connect(): Promise<void>;
20
+ private ensureConnected;
21
+ publish(topic: string, event: TunnloEvent): Promise<void>;
22
+ subscribe(topic: string, callback: EventCallback): void;
23
+ unsubscribe(topic: string, callback: EventCallback): void;
24
+ close(): Promise<void>;
25
+ private consumeTopic;
26
+ }
27
+ //# sourceMappingURL=kafka-bus.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"kafka-bus.d.ts","sourceRoot":"","sources":["../src/kafka-bus.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,YAAY,CAAC;AAC9C,OAAO,KAAK,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAI1D,MAAM,WAAW,cAAc;IAC7B,OAAO,EAAE,MAAM,EAAE,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,QAAQ,CAAC,EAAE,MAAM,CAAC;CACnB;AAED,qBAAa,QAAS,YAAW,UAAU;IACzC,OAAO,CAAC,WAAW,CAAyC;IAC5D,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,SAAS,CAAS;IAC1B,OAAO,CAAC,KAAK,CAAM;IACnB,OAAO,CAAC,QAAQ,CAAM;IACtB,OAAO,CAAC,SAAS,CAA0B;IAC3C,OAAO,CAAC,MAAM,CAAiB;gBAEnB,MAAM,EAAE,cAAc;IAU5B,OAAO,IAAI,OAAO,CAAC,IAAI,CAAC;IAmB9B,OAAO,CAAC,eAAe;IAMjB,OAAO,CAAC,KAAK,EAAE,MAAM,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IAmC/D,SAAS,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAavD,WAAW,CAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,aAAa,GAAG,IAAI;IAInD,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;YAoBd,YAAY;CAqC3B"}