Saltar al contenido principal

WACI DIDComm

Tipos de mensaje

El protocolo define distintos flujos de mensajes dependendiendo de si se quiere emitir una credencial o presentar una credencial. Estos mensajes se distinguen en pasos segun la especificacion WACI-DIDComm Interop Profile.

PasoEmisiónPresentación
1Out of bandOut of band
2Propose CredentialPropose Presentation
3Offer Credential Request Presentation
4Request CredentialPresent Proof
5AckAck Presentation

El servicio WACIInterpreter se encarga de tomar el mensaje, interpretar si es de tipo WACI y ademas que flujo pertenece para responder con el mesaje oportuno.

1. Instala

npm i @extrimian/waci

2. Instancia

const waci = new WACIInterpreter();

3. Interpreta el mensaje

waci.isWACIMessage(messageToCheck);

messageToCheck puede ser cualquier tipo de mensaje, si no tiene la estructura de una mensaje de WACI lo descarta.

Para que sea de tipo WACI debe tener la siguiente estructura:

type WACIMessage = {
type: WACIMessageType;
id: string;
from: string;
to?: string[];
body?: any;
pthid?: string;
thid?: string;
attachments?: any[];
};

4. Procesa el mensaje

waci.processMessage(WACIMessage[])

processMessage se encarga de recibir un mensaje WACI y delegar su interpretacion al handler que corresponda al tipo de mensaje que sea.

5. Set Up For

El WACIInterpreter tiene un metodo llamado setUpFor para definir el flujo correspondiente al intercambio de credenciales.

new WACIInterpreter().setUpFor<Actor>(params: InputCallbacks[Actor], actor: Actor);

Requiere la definicion del Actor ya que el flujo de WACI cambia dependiendo de los actores.

enum Actor {
Holder = "holder",
Issuer = "issuer",
Verifier = "verifier",
}

Luego se deben configurara distintos tipos de callbacks segun se quiera emitir, presentar o verificar una credencial.

Por ejemplo para la verificación de una credencial se deberia instanciar de la siguiente manera:

 waci.setUpFor(
{
getPresentationDefinition: (): any => {
return [credentialModel];
},
verifyCredential: async (credential: any): Promise<boolean> => {
console.log('Credential', JSON.stringify(credential, null, 2));

const vcVerifierService = new VCVerifierService({
didDocumentResolver: didResolver.resolveDid,
});

const verifier = await vcVerifierService.verify(credential, {
name: 'assertionMethod',
});

console.log('verifiers', JSON.stringify(verifier, null, 2));

return verifier.result;
},
}
Actor.Verifier)