Releases: AsenaJs/Asena
Release-v0.6.3
Release-v0.6.2
Release v0.6.0
Minor Changes
-
d1fd783: ## Event System
Added Spring-like event-driven architecture.
@EventService({ prefix: 'user' }) export class UserEventService { @On('created') handleUserCreated(eventName: string, data: any) { console.log('User created:', data); } @On('*.error') // Wildcard support handleErrors(eventName: string, data: any) { console.error('Error:', eventName); } }
Features:
@EventServiceand@Ondecorators- Wildcard pattern support (
user.*,*.error) - Fire-and-forget pattern
- Async/sync handler support
- Error isolation
- Event chaining
Exports:
import { EventService, On } from '@asenajs/asena/decorators'; import { EventEmitter } from '@asenajs/asena/event';
Breaking Changes (Adapter Developers Only)
WebSocket Refactoring - Circular Dependency Removal
AsenaSocketno longer holds a reference toAsenaWebSocketService.Changes:
AsenaSocketconstructor: removedwebsocketServiceparameter, addednamespace: string- Removed
cleanup()method - Removed manual
roomsmanagement (using Bun native pub/sub) - Removed
getSocketsByRoom()method fromAsenaWebSocketService
Impact:
⚠️ HTTP/WebSocket adapter developers must update their code- ✅ End users are not affected
For adapter developers:
// Before new AsenaSocket(ws, websocketService); // After new AsenaSocket(ws, namespace);
Release v0.5.0
Release v0.5.0
Summary
Introduces Ulak WebSocket Messaging System - a centralized message broker that eliminates circular dependencies in WebSocket communication.
✨ New Features
Ulak Messaging System
Centralized WebSocket message broker with namespace-based routing.
@Service('UserService')
class UserService {
@Inject(ulak("/notifications"))
private notifications: Ulak.NameSpace<"/notifications">;
async createUser(data: any) {
const user = await this.saveUser(data);
await this.notifications.broadcast({ type: 'user_created', user });
}
}Benefits:
- Eliminates circular dependencies between WebSocket services
- Type-safe messaging with full TypeScript support
- Bulk operations and pattern matching support
- Comprehensive error handling
New Export: @asenajs/asena/messaging
Enhanced @Inject Decorator
Supports tuple injection pattern for advanced DI scenarios:
@Inject([Service, (a) => processData(a)])
private processedData: Result;🐛 Bug Fixes
- Fixed IocEngine empty dependency error in non-minified codebases
💥 Breaking Changes
AsenaWebSocketServer Constructor
Before:
const wsServer = new AsenaWebSocketServer(server, 'my-topic');After:
const wsServer = new AsenaWebSocketServer(server);Removed API:
AsenaWebSocketServer.websocketCountgetter
Impact:
⚠️ Custom adapter implementations need updates- ✅ Official adapters already compatible
- ✅ Regular users not affected
Migration for Custom Adapters:
// Use single shared instance
public startWebsocket(server: Server<any>): void {
const sharedServer = new AsenaWebSocketServer(server);
for (const websocket of this.websockets.values()) {
websocket.server = sharedServer;
}
}🔄 Migration Guide
WebSocket Service Communication:
// Before - Circular dependency risk
@Inject(ChatWebSocketService)
private chatService: ChatWebSocketService;
// After - Use Ulak
@Inject(ulak("/chat"))
private chat: Ulak.NameSpace<"/chat">;Full Changelog: v0.4.0...v0.5.0
Release v0.4.0
🎉 Release v0.4.0
Major architectural improvement migrating entire framework to full IoC container pattern with field-based dependency injection.
✨ Features
- Full IoC Container: All core services now managed by IoC container
- AsenaServerFactory: New factory pattern for server creation (replaces
new AsenaServer()) - Field-based Injection: All services use
@Injectdecorator for clean dependency management - Circular Dependency Detection: Runtime detection with detailed error messages
- Symbol-based Metadata: Type-safe metadata keys preventing external manipulation
- CoreContainer: Framework-level container managing bootstrap sequence
💥 Breaking Changes
new AsenaServer()is replaced withAsenaServerFactory.create()- Server configuration now uses options object instead of builder pattern
Migration Guide
Before (v0.3.x):
await new AsenaServer(adapter, logger).port(3000).start();
After (v0.4.x):
const server = await AsenaServerFactory.create({
adapter,
logger,
port: 3000
});
await server.start();
🔧 Internal Improvements
- All 5 prepare services migrated to field injection
- IocEngine now receives Container via injection
- Bootstrap process split into 9 deterministic phases
- PrepareService base class removed (field injection pattern)
📊 Test Results
- ✅ 252 tests passing
- ✅ 90%+ code coverage
- ✅ All type checks passing
- ✅ Bun 1.3.0 compatible
📝 Full Changelog
See https://github.com/AsenaJs/Asena/blob/master/CHANGELOG.md for complete details.
---
Installation:
bun add @asenajs/asena@0.4.0Hotfix-V0.3.3
Fixes
- Fix topic format inconsistency in subscribe/unsubscribe operations
- Improve AsenaSocket cleanup to prevent modification during iteration
- Enhance unsubscribe method with safer socket filtering
- Add memory leak prevention tests
- Add topic format consistency tests
- Resolves potential memory leaks and subscription issues in WebSocket connections.
Hotfix-V0.3.2
Fixes
PostConstruct Duplicate Execution
- Added
executedMethodsSet to track executed methods - Each PostConstruct method now executes only once in inheritance chain
- Override behavior works correctly with
super.method()calls
Async PostConstruct Await
- Made
Container.register()async - Added
awaitto allprepareInstance()calls - Singleton services now fully initialize before injection
v0.3.1
v0.3.0
Minor Changes
- b7aae6c: - Removed Winston dependency to reduce external dependencies. -
- Implemented a new WebSocket adapter system for enhanced real-time communication capabilities.
- Introduced a static serve API and configuration for serving static files.
- Addressed various minor bugs. - Improved and fixed existing tests.
- Added new tests to increase code coverage and ensure stability.
- Performed general code cleanup and refactoring.
Inheritance bug fixes
inheritance bug fixed and hono adapter removed from project