import type { ClientId, PacketId, Topic, TopicFilter } from "./deps.ts"; import type { ClientRegistrationResult, ClientSubscription, ExtPublishPacket, ShareName, } from "./persistence.ts"; export type StoredSubscription = ClientSubscription & { clientId: ClientId }; export const PacketDirection = { Incoming: 0, Outgoing: 1, } as const; export type PacketDirection = typeof PacketDirection[keyof typeof PacketDirection]; export interface StorageProvider { initialize(): Promise; close?(): Promise; // --- Session Storage --- saveSession( clientId: ClientId, session: ClientRegistrationResult, ): Promise; getSession(clientId: ClientId): Promise; deleteSession(clientId: ClientId): Promise; listAllSessions(): AsyncIterableIterator< { clientId: ClientId; session: ClientRegistrationResult } >; // --- Subscription Storage --- saveSubscription(clientId: ClientId, sub: ClientSubscription): Promise; deleteSubscription( clientId: ClientId, topicFilter: TopicFilter, shareName: ShareName, ): Promise; listSubscriptions( clientId: ClientId, ): AsyncIterableIterator; listAllSubscriptions(): AsyncIterableIterator; // --- Pending Packet Storage (Incoming & Outgoing) --- savePendingPacket( clientId: ClientId, direction: PacketDirection, packet: ExtPublishPacket, ): Promise; getPendingPacket( clientId: ClientId, direction: PacketDirection, packetId: PacketId, ): Promise; updatePendingPacket( clientId: ClientId, direction: PacketDirection, packetId: PacketId, dup: boolean, ): Promise; deletePendingPacket( clientId: ClientId, direction: PacketDirection, packetId: PacketId, ): Promise; listPendingPackets( clientId: ClientId, direction: PacketDirection, ): AsyncIterableIterator; // --- Pending Acknowledgment Storage --- savePendingAck(clientId: ClientId, packetId: PacketId): Promise; hasPendingAck(clientId: ClientId, packetId: PacketId): Promise; deletePendingAck(clientId: ClientId, packetId: PacketId): Promise; listPendingAcks(clientId: ClientId): AsyncIterableIterator; // --- Retained Message Storage --- saveRetained(topic: Topic, packet: ExtPublishPacket): Promise; deleteRetained(topic: Topic): Promise; listRetainedMatches( topicFilter: TopicFilter, ): AsyncIterableIterator; }