# DIDComm TypeScript/Javascript API
```typescript=
/**
* Represents KeyAgreement record in DID Document
*/
interface DIDKeyAgreement {
asJWK(): string; // public JWK
}
/**
* Represents Authentication record in DID Document
*/
interface DIDKAuthentication {
asJWK(): string; // public JWK
}
/**
* Represents RouteKey record in DID Document
*/
interface DIDRouteKey {
asJWK(): string; // public JWK
}
/**
* Represents DID Document
*/
interface DIDDoc {
keyAgreements(): [DIDKeyAgreement]; // [pubJWK]
keyAgreement(kid: string): DIDKeyAgreement; // pubJWK
authentications(): [DIDKAuthentication]; // [pubJWK]
authentication(kid: string): DIDKAuthentication; // pubJWK
routeKeys(): [DIDRouteKey];
}
/**
* Represend DID Resolver concept.
* Pluggubale implementation should allow resolve
* DID Document for specific DID
*/
interface DIDResolver {
resolve(did: string): Promise<DIDDoc>;
}
/**
* Represents Secret for DID KeyAgreement
*/
interface DIDKeyAgreementSecret {
asJWK(): string; // JWK
}
interface DIDKAuthenticationSecret {
asJWK(): string; // JWK
}
interface DIDSecrets {
keyAgreements(): [DIDKeyAgreementSecret];
keyAgreement(kid: string): DIDKeyAgreementSecret;
authentications(): [DIDKAuthenticationSecret];
authentication(kid: string): DIDKAuthenticationSecret;
}
interface DIDSecretsResolver {
resolve(did: string): Promise<DIDSecrets>;
}
// Message building, encryption and decryption helpers
class MessageBuilder {
from(sender: string): MessageBuilder { return this; }
to(recipients: string | string[]): MessageBuilder { return this; }
typ(typ: string): MessageBuilder { return this; }
created_at(created_at?: Date): MessageBuilder { return this; }
expires_at(expires_at: Date): MessageBuilder { return this; }
header(header: string, value: string | object): MessageBuilder { return this; }
body(body: object): MessageBuilder { return this; }
attach(aid: string, body: Uint8Array): MessageBuilder { return this; }
finalize(): Message { return new Message(); }
}
// MessageTrustContext - contains trust infomration received after unpack
type MessageTrustContext = {
from: string | undefined;
to: [string];
nonRepudable: boolean;
// TODO: add more trust details
}
// MessageTrustOptions - defines consistency/trust checks for unpack
type MessageTrustOptions = {
// TODO: add more trust details
}
// Common error for DIDComm
class DIDCommError {
// TODO: add more trust details
}
/**
* Wrapper for plain message. Provides
*/
class Message {
/**
* New message building helper
* @returns builder for new message
*/
static build(): MessageBuilder { return new MessageBuilder(); }
/**
*
* @param raw raw message to unpack
* @param options consistency checkign and trust options
* @param didResolver didResolver to be used
* @param secretsResolver secretsResolver to be used
* @returns
* @throws DIDCommError
*/
static unpack(
raw: string,
{ options, didResolver, secretsResolver }: {
options?: MessageTrustOptions; didResolver?: DIDResolver;
secretsResolver?: DIDSecretsResolver;
}): [Message, MessageTrustContext] {
return [
new Message(),
{ from: 'did:example:alice', to: ['did:example:bob'], nonRepudable: false }
];
}
from(): string { return "from"; }
to(): [string] { return ["to"]; }
created_at(): Date | undefined { return undefined; }
expires_at(): Date | undefined { return undefined; }
headers(): { [key: string]: object; } { return {}; }
body(): object { return {}; }
as_plain(): string { return "plain"; }
async authcrypt({
from, to, method, didResolver, secretsResolver }: {
from?: string;
to?: string | string[];
method?: string;
didResolver?: DIDResolver;
secretsResolver?: DIDSecretsResolver;
}): Promise<string> { return "authcrypt"; }
async anoncrypt({
to, method, didResolver, secretsResolver }: {
to?: string | string[];
method?: string;
didResolver?: DIDResolver;
secretsResolver?: DIDSecretsResolver;
}): Promise<string> { return "anoncrypt"; }
async anoncrypt_signed({
from, to, method, didResolver, secretsResolver }: {
from?: string;
to?: string | string[];
method?: string;
didResolver?: DIDResolver;
secretsResolver?: DIDSecretsResolver;
}): Promise<string> { return "anoncrypt"; }
async sign({
from, method, secretsResolver }: {
from?: string;
method?: string;
secretsResolver?: DIDSecretsResolver;
}): Promise<string> { return "sign"; }
}
// - Examples
// Instanciate DIDResolver and DIDSecretsResolver instances
let didResolver = undefined as DIDResolver;
let secretsResolver = undefined as DIDSecretsResolver;
// Build message using builder. Note msg.as_plain() allow to get it as plain string.
let msg = Message
.build()
.from('did:example:alice')
.to(['did:example:bob1', 'did:example:bob2'])
.header('some-header', 'some-value')
.header('more-header', 'more-value')
.body({ 'say': 'hello' })
.created_at()
.expires_at(new Date())
.finalize();
// Authcrypt message with default method and specific did and secrets resolvers
let authcrypted = msg.authcrypt({
didResolver,
secretsResolver,
});
// Custom method, from, to
let authcrypted1 = msg.authcrypt({
method: 'ECDH-1PU+A256KW',
didResolver,
secretsResolver,
});
// Anocrypt message with default method and specific did and secrets resolvers
let anoncrypted = msg.anoncrypt({
didResolver,
secretsResolver,
});
// Anocrypt and sign message with default method and specific did and secrets resolvers
let anoncrypted_signed = msg.anoncrypt_signed({
didResolver,
secretsResolver,
});
// Sign message with default method and specific did and secrets resolvers
let signed = msg.sign({
secretsResolver,
});
// Unpack received message with default trust options
let unpacked_msg = Message.unpack("...", {
didResolver,
secretsResolver
});
```