UNPKG

claude-flow

Version:

Ruflo - Enterprise AI agent orchestration for Claude Code. Deploy 60+ specialized agents in coordinated swarms with self-learning, fault-tolerant consensus, vector memory, and MCP integration

195 lines (167 loc) 6.04 kB
import { Observable, of, from, interval, throwError } from 'rxjs'; import { map, filter, catchError, switchMap, take, tap } from 'rxjs/operators'; // Mock function to fetch stock prices (simulates API call) const fetchStockPrice = (ticker: string): Observable<number> => { return new Observable<number>((observer) => { const intervalId = setInterval(() => { if (Math.random() < 0.1) { // Simulating an error 10% of the time observer.error(`Error fetching stock price for ${ticker}`); } else { const price = parseFloat((Math.random() * 1000).toFixed(2)); observer.next(price); } }, 1000); return () => { clearInterval(intervalId); console.log(`Stopped fetching prices for ${ticker}`); }; }); }; // Example usage: Tracking stock price updates const stockTicker = 'AAPL'; const stockPrice$ = fetchStockPrice(stockTicker).pipe( map(price => ({ ticker: stockTicker, price })), // Transform data filter(data => data.price > 500), // Only keep prices above 500 tap(data => console.log(`Price update:`, data)), // Side effect: Logging catchError(err => { console.error(err); return of({ ticker: stockTicker, price: null }); // Fallback observable }) ); // Subscribe to the stock price updates const subscription = stockPrice$.subscribe({ next: data => console.log(`Subscriber received:`, data), error: err => console.error(`Subscription error:`, err), complete: () => console.log('Stream complete'), }); // Automatically unsubscribe after 10 seconds setTimeout(() => { subscription.unsubscribe(); console.log('Unsubscribed from stock price updates.'); }, 10000); --- class EnforceAttrsMeta(type): """ Metaclass that enforces the presence of specific attributes in a class and automatically decorates methods with a logging wrapper. """ required_attributes = ['name', 'version'] def __new__(cls, name, bases, class_dict): """ Create a new class with enforced attributes and method logging. :param name: Name of the class being created. :param bases: Tuple of base classes. :param class_dict: Dictionary of attributes and methods of the class. :return: Newly created class object. """ # Ensure required attributes exist for attr in cls.required_attributes: if attr not in class_dict: raise TypeError(f"Class '{name}' is missing required attribute '{attr}'") # Wrap all methods in a logging decorator for key, value in class_dict.items(): if callable(value): # Check if it's a method class_dict[key] = cls.log_calls(value) return super().__new__(cls, name, bases, class_dict) @staticmethod def log_calls(func): """ Decorator that logs method calls and arguments. :param func: Function to be wrapped. :return: Wrapped function with logging. """ def wrapper(*args, **kwargs): print(f"Calling {func.__name__} with args={args} kwargs={kwargs}") result = func(*args, **kwargs) print(f"{func.__name__} returned {result}") return result return wrapper class PluginBase(metaclass=EnforceAttrsMeta): """ Base class for plugins that enforces required attributes and logging. """ name = "BasePlugin" version = "1.0" def run(self, data): """ Process the input data. :param data: The data to be processed. :return: Processed result. """ return f"Processed {data}" class CustomPlugin(PluginBase): """ Custom plugin that extends PluginBase and adheres to enforced rules. """ name = "CustomPlugin" version = "2.0" def run(self, data): """ Custom processing logic. :param data: The data to process. :return: Modified data. """ return f"Custom processing of {data}" # Uncommenting the following class definition will raise a TypeError # because 'version' attribute is missing. # class InvalidPlugin(PluginBase): # name = "InvalidPlugin" if __name__ == "__main__": # Instantiate and use the plugin plugin = CustomPlugin() print(plugin.run("example data")) --- <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Click the Box Game</title> <style> body { text-align: center; font-family: Arial, sans-serif; } #game-container { position: relative; width: 300px; height: 300px; margin: 20px auto; border: 2px solid black; overflow: hidden; } #target { width: 50px; height: 50px; background-color: red; position: absolute; cursor: pointer; } </style> </head> <body> <h1>Click the Box!</h1> <p>Score: <span id="score">0</span></p> <div id="game-container"> <div id="target"></div> </div> <script> let score = 0; const target = document.getElementById("target"); const scoreDisplay = document.getElementById("score"); const container = document.getElementById("game-container"); function moveTarget() { const maxX = container.clientWidth - target.clientWidth; const maxY = container.clientHeight - target.clientHeight; target.style.left = Math.random() * maxX + "px"; target.style.top = Math.random() * maxY + "px"; } target.addEventListener("click", function() { score++; scoreDisplay.textContent = score; moveTarget(); }); moveTarget(); </script> </body> </html>