@teneo-protocol/sdk 1.0.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.
- package/.dockerignore +14 -0
- package/.env.test.example +14 -0
- package/.eslintrc.json +26 -0
- package/.github/workflows/claude-code-review.yml +78 -0
- package/.github/workflows/claude-reviewer.yml +64 -0
- package/.github/workflows/publish-npm.yml +38 -0
- package/.github/workflows/push-to-main.yml +23 -0
- package/.node-version +1 -0
- package/.prettierrc +11 -0
- package/Dockerfile +25 -0
- package/LICENCE +661 -0
- package/README.md +709 -0
- package/dist/constants.d.ts +42 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +45 -0
- package/dist/constants.js.map +1 -0
- package/dist/core/websocket-client.d.ts +261 -0
- package/dist/core/websocket-client.d.ts.map +1 -0
- package/dist/core/websocket-client.js +875 -0
- package/dist/core/websocket-client.js.map +1 -0
- package/dist/formatters/response-formatter.d.ts +354 -0
- package/dist/formatters/response-formatter.d.ts.map +1 -0
- package/dist/formatters/response-formatter.js +575 -0
- package/dist/formatters/response-formatter.js.map +1 -0
- package/dist/handlers/message-handler-registry.d.ts +155 -0
- package/dist/handlers/message-handler-registry.d.ts.map +1 -0
- package/dist/handlers/message-handler-registry.js +216 -0
- package/dist/handlers/message-handler-registry.js.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts +112 -0
- package/dist/handlers/message-handlers/agent-selected-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js +40 -0
- package/dist/handlers/message-handlers/agent-selected-handler.js.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/agents-list-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/agents-list-handler.js +25 -0
- package/dist/handlers/message-handlers/agents-list-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts +71 -0
- package/dist/handlers/message-handlers/auth-error-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-error-handler.js +30 -0
- package/dist/handlers/message-handlers/auth-error-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-message-handler.js +60 -0
- package/dist/handlers/message-handlers/auth-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/auth-required-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-required-handler.js +23 -0
- package/dist/handlers/message-handlers/auth-required-handler.js.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts +18 -0
- package/dist/handlers/message-handlers/auth-success-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/auth-success-handler.js +51 -0
- package/dist/handlers/message-handlers/auth-success-handler.js.map +1 -0
- package/dist/handlers/message-handlers/base-handler.d.ts +55 -0
- package/dist/handlers/message-handlers/base-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/base-handler.js +83 -0
- package/dist/handlers/message-handlers/base-handler.js.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts +73 -0
- package/dist/handlers/message-handlers/challenge-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/challenge-handler.js +47 -0
- package/dist/handlers/message-handlers/challenge-handler.js.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts +76 -0
- package/dist/handlers/message-handlers/error-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/error-message-handler.js +29 -0
- package/dist/handlers/message-handlers/error-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/index.d.ts +28 -0
- package/dist/handlers/message-handlers/index.d.ts.map +1 -0
- package/dist/handlers/message-handlers/index.js +100 -0
- package/dist/handlers/message-handlers/index.js.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts +122 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js +30 -0
- package/dist/handlers/message-handlers/list-rooms-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts +104 -0
- package/dist/handlers/message-handlers/ping-pong-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js +36 -0
- package/dist/handlers/message-handlers/ping-pong-handler.js.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts +56 -0
- package/dist/handlers/message-handlers/regular-message-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/regular-message-handler.js +59 -0
- package/dist/handlers/message-handlers/regular-message-handler.js.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/subscribe-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts +14 -0
- package/dist/handlers/message-handlers/task-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/task-response-handler.js +44 -0
- package/dist/handlers/message-handlers/task-response-handler.js.map +1 -0
- package/dist/handlers/message-handlers/types.d.ts +51 -0
- package/dist/handlers/message-handlers/types.d.ts.map +1 -0
- package/dist/handlers/message-handlers/types.js +7 -0
- package/dist/handlers/message-handlers/types.js.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts +81 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.d.ts.map +1 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js +48 -0
- package/dist/handlers/message-handlers/unsubscribe-response-handler.js.map +1 -0
- package/dist/handlers/webhook-handler.d.ts +202 -0
- package/dist/handlers/webhook-handler.d.ts.map +1 -0
- package/dist/handlers/webhook-handler.js +511 -0
- package/dist/handlers/webhook-handler.js.map +1 -0
- package/dist/index.d.ts +71 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +217 -0
- package/dist/index.js.map +1 -0
- package/dist/managers/agent-registry.d.ts +173 -0
- package/dist/managers/agent-registry.d.ts.map +1 -0
- package/dist/managers/agent-registry.js +310 -0
- package/dist/managers/agent-registry.js.map +1 -0
- package/dist/managers/connection-manager.d.ts +134 -0
- package/dist/managers/connection-manager.d.ts.map +1 -0
- package/dist/managers/connection-manager.js +176 -0
- package/dist/managers/connection-manager.js.map +1 -0
- package/dist/managers/index.d.ts +9 -0
- package/dist/managers/index.d.ts.map +1 -0
- package/dist/managers/index.js +16 -0
- package/dist/managers/index.js.map +1 -0
- package/dist/managers/message-router.d.ts +112 -0
- package/dist/managers/message-router.d.ts.map +1 -0
- package/dist/managers/message-router.js +260 -0
- package/dist/managers/message-router.js.map +1 -0
- package/dist/managers/room-manager.d.ts +165 -0
- package/dist/managers/room-manager.d.ts.map +1 -0
- package/dist/managers/room-manager.js +227 -0
- package/dist/managers/room-manager.js.map +1 -0
- package/dist/teneo-sdk.d.ts +703 -0
- package/dist/teneo-sdk.d.ts.map +1 -0
- package/dist/teneo-sdk.js +907 -0
- package/dist/teneo-sdk.js.map +1 -0
- package/dist/types/config.d.ts +1047 -0
- package/dist/types/config.d.ts.map +1 -0
- package/dist/types/config.js +720 -0
- package/dist/types/config.js.map +1 -0
- package/dist/types/error-codes.d.ts +29 -0
- package/dist/types/error-codes.d.ts.map +1 -0
- package/dist/types/error-codes.js +41 -0
- package/dist/types/error-codes.js.map +1 -0
- package/dist/types/events.d.ts +616 -0
- package/dist/types/events.d.ts.map +1 -0
- package/dist/types/events.js +261 -0
- package/dist/types/events.js.map +1 -0
- package/dist/types/health.d.ts +40 -0
- package/dist/types/health.d.ts.map +1 -0
- package/dist/types/health.js +6 -0
- package/dist/types/health.js.map +1 -0
- package/dist/types/index.d.ts +10 -0
- package/dist/types/index.d.ts.map +1 -0
- package/dist/types/index.js +123 -0
- package/dist/types/index.js.map +1 -0
- package/dist/types/messages.d.ts +3734 -0
- package/dist/types/messages.d.ts.map +1 -0
- package/dist/types/messages.js +482 -0
- package/dist/types/messages.js.map +1 -0
- package/dist/types/validation.d.ts +81 -0
- package/dist/types/validation.d.ts.map +1 -0
- package/dist/types/validation.js +115 -0
- package/dist/types/validation.js.map +1 -0
- package/dist/utils/bounded-queue.d.ts +127 -0
- package/dist/utils/bounded-queue.d.ts.map +1 -0
- package/dist/utils/bounded-queue.js +181 -0
- package/dist/utils/bounded-queue.js.map +1 -0
- package/dist/utils/circuit-breaker.d.ts +141 -0
- package/dist/utils/circuit-breaker.d.ts.map +1 -0
- package/dist/utils/circuit-breaker.js +215 -0
- package/dist/utils/circuit-breaker.js.map +1 -0
- package/dist/utils/deduplication-cache.d.ts +110 -0
- package/dist/utils/deduplication-cache.d.ts.map +1 -0
- package/dist/utils/deduplication-cache.js +177 -0
- package/dist/utils/deduplication-cache.js.map +1 -0
- package/dist/utils/event-waiter.d.ts +101 -0
- package/dist/utils/event-waiter.d.ts.map +1 -0
- package/dist/utils/event-waiter.js +118 -0
- package/dist/utils/event-waiter.js.map +1 -0
- package/dist/utils/index.d.ts +51 -0
- package/dist/utils/index.d.ts.map +1 -0
- package/dist/utils/index.js +72 -0
- package/dist/utils/index.js.map +1 -0
- package/dist/utils/logger.d.ts +22 -0
- package/dist/utils/logger.d.ts.map +1 -0
- package/dist/utils/logger.js +91 -0
- package/dist/utils/logger.js.map +1 -0
- package/dist/utils/rate-limiter.d.ts +122 -0
- package/dist/utils/rate-limiter.d.ts.map +1 -0
- package/dist/utils/rate-limiter.js +190 -0
- package/dist/utils/rate-limiter.js.map +1 -0
- package/dist/utils/retry-policy.d.ts +191 -0
- package/dist/utils/retry-policy.d.ts.map +1 -0
- package/dist/utils/retry-policy.js +225 -0
- package/dist/utils/retry-policy.js.map +1 -0
- package/dist/utils/secure-private-key.d.ts +113 -0
- package/dist/utils/secure-private-key.d.ts.map +1 -0
- package/dist/utils/secure-private-key.js +188 -0
- package/dist/utils/secure-private-key.js.map +1 -0
- package/dist/utils/signature-verifier.d.ts +143 -0
- package/dist/utils/signature-verifier.d.ts.map +1 -0
- package/dist/utils/signature-verifier.js +238 -0
- package/dist/utils/signature-verifier.js.map +1 -0
- package/dist/utils/ssrf-validator.d.ts +36 -0
- package/dist/utils/ssrf-validator.d.ts.map +1 -0
- package/dist/utils/ssrf-validator.js +195 -0
- package/dist/utils/ssrf-validator.js.map +1 -0
- package/examples/.env.example +17 -0
- package/examples/basic-usage.ts +211 -0
- package/examples/production-dashboard/.env.example +153 -0
- package/examples/production-dashboard/package.json +39 -0
- package/examples/production-dashboard/public/dashboard.html +642 -0
- package/examples/production-dashboard/server.ts +753 -0
- package/examples/webhook-integration.ts +239 -0
- package/examples/x-influencer-battle-redesign.html +1065 -0
- package/examples/x-influencer-battle-server.ts +217 -0
- package/examples/x-influencer-battle.html +787 -0
- package/package.json +65 -0
- package/src/constants.ts +43 -0
- package/src/core/websocket-client.test.ts +512 -0
- package/src/core/websocket-client.ts +1056 -0
- package/src/formatters/response-formatter.test.ts +571 -0
- package/src/formatters/response-formatter.ts +677 -0
- package/src/handlers/message-handler-registry.ts +239 -0
- package/src/handlers/message-handlers/agent-selected-handler.ts +40 -0
- package/src/handlers/message-handlers/agents-list-handler.ts +26 -0
- package/src/handlers/message-handlers/auth-error-handler.ts +31 -0
- package/src/handlers/message-handlers/auth-message-handler.ts +66 -0
- package/src/handlers/message-handlers/auth-required-handler.ts +23 -0
- package/src/handlers/message-handlers/auth-success-handler.ts +57 -0
- package/src/handlers/message-handlers/base-handler.ts +101 -0
- package/src/handlers/message-handlers/challenge-handler.ts +57 -0
- package/src/handlers/message-handlers/error-message-handler.ts +27 -0
- package/src/handlers/message-handlers/index.ts +77 -0
- package/src/handlers/message-handlers/list-rooms-response-handler.ts +28 -0
- package/src/handlers/message-handlers/ping-pong-handler.ts +30 -0
- package/src/handlers/message-handlers/regular-message-handler.ts +65 -0
- package/src/handlers/message-handlers/subscribe-response-handler.ts +47 -0
- package/src/handlers/message-handlers/task-response-handler.ts +45 -0
- package/src/handlers/message-handlers/types.ts +77 -0
- package/src/handlers/message-handlers/unsubscribe-response-handler.ts +47 -0
- package/src/handlers/webhook-handler.test.ts +789 -0
- package/src/handlers/webhook-handler.ts +576 -0
- package/src/index.ts +269 -0
- package/src/managers/agent-registry.test.ts +466 -0
- package/src/managers/agent-registry.ts +347 -0
- package/src/managers/connection-manager.ts +195 -0
- package/src/managers/index.ts +9 -0
- package/src/managers/message-router.ts +349 -0
- package/src/managers/room-manager.ts +248 -0
- package/src/teneo-sdk.ts +1022 -0
- package/src/types/config.test.ts +325 -0
- package/src/types/config.ts +799 -0
- package/src/types/error-codes.ts +44 -0
- package/src/types/events.test.ts +302 -0
- package/src/types/events.ts +382 -0
- package/src/types/health.ts +46 -0
- package/src/types/index.ts +199 -0
- package/src/types/messages.test.ts +660 -0
- package/src/types/messages.ts +570 -0
- package/src/types/validation.ts +123 -0
- package/src/utils/bounded-queue.test.ts +356 -0
- package/src/utils/bounded-queue.ts +205 -0
- package/src/utils/circuit-breaker.test.ts +394 -0
- package/src/utils/circuit-breaker.ts +262 -0
- package/src/utils/deduplication-cache.test.ts +380 -0
- package/src/utils/deduplication-cache.ts +198 -0
- package/src/utils/event-waiter.test.ts +381 -0
- package/src/utils/event-waiter.ts +172 -0
- package/src/utils/index.ts +74 -0
- package/src/utils/logger.ts +87 -0
- package/src/utils/rate-limiter.test.ts +341 -0
- package/src/utils/rate-limiter.ts +211 -0
- package/src/utils/retry-policy.test.ts +558 -0
- package/src/utils/retry-policy.ts +272 -0
- package/src/utils/secure-private-key.test.ts +356 -0
- package/src/utils/secure-private-key.ts +205 -0
- package/src/utils/signature-verifier.test.ts +464 -0
- package/src/utils/signature-verifier.ts +298 -0
- package/src/utils/ssrf-validator.test.ts +372 -0
- package/src/utils/ssrf-validator.ts +224 -0
- package/tests/integration/real-server.test.ts +740 -0
- package/tests/integration/websocket.test.ts +381 -0
- package/tests/integration-setup.ts +16 -0
- package/tests/setup.ts +34 -0
- package/tsconfig.json +32 -0
- package/vitest.config.ts +42 -0
- package/vitest.integration.config.ts +23 -0
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Event Waiter Utility
|
|
4
|
+
* Provides a clean Promise-based API for waiting for events with timeout and filtering
|
|
5
|
+
* Eliminates callback hell and ensures proper cleanup of listeners and timers
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.waitForEvent = waitForEvent;
|
|
9
|
+
exports.waitForAnyEvent = waitForAnyEvent;
|
|
10
|
+
exports.waitForAllEvents = waitForAllEvents;
|
|
11
|
+
/**
|
|
12
|
+
* Wait for an event to be emitted with automatic timeout and cleanup
|
|
13
|
+
*
|
|
14
|
+
* This utility encapsulates the complex pattern of:
|
|
15
|
+
* - Setting up event listeners
|
|
16
|
+
* - Managing timeouts
|
|
17
|
+
* - Cleaning up listeners and timers in all code paths
|
|
18
|
+
* - Filtering events
|
|
19
|
+
*
|
|
20
|
+
* All cleanup is guaranteed to happen, preventing memory leaks.
|
|
21
|
+
*
|
|
22
|
+
* @param emitter - The EventEmitter to listen to
|
|
23
|
+
* @param eventName - The name of the event to wait for
|
|
24
|
+
* @param options - Configuration options
|
|
25
|
+
* @returns Promise that resolves with the event data or rejects on timeout
|
|
26
|
+
*
|
|
27
|
+
* @example
|
|
28
|
+
* ```typescript
|
|
29
|
+
* // Simple usage: wait for any 'data' event
|
|
30
|
+
* const data = await waitForEvent(emitter, 'data', { timeout: 5000 });
|
|
31
|
+
*
|
|
32
|
+
* // With filter: wait for specific event
|
|
33
|
+
* const response = await waitForEvent(wsClient, 'agent:response', {
|
|
34
|
+
* timeout: 30000,
|
|
35
|
+
* filter: (r) => r.taskId === myTaskId,
|
|
36
|
+
* timeoutMessage: 'Agent did not respond in time'
|
|
37
|
+
* });
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
async function waitForEvent(emitter, eventName, options) {
|
|
41
|
+
return new Promise((resolve, reject) => {
|
|
42
|
+
let timeoutHandle;
|
|
43
|
+
let eventHandler;
|
|
44
|
+
let cleaned = false;
|
|
45
|
+
// Cleanup function - ensures we only clean up once
|
|
46
|
+
const cleanup = () => {
|
|
47
|
+
if (cleaned)
|
|
48
|
+
return;
|
|
49
|
+
cleaned = true;
|
|
50
|
+
if (timeoutHandle) {
|
|
51
|
+
clearTimeout(timeoutHandle);
|
|
52
|
+
timeoutHandle = undefined;
|
|
53
|
+
}
|
|
54
|
+
if (eventHandler) {
|
|
55
|
+
emitter.off(eventName, eventHandler);
|
|
56
|
+
eventHandler = undefined;
|
|
57
|
+
}
|
|
58
|
+
};
|
|
59
|
+
// Event handler - filters and resolves
|
|
60
|
+
eventHandler = (data) => {
|
|
61
|
+
// If filter is provided, check if this event matches
|
|
62
|
+
if (options.filter && !options.filter(data)) {
|
|
63
|
+
// Not the event we're looking for, keep waiting
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
// This is the event we want!
|
|
67
|
+
cleanup();
|
|
68
|
+
resolve(data);
|
|
69
|
+
};
|
|
70
|
+
// Timeout handler - rejects after timeout
|
|
71
|
+
timeoutHandle = setTimeout(() => {
|
|
72
|
+
cleanup();
|
|
73
|
+
const message = options.timeoutMessage || `Timeout waiting for event '${eventName}' after ${options.timeout}ms`;
|
|
74
|
+
reject(new Error(message));
|
|
75
|
+
}, options.timeout);
|
|
76
|
+
// Start listening
|
|
77
|
+
emitter.on(eventName, eventHandler);
|
|
78
|
+
});
|
|
79
|
+
}
|
|
80
|
+
/**
|
|
81
|
+
* Wait for multiple events simultaneously (race condition)
|
|
82
|
+
* Resolves with the first event that fires and matches its filter
|
|
83
|
+
*
|
|
84
|
+
* @param waiters - Array of event waiter configurations
|
|
85
|
+
* @returns Promise that resolves with the first matching event
|
|
86
|
+
*
|
|
87
|
+
* @example
|
|
88
|
+
* ```typescript
|
|
89
|
+
* // Wait for either success or error
|
|
90
|
+
* const result = await waitForAnyEvent([
|
|
91
|
+
* { emitter: client, eventName: 'auth:success', options: { timeout: 5000 } },
|
|
92
|
+
* { emitter: client, eventName: 'auth:error', options: { timeout: 5000 } }
|
|
93
|
+
* ]);
|
|
94
|
+
* ```
|
|
95
|
+
*/
|
|
96
|
+
async function waitForAnyEvent(waiters) {
|
|
97
|
+
return Promise.race(waiters.map(({ emitter, eventName, options }) => waitForEvent(emitter, eventName, options)));
|
|
98
|
+
}
|
|
99
|
+
/**
|
|
100
|
+
* Wait for all events to fire (all must complete)
|
|
101
|
+
* Useful when you need multiple events to occur before proceeding
|
|
102
|
+
*
|
|
103
|
+
* @param waiters - Array of event waiter configurations
|
|
104
|
+
* @returns Promise that resolves with array of all event data
|
|
105
|
+
*
|
|
106
|
+
* @example
|
|
107
|
+
* ```typescript
|
|
108
|
+
* // Wait for both auth and connection
|
|
109
|
+
* const [authState, connState] = await waitForAllEvents([
|
|
110
|
+
* { emitter: client, eventName: 'auth:success', options: { timeout: 5000 } },
|
|
111
|
+
* { emitter: client, eventName: 'connection:open', options: { timeout: 5000 } }
|
|
112
|
+
* ]);
|
|
113
|
+
* ```
|
|
114
|
+
*/
|
|
115
|
+
async function waitForAllEvents(waiters) {
|
|
116
|
+
return Promise.all(waiters.map(({ emitter, eventName, options }) => waitForEvent(emitter, eventName, options)));
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=event-waiter.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"event-waiter.js","sourceRoot":"","sources":["../../src/utils/event-waiter.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;AA0DH,oCAiDC;AAkBD,0CAYC;AAkBD,4CAYC;AA1ID;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA4BG;AACI,KAAK,UAAU,YAAY,CAChC,OAAqB,EACrB,SAAiB,EACjB,OAA+B;IAE/B,OAAO,IAAI,OAAO,CAAI,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;QACxC,IAAI,aAAyC,CAAC;QAC9C,IAAI,YAA6C,CAAC;QAClD,IAAI,OAAO,GAAG,KAAK,CAAC;QAEpB,mDAAmD;QACnD,MAAM,OAAO,GAAG,GAAG,EAAE;YACnB,IAAI,OAAO;gBAAE,OAAO;YACpB,OAAO,GAAG,IAAI,CAAC;YAEf,IAAI,aAAa,EAAE,CAAC;gBAClB,YAAY,CAAC,aAAa,CAAC,CAAC;gBAC5B,aAAa,GAAG,SAAS,CAAC;YAC5B,CAAC;YAED,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;gBACrC,YAAY,GAAG,SAAS,CAAC;YAC3B,CAAC;QACH,CAAC,CAAC;QAEF,uCAAuC;QACvC,YAAY,GAAG,CAAC,IAAO,EAAE,EAAE;YACzB,qDAAqD;YACrD,IAAI,OAAO,CAAC,MAAM,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;gBAC5C,gDAAgD;gBAChD,OAAO;YACT,CAAC;YAED,6BAA6B;YAC7B,OAAO,EAAE,CAAC;YACV,OAAO,CAAC,IAAI,CAAC,CAAC;QAChB,CAAC,CAAC;QAEF,0CAA0C;QAC1C,aAAa,GAAG,UAAU,CAAC,GAAG,EAAE;YAC9B,OAAO,EAAE,CAAC;YACV,MAAM,OAAO,GAAG,OAAO,CAAC,cAAc,IAAI,8BAA8B,SAAS,WAAW,OAAO,CAAC,OAAO,IAAI,CAAC;YAChH,MAAM,CAAC,IAAI,KAAK,CAAC,OAAO,CAAC,CAAC,CAAC;QAC7B,CAAC,EAAE,OAAO,CAAC,OAAO,CAAC,CAAC;QAEpB,kBAAkB;QAClB,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,YAAY,CAAC,CAAC;IACtC,CAAC,CAAC,CAAC;AACL,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,eAAe,CACnC,OAIE;IAEF,OAAO,OAAO,CAAC,IAAI,CACjB,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAC9C,YAAY,CAAI,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAC7C,CACF,CAAC;AACJ,CAAC;AAED;;;;;;;;;;;;;;;GAeG;AACI,KAAK,UAAU,gBAAgB,CACpC,OAIE;IAEF,OAAO,OAAO,CAAC,GAAG,CAChB,OAAO,CAAC,GAAG,CAAC,CAAC,EAAE,OAAO,EAAE,SAAS,EAAE,OAAO,EAAE,EAAE,EAAE,CAC9C,YAAY,CAAI,OAAO,EAAE,SAAS,EAAE,OAAO,CAAC,CAC7C,CACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,51 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Utility functions and helpers for the Teneo Protocol SDK
|
|
3
|
+
*/
|
|
4
|
+
/**
|
|
5
|
+
* Logger creation utilities
|
|
6
|
+
*/
|
|
7
|
+
export { createPinoLogger } from "./logger";
|
|
8
|
+
/**
|
|
9
|
+
* SSRF protection utilities for webhook URL validation
|
|
10
|
+
* Prevents Server-Side Request Forgery attacks
|
|
11
|
+
*/
|
|
12
|
+
export { validateWebhookUrl, isPrivateIP, isCloudMetadataEndpoint } from "./ssrf-validator";
|
|
13
|
+
/**
|
|
14
|
+
* Event waiting utilities for async event handling
|
|
15
|
+
* Wait for specific events with timeout support
|
|
16
|
+
*/
|
|
17
|
+
export { waitForEvent, waitForAnyEvent, waitForAllEvents, type WaitForEventOptions } from "./event-waiter";
|
|
18
|
+
/**
|
|
19
|
+
* Memory-safe bounded queue with overflow strategies
|
|
20
|
+
* Prevents unbounded memory growth
|
|
21
|
+
*/
|
|
22
|
+
export { BoundedQueue, QueueOverflowError, type OverflowStrategy } from "./bounded-queue";
|
|
23
|
+
/**
|
|
24
|
+
* Token bucket rate limiter for request throttling
|
|
25
|
+
*/
|
|
26
|
+
export { TokenBucketRateLimiter, RateLimitError } from "./rate-limiter";
|
|
27
|
+
/**
|
|
28
|
+
* Circuit breaker pattern for fault tolerance
|
|
29
|
+
* Prevents cascading failures with automatic recovery
|
|
30
|
+
*/
|
|
31
|
+
export { CircuitBreaker, CircuitBreakerError, type CircuitState } from "./circuit-breaker";
|
|
32
|
+
/**
|
|
33
|
+
* Message deduplication cache with TTL support
|
|
34
|
+
*/
|
|
35
|
+
export { DeduplicationCache } from "./deduplication-cache";
|
|
36
|
+
/**
|
|
37
|
+
* Ethereum signature verification utilities (SEC-2)
|
|
38
|
+
* ECDSA signature validation for message authenticity
|
|
39
|
+
*/
|
|
40
|
+
export { SignatureVerifier, type SignatureVerificationOptions, type VerificationResult } from "./signature-verifier";
|
|
41
|
+
/**
|
|
42
|
+
* Secure private key storage with AES-256-GCM encryption (SEC-3)
|
|
43
|
+
* Protects private keys from memory dumps
|
|
44
|
+
*/
|
|
45
|
+
export { SecurePrivateKey } from "./secure-private-key";
|
|
46
|
+
/**
|
|
47
|
+
* Configurable retry strategies for resilient operations (REL-3)
|
|
48
|
+
* Supports exponential, linear, and constant backoff
|
|
49
|
+
*/
|
|
50
|
+
export { RetryPolicy, RetryStrategySchema, type RetryStrategy, type RetryStrategyType } from "./retry-policy";
|
|
51
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH;;GAEG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,UAAU,CAAC;AAE5C;;;GAGG;AACH,OAAO,EAAE,kBAAkB,EAAE,WAAW,EAAE,uBAAuB,EAAE,MAAM,kBAAkB,CAAC;AAE5F;;;GAGG;AACH,OAAO,EACL,YAAY,EACZ,eAAe,EACf,gBAAgB,EAChB,KAAK,mBAAmB,EACzB,MAAM,gBAAgB,CAAC;AAExB;;;GAGG;AACH,OAAO,EAAE,YAAY,EAAE,kBAAkB,EAAE,KAAK,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAE1F;;GAEG;AACH,OAAO,EAAE,sBAAsB,EAAE,cAAc,EAAE,MAAM,gBAAgB,CAAC;AAExE;;;GAGG;AACH,OAAO,EAAE,cAAc,EAAE,mBAAmB,EAAE,KAAK,YAAY,EAAE,MAAM,mBAAmB,CAAC;AAE3F;;GAEG;AACH,OAAO,EAAE,kBAAkB,EAAE,MAAM,uBAAuB,CAAC;AAE3D;;;GAGG;AACH,OAAO,EACL,iBAAiB,EACjB,KAAK,4BAA4B,EACjC,KAAK,kBAAkB,EACxB,MAAM,sBAAsB,CAAC;AAE9B;;;GAGG;AACH,OAAO,EAAE,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AAExD;;;GAGG;AACH,OAAO,EACL,WAAW,EACX,mBAAmB,EACnB,KAAK,aAAa,EAClB,KAAK,iBAAiB,EACvB,MAAM,gBAAgB,CAAC"}
|
|
@@ -0,0 +1,72 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Utility functions and helpers for the Teneo Protocol SDK
|
|
4
|
+
*/
|
|
5
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
|
+
exports.RetryStrategySchema = exports.RetryPolicy = exports.SecurePrivateKey = exports.SignatureVerifier = exports.DeduplicationCache = exports.CircuitBreakerError = exports.CircuitBreaker = exports.RateLimitError = exports.TokenBucketRateLimiter = exports.QueueOverflowError = exports.BoundedQueue = exports.waitForAllEvents = exports.waitForAnyEvent = exports.waitForEvent = exports.isCloudMetadataEndpoint = exports.isPrivateIP = exports.validateWebhookUrl = exports.createPinoLogger = void 0;
|
|
7
|
+
/**
|
|
8
|
+
* Logger creation utilities
|
|
9
|
+
*/
|
|
10
|
+
var logger_1 = require("./logger");
|
|
11
|
+
Object.defineProperty(exports, "createPinoLogger", { enumerable: true, get: function () { return logger_1.createPinoLogger; } });
|
|
12
|
+
/**
|
|
13
|
+
* SSRF protection utilities for webhook URL validation
|
|
14
|
+
* Prevents Server-Side Request Forgery attacks
|
|
15
|
+
*/
|
|
16
|
+
var ssrf_validator_1 = require("./ssrf-validator");
|
|
17
|
+
Object.defineProperty(exports, "validateWebhookUrl", { enumerable: true, get: function () { return ssrf_validator_1.validateWebhookUrl; } });
|
|
18
|
+
Object.defineProperty(exports, "isPrivateIP", { enumerable: true, get: function () { return ssrf_validator_1.isPrivateIP; } });
|
|
19
|
+
Object.defineProperty(exports, "isCloudMetadataEndpoint", { enumerable: true, get: function () { return ssrf_validator_1.isCloudMetadataEndpoint; } });
|
|
20
|
+
/**
|
|
21
|
+
* Event waiting utilities for async event handling
|
|
22
|
+
* Wait for specific events with timeout support
|
|
23
|
+
*/
|
|
24
|
+
var event_waiter_1 = require("./event-waiter");
|
|
25
|
+
Object.defineProperty(exports, "waitForEvent", { enumerable: true, get: function () { return event_waiter_1.waitForEvent; } });
|
|
26
|
+
Object.defineProperty(exports, "waitForAnyEvent", { enumerable: true, get: function () { return event_waiter_1.waitForAnyEvent; } });
|
|
27
|
+
Object.defineProperty(exports, "waitForAllEvents", { enumerable: true, get: function () { return event_waiter_1.waitForAllEvents; } });
|
|
28
|
+
/**
|
|
29
|
+
* Memory-safe bounded queue with overflow strategies
|
|
30
|
+
* Prevents unbounded memory growth
|
|
31
|
+
*/
|
|
32
|
+
var bounded_queue_1 = require("./bounded-queue");
|
|
33
|
+
Object.defineProperty(exports, "BoundedQueue", { enumerable: true, get: function () { return bounded_queue_1.BoundedQueue; } });
|
|
34
|
+
Object.defineProperty(exports, "QueueOverflowError", { enumerable: true, get: function () { return bounded_queue_1.QueueOverflowError; } });
|
|
35
|
+
/**
|
|
36
|
+
* Token bucket rate limiter for request throttling
|
|
37
|
+
*/
|
|
38
|
+
var rate_limiter_1 = require("./rate-limiter");
|
|
39
|
+
Object.defineProperty(exports, "TokenBucketRateLimiter", { enumerable: true, get: function () { return rate_limiter_1.TokenBucketRateLimiter; } });
|
|
40
|
+
Object.defineProperty(exports, "RateLimitError", { enumerable: true, get: function () { return rate_limiter_1.RateLimitError; } });
|
|
41
|
+
/**
|
|
42
|
+
* Circuit breaker pattern for fault tolerance
|
|
43
|
+
* Prevents cascading failures with automatic recovery
|
|
44
|
+
*/
|
|
45
|
+
var circuit_breaker_1 = require("./circuit-breaker");
|
|
46
|
+
Object.defineProperty(exports, "CircuitBreaker", { enumerable: true, get: function () { return circuit_breaker_1.CircuitBreaker; } });
|
|
47
|
+
Object.defineProperty(exports, "CircuitBreakerError", { enumerable: true, get: function () { return circuit_breaker_1.CircuitBreakerError; } });
|
|
48
|
+
/**
|
|
49
|
+
* Message deduplication cache with TTL support
|
|
50
|
+
*/
|
|
51
|
+
var deduplication_cache_1 = require("./deduplication-cache");
|
|
52
|
+
Object.defineProperty(exports, "DeduplicationCache", { enumerable: true, get: function () { return deduplication_cache_1.DeduplicationCache; } });
|
|
53
|
+
/**
|
|
54
|
+
* Ethereum signature verification utilities (SEC-2)
|
|
55
|
+
* ECDSA signature validation for message authenticity
|
|
56
|
+
*/
|
|
57
|
+
var signature_verifier_1 = require("./signature-verifier");
|
|
58
|
+
Object.defineProperty(exports, "SignatureVerifier", { enumerable: true, get: function () { return signature_verifier_1.SignatureVerifier; } });
|
|
59
|
+
/**
|
|
60
|
+
* Secure private key storage with AES-256-GCM encryption (SEC-3)
|
|
61
|
+
* Protects private keys from memory dumps
|
|
62
|
+
*/
|
|
63
|
+
var secure_private_key_1 = require("./secure-private-key");
|
|
64
|
+
Object.defineProperty(exports, "SecurePrivateKey", { enumerable: true, get: function () { return secure_private_key_1.SecurePrivateKey; } });
|
|
65
|
+
/**
|
|
66
|
+
* Configurable retry strategies for resilient operations (REL-3)
|
|
67
|
+
* Supports exponential, linear, and constant backoff
|
|
68
|
+
*/
|
|
69
|
+
var retry_policy_1 = require("./retry-policy");
|
|
70
|
+
Object.defineProperty(exports, "RetryPolicy", { enumerable: true, get: function () { return retry_policy_1.RetryPolicy; } });
|
|
71
|
+
Object.defineProperty(exports, "RetryStrategySchema", { enumerable: true, get: function () { return retry_policy_1.RetryStrategySchema; } });
|
|
72
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/utils/index.ts"],"names":[],"mappings":";AAAA;;GAEG;;;AAEH;;GAEG;AACH,mCAA4C;AAAnC,0GAAA,gBAAgB,OAAA;AAEzB;;;GAGG;AACH,mDAA4F;AAAnF,oHAAA,kBAAkB,OAAA;AAAE,6GAAA,WAAW,OAAA;AAAE,yHAAA,uBAAuB,OAAA;AAEjE;;;GAGG;AACH,+CAKwB;AAJtB,4GAAA,YAAY,OAAA;AACZ,+GAAA,eAAe,OAAA;AACf,gHAAA,gBAAgB,OAAA;AAIlB;;;GAGG;AACH,iDAA0F;AAAjF,6GAAA,YAAY,OAAA;AAAE,mHAAA,kBAAkB,OAAA;AAEzC;;GAEG;AACH,+CAAwE;AAA/D,sHAAA,sBAAsB,OAAA;AAAE,8GAAA,cAAc,OAAA;AAE/C;;;GAGG;AACH,qDAA2F;AAAlF,iHAAA,cAAc,OAAA;AAAE,sHAAA,mBAAmB,OAAA;AAE5C;;GAEG;AACH,6DAA2D;AAAlD,yHAAA,kBAAkB,OAAA;AAE3B;;;GAGG;AACH,2DAI8B;AAH5B,uHAAA,iBAAiB,OAAA;AAKnB;;;GAGG;AACH,2DAAwD;AAA/C,sHAAA,gBAAgB,OAAA;AAEzB;;;GAGG;AACH,+CAKwB;AAJtB,2GAAA,WAAW,OAAA;AACX,mHAAA,mBAAmB,OAAA"}
|
|
@@ -0,0 +1,22 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Logger utility for Teneo Protocol SDK
|
|
3
|
+
* Provides pino-based logging with structured output and optional pretty printing
|
|
4
|
+
*/
|
|
5
|
+
import type { Logger, LogLevel } from "../types";
|
|
6
|
+
/**
|
|
7
|
+
* Creates a pino-based logger that conforms to the SDK Logger interface.
|
|
8
|
+
* Automatically configures pretty printing for development environments.
|
|
9
|
+
*
|
|
10
|
+
* @param level - Log level (debug, info, warn, error, silent)
|
|
11
|
+
* @param name - Logger name for identifying log source (e.g., "TeneoSDK", "WebSocketClient")
|
|
12
|
+
* @returns Logger instance compatible with SDK Logger interface
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```typescript
|
|
16
|
+
* const logger = createPinoLogger('info', 'TeneoSDK');
|
|
17
|
+
* logger.info('SDK initialized', { wsUrl: 'wss://example.com' });
|
|
18
|
+
* logger.error('Connection failed', { code: 'CONN_FAILED', attempt: 3 });
|
|
19
|
+
* ```
|
|
20
|
+
*/
|
|
21
|
+
export declare function createPinoLogger(level: LogLevel, name?: string): Logger;
|
|
22
|
+
//# sourceMappingURL=logger.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,OAAO,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEjD;;;;;;;;;;;;;;GAcG;AACH,wBAAgB,gBAAgB,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,CAAC,EAAE,MAAM,GAAG,MAAM,CA+DvE"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Logger utility for Teneo Protocol SDK
|
|
4
|
+
* Provides pino-based logging with structured output and optional pretty printing
|
|
5
|
+
*/
|
|
6
|
+
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
7
|
+
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
8
|
+
};
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.createPinoLogger = createPinoLogger;
|
|
11
|
+
const pino_1 = __importDefault(require("pino"));
|
|
12
|
+
/**
|
|
13
|
+
* Creates a pino-based logger that conforms to the SDK Logger interface.
|
|
14
|
+
* Automatically configures pretty printing for development environments.
|
|
15
|
+
*
|
|
16
|
+
* @param level - Log level (debug, info, warn, error, silent)
|
|
17
|
+
* @param name - Logger name for identifying log source (e.g., "TeneoSDK", "WebSocketClient")
|
|
18
|
+
* @returns Logger instance compatible with SDK Logger interface
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const logger = createPinoLogger('info', 'TeneoSDK');
|
|
23
|
+
* logger.info('SDK initialized', { wsUrl: 'wss://example.com' });
|
|
24
|
+
* logger.error('Connection failed', { code: 'CONN_FAILED', attempt: 3 });
|
|
25
|
+
* ```
|
|
26
|
+
*/
|
|
27
|
+
function createPinoLogger(level, name) {
|
|
28
|
+
// Map 'silent' to pino's 'silent' level
|
|
29
|
+
const pinoLevel = level === "silent" ? "silent" : level;
|
|
30
|
+
// Create pino logger with optional pretty printing for development
|
|
31
|
+
const pinoLogger = (0, pino_1.default)({
|
|
32
|
+
level: pinoLevel,
|
|
33
|
+
name: name || "TeneoSDK",
|
|
34
|
+
// Use pino-pretty in development for readable logs
|
|
35
|
+
transport: process.env.NODE_ENV !== "production"
|
|
36
|
+
? {
|
|
37
|
+
target: "pino-pretty",
|
|
38
|
+
options: {
|
|
39
|
+
colorize: true,
|
|
40
|
+
ignore: "pid,hostname",
|
|
41
|
+
translateTime: "HH:MM:ss.l",
|
|
42
|
+
singleLine: false
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
: undefined,
|
|
46
|
+
// Production: fast JSON logs
|
|
47
|
+
formatters: process.env.NODE_ENV === "production"
|
|
48
|
+
? {
|
|
49
|
+
level: (label) => {
|
|
50
|
+
return { level: label };
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
: undefined
|
|
54
|
+
});
|
|
55
|
+
// Adapt pino's API to match our Logger interface
|
|
56
|
+
return {
|
|
57
|
+
debug: (message, data) => {
|
|
58
|
+
if (data !== undefined) {
|
|
59
|
+
pinoLogger.debug(data, message);
|
|
60
|
+
}
|
|
61
|
+
else {
|
|
62
|
+
pinoLogger.debug(message);
|
|
63
|
+
}
|
|
64
|
+
},
|
|
65
|
+
info: (message, data) => {
|
|
66
|
+
if (data !== undefined) {
|
|
67
|
+
pinoLogger.info(data, message);
|
|
68
|
+
}
|
|
69
|
+
else {
|
|
70
|
+
pinoLogger.info(message);
|
|
71
|
+
}
|
|
72
|
+
},
|
|
73
|
+
warn: (message, data) => {
|
|
74
|
+
if (data !== undefined) {
|
|
75
|
+
pinoLogger.warn(data, message);
|
|
76
|
+
}
|
|
77
|
+
else {
|
|
78
|
+
pinoLogger.warn(message);
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
error: (message, data) => {
|
|
82
|
+
if (data !== undefined) {
|
|
83
|
+
pinoLogger.error(data, message);
|
|
84
|
+
}
|
|
85
|
+
else {
|
|
86
|
+
pinoLogger.error(message);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=logger.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"logger.js","sourceRoot":"","sources":["../../src/utils/logger.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;;;AAoBH,4CA+DC;AAjFD,gDAAwB;AAGxB;;;;;;;;;;;;;;GAcG;AACH,SAAgB,gBAAgB,CAAC,KAAe,EAAE,IAAa;IAC7D,wCAAwC;IACxC,MAAM,SAAS,GAAG,KAAK,KAAK,QAAQ,CAAC,CAAC,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;IAExD,mEAAmE;IACnE,MAAM,UAAU,GAAG,IAAA,cAAI,EAAC;QACtB,KAAK,EAAE,SAAS;QAChB,IAAI,EAAE,IAAI,IAAI,UAAU;QACxB,mDAAmD;QACnD,SAAS,EACP,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACnC,CAAC,CAAC;gBACE,MAAM,EAAE,aAAa;gBACrB,OAAO,EAAE;oBACP,QAAQ,EAAE,IAAI;oBACd,MAAM,EAAE,cAAc;oBACtB,aAAa,EAAE,YAAY;oBAC3B,UAAU,EAAE,KAAK;iBAClB;aACF;YACH,CAAC,CAAC,SAAS;QACf,6BAA6B;QAC7B,UAAU,EACR,OAAO,CAAC,GAAG,CAAC,QAAQ,KAAK,YAAY;YACnC,CAAC,CAAC;gBACE,KAAK,EAAE,CAAC,KAAK,EAAE,EAAE;oBACf,OAAO,EAAE,KAAK,EAAE,KAAK,EAAE,CAAC;gBAC1B,CAAC;aACF;YACH,CAAC,CAAC,SAAS;KAChB,CAAC,CAAC;IAEH,iDAAiD;IACjD,OAAO;QACL,KAAK,EAAE,CAAC,OAAe,EAAE,IAAU,EAAE,EAAE;YACrC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,OAAe,EAAE,IAAU,EAAE,EAAE;YACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,IAAI,EAAE,CAAC,OAAe,EAAE,IAAU,EAAE,EAAE;YACpC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YACjC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,IAAI,CAAC,OAAO,CAAC,CAAC;YAC3B,CAAC;QACH,CAAC;QACD,KAAK,EAAE,CAAC,OAAe,EAAE,IAAU,EAAE,EAAE;YACrC,IAAI,IAAI,KAAK,SAAS,EAAE,CAAC;gBACvB,UAAU,CAAC,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;YAClC,CAAC;iBAAM,CAAC;gBACN,UAAU,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YAC5B,CAAC;QACH,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,122 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Token Bucket Rate Limiter
|
|
3
|
+
* Prevents message flooding and ensures fair resource usage
|
|
4
|
+
*
|
|
5
|
+
* Uses the token bucket algorithm: tokens are added at a constant rate,
|
|
6
|
+
* and each operation consumes one token. When no tokens are available,
|
|
7
|
+
* operations must wait until tokens are replenished.
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Error thrown when rate limit is exceeded with tryConsume()
|
|
11
|
+
*/
|
|
12
|
+
export declare class RateLimitError extends Error {
|
|
13
|
+
constructor(message: string);
|
|
14
|
+
}
|
|
15
|
+
/**
|
|
16
|
+
* Token bucket rate limiter for controlling operation frequency
|
|
17
|
+
*
|
|
18
|
+
* @example
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // Allow 10 messages per second with burst of 20
|
|
21
|
+
* const limiter = new TokenBucketRateLimiter(10, 20);
|
|
22
|
+
*
|
|
23
|
+
* // Non-blocking check
|
|
24
|
+
* if (limiter.tryConsume()) {
|
|
25
|
+
* await sendMessage(msg);
|
|
26
|
+
* } else {
|
|
27
|
+
* console.log('Rate limit exceeded');
|
|
28
|
+
* }
|
|
29
|
+
*
|
|
30
|
+
* // Blocking wait (auto-waits for token)
|
|
31
|
+
* await limiter.consume();
|
|
32
|
+
* await sendMessage(msg);
|
|
33
|
+
* ```
|
|
34
|
+
*/
|
|
35
|
+
export declare class TokenBucketRateLimiter {
|
|
36
|
+
private readonly tokensPerSecond;
|
|
37
|
+
private readonly maxBurst;
|
|
38
|
+
private tokens;
|
|
39
|
+
private lastRefill;
|
|
40
|
+
private readonly refillInterval;
|
|
41
|
+
/**
|
|
42
|
+
* Creates a new token bucket rate limiter
|
|
43
|
+
*
|
|
44
|
+
* @param tokensPerSecond - Rate at which tokens are added (operations per second)
|
|
45
|
+
* @param maxBurst - Maximum tokens that can accumulate (burst capacity)
|
|
46
|
+
* @throws {Error} If tokensPerSecond or maxBurst is less than 1
|
|
47
|
+
*
|
|
48
|
+
* @example
|
|
49
|
+
* ```typescript
|
|
50
|
+
* // 10 ops/sec, burst up to 20
|
|
51
|
+
* const limiter = new TokenBucketRateLimiter(10, 20);
|
|
52
|
+
* ```
|
|
53
|
+
*/
|
|
54
|
+
constructor(tokensPerSecond: number, maxBurst: number);
|
|
55
|
+
/**
|
|
56
|
+
* Try to consume one token without blocking
|
|
57
|
+
*
|
|
58
|
+
* @returns true if token was consumed, false if no tokens available
|
|
59
|
+
*
|
|
60
|
+
* @example
|
|
61
|
+
* ```typescript
|
|
62
|
+
* if (limiter.tryConsume()) {
|
|
63
|
+
* // Proceed with operation
|
|
64
|
+
* } else {
|
|
65
|
+
* // Rate limited - handle accordingly
|
|
66
|
+
* }
|
|
67
|
+
* ```
|
|
68
|
+
*/
|
|
69
|
+
tryConsume(): boolean;
|
|
70
|
+
/**
|
|
71
|
+
* Consume one token, waiting if necessary until a token is available
|
|
72
|
+
*
|
|
73
|
+
* @param timeout - Optional max wait time in ms (default: no timeout)
|
|
74
|
+
* @returns Promise that resolves when token is consumed
|
|
75
|
+
* @throws {RateLimitError} If timeout is exceeded
|
|
76
|
+
*
|
|
77
|
+
* @example
|
|
78
|
+
* ```typescript
|
|
79
|
+
* // Wait indefinitely for token
|
|
80
|
+
* await limiter.consume();
|
|
81
|
+
*
|
|
82
|
+
* // Wait max 5 seconds
|
|
83
|
+
* try {
|
|
84
|
+
* await limiter.consume(5000);
|
|
85
|
+
* } catch (error) {
|
|
86
|
+
* console.log('Timeout waiting for rate limit');
|
|
87
|
+
* }
|
|
88
|
+
* ```
|
|
89
|
+
*/
|
|
90
|
+
consume(timeout?: number): Promise<void>;
|
|
91
|
+
/**
|
|
92
|
+
* Get the number of tokens currently available
|
|
93
|
+
* Refills tokens before returning count
|
|
94
|
+
*
|
|
95
|
+
* @returns Number of tokens available (may be fractional before consumption)
|
|
96
|
+
*/
|
|
97
|
+
getAvailableTokens(): number;
|
|
98
|
+
/**
|
|
99
|
+
* Get rate limiter configuration
|
|
100
|
+
*
|
|
101
|
+
* @returns Configuration object with rate and burst capacity
|
|
102
|
+
*/
|
|
103
|
+
getConfig(): {
|
|
104
|
+
tokensPerSecond: number;
|
|
105
|
+
maxBurst: number;
|
|
106
|
+
};
|
|
107
|
+
/**
|
|
108
|
+
* Reset the rate limiter to full capacity
|
|
109
|
+
* Useful for testing or manual reset scenarios
|
|
110
|
+
*/
|
|
111
|
+
reset(): void;
|
|
112
|
+
/**
|
|
113
|
+
* Refill tokens based on elapsed time since last refill
|
|
114
|
+
* Called automatically before token consumption
|
|
115
|
+
*/
|
|
116
|
+
private refill;
|
|
117
|
+
/**
|
|
118
|
+
* Sleep helper for async waiting
|
|
119
|
+
*/
|
|
120
|
+
private sleep;
|
|
121
|
+
}
|
|
122
|
+
//# sourceMappingURL=rate-limiter.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rate-limiter.d.ts","sourceRoot":"","sources":["../../src/utils/rate-limiter.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AAEH;;GAEG;AACH,qBAAa,cAAe,SAAQ,KAAK;gBAC3B,OAAO,EAAE,MAAM;CAQ5B;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,qBAAa,sBAAsB;IAmB/B,OAAO,CAAC,QAAQ,CAAC,eAAe;IAChC,OAAO,CAAC,QAAQ,CAAC,QAAQ;IAnB3B,OAAO,CAAC,MAAM,CAAS;IACvB,OAAO,CAAC,UAAU,CAAS;IAC3B,OAAO,CAAC,QAAQ,CAAC,cAAc,CAAS;IAExC;;;;;;;;;;;;OAYG;gBAEgB,eAAe,EAAE,MAAM,EACvB,QAAQ,EAAE,MAAM;IAcnC;;;;;;;;;;;;;OAaG;IACI,UAAU,IAAI,OAAO;IAW5B;;;;;;;;;;;;;;;;;;;OAmBG;IACU,OAAO,CAAC,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC;IAgCrD;;;;;OAKG;IACI,kBAAkB,IAAI,MAAM;IAKnC;;;;OAIG;IACI,SAAS,IAAI;QAAE,eAAe,EAAE,MAAM,CAAC;QAAC,QAAQ,EAAE,MAAM,CAAA;KAAE;IAOjE;;;OAGG;IACI,KAAK,IAAI,IAAI;IAKpB;;;OAGG;IACH,OAAO,CAAC,MAAM;IAcd;;OAEG;IACH,OAAO,CAAC,KAAK;CAGd"}
|