@aiconnect/confidant 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.
Files changed (103) hide show
  1. package/README.md +570 -0
  2. package/dist/api-client.d.ts +58 -0
  3. package/dist/api-client.d.ts.map +1 -0
  4. package/dist/api-client.js +101 -0
  5. package/dist/api-client.js.map +1 -0
  6. package/dist/cli.d.ts +3 -0
  7. package/dist/cli.d.ts.map +1 -0
  8. package/dist/cli.js +69 -0
  9. package/dist/cli.js.map +1 -0
  10. package/dist/commands/create.d.ts +3 -0
  11. package/dist/commands/create.d.ts.map +1 -0
  12. package/dist/commands/create.js +51 -0
  13. package/dist/commands/create.js.map +1 -0
  14. package/dist/commands/delete.d.ts +3 -0
  15. package/dist/commands/delete.d.ts.map +1 -0
  16. package/dist/commands/delete.js +29 -0
  17. package/dist/commands/delete.js.map +1 -0
  18. package/dist/commands/get-request.d.ts +3 -0
  19. package/dist/commands/get-request.d.ts.map +1 -0
  20. package/dist/commands/get-request.js +89 -0
  21. package/dist/commands/get-request.js.map +1 -0
  22. package/dist/commands/get.d.ts +3 -0
  23. package/dist/commands/get.d.ts.map +1 -0
  24. package/dist/commands/get.js +29 -0
  25. package/dist/commands/get.js.map +1 -0
  26. package/dist/commands/request.d.ts +3 -0
  27. package/dist/commands/request.d.ts.map +1 -0
  28. package/dist/commands/request.js +289 -0
  29. package/dist/commands/request.js.map +1 -0
  30. package/dist/commands/status.d.ts +3 -0
  31. package/dist/commands/status.d.ts.map +1 -0
  32. package/dist/commands/status.js +40 -0
  33. package/dist/commands/status.js.map +1 -0
  34. package/dist/crypto.d.ts +32 -0
  35. package/dist/crypto.d.ts.map +1 -0
  36. package/dist/crypto.js +79 -0
  37. package/dist/crypto.js.map +1 -0
  38. package/dist/crypto.test.d.ts +5 -0
  39. package/dist/crypto.test.d.ts.map +1 -0
  40. package/dist/crypto.test.js +77 -0
  41. package/dist/crypto.test.js.map +1 -0
  42. package/dist/i18n.d.ts +55 -0
  43. package/dist/i18n.d.ts.map +1 -0
  44. package/dist/i18n.js +63 -0
  45. package/dist/i18n.js.map +1 -0
  46. package/dist/index.d.ts +2 -0
  47. package/dist/index.d.ts.map +1 -0
  48. package/dist/index.js +53 -0
  49. package/dist/index.js.map +1 -0
  50. package/dist/network-detection.d.ts +11 -0
  51. package/dist/network-detection.d.ts.map +1 -0
  52. package/dist/network-detection.js +54 -0
  53. package/dist/network-detection.js.map +1 -0
  54. package/dist/network-detection.test.d.ts +2 -0
  55. package/dist/network-detection.test.d.ts.map +1 -0
  56. package/dist/network-detection.test.js +150 -0
  57. package/dist/network-detection.test.js.map +1 -0
  58. package/dist/rate-limiter.d.ts +61 -0
  59. package/dist/rate-limiter.d.ts.map +1 -0
  60. package/dist/rate-limiter.js +128 -0
  61. package/dist/rate-limiter.js.map +1 -0
  62. package/dist/rate-limiter.test.d.ts +5 -0
  63. package/dist/rate-limiter.test.d.ts.map +1 -0
  64. package/dist/rate-limiter.test.js +130 -0
  65. package/dist/rate-limiter.test.js.map +1 -0
  66. package/dist/registry.d.ts +136 -0
  67. package/dist/registry.d.ts.map +1 -0
  68. package/dist/registry.js +182 -0
  69. package/dist/registry.js.map +1 -0
  70. package/dist/registry.test.d.ts +13 -0
  71. package/dist/registry.test.d.ts.map +1 -0
  72. package/dist/registry.test.js +308 -0
  73. package/dist/registry.test.js.map +1 -0
  74. package/dist/routes.d.ts +4 -0
  75. package/dist/routes.d.ts.map +1 -0
  76. package/dist/routes.js +931 -0
  77. package/dist/routes.js.map +1 -0
  78. package/dist/server.d.ts +27 -0
  79. package/dist/server.d.ts.map +1 -0
  80. package/dist/server.js +79 -0
  81. package/dist/server.js.map +1 -0
  82. package/dist/storage.d.ts +150 -0
  83. package/dist/storage.d.ts.map +1 -0
  84. package/dist/storage.js +298 -0
  85. package/dist/storage.js.map +1 -0
  86. package/dist/storage.test.d.ts +5 -0
  87. package/dist/storage.test.d.ts.map +1 -0
  88. package/dist/storage.test.js +466 -0
  89. package/dist/storage.test.js.map +1 -0
  90. package/dist/types.d.ts +144 -0
  91. package/dist/types.d.ts.map +1 -0
  92. package/dist/types.js +56 -0
  93. package/dist/types.js.map +1 -0
  94. package/dist/url-helper.d.ts +16 -0
  95. package/dist/url-helper.d.ts.map +1 -0
  96. package/dist/url-helper.js +27 -0
  97. package/dist/url-helper.js.map +1 -0
  98. package/dist/url-helper.test.d.ts +2 -0
  99. package/dist/url-helper.test.d.ts.map +1 -0
  100. package/dist/url-helper.test.js +70 -0
  101. package/dist/url-helper.test.js.map +1 -0
  102. package/package.json +73 -0
  103. package/public/index.html +352 -0
@@ -0,0 +1,130 @@
1
+ /**
2
+ * Tests for rate limiter
3
+ */
4
+ import { describe, it, expect, beforeEach } from 'vitest';
5
+ import { RateLimiter } from './rate-limiter.js';
6
+ describe('RateLimiter', () => {
7
+ let rateLimiter;
8
+ beforeEach(() => {
9
+ rateLimiter = new RateLimiter({
10
+ maxRequests: 5,
11
+ windowMs: 1000
12
+ });
13
+ });
14
+ describe('check', () => {
15
+ it('should allow requests within the limit', () => {
16
+ const result1 = rateLimiter.check('127.0.0.1');
17
+ const result2 = rateLimiter.check('127.0.0.1');
18
+ const result3 = rateLimiter.check('127.0.0.1');
19
+ expect(result1.allowed).toBe(true);
20
+ expect(result1.remaining).toBe(4);
21
+ expect(result2.allowed).toBe(true);
22
+ expect(result2.remaining).toBe(3);
23
+ expect(result3.allowed).toBe(true);
24
+ expect(result3.remaining).toBe(2);
25
+ });
26
+ it('should block requests exceeding the limit', () => {
27
+ // Make 5 requests (within limit)
28
+ for (let i = 0; i < 5; i++) {
29
+ const result = rateLimiter.check('127.0.0.1');
30
+ expect(result.allowed).toBe(true);
31
+ }
32
+ // 6th request should be blocked
33
+ const result = rateLimiter.check('127.0.0.1');
34
+ expect(result.allowed).toBe(false);
35
+ expect(result.remaining).toBe(0);
36
+ });
37
+ it('should track requests separately for different IPs', () => {
38
+ // Make 5 requests from IP1
39
+ for (let i = 0; i < 5; i++) {
40
+ rateLimiter.check('127.0.0.1');
41
+ }
42
+ // IP1 should be blocked
43
+ const result1 = rateLimiter.check('127.0.0.1');
44
+ expect(result1.allowed).toBe(false);
45
+ // IP2 should still be allowed
46
+ const result2 = rateLimiter.check('192.168.1.1');
47
+ expect(result2.allowed).toBe(true);
48
+ });
49
+ it('should reset the window after it expires', async () => {
50
+ // Make 5 requests (within limit)
51
+ for (let i = 0; i < 5; i++) {
52
+ rateLimiter.check('127.0.0.1');
53
+ }
54
+ // 6th request should be blocked
55
+ let result = rateLimiter.check('127.0.0.1');
56
+ expect(result.allowed).toBe(false);
57
+ // Wait for window to expire
58
+ await new Promise(resolve => setTimeout(resolve, 1100));
59
+ // Should be allowed again
60
+ result = rateLimiter.check('127.0.0.1');
61
+ expect(result.allowed).toBe(true);
62
+ expect(result.remaining).toBe(4);
63
+ });
64
+ it('should provide correct reset time', () => {
65
+ const result = rateLimiter.check('127.0.0.1');
66
+ const now = Date.now();
67
+ expect(result.resetTime).toBeGreaterThan(now);
68
+ expect(result.resetTime).toBeLessThanOrEqual(now + 1000);
69
+ });
70
+ });
71
+ describe('reset', () => {
72
+ it('should reset the rate limit for a specific IP', () => {
73
+ // Make 5 requests (within limit)
74
+ for (let i = 0; i < 5; i++) {
75
+ rateLimiter.check('127.0.0.1');
76
+ }
77
+ // 6th request should be blocked
78
+ let result = rateLimiter.check('127.0.0.1');
79
+ expect(result.allowed).toBe(false);
80
+ // Reset the IP
81
+ rateLimiter.reset('127.0.0.1');
82
+ // Should be allowed again
83
+ result = rateLimiter.check('127.0.0.1');
84
+ expect(result.allowed).toBe(true);
85
+ });
86
+ });
87
+ describe('cleanup', () => {
88
+ it('should remove old records', async () => {
89
+ // Make requests from two IPs
90
+ rateLimiter.check('127.0.0.1');
91
+ rateLimiter.check('192.168.1.1');
92
+ // Wait for records to become old
93
+ await new Promise(resolve => setTimeout(resolve, 100));
94
+ // Cleanup with max age of 50ms
95
+ rateLimiter.cleanup(50);
96
+ // Both records should be removed (old enough)
97
+ const status1 = rateLimiter.getStatus('127.0.0.1');
98
+ const status2 = rateLimiter.getStatus('192.168.1.1');
99
+ expect(status1.remaining).toBe(5); // Reset to full limit
100
+ expect(status2.remaining).toBe(5); // Reset to full limit
101
+ });
102
+ });
103
+ describe('getStatus', () => {
104
+ it('should return status without incrementing count', () => {
105
+ const status1 = rateLimiter.getStatus('127.0.0.1');
106
+ expect(status1.allowed).toBe(true);
107
+ expect(status1.remaining).toBe(5);
108
+ const status2 = rateLimiter.getStatus('127.0.0.1');
109
+ expect(status2.allowed).toBe(true);
110
+ expect(status2.remaining).toBe(5); // Still 5, not decremented
111
+ });
112
+ it('should return correct status for IPs that have made requests', () => {
113
+ rateLimiter.check('127.0.0.1');
114
+ rateLimiter.check('127.0.0.1');
115
+ const status = rateLimiter.getStatus('127.0.0.1');
116
+ expect(status.allowed).toBe(true);
117
+ expect(status.remaining).toBe(3);
118
+ });
119
+ it('should return not allowed for IPs that have exceeded the limit', () => {
120
+ // Make 5 requests (within limit)
121
+ for (let i = 0; i < 5; i++) {
122
+ rateLimiter.check('127.0.0.1');
123
+ }
124
+ const status = rateLimiter.getStatus('127.0.0.1');
125
+ expect(status.allowed).toBe(false);
126
+ expect(status.remaining).toBe(0);
127
+ });
128
+ });
129
+ });
130
+ //# sourceMappingURL=rate-limiter.test.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rate-limiter.test.js","sourceRoot":"","sources":["../src/rate-limiter.test.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,136 @@
1
+ /**
2
+ * Modular Registry System
3
+ *
4
+ * A generic, type-safe registry system for managing components/modules.
5
+ * Enables dynamic registration, retrieval, and lifecycle management of modules.
6
+ */
7
+ /**
8
+ * Base Module interface with optional lifecycle hooks
9
+ * All modules must implement this interface to be registered in a registry.
10
+ */
11
+ export interface Module {
12
+ /** Unique identifier for the module */
13
+ name: string;
14
+ /** Optional initialization hook called when module is registered */
15
+ init?(): Promise<void> | void;
16
+ /** Optional cleanup hook called when module is unregistered */
17
+ destroy?(): Promise<void> | void;
18
+ }
19
+ /**
20
+ * Generic Registry class for managing modules
21
+ * @template T - The module type (must extend Module)
22
+ */
23
+ export declare class Registry<T extends Module> {
24
+ private modules;
25
+ /**
26
+ * Registers a module with the given name
27
+ * @param name - Unique identifier for the module
28
+ * @param module - Module instance to register
29
+ * @throws Error if a module with the same name is already registered
30
+ */
31
+ register(name: string, module: T): Promise<void>;
32
+ /**
33
+ * Unregisters a module by name
34
+ * @param name - Name of the module to unregister
35
+ * @throws Error if module is not found
36
+ */
37
+ unregister(name: string): Promise<void>;
38
+ /**
39
+ * Retrieves a registered module by name
40
+ * @param name - Name of the module to retrieve
41
+ * @returns Module instance if found, undefined otherwise
42
+ */
43
+ get(name: string): T | undefined;
44
+ /**
45
+ * Checks if a module is registered
46
+ * @param name - Name of the module to check
47
+ * @returns true if module is registered, false otherwise
48
+ */
49
+ has(name: string): boolean;
50
+ /**
51
+ * Returns list of all registered module names
52
+ * @returns Array of module names
53
+ */
54
+ list(): string[];
55
+ /**
56
+ * Clears all registered modules
57
+ * Calls destroy hook on all modules if present
58
+ */
59
+ clear(): Promise<void>;
60
+ }
61
+ /**
62
+ * Storage Module interface for storage backends
63
+ */
64
+ export interface StorageModule extends Module {
65
+ /** Retrieve a value by key */
66
+ get(key: string): Promise<any>;
67
+ /** Set a value with optional TTL */
68
+ set(key: string, value: any, ttl?: number): Promise<void>;
69
+ /** Delete a value by key */
70
+ delete(key: string): Promise<void>;
71
+ }
72
+ /**
73
+ * Validator Module interface for data validation
74
+ */
75
+ export interface ValidatorModule extends Module {
76
+ /** Validate data and return true if valid */
77
+ validate(data: any): boolean | Promise<boolean>;
78
+ /** Get validation errors */
79
+ getErrors(): string[];
80
+ }
81
+ /**
82
+ * Transformer Module interface for data transformation
83
+ */
84
+ export interface TransformerModule extends Module {
85
+ /** Transform data and return the result */
86
+ transform(data: any): any | Promise<any>;
87
+ }
88
+ /**
89
+ * Singleton registry instances for different module types
90
+ */
91
+ /**
92
+ * Registry for storage modules
93
+ */
94
+ export declare const storageRegistry: Registry<StorageModule>;
95
+ /**
96
+ * Registry for validator modules
97
+ */
98
+ export declare const validatorRegistry: Registry<ValidatorModule>;
99
+ /**
100
+ * Registry for transformer modules
101
+ */
102
+ export declare const transformerRegistry: Registry<TransformerModule>;
103
+ /**
104
+ * Example: Memory Storage Module
105
+ * Simple in-memory storage implementation for demonstration
106
+ */
107
+ declare class MemoryStorageModuleImpl implements StorageModule {
108
+ name: string;
109
+ private storage;
110
+ init(): Promise<void>;
111
+ destroy(): Promise<void>;
112
+ get(key: string): Promise<any>;
113
+ set(key: string, value: any, ttl?: number): Promise<void>;
114
+ delete(key: string): Promise<void>;
115
+ }
116
+ export declare const MemoryStorageModule: MemoryStorageModuleImpl;
117
+ /**
118
+ * Example: Basic Validator Module
119
+ * Simple validator that checks if data is not empty
120
+ */
121
+ declare class BasicValidatorModuleImpl implements ValidatorModule {
122
+ name: string;
123
+ private errors;
124
+ init(): Promise<void>;
125
+ destroy(): Promise<void>;
126
+ validate(data: any): boolean;
127
+ getErrors(): string[];
128
+ }
129
+ export declare const BasicValidatorModule: BasicValidatorModuleImpl;
130
+ /**
131
+ * Example: Uppercase Transformer Module
132
+ * Transforms strings to uppercase
133
+ */
134
+ export declare const UppercaseTransformerModule: TransformerModule;
135
+ export {};
136
+ //# sourceMappingURL=registry.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,182 @@
1
+ /**
2
+ * Modular Registry System
3
+ *
4
+ * A generic, type-safe registry system for managing components/modules.
5
+ * Enables dynamic registration, retrieval, and lifecycle management of modules.
6
+ */
7
+ /**
8
+ * Generic Registry class for managing modules
9
+ * @template T - The module type (must extend Module)
10
+ */
11
+ export class Registry {
12
+ modules = new Map();
13
+ /**
14
+ * Registers a module with the given name
15
+ * @param name - Unique identifier for the module
16
+ * @param module - Module instance to register
17
+ * @throws Error if a module with the same name is already registered
18
+ */
19
+ async register(name, module) {
20
+ if (this.modules.has(name)) {
21
+ throw new Error(`Module with name '${name}' is already registered`);
22
+ }
23
+ // Call init hook if present
24
+ if (module.init) {
25
+ await module.init();
26
+ }
27
+ this.modules.set(name, module);
28
+ }
29
+ /**
30
+ * Unregisters a module by name
31
+ * @param name - Name of the module to unregister
32
+ * @throws Error if module is not found
33
+ */
34
+ async unregister(name) {
35
+ const module = this.modules.get(name);
36
+ if (!module) {
37
+ throw new Error(`Module '${name}' not found`);
38
+ }
39
+ // Call destroy hook if present
40
+ if (module.destroy) {
41
+ await module.destroy();
42
+ }
43
+ this.modules.delete(name);
44
+ }
45
+ /**
46
+ * Retrieves a registered module by name
47
+ * @param name - Name of the module to retrieve
48
+ * @returns Module instance if found, undefined otherwise
49
+ */
50
+ get(name) {
51
+ return this.modules.get(name);
52
+ }
53
+ /**
54
+ * Checks if a module is registered
55
+ * @param name - Name of the module to check
56
+ * @returns true if module is registered, false otherwise
57
+ */
58
+ has(name) {
59
+ return this.modules.has(name);
60
+ }
61
+ /**
62
+ * Returns list of all registered module names
63
+ * @returns Array of module names
64
+ */
65
+ list() {
66
+ return Array.from(this.modules.keys());
67
+ }
68
+ /**
69
+ * Clears all registered modules
70
+ * Calls destroy hook on all modules if present
71
+ */
72
+ async clear() {
73
+ const promises = Array.from(this.modules.values()).map(async (module) => {
74
+ if (module.destroy) {
75
+ await module.destroy();
76
+ }
77
+ });
78
+ await Promise.all(promises);
79
+ this.modules.clear();
80
+ }
81
+ }
82
+ /**
83
+ * Singleton registry instances for different module types
84
+ */
85
+ /**
86
+ * Registry for storage modules
87
+ */
88
+ export const storageRegistry = new Registry();
89
+ /**
90
+ * Registry for validator modules
91
+ */
92
+ export const validatorRegistry = new Registry();
93
+ /**
94
+ * Registry for transformer modules
95
+ */
96
+ export const transformerRegistry = new Registry();
97
+ /**
98
+ * Example: Memory Storage Module
99
+ * Simple in-memory storage implementation for demonstration
100
+ */
101
+ class MemoryStorageModuleImpl {
102
+ name = 'memory-storage';
103
+ storage = new Map();
104
+ async init() {
105
+ console.log('MemoryStorageModule initialized');
106
+ }
107
+ async destroy() {
108
+ this.storage.clear();
109
+ console.log('MemoryStorageModule destroyed');
110
+ }
111
+ async get(key) {
112
+ const entry = this.storage.get(key);
113
+ if (!entry) {
114
+ return undefined;
115
+ }
116
+ // Check if expired
117
+ if (entry.expiresAt && Date.now() > entry.expiresAt) {
118
+ this.storage.delete(key);
119
+ return undefined;
120
+ }
121
+ return entry.value;
122
+ }
123
+ async set(key, value, ttl) {
124
+ const expiresAt = ttl ? Date.now() + ttl : undefined;
125
+ this.storage.set(key, { value, expiresAt });
126
+ }
127
+ async delete(key) {
128
+ this.storage.delete(key);
129
+ }
130
+ }
131
+ export const MemoryStorageModule = new MemoryStorageModuleImpl();
132
+ /**
133
+ * Example: Basic Validator Module
134
+ * Simple validator that checks if data is not empty
135
+ */
136
+ class BasicValidatorModuleImpl {
137
+ name = 'basic-validator';
138
+ errors = [];
139
+ async init() {
140
+ console.log('BasicValidatorModule initialized');
141
+ }
142
+ async destroy() {
143
+ this.errors = [];
144
+ console.log('BasicValidatorModule destroyed');
145
+ }
146
+ validate(data) {
147
+ this.errors = [];
148
+ if (data === null || data === undefined) {
149
+ this.errors.push('Data cannot be null or undefined');
150
+ return false;
151
+ }
152
+ if (typeof data === 'string' && data.trim() === '') {
153
+ this.errors.push('String cannot be empty');
154
+ return false;
155
+ }
156
+ return true;
157
+ }
158
+ getErrors() {
159
+ return [...this.errors];
160
+ }
161
+ }
162
+ export const BasicValidatorModule = new BasicValidatorModuleImpl();
163
+ /**
164
+ * Example: Uppercase Transformer Module
165
+ * Transforms strings to uppercase
166
+ */
167
+ export const UppercaseTransformerModule = {
168
+ name: 'uppercase-transformer',
169
+ async init() {
170
+ console.log('UppercaseTransformerModule initialized');
171
+ },
172
+ async destroy() {
173
+ console.log('UppercaseTransformerModule destroyed');
174
+ },
175
+ transform(data) {
176
+ if (typeof data === 'string') {
177
+ return data.toUpperCase();
178
+ }
179
+ return data;
180
+ }
181
+ };
182
+ //# sourceMappingURL=registry.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,13 @@
1
+ /**
2
+ * Registry System Tests
3
+ *
4
+ * Tests for the generic registry system including:
5
+ * - Basic registry operations
6
+ * - Register/unregister functionality
7
+ * - Get/has/list methods
8
+ * - Lifecycle hooks (init/destroy)
9
+ * - Error handling
10
+ * - Typed registry instances
11
+ */
12
+ export {};
13
+ //# sourceMappingURL=registry.test.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../src/registry.test.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;GAUG"}