@sphereon/ssi-sdk.qr-code-generator
Version:
QR Code provider (react)
1 lines • 16 kB
Source Map (JSON)
{"version":3,"sources":["../src/index.ts","../src/types/IQRCodeGenerator.ts","../src/agent/utils/react-qr.tsx","../src/agent/utils/didcomm-oob-message.tsx","../src/agent/QrCodeProvider.tsx"],"sourcesContent":["/**\n * @public\n */\n\nexport * from './agent/QrCodeProvider'\nexport * from './types/IQRCodeGenerator'\n","import { IAgentContext, IPluginMethodMap } from '@veramo/core'\n\nexport interface IQRCodeGenerator extends IPluginMethodMap {\n qrDIDCommOobInvitationElement(\n args: CreateElementArgs<QRType.DIDCOMM_V2_OOB_INVITATION, DIDCommV2OOBInvitationData>,\n context: IRequiredContext,\n ): Promise<JSX.Element>\n\n qrDIDCommOobInvitationValue(\n args: CreateValueArgs<QRType.DIDCOMM_V2_OOB_INVITATION, DIDCommV2OOBInvitationData>,\n context: IRequiredContext,\n ): Promise<string>\n\n qrSIOPv2Element(args: CreateElementArgs<QRType.SIOPV2, SIOPv2DataWithScheme>, context: IRequiredContext): Promise<JSX.Element>\n\n qrSIOPv2Value(args: CreateValueArgs<QRType.SIOPV2, SIOPv2DataWithScheme>, context: IRequiredContext): Promise<string>\n\n qrURIElement(args: CreateElementArgs<QRType.URI, URIData>, context: IRequiredContext): Promise<JSX.Element>\n\n qrOpenID4VCIElement(args: CreateElementArgs<QRType.OpenID4VCI, OpenID4VCIDataWithScheme>, context: IRequiredContext): Promise<JSX.Element>\n qrOpenID4VCIValue(args: CreateValueArgs<QRType.OpenID4VCI, OpenID4VCIDataWithScheme>, context: IRequiredContext): Promise<string>\n}\n\nexport interface CreateValueArgs<T extends QRType, D> {\n onGenerate?: (result: ValueResult<T, D>) => void\n data: QRData<T, D>\n}\n\nexport interface CreateElementArgs<T extends QRType, D> extends CreateValueArgs<T, D> {\n renderingProps: QRRenderingProps\n}\n\nexport interface ValueResult<T extends QRType, D> {\n id: string\n value: string\n data: QRData<T, D>\n renderingProps?: QRRenderingProps\n context?: IRequiredContext\n}\n\nexport enum QRType {\n URI = 'uri',\n SIOPV2 = 'openid-vc',\n DIDCOMM_V2_OOB_INVITATION = 'https://didcomm.org/out-of-band/2.0/invitation',\n OpenID4VCI = 'openid-credential-offer',\n}\n\nexport type SIOPv2Scheme = 'openid' | 'openid-vc' | string\nexport interface SIOPv2DataWithScheme {\n scheme?: SIOPv2Scheme\n requestUri: string\n}\n\nexport type OpenID4VCIScheme = 'openid-credential-offer' | 'https' | string\nexport interface OpenID4VCIDataWithScheme {\n scheme?: OpenID4VCIScheme\n baseUri?: string\n credentialOfferUri?: string\n credentialOffer?: string\n}\n\nexport interface DIDCommV2OOBInvitationData {\n baseURI: string\n oobInvitation: DIDCommV2OOBInvitation\n}\n\n/**\n * {\n * \"type\": \"https://didcomm.org/out-of-band/2.0/invitation\",\n * \"id\": \"599f3638-b563-4937-9487-dfe55099d900\",\n * \"from\": \"did:example:verifier\",\n * \"body\": {\n * \"goal_code\": \"streamlined-vp\",\n * \"accept\": ['didcomm/v2']\n * }\n * }\n */\nexport interface DIDCommV2OOBInvitation {\n type: 'https://didcomm.org/out-of-band/2.0/invitation'\n id: string\n from: DID\n\n body: Body\n}\n\nexport type URIData = string\n\nexport type DID = string\n\nexport interface Body {\n goal_code: GoalCode\n accept: [AcceptMode]\n}\n\nexport type GoalCode = 'streamlined-vp' | 'streamlined-vc'\n\nexport type AcceptMode = 'didcomm/v2' | string\n\n/*OIDC4VP = 'oidc4vp',\nSIOPV2_WITH_OIDC4VP = 'siopv2+oidc4vp',\nSIOP_V2 = 'siopv2',*/\n\nexport enum StatusCode {\n OK = 'OK',\n CREATED = 'CREATED',\n}\n\nexport interface QRData<T extends QRType, D> {\n id: string\n type: T\n object: D\n}\n\nexport interface QRRenderingProps {\n bgColor?: string\n fgColor?: string\n level?: 'L' | 'M' | 'Q' | 'H'\n size?: number\n title?: string\n}\n\nexport enum events {\n QR_CODE_CODE_CREATED = 'QrCodeCreated',\n}\n\nexport type IRequiredContext = IAgentContext<Record<string, never>>\n","import { CreateElementArgs, CreateValueArgs, events, IRequiredContext, QRType, ValueResult } from '../../types/IQRCodeGenerator'\nimport QRCodeImport from 'react-qr-code'\nimport React from 'react'\n\nconst QRCode = (QRCodeImport as any)?.default || QRCodeImport\n\nexport async function generateQRCodeValue<T extends QRType>(\n args: CreateValueArgs<T, string> | CreateElementArgs<T, string>,\n context?: IRequiredContext,\n): Promise<ValueResult<T, string>> {\n return generateQRCodeValueImpl(args, args, context)\n}\n\nexport async function generateQRCodeValueImpl<T extends QRType>(\n args: CreateValueArgs<T, string> | CreateElementArgs<T, string>,\n orig: CreateValueArgs<T, any> | CreateElementArgs<T, any>,\n context?: IRequiredContext,\n): Promise<ValueResult<T, string>> {\n const { onGenerate } = orig\n const { id } = orig.data\n\n const value = args.data.object\n\n const result: ValueResult<T, string> = {\n id,\n value,\n data: orig.data,\n renderingProps: 'renderingProps' in orig ? orig.renderingProps : undefined,\n context,\n }\n\n if (onGenerate) {\n onGenerate(result)\n }\n if (context) {\n context.agent.emit(events.QR_CODE_CODE_CREATED, result)\n }\n\n return result\n}\n\nexport async function generateQRCodeReactElement<T extends QRType>(\n args: CreateElementArgs<T, string>,\n context: IRequiredContext,\n): Promise<JSX.Element> {\n return generateQRCodeReactElementImpl(args, args, context)\n}\n\nexport async function generateQRCodeReactElementImpl<T extends QRType>(\n args: CreateElementArgs<T, string>,\n orig: CreateElementArgs<T, any>,\n context: IRequiredContext,\n): Promise<JSX.Element> {\n const { renderingProps } = args\n const { bgColor, fgColor, level, size, title } = renderingProps\n const result: ValueResult<T, string> = await generateQRCodeValueImpl(args, orig, context)\n\n return <QRCode value={result.value} bgColor={bgColor} fgColor={fgColor} level={level} size={size} title={title} />\n}\n","import { DIDCommV2OOBInvitation } from '../../types/IQRCodeGenerator'\nimport base64url from 'base64url'\n\nexport class DidCommOutOfBandMessage {\n public static toJson(props: DIDCommV2OOBInvitation): string {\n return JSON.stringify(props).replace('goalCode', 'goal-code')\n }\n\n public static urlEncode(payload: DIDCommV2OOBInvitation) {\n return base64url(this.toJson(payload))\n }\n}\n","import { IAgentPlugin } from '@veramo/core'\n\nimport {\n CreateElementArgs,\n CreateValueArgs,\n DIDCommV2OOBInvitationData,\n IQRCodeGenerator,\n IRequiredContext,\n OpenID4VCIDataWithScheme,\n QRType,\n SIOPv2DataWithScheme,\n URIData,\n} from '../types/IQRCodeGenerator'\nimport { DidCommOutOfBandMessage, generateQRCodeReactElement } from './utils'\nimport { generateQRCodeReactElementImpl } from './utils/react-qr'\n\n/**\n * {@inheritDoc IQRCodeGenerator}\n */\nexport class QrCodeProvider implements IAgentPlugin {\n readonly methods: IQRCodeGenerator = {\n qrDIDCommOobInvitationElement: QrCodeProvider.qrDIDCommOobInvitationElement.bind(this),\n qrDIDCommOobInvitationValue: QrCodeProvider.qrDIDCommOobInvitationValue.bind(this),\n qrSIOPv2Element: QrCodeProvider.qrSIOPv2Element.bind(this),\n qrSIOPv2Value: QrCodeProvider.qrSIOPv2Value.bind(this),\n qrURIElement: QrCodeProvider.qrURIElement.bind(this),\n qrOpenID4VCIElement: QrCodeProvider.qrOpenID4VCIElement.bind(this),\n qrOpenID4VCIValue: QrCodeProvider.qrOpenID4VCIValue.bind(this),\n }\n\n /** {@inheritDoc IQRCodeGenerator.uriElement} */\n\n private static async qrURIElement(args: CreateElementArgs<QRType.URI, URIData>, context: IRequiredContext): Promise<JSX.Element> {\n return generateQRCodeReactElement(args, context)\n }\n\n /** {@inheritDoc IQRCodeGenerator.didCommOobInvitationValue} */\n private static async qrDIDCommOobInvitationValue(\n args: CreateValueArgs<QRType.DIDCOMM_V2_OOB_INVITATION, DIDCommV2OOBInvitationData>,\n context: IRequiredContext,\n ): Promise<string> {\n const { object } = args.data\n const encoded = DidCommOutOfBandMessage.urlEncode(object.oobInvitation)\n const delim = object.baseURI.includes('?') ? '&' : '?'\n return object.baseURI.includes('oob=') ? object.baseURI.replace('oob=', `oob=${encoded}`) : `${object.baseURI}${delim}_oob=${encoded}`\n }\n\n /** {@inheritDoc IQRCodeGenerator.didCommOobInvitationElement} */\n private static async qrDIDCommOobInvitationElement(\n args: CreateElementArgs<QRType.DIDCOMM_V2_OOB_INVITATION, DIDCommV2OOBInvitationData>,\n context: IRequiredContext,\n ): Promise<JSX.Element> {\n const content = await QrCodeProvider.qrDIDCommOobInvitationValue(args, context)\n return generateQRCodeReactElementImpl(\n {\n ...args,\n data: { ...args.data, object: content },\n } as CreateElementArgs<QRType.DIDCOMM_V2_OOB_INVITATION, string>,\n args,\n context,\n )\n }\n\n /** {@inheritDoc IQRCodeGenerator.siopv2Value} */\n private static async qrSIOPv2Value(args: CreateValueArgs<QRType.SIOPV2, SIOPv2DataWithScheme>, context: IRequiredContext): Promise<string> {\n const { object } = args.data\n if (typeof object === 'string') {\n return object\n }\n\n const scheme = (object.scheme ?? 'openid-vc://').replace('://?', '').replace('://', '') + '://'\n const requestUri = `request_uri=${object.requestUri.replace('request_uri=', '')}`\n return `${scheme}?${requestUri}`\n }\n\n /** {@inheritDoc IQRCodeGenerator.siopv2Element} */\n private static async qrSIOPv2Element(\n args: CreateElementArgs<QRType.SIOPV2, SIOPv2DataWithScheme>,\n context: IRequiredContext,\n ): Promise<JSX.Element> {\n const content = await QrCodeProvider.qrSIOPv2Value(args, context)\n return generateQRCodeReactElementImpl(\n { ...args, data: { ...args.data, object: content } } as CreateElementArgs<QRType.SIOPV2, string>,\n args,\n context,\n )\n }\n\n /** {@inheritDoc IQRCodeGenerator.qrOpenID4VCIElement} */\n private static async qrOpenID4VCIElement(args: CreateElementArgs<QRType.OpenID4VCI, any>, context: IRequiredContext): Promise<JSX.Element> {\n const content = await QrCodeProvider.qrOpenID4VCIValue(args, context)\n return generateQRCodeReactElementImpl(\n { ...args, data: { ...args.data, object: content } } as CreateElementArgs<QRType.OpenID4VCI, string>,\n args,\n context,\n )\n }\n\n /** {@inheritDoc IQRCodeGenerator.qrOpenID4VCIValue} */\n private static async qrOpenID4VCIValue(\n args: CreateValueArgs<QRType.OpenID4VCI, OpenID4VCIDataWithScheme>,\n context: IRequiredContext,\n ): Promise<string> {\n const { object } = args.data\n if (!object.credentialOffer && !object.credentialOfferUri) {\n throw new Error('Please provide credential_offer or credential_offer_uri')\n }\n const scheme = (object.scheme ?? 'openid-credential-offer://').replace('://?', '').replace('://', '') + '://'\n const baseUri = object.baseUri ?? ''\n let url\n const splitBaseUri = baseUri.split('://')\n const hasScheme = splitBaseUri.length > 1\n if (hasScheme && object.scheme) {\n if (splitBaseUri[0] !== object.scheme) {\n throw new Error('The uri must contain the same scheme or omit it')\n }\n url = `${baseUri}`\n } else {\n url = `${scheme}${baseUri}`\n }\n const credentialOfferUri = `?credential_offer_uri=${object.credentialOfferUri?.replace('credential_offer_uri=', '')}`\n const credentialOffer = `?credential_offer=${object.credentialOffer?.replace('credential_offer=', '')}`\n const value = object.credentialOffer ? credentialOffer : credentialOfferUri\n return `${url}${value}`\n }\n}\n"],"mappings":"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","names":["QRType","StatusCode","events","QRCode","QRCodeImport","default","generateQRCodeValueImpl","args","orig","context","onGenerate","id","data","value","object","result","renderingProps","undefined","agent","emit","events","QR_CODE_CODE_CREATED","generateQRCodeReactElement","generateQRCodeReactElementImpl","bgColor","fgColor","level","size","title","React","QRCode","DidCommOutOfBandMessage","toJson","props","JSON","stringify","replace","urlEncode","payload","base64url","QrCodeProvider","methods","qrDIDCommOobInvitationElement","bind","qrDIDCommOobInvitationValue","qrSIOPv2Element","qrSIOPv2Value","qrURIElement","qrOpenID4VCIElement","qrOpenID4VCIValue","args","context","generateQRCodeReactElement","object","data","encoded","DidCommOutOfBandMessage","urlEncode","oobInvitation","delim","baseURI","includes","replace","content","generateQRCodeReactElementImpl","scheme","requestUri","credentialOffer","credentialOfferUri","Error","baseUri","url","splitBaseUri","split","hasScheme","length","value"]}