Skip to content

Commit 90cdc28

Browse files
committed
add veramo
1 parent b38f284 commit 90cdc28

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

48 files changed

+29049
-24787
lines changed

components/layout.tsx

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -159,7 +159,7 @@ const Layout = (props: any) => {
159159
router.push("/");
160160
};
161161
return (
162-
<Box sx={{ display: 'flex' }}>
162+
(<Box sx={{ display: 'flex' }}>
163163
{/* <CssBaseline /> */}
164164
<AppBar position="fixed">
165165
<Toolbar>
@@ -237,7 +237,7 @@ const Layout = (props: any) => {
237237
</LayoutDialogTitle>
238238
<DialogContent dividers>
239239
<ul>
240-
{content.map((text: string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | React.ReactFragment | React.ReactPortal | null | undefined, index: any) => (
240+
{content.map((text: string | number | boolean | React.ReactElement<any, string | React.JSXElementConstructor<any>> | Iterable<React.ReactNode> | React.ReactPortal | null | undefined, index: any) => (
241241
<li key={index}>
242242
<Typography gutterBottom>
243243
{text}
@@ -251,7 +251,7 @@ const Layout = (props: any) => {
251251
<DrawerHeader/>
252252
{props.children}
253253
</Main>
254-
</Box>
254+
</Box>)
255255
);
256256
}
257257

lib/cors.ts

Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
import cors, { CorsOptions, CorsOptionsDelegate } from 'cors'
2+
import { NextApiRequest, NextApiResponse } from 'next'
3+
4+
// Helper method to wait for a middleware to execute before continuing
5+
// And to throw an error when an error happens in a middleware
6+
function initMiddleware(middleware: typeof cors) {
7+
return (req: NextApiRequest, res: NextApiResponse, options?: CorsOptions | CorsOptionsDelegate) =>
8+
new Promise((resolve, reject) => {
9+
middleware(options)(req, res, (result: Error | unknown) => {
10+
if (result instanceof Error) {
11+
return reject(result)
12+
}
13+
14+
return resolve(result)
15+
})
16+
})
17+
}
18+
19+
// You can read more about the available options here: https://github.com/expressjs/cors#configuration-options
20+
const NextCors = initMiddleware(cors)
21+
22+
export default NextCors

lib/createJWT.ts

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as jose from 'jose';
2-
import { randomBytes } from 'crypto';
2+
import { nanoid } from 'nanoid';
33
import objectPath from 'object-path';
44

55
var user = process.env.COUCHDB_USER;
@@ -49,8 +49,7 @@ async function createJWT(doc: any) {
4949
.setExpirationTime('6h')
5050
.setSubject(doc.email)
5151
.sign(rsaPrivateKey);
52-
const token_endpoint_access_token = Buffer.from(randomBytes(16)).toString('base64url');
53-
// const token_endpoint_access_token = randomBytes(16).toString('base64url');
52+
const token_endpoint_access_token = nanoid(22);
5453
const gnap = await nano.use("gnap");
5554
objectPath.set(doc, 'token_endpoint_access_token', token_endpoint_access_token);
5655
objectPath.set(doc, 'access_token.value', jwt);

lib/store.ts

Lines changed: 88 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,88 @@
1+
import {
2+
ClaimTableEntry,
3+
CredentialTableEntry,
4+
DiffCallback,
5+
PresentationTableEntry,
6+
VeramoJsonCache,
7+
VeramoJsonStore,
8+
} from '@veramo/data-store-json'
9+
import * as fs from 'fs'
10+
import { IIdentifier, IMessage, ManagedKeyInfo } from '@veramo/core-types'
11+
import { ManagedPrivateKey } from '@veramo/key-manager'
12+
13+
/**
14+
* A utility class that shows how a File based JSON storage system could work.
15+
* This is not recommended for large databases since every write operation rewrites the entire database.
16+
*/
17+
export class JsonFileStore implements VeramoJsonStore {
18+
notifyUpdate: DiffCallback
19+
dids: Record<string, IIdentifier>
20+
keys: Record<string, ManagedKeyInfo>
21+
privateKeys: Record<string, ManagedPrivateKey>
22+
credentials: Record<string, CredentialTableEntry>
23+
claims: Record<string, ClaimTableEntry>
24+
presentations: Record<string, PresentationTableEntry>
25+
messages: Record<string, IMessage>
26+
private file: fs.PathLike
27+
28+
private constructor(file: fs.PathLike) {
29+
this.file = file
30+
this.notifyUpdate = async (oldState: VeramoJsonCache, newState: VeramoJsonCache) => {
31+
await this.save(newState)
32+
}
33+
this.dids = {}
34+
this.keys = {}
35+
this.privateKeys = {}
36+
this.credentials = {}
37+
this.claims = {}
38+
this.presentations = {}
39+
this.messages = {}
40+
}
41+
42+
public static async fromFile(file: fs.PathLike): Promise<JsonFileStore> {
43+
const store = new JsonFileStore(file)
44+
return await store.load()
45+
}
46+
47+
private async load(): Promise<JsonFileStore> {
48+
49+
let cache: VeramoJsonCache
50+
if (fs.existsSync(this.file)) {
51+
try {
52+
const rawCache = await fs.promises.readFile(this.file, { encoding: 'utf8' })
53+
cache = JSON.parse(rawCache)
54+
} catch (e: any) {
55+
console.log(e)
56+
cache = {}
57+
}
58+
} else {
59+
cache = {}
60+
}
61+
; ({
62+
dids: this.dids,
63+
keys: this.keys,
64+
credentials: this.credentials,
65+
claims: this.claims,
66+
presentations: this.presentations,
67+
messages: this.messages,
68+
privateKeys: this.privateKeys,
69+
} = {
70+
dids: {},
71+
keys: {},
72+
credentials: {},
73+
claims: {},
74+
presentations: {},
75+
messages: {},
76+
privateKeys: {},
77+
...cache,
78+
})
79+
return this
80+
}
81+
82+
private async save(newState: VeramoJsonCache): Promise<void> {
83+
await fs.promises.writeFile(this.file, JSON.stringify(newState), {
84+
encoding: 'utf8',
85+
})
86+
}
87+
88+
}

lib/veramo.ts

Lines changed: 72 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,72 @@
1+
import { createAgent } from '@veramo/core'
2+
import { DIDManager } from '@veramo/did-manager'
3+
import { KeyManager } from '@veramo/key-manager'
4+
import { KeyManagementSystem, SecretBox } from '@veramo/kms-local'
5+
import { CredentialPlugin } from '@veramo/credential-w3c'
6+
import { EthrDIDProvider } from '@veramo/did-provider-ethr'
7+
import { KeyDIDProvider } from '@veramo/did-provider-key'
8+
import { DIDResolverPlugin } from '@veramo/did-resolver'
9+
import { Resolver } from 'did-resolver'
10+
import { getResolver as ethrDidResolver } from 'ethr-did-resolver'
11+
import { getResolver as webDidResolver } from 'web-did-resolver'
12+
import { DataStoreJson, KeyStoreJson, DIDStoreJson, PrivateKeyStoreJson } from '@veramo/data-store-json'
13+
import fs from 'fs'
14+
import { JsonFileStore } from './store'
15+
import {
16+
IDIDManager,
17+
IKeyManager,
18+
IResolver,
19+
IDataStore,
20+
ICredentialIssuer,
21+
TAgent
22+
} from '@veramo/core-types'
23+
type ConfiguredAgent = TAgent<IDIDManager & IKeyManager & IResolver & IDataStore & ICredentialIssuer>
24+
25+
const INFURA_PROJECT_ID = process.env.INFURIA_API_KEY
26+
// const INFURA_PROJECT_ID = '62cfe5babc774c1aaffa9eac6dbbf47f'
27+
let KMS_SECRET_KEY = null
28+
const kmsfile = '/data/kms';
29+
const storefile = '/data/store.json';
30+
31+
if (fs.existsSync(kmsfile)) {
32+
KMS_SECRET_KEY = fs.readFileSync(kmsfile, 'utf8')
33+
} else {
34+
KMS_SECRET_KEY = await SecretBox.createSecretKey()
35+
fs.writeFileSync(kmsfile, KMS_SECRET_KEY)
36+
}
37+
38+
const jsonFileStore = await JsonFileStore.fromFile(storefile)
39+
40+
export const agent: ConfiguredAgent = createAgent({
41+
plugins: [
42+
new KeyManager({
43+
store: new KeyStoreJson(jsonFileStore),
44+
kms: {
45+
local: new KeyManagementSystem(new PrivateKeyStoreJson(jsonFileStore, new SecretBox(KMS_SECRET_KEY))),
46+
}
47+
}),
48+
new DIDManager({
49+
store: new DIDStoreJson(jsonFileStore),
50+
defaultProvider: 'did:key',
51+
providers: {
52+
'did:ethr:sepolia': new EthrDIDProvider({
53+
defaultKms: 'local',
54+
network: 'sepolia',
55+
rpcUrl: 'https://sepolia.infura.io/v3/' + INFURA_PROJECT_ID,
56+
}),
57+
'did:key': new KeyDIDProvider({
58+
defaultKms: 'local'
59+
})
60+
},
61+
}),
62+
new DIDResolverPlugin({
63+
resolver: new Resolver({
64+
...ethrDidResolver({ infuraProjectId: INFURA_PROJECT_ID }),
65+
...webDidResolver(),
66+
})
67+
}),
68+
new DataStoreJson(jsonFileStore),
69+
new CredentialPlugin()
70+
],
71+
})
72+

next-env.d.ts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -2,4 +2,4 @@
22
/// <reference types="next/image-types/global" />
33

44
// NOTE: This file should not be edited
5-
// see https://nextjs.org/docs/pages/building-your-application/configuring/typescript for more information.
5+
// see https://nextjs.org/docs/pages/api-reference/config/typescript for more information.

0 commit comments

Comments
 (0)