import type { CredentialProtocol } from './CredentialProtocol' import type { AgentMessage } from '../../../agent/AgentMessage' import type { ConnectionRecord } from '../../connections/repository/ConnectionRecord' import type { CredentialFormat, CredentialFormatPayload, CredentialFormatService, ExtractCredentialFormats, } from '../formats' import type { CredentialPreviewAttributeOptions } from '../models' import type { AutoAcceptCredential } from '../models/CredentialAutoAcceptType' import type { CredentialExchangeRecord } from '../repository/CredentialExchangeRecord' /** * Get the format data payload for a specific message from a list of CredentialFormat interfaces and a message * * For an indy offer, this resolves to the cred abstract format as defined here: * https://github.com/hyperledger/aries-rfcs/tree/b3a3942ef052039e73cd23d847f42947f8287da2/features/0592-indy-attachments#cred-abstract-format * * @example * ``` * * type OfferFormatData = CredentialFormatDataMessagePayload<[IndyCredentialFormat, JsonLdCredentialFormat], 'createOffer'> * * // equal to * type OfferFormatData = { * indy: { * // ... payload for indy offer attachment as defined in RFC 0592 ... * }, * jsonld: { * // ... payload for jsonld offer attachment as defined in RFC 0593 ... * } * } * ``` */ export type CredentialFormatDataMessagePayload< CFs extends CredentialFormat[] = CredentialFormat[], M extends keyof CredentialFormat['formatData'] = keyof CredentialFormat['formatData'] > = { [Service in CFs[number] as Service['formatKey']]?: Service['formatData'][M] } /** * Infer the {@link CredentialFormat} types based on an array of {@link CredentialProtocol} types. * * It does this by extracting the `CredentialFormatServices` generic from the `CredentialProtocol`, and * then extracting the `CredentialFormat` generic from each of the `CredentialFormatService` types. * * @example * ``` * // TheCredentialFormatServices is now equal to [IndyCredentialFormatService] * type TheCredentialFormatServices = CredentialFormatsFromProtocols<[V1CredentialProtocol]> * ``` * * Because the `V1CredentialProtocol` is defined as follows: * ``` * class V1CredentialProtocol implements CredentialProtocol<[IndyCredentialFormatService]> { * } * ``` */ export type CredentialFormatsFromProtocols = Type[number] extends CredentialProtocol< infer CredentialFormatServices > ? CredentialFormatServices extends CredentialFormatService[] ? ExtractCredentialFormats : never : never /** * Get format data return value. Each key holds a mapping of credential format key to format data. * * @example * ``` * { * proposal: { * indy: { * cred_def_id: string * } * } * } * ``` */ export type GetCredentialFormatDataReturn = { proposalAttributes?: CredentialPreviewAttributeOptions[] proposal?: CredentialFormatDataMessagePayload offer?: CredentialFormatDataMessagePayload offerAttributes?: CredentialPreviewAttributeOptions[] request?: CredentialFormatDataMessagePayload credential?: CredentialFormatDataMessagePayload } export interface CreateCredentialProposalOptions { connectionRecord: ConnectionRecord credentialFormats: CredentialFormatPayload, 'createProposal'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface AcceptCredentialProposalOptions { credentialRecord: CredentialExchangeRecord credentialFormats?: CredentialFormatPayload, 'acceptProposal'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface NegotiateCredentialProposalOptions { credentialRecord: CredentialExchangeRecord credentialFormats: CredentialFormatPayload, 'createOffer'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface CreateCredentialOfferOptions { // Create offer can also be used for connection-less, so connection is optional connectionRecord?: ConnectionRecord credentialFormats: CredentialFormatPayload, 'createOffer'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface AcceptCredentialOfferOptions { credentialRecord: CredentialExchangeRecord credentialFormats?: CredentialFormatPayload, 'acceptOffer'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface NegotiateCredentialOfferOptions { credentialRecord: CredentialExchangeRecord credentialFormats: CredentialFormatPayload, 'createProposal'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface CreateCredentialRequestOptions { connectionRecord: ConnectionRecord credentialFormats: CredentialFormatPayload, 'createRequest'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface AcceptCredentialRequestOptions { credentialRecord: CredentialExchangeRecord credentialFormats?: CredentialFormatPayload, 'acceptRequest'> autoAcceptCredential?: AutoAcceptCredential comment?: string } export interface AcceptCredentialOptions { credentialRecord: CredentialExchangeRecord } export interface CreateCredentialProblemReportOptions { credentialRecord: CredentialExchangeRecord description: string } export interface CredentialProtocolMsgReturnType { message: MessageType credentialRecord: CredentialExchangeRecord } export interface DeleteCredentialOptions { deleteAssociatedCredentials?: boolean deleteAssociatedDidCommMessages?: boolean }