/ examples / js / memory / memory-hooks.ts
memory-hooks.ts
  1  /**
  2   * MemoryHooks Integration Test
  3   * 
  4   * Tests pre/post hooks for memory operations.
  5   * 
  6   * Run: npx ts-node memory-hooks.ts
  7   */
  8  
  9  import {
 10      MemoryHooks,
 11      createMemoryHooks,
 12      createLoggingHooks,
 13      createValidationHooks,
 14      Memory,
 15      createMemory
 16  } from '../../../src/praisonai-ts/dist';
 17  
 18  async function main() {
 19      console.log('=== MemoryHooks Integration Test ===\n');
 20  
 21      // Test 1: Basic hooks
 22      console.log('1. Testing basic MemoryHooks:');
 23      const logs: string[] = [];
 24  
 25      const hooks = new MemoryHooks({
 26          beforeStore: async (key, value) => {
 27              logs.push(`beforeStore: ${key}`);
 28              return { key, value };
 29          },
 30          afterStore: async (key) => {
 31              logs.push(`afterStore: ${key}`);
 32          },
 33          beforeRetrieve: async (key) => {
 34              logs.push(`beforeRetrieve: ${key}`);
 35              return key;
 36          },
 37          afterRetrieve: async (key, value) => {
 38              logs.push(`afterRetrieve: ${key}`);
 39              return value;
 40          }
 41      });
 42  
 43      await hooks.beforeStore('key1', { data: 'value1' });
 44      await hooks.afterStore('key1', { data: 'value1' });
 45      await hooks.beforeRetrieve('key1');
 46      await hooks.afterRetrieve('key1', { data: 'value1' });
 47  
 48      console.log('   Triggered hooks:', logs);
 49      console.log('   Success: ✅');
 50  
 51      // Test 2: Logging hooks
 52      console.log('\n2. Testing createLoggingHooks:');
 53      const logMessages: string[] = [];
 54      const loggingHooks = createLoggingHooks((msg) => logMessages.push(msg));
 55  
 56      await loggingHooks.beforeStore('test', 'data');
 57      await loggingHooks.afterStore('test', 'data');
 58      await loggingHooks.beforeRetrieve('test');
 59      await loggingHooks.afterRetrieve('test', 'data');
 60  
 61      console.log('   Log messages:', logMessages.length);
 62      logMessages.forEach(m => console.log('    -', m));
 63      console.log('   Success: ✅');
 64  
 65      // Test 3: Validation hooks
 66      console.log('\n3. Testing createValidationHooks:');
 67      const validationHooks = createValidationHooks((key, value) => {
 68          // Only allow non-empty strings
 69          if (typeof value !== 'string' || value.length === 0) {
 70              return { valid: false, reason: 'Value must be non-empty string' };
 71          }
 72          return { valid: true };
 73      });
 74  
 75      const validResult = await validationHooks.beforeStore('good', 'valid string');
 76      console.log('   Valid data allowed:', validResult !== null);
 77  
 78      const invalidResult = await validationHooks.beforeStore('bad', '');
 79      console.log('   Invalid data blocked:', invalidResult === null);
 80      console.log('   Success: ✅');
 81  
 82      // Test 4: Delete hooks
 83      console.log('\n4. Testing delete hooks:');
 84      const deleteHooks = new MemoryHooks({
 85          beforeDelete: async (key) => {
 86              console.log(`   [Hook] About to delete: ${key}`);
 87              return true; // Allow deletion
 88          },
 89          afterDelete: async (key, success) => {
 90              console.log(`   [Hook] Delete ${key}: ${success ? 'succeeded' : 'failed'}`);
 91          }
 92      });
 93  
 94      const canDelete = await deleteHooks.beforeDelete('item-to-delete');
 95      console.log('   Deletion allowed:', canDelete);
 96      await deleteHooks.afterDelete('item-to-delete', true);
 97      console.log('   Success: ✅');
 98  
 99      // Test 5: Search hooks
100      console.log('\n5. Testing search hooks:');
101      const searchHooks = new MemoryHooks({
102          beforeSearch: async (query, options) => {
103              console.log(`   [Hook] Searching: "${query}"`);
104              // Could modify query here
105              return { query: query.toLowerCase(), options };
106          },
107          afterSearch: async (query, results) => {
108              console.log(`   [Hook] Found ${results.length} results for "${query}"`);
109              return results;
110          }
111      });
112  
113      const searchParams = await searchHooks.beforeSearch('UPPERCASE QUERY');
114      console.log('   Modified query:', searchParams?.query);
115  
116      await searchHooks.afterSearch('query', [{ id: '1' }, { id: '2' }]);
117      console.log('   Success: ✅');
118  
119      // Test 6: Dynamic hook management
120      console.log('\n6. Testing dynamic hook management:');
121      const dynamicHooks = new MemoryHooks({});
122  
123      console.log('   Initial config:', Object.keys(dynamicHooks.getConfig()).length === 0 ? 'empty' : 'has hooks');
124  
125      dynamicHooks.addHook('logging', true);
126      dynamicHooks.setLogging(true);
127  
128      console.log('   After adding logging:', dynamicHooks.getConfig().logging);
129  
130      dynamicHooks.removeHook('logging');
131      console.log('   After removing:', dynamicHooks.getConfig().logging ?? 'undefined');
132      console.log('   Success: ✅');
133  
134      console.log('\n=== MemoryHooks Tests Complete ===');
135  }
136  
137  main().catch(console.error);