diff --git a/binaryrpc_architecture.puml b/binaryrpc_architecture.puml new file mode 100644 index 0000000..17653d5 --- /dev/null +++ b/binaryrpc_architecture.puml @@ -0,0 +1,372 @@ +@startuml BinaryRPC Architecture + +!theme plain +skinparam backgroundColor #FFFFFF +skinparam classBackgroundColor #F8F9FA +skinparam classBorderColor #343A40 +skinparam packageBackgroundColor #E9ECEF +skinparam packageBorderColor #6C757D +skinparam noteBackgroundColor #FFF3CD +skinparam noteBorderColor #FFC107 + +title BinaryRPC - Detaylı UML Mimarisi + +package "Client Layer" { + class Client { + +clientId: string + +deviceId: uint64 + +sessionToken: array + +connection: WebSocket* + +state: ConnectionState + } + + class WebSocketConnection { + +connection: void* + +isConnected: bool + +lastActivity: timestamp + } +} + +package "Transport Layer" { + interface ITransport { + +start(port: uint16_t): void + +stop(): void + +send(data: vector): void + +sendToClient(connection: void*, data: vector): void + +sendToSession(session: Session, data: vector): void + +disconnectClient(connection: void*): void + +setCallback(callback: DataCallback): void + +setSessionRegisterCallback(cb: SessionRegisterCallback): void + +setDisconnectCallback(cb: DisconnectCallback): void + +setReliable(options: ReliableOptions): void + } + + class WebSocketTransport { + -sessionManager: SessionManager& + -idleTimeoutSec: uint16_t + -maxPayloadBytes: uint32_t + -handshakeInspector: shared_ptr + -reliableOptions: ReliableOptions + +start(port: uint16_t): void + +stop(): void + +send(data: vector): void + +sendToClient(connection: void*, data: vector): void + +sendToSession(session: Session, data: vector): void + +disconnectClient(connection: void*): void + +setHandshakeInspector(inspector: shared_ptr): void + +handleFrame(data: uint8_t*, length: size_t): void + } + + enum FrameType { + FRAME_DATA + FRAME_ACK + FRAME_PREPARE + FRAME_PREPARE_ACK + FRAME_COMMIT + FRAME_COMPLETE + } +} + +package "Protocol Layer" { + interface IProtocol { + +parse(data: vector): ParsedRequest + +serialize(method: string, payload: vector): vector + +serializeError(error: ErrorObj): vector + } + + class MsgPackProtocol { + +parse(data: vector): ParsedRequest + +serialize(method: string, payload: vector): vector + +serializeError(error: ErrorObj): vector + } + + class SimpleTextProtocol { + +parse(data: vector): ParsedRequest + +serialize(method: string, payload: vector): vector + +serializeError(error: ErrorObj): vector + } + + struct ParsedRequest { + +methodName: string + +payload: vector + } +} + +package "Core Application" { + class App { + -pImpl: unique_ptr + +getInstance(): App& + +run(port: uint16_t): void + +stop(): void + +setTransport(transport: unique_ptr): void + +usePlugin(plugin: shared_ptr): void + +use(middleware: Middleware): void + +useFor(method: string, middleware: Middleware): void + +useForMulti(methods: vector, middleware: Middleware): void + +registerRPC(method: string, handler: RpcContextHandler): void + +getTransport(): ITransport* + +getSessionManager(): SessionManager& + +getFrameworkApi(): FrameworkAPI& + +setProtocol(proto: shared_ptr): void + +getProtocol(): IProtocol* + } + + class FrameworkAPI { + -pImpl: unique_ptr + +sendTo(sid: string, data: vector): bool + +sendToSession(session: shared_ptr, data: vector): void + +disconnect(sid: string): bool + +listSessionIds(): vector + +setField(sid: string, key: string, value: T, indexed: bool): bool + +getField(sid: string, key: string): optional + +findBy(key: string, value: string): vector> + } +} + +package "Session Management" { + class SessionManager { + -sessions: unordered_map> + -byId: unordered_map> + -bySid: unordered_map> + -state: unordered_map> + -index: GenericIndex* + -ttlMs: uint64_t + -cleanupThread: jthread + -offlineQueues: unordered_map> + +createSession(cid: ClientIdentity, nowMs: uint64_t): shared_ptr + +getOrCreate(id: ClientIdentity, nowMs: uint64_t): shared_ptr + +removeSession(sid: string): void + +getSession(sid: string): shared_ptr + +listSessionIds(): vector + +attachSession(s: shared_ptr): void + +indices(): GenericIndex& + +findIndexed(key: string, value: string): shared_ptr> + +reap(nowMs: uint64_t): void + +startCleanupTimer(): void + +setField(sid: string, key: string, value: T, indexed: bool): bool + +getField(sid: string, key: string): optional + +addOfflineMessage(sessionId: string, data: vector): bool + +processOfflineMessages(sessionId: string, sendCallback: function): void + } + + class Session { + -pImpl: unique_ptr + +qosState: shared_ptr + +expiryMs: uint64_t + +connectionState: ConnectionState + +id(): string& + +identity(): ClientIdentity& + +rebind(ws: WS*): void + +liveWs(): WS* + +set(key: string, value: T): void + +get(key: string): T + +acceptDuplicate(payload: vector, ttl: milliseconds): bool + } + + struct ClientIdentity { + +clientId: string + +deviceId: uint64_t + +sessionToken: array + +operator==(other: ClientIdentity): bool + } + + enum ConnectionState { + ONLINE + OFFLINE + } + + struct OfflineMessage { + +data: vector + +timestamp: uint64_t + +sessionId: string + } +} + +package "RPC System" { + class RpcContext { + -session: shared_ptr + -connection: void* + -transport: ITransport* + +reply(data: vector): void + +broadcast(data: vector): void + +disconnect(): void + +session(): Session& + +sessionPtr(): shared_ptr + +hasRole(expected: string): bool + } + + class RpcManager { + -handlers: unordered_map + +registerHandler(method: string, handler: RpcContextHandler): void + +execute(method: string, payload: vector, context: RpcContext): void + } + + note right of RpcContext + RPC çağrıları için context sağlar. + Session, transport ve connection'a erişim. + Reply, broadcast ve disconnect işlemleri. + end note +} + +package "Middleware System" { + class MiddlewareChain { + -global: vector + -scoped: unordered_map> + +add(middleware: Middleware): void + +addFor(method: string, middleware: Middleware): void + +execute(session: Session&, method: string, payload: vector&): bool + } + + class JwtAuth { + +jwtAuth(secret: string, requiredRole: string): Middleware + } + + class RateLimiter { + +rateLimiter(qps: int, burst: int): Middleware + } + + struct RateBucket { + +tokens: int + +last: time_point + } + + note right of MiddlewareChain + Chain of Responsibility pattern. + Global ve method-specific middleware. + Her middleware next() çağırabilir. + end note +} + +package "Plugin System" { + interface IPlugin { + +initialize(): void + +name(): const char* + } + + class RoomPlugin { + -pImpl: unique_ptr + +initialize(): void + +name(): const char* + +join(room: string, sid: string): void + +leave(room: string, sid: string): void + +leaveAll(sid: string): void + +broadcast(room: string, data: vector): void + +getRoomMembers(room: string): vector + } +} + +package "Quality of Service" { + enum QoSLevel { + None + AtLeastOnce + ExactlyOnce + } + + struct ReliableOptions { + +level: QoSLevel + +baseRetryMs: uint32_t + +maxRetry: uint32_t + +maxBackoffMs: uint32_t + +sessionTtlMs: uint64_t + +duplicateTtlMs: uint32_t + +backoffStrategy: shared_ptr + +enableCompression: bool + +compressionThresholdBytes: size_t + +maxSendQueueSize: size_t + } + + interface IBackoffStrategy { + +calculateDelay(attempt: int, baseDelay: uint32_t): uint32_t + } + + struct ConnState { + +qosLevel: QoSLevel + +retryCount: uint32_t + +lastRetry: time_point + +duplicateFilter: unordered_set + +sendQueue: queue + } +} + +package "Utilities" { + class Logger { + +info(message: string): void + +warn(message: string): void + +error(message: string): void + +debug(message: string): void + } + + class GenericIndex { + +add(key: string, value: string, sessionId: string): void + +remove(key: string, value: string, sessionId: string): void + +find(key: string, value: string): unordered_set + +clear(): void + } + + class ThreadPool { + +submit(task: function): void + +shutdown(): void + } +} + +' Relationships +App ||--|| SessionManager : manages +App ||--|| FrameworkAPI : provides +App ||--o ITransport : uses +App ||--o IProtocol : uses +App ||--o IPlugin : loads +App ||--o MiddlewareChain : configures + +SessionManager ||--o{ Session : manages +SessionManager ||--|| GenericIndex : uses +SessionManager ||--o{ OfflineMessage : queues + +WebSocketTransport ..|> ITransport : implements +MsgPackProtocol ..|> IProtocol : implements +SimpleTextProtocol ..|> IProtocol : implements +RoomPlugin ..|> IPlugin : implements + +Session ||--|| ClientIdentity : identifies +Session ||--o{ ConnState : has +Session ||--o WebSocketConnection : connects + +RpcContext ||--|| Session : uses +RpcContext ||--|| ITransport : uses + +MiddlewareChain ||--o{ Middleware : executes +JwtAuth ..> Middleware : creates +RateLimiter ..> Middleware : creates + +WebSocketTransport ||--o{ FrameType : handles +WebSocketTransport ||--|| ReliableOptions : configures + +SessionManager ||--|| ThreadPool : uses +SessionManager ||--|| Logger : uses + +note top of App + Singleton pattern ile tek instance. + Tüm framework'ün ana giriş noktası. + Transport, protocol, plugin ve middleware yönetimi. +end note + +note top of SessionManager + Thread-safe session yönetimi. + Offline message queuing. + TTL-based cleanup. + Generic index ile hızlı arama. +end note + +note top of WebSocketTransport + uWebSockets tabanlı transport. + QoS desteği ile güvenilir mesajlaşma. + Handshake inspection. + Frame-based protokol. +end note + +note top of MiddlewareChain + Chain of Responsibility pattern. + Global ve method-specific middleware. + Her middleware next() çağırabilir. +end note + +@enduml \ No newline at end of file