diff --git a/.gitignore b/.gitignore index fa34ce305..5705b441e 100644 --- a/.gitignore +++ b/.gitignore @@ -17,9 +17,8 @@ node_modules .env.production.local .vscode .idea - +build npm-debug.log* yarn-debug.log* yarn-error.log* -build *.db \ No newline at end of file diff --git a/.npmignore b/.npmignore index 348c68698..d36841e97 100644 --- a/.npmignore +++ b/.npmignore @@ -33,7 +33,4 @@ README.md .eslintignore .eslintrc.json webpack.config.js -babel.config.js -build/browser-test -build/node-test -build/types/demos \ No newline at end of file +babel.config.js \ No newline at end of file diff --git a/demos/browser/App.tsx b/demos/browser/App.tsx index 36f36947c..bfcbdde71 100644 --- a/demos/browser/App.tsx +++ b/demos/browser/App.tsx @@ -5,21 +5,21 @@ import {useAtom} from "jotai"; import * as SDK from "../../index"; import * as Domain from '../../domain'; -import {PrismDIDInfo} from '../../domain/models/PrismDIDInfo'; -import Pluto from '../../pluto/Pluto'; import { + MnemonicWordList, Service as DIDDocumentService, - ServiceEndpoint as DIDDocumentServiceEndpoint, -} from "../../domain"; -import { mnemonicsAtom } from "./state"; -import { trimString } from "./utils"; + ServiceEndpoint as DIDDocumentServiceEndpoint +} from '../../domain'; +import {PrismDIDInfo} from '../../domain/models/PrismDIDInfo'; +import Pluto from '../../pluto/Pluto'; +import {mnemonicsAtom} from "./state"; +import {trimString} from "./utils"; import Spacer from "./Spacer"; -import { Box } from "./Box"; -import { MnemonicWordList } from "../../domain"; -import { BasicMessage } from "../../prism-agent/protocols/other/BasicMessage"; +import {Box} from "./Box"; +import {BasicMessage} from "../../prism-agent/protocols/other/BasicMessage"; const mediatorDID = SDK.Domain.DID.fromString( - "did:peer:2.Ez6LScuuNiWo8rwnpYy5dXbq7JnVDv6yCgsAz6viRUWCUbCJk.Vz6MkfzL1tPPvpXioYDwuGQRdpATV1qb4x7mKmcXyhCmLcUGK.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL21lZGlhdG9yLmpyaWJvLmtpd2kiLCJhIjpbImRpZGNvbW0vdjIiXX0" + "did:peer:2.Ez6LScuuNiWo8rwnpYy5dXbq7JnVDv6yCgsAz6viRUWCUbCJk.Vz6MkfzL1tPPvpXioYDwuGQRdpATV1qb4x7mKmcXyhCmLcUGK.SeyJpZCI6Im5ldy1pZCIsInQiOiJkbSIsInMiOiJodHRwczovL21lZGlhdG9yLmpyaWJvLmtpd2kiLCJhIjpbImRpZGNvbW0vdjIiXX0" ); const apollo = new SDK.Apollo(); @@ -34,38 +34,38 @@ function Mnemonics() { } return ( - -

Mnemonics and keys

+ +

Mnemonics and keys

- - -
- {mnemonics - ? mnemonics.map((word, i) => ( - + + +
+ {mnemonics + ? mnemonics.map((word, i) => ( + {i + 1}. {word} - )) - : null} -
- + )) + : null} +
+
); } -function KeyPair({ curve = SDK.Domain.Curve.SECP256K1 }: { curve?: SDK.Domain.Curve }) { +function KeyPair({curve = SDK.Domain.Curve.SECP256K1}: { curve?: SDK.Domain.Curve }) { const [mnemonics] = useAtom(mnemonicsAtom); // let [keyPair, setKeyPair] = React.useState(null); const [keyPair, setKeyPair] = React.useState(); @@ -378,34 +378,35 @@ export const PlutoApp: React.FC<{ pluto: SDK.Pluto }> = props => { }, [pluto, dids]); return ( - -

Pluto

- - - + +

Pluto

+ + + -
-
- -
- - {error} - { - dids?.map((item, index) => ( -
{item.did.toString()}
- )) ?? null - } -
-
+
+
+ +
+ + {error} + { + dids?.map((item, index) => ( +
{item.did.toString()}
+ )) ?? null + } +
+
); -} +}; const Agent: React.FC<{ agent: SDK.Agent }> = props => { const [state, setState] = React.useState(props.agent.state); @@ -413,123 +414,123 @@ const Agent: React.FC<{ agent: SDK.Agent }> = props => { const [newMessage, setNewMessage] = React.useState([]); const [messages, setMessages] = React.useState([]); - const handleMessages = useCallback((event:any) => { + const handleMessages = useCallback((event: any) => { const joinedMessages = [...messages, ...event]; - setMessages(joinedMessages) - setNewMessage(joinedMessages.map(() => "")) - }, []) + setMessages(joinedMessages); + setNewMessage(joinedMessages.map(() => "")); + }, []); + - useEffect(() => { - props.agent.onMessage(handleMessages) + props.agent.onMessage(handleMessages); return () => { - props.agent.clearOnMessage(handleMessages) - } - }, []) + props.agent.clearOnMessage(handleMessages); + }; + }, []); - const handleOnChange = (e:any, i:number) => { + const handleOnChange = (e: any, i: number) => { setNewMessage([ - ...newMessage.map((message:any, z:number) => { + ...newMessage.map((message: any, z: number) => { if (z === i) { - return e.target.value + return e.target.value; } - return message + return message; }) - ]) - } + ]); + }; const handleStart = async () => { setState("starting"); try { const status = await props.agent.start(); - const mediator = props.agent.currentMediatorDID + const mediator = props.agent.currentMediatorDID; if (!mediator) { - throw new Error("Mediator not available") + throw new Error("Mediator not available"); } const secondaryDID = await props.agent.createNewPeerDID( - [ - new DIDDocumentService( - "#didcomm-1", - ["DIDCommMessaging"], - new DIDDocumentServiceEndpoint( - mediator.toString() - ) - ), - ], - true + [ + new DIDDocumentService( + "#didcomm-1", + ["DIDCommMessaging"], + new DIDDocumentServiceEndpoint( + mediator.toString() + ) + ), + ], + true ); const testMessage = new BasicMessage( - { content: "Test Message" }, - secondaryDID, - secondaryDID + {content: "Test Message"}, + secondaryDID, + secondaryDID ).makeMessage(); try { await props.agent.sendMessage(testMessage); } catch (err) { - console.log("Safe to ignore, mediator returns null on successfully receiving the message, unpack fails.") + console.log("Safe to ignore, mediator returns null on successfully receiving the message, unpack fails."); } setState(status); - } - catch (e) { + } catch (e) { setError(e); setState("failed"); throw e; } - } + }; const handleSend = async (responseMessageIndex: number) => { const text = newMessage[responseMessageIndex]; - setNewMessage(newMessage.map((message: any, i:number) => (i === responseMessageIndex) ? "": message)) + setNewMessage(newMessage.map((message: any, i: number) => (i === responseMessageIndex) ? "" : message)); const message = messages[responseMessageIndex]; await props.agent.sendMessage( - new BasicMessage( - { content: text }, - message.from, - message.from - ).makeMessage() - ) - } + new BasicMessage( + {content: text}, + message.from, + message.from + ).makeMessage() + ); + }; const handleStop = async () => { setState("stopping"); await props.agent.stop(); setState("stopped"); - } + }; return ( - -

Agent

-

- Status:  {props.agent.state} -

-
- {state === "stopped" && ( - - )} - {props.agent.state === "running" && ( - <> - - {messages.map((message:any, i: number) => { - return
-

Message {message.id} {JSON.parse(message.body).content}

- handleOnChange(e, i)} /> - -
- })} - - )} -
+ +

Agent

+

+ Status:  {props.agent.state} +

+
+ {state === "stopped" && ( + + )} + {props.agent.state === "running" && ( + <> + + {messages.map((message: any, i: number) => { + return
+

Message {message.id} {JSON.parse(message.body).content}

+ handleOnChange(e, i)}/> + +
; + })} + + )} +
- {error instanceof Error && ( -
+        {error instanceof Error && (
+            
           Error: {error.message}
         
- )} - + )} + ); -} +}; const useSDK = () => { const pluto = new Pluto({ @@ -574,38 +575,38 @@ const useSDK = () => { "admit", "peanut" ] as MnemonicWordList; - const seed = apollo.createSeed(words) + const seed = apollo.createSeed(words); const agent = new SDK.Agent( - apollo, - castor, - pluto, - mercury, - handler, - manager, - seed + apollo, + castor, + pluto, + mercury, + handler, + manager, + seed ); - return { agent, pluto }; -} + return {agent, pluto}; +}; function App() { const sdk = useSDK(); return ( -
-

Atala PRISM Wallet SDK Usage Examples

- - - - - - - - - - - -
+
+

Atala PRISM Wallet SDK Usage Examples

+ + + + + + + + + + + +
); } diff --git a/index.ts b/index.ts index bdf44af52..64236816e 100644 --- a/index.ts +++ b/index.ts @@ -1,10 +1,11 @@ -export { default as Apollo } from "./apollo/Apollo"; -export { default as Castor } from "./castor/Castor"; +export {default as Apollo} from "./apollo/Apollo"; +export {default as Castor} from "./castor/Castor"; export * as Domain from "./domain"; -export { default as Mercury } from "./mercury/Mercury"; -export { default as Pluto } from "./pluto/Pluto"; -export { default as Pollux } from "./pollux/Pollux"; -export { default as Agent } from "./prism-agent/Agent"; +export {default as Mercury} from "./mercury/Mercury"; +export {default as Pluto} from "./pluto/Pluto"; +export {default as Pollux} from "./pollux/Pollux"; +export {default as Agent} from "./prism-agent/Agent"; +export * from "./prism-agent/protocols/other/BasicMessage"; export * from "./prism-agent/connectionsManager/ConnectionsManager"; export * from "./prism-agent/mediator/BasicMediatorHandler"; export * from "./prism-agent/mediator/PlutoMediatorStore"; diff --git a/package-lock.json b/package-lock.json index 0b579e823..532fefafc 100644 --- a/package-lock.json +++ b/package-lock.json @@ -22,6 +22,7 @@ "google-protobuf": "^3.21.2", "hash.js": "1.1.7", "jose": "^4.12.2", + "localforage": "^1.10.0", "multiformats": "^9.9.0", "typeorm": "^0.3.12" }, @@ -76,12 +77,12 @@ "jest": "^29.5.0", "jotai": "^2.0.3", "json-loader": "^0.5.7", - "localforage": "^1.10.0", "mini-css-extract-plugin": "^2.7.3", "path-browserify": "^1.0.1", "process": "^0.11.10", "react": "^18.2.0", "react-dom": "^18.2.0", + "react-native-sqlite-storage": "./dummy", "sinon": "^15.0.1", "sinon-chai": "^3.7.0", "sql.js": "^1.8.0", @@ -97,6 +98,11 @@ "webpack-cli": "^5.0.1", "webpack-dev-server": "4.11.1", "webpack-node-externals": "^3.0.0" + }, + "peerDependenciesMeta": { + "react-native-sqlite-storage": { + "optional": true + } } }, "node_modules/@ampproject/remapping": { @@ -8152,8 +8158,7 @@ "node_modules/immediate": { "version": "3.0.6", "resolved": "https://registry.npmjs.org/immediate/-/immediate-3.0.6.tgz", - "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==", - "dev": true + "integrity": "sha512-XXOFtyqDjNDAQxVfYxuF7g9Il/IbWmmlQg2MYKOH8ExIT1qg6xc4zyS3HaEEATgs1btfzxq15ciUiY7gjSXRGQ==" }, "node_modules/import-fresh": { "version": "3.3.0", @@ -10249,7 +10254,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/lie/-/lie-3.1.1.tgz", "integrity": "sha512-RiNhHysUjhrDQntfYSfY4MU24coXXdEOgw9WGcKHNeEwffDYbF//u87M1EWaMGzuFoSbqW0C9C6lEEhDOAswfw==", - "dev": true, "dependencies": { "immediate": "~3.0.5" } @@ -10292,7 +10296,6 @@ "version": "1.10.0", "resolved": "https://registry.npmjs.org/localforage/-/localforage-1.10.0.tgz", "integrity": "sha512-14/H1aX7hzBBmmh7sGPd+AOMkkIrHM3Z1PAyGgZigA1H1p5O5ANnMyWzvpAETtG68/dC4pC0ncy3+PPGzXZHPg==", - "dev": true, "dependencies": { "lie": "3.1.1" } @@ -12258,6 +12261,12 @@ "dev": true, "license": "MIT" }, + "node_modules/react-native-sqlite-storage": { + "version": "1.0.0", + "resolved": "file:dummy", + "dev": true, + "license": "ISC" + }, "node_modules/readable-stream": { "version": "3.6.2", "license": "MIT", @@ -13027,8 +13036,9 @@ }, "node_modules/sql.js": { "version": "1.8.0", - "devOptional": true, - "license": "MIT" + "resolved": "https://registry.npmjs.org/sql.js/-/sql.js-1.8.0.tgz", + "integrity": "sha512-3HD8pSkZL+5YvYUI8nlvNILs61ALqq34xgmF+BHpqxe68yZIJ1H+sIVIODvni25+CcxHUxDyrTJUL0lE/m7afw==", + "devOptional": true }, "node_modules/sqlite3": { "version": "5.1.6", diff --git a/package.json b/package.json index 4e94bdb95..f38126ab7 100644 --- a/package.json +++ b/package.json @@ -26,6 +26,11 @@ }, "author": "", "license": "", + "peerDependenciesMeta": { + "react-native-sqlite-storage": { + "optional": true + } + }, "keywords": [], "devDependencies": { "@babel/cli": "^7.21.0", @@ -78,7 +83,6 @@ "jest": "^29.5.0", "jotai": "^2.0.3", "json-loader": "^0.5.7", - "localforage": "^1.10.0", "mini-css-extract-plugin": "^2.7.3", "path-browserify": "^1.0.1", "process": "^0.11.10", @@ -86,7 +90,6 @@ "react-dom": "^18.2.0", "sinon": "^15.0.1", "sinon-chai": "^3.7.0", - "sql.js": "^1.8.0", "sqlite3": "^5.1.6", "stream-browserify": "^3.0.0", "style-loader": "^3.3.1", @@ -96,6 +99,7 @@ "url-loader": "^4.1.1", "util": "^0.12.5", "webpack": "^5.76.0", + "sql.js": "^1.8.0", "webpack-cli": "^5.0.1", "webpack-dev-server": "4.11.1", "webpack-node-externals": "^3.0.0" @@ -121,6 +125,7 @@ "google-protobuf": "^3.21.2", "hash.js": "1.1.7", "jose": "^4.12.2", + "localforage": "^1.10.0", "multiformats": "^9.9.0", "typeorm": "^0.3.12" } diff --git a/pluto/Pluto.ts b/pluto/Pluto.ts index 453518bb9..032552c64 100644 --- a/pluto/Pluto.ts +++ b/pluto/Pluto.ts @@ -3,7 +3,7 @@ import {DID, getKeyCurveByNameAndIndex, Mediator, Message, PeerDID, PrivateKey} import {PrismDIDInfo} from '../domain/models/PrismDIDInfo'; import {VerifiableCredential} from '../domain/models/VerifiableCredential'; import {default as PlutoInterface} from '../domain/buildingBlocks/Pluto'; -import {DataSource} from 'typeorm'; +import {DataSource, Repository} from 'typeorm'; import * as entities from './entities'; import Did from './entities/DID'; import {DIDPair} from '../domain/models/DIDPair'; @@ -49,10 +49,19 @@ export default class Pluto implements PlutoInterface { dataSource: DataSource; constructor(connection: PlutoConnectionProps) { + const presetSqlJSConfig = connection.type === 'sqljs' ? { + location: "pluto", + useLocalForage: true, + autoSave: true, + sqlJsConfig: { + locateFile: (file: string) => `https://sql.js.org/dist/${file}` + } + } : {}; this.dataSource = new DataSource({ + ...presetSqlJSConfig, ...connection, entities: Object.values(entities), - synchronize: true + synchronize: true, }); } @@ -174,10 +183,10 @@ export default class Pluto implements PlutoInterface { } async getAllPrismDIDs() { - const didRepository = this.dataSource.manager.getRepository(entities.DID); + const didRepository = this.dataSource.manager.getRepository("did"); try { const dids: (Did & Record<"keyPathIndex", number>)[] = await didRepository.createQueryBuilder('did') - .innerJoin('PrivateKey', 'private_key', 'did.did = private_key.didId') + .innerJoin('private_key', 'private_key', 'did.did = private_key.didId') .select('did.*, private_key.keyPathIndex') .where('did.method = :method', {method: "prism"}) .getRawMany(); @@ -192,7 +201,7 @@ export default class Pluto implements PlutoInterface { } async getDIDInfoByDID(did: DID) { - const didRepository = this.dataSource.manager.getRepository(entities.DID); + const didRepository = this.dataSource.manager.getRepository("did"); try { const didResponse: (Did & Record<"keyPathIndex", number>) | undefined = await didRepository.createQueryBuilder('did') .innerJoin('private_key', 'private_key', 'did.did = private_key.didId') @@ -220,7 +229,7 @@ export default class Pluto implements PlutoInterface { } async getDIDInfoByAlias(alias: string) { - const didRepository = this.dataSource.manager.getRepository(entities.DID); + const didRepository = this.dataSource.manager.getRepository("did"); try { const didResponse: (Did & Record<"private_key_keyPathIndex", number>)[] = await didRepository.createQueryBuilder('did') @@ -242,7 +251,7 @@ export default class Pluto implements PlutoInterface { } async getPrismDIDKeyPathIndex(did: DID) { - const repository = this.dataSource.manager.getRepository(entities.PrivateKey); + const repository = this.dataSource.manager.getRepository("private_key"); try { const data = await repository.findOne({ where: { @@ -259,7 +268,7 @@ export default class Pluto implements PlutoInterface { } async getPrismLastKeyPathIndex() { - const repository = this.dataSource.manager.getRepository(entities.PrivateKey); + const repository = this.dataSource.manager.getRepository("private_key"); try { const data = await repository.createQueryBuilder('private_key') .select('private_key.keyPathIndex') @@ -281,8 +290,8 @@ export default class Pluto implements PlutoInterface { } async getAllPeerDIDs() { - const didRepository = this.dataSource.manager.getRepository(entities.DID); - const privateKeysRepository = this.dataSource.manager.getRepository(entities.PrivateKey); + const didRepository: Repository = this.dataSource.manager.getRepository("did"); + const privateKeysRepository = this.dataSource.manager.getRepository("private_key"); /* * This method is overcomplicated, dids should have relations. * */ @@ -317,7 +326,7 @@ export default class Pluto implements PlutoInterface { } async getDIDPrivateKeysByDID(did: DID) { - const repository = this.dataSource.manager.getRepository(entities.PrivateKey); + const repository = this.dataSource.manager.getRepository("private_key"); try { const data = await repository.find({ where: { @@ -336,7 +345,7 @@ export default class Pluto implements PlutoInterface { } async getDIDPrivateKeyByID(id: string) { - const repository = this.dataSource.manager.getRepository(entities.PrivateKey); + const repository = this.dataSource.manager.getRepository("private_key"); try { const data = await repository.findOne({ @@ -357,7 +366,7 @@ export default class Pluto implements PlutoInterface { } async getAllDidPairs() { - const repository = this.dataSource.manager.getRepository(entities.DIDPair); + const repository = this.dataSource.manager.getRepository("did_pair"); try { const data = await repository.find({ relationLoadStrategy: "join" @@ -374,7 +383,7 @@ export default class Pluto implements PlutoInterface { async getPairByDID(did: DID) { - const repository = this.dataSource.manager.getRepository(entities.DIDPair); + const repository = this.dataSource.manager.getRepository("did_pair"); try { const data = await repository.findOne({ where: { @@ -396,7 +405,7 @@ export default class Pluto implements PlutoInterface { } async getPairByName(name: string) { - const repository = this.dataSource.manager.getRepository(entities.DIDPair); + const repository = this.dataSource.manager.getRepository("did_pair"); try { const data = await repository.findOne({ where: { @@ -418,7 +427,7 @@ export default class Pluto implements PlutoInterface { } async getAllMessages() { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.find(); return data.map(Pluto.transformMessageDBToInterface); @@ -426,7 +435,7 @@ export default class Pluto implements PlutoInterface { async getAllMessagesByDID(did: DID) { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.find({ where: { from: did.toString() @@ -437,7 +446,7 @@ export default class Pluto implements PlutoInterface { } async getAllMessagesSent() { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.find({ where: { isReceived: 0 @@ -447,7 +456,7 @@ export default class Pluto implements PlutoInterface { } async getAllMessagesReceived() { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.find({ where: { isReceived: 1 @@ -457,7 +466,7 @@ export default class Pluto implements PlutoInterface { } async getAllMessagesSentTo(did: DID) { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.find({ where: { to: did.toString() @@ -467,7 +476,7 @@ export default class Pluto implements PlutoInterface { } async getAllMessagesReceivedFrom(did: DID) { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.find({ where: { from: did.toString() @@ -477,7 +486,7 @@ export default class Pluto implements PlutoInterface { } async getAllMessagesOfType(type: string, relatedWithDID?: DID) { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.createQueryBuilder('message') .where('message.type = :type', {type}) .andWhere(':relatedWithDID IS NULL OR :relatedWithDID IN (message.from, message.to)', {relatedWithDID: relatedWithDID?.toString() ?? null}) @@ -487,7 +496,7 @@ export default class Pluto implements PlutoInterface { } async getAllMessagesByFromToDID(from: DID, to: DID) { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.find({ where: { from: from.toString(), @@ -498,7 +507,7 @@ export default class Pluto implements PlutoInterface { } async getMessage(id: string) { - const repository = this.dataSource.manager.getRepository(entities.Message); + const repository: Repository = this.dataSource.manager.getRepository("message"); const data = await repository.findOne({ where: { id @@ -511,7 +520,7 @@ export default class Pluto implements PlutoInterface { } async getAllMediators() { - const repository = this.dataSource.manager.getRepository(entities.Mediator); + const repository: Repository = this.dataSource.manager.getRepository("mediator"); const data = await repository.find({ relationLoadStrategy: "join" }); @@ -524,7 +533,7 @@ export default class Pluto implements PlutoInterface { } async getAllCredentials() { - const repository = this.dataSource.manager.getRepository(entities.VerifiableCredential); + const repository: Repository = this.dataSource.manager.getRepository("verifiable_credential"); const data = await repository.find(); return data.map(credential => { const json = JSON.parse(credential.verifiableCredentialJson) as VerifiableCredential; diff --git a/pluto/entities/DID.ts b/pluto/entities/DID.ts index c6b41fc9d..5c1cbbe2f 100644 --- a/pluto/entities/DID.ts +++ b/pluto/entities/DID.ts @@ -1,6 +1,6 @@ import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'; -@Entity("Did") +@Entity({name: "did"}) export default class Did { @PrimaryGeneratedColumn('uuid') id?: string; diff --git a/pluto/entities/DIDPair.ts b/pluto/entities/DIDPair.ts index 058bb7d31..02a2c992e 100644 --- a/pluto/entities/DIDPair.ts +++ b/pluto/entities/DIDPair.ts @@ -1,6 +1,6 @@ import {Column, Entity, PrimaryColumn} from 'typeorm'; -@Entity() +@Entity({name: "did_pair"}) export default class DidPair { @PrimaryColumn({type: 'text'}) id?: string; // ID will be hostDID and receiverDID concatenated diff --git a/pluto/entities/Mediator.ts b/pluto/entities/Mediator.ts index 1e0742ff2..809f33e18 100644 --- a/pluto/entities/Mediator.ts +++ b/pluto/entities/Mediator.ts @@ -1,6 +1,6 @@ import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'; -@Entity() +@Entity({name: "mediator"}) export default class Mediator { @PrimaryGeneratedColumn('uuid') id!: string; diff --git a/pluto/entities/Message.ts b/pluto/entities/Message.ts index b8b470ff6..64c99a5b2 100644 --- a/pluto/entities/Message.ts +++ b/pluto/entities/Message.ts @@ -1,6 +1,6 @@ import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'; -@Entity() +@Entity({name: "message"}) export default class Message { @PrimaryGeneratedColumn('uuid') id!: string; diff --git a/pluto/entities/PrivateKey.ts b/pluto/entities/PrivateKey.ts index 67a997618..46ad18543 100644 --- a/pluto/entities/PrivateKey.ts +++ b/pluto/entities/PrivateKey.ts @@ -1,6 +1,6 @@ import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'; -@Entity() +@Entity({name: "private_key"}) export default class PrivateKey { @PrimaryGeneratedColumn('uuid') id!: string; diff --git a/pluto/entities/VerifiableCredential.ts b/pluto/entities/VerifiableCredential.ts index 969d0c8d5..627ea26e6 100644 --- a/pluto/entities/VerifiableCredential.ts +++ b/pluto/entities/VerifiableCredential.ts @@ -1,6 +1,7 @@ import {Column, Entity, PrimaryGeneratedColumn} from 'typeorm'; -@Entity() + +@Entity({name: "verifiable_credential"}) export default class VerifiableCredential { @PrimaryGeneratedColumn('uuid') id!: string; diff --git a/prism-agent/Agent.ts b/prism-agent/Agent.ts index b041fe123..b2cfb1ef3 100644 --- a/prism-agent/Agent.ts +++ b/prism-agent/Agent.ts @@ -10,10 +10,10 @@ import { import Castor from "../domain/buildingBlocks/Castor"; import Pluto from "../domain/buildingBlocks/Pluto"; import Mercury from "../domain/buildingBlocks/Mercury"; -import { Api } from "../domain/models/Api"; -import { ApiImpl } from "./helpers/ApiImpl"; +import {Api} from "../domain/models/Api"; +import {ApiImpl} from "./helpers/ApiImpl"; -import { AgentError } from "../domain/models/Errors"; +import {AgentError} from "../domain/models/Errors"; import { AgentCredentials as AgentCredentialsClass, AgentDIDHigherFunctions as AgentDIDHigherFunctionsClass, @@ -24,15 +24,13 @@ import { MediatorHandler, PrismOnboardingInvitation, } from "./types"; -import { OutOfBandInvitation } from "./protocols/invitation/v2/OutOfBandInvitation"; -import { VerifiableCredential } from "../domain/models/VerifiableCredential"; -import { AgentCredentials } from "./Agent.Credentials"; -import { AgentDIDHigherFunctions } from "./Agent.DIDHigherFunctions"; -import { AgentInvitations } from "./Agent.Invitations"; -import { ConnectionsManager } from "./connectionsManager/ConnectionsManager"; -import { AgentMessageEvents } from "./Agent.MessageEvents"; -import { ProtocolType } from "./protocols/ProtocolTypes"; -import { BasicMessage } from "./protocols/other/BasicMessage"; +import {OutOfBandInvitation} from "./protocols/invitation/v2/OutOfBandInvitation"; +import {VerifiableCredential} from "../domain/models/VerifiableCredential"; +import {AgentCredentials} from "./Agent.Credentials"; +import {AgentDIDHigherFunctions} from "./Agent.DIDHigherFunctions"; +import {AgentInvitations} from "./Agent.Invitations"; +import {ConnectionsManager} from "./connectionsManager/ConnectionsManager"; +import {AgentMessageEvents} from "./Agent.MessageEvents"; enum AgentState { STOPPED = "stopped", @@ -42,72 +40,71 @@ enum AgentState { } export default class Agent - implements - AgentCredentialsClass, - AgentDIDHigherFunctionsClass, - AgentInvitationsClass, - AgentMessageEventsClass -{ + implements AgentCredentialsClass, + AgentDIDHigherFunctionsClass, + AgentInvitationsClass, + AgentMessageEventsClass { public state: AgentState = AgentState.STOPPED; - public get currentMediatorDID() { - return this.mediationHandler.mediator?.mediatorDID; - } private agentCredentials: AgentCredentials; private agentDIDHigherFunctions: AgentDIDHigherFunctions; private agentInvitations: AgentInvitations; private agentMessageEvents: AgentMessageEvents; constructor( - protected apollo: Apollo, - protected castor: Castor, - protected pluto: Pluto, - protected mercury: Mercury, - public mediationHandler: MediatorHandler, - protected connectionManager = new ConnectionsManager( - castor, - mercury, - pluto, - mediationHandler - ), - protected seed: Seed = apollo.createRandomSeed().seed, - protected api: Api = new ApiImpl() + protected apollo: Apollo, + protected castor: Castor, + protected pluto: Pluto, + protected mercury: Mercury, + public mediationHandler: MediatorHandler, + protected connectionManager = new ConnectionsManager( + castor, + mercury, + pluto, + mediationHandler + ), + protected seed: Seed = apollo.createRandomSeed().seed, + protected api: Api = new ApiImpl() ) { this.agentCredentials = new AgentCredentials(pluto); this.agentDIDHigherFunctions = new AgentDIDHigherFunctions( - apollo, - castor, - pluto, - connectionManager, - mediationHandler, - seed + apollo, + castor, + pluto, + connectionManager, + mediationHandler, + seed ); this.agentInvitations = new AgentInvitations( - this.pluto, - this.api, - this.agentDIDHigherFunctions, - this.connectionManager + this.pluto, + this.api, + this.agentDIDHigherFunctions, + this.connectionManager ); this.agentMessageEvents = new AgentMessageEvents(connectionManager, pluto); } + public get currentMediatorDID() { + return this.mediationHandler.mediator?.mediatorDID; + } + static instanceFromConnectionManager( - apollo: Apollo, - castor: Castor, - pluto: Pluto, - mercury: Mercury, - connectionManager: ConnectionsManager, - seed?: Seed, - api?: Api + apollo: Apollo, + castor: Castor, + pluto: Pluto, + mercury: Mercury, + connectionManager: ConnectionsManager, + seed?: Seed, + api?: Api ) { return new Agent( - apollo, - castor, - pluto, - mercury, - connectionManager.mediationHandler, - connectionManager, - seed ? seed : apollo.createRandomSeed().seed, - api ? api : new ApiImpl() + apollo, + castor, + pluto, + mercury, + connectionManager.mediationHandler, + connectionManager, + seed ? seed : apollo.createRandomSeed().seed, + api ? api : new ApiImpl() ); } @@ -122,16 +119,16 @@ export default class Agent } catch (e) { if (e instanceof AgentError.NoMediatorAvailableError) { const hostDID = await this.createNewPeerDID( - [ - new DIDDocumentService( - "#didcomm-1", - ["DIDCommMessaging"], - new DIDDocumentServiceEndpoint( - this.connectionManager.mediationHandler.mediatorDID.toString() - ) - ), - ], - false + [ + new DIDDocumentService( + "#didcomm-1", + ["DIDCommMessaging"], + new DIDDocumentServiceEndpoint( + this.connectionManager.mediationHandler.mediatorDID.toString() + ) + ), + ], + false ); await this.connectionManager.registerMediator(hostDID); } else throw e; @@ -156,24 +153,24 @@ export default class Agent } async createNewPrismDID( - alias: string, - services: DIDDocumentService[] = [], - keyPathIndex?: number + alias: string, + services: DIDDocumentService[] = [], + keyPathIndex?: number ): Promise { return this.agentDIDHigherFunctions.createNewPrismDID( - alias, - services, - keyPathIndex + alias, + services, + keyPathIndex ); } async createNewPeerDID( - services: DIDDocumentService[] = [], - updateMediator = true + services: DIDDocumentService[] = [], + updateMediator = true ): Promise { return this.agentDIDHigherFunctions.createNewPeerDID( - services, - updateMediator + services, + updateMediator ); } @@ -198,7 +195,7 @@ export default class Agent } async acceptDIDCommInvitation( - invitation: OutOfBandInvitation + invitation: OutOfBandInvitation ): Promise { return this.agentInvitations.acceptDIDCommInvitation(invitation); } diff --git a/webpack/webpack.browser.conf.js b/webpack/webpack.browser.conf.js index b99ec98b8..f908b06d4 100644 --- a/webpack/webpack.browser.conf.js +++ b/webpack/webpack.browser.conf.js @@ -19,16 +19,16 @@ module.exports = (env, argv) => { {from: './node_modules/sql.js/dist/sql-wasm.wasm'} ] })] : []; - const providePluginStuff = !isProduction ? [new webpack.ProvidePlugin({ - 'window.SQL': 'sql.js/dist/sql-wasm.js', + const providePluginStuff = new webpack.ProvidePlugin({ + 'window.SQL': "sql.js/dist/sql-wasm.js", 'window.localforage': 'localforage/dist/localforage.js', - })] : []; + }); const plugins = [ new webpack.NormalModuleReplacementPlugin(/typeorm$/, function (result) { result.request = result.request.replace(/typeorm/, "typeorm/browser"); }), - ...providePluginStuff, + providePluginStuff, ...copyStuff, new CleanWebpackPlugin(), new webpack.ProvidePlugin(providePlutin), @@ -63,7 +63,7 @@ module.exports = (env, argv) => { mode: isProduction ? "production" : "development", devtool: "source-map", externals: { - 'react-native-sqlite-storage': 'commonjs react-native-sqlite-storage', + "sql.js": "sql.js" }, entry: isProduction ? "./index.ts" : "./demos/test-browser.tsx", devServer: { @@ -77,10 +77,14 @@ module.exports = (env, argv) => { }, output: { filename: "index.js", + libraryTarget: "umd", + library: "prism", path: path.resolve( __dirname, `../build/browser${isProduction ? "" : "-test"}` ), + publicPath: "/", + webassemblyModuleFilename: "index_bg.module.wasm", chunkFormat: "commonjs", }, optimization: {