{"id":"dosensuppe/eventbroker","name":"eventbroker","scope":"dosensuppe","platform":"roblox","description":"Mirrored from the Wally registry.","version":"2.3.0","latest":"2.3.0","versions":["1.0.0","2.0.3","2.0.4","2.0.7","2.0.12","2.0.13","2.0.14","2.1.0","2.2.0","2.2.1","2.2.2","2.2.3","2.2.4","2.3.0"],"license":"MIT","licenseRating":"safe","licenseCaveats":["License identified from the packaged LICENSE file; the manifest declared none."],"licenseVerified":true,"dependencies":{"pysephwasntavailable/remotepacketsizecounter":{"version":"^2.4.1","alias":"remotepacketsizecounter"}},"integrity":"56aea841d2820b7ad0f93ad1f6d26e08eef60cc36e28538c58397fd60141d93a","likes":0,"downloads":0,"install":"forest install dosensuppe/eventbroker","url":"https://forest.dev/p/roblox/dosensuppe/eventbroker","files":"https://api.forest.dev/ai/package/roblox/dosensuppe/eventbroker/files","readme":"# EventBroker\r\n\r\nA production-ready remote monitoring and security framework for Roblox, providing comprehensive validation, rate limiting, and middleware capabilities.\r\n\r\n## Features\r\n\r\n- **Security First**: Built-in rate limiting, parameter validation, and middleware chains\r\n- **Production Logging**: Comprehensive event tracking with automatic cleanup\r\n- **Modular Design**: Clean separation of concerns with dependency injection\r\n- **Memory Efficient**: Circular buffer prevents memory leaks in long-running servers\r\n- **Granular Control**: Per-remote middleware for fine-tuned security policies\r\n- **Analytics Ready**: Built-in statistics and monitoring capabilities\r\n- **Type Safe**: Full Luau typing for better development experience\r\n\r\n## Getting Started\r\n\r\n```lua\r\nlocal EventBroker = require(game.ServerScriptService.EventBroker)\r\n\r\n-- Basic remote registration\r\nlocal chatRemote = game.ReplicatedStorage.ChatRemote\r\n\r\nEventBroker.RegisterRemoteEvent(chatRemote, function(player, logIndex, message)\r\n    if #message > 0 then\r\n        broadcastMessage(player, message)\r\n    end\r\nend, {\"message\", \"string\"})\r\n```\r\n\r\n## Architecture\r\n\r\nEventBroker follows a modular architecture with clear separation of responsibilities:\r\n\r\n```\r\nEventBroker/\r\n├── EventBroker.luau           # Main module\r\n├── EventBroker.Types.luau     # Type definitions  \r\n├── EventBroker.Logger.luau    # Event storage\r\n├── EventBroker.Validator.luau # Parameter validation\r\n├── EventBroker.RateLimit.luau # Rate limiting\r\n├── EventBroker.RemoteHandler.luau # Core handler\r\n└── EventBroker.Assert.luau    # Validation helpers\r\n```\r\n\r\n## Configuration\r\n\r\n```lua\r\nEventBroker.Configure({\r\n    maxLogCount = 20000,\r\n    cleanupInterval = 15,\r\n    rateLimitWindow = 60,\r\n    rateLimitMaxRequests = 150,\r\n    debuggingMode = false\r\n})\r\n```\r\n\r\n## Remote Registration\r\n\r\n### RemoteEvents\r\n\r\n```lua\r\nEventBroker.RegisterRemoteEvent(remote, callback, paramlist?, forceLogging?)\r\n```\r\n\r\nThe callback receives `(player, logIndex, ...args)` where logIndex can be used for assertions and logging.\r\n\r\n```lua\r\nEventBroker.RegisterRemoteEvent(purchaseRemote, function(player, logIndex, itemId, quantity)\r\n    -- Validate purchase limits\r\n    if not EventBroker.AssertInRange(logIndex, quantity, 1, 10) then\r\n        return\r\n    end\r\n    \r\n    processPurchase(player, itemId, quantity)\r\nend, {\"itemId\", \"string\", \"quantity\", \"number\"})\r\n```\r\n\r\n### RemoteFunctions\r\n\r\n```lua\r\nEventBroker.RegisterRemoteFunction(remote, callback, paramlist?, forceLogging?)\r\n```\r\n\r\nFunctions should return data or nil on error:\r\n\r\n```lua\r\nEventBroker.RegisterRemoteFunction(getDataRemote, function(player, logIndex, dataType)\r\n    if dataType == \"stats\" then\r\n        return player.leaderstats\r\n    end\r\n    return nil\r\nend, {\"dataType\", \"string\"})\r\n```\r\n\r\n## Parameter Validation\r\n\r\nParameter lists follow the pattern: `{name, type, name, type, ...}`\r\n\r\n**Supported Types:**\r\n- Basic: `string`, `number`, `boolean`, `table`\r\n- Optional: `string?`, `number?` (append ?)\r\n- Union: `string|number`, `table|string`\r\n- Special: `integer`, `any`\r\n- Range: `range[min,max]` for numbers\r\n\r\n```lua\r\n-- Complex validation example\r\n{\"action\", \"string\", \"target\", \"string|number\", \"data\", \"table?\", \"priority\", \"range[1,5]\"}\r\n```\r\n\r\n## Middleware\r\n\r\nMiddleware functions execute before the main callback and can block requests:\r\n\r\n```lua\r\nlocal function rateLimitMiddleware(player, logIndex, remoteObject, ...)\r\n    local key = `{player.UserId}_{remoteObject.Name}`\r\n    local lastRequest = requestTimes[key] or 0\r\n    local currentTime = os.time()\r\n    \r\n    if currentTime - lastRequest < 2 then\r\n        return false -- Block rapid requests\r\n    end\r\n    \r\n    requestTimes[key] = currentTime\r\n    return true\r\nend\r\n\r\nEventBroker.AddMiddleware(tradingRemote, rateLimitMiddleware)\r\n```\r\n\r\nMultiple middleware can be chained per remote. Execution stops if any middleware returns false.\r\n\r\n## Data Retrieval\r\n\r\n```lua\r\n-- Get all logs\r\nlocal allLogs = EventBroker.RetrieveLogs()\r\n\r\n-- Filter by player\r\nlocal playerLogs = EventBroker.RetrieveLogsBySender(123456)\r\n\r\n-- Filter by time range  \r\nlocal recentLogs = EventBroker.RetrieveLogsByTimeRange(os.time() - 3600, os.time())\r\n\r\n-- Get problematic events\r\nlocal errorLogs = EventBroker.RetrieveLogsWithInfoCount(1)\r\n\r\n-- System statistics\r\nlocal stats = EventBroker.GetStatistics()\r\nprint(`Total events: {stats.totalLogs}, Errors: {stats.errorLogs}`)\r\n```\r\n\r\n## Validation Helpers\r\n\r\n```lua\r\nEventBroker.RegisterRemoteEvent(actionRemote, function(player, logIndex, action, target)\r\n    local validActions = {\"move\", \"attack\", \"defend\"}\r\n    \r\n    if not EventBroker.AssertInList(logIndex, action, validActions) then\r\n        return\r\n    end\r\n    \r\n    if not EventBroker.AssertStringPattern(logIndex, target, \"^%d+$\") then\r\n        return\r\n    end\r\n    \r\n    executeAction(player, action, target)\r\nend, {\"action\", \"string\", \"target\", \"string\"})\r\n```\r\n\r\n## Advanced Usage\r\n\r\n### Security Layers\r\n\r\n```lua\r\nlocal tradingRemote = game.ReplicatedStorage.Trading\r\n\r\n-- Layer 1: Permission check\r\nEventBroker.AddMiddleware(tradingRemote, function(player, logIndex, remoteObject, ...)\r\n    return player.leaderstats.Level.Value >= 10\r\nend)\r\n\r\n-- Layer 2: Rate limiting\r\nEventBroker.AddMiddleware(tradingRemote, function(player, logIndex, remoteObject, ...)\r\n    return checkCooldown(player.UserId, 30)\r\nend)\r\n\r\n-- Layer 3: Data validation  \r\nEventBroker.AddMiddleware(tradingRemote, function(player, logIndex, remoteObject, action, items)\r\n    return typeof(items) == \"table\" and #items > 0\r\nend)\r\n\r\nEventBroker.RegisterRemoteFunction(tradingRemote, function(player, logIndex, action, items)\r\n    return processTrade(player, action, items)\r\nend, {\"action\", \"string\", \"items\", \"table\"})\r\n```\r\n\r\n### Dynamic Control\r\n\r\n```lua\r\nlocal featureFlags = {\r\n    betaFeatures = false,\r\n    maintenanceMode = false\r\n}\r\n\r\nlocal featureGate = function(player, logIndex, remoteObject, ...)\r\n    if featureFlags.maintenanceMode then\r\n        return false\r\n    end\r\n    \r\n    if remoteObject.Name:find(\"Beta\") and not featureFlags.betaFeatures then\r\n        return isTestUser(player.UserId)\r\n    end\r\n    \r\n    return true\r\nend\r\n\r\n-- Apply to multiple remotes\r\nfor _, remote in betaRemotes do\r\n    EventBroker.AddMiddleware(remote, featureGate)\r\nend\r\n```\r\n\r\n### Error Monitoring\r\n\r\n```lua\r\n-- Check for suspicious activity\r\nlocal function monitorErrors()\r\n    local errorLogs = EventBroker.RetrieveLogsWithInfoCount(3)\r\n    \r\n    for _, log in errorLogs do\r\n        local player = game.Players:GetPlayerByUserId(log.Sender)\r\n        if player then\r\n            warn(`Suspicious activity from {player.Name}: {#log.EventLogs} issues`)\r\n        end\r\n    end\r\nend\r\n\r\ngame:GetService(\"RunService\").Heartbeat:Connect(monitorErrors)\r\n```\r\n\r\n## Performance Notes\r\n\r\nEventBroker is optimized for production use:\r\n\r\n- Automatic log rotation prevents memory growth\r\n- Rate limiting protects against spam attacks  \r\n- Parameter validation happens before callback execution\r\n- Middleware only runs for registered remotes\r\n\r\nThe circular buffer maintains constant memory usage regardless of server uptime.\r\n\r\n## Troubleshooting\r\n\r\n**High error counts**: Check parameter validation and ensure clients send correct data types.\r\n\r\n**Memory usage**: Reduce `maxLogCount` or increase `cleanupInterval` for lower memory footprint.\r\n\r\n**Performance issues**: Profile middleware functions and minimize expensive operations in validation.\r\n\r\nEnable debug mode temporarily to monitor cleanup behavior:\r\n```lua\r\nEventBroker.Configure({ debuggingMode = true })\r\n```\r\n","readmeTruncated":false}