export type DatabaseResult = T | PromiseLike export type Connection = { id: string namespace: string providerId: string configuration: Record oauthIssuer: string | null oauthClientId: string | null oauthClientSecret: string | null secret: string | null refreshToken: string | null tokenType: string requestedScopes: string[] scopes: string[] expiresAt: Date | null metadata: Record externalAccountId: string | null externalAccountLabel: string | null createdAt: Date updatedAt: Date } export type OAuthState = { id: string namespace: string providerId: string codeVerifier: string | null redirectUri: string returnTo: string | null scopes: string[] issuer: string | null status: string errorStatus: number | null errorCode: string | null errorMessage: string | null completedAt: Date | null createdAt: Date expiresAt: Date } export type BrokerAccessToken = { name: string tokenIdHash: string scopes: string[] createdAt: Date expiresAt: Date } export type NewOAuthState = Pick< OAuthState, 'id' | 'namespace' | 'providerId' | 'redirectUri' | 'scopes' | 'expiresAt' > & Partial> export type OAuthStateUpdate = Partial< Pick< OAuthState, 'status' | 'errorStatus' | 'errorCode' | 'errorMessage' | 'completedAt' > > export type NewConnection = Pick< Connection, 'namespace' | 'providerId' | 'configuration' > & Partial< Pick< Connection, | 'oauthIssuer' | 'oauthClientId' | 'oauthClientSecret' | 'secret' | 'refreshToken' | 'tokenType' | 'requestedScopes' | 'scopes' | 'expiresAt' | 'metadata' | 'externalAccountId' | 'externalAccountLabel' > > export type ConnectionUpdate = Partial< Pick< Connection, | 'configuration' | 'oauthIssuer' | 'oauthClientId' | 'oauthClientSecret' | 'secret' | 'refreshToken' | 'tokenType' | 'requestedScopes' | 'scopes' | 'expiresAt' | 'metadata' | 'externalAccountId' | 'externalAccountLabel' > > export type ConnectionSummary = Pick< Connection, | 'namespace' | 'providerId' | 'configuration' | 'scopes' | 'expiresAt' | 'externalAccountId' | 'externalAccountLabel' | 'metadata' | 'createdAt' | 'updatedAt' > export type ConnectionFilter = { providerId?: string namespace?: string resourceScopes?: string[] } export type NewBrokerAccessToken = Pick< BrokerAccessToken, 'name' | 'tokenIdHash' | 'scopes' | 'expiresAt' > /** Persistence contract shared by Postgres, PGlite, and Durable Objects. */ export interface Database { createOAuthState(input: NewOAuthState): DatabaseResult supersedeOAuthStates( namespace: string, providerId: string, ): DatabaseResult claimOAuthState( ids: readonly string[], providerId: string, ): DatabaseResult getOAuthState( ids: readonly string[], providerId: string, ): DatabaseResult updateOAuthState( id: string, update: OAuthStateUpdate, ): DatabaseResult purgeExpiredOAuthStates(before: Date): DatabaseResult getConnection( namespace: string, providerId: string, ): DatabaseResult putConnection(input: NewConnection): DatabaseResult updateConnection( id: string, update: ConnectionUpdate, ): DatabaseResult listConnections( filter?: ConnectionFilter, ): DatabaseResult deleteConnection(id: string): DatabaseResult getValidBrokerAccessToken( name: string, tokenIdHash: string, now: Date, ): DatabaseResult purgeExpiredBrokerAccessTokens(before: Date): DatabaseResult createBrokerAccessToken(input: NewBrokerAccessToken): DatabaseResult listBrokerAccessTokenNames(): DatabaseResult deleteBrokerAccessToken(name: string): DatabaseResult }