diff --git a/.dockerignore b/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..958b26c9d6ea21bea38f9de590fc01075da016a9 --- /dev/null +++ b/.dockerignore @@ -0,0 +1,5 @@ +node_modules +.git +.gitignore +*.md +dist \ No newline at end of file diff --git a/.editorconfig b/.editorconfig new file mode 100644 index 0000000000000000000000000000000000000000..1ed453a371ba5c23ea9e365f9a6984d6aec0a13e --- /dev/null +++ b/.editorconfig @@ -0,0 +1,10 @@ +root = true + +[*] +end_of_line = lf +insert_final_newline = true + +[*.{js,json,yml}] +charset = utf-8 +indent_style = space +indent_size = 2 diff --git a/.gitattributes b/.gitattributes new file mode 100644 index 0000000000000000000000000000000000000000..af3ad128122dfe2a143df207c66884380fd888d4 --- /dev/null +++ b/.gitattributes @@ -0,0 +1,4 @@ +/.yarn/** linguist-vendored +/.yarn/releases/* binary +/.yarn/plugins/**/* binary +/.pnp.* binary linguist-generated diff --git a/.gitignore b/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..fa86b2945a0eaeada1816fb3d53fcda793403130 --- /dev/null +++ b/.gitignore @@ -0,0 +1,59 @@ +.yarn/* +!.yarn/patches +!.yarn/plugins +!.yarn/releases +!.yarn/sdks +!.yarn/versions + +# Swap the comments on the following lines if you don't wish to use zero-installs +# Documentation here: https://yarnpkg.com/features/zero-installs +# !.yarn/cache +.pnp.* +node_modules +.idea + +**/*.env + +# compiled output +node_modules/ +apps/*/node_modules +/dist +/apps/**/dist/ + +# Logs +/logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +logs/log.json + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +#Env files +**/*.env +!config/env/development.env +.idea diff --git a/README.md b/README.md index 1bdc5cab87c5631b216ee01fb1d70cdcec45109e..6375fe07e059c344167059b463477b8e415a4623 100644 --- a/README.md +++ b/README.md @@ -1 +1,9 @@ -Initial commit \ No newline at end of file +# ocm-engine version 1 + +#### Dependencies +Node 12 +Python 2.5.0 >= <3.0.0 + +### Installation + +yarn diff --git a/apps/attestation-manager/.dockerignore b/apps/attestation-manager/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..db6bf0bb299a1377dc57287e3aadba36447c80fb --- /dev/null +++ b/apps/attestation-manager/.dockerignore @@ -0,0 +1,22 @@ +Dockerfile +Jenkinsfile +coverage +docker-compose.yml +docs +node_modules +yarn-error.log +*.md +!README.md +.circle* +.codecov* +.coveralls* +.dockerignore +.drone* +.editorconfig +# .env +.git* +.huskyrc* +.lintstagedrc* +.npmignore +.prettierrc* +dist \ No newline at end of file diff --git a/apps/attestation-manager/.env.example b/apps/attestation-manager/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..669d3398a2db8460f434a74b35d1c8a70034b4e7 --- /dev/null +++ b/apps/attestation-manager/.env.example @@ -0,0 +1,11 @@ +PORT=3005 +DATABASE_URL=postgresql://root:password@localhost:5432/postgres?schema=attestation +ECSURL=http://localhost:9200/ +ACCEPT_MEMBERSHIP_CREDENTIALS_CONFIG = AUTO +NATS_URL=nats://localhost:4222 +AGENT_URL=http://localhost:3010 +TSA_URL=https://gaiax.vereign.com/tsa/policy/policy/example +USE_AUTH=false +OAUTH_CLIENT_ID=clientid +OAUTH_CLIENT_SECRET=clientsecret +OAUTH_TOKEN_URL=https://tokenurl \ No newline at end of file diff --git a/apps/attestation-manager/.eslintrc.js b/apps/attestation-manager/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..1d3be26ba9f605df5486ce040d8a15fb06ba2e8e --- /dev/null +++ b/apps/attestation-manager/.eslintrc.js @@ -0,0 +1,27 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'airbnb-base', + 'airbnb-typescript/base' + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + "@typescript-eslint/ban-ts-comment": "off", + "prefer-spread": "off" + }, +}; diff --git a/apps/attestation-manager/.prettierrc b/apps/attestation-manager/.prettierrc new file mode 100644 index 0000000000000000000000000000000000000000..dcb72794f5300a3e0ccd2ad0669d802b62f3d370 --- /dev/null +++ b/apps/attestation-manager/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/apps/attestation-manager/GDPR.md b/apps/attestation-manager/GDPR.md new file mode 100644 index 0000000000000000000000000000000000000000..e7e10f96fb1aaab81d9d075eb37f6a1a75ad8ada --- /dev/null +++ b/apps/attestation-manager/GDPR.md @@ -0,0 +1,32 @@ +# GDPR Compliance Document +The objective of this document is to detail, the data being stored and proccessed by the Organization Credential Manager's, Attestation Manger. + +## What information is stored +### Source User Information +The Open Id connect claims that MAY contain all sorts of personal data (like email, name, age and others), are received from any external source. + +### Technical User Information (Public) + +- Schema information (public) +- Credential/credential definition ids and states +- DID of issuer +- DID of holder +- Created/updated dates +- Offered credential attributes and attachments + +## How is the information stored +### Source User Information +Source User Information is encrypted using the Private Key of the Organizations SSI Agent and stored until the issuance of credential in Organization's SSI Agent's PostgreSQL database. + +### Technical User Information (Public) +Technical User Information is encrypted using the Private Key of the Organizations SSI Agent and stored internally (on the agent) on PostgreSQL and externally/ metadata (shared between the OCM services) on PostgreSQL of Organization. + +## Who can access the information +The Source User Information and Technical User Information both are accessible only by the Organization specific SSI agent's private key. + +## How long will the information stay +### Source User Information +The Source User Information is wiped out once the credential is issued. + +### Technical User Information (Public) +The Technical User Information is wiped out according to the retention periods (not defined yet). diff --git a/apps/attestation-manager/Gaia-x Attestation Manager API.postman_collection.json b/apps/attestation-manager/Gaia-x Attestation Manager API.postman_collection.json new file mode 100644 index 0000000000000000000000000000000000000000..d25f2ab84a4433b8be33c143a42895ba37feb491 --- /dev/null +++ b/apps/attestation-manager/Gaia-x Attestation Manager API.postman_collection.json @@ -0,0 +1,991 @@ +{ + "info": { + "_postman_id": "096d259a-3afa-45e2-b8fd-ce78cc1afaee", + "name": "Gaia-x Attestation Manager API", + "description": "API documentation for GAIA-X Attestation Manager", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "10250261" + }, + "item": [ + { + "name": "Fetch credential information by credential id", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credential-info/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credential-info", + ":id" + ], + "variable": [ + { + "key": "id" + } + ] + } + }, + "response": [] + }, + { + "name": "Send credential proposal to connection", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"connectionId\": \"<string>\",\n \"credentialDefinitionId\": \"<string>\",\n \"comment\": \"<string>\",\n \"credentialProposal\": {},\n \"autoAcceptCredential\": \"<string>\"\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/create-propose-credential", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "create-propose-credential" + ] + } + }, + "response": [] + }, + { + "name": "Send credential offer with credential values to connection", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"connectionId\": \"<string>\",\n \"credentialDefinitionId\": \"<string>\",\n \"comment\": \"<string>\",\n \"attributes\": [\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n },\n {\n \"name\": \"<string>\",\n \"value\": \"<string>\"\n }\n ],\n \"autoAcceptCredential\": \"<string>\"\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/create-offer-credential", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "create-offer-credential" + ] + } + }, + "response": [] + }, + { + "name": "Accept credential request by credential id", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{baseUrl}}/v1/accept-request/:credentialId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-request", + ":credentialId" + ], + "variable": [ + { + "key": "credentialId" + } + ] + } + }, + "response": [] + }, + { + "name": "Accept credential proposal by credential id", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{baseUrl}}/v1/accept-proposal/:credentialId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-proposal", + ":credentialId" + ], + "variable": [ + { + "key": "credentialId" + } + ] + } + }, + "response": [] + }, + { + "name": "Accept credential offer by credential id", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{baseUrl}}/v1/accept-offer/:credentialId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-offer", + ":credentialId" + ], + "variable": [ + { + "key": "credentialId" + } + ] + } + }, + "response": [] + }, + { + "name": "Accept credentials by credential id", + "request": { + "method": "POST", + "header": [], + "url": { + "raw": "{{baseUrl}}/v1/accept-credential/:credentialId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-credential", + ":credentialId" + ], + "variable": [ + { + "key": "credentialId" + } + ] + } + }, + "response": [] + }, + { + "name": "Fetch list of credential definition", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credentialDef", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credentialDef" + ] + } + }, + "response": [] + }, + { + "name": "Fetch credential definition by id", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credentialDef/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credentialDef", + ":id" + ], + "variable": [ + { + "key": "id", + "value": "<string>" + } + ] + } + }, + "response": [] + }, + { + "name": "Create new credential definition", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"schemaID\": \"<string>\",\n \"name\": \"<string>\",\n \"isRevokable\": \"<boolean>\",\n \"isAutoIssue\": \"<boolean>\",\n \"expiryHours\": \"<string>\",\n \"createdBy\": \"<string>\",\n \"type\": \"<string>\"\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/credentialDef", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credentialDef" + ] + } + }, + "response": [] + }, + { + "name": "Fetch list of credentials using pagination and queries", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credential?page=0&pageSize=10&isReceived&threadId&state&credDefId&createdDateStart&createdDateEnd&updatedDateStart&updatedDateEnd&expirationDateStart&expirationDateEnd&connectionId&principalDid", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credential" + ], + "query": [ + { + "key": "page", + "value": "0" + }, + { + "key": "pageSize", + "value": "10" + }, + { + "key": "isReceived", + "value": null + }, + { + "key": "threadId", + "value": null + }, + { + "key": "state", + "value": null + }, + { + "key": "credDefId", + "value": null + }, + { + "key": "createdDateStart", + "value": null + }, + { + "key": "createdDateEnd", + "value": null + }, + { + "key": "updatedDateStart", + "value": null + }, + { + "key": "updatedDateEnd", + "value": null + }, + { + "key": "expirationDateStart", + "value": null + }, + { + "key": "expirationDateEnd", + "value": null + }, + { + "key": "connectionId", + "value": null + }, + { + "key": "principalDid", + "value": null + } + ] + } + }, + "response": [ + { + "name": "Fetch list of credentials using pagination and queries", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credential?page=0&pageSize=10&isReceived&threadId&state&credDefId&createdDateStart&createdDateEnd&updatedDateStart&updatedDateEnd&expirationDateStart&expirationDateEnd&connectionId&principalDid", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credential" + ], + "query": [ + { + "key": "page", + "value": "0" + }, + { + "key": "pageSize", + "value": "10" + }, + { + "key": "isReceived", + "value": null + }, + { + "key": "threadId", + "value": null + }, + { + "key": "state", + "value": null + }, + { + "key": "credDefId", + "value": null + }, + { + "key": "createdDateStart", + "value": null + }, + { + "key": "createdDateEnd", + "value": null + }, + { + "key": "updatedDateStart", + "value": null + }, + { + "key": "updatedDateEnd", + "value": null + }, + { + "key": "expirationDateStart", + "value": null + }, + { + "key": "expirationDateEnd", + "value": null + }, + { + "key": "connectionId", + "value": null + }, + { + "key": "principalDid", + "value": null + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 05:58:26 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "4576" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"11e0-n29HDRxi/1rhzktri7nD+uBh93Y\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Credential fetch successfully\",\n \"data\": {\n \"count\": 87,\n \"records\": [\n {\n \"id\": \"01b3d49c-1d51-4070-924d-9424ea239a93\",\n \"credentialId\": \"f4472554-ee2e-4262-bfc6-0ed268c8be31\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:48687:Automation_CredDef_001\",\n \"threadId\": \"cdb2ce40-970d-4bb2-9d8b-a4aa5e517226\",\n \"state\": \"done\",\n \"principalDid\": \"CuZ94QvJCHihuCBCzRULoc\",\n \"connectionId\": \"2ded97e4-0c8e-470a-8e53-481e24e50db7\",\n \"createdDate\": \"2023-05-15T13:10:52.070Z\",\n \"updatedDate\": \"2023-05-15T13:13:10.164Z\",\n \"expirationDate\": \"2023-05-16T13:10:52.068Z\"\n },\n {\n \"id\": \"0306d10d-1b8f-471a-98c2-86edfe24e1dd\",\n \"credentialId\": \"c1b80b87-e044-4056-87ed-f53b50480015\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:46833:OCM1-passport\",\n \"threadId\": \"52d63479-a20e-47e3-9e5b-43b06998566d\",\n \"state\": \"offer-sent\",\n \"principalDid\": \"FyydY9n2QZyuskXGm73kH8\",\n \"connectionId\": \"f468aeaa-6482-44af-b3d5-eb67aed0a2bd\",\n \"createdDate\": \"2023-05-09T12:52:55.259Z\",\n \"updatedDate\": \"2023-05-09T12:52:55.259Z\",\n \"expirationDate\": null\n },\n {\n \"id\": \"0b444def-2419-4635-97a5-46b8a2a93a8c\",\n \"credentialId\": \"2b7f4387-3361-4bc5-b4f8-0a6a3fb7b05a\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:48362:Enrollment_credDef-222222322211\",\n \"threadId\": \"84336905-fbdb-4405-be94-24f0bb3143d8\",\n \"state\": \"done\",\n \"principalDid\": \"9M5aDzwUzeiq3sSwBD5mPC\",\n \"connectionId\": \"4a1b0ed2-d7ce-4629-9d91-03247f0015ca\",\n \"createdDate\": \"2023-05-09T14:06:00.663Z\",\n \"updatedDate\": \"2023-05-09T14:09:38.440Z\",\n \"expirationDate\": \"2023-05-10T14:06:00.661Z\"\n },\n {\n \"id\": \"0be85272-0802-48c4-a155-787534b050c7\",\n \"credentialId\": \"85ec488c-2f23-4544-885e-3f0e9a4f3e63\",\n \"credDefId\": \"48f6D93QZPA127oknMazWy:3:CL:41034:test2-credDef\",\n \"threadId\": \"edbdddc1-1a49-4d3e-aa47-bfbdca65aedf\",\n \"state\": \"offer-sent\",\n \"principalDid\": \"LpN6wLLjfm5p1tqUo8Nf3w\",\n \"connectionId\": \"d45614da-c174-4399-bf27-3cf01928fe3a\",\n \"createdDate\": \"2023-03-27T12:10:22.645Z\",\n \"updatedDate\": \"2023-03-27T12:10:22.645Z\",\n \"expirationDate\": \"2023-03-28T11:10:22.642Z\"\n },\n {\n \"id\": \"13424638-ce33-4c77-9375-7b24e2d55e10\",\n \"credentialId\": \"4fea6609-cb4f-478b-9c30-a1ef09453dd1\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:50014:LoginCredentials2\",\n \"threadId\": \"eeb6a119-68bd-40bf-b454-69cd0dd6c13d\",\n \"state\": \"done\",\n \"principalDid\": \"7tziR5BbxSbqJbrtDC7ZJw\",\n \"connectionId\": \"9d6b7000-5f5a-49cd-91e7-6aff9ef73f83\",\n \"createdDate\": \"2023-05-22T11:23:47.206Z\",\n \"updatedDate\": \"2023-05-22T11:24:05.454Z\",\n \"expirationDate\": null\n },\n {\n \"id\": \"14b85bde-d2f4-4e1a-a49c-b7f51e0b9d68\",\n \"credentialId\": \"7dbd2d9d-b285-4c8d-a8c0-c982dbb76194\",\n \"credDefId\": \"48f6D93QZPA127oknMazWy:3:CL:41034:test2-credDef\",\n \"threadId\": \"34c43f2b-5223-42ac-8d6b-d6aa3508b30e\",\n \"state\": \"offer-sent\",\n \"principalDid\": \"LpN6wLLjfm5p1tqUo8Nf3w\",\n \"connectionId\": \"d45614da-c174-4399-bf27-3cf01928fe3a\",\n \"createdDate\": \"2023-03-27T11:43:12.367Z\",\n \"updatedDate\": \"2023-03-27T11:43:12.367Z\",\n \"expirationDate\": \"2023-03-28T10:43:12.364Z\"\n },\n {\n \"id\": \"15281264-9b75-457b-babf-ea453ef742df\",\n \"credentialId\": \"c597ebb2-9dea-4a75-9616-1cf577818699\",\n \"credDefId\": \"48f6D93QZPA127oknMazWy:3:CL:42130:Driver Licence\",\n \"threadId\": \"48866e07-61b7-4036-9aeb-b4048edb1f5c\",\n \"state\": \"done\",\n \"principalDid\": \"AZGMhjPLkTHmHrwbaVCg8S\",\n \"connectionId\": \"1e55ac60-ce30-4887-b51b-ce581ab020c0\",\n \"createdDate\": \"2023-03-22T07:44:10.338Z\",\n \"updatedDate\": \"2023-03-22T07:45:48.314Z\",\n \"expirationDate\": null\n },\n {\n \"id\": \"17713cae-bbb5-4347-ab56-bb0abd11d4e3\",\n \"credentialId\": \"404433ba-bf23-4a1b-91b9-4c2e0b550811\",\n \"credDefId\": \"PFoX6wEKUmUrciXad7gyxQ:3:CL:46833:SSI-prod-passport1\",\n \"threadId\": \"3ad48da9-536d-4a70-b519-4a96328fff68\",\n \"state\": \"credential-received\",\n \"principalDid\": \"FyydY9n2QZyuskXGm73kH8\",\n \"connectionId\": \"f468aeaa-6482-44af-b3d5-eb67aed0a2bd\",\n \"createdDate\": \"2023-05-09T13:21:04.464Z\",\n \"updatedDate\": \"2023-05-09T13:21:59.765Z\",\n \"expirationDate\": null\n },\n {\n \"id\": \"17fe1bd6-1fb8-441d-bab7-da0c065feade\",\n \"credentialId\": \"fb713703-4dbb-4046-92a9-38275dfdc3c3\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:48710:Automation_CredDef_001\",\n \"threadId\": \"92d75b0f-658a-4a15-ad8d-464e1bc9ed56\",\n \"state\": \"done\",\n \"principalDid\": \"CuZ94QvJCHihuCBCzRULoc\",\n \"connectionId\": \"2ded97e4-0c8e-470a-8e53-481e24e50db7\",\n \"createdDate\": \"2023-05-15T13:10:49.447Z\",\n \"updatedDate\": \"2023-05-15T13:14:28.548Z\",\n \"expirationDate\": \"2023-05-16T13:10:49.445Z\"\n },\n {\n \"id\": \"1879df35-ccaf-444a-b953-10339531582a\",\n \"credentialId\": \"9a5a8b7b-f1d7-45a3-a5f4-af78d0b450f3\",\n \"credDefId\": \"2ZDQuDB9Ww23qnesQLw9aq:3:CL:43799:Enrollment_credDef-22222322211\",\n \"threadId\": \"4ab8c6a6-7183-41db-bc5c-75d31c5c3753\",\n \"state\": \"offer-sent\",\n \"principalDid\": \"9aRgDXK7SXJVKpbp91yAmr\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"createdDate\": \"2023-04-05T08:47:48.281Z\",\n \"updatedDate\": \"2023-04-05T08:47:48.281Z\",\n \"expirationDate\": \"2023-04-06T08:47:48.277Z\"\n }\n ]\n }\n}" + } + ] + }, + { + "name": "Fetch credential by credential id", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credential/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credential", + ":id" + ], + "variable": [ + { + "key": "id", + "value": "f4472554-ee2e-4262-bfc6-0ed268c8be31" + } + ] + } + }, + "response": [ + { + "name": "Fetch credential by credential id", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credential/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credential", + ":id" + ], + "variable": [ + { + "key": "id", + "value": "f4472554-ee2e-4262-bfc6-0ed268c8be31" + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 05:58:44 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "525" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"20d-E/63SLfeyJlcwG1mLsRAN1dAc50\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Credential fetched successfully\",\n \"data\": {\n \"id\": \"01b3d49c-1d51-4070-924d-9424ea239a93\",\n \"credentialId\": \"f4472554-ee2e-4262-bfc6-0ed268c8be31\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:48687:Automation_CredDef_001\",\n \"threadId\": \"cdb2ce40-970d-4bb2-9d8b-a4aa5e517226\",\n \"state\": \"done\",\n \"principalDid\": \"CuZ94QvJCHihuCBCzRULoc\",\n \"connectionId\": \"2ded97e4-0c8e-470a-8e53-481e24e50db7\",\n \"createdDate\": \"2023-05-15T13:10:52.070Z\",\n \"updatedDate\": \"2023-05-15T13:13:10.164Z\",\n \"expirationDate\": \"2023-05-16T13:10:52.068Z\"\n }\n}" + } + ] + }, + { + "name": "Create new CredentialType", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"type\": \"<string>\",\n \"schemaId\": \"<string>\"\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/credentialType", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credentialType" + ] + } + }, + "response": [] + }, + { + "name": "Fetch CredentialType (schemaId amd its attributes) by type", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/credentialType", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "credentialType" + ] + } + }, + "response": [] + }, + { + "name": "Delete credential (request/offer/proposal) by credential id", + "request": { + "method": "DELETE", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/delete-credential/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "delete-credential", + ":id" + ], + "variable": [ + { + "key": "id" + } + ] + } + }, + "response": [] + }, + { + "name": "Health check", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/health", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "health" + ] + } + }, + "response": [ + { + "name": "Health check", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/health", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "health" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 05:54:20 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "93" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"5d-n7tsAF97fIhtcEb5uvvhp8pNSHg\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Fri Jun 02 2023 05:54:20 GMT+0000 (Coordinated Universal Time)\"\n}" + } + ] + }, + { + "name": "Fetch list of Schemas with pagination", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/schemas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "schemas" + ] + } + }, + "response": [] + }, + { + "name": "Create new schema", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"name\": \"<string>\",\n \"createdBy\": \"<string>\",\n \"version\": \"<string>\",\n \"attributes\": [\n \"<string>\",\n \"<string>\"\n ],\n \"type\": \"<string>\"\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/schemas", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "schemas" + ] + } + }, + "response": [] + }, + { + "name": "Fetch list of dids for schema id", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/schemas/get-dids-for-schema/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "schemas", + "get-dids-for-schema", + ":id" + ], + "variable": [ + { + "key": "id", + "value": "<string>" + } + ] + } + }, + "response": [] + }, + { + "name": "Fetch list of Schemas by schema id", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/schemas/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "schemas", + ":id" + ], + "variable": [ + { + "key": "id", + "value": "<string>" + } + ] + } + }, + "response": [] + }, + { + "name": "Update schemaId in CredentialsType", + "request": { + "method": "PATCH", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"schemaId\": \"<string>\"\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/updateSchemaIdByType", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "updateSchemaIdByType" + ] + } + }, + "response": [] + }, + { + "name": "Add user information associated with connection id", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"connectionId\": \"<string>\",\n \"autoAcceptCredential\": \"<string>\",\n \"userInfo\": {}\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/userInfo", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "userInfo" + ] + } + }, + "response": [] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "https://ssi-dev.vereign.com/ocm/attestation" + } + ] +} \ No newline at end of file diff --git a/apps/attestation-manager/LICENSE b/apps/attestation-manager/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..6bc596c6d9ae158f03739f543ee9d26c4fb5e8d6 --- /dev/null +++ b/apps/attestation-manager/LICENSE @@ -0,0 +1,636 @@ +GAIA-X "Attestation Manager" + +is the microservice which is responsible for handling the features +related to issuance of credentials of the GAIA-X project. It handles REST +endpoints for Schemas, Credential Definitions and Verifiable Credentials. + +Copyright 2022 Vereign AG + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Attestation Manager incorporates + +"elastic/ecs-winston-format", + +a Node.js package to provide a formatter for the winston logger compatible +with Elastic Common Schema (ECS) logging, which is covered by the following copyright +and permission notice: + +Copyright 2020 Elastic and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Attestation Manager also incorporates + +"nestjs", + +a progressive Node.js framework for building efficient and scalable server-side applications, +which is covered by the following copyright and permission notice: + +Copyright (c) 2017-2022 Kamil Mysliwiec <https://kamilmysliwiec.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"nestjs/terminus" + +, integrated healthchecks for Nest, which contains the +following copyright and permission notice: + +Copyright (c) 2018-2021 Livio Brunner, Kamil Myśliwiec + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"prisma client" + +,an auto-generated query builder that enables type-safe database access and reduces +boilerplate, which is covered by the following copyright and permission notice: + +Copyright 2019 Johannes Schickling + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Attestation Manager also incorporates + +"types/node" + +,type definitions for Node, which is covered by the following copyright and +permission notice: + +Copyright Microsoft TypeScript, DefinitelyTyped, Alberto Schiabel, +Alvis HT Tang, Andrew Makarov, Benjamin Toueg, Chigozirim C., David Junger, Deividas Bakanas, Eugene Y. Q. Shen, +Hannes Magnusson, Huw, Kelvin Jin, Klaus Meinhardt, Lishude, Mariusz Wiktorczyk, Mohsen Azimi, Nicolas Even, +Nikita Galkin, Parambir Singh, Sebastian Silbermann, Simon Schick, Thomas den Hollander, Wilco Bakker, wwwy3y3, +Samuel Ainsworth, Kyle Uehlein, Thanik Bhongbhibhat, Marcin Kopacz, Trivikram Kamat, Junxiao Shi, Ilia Baryshnikov, +ExE Boss, Piotr Błażejewicz, Anna Henningsen, Victor Perin, Yongsheng Zhang, NodeJS Contributors, +Linus Unnebäck, wafuwafu13, and Matteo Collina. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"types/express" + +,type definitions for Express (http://expressjs.com), which is covered by the following +copyright and permission notice: + +Copyright Boris Yankov, China Medical University Hospital, Puneet Arora, and Dylan Frankland. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"types/jest" + +type definitions for Jest, which is covered by the following copyright and permission notice: + +Copyright Asana (https://asana.com)// Ivo Stratev, jwbay, Alexey Svetliakov, Alex Jover Morales, Allan Lukwago, +Ika, Waseem Dahman, Jamie Mason, Douglas Duteil, Ahn, Jeff Lau, Andrew Makarov, Martin Hochel, Sebastian Sebald, +Andy, Antoine Brault, Gregor Stamać, ExE Boss, Alex Bolenok, Mario Beltrán Alarcón, Tony Hallett, Jason Yu, Pawel Fajfer, +Regev Brody, Alexandre Germain, and Adam Jones. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"class-validator" + +, a tool to allow decorator and non-decorator based validation, + +and + +"class-transformer" + +,a tool to transform plain object to some instance of class and versa, also to serialize / +deserialize object based on criteria, both of which are covered by the following copyright +and permission notice: + +Copyright 2015-2020 TypeStack + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"express" + +,a fast, unopinionated, minimalist web framework for node, which is covered by the following copyright +and permission notice: + +Copyright (c) 2009-2014 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2013-2014 Roman Shtylman <shtylman+expressjs@gmail.com> +Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"husky" + +, modern native Git hooks made easy, which is covered by the following copyright and +permission notice: + +Copyright (c) 2021 typicode + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in all +copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE +SOFTWARE. + + +This Attestation Manager also incorporates + +"joi" + +, the most powerful schema description language and data validator for JavaScript, which is +covered by the following copyright and permission notice: + +Copyright (c) 2012-2020, Sideway. Inc, and project contributors. +Copyright (c) 2012-2014, Walmart. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. +- The names of any contributors may not be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +This Attestation Manager also incorporates + +"liquibase" + +, liquibase is an open-source database-independent library for tracking, managing and applying database schema change, which is covered +by the following copyright and permission notice: + +Copyright (c) Taylor Buckner <taylora.buckner@gmail.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +This Attestation Manager also incorporates + +"moment" + +, a JavaScript date library for parsing, validating, manipulating, and formatting dates, +which is covered by the following copyright and permission notice: + +Copyright (c) JS Foundation and other contributors + +(The MIT License) +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"nats" + +, a Node.js client for the NATS messaging system, which is covered by +the following copyright and permission notice: + +Copyright 2013-2018 The NATS Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Attestation Manager also incorporates + +"pg - node postgres" + +, non-blocking PostgreSQL client for Node.js, which is covered by +the following copyright and permission notice: + +Copyright (c) 2010-2020 Brian Carlson (brian.m.carlson@gmail.com) + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Attestation Manager also incorporates + +"prisma" + +, next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server, +SQLite, MongoDB and CockroachDB, which is covered by the following copyright and +permission notice: + +Copyright 2019 Johannes Schickling + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Attestation Manager also incorporates + +"reflect-metadata" + +, prototype for a Metadata Reflection API for ECMAScript, which is covered +by the following copyright and permission notice: + +Copyright 2019 Ron Buckton + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Attestation Manager also incorporates + +"rimraf" + +, a `rm -rf` util for nodejs, which is covered by the following copyright +and permission notice: + +Copyright (c) 2011-2022 Isaac Z. Schlueter and Contributors + +(The ISC License) +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +This Attestation Manager also incorporates + +"rxjs" + +, reactive extensions for JavaScript, which is covered by the following copyright +and permission notice: + +Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Attestation Manager also incorporates + +"Swagger UI Express" + +, allows to serve auto-generated swagger-ui generated API docs from express, +based on a swagger.json file, which is covered by the following copyright and +permission notice: + +Copyright (c) 2018 Scott IT London + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +This Attestation Manager also incorporates + +"winston" + +, a logger for just about everything, which is covered by the following copyright and +permission notice: + +Copyright (c) 2010 Charlie Robbins + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +This Attestation Manager also incorporates + +"winston-elasticsearch" + +, an elasticsearch transport for winston, which is covered by the following copyright and +permission notice: + +Copyright (c) 2015 - 2018 Thomas Hoppe. +Copyright (c) 2013 Jacques-Olivier D. Bernier. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/apps/attestation-manager/README.md b/apps/attestation-manager/README.md new file mode 100644 index 0000000000000000000000000000000000000000..28ae6e81478f6c88e6ae588b1e5525c5d665bb2e --- /dev/null +++ b/apps/attestation-manager/README.md @@ -0,0 +1,122 @@ +# OCM Attestation Manager + +## Description +<hr/> + +The Attestation Manager is the microservice responsible for handling the features related to Issuance of Credentials. It handles REST endpoints for Schemas, Credential Definitions and Verifiable Credentials. + +## Usage +<hr/> + +### Swagger Documentation: + +[Swagger/OpenAPI](swagger.json) + +## Installation +<hr/> + +### Pre-requisite + +* yarn +* docker +* docker-compose +* PostgreSQL + +### OCM Services Dependencies + +* SSI Abstraction +* Connection Manager + +## Running the app + +**Each service in the Organizational Credential Manager can be run from the infrastructure repository with Docker.** + +**The .env files are in the infrastructure repository under /env** + +```bash + ## production in: + ./deployment/ci + ## development in: + ./deployment/dev +``` + +* (optional) Edit docker-compose.yml in "infrastructure" to use either **/ci/** or **/dev/** Dockerfiles. + +* Run while in **"infrastructure"** project: +```bash +$ docker-compose up --build attestation-m +``` +to run only Attestation Manager or +```bash +$ docker-compose up --build +``` +to run all the services. + +## Build +``` +yarn build +``` + +## Run +``` +yarn start +``` + +### Environment Variables Required +``` +1. PORT +2. DATABASE_URL +3. ECSURL +4. NATS_URL +5. AGENT_URL +``` + +### Outgoing communication services +``` +1. SSI Abstraction +``` + +### Incomming communication services +``` +1. Principal Manager +``` + +### Features supported +``` +1. Create Schema +2. Create Credential Definition +3. Offer Credentials +4. Propose Credentials +5. Accept Credential +``` + + +## Test +<hr/> + +```bash +# unit tests +$ npm run test + +# e2e tests +$ npm run test:e2e + +# test coverage +$ npm run test:cov +``` + + +## GDPR +<hr/> + +[GDPR](GDPR.md) + +## Dependencies +<hr/> + +[Dependencies](package.json) + +## License +<hr/> + +[Apache 2.0 license](LICENSE) diff --git a/apps/attestation-manager/config/config.ts b/apps/attestation-manager/config/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..bd708761c4f016f42c150dc47179cd0734492a41 --- /dev/null +++ b/apps/attestation-manager/config/config.ts @@ -0,0 +1,26 @@ +const config = () => ({ + PORT: Number(process.env.PORT), + nats: { + url: process.env.NATS_URL, + }, + auth: { + useAuth: process.env.USE_AUTH || 'false', + clientId: process.env.OAUTH_CLIENT_ID, + clientSecret: process.env.OAUTH_CLIENT_SECRET, + tokenUrl: process.env.OAUTH_TOKEN_URL, + }, + agent: { + AGENT_URL: process.env.AGENT_URL, + }, + DATABASE: { + type: 'postgres', + port: 5432, + synchronize: false, + logging: false, + entities: [`${__dirname}/../**/**.model{.ts,.js}`], + }, + ECSURL: process.env.ECSURL, + ACCEPT_MEMBERSHIP_CREDENTIALS_CONFIG: process.env.ACCEPT_MEMBERSHIP_CREDENTIALS_CONFIG, + TSA_URL: process.env.TSA_URL, +}); +export default config; diff --git a/apps/attestation-manager/config/validation.ts b/apps/attestation-manager/config/validation.ts new file mode 100644 index 0000000000000000000000000000000000000000..323486bad55684b10f17bed7617e2d27d6b76c1b --- /dev/null +++ b/apps/attestation-manager/config/validation.ts @@ -0,0 +1,15 @@ +import * as Joi from 'joi'; + +const validationSchema = Joi.object({ + DATABASE_URL: Joi.string().required(), + AGENT_URL: Joi.string().required(), + NATS_URL: Joi.string().required(), + PORT: Joi.number().required(), + ACCEPT_MEMBERSHIP_CREDENTIALS_CONFIG: Joi.string().required(), + USE_AUTH: Joi.string(), + OAUTH_CLIENT_ID: Joi.string(), + OAUTH_CLIENT_SECRET: Joi.string(), + OAUTH_TOKEN_URL: Joi.string(), +}); + +export default validationSchema; diff --git a/apps/attestation-manager/deployment/ci/Dockerfile b/apps/attestation-manager/deployment/ci/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..1d35b554573fa81dedd46b3519bbb05c72166212 --- /dev/null +++ b/apps/attestation-manager/deployment/ci/Dockerfile @@ -0,0 +1,47 @@ +FROM node:20-alpine3.16 AS builder + +WORKDIR /usr/src/app + +RUN yarn global add @nestjs/cli + +COPY package.json ./ +COPY yarn.lock ./ + +# --prod works if @types/node is in deps (not devDeps) +RUN yarn --frozen-lockfile --prod + +COPY . . + +RUN yarn prisma:generate + +RUN yarn build + +FROM node:14-alpine3.15 + +ENV PATH /usr/src/app/node_modules/.bin:$PATH + +WORKDIR /usr/src/app + + +COPY --from=builder /usr/src/app/dist ./dist +COPY --from=builder /usr/src/app/start.sh ./start.sh +COPY --from=builder /usr/src/app/node_modules ./node_modules +COPY --from=builder /usr/src/app/src/prisma prisma + +EXPOSE 3005 + +RUN chmod +x ./start.sh + +CMD ["./start.sh"] + + + + + + + + + + + + diff --git a/apps/attestation-manager/deployment/dev/Dockerfile b/apps/attestation-manager/deployment/dev/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..d36e8aeae59591b96304ce299406ea62e319f520 --- /dev/null +++ b/apps/attestation-manager/deployment/dev/Dockerfile @@ -0,0 +1,18 @@ +FROM node:14-alpine3.15 + +WORKDIR /usr/src/app + +ENV PATH /usr/src/app/node_modules/.bin:$PATH + +COPY package.json ./ +COPY yarn.lock ./ + +COPY . . + +RUN yarn + +RUN yarn prisma:generate + +EXPOSE 3005 + +CMD ["yarn", "start:docker"] diff --git a/apps/attestation-manager/nest-cli.json b/apps/attestation-manager/nest-cli.json new file mode 100644 index 0000000000000000000000000000000000000000..56167b36a14c2c69eb0db57302e2c44a1128b006 --- /dev/null +++ b/apps/attestation-manager/nest-cli.json @@ -0,0 +1,4 @@ +{ + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/apps/attestation-manager/package.json b/apps/attestation-manager/package.json new file mode 100644 index 0000000000000000000000000000000000000000..76d148381466b501cce2184d7837387b2ed9f8e0 --- /dev/null +++ b/apps/attestation-manager/package.json @@ -0,0 +1,124 @@ +{ + "name": "attestation-manager", + "version": "0.0.1", + "description": "", + "author": "Shirdhar", + "private": true, + "license": "Apache-2.0", + "scripts": { + "clean": "rm -r dist", + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "dbSchema": "npx prisma db push --schema=./src/prisma/schema.prisma", + "prisma:generate": "prisma generate --schema=./src/prisma/schema.prisma", + "prisma:migrate": "npx prisma migrate deploy --schema=./src/prisma/schema.prisma", + "prismaStudio": "npx prisma studio", + "start": "nest start", + "start:docker": "yarn prisma:generate && yarn dbSchema && yarn start", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@elastic/ecs-winston-format": "^1.3.1", + "@nestjs/axios": "0.0.5", + "@nestjs/common": "^8.0.0", + "@nestjs/config": "^1.1.6", + "@nestjs/core": "^8.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/microservices": "^8.2.6", + "@nestjs/platform-express": "^8.0.0", + "@nestjs/swagger": "^5.2.0", + "@nestjs/terminus": "^8.0.4", + "@prisma/client": "^3.9.2", + "@types/express": "^4.17.13", + "@types/jest": "27.0.2", + "@types/jsonwebtoken": "^8.5.9", + "@types/node": "^16.0.0", + "class-transformer": "^0.5.1", + "class-validator": "^0.13.2", + "express": "^4.17.3", + "husky": "^7.0.4", + "joi": "^17.6.0", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "^3.0.0", + "liquibase": "^4.4.0", + "moment": "^2.29.1", + "nats": "^2.6.0", + "pg": "^8.7.3", + "prisma": "^3.9.2", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.2.0", + "swagger-ui-express": "^4.3.0", + "winston": "^3.6.0", + "winston-elasticsearch": "^0.16.1" + }, + "devDependencies": { + "@nestjs/cli": "^8.0.0", + "@nestjs/schematics": "^8.0.0", + "@nestjs/testing": "^8.0.0", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "dotenv-cli": "^4.1.1", + "eslint": "^8.0.1", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-prettier": "^4.0.0", + "jest": "^27.2.5", + "node-mocks-http": "^1.11.0", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "^27.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "^3.10.1", + "typescript": "^4.3.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "setupFiles": [ + "<rootDir>/../setup.js" + ], + "coveragePathIgnorePatterns": [ + "<rootDir>/main", + "<rootDir>/client/", + "<rootDir>/common/" + ], + "moduleNameMapper": { + "^@config/(.*)$": [ + "<rootDir>/../config/$1" + ], + "^@credentialDef/(.*)$": "<rootDir>/credentialDef/$1", + "^@issueCredential/(.*)$": "<rootDir>/issue-credential/$1", + "^@schemas/(.*)$": "<rootDir>/schemas/$1", + "^@userInfo/(.*)$": "<rootDir>/userInfo/$1", + "^@src/(.*)$": "<rootDir>/$1", + "^@DB/(.*)$": "<rootDir>/prisma/$1", + "^@common/(.*)$": "<rootDir>/common/$1", + "^@utils/(.*)$": "<rootDir>/utils/$1", + "^@health/(.*)$": "<rootDir>/health/$1" + }, + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/apps/attestation-manager/setup.js b/apps/attestation-manager/setup.js new file mode 100644 index 0000000000000000000000000000000000000000..d4516a8eb8a7566d5666d49144c3317ff919f9d1 --- /dev/null +++ b/apps/attestation-manager/setup.js @@ -0,0 +1,2 @@ +process.env.PORT=3005 +process.env.NODE_ENV='development' \ No newline at end of file diff --git a/apps/attestation-manager/src/app.module.ts b/apps/attestation-manager/src/app.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..f117f1901ae263c1f422120be346071d282e50aa --- /dev/null +++ b/apps/attestation-manager/src/app.module.ts @@ -0,0 +1,53 @@ +import { APP_FILTER } from '@nestjs/core'; +import { + MiddlewareConsumer, + Module, + NestModule, + RequestMethod, +} from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TerminusModule } from '@nestjs/terminus'; +import config from '@config/config'; +import validationSchema from '@config/validation'; +import HealthController from '@src/health/health.controller'; +import ExceptionHandler from '@src/common/exception.handler'; +import SchemasModule from '@src/schemas/module'; +import CredentialDefModule from '@src/credentialDef/module'; +import UserInfoModule from '@userInfo/module'; +import AttestationModule from './issue-credential/module'; +import { AuthMiddleware } from './middleware/auth.middleware'; + +@Module({ + imports: [ + TerminusModule, + ConfigModule.forRoot({ + isGlobal: true, + load: [config], + validationSchema, + }), + SchemasModule, + AttestationModule, + CredentialDefModule, + UserInfoModule, + ], + controllers: [HealthController], + providers: [ + { + provide: APP_FILTER, + useClass: ExceptionHandler, + }, + ], +}) +export default class AppModule implements NestModule { + // eslint-disable-next-line class-methods-use-this + configure(consumer: MiddlewareConsumer) { + // eslint-disable-line + consumer + .apply(AuthMiddleware) + .exclude({ + path: 'v1/health', + method: RequestMethod.GET, + }) + .forRoutes('*'); + } +} diff --git a/apps/attestation-manager/src/client/nats.client.ts b/apps/attestation-manager/src/client/nats.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..e2189c89cd8e2e495c7bf6f3f3f6e6e75991af30 --- /dev/null +++ b/apps/attestation-manager/src/client/nats.client.ts @@ -0,0 +1,35 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { lastValueFrom } from 'rxjs'; +import { Connection, NATSServices } from '@common/constants'; + +@Injectable() +export default class NatsClientService { + constructor( + @Inject(NATSServices.SERVICE_NAME) private natsClient: ClientProxy, + ) {} + + getConnectionById(connectionId: string) { + const pattern = { + endpoint: `${Connection.NATS_ENDPOINT}/${Connection.GET_CONNECTION_BY_ID}`, + }; + const payload = { connectionId }; + return lastValueFrom(this.natsClient.send(pattern, payload)); + } + + connectionTrusted(connectionId: string) { + const pattern = { + endpoint: `${Connection.NATS_ENDPOINT}/${Connection.MAKE_CONNECTION_TRUSTED}`, + }; + const payload = { connectionId }; + return lastValueFrom(this.natsClient.send(pattern, payload)); + } + + getReceivedConnections() { + const pattern = { + endpoint: `${Connection.NATS_ENDPOINT}/${Connection.GET_RECEIVED_CONNECTIONS}`, + }; + const payload = {}; + return lastValueFrom(this.natsClient.send(pattern, payload)); + } +} diff --git a/apps/attestation-manager/src/client/rest.client.ts b/apps/attestation-manager/src/client/rest.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..a31574143daf2365741d318341b99ffc3c0b9bde --- /dev/null +++ b/apps/attestation-manager/src/client/rest.client.ts @@ -0,0 +1,28 @@ +import { Injectable } from '@nestjs/common'; +import { lastValueFrom, map } from 'rxjs'; +import { HttpService } from '@nestjs/axios'; + +@Injectable() +export default class RestClientService { + constructor(private readonly httpService: HttpService) {} + + async delete(url: string) { + return lastValueFrom( + this.httpService.delete(url).pipe(map((response) => response.data)), + ); + } + + async post(url: string, payload: object) { + return lastValueFrom( + this.httpService + .post(url, payload) + .pipe(map((response) => response.data)), + ); + } + + async get(url: string) { + return lastValueFrom( + this.httpService.get(url).pipe(map((response) => response.data)), + ); + } +} diff --git a/apps/attestation-manager/src/client/tests/__mocks__/nats.client.ts b/apps/attestation-manager/src/client/tests/__mocks__/nats.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..2c172e125955a53821167a20d2467e5438b4cab6 --- /dev/null +++ b/apps/attestation-manager/src/client/tests/__mocks__/nats.client.ts @@ -0,0 +1,11 @@ +import { + natsAgentResponse, + natsConnectionResponse, +} from '../stubs/nats-response'; + +const NatsClientServiceMock = jest.fn().mockReturnValue({ + getAgentByParticipantId: jest.fn().mockReturnValue(natsAgentResponse), + getConnectionById: jest.fn().mockReturnValue(natsConnectionResponse), +}); + +export default NatsClientServiceMock; diff --git a/apps/attestation-manager/src/client/tests/__mocks__/rest.client.ts b/apps/attestation-manager/src/client/tests/__mocks__/rest.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..3244e2f31b5e2cbbf4858c1e82d85d85c5a9e8f6 --- /dev/null +++ b/apps/attestation-manager/src/client/tests/__mocks__/rest.client.ts @@ -0,0 +1,14 @@ +import schemaAgentDto from '@src/schemas/tests/stubs/schema-from-agent-dto'; + +const RestClientServiceMock = jest.fn().mockReturnValue({ + post: jest.fn().mockReturnValue({ agent: 'response' }), + get: jest.fn().mockImplementation((url: string) => { + if (url.includes('schemas')) { + return schemaAgentDto; + } + + return {}; + }), +}); + +export default RestClientServiceMock; diff --git a/apps/attestation-manager/src/client/tests/__mocks__/tsa.client.ts b/apps/attestation-manager/src/client/tests/__mocks__/tsa.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..b2ceaf94690b2a078db3d08689e55d2b643219f6 --- /dev/null +++ b/apps/attestation-manager/src/client/tests/__mocks__/tsa.client.ts @@ -0,0 +1,17 @@ +import { PolicyReturnType } from '@src/client/tsa.client'; +import { TSAService } from '@src/common/constants'; + +const TSAClientServiceMock = jest.fn().mockReturnValue({ + getPolicy: jest.fn().mockImplementation((url: string) => { + if (url.includes(TSAService.PRINCIPAL_CREDENTIAL_REQUEST)) { + return { + success: true, + returnData: true, + } as PolicyReturnType; + } + + return {}; + }), +}); + +export default TSAClientServiceMock; diff --git a/apps/attestation-manager/src/client/tests/rest.client.spec.ts b/apps/attestation-manager/src/client/tests/rest.client.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b7984fe1cd7574d10cded265c229aca273b618cc --- /dev/null +++ b/apps/attestation-manager/src/client/tests/rest.client.spec.ts @@ -0,0 +1,42 @@ +import { HttpModule, HttpService } from '@nestjs/axios'; +import { Test, TestingModule } from '@nestjs/testing'; +import HttpServiceMock from '@src/tests/__mocks__/http-service'; +import RestClientService from '../rest.client'; + +describe('RestClientService', () => { + let restClient: RestClientService; + + const HttpServiceProvider = { + provide: HttpService, + useFactory: HttpServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [HttpModule], + providers: [RestClientService, HttpServiceProvider], + }).compile(); + + restClient = module.get<RestClientService>(RestClientService); + }); + + it('should be defined', () => { + expect(restClient).toBeDefined(); + }); + + describe('post()', () => { + let restClientResponse: any; + + beforeEach(async () => { + restClientResponse = await restClient.post('test_url', {}); + }); + + it('should call post() from HttpService', async () => { + expect(HttpServiceMock().post).toHaveBeenCalled(); + }); + + it('should retrieve response', async () => { + expect(restClientResponse).not.toBe(null); + }); + }); +}); diff --git a/apps/attestation-manager/src/client/tests/stubs/nats-response.ts b/apps/attestation-manager/src/client/tests/stubs/nats-response.ts new file mode 100644 index 0000000000000000000000000000000000000000..9abad304eaccd062778ff7c41ebb132dfc1c9523 --- /dev/null +++ b/apps/attestation-manager/src/client/tests/stubs/nats-response.ts @@ -0,0 +1,16 @@ +import { ResponseType } from '@src/common/response'; +import AttestationService from '@src/issue-credential/services/service'; + +const natsAgentResponse: ResponseType = { + statusCode: 200, + data: { + service_endpoint: 'TEST_AGENT_URL', + }, + message: 'Agent Details', +}; + +const natsConnectionResponse = { + status: AttestationService.connectionStatus.TRUSTED, +}; + +export { natsAgentResponse, natsConnectionResponse }; diff --git a/apps/attestation-manager/src/client/tsa.client.ts b/apps/attestation-manager/src/client/tsa.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..541a695a01a666453c1751c75a4e15c18e5ad573 --- /dev/null +++ b/apps/attestation-manager/src/client/tsa.client.ts @@ -0,0 +1,51 @@ +import { Injectable } from '@nestjs/common'; +import RestClientService from '@src/client/rest.client'; + +export interface PolicyReturnType { + success: boolean; + returnData?: any; // replace with actual structure when ready +} + +export interface PolicyResult { + allow: boolean; + data?: any; +} + +@Injectable() +export default class TSAClientService { + constructor(private readonly restClient: RestClientService) {} + + async getPolicy(policyUrl: string) { + try { + const policyResponse: PolicyResult = await this.restClient.get(policyUrl); + + if ( + policyResponse && + policyResponse.allow && + typeof policyResponse.allow === 'boolean' + ) { + return { + success: true, + returnData: Boolean(policyResponse?.allow), + } as PolicyReturnType; + } + + // Add condition when policy returns data other than boolean + return { + success: false, + returnData: 'Unable to fetch policy data.', + } as PolicyReturnType; + } catch (error: any) { + let returnData = 'Something went wrong!'; + + if (error?.isAxiosError) { + returnData = `${error?.response?.status} ${error?.response?.statusText}`; + } + + return { + success: false, + returnData, + } as PolicyReturnType; + } + } +} diff --git a/apps/attestation-manager/src/common/constants.ts b/apps/attestation-manager/src/common/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..98b288fb5b0a68e9601d328c939e4e53859b92ec --- /dev/null +++ b/apps/attestation-manager/src/common/constants.ts @@ -0,0 +1,38 @@ +export enum LoggerConfig { + FILE_PATH = 'logs/log.json', + lOG_DIR = './logs', +} + +export enum Connection { + BASE_URL = 'http://3.111.77.38:3003', // TODO Hardcoded IP, move to env variables + CONNECTION = 'v1/connections', + GET_CONNECTION_BY_ID = 'getConnectionById', + NATS_ENDPOINT = 'CONNECTION_MANAGER_SERVICE', + MAKE_CONNECTION_TRUSTED = 'makeConnectionTrusted', + GET_RECEIVED_CONNECTIONS = 'getReceivedConnections', +} + +export enum Abstraction { + NATS_ENDPOINT = 'SSI_ABSTRACTION_SERVICE', + CREDENTIAL_STATE_CHANGED = 'CredentialStateChanged', +} + +export enum NATSServices { + SERVICE_NAME = 'ATTESTATION_MANAGER_SERVICE', +} + +export enum TSAService { + PRINCIPAL_CREDENTIAL_REQUEST = 'PrincipalCredentialRequest', +} + +export enum PrismaErrorCode { + RECORD_NOT_FOUND = 'P2025', +} + +export const VersionRegex = /^(\d+\.)(\d+\.)?(\d+)$/; + +export enum AutoAcceptCredential { + ALWAYS = 'always', + Content_Approved = 'contentApproved', + NEVER = 'never', +} diff --git a/apps/attestation-manager/src/common/date.utils.ts b/apps/attestation-manager/src/common/date.utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..f7276e5c4d3bab62d48addca3fac71f21ddd4df8 --- /dev/null +++ b/apps/attestation-manager/src/common/date.utils.ts @@ -0,0 +1,5 @@ +import moment = require('moment'); + +const getDate = () => moment().format('MM-DD-YYYY, h:mm:ss a'); + +export default getDate; diff --git a/apps/attestation-manager/src/common/exception.handler.ts b/apps/attestation-manager/src/common/exception.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..9495ebd23c60a0a3fa9372f0ffc3b730eeaf68c6 --- /dev/null +++ b/apps/attestation-manager/src/common/exception.handler.ts @@ -0,0 +1,42 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus, +} from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; +import { ResponseType } from './response'; + +@Catch() +export default class ExceptionHandler implements ExceptionFilter { + constructor(private readonly httpAdapterHost: HttpAdapterHost) {} + + catch(exception: any, host: ArgumentsHost): void { + // In certain situations `httpAdapter` might not be available in the + // constructor method, thus we should resolve it here. + const { httpAdapter } = this.httpAdapterHost; + + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + + let statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + let message = + exception.message.error || exception.message || 'Something went wrong!'; + + if (exception instanceof HttpException) { + const errorResponse: any = exception.getResponse(); + + statusCode = exception.getStatus(); + message = errorResponse.error || message; + } + + const responseBody: ResponseType = { + statusCode, + message, + error: exception.message, + }; + + httpAdapter.reply(response, responseBody, statusCode); + } +} diff --git a/apps/attestation-manager/src/common/response.ts b/apps/attestation-manager/src/common/response.ts new file mode 100644 index 0000000000000000000000000000000000000000..0bbcc92e4d925953b397eef308a732f34e36c7ef --- /dev/null +++ b/apps/attestation-manager/src/common/response.ts @@ -0,0 +1,6 @@ +export interface ResponseType { + statusCode: number; + message: string; + data?: any; + error?: any; +} diff --git a/apps/attestation-manager/src/credentialDef/controller/controller.ts b/apps/attestation-manager/src/credentialDef/controller/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..1b6f4baa9a54d88f7d24b501e6d360ff7ba07288 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/controller/controller.ts @@ -0,0 +1,472 @@ +import { + Body, + Controller, + Get, + HttpStatus, + InternalServerErrorException, + Param, + Post, + Query, + Res, + Version, +} from '@nestjs/common'; +import { Response } from 'express'; +import logger from '@utils/logger'; +import CredentialDefService from '@src/credentialDef/services/service'; +import { ResponseType } from '@src/common/response'; +import CredentialDefDto from '@src/credentialDef/entities/credentialDef-entity'; +import { + ApiBody, + ApiParam, + ApiQuery, + ApiOperation, + ApiResponse, + ApiTags, +} from '@nestjs/swagger'; +import { PrismaClientUnknownRequestError } from '@prisma/client/runtime'; +import CredentialDefLedgerDto from '@src/credentialDef/entities/credentialDefLedger-entity'; + +@ApiTags('Credential Definitions') +@Controller('credentialDef') +export default class CredentialDefController { + constructor(private readonly credentialDefService: CredentialDefService) {} + + @Version(['1']) + @ApiQuery({ name: 'page', required: false }) + @ApiQuery({ name: 'pageSize', required: false }) + @ApiQuery({ name: 'schemaID', required: false }) + @Get('') + @ApiOperation({ + summary: 'Fetch a list of credential definitions', + description: 'This call provides the capability to search created credential definitions by using pagination and filter parameter (schemaID) to select credential definitions. This call returns a list of credential definitions and overall count of records. Using a credential definition from that list you can issue credential so some connection' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential definitions fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential definitions fetched successfully': { + value: { + statusCode: 200, + message: 'Credential definitions fetched successfully', + data: { + count: 2, + records: [ + { + id: '1234abcd', + schemaID: 'loremipsum:test-01-01:1.0', + name: 'test-01-01', + credDefId: 'test-cred-def123', + isAutoIssue: false, + isRevokable: false, + expiryHours: '24', + createdBy: 'acceptsAnyString', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + }, + { + id: '5678abcd', + schemaID: 'loremipsum2:test2-01-01:1.0', + name: 'test2-01-01', + credDefId: 'test2-cred-def123', + isAutoIssue: false, + isRevokable: false, + expiryHours: '24', + createdBy: 'acceptsAnyString', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found.', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found.': { + value: { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async findCredentialDef( + @Query() + query: { + pageSize: string; + page: string; + schemaID: string; + }, + @Res() response: Response, + ) { + let res: ResponseType; + try { + logger.info('Credential definitions fetched successfully'); + const result = await this.credentialDefService.findCredentialDef( + query.pageSize ? parseInt(query.pageSize, 10) : 10, + query.page ? parseInt(query.page, 10) : 0, + query.schemaID ? query.schemaID : '', + ); + if (Array.isArray(result) && result[0] > 0) { + res = { + statusCode: HttpStatus.OK, + message: 'Credential definitions fetched successfully', + data: { + count: result[0], + records: result[1], + }, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + return response.send(res); + } catch (error: any) { + logger.error(error && error.message); + throw new InternalServerErrorException(`Error: ${error.message}`); + } + } + + @ApiParam({ name: 'id', type: 'string', description: 'Pass Cred Def id' }) + @Version(['1']) + @Get('/:id') + @ApiOperation({ + summary: 'Fetch credential definition by id', + description: 'This call provides the capability to get credential definition data by providing id of credential definition. The credential definition data is the same which is returned from /v1/connections endpoint and contains generic information about credential definition like schemaID, name, credDefId, isAutoIssue, isRevokable, expiryHours, createdBy, createdDate, updatedBy, updatedDate' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential definition fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential definition fetched successfully': { + value: { + statusCode: 200, + message: 'Credential definition fetched successfully', + data: { + count: 1, + records: [ + { + id: '1234abcd', + schemaID: 'loremipsum:test-01-01:1.0', + name: 'test-01-01', + credDefId: 'test-cred-def123', + isAutoIssue: false, + isRevokable: false, + expiryHours: '24', + createdBy: 'acceptsAnyString', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found': { + value: { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async findCredentialDefById( + @Param('id') id: string, + @Res() response: Response, + ) { + let res: ResponseType; + try { + logger.info('Credential definition fetched successfully'); + const result = await this.credentialDefService.findCredentialDefById(id); + if (Array.isArray(result) && result[0] > 0) { + res = { + statusCode: HttpStatus.OK, + message: 'Credential definition fetch successfully', + data: { + count: result[0], + records: result[1], + }, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } + + @Version(['1']) + @ApiBody({ type: CredentialDefDto }) + @Post('') + @ApiOperation({ + summary: 'Create a new credential definition', + description: 'This call provides the capability to create new credential definition by providing schema id, name, createdBy, auto-issue and other information required by this method. This call returns an object contains information abut this credential definition (type CredentialDefDto). You can use this credential definition to issue credentials to some connection' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Credential definition created successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential definition created successfully': { + value: { + statusCode: 201, + message: 'Credential definition created successfully', + data: { + id: '71b784a3', + schemaID: '7KuDTpQh3:test-schema', + name: 'test', + credDefId: '7KuDTpQh3:test', + isAutoIssue: false, + isRevokable: false, + expiryHours: '23', + createdBy: 'vocm', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Credential definition required following attributes ( schemaID, name, isRevokable, isAutoIssue, createdBy, expiryHours )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential definition required following attributes ( schemaID, name, isRevokable, isAutoIssue, createdBy, expiryHours )': + { + value: { + statusCode: 400, + message: + 'Credential definition required following attributes ( schemaID, name, isRevokable, isAutoIssue, createdBy, expiryHours )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Could not get credential definition details. Please try again.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Could not get credential definition details. Please try again.': { + value: { + statusCode: 400, + message: + 'Could not get credential definition details. Please try again.', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.CONFLICT, + description: 'Credential definition already exists', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential definition already exists': { + value: { + statusCode: 409, + message: 'Credential definition already exists', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async createCredentialDef( + @Body() credentialDefDto: CredentialDefDto, + @Res() response: Response, + ) { + try { + let res: ResponseType = { + statusCode: HttpStatus.OK, + message: 'Something went wrong please try again.', + }; + if ( + !( + credentialDefDto.schemaID && + typeof credentialDefDto.schemaID === 'string' && + credentialDefDto.name && + typeof credentialDefDto.name === 'string' && + credentialDefDto.createdBy && + typeof credentialDefDto.createdBy === 'string' && + (credentialDefDto.isRevokable === false || + credentialDefDto.isRevokable === true) && + (credentialDefDto.isAutoIssue === false || + credentialDefDto.isAutoIssue === true) && + credentialDefDto.expiryHours && + typeof credentialDefDto.expiryHours === 'string' && + parseFloat(credentialDefDto.expiryHours) >= -1 + ) + ) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Credential definition required following attributes ( schemaID, name, isRevokable, isAutoIssue, createdBy, expiryHours )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + const credDefResponse = + await this.credentialDefService.checkCredDefByNameAndSchemaID( + credentialDefDto, + ); + + if (credDefResponse[0] === 0) { + const credentialDefLedgerDto: CredentialDefLedgerDto = { + tag: credentialDefDto.name, + supportRevocation: credentialDefDto.isRevokable, + schemaId: credentialDefDto.schemaID, + }; + const resp = await this.credentialDefService.createCredDefOnLedger( + credentialDefLedgerDto, + ); + + if (resp?.id) { + const credentialDefIDRes: CredentialDefDto = credentialDefDto; + credentialDefIDRes.credDefId = resp.id; + response.status(HttpStatus.CREATED); + res = { + statusCode: HttpStatus.CREATED, + message: 'Credential definition created successfully', + data: await this.credentialDefService.createCredDef( + credentialDefIDRes, + ), + }; + logger.info('Credential definition created successfully'); + } else { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Could not get credential definition details. Please try again.', + }; + } + } else { + response.status(HttpStatus.CONFLICT); + res = { + statusCode: HttpStatus.CONFLICT, + message: 'Credential definition already exists', + }; + } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } +} diff --git a/apps/attestation-manager/src/credentialDef/entities/credentialDef-entity.ts b/apps/attestation-manager/src/credentialDef/entities/credentialDef-entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..d6d373b3244ef428351561199d5777a01654ab46 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/entities/credentialDef-entity.ts @@ -0,0 +1,56 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { IsString, IsNotEmpty, IsBoolean } from 'class-validator'; + +export default class CredentialDefDto { + @IsString() + id: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + schemaID: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + name: string; + + @IsString() + credDefId: string; + + @IsBoolean() + supportRevocation?: boolean; + + @IsBoolean() + @ApiProperty() + isRevokable: boolean; + + @IsBoolean() + @ApiProperty() + isAutoIssue: boolean; + + @IsString() + @ApiProperty() + // Number of hours of Credential validity + expiryHours: string; + + @IsString() + @ApiProperty() + createdBy: string; + + @IsString() + createdDate: Date; + + @IsString() + updatedBy: string; + + @IsString() + updatedDate: Date; + + @IsString() + tag?: string; + + @IsString() + @ApiPropertyOptional() + type?: string; +} diff --git a/apps/attestation-manager/src/credentialDef/entities/credentialDefLedger-entity.ts b/apps/attestation-manager/src/credentialDef/entities/credentialDefLedger-entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..347ea5687056691f1c67505bd28932847e60ff40 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/entities/credentialDefLedger-entity.ts @@ -0,0 +1,12 @@ +import { IsString, IsBoolean } from 'class-validator'; + +export default class CredentialDefLedgerDto { + @IsString() + schemaId: string; + + @IsBoolean() + supportRevocation?: boolean; + + @IsString() + tag?: string; +} diff --git a/apps/attestation-manager/src/credentialDef/entities/credentialDefReq.dto.ts b/apps/attestation-manager/src/credentialDef/entities/credentialDefReq.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..f839068356f8985b5a4971bb28cb271be08057a5 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/entities/credentialDefReq.dto.ts @@ -0,0 +1,52 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsNotEmpty, IsBoolean } from 'class-validator'; + +export default class CredentialDefReqDto { + @IsString() + id: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + schemaID: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + name: string; + + @IsString() + credDefId: string; + + @IsBoolean() + supportRevocation?: boolean; + + @IsBoolean() + @ApiProperty() + isRevokable: boolean; + + @IsBoolean() + @ApiProperty() + isAutoIssue: boolean; + + @IsString() + @ApiProperty() + // Number of hours of Credential validity + expiryHours: string; + + @IsString() + @ApiProperty() + createdBy: string; + + @IsString() + createdDate: Date; + + @IsString() + updatedBy: string; + + @IsString() + updatedDate: Date; + + @IsString() + tag?: string; +} diff --git a/apps/attestation-manager/src/credentialDef/module.ts b/apps/attestation-manager/src/credentialDef/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..0ef0b3afe4ebbcc5a80348bd7e46c27085b9c74c --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/module.ts @@ -0,0 +1,35 @@ +import SchemasService from '@schemas/services/service'; +import { Module } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import CredentialDefService from '@src/credentialDef/services/service'; +import CredentialDefController from '@src/credentialDef/controller/controller'; +import NatsClientService from '@src/client/nats.client'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import RestClientService from '@src/client/rest.client'; +import config from '@config/config'; + +@Module({ + imports: [ + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + ], + controllers: [CredentialDefController], + providers: [ + CredentialDefService, + PrismaService, + NatsClientService, + RestClientService, + SchemasService, + ], +}) +export default class CredentialDefModule {} diff --git a/apps/attestation-manager/src/credentialDef/repository/credentialDef.respository.ts b/apps/attestation-manager/src/credentialDef/repository/credentialDef.respository.ts new file mode 100644 index 0000000000000000000000000000000000000000..b09641801190f0514a9b87f3bbbdbae251bc7a39 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/repository/credentialDef.respository.ts @@ -0,0 +1,60 @@ +import { Injectable } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export default class CredentialDefRepository { + constructor(private readonly prismaService: PrismaService) {} + + async createCredDef(data: Prisma.CredentialDefCreateInput) { + const credDef = await this.prismaService.credentialDef.create({ + data, + }); + + await this.prismaService.schema.update({ + where: { + schemaID: data.schemaID, + }, + data: { + credential_defs: { + connect: { + id: credDef.id, + }, + }, + }, + }); + + return credDef; + } + + async findCredentialDef(params: { + skip?: number; + take?: number; + cursor?: Prisma.CredentialDefWhereUniqueInput; + where?: Prisma.CredentialDefWhereInput; + orderBy?: Prisma.CredentialDefOrderByWithRelationInput; + }) { + const { skip, take, cursor, where, orderBy } = params; + return this.prismaService.$transaction([ + this.prismaService.credentialDef.count({ + where, + }), + this.prismaService.credentialDef.findMany({ + skip, + take, + cursor, + where, + orderBy, + }), + ]); + } + + async findUniqueCredentialDef(params: { + where: Prisma.CredentialDefWhereUniqueInput; + }) { + const { where } = params; + return this.prismaService.credentialDef.findUnique({ + where, + }); + } +} diff --git a/apps/attestation-manager/src/credentialDef/services/service.ts b/apps/attestation-manager/src/credentialDef/services/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..392e57106af8863420a6d99e29f330139557afb4 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/services/service.ts @@ -0,0 +1,137 @@ +import logger from '@utils/logger'; +import { Injectable } from '@nestjs/common'; +import CredentialDefDto from '@src/credentialDef/entities/credentialDef-entity'; +import CredentialDefRepository from '@src/credentialDef/repository/credentialDef.respository'; +import PrismaService from '@DB/prisma.service'; +import CredentialDefLedgerDto from '@src/credentialDef/entities/credentialDefLedger-entity'; +import { Prisma } from '@prisma/client'; +import pagination from '@utils/pagination'; +import RestClientService from '@src/client/rest.client'; +import { ConfigService } from '@nestjs/config'; +import SchemasService from '@schemas/services/service'; +import SchemaDto from '@src/schemas/entities/schema-entity'; +import CredentialTypeRepository from '@src/issue-credential/repository/credentialType.repository'; + +@Injectable() +export default class CredentialDefService { + private credentialDefRepository: CredentialDefRepository; + + private credentialTypeRepository: CredentialTypeRepository; + + constructor( + private readonly prismaService: PrismaService, + private readonly restClient: RestClientService, + private readonly configService: ConfigService, + private readonly schemaService: SchemasService, + ) { + this.credentialDefRepository = new CredentialDefRepository( + this.prismaService, + ); + + this.credentialTypeRepository = new CredentialTypeRepository( + this.prismaService, + ); + } + + async createCredDef(credentialDefDtoPar: CredentialDefDto) { + const credentialDefDto: CredentialDefDto = credentialDefDtoPar; + const schema = await this.schemaService.findBySchemaId( + credentialDefDto.schemaID, + ); + logger.info(`is schema already exists ${schema}`); + if (!schema) { + const schemaLedger = + await this.schemaService.getSchemaAndAttributesBySchemaIDFromLedger( + credentialDefDto.schemaID, + ); + const schemaObj: SchemaDto = { + schemaID: credentialDefDto.schemaID, + name: schemaLedger.name, + version: schemaLedger.version, + attributes: schemaLedger.attrNames, + createdBy: '', + id: '', + type: '', + createdDate: new Date(), + updatedDate: new Date(), + }; + const createschema = await this.schemaService.createSchemas(schemaObj); + logger.info(`Schema created in Database ${JSON.stringify(createschema)}`); + } + + if ( + credentialDefDto.type && + typeof credentialDefDto.type === 'string' && + credentialDefDto.type.trim().length > 0 + ) { + await this.credentialTypeRepository.createOrUpdateCredentialsType({ + schemaId: credentialDefDto.schemaID, + type: credentialDefDto.type.trim(), + }); + } + delete credentialDefDto.type; + return this.credentialDefRepository.createCredDef(credentialDefDto); + } + + async findCredentialDef(pageSize: number, page: number, getSchemaID: string) { + let query: { + skip?: number; + take?: number; + cursor?: Prisma.CredentialDefWhereUniqueInput; + where?: Prisma.CredentialDefWhereInput; + orderBy?: Prisma.CredentialDefOrderByWithRelationInput; + } = {}; + if (getSchemaID) { + query.where = { + schemaID: getSchemaID, + }; + } + query = { ...query, ...pagination(pageSize, page) }; + return this.credentialDefRepository.findCredentialDef(query); + } + + async findCredentialDefBySchemaIdAndCredDefId(data: { + schemaID: string; + credDefId: string; + }) { + return this.credentialDefRepository.findCredentialDef({ + where: data, + }); + } + + async findCredentialDefBySchemaIdDesc(data: { schemaID: string }) { + return this.credentialDefRepository.findCredentialDef({ + where: data, + orderBy: { + createdDate: 'desc', + }, + }); + } + + async findCredentialDefById(id: string) { + return this.credentialDefRepository.findCredentialDef({ + where: { credDefId: id }, + }); + } + + async checkCredDefByNameAndSchemaID(createSchema: CredentialDefDto) { + return this.credentialDefRepository.findCredentialDef({ + where: { + schemaID: { + equals: createSchema.schemaID, // Default value: default + }, + name: { + equals: createSchema.name, // Default mode + }, + }, + }); + } + + async createCredDefOnLedger(credentialDefDto: CredentialDefLedgerDto) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + return this.restClient.post( + `${agentUrl}/credential-definitions/`, + credentialDefDto, + ); + } +} diff --git a/apps/attestation-manager/src/credentialDef/tests/__mocks__/service.ts b/apps/attestation-manager/src/credentialDef/tests/__mocks__/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..09ff612eb0d07c063551741a9f9e699a31ed2eeb --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/tests/__mocks__/service.ts @@ -0,0 +1,19 @@ +import credDefStub from '@src/credentialDef/tests/stubs/credDef.stub'; + +const CredentialDefServiceMock = jest.fn().mockReturnValue({ + createCredDef: jest.fn().mockReturnValue(credDefStub()), + findCredentialDef: jest.fn().mockReturnValue([1, [credDefStub()]]), + findCredentialDefById: jest.fn().mockReturnValue([1, [credDefStub()]]), + findCredentialDefBySchemaIdDesc: jest + .fn() + .mockReturnValue([1, [credDefStub()]]), + checkCredDefByNameAndSchemaID: jest + .fn() + .mockImplementation((cd) => + cd.id === credDefStub().id ? [0, []] : [1, [credDefStub()]], + ), + getAgentByParticipantId: jest.fn().mockReturnValue([1, [credDefStub()]]), + createCredDefOnLedger: jest.fn().mockReturnValue({ id: 'new-creddef-id' }), +}); + +export default CredentialDefServiceMock; diff --git a/apps/attestation-manager/src/credentialDef/tests/controller.spec.ts b/apps/attestation-manager/src/credentialDef/tests/controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..719d388197d6a4ece52225e80366cd9c5850c18c --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/tests/controller.spec.ts @@ -0,0 +1,139 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import httpMocks from 'node-mocks-http'; + +import CredentialDefController from '@credentialDef/controller/controller'; +import CredentialDefService from '@credentialDef/services/service'; +import CredentialDefServiceMock from '@credentialDef/tests/__mocks__/service'; +import credDefStub from '@credentialDef/tests/stubs/credDef.stub'; +import { HttpStatus } from '@nestjs/common'; +import { Response } from 'express'; +import { ConfigService } from '@nestjs/config'; + +describe('CredentialDefController', () => { + let credentialDefController: CredentialDefController; + let spyService: CredentialDefService; + + beforeEach(async () => { + const CredentialDefServiceProvider = { + provide: CredentialDefService, + useFactory: CredentialDefServiceMock, + }; + + const module: TestingModule = await Test.createTestingModule({ + imports: [], + controllers: [CredentialDefController], + providers: [CredentialDefServiceProvider, ConfigService], + }).compile(); + + credentialDefController = module.get<CredentialDefController>( + CredentialDefController, + ); + spyService = module.get<CredentialDefService>(CredentialDefService); + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(credentialDefController).toBeDefined(); + }); + + describe('findCredentialDef()', () => { + let query: { + pageSize: string; + page: string; + schemaID: string; + }; + let credDefResponse: Response<string, Record<string, any>>; + + beforeEach(async () => { + query = { + pageSize: '10', + page: '1', + schemaID: credDefStub().schemaID, + }; + + const response = httpMocks.createResponse(); + credDefResponse = await credentialDefController.findCredentialDef( + query, + response, + ); + }); + + it('should call findCredentialDef() from service', async () => { + expect(spyService.findCredentialDef).toHaveBeenCalled(); + }); + + it('should retrieve CredDef for a correct ID', async () => { + expect( + spyService.findCredentialDef( + query.pageSize ? parseInt(query.pageSize, 10) : 10, + query.page ? parseInt(query.page, 10) : 0, + query.schemaID ? query.schemaID : '', + ), + ).toEqual([1, [credDefStub()]]); + }); + + it(`should retrieve HTTP status success(${HttpStatus.OK})`, async () => { + expect(credDefResponse?.statusCode).toEqual(HttpStatus.OK); + }); + }); + + describe('findCredentialDefById()', () => { + let credDefID: string; + let credDef: Response<string, Record<string, any>>; + + beforeEach(async () => { + credDefID = credDefStub().id; + + const response = httpMocks.createResponse(); + credDef = await credentialDefController.findCredentialDefById( + credDefID, + response, + ); + }); + + it('should call findCredentialDefById() for a CredDef', async () => { + expect(spyService.findCredentialDefById).toHaveBeenCalled(); + }); + + it('should retrieve CredDef for a correct ID', async () => { + expect(spyService.findCredentialDefById(credDefID)).toEqual([ + 1, + [credDefStub()], + ]); + }); + + it(`should retrieve HTTP status success(${HttpStatus.OK})`, async () => { + expect(credDef?.statusCode).toEqual(HttpStatus.OK); + }); + }); + + describe('createCredDef()', () => { + let credDef: Response<string, Record<string, any>>; + + beforeEach(async () => { + const response = httpMocks.createResponse(); + credDef = await credentialDefController.createCredentialDef( + credDefStub(), + response, + ); + }); + + it('should call checkCredDefByNameAndSchemaID() from service', async () => { + expect(spyService.checkCredDefByNameAndSchemaID).toHaveBeenCalled(); + }); + + it('should not retrieve CredDef for a given credDef', async () => { + expect(spyService.checkCredDefByNameAndSchemaID(credDefStub())).toContain( + 0, + ); + }); + + it('should call createCredDefOnLedger() from service', async () => { + expect(spyService.createCredDefOnLedger).toHaveBeenCalled(); + }); + + it(`should retrieve HTTP status created(${HttpStatus.CREATED})`, async () => { + expect(credDef?.statusCode).toEqual(HttpStatus.CREATED); + }); + }); +}); diff --git a/apps/attestation-manager/src/credentialDef/tests/module.spec.ts b/apps/attestation-manager/src/credentialDef/tests/module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..07f6c53ebac481fe8c58a58f2a95a616d3dd2c95 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/tests/module.spec.ts @@ -0,0 +1,54 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import NatsClientService from '@src/client/nats.client'; +import PrismaServiceMock from '@src/prisma/tests/__mocks__/prisma.service'; +import NatsClientServiceMock from '@src/client/tests/__mocks__/nats.client'; +import RestClientService from '@src/client/rest.client'; +import RestClientServiceMock from '@src/client/tests/__mocks__/rest.client'; +import CredentialDefModule from '../module'; +import CredentialDefService from '../services/service'; +import CredentialDefServiceMock from './__mocks__/service'; + +describe('CredentialDefModule', () => { + let credentialDefModule: CredentialDefModule; + + const CredentialDefServiceProvider = { + provide: CredentialDefService, + useFactory: CredentialDefServiceMock, + }; + + const PrismaServiceProvider = { + provide: PrismaService, + useFactory: PrismaServiceMock, + }; + + const NatsClientServiceProvider = { + provide: NatsClientService, + useFactory: NatsClientServiceMock, + }; + + const RestClientServiceProvider = { + provide: RestClientService, + useFactory: RestClientServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [HttpModule], + providers: [ + CredentialDefModule, + CredentialDefServiceProvider, + PrismaServiceProvider, + NatsClientServiceProvider, + RestClientServiceProvider, + ], + }).compile(); + + credentialDefModule = module.get<CredentialDefModule>(CredentialDefModule); + }); + + it('should be defined', () => { + expect(credentialDefModule).toBeDefined(); + }); +}); diff --git a/apps/attestation-manager/src/credentialDef/tests/service.spec.ts b/apps/attestation-manager/src/credentialDef/tests/service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..acf24978ce053f354992efe3386a4246a9300360 --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/tests/service.spec.ts @@ -0,0 +1,180 @@ +import CredentialDefService from '@credentialDef/services/service'; +import { HttpModule } from '@nestjs/axios'; +import { Test, TestingModule } from '@nestjs/testing'; +import { CredentialDef } from '@prisma/client'; +import NatsClientService from '@src/client/nats.client'; +import NatsClientServiceMock from '@src/client/tests/__mocks__/nats.client'; +import PrismaService from '@src/prisma/prisma.service'; +import PrismaServiceMock from '@src/prisma/tests/__mocks__/prisma.service'; +import RestClientService from '@src/client/rest.client'; +import RestClientServiceMock from '@src/client/tests/__mocks__/rest.client'; +import { ConfigService } from '@nestjs/config'; +import SchemasService from '@src/schemas/services/service'; +import SchemasServiceMock from '@src/schemas/tests/__mocks__/service'; +import credDefStub from './stubs/credDef.stub'; + +describe('CredentialDefService', () => { + let credDefService: CredentialDefService; + + const PrismaServiceProvider = { + provide: PrismaService, + useFactory: PrismaServiceMock, + }; + + const NatsClientServiceProvider = { + provide: NatsClientService, + useFactory: NatsClientServiceMock, + }; + + const RestClientServiceProvider = { + provide: RestClientService, + useFactory: RestClientServiceMock, + }; + + const SchemasServiceProvider = { + provide: SchemasService, + useFactory: SchemasServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [HttpModule], + providers: [ + CredentialDefService, + PrismaServiceProvider, + NatsClientServiceProvider, + RestClientServiceProvider, + ConfigService, + SchemasServiceProvider, + ], + }).compile(); + + credDefService = module.get<CredentialDefService>(CredentialDefService); + }); + + it('should be defined', () => { + expect(credDefService).toBeDefined(); + }); + + describe('createCredDef()', () => { + let credDefResponse: CredentialDef; + + beforeEach(async () => { + credDefResponse = await credDefService.createCredDef(credDefStub()); + }); + + it('should call create() from PrismaService', async () => { + expect(PrismaServiceMock().credentialDef.create).toHaveBeenCalled(); + }); + + it('should retrieve credDef by participantId', async () => { + expect(credDefResponse).toEqual([credDefStub()]); + }); + }); + + describe('findCredentialDef()', () => { + let credDefResponse: Array<number | CredentialDef[]>; + let id: string; + + beforeEach(async () => { + const pageSize = 10; + const page = 10; + id = credDefStub().credDefId; + + credDefResponse = await credDefService.findCredentialDef( + pageSize, + page, + id, + ); + }); + + it('should call findMany() from PrismaService.credentialDef', async () => { + expect(PrismaServiceMock().credentialDef.findMany).toHaveBeenCalled(); + }); + + it('should call count() from PrismaService.credentialDef', async () => { + expect(PrismaServiceMock().credentialDef.count).toHaveBeenCalled(); + }); + + it('should call $transaction() from PrismaService', async () => { + expect(PrismaServiceMock().$transaction).toHaveBeenCalled(); + }); + + it('should retrieve schema by ID', async () => { + expect(credDefResponse).toEqual([1, [credDefStub()]]); + }); + }); + + describe('findCredentialDefById()', () => { + let credDefResponse: Array<number | CredentialDef[]>; + let id: string; + + beforeEach(async () => { + id = credDefStub().credDefId; + + credDefResponse = await credDefService.findCredentialDefById(id); + }); + + it('should call findMany() from PrismaService.credentialDef', async () => { + expect(PrismaServiceMock().credentialDef.findMany).toHaveBeenCalled(); + }); + + it('should call count() from PrismaService.credentialDef', async () => { + expect(PrismaServiceMock().credentialDef.count).toHaveBeenCalled(); + }); + + it('should call $transaction() from PrismaService', async () => { + expect(PrismaServiceMock().$transaction).toHaveBeenCalled(); + }); + + it('should retrieve schema by ID', async () => { + expect(credDefResponse).toEqual([1, [credDefStub()]]); + }); + }); + + describe('checkCredDefByNameAndSchemaID()', () => { + let credDefResponse: Array<number | CredentialDef[]>; + + beforeEach(async () => { + credDefResponse = await credDefService.checkCredDefByNameAndSchemaID( + credDefStub(), + ); + }); + + it('should call findMany() from PrismaService.credentialDef', async () => { + expect(PrismaServiceMock().credentialDef.findMany).toHaveBeenCalled(); + }); + + it('should call count() from PrismaService.credentialDef', async () => { + expect(PrismaServiceMock().credentialDef.count).toHaveBeenCalled(); + }); + + it('should call $transaction() from PrismaService', async () => { + expect(PrismaServiceMock().$transaction).toHaveBeenCalled(); + }); + + it('should retrieve credDef by Name and Schema ID', async () => { + expect(credDefResponse).toEqual([1, [credDefStub()]]); + }); + }); + + describe('createCredDefOnLedger()', () => { + let credDefResponse: Array<number | CredentialDef[]>; + + beforeEach(async () => { + credDefResponse = await credDefService.createCredDefOnLedger({ + schemaId: credDefStub().schemaID, + supportRevocation: credDefStub().supportRevocation, + tag: credDefStub().tag, + }); + }); + + it('should call post() from restClient', async () => { + expect(RestClientServiceMock().post).toHaveBeenCalled(); + }); + + it('should get a response from AFJ', async () => { + expect(credDefResponse).not.toBe(null); + }); + }); +}); diff --git a/apps/attestation-manager/src/credentialDef/tests/stubs/credDef.stub.ts b/apps/attestation-manager/src/credentialDef/tests/stubs/credDef.stub.ts new file mode 100644 index 0000000000000000000000000000000000000000..8b50a312ed0a09703c99795d72d81b4e08a3c2dc --- /dev/null +++ b/apps/attestation-manager/src/credentialDef/tests/stubs/credDef.stub.ts @@ -0,0 +1,20 @@ +import CredentialDefDto from '@credentialDef/entities/credentialDef-entity'; + +const credDefStub = (): CredentialDefDto => + ({ + id: 'cred-def-stub-id', + schemaID: 'cred-def-stub-schema-id', + name: 'cred-def-stub-name', + credDefId: 'cred-def-stub-cred-def-id', + supportRevocation: true, + isRevokable: true, + isAutoIssue: true, + expiryHours: '48', + createdBy: 'cred-def-stub-created-by-id', + createdDate: new Date(2022), + updatedBy: 'cred-def-stub-updated-by-id', + updatedDate: new Date(2022), + tag: 'cred-def-stub-tag', + } as CredentialDefDto); + +export default credDefStub; diff --git a/apps/attestation-manager/src/health/health.controller.ts b/apps/attestation-manager/src/health/health.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..3c581d13d170074a8cc0ef886a0d5e2ebd5b5399 --- /dev/null +++ b/apps/attestation-manager/src/health/health.controller.ts @@ -0,0 +1,41 @@ +import { Controller, Get, Version, HttpStatus } from '@nestjs/common'; + +import { ResponseType } from '@common/response'; +import {ApiOperation, ApiResponse} from '@nestjs/swagger'; + +@Controller('health') +export default class HealthController { + res: ResponseType; + + @Version(['1']) + @Get() + @ApiOperation({ + summary: 'Health check', + description: 'This call provides the capability to check the service is working and up. The call returns 200 Status Code and current server time in json body' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Service is up and running.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Service is up and running.': { + value: { + statusCode: 200, + message: + 'Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time)', + }, + }, + }, + }, + }, + }) + getHealth() { + this.res = { + statusCode: HttpStatus.OK, + message: `${new Date()}`, + }; + return this.res; + } +} diff --git a/apps/attestation-manager/src/health/tests/health.controller.spec.ts b/apps/attestation-manager/src/health/tests/health.controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1bc3d0eae744799a793a12855b6a2b15bac82455 --- /dev/null +++ b/apps/attestation-manager/src/health/tests/health.controller.spec.ts @@ -0,0 +1,34 @@ +import { HttpStatus } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { ResponseType } from '@src/common/response'; + +import HealthController from '../health.controller'; + +describe('HealthController', () => { + let healthController: HealthController; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + controllers: [HealthController], + }).compile(); + + healthController = module.get<HealthController>(HealthController); + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(healthController).toBeDefined(); + }); + + describe('getHealth()', () => { + let health: ResponseType; + + beforeEach(async () => { + health = healthController.getHealth(); + }); + + it(`should retrieve HTTP status created(${HttpStatus.OK})`, async () => { + expect(health.statusCode).toEqual(HttpStatus.OK); + }); + }); +}); diff --git a/apps/attestation-manager/src/issue-credential/controller/controller.ts b/apps/attestation-manager/src/issue-credential/controller/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..1285cae3d435bb6c41bcc1289856b5567d9eb271 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/controller/controller.ts @@ -0,0 +1,1415 @@ +import OfferCredentialDto from '@issueCredential/entities/entity'; +import logger from '@utils/logger'; +import CredentialDto from '@issueCredential/entities/credential.entity'; +import { + Body, + Controller, + Get, + HttpStatus, + InternalServerErrorException, + Param, + Post, + Query, + Res, + Version, + Patch, + NotFoundException, + BadRequestException, + HttpException, + PreconditionFailedException, + Delete, +} from '@nestjs/common'; +import AttestationService from '@src/issue-credential/services/service'; +import { ResponseType } from '@src/common/response'; +import {ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags} from '@nestjs/swagger'; +import CredentialStateDto from '@issueCredential/entities/credential.state.entity'; +import GetIssueCredentialsDto from '@src/issue-credential/entities/get-issue-credentials.dto'; +import GetCredentialParams from '@issueCredential/entities/get.credential.params'; +import GetCredentialQuery from '@issueCredential/entities/get.credential.query'; +import { PrismaClientUnknownRequestError } from '@prisma/client/runtime'; +import { Response } from 'express'; +import { + Abstraction, + NATSServices, + PrismaErrorCode, +} from '@src/common/constants'; +import { EventPattern, MessagePattern } from '@nestjs/microservices'; +import { ConfigService } from '@nestjs/config'; +import UpdateSchemaIdByTypeDto from '@issueCredential/entities/updatecredDefIdByType.entity'; +import CredentialDefService from '@credentialDef/services/service'; +import CredentialTypeDto from '@issueCredential/entities/credentialType.entity'; +import ProposeCredentialDto from '@issueCredential/entities/propose-credential.dto'; +import UserInfoService from '@userInfo/services/service'; +import SchemasService from '@src/schemas/services/service'; + +@ApiTags('Credentials') +@Controller() +export default class AttestationController { + name: string; + + constructor( + private readonly attestationService: AttestationService, + private readonly credentialDefService: CredentialDefService, + private readonly userInfoService: UserInfoService, + private readonly schemaService: SchemasService, + private configService: ConfigService, + ) {} + + @Version(['1']) + @ApiBody({ type: OfferCredentialDto }) + @Post('create-offer-credential') + @ApiOperation({ + summary: 'Send credential offer to a connection', + description: 'This call provides the capability to offer credentials to a connection. You need to provide information about credential definition, connection and attributes which will be send to connection. Initial state of this is offer-sent (workflow is here https://github.com/hyperledger/aries-rfcs/tree/main/features/0036-issue-credential). This call returns information about this credential offer. From user perspective this call means that as organization (e.g. Faber university) I want to start issuing crendentials to student (Alice, holder)' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Credential created successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential created successfully': { + value: { + statusCode: 201, + message: 'Credential created successfully', + data: { + _tags: {}, + metadata: { + '_internal/indyCredential': { + credentialDefinitionId: '7KuDTpQh3GJ7Gp6', + schemaId: '7KuDTpQash2', + }, + }, + id: '61c5df9c', + createdAt: '1970-01-01T12:07:57.388Z', + state: 'offer-sent', + connectionId: '12cd39de', + threadId: '195e8ae3', + offerMessage: { + '@type': + 'https://didcomm.org/issue-credential/1.0/offer-credential', + '@id': '195e8da', + comment: 'asd', + credential_preview: { + '@type': + 'https://didcomm.org/issue-credential/1.0/credential-preview', + attributes: [ + { + name: 'firstName', + value: 'Lorem', + }, + { + name: 'email', + value: 'lorem@example.com', + }, + { + name: 'au', + value: 'ipsum', + }, + { + name: 'expirationDate', + value: + 'Wed Mar 01 2084 11:07:57 GMT+0000 (Coordinated Universal Time)', + }, + ], + }, + 'offers~attach': [ + { + '@id': 'libindy-cred-offer-0', + 'mime-type': 'application/json', + data: { + base64: 'eyJzY2hlbWFf', + }, + }, + ], + }, + credentialAttributes: [ + { + name: 'attribute1', + value: 'testValue1', + }, + { + name: 'attribute2', + value: 'testValue2', + }, + { + name: 'attributeN', + value: 'testValueN', + }, + { + name: 'expirationDate', + value: + 'Wed Mar 01 2023 11:07:57 GMT+0000 (Coordinated Universal Time)', + }, + ], + autoAcceptCredential: 'always', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'offer credentials required following attributes ( connectionId, credentialDefinitionId, attributes, autoAcceptCredential)', + content: { + 'application/json': { + schema: {}, + examples: { + 'offer credentials required following attributes ( connectionId, credentialDefinitionId, attributes, autoAcceptCredential)': + { + value: { + statusCode: 400, + message: + 'offer credentials required following attributes ( connectionId, credentialDefinitionId, attributes, autoAcceptCredential)', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Connection is not trusted', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connection is not trusted': { + value: { + statusCode: 400, + message: 'Connection is not trusted', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async createOfferCredential( + @Body() connectionCreate: OfferCredentialDto, + @Res() response: Response, + ) { + try { + let res: ResponseType; + + if ( + !( + connectionCreate.connectionId && + typeof connectionCreate.connectionId === 'string' && + connectionCreate.credentialDefinitionId && + typeof connectionCreate.credentialDefinitionId === 'string' && + Array.isArray(connectionCreate.attributes) && + connectionCreate.attributes.every( + (i) => + typeof i.name === 'string' && + i.name.trim().length > 0 && + typeof i.value === 'string' && + i.value.trim().length > 0, + ) && + connectionCreate.autoAcceptCredential && + typeof connectionCreate.autoAcceptCredential === 'string' + ) + ) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Offer credentials required following attributes ( connectionId, credentialDefinitionId, attributes, autoAcceptCredential)', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + const OfferCredentialTemp: OfferCredentialDto = { + connectionId: connectionCreate.connectionId, + credentialDefinitionId: connectionCreate.credentialDefinitionId, + attributes: connectionCreate.attributes, + autoAcceptCredential: connectionCreate.autoAcceptCredential, + comment: connectionCreate.comment, + }; + + const offerCredential = + await this.attestationService.createOfferCredential( + OfferCredentialTemp, + ); + + if (offerCredential) { + res = { + statusCode: HttpStatus.CREATED, + message: 'Credential created successfully', + data: offerCredential, + }; + } else { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Connection is not trusted', + }; + } + + return response.send(res); + } catch (error) { + throw new InternalServerErrorException(error); + } + } + + @Version(['1']) + @ApiBody({ type: ProposeCredentialDto }) + @Post('create-propose-credential') + @ApiOperation({ + summary: 'Send credential proposal to a connection', + description: 'This call provides the capability to send propose crendential request to a connection. You need to provide information about credential definition, connection and attributes which you want to use for creating credentials. Initial state of this is proposal-sent (workflow is here https://github.com/hyperledger/aries-rfcs/tree/main/features/0036-issue-credential). This call returns information about this credential proposal. From user perspective this call means that as user (e.g. student) I want to ask organization (e.g. Faber university) to initiate issuing credentials for me using provided data' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Credential proposed successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential proposed successfully': { + value: { + statusCode: 201, + message: 'Credential proposed successfully', + data: { + _tags: {}, + metadata: { + '_internal/indyCredential': { + credentialDefinitionId: + '7KuDTpQh3GJ7Gp6kErpWvM:3:CL:39399:test-13-03', + }, + }, + id: 'c566907d', + createdAt: '1970-01-01T00:00:09.383Z', + state: 'proposal-sent', + connectionId: '12cd39de', + threadId: 'e271b1a0', + proposalMessage: { + '@type': + 'https://didcomm.org/issue-credential/1.0/propose-credential', + '@id': 'e271b1a0', + comment: 'asd', + credential_proposal: { + '@type': + 'https://didcomm.org/issue-credential/1.0/credential-preview', + attributes: [ + { + name: 'firstName', + value: 'TESTING', + }, + { + name: 'email', + value: 'asd@asd.asd', + }, + { + name: 'au', + value: 'level1', + }, + ], + }, + cred_def_id: '1234abcd', + }, + credentialAttributes: [ + { + name: 'firstName', + value: 'TESTING', + }, + { + name: 'email', + value: 'asd@asd.asd', + }, + { + name: 'au', + value: 'level1', + }, + ], + autoAcceptCredential: 'never', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Connection is not trusted', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connection is not trusted': { + value: { + statusCode: 400, + message: 'Connection is not trusted', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async createProposeCredential( + @Body() connectionCreate: ProposeCredentialDto, + @Res() response: Response, + ) { + try { + let res: ResponseType; + const proposeCredential = await this.attestationService.proposeCredential( + connectionCreate, + ); + + if (proposeCredential) { + res = { + statusCode: HttpStatus.CREATED, + message: 'Credential proposed successfully', + data: proposeCredential, + }; + } else { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Connection is not trusted', + }; + } + + return response.send(res); + } catch (error) { + throw new InternalServerErrorException(error); + } + } + + @Version(['1']) + @Post('accept-request/:credentialId') + @ApiOperation({ + summary: 'Accept credential request by credential id', + description: 'Accept a credential request as issuer (by sending a credential message) to the connection associated with the credential record.' + }) + async acceptOfferCredential(@Param() params: { credentialId: string }) { + try { + const res: ResponseType = { + statusCode: HttpStatus.ACCEPTED, + message: 'Accepted Credential Offer', + data: await this.attestationService.acceptRequestCredential( + params.credentialId, + ), + }; + return res; + } catch (error) { + throw new InternalServerErrorException(error); + } + } + + @Version(['1']) + @Post('accept-proposal/:credentialId') + @ApiOperation({ + summary: 'Accept credential proposal by credential id', + description: 'Accept a credential proposal as issuer (by sending a credential offer message) to the connection associated with the credential record.' + }) + async acceptProposeCredential(@Param() params: { credentialId: string }) { + try { + if (!params.credentialId) { + throw new BadRequestException('Invalid credential ID'); + } + + const res: ResponseType = { + statusCode: HttpStatus.ACCEPTED, + message: 'Accepted Credential proposal', + data: await this.attestationService.acceptProposeCredential( + params.credentialId, + ), + }; + return res; + } catch (error: any) { + throw new HttpException( + error?.message || 'Internal server error', + error?.status || 500, + ); + } + } + + @Version(['1']) + @Post('accept-offer/:credentialId') + @ApiOperation({ + summary: 'Accept credential offer by credential id', + description: 'Accept a credential offer as holder (by sending a credential request message) to the connection associated with the credential record.' + }) + async acceptCredentialOffer(@Param() params: { credentialId: string }) { + try { + if (!params.credentialId) { + throw new BadRequestException('Invalid credential ID'); + } + + const res: ResponseType = { + statusCode: HttpStatus.ACCEPTED, + message: 'Accepted Credential offer', + data: await this.attestationService.acceptCredentialOffer( + params.credentialId, + ), + }; + return res; + } catch (error: any) { + throw new HttpException( + error?.message || 'Internal server error', + error?.status || 500, + ); + } + } + + @Version(['1']) + @Post('accept-credential/:credentialId') + @ApiOperation({ + summary: 'Accept credentials by credential id', + description: 'Accept a credential as holder (by sending a credential acknowledgement message) to the connection associated with the credential record.' + }) + async acceptCredential(@Param() params: { credentialId: string }) { + try { + if (!params.credentialId) { + throw new BadRequestException('Invalid credential ID'); + } + + const res: ResponseType = { + statusCode: HttpStatus.ACCEPTED, + message: 'Accepted Credential offer', + data: await this.attestationService.acceptCredential( + params.credentialId, + ), + }; + return res; + } catch (error: any) { + throw new HttpException( + error?.message || 'Internal server error', + error?.status || 500, + ); + } + } + + // @Version(['1']) + // @Post('credentials') + @EventPattern({ + endpoint: `${Abstraction.NATS_ENDPOINT}/${Abstraction.CREDENTIAL_STATE_CHANGED}`, + }) + async webHookCredentials(body: { credentialRecord: CredentialStateDto }) { + const credentialsCreate = body.credentialRecord; + logger.info( + `credentials webhook call data ${JSON.stringify(credentialsCreate)}`, + ); + const credentialObj: CredentialDto = { + credentialId: credentialsCreate.id, + state: credentialsCreate.state, + connectionId: credentialsCreate.connectionId, + credDefId: + credentialsCreate.metadata['_internal/indyCredential'] + .credentialDefinitionId, + schemaId: credentialsCreate.metadata['_internal/indyCredential'].schemaId, + threadId: credentialsCreate.threadId, + }; + let res: ResponseType; + + if ( + credentialsCreate.state === AttestationService.status.OFFER_SENT || + credentialsCreate.state === AttestationService.status.PROPOSAL_SENT || + credentialsCreate.state === AttestationService.status.OFFER_RECEIVED + ) { + res = { + statusCode: HttpStatus.CREATED, + message: 'Credentials Offered', + data: await this.attestationService.createCredential(credentialObj), + }; + } else { + const result: CredentialDto = + await this.attestationService.updateCredential(credentialObj); + + if ( + credentialsCreate.state === AttestationService.status.REQUEST_RECEIVED + ) { + res = { + statusCode: HttpStatus.ACCEPTED, + message: 'Credentials request auto accepted', + data: await this.attestationService.acceptRequestCredential( + result.credentialId, + ), + }; + return res; + } + const credentialsType = + await this.attestationService.getPrincipalMemberShipCredentials({ + type: AttestationService.principalMemberCredential, + }); + if ( + credentialsType?.schemaId === credentialObj.schemaId && + credentialsCreate.state === AttestationService.status.DONE + ) { + this.attestationService.connectionTrusted(credentialObj.connectionId); + } + res = { + statusCode: HttpStatus.OK, + message: 'Credentials status Updated', + data: result, + }; + } + + return res; + } + + // TODO: example values + @Version(['1']) + @Get('credential-info/:id') + @ApiOperation({ + summary: 'Fetch credential information by credential id', + description: 'This call provides the capability to get credential information by credential id. This call returns a credential record (CredentialRecord type with fields connectionId, threadId, credentialId, state, autoAcceptCredential, errorMessage, proposalMessage, offerMessage, requestMessage, credentialMessage, credentialAttributes, linkedAttachments and others). This request get credential data directly from agent, so you can use this endpoint to get some additional info which is not presented in /v1/credential/{id}' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential information fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential information fetched successfully': { + value: {}, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async getCredentialInfo( + @Param() params: GetCredentialParams, + @Res() response: Response, + ) { + let res: ResponseType; + + try { + const result = await this.attestationService.getCredentialInformation( + params.id, + ); + + res = { + statusCode: HttpStatus.OK, + message: 'Agent responded', + data: result, + }; + + // if (result) { + // if (result[0]) { + // res = { + // statusCode: HttpStatus.OK, + // message: 'Credential information fetched successfully', + // data: { + // count: result[0], + // records: result[1], + // }, + // }; + // } else { + // response.status(HttpStatus.NOT_FOUND); + // res = { + // statusCode: HttpStatus.NOT_FOUND, + // message: 'No Data found', + // }; + // } + // } else { + // response.status(HttpStatus.INTERNAL_SERVER_ERROR); + // res = { + // statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + // message: 'Something went wrong please try again', + // }; + // } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } + + @Version(['1']) + @Delete('delete-credential/:id') + @ApiOperation({ + summary: 'Delete credential by id', + description: 'This call provides the capability to delete credential (request/offer/proposal) by provided credential id' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential deleted successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential deleted successfully': { + value: { + statusCode: HttpStatus.OK, + message: 'Credential deleted successfully', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async deleteCredential( + @Param() params: GetCredentialParams, + @Res() response: Response, + ) { + let res: ResponseType; + + try { + const result = await this.attestationService.deleteCredential(params.id); + + if (result.reason || result.message) { + res = { + statusCode: result.status || HttpStatus.INTERNAL_SERVER_ERROR, + message: result.message || result.reason, + }; + } else { + res = { + statusCode: HttpStatus.OK, + message: 'Credential deleted successfully', + data: result, + }; + } + + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } + + @Version(['1']) + @Get('credential') + @ApiOperation({ + summary: 'Fetch a list of credentials', + description: 'This call provides the capability to search credentials by using pagination and filter parameters to select credentials. This call returns a list of credentials and overall count of records. Filter supports following parameters: page, pageSize, isReceived, threadId, state, credDefId, createdDateStart, createdDateEnd, updatedDateStart, updatedDateEnd, expirationDateStart, expirationDateEnd, connectionId, principalDid' + }) + @ApiQuery({ name: 'page', required: false }) + @ApiQuery({ name: 'pageSize', required: false }) + @ApiQuery({ name: 'isReceived', required: false }) + @ApiQuery({ name: 'threadId', required: false }) + @ApiQuery({ name: 'state', required: false }) + @ApiQuery({ name: 'credDefId', required: false }) + @ApiQuery({ name: 'createdDateStart', required: false }) + @ApiQuery({ name: 'createdDateEnd', required: false }) + @ApiQuery({ name: 'updatedDateStart', required: false }) + @ApiQuery({ name: 'updatedDateEnd', required: false }) + @ApiQuery({ name: 'expirationDateStart', required: false }) + @ApiQuery({ name: 'expirationDateEnd', required: false }) + @ApiQuery({ name: 'connectionId', required: false }) + @ApiQuery({ name: 'principalDid', required: false }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential fetched successfully': { + value: { + statusCode: 200, + message: 'Credential fetched successfully', + data: { + count: 87, + records: [ + { + id: '14875384', + credentialId: 'c566907d', + credDefId: '7KuDTpQh3GJ', + threadId: 'e271b1a0', + state: 'proposal-sent', + principalDid: 'KGaeQVaF', + connectionId: '12cd39de', + createdDate: '1970-01-01T00:00:09.761Z', + updatedDate: '1970-01-01T00:00:09.761Z', + expirationDate: '2070-01-01T00:00:09.756Z', + } + ] + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found': { + value: { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async getCredentialList( + @Query() query: GetCredentialQuery, + @Res() response: Response, + ) { + let res: ResponseType; + + try { + if (query.threadId) { + const result = await this.attestationService.findCredentialByThreadId( + query.threadId, + ); + if (result) { + res = { + statusCode: HttpStatus.OK, + message: 'Credential fetch successfully', + data: { + count: 1, + results: [result], + }, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + } else { + const result = await this.attestationService.findCredential( + query.pageSize ? parseInt(query.pageSize, 10) : 10, + query.page ? parseInt(query.page, 10) : 0, + query.isReceived === 'true', + query.state ? query.state : false, + query.credDefId ? query.credDefId : false, + query.createdDateStart ? query.createdDateStart : false, + query.createdDateEnd ? query.createdDateEnd : false, + query.updatedDateStart ? query.updatedDateStart : false, + query.updatedDateEnd ? query.updatedDateEnd : false, + query.expirationDateStart ? query.expirationDateStart : false, + query.expirationDateEnd ? query.expirationDateEnd : false, + query.connectionId ? query.connectionId : false, + query.principalDid ? query.principalDid : false, + ); + + if (result) { + if (result[0]) { + res = { + statusCode: HttpStatus.OK, + message: 'Credential fetch successfully', + data: { + count: result[0], + records: result[1], + }, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + } else { + response.status(HttpStatus.INTERNAL_SERVER_ERROR); + res = { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + message: 'Something went wrong please try again', + }; + } + } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } + + @Version(['1']) + @Get('credential/:id') + @ApiOperation({ + summary: 'Fetch credential by id', + description: 'This call provides the capability to get credential data by providing credential id. The credential definition data is the same which is returned from /v1/credential endpoint and contains generic information about credential like credentialId, credDefId, threadId, state, principalDid, connectionId, createdDate, updatedDate, expirationDate' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential fetched successfully': { + value: { + statusCode: 200, + message: 'Credential fetched successfully', + data: { + id: '14875384', + credentialId: 'c566907d', + credDefId: '7KuDTpQh3GJ', + threadId: 'e271b1a0', + state: 'proposal-sent', + principalDid: 'KGaeQVaF', + connectionId: '12cd39de', + createdDate: '1970-01-01T00:00:09.761Z', + updatedDate: '1970-01-01T00:00:09.761Z', + expirationDate: '2070-01-01T00:00:09.756Z', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found': { + value: { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async getCredential( + @Param() params: GetCredentialParams, + @Query() query: GetCredentialQuery, + @Res() response: Response, + ) { + let res: ResponseType; + + try { + const result = await this.attestationService.findCredentialById( + params.id, + ); + if (result) { + res = { + statusCode: HttpStatus.OK, + message: 'Credential fetched successfully', + data: result, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/offerMemberShipCredentials`, + }) + async offerMemberShipCredentials(data: { + status: string; + connectionId: string; + theirLabel: string; + participantDID: string; + theirDid: string; + }) { + logger.info('Inside OfferMembership Credential'); + try { + const credentialsType = + await this.attestationService.getPrincipalMemberShipCredentials({ + type: AttestationService.principalMemberCredential, + }); + logger.info(JSON.stringify(credentialsType)); + if (credentialsType) { + /* Husky restructure this line every time + and lint does not allow more then 100 characters on same line. + */ + + // eslint-disable-next-line max-len + const [, [credentialDef]] = + await this.credentialDefService.findCredentialDefBySchemaIdDesc({ + schemaID: credentialsType?.schemaId, + }); + logger.info(`credentialDef ${JSON.stringify(credentialDef)}`); + + const schemaDetails = await this.schemaService.findBySchemaId( + credentialDef.schemaID, + ); + + const attributes: { name: string; value: string }[] = []; + + const schemaAttributes = schemaDetails?.attribute; + + const userDetails = await this.userInfoService.getUserInfo( + data.connectionId, + ); + + const userInfo = userDetails + ? JSON.parse(JSON.stringify(userDetails.userInfo)) + : { + issuerDID: data.participantDID, + subjectDID: data.theirDid, + email: data.theirLabel, + }; + + if (userInfo && schemaAttributes && schemaAttributes.length > 0) { + userInfo.issuerDID = data.participantDID; + userInfo.subjectDID = data.theirDid; + + for (let i = 0; i < schemaAttributes.length; i += 1) { + const attribute: any = schemaAttributes[i]; + + if (attribute.name in userInfo) { + attributes.push({ + name: attribute.name, + value: userInfo[attribute.name], + }); + } else if (attribute.name !== 'expirationDate') { + attributes.push({ + name: attribute.name, + value: attribute.name === 'email' ? data.theirLabel : 'NA', + }); + } + } + } + + await this.userInfoService.updateUserInfo({ + connectionId: data.connectionId, + credentialDefinitionId: credentialDef.credDefId, + status: 'issued', + userInfo: {}, + }); + + const res: ResponseType = { + statusCode: HttpStatus.OK, + message: 'Membership Credentials issued.', + data: await this.attestationService.issueMemberCredentials({ + ...data, + credDefId: credentialDef.credDefId, + attributes, + autoAcceptCredential: userDetails?.autoAcceptCredential as string, + }), + }; + logger.info(JSON.stringify(res)); + return res; + } + const res: ResponseType = { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + message: 'Schema Id Not defined please connect admin.', + }; + return res; + } catch (error) { + logger.error(error); + let res: ResponseType; + + if (error instanceof PreconditionFailedException) { + res = { + statusCode: error.getStatus(), + message: error?.message || 'Something went wrong. Please try again', + }; + } else { + res = { + statusCode: HttpStatus.INTERNAL_SERVER_ERROR, + message: 'Something went wrong. Please try again', + }; + } + return res; + } + } + + @Patch('updateSchemaIdByType') + @ApiQuery({ name: 'type', required: true }) + @ApiBody({ type: UpdateSchemaIdByTypeDto }) + @ApiOperation({ + summary: 'Update schemaId in CredentialsType', + description: 'This call provides the capability to update mapping between schema and type.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'schemaId updated in CredentialsType', + content: { + 'application/json': { + schema: {}, + examples: { + 'schemaId updated in CredentialsType': { + value: { + statusCode: 200, + message: 'schemaId updated in CredentialsType', + data: { + id: 'd6ef2d010', + type: 'principalMemberCredential', + schemaId: '7KuDTpQh3GJ7Gp6kErpWvM:2:principalTestSchema:1.0', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Not Found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Not Found': { + value: { + status: HttpStatus.NOT_FOUND, + message: 'Not Found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async updateSchemaIdByType( + @Body() body: { schemaId: string }, + @Query() query: { type: string }, + ) { + try { + const res: ResponseType = { + statusCode: HttpStatus.OK, + message: 'schemaId updated in CredentialsType', + data: await this.attestationService.updateSchemaByType( + query.type, + body, + ), + }; + return res; + } catch (error: any) { + if (error.code === PrismaErrorCode.RECORD_NOT_FOUND) { + throw new NotFoundException(error.message); + } + throw new InternalServerErrorException(error); + } + } + + @Post('credentialType') + @ApiOperation({ + summary: 'Create new CredentialType', + description: 'This call provides the capability to create mapping between schema and type.' + }) + @ApiBody({ type: CredentialTypeDto }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'schemaId added in CredentialsType of membership credentials.', + content: { + 'application/json': { + schema: {}, + examples: { + 'schemaId added in CredentialsType of membership credentials.': { + value: { + statusCode: 201, + message: + 'schemaId added in CredentialsType of membership credentials.', + data: { + id: 'd6ef2d01', + type: 'principalMemberCredential', + schemaId: '7KuDTpQh3GJ7Gp6kErpWvM:2:principalTestSchema:1.0', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async createCredentialType(@Body() body: CredentialTypeDto) { + try { + const res: ResponseType = { + statusCode: HttpStatus.CREATED, + message: 'schemaId added in CredentialsType of membership credentials.', + data: await this.attestationService.createCredentialsType(body), + }; + return res; + } catch (error) { + throw new InternalServerErrorException(error); + } + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/getIssueCredentials`, + }) + async getIssueCredentials(data: GetIssueCredentialsDto) { + return this.attestationService.getIssueCredentials(data); + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/getCredentialsTypeDetails`, + }) + async getCredentialsTypeDetails(data: { type: string }) { + let res; + + const credentialsType = + await this.attestationService.getPrincipalMemberShipCredentials(data); + + if (credentialsType?.schemaId) { + const getSchema = + await this.attestationService.getSchemaAndAttributesBySchemaIDFromLedger( + credentialsType.schemaId, + ); + const attributes: Array<{ name: string }> = []; + getSchema.attrNames.forEach((attr: string) => { + attributes.push({ name: attr }); + }); + + res = { + schema: { + schemaID: credentialsType?.schemaId, + attribute: attributes, + }, + }; + } + return res; + } + + @Get('credentialType') + @ApiOperation({ + summary: 'Fetch CredentialType contains schemaId and attributes by type', + description: 'This call provides the capability to get schema id and its attributes by provided type' + }) + @ApiQuery({ name: 'type', required: true }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Credential type retrieved successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential type retrieved successfully': { + value: { + schema: { + schemaID: '7KuDTpQh3GJ7Gp6kErpWvM:2:principalTestSchema:1.0', + attribute: [ + 'prcPreferredUsername', + 'issuerDID', + 'prcGender', + 'prcBirthdate', + 'expirationDate', + 'prcLastName', + 'prcFirstName', + 'email', + 'prcMiddleName', + 'subjectDID', + 'auth_time', + 'email_verified', + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Credential type not found', + content: { + 'application/json': { + schema: {}, + examples: { + 'Credential type not found': { + value: undefined, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async getCredentialTypeAttributes(@Query() query: { type: string }) { + let res; + + const credentialsType = + await this.attestationService.getPrincipalMemberShipCredentials(query); + if (credentialsType?.schemaId) { + const schemaDetails: { + ver: string; + id: string; + name: string; + version: string; + attrNames: string[]; + seqNo: number; + } = await this.attestationService.getSchemaAndAttributesBySchemaIDFromLedger( + credentialsType.schemaId, + ); + res = { + schema: { + schemaID: credentialsType?.schemaId, + attribute: schemaDetails.attrNames, + }, + }; + } + return res; + } +} diff --git a/apps/attestation-manager/src/issue-credential/entities/credential.entity.ts b/apps/attestation-manager/src/issue-credential/entities/credential.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..8d6043db10befccf00ce113e18cec42ee6bd229e --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/credential.entity.ts @@ -0,0 +1,37 @@ +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class CredentialDto { + @IsString() + @IsNotEmpty() + credentialId: string; + + @IsString() + @IsNotEmpty() + credDefId: string; + + @IsString() + schemaId?: string; + + @IsString() + @IsNotEmpty() + participantId?: string; + + @IsString() + @IsNotEmpty() + principalDid?: string; + + @IsString() + @IsNotEmpty() + state: string; + + @IsString() + @IsNotEmpty() + threadId: string; + + @IsString() + @IsNotEmpty() + connectionId: string; + + @IsString() + expirationDate?: Date | null; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/credential.state.entity.ts b/apps/attestation-manager/src/issue-credential/entities/credential.state.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..845fc48b2fa41758b07e5059b373d8bded2f1072 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/credential.state.entity.ts @@ -0,0 +1,31 @@ +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class CredentialStateDto { + @IsString() + @IsNotEmpty() + id: string; + + @IsNotEmpty() + metadata: { + '_internal/indyCredential': { + credentialDefinitionId: string; + schemaId: string; + }; + }; + + @IsString() + @IsNotEmpty() + credDefId: string; + + @IsString() + @IsNotEmpty() + state: string; + + @IsString() + @IsNotEmpty() + threadId: string; + + @IsString() + @IsNotEmpty() + connectionId: string; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/credentialType.entity.ts b/apps/attestation-manager/src/issue-credential/entities/credentialType.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..59d79ffac3645c19e2ee1839fa8732e9ba36c658 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/credentialType.entity.ts @@ -0,0 +1,17 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class CredentialTypeDto { + @IsString() + id?: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + type: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + schemaId: string; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/entity.ts b/apps/attestation-manager/src/issue-credential/entities/entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..72cdea6be0b82ee339a75eb2a013392064b6e97d --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/entity.ts @@ -0,0 +1,38 @@ +// eslint-disable-next-line max-classes-per-file +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsNotEmpty } from 'class-validator'; + +class CredentialPreviewAttributes { + @IsString() + @IsNotEmpty() + @ApiProperty() + name: string; + + @IsString() + @ApiProperty() + value: string; +} +export default class OfferCredentialDto { + @IsString() + @IsNotEmpty() + @ApiProperty() + connectionId: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + credentialDefinitionId: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + comment: string; + + @ApiProperty({ type: [CredentialPreviewAttributes] }) + attributes: CredentialPreviewAttributes[]; + + @IsString() + @IsNotEmpty() + @ApiProperty() + autoAcceptCredential: string; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/get-issue-credentials.dto.ts b/apps/attestation-manager/src/issue-credential/entities/get-issue-credentials.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..efd99a2d7916e4211fee02f96a7f2cbb4ea2e584 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/get-issue-credentials.dto.ts @@ -0,0 +1,6 @@ +import { IsString } from 'class-validator'; + +export default class GetIssueCredentialsDto { + @IsString() + connectionId: string; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/get.credential.params.ts b/apps/attestation-manager/src/issue-credential/entities/get.credential.params.ts new file mode 100644 index 0000000000000000000000000000000000000000..12c0cdfee2e633c09b1f239cf9e08f3844c67431 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/get.credential.params.ts @@ -0,0 +1,6 @@ +import { IsString } from 'class-validator'; + +export default class GetCredentialParams { + @IsString() + id: string; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/get.credential.query.ts b/apps/attestation-manager/src/issue-credential/entities/get.credential.query.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f990415c2b559cef3cd4a431621162dbcfa7c80 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/get.credential.query.ts @@ -0,0 +1,45 @@ +import { IsBoolean, IsString, IsDateString } from 'class-validator'; + +export default class GetCredentialQuery { + @IsString() + page?: string; + + @IsString() + pageSize?: string; + + @IsString() + threadId?: string; + + @IsBoolean() + isReceived?: boolean | string; + + @IsString() + state?: string; + + @IsString() + credDefId?: string; + + @IsDateString() + createdDateStart?: string; + + @IsDateString() + createdDateEnd?: string; + + @IsDateString() + updatedDateStart?: string; + + @IsDateString() + updatedDateEnd?: string; + + @IsDateString() + expirationDateStart?: string; + + @IsDateString() + expirationDateEnd?: string; + + @IsString() + connectionId?: string; + + @IsString() + principalDid?: string; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/propose-credential.dto.ts b/apps/attestation-manager/src/issue-credential/entities/propose-credential.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..c1cc2ee970930d108709f6446a01dbd893fed815 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/propose-credential.dto.ts @@ -0,0 +1,35 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class ProposeCredentialDto { + @IsString() + @IsNotEmpty() + @ApiProperty() + connectionId: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + credentialDefinitionId: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + comment: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + credentialProposal: { + '@type': string; + attributes: { + name: string; + value: string; + }[]; + }; + + @IsString() + @IsNotEmpty() + @ApiProperty() + autoAcceptCredential: string; +} diff --git a/apps/attestation-manager/src/issue-credential/entities/updatecredDefIdByType.entity.ts b/apps/attestation-manager/src/issue-credential/entities/updatecredDefIdByType.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..d141e87dce7ad1ba87f99241b5a321e7cf87b4dd --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/entities/updatecredDefIdByType.entity.ts @@ -0,0 +1,9 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class UpdateSchemaIdByTypeDto { + @IsString() + @IsNotEmpty() + @ApiProperty() + schemaId: string; +} diff --git a/apps/attestation-manager/src/issue-credential/module.ts b/apps/attestation-manager/src/issue-credential/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..cec3e78ffb61a1c927cc2c9ef0e13f23ec96b278 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/module.ts @@ -0,0 +1,41 @@ +import SchemasService from '@src/schemas/services/service'; +import CredentialDefService from '@src/credentialDef/services/service'; +import { Module } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import AttestationService from '@src/issue-credential/services/service'; +import AttestationController from '@src/issue-credential/controller/controller'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import NatsClientService from '@src/client/nats.client'; +import RestClientService from '@src/client/rest.client'; +import config from '@config/config'; +import TSAClientService from '@src/client/tsa.client'; +import UserInfoService from '@userInfo/services/service'; + +@Module({ + imports: [ + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + ], + controllers: [AttestationController], + providers: [ + AttestationService, + PrismaService, + NatsClientService, + RestClientService, + CredentialDefService, + SchemasService, + TSAClientService, + UserInfoService, + ], +}) +export default class AttestationModule {} diff --git a/apps/attestation-manager/src/issue-credential/repository/credential.repository.ts b/apps/attestation-manager/src/issue-credential/repository/credential.repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..3ba8644ce11ea1b76b9f6fccff2b8e9482b125c0 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/repository/credential.repository.ts @@ -0,0 +1,88 @@ +import { Injectable } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export default class CredentialRepository { + constructor(private readonly prismaService: PrismaService) {} + + async createCredential(data: Prisma.CredentialCreateInput) { + const credential = await this.prismaService.credential.create({ data }); + + const credDef = await this.prismaService.credentialDef.findFirst({ + where: { credDefId: data.credDefId }, + }); + + if (!credDef) { + return credential; + } + + await this.prismaService.credentialDef.update({ + where: { + credDefId: data.credDefId, + }, + data: { + credentials: { + connect: { + id: credential.id, + }, + }, + }, + }); + + return credential; + } + + async findUniqueCredential(params: { + where: Prisma.CredentialWhereUniqueInput; + }) { + const { where } = params; + return this.prismaService.credential.findUnique({ + where, + }); + } + + async updateCredential(params: { + where: Prisma.CredentialWhereUniqueInput; + data: Prisma.CredentialUpdateInput; + }) { + const { where, data } = params; + return this.prismaService.credential.update({ + data, + where, + }); + } + + async findCredential(params: { + skip?: number; + take?: number; + cursor?: Prisma.CredentialWhereUniqueInput; + where?: Prisma.CredentialWhereInput; + orderBy?: Prisma.CredentialOrderByWithRelationInput; + }) { + const { skip, take, cursor, where, orderBy } = params; + + return this.prismaService.$transaction([ + this.prismaService.credential.count({ + where: { + ...where, + }, + }), + this.prismaService.credential.findMany({ + skip, + take, + cursor, + where, + orderBy, + }), + ]); + } + + async deleteCredential(params: { where: Prisma.CredentialWhereUniqueInput }) { + const { where } = params; + + return this.prismaService.credential.delete({ + where, + }); + } +} diff --git a/apps/attestation-manager/src/issue-credential/repository/credentialType.repository.ts b/apps/attestation-manager/src/issue-credential/repository/credentialType.repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..3f6161db90ead63936f93dc69aca0bea6dd3c7cd --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/repository/credentialType.repository.ts @@ -0,0 +1,100 @@ +import { Injectable } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export default class CredentialsTypeRepository { + constructor(private readonly prismaService: PrismaService) {} + + async createCredentialsType(data: Prisma.CredentialsTypeCreateInput) { + return this.prismaService.credentialsType.create({ data }); + } + + async createOrUpdateCredentialsType(data: Prisma.CredentialsTypeCreateInput) { + const credentialType = await this.prismaService.credentialsType.findFirst({ + where: { + type: { + equals: data.type, + mode: 'insensitive', + }, + }, + }); + + if (credentialType) { + return this.prismaService.credentialsType.update({ + where: { + id: credentialType.id, + }, + data, + }); + } + const credentialTypeSchemaCheck = + await this.prismaService.credentialsType.findFirst({ + where: { + schemaId: { + equals: data.schemaId, + }, + }, + }); + if (credentialTypeSchemaCheck) { + return this.prismaService.credentialsType.update({ + where: { + id: credentialTypeSchemaCheck.id, + }, + data, + }); + } + + return this.prismaService.credentialsType.create({ + data, + }); + } + + async findUniqueCredentialsType(data: { type: string }) { + return this.prismaService.credentialsType.findFirst({ + where: { + type: { + equals: data.type, + mode: 'insensitive', + }, + }, + }); + } + + // TODO check + async updateCredentialsType(params: { + where: Prisma.CredentialsTypeWhereUniqueInput; + data: Prisma.CredentialsTypeUpdateInput; + }) { + const { where, data } = params; + return this.prismaService.credentialsType.update({ + data, + where, + }); + } + + async findCredentialsType(params: { + skip?: number; + take?: number; + cursor?: Prisma.CredentialsTypeWhereUniqueInput; + where?: Prisma.CredentialsTypeWhereInput; + orderBy?: Prisma.CredentialsTypeOrderByWithRelationInput; + }) { + const { skip, take, cursor, where, orderBy } = params; + + return this.prismaService.$transaction([ + this.prismaService.credentialsType.count({ + where: { + ...where, + }, + }), + this.prismaService.credentialsType.findMany({ + skip, + take, + cursor, + where, + orderBy, + }), + ]); + } +} diff --git a/apps/attestation-manager/src/issue-credential/services/service.ts b/apps/attestation-manager/src/issue-credential/services/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..1994ac4252c3bf72b3158c34a5da5901f9cd7508 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/services/service.ts @@ -0,0 +1,483 @@ +import { + BadRequestException, + Injectable, + PreconditionFailedException, +} from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import logger from '@utils/logger'; +import CredentialRepository from '@issueCredential/repository/credential.repository'; +import CredentialDto from '@issueCredential/entities/credential.entity'; +import { Credential, Prisma } from '@prisma/client'; +import NatsClientService from '@src/client/nats.client'; +import OfferCredentialDto from '@issueCredential/entities/entity'; +import GetIssueCredentialsDto from '@src/issue-credential/entities/get-issue-credentials.dto'; +import CredentialsTypeRepository from '@issueCredential/repository/credentialType.repository'; +import pagination from '@utils/pagination'; +import Utils from '@utils/common'; +import CredentialDefService from '@src/credentialDef/services/service'; +import RestClientService from '@src/client/rest.client'; +import { ConfigService } from '@nestjs/config'; +import CredentialTypeDto from '@issueCredential/entities/credentialType.entity'; +import ProposeCredentialDto from '@issueCredential/entities/propose-credential.dto'; +import TSAClientService from '@src/client/tsa.client'; +import { TSAService } from '@src/common/constants'; + +@Injectable() +export default class AttestationService { + private credentialRepository: CredentialRepository; + + private credentialRepositoryType: CredentialsTypeRepository; + + constructor( + private readonly credDefService: CredentialDefService, + private readonly prismaService: PrismaService, + private readonly restClient: RestClientService, + private readonly natsClient: NatsClientService, + private readonly tsaClient: TSAClientService, + private readonly configService: ConfigService, + ) { + this.credentialRepository = new CredentialRepository(this.prismaService); + this.credentialRepositoryType = new CredentialsTypeRepository( + this.prismaService, + ); + } + + static readonly status = { + OFFER_SENT: 'offer-sent', + PROPOSAL_SENT: 'proposal-sent', + REQUEST_RECEIVED: 'request-received', + DONE: 'done', + OFFER_RECEIVED: 'offer-received', + }; + + static readonly principalMemberCredential = 'principalMemberCredential'; + + static readonly connectionStatus = { + TRUSTED: 'trusted', + }; + + async createOfferCredential( + credentialRequest: OfferCredentialDto, + isTrustedConnectionRequired = false, + ) { + // TODO is it a correct conditions here? Should not be just isTrustedConnectionRequired? + if (!isTrustedConnectionRequired) { + const connection = await this.getConnectionByID( + credentialRequest.connectionId, + ); + + logger.info(`connection ${JSON.stringify(connection)}`); + + if (connection?.status !== AttestationService.connectionStatus.TRUSTED) { + return null; + } + } + + const agentUrl = this.configService.get('agent.AGENT_URL'); + const credentialRequestObj = { ...credentialRequest }; + + const credDef = await this.findCredDef( + credentialRequestObj.credentialDefinitionId, + ); + + const expirationDate = Utils.calculateExpiry(credDef.expiryHours); + + if (expirationDate) { + credentialRequestObj.attributes.push({ + name: 'expirationDate', + value: expirationDate.toString(), + }); + } + + const schemaDetails = await this.getSchemaAndAttributesBySchemaIDFromLedger( + credDef.schemaID, + ); + logger.info( + `schemaDetails?.attrNames?.length ${schemaDetails?.attrNames?.length}`, + ); + logger.info( + `credentialRequest.preview.attributes.length ${credentialRequest.attributes.length}`, + ); + + if ( + schemaDetails?.attrNames?.length !== credentialRequest.attributes.length + ) { + throw new BadRequestException('Invalid attributes'); + } + + logger.info(`offer-credential payload: ${credentialRequestObj}`); + + try { + const credentialRequestPayload = { + connectionId: credentialRequestObj.connectionId, + credentialDefinitionId: credentialRequestObj.credentialDefinitionId, + comment: credentialRequestObj.comment, + preview: { + '@type': + 'https://didcomm.org/issue-credential/1.0/credential-preview', + attributes: credentialRequestObj.attributes, + }, + autoAcceptCredential: credentialRequestObj.autoAcceptCredential, + }; + + logger.info( + `***Offer Credential Payload*** ${JSON.stringify( + credentialRequestPayload, + )}`, + ); + + const responseData = await this.restClient.post( + `${agentUrl}/credentials/offer-credential`, + credentialRequestPayload, + ); + logger.info(responseData); + return responseData; + } catch (error) { + logger.error(JSON.stringify(error)); + throw new Error(JSON.stringify(error)); + } + } + + async proposeCredential(connectionCreate: ProposeCredentialDto) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const connectionCreateObj = { ...connectionCreate }; + try { + const responseData = await this.restClient.post( + `${agentUrl}/credentials/propose-credential`, + connectionCreateObj, + ); + logger.info(responseData); + return responseData; + } catch (error) { + logger.error(JSON.stringify(error)); + throw new Error(JSON.stringify(error)); + } + } + + async acceptRequestCredential(credentialId: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + + const responseData = await this.restClient.post( + `${agentUrl}/credentials/${credentialId}/accept-request`, + {}, + ); + logger.info(responseData); + return responseData; + } + + async acceptProposeCredential(credentialId: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.post( + `${agentUrl}/credentials/${credentialId}/accept-proposal`, + {}, + ); + logger.info(responseData); + return responseData; + } + + async acceptCredentialOffer(credentialId: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.post( + `${agentUrl}/credentials/${credentialId}/accept-offer`, + {}, + ); + logger.info(responseData); + return responseData; + } + + async acceptCredential(credentialId: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.post( + `${agentUrl}/credentials/${credentialId}/accept-credential`, + {}, + ); + logger.info(responseData); + return responseData; + } + + async createCredential(credential: CredentialDto) { + const connection = await this.getConnectionByID(credential.connectionId); + + const credDef = await this.findCredDef(credential.credDefId); + + logger.info(`credDef.expiryHours ${credDef.expiryHours}`); + const expirationDate = Utils.calculateExpiry(credDef.expiryHours); + logger.info(`expirationDate ${expirationDate}`); + const tempCredential = credential; + delete tempCredential.schemaId; + + return this.credentialRepository.createCredential({ + ...tempCredential, + ...(expirationDate !== 'NA' && { expirationDate }), + principalDid: connection.theirDid, + }); + } + + async getConnectionByID(connectionID: string) { + const connection = await this.natsClient.getConnectionById(connectionID); + return connection; + } + + async updateCredential(credential: CredentialDto) { + return this.credentialRepository.updateCredential({ + where: { credentialId: credential.credentialId }, + data: { + state: credential.state, + updatedDate: new Date(), + }, + }); + } + + findCredentialById(credentialId: string) { + const where: Prisma.CredentialWhereUniqueInput = { credentialId }; + return this.credentialRepository.findUniqueCredential({ where }); + } + + findCredentialByThreadId(threadId: string) { + const where: Prisma.CredentialWhereUniqueInput = { threadId }; + return this.credentialRepository.findUniqueCredential({ where }); + } + + async findCredential( + pageSize: number, + page: number, + isReceived: boolean, + state?: string | false, + credDefId?: string | false, + createdDateStart?: string | false, + createdDateEnd?: string | false, + updatedDateStart?: string | false, + updatedDateEnd?: string | false, + expirationDateStart?: string | false, + expirationDateEnd?: string | false, + connectionId?: string | false, + principalDid?: string | false, + ) { + let query: { + skip?: number; + take?: number; + cursor?: Prisma.CredentialWhereUniqueInput; + where: Prisma.CredentialWhereInput; + orderBy?: Prisma.CredentialOrderByWithRelationInput; + } = { + where: {}, + }; + + if (state) { + const states: string[] = state.split(','); + query.where.state = { in: states }; + } + if (credDefId) { + query.where.credDefId = credDefId; + } + if (createdDateStart) { + query.where.createdDate = { gte: createdDateStart }; + } + if (createdDateEnd) { + // eslint-disable-next-line prefer-object-spread + query.where.createdDate = Object.assign({}, query.where.createdDate, { + lte: createdDateEnd, + }); + } + if (updatedDateStart) { + query.where.updatedDate = { gte: updatedDateStart }; + } + if (updatedDateEnd) { + // eslint-disable-next-line prefer-object-spread + query.where.updatedDate = Object.assign({}, query.where.updatedDate, { + lte: updatedDateEnd, + }); + } + if (expirationDateStart) { + query.where.expirationDate = { gte: expirationDateStart }; + } + if (expirationDateEnd) { + // eslint-disable-next-line prefer-object-spread + query.where.expirationDate = Object.assign( + {}, + query.where.expirationDate, + { lte: expirationDateEnd }, + ); + } + if (connectionId) { + query.where.connectionId = connectionId; + } + if (principalDid) { + query.where.principalDid = principalDid; + } + + if (isReceived) { + // TODO we need to check the case when first and second OCMs can re-use the same connection + // and can issue credentials to each other. Will this function returns correct results for + // every OCM? + const receivedConnections = + await this.natsClient.getReceivedConnections(); + if ( + Array.isArray(receivedConnections) && + receivedConnections.length > 0 + ) { + const receivedConnectionIds = receivedConnections.map( + (connection) => connection.connectionId, + ); + + query.where.connectionId = { in: receivedConnectionIds }; + } + } + + query = { ...query, ...pagination(pageSize, page) }; + + return this.credentialRepository.findCredential(query); + } + + async issueMemberCredentials(data: { + status: string; + connectionId: string; + theirLabel: string; + participantDID: string; + theirDid: string; + credDefId: string; + attributes: { name: string; value: string }[]; + autoAcceptCredential: string; + }) { + logger.info(JSON.stringify(data)); + const payload: OfferCredentialDto = { + connectionId: data.connectionId, + credentialDefinitionId: data.credDefId, + comment: 'Created', + attributes: data.attributes, + autoAcceptCredential: data.autoAcceptCredential, + }; + logger.info(JSON.stringify(payload)); + + const tsaResponse = await this.tsaClient.getPolicy( + `${this.configService.get('TSA_URL')}/${ + TSAService.PRINCIPAL_CREDENTIAL_REQUEST + }/1.0/evaluation`, + ); + + if (tsaResponse?.success && !tsaResponse.returnData) { + throw new PreconditionFailedException('TSA ERROR!'); + } + + const result = await this.createOfferCredential(payload, true); + logger.info(JSON.stringify(result)); + return result; + } + + getPrincipalMemberShipCredentials(data: { type: string }) { + return this.credentialRepositoryType.findUniqueCredentialsType(data); + } + + async getSchemaAndAttributesBySchemaIDFromLedger(schemaID: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.get( + `${agentUrl}/schemas/${schemaID}`, + ); + + if (!responseData?.id) { + throw new BadRequestException('Invalid schema ID'); + } + + return responseData; + } + + updateSchemaByType(type: string, body: { schemaId: string }) { + return this.credentialRepositoryType.updateCredentialsType({ + where: { + type, + }, + data: { + schemaId: body.schemaId, + }, + }); + } + + async getIssueCredentials(data: GetIssueCredentialsDto) { + return this.credentialRepository.findCredential({ + where: { + connectionId: data.connectionId, + }, + }); + } + + async getCredentialInformation(credentialId: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.get( + `${agentUrl}/credentials/${credentialId}`, + ); + + if (!responseData?.id) { + throw new BadRequestException('Invalid credential ID'); + } + + return responseData; + } + + async deleteCredential(credentialId: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.delete( + `${agentUrl}/credentials/${credentialId}`, + ); + + await this.credentialRepository.deleteCredential({ + where: { + credentialId, + }, + }); + + return responseData; + } + + createCredentialsType(credentialType: CredentialTypeDto) { + return this.credentialRepositoryType.createCredentialsType({ + type: credentialType.type, + schemaId: credentialType.schemaId, + }); + } + + connectionTrusted(connectionId: string) { + return this.natsClient.connectionTrusted(connectionId); + } + + async findCredDef(credentialDefinitionId: string) { + const credDefRes = await this.credDefService.findCredentialDefById( + credentialDefinitionId, + ); + + if (!credDefRes[0]) { + return { + expiryHours: '-1', + schemaID: '', + }; + } + + return credDefRes[1][0]; + } + + async findReceivedCredentials() { + try { + let result: Credential[] = []; + const receivedConnections = + await this.natsClient.getReceivedConnections(); + + if ( + Array.isArray(receivedConnections) && + receivedConnections.length > 0 + ) { + const receivedConnectionIds = receivedConnections.map( + (connection) => connection.connectionId, + ); + + const credentials = await this.credentialRepository.findCredential({ + where: { connectionId: { in: receivedConnectionIds } }, + }); + [, result] = credentials; + } + + return result; + } catch (error) { + logger.error(JSON.stringify(error)); + throw new Error(JSON.stringify(error)); + } + } +} diff --git a/apps/attestation-manager/src/issue-credential/tests/__mocks__/service.ts b/apps/attestation-manager/src/issue-credential/tests/__mocks__/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..74ec7e0fc166d4134975ae9485aa5d655bbd94c4 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/__mocks__/service.ts @@ -0,0 +1,21 @@ +import credentialDto from '@issueCredential/tests/stubs/credential-dto'; +import schemaAgentDto from '@src/schemas/tests/stubs/schema-from-agent-dto'; +import credentialTypeDto from '../stubs/credential-type-dto'; + +const AttestationServiceMock = jest.fn().mockReturnValue({ + createOfferCredential: jest.fn().mockReturnValue({}), + acceptRequestCredential: jest.fn().mockReturnValue({}), + findCredentialById: jest.fn().mockReturnValue(credentialDto()), + createCredentialsType: jest.fn().mockReturnValue(credentialTypeDto()), + getPrincipalMemberShipCredentials: jest + .fn() + .mockReturnValue(credentialTypeDto()), + createCredential: jest.fn().mockReturnValue(credentialDto()), + updateCredential: jest.fn().mockReturnValue(credentialDto()), + issueMemberCredentials: jest.fn().mockReturnValue({}), + getSchemaAndAttributesBySchemaIDFromLedger: jest + .fn() + .mockReturnValue(schemaAgentDto), +}); + +export default AttestationServiceMock; diff --git a/apps/attestation-manager/src/issue-credential/tests/controller.spec.ts b/apps/attestation-manager/src/issue-credential/tests/controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a8ad32bc9edc34a41ef77fe4d1725906512ff28c --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/controller.spec.ts @@ -0,0 +1,293 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import httpMocks from 'node-mocks-http'; +import AttestationController from '@issueCredential/controller/controller'; +import AttestationService from '@issueCredential/services/service'; +import AttestationServiceMock from '@issueCredential/tests/__mocks__/service'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@src/common/constants'; +import { ConfigService } from '@nestjs/config'; +import { Response } from 'express'; +import { HttpStatus } from '@nestjs/common'; +import { ResponseType } from '@src/common/response'; +import CredentialDefService from '@src/credentialDef/services/service'; +import CredentialDefServiceMock from '@src/credentialDef/tests/__mocks__/service'; +import UserInfoService from '@userInfo/services/service'; +import UserInfoServiceMock from '@userInfo/tests/__mocks__/service'; +import SchemasService from '@src/schemas/services/service'; +import SchemasServiceMock from '@src/schemas/tests/__mocks__/service'; +import credentialDto from './stubs/credential-dto'; +import GetCredentialParams from '../entities/get.credential.params'; +import GetCredentialQuery from '../entities/get.credential.query'; +import credentialTypeDto from './stubs/credential-type-dto'; +import CredentialTypeDto from '../entities/credentialType.entity'; +import CredentialStateDto from '../entities/credential.state.entity'; +import credentialStateDto from './stubs/credential-state-dto'; +import CredentialDto from '../entities/credential.entity'; + +describe('AttestationController', () => { + let attestationController: AttestationController; + let attestationService: AttestationService; + + beforeEach(async () => { + const AttestationServiceProvider = { + provide: AttestationService, + useFactory: AttestationServiceMock, + }; + + const CredentialDefServiceProvider = { + provide: CredentialDefService, + useFactory: CredentialDefServiceMock, + }; + + const UserInfoServiceProvider = { + provide: UserInfoService, + useFactory: UserInfoServiceMock, + }; + + const SchemasServiceProvider = { + provide: SchemasService, + useFactory: SchemasServiceMock, + }; + + const module: TestingModule = await Test.createTestingModule({ + imports: [ + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + }, + ]), + ], + controllers: [AttestationController], + providers: [ + AttestationServiceProvider, + CredentialDefServiceProvider, + UserInfoServiceProvider, + SchemasServiceProvider, + ConfigService, + ], + }).compile(); + + attestationController = module.get<AttestationController>( + AttestationController, + ); + attestationService = module.get<AttestationService>(AttestationService); + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(attestationController).toBeDefined(); + }); + + // describe('createOfferCredential()', () => { + // let attestationResponse: Response<string, Record<string, any>>; + + // beforeEach(async () => { + // const response = httpMocks.createResponse(); + // attestationResponse = await attestationController.createOfferCredential( + // offerCredentialDto(), + // response, + // ); + // }); + + // it('should call createOfferCredential() from service', async () => { + // expect(attestationService.createOfferCredential).toHaveBeenCalled(); + // }); + + // it('should retrieve created credential', async () => { + // expect( + // attestationService.createOfferCredential(offerCredentialDto()), + // ).not.toBe(null); + // }); + + // it(`should retrieve HTTP status created(${HttpStatus.CREATED})`, async () => { + // expect(attestationResponse?.statusCode).toEqual(HttpStatus.CREATED); + // }); + // }); + + describe('acceptOfferCredential()', () => { + let attestationResponse: ResponseType; + let query: { credentialId: string }; + + beforeEach(async () => { + query = { + credentialId: credentialDto().credentialId, + }; + + attestationResponse = await attestationController.acceptOfferCredential( + query, + ); + }); + + it('should call acceptRequestCredential() from service', async () => { + expect(attestationService.acceptRequestCredential).toHaveBeenCalled(); + }); + + it('should retrieve created credential', async () => { + expect( + attestationService.acceptRequestCredential( + query.credentialId ? query.credentialId : '', + ), + ).not.toBe(null); + }); + + it(`should retrieve HTTP status accepted(${HttpStatus.ACCEPTED})`, async () => { + expect(attestationResponse?.statusCode).toEqual(HttpStatus.ACCEPTED); + }); + }); + + describe('webHookCredentials()', () => { + let attestationResponse: ResponseType; + let body: { credentialRecord: CredentialStateDto }; + let credentialObj: CredentialDto; + + beforeEach(async () => { + body = { credentialRecord: credentialStateDto() }; + credentialObj = { + credentialId: body.credentialRecord.id, + state: body.credentialRecord.state, + connectionId: body.credentialRecord.connectionId, + credDefId: + body.credentialRecord.metadata['_internal/indyCredential'] + .credentialDefinitionId, + threadId: body.credentialRecord.threadId, + }; + + attestationResponse = await attestationController.webHookCredentials( + body, + ); + }); + + it('should call createCredential() from service', async () => { + expect(attestationService.createCredential).toHaveBeenCalled(); + }); + + it('should retrieve created credential', async () => { + expect(attestationService.createCredential(credentialObj)).toEqual( + credentialDto(), + ); + }); + + it(`should retrieve HTTP status accepted(${HttpStatus.CREATED})`, async () => { + expect(attestationResponse?.statusCode).toEqual(HttpStatus.CREATED); + }); + }); + + describe('getCredential()', () => { + let attestationResponse: Response<string, Record<string, any>>; + let params: GetCredentialParams; + let query: GetCredentialQuery; + + beforeEach(async () => { + params = { id: credentialDto().credentialId }; + query = { + state: credentialDto().state, + }; + + const response = httpMocks.createResponse(); + attestationResponse = await attestationController.getCredential( + params, + query, + response, + ); + }); + + it('should call findCredentialById() from service', async () => { + expect(attestationService.findCredentialById).toHaveBeenCalled(); + }); + + it('should retrieve credential', async () => { + expect(attestationService.findCredentialById(params.id)).toEqual( + credentialDto(), + ); + }); + + it(`should retrieve HTTP status OK(${HttpStatus.OK})`, async () => { + expect(attestationResponse?.statusCode).toEqual(HttpStatus.OK); + }); + }); + + // describe('offerMemberShipCredentials()', () => { + // let data: { + // status: string; + // connectionId: string; + // theirLabel: string; + // participantDID: string; + // theirDid: string; + // }; + // let attestationResponse: ResponseType; + + // beforeEach(async () => { + // data = { + // status: 'status', + // connectionId: credentialDto().connectionId, + // theirLabel: credentialDto().principalDid || '', + // participantDID, + // theirDid: credentialDto().principalDid || '', + // }; + + // attestationResponse = + // await attestationController.offerMemberShipCredentials(data); + // }); + + // it('should call issueMemberCredentials() from service', async () => { + // expect(attestationService.issueMemberCredentials).toHaveBeenCalled(); + // }); + + // it('should retrieve created credential', async () => { + // expect( + // attestationService.issueMemberCredentials({ + // ...data, + // credDefId: credentialDto().credDefId, + // attributes: offerCredentialDto().attributes, + // autoAcceptCredential: offerCredentialDto().autoAcceptCredential, + // }), + // ).not.toBe(null); + // }); + + // it(`should retrieve HTTP status accepted(${HttpStatus.OK})`, async () => { + // expect(attestationResponse?.statusCode).toEqual(HttpStatus.OK); + // }); + // }); + + describe('createCredentialType()', () => { + let attestationResponse: ResponseType; + let body: CredentialTypeDto; + + beforeEach(async () => { + body = credentialTypeDto(); + + attestationResponse = await attestationController.createCredentialType( + body, + ); + }); + + it('should call createCredentialsType() from service', async () => { + expect(attestationService.createCredentialsType).toHaveBeenCalled(); + }); + + it('should retrieve created updated credential-type', async () => { + expect(attestationService.createCredentialsType(body)).toEqual( + credentialTypeDto(), + ); + }); + + it(`should retrieve HTTP status created(${HttpStatus.CREATED})`, async () => { + expect(attestationResponse?.statusCode).toEqual(HttpStatus.CREATED); + }); + }); + + // describe('getCredential()', () => { + // let attestationResponse: Response<string, Record<string, any>>; + // let query: { credentialId: string; participantId: string }; + + // beforeEach(async () => { + // query = { + // credentialId: credentialDto().credentialId, + // participantId: credentialDto().participantId || '', + // }; + + // attestationResponse = await attestationController.acceptOfferCredential(query); + // }); + // }); +}); diff --git a/apps/attestation-manager/src/issue-credential/tests/module.spec.ts b/apps/attestation-manager/src/issue-credential/tests/module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..100101b7771b83b3766aed499aada2572a3c63d7 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/module.spec.ts @@ -0,0 +1,62 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import NatsClientService from '@src/client/nats.client'; +import PrismaServiceMock from '@src/prisma/tests/__mocks__/prisma.service'; +import NatsClientServiceMock from '@src/client/tests/__mocks__/nats.client'; +import RestClientService from '@src/client/rest.client'; +import RestClientServiceMock from '@src/client/tests/__mocks__/rest.client'; +import CredentialDefService from '@src/credentialDef/services/service'; +import CredentialDefServiceMock from '@src/credentialDef/tests/__mocks__/service'; +import AttestationModule from '../module'; +import AttestationService from '../services/service'; +import AttestationServiceMock from './__mocks__/service'; + +describe('AttestationModule', () => { + let attestationModule: AttestationModule; + + const AttestationServiceProvider = { + provide: AttestationService, + useFactory: AttestationServiceMock, + }; + + const CredentialDefServiceProvider = { + provide: CredentialDefService, + useFactory: CredentialDefServiceMock, + }; + + const PrismaServiceProvider = { + provide: PrismaService, + useFactory: PrismaServiceMock, + }; + + const NatsClientServiceProvider = { + provide: NatsClientService, + useFactory: NatsClientServiceMock, + }; + + const RestClientServiceProvider = { + provide: RestClientService, + useFactory: RestClientServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [HttpModule], + providers: [ + AttestationModule, + AttestationServiceProvider, + CredentialDefServiceProvider, + PrismaServiceProvider, + NatsClientServiceProvider, + RestClientServiceProvider, + ], + }).compile(); + + attestationModule = module.get<AttestationModule>(AttestationModule); + }); + + it('should be defined', () => { + expect(attestationModule).toBeDefined(); + }); +}); diff --git a/apps/attestation-manager/src/issue-credential/tests/service.spec.ts b/apps/attestation-manager/src/issue-credential/tests/service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..efc83c9871bdaec15a732dc3a0a1da5aa318852e --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/service.spec.ts @@ -0,0 +1,297 @@ +import { HttpModule } from '@nestjs/axios'; +import { Test, TestingModule } from '@nestjs/testing'; +import NatsClientService from '@src/client/nats.client'; +import NatsClientServiceMock from '@src/client/tests/__mocks__/nats.client'; +import PrismaService from '@src/prisma/prisma.service'; +import PrismaServiceMock from '@src/prisma/tests/__mocks__/prisma.service'; +import AttestationService from '@issueCredential/services/service'; +import { natsConnectionResponse } from '@src/client/tests/stubs/nats-response'; +import { ResponseType } from '@src/common/response'; +import { Credential, CredentialsType } from '@prisma/client'; +import RestClientService from '@src/client/rest.client'; +import RestClientServiceMock from '@src/client/tests/__mocks__/rest.client'; +import TSAClientServiceMock from '@src/client/tests/__mocks__/tsa.client'; +import { ConfigService } from '@nestjs/config'; +import CredentialDefService from '@src/credentialDef/services/service'; +import CredentialDefServiceMock from '@src/credentialDef/tests/__mocks__/service'; +import TSAClientService from '@src/client/tsa.client'; +import credentialDto from './stubs/credential-dto'; +import credentialsTypeDto from './stubs/credential-type-dto'; + +describe('AttestationService', () => { + let attestationService: AttestationService; + let spyGetConnectionByID: jest.SpyInstance; + + const CredentialDefServiceProvider = { + provide: CredentialDefService, + useFactory: CredentialDefServiceMock, + }; + + const PrismaServiceProvider = { + provide: PrismaService, + useFactory: PrismaServiceMock, + }; + + const NatsClientServiceProvider = { + provide: NatsClientService, + useFactory: NatsClientServiceMock, + }; + + const RestClientServiceProvider = { + provide: RestClientService, + useFactory: RestClientServiceMock, + }; + + const TSAClientServiceProvider = { + provide: TSAClientService, + useFactory: TSAClientServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [HttpModule], + providers: [ + AttestationService, + CredentialDefServiceProvider, + PrismaServiceProvider, + RestClientServiceProvider, + NatsClientServiceProvider, + TSAClientServiceProvider, + ConfigService, + ], + }).compile(); + + attestationService = module.get<AttestationService>(AttestationService); + + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(attestationService).toBeDefined(); + }); + + // describe('createOfferCredential()', () => { + // let attestationResponse: ResponseType; + + // beforeEach(async () => { + // jest + // .spyOn(attestationService, 'getSchemaAndAttributesBySchemaIDFromLedger') + // .mockImplementation( + // AttestationServiceMock().getSchemaAndAttributesBySchemaIDFromLedger, + // ); + + // attestationResponse = await attestationService.createOfferCredential( + // offerCredentialDto(), + // ); + // }); + + // it('should call post() from restClient', async () => { + // expect(RestClientServiceMock().post).toHaveBeenCalled(); + // }); + + // it('should get a response from AFJ', async () => { + // expect(attestationResponse).not.toBe(null); + // }); + // }); + + describe('acceptRequestCredential()', () => { + let attestationResponse: ResponseType; + + beforeEach(async () => { + attestationResponse = await attestationService.acceptRequestCredential( + credentialDto().credentialId, + ); + }); + + it('should call post() from restClient', async () => { + expect(RestClientServiceMock().post).toHaveBeenCalled(); + }); + + it('should get a response from AFJ', async () => { + expect(attestationResponse).not.toBe(null); + }); + }); + + describe('createCredential()', () => { + beforeEach(async () => { + spyGetConnectionByID = jest.spyOn( + attestationService, + 'getConnectionByID', + ); + + await attestationService.createCredential(credentialDto()); + }); + + it('should call getConnectionByID()', async () => { + expect(spyGetConnectionByID).toHaveBeenCalled(); + }); + + it('should call create() from PrismaService.credential', async () => { + expect(PrismaServiceMock().credential.create).toHaveBeenCalled(); + }); + }); + + describe('getConnectionByID()', () => { + let attestationResponse: ResponseType; + + beforeEach(async () => { + attestationResponse = await attestationService.getConnectionByID( + credentialDto().connectionId, + ); + }); + + it('should call getConnectionById() from NatsClientService', async () => { + expect(NatsClientServiceMock().getConnectionById).toHaveBeenCalled(); + }); + + it('should receive connection details from NatsClientService', async () => { + expect(attestationResponse).toEqual(natsConnectionResponse); + }); + }); + + describe('updateCredential()', () => { + let attestationResponse: Credential; + + beforeEach(async () => { + attestationResponse = await attestationService.updateCredential( + credentialDto(), + ); + }); + + it('should call update() from PrismaService.credential', async () => { + expect(PrismaServiceMock().credential.update).toHaveBeenCalled(); + }); + + it('should retreive updated credential', async () => { + expect(attestationResponse).toEqual(credentialDto()); + }); + }); + + describe('findCredentialById()', () => { + let attestationResponse: Credential | null; + let id: string; + + beforeEach(async () => { + id = credentialDto().credDefId; + + attestationResponse = await attestationService.findCredentialById(id); + }); + + it('should call findUnique() from PrismaService.credential', async () => { + expect(PrismaServiceMock().credential.findUnique).toHaveBeenCalled(); + }); + + it('should retrieve schema by ID', async () => { + expect(attestationResponse).toEqual(credentialDto()); + }); + }); + + describe('findCredential()', () => { + let attestationResponse: Array<number | Credential[]>; + + beforeEach(async () => { + attestationResponse = await attestationService.findCredential( + 10, + 10, + false, + false, + false, + false, + false, + false, + false, + false, + false, + ); + }); + + it('should call findMany() from PrismaService.credential', async () => { + expect(PrismaServiceMock().credential.findMany).toHaveBeenCalled(); + }); + + it('should call count() from PrismaService.credential', async () => { + expect(PrismaServiceMock().credential.count).toHaveBeenCalled(); + }); + + it('should call $transaction() from PrismaService', async () => { + expect(PrismaServiceMock().$transaction).toHaveBeenCalled(); + }); + + it('should retrieve schema by ID', async () => { + expect(attestationResponse).toEqual([1, [credentialDto()]]); + }); + }); + + // describe('issueMemberCredentials()', () => { + // let attestationResponse: any; + + // beforeEach(async () => { + // spyCreateOfferCredential = jest.spyOn( + // attestationService, + // 'createOfferCredential', + // ); + + // attestationResponse = await attestationService.issueMemberCredentials({ + // status: credentialDto().state, + // connectionId: credentialDto().connectionId, + // theirLabel: credentialDto().principalDid || '', + // participantDID, + // credDefId: credentialDto().credDefId, + // theirDid: credentialDto().principalDid || '', + // attributes: [ + // { name: 'foo', value: 'bar' }, + // { name: 'foo', value: 'bar' }, + // { name: 'foo', value: 'bar' }, + // ], + // autoAcceptCredential: 'never', + // }); + // }); + + // it('should call createOfferCredential()', async () => { + // expect(spyCreateOfferCredential).toHaveBeenCalled(); + // }); + + // it('should get a response from AFJ', async () => { + // expect(attestationResponse).not.toBe(null); + // }); + // }); + + describe('getPrincipalMemberShipCredentials()', () => { + let attestationResponse: CredentialsType | null; + let data: { + type: string; + }; + + beforeEach(async () => { + data = { type: credentialsTypeDto().type }; + attestationResponse = + await attestationService.getPrincipalMemberShipCredentials(data); + }); + + it('should call findUnique() from PrismaService.credentialsType', async () => { + expect(PrismaServiceMock().credentialsType.findUnique).toHaveBeenCalled(); + }); + + it('should get principal member credentials type', async () => { + expect(attestationResponse).toEqual(credentialsTypeDto()); + }); + }); + + describe('createCredentialsType()', () => { + let attestationResponse: CredentialsType; + + beforeEach(async () => { + attestationResponse = await attestationService.createCredentialsType( + credentialsTypeDto(), + ); + }); + + it('should call create() from PrismaService.credentialsType', async () => { + expect(PrismaServiceMock().credentialsType.create).toHaveBeenCalled(); + }); + + it('should retrieve created credetialType', async () => { + expect(attestationResponse).toEqual(credentialsTypeDto()); + }); + }); +}); diff --git a/apps/attestation-manager/src/issue-credential/tests/stubs/credential-dto.ts b/apps/attestation-manager/src/issue-credential/tests/stubs/credential-dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..3e995edd9f82b91bc03277ba7cd6e69ceca2ec6e --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/stubs/credential-dto.ts @@ -0,0 +1,14 @@ +import CredentialDto from '@issueCredential/entities/credential.entity'; +import credDefStub from '@src/credentialDef/tests/stubs/credDef.stub'; +import AttestationService from '@src/issue-credential/services/service'; + +const credentialDto = (): CredentialDto => ({ + credentialId: 'credential-id', + credDefId: credDefStub().id, + principalDid: 'principal-did', + threadId: 'thread-id', + state: AttestationService.status.OFFER_SENT, + connectionId: 'connection-id', +}); + +export default credentialDto; diff --git a/apps/attestation-manager/src/issue-credential/tests/stubs/credential-state-dto.ts b/apps/attestation-manager/src/issue-credential/tests/stubs/credential-state-dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..22f6e4114b3682e1120531960e988aafbfd36cb8 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/stubs/credential-state-dto.ts @@ -0,0 +1,19 @@ +import CredentialStateDto from '@issueCredential/entities/credential.state.entity'; +import credDefStub from '@src/credentialDef/tests/stubs/credDef.stub'; +import credentialDto from './credential-dto'; + +const credentialStateDto = (): CredentialStateDto => ({ + id: 'credential-state-id', + metadata: { + '_internal/indyCredential': { + credentialDefinitionId: credentialDto().credDefId, + schemaId: credDefStub().schemaID, + }, + }, + credDefId: credentialDto().credDefId, + state: credentialDto().state, + threadId: 'thread-id', + connectionId: credentialDto().connectionId, +}); + +export default credentialStateDto; diff --git a/apps/attestation-manager/src/issue-credential/tests/stubs/credential-type-dto.ts b/apps/attestation-manager/src/issue-credential/tests/stubs/credential-type-dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..cae4ae6ff4e21f70c2f58ee6fee7d88aa95dd203 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/stubs/credential-type-dto.ts @@ -0,0 +1,10 @@ +import CredentialTypeDto from '@issueCredential/entities/credentialType.entity'; +import schemaDto from '@src/schemas/tests/stubs/schema-dto'; + +const credentialsTypeDto = (): CredentialTypeDto => ({ + id: 'credential-type-id', + schemaId: schemaDto().schemaID, + type: 'type', +}); + +export default credentialsTypeDto; diff --git a/apps/attestation-manager/src/issue-credential/tests/stubs/offer-credential-dto.ts b/apps/attestation-manager/src/issue-credential/tests/stubs/offer-credential-dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..cb8b17a6efc1805c7fec541a578bb51d3e47f41c --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/stubs/offer-credential-dto.ts @@ -0,0 +1,16 @@ +import OfferCredentialDto from '@src/issue-credential/entities/entity'; +import schemaDto from '@src/schemas/tests/stubs/schema-dto'; +import credentialDto from './credential-dto'; + +const offerCredentialDto = (): OfferCredentialDto => ({ + connectionId: credentialDto().connectionId, + credentialDefinitionId: credentialDto().credDefId, + comment: 'Test Comment!!', + attributes: schemaDto().attributes.map((attr: string) => ({ + name: attr, + value: attr, + })), + autoAcceptCredential: 'never', +}); + +export default offerCredentialDto; diff --git a/apps/attestation-manager/src/issue-credential/tests/stubs/participantDID.stub.ts b/apps/attestation-manager/src/issue-credential/tests/stubs/participantDID.stub.ts new file mode 100644 index 0000000000000000000000000000000000000000..3d995de13e4ed79dcd22f447b80489d184005512 --- /dev/null +++ b/apps/attestation-manager/src/issue-credential/tests/stubs/participantDID.stub.ts @@ -0,0 +1,3 @@ +const participantDID = 'participant-did'; + +export default participantDID; diff --git a/apps/attestation-manager/src/main.ts b/apps/attestation-manager/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..0a746e1812cc42cb29875c50ffed775237b8481d --- /dev/null +++ b/apps/attestation-manager/src/main.ts @@ -0,0 +1,46 @@ +import { HttpAdapterHost, NestFactory } from '@nestjs/core'; +import { ConfigService } from '@nestjs/config'; +import { VersioningType } from '@nestjs/common'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { Transport, MicroserviceOptions } from '@nestjs/microservices'; +import logger from '@utils/logger'; +import AppModule from '@src/app.module'; +import AllExceptionsFilter from '@utils/exceptionsFilter'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + const configService = app.get(ConfigService); + app.enableCors(); + + app.connectMicroservice<MicroserviceOptions>({ + transport: Transport.NATS, + options: { + servers: [configService.get('nats').url], + }, + }); + + app.enableVersioning({ + defaultVersion: ['1'], + type: VersioningType.URI, + }); + + const swaggerConfig = new DocumentBuilder() + .setTitle('Gaia-x Attestation Manager API') + .setDescription('API documentation for GAIA-X Attestation Manager') + .setVersion('1.0') + .addServer('localhost:3005') + .build(); + + const document = SwaggerModule.createDocument(app, swaggerConfig); + + SwaggerModule.setup('/swagger', app, document); + await app.startAllMicroservices(); + + const httpAdapter = app.get(HttpAdapterHost); + app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)); + + await app.listen(configService.get('PORT') || 3000, () => { + logger.info(`Listening on Port:${configService.get('PORT')}` || 3000); + }); +} +bootstrap(); diff --git a/apps/attestation-manager/src/middleware/auth.middleware.ts b/apps/attestation-manager/src/middleware/auth.middleware.ts new file mode 100644 index 0000000000000000000000000000000000000000..aa8ea00ac24920459ab0ea9fea50c4f79faed750 --- /dev/null +++ b/apps/attestation-manager/src/middleware/auth.middleware.ts @@ -0,0 +1,137 @@ +import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import logger from '@src/utils/logger'; +import { Request, Response, NextFunction } from 'express'; +// import { ClientCredentials } from 'simple-oauth2'; + +import * as jwt from 'jsonwebtoken'; +import jwksClient = require('jwks-rsa'); + +// interface IOAuthConfig { +// client: { +// id: string, +// secret: string +// }; +// auth: { +// tokenHost: string +// } +// } + +@Injectable() +export class AuthMiddleware implements NestMiddleware { + constructor(private readonly configService: ConfigService) {} + + /* eslint-disable */ + async use(req: Request, res: Response, next: NextFunction) { + if (this.configService.get('auth.useAuth') === 'false') { + return next(); + } + + logger.info('Request at middleware'); + + const authHeader = req.headers.authorization; + const authToken = authHeader && authHeader.split(' ')[1]; + + if (!authToken) { + logger.error('No access token provided.'); + res.json({ + status: HttpStatus.UNAUTHORIZED, + message: 'Unauthorized. No Access token provided.', + data: undefined, + }); + return; + } + + // ClientID string `envconfig:"OAUTH_CLIENT_ID"` + // ClientSecret string `envconfig:"OAUTH_CLIENT_SECRET"` + // TokenURL string `envconfig:"OAUTH_TOKEN_URL"` + + // const oauthConfig = { + // client: { + // id: this.configService.get('auth.clientId'), + // secret: this.configService.get('auth.clientSecret') + // }, + // auth: { + // tokenHost: this.configService.get('auth.tokenUrl') || 'https://api.oauth.com' + // } + // }; + + // async function getAccessToken(conf: IOAuthConfig) { + // const client = new ClientCredentials(conf); + // let accessToken: any; + + // const tokenParams = { + // scope: '<scope>', + // }; + + // try { + // accessToken = await client.getToken(tokenParams); + // } catch (error) { + // logger.error('Access Token error', error.message); + // } + + // return accessToken; + // } + + // let result = getAccessToken(oauthConfig); + + // if (!result) { + // res.json({ + // status: HttpStatus.UNAUTHORIZED, + // message: 'Unauthorized. Access token error.', + // data: undefined, + // }) + // return; + // } + + const getKey = ( + header: jwt.JwtHeader, + callback: jwt.SigningKeyCallback, + ): void => { + const jwksUri = this.configService.get('auth.tokenUrl') || ''; + const client = jwksClient({ jwksUri, timeout: 30000 }); + + client + .getSigningKey(header.kid) + .then((key) => callback(null, key.getPublicKey())) + .catch(callback); + }; + + function verify(token: string): Promise<any> | undefined { + return new Promise( + (resolve: (decoded: any) => void, reject: (error: Error) => void) => { + const verifyCallback: jwt.VerifyCallback<jwt.JwtPayload | string> = ( + error: jwt.VerifyErrors | null, + decoded: any, + ): void => { + if (error) { + return reject(error); + } + return resolve(decoded); + }; + + jwt.verify(token, getKey, verifyCallback); + }, + ); + } + + const result = await verify(authToken); + + if (!result) { + logger.error('Invalid access token provided.'); + res.json({ + status: HttpStatus.UNAUTHORIZED, + message: 'Unauthorized. Invalid Access token provided.', + data: undefined, + }); + return; + } + + next(); + } + /* eslint-enable */ +} + +export default { + AuthMiddleware, +}; diff --git a/apps/attestation-manager/src/prisma/prisma.module.ts b/apps/attestation-manager/src/prisma/prisma.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..a120dadd2a18fbdeb7cfc5d8706c9447bdc66c8d --- /dev/null +++ b/apps/attestation-manager/src/prisma/prisma.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import PrismaService from '@DB/prisma.service'; + +@Module({ + imports: [ConfigModule], + controllers: [], + providers: [PrismaService], + exports: [PrismaService], +}) +export default class PrismaModule {} diff --git a/apps/attestation-manager/src/prisma/prisma.service.ts b/apps/attestation-manager/src/prisma/prisma.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d885d9af71da2594144d53712047afd50c53f05 --- /dev/null +++ b/apps/attestation-manager/src/prisma/prisma.service.ts @@ -0,0 +1,28 @@ +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { PrismaClient } from '@prisma/client'; + +@Injectable() +export default class PrismaService + extends PrismaClient + implements OnModuleInit, OnModuleDestroy +{ + constructor(private configService: ConfigService) { + super(); + } + + async onModuleInit() { + const prisma = new PrismaClient({ + datasources: { + db: { + url: this.configService.get('DATABASE_URL'), + }, + }, + }); + await prisma.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } +} diff --git a/apps/attestation-manager/src/prisma/schema.prisma b/apps/attestation-manager/src/prisma/schema.prisma new file mode 100644 index 0000000000000000000000000000000000000000..96a4e4144fbc4c7f9e2b1d4c834cf1031def2300 --- /dev/null +++ b/apps/attestation-manager/src/prisma/schema.prisma @@ -0,0 +1,92 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Schema { + id String @id @default(uuid()) + schemaID String @unique @map("schema_id") + name String + createdBy String @map("created_by") + createdDate DateTime @default(now()) @map("created_date") + updatedBy String @default("") @map("updated_by") + updatedDate DateTime @default(now()) @map("updated_date") + attribute Attributes[] + credential_defs CredentialDef[] +} + +model Attributes { + id String @id @default(uuid()) + schemaID String @map("schema_id") + name String + createdBy String @map("created_by") + createdDate DateTime @default(now()) @map("created_date") + updatedBy String @default("") @map("updated_by") + updatedDate DateTime @default(now()) @map("updated_date") + schema Schema[] +} + +model CredentialDef { + id String @id @default(uuid()) + schemaID String @map("schema_id") + name String + credDefId String @unique @map("cred_def_id") + isAutoIssue Boolean @map("is_auto_issue") + isRevokable Boolean @map("is_revokable") + expiryHours String @map("expiry_hours") + createdBy String @map("created_by") + createdDate DateTime @default(now()) @map("created_date") + updatedBy String @default("") @map("updated_by") + updatedDate DateTime @default(now()) @map("updated_date") + schema Schema[] + credentials Credential[] +} + +model UserInfo { + id Int @id @default(autoincrement()) + connectionId String @map("connection_id") + credentialDefinitionId String? @map("credential_definition_id") + autoAcceptCredential String @map("auto_accept_credential") + status String? + userInfo Json? @map("user_info") +} + +model proposeCredential { + id Int @id @default(autoincrement()) + connectionId String @map("connection_id") + comment String + credentialProposal String[] @map("credential_proposal") + schemaIssuerDid String @map("schema_issuer_id") + schemaId String @map("schema_id") + schemaName String @map("schema_name") + schemaVersion String @map("schema_version") + credentialDefinitionId String @map("credential_definition_id") + issuerDid String @map("issuer_did") + attachments String + linkedAttachments String @map("linked_attachments") + autoAcceptCredential String @map("auto_accept_credential") +} + +model Credential { + id String @id @default(uuid()) + credentialId String @unique @map("credential_id") + credDefId String @map("cred_def_id") + threadId String @default(uuid()) @unique @map("thread_id") + state String + principalDid String @map("principal_did") + connectionId String @map("connection_id") + createdDate DateTime @default(now()) @map("created_date") + updatedDate DateTime @default(now()) @map("updated_date") + expirationDate DateTime? @map("expiration_date") + credentialDef CredentialDef[] +} + +model CredentialsType { + id String @id @default(uuid()) + type String @unique + schemaId String @unique @map("schema_id") +} diff --git a/apps/attestation-manager/src/prisma/tests/__mocks__/prisma.service.ts b/apps/attestation-manager/src/prisma/tests/__mocks__/prisma.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..bf72e7dc30653f7514bc21fde192b08bd0508d66 --- /dev/null +++ b/apps/attestation-manager/src/prisma/tests/__mocks__/prisma.service.ts @@ -0,0 +1,35 @@ +import schemaDto from '@schemas/tests/stubs/schema-dto'; +import credDefStub from '@src/credentialDef/tests/stubs/credDef.stub'; +import credentialDto from '@src/issue-credential/tests/stubs/credential-dto'; +import credentialTypeDto from '@src/issue-credential/tests/stubs/credential-type-dto'; + +const PrismaServiceMock = jest.fn().mockReturnValue({ + $transaction: jest.fn().mockImplementation((args: any) => [...args]), + schema: { + create: jest.fn().mockReturnValue([schemaDto()]), + update: jest.fn().mockReturnValue([schemaDto()]), + count: jest.fn().mockReturnValue(1), + findMany: jest.fn().mockReturnValue([schemaDto()]), + }, + credentialDef: { + create: jest.fn().mockReturnValue([credDefStub()]), + update: jest.fn().mockReturnValue([credDefStub()]), + count: jest.fn().mockReturnValue(1), + findMany: jest.fn().mockReturnValue([credDefStub()]), + findFirst: jest.fn().mockReturnValue(credDefStub()), + }, + credential: { + create: jest.fn().mockReturnValue(credentialDto()), + update: jest.fn().mockReturnValue(credentialDto()), + findUnique: jest.fn().mockReturnValue(credentialDto()), + count: jest.fn().mockReturnValue(1), + findMany: jest.fn().mockReturnValue([credentialDto()]), + }, + credentialsType: { + update: jest.fn().mockReturnValue(credentialTypeDto()), + create: jest.fn().mockReturnValue(credentialTypeDto()), + findUnique: jest.fn().mockReturnValue(credentialTypeDto()), + }, +}); + +export default PrismaServiceMock; diff --git a/apps/attestation-manager/src/prisma/tests/prisma.module.spec.ts b/apps/attestation-manager/src/prisma/tests/prisma.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d190f50545ac13c9381f3fc63fec01b76fef8162 --- /dev/null +++ b/apps/attestation-manager/src/prisma/tests/prisma.module.spec.ts @@ -0,0 +1,28 @@ +import { ConfigModule } from '@nestjs/config'; +import { Test, TestingModule } from '@nestjs/testing'; +import PrismaModule from '../prisma.module'; +import PrismaService from '../prisma.service'; +import PrismaServiceMock from './__mocks__/prisma.service'; + +describe('PrismaModule', () => { + let prismaModule: PrismaModule; + + const PrismaServiceProvider = { + provide: PrismaService, + useFactory: PrismaServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ConfigModule], + providers: [PrismaModule, PrismaServiceProvider], + exports: [PrismaService], + }).compile(); + + prismaModule = module.get<PrismaService>(PrismaService); + }); + + it('should be defined', () => { + expect(prismaModule).toBeDefined(); + }); +}); diff --git a/apps/attestation-manager/src/prisma/tests/prisma.service.spec.ts b/apps/attestation-manager/src/prisma/tests/prisma.service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..8ed21eba0bdc7289a7d08b5ffb466b58ff0154d2 --- /dev/null +++ b/apps/attestation-manager/src/prisma/tests/prisma.service.spec.ts @@ -0,0 +1,43 @@ +import { ConfigService } from '@nestjs/config'; +import { Test, TestingModule } from '@nestjs/testing'; +import PrismaService from '../prisma.service'; + +describe('PrismaService', () => { + let prismaService: PrismaService; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + providers: [PrismaService, ConfigService], + }).compile(); + + prismaService = module.get<PrismaService>(PrismaService); + }); + + it('should be defined', () => { + expect(prismaService).toBeDefined(); + }); + + describe('onModuleInit()', () => { + let res: any; + + beforeEach(async () => { + res = await prismaService.onModuleInit(); + }); + + it('should not return anything', async () => { + expect(res).toBeUndefined(); + }); + }); + + describe('onModuleDestroy()', () => { + let res: any; + + beforeEach(async () => { + res = await prismaService.onModuleDestroy(); + }); + + it('should not return anything', async () => { + expect(res).toBeUndefined(); + }); + }); +}); diff --git a/apps/attestation-manager/src/schemas/controller/controller.ts b/apps/attestation-manager/src/schemas/controller/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..b91699143c77493ff5a60061104ff8d70847830c --- /dev/null +++ b/apps/attestation-manager/src/schemas/controller/controller.ts @@ -0,0 +1,581 @@ +import { + Body, + Controller, + Get, + HttpStatus, + InternalServerErrorException, + Param, + Post, + Query, + Res, + Version, +} from '@nestjs/common'; +import { Response } from 'express'; +import logger from '@utils/logger'; +import SchemasService from '@src/schemas/services/service'; +import { ResponseType } from '@src/common/response'; +import SchemaDto from '@src/schemas/entities/schema-entity'; +import { + ApiBody, ApiOperation, + ApiParam, + ApiQuery, + ApiResponse, + ApiTags, +} from '@nestjs/swagger'; +import { PrismaClientUnknownRequestError } from '@prisma/client/runtime'; +import { VersionRegex } from '@src/common/constants'; + +@ApiTags('Schemas') +@Controller('schemas') +export default class SchemasController { + constructor(private readonly schemasService: SchemasService) {} + + @Version(['1']) + @ApiQuery({ name: 'page', required: false }) + @ApiQuery({ name: 'pageSize', required: false }) + @Get('') + @ApiOperation({ + summary: 'Fetch a list of schemas', + description: 'This call provides capabilities to search schemas (which have been created by this OCM) by using pagination. This call returns a list of schemas and overall count of records. Every record contains schemaId, name, attributes' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Schemas fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Schemas fetched successfully': { + value: { + statusCode: 200, + message: 'Schemas fetched successfully', + data: { + count: 2, + records: [ + { + id: '1234abcd', + schemaID: 'loremipsum:test-01-01:1.0', + name: 'test-01-01', + createdBy: 'agentName', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + attribute: [ + { + name: 'attribute1', + }, + { + name: 'attribute2', + }, + { + name: 'attributeN', + }, + ], + }, + { + id: '5678abcd', + schemaID: 'loremipsum2:test2-01-01:1.0', + name: 'test2-01-01', + createdBy: 'agentName', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + attribute: [ + { + name: 'attribute1', + }, + { + name: 'attribute2', + }, + { + name: 'attributeN', + }, + ], + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found.', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found.': { + value: { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async findSchemas( + @Query() query: { pageSize: string; page: string }, + @Res() response: Response, + ) { + let res: ResponseType; + try { + logger.info('Schemas fetch successfully'); + const result = await this.schemasService.findSchemas( + query.pageSize ? parseInt(query.pageSize, 10) : 10, + query.page ? parseInt(query.page, 10) : 0, + ); + if (result) { + res = { + statusCode: HttpStatus.OK, + message: 'Schemas fetched successfully', + data: { + count: result[0], + records: result[1], + }, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + return response.send(res); + } catch (error: any) { + throw new InternalServerErrorException( + `Internal Server Error: ${error?.message}`, + ); + } + } + + @ApiParam({ name: 'id', type: 'string', description: 'Pass schema id' }) + @Version(['1']) + @Get('/:id') + @ApiOperation({ + summary: 'Fetch schema by id', + description: 'This call provides the capability to get schema data by providing schemaId. The schema data is the same which is returned from /v1/schemas endpoint and contains generic information about schema like schemaID, name, createdBy, createdDate, updatedBy, updatedDate, attribute' }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Schema fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Schema fetched successfully': { + value: { + statusCode: 200, + message: 'Schema fetched successfully', + data: { + count: 1, + records: [ + { + id: '1234abcd', + schemaID: 'loremipsum:test-01-01:1.0', + name: 'test-01-01', + createdBy: 'agentName', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + attribute: [ + { + name: 'attribute1', + }, + { + name: 'attribute2', + }, + { + name: 'attributeN', + }, + ], + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found.', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found.': { + value: { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async findSchemasById(@Param('id') id: string, @Res() response: Response) { + let res: ResponseType; + try { + logger.info('Schema fetched successfully'); + const result = await this.schemasService.findSchemasById(id); + if (Array.isArray(result) && result[0] > 0) { + res = { + statusCode: HttpStatus.OK, + message: 'Schema fetch successfully', + data: { + count: result[0], + records: result[1], + }, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } + + @Version(['1']) + @ApiBody({ type: SchemaDto }) + @Post('') + @ApiOperation({ + summary: 'Create a new schema', + description: 'This call provides the capability to create new schema on ledger by name, author, version, schema attributes and type. Later this schema can be used to issue new credential definition. This call returns an information about created schema.' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Schema created successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Schema created successfully': { + value: { + statusCode: 201, + message: 'Schema created successfully', + data: { + id: '1234qwer', + schemaID: 'loremipsum:2:test-02-01:1.0', + name: 'test-02-01', + createdBy: 'agentName', + createdDate: '1970-01-01T00:00:28.343Z', + updatedBy: '', + updatedDate: '1970-01-01T00:00:28.343Z', + attribute: [ + { + name: 'attribute1', + }, + { + name: 'attribute2', + }, + { + name: 'attributeN', + }, + { + name: 'attributeN+1', + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Schema required following attributes ( name, createdBy, version, attributes )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Schema required following attributes ( name, createdBy, version, attributes )': + { + value: { + statusCode: 400, + message: + 'Schema required following attributes ( name, createdBy, version, attributes )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Could not get agent details. please try again.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Could not get agent details. please try again.': { + value: { + statusCode: 400, + message: 'Could not get agent details. please try again.', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.CONFLICT, + description: 'Schema already exists', + content: { + 'application/json': { + schema: {}, + examples: { + 'Schema already exists': { + value: { + statusCode: 409, + message: 'Schema already exists', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async createSchema( + @Body() createSchema: SchemaDto, + @Res() response: Response, + ) { + try { + let res: ResponseType; + if ( + !( + createSchema.name && + typeof createSchema.name === 'string' && + createSchema.createdBy && + typeof createSchema.createdBy === 'string' && + createSchema.version && + typeof createSchema.version === 'string' && + VersionRegex.test(createSchema.version) && + Array.isArray(createSchema.attributes) && + createSchema.attributes.length > 0 && + createSchema.attributes.every( + (i) => typeof i === 'string' && i.trim().length > 0, + ) + ) + ) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Schema required following attributes ( name, createdBy, version, attributes )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + createSchema.attributes.push('expirationDate'); + const schemaResponse = + await this.schemasService.checkSchemasByNameAndVersion(createSchema); + if (schemaResponse[0] === 0) { + const resp = await this.schemasService.createSchemaOnLedger( + createSchema, + ); + if (resp?.id) { + const schemaRes: SchemaDto = createSchema; + schemaRes.schemaID = resp.id; + response.status(HttpStatus.CREATED); + res = { + statusCode: HttpStatus.CREATED, + message: 'Schema created successfully', + data: await this.schemasService.createSchemas(schemaRes), + }; + logger.info('Schema created successfully'); + } else { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Could not get agent details. please try again.', + }; + } + } else { + response.status(HttpStatus.CONFLICT); + res = { + statusCode: HttpStatus.CONFLICT, + message: 'Schema already exists', + }; + } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } + + @Version(['1']) + @Get('/get-dids-for-schema/:id') + @ApiOperation({ + summary: 'Fetch list of dids for schema id', + description: 'This call provides the capability to get principal dids. The format of the response is shown in the example. To issue credentials, you need to have a credential definition. This is a basic principle of this process. This credential definition is created by using the schema. Using this endpoint gives you all dids of participants to whom OCM issued credentials using specified schema.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Schema DIDs fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Schema DIDs fetched successfully': { + value: { + statusCode: 200, + message: 'Schema DIDs fetched successfully', + data: { + total_credential_defs: 1, + principalDids: [ + { + loremIpsumCredDef: ['1234did'], + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found.', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found.': { + value: { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error.': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:27.897Z', + message: 'Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async getDidsForSchema(@Param('id') id: string, @Res() response: Response) { + let res: ResponseType; + try { + logger.info('Schema DIDs fetched successfully'); + const result = await this.schemasService.getDidsForSchemasId(id); + + if (result && result.length) { + const schema = result[0]; + const credDefs = schema.credential_defs; + const principalDids = credDefs.map((cd) => ({ + [cd.credDefId]: cd.credentials.map((cred) => cred.principalDid), + })); + + const data = { + total_credential_defs: credDefs.length, + principalDids, + }; + + res = { + statusCode: HttpStatus.OK, + message: 'Schema DIDs fetched successfully', + data, + }; + } else { + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + } + return response.send(res); + } catch (error) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new InternalServerErrorException(error); + } + } + } +} diff --git a/apps/attestation-manager/src/schemas/entities/schema-entity.ts b/apps/attestation-manager/src/schemas/entities/schema-entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..a11fbc877b1460ad5002358cb7390cae75f9bb19 --- /dev/null +++ b/apps/attestation-manager/src/schemas/entities/schema-entity.ts @@ -0,0 +1,48 @@ +import { ApiProperty, ApiPropertyOptional } from '@nestjs/swagger'; +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class SchemaDto { + @IsString() + @IsNotEmpty() + id: string; + + @IsString() + @IsNotEmpty() + schemaID: string; + + @IsString() + @IsNotEmpty() + @ApiProperty() + name: string; + + @IsString() + @ApiProperty() + createdBy: string; + + @IsString() + createdDate: Date; + + @IsString() + updatedBy?: string; + + @IsString() + updatedDate: Date; + + @IsString() + @ApiProperty() + version: string; + + @IsString() + @ApiProperty() + attributes: string[]; + + @IsString() + pageSize?: string; + + @IsString() + page?: string; + + @IsString() + @ApiPropertyOptional() + type?: string; +} diff --git a/apps/attestation-manager/src/schemas/module.ts b/apps/attestation-manager/src/schemas/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..ac79d4dba674fed183833111597693c1e7567258 --- /dev/null +++ b/apps/attestation-manager/src/schemas/module.ts @@ -0,0 +1,33 @@ +import { Module } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import SchemasService from '@src/schemas/services/service'; +import SchemasController from '@src/schemas/controller/controller'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import NatsClientService from '@src/client/nats.client'; +import RestClientService from '@src/client/rest.client'; +import config from '@config/config'; + +@Module({ + imports: [ + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + ], + controllers: [SchemasController], + providers: [ + SchemasService, + PrismaService, + NatsClientService, + RestClientService, + ], +}) +export default class SchemasModule {} diff --git a/apps/attestation-manager/src/schemas/repository/schema.respository.ts b/apps/attestation-manager/src/schemas/repository/schema.respository.ts new file mode 100644 index 0000000000000000000000000000000000000000..0596ee1a9a057c9a9f05bcaf49c479cf84ffc9f9 --- /dev/null +++ b/apps/attestation-manager/src/schemas/repository/schema.respository.ts @@ -0,0 +1,64 @@ +import { Injectable } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export default class SchemaRepository { + constructor(private readonly prismaService: PrismaService) {} + + async createSchema(data: Prisma.SchemaCreateInput) { + return this.prismaService.schema.create({ + data, + include: { + attribute: { + select: { + name: true, + }, + }, + }, + }); + } + + async findSchemas(params: { + skip?: number; + take?: number; + cursor?: Prisma.SchemaWhereUniqueInput; + where?: Prisma.SchemaWhereInput; + orderBy?: Prisma.SchemaOrderByWithRelationInput; + }) { + const { skip, take, cursor, where, orderBy } = params; + return this.prismaService.$transaction([ + this.prismaService.schema.count({ + where, + }), + this.prismaService.schema.findMany({ + skip, + take, + cursor, + where, + orderBy, + include: { + attribute: { + select: { + name: true, + }, + }, + }, + }), + ]); + } + + async findUniqueSchema(params: { where: Prisma.SchemaWhereUniqueInput }) { + const { where } = params; + return this.prismaService.schema.findUnique({ + where, + include: { + attribute: { + select: { + name: true, + }, + }, + }, + }); + } +} diff --git a/apps/attestation-manager/src/schemas/services/service.ts b/apps/attestation-manager/src/schemas/services/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..dec187a7e5945f066ee7d57ca7cb58e104645b6b --- /dev/null +++ b/apps/attestation-manager/src/schemas/services/service.ts @@ -0,0 +1,148 @@ +import { BadRequestException, Injectable } from '@nestjs/common'; +import SchemaDto from '@src/schemas/entities/schema-entity'; +import SchemaRepository from '@src/schemas/repository/schema.respository'; +import CredentialTypeRepository from '@src/issue-credential/repository/credentialType.repository'; +import PrismaService from '@DB/prisma.service'; +import NatsClientService from '@src/client/nats.client'; +import { Prisma } from '@prisma/client'; +import pagination from '@utils/pagination'; +import RestClientService from '@src/client/rest.client'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export default class SchemasService { + private schemaRepository: SchemaRepository; + + private credentialTypeRepository: CredentialTypeRepository; + + constructor( + private readonly prismaService: PrismaService, + private readonly restClient: RestClientService, + private readonly natsClient: NatsClientService, + private readonly configService: ConfigService, + ) { + this.schemaRepository = new SchemaRepository(this.prismaService); + this.credentialTypeRepository = new CredentialTypeRepository( + this.prismaService, + ); + } + + async createSchemas(schema: SchemaDto) { + const query: { + schemaID: string; + name: string; + createdBy: string; + attribute: { + create: { + schemaID: string; + name: string; + createdBy: string; + }[]; + }; + } = { + schemaID: schema.schemaID, + name: schema.name, + createdBy: schema.createdBy, + attribute: { + create: [], + }, + }; + schema.attributes.forEach((element) => { + query.attribute.create.push({ + schemaID: schema.schemaID, + name: element, + createdBy: schema.createdBy, + }); + }); + + if ( + schema.type && + typeof schema.type === 'string' && + schema.type.trim().length > 0 + ) { + await this.credentialTypeRepository.createOrUpdateCredentialsType({ + schemaId: query.schemaID, + type: schema.type.trim(), + }); + } + + return this.schemaRepository.createSchema(query); + } + + async findSchemas(pageSize: number, page: number) { + let query: { + skip?: number; + take?: number; + cursor?: Prisma.SchemaWhereUniqueInput; + where?: Prisma.SchemaWhereInput; + orderBy?: Prisma.SchemaOrderByWithRelationInput; + } = {}; + + query = { ...query, ...pagination(pageSize, page) }; + return this.schemaRepository.findSchemas(query); + } + + async findSchemasById(id: string) { + return this.schemaRepository.findSchemas({ + where: { schemaID: id }, + }); + } + + async getDidsForSchemasId(id: string) { + return this.prismaService.schema.findMany({ + where: { schemaID: id }, + include: { + attribute: true, + credential_defs: { + include: { + credentials: { + distinct: 'principalDid', + }, + }, + }, + }, + }); + } + + findBySchemaId(schemaID: string) { + const query = { where: { schemaID } }; + return this.schemaRepository.findUniqueSchema(query); + } + + async checkSchemasByNameAndVersion(schemaDto: SchemaDto) { + return this.schemaRepository.findSchemas({ + where: { + schemaID: { + endsWith: `:${schemaDto.version}`, + mode: 'insensitive', // Default value: default + }, + name: { + equals: schemaDto.name, // Default mode + }, + }, + }); + } + + async createSchemaOnLedger(schemaDto: SchemaDto) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.post( + `${agentUrl}/schemas/`, + schemaDto, + ); + + return responseData; + } + + async getSchemaAndAttributesBySchemaIDFromLedger(schemaID: string) { + const agentUrl = this.configService.get('agent.AGENT_URL'); + const responseData = await this.restClient.get( + `${agentUrl}/schemas/${schemaID}`, + ); + + if (!responseData?.id) { + throw new BadRequestException('Invalid schema ID'); + } + + return responseData; + } +} diff --git a/apps/attestation-manager/src/schemas/tests/__mocks__/service.ts b/apps/attestation-manager/src/schemas/tests/__mocks__/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..96d1010384296bf398d2a4fbabf10a6e17bdb779 --- /dev/null +++ b/apps/attestation-manager/src/schemas/tests/__mocks__/service.ts @@ -0,0 +1,12 @@ +import schemaDto from '../stubs/schema-dto'; + +const SchemasServiceMock = jest.fn().mockReturnValue({ + findSchemas: jest.fn().mockReturnValue([1, [schemaDto()]]), + findSchemasById: jest.fn().mockReturnValue([1, [schemaDto()]]), + findBySchemaId: jest.fn().mockReturnValue(schemaDto()), + checkSchemasByNameAndVersion: jest.fn().mockReturnValue([0, []]), + createSchemaOnLedger: jest.fn().mockReturnValue({ id: schemaDto().schemaID }), + createSchemas: jest.fn().mockReturnValue(schemaDto()), +}); + +export default SchemasServiceMock; diff --git a/apps/attestation-manager/src/schemas/tests/controller.spec.ts b/apps/attestation-manager/src/schemas/tests/controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..73c73f94aad1776096166646a1ecdf8e0f365a19 --- /dev/null +++ b/apps/attestation-manager/src/schemas/tests/controller.spec.ts @@ -0,0 +1,137 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import httpMocks from 'node-mocks-http'; +import SchemasController from '@schemas/controller/controller'; +import SchemasService from '@schemas/services/service'; +import SchemasServiceMock from '@schemas/tests/__mocks__/service'; +import { Response } from 'express'; +import { HttpStatus } from '@nestjs/common'; +import SchemaDto from '../entities/schema-entity'; +import schemaDto from './stubs/schema-dto'; + +describe('SchemasController', () => { + let schemasController: SchemasController; + let schemasService: SchemasService; + + beforeEach(async () => { + const SchemasServiceProvider = { + provide: SchemasService, + useFactory: SchemasServiceMock, + }; + + const module: TestingModule = await Test.createTestingModule({ + controllers: [SchemasController], + providers: [SchemasServiceProvider], + }).compile(); + + schemasController = module.get<SchemasController>(SchemasController); + schemasService = module.get<SchemasService>(SchemasService); + jest.clearAllMocks(); + }); + + it('should be defined', () => { + expect(schemasController).toBeDefined(); + }); + + describe('findSchemas()', () => { + let schemasResponse: Response<string, Record<string, any>>; + let query: SchemaDto; + let response: Response<string, Record<string, any>>; + + beforeEach(async () => { + query = schemaDto(); + response = httpMocks.createResponse(); + + schemasResponse = await schemasController.findSchemas(query, response); + }); + + it('should call findSchemas() from service', async () => { + expect(schemasService.findSchemas).toHaveBeenCalled(); + }); + + it('should retrieve schemas by query', async () => { + expect( + schemasService.findSchemas( + query.pageSize ? parseInt(query.pageSize, 10) : 10, + query.page ? parseInt(query.page, 10) : 0, + ), + ).toEqual([1, [schemaDto()]]); + }); + + it(`should retrieve HTTP status OK(${HttpStatus.OK})`, async () => { + expect(schemasResponse?.statusCode).toEqual(HttpStatus.OK); + }); + }); + + describe('findSchemasById()', () => { + let schemasResponse: Response<string, Record<string, any>>; + let id: string; + let response: Response<string, Record<string, any>>; + + beforeEach(async () => { + id = schemaDto().schemaID || ''; + response = httpMocks.createResponse(); + + schemasResponse = await schemasController.findSchemasById(id, response); + }); + + it('should call findSchemasById() from service', async () => { + expect(schemasService.findSchemasById).toHaveBeenCalled(); + }); + + it('should retrieve schema by ID', async () => { + expect(schemasService.findSchemasById(id)).toEqual([1, [schemaDto()]]); + }); + + it(`should retrieve HTTP status OK(${HttpStatus.OK})`, async () => { + expect(schemasResponse?.statusCode).toEqual(HttpStatus.OK); + }); + }); + + describe('createSchema()', () => { + let schemasResponse: Response<string, Record<string, any>>; + let createSchema: SchemaDto; + let response: Response<string, Record<string, any>>; + + beforeEach(async () => { + createSchema = schemaDto(); + response = httpMocks.createResponse(); + + schemasResponse = await schemasController.createSchema( + createSchema, + response, + ); + }); + + it('should call checkSchemasByNameAndVersion() from service', async () => { + expect(schemasService.checkSchemasByNameAndVersion).toHaveBeenCalled(); + }); + + it('should not retrieve any existing schema', async () => { + expect( + schemasService.checkSchemasByNameAndVersion(createSchema), + ).toContain(0); + }); + + it('should call createSchemaOnLedger() from service', async () => { + expect(schemasService.createSchemaOnLedger).toHaveBeenCalled(); + }); + + it('should retrieve schema with ID', async () => { + expect(schemasService.createSchemaOnLedger(createSchema)).toEqual({ + id: schemaDto().schemaID, + }); + }); + + it('should call createSchemas() from service', async () => { + expect(schemasService.createSchemas).toHaveBeenCalled(); + }); + + it('should retrieve created schema', async () => { + expect(schemasService.createSchemas(createSchema)).toEqual(schemaDto()); + }); + + it(`should retrieve HTTP status created(${HttpStatus.CREATED})`, async () => { + expect(schemasResponse?.statusCode).toEqual(HttpStatus.CREATED); + }); + }); +}); diff --git a/apps/attestation-manager/src/schemas/tests/module.spec.ts b/apps/attestation-manager/src/schemas/tests/module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..3cae9de60b9aa3c3e218ae27b6c6304a2da8e0e1 --- /dev/null +++ b/apps/attestation-manager/src/schemas/tests/module.spec.ts @@ -0,0 +1,56 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import SchemasService from '@schemas/services/service'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import NatsClientService from '@src/client/nats.client'; +import PrismaServiceMock from '@src/prisma/tests/__mocks__/prisma.service'; +import NatsClientServiceMock from '@src/client/tests/__mocks__/nats.client'; +import RestClientService from '@src/client/rest.client'; +import RestClientServiceMock from '@src/client/tests/__mocks__/rest.client'; +import { ConfigService } from '@nestjs/config'; +import SchemasModule from '../module'; +import SchemasServiceMock from './__mocks__/service'; + +describe('SchemasModule', () => { + let schemasModule: SchemasModule; + + const SchemasServiceProvider = { + provide: SchemasService, + useFactory: SchemasServiceMock, + }; + + const PrismaServiceProvider = { + provide: PrismaService, + useFactory: PrismaServiceMock, + }; + + const NatsClientServiceProvider = { + provide: NatsClientService, + useFactory: NatsClientServiceMock, + }; + + const RestClientServiceProvider = { + provide: RestClientService, + useFactory: RestClientServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [HttpModule], + providers: [ + SchemasModule, + SchemasServiceProvider, + PrismaServiceProvider, + NatsClientServiceProvider, + RestClientServiceProvider, + ConfigService, + ], + }).compile(); + + schemasModule = module.get<SchemasModule>(SchemasModule); + }); + + it('should be defined', () => { + expect(schemasModule).toBeDefined(); + }); +}); diff --git a/apps/attestation-manager/src/schemas/tests/service.spec.ts b/apps/attestation-manager/src/schemas/tests/service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..4e237513a7e51a7f39a05382166773fc141bcf00 --- /dev/null +++ b/apps/attestation-manager/src/schemas/tests/service.spec.ts @@ -0,0 +1,163 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import SchemasService from '@schemas/services/service'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import NatsClientService from '@src/client/nats.client'; +import { Schema } from '@prisma/client'; +import { ResponseType } from '@src/common/response'; +import PrismaServiceMock from '@src/prisma/tests/__mocks__/prisma.service'; +import NatsClientServiceMock from '@src/client/tests/__mocks__/nats.client'; +import RestClientService from '@src/client/rest.client'; +import RestClientServiceMock from '@src/client/tests/__mocks__/rest.client'; +import { ConfigService } from '@nestjs/config'; +import schemaDto from './stubs/schema-dto'; + +describe('SchemasService', () => { + let schemasService: SchemasService; + + const PrismaServiceProvider = { + provide: PrismaService, + useFactory: PrismaServiceMock, + }; + + const NatsClientServiceProvider = { + provide: NatsClientService, + useFactory: NatsClientServiceMock, + }; + + const RestClientServiceProvider = { + provide: RestClientService, + useFactory: RestClientServiceMock, + }; + + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [HttpModule], + providers: [ + SchemasService, + PrismaServiceProvider, + RestClientServiceProvider, + NatsClientServiceProvider, + ConfigService, + ], + }).compile(); + + schemasService = module.get<SchemasService>(SchemasService); + }); + + it('should be defined', () => { + expect(schemasService).toBeDefined(); + }); + + describe('createSchemas()', () => { + let schemasResponse: Schema; + + beforeEach(async () => { + schemasResponse = await schemasService.createSchemas(schemaDto()); + }); + + it('should call create() from PrismaService.schema', async () => { + expect(PrismaServiceMock().schema.create).toHaveBeenCalled(); + }); + + it('should retrieve created schema', async () => { + expect(schemasResponse).toEqual([schemaDto()]); + }); + }); + + describe('findSchemas()', () => { + let schemasResponse: Array<number | Schema[]>; + + beforeEach(async () => { + const pageSize = parseInt(schemaDto().pageSize || '', 10); + const page = parseInt(schemaDto().page || '', 10); + + schemasResponse = await schemasService.findSchemas(pageSize, page); + }); + + it('should call findMany() from PrismaService.schema', async () => { + expect(PrismaServiceMock().schema.findMany).toHaveBeenCalled(); + }); + + it('should call count() from PrismaService.schema', async () => { + expect(PrismaServiceMock().schema.count).toHaveBeenCalled(); + }); + + it('should call $transaction() from PrismaService', async () => { + expect(PrismaServiceMock().$transaction).toHaveBeenCalled(); + }); + + it('should retrieve schemas by participantId', async () => { + expect(schemasResponse).toEqual([1, [schemaDto()]]); + }); + }); + + describe('findSchemasById()', () => { + let schemasResponse: Array<number | Schema[]>; + let id: string; + + beforeEach(async () => { + id = schemaDto().schemaID || ''; + + schemasResponse = await schemasService.findSchemasById(id); + }); + + it('should call findMany() from PrismaService.schema', async () => { + expect(PrismaServiceMock().schema.findMany).toHaveBeenCalled(); + }); + + it('should call count() from PrismaService.schema', async () => { + expect(PrismaServiceMock().schema.count).toHaveBeenCalled(); + }); + + it('should call $transaction() from PrismaService', async () => { + expect(PrismaServiceMock().$transaction).toHaveBeenCalled(); + }); + + it('should retrieve schema by Schema ID', async () => { + expect(schemasResponse).toEqual([1, [schemaDto()]]); + }); + }); + + describe('checkSchemasByNameAndVersion()', () => { + let schemasResponse: Array<number | Schema[]>; + + beforeEach(async () => { + schemasResponse = await schemasService.checkSchemasByNameAndVersion( + schemaDto(), + ); + }); + + it('should call findMany() from PrismaService.schema', async () => { + expect(PrismaServiceMock().schema.findMany).toHaveBeenCalled(); + }); + + it('should call count() from PrismaService.schema', async () => { + expect(PrismaServiceMock().schema.count).toHaveBeenCalled(); + }); + + it('should call $transaction() from PrismaService', async () => { + expect(PrismaServiceMock().$transaction).toHaveBeenCalled(); + }); + + it('should retrieve schemas by Name and Version', async () => { + expect(schemasResponse).toEqual([1, [schemaDto()]]); + }); + }); + + describe('createSchemaOnLedger()', () => { + let schemasResponse: ResponseType; + + beforeEach(async () => { + schemasResponse = await schemasService.createSchemaOnLedger(schemaDto()); + }); + + it('should call post() from restClient', async () => { + expect(RestClientServiceMock().post).toHaveBeenCalled(); + }); + + it('should get a response from AFJ', async () => { + expect(schemasResponse).not.toBe(null); + }); + }); +}); diff --git a/apps/attestation-manager/src/schemas/tests/stubs/schema-dto.ts b/apps/attestation-manager/src/schemas/tests/stubs/schema-dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..f503d3fda27ea25412b45e373c9719a5ee6e1c50 --- /dev/null +++ b/apps/attestation-manager/src/schemas/tests/stubs/schema-dto.ts @@ -0,0 +1,18 @@ +import SchemaDto from '@src/schemas/entities/schema-entity'; + +const schemaDto = (): SchemaDto => ({ + id: 'schema-db-id', + schemaID: 'schema-ledger-id', + name: 'schema-name', + createdBy: 'created-by', + createdDate: new Date(2022), + updatedBy: 'updated-by', + updatedDate: new Date(2022), + version: '0.0.1', + attributes: ['attr1', 'attr2', 'attr3'], + pageSize: '3', + page: '3', + type: 'testing', +}); + +export default schemaDto; diff --git a/apps/attestation-manager/src/schemas/tests/stubs/schema-from-agent-dto.ts b/apps/attestation-manager/src/schemas/tests/stubs/schema-from-agent-dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..2b4743f3418d345e194ed3933a6715516e788acd --- /dev/null +++ b/apps/attestation-manager/src/schemas/tests/stubs/schema-from-agent-dto.ts @@ -0,0 +1,12 @@ +import schemaDto from './schema-dto'; + +const schemaAgentDto = { + ver: '1.0', + id: schemaDto().schemaID, + name: schemaDto().name, + version: schemaDto().version, + attrNames: [...schemaDto().attributes, 'expirationDate'], + seqNo: 335519, +}; + +export default schemaAgentDto; diff --git a/apps/attestation-manager/src/tests/__mocks__/http-service.ts b/apps/attestation-manager/src/tests/__mocks__/http-service.ts new file mode 100644 index 0000000000000000000000000000000000000000..49016bf06278293c2749e2100387072af3a81f6b --- /dev/null +++ b/apps/attestation-manager/src/tests/__mocks__/http-service.ts @@ -0,0 +1,16 @@ +import { Observable } from 'rxjs'; + +const HttpServiceMock = jest.fn().mockReturnValue({ + post: jest.fn().mockReturnValue( + new Observable((subscriber) => { + subscriber.next({ + data: { + sample: 'data', + }, + }); + subscriber.complete(); + }), + ), +}); + +export default HttpServiceMock; diff --git a/apps/attestation-manager/src/tests/app.module.spec.ts b/apps/attestation-manager/src/tests/app.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a453e582ff5143228778cd0fa60d3b565fa92298 --- /dev/null +++ b/apps/attestation-manager/src/tests/app.module.spec.ts @@ -0,0 +1,27 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import AppModule from '@src/app.module'; + +// import config from '@config/config'; + +// jest.mock('@config/config', jest.fn().mockReturnValue({ +// PORT: 3005, +// ACCEPT_MEMBERSHIP_CREDENTIALS_CONFIG: process.env.ACCEPT_MEMBERSHIP_CREDENTIALS_CONFIG, +// })); + +describe('App Module', () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('should work', () => { + expect(true).toBe(true); + }); +}); diff --git a/apps/attestation-manager/src/userInfo/controller/controller.ts b/apps/attestation-manager/src/userInfo/controller/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..9ba1fe4a13cc8b5611e6d41f240f7ae429414d39 --- /dev/null +++ b/apps/attestation-manager/src/userInfo/controller/controller.ts @@ -0,0 +1,75 @@ +import { + BadRequestException, + Body, + Controller, + HttpException, + HttpStatus, + InternalServerErrorException, + Post, + Res, + Version, +} from '@nestjs/common'; +import { Response } from 'express'; +import {ApiBody, ApiOperation, ApiTags} from '@nestjs/swagger'; + +import logger from '@utils/logger'; +import UserInfoService from '@userInfo/services/service'; +import UserInfoDto from '@userInfo/entities/userInfo.entity'; +import { PrismaClientUnknownRequestError } from '@prisma/client/runtime'; +import { isUUID } from 'class-validator'; +import { AutoAcceptCredential } from '@src/common/constants'; + +@ApiTags('userInfo (to be deprecated)') +@Controller('userInfo') +export default class UserInfoController { + constructor(private readonly userInfoService: UserInfoService) {} + + @Version(['1']) + @ApiBody({ type: UserInfoDto }) + @Post('') + @ApiOperation({ + summary: 'Add user information to a connection', + description: 'This call provides the capability to add any additional information to connection. The format of added data is just a simple json' + }) + async createUserInfo( + @Body() userInfoDto: UserInfoDto, + @Res() response: Response, + ) { + try { + logger.info(`UserInfoDto: ${JSON.stringify(UserInfoDto)}`); + + const { autoAcceptCredential, connectionId, userInfo } = userInfoDto; + + if (!connectionId || !isUUID(connectionId)) { + throw new BadRequestException('Invalid connection ID'); + } + + if ( + autoAcceptCredential && + autoAcceptCredential in AutoAcceptCredential + ) { + throw new BadRequestException('Invalid autoAcceptCredential'); + } + + if (!userInfo || Object.values(userInfo).length === 0) { + throw new BadRequestException('Invalid userInfo'); + } + + const res = { + statusCode: HttpStatus.CREATED, + message: 'User info created successfully', + data: await this.userInfoService.createUserInfo(userInfoDto), + }; + return response.send(res); + } catch (error: any) { + if (error instanceof PrismaClientUnknownRequestError) { + throw new InternalServerErrorException(error.message); + } else { + throw new HttpException( + error?.message || 'Internal server error', + error?.status || 500, + ); + } + } + } +} diff --git a/apps/attestation-manager/src/userInfo/entities/update-unserInfo.dto.ts b/apps/attestation-manager/src/userInfo/entities/update-unserInfo.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..4bd5f1a9aad047c91192a6fbe5507470a20ed143 --- /dev/null +++ b/apps/attestation-manager/src/userInfo/entities/update-unserInfo.dto.ts @@ -0,0 +1,13 @@ +type UserInfo = { + [key: string]: any; +}; + +export default class UpdateUserInfoDto { + connectionId: string; + + status: string; + + credentialDefinitionId: string; + + userInfo: UserInfo; +} diff --git a/apps/attestation-manager/src/userInfo/entities/userInfo.entity.ts b/apps/attestation-manager/src/userInfo/entities/userInfo.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..021c8debf818d3e614e12cf2ff34b1372e71a9ce --- /dev/null +++ b/apps/attestation-manager/src/userInfo/entities/userInfo.entity.ts @@ -0,0 +1,21 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString, IsNotEmpty, IsEnum } from 'class-validator'; + +type UserInfo = { + [key: string]: any; +}; +export default class UserInfoDto { + @IsString() + @IsNotEmpty() + @ApiProperty() + connectionId: string; + + @IsEnum(['always', 'contentApproved', 'never']) + @IsNotEmpty() + @ApiProperty() + autoAcceptCredential: string; + + @IsNotEmpty() + @ApiProperty({ type: {} }) + userInfo: UserInfo; +} diff --git a/apps/attestation-manager/src/userInfo/module.ts b/apps/attestation-manager/src/userInfo/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..10e03e39ab22667abde4504a79852b8e650d5e8d --- /dev/null +++ b/apps/attestation-manager/src/userInfo/module.ts @@ -0,0 +1,35 @@ +import SchemasService from '@schemas/services/service'; +import { Module } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import UserInfoService from '@userInfo/services/service'; +import UserInfoController from '@userInfo/controller/controller'; +import NatsClientService from '@src/client/nats.client'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import RestClientService from '@src/client/rest.client'; +import config from '@config/config'; + +@Module({ + imports: [ + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + ], + controllers: [UserInfoController], + providers: [ + UserInfoService, + PrismaService, + NatsClientService, + RestClientService, + SchemasService, + ], +}) +export default class UserInfoModule {} diff --git a/apps/attestation-manager/src/userInfo/repository/userInfo.respository.ts b/apps/attestation-manager/src/userInfo/repository/userInfo.respository.ts new file mode 100644 index 0000000000000000000000000000000000000000..591b1fc1bf86e6b023f23a4cc908827fb696466f --- /dev/null +++ b/apps/attestation-manager/src/userInfo/repository/userInfo.respository.ts @@ -0,0 +1,34 @@ +import { Injectable } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export default class UserInfoRepository { + constructor(private readonly prismaService: PrismaService) {} + + async createUserInfo(data: Prisma.UserInfoCreateInput) { + const userInfo = await this.prismaService.userInfo.create({ + data, + }); + + return userInfo; + } + + async updateUserInfo(data: Prisma.UserInfoUncheckedUpdateManyInput) { + const userInfo = await this.prismaService.userInfo.updateMany({ + where: { + connectionId: data.connectionId as string, + }, + data, + }); + + return userInfo; + } + + async getUserInfo(params: { where: Prisma.UserInfoWhereInput }) { + const { where } = params; + return this.prismaService.userInfo.findFirst({ + where, + }); + } +} diff --git a/apps/attestation-manager/src/userInfo/services/service.ts b/apps/attestation-manager/src/userInfo/services/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..d87e1a652cda50d9a940ba9133f7f36638497d51 --- /dev/null +++ b/apps/attestation-manager/src/userInfo/services/service.ts @@ -0,0 +1,43 @@ +import logger from '@utils/logger'; +import { Injectable } from '@nestjs/common'; +import UserInfoDto from '@userInfo/entities/userInfo.entity'; +import UpdateUserInfoDto from '@userInfo/entities/update-unserInfo.dto'; +import UserInfoRepository from '@userInfo/repository/userInfo.respository'; +import PrismaService from '@DB/prisma.service'; + +@Injectable() +export default class UserInfoService { + private userInfoRepository: UserInfoRepository; + + constructor(private readonly prismaService: PrismaService) { + this.userInfoRepository = new UserInfoRepository(this.prismaService); + } + + async createUserInfo(userInfoDto: UserInfoDto) { + logger.info(`In user info service, ${JSON.stringify(userInfoDto)}`); + return this.userInfoRepository.createUserInfo({ + autoAcceptCredential: userInfoDto.autoAcceptCredential, + connectionId: userInfoDto.connectionId, + userInfo: userInfoDto.userInfo as object, + }); + } + + async updateUserInfo(userInfoDto: UpdateUserInfoDto) { + logger.info(`In user info service, ${userInfoDto}`); + return this.userInfoRepository.updateUserInfo({ + connectionId: userInfoDto.connectionId, + credentialDefinitionId: userInfoDto.credentialDefinitionId, + status: userInfoDto.status, + userInfo: userInfoDto.userInfo as object, + }); + } + + async getUserInfo(connectionId: string) { + logger.info(`In get user info service, ${connectionId}`); + return this.userInfoRepository.getUserInfo({ + where: { + connectionId, + }, + }); + } +} diff --git a/apps/attestation-manager/src/userInfo/tests/__mocks__/service.ts b/apps/attestation-manager/src/userInfo/tests/__mocks__/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..f40e506e5daa17fbb22b86ae902e6fd26764a76d --- /dev/null +++ b/apps/attestation-manager/src/userInfo/tests/__mocks__/service.ts @@ -0,0 +1,9 @@ +import userInfo from '@userInfo/tests/stubs/user-info-dto.stub'; + +const UserInfoServiceMock = jest.fn().mockReturnValue({ + createUserInfo: jest.fn().mockReturnValue(userInfo), + updateUserInfo: jest.fn().mockReturnValue(userInfo()), + getUserInfo: jest.fn().mockReturnValue(userInfo()), +}); + +export default UserInfoServiceMock; diff --git a/apps/attestation-manager/src/userInfo/tests/stubs/user-info-dto.stub.ts b/apps/attestation-manager/src/userInfo/tests/stubs/user-info-dto.stub.ts new file mode 100644 index 0000000000000000000000000000000000000000..a178765c599a17034da540f5af444f2d08537724 --- /dev/null +++ b/apps/attestation-manager/src/userInfo/tests/stubs/user-info-dto.stub.ts @@ -0,0 +1,14 @@ +import credentialDto from '@issueCredential/tests/stubs/credential-dto'; +import offerCredentialDto from '@issueCredential/tests/stubs/offer-credential-dto'; +import schemaDto from '@schemas/tests/stubs/schema-dto'; +import UserInfoDto from '@userInfo/entities/userInfo.entity'; + +const userInfo = (): UserInfoDto => ({ + autoAcceptCredential: offerCredentialDto().autoAcceptCredential, + connectionId: credentialDto().connectionId, + userInfo: { + ...schemaDto().attributes.map((attr) => ({ [attr]: attr })), + }, +}); + +export default userInfo; diff --git a/apps/attestation-manager/src/utils/common.ts b/apps/attestation-manager/src/utils/common.ts new file mode 100644 index 0000000000000000000000000000000000000000..1d2ea566d140549f39e5e8f9ab7bebcb4c90f88e --- /dev/null +++ b/apps/attestation-manager/src/utils/common.ts @@ -0,0 +1,12 @@ +import moment from 'moment'; + +const calculateExpiry = (expiry: string) => { + if (!expiry || expiry === '-1') return 'NA'; + + // Adding 'expiryHours' as number of hours to the Credential Definition + const expirationDate = moment().add(Number(expiry), 'h').toDate(); + + return expirationDate; +}; + +export default { calculateExpiry }; diff --git a/apps/attestation-manager/src/utils/exceptionsFilter.ts b/apps/attestation-manager/src/utils/exceptionsFilter.ts new file mode 100644 index 0000000000000000000000000000000000000000..388304be68a2e6638478db9de0e2feefcfe914a6 --- /dev/null +++ b/apps/attestation-manager/src/utils/exceptionsFilter.ts @@ -0,0 +1,61 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus, + Logger, +} from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; +import { Request } from 'express'; +import { Prisma } from '@prisma/client'; + +const { PrismaClientKnownRequestError, PrismaClientValidationError } = Prisma; + +@Catch() +export default class AllExceptionsFilter implements ExceptionFilter { + constructor(private readonly httpAdapterHost: HttpAdapterHost) {} + + catch(exception: any, host: ArgumentsHost): void { + const { httpAdapter } = this.httpAdapterHost; + + const ctx = host.switchToHttp(); + const request = ctx.getRequest<Request>(); + + let httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + let message = ''; + + switch (exception.constructor) { + case HttpException: + httpStatus = (exception as HttpException).getStatus(); + message = exception?.message || 'Internal server error'; + break; + case PrismaClientKnownRequestError: + httpStatus = HttpStatus.BAD_REQUEST; + message = exception?.message; + break; + case PrismaClientValidationError: + httpStatus = HttpStatus.BAD_REQUEST; + message = exception?.message; + break; + default: + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + message = exception?.message || 'Internal server error'; + } + + Logger.error( + 'Exception Filter :', + message, + (exception as any).stack, + `${request.method} ${request.url}`, + ); + + const responseBody = { + statusCode: httpStatus, + timestamp: new Date().toISOString(), + message, + }; + + httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus); + } +} diff --git a/apps/attestation-manager/src/utils/logger.ts b/apps/attestation-manager/src/utils/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..a486e3248dbe39af2b373e42203233e0f5e3813a --- /dev/null +++ b/apps/attestation-manager/src/utils/logger.ts @@ -0,0 +1,41 @@ +import { existsSync, mkdirSync } from 'fs'; +import { Logger } from 'winston'; +import ecsFormat from '@elastic/ecs-winston-format'; +// import { ElasticsearchTransport } from 'winston-elasticsearch'; +import winston = require('winston'); +import { LoggerConfig } from '@common/constants'; + +if (!existsSync(LoggerConfig.lOG_DIR)) { + mkdirSync(LoggerConfig.lOG_DIR); +} + +// const esTransportOpts = { +// clientOpts: { node: process.env.ECSURL }, +// }; + +// const esTransportOpts = { +// clientOpts: { node: 'http://localhost:9200' }, +// }; + +// const esTransport = new ElasticsearchTransport(esTransportOpts); + +// esTransport.on('error', (error: any) => { +// console.error('Error in logger caught', error); +// }); + +const logger: Logger = winston.createLogger({ + format: ecsFormat({ convertReqRes: true }), + transports: [ + new winston.transports.Console(), + new winston.transports.File({ + filename: LoggerConfig.FILE_PATH, + }), + // esTransport, + ], +}); + +logger.on('error', (error) => { + console.error('Error in logger caught', error); +}); + +export default logger; diff --git a/apps/attestation-manager/src/utils/pagination.ts b/apps/attestation-manager/src/utils/pagination.ts new file mode 100644 index 0000000000000000000000000000000000000000..953e8fc5941366794cf0fafa9cc4f32c8847d781 --- /dev/null +++ b/apps/attestation-manager/src/utils/pagination.ts @@ -0,0 +1,16 @@ +const pagination = (pageSize: number, page: number) => { + const query: { + skip?: number; + take?: number; + } = {}; + if (pageSize && (page || page === 0)) { + query.skip = page * pageSize; + query.take = pageSize; + } else { + query.skip = 0; + query.take = 10; + } + return query; +}; + +export default pagination; diff --git a/apps/attestation-manager/src/utils/tests/logger.spec.ts b/apps/attestation-manager/src/utils/tests/logger.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a775b98a0a200705e63b19e06178f808e7f212b9 --- /dev/null +++ b/apps/attestation-manager/src/utils/tests/logger.spec.ts @@ -0,0 +1,55 @@ +import fs from 'fs'; + +describe('Logger', () => { + let logger: any; + + jest.spyOn(fs, 'existsSync').mockImplementation(() => false); + jest.spyOn(fs, 'mkdirSync').mockImplementation(() => 'mocked'); + + beforeEach(async () => { + logger = await import('../logger'); + }); + + it('should call logger', async () => { + expect(logger).toBeDefined(); + }); + + it('should check if directory exists', async () => { + expect(fs.existsSync).toHaveBeenCalled(); + }); + + it('should create a directory if not exists', async () => { + expect(fs.mkdirSync).toHaveBeenCalled(); + }); +}); + +// import pagination from '../pagination'; + +// describe('Pagination', () => { +// let pageSize: number; +// let page: number; + +// it('should return skip 0 and take 10', async () => { +// pageSize = 0; +// page = 0; + +// const res = pagination(pageSize, page); + +// expect(res).toEqual({ +// skip: 0, +// take: 10, +// }); +// }); + +// it('should return skip (page * pageSize) and take (pageSize)', async () => { +// pageSize = 5; +// page = 0; + +// const res = pagination(pageSize, page); + +// expect(res).toEqual({ +// skip: page * pageSize, +// take: pageSize, +// }); +// }); +// }); diff --git a/apps/attestation-manager/src/utils/tests/pagination.spec.ts b/apps/attestation-manager/src/utils/tests/pagination.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d4e7879811a519c4d1577c17fe77fde202cfaa26 --- /dev/null +++ b/apps/attestation-manager/src/utils/tests/pagination.spec.ts @@ -0,0 +1,30 @@ +import pagination from '../pagination'; + +describe('Pagination', () => { + let pageSize: number; + let page: number; + + it('should return skip 0 and take 10', async () => { + pageSize = 0; + page = 0; + + const res = pagination(pageSize, page); + + expect(res).toEqual({ + skip: 0, + take: 10, + }); + }); + + it('should return skip (page * pageSize) and take (pageSize)', async () => { + pageSize = 5; + page = 0; + + const res = pagination(pageSize, page); + + expect(res).toEqual({ + skip: page * pageSize, + take: pageSize, + }); + }); +}); diff --git a/apps/attestation-manager/start.sh b/apps/attestation-manager/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..5c6b740ec5f3ab0374a1d669cf98cc4ffb8c0c90 --- /dev/null +++ b/apps/attestation-manager/start.sh @@ -0,0 +1 @@ +./node_modules/.bin/prisma db push --schema=./prisma/schema.prisma && node dist/src/main.js diff --git a/apps/attestation-manager/swagger.json b/apps/attestation-manager/swagger.json new file mode 100644 index 0000000000000000000000000000000000000000..80e10a286f71bf01b4bd6b2f35ded3a69bba2af5 --- /dev/null +++ b/apps/attestation-manager/swagger.json @@ -0,0 +1,1833 @@ +{ + "openapi": "3.0.0", + "paths": { + "/v1/health": { + "get": { + "operationId": "HealthController_getHealth", + "summary": "Health check", + "description": "This call provides the capability to check the service is working and up. The call returns 200 Status Code and current server time in json body", + "parameters": [], + "responses": { + "200": { + "description": "Service is up and running.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Service is up and running.": { + "value": { + "statusCode": 200, + "message": "Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time)" + } + } + } + } + } + } + } + } + }, + "/v1/schemas": { + "get": { + "operationId": "SchemasController_findSchemas", + "summary": "Fetch a list of schemas", + "description": "This call provides capabilities to search schemas (which have been created by this OCM) by using pagination. This call returns a list of schemas and overall count of records. Every record contains schemaId, name, attributes", + "parameters": [ + { + "name": "pageSize", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Schemas fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Schemas fetched successfully": { + "value": { + "statusCode": 200, + "message": "Schemas fetched successfully", + "data": { + "count": 2, + "records": [ + { + "id": "1234abcd", + "schemaID": "loremipsum:test-01-01:1.0", + "name": "test-01-01", + "createdBy": "agentName", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z", + "attribute": [ + { + "name": "attribute1" + }, + { + "name": "attribute2" + }, + { + "name": "attributeN" + } + ] + }, + { + "id": "5678abcd", + "schemaID": "loremipsum2:test2-01-01:1.0", + "name": "test2-01-01", + "createdBy": "agentName", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z", + "attribute": [ + { + "name": "attribute1" + }, + { + "name": "attribute2" + }, + { + "name": "attributeN" + } + ] + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found.": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Schemas" + ] + }, + "post": { + "operationId": "SchemasController_createSchema", + "summary": "Create a new schema", + "description": "This call provides the capability to create new schema on ledger by name, author, version, schema attributes and type. Later this schema can be used to issue new credential definition. This call returns an information about created schema.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaDto" + } + } + } + }, + "responses": { + "201": { + "description": "Schema created successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Schema created successfully": { + "value": { + "statusCode": 201, + "message": "Schema created successfully", + "data": { + "id": "1234qwer", + "schemaID": "loremipsum:2:test-02-01:1.0", + "name": "test-02-01", + "createdBy": "agentName", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z", + "attribute": [ + { + "name": "attribute1" + }, + { + "name": "attribute2" + }, + { + "name": "attributeN" + }, + { + "name": "attributeN+1" + } + ] + } + } + } + } + } + } + }, + "400": { + "description": "Schema required following attributes ( name, createdBy, version, attributes )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Schema required following attributes ( name, createdBy, version, attributes )": { + "value": { + "statusCode": 400, + "message": "Schema required following attributes ( name, createdBy, version, attributes )" + } + } + } + } + } + }, + "409": { + "description": "Schema already exists", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Schema already exists": { + "value": { + "statusCode": 409, + "message": "Schema already exists" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Schemas" + ] + } + }, + "/v1/schemas/{id}": { + "get": { + "operationId": "SchemasController_findSchemasById", + "summary": "Fetch schema by id", + "description": "This call provides the capability to get schema data by providing schemaId. The schema data is the same which is returned from /v1/schemas endpoint and contains generic information about schema like schemaID, name, createdBy, createdDate, updatedBy, updatedDate, attribute", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Pass schema id", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Schema fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Schema fetched successfully": { + "value": { + "statusCode": 200, + "message": "Schema fetched successfully", + "data": { + "count": 1, + "records": [ + { + "id": "1234abcd", + "schemaID": "loremipsum:test-01-01:1.0", + "name": "test-01-01", + "createdBy": "agentName", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z", + "attribute": [ + { + "name": "attribute1" + }, + { + "name": "attribute2" + }, + { + "name": "attributeN" + } + ] + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found.": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Schemas" + ] + } + }, + "/v1/schemas/get-dids-for-schema/{id}": { + "get": { + "operationId": "SchemasController_getDidsForSchema", + "summary": "Fetch list of dids for schema id", + "description": "This call provides the capability to get principal dids. The format of the response is shown in the example. To issue credentials, you need to have a credential definition. This is a basic principle of this process. This credential definition is created by using the schema. Using this endpoint gives you all dids of participants to whom OCM issued credentials using specified schema.", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Schema DIDs fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Schema DIDs fetched successfully": { + "value": { + "statusCode": 200, + "message": "Schema DIDs fetched successfully", + "data": { + "total_credential_defs": 1, + "principalDids": [ + { + "loremIpsumCredDef": [ + "1234did" + ] + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found.": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Schemas" + ] + } + }, + "/v1/create-offer-credential": { + "post": { + "operationId": "AttestationController_createOfferCredential", + "summary": "Send credential offer to a connection", + "description": "This call provides the capability to offer credentials to a connection. You need to provide information about credential definition, connection and attributes which will be send to connection. Initial state of this is offer-sent (workflow is here https://github.com/hyperledger/aries-rfcs/tree/main/features/0036-issue-credential). This call returns information about this credential offer. From user perspective this call means that as organization (e.g. Faber university) I want to start issuing crendentials to student (Alice, holder)", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/OfferCredentialDto" + } + } + } + }, + "responses": { + "201": { + "description": "Credential created successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential created successfully": { + "value": { + "statusCode": 201, + "message": "Credential created successfully", + "data": { + "_tags": {}, + "metadata": { + "_internal/indyCredential": { + "credentialDefinitionId": "7KuDTpQh3GJ7Gp6", + "schemaId": "7KuDTpQash2" + } + }, + "id": "61c5df9c", + "createdAt": "1970-01-01T12:07:57.388Z", + "state": "offer-sent", + "connectionId": "12cd39de", + "threadId": "195e8ae3", + "offerMessage": { + "@type": "https://didcomm.org/issue-credential/1.0/offer-credential", + "@id": "195e8da", + "comment": "asd", + "credential_preview": { + "@type": "https://didcomm.org/issue-credential/1.0/credential-preview", + "attributes": [ + { + "name": "firstName", + "value": "Lorem" + }, + { + "name": "email", + "value": "lorem@example.com" + }, + { + "name": "au", + "value": "ipsum" + }, + { + "name": "expirationDate", + "value": "Wed Mar 01 2084 11:07:57 GMT+0000 (Coordinated Universal Time)" + } + ] + }, + "offers~attach": [ + { + "@id": "libindy-cred-offer-0", + "mime-type": "application/json", + "data": { + "base64": "eyJzY2hlbWFf" + } + } + ] + }, + "credentialAttributes": [ + { + "name": "attribute1", + "value": "testValue1" + }, + { + "name": "attribute2", + "value": "testValue2" + }, + { + "name": "attributeN", + "value": "testValueN" + }, + { + "name": "expirationDate", + "value": "Wed Mar 01 2023 11:07:57 GMT+0000 (Coordinated Universal Time)" + } + ], + "autoAcceptCredential": "always" + } + } + } + } + } + } + }, + "400": { + "description": "offer credentials required following attributes ( connectionId, credentialDefinitionId, attributes, autoAcceptCredential)", + "content": { + "application/json": { + "schema": {}, + "examples": { + "offer credentials required following attributes ( connectionId, credentialDefinitionId, attributes, autoAcceptCredential)": { + "value": { + "statusCode": 400, + "message": "offer credentials required following attributes ( connectionId, credentialDefinitionId, attributes, autoAcceptCredential)" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/create-propose-credential": { + "post": { + "operationId": "AttestationController_createProposeCredential", + "summary": "Send credential proposal to a connection", + "description": "This call provides the capability to send propose crendential request to a connection. You need to provide information about credential definition, connection and attributes which you want to use for creating credentials. Initial state of this is proposal-sent (workflow is here https://github.com/hyperledger/aries-rfcs/tree/main/features/0036-issue-credential). This call returns information about this credential proposal. From user perspective this call means that as user (e.g. student) I want to ask organization (e.g. Faber university) to initiate issuing credentials for me using provided data", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProposeCredentialDto" + } + } + } + }, + "responses": { + "201": { + "description": "Credential proposed successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential proposed successfully": { + "value": { + "statusCode": 201, + "message": "Credential proposed successfully", + "data": { + "_tags": {}, + "metadata": { + "_internal/indyCredential": { + "credentialDefinitionId": "7KuDTpQh3GJ7Gp6kErpWvM:3:CL:39399:test-13-03" + } + }, + "id": "c566907d", + "createdAt": "1970-01-01T00:00:09.383Z", + "state": "proposal-sent", + "connectionId": "12cd39de", + "threadId": "e271b1a0", + "proposalMessage": { + "@type": "https://didcomm.org/issue-credential/1.0/propose-credential", + "@id": "e271b1a0", + "comment": "asd", + "credential_proposal": { + "@type": "https://didcomm.org/issue-credential/1.0/credential-preview", + "attributes": [ + { + "name": "firstName", + "value": "TESTING" + }, + { + "name": "email", + "value": "asd@asd.asd" + }, + { + "name": "au", + "value": "level1" + } + ] + }, + "cred_def_id": "1234abcd" + }, + "credentialAttributes": [ + { + "name": "firstName", + "value": "TESTING" + }, + { + "name": "email", + "value": "asd@asd.asd" + }, + { + "name": "au", + "value": "level1" + } + ], + "autoAcceptCredential": "never" + } + } + } + } + } + } + }, + "400": { + "description": "Connection is not trusted", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Connection is not trusted": { + "value": { + "statusCode": 400, + "message": "Connection is not trusted" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/accept-request/{credentialId}": { + "post": { + "operationId": "AttestationController_acceptOfferCredential", + "summary": "Accept credential request by credential id", + "description": "Accept a credential request as issuer (by sending a credential message) to the connection associated with the credential record.", + "parameters": [], + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/accept-proposal/{credentialId}": { + "post": { + "operationId": "AttestationController_acceptProposeCredential", + "summary": "Accept credential proposal by credential id", + "description": "Accept a credential proposal as issuer (by sending a credential offer message) to the connection associated with the credential record.", + "parameters": [], + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/accept-offer/{credentialId}": { + "post": { + "operationId": "AttestationController_acceptCredentialOffer", + "summary": "Accept credential offer by credential id", + "description": "Accept a credential offer as holder (by sending a credential request message) to the connection associated with the credential record.", + "parameters": [], + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/accept-credential/{credentialId}": { + "post": { + "operationId": "AttestationController_acceptCredential", + "summary": "Accept credentials by credential id", + "description": "Accept a credential as holder (by sending a credential acknowledgement message) to the connection associated with the credential record.", + "parameters": [], + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/credential-info/{id}": { + "get": { + "operationId": "AttestationController_getCredentialInfo", + "summary": "Fetch credential information by credential id", + "description": "This call provides the capability to get credential information by credential id. This call returns a credential record (CredentialRecord type with fields connectionId, threadId, credentialId, state, autoAcceptCredential, errorMessage, proposalMessage, offerMessage, requestMessage, credentialMessage, credentialAttributes, linkedAttachments and others). This request get credential data directly from agent, so you can use this endpoint to get some additional info which is not presented in /v1/credential/{id}", + "parameters": [], + "responses": { + "200": { + "description": "Credential information fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential information fetched successfully": { + "value": {} + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/delete-credential/{id}": { + "delete": { + "operationId": "AttestationController_deleteCredential", + "summary": "Delete credential by id", + "description": "This call provides the capability to delete credential (request/offer/proposal) by provided credential id", + "parameters": [], + "responses": { + "200": { + "description": "Credential deleted successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential deleted successfully": { + "value": { + "statusCode": 200, + "message": "Credential deleted successfully" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/credential": { + "get": { + "operationId": "AttestationController_getCredentialList", + "summary": "Fetch a list of credentials", + "description": "This call provides the capability to search credentials by using pagination and filter parameters to select credentials. This call returns a list of credentials and overall count of records. Filter supports following parameters: page, pageSize, isReceived, threadId, state, credDefId, createdDateStart, createdDateEnd, updatedDateStart, updatedDateEnd, expirationDateStart, expirationDateEnd, connectionId, principalDid", + "parameters": [ + { + "name": "principalDid", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "connectionId", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "expirationDateEnd", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "expirationDateStart", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "updatedDateEnd", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "updatedDateStart", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "createdDateEnd", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "createdDateStart", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "credDefId", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "state", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "threadId", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "isReceived", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Credential fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential fetched successfully": { + "value": { + "statusCode": 200, + "message": "Credential fetched successfully", + "data": { + "count": 87, + "records": [ + { + "id": "14875384", + "credentialId": "c566907d", + "credDefId": "7KuDTpQh3GJ", + "threadId": "e271b1a0", + "state": "proposal-sent", + "principalDid": "KGaeQVaF", + "connectionId": "12cd39de", + "createdDate": "1970-01-01T00:00:09.761Z", + "updatedDate": "1970-01-01T00:00:09.761Z", + "expirationDate": "2070-01-01T00:00:09.756Z" + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/credential/{id}": { + "get": { + "operationId": "AttestationController_getCredential", + "summary": "Fetch credential by id", + "description": "This call provides the capability to get credential data by providing credential id. The credential definition data is the same which is returned from /v1/credential endpoint and contains generic information about credential like credentialId, credDefId, threadId, state, principalDid, connectionId, createdDate, updatedDate, expirationDate", + "parameters": [], + "responses": { + "200": { + "description": "Credential fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential fetched successfully": { + "value": { + "statusCode": 200, + "message": "Credential fetched successfully", + "data": { + "id": "14875384", + "credentialId": "c566907d", + "credDefId": "7KuDTpQh3GJ", + "threadId": "e271b1a0", + "state": "proposal-sent", + "principalDid": "KGaeQVaF", + "connectionId": "12cd39de", + "createdDate": "1970-01-01T00:00:09.761Z", + "updatedDate": "1970-01-01T00:00:09.761Z", + "expirationDate": "2070-01-01T00:00:09.756Z" + } + } + } + } + } + } + }, + "404": { + "description": "No Data found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/updateSchemaIdByType": { + "patch": { + "operationId": "AttestationController_updateSchemaIdByType", + "summary": "Update schemaId in CredentialsType", + "description": "This call provides the capability to update mapping between schema and type.", + "parameters": [ + { + "name": "type", + "required": true, + "in": "query", + "schema": {} + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UpdateSchemaIdByTypeDto" + } + } + } + }, + "responses": { + "200": { + "description": "schemaId updated in CredentialsType", + "content": { + "application/json": { + "schema": {}, + "examples": { + "schemaId updated in CredentialsType": { + "value": { + "statusCode": 200, + "message": "schemaId updated in CredentialsType", + "data": { + "id": "d6ef2d010", + "type": "principalMemberCredential", + "schemaId": "7KuDTpQh3GJ7Gp6kErpWvM:2:principalTestSchema:1.0" + } + } + } + } + } + } + }, + "404": { + "description": "Not Found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Not Found": { + "value": { + "status": 404, + "message": "Not Found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/credentialType": { + "post": { + "operationId": "AttestationController_createCredentialType", + "summary": "Create new CredentialType", + "description": "This call provides the capability to create mapping between schema and type.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialTypeDto" + } + } + } + }, + "responses": { + "201": { + "description": "schemaId added in CredentialsType of membership credentials.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "schemaId added in CredentialsType of membership credentials.": { + "value": { + "statusCode": 201, + "message": "schemaId added in CredentialsType of membership credentials.", + "data": { + "id": "d6ef2d01", + "type": "principalMemberCredential", + "schemaId": "7KuDTpQh3GJ7Gp6kErpWvM:2:principalTestSchema:1.0" + } + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + }, + "get": { + "operationId": "AttestationController_getCredentialTypeAttributes", + "summary": "Fetch CredentialType contains schemaId and attributes by type", + "description": "This call provides the capability to get schema id and its attributes by provided type", + "parameters": [ + { + "name": "type", + "required": true, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Credential type retrieved successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential type retrieved successfully": { + "value": { + "schema": { + "schemaID": "7KuDTpQh3GJ7Gp6kErpWvM:2:principalTestSchema:1.0", + "attribute": [ + "prcPreferredUsername", + "issuerDID", + "prcGender", + "prcBirthdate", + "expirationDate", + "prcLastName", + "prcFirstName", + "email", + "prcMiddleName", + "subjectDID", + "auth_time", + "email_verified" + ] + } + } + } + } + } + } + }, + "404": { + "description": "Credential type not found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential type not found": {} + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credentials" + ] + } + }, + "/v1/credentialDef": { + "get": { + "operationId": "CredentialDefController_findCredentialDef", + "summary": "Fetch a list of credential definitions", + "description": "This call provides the capability to search created credential definitions by using pagination and filter parameter (schemaID) to select credential definitions. This call returns a list of credential definitions and overall count of records. Using a credential definition from that list you can issue credential so some connection", + "parameters": [ + { + "name": "schemaID", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Credential definitions fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential definitions fetched successfully": { + "value": { + "statusCode": 200, + "message": "Credential definitions fetched successfully", + "data": { + "count": 2, + "records": [ + { + "id": "1234abcd", + "schemaID": "loremipsum:test-01-01:1.0", + "name": "test-01-01", + "credDefId": "test-cred-def123", + "isAutoIssue": false, + "isRevokable": false, + "expiryHours": "24", + "createdBy": "acceptsAnyString", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z" + }, + { + "id": "5678abcd", + "schemaID": "loremipsum2:test2-01-01:1.0", + "name": "test2-01-01", + "credDefId": "test2-cred-def123", + "isAutoIssue": false, + "isRevokable": false, + "expiryHours": "24", + "createdBy": "acceptsAnyString", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z" + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found.": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credential Definitions" + ] + }, + "post": { + "operationId": "CredentialDefController_createCredentialDef", + "summary": "Create a new credential definition", + "description": "This call provides the capability to create new credential definition by providing schema id, name, createdBy, auto-issue and other information required by this method. This call returns an object contains information abut this credential definition (type CredentialDefDto). You can use this credential definition to issue credentials to some connection", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialDefDto" + } + } + } + }, + "responses": { + "201": { + "description": "Credential definition created successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential definition created successfully": { + "value": { + "statusCode": 201, + "message": "Credential definition created successfully", + "data": { + "id": "71b784a3", + "schemaID": "7KuDTpQh3:test-schema", + "name": "test", + "credDefId": "7KuDTpQh3:test", + "isAutoIssue": false, + "isRevokable": false, + "expiryHours": "23", + "createdBy": "vocm", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z" + } + } + } + } + } + } + }, + "400": { + "description": "Credential definition required following attributes ( schemaID, name, isRevokable, isAutoIssue, createdBy, expiryHours )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential definition required following attributes ( schemaID, name, isRevokable, isAutoIssue, createdBy, expiryHours )": { + "value": { + "statusCode": 400, + "message": "Credential definition required following attributes ( schemaID, name, isRevokable, isAutoIssue, createdBy, expiryHours )" + } + } + } + } + } + }, + "409": { + "description": "Credential definition already exists", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential definition already exists": { + "value": { + "statusCode": 409, + "message": "Credential definition already exists" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credential Definitions" + ] + } + }, + "/v1/credentialDef/{id}": { + "get": { + "operationId": "CredentialDefController_findCredentialDefById", + "summary": "Fetch credential definition by id", + "description": "This call provides the capability to get credential definition data by providing id of credential definition. The credential definition data is the same which is returned from /v1/connections endpoint and contains generic information about credential definition like schemaID, name, credDefId, isAutoIssue, isRevokable, expiryHours, createdBy, createdDate, updatedBy, updatedDate", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "description": "Pass Cred Def id", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Credential definition fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Credential definition fetched successfully": { + "value": { + "statusCode": 200, + "message": "Credential definition fetched successfully", + "data": { + "count": 1, + "records": [ + { + "id": "1234abcd", + "schemaID": "loremipsum:test-01-01:1.0", + "name": "test-01-01", + "credDefId": "test-cred-def123", + "isAutoIssue": false, + "isRevokable": false, + "expiryHours": "24", + "createdBy": "acceptsAnyString", + "createdDate": "1970-01-01T00:00:28.343Z", + "updatedBy": "", + "updatedDate": "1970-01-01T00:00:28.343Z" + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error.": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:27.897Z", + "message": "Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Credential Definitions" + ] + } + }, + "/v1/userInfo": { + "post": { + "operationId": "UserInfoController_createUserInfo", + "summary": "Add user information to a connection", + "description": "This call provides the capability to add any additional information to connection. The format of added data is just a simple json", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/UserInfoDto" + } + } + } + }, + "responses": { + "201": { + "description": "" + } + }, + "tags": [ + "userInfo (to be deprecated)" + ] + } + } + }, + "info": { + "title": "Gaia-x Attestation Manager API", + "description": "API documentation for GAIA-X Attestation Manager", + "version": "1.0", + "contact": {} + }, + "tags": [], + "servers": [], + "components": { + "schemas": { + "SchemaDto": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "version": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { + "type": "string" + } + }, + "type": { + "type": "string" + } + }, + "required": [ + "name", + "createdBy", + "version", + "attributes" + ] + }, + "CredentialPreviewAttributes": { + "type": "object", + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "required": [ + "name", + "value" + ] + }, + "OfferCredentialDto": { + "type": "object", + "properties": { + "connectionId": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "attributes": { + "type": "array", + "items": { + "$ref": "#/components/schemas/CredentialPreviewAttributes" + } + }, + "autoAcceptCredential": { + "type": "string" + } + }, + "required": [ + "connectionId", + "credentialDefinitionId", + "comment", + "attributes", + "autoAcceptCredential" + ] + }, + "ProposeCredentialDto": { + "type": "object", + "properties": { + "connectionId": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "credentialProposal": { + "type": "object" + }, + "autoAcceptCredential": { + "type": "string" + } + }, + "required": [ + "connectionId", + "credentialDefinitionId", + "comment", + "credentialProposal", + "autoAcceptCredential" + ] + }, + "UpdateSchemaIdByTypeDto": { + "type": "object", + "properties": { + "schemaId": { + "type": "string" + } + }, + "required": [ + "schemaId" + ] + }, + "CredentialTypeDto": { + "type": "object", + "properties": { + "type": { + "type": "string" + }, + "schemaId": { + "type": "string" + } + }, + "required": [ + "type", + "schemaId" + ] + }, + "CredentialDefDto": { + "type": "object", + "properties": { + "schemaID": { + "type": "string" + }, + "name": { + "type": "string" + }, + "isRevokable": { + "type": "boolean" + }, + "isAutoIssue": { + "type": "boolean" + }, + "expiryHours": { + "type": "string" + }, + "createdBy": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "required": [ + "schemaID", + "name", + "isRevokable", + "isAutoIssue", + "expiryHours", + "createdBy" + ] + }, + "UserInfoDto": { + "type": "object", + "properties": { + "connectionId": { + "type": "string" + }, + "autoAcceptCredential": { + "type": "string" + }, + "userInfo": { + "type": "object", + "properties": {} + } + }, + "required": [ + "connectionId", + "autoAcceptCredential", + "userInfo" + ] + } + } + } +} diff --git a/apps/attestation-manager/test/app.e2e-spec.ts b/apps/attestation-manager/test/app.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..5052f6bc31bbc1141f0909d2a0104525f49796ef --- /dev/null +++ b/apps/attestation-manager/test/app.e2e-spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import AppModule from '@src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => + request(app.getHttpServer()).get('/').expect(200).expect('Hello World!')); +}); diff --git a/apps/attestation-manager/test/jest-e2e.json b/apps/attestation-manager/test/jest-e2e.json new file mode 100644 index 0000000000000000000000000000000000000000..e9d912f3e3cefc18505d3cd19b3a5a9f567f5de0 --- /dev/null +++ b/apps/attestation-manager/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/attestation-manager/tsconfig.build.json b/apps/attestation-manager/tsconfig.build.json new file mode 100644 index 0000000000000000000000000000000000000000..64f86c6bd2bb30e3d22e752295eb7c7923fc191e --- /dev/null +++ b/apps/attestation-manager/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/apps/attestation-manager/tsconfig.json b/apps/attestation-manager/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..3bd0cdcd53eb247acbf78c2d2d64492445c477bf --- /dev/null +++ b/apps/attestation-manager/tsconfig.json @@ -0,0 +1,40 @@ +{ + "compilerOptions": { + "target": "es6", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "module": "commonjs", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "strict": true, + "skipLibCheck": true, + "baseUrl": "./", + "strictPropertyInitialization": false, + "sourceMap": true, + "strictNullChecks": true, + "paths": { + "@src/*": ["src/*"], + "@config/*": ["config/*"], + "@utils/*" :["src/utils/*"], + "@common/*":["src/common/*"], + "@schemas/*":["src/schemas/*"], + "@credentialDef/*": ["src/credentialDef/*"], + "@issueCredential/*": ["src/issue-credential/*"], + "@userInfo/*": ["src/userInfo/*"], + "@health/*":["src/health/*"], + "@DB/*":["src/prisma/*"] + }, + "types": [ + "node", + "jest", + "express" + ] + }, + "include": [ + "**/*.ts", + "src", + "config", + ], + "exclude": ["node_modules", "./dist/**/*"] +} diff --git a/apps/connection-manager/.dockerignore b/apps/connection-manager/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..68cfddeb9ca7bfcaae9d9c8660dfd04b7bdfc657 --- /dev/null +++ b/apps/connection-manager/.dockerignore @@ -0,0 +1,20 @@ +Jenkinsfile +coverage +docker-compose.yml +docs +node_modules +yarn-error.log +*.md +!README.md +.circle* +.codecov* +.coveralls* +.drone* +.editorconfig +# .env +.git* +.huskyrc* +.lintstagedrc* +.npmignore +.prettierrc* +dist diff --git a/apps/connection-manager/.env.example b/apps/connection-manager/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..09f908724b0ad38ecfacfdc1b4991eb58571e8f1 --- /dev/null +++ b/apps/connection-manager/.env.example @@ -0,0 +1,10 @@ +PORT=3003 +CONNECTION_MANAGER_URL=http://localhost:3003 +DATABASE_URL=postgresql://root:password@localhost:5432/postgres?schema=connection +ECSURL=http://localhost:9200/ +NATS_URL=nats://localhost:4222 +AGENT_URL=http://localhost:3010 +USE_AUTH=false +OAUTH_CLIENT_ID=clientid +OAUTH_CLIENT_SECRET=clientsecret +OAUTH_TOKEN_URL=https://tokenurl \ No newline at end of file diff --git a/apps/connection-manager/.eslintrc.js b/apps/connection-manager/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..45096635436d87471c78252f906f5e3f5a2aed9c --- /dev/null +++ b/apps/connection-manager/.eslintrc.js @@ -0,0 +1,28 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'airbnb-base', + 'airbnb-typescript/base', + ], + parserOptions: { + project: './tsconfig.json', + }, + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/apps/connection-manager/.prettierrc b/apps/connection-manager/.prettierrc new file mode 100644 index 0000000000000000000000000000000000000000..dcb72794f5300a3e0ccd2ad0669d802b62f3d370 --- /dev/null +++ b/apps/connection-manager/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/apps/connection-manager/GDPR.md b/apps/connection-manager/GDPR.md new file mode 100644 index 0000000000000000000000000000000000000000..ee20399b90c412e6d6bcbe896b2a4a9acc1e46eb --- /dev/null +++ b/apps/connection-manager/GDPR.md @@ -0,0 +1,23 @@ +# GDPR Compliance Document +The objective of this document is to detail, the data being stored and proccessed by the Organization Credential Manager's, Connection Manger. + +## What information is stored +### Source User Information +The email id received from the user. + +### Technical User Information (Public) +- DID of the OCM agent +- DID of the other participant in the connection +- Connection Status +- Connection Internal Ids +- Date created and updated +- Holder email as well as wallet name is stored in DB + +## How is the information stored +The Source User Information and Technical User Information is encrypted using the Private Key of the Organizations SSI Agent and stored internally (on the agent) on PostgreSQL and externally/ metadata (shared between the OCM services) on PostgreSQL of Organization. + +## Who can access the information +The Source User Information and Technical User Information both are accessible only by the Organization specific SSI agent's private key. + +## How long will the information stay +The Source User Information and Technical User Information is wiped out according to the retention periods (not defined yet). diff --git a/apps/connection-manager/Gaia-x Connection Manager API.postman_collection.json b/apps/connection-manager/Gaia-x Connection Manager API.postman_collection.json new file mode 100644 index 0000000000000000000000000000000000000000..201a66918deb464b641847eee3f8fe5b9079aefe --- /dev/null +++ b/apps/connection-manager/Gaia-x Connection Manager API.postman_collection.json @@ -0,0 +1,673 @@ +{ + "info": { + "_postman_id": "1da5476b-7f1e-4a30-8dba-b348f7ac6672", + "name": "Gaia-x Connection Manager API", + "description": "API documentation for GAIA-X Connection Manager", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "10250261" + }, + "item": [ + { + "name": "Fetch connection by connection id", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/connections/adede599-a398-49ea-b115-b8522d17f714", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "connections", + "adede599-a398-49ea-b115-b8522d17f714" + ] + } + }, + "response": [ + { + "name": "Fetch connection by connection id", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/connections/adede599-a398-49ea-b115-b8522d17f714", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "connections", + "adede599-a398-49ea-b115-b8522d17f714" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 02:02:41 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "430" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"1ae-MrfZd4/V8Lo8suMlUBONZ1OD7d4\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Connections fetch successfully\",\n \"data\": {\n \"records\": {\n \"id\": \"5457aa3a-9885-4f2c-83c4-54189102dcb2\",\n \"connectionId\": \"adede599-a398-49ea-b115-b8522d17f714\",\n \"status\": \"trusted\",\n \"participantDid\": \"5hfjHDaZMTknD4kVApcXnC\",\n \"theirDid\": \"UZkhCWb66vXWpDiBK6jJD9\",\n \"theirLabel\": \"ssi-abstraction-agent\",\n \"createdDate\": \"2023-04-05T10:06:13.140Z\",\n \"updatedDate\": \"2023-04-05T10:06:13.761Z\",\n \"isActive\": true,\n \"isReceived\": true\n }\n }\n}" + } + ] + }, + { + "name": "Fetch list of connections with pagination and queries", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/connections?page=0&pageSize=25&status&participantDID", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "connections" + ], + "query": [ + { + "key": "page", + "value": "0" + }, + { + "key": "pageSize", + "value": "25" + }, + { + "key": "status", + "value": null + }, + { + "key": "participantDID", + "value": null + } + ] + } + }, + "response": [ + { + "name": "Fetch list of connections with pagination and queries", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/connections?page=0&pageSize=25&status&participantDID", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "connections" + ], + "query": [ + { + "key": "page", + "value": "0" + }, + { + "key": "pageSize", + "value": "25" + }, + { + "key": "status", + "value": null + }, + { + "key": "participantDID", + "value": null + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 02:00:49 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "8254" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"203e-T9AKdRFxK834ZNwao8c6y6TX3wc\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Connections fetch successfully\",\n \"data\": {\n \"count\": 232,\n \"records\": [\n {\n \"id\": \"008e3953-15d9-421c-ba30-3b06661595fe\",\n \"connectionId\": \"a11a0f89-bdc7-468d-a76f-0f2652af1447\",\n \"status\": \"invited\",\n \"participantDid\": \"PYk6P7VfYMHTEqdnQBEtuY\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-04-06T11:36:24.395Z\",\n \"updatedDate\": \"2023-04-06T11:36:24.395Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"015b95e0-6a43-4b11-9d2d-89e17fddfcc2\",\n \"connectionId\": \"c3d767ea-9e02-4076-8e92-d2a7942e4800\",\n \"status\": \"invited\",\n \"participantDid\": \"9obzVbmTx3oCNLoQeKdS1U\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-23T07:52:11.931Z\",\n \"updatedDate\": \"2023-03-23T07:52:11.931Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"0215762c-e581-46e5-a789-4ff13adc3dff\",\n \"connectionId\": \"52ae2374-4c9e-4abd-9da5-aabe98d6acb4\",\n \"status\": \"invited\",\n \"participantDid\": \"Lg6tP3d456p6oyereiCiKU\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-05-10T09:28:45.850Z\",\n \"updatedDate\": \"2023-05-10T09:28:45.850Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"02c81e42-7cfa-47fa-a819-dfbc14042ec2\",\n \"connectionId\": \"7cb7cdec-fd69-4c3a-93f4-ab3f85bfa7cb\",\n \"status\": \"invited\",\n \"participantDid\": \"HJ66AqHk4fpvbPXUjb9VqN\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-09T10:24:37.644Z\",\n \"updatedDate\": \"2023-03-09T10:24:37.644Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"03563562-d0dc-4c0d-804a-42adbfd4ea4d\",\n \"connectionId\": \"9d756266-f9fc-4a12-88b2-5123166aebae\",\n \"status\": \"invited\",\n \"participantDid\": \"FTzEn6oyH6peQigjc5pyxp\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-22T13:24:10.790Z\",\n \"updatedDate\": \"2023-03-22T13:24:10.790Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"049020d5-8c21-4ea0-89b0-39426e385c73\",\n \"connectionId\": \"6a625623-1ae1-4c26-ae9e-8ae7043a439a\",\n \"status\": \"trusted\",\n \"participantDid\": \"95GnbqtZSARbgVDRgstB6A\",\n \"theirDid\": \"QhiAVXCFc4aFeo8Xeio7cD\",\n \"theirLabel\": \"cef7d748-0e1e-409d-a992-eed8fde1f603\",\n \"createdDate\": \"2023-05-09T13:32:59.666Z\",\n \"updatedDate\": \"2023-05-09T13:43:19.978Z\",\n \"isActive\": true,\n \"isReceived\": false\n },\n {\n \"id\": \"04f11557-4157-4083-a73f-f6c1dc233583\",\n \"connectionId\": \"058d420f-af66-4489-be17-2e5bcdd4d7cd\",\n \"status\": \"trusted\",\n \"participantDid\": \"Fkr8PoGdHGHPEHsUiZpVD2\",\n \"theirDid\": \"Ue61ZtAw1RVzfU42JHbXcU\",\n \"theirLabel\": \"ssi-abstraction-agent\",\n \"createdDate\": \"2023-05-09T08:20:47.044Z\",\n \"updatedDate\": \"2023-05-09T08:20:48.154Z\",\n \"isActive\": true,\n \"isReceived\": true\n },\n {\n \"id\": \"04f7aa6c-dcc2-4a3c-9300-9b21e8045a17\",\n \"connectionId\": \"2de29e2f-50cc-45f2-95ef-1770bc3c7b9d\",\n \"status\": \"trusted\",\n \"participantDid\": \"Mmik8v2w5DrZdi755maeFJ\",\n \"theirDid\": \"Ud2wNAWLFEaBaRvdUKwwVa\",\n \"theirLabel\": \"557a4089-4e72-402c-8422-5ddaac2f3d1b\",\n \"createdDate\": \"2023-03-27T07:35:28.046Z\",\n \"updatedDate\": \"2023-03-27T07:35:38.401Z\",\n \"isActive\": true,\n \"isReceived\": false\n },\n {\n \"id\": \"055ad5f4-d9f3-46e0-9279-8f8c3071ae32\",\n \"connectionId\": \"7e44f02f-9c4f-4c65-a028-d2f90f907ee5\",\n \"status\": \"trusted\",\n \"participantDid\": \"5rBDJq3yK3MLCe8pny4kLz\",\n \"theirDid\": \"RbaMdHuU8PNAHYi2YouicD\",\n \"theirLabel\": \"44f30cb6-7b3b-4a84-861b-767fe670ce26\",\n \"createdDate\": \"2023-05-22T13:47:45.062Z\",\n \"updatedDate\": \"2023-05-22T13:48:16.503Z\",\n \"isActive\": true,\n \"isReceived\": false\n },\n {\n \"id\": \"0605a933-8f4c-4cd4-b816-79bc17ebc47a\",\n \"connectionId\": \"d8f473d7-1055-4512-bd27-60394314ef2f\",\n \"status\": \"invited\",\n \"participantDid\": \"WBduFTtbz3si6RnebYh91m\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-07T08:09:36.156Z\",\n \"updatedDate\": \"2023-03-07T08:09:36.156Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"06954fec-600c-4d97-81e3-b65d2c8a4d90\",\n \"connectionId\": \"98e3538d-bb71-44e3-8ee4-4999ab357e8c\",\n \"status\": \"invited\",\n \"participantDid\": \"PafruvwBVEqSWJtXCq16Ge\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-05-22T10:27:14.205Z\",\n \"updatedDate\": \"2023-05-22T10:27:14.205Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"0804f8c0-9aff-43c6-a473-344369c9ddc7\",\n \"connectionId\": \"92ffb41e-0190-4731-99ca-af4308b0357a\",\n \"status\": \"complete\",\n \"participantDid\": \"TBkKc84kS2DELsDceQDHFh\",\n \"theirDid\": \"8qcNQgxQfAGJYa8mjgvjfB\",\n \"theirLabel\": \"ssi-abstraction-agent\",\n \"createdDate\": \"2023-04-24T09:17:55.082Z\",\n \"updatedDate\": \"2023-04-24T09:20:49.861Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"08b49296-5adb-416a-ba63-7d36cef4d6cd\",\n \"connectionId\": \"6bf8ecb9-4ce2-4fd7-8eec-73094fd118fc\",\n \"status\": \"trusted\",\n \"participantDid\": \"QZQH23QAKuMJxzwUQpXQUG\",\n \"theirDid\": \"31sxM8gpGFTU7YZ58q7rMB\",\n \"theirLabel\": \"e9cbfec0-6575-4025-aa6e-bedf7b7c5938\",\n \"createdDate\": \"2023-05-15T11:29:05.256Z\",\n \"updatedDate\": \"2023-05-15T11:29:10.037Z\",\n \"isActive\": true,\n \"isReceived\": false\n },\n {\n \"id\": \"09e6e5c4-2b4e-4610-82e9-7dac9435fd59\",\n \"connectionId\": \"14e554fe-c9da-4881-afe7-1d92bffe6eb6\",\n \"status\": \"requested\",\n \"participantDid\": \"My7fYuLyF7ptsMnBn5d7xH\",\n \"theirDid\": \"\",\n \"theirLabel\": \"ssi-abstraction-agent\",\n \"createdDate\": \"2023-05-09T11:15:42.452Z\",\n \"updatedDate\": \"2023-05-09T11:15:42.557Z\",\n \"isActive\": false,\n \"isReceived\": true\n },\n {\n \"id\": \"0b3435e3-cbed-4635-ab55-cacdaafbc1cb\",\n \"connectionId\": \"cdca3644-2147-47ce-abd4-7a82e6195d19\",\n \"status\": \"trusted\",\n \"participantDid\": \"8qcNQgxQfAGJYa8mjgvjfB\",\n \"theirDid\": \"TBkKc84kS2DELsDceQDHFh\",\n \"theirLabel\": \"ssi-abstraction-agent\",\n \"createdDate\": \"2023-04-24T09:20:48.866Z\",\n \"updatedDate\": \"2023-04-24T09:20:49.758Z\",\n \"isActive\": true,\n \"isReceived\": true\n },\n {\n \"id\": \"0ba240e7-0663-4220-b32c-6e9beaf8a39b\",\n \"connectionId\": \"3020b9cc-51c8-4ae7-9fa5-05f873260a6e\",\n \"status\": \"invited\",\n \"participantDid\": \"97rZZnBjDiQWVkNEu5kxoP\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-04-06T11:43:20.246Z\",\n \"updatedDate\": \"2023-04-06T11:43:20.246Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"0c0baac0-b452-46de-8796-a841e7661cb8\",\n \"connectionId\": \"f97bbf2b-9186-4326-80f6-d4235ef019b2\",\n \"status\": \"invited\",\n \"participantDid\": \"9bHihwYECeRbDyAWzGYrkR\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-04-04T14:40:22.948Z\",\n \"updatedDate\": \"2023-04-04T14:40:22.948Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"0d2ac070-b316-4d48-9c49-bcd68e626f00\",\n \"connectionId\": \"88f8d883-f5fc-4781-9a4c-04238fcd233b\",\n \"status\": \"invited\",\n \"participantDid\": \"66WLh3hCCSehqE4QoeLKD2\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-05-10T09:31:21.937Z\",\n \"updatedDate\": \"2023-05-10T09:31:21.937Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"0d44b8f7-e703-405d-ac48-f33e5261bda5\",\n \"connectionId\": \"e823cd0b-8bd3-46f7-9866-a949f8adb493\",\n \"status\": \"invited\",\n \"participantDid\": \"C9rZe9uuw9ogqw8FHPJx28\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-25T14:57:16.527Z\",\n \"updatedDate\": \"2023-03-25T14:57:16.527Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"0e5bce8f-4c92-4583-8413-11701f49fd14\",\n \"connectionId\": \"77bf538d-e2ae-4310-a45f-a4a51f26f02f\",\n \"status\": \"complete\",\n \"participantDid\": \"QLLQtZxcq7g8exUMYCAzJL\",\n \"theirDid\": \"2mcHSKBnpbQzzq7Kte8Fbi\",\n \"theirLabel\": \"de3d717c-fcb0-49fb-8bff-1e5a4acdc280\",\n \"createdDate\": \"2023-05-22T01:42:55.707Z\",\n \"updatedDate\": \"2023-05-22T01:43:24.442Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"0e7aae40-202d-4d12-968e-b93eab0858eb\",\n \"connectionId\": \"c4326fe8-dfb0-4c3c-9e26-068e01733abc\",\n \"status\": \"invited\",\n \"participantDid\": \"3ADpcR1D11ozo5UNWurLVY\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-05-10T12:19:56.914Z\",\n \"updatedDate\": \"2023-05-10T12:19:56.913Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"10bf37e2-f5b5-4e97-9c87-6e09bf723bce\",\n \"connectionId\": \"4aa93902-729d-42ad-b224-c21390055bdf\",\n \"status\": \"invited\",\n \"participantDid\": \"Kq7H3nDWnQhXYe5yosR1J7\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-05-10T09:57:05.517Z\",\n \"updatedDate\": \"2023-05-10T09:57:05.517Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"10dea699-a127-4082-b25e-68c128c937ee\",\n \"connectionId\": \"df7a1b85-ea59-40fc-9520-6ae59651eda0\",\n \"status\": \"invited\",\n \"participantDid\": \"Xekj3zM5wUQ1jvaL4cv4Ay\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-07T08:11:02.103Z\",\n \"updatedDate\": \"2023-03-07T08:11:02.103Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"114e8be7-49cd-4581-9675-06650833f1f1\",\n \"connectionId\": \"655fdf48-6ff9-4451-9f73-88621750a3fa\",\n \"status\": \"invited\",\n \"participantDid\": \"BrMoyqzb92hX6Xm2t6wNs5\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-27T07:20:27.591Z\",\n \"updatedDate\": \"2023-03-27T07:20:27.591Z\",\n \"isActive\": false,\n \"isReceived\": false\n },\n {\n \"id\": \"11def929-68a8-4464-bae6-e9bed225c68d\",\n \"connectionId\": \"61154910-3a13-4e65-b151-d0b9dfec9ecf\",\n \"status\": \"invited\",\n \"participantDid\": \"KDeiHYWP2Y5YgXSPbaZAW4\",\n \"theirDid\": \"\",\n \"theirLabel\": \"\",\n \"createdDate\": \"2023-03-30T11:12:13.346Z\",\n \"updatedDate\": \"2023-03-30T11:12:13.346Z\",\n \"isActive\": false,\n \"isReceived\": false\n }\n ]\n }\n}" + } + ] + }, + { + "name": "Fetch connection information by query id or did ", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/connection-information?connectionId=6a625623-1ae1-4c26-ae9e-8ae7043a439a&did", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "connection-information" + ], + "query": [ + { + "key": "connectionId", + "value": "6a625623-1ae1-4c26-ae9e-8ae7043a439a" + }, + { + "key": "did", + "value": null + } + ] + } + }, + "response": [ + { + "name": "Fetch connection information by query id or did ", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/connection-information?connectionId=6a625623-1ae1-4c26-ae9e-8ae7043a439a&did", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "connection-information" + ], + "query": [ + { + "key": "connectionId", + "value": "6a625623-1ae1-4c26-ae9e-8ae7043a439a" + }, + { + "key": "did", + "value": null + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 02:09:45 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "1294" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"50e-QdCj91548b/gSNWPOH6hEgXsq6k\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Connection information fetch successfully\",\n \"data\": {\n \"records\": {\n \"issueCredentials\": [\n {\n \"id\": \"d1b0a2e0-2d42-40c2-a1bf-f00187ac34c1\",\n \"credentialId\": \"abfd32ca-80fc-439d-ab62-1e19f909f670\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:46833:OCM1-passport\",\n \"threadId\": \"619094b6-dae4-4d35-83f6-bd3ef9a78ff3\",\n \"state\": \"done\",\n \"principalDid\": \"QhiAVXCFc4aFeo8Xeio7cD\",\n \"connectionId\": \"6a625623-1ae1-4c26-ae9e-8ae7043a439a\",\n \"createdDate\": \"2023-05-09T13:41:15.067Z\",\n \"updatedDate\": \"2023-05-09T13:41:29.640Z\",\n \"expirationDate\": null\n },\n {\n \"id\": \"8658a92b-807b-4627-a180-d9f8fd2389b5\",\n \"credentialId\": \"047978b7-ea0f-4ed9-92df-7bd01a91576b\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:50014:LoginCredentials2\",\n \"threadId\": \"f3d65d44-0735-4712-a9db-5dfb2489a58d\",\n \"state\": \"offer-sent\",\n \"principalDid\": \"QhiAVXCFc4aFeo8Xeio7cD\",\n \"connectionId\": \"6a625623-1ae1-4c26-ae9e-8ae7043a439a\",\n \"createdDate\": \"2023-05-22T07:19:37.637Z\",\n \"updatedDate\": \"2023-05-22T07:19:37.638Z\",\n \"expirationDate\": null\n }\n ],\n \"presentProofs\": [\n {\n \"id\": \"1daf4f41-d12e-40b0-8ff0-e03436735ade\",\n \"proofRecordId\": \"8eb6beb7-3f38-4482-90c4-14b27342b35f\",\n \"connectionId\": \"6a625623-1ae1-4c26-ae9e-8ae7043a439a\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"done\",\n \"createdDate\": \"2023-05-09T13:42:09.025Z\",\n \"updatedDate\": \"2023-05-09T13:43:19.967Z\"\n }\n ]\n }\n }\n}" + } + ] + }, + { + "name": "Accept connection invitation", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"invitationUrl\": \"https://ssi-dev.vereign.com:443/ocm/didcomm?c_i=eyJAdHlwZSI6Imh0dHBzOi8vZGlkY29tbS5vcmcvY29ubmVjdGlvbnMvMS4wL2ludml0YXRpb24iLCJAaWQiOiJmYzM1ODNhYi1kZjEyLTRiNmEtOGYxYi0yY2I2NTk1NWFkMzIiLCJsYWJlbCI6InNzaS1hYnN0cmFjdGlvbi1hZ2VudCIsInJlY2lwaWVudEtleXMiOlsiOEoxVWdoRmFpZ3NUWDlKeHhuV1haUkRzWUtHdU53dDlFRkY5dXN6Q1h0dDQiXSwic2VydmljZUVuZHBvaW50IjoiaHR0cHM6Ly9zc2ktZGV2LnZlcmVpZ24uY29tOjQ0My9vY20vZGlkY29tbSIsInJvdXRpbmdLZXlzIjpbXX0\",\n \"autoAcceptConnection\": true\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/accept-connection-invitation", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-connection-invitation" + ] + } + }, + "response": [ + { + "name": "Accept connection invitation", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"invitationUrl\": \"https://ssi-dev.vereign.com:443/ocm/didcomm?c_i=eyJAdHlwZSI6Imh0dHBzOi8vZGlkY29tbS5vcmcvY29ubmVjdGlvbnMvMS4wL2ludml0YXRpb24iLCJAaWQiOiJmYzM1ODNhYi1kZjEyLTRiNmEtOGYxYi0yY2I2NTk1NWFkMzIiLCJsYWJlbCI6InNzaS1hYnN0cmFjdGlvbi1hZ2VudCIsInJlY2lwaWVudEtleXMiOlsiOEoxVWdoRmFpZ3NUWDlKeHhuV1haUkRzWUtHdU53dDlFRkY5dXN6Q1h0dDQiXSwic2VydmljZUVuZHBvaW50IjoiaHR0cHM6Ly9zc2ktZGV2LnZlcmVpZ24uY29tOjQ0My9vY20vZGlkY29tbSIsInJvdXRpbmdLZXlzIjpbXX0\",\n \"autoAcceptConnection\": true\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/accept-connection-invitation", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-connection-invitation" + ] + } + }, + "status": "Accepted", + "code": 202, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 02:12:02 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "1477" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"5c5-XLhvcE9qBLdJDJdTDANXXroqTQY\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 202,\n \"message\": \"Accepted Connection Request\",\n \"data\": {\n \"_tags\": {\n \"state\": \"invited\",\n \"verkey\": \"Fitz5HGemw3rW1agFPZ222LAsAQHSB7Q4NPdtM8uCfx4\",\n \"role\": \"invitee\",\n \"invitationKey\": \"8J1UghFaigsTX9JxxnWXZRDsYKGuNwt9EFF9uszCXtt4\"\n },\n \"metadata\": {},\n \"id\": \"85ee9709-639e-44b7-aaca-93aa1a7c8db5\",\n \"createdAt\": \"2023-06-02T02:12:01.910Z\",\n \"did\": \"U1ghVZwqoDcv55uVjiiGRZ\",\n \"didDoc\": {\n \"@context\": \"https://w3id.org/did/v1\",\n \"publicKey\": [\n {\n \"id\": \"U1ghVZwqoDcv55uVjiiGRZ#1\",\n \"controller\": \"U1ghVZwqoDcv55uVjiiGRZ\",\n \"type\": \"Ed25519VerificationKey2018\",\n \"publicKeyBase58\": \"Fitz5HGemw3rW1agFPZ222LAsAQHSB7Q4NPdtM8uCfx4\"\n }\n ],\n \"service\": [\n {\n \"id\": \"U1ghVZwqoDcv55uVjiiGRZ#IndyAgentService\",\n \"serviceEndpoint\": \"https://ssi-dev.vereign.com:443/ocm/didcomm\",\n \"type\": \"IndyAgent\",\n \"priority\": 0,\n \"recipientKeys\": [\n \"Fitz5HGemw3rW1agFPZ222LAsAQHSB7Q4NPdtM8uCfx4\"\n ],\n \"routingKeys\": []\n }\n ],\n \"authentication\": [\n {\n \"publicKey\": \"U1ghVZwqoDcv55uVjiiGRZ#1\",\n \"type\": \"Ed25519SignatureAuthentication2018\"\n }\n ],\n \"id\": \"U1ghVZwqoDcv55uVjiiGRZ\"\n },\n \"verkey\": \"Fitz5HGemw3rW1agFPZ222LAsAQHSB7Q4NPdtM8uCfx4\",\n \"theirLabel\": \"ssi-abstraction-agent\",\n \"state\": \"requested\",\n \"role\": \"invitee\",\n \"alias\": \"connection-received\",\n \"autoAcceptConnection\": true,\n \"invitation\": {\n \"@type\": \"https://didcomm.org/connections/1.0/invitation\",\n \"@id\": \"fc3583ab-df12-4b6a-8f1b-2cb65955ad32\",\n \"label\": \"ssi-abstraction-agent\",\n \"recipientKeys\": [\n \"8J1UghFaigsTX9JxxnWXZRDsYKGuNwt9EFF9uszCXtt4\"\n ],\n \"serviceEndpoint\": \"https://ssi-dev.vereign.com:443/ocm/didcomm\",\n \"routingKeys\": []\n },\n \"multiUseInvitation\": false\n }\n}" + } + ] + }, + { + "name": "Health check", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/health", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "health" + ] + } + }, + "response": [ + { + "name": "Health check", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/health", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "health" + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 01:57:14 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "93" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"5d-6fAWdfgLj4ONHU0kBMP++Ryy1mQ\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Fri Jun 02 2023 01:57:14 GMT+0000 (Coordinated Universal Time)\"\n}" + } + ] + }, + { + "name": "Create new connection invitation", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"autoAcceptConnection\": true\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/invitation-url?alias=trust", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "invitation-url" + ], + "query": [ + { + "key": "alias", + "value": "trust" + } + ] + } + }, + "response": [ + { + "name": "Create new connection invitation", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"autoAcceptConnection\": true\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/invitation-url?alias=trust", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "invitation-url" + ], + "query": [ + { + "key": "alias", + "value": "trust" + } + ] + } + }, + "status": "Created", + "code": 201, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 01:58:59 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "2137" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"859-jOPeDmwN60Q2TJ0P9cGI3mOlf2A\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Connection created successfully\",\n \"data\": {\n \"invitationUrl\": \"https://ssi-dev.vereign.com:443/ocm/didcomm?c_i=eyJAdHlwZSI6Imh0dHBzOi8vZGlkY29tbS5vcmcvY29ubmVjdGlvbnMvMS4wL2ludml0YXRpb24iLCJAaWQiOiJmYzM1ODNhYi1kZjEyLTRiNmEtOGYxYi0yY2I2NTk1NWFkMzIiLCJsYWJlbCI6InNzaS1hYnN0cmFjdGlvbi1hZ2VudCIsInJlY2lwaWVudEtleXMiOlsiOEoxVWdoRmFpZ3NUWDlKeHhuV1haUkRzWUtHdU53dDlFRkY5dXN6Q1h0dDQiXSwic2VydmljZUVuZHBvaW50IjoiaHR0cHM6Ly9zc2ktZGV2LnZlcmVpZ24uY29tOjQ0My9vY20vZGlkY29tbSIsInJvdXRpbmdLZXlzIjpbXX0\",\n \"invitation\": {\n \"@type\": \"https://didcomm.org/connections/1.0/invitation\",\n \"@id\": \"fc3583ab-df12-4b6a-8f1b-2cb65955ad32\",\n \"label\": \"ssi-abstraction-agent\",\n \"recipientKeys\": [\n \"8J1UghFaigsTX9JxxnWXZRDsYKGuNwt9EFF9uszCXtt4\"\n ],\n \"serviceEndpoint\": \"https://ssi-dev.vereign.com:443/ocm/didcomm\",\n \"routingKeys\": []\n },\n \"connection\": {\n \"_tags\": {},\n \"metadata\": {},\n \"id\": \"2078a34b-a7fe-4e22-91fc-9797c0b42505\",\n \"createdAt\": \"2023-06-02T01:58:58.280Z\",\n \"did\": \"EP7amWYvKAUL4t3iS7vc1m\",\n \"didDoc\": {\n \"@context\": \"https://w3id.org/did/v1\",\n \"publicKey\": [\n {\n \"id\": \"EP7amWYvKAUL4t3iS7vc1m#1\",\n \"controller\": \"EP7amWYvKAUL4t3iS7vc1m\",\n \"type\": \"Ed25519VerificationKey2018\",\n \"publicKeyBase58\": \"8J1UghFaigsTX9JxxnWXZRDsYKGuNwt9EFF9uszCXtt4\"\n }\n ],\n \"service\": [\n {\n \"id\": \"EP7amWYvKAUL4t3iS7vc1m#IndyAgentService\",\n \"serviceEndpoint\": \"https://ssi-dev.vereign.com:443/ocm/didcomm\",\n \"type\": \"IndyAgent\",\n \"priority\": 0,\n \"recipientKeys\": [\n \"8J1UghFaigsTX9JxxnWXZRDsYKGuNwt9EFF9uszCXtt4\"\n ],\n \"routingKeys\": []\n }\n ],\n \"authentication\": [\n {\n \"publicKey\": \"EP7amWYvKAUL4t3iS7vc1m#1\",\n \"type\": \"Ed25519SignatureAuthentication2018\"\n }\n ],\n \"id\": \"EP7amWYvKAUL4t3iS7vc1m\"\n },\n \"verkey\": \"8J1UghFaigsTX9JxxnWXZRDsYKGuNwt9EFF9uszCXtt4\",\n \"state\": \"invited\",\n \"role\": \"inviter\",\n \"alias\": \"trust\",\n \"autoAcceptConnection\": true,\n \"invitation\": {\n \"@type\": \"https://didcomm.org/connections/1.0/invitation\",\n \"@id\": \"fc3583ab-df12-4b6a-8f1b-2cb65955ad32\",\n \"label\": \"ssi-abstraction-agent\",\n \"recipientKeys\": [\n \"8J1UghFaigsTX9JxxnWXZRDsYKGuNwt9EFF9uszCXtt4\"\n ],\n \"serviceEndpoint\": \"https://ssi-dev.vereign.com:443/ocm/didcomm\",\n \"routingKeys\": []\n },\n \"multiUseInvitation\": false\n },\n \"invitationUrlShort\": \"https://ssi-dev.vereign.com/ocm/connection/v1/url/d82b96f4-5966-4ada-a171-88dd4f80394a\"\n }\n}" + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "https://ssi-dev.vereign.com/ocm/connection" + } + ] +} \ No newline at end of file diff --git a/apps/connection-manager/LICENSE b/apps/connection-manager/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..52521c8796ccdb68385bf0618ca03def18372a62 --- /dev/null +++ b/apps/connection-manager/LICENSE @@ -0,0 +1,427 @@ +GAIA-X "Connection Manager" + +is the microservice which handles the feature related to connection between the +two Aries agents.The service handles connections REST endpoints, events and calls +to other services related to connections in the Organizational Credential Manager + + Copyright 2022 Vereign AG + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Connection Manager incorporates + +"elastic/ecs-winston-format" + +, a Node.js package to provide a formatter for the winston logger compatible +with Elastic Common Schema (ECS) logging, which is covered by the following copyright +and permission notice: + +Copyright 2020 Elastic and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Connection Manager also incorporates + +"nestjs" + +, a progressive Node.js framework for building efficient and scalable server-side applications, +which is covered by the following copyright and permission notice: + +Copyright (c) 2017-2022 Kamil Mysliwiec <https://kamilmysliwiec.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Connection Manager also incorporates + +"nestjs/terminus" + +, integrated healthchecks for Nest, which contains the +following copyright and permission notice: + +Copyright (c) 2018-2021 Livio Brunner, Kamil Myśliwiec + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Connection Manager also incorporates + +"prisma client" + +, an auto-generated query builder that enables type-safe database access and reduces +boilerplate, which is covered by the following copyright and permission notice: + +Copyright 2019 Johannes Schickling + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Connection Manager also incorporates + +"types/node" + +, type definitions for Node, which is covered by the following copyright and +permission notice: + +Copyright Microsoft TypeScript, DefinitelyTyped, Alberto Schiabel, +Alvis HT Tang, Andrew Makarov, Benjamin Toueg, Chigozirim C., David Junger, Deividas Bakanas, Eugene Y. Q. Shen, +Hannes Magnusson, Huw, Kelvin Jin, Klaus Meinhardt, Lishude, Mariusz Wiktorczyk, Mohsen Azimi, Nicolas Even, +Nikita Galkin, Parambir Singh, Sebastian Silbermann, Simon Schick, Thomas den Hollander, Wilco Bakker, wwwy3y3, +Samuel Ainsworth, Kyle Uehlein, Thanik Bhongbhibhat, Marcin Kopacz, Trivikram Kamat, Junxiao Shi, Ilia Baryshnikov, +ExE Boss, Piotr Błażejewicz, Anna Henningsen, Victor Perin, Yongsheng Zhang, NodeJS Contributors, +Linus Unnebäck, wafuwafu13, and Matteo Collina. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Connection Manager also incorporates + +"class-validator" + +, a tool to allow decorator and non-decorator based validation, + +Copyright 2015-2020 TypeStack + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Connection Manager also incorporates + +"express" + +, a fast, unopinionated, minimalist web framework for node, which is covered by the following copyright +and permission notice: + +Copyright (c) 2009-2014 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2013-2014 Roman Shtylman <shtylman+expressjs@gmail.com> +Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Connection Manager also incorporates + +"joi" + +, the most powerful schema description language and data validator for JavaScript, which is +covered by the following copyright and permission notice: + +Copyright (c) 2012-2020, Sideway. Inc, and project contributors. +Copyright (c) 2012-2014, Walmart. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. +- The names of any contributors may not be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +This Connection Manager also incorporates + +"moment" + +, a JavaScript date library for parsing, validating, manipulating, and formatting dates, +which is covered by the following copyright and permission notice: + +Copyright (c) JS Foundation and other contributors + +(The MIT License) +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +This Connection Manager also incorporates + +"nats" + +, a Node.js client for the NATS messaging system, which is covered by +the following copyright and permission notice: + +Copyright 2013-2018 The NATS Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Connection Manager also incorporates + +"prisma" + +, next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server, +SQLite, MongoDB and CockroachDB, which is covered by the following copyright and +permission notice: + +Copyright 2019 Johannes Schickling + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Connection Manager also incorporates + +"reflect-metadata" + +, prototype for a Metadata Reflection API for ECMAScript, which is covered +by the following copyright and permission notice: + +Copyright 2019 Ron Buckton + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Connection Manager also incorporates + +"rxjs" + +, reactive extensions for JavaScript, which is covered by the following copyright +and permission notice: + +Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Connection Manager also incorporates + +"winston" + +, a logger for just about everything, which is covered by the following copyright and +permission notice: + +Copyright (c) 2010 Charlie Robbins + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +This Connection Manager also incorporates + +"winston-elasticsearch" + +, an elasticsearch transport for winston, which is covered by the following copyright and +permission notice: + +Copyright (c) 2015 - 2018 Thomas Hoppe. +Copyright (c) 2013 Jacques-Olivier D. Bernier. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/apps/connection-manager/README.md b/apps/connection-manager/README.md new file mode 100644 index 0000000000000000000000000000000000000000..421458c60b365e5d3045aa4f9e875186ba431710 --- /dev/null +++ b/apps/connection-manager/README.md @@ -0,0 +1,130 @@ +# OCM Connection Manager + +## Description +<hr/> + +The connection manager is the microservice responsible for handling the features related to connection between aries agents. +The service implements REST endpoints, events and calls to other services related to connections in the Organizational Credential Manager. + +#### Security note +`Man in the mid` security concern will be address in Phase II of of the project. It was discussed multiple times, and one of the options is to use [TRAIN API](https://train.trust-scheme.de/info/) . + + +## Usage +<hr/> + + +### Swagger Documentation: + +[Swagger/OpenAPI](swagger.json) + +## Installation +<hr/> + + +### Pre-requisites +* yarn +* docker +* docker-compose +* postgres +* NATS Server + + +### OCM Services Dependencies +* SSI Abstraction +* Principal Manager +* Attestation Manager +* Proof Manager + + +## Running the app +<hr/> + + +**Each service in the Organizational Credential Manager can be run from the infrastructure repository with Docker.** + +**The .env files are in the infrastructure repository under /env** + +```bash + ## production: + ./deployment/ci + ## development: + ./deployment/dev +``` + +* (optional) Edit docker-compose.yml in "infrastructure" to use either **/ci/** or **/dev/** Dockerfiles. + +* Run while in **"infrastructure"** project: +```bash +$ docker-compose up --build conn-m +``` +to run only Connection Manager or +```bash +$ docker-compose up --build +``` +to run all the services. + + +### Environment variables required +``` +1. PORT +2. DATABASE_URL +3. NATS_URL +4. AGENT_URL +``` + +### Outgoing communication services +``` +1. PRINCIPAL MANAGER +2. ATTESTATION MANAGER +3. PROOF MANAGER +``` + +### Incoming communication services +``` +1. SSI-ABSTRACTION +2. PROOF MANAGER +3. ATTESTATION MANAGER +``` + +### Supported features +``` +1. Nats endpoint to update connection status +2. Create invitation URL. +3. Provide connection information. +4. Provide a list of connections. +5. Nats endpoint to get connection by ID. +6. Nats endpoint to make connection trusted. +7. Accept connection invitation. +``` + +## Test +<hr/> + +```bash +# unit tests +$ npm run test + +# e2e tests +$ npm run test:e2e + +# test coverage +$ npm run test:cov +``` + +## GDPR +<hr/> + +[GDPR](GDPR.md) + +## Dependencies +<hr/> + +[Dependencies](package.json) + +## License +<hr/> + +[Apache 2.0 license](LICENSE) + + diff --git a/apps/connection-manager/config/config.ts b/apps/connection-manager/config/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..2e11fbb30721c860a15904a5a4ba8e525892cd40 --- /dev/null +++ b/apps/connection-manager/config/config.ts @@ -0,0 +1,30 @@ +const config = () => ({ + PORT: Number(process.env.PORT), + APP_URL: process.env.CONNECTION_MANAGER_URL, + auth: { + useAuth: process.env.USE_AUTH || 'false', + clientId: process.env.OAUTH_CLIENT_ID, + clientSecret: process.env.OAUTH_CLIENT_SECRET, + tokenUrl: process.env.OAUTH_TOKEN_URL, + }, + nats: { + url: process.env.NATS_URL, + }, + database: { + type: 'postgres', + host: process.env.DB_HOST, + username: process.env.DB_USERNAME, + password: process.env.DB_PASSWORD, + database: process.env.DB_DATABASE, + port: 5432, + synchronize: false, + logging: false, + entities: [`${__dirname}/../**/**.model{.ts,.js}`], + DATABASE_URL: process.env.DATABASE_URL, + }, + agent: { + agentUrl: process.env.AGENT_URL, + }, + ECSURL: process.env.ECSURL, +}); +export default config; diff --git a/apps/connection-manager/config/validation.ts b/apps/connection-manager/config/validation.ts new file mode 100644 index 0000000000000000000000000000000000000000..30c678248d467872512196abc03a9b88bc7e77bd --- /dev/null +++ b/apps/connection-manager/config/validation.ts @@ -0,0 +1,15 @@ +import * as Joi from 'joi'; + +const validationSchema = Joi.object({ + DATABASE_URL: Joi.string().required(), + NATS_URL: Joi.string().required(), + PORT: Joi.number().required(), + CONNECTION_MANAGER_URL: Joi.string().required(), + USE_AUTH: Joi.string(), + AGENT_URL: Joi.string().required(), + OAUTH_CLIENT_ID: Joi.string(), + OAUTH_CLIENT_SECRET: Joi.string(), + OAUTH_TOKEN_URL: Joi.string(), +}); + +export default validationSchema; diff --git a/apps/connection-manager/deployment/ci/Dockerfile b/apps/connection-manager/deployment/ci/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..0b333a1775077dfd768a2cd3583e65cc3f5d1517 --- /dev/null +++ b/apps/connection-manager/deployment/ci/Dockerfile @@ -0,0 +1,36 @@ +FROM node:16-alpine3.15 AS builder + +WORKDIR /usr/src/app + +RUN yarn global add @nestjs/cli + +COPY package.json ./ +COPY yarn.lock ./ + +# --prod works if @types/node is in deps (not devDeps) +RUN yarn --frozen-lockfile --prod + +COPY . . + +RUN yarn prisma:generate + +RUN yarn build + + +FROM node:14-alpine3.15 + +ENV PATH /usr/src/app/node_modules/.bin:$PATH + +WORKDIR /usr/src/app + + +COPY --from=builder /usr/src/app/dist ./dist +COPY --from=builder /usr/src/app/start.sh ./start.sh +COPY --from=builder /usr/src/app/node_modules ./node_modules +COPY --from=builder /usr/src/app/src/prisma prisma + +EXPOSE 3003 + +RUN chmod +x ./start.sh + +CMD ["./start.sh"] diff --git a/apps/connection-manager/deployment/dev/Dockerfile b/apps/connection-manager/deployment/dev/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..9536a3c4e03d3c5632aecfa5933883330a6340b1 --- /dev/null +++ b/apps/connection-manager/deployment/dev/Dockerfile @@ -0,0 +1,12 @@ +FROM node:16-alpine3.15 + +WORKDIR /usr/src/app + +COPY . . + +RUN pnpm install --frozen-lockfile +RUN pnpm -F connection-manager build + +EXPOSE 3003 + +CMD ["pnpm", "-F", "connection-manager", "start:docker"] diff --git a/apps/connection-manager/nest-cli.json b/apps/connection-manager/nest-cli.json new file mode 100644 index 0000000000000000000000000000000000000000..56167b36a14c2c69eb0db57302e2c44a1128b006 --- /dev/null +++ b/apps/connection-manager/nest-cli.json @@ -0,0 +1,4 @@ +{ + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/apps/connection-manager/package.json b/apps/connection-manager/package.json new file mode 100644 index 0000000000000000000000000000000000000000..8f4da1a4f96be204793dcde2a57e09ccd24ca118 --- /dev/null +++ b/apps/connection-manager/package.json @@ -0,0 +1,119 @@ +{ + "name": "connection-manager", + "version": "0.0.1", + "description": "", + "author": "Sagar", + "private": true, + "license": "Apache-2.0", + "scripts": { + "clean": "rm -r dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "dbSchema": "npx prisma db push --schema=./src/prisma/schema.prisma", + "prisma:generate": "prisma generate --schema=./src/prisma/schema.prisma", + "prisma:migrate": "npx prisma migrate deploy --schema=./src/prisma/schema.prisma", + "prismaStudio": "npx prisma studio", + "start": "nest start", + "start:docker": "yarn prisma:generate && yarn dbSchema && yarn start", + "start:docker:prod": "yarn prisma:migrate && node dist/src/main", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@elastic/ecs-winston-format": "^1.3.1", + "@nestjs/axios": "^0.0.5", + "@nestjs/cli": "^8.0.0", + "@nestjs/common": "^8.0.0", + "@nestjs/config": "^1.1.6", + "@nestjs/core": "^8.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/microservices": "^8.2.6", + "@nestjs/platform-express": "^8.0.0", + "@nestjs/schedule": "^1.0.2", + "@nestjs/schematics": "^8.0.0", + "@nestjs/swagger": "^5.2.0", + "@nestjs/terminus": "^8.0.4", + "@nestjs/testing": "^8.0.0", + "@prisma/client": "^3.15.2", + "@types/node": "^16.0.0", + "class-validator": "^0.13.2", + "express": "^4.17.3", + "joi": "^17.6.0", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "^3.0.0", + "moment": "^2.29.1", + "nats": "^2.6.0", + "prisma": "^3.15.2", + "reflect-metadata": "^0.1.13", + "rxjs": "^7.2.0", + "simple-oauth2": "^5.0.0", + "winston": "^3.6.0", + "winston-elasticsearch": "^0.16.1" + }, + "devDependencies": { + "@types/express": "^4.17.13", + "@types/jest": "27.0.2", + "@types/jsonwebtoken": "^8.5.9", + "@types/simple-oauth2": "^4.1.1", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.14.0", + "@typescript-eslint/parser": "^5.14.0", + "dotenv-cli": "^4.1.1", + "eslint": "^8.0.1", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.26.0", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^7.0.4", + "jest": "^27.2.5", + "node-mocks-http": "^1.11.0", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "swagger-ui-express": "^4.3.0", + "ts-jest": "^27.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "^3.10.1", + "typescript": "^4.3.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "coveragePathIgnorePatterns": [ + "<rootDir>/main", + "<rootDir>/client" + ], + "setupFiles": [ + "<rootDir>/../setup.js" + ], + "moduleNameMapper": { + "^@connections/(.*)$": "<rootDir>/connections/$1", + "^@src/(.*)$": "<rootDir>/$1", + "^@DB/(.*)$": "<rootDir>/prisma/$1", + "^@common/(.*)$": "<rootDir>/common/$1", + "@config/(.*)": [ + "<rootDir>/../config/$1" + ], + "^@utils/(.*)$": "<rootDir>/utils/$1", + "^@health/(.*)$": "<rootDir>/health/$1" + }, + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/apps/connection-manager/src/app.module.spec.ts b/apps/connection-manager/src/app.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..55541ed94a5e4ae949291bbd7e03382b7d2aaaaf --- /dev/null +++ b/apps/connection-manager/src/app.module.spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import AppModule from './app.module'; + +describe('App Module', () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('should work', () => { + expect(true).toBe(true); + }); + + afterAll(async () => { + await app.close(); + }); +}); diff --git a/apps/connection-manager/src/app.module.ts b/apps/connection-manager/src/app.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..12a698c14544974b593790fbc74da2fdac8ca87a --- /dev/null +++ b/apps/connection-manager/src/app.module.ts @@ -0,0 +1,54 @@ +import PrismaService from '@src/prisma/prisma.service'; +import { APP_FILTER } from '@nestjs/core'; +import { + MiddlewareConsumer, + Module, + NestModule, + RequestMethod, +} from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TerminusModule } from '@nestjs/terminus'; +import validationSchema from '@config/validation'; + +import config from '@config/config'; +import HealthController from '@health/health.controller'; +import ExceptionHandler from '@common/exception.handler'; +import ConnectionsModule from '@connections/module'; +import { ScheduleModule } from '@nestjs/schedule'; +import SchedulerService from './connections/scheduler/scheduler.service'; +import { AuthMiddleware } from './middleware/auth.middleware'; + +@Module({ + imports: [ + ScheduleModule.forRoot(), + TerminusModule, + ConfigModule.forRoot({ + isGlobal: true, + load: [config], + validationSchema, + }), + ConnectionsModule, + ], + controllers: [HealthController], + providers: [ + { + provide: APP_FILTER, + useClass: ExceptionHandler, + }, + SchedulerService, + PrismaService, + ], +}) +export default class AppModule implements NestModule { + // eslint-disable-next-line class-methods-use-this + configure(consumer: MiddlewareConsumer) { + // eslint-disable-line + consumer + .apply(AuthMiddleware) + .exclude({ + path: 'v1/health', + method: RequestMethod.GET, + }) + .forRoutes('*'); + } +} diff --git a/apps/connection-manager/src/client/config.client.ts b/apps/connection-manager/src/client/config.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..f4efc5ad73ebfc4ddb536192922f29040c13821c --- /dev/null +++ b/apps/connection-manager/src/client/config.client.ts @@ -0,0 +1,20 @@ +export default class ConfigClient { + /** + * + * If there is no Limit to check expire till date return false + * @returns Number to calculate end date + */ + static checkExpireTill(): Date | false { + const days = 2; + const tillDate = new Date(); + tillDate.setDate(tillDate.getDate() - days); + return tillDate; + } + + static getConnectionExpire(): Date | false { + const min = 30; + const connectionExpire = min * 60 * 1000; + const compareDateTime = new Date(new Date().getTime() - connectionExpire); + return compareDateTime; + } +} diff --git a/apps/connection-manager/src/client/nats.client.ts b/apps/connection-manager/src/client/nats.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..316b5b6a8c271215bbe0739f2e57d6f1d983e1da --- /dev/null +++ b/apps/connection-manager/src/client/nats.client.ts @@ -0,0 +1,75 @@ +import logger from '@src/utils/logger'; +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { lastValueFrom } from 'rxjs'; +import { + NATSServices, + Principal, + Attestation, + ProofManager, +} from '@common/constants'; +import ResponseType from '@common/response'; +import ConnectionSubscriptionEndpointDto from '@connections/entities/connectionSubscribeEndPoint.entity'; + +@Injectable() +export default class NatsClientService { + constructor(@Inject(NATSServices.SERVICE_NAME) private client: ClientProxy) {} + + sendConnectionStatusPrincipalManager( + status: string, + connectionId: string, + theirLabel: string, + participantDID: string, + theirDid: string, + ) { + const pattern = { + endpoint: `${Principal.NATS_ENDPOINT}/${Principal.CONNECTION_COMPLETE_STATUS}`, + }; + const payload = { + status, + connectionId, + theirLabel, + participantDID, + theirDid, + }; + logger.info(`before nats call to principal manager ${payload}`); + return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); + } + + getIssueCredentials(connectionId: string) { + const pattern = { + endpoint: `${Attestation.NATS_ENDPOINT}/${Attestation.GET_ISSUE_CREDENTIALS}`, + }; + const payload = { + connectionId, + }; + return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); + } + + sendMembershipProofRequestToProofManager(connectionId: string) { + const pattern = { + endpoint: `${ProofManager.NATS_ENDPOINT}/${ProofManager.SEND_MEMBERSHIP_PROOF_REQUEST}`, + }; + const payload = { + connectionId, + }; + return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); + } + + getPresentProofs(connectionId: string) { + const pattern = { + endpoint: `${ProofManager.NATS_ENDPOINT}/${ProofManager.GET_PRESENT_PROOFS}`, + }; + const payload = { + connectionId, + }; + return lastValueFrom(this.client.send<ResponseType>(pattern, payload)); + } + + publishConnection(data: ConnectionSubscriptionEndpointDto) { + this.client.emit( + `${NATSServices.SERVICE_NAME}/${NATSServices.CONNECTION_SUBSCRIBER_ENDPOINT}`, + data, + ); + } +} diff --git a/apps/connection-manager/src/client/rest.client.ts b/apps/connection-manager/src/client/rest.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..df5feb4b3d59ca6d1f6b22add89fa8fe079e0dd3 --- /dev/null +++ b/apps/connection-manager/src/client/rest.client.ts @@ -0,0 +1,16 @@ +import { HttpService } from '@nestjs/axios'; +import { Injectable } from '@nestjs/common'; +import { lastValueFrom, map } from 'rxjs'; + +@Injectable() +export default class RestClientService { + constructor(private readonly httpService: HttpService) {} + + async post(url: string, payload: object) { + return lastValueFrom( + this.httpService + .post(url, payload) + .pipe(map((response) => response.data)), + ); + } +} diff --git a/apps/connection-manager/src/common/common.spec.ts b/apps/connection-manager/src/common/common.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a42934af6f12fa745b1c96e989f726afc3252718 --- /dev/null +++ b/apps/connection-manager/src/common/common.spec.ts @@ -0,0 +1,7 @@ +import StatusCode from './status.codes'; + +describe('StatusCode', () => { + it('should be defined', () => { + expect(StatusCode).toBeDefined(); + }); +}); diff --git a/apps/connection-manager/src/common/constants.ts b/apps/connection-manager/src/common/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..60d0d5a4f9825b0d0ff36a46604a5c310c7e9d46 --- /dev/null +++ b/apps/connection-manager/src/common/constants.ts @@ -0,0 +1,32 @@ +export enum NATSServices { + SERVICE_NAME = 'CONNECTION_MANAGER_SERVICE', + CONNECTION_SUBSCRIBER_ENDPOINT = 'ConnectionSubscriberEndpoint', +} + +export enum LoggerConfig { + FILE_PATH = 'logs/log.json', + lOG_DIR = './logs', +} + +export enum Abstraction { + NATS_ENDPOINT = 'SSI_ABSTRACTION_SERVICE', + CONNECTION_STATE_CHANGED = 'ConnectionStateChanged', +} + +export enum Principal { + NATS_ENDPOINT = 'PRINCIPAL_MANAGER_SERVICE', + CONNECTION_COMPLETE_STATUS = 'connectionCompleteStatus', +} + +export enum Attestation { + NATS_ENDPOINT = 'ATTESTATION_MANAGER_SERVICE', + GET_ISSUE_CREDENTIALS = 'getIssueCredentials', +} + +export enum ProofManager { + NATS_ENDPOINT = 'PROOF_MANAGER_SERVICE', + GET_PRESENT_PROOFS = 'getPresentProofs', + SEND_MEMBERSHIP_PROOF_REQUEST = 'sendMembershipProofRequest', +} + +export const RECEIVED_CONNECTION_ALIAS = 'connection-received'; diff --git a/apps/connection-manager/src/common/date.utils.ts b/apps/connection-manager/src/common/date.utils.ts new file mode 100644 index 0000000000000000000000000000000000000000..f7276e5c4d3bab62d48addca3fac71f21ddd4df8 --- /dev/null +++ b/apps/connection-manager/src/common/date.utils.ts @@ -0,0 +1,5 @@ +import moment = require('moment'); + +const getDate = () => moment().format('MM-DD-YYYY, h:mm:ss a'); + +export default getDate; diff --git a/apps/connection-manager/src/common/exception.handler.ts b/apps/connection-manager/src/common/exception.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..1da5ca9155ab4de489adc1b5313fb66dd83b00a1 --- /dev/null +++ b/apps/connection-manager/src/common/exception.handler.ts @@ -0,0 +1,42 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus, +} from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; +import ResponseType from './response'; + +@Catch() +export default class ExceptionHandler implements ExceptionFilter { + constructor(private readonly httpAdapterHost: HttpAdapterHost) {} + + catch(exception: any, host: ArgumentsHost): void { + // In certain situations `httpAdapter` might not be available in the + // constructor method, thus we should resolve it here. + const { httpAdapter } = this.httpAdapterHost; + + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + + let statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + let message = + exception.message.error || exception.message || 'Something went wrong!'; + + if (exception instanceof HttpException) { + const errorResponse: any = exception.getResponse(); + + statusCode = exception.getStatus(); + message = errorResponse.error || message; + } + + const responseBody: ResponseType = { + statusCode, + message, + error: exception.message, + }; + + httpAdapter.reply(response, responseBody, statusCode); + } +} diff --git a/apps/connection-manager/src/common/response.ts b/apps/connection-manager/src/common/response.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5b6296cf88bea1c13e38e1deba6ab0aca2be551 --- /dev/null +++ b/apps/connection-manager/src/common/response.ts @@ -0,0 +1,6 @@ +export default interface ResponseType { + statusCode: number; + message: string; + data?: any; + error?: any; +} diff --git a/apps/connection-manager/src/connections/controller/controller.spec.ts b/apps/connection-manager/src/connections/controller/controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b6600101d8ff78ad106c4852eaf91114be706dfa --- /dev/null +++ b/apps/connection-manager/src/connections/controller/controller.spec.ts @@ -0,0 +1,827 @@ +import { HttpStatus } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigModule } from '@nestjs/config'; +import { HttpModule } from '@nestjs/axios'; +import NatsClientService from '@src/client/nats.client'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@src/common/constants'; +import httpMocks = require('node-mocks-http'); +import RestClientService from '@src/client/rest.client'; +import ConnectionsController from '@src/connections/controller/controller'; +import ConnectionsService from '../services/service'; +import PrismaService from '../../prisma/prisma.service'; +import ConnectionStateDto from '../entities/connectionStateDto.entity'; + +describe('ConnectionsController', () => { + let connectionController: ConnectionsController; + let connectionService: ConnectionsService; + // const connection = new ConnectionDto(); + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + ConfigModule, + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + }, + ]), + ], + controllers: [ConnectionsController], + providers: [ + ConnectionsService, + PrismaService, + NatsClientService, + RestClientService, + ], + exports: [PrismaService], + }).compile(); + connectionService = module.get<ConnectionsService>(ConnectionsService); + connectionController = module.get<ConnectionsController>( + ConnectionsController, + ); + }); + it('should be defined', () => { + expect(connectionController).toBeDefined(); + }); + + describe('Get all connections', () => { + it('should return an array of connection', async () => { + const param = {}; + const query = { + pageSize: '0', + page: '0', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + }; + const serviceResult: any = [ + 1, + { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }, + ]; + + const result: any = { + count: 1, + records: { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }, + }; + + const response = httpMocks.createResponse(); + jest + .spyOn(connectionService, 'findConnections') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.getConnection( + param, + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(JSON.parse(resData).data).toStrictEqual(result); + }); + + it('If Not provided required parameter response should be bad request', async () => { + const param = {}; + const query = { + pageSize: '0', + page: '0', + }; + const serviceResult: any = [ + 1, + { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }, + ]; + + const response = httpMocks.createResponse(); + jest + .spyOn(connectionService, 'findConnections') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.getConnection( + param, + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + expect(JSON.parse(resData).message).toStrictEqual( + 'Participant ID/ connection ID / participant DID must be provided', + ); + }); + + it('Get connection against connection id', async () => { + const param = { + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + }; + const query = {}; + const serviceResult: any = { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }; + + const result: any = { + statusCode: 200, + message: 'Connections fetch successfully', + data: { + records: { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }, + }, + }; + + const response = httpMocks.createResponse(); + jest + .spyOn(connectionService, 'findConnections') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.getConnection( + param, + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(JSON.parse(resData)).toStrictEqual(result); + }); + + it('Not fount if data is not present against connection id ', async () => { + const param = { + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + }; + const query = {}; + const serviceResult: any = { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: false, + }; + + const result: any = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + + const response = httpMocks.createResponse(); + jest + .spyOn(connectionService, 'findConnections') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.getConnection( + param, + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.NOT_FOUND); + expect(JSON.parse(resData)).toStrictEqual(result); + }); + + it('should return an array of connection with status filter', async () => { + const param = {}; + const query = { + pageSize: '0', + page: '0', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted,complete', + }; + const serviceResult: any = [ + 1, + { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }, + ]; + + const result: any = { + count: 1, + records: { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }, + }; + + const response = httpMocks.createResponse(); + jest + .spyOn(connectionService, 'findConnections') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.getConnection( + param, + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(JSON.parse(resData).data).toStrictEqual(result); + }); + }); + + describe('Connection webhook calls', () => { + it('Create connection webhook call', async () => { + const webHook: ConnectionStateDto = { + _tags: {}, + metadata: {}, + id: '7edc871d-9fa3-4f30-8763-59c80bf346f5', + createdAt: '2022-04-21T10:52:27.151Z', + did: 'DD8Aue5tuohjBaCLM9GMU7', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#1', + controller: 'C1buxAXWiisjFpVVyUGM5D', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + }, + ], + ], + service: [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + serviceEndpoint: 'http://localhost:4011', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + routingKeys: [], + }, + ], + authentication: [[Object]], + id: 'DD8Aue5tuohjBaCLM9GMU7', + }, + theirDid: '', + theirLabel: '', + verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + state: 'invited', + role: 'inviter', + alias: 'member', + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + label: 'State_University', + recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + serviceEndpoint: 'http://localhost:4017', + routingKeys: [], + }, + multiUseInvitation: false, + }; + const serviceResult: any = {}; + jest + .spyOn(connectionService, 'createConnections') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.createConnection({ + body: webHook, + }); + + expect(res.statusCode).toBe(HttpStatus.CREATED); + // expect(JSON.parse(resData).data).toStrictEqual(result); + }); + + it('Create connection webhook call', async () => { + const webHook: ConnectionStateDto = { + _tags: {}, + metadata: {}, + id: '7edc871d-9fa3-4f30-8763-59c80bf346f5', + createdAt: '2022-04-21T10:52:27.151Z', + did: 'DD8Aue5tuohjBaCLM9GMU7', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#1', + controller: 'C1buxAXWiisjFpVVyUGM5D', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + }, + ], + ], + service: [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + serviceEndpoint: 'http://localhost:4011', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + routingKeys: [], + }, + ], + authentication: [[Object]], + id: 'DD8Aue5tuohjBaCLM9GMU7', + }, + theirDid: '', + theirLabel: '', + verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + state: 'invited', + role: 'inviter', + alias: 'member', + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + label: 'State_University', + recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + serviceEndpoint: 'http://localhost:4017', + routingKeys: [], + }, + multiUseInvitation: false, + }; + const serviceResult: any = {}; + jest + .spyOn(connectionService, 'createConnections') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.createConnection({ + body: webHook, + }); + + expect(res.statusCode).toBe(HttpStatus.CREATED); + // expect(JSON.parse(resData).data).toStrictEqual(result); + }); + + it('Update connection webhook call -> member flow', async () => { + const webHook: ConnectionStateDto = { + _tags: {}, + metadata: {}, + id: '72534911-9be0-4e3f-8539-2a8a09e4e409', + createdAt: '2022-04-21T10:52:27.151Z', + did: 'DD8Aue5tuohjBaCLM9GMU7', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#1', + controller: 'C1buxAXWiisjFpVVyUGM5D', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + }, + ], + ], + service: [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + serviceEndpoint: 'http://localhost:4011', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + routingKeys: [], + }, + ], + authentication: [[Object]], + id: 'DD8Aue5tuohjBaCLM9GMU7', + }, + theirDid: '', + theirLabel: '', + verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + state: 'complete', + role: 'inviter', + alias: 'member', + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + label: 'State_University', + recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + serviceEndpoint: 'http://localhost:4017', + routingKeys: [], + }, + multiUseInvitation: false, + }; + + const restConnection: any = { + id: '29701e41-60e8-4fca-8504-ea3bcefa6486', + connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + status: 'trusted', + participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', + theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', + theirLabel: 'Attest12', + createdDate: '2022-04-15T11:30:04.660Z', + updatedDate: '2022-04-15T11:36:58.560Z', + isActive: true, + }; + const serviceResult: any = {}; + jest + .spyOn(connectionService, 'updateStatusByConnectionId') + .mockResolvedValueOnce(serviceResult); + + jest + .spyOn(connectionService, 'getConnectionByID') + .mockResolvedValueOnce(restConnection); + const res: any = await connectionController.createConnection({ + body: webHook, + }); + + expect(res.statusCode).toBe(HttpStatus.OK); + // expect(JSON.parse(resData).data).toStrictEqual(result); + }); + + it('Update connection webhook call -> subscriber flow', async () => { + const webHook: ConnectionStateDto = { + _tags: {}, + metadata: {}, + id: '72534911-9be0-4e3f-8539-2a8a09e4e409', + createdAt: '2022-04-21T10:52:27.151Z', + did: 'DD8Aue5tuohjBaCLM9GMU7', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#1', + controller: 'C1buxAXWiisjFpVVyUGM5D', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + }, + ], + ], + service: [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + serviceEndpoint: 'http://localhost:4011', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + routingKeys: [], + }, + ], + authentication: [[Object]], + id: 'DD8Aue5tuohjBaCLM9GMU7', + }, + theirDid: '', + theirLabel: '', + verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + state: 'complete', + role: 'inviter', + alias: 'subscriber', + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + label: 'State_University', + recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + serviceEndpoint: 'http://localhost:4017', + routingKeys: [], + }, + multiUseInvitation: false, + }; + + const restConnection: any = { + id: '29701e41-60e8-4fca-8504-ea3bcefa6486', + connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + status: 'trusted', + participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', + theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', + theirLabel: 'Attest12', + createdDate: '2022-04-15T11:30:04.660Z', + updatedDate: '2022-04-15T11:36:58.560Z', + isActive: true, + }; + const serviceResult: any = {}; + jest + .spyOn(connectionService, 'updateStatusByConnectionId') + .mockResolvedValueOnce(serviceResult); + + jest + .spyOn(connectionService, 'getConnectionByID') + .mockResolvedValueOnce(restConnection); + const res: any = await connectionController.createConnection({ + body: webHook, + }); + + expect(res.statusCode).toBe(HttpStatus.OK); + // expect(JSON.parse(resData).data).toStrictEqual(result); + }); + + it('Connection webhook call with wrong role', async () => { + const webHook: ConnectionStateDto = { + _tags: {}, + metadata: {}, + id: '72534911-9be0-4e3f-8539-2a8a09e4e409', + createdAt: '2022-04-21T10:52:27.151Z', + did: 'DD8Aue5tuohjBaCLM9GMU7', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#1', + controller: 'C1buxAXWiisjFpVVyUGM5D', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + }, + ], + ], + service: [ + { + id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + serviceEndpoint: 'http://localhost:4011', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + routingKeys: [], + }, + ], + authentication: [[Object]], + id: 'DD8Aue5tuohjBaCLM9GMU7', + }, + theirDid: '', + theirLabel: '', + verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + state: 'complete', + role: 'invitee', + alias: 'subscriber', + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + label: 'State_University', + recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + serviceEndpoint: 'http://localhost:4017', + routingKeys: [], + }, + multiUseInvitation: false, + }; + + const restConnection: any = { + id: '29701e41-60e8-4fca-8504-ea3bcefa6486', + connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + status: 'trusted', + participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', + theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', + theirLabel: 'Attest12', + createdDate: '2022-04-15T11:30:04.660Z', + updatedDate: '2022-04-15T11:36:58.560Z', + isActive: true, + }; + const serviceResult: any = {}; + jest + .spyOn(connectionService, 'updateStatusByConnectionId') + .mockResolvedValueOnce(serviceResult); + + jest + .spyOn(connectionService, 'getConnectionByID') + .mockResolvedValueOnce(restConnection); + const res: any = await connectionController.createConnection({ + body: webHook, + }); + + expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + // expect(JSON.parse(resData).data).toStrictEqual(result); + }); + }); + + describe('Get invitation URL ', () => { + it('Get Member invitation URL', async () => { + const body = { + autoAcceptConnection: true, + }; + const query = { + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + process: 'member', + }; + const serviceResult: any = { + invitationUrl: + 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', + invitation: { + '@type': + 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', + '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + label: 'technica_corp', + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + serviceEndpoint: 'http://localhost:4005', + routingKeys: [], + }, + connection: { + _tags: {}, + metadata: {}, + id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', + createdAt: '2022-04-21T10:52:18.161Z', + did: '9nYw7CSdHPqXf6ayfA7Wo2', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + { + id: '9nYw7CSdHPqXf6ayfA7Wo2#1', + controller: '9nYw7CSdHPqXf6ayfA7Wo2', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + }, + ], + service: [ + { + id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', + serviceEndpoint: 'http://localhost:4005', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + routingKeys: [], + }, + ], + authentication: [ + { + publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', + type: 'Ed25519SignatureAuthentication2018', + }, + ], + id: '9nYw7CSdHPqXf6ayfA7Wo2', + }, + verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + state: 'invited', + role: 'inviter', + alias: 'member', + autoAcceptConnection: true, + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + label: 'technica_corp', + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + serviceEndpoint: 'http://localhost:4005', + routingKeys: [], + }, + multiUseInvitation: false, + }, + }; + + const result: any = { + statusCode: 200, + message: 'Connection created successfully', + data: { + invitationUrl: + 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', + invitation: { + '@type': + 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', + '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + label: 'technica_corp', + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + serviceEndpoint: 'http://localhost:4005', + routingKeys: [], + }, + connection: { + _tags: {}, + metadata: {}, + id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', + createdAt: '2022-04-21T10:52:18.161Z', + did: '9nYw7CSdHPqXf6ayfA7Wo2', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + { + id: '9nYw7CSdHPqXf6ayfA7Wo2#1', + controller: '9nYw7CSdHPqXf6ayfA7Wo2', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: + '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + }, + ], + service: [ + { + id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', + serviceEndpoint: 'http://localhost:4005', + type: 'IndyAgent', + priority: 0, + recipientKeys: [ + '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + ], + routingKeys: [], + }, + ], + authentication: [ + { + publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', + type: 'Ed25519SignatureAuthentication2018', + }, + ], + id: '9nYw7CSdHPqXf6ayfA7Wo2', + }, + verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + state: 'invited', + role: 'inviter', + alias: 'member', + autoAcceptConnection: true, + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + label: 'technica_corp', + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + serviceEndpoint: 'http://localhost:4005', + routingKeys: [], + }, + multiUseInvitation: false, + }, + }, + }; + + const response = httpMocks.createResponse(); + jest + .spyOn(connectionService, 'createInvitationURL') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.createConnectionInvitation( + body, + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(resData).toStrictEqual(result); + }); + + it('Get Member invitation URL-> Agent is not present', async () => { + const body = { + autoAcceptConnection: true, + }; + const query = { + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + process: 'member', + }; + const serviceResult: any = undefined; + + const result: any = { + statusCode: HttpStatus.NOT_FOUND, + message: 'Agent Data not found.', + }; + + const response = httpMocks.createResponse(); + jest + .spyOn(connectionService, 'createInvitationURL') + .mockResolvedValueOnce(serviceResult); + const res: any = await connectionController.createConnectionInvitation( + body, + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.NOT_FOUND); + expect(resData).toStrictEqual(result); + }); + }); +}); diff --git a/apps/connection-manager/src/connections/controller/controller.ts b/apps/connection-manager/src/connections/controller/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..90ebb31a365336deace56469245799664adb07ce --- /dev/null +++ b/apps/connection-manager/src/connections/controller/controller.ts @@ -0,0 +1,765 @@ +import { + Body, + Controller, + Get, + HttpStatus, + Param, + Post, + Query, + Res, + Version, +} from '@nestjs/common'; +import ResponseType from '@common/response'; +import ConnectionDto from '@connections/entities/entity'; +import { + ApiBody, + ApiExcludeEndpoint, + ApiOperation, + ApiQuery, + ApiResponse, + ApiTags, +} from '@nestjs/swagger'; +import ConnectionsService from '@connections/services/service'; +import ConnectionStateDto from '@connections/entities/connectionStateDto.entity'; +import ConnectionCreateInvitationDto from '@connections/entities/connectionCreateInvitationDto.entity'; +import { Response } from 'express'; +import logger from '@src/utils/logger'; +import { MessagePattern } from '@nestjs/microservices'; +import { + Abstraction, + NATSServices, + RECEIVED_CONNECTION_ALIAS, +} from '@src/common/constants'; +import ConnectionSubscriptionEndpointDto from '../entities/connectionSubscribeEndPoint.entity'; +import AcceptConnectionInvitationBody from '../entities/AcceptConnectionInvitationBody'; + +@ApiTags('Connections') +@Controller() +export default class ConnectionsController { + constructor(private readonly connectionsService: ConnectionsService) {} + + @MessagePattern({ + endpoint: `${Abstraction.NATS_ENDPOINT}/${Abstraction.CONNECTION_STATE_CHANGED}`, + }) + async createConnection(body: { connectionRecord: ConnectionStateDto }) { + const connection = body.connectionRecord; + + const connectionObj: ConnectionDto = { + connectionId: connection.id ? connection.id : '', + status: connection.state ? connection.state : '', + participantDid: connection.did ? connection.did : '', + theirDid: connection.theirDid ? connection.theirDid : '', + theirLabel: connection.theirLabel ? connection.theirLabel : '', + isReceived: connection.alias === RECEIVED_CONNECTION_ALIAS, + }; + + /** + * Sent Connection updates to subscriber + */ + const connectionSubscriptionEndpointDto: ConnectionSubscriptionEndpointDto = + { + connectionId: connectionObj.connectionId, + status: connectionObj.status, + }; + this.connectionsService.publishConnectionSubscriberEndpoint( + connectionSubscriptionEndpointDto, + ); + + if (connection.state === ConnectionsService.status.INVITED) { + connectionObj.invitation = { + serviceEndpoint: connection.invitation.serviceEndpoint, + }; + const res: ResponseType = { + statusCode: HttpStatus.CREATED, + message: 'Connection established successfully', + data: await this.connectionsService.createConnections(connectionObj), + }; + return res; + } + if (connection.state === ConnectionsService.status.COMPLETE) { + logger.info('connection is in complete state'); + if ( + connection.alias === RECEIVED_CONNECTION_ALIAS || + connection.alias === ConnectionsService.connectionAlias.TRUST + ) { + connectionObj.status = ConnectionsService.status.TRUSTED; + } else { + const resConnection = await this.connectionsService.getConnectionByID( + connection.id, + ); + + if (resConnection) { + if (connection.alias === ConnectionsService.connectionAlias.MEMBER) { + logger.info( + `connection.alias ===${ConnectionsService.connectionAlias.MEMBER}`, + ); + this.connectionsService.sendConnectionStatusToPrincipal( + connection.state, + connection.id, + connection.theirLabel, + connection.did, + connection.theirDid, + ); + } + + if ( + connection.alias === ConnectionsService.connectionAlias.SUBSCRIBER + ) { + this.connectionsService.sendMembershipProofRequestToProofManager( + connection.id, + ); + } + } + } + } + + const res: ResponseType = { + statusCode: HttpStatus.OK, + message: 'Connection status Updated successfully', + data: await this.connectionsService.updateStatusByConnectionId( + connectionObj, + ), + }; + + return res; + } + + @Version(['1']) + @ApiBody({ type: ConnectionCreateInvitationDto }) + @Post('invitation-url') + @ApiOperation({ + summary: 'Create new connection invitation', + description: 'This call provides the capability to create new connection invitation by providing alias parameter for taht connection in the body of request. Alias can be one of value: trust/subscriber/trust. This call returns an object contains three fields. invitationUrl, invitationUrlShort, invitation object and connection object. You can use invitationUrlShort or invitationUrl to create QR code which can be scanned by PCM. It\'s better to use invitationUrlShort because long string of invitationUrl replaced with short id and QR code can be displayed properly' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connection created successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connection created successfully': { + value: { + statusCode: 200, + message: 'Connection created successfully', + data: { + invitationUrl: + 'https://serviceEndpointUrl.com:443/ocm/didcomm?c_i=eyJAdHlwZSI6Imh0dHBzOi', + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': 'efe3fe97', + label: 'ssi-abstraction-agent', + recipientKeys: ['8iT6AAmbj9P'], + serviceEndpoint: + 'https://serviceEndpointUrl.com:443/ocm/didcomm', + routingKeys: [], + }, + connection: { + _tags: {}, + metadata: {}, + id: '507de3ab', + createdAt: '1970-01-01T00:00:00.358Z', + did: 'F9xYT1m', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + { + id: 'F9xYT1m', + controller: 'F9xYT1m', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '8iT6AAmbj9P', + }, + ], + service: [ + { + id: 'F9xYT1m#IndyAgentService', + serviceEndpoint: + 'https://serviceEndpointUrl.com:443/ocm/didcomm', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['8iT6AAmbj9P'], + routingKeys: [], + }, + ], + authentication: [ + { + publicKey: 'F9xYT1m', + type: 'Ed25519SignatureAuthentication2018', + }, + ], + id: 'F9xYT1m', + }, + verkey: '8iT6AAmbj9P', + state: 'invited', + role: 'inviter', + alias: 'trust', + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': 'efe3fe97', + label: 'ssi-abstraction-agent', + recipientKeys: ['8iT6AAmbj9P'], + serviceEndpoint: + 'https://serviceEndpointUrl.com:443/ocm/didcomm', + routingKeys: [], + }, + multiUseInvitation: false, + }, + invitationUrlShort: + 'https://serviceEndpointUrl.com/ocm/connection/v1/url/1234abc', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Alias must be provided', + content: { + 'application/json': { + schema: {}, + examples: { + 'Alias must be provided': { + value: { + statusCode: 400, + message: 'Alias must be provided', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'Agent Data not found.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Agent Data not found.': { + value: { + statusCode: 400, + message: 'Agent Data not found.', + }, + }, + }, + }, + }, + }) + @ApiQuery({ name: 'alias', required: true }) + async createConnectionInvitation( + @Body() connectionCreate: ConnectionCreateInvitationDto, + @Query() query, + @Res() response: Response, + ) { + logger.info(JSON.stringify(query)); + let res: ResponseType; + + if ( + !( + query.alias === ConnectionsService.connectionAlias.MEMBER || + query.alias === ConnectionsService.connectionAlias.SUBSCRIBER || + query.alias === ConnectionsService.connectionAlias.TRUST + ) + ) { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Alias must be provided', + }; + return response.send(res); + } + const createConnectionPayload = { + ...connectionCreate, + alias: query.alias, + }; + const result = await this.connectionsService.createInvitationURL( + createConnectionPayload, + ); + if (result) { + res = { + statusCode: HttpStatus.OK, + message: 'Connection created successfully', + data: result, + }; + return response.send(res); + } + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'Agent Data not found.', + }; + + return response.send(res); + } + + @Version(['1']) + @Get('url/:id') + @ApiOperation({ + summary: 'Get full url from short url id', + description: 'Get full url from short url id' + }) + @ApiExcludeEndpoint() + async redirectToConnectionUrl(@Param() params, @Res() response: Response) { + const result = await this.connectionsService.findConnectionByShortUrlId( + params.id, + ); + if (!result) { + throw new Error('Not found'); + } + response.writeHead(302, { + location: result.connectionUrl, + }); + return response.end(); + } + + @Version(['1']) + @Get('connection-information') + @ApiOperation({ + summary: 'Fetch connection information by id or did', + description: 'This call provides the capability to get information about connection by connectionId or did. This call returns issued credentials and requested proof to that connection' + }) + @ApiQuery({ name: 'connectionId', required: false }) + @ApiQuery({ name: 'did', required: false }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connection information fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connection information fetched successfully': { + value: { + statusCode: 200, + message: 'Connection information fetched successfully', + data: { + records: { + issueCredentials: [ + { + id: '6a6ee15d', + credentialId: '624a76fd', + credDefId: '8y8oycXjn', + threadId: '9f95a52a', + state: 'done', + principalDid: 'KGaeQVa', + connectionId: '12cd39de', + createdDate: '1970-01-01T00:00:00.149Z', + updatedDate: '1970-01-01T00:00:00.467Z', + expirationDate: null, + }, + ], + presentProofs: [], + }, + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'connection ID / DID must be provided', + content: { + 'application/json': { + schema: {}, + examples: { + 'connection ID / DID must be provided': { + value: { + statusCode: 400, + message: 'connection ID / DID must be provided', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Invalid connection ID / DID', + content: { + 'application/json': { + schema: {}, + examples: { + 'Invalid connection ID / DID': { + value: { + statusCode: 400, + message: 'Invalid connection ID / DID', + }, + }, + }, + }, + }, + }) + async getConnectionInformationRequest( + @Query() query, + @Res() response: Response, + ) { + let res: ResponseType; + + if (!query.connectionId && !query.did) { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'connection ID / DID must be provided', + }; + return response.json(res); + } + + const result = + await this.connectionsService.getConnectionInformationRequest( + query.connectionId || '', + query.did || '', + ); + + if (!result) { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Invalid connection ID / DID', + }; + return response.json(res); + } + + res = { + statusCode: HttpStatus.OK, + message: 'Connection information fetched successfully', + data: { + records: result, + }, + }; + return response.json(res); + } + + @Version(['1']) + @Get('connections') + @ApiOperation({ + summary: 'Fetch list of connections', + description: 'This call provides the capability to search connections by using pagination and filter parameters. This call returns a list of connections and overall count of records. This endpoint supports followinng query filter parameters: participantDID, status, pageSize, page' + }) + @ApiQuery({ name: 'page', required: false }) + @ApiQuery({ name: 'pageSize', required: false }) + @ApiQuery({ name: 'status', required: false }) + @ApiQuery({ name: 'participantDID', required: false }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connections fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connections fetched successfully': { + value: { + statusCode: 200, + message: 'Connections fetched successfully', + data: { + count: 1, + records: [ + { + id: '089e1b95', + connectionId: 'e7361a1b', + status: 'invited', + participantDid: 'Kv6NS9y', + theirDid: '', + theirLabel: '', + createdDate: '1970-01-01T00:00:00.617Z', + updatedDate: '1970-01-01T00:00:00.617Z', + isActive: false, + isReceived: false, + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found': { + value: { + statusCode: 404, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + async getConnectionLists( + @Param() params, + @Query() query, + @Res() response: Response, + ) { + let res: ResponseType; + + const result = await this.connectionsService.findConnections( + query.pageSize ? parseInt(query.pageSize, 10) : 10, + query.page ? parseInt(query.page, 10) : 0, + query.status ? query.status : false, + params?.connectionId ? params.connectionId : null, + query.participantDID, + ); + + if (Array.isArray(result) && result[0] > 0) { + res = { + statusCode: HttpStatus.OK, + message: 'Connections fetched successfully', + data: { + count: result[0], + records: result[1], + }, + }; + return response.json(res); + } + + if (result && !Array.isArray(result) && result.isActive) { + res = { + statusCode: HttpStatus.OK, + message: 'Connections fetched successfully', + data: { + records: result, + }, + }; + return response.json(res); + } + + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + return response.json(res); + } + + + @Version(['1']) + @Get('connections/:connectionId') + @ApiOperation({ + summary: 'Fetch connection by id', + description: 'This call provides the capability to get connection data by providing connectionId. The connection data is the same which is returned from /v1/connections endpoint and contains generic information about connection like connectionId, status, dids and so on.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Connections fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Connections fetched successfully': { + value: { + statusCode: 200, + message: 'Connections fetched successfully', + data: { + count: 1, + records: [ + { + id: '089e1b95', + connectionId: 'e7361a1b', + status: 'invited', + participantDid: 'Kv6NS9y', + theirDid: '', + theirLabel: '', + createdDate: '1970-01-01T00:00:00.617Z', + updatedDate: '1970-01-01T00:00:00.617Z', + isActive: false, + isReceived: false, + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found': { + value: { + statusCode: 404, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + async getConnection( + @Param() params, + @Res() response: Response, + ) { + return this.getConnectionLists( + params, + {}, + response + ); + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/getConnectionById`, + }) + async getConnectionById(data: { connectionId: string }) { + const result = await this.connectionsService.findConnections( + -1, + -1, + false, + data.connectionId, + ); + return result; + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/makeConnectionTrusted`, + }) + async makeConnectionTrusted(data: { connectionId: string }) { + const result = await this.connectionsService.makeConnectionTrusted( + data.connectionId, + ); + return result; + } + + @Version(['1']) + @ApiBody({ type: AcceptConnectionInvitationBody }) + @Post('accept-connection-invitation') + @ApiOperation({ + summary: 'Accept connection invitation', + description: 'This call provides the capability to receive connection invitation as invitee by invitationUrl and create connection. If auto accepting is enabled via either the config passed in the function or the global agent config, a connection request message will be send.' + }) + @ApiResponse({ + status: HttpStatus.ACCEPTED, + description: 'Accepted Connection Request', + content: { + 'application/json': { + schema: {}, + examples: { + 'Accepted Connection Request': { + value: { + statusCode: 202, + message: 'Accepted Connection Request', + data: { + _tags: { + invitationKey: '5Nj', + state: 'invited', + role: 'invitee', + verkey: 'F6d', + }, + metadata: {}, + id: 'e6d30380', + createdAt: '1970-01-01T00:00:00.103Z', + did: 'Ss8', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + { + id: 'Ss8#1', + controller: 'Ss8', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: 'F6d', + }, + ], + service: [ + { + id: 'Ss8', + serviceEndpoint: + 'https://serviceEndpointUrl.com:443/ocm/didcomm', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['F6d'], + routingKeys: [], + }, + ], + authentication: [ + { + publicKey: 'Ss8#1', + type: 'Ed25519SignatureAuthentication2018', + }, + ], + id: 'Ss8', + }, + verkey: 'F6d', + theirLabel: 'ssi-abstraction-agent', + state: 'requested', + role: 'invitee', + alias: 'connection-received', + autoAcceptConnection: true, + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': '12ebbf61', + label: 'ssi-abstraction-agent', + recipientKeys: ['5Nj'], + serviceEndpoint: + 'https://serviceEndpointUrl.com:443/ocm/didcomm', + routingKeys: [], + }, + multiUseInvitation: false, + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error or Bad Request', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error or Bad Request': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:00.668Z', + message: 'something went wrong: Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async acceptConnectionInvitation( + @Body() body: AcceptConnectionInvitationBody, + @Res() response: Response, + ) { + const { invitationUrl, autoAcceptConnection } = body; + + const { agentUrl } = this.connectionsService.getAgentUrl(); + + const responseData: ResponseType = { + statusCode: HttpStatus.ACCEPTED, + message: 'Accepted Connection Request', + data: await this.connectionsService.acceptConnectionInvitation(agentUrl, { + invitationUrl, + autoAcceptConnection, + alias: RECEIVED_CONNECTION_ALIAS, + }), + }; + + return response.status(responseData.statusCode).send(responseData); + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/getReceivedConnections`, + }) + async getReceivedConnections() { + let result: object[] = []; + const connections = await this.connectionsService.getReceivedConnections(); + if (connections[0]) { + [, result] = connections; + } + return result; + } +} diff --git a/apps/connection-manager/src/connections/entities/AcceptConnectionInvitationBody.ts b/apps/connection-manager/src/connections/entities/AcceptConnectionInvitationBody.ts new file mode 100644 index 0000000000000000000000000000000000000000..4cf37a86986dcf7c16a3128f0ba284af4d25e6c1 --- /dev/null +++ b/apps/connection-manager/src/connections/entities/AcceptConnectionInvitationBody.ts @@ -0,0 +1,9 @@ +import { ApiProperty } from '@nestjs/swagger'; + +export default class AcceptConnectionInvitationBody { + @ApiProperty() + invitationUrl: string; + + @ApiProperty() + autoAcceptConnection: boolean; +} diff --git a/apps/connection-manager/src/connections/entities/InvitationDto.entity.ts b/apps/connection-manager/src/connections/entities/InvitationDto.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..b42ce40f668c508013cc2049a5571352687b841e --- /dev/null +++ b/apps/connection-manager/src/connections/entities/InvitationDto.entity.ts @@ -0,0 +1,21 @@ +import { IsString } from 'class-validator'; + +export default class InvitationDTO { + @IsString() + serviceEndpoint?: string; + + @IsString() + ['@type']?: string; + + @IsString() + ['@id']?: string; + + @IsString() + label?: string; + + @IsString() + recipientKeys?: [string]; + + @IsString() + routingKeys?: []; +} diff --git a/apps/connection-manager/src/connections/entities/connectionCreateInvitationDto.entity.ts b/apps/connection-manager/src/connections/entities/connectionCreateInvitationDto.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..9569d0377ef8763e2b42b7fec721b0a2606d4f46 --- /dev/null +++ b/apps/connection-manager/src/connections/entities/connectionCreateInvitationDto.entity.ts @@ -0,0 +1,20 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString } from 'class-validator'; + +export default class ConnectionCreateInvitationDto { + @IsString() + @ApiProperty() + autoAcceptConnection?: boolean; + + @IsString() + @ApiProperty() + alias?: string; + + @IsString() + @ApiProperty() + myLabel?: string; + + @IsString() + @ApiProperty() + myImageUrl?: string; +} diff --git a/apps/connection-manager/src/connections/entities/connectionStateDto.entity.ts b/apps/connection-manager/src/connections/entities/connectionStateDto.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..c982ca50c0fea66fd30a4ff6ce7e88846a2f45a1 --- /dev/null +++ b/apps/connection-manager/src/connections/entities/connectionStateDto.entity.ts @@ -0,0 +1,49 @@ +import { IsString, IsNotEmpty } from 'class-validator'; +import InvitationDTO from './InvitationDto.entity'; + +export default class ConnectionStateDto { + @IsString() + ['_tags']?: any; + + @IsString() + metadata?: any; + + @IsString() + didDoc?: any; + + @IsString() + verkey?: string; + + @IsString() + createdAt?: string; + + @IsString() + @IsNotEmpty() + role: string; + + @IsString() + @IsNotEmpty() + state: string; + + @IsString() + @IsNotEmpty() + id: string; + + @IsString() + @IsNotEmpty() + did: string; + + @IsString() + theirDid: string; + + @IsString() + theirLabel: string; + + @IsString() + invitation: InvitationDTO; + + @IsString() + alias: string; + + multiUseInvitation?: boolean; +} diff --git a/apps/connection-manager/src/connections/entities/connectionSubscribeEndPoint.entity.ts b/apps/connection-manager/src/connections/entities/connectionSubscribeEndPoint.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..fe7cb31f38bbcfbb2fa40fe5f6a132ae176ab0e8 --- /dev/null +++ b/apps/connection-manager/src/connections/entities/connectionSubscribeEndPoint.entity.ts @@ -0,0 +1,11 @@ +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class ConnectionSubscriptionEndpointDto { + @IsString() + @IsNotEmpty() + connectionId: string; + + @IsString() + @IsNotEmpty() + status: string; +} diff --git a/apps/connection-manager/src/connections/entities/entity.ts b/apps/connection-manager/src/connections/entities/entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..9f00bf8f277692f7d7a6c114d15217ea99320ba9 --- /dev/null +++ b/apps/connection-manager/src/connections/entities/entity.ts @@ -0,0 +1,40 @@ +import { IsString, IsNotEmpty, IsDate, IsBoolean } from 'class-validator'; +import InvitationDTO from './InvitationDto.entity'; + +export default class ConnectionDto { + @IsString() + id?: string; + + @IsDate() + connectionDate?: Date; + + @IsDate() + createdDate?: Date; + + @IsDate() + updatedDate?: Date; + + @IsString() + @IsNotEmpty() + participantDid: string; + + @IsString() + @IsNotEmpty() + status: string; + + @IsString() + @IsNotEmpty() + connectionId: string; + + @IsString() + theirDid: string; + + @IsString() + theirLabel: string; + + @IsBoolean() + isReceived: boolean; + + @IsString() + invitation?: InvitationDTO; +} diff --git a/apps/connection-manager/src/connections/module.spec.ts b/apps/connection-manager/src/connections/module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..0964656b5eaf8968ceab4b7c3c782580a7db4715 --- /dev/null +++ b/apps/connection-manager/src/connections/module.spec.ts @@ -0,0 +1,7 @@ +import ConnectionsModule from './module'; + +describe('Check if the module is working', () => { + it('should be defined', () => { + expect(ConnectionsModule).toBeDefined(); + }); +}); diff --git a/apps/connection-manager/src/connections/module.ts b/apps/connection-manager/src/connections/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..620d8ea5be9caa9d702447c42889fb7114ac3e96 --- /dev/null +++ b/apps/connection-manager/src/connections/module.ts @@ -0,0 +1,33 @@ +import { Module } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import ConnectionsController from '@connections/controller/controller'; +import ConnectionsService from '@connections/services/service'; +import NatsClientService from '@src/client/nats.client'; +import RestClientService from '@src/client/rest.client'; +import config from '@config/config'; + +@Module({ + imports: [ + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + ], + controllers: [ConnectionsController], + providers: [ + ConnectionsService, + PrismaService, + NatsClientService, + RestClientService, + ], +}) +export default class ConnectionsModule {} diff --git a/apps/connection-manager/src/connections/repository/connection.repository.ts b/apps/connection-manager/src/connections/repository/connection.repository.ts new file mode 100644 index 0000000000000000000000000000000000000000..eb04deef59d4eb7753153b064243a708817df566 --- /dev/null +++ b/apps/connection-manager/src/connections/repository/connection.repository.ts @@ -0,0 +1,100 @@ +import { Injectable } from '@nestjs/common'; +import { Prisma } from '@prisma/client'; +import PrismaService from '@DB/prisma.service'; + +@Injectable() +export default class ConnectionRepository { + constructor(private readonly prismaService: PrismaService) {} + + async createConnection(data: Prisma.ConnectionCreateInput) { + return this.prismaService.connection.create({ + data, + }); + } + + async createShortUrl(invitationUrl: string) { + return this.prismaService.shortUrlConnection.create({ + data: { + connectionUrl: invitationUrl, + }, + }); + } + + async getShortUrl(id: string) { + return this.prismaService.shortUrlConnection.findUnique({ + where: { + id, + }, + }); + } + + async updateConnection(params: { + where: Prisma.ConnectionWhereUniqueInput; + data: Prisma.ConnectionUpdateInput; + }) { + const { where, data } = params; + return this.prismaService.connection.update({ + data, + where, + }); + } + + async updateManyConnection(params: { + where: Prisma.ConnectionWhereInput; + data: Prisma.ConnectionUpdateInput; + }) { + const { where, data } = params; + return this.prismaService.connection.updateMany({ + data, + where, + }); + } + + async findConnections(params: { + skip?: number; + take?: number; + cursor?: Prisma.ConnectionWhereUniqueInput; + where?: Prisma.ConnectionWhereInput; + orderBy?: Prisma.ConnectionOrderByWithRelationInput; + select?: Prisma.ConnectionSelect; + }) { + const { skip, take, cursor, where, orderBy, select } = params; + if (where) { + where.isActive = true; + } + return this.prismaService.$transaction([ + this.prismaService.connection.count({ + where: { + ...where, + }, + }), + this.prismaService.connection.findMany({ + skip, + take, + cursor, + where, + orderBy, + select, + }), + ]); + } + + async findUniqueConnection(params: { + where: Prisma.ConnectionWhereUniqueInput; + }) { + const { where } = params; + return this.prismaService.connection.findUnique({ + where, + }); + } + + findByConnectionId(connectionId: string) { + const query = { where: { connectionId } }; + return this.findUniqueConnection(query); + } + + findByConnectionByParticipantDID(participantDid: string) { + const query = { where: { participantDid } }; + return this.findUniqueConnection(query); + } +} diff --git a/apps/connection-manager/src/connections/scheduler/scheduler.service.ts b/apps/connection-manager/src/connections/scheduler/scheduler.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ba03f92fa415753cd57e0f99ea6299f2083dc30 --- /dev/null +++ b/apps/connection-manager/src/connections/scheduler/scheduler.service.ts @@ -0,0 +1,107 @@ +import logger from '@utils/logger'; +import { + Controller, + Injectable, + InternalServerErrorException, +} from '@nestjs/common'; +import { Cron, CronExpression } from '@nestjs/schedule'; +import PrismaService from '@DB/prisma.service'; +import ConnectionRepository from '@connections/repository/connection.repository'; +import ConnectionsService from '@connections/services/service'; +import ConfigClient from '@src/client/config.client'; + +@Injectable() +@Controller() +export default class SchedulerService { + private connectionRepository; + + constructor(private readonly prismaService: PrismaService) { + this.connectionRepository = new ConnectionRepository(this.prismaService); + } + + @Cron(CronExpression.EVERY_30_SECONDS) + async expireNonCompleteConnection() { + const compareDateTime = ConfigClient.getConnectionExpire(); + if (compareDateTime) { + const checkExpireTillDateTime = ConfigClient.checkExpireTill(); + + const query = { + where: { + AND: [ + { + OR: [ + { + status: ConnectionsService.status.INVITED, + }, + { + status: ConnectionsService.status.REQUESTED, + }, + { + status: ConnectionsService.status.RESPONDED, + }, + ], + }, + { + isActive: true, + }, + { + createdDate: { + lt: compareDateTime, + ...(checkExpireTillDateTime && { gt: checkExpireTillDateTime }), + }, + }, + ], + }, + data: { + isActive: false, + }, + }; + const result = await this.connectionRepository.updateManyConnection( + query, + ); + logger.info(JSON.stringify(result)); + } else { + throw new InternalServerErrorException( + 'Connection Expire period is mandatory', + ); + } + } + + @Cron(CronExpression.EVERY_30_SECONDS) + async expireNonTrustedConnection() { + const compareDateTime = ConfigClient.getConnectionExpire(); + if (compareDateTime) { + const checkExpireTillDateTime = ConfigClient.checkExpireTill(); + + const query = { + where: { + AND: [ + { + status: ConnectionsService.status.COMPLETE, + }, + { + isActive: true, + }, + { + createdDate: { + lt: compareDateTime, + ...(checkExpireTillDateTime && { gt: checkExpireTillDateTime }), + }, + }, + ], + }, + data: { + isActive: false, + }, + }; + const result = await this.connectionRepository.updateManyConnection( + query, + ); + logger.info(JSON.stringify(result)); + } else { + throw new InternalServerErrorException( + 'Connection Expire period is mandatory', + ); + } + } +} diff --git a/apps/connection-manager/src/connections/services/service.spec.ts b/apps/connection-manager/src/connections/services/service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b61de64755a3dc1a5f44796f4561bebf8979412b --- /dev/null +++ b/apps/connection-manager/src/connections/services/service.spec.ts @@ -0,0 +1,451 @@ +import { HttpModule } from '@nestjs/axios'; +import { ConfigModule } from '@nestjs/config'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { Test, TestingModule } from '@nestjs/testing'; +import NatsClientService from '@src/client/nats.client'; +import { NATSServices } from '@common/constants'; +import PrismaService from '@DB/prisma.service'; +import ConnectionsService from '@connections/services/service'; +import RestClientService from '@src/client/rest.client'; +import ConnectionDto from '@connections/entities/entity'; + +describe('ConnectionsService', () => { + let service: ConnectionsService; + let prismaService: PrismaService; + let restClientService: RestClientService; + let natsClient: NatsClientService; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + ConfigModule, + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + }, + ]), + ], + providers: [ + ConnectionsService, + PrismaService, + NatsClientService, + RestClientService, + ], + exports: [PrismaService], + }).compile(); + prismaService = module.get<PrismaService>(PrismaService); + service = module.get<ConnectionsService>(ConnectionsService); + restClientService = module.get<RestClientService>(RestClientService); + natsClient = module.get<NatsClientService>(NatsClientService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('find Connection function', () => { + it('find connection by connection Id ', async () => { + const repositoryResult: any = { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }; + + const result: any = { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }; + jest + .spyOn(prismaService.connection, 'findUnique') + .mockResolvedValueOnce(repositoryResult); + const res: any = await service.findConnections( + '', + -1, + -1, + false, + '7b821264-2ae3-4459-b45f-19fa975d91f7', + ); + expect(res).toStrictEqual(result); + }); + + it('find connection by participant DID', async () => { + const repositoryResult: any = { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }; + + const result: any = { + id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + status: 'trusted', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-18T11:03:58.099Z', + updatedDate: '2022-04-18T11:05:10.004Z', + isActive: true, + }; + jest + .spyOn(prismaService.connection, 'findUnique') + .mockResolvedValueOnce(repositoryResult); + const res: any = await service.findConnections( + '', + -1, + -1, + false, + '', + 'SU1SHqQiDcc6gDvqH8wwYF', + ); + + expect(res).toStrictEqual(result); + }); + + it('find connection by participant id', async () => { + const repositoryResult: any = [ + 3, + [ + { + id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', + connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'invited', + participantDid: 'UVE8wxzGEYGjTWWcudc2nB', + theirDid: '', + theirLabel: '', + createdDate: '2022-04-22T12:15:59.365Z', + updatedDate: '2022-04-22T12:15:59.365Z', + isActive: true, + }, + { + id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', + connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'trusted', + participantDid: '3X5jtG9CJFgsDFyXjUDRNp', + theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', + theirLabel: 'tango@vomoto.com', + createdDate: '2022-04-22T12:18:42.273Z', + updatedDate: '2022-04-22T12:23:09.183Z', + isActive: true, + }, + { + id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', + connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'responded', + participantDid: 'WYcecJk6ZbWvoF2VD9xTey', + theirDid: '3NigtUWR68H3HPQiuwgfEk', + theirLabel: 'arnold@vomoto.com', + createdDate: '2022-04-22T12:16:03.614Z', + updatedDate: '2022-04-22T12:16:56.132Z', + isActive: true, + }, + ], + ]; + + const result: any = [ + 3, + [ + { + id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', + connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'invited', + participantDid: 'UVE8wxzGEYGjTWWcudc2nB', + theirDid: '', + theirLabel: '', + createdDate: '2022-04-22T12:15:59.365Z', + updatedDate: '2022-04-22T12:15:59.365Z', + isActive: true, + }, + { + id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', + connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'trusted', + participantDid: '3X5jtG9CJFgsDFyXjUDRNp', + theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', + theirLabel: 'tango@vomoto.com', + createdDate: '2022-04-22T12:18:42.273Z', + updatedDate: '2022-04-22T12:23:09.183Z', + isActive: true, + }, + { + id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', + connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'responded', + participantDid: 'WYcecJk6ZbWvoF2VD9xTey', + theirDid: '3NigtUWR68H3HPQiuwgfEk', + theirLabel: 'arnold@vomoto.com', + createdDate: '2022-04-22T12:16:03.614Z', + updatedDate: '2022-04-22T12:16:56.132Z', + isActive: true, + }, + ], + ]; + jest + .spyOn(prismaService, '$transaction') + .mockResolvedValueOnce(repositoryResult); + const res: any = await service.findConnections( + '13f412e2-2749-462a-a10a-54f25e326641', + -1, + -1, + false, + '', + '', + ); + + expect(res).toStrictEqual(result); + }); + + it('find connections by participant Id and status', async () => { + const repositoryResult: any = [ + 3, + [ + { + id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', + connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'invited', + participantDid: 'UVE8wxzGEYGjTWWcudc2nB', + theirDid: '', + theirLabel: '', + createdDate: '2022-04-22T12:15:59.365Z', + updatedDate: '2022-04-22T12:15:59.365Z', + isActive: true, + }, + { + id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', + connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'trusted', + participantDid: '3X5jtG9CJFgsDFyXjUDRNp', + theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', + theirLabel: 'tango@vomoto.com', + createdDate: '2022-04-22T12:18:42.273Z', + updatedDate: '2022-04-22T12:23:09.183Z', + isActive: true, + }, + { + id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', + connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'responded', + participantDid: 'WYcecJk6ZbWvoF2VD9xTey', + theirDid: '3NigtUWR68H3HPQiuwgfEk', + theirLabel: 'arnold@vomoto.com', + createdDate: '2022-04-22T12:16:03.614Z', + updatedDate: '2022-04-22T12:16:56.132Z', + isActive: true, + }, + ], + ]; + + const result: any = [ + 3, + [ + { + id: '977c7cd6-a1af-4a5a-bd51-03758d8db50f', + connectionId: '19694476-cc8e-42a3-a5ea-0b2503133348', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'invited', + participantDid: 'UVE8wxzGEYGjTWWcudc2nB', + theirDid: '', + theirLabel: '', + createdDate: '2022-04-22T12:15:59.365Z', + updatedDate: '2022-04-22T12:15:59.365Z', + isActive: true, + }, + { + id: 'a453d1ae-f95d-4485-8a1a-3c4347450537', + connectionId: '24fcc8b7-3cfa-4d46-a14a-9b6297e81d7e', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'trusted', + participantDid: '3X5jtG9CJFgsDFyXjUDRNp', + theirDid: 'Us8ZgUGXZ5P7GTF8q5NEgh', + theirLabel: 'tango@vomoto.com', + createdDate: '2022-04-22T12:18:42.273Z', + updatedDate: '2022-04-22T12:23:09.183Z', + isActive: true, + }, + { + id: 'ccde23e4-5a21-44d8-a90b-beeba526d5f4', + connectionId: 'ff468f45-7fe8-4964-abb4-d2dd90b6aed3', + participantId: '13f412e2-2749-462a-a10a-54f25e326641', + status: 'responded', + participantDid: 'WYcecJk6ZbWvoF2VD9xTey', + theirDid: '3NigtUWR68H3HPQiuwgfEk', + theirLabel: 'arnold@vomoto.com', + createdDate: '2022-04-22T12:16:03.614Z', + updatedDate: '2022-04-22T12:16:56.132Z', + isActive: true, + }, + ], + ]; + jest + .spyOn(prismaService, '$transaction') + .mockResolvedValueOnce(repositoryResult); + + const res: any = await service.findConnections( + '13f412e2-2749-462a-a10a-54f25e326641', + -1, + -1, + 'trusted,complete,responded,invited', + '', + ); + expect(res).toStrictEqual(result); + }); + }); + + describe('create invitation', () => { + it('Create invitation-> member flow', async () => { + const serviceResult: any = { + invitationUrl: + 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', + invitation: { + '@type': + 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', + '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + label: 'technica_corp', + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + serviceEndpoint: 'http://localhost:4005', + routingKeys: [], + }, + connection: { + _tags: {}, + metadata: {}, + id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', + createdAt: '2022-04-21T10:52:18.161Z', + did: '9nYw7CSdHPqXf6ayfA7Wo2', + didDoc: { + '@context': 'https://w3id.org/did/v1', + publicKey: [ + { + id: '9nYw7CSdHPqXf6ayfA7Wo2#1', + controller: '9nYw7CSdHPqXf6ayfA7Wo2', + type: 'Ed25519VerificationKey2018', + publicKeyBase58: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + }, + ], + service: [ + { + id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', + serviceEndpoint: 'http://localhost:4005', + type: 'IndyAgent', + priority: 0, + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + routingKeys: [], + }, + ], + authentication: [ + { + publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', + type: 'Ed25519SignatureAuthentication2018', + }, + ], + id: '9nYw7CSdHPqXf6ayfA7Wo2', + }, + verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + state: 'invited', + role: 'inviter', + alias: 'member', + autoAcceptConnection: true, + invitation: { + '@type': 'https://didcomm.org/connections/1.0/invitation', + '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + label: 'technica_corp', + recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + serviceEndpoint: 'http://localhost:4005', + routingKeys: [], + }, + multiUseInvitation: false, + }, + }; + const agent: any = { + status: 200, + message: 'Agent Data', + data: { + service_endpoint: 'agent URL', + }, + }; + const result = serviceResult; + jest + .spyOn(natsClient, 'getAgentByParticipantId') + .mockResolvedValueOnce(agent); + jest + .spyOn(restClientService, 'post') + .mockResolvedValueOnce(serviceResult); + const res = await service.createInvitationURL( + { autoAcceptConnection: true, alias: 'member' }, + 'participantId', + ); + expect(res).toStrictEqual(result); + }); + }); + + describe('Create connection', () => { + it('should create', async () => { + const connectionObj: ConnectionDto = { + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + status: 'complete', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + }; + const agent: any = { + status: 200, + message: 'Agent Data', + data: { + service_endpoint: 'agent URL', + }, + }; + const repositoryResult: any = { + id: '52d499e0-f76a-4b25-9c2a-f357bf6b73be', + connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + participantId: '', + status: 'complete', + participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + theirLabel: 'sagar@getnada.com', + createdDate: '2022-04-27T06:55:01.643Z', + updatedDate: '2022-04-27T06:55:01.643Z', + isActive: true, + }; + + const result = repositoryResult; + jest.spyOn(natsClient, 'getAgentByURL').mockResolvedValueOnce(agent); + jest + .spyOn(prismaService.connection, 'create') + .mockResolvedValueOnce(repositoryResult); + + const res = await service.createConnections(connectionObj); + expect(res).toStrictEqual(result); + }); + }); +}); diff --git a/apps/connection-manager/src/connections/services/service.ts b/apps/connection-manager/src/connections/services/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..7c404f6a3a3edf9677a6bea136207260689958ff --- /dev/null +++ b/apps/connection-manager/src/connections/services/service.ts @@ -0,0 +1,259 @@ +import { Injectable } from '@nestjs/common'; +import ConnectionDto from '@connections/entities/entity'; +import ConnectionRepository from '@connections/repository/connection.repository'; +import PrismaService from '@DB/prisma.service'; +import ConnectionCreateInvitationDto from '@connections/entities/connectionCreateInvitationDto.entity'; +import { Connection, Prisma } from '@prisma/client'; +import NatsClientService from '@src/client/nats.client'; +import pagination from '@utils/pagination'; +import logger from '@src/utils/logger'; +import ConnectionSubscriptionEndpointDto from '@connections/entities/connectionSubscribeEndPoint.entity'; +import RestClientService from '@src/client/rest.client'; +import { ConfigService } from '@nestjs/config'; + +@Injectable() +export default class ConnectionsService { + private connectionRepository: ConnectionRepository; + + constructor( + private readonly prismaService: PrismaService, + private readonly natsClient: NatsClientService, + private readonly restClient: RestClientService, + private readonly configService: ConfigService, + ) { + this.connectionRepository = new ConnectionRepository(this.prismaService); + } + + static readonly connectionAlias = { + MEMBER: 'member', + SUBSCRIBER: 'subscriber', + TRUST: 'trust', + }; + + static readonly status = { + DEFAULT: 'invited', + INVITED: 'invited', + REQUESTED: 'requested', + RESPONDED: 'responded', + COMPLETE: 'complete', + TRUSTED: 'trusted', + }; + + static readonly roles = { + INVITER: 'inviter', + INVITEE: 'invitee', + }; + + async createConnections(connection: ConnectionDto) { + logger.info( + `connection service create connection connection?.invitation?.serviceEndpoint is ${connection?.invitation?.serviceEndpoint}`, + ); + const insertData = { + ...connection, + }; + delete insertData.invitation; + return this.connectionRepository.createConnection({ + ...insertData, + }); + } + + async sendConnectionStatusToPrincipal( + status: string, + connectionId: string, + theirLabel: string, + participantDID: string, + theirDid: string, + ) { + try { + const response = + await this.natsClient.sendConnectionStatusPrincipalManager( + status, + connectionId, + theirLabel, + participantDID, + theirDid, + ); + return response; + } catch (error) { + logger.error(error.toString()); + return error; + } + } + + async sendMembershipProofRequestToProofManager(connectionId: string) { + try { + const response = + await this.natsClient.sendMembershipProofRequestToProofManager( + connectionId, + ); + return response; + } catch (error) { + logger.error(error.toString()); + return error; + } + } + + async updateStatusByConnectionId(connection: ConnectionDto) { + return this.connectionRepository.updateConnection({ + where: { connectionId: connection.connectionId }, + data: { + status: connection.status, + theirDid: connection.theirDid, + theirLabel: connection.theirLabel, + updatedDate: new Date(), + }, + }); + } + + getConnectionByID(connectionId: string) { + return this.connectionRepository.findByConnectionId(connectionId); + } + + getAgentUrl() { + return this.configService.get('agent'); + } + + getAppUrl() { + return this.configService.get('APP_URL'); + } + + async findConnections( + pageSize: number, + page: number, + status: string | false, + connectionId = '', + participantDid = '', + ) { + let query: { + skip?: number; + take?: number; + cursor?: Prisma.ConnectionWhereUniqueInput; + where?: Prisma.ConnectionWhereInput; + orderBy?: Prisma.ConnectionOrderByWithRelationInput; + } = {}; + + if (connectionId) { + return this.connectionRepository.findByConnectionId(connectionId); + } + if (participantDid) { + return this.connectionRepository.findByConnectionByParticipantDID( + participantDid, + ); + } + if (status) { + const statuses: string[] = status.split(','); + query.where = { status: { in: statuses } }; + } + + query = { ...query, ...pagination(pageSize, page) }; + + return this.connectionRepository.findConnections(query); + } + + async createInvitationURL(connectionCreate: ConnectionCreateInvitationDto) { + const { agentUrl } = this.getAgentUrl(); + const appUrl = this.getAppUrl(); + const responseData = await this.restClient.post( + `${agentUrl}/connections/create-invitation`, + connectionCreate, + ); + + const shortRow = await this.connectionRepository.createShortUrl( + responseData.invitationUrl, + ); + responseData.invitationUrlShort = `${appUrl}/v1/url/${shortRow.id}`; + return responseData; + } + + async findConnectionByShortUrlId(id: string) { + return this.connectionRepository.getShortUrl(id); + } + + async getConnectionInformationRequest(connectionId = '', did = '') { + try { + let connectionDetails: Connection | null = null; + + if (connectionId) { + connectionDetails = await this.connectionRepository.findByConnectionId( + connectionId, + ); + } + + if (did && !connectionDetails) { + connectionDetails = + await this.connectionRepository.findByConnectionByParticipantDID(did); + } + + if (!connectionDetails) { + return null; + } + + const response = { + issueCredentials: [], + presentProofs: [], + }; + + const issueCredentials = await this.natsClient.getIssueCredentials( + connectionDetails.connectionId, + ); + + if ( + issueCredentials && + Array.isArray(issueCredentials) && + !!issueCredentials[1] + ) { + const [, issueCredentialsArr] = issueCredentials; + response.issueCredentials = issueCredentialsArr; + } + + const presentProofs = await this.natsClient.getPresentProofs( + connectionDetails.connectionId, + ); + + if (presentProofs && Array.isArray(presentProofs) && !!presentProofs[1]) { + const [, presentProofsArr] = presentProofs; + response.presentProofs = presentProofsArr; + } + + return response; + } catch (error) { + logger.error(JSON.stringify(error)); + return error; + } + } + + async makeConnectionTrusted(connectionId: string) { + return this.connectionRepository.updateConnection({ + where: { connectionId }, + data: { + status: ConnectionsService.status.TRUSTED, + updatedDate: new Date(), + }, + }); + } + + publishConnectionSubscriberEndpoint(data: ConnectionSubscriptionEndpointDto) { + this.natsClient.publishConnection(data); + } + + async acceptConnectionInvitation( + agentURL: string, + payload: { + invitationUrl: string; + autoAcceptConnection: boolean; + alias: string; + }, + ) { + return this.restClient.post( + `${agentURL}/connections/receive-invitation-url`, + payload, + ); + } + + async getReceivedConnections() { + return this.connectionRepository.findConnections({ + where: { isReceived: true }, + select: { connectionId: true }, + }); + } +} diff --git a/apps/connection-manager/src/health/health.controller.ts b/apps/connection-manager/src/health/health.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2391f4721ec777e81853b54951d6e1a5bac3b8a --- /dev/null +++ b/apps/connection-manager/src/health/health.controller.ts @@ -0,0 +1,41 @@ +import { Controller, Get, Version, HttpStatus } from '@nestjs/common'; + +import ResponseType from '@common/response'; +import {ApiOperation, ApiResponse} from '@nestjs/swagger'; + +@Controller('health') +export default class HealthController { + res: ResponseType; + + @Version(['1']) + @Get() + @ApiOperation({ + summary: 'Health check', + description: 'This call provides the capability to check the service is working and up. The call returns 200 Status Code and current server time in json body' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Service is up and running.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Service is up and running.': { + value: { + statusCode: 200, + message: + 'Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time)', + }, + }, + }, + }, + }, + }) + getHealth() { + this.res = { + statusCode: HttpStatus.OK, + message: `${new Date()}`, + }; + return this.res; + } +} diff --git a/apps/connection-manager/src/health/health.spec.ts b/apps/connection-manager/src/health/health.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a7ecda97f48681fcbca95cb4086ed1a048c10176 --- /dev/null +++ b/apps/connection-manager/src/health/health.spec.ts @@ -0,0 +1,23 @@ +import { HttpStatus } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import HealthController from './health.controller'; + +describe('Health', () => { + let healthController: HealthController; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + controllers: [HealthController], + providers: [], + }).compile(); + healthController = module.get<HealthController>(HealthController); + }); + it('should be defined', () => { + expect(healthController).toBeDefined(); + }); + + it('should call getHealth', () => { + const response = healthController.getHealth(); + expect(response.statusCode).toBe(HttpStatus.OK); + }); +}); diff --git a/apps/connection-manager/src/main.ts b/apps/connection-manager/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..232e2935f01a911f85dcb792bbc1adb2423594e3 --- /dev/null +++ b/apps/connection-manager/src/main.ts @@ -0,0 +1,47 @@ +import { HttpAdapterHost, NestFactory } from '@nestjs/core'; +import { ConfigService } from '@nestjs/config'; +import { VersioningType } from '@nestjs/common'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { Transport, MicroserviceOptions } from '@nestjs/microservices'; +import AllExceptionsFilter from '@utils/exceptionsFilter'; +import AppModule from './app.module'; +import logger from './utils/logger'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + const configService = app.get(ConfigService); + app.enableCors(); + + app.connectMicroservice<MicroserviceOptions>({ + transport: Transport.NATS, + options: { + servers: [configService.get('nats').url], + }, + }); + + app.enableVersioning({ + defaultVersion: ['1', '2'], + type: VersioningType.URI, + }); + + const swaggerConfig = new DocumentBuilder() + .setTitle('Gaia-x Connection Manager API') + .setDescription('API documentation for GAIA-X Connection Manager') + .setVersion('1.0') + .addServer(`localhost:${configService.get('PORT')}`) + .build(); + + const document = SwaggerModule.createDocument(app, swaggerConfig); + + SwaggerModule.setup('/swagger', app, document); + await app.startAllMicroservices(); + + const httpAdapter = app.get(HttpAdapterHost); + app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)); + + await app.listen(configService.get('PORT') || 3000, () => { + logger.info(`Listening on Port:${configService.get('PORT')}` || 3000); + }); +} + +bootstrap(); diff --git a/apps/connection-manager/src/middleware/auth.middleware.ts b/apps/connection-manager/src/middleware/auth.middleware.ts new file mode 100644 index 0000000000000000000000000000000000000000..66e0a50bfa92cfd37ac569d27f0c70be4e20cd0e --- /dev/null +++ b/apps/connection-manager/src/middleware/auth.middleware.ts @@ -0,0 +1,137 @@ +import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import logger from '@src/utils/logger'; +import { Request, Response, NextFunction } from 'express'; +// import { ClientCredentials } from 'simple-oauth2'; + +import * as jwt from 'jsonwebtoken'; +import jwksClient = require('jwks-rsa'); + +// interface IOAuthConfig { +// client: { +// id: string, +// secret: string +// }; +// auth: { +// tokenHost: string +// } +// } + +@Injectable() +export class AuthMiddleware implements NestMiddleware { + constructor(private readonly configService: ConfigService) {} + + /* eslint-disable */ + async use(req: Request, res: Response, next: NextFunction) { + if (this.configService.get('auth.useAuth') === 'false') { + return next(); + } + + logger.info('Request at middleware'); + + const authHeader = req.headers.authorization; + const authToken = authHeader && authHeader.split(' ')[1]; + + if (!authToken) { + logger.error('No access token provided.'); + res.json({ + status: HttpStatus.UNAUTHORIZED, + message: 'Unauthorized. No Access token provided.', + data: undefined, + }); + return; + } + + // ClientID string `envconfig:"OAUTH_CLIENT_ID"` + // ClientSecret string `envconfig:"OAUTH_CLIENT_SECRET"` + // TokenURL string `envconfig:"OAUTH_TOKEN_URL"` + + // const oauthConfig = { + // client: { + // id: this.configService.get('auth.clientId'), + // secret: this.configService.get('auth.clientSecret') + // }, + // auth: { + // tokenHost: this.configService.get('auth.tokenUrl') || 'https://api.oauth.com' + // } + // }; + + // async function getAccessToken(conf: IOAuthConfig) { + // const client = new ClientCredentials(conf); + // let accessToken: any; + + // const tokenParams = { + // scope: '<scope>', + // }; + + // try { + // accessToken = await client.getToken(tokenParams); + // } catch (error) { + // logger.error('Access Token error', error.message); + // } + + // return accessToken; + // } + + // let result = getAccessToken(oauthConfig); + + // if (!result) { + // res.json({ + // status: HttpStatus.UNAUTHORIZED, + // message: 'Unauthorized. Access token error.', + // data: undefined, + // }) + // return; + // } + + function getKey( + header: jwt.JwtHeader, + callback: jwt.SigningKeyCallback, + ): void { + const jwksUri = this.configService.get('auth.tokenUrl') || ''; + const client = jwksClient({ jwksUri, timeout: 30000 }); + + client + .getSigningKey(header.kid) + .then((key) => callback(null, key.getPublicKey())) + .catch(callback); + } + + function verify(token: string): Promise<any> | undefined { + return new Promise( + (resolve: (decoded: any) => void, reject: (error: Error) => void) => { + const verifyCallback: jwt.VerifyCallback<jwt.JwtPayload | string> = ( + error: jwt.VerifyErrors | null, + decoded: any, + ): void => { + if (error) { + return reject(error); + } + return resolve(decoded); + }; + + jwt.verify(token, getKey, verifyCallback); + }, + ); + } + + const result = await verify(authToken); + + if (!result) { + logger.error('Invalid access token provided.'); + res.json({ + status: HttpStatus.UNAUTHORIZED, + message: 'Unauthorized. Invalid Access token provided.', + data: undefined, + }); + return; + } + + next(); + } + /* eslint-enable */ +} + +export default { + AuthMiddleware, +}; diff --git a/apps/connection-manager/src/prisma/prisma.module.spec.ts b/apps/connection-manager/src/prisma/prisma.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e557fe14e4a4d0a516b645ce88cfe11e613eb8f6 --- /dev/null +++ b/apps/connection-manager/src/prisma/prisma.module.spec.ts @@ -0,0 +1,7 @@ +import PrismaModule from './prisma.module'; + +describe('Check if the module is working', () => { + it('should be defined', () => { + expect(PrismaModule).toBeDefined(); + }); +}); diff --git a/apps/connection-manager/src/prisma/prisma.module.ts b/apps/connection-manager/src/prisma/prisma.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..f3b6aae822b9713f36774df2efde0dc11b642a3d --- /dev/null +++ b/apps/connection-manager/src/prisma/prisma.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import PrismaService from './prisma.service'; + +@Module({ + imports: [ConfigModule], + controllers: [], + providers: [PrismaService], + exports: [PrismaService], +}) +export default class PrismaModule {} diff --git a/apps/connection-manager/src/prisma/prisma.service.ts b/apps/connection-manager/src/prisma/prisma.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d885d9af71da2594144d53712047afd50c53f05 --- /dev/null +++ b/apps/connection-manager/src/prisma/prisma.service.ts @@ -0,0 +1,28 @@ +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { PrismaClient } from '@prisma/client'; + +@Injectable() +export default class PrismaService + extends PrismaClient + implements OnModuleInit, OnModuleDestroy +{ + constructor(private configService: ConfigService) { + super(); + } + + async onModuleInit() { + const prisma = new PrismaClient({ + datasources: { + db: { + url: this.configService.get('DATABASE_URL'), + }, + }, + }); + await prisma.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } +} diff --git a/apps/connection-manager/src/prisma/schema.prisma b/apps/connection-manager/src/prisma/schema.prisma new file mode 100644 index 0000000000000000000000000000000000000000..58c5c2d7c5ae4baa1e426a7268ed2752bde9725f --- /dev/null +++ b/apps/connection-manager/src/prisma/schema.prisma @@ -0,0 +1,26 @@ +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Connection { + id String @id @default(uuid()) + connectionId String @unique @map("connection_id") + status String + participantDid String @unique @map("participant_did") + theirDid String @map("their_did") + theirLabel String @map("their_label") + createdDate DateTime @default(now()) @map("created_date") + updatedDate DateTime @default(now()) @map("updated_date") + isActive Boolean @default(true) @map("is_active") + isReceived Boolean @map("is_received") +} + +model ShortUrlConnection { + id String @id @default(uuid()) + connectionUrl String +} diff --git a/apps/connection-manager/src/utils/exceptionsFilter.ts b/apps/connection-manager/src/utils/exceptionsFilter.ts new file mode 100644 index 0000000000000000000000000000000000000000..647308cb01b41a9f0bc71c1dc1c9260ddd30b333 --- /dev/null +++ b/apps/connection-manager/src/utils/exceptionsFilter.ts @@ -0,0 +1,86 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus, + Logger, +} from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; +import { Request } from 'express'; +import { Prisma } from '@prisma/client'; + +const { PrismaClientKnownRequestError, PrismaClientValidationError } = Prisma; + +@Catch() +export default class AllExceptionsFilter implements ExceptionFilter { + constructor(private readonly httpAdapterHost: HttpAdapterHost) {} + + catch(exception: any, host: ArgumentsHost): void { + const { httpAdapter } = this.httpAdapterHost; + + const ctx = host.switchToHttp(); + const request = ctx.getRequest<Request>(); + + let httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + let message = ''; + switch (exception.constructor) { + case HttpException: + httpStatus = (exception as HttpException).getStatus(); + message = exception?.message || 'Internal server error'; + break; + case PrismaClientKnownRequestError: + switch (exception.code) { + case 'P2002': // Unique constraint failed on the {constraint} + case 'P2000': // The provided value for the column is too long for the column's type. Column: {column_name} + case 'P2001': // The record searched for in the where condition ({model_name}.{argument_name} = {argument_value}) does not exist + case 'P2005': // The value {field_value} stored in the database for the field {field_name} is invalid for the field's type + case 'P2006': // The provided value {field_value} for {model_name} field {field_name} is not valid + case 'P2010': // Raw query failed. Code: {code}. Message: {message} + case 'P2011': // Null constraint violation on the {constraint} + case 'P2017': // The records for relation {relation_name} between the {parent_name} and {child_name} models are not connected. + case 'P2021': // The table {table} does not exist in the current database. + case 'P2022': // The column {column} does not exist in the current database. + httpStatus = HttpStatus.BAD_REQUEST; + message = exception?.message; + break; + case 'P2018': // The required connected records were not found. {details} + case 'P2025': // An operation failed because it depends on one or more records that were required but not found. {cause} + case 'P2015': // A related record could not be found. {details} + httpStatus = HttpStatus.NOT_FOUND; + message = exception?.message; + break; + default: + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + message = exception?.message || 'Internal server error'; + } + break; + case PrismaClientValidationError: + httpStatus = HttpStatus.BAD_REQUEST; + message = exception?.message; + break; + default: + httpStatus = + exception.response?.status || HttpStatus.INTERNAL_SERVER_ERROR; + message = + exception.response?.data?.message || + exception?.message || + 'Internal server error'; + } + + Logger.error( + 'Exception Filter :', + message, + (exception as any).stack, + `${request.method} ${request.url}`, + ); + + const responseBody = { + statusCode: httpStatus, + timestamp: new Date().toISOString(), + message, + }; + + httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus); + } +} diff --git a/apps/connection-manager/src/utils/logger.spec.ts b/apps/connection-manager/src/utils/logger.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..35eefc43c4950ae0971a318cbda0332a9ca4dcca --- /dev/null +++ b/apps/connection-manager/src/utils/logger.spec.ts @@ -0,0 +1,12 @@ +import * as fs from 'fs'; + +describe('Logger', () => { + it('should create a directory if not exists', async () => { + jest.spyOn(fs, 'existsSync').mockImplementation(() => false); + jest.spyOn(fs, 'mkdirSync').mockImplementation(() => 'mocked'); + const logger = await import('./logger'); + expect(logger).toBeDefined(); + expect(fs.existsSync).toHaveBeenCalled(); + expect(fs.mkdirSync).toHaveBeenCalled(); + }); +}); diff --git a/apps/connection-manager/src/utils/logger.ts b/apps/connection-manager/src/utils/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..be9e4f5ad723015d32984294b3a63d961aa113f9 --- /dev/null +++ b/apps/connection-manager/src/utils/logger.ts @@ -0,0 +1,42 @@ +import { existsSync, mkdirSync } from 'fs'; +import { Logger } from 'winston'; +import ecsFormat = require('@elastic/ecs-winston-format'); + +import winston = require('winston'); +// import { ElasticsearchTransport } from 'winston-elasticsearch'; +import { LoggerConfig } from '@common/constants'; + +if (!existsSync(LoggerConfig.lOG_DIR)) { + mkdirSync(LoggerConfig.lOG_DIR); +} + +// const esTransportOpts = { +// clientOpts: { node: process.env.ECSURL }, +// }; + +// const esTransport = new ElasticsearchTransport(esTransportOpts); + +// esTransport.on('error', (error) => { +// console.error(error); +// }); + +const logger: Logger = winston.createLogger({ + format: ecsFormat({ convertReqRes: true }), + + transports: [ + new winston.transports.Console(), + + // new winston.transports.File({ + // // path to log file + // filename: LoggerConfig.FILE_PATH, + // }), + // // Path to Elasticsearch + // esTransport, + ], +}); + +logger.on('error', (error) => { + console.error('Error in logger caught', error); +}); + +export default logger; diff --git a/apps/connection-manager/src/utils/nats.ts b/apps/connection-manager/src/utils/nats.ts new file mode 100644 index 0000000000000000000000000000000000000000..af553d64a002d46156e706d8cf7a0282691f1461 --- /dev/null +++ b/apps/connection-manager/src/utils/nats.ts @@ -0,0 +1,39 @@ +import { connect, NatsConnection, StringCodec } from 'nats'; + +const sc = StringCodec(); + +export default class Nats { + private static nc: NatsConnection | null = null; + + public static async initialize(natsConfig: { + servers: Array<string> | string; + name: string; + }): Promise<NatsConnection | null> { + this.nc = await connect(natsConfig); + + return this.nc; + } + + public static async publish(subject: string, payload: string) { + if (this.nc) { + this.nc.publish(subject, sc.encode(payload)); + } else { + throw new Error('Initialize Nats First!!'); + } + } + + public static async subscribe(subject: string, cb: (...args: any[]) => any) { + if (this.nc) { + const sub = this.nc.subscribe(subject); + (async () => { + // airbnb rule for this lint is outdated + // eslint-disable-next-line + for await (const m of sub) { + cb(sc.decode(m.data)); + } + })(); + } else { + throw new Error('Initialize Nats First!!'); + } + } +} diff --git a/apps/connection-manager/src/utils/pagination.spec.ts b/apps/connection-manager/src/utils/pagination.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a75d3bbe936ea957448f53237a8d2dc2329ab038 --- /dev/null +++ b/apps/connection-manager/src/utils/pagination.spec.ts @@ -0,0 +1,17 @@ +import pagination from './pagination'; + +describe('Check if the module is working', () => { + it('should be defined', () => { + expect(pagination).toBeDefined(); + }); + + it('should be return default value', () => { + const result = { skip: 0, take: 10 }; + expect(pagination(0, 0)).toStrictEqual(result); + }); + + it('should be return next page value', () => { + const result = { skip: 0, take: 10 }; + expect(pagination(10, 0)).toStrictEqual(result); + }); +}); diff --git a/apps/connection-manager/src/utils/pagination.ts b/apps/connection-manager/src/utils/pagination.ts new file mode 100644 index 0000000000000000000000000000000000000000..a498e614fec4f8f01d731ba9a9c08886f9e93f57 --- /dev/null +++ b/apps/connection-manager/src/utils/pagination.ts @@ -0,0 +1,16 @@ +const pagination = (pageSize: number, page: number) => { + const query: { + skip?: number; + take?: number; + } = {}; + if (pageSize && (page || page === 0)) { + query.skip = page * pageSize; + query.take = pageSize; + } else { + query.skip = 0; + query.take = 1000; + } + return query; +}; + +export default pagination; diff --git a/apps/connection-manager/start.sh b/apps/connection-manager/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..5c6b740ec5f3ab0374a1d669cf98cc4ffb8c0c90 --- /dev/null +++ b/apps/connection-manager/start.sh @@ -0,0 +1 @@ +./node_modules/.bin/prisma db push --schema=./prisma/schema.prisma && node dist/src/main.js diff --git a/apps/connection-manager/swagger.json b/apps/connection-manager/swagger.json new file mode 100644 index 0000000000000000000000000000000000000000..0a3f284d4a124eb0385ec9c0eb69ff4865237256 --- /dev/null +++ b/apps/connection-manager/swagger.json @@ -0,0 +1,566 @@ +{ + "openapi": "3.0.0", + "paths": { + "/v1/health": { + "get": { + "operationId": "HealthController_getHealth", + "summary": "Health check", + "description": "This call provides the capability to check the service is working and up. The call returns 200 Status Code and current server time in json body", + "parameters": [], + "responses": { + "200": { + "description": "Service is up and running.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Service is up and running.": { + "value": { + "statusCode": 200, + "message": "Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time)" + } + } + } + } + } + } + } + } + }, + "/v1/invitation-url": { + "post": { + "operationId": "ConnectionsController_createConnectionInvitation", + "summary": "Create new connection invitation", + "description": "This call provides the capability to create new connection invitation by providing alias parameter for taht connection in the body of request. Alias can be one of value: trust/subscriber/trust. This call returns an object contains three fields. invitationUrl, invitationUrlShort, invitation object and connection object. You can use invitationUrlShort or invitationUrl to create QR code which can be scanned by PCM. It's better to use invitationUrlShort because long string of invitationUrl replaced with short id and QR code can be displayed properly", + "parameters": [ + { + "name": "alias", + "required": true, + "in": "query", + "schema": {} + } + ], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ConnectionCreateInvitationDto" + } + } + } + }, + "responses": { + "200": { + "description": "Connection created successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Connection created successfully": { + "value": { + "statusCode": 200, + "message": "Connection created successfully", + "data": { + "invitationUrl": "https://serviceEndpointUrl.com:443/ocm/didcomm?c_i=eyJAdHlwZSI6Imh0dHBzOi", + "invitation": { + "@type": "https://didcomm.org/connections/1.0/invitation", + "@id": "efe3fe97", + "label": "ssi-abstraction-agent", + "recipientKeys": [ + "8iT6AAmbj9P" + ], + "serviceEndpoint": "https://serviceEndpointUrl.com:443/ocm/didcomm", + "routingKeys": [] + }, + "connection": { + "_tags": {}, + "metadata": {}, + "id": "507de3ab", + "createdAt": "1970-01-01T00:00:00.358Z", + "did": "F9xYT1m", + "didDoc": { + "@context": "https://w3id.org/did/v1", + "publicKey": [ + { + "id": "F9xYT1m", + "controller": "F9xYT1m", + "type": "Ed25519VerificationKey2018", + "publicKeyBase58": "8iT6AAmbj9P" + } + ], + "service": [ + { + "id": "F9xYT1m#IndyAgentService", + "serviceEndpoint": "https://serviceEndpointUrl.com:443/ocm/didcomm", + "type": "IndyAgent", + "priority": 0, + "recipientKeys": [ + "8iT6AAmbj9P" + ], + "routingKeys": [] + } + ], + "authentication": [ + { + "publicKey": "F9xYT1m", + "type": "Ed25519SignatureAuthentication2018" + } + ], + "id": "F9xYT1m" + }, + "verkey": "8iT6AAmbj9P", + "state": "invited", + "role": "inviter", + "alias": "trust", + "invitation": { + "@type": "https://didcomm.org/connections/1.0/invitation", + "@id": "efe3fe97", + "label": "ssi-abstraction-agent", + "recipientKeys": [ + "8iT6AAmbj9P" + ], + "serviceEndpoint": "https://serviceEndpointUrl.com:443/ocm/didcomm", + "routingKeys": [] + }, + "multiUseInvitation": false + }, + "invitationUrlShort": "https://serviceEndpointUrl.com/ocm/connection/v1/url/1234abc" + } + } + } + } + } + } + }, + "400": { + "description": "Alias must be provided", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Alias must be provided": { + "value": { + "statusCode": 400, + "message": "Alias must be provided" + } + } + } + } + } + }, + "404": { + "description": "Agent Data not found.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Agent Data not found.": { + "value": { + "statusCode": 400, + "message": "Agent Data not found." + } + } + } + } + } + } + }, + "tags": [ + "Connections" + ] + } + }, + "/v1/connection-information": { + "get": { + "operationId": "ConnectionsController_getConnectionInformationRequest", + "summary": "Fetch connection information by id or did", + "description": "This call provides the capability to get information about connection by connectionId or did. This call returns issued credentials and requested proof to that connection", + "parameters": [ + { + "name": "did", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "connectionId", + "required": false, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Connection information fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Connection information fetched successfully": { + "value": { + "statusCode": 200, + "message": "Connection information fetched successfully", + "data": { + "records": { + "issueCredentials": [ + { + "id": "6a6ee15d", + "credentialId": "624a76fd", + "credDefId": "8y8oycXjn", + "threadId": "9f95a52a", + "state": "done", + "principalDid": "KGaeQVa", + "connectionId": "12cd39de", + "createdDate": "1970-01-01T00:00:00.149Z", + "updatedDate": "1970-01-01T00:00:00.467Z", + "expirationDate": null + } + ], + "presentProofs": [] + } + } + } + } + } + } + } + }, + "400": { + "description": "connection ID / DID must be provided", + "content": { + "application/json": { + "schema": {}, + "examples": { + "connection ID / DID must be provided": { + "value": { + "statusCode": 400, + "message": "connection ID / DID must be provided" + } + } + } + } + } + } + }, + "tags": [ + "Connections" + ] + } + }, + "/v1/connections": { + "get": { + "operationId": "ConnectionsController_getConnectionLists", + "summary": "Fetch list of connections", + "description": "This call provides the capability to search connections by using pagination and filter parameters. This call returns a list of connections and overall count of records. This endpoint supports followinng query filter parameters: participantDID, status, pageSize, page", + "parameters": [ + { + "name": "participantDID", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "status", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Connections fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Connections fetched successfully": { + "value": { + "statusCode": 200, + "message": "Connections fetched successfully", + "data": { + "count": 1, + "records": [ + { + "id": "089e1b95", + "connectionId": "e7361a1b", + "status": "invited", + "participantDid": "Kv6NS9y", + "theirDid": "", + "theirLabel": "", + "createdDate": "1970-01-01T00:00:00.617Z", + "updatedDate": "1970-01-01T00:00:00.617Z", + "isActive": false, + "isReceived": false + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + } + }, + "tags": [ + "Connections" + ] + } + }, + "/v1/connections/{connectionId}": { + "get": { + "operationId": "ConnectionsController_getConnection", + "summary": "Fetch connection by id", + "description": "This call provides the capability to get connection data by providing connectionId. The connection data is the same which is returned from /v1/connections endpoint and contains generic information about connection like connectionId, status, dids and so on.", + "parameters": [], + "responses": { + "200": { + "description": "Connections fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Connections fetched successfully": { + "value": { + "statusCode": 200, + "message": "Connections fetched successfully", + "data": { + "count": 1, + "records": [ + { + "id": "089e1b95", + "connectionId": "e7361a1b", + "status": "invited", + "participantDid": "Kv6NS9y", + "theirDid": "", + "theirLabel": "", + "createdDate": "1970-01-01T00:00:00.617Z", + "updatedDate": "1970-01-01T00:00:00.617Z", + "isActive": false, + "isReceived": false + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + } + }, + "tags": [ + "Connections" + ] + } + }, + "/v1/accept-connection-invitation": { + "post": { + "operationId": "ConnectionsController_acceptConnectionInvitation", + "summary": "Accept connection invitation", + "description": "This call provides the capability to receive connection invitation as invitee by invitationUrl and create connection. If auto accepting is enabled via either the config passed in the function or the global agent config, a connection request message will be send.", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AcceptConnectionInvitationBody" + } + } + } + }, + "responses": { + "202": { + "description": "Accepted Connection Request", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Accepted Connection Request": { + "value": { + "statusCode": 202, + "message": "Accepted Connection Request", + "data": { + "_tags": { + "invitationKey": "5Nj", + "state": "invited", + "role": "invitee", + "verkey": "F6d" + }, + "metadata": {}, + "id": "e6d30380", + "createdAt": "1970-01-01T00:00:00.103Z", + "did": "Ss8", + "didDoc": { + "@context": "https://w3id.org/did/v1", + "publicKey": [ + { + "id": "Ss8#1", + "controller": "Ss8", + "type": "Ed25519VerificationKey2018", + "publicKeyBase58": "F6d" + } + ], + "service": [ + { + "id": "Ss8", + "serviceEndpoint": "https://serviceEndpointUrl.com:443/ocm/didcomm", + "type": "IndyAgent", + "priority": 0, + "recipientKeys": [ + "F6d" + ], + "routingKeys": [] + } + ], + "authentication": [ + { + "publicKey": "Ss8#1", + "type": "Ed25519SignatureAuthentication2018" + } + ], + "id": "Ss8" + }, + "verkey": "F6d", + "theirLabel": "ssi-abstraction-agent", + "state": "requested", + "role": "invitee", + "alias": "connection-received", + "autoAcceptConnection": true, + "invitation": { + "@type": "https://didcomm.org/connections/1.0/invitation", + "@id": "12ebbf61", + "label": "ssi-abstraction-agent", + "recipientKeys": [ + "5Nj" + ], + "serviceEndpoint": "https://serviceEndpointUrl.com:443/ocm/didcomm", + "routingKeys": [] + }, + "multiUseInvitation": false + } + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error or Bad Request", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error or Bad Request": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:00.668Z", + "message": "something went wrong: Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Connections" + ] + } + } + }, + "info": { + "title": "Gaia-x Connection Manager API", + "description": "API documentation for GAIA-X Connection Manager", + "version": "1.0", + "contact": {} + }, + "tags": [], + "servers": [], + "components": { + "schemas": { + "ConnectionCreateInvitationDto": { + "type": "object", + "properties": { + "autoAcceptConnection": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "myLabel": { + "type": "string" + }, + "myImageUrl": { + "type": "string" + } + }, + "required": [ + "autoAcceptConnection", + "alias", + "myLabel", + "myImageUrl" + ] + }, + "AcceptConnectionInvitationBody": { + "type": "object", + "properties": { + "invitationUrl": { + "type": "string" + }, + "autoAcceptConnection": { + "type": "boolean" + } + }, + "required": [ + "invitationUrl", + "autoAcceptConnection" + ] + } + } + } +} diff --git a/apps/connection-manager/test/app.e2e-spec.ts b/apps/connection-manager/test/app.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..c9f4c5628d02c59f0d1f10a3c5a41789d3b04fcc --- /dev/null +++ b/apps/connection-manager/test/app.e2e-spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import * as request from 'supertest'; +import AppModule from '@src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => + request(app.getHttpServer()).get('/').expect(200).expect('Hello World!')); +}); diff --git a/apps/connection-manager/test/jest-e2e.json b/apps/connection-manager/test/jest-e2e.json new file mode 100644 index 0000000000000000000000000000000000000000..e9d912f3e3cefc18505d3cd19b3a5a9f567f5de0 --- /dev/null +++ b/apps/connection-manager/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/connection-manager/tsconfig.build.json b/apps/connection-manager/tsconfig.build.json new file mode 100644 index 0000000000000000000000000000000000000000..64f86c6bd2bb30e3d22e752295eb7c7923fc191e --- /dev/null +++ b/apps/connection-manager/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/apps/connection-manager/tsconfig.json b/apps/connection-manager/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..eafedc36103f5368852ea3db1763b491bc1d451c --- /dev/null +++ b/apps/connection-manager/tsconfig.json @@ -0,0 +1,34 @@ +{ + "compilerOptions": { + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "skipLibCheck": true, + "strictPropertyInitialization": false, + "module": "commonjs", + "declaration": true, + "removeComments": true, + "emitDecoratorMetadata": true, + "experimentalDecorators": true, + "target": "es6", + "sourceMap": true, + "outDir": "./dist", + "baseUrl": "./", + "incremental": true, + "strictNullChecks": true, + "paths": { + "@src/*": ["src/*"], + "@config/*":["config/*"], + "@utils/*" :["src/utils/*"], + "@common/*":["src/common/*"], + "@connections/*":["src/connections/*"], + "@health/*":["src/health/*"], + "@DB/*":["src/prisma/*"] + } + }, + "include": [ + "**/*.ts", + "src", + "config", + ], + "exclude": ["node_modules", "./dist/**/*"] +} \ No newline at end of file diff --git a/apps/proof-manager/.dockerignore b/apps/proof-manager/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..db6bf0bb299a1377dc57287e3aadba36447c80fb --- /dev/null +++ b/apps/proof-manager/.dockerignore @@ -0,0 +1,22 @@ +Dockerfile +Jenkinsfile +coverage +docker-compose.yml +docs +node_modules +yarn-error.log +*.md +!README.md +.circle* +.codecov* +.coveralls* +.dockerignore +.drone* +.editorconfig +# .env +.git* +.huskyrc* +.lintstagedrc* +.npmignore +.prettierrc* +dist \ No newline at end of file diff --git a/apps/proof-manager/.env.example b/apps/proof-manager/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..1bf339c18c8237b8938ed909a49c24699318906a --- /dev/null +++ b/apps/proof-manager/.env.example @@ -0,0 +1,12 @@ +PORT=3007 +PROOF_MANAGER_URL=http://localhost:3007 +DATABASE_URL=postgresql://root:password@localhost:5432/postgres?schema=proof +ECSURL=http://localhost:9200/ +ACCEPT_PRESENTATION_CONFIG=AUTO +NATS_URL=nats://localhost:4222 +AGENT_URL=http://localhost:3010 +DIDCOMM_URL=http://localhost:3009 +USE_AUTH=false +OAUTH_CLIENT_ID=clientid +OAUTH_CLIENT_SECRET=clientsecret +OAUTH_TOKEN_URL=https://tokenurl diff --git a/apps/proof-manager/.eslintrc.js b/apps/proof-manager/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..ba9f72b7a08be673285f0735893214409c8d2137 --- /dev/null +++ b/apps/proof-manager/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'airbnb-base', + 'airbnb-typescript/base' + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/apps/proof-manager/.prettierrc b/apps/proof-manager/.prettierrc new file mode 100644 index 0000000000000000000000000000000000000000..dcb72794f5300a3e0ccd2ad0669d802b62f3d370 --- /dev/null +++ b/apps/proof-manager/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/apps/proof-manager/GDPR.md b/apps/proof-manager/GDPR.md new file mode 100644 index 0000000000000000000000000000000000000000..bd343ebe87a10f02ed3016d0522292cb10015209 --- /dev/null +++ b/apps/proof-manager/GDPR.md @@ -0,0 +1,21 @@ +# GDPR Compliance Document +The objective of this document is to detail, the data being stored and proccessed by the Organization Credential Manager's, Proof Manger. + +## What information is stored +### Source User Information +No personal data is accessed or processed + +### Technical User Information (Public) +Schema id +Presentation ids and states +DID of requester +Created/updated dates + +## How is the information stored +The Technical User Information is encrypted using the Private Key of the Organizations SSI Agent and stored internally (on the agent) on PostgreSQL and externally/ metadata (shared between the OCM services) on PostgreSQL of Organization. + +## Who can access the information +The Technical User Information both are accessible only by the Organization specific SSI agent's private key. + +## How long will the information stay +The Technical User Information is wiped out according to the retention periods (not defined yet). \ No newline at end of file diff --git a/apps/proof-manager/Gaia-x Proof Manager API.postman_collection.json b/apps/proof-manager/Gaia-x Proof Manager API.postman_collection.json new file mode 100644 index 0000000000000000000000000000000000000000..9bae7aa5319cd45e28df67119f8217187bc40729 --- /dev/null +++ b/apps/proof-manager/Gaia-x Proof Manager API.postman_collection.json @@ -0,0 +1,646 @@ +{ + "info": { + "_postman_id": "8cdaf3fb-ded2-4518-8464-c196c01c622f", + "name": "Gaia-x Proof Manager API", + "description": "API documentation for GAIA-X Proof Manager", + "schema": "https://schema.getpostman.com/json/collection/v2.1.0/collection.json", + "_exporter_id": "10250261" + }, + "item": [ + { + "name": "Get full url from short url id", + "request": { + "method": "GET", + "header": [], + "url": { + "raw": "{{baseUrl}}/v1/url/:id", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "url", + ":id" + ], + "variable": [ + { + "key": "id", + "value": "<string>" + } + ] + } + }, + "response": [] + }, + { + "name": "Send presentation request", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"comment\": \"Proof Presenation\",\n \"attributes\": [\n {\n \"schemaId\": \"\",\n \"credentialDefId\": \"{{cred-def-id}}\",\n \"attributeName\": \"fName\",\n \"value\": \"\",\n \"condition\": \"\"\n },\n {\n \"schemaId\": \"\",\n \"credentialDefId\": \"{{pcm-vc-cred-def-id}}\",\n \"attributeName\": \"email\",\n \"value\": \"\",\n \"condition\": \"\"\n }\n ],\n \"connectionId\": \"{{conn-id}}\"\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/send-presentation-request", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "send-presentation-request" + ] + } + }, + "response": [] + }, + { + "name": "Send out of band presentation request", + "request": { + "method": "POST", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + }, + { + "key": "Accept", + "value": "application/json" + } + ], + "body": { + "mode": "raw", + "raw": "{\n \"comment\": \"<string>\",\n \"schemaId\": \"<string>\",\n \"options\": {},\n \"attributes\": [\n \"<string>\",\n \"<string>\"\n ]\n}", + "options": { + "raw": { + "headerFamily": "json", + "language": "json" + } + } + }, + "url": { + "raw": "{{baseUrl}}/v1/send-out-of-band-presentation-request", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "send-out-of-band-presentation-request" + ] + } + }, + "response": [] + }, + { + "name": "Send out of band proof", + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/out-of-band-proof", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "out-of-band-proof" + ] + } + }, + "response": [] + }, + { + "name": "Health check", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/health", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "health" + ] + } + }, + "response": [] + }, + { + "name": "Search proof request information using pagination and queries", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/find-proof-presentation?page=0&pageSize=25&proofRecordId&connectionId&credentialDefId&schemaId&theirDid&status&createdDateStart=2023-03-05T08:36:19.170Z&createdDateEnd&updatedDateStart&updatedDateEnd", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "find-proof-presentation" + ], + "query": [ + { + "key": "page", + "value": "0" + }, + { + "key": "pageSize", + "value": "25" + }, + { + "key": "proofRecordId", + "value": null + }, + { + "key": "connectionId", + "value": null + }, + { + "key": "credentialDefId", + "value": null + }, + { + "key": "schemaId", + "value": null + }, + { + "key": "theirDid", + "value": null + }, + { + "key": "status", + "value": null + }, + { + "key": "createdDateStart", + "value": "2023-03-05T08:36:19.170Z" + }, + { + "key": "createdDateEnd", + "value": null + }, + { + "key": "updatedDateStart", + "value": null + }, + { + "key": "updatedDateEnd", + "value": null + } + ] + } + }, + "response": [ + { + "name": "Search proof request information using pagination and queries", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/find-proof-presentation?page=0&pageSize=25&proofRecordId&connectionId&credentialDefId&schemaId&theirDid&status&createdDateStart=2023-03-05T08:36:19.170Z&createdDateEnd&updatedDateStart&updatedDateEnd", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "find-proof-presentation" + ], + "query": [ + { + "key": "page", + "value": "0" + }, + { + "key": "pageSize", + "value": "25" + }, + { + "key": "proofRecordId", + "value": null + }, + { + "key": "connectionId", + "value": null + }, + { + "key": "credentialDefId", + "value": null + }, + { + "key": "schemaId", + "value": null + }, + { + "key": "theirDid", + "value": null + }, + { + "key": "status", + "value": null + }, + { + "key": "createdDateStart", + "value": "2023-03-05T08:36:19.170Z" + }, + { + "key": "createdDateEnd", + "value": null + }, + { + "key": "updatedDateStart", + "value": null + }, + { + "key": "updatedDateEnd", + "value": null + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 06:10:41 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "7522" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"1d62-eeaYumJatMrJi96zaADgb+qSzt0\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Proof presentations fetched successfully\",\n \"data\": {\n \"count\": 664,\n \"records\": [\n {\n \"id\": \"001ad97f-78f4-41f1-8a69-e03eefe4136a\",\n \"proofRecordId\": \"6b19a270-3448-4055-97b7-81fb42113688\",\n \"connectionId\": \"9bf1804a-a356-44b3-b97a-dd40b0667a50\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:36:19.170Z\",\n \"updatedDate\": \"2023-04-05T08:36:19.170Z\"\n },\n {\n \"id\": \"00bc3f5c-d42f-424c-8db5-2b7fe4f2118f\",\n \"proofRecordId\": \"f9ff0dae-f74c-4ae4-b164-adcbe2e85192\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-06T11:39:24.077Z\",\n \"updatedDate\": \"2023-04-06T11:39:24.077Z\"\n },\n {\n \"id\": \"0117964f-96d4-461d-903c-31e9e4ad9f5f\",\n \"proofRecordId\": \"54673c3c-0325-45cd-b39e-2a77007958a7\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:02:55.339Z\",\n \"updatedDate\": \"2023-04-05T08:02:55.339Z\"\n },\n {\n \"id\": \"017b6c72-7506-41a4-9cb9-5347641e03de\",\n \"proofRecordId\": \"299ba1c1-7f9b-4a32-9d18-a41f80c5ff33\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:36:14.844Z\",\n \"updatedDate\": \"2023-04-05T08:36:14.844Z\"\n },\n {\n \"id\": \"026aa092-a82f-4cab-bf88-55fe3e084062\",\n \"proofRecordId\": \"f9a2d030-1776-4329-aff1-2707668c61f0\",\n \"connectionId\": \"757cc3c0-ba70-4ac2-bd52-797ea0fa60a1\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:35:46.086Z\",\n \"updatedDate\": \"2023-04-05T08:35:46.086Z\"\n },\n {\n \"id\": \"02cecc4a-1824-40d1-b3ea-e1d6e938a74d\",\n \"proofRecordId\": \"9b419c4b-9945-4813-90ad-400190e61100\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-06-02T02:04:42.738Z\",\n \"updatedDate\": \"2023-06-02T02:04:42.738Z\"\n },\n {\n \"id\": \"02ffd3e4-3d87-45dc-8c58-2a9075aa057e\",\n \"proofRecordId\": \"2d619580-7b06-4411-8c47-73dd307ae777\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:35:27.835Z\",\n \"updatedDate\": \"2023-04-05T08:35:27.836Z\"\n },\n {\n \"id\": \"03d59eae-263c-4f37-82d2-d2a61044e680\",\n \"proofRecordId\": \"72a2a37b-ba0a-40a6-9c1e-e05b37fb1550\",\n \"connectionId\": \"9bf1804a-a356-44b3-b97a-dd40b0667a50\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:02:37.486Z\",\n \"updatedDate\": \"2023-04-05T08:02:37.486Z\"\n },\n {\n \"id\": \"03e459a0-e2e7-45e8-a32c-039672523ca3\",\n \"proofRecordId\": \"cd6a82ad-ee03-4e71-9c01-71e7fe83219b\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:37:04.571Z\",\n \"updatedDate\": \"2023-04-05T08:37:04.571Z\"\n },\n {\n \"id\": \"0405d814-57b6-4ff8-a645-3fe3682e09b8\",\n \"proofRecordId\": \"0a3ad2b8-90f9-49c9-83c8-1cf6b231c5fa\",\n \"connectionId\": \"757cc3c0-ba70-4ac2-bd52-797ea0fa60a1\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:02:43.442Z\",\n \"updatedDate\": \"2023-04-05T08:02:43.442Z\"\n },\n {\n \"id\": \"04409e91-77d1-48f3-8982-d425806e79f2\",\n \"proofRecordId\": \"29e5b3f0-9fcc-40cf-8573-9e219a7366ab\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-05-10T09:43:56.431Z\",\n \"updatedDate\": \"2023-05-10T09:43:56.431Z\"\n },\n {\n \"id\": \"057647eb-863e-4930-98ce-2e7206756f06\",\n \"proofRecordId\": \"708a6758-36d5-4327-8334-73b7f56e7d45\",\n \"connectionId\": \"757cc3c0-ba70-4ac2-bd52-797ea0fa60a1\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:02:03.757Z\",\n \"updatedDate\": \"2023-04-05T08:02:03.757Z\"\n },\n {\n \"id\": \"057d8759-c2cf-47d1-b809-77b5fa250714\",\n \"proofRecordId\": \"d3e7bf0d-37b8-4177-b771-c055ba384cde\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-27T08:24:51.139Z\",\n \"updatedDate\": \"2023-04-27T08:24:51.139Z\"\n },\n {\n \"id\": \"0708a7a2-d679-44dc-bf0c-93b02de40cb8\",\n \"proofRecordId\": \"74f40bda-9277-4dc9-86dd-01c2266b503f\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:00:54.344Z\",\n \"updatedDate\": \"2023-04-05T08:00:54.344Z\"\n },\n {\n \"id\": \"0723f10e-66e3-45ec-9a70-751365ae2934\",\n \"proofRecordId\": \"a3af4436-7dea-41b4-b66a-1e4138b038dd\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-05-10T11:48:56.739Z\",\n \"updatedDate\": \"2023-05-10T11:48:56.739Z\"\n },\n {\n \"id\": \"074e14bb-01f0-4d77-a021-6af6f6c8a697\",\n \"proofRecordId\": \"13eb0c78-e4f0-4b24-93f6-af043c13ac57\",\n \"connectionId\": \"9bf1804a-a356-44b3-b97a-dd40b0667a50\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:36:46.244Z\",\n \"updatedDate\": \"2023-04-05T08:36:46.244Z\"\n },\n {\n \"id\": \"07bb6a56-c62c-4eed-9673-8973e5cc73e7\",\n \"proofRecordId\": \"5cdfdc23-d98f-4f1d-bac3-e6dedeced3a3\",\n \"connectionId\": \"757cc3c0-ba70-4ac2-bd52-797ea0fa60a1\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:01:46.861Z\",\n \"updatedDate\": \"2023-04-05T08:01:46.861Z\"\n },\n {\n \"id\": \"0870526d-849a-44e5-87e4-05416ba8440b\",\n \"proofRecordId\": \"732d5ccc-56a7-476a-a1bb-5a6db8eaf0f2\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:37:02.390Z\",\n \"updatedDate\": \"2023-04-05T08:37:02.390Z\"\n },\n {\n \"id\": \"09d6f050-8bde-48f3-ba0e-e59b4e8f035f\",\n \"proofRecordId\": \"f41d2f97-f79a-4b9f-a882-b7b78f8966dd\",\n \"connectionId\": \"757cc3c0-ba70-4ac2-bd52-797ea0fa60a1\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:37:12.868Z\",\n \"updatedDate\": \"2023-04-05T08:37:12.868Z\"\n },\n {\n \"id\": \"0c2cead8-f125-43dd-bd16-a1611658132d\",\n \"proofRecordId\": \"0d7d8534-1d4f-4976-bce4-d1ac43a67ac5\",\n \"connectionId\": \"f9c10d29-2cbd-44b0-b909-26ca4108c5dd\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:37:10.867Z\",\n \"updatedDate\": \"2023-04-05T08:37:10.867Z\"\n },\n {\n \"id\": \"0d0b50dd-bd4f-4409-8918-8faa9e41b36a\",\n \"proofRecordId\": \"437e0246-3c77-40a9-9984-fa279a6da66f\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-05-25T06:50:47.760Z\",\n \"updatedDate\": \"2023-05-25T06:50:47.760Z\"\n },\n {\n \"id\": \"0d0fbe35-306c-411b-9924-cfbd0671c0c4\",\n \"proofRecordId\": \"c6cf80aa-c82b-40d4-932f-b6a0dfd94b31\",\n \"connectionId\": \"9bf1804a-a356-44b3-b97a-dd40b0667a50\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-05T08:02:07.235Z\",\n \"updatedDate\": \"2023-04-05T08:02:07.197Z\"\n },\n {\n \"id\": \"0d36b72b-0ccd-409b-848b-8aaf64cde60c\",\n \"proofRecordId\": \"6ed08154-abc5-4b7a-99b2-8cc746ea2efa\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-04-27T08:24:51.803Z\",\n \"updatedDate\": \"2023-04-27T08:24:51.804Z\"\n },\n {\n \"id\": \"0d8b8019-3a45-47cc-a0b0-3b7433c79ef3\",\n \"proofRecordId\": \"8b14c221-4e8c-412d-979e-f980c2493718\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"request-sent\",\n \"createdDate\": \"2023-05-25T08:41:08.159Z\",\n \"updatedDate\": \"2023-05-25T08:41:08.159Z\"\n },\n {\n \"id\": \"0dcb6484-9bbb-4aa0-8f29-55b2099313ac\",\n \"proofRecordId\": \"3f29af26-fa7c-4dff-9e73-dfb11aeed108\",\n \"connectionId\": \"\",\n \"credentialDefId\": \"\",\n \"schemaId\": \"\",\n \"theirDid\": \"\",\n \"status\": \"done\",\n \"createdDate\": \"2023-05-22T10:56:44.678Z\",\n \"updatedDate\": \"2023-05-22T11:46:59.158Z\"\n }\n ]\n }\n}" + } + ] + }, + { + "name": "Fetch proof presentation (with received credentials) by proofRequestId", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/find-by-presentation-id?proofRecordId=3f29af26-fa7c-4dff-9e73-dfb11aeed108", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "find-by-presentation-id" + ], + "query": [ + { + "key": "proofRecordId", + "value": "3f29af26-fa7c-4dff-9e73-dfb11aeed108", + "description": "(Required) " + } + ] + } + }, + "response": [ + { + "name": "Fetch proof presentation (with received credentials) by proofRequestId", + "originalRequest": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/find-by-presentation-id?proofRecordId=3f29af26-fa7c-4dff-9e73-dfb11aeed106", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "find-by-presentation-id" + ], + "query": [ + { + "key": "proofRecordId", + "value": "3f29af26-fa7c-4dff-9e73-dfb11aeed106", + "description": "(Required) " + } + ] + } + }, + "status": "OK", + "code": 200, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Date", + "value": "Fri, 02 Jun 2023 06:11:11 GMT" + }, + { + "key": "Content-Type", + "value": "application/json; charset=utf-8" + }, + { + "key": "Content-Length", + "value": "328" + }, + { + "key": "Connection", + "value": "keep-alive" + }, + { + "key": "X-Powered-By", + "value": "Express" + }, + { + "key": "Access-Control-Allow-Origin", + "value": "*" + }, + { + "key": "ETag", + "value": "W/\"148-MIqXpsMkr4A+x4RvK6AWWJ6RzRM\"" + }, + { + "key": "Strict-Transport-Security", + "value": "max-age=15724800; includeSubDomains" + } + ], + "cookie": [], + "body": "{\n \"statusCode\": 200,\n \"message\": \"Proof presentation fetched successfully\",\n \"data\": {\n \"state\": \"done\",\n \"presentations\": [\n {\n \"schemaId\": \"BsfUfTECZPVRnoCgHUfB3p:2:LoginCredentials:1.0\",\n \"credDefId\": \"BsfUfTECZPVRnoCgHUfB3p:3:CL:50014:LoginCredentials2\",\n \"revRegId\": null,\n \"timestamp\": null,\n \"credentialSubject\": {\n \"email\": \"example@example.com\"\n }\n }\n ]\n }\n}" + } + ] + }, + { + "name": "Delete proof request by proofRecordId", + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/delete-proof-request/:proofRecordId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "delete-proof-request", + ":proofRecordId" + ], + "variable": [ + { + "key": "proofRecordId" + } + ] + } + }, + "response": [] + }, + { + "name": "Decline proof request by proofRecordId", + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/decline-proof-request/:proofRecordId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "decline-proof-request", + ":proofRecordId" + ], + "variable": [ + { + "key": "proofRecordId" + } + ] + } + }, + "response": [] + }, + { + "name": "Fetch all proofs directly from agent", + "request": { + "method": "GET", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/agent-proofs", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "agent-proofs" + ] + } + }, + "response": [] + }, + { + "name": "Accept proof request by proofRecordId", + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/accept-proof-request/:proofRecordId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-proof-request", + ":proofRecordId" + ], + "variable": [ + { + "key": "proofRecordId" + } + ] + } + }, + "response": [] + }, + { + "name": "Accept presentation request by proofRecordId", + "request": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/accept-presentation/:proofRecordId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-presentation", + ":proofRecordId" + ], + "variable": [ + { + "key": "proofRecordId", + "value": "<string>" + } + ] + } + }, + "response": [ + { + "name": "Accept presentation request required following attributes ( proof_record_id )", + "originalRequest": { + "method": "POST", + "header": [ + { + "key": "Accept", + "value": "application/json" + } + ], + "url": { + "raw": "{{baseUrl}}/v1/accept-presentation/:proofRecordId", + "host": [ + "{{baseUrl}}" + ], + "path": [ + "v1", + "accept-presentation", + ":proofRecordId" + ], + "variable": [ + { + "key": "proofRecordId" + } + ] + } + }, + "status": "Bad Request", + "code": 400, + "_postman_previewlanguage": "json", + "header": [ + { + "key": "Content-Type", + "value": "application/json" + } + ], + "cookie": [], + "body": "{}" + } + ] + } + ], + "event": [ + { + "listen": "prerequest", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + }, + { + "listen": "test", + "script": { + "type": "text/javascript", + "exec": [ + "" + ] + } + } + ], + "variable": [ + { + "key": "baseUrl", + "value": "https://ssi-dev.vereign.com/ocm/proof" + } + ] +} \ No newline at end of file diff --git a/apps/proof-manager/LICENSE b/apps/proof-manager/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..33f48080615e98cdd9d1bfed3fa1bc2c3d9d89cc --- /dev/null +++ b/apps/proof-manager/LICENSE @@ -0,0 +1,532 @@ +GAIA-X "Proof Manager" + +is the microservice responsible for handling the features related to +proof presentation in the Organizational Credential Manager. + + Copyright 2022 Vereign AG + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Proof Manager incorporates + +"elastic/ecs-winston-format", + +a Node.js package to provide a formatter for the winston logger compatible +with Elastic Common Schema (ECS) logging, which is covered by the following copyright +and permission notice: + +Copyright 2020 Elastic and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Proof Manager also incorporates + +"nestjs", + +a progressive Node.js framework for building efficient and scalable server-side applications, +which is covered by the following copyright and permission notice: + +Copyright (c) 2017-2022 Kamil Mysliwiec <https://kamilmysliwiec.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"nestjs/terminus" + +, integrated healthchecks for Nest, which contains the +following copyright and permission notice: + +Copyright (c) 2018-2021 Livio Brunner, Kamil Myśliwiec + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"prisma client" + +,an auto-generated query builder that enables type-safe database access and reduces +boilerplate, which is covered by the following copyright and permission notice: + +Copyright 2019 Johannes Schickling + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Proof Manager also incorporates + +"DefinitelyTyped, types/express, types/jest" + +, the repository for high quality TypeScript type definitions, which is covered by the +following copyright and permission notice: + +Copyrights are respective of each contributor listed at the beginning of each +definition file. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"types/node" + +,type definitions for Node, which is covered by the following copyright and +permission notice: + +Copyright Microsoft TypeScript, DefinitelyTyped, Alberto Schiabel, +Alvis HT Tang, Andrew Makarov, Benjamin Toueg, Chigozirim C., David Junger, Deividas Bakanas, Eugene Y. Q. Shen, +Hannes Magnusson, Huw, Kelvin Jin, Klaus Meinhardt, Lishude, Mariusz Wiktorczyk, Mohsen Azimi, Nicolas Even, +Nikita Galkin, Parambir Singh, Sebastian Silbermann, Simon Schick, Thomas den Hollander, Wilco Bakker, wwwy3y3, +Samuel Ainsworth, Kyle Uehlein, Thanik Bhongbhibhat, Marcin Kopacz, Trivikram Kamat, Junxiao Shi, Ilia Baryshnikov, +ExE Boss, Piotr Błażejewicz, Anna Henningsen, Victor Perin, Yongsheng Zhang, NodeJS Contributors, +Linus Unnebäck, wafuwafu13, and Matteo Collina. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"class-validator" + +, a tool to allow decorator and non-decorator based validation, + +Copyright 2015-2020 TypeStack + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"express" + +, a fast, unopinionated, minimalist web framework for node, which is covered by the following copyright +and permission notice: + +Copyright (c) 2009-2014 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2013-2014 Roman Shtylman <shtylman+expressjs@gmail.com> +Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"joi" + +, the most powerful schema description language and data validator for JavaScript, which is +covered by the following copyright and permission notice: + +Copyright (c) 2012-2020, Sideway. Inc, and project contributors. +Copyright (c) 2012-2014, Walmart. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. +- The names of any contributors may not be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +This Proof Manager also incorporates + +"js-base64" + +, yet another Base64 transcoder, which is covered by the following copyright and permission notice: + +Copyright (c) 2014, Dan Kogai All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. + +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or other materials provided with the distribution. + +- Neither the name of {{{project}}} nor the names of its contributors may be used to endorse or promote products derived from this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE +GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRAC +T, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE +POSSIBILITY OF SUCH DAMAGE. + + +This Proof Manager also incorporates + +"moment" + +, a JavaScript date library for parsing, validating, manipulating, and formatting dates, +which is covered by the following copyright and permission notice: + +Copyright (c) JS Foundation and other contributors + +(The MIT License) +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"nats" + +, a Node.js client for the NATS messaging system, which is covered by +the following copyright and permission notice: + +Copyright 2013-2018 The NATS Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Proof Manager also incorporates + +"pg - node postgres" + +, non-blocking PostgreSQL client for Node.js, which is covered by +the following copyright and permission notice: + +Copyright (c) 2010-2020 Brian Carlson (brian.m.carlson@gmail.com) + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This Proof Manager also incorporates + +"prisma" + +, next-generation ORM for Node.js & TypeScript | PostgreSQL, MySQL, MariaDB, SQL Server, +SQLite, MongoDB and CockroachDB, which is covered by the following copyright and +permission notice: + +Copyright 2019 Johannes Schickling + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Proof Manager also incorporates + +"reflect-metadata" + +, prototype for a Metadata Reflection API for ECMAScript, which is covered +by the following copyright and permission notice: + +Copyright 2019 Ron Buckton + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Proof Manager also incorporates + +"rimraf" + +, a `rm -rf` util for nodejs, which is covered by the following copyright +and permission notice: + +Copyright (c) 2011-2022 Isaac Z. Schlueter and Contributors + +(The ISC License) +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +This Proof Manager also incorporates + +"rxjs" + +, reactive extensions for JavaScript, which is covered by the following copyright +and permission notice: + +Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This Proof Manager also incorporates + +"winston" + +, a logger for just about everything, which is covered by the following copyright and +permission notice: + +Copyright (c) 2010 Charlie Robbins + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +This Proof Manager also incorporates + +"winston-elasticsearch" + +, an elasticsearch transport for winston, which is covered by the following copyright and +permission notice: + +Copyright (c) 2015 - 2018 Thomas Hoppe. +Copyright (c) 2013 Jacques-Olivier D. Bernier. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/apps/proof-manager/README.md b/apps/proof-manager/README.md new file mode 100644 index 0000000000000000000000000000000000000000..3898617102e799065ad7d66dac164ff3616f3012 --- /dev/null +++ b/apps/proof-manager/README.md @@ -0,0 +1,122 @@ +# OCM Proof Manager + +## Description +<hr/> +The Proof Manager, is the microservice responsible for handling the features related to Proof Presentation in the Organizational Credential Manager. + +## Usage +<hr/> + +### Swagger Documentation: + +[Swagger/OpenAPI](swagger.json) + +## Installation +<hr/> + +### Pre-requisite + +* yarn +* docker +* docker-compose +* Postgres + +### OCM Services Dependencies + +* SSI Abstraction +* Connection Manager +* Attestation Manager + +## Running the app + +**Each service in the Organizational Credential Manager can be run from the infrastructure repository with Docker.** + +**The .env files are in the infrastructure repository under /env** + +### There are two separate Dockefiles in "./deployment" of every project: +```bash + ## production in: + ./deployment/ci + ## development in: + ./deployment/dev +``` + +* (optional) Edit docker-compose.yml in "infrastructure" to use either **/ci/** or **/dev/** Dockerfiles. + +* Run while in **"infrastructure"** project: +```bash +$ docker-compose up --build proof-m +``` +to run only Connection Manager or +```bash +$ docker-compose up --build +``` +to run all the services. + + +## Build +``` +yarn build +``` + +## Run +``` +yarn start +``` + +### Environment Variables Required +``` +1. PORT +2. DATABASE_URL +3. ECSURL +4. NATS_URL +5. AGENT_URL +``` + +### Outgoing communication services +``` +1. SSI Abstraction +``` + +### Incomming communication services +``` +1. Connection Manager +2. Attestation Manager +``` + +## Features supported +``` +1. Proof Presentation +2. Out of Band +``` + + +## Test +<hr/> + +```bash +# unit tests +$ npm run test + +# e2e tests +$ npm run test:e2e + +# test coverage +$ npm run test:cov +``` + + +## GDPR +<hr/> + +[GDPR](GDPR.md) + +## Dependencies +<hr/> + +[Dependencies](package.json) + +## License +<hr/> + +[Apache 2.0 license](LICENSE) diff --git a/apps/proof-manager/config/config.ts b/apps/proof-manager/config/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..3b17d2dc80bb98c9b6cef2a15714d23ca7fd0bc5 --- /dev/null +++ b/apps/proof-manager/config/config.ts @@ -0,0 +1,27 @@ +const config = () => ({ + PORT: Number(process.env.PORT), + APP_URL: process.env.PROOF_MANAGER_URL, + nats: { + url: process.env.NATS_URL, + }, + auth: { + useAuth: process.env.USE_AUTH || 'false', + clientId: process.env.OAUTH_CLIENT_ID, + clientSecret: process.env.OAUTH_CLIENT_SECRET, + tokenUrl: process.env.OAUTH_TOKEN_URL, + }, + agent: { + agentUrl: process.env.AGENT_URL, + didcommUrl: process.env.DIDCOMM_URL, + }, + DATABASE: { + type: 'postgres', + port: 5432, + synchronize: false, + logging: false, + entities: [`${__dirname}/../**/**.model{.ts,.js}`], + }, + ECSURL: process.env.ECSURL, + ACCEPT_PRESENTATION_CONFIG: process.env.ACCEPT_PRESENTATION_CONFIG, +}); +export default config; diff --git a/apps/proof-manager/config/validation.ts b/apps/proof-manager/config/validation.ts new file mode 100644 index 0000000000000000000000000000000000000000..bead7bddebf15be15c8f720418362c3a8919eba5 --- /dev/null +++ b/apps/proof-manager/config/validation.ts @@ -0,0 +1,15 @@ +import * as Joi from 'joi'; + +const validationSchema = Joi.object({ + AGENT_URL: Joi.string().required(), + DATABASE_URL: Joi.string().required(), + NATS_URL: Joi.string().required(), + PORT: Joi.number().required(), + ACCEPT_PRESENTATION_CONFIG: Joi.string().required(), + USE_AUTH: Joi.string(), + OAUTH_CLIENT_ID: Joi.string(), + OAUTH_CLIENT_SECRET: Joi.string(), + OAUTH_TOKEN_URL: Joi.string(), +}); + +export default validationSchema; diff --git a/apps/proof-manager/deployment/ci/Dockerfile b/apps/proof-manager/deployment/ci/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..0d441b6645373c86c0874f847453f4302b230f5b --- /dev/null +++ b/apps/proof-manager/deployment/ci/Dockerfile @@ -0,0 +1,49 @@ +FROM node:16-alpine3.15 AS builder + +WORKDIR /usr/src/app + +RUN yarn global add @nestjs/cli + +COPY package.json ./ +COPY yarn.lock ./ + +# --prod works if @types/node is in deps (not devDeps) +RUN yarn +#--frozen-lockfile --prod + +COPY . . + +RUN yarn prisma:generate + +RUN yarn build + + +FROM node:14-alpine3.15 + +ENV PATH /usr/src/app/node_modules/.bin:$PATH + +WORKDIR /usr/src/app + + +COPY --from=builder /usr/src/app/dist ./dist +COPY --from=builder /usr/src/app/start.sh ./start.sh +COPY --from=builder /usr/src/app/node_modules ./node_modules +COPY --from=builder /usr/src/app/src/prisma prisma + +EXPOSE 3007 + +RUN chmod +x ./start.sh + +CMD ["./start.sh"] + + + + + + + + + + + + diff --git a/apps/proof-manager/deployment/dev/Dockerfile b/apps/proof-manager/deployment/dev/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..a29fdc89e5dfb02d81e78a5ffafd5e24aecd8b4d --- /dev/null +++ b/apps/proof-manager/deployment/dev/Dockerfile @@ -0,0 +1,18 @@ +FROM node:16-alpine3.15 + +WORKDIR /usr/src/app + +ENV PATH /usr/src/app/node_modules/.bin:$PATH + +COPY package.json ./ +COPY yarn.lock ./ + +COPY . . + +RUN yarn + +RUN yarn prisma:generate + +EXPOSE 3007 + +CMD ["yarn", "start:docker"] diff --git a/apps/proof-manager/nest-cli.json b/apps/proof-manager/nest-cli.json new file mode 100644 index 0000000000000000000000000000000000000000..56167b36a14c2c69eb0db57302e2c44a1128b006 --- /dev/null +++ b/apps/proof-manager/nest-cli.json @@ -0,0 +1,4 @@ +{ + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/apps/proof-manager/package.json b/apps/proof-manager/package.json new file mode 100644 index 0000000000000000000000000000000000000000..8883f873396adbc46f5931053b61a6cb8f892bc3 --- /dev/null +++ b/apps/proof-manager/package.json @@ -0,0 +1,117 @@ +{ + "name": "proof-manager", + "version": "0.0.1", + "description": "The Proof Manager provides an endpoint to request a presentation over an existing connection", + "author": "Sagar", + "private": true, + "license": "Apache-2.0", + "scripts": { + "clean": "rm -r dist", + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "prisma:generate": "prisma generate --schema=./src/prisma/schema.prisma", + "prisma:migrate": "npx prisma migrate deploy --schema=./src/prisma/schema.prisma", + "dbSchema": "npx prisma db push --schema=./src/prisma/schema.prisma", + "prismaStudio": "npx prisma studio", + "start": "nest start", + "start:docker": "yarn prisma:generate && yarn dbSchema && yarn start", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest --config ./test/jest-e2e.json" + }, + "dependencies": { + "@elastic/ecs-winston-format": "^1.3.1", + "@nestjs/axios": "0.0.5", + "@nestjs/common": "^8.0.0", + "@nestjs/config": "^1.1.6", + "@nestjs/core": "^8.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/microservices": "^8.2.6", + "@nestjs/platform-express": "^8.0.0", + "@nestjs/swagger": "^5.2.0", + "@nestjs/terminus": "^8.0.4", + "@prisma/client": "^3.15.2", + "@types/express": "^4.17.13", + "@types/jest": "27.0.2", + "@types/jsonwebtoken": "^8.5.9", + "@types/node": "^16.0.0", + "class-validator": "^0.13.2", + "express": "^4.17.3", + "joi": "^17.6.0", + "js-base64": "^3.7.2", + "jsonwebtoken": "^8.5.1", + "jwks-rsa": "^3.0.0", + "moment": "^2.29.1", + "nats": "^2.6.0", + "pg": "^8.7.3", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.2.0", + "winston": "^3.6.0", + "winston-elasticsearch": "^0.16.1" + }, + "devDependencies": { + "@nestjs/cli": "^8.0.0", + "@nestjs/schematics": "^8.0.0", + "@nestjs/testing": "^8.0.0", + "@types/supertest": "^2.0.11", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "dotenv-cli": "^4.1.1", + "eslint": "^8.0.1", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^7.0.4", + "jest": "^27.2.5", + "node-mocks-http": "^1.11.0", + "prettier": "^2.3.2", + "prisma": "^3.15.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "swagger-ui-express": "^4.3.0", + "ts-jest": "^27.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "^3.10.1", + "typescript": "^4.3.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "setupFiles": [ + "<rootDir>/../setup.js" + ], + "coveragePathIgnorePatterns": [ + "<rootDir>/main", + "<rootDir>/client" + ], + "moduleNameMapper": { + "^@src/(.*)$": "<rootDir>/$1", + "^@config/(.*)$": "<rootDir>/../config/$1", + "^@utils/(.*)$": "<rootDir>/utils/$1", + "^@common/(.*)$": "<rootDir>/common/$1", + "^@presentationProof/(.*)$": "<rootDir>/presentationProof/$1", + "^@health/(.*)$": "<rootDir>/health/$1", + "^@DB/(.*)$": "<rootDir>/prisma/$1" + }, + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "collectCoverageFrom": [ + "**/*.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/apps/proof-manager/setup.js b/apps/proof-manager/setup.js new file mode 100644 index 0000000000000000000000000000000000000000..9d45151621316b3e7e30bbf01a68a65320b9beef --- /dev/null +++ b/apps/proof-manager/setup.js @@ -0,0 +1,2 @@ +process.env.PORT = 3000 +process.env.NODE_ENV = 'development' \ No newline at end of file diff --git a/apps/proof-manager/src/app.module.spec.ts b/apps/proof-manager/src/app.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..55541ed94a5e4ae949291bbd7e03382b7d2aaaaf --- /dev/null +++ b/apps/proof-manager/src/app.module.spec.ts @@ -0,0 +1,24 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import AppModule from './app.module'; + +describe('App Module', () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('should work', () => { + expect(true).toBe(true); + }); + + afterAll(async () => { + await app.close(); + }); +}); diff --git a/apps/proof-manager/src/app.module.ts b/apps/proof-manager/src/app.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..8446388a9d02d87f8974a896f0ca21512918f12a --- /dev/null +++ b/apps/proof-manager/src/app.module.ts @@ -0,0 +1,47 @@ +import { APP_FILTER } from '@nestjs/core'; +import { + MiddlewareConsumer, + Module, + NestModule, + RequestMethod, +} from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TerminusModule } from '@nestjs/terminus'; +import PresentationProofsModule from '@presentationProof/module'; +import config from '@config/config'; +import validationSchema from '@config/validation'; +import HealthController from '@health/health.controller'; +import ExceptionHandler from '@common/exception.handler'; +import { AuthMiddleware } from './middleware/auth.middleware'; + +@Module({ + imports: [ + TerminusModule, + ConfigModule.forRoot({ + isGlobal: true, + load: [config], + validationSchema, + }), + PresentationProofsModule, + ], + controllers: [HealthController], + providers: [ + { + provide: APP_FILTER, + useClass: ExceptionHandler, + }, + ], +}) +export default class AppModule implements NestModule { + // eslint-disable-next-line class-methods-use-this + configure(consumer: MiddlewareConsumer) { + // eslint-disable-line + consumer + .apply(AuthMiddleware) + .exclude({ + path: 'v1/health', + method: RequestMethod.GET, + }) + .forRoutes('*'); + } +} diff --git a/apps/proof-manager/src/client/nats.client.ts b/apps/proof-manager/src/client/nats.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..753df61e79a3fbd49798dbbafd0d584762b2e8d8 --- /dev/null +++ b/apps/proof-manager/src/client/nats.client.ts @@ -0,0 +1,41 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { lastValueFrom } from 'rxjs'; +import { ATTESTATION, Connection, NATSServices } from '@common/constants'; +import PresentationSubscriptionEndpointDto from '@presentationProof/entities/presentationSubscribeEndPoint.entity'; + +@Injectable() +export default class NatsClientService { + constructor(@Inject(NATSServices.SERVICE_NAME) private client: ClientProxy) {} + + getConnectionById(connectionId: string) { + const pattern = { + endpoint: `${Connection.NATS_ENDPOINT}/${Connection.GET_CONNECTION_By_ID}`, + }; + const payload = { connectionId }; + return lastValueFrom(this.client.send(pattern, payload)); + } + + publishPresentation(data: PresentationSubscriptionEndpointDto) { + this.client.emit( + `${NATSServices.SERVICE_NAME}/${NATSServices.PRESENTATION_SUBSCRIBER_ENDPOINT}`, + data, + ); + } + + getCredentialsTypeDetails(type: string) { + const pattern = { + endpoint: `${ATTESTATION.ATTESTATION_MANAGER_SERVICE}/${ATTESTATION.GET_MEMBERSHIP_CREDENTIALS_DETAILS}`, + }; + const payload = { type }; + return lastValueFrom(this.client.send(pattern, payload)); + } + + makeConnectionTrusted(connectionId: string) { + const pattern = { + endpoint: `${Connection.NATS_ENDPOINT}/${Connection.MAKE_CONNECTION_TRUSTED}`, + }; + const payload = { connectionId }; + return lastValueFrom(this.client.send(pattern, payload)); + } +} diff --git a/apps/proof-manager/src/client/nats.spec.ts b/apps/proof-manager/src/client/nats.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..23203130baac495a76336ba802c07c6f83029a61 --- /dev/null +++ b/apps/proof-manager/src/client/nats.spec.ts @@ -0,0 +1,39 @@ +// import { ClientProxy } from '@nestjs/microservices'; +import NatsClientService from './nats.client'; + +describe('Check if the nats client is working', () => { + // let natsClient: NatsClientService; + // let client: ClientProxy; + + // beforeEach(() => { + // natsClient = new NatsClientService(client); + // }); + + // jest.mock('rxjs', () => { + // const original = jest.requireActual('rxjs'); + + // return { + // ...original, + // lastValueFrom: () => new Promise((resolve, reject) => { + // resolve(true); + // }), + // }; + // }); + + it('should be defined', () => { + expect(NatsClientService).toBeDefined(); + }); + + // it('should call the offer membership credential endpoint', async () => { + // const data = { + // status: 'complete', + // connectionId: 'connectionId', + // theirLabel: 'theirLabel', + // participantId: 'participantId', + // participantDID: 'participantDID' + // }; + // jest.spyOn(client, 'send').mockReturnValue(of(data)); + // const response = await natsClient.OfferMembershipCredential(data); + // expect(response).toBeTruthy(); + // }); +}); diff --git a/apps/proof-manager/src/client/rest.client.ts b/apps/proof-manager/src/client/rest.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..51ee54a65b7a27f4c80b5a422ee3e37fb51a0cda --- /dev/null +++ b/apps/proof-manager/src/client/rest.client.ts @@ -0,0 +1,22 @@ +import { HttpService } from '@nestjs/axios'; +import { Injectable } from '@nestjs/common'; +import { lastValueFrom, map } from 'rxjs'; + +@Injectable() +export default class RestClientService { + constructor(private readonly httpService: HttpService) {} + + async post(url: string, payload: object) { + return lastValueFrom( + this.httpService + .post(url, payload) + .pipe(map((response) => response.data)), + ); + } + + async get(url: string) { + return lastValueFrom( + this.httpService.get(url).pipe(map((response) => response.data)), + ); + } +} diff --git a/apps/proof-manager/src/common/constants.ts b/apps/proof-manager/src/common/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..c970284655d6e1b36dd463499573bae0cb011675 --- /dev/null +++ b/apps/proof-manager/src/common/constants.ts @@ -0,0 +1,32 @@ +export enum LoggerConfig { + FILE_PATH = 'logs/log.json', + lOG_DIR = './logs', +} + +export enum NATSServices { + SERVICE_NAME = 'PROOF_MANAGER_SERVICE', + PRESENTATION_SUBSCRIBER_ENDPOINT = 'PresentationSubscriberEndpoint', +} + +export enum Abstraction { + NATS_ENDPOINT = 'SSI_ABSTRACTION_SERVICE', + PROOF_STATE_CHANGED = 'ProofStateChanged', +} + +export enum Connection { + GET_CONNECTION_By_ID = 'getConnectionById', + NATS_ENDPOINT = 'CONNECTION_MANAGER_SERVICE', + MAKE_CONNECTION_TRUSTED = 'makeConnectionTrusted', +} + +export enum ATTESTATION { + ATTESTATION_MANAGER_SERVICE = 'ATTESTATION_MANAGER_SERVICE', + GET_MEMBERSHIP_CREDENTIALS_DETAILS = 'getCredentialsTypeDetails', + CREDENTIAL_TYPE = 'principalMemberCredential', +} + +export enum States { + RequestSent = 'request-sent', + PresentationReceived = 'presentation-received', + Done = 'done', +} diff --git a/apps/proof-manager/src/common/exception.handler.ts b/apps/proof-manager/src/common/exception.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..8883876251109335946e9b83d32d51230e9e4534 --- /dev/null +++ b/apps/proof-manager/src/common/exception.handler.ts @@ -0,0 +1,42 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus, +} from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; +import ResponseType from '@common/response'; + +@Catch() +export default class ExceptionHandler implements ExceptionFilter { + constructor(private readonly httpAdapterHost: HttpAdapterHost) {} + + catch(exception: any, host: ArgumentsHost): void { + // In certain situations `httpAdapter` might not be available in the + // constructor method, thus we should resolve it here. + const { httpAdapter } = this.httpAdapterHost; + + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + + let statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + let message = + exception.message.error || exception.message || 'Something went wrong!'; + + if (exception instanceof HttpException) { + const errorResponse: any = exception.getResponse(); + + statusCode = exception.getStatus(); + message = errorResponse.error || message; + } + + const responseBody: ResponseType = { + statusCode, + message, + error: exception.message, + }; + + httpAdapter.reply(response, responseBody, statusCode); + } +} diff --git a/apps/proof-manager/src/common/response.ts b/apps/proof-manager/src/common/response.ts new file mode 100644 index 0000000000000000000000000000000000000000..e5b6296cf88bea1c13e38e1deba6ab0aca2be551 --- /dev/null +++ b/apps/proof-manager/src/common/response.ts @@ -0,0 +1,6 @@ +export default interface ResponseType { + statusCode: number; + message: string; + data?: any; + error?: any; +} diff --git a/apps/proof-manager/src/health/health.controller.ts b/apps/proof-manager/src/health/health.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..6520e6c5a46962e331c904baae4ea4d5154270b1 --- /dev/null +++ b/apps/proof-manager/src/health/health.controller.ts @@ -0,0 +1,40 @@ +import { Controller, Get, Version, HttpStatus } from '@nestjs/common'; +import ResponseType from '@common/response'; +import {ApiOperation, ApiResponse} from '@nestjs/swagger'; + +@Controller('health') +export default class HealthController { + res: ResponseType; + + @Version(['1']) + @Get() + @ApiOperation({ + summary: 'Health check', + description: 'This call provides the capability to check the service is working and up. The call returns 200 Status Code and current server time in json body' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Service is up and running.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Service is up and running.': { + value: { + statusCode: 200, + message: + 'Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time)', + }, + }, + }, + }, + }, + }) + getHealth() { + this.res = { + statusCode: HttpStatus.OK, + message: `${new Date()}`, + }; + return this.res; + } +} diff --git a/apps/proof-manager/src/health/health.spec.ts b/apps/proof-manager/src/health/health.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a7ecda97f48681fcbca95cb4086ed1a048c10176 --- /dev/null +++ b/apps/proof-manager/src/health/health.spec.ts @@ -0,0 +1,23 @@ +import { HttpStatus } from '@nestjs/common'; +import { Test, TestingModule } from '@nestjs/testing'; +import HealthController from './health.controller'; + +describe('Health', () => { + let healthController: HealthController; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [], + controllers: [HealthController], + providers: [], + }).compile(); + healthController = module.get<HealthController>(HealthController); + }); + it('should be defined', () => { + expect(healthController).toBeDefined(); + }); + + it('should call getHealth', () => { + const response = healthController.getHealth(); + expect(response.statusCode).toBe(HttpStatus.OK); + }); +}); diff --git a/apps/proof-manager/src/main.ts b/apps/proof-manager/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..8674d25a74e6794ca6892e06e1247d823321b5bf --- /dev/null +++ b/apps/proof-manager/src/main.ts @@ -0,0 +1,45 @@ +import { HttpAdapterHost, NestFactory } from '@nestjs/core'; +import { ConfigService } from '@nestjs/config'; +import { VersioningType } from '@nestjs/common'; +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { Transport, MicroserviceOptions } from '@nestjs/microservices'; +import logger from '@utils/logger'; +import AppModule from '@src/app.module'; +import AllExceptionsFilter from '@utils/exceptionsFilter'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + const configService = app.get(ConfigService); + app.enableCors(); + app.connectMicroservice<MicroserviceOptions>({ + transport: Transport.NATS, + options: { + servers: [configService.get('nats')?.url], + }, + }); + + app.enableVersioning({ + defaultVersion: ['1'], + type: VersioningType.URI, + }); + + const swaggerConfig = new DocumentBuilder() + .setTitle('Gaia-x Proof Manager API') + .setDescription('API documentation for GAIA-X Proof Manager') + .setVersion('1.0') + .addServer(`localhost:${configService.get('PORT')}`) + .build(); + + const document = SwaggerModule.createDocument(app, swaggerConfig); + + SwaggerModule.setup('/swagger', app, document); + await app.startAllMicroservices(); + + const httpAdapter = app.get(HttpAdapterHost); + app.useGlobalFilters(new AllExceptionsFilter(httpAdapter)); + + await app.listen(configService.get('PORT') || 3000, () => { + logger.info(`Listening on Port:${configService.get('PORT')}` || 3000); + }); +} +bootstrap(); diff --git a/apps/proof-manager/src/middleware/auth.middleware.ts b/apps/proof-manager/src/middleware/auth.middleware.ts new file mode 100644 index 0000000000000000000000000000000000000000..9c6d1107331263c0d727922f5f31beae59534f5b --- /dev/null +++ b/apps/proof-manager/src/middleware/auth.middleware.ts @@ -0,0 +1,137 @@ +import { HttpStatus, Injectable, NestMiddleware } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import logger from '@src/utils/logger'; +import { Request, Response, NextFunction } from 'express'; +// import { ClientCredentials } from 'simple-oauth2'; + +import * as jwt from 'jsonwebtoken'; +import jwksClient = require('jwks-rsa'); + +// interface IOAuthConfig { +// client: { +// id: string, +// secret: string +// }; +// auth: { +// tokenHost: string +// } +// } + +@Injectable() +export class AuthMiddleware implements NestMiddleware { + constructor(private readonly configService: ConfigService) {} + + /* eslint-disable */ + async use(req: Request, res: Response, next: NextFunction) { + if (this.configService.get('auth.useAuth') === 'false') { + return next(); + } + + logger.info('Request at middleware'); + + const authHeader = req.headers.authorization; + const authToken = authHeader && authHeader?.split(' ')[1]; + + if (!authToken) { + logger.error('No access token provided.'); + res.json({ + status: HttpStatus.UNAUTHORIZED, + message: 'Unauthorized. No Access token provided.', + data: undefined, + }); + return; + } + + // ClientID string `envconfig:"OAUTH_CLIENT_ID"` + // ClientSecret string `envconfig:"OAUTH_CLIENT_SECRET"` + // TokenURL string `envconfig:"OAUTH_TOKEN_URL"` + + // const oauthConfig = { + // client: { + // id: this.configService.get('auth.clientId'), + // secret: this.configService.get('auth.clientSecret') + // }, + // auth: { + // tokenHost: this.configService.get('auth.tokenUrl') || 'https://api.oauth.com' + // } + // }; + + // async function getAccessToken(conf: IOAuthConfig) { + // const client = new ClientCredentials(conf); + // let accessToken: any; + + // const tokenParams = { + // scope: '<scope>', + // }; + + // try { + // accessToken = await client.getToken(tokenParams); + // } catch (error) { + // logger.error('Access Token error', error.message); + // } + + // return accessToken; + // } + + // let result = getAccessToken(oauthConfig); + + // if (!result) { + // res.json({ + // status: HttpStatus.UNAUTHORIZED, + // message: 'Unauthorized. Access token error.', + // data: undefined, + // }) + // return; + // } + + const getKey = ( + header: jwt.JwtHeader, + callback: jwt.SigningKeyCallback, + ): void => { + const jwksUri = this.configService.get('auth.tokenUrl') || ''; + const client = jwksClient({ jwksUri, timeout: 30000 }); + + client + .getSigningKey(header.kid) + .then((key) => callback(null, key.getPublicKey())) + .catch(callback); + }; + + function verify(token: string): Promise<any> | undefined { + return new Promise( + (resolve: (decoded: any) => void, reject: (error: Error) => void) => { + const verifyCallback: jwt.VerifyCallback<jwt.JwtPayload | string> = ( + error: jwt.VerifyErrors | null, + decoded: any, + ): void => { + if (error) { + return reject(error); + } + return resolve(decoded); + }; + + jwt.verify(token, getKey, verifyCallback); + }, + ); + } + + const result = await verify(authToken as string); + + if (!result) { + logger.error('Invalid access token provided.'); + res.json({ + status: HttpStatus.UNAUTHORIZED, + message: 'Unauthorized. Invalid Access token provided.', + data: undefined, + }); + return; + } + + next(); + } + /* eslint-enable */ +} + +export default { + AuthMiddleware, +}; diff --git a/apps/proof-manager/src/presentationProof/controller/controller.spec.ts b/apps/proof-manager/src/presentationProof/controller/controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a2d73d7685649f4c729716290b9c28b741d8cd0a --- /dev/null +++ b/apps/proof-manager/src/presentationProof/controller/controller.spec.ts @@ -0,0 +1,598 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { ConfigModule } from '@nestjs/config'; +import { HttpModule } from '@nestjs/axios'; +import NatsClientService from '@src/client/nats.client'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@src/common/constants'; +import httpMocks from 'node-mocks-http'; +import { HttpStatus } from '@nestjs/common'; +import RestClientService from '@src/client/rest.client'; +import PresentationProofsController from './controller'; +import PresentationProofsService from '../services/service'; +import PrismaService from '../../prisma/prisma.service'; +import FindProofPresentationDto from '../entities/find-proof-presentation.dto'; +import SendProofRequest from '../entities/send-proof-request.dto'; + +describe('Proof Presentation Controller', () => { + let controller: PresentationProofsController; + let service: PresentationProofsService; + let natsClient: NatsClientService; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + ConfigModule, + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + }, + ]), + ], + controllers: [PresentationProofsController], + providers: [ + PresentationProofsService, + PrismaService, + NatsClientService, + RestClientService, + ], + exports: [PrismaService], + }).compile(); + + service = module.get<PresentationProofsService>(PresentationProofsService); + controller = module.get<PresentationProofsController>( + PresentationProofsController, + ); + natsClient = module.get<NatsClientService>(NatsClientService); + }); + + it('should be defined', () => { + expect(controller).toBeDefined(); + }); + + describe('get all proof presentation', () => { + it('should return an array of proof presentation', async () => { + const query: FindProofPresentationDto = { + pageSize: '0', + page: '0', + }; + + const serviceResult: any = [ + 1, + { + id: '3b5e9083-2c2d-4acf-8b18-13f43e31c7df', + proof_record_id: '0448de40-415c-4448-bfa0-456fd8936f91', + participant_id: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + connectionId: '9c80d8c0-8893-4638-97d2-221024f5bafa', + credential_def_id: 'LC5aqqDP6sB7Nyn3GHn4eC:3:CL:242017:UID', + schemaId: '', + their_did: '', + status: 'done', + created_date: '2022-04-19T12:45:38.872Z', + updated_date: '2022-04-19T12:45:55.541Z', + }, + ]; + + const result: any = { + count: 1, + records: { + id: '3b5e9083-2c2d-4acf-8b18-13f43e31c7df', + proof_record_id: '0448de40-415c-4448-bfa0-456fd8936f91', + participant_id: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + connectionId: '9c80d8c0-8893-4638-97d2-221024f5bafa', + credential_def_id: 'LC5aqqDP6sB7Nyn3GHn4eC:3:CL:242017:UID', + schemaId: '', + their_did: '', + status: 'done', + created_date: '2022-04-19T12:45:38.872Z', + updated_date: '2022-04-19T12:45:55.541Z', + }, + }; + + const response = httpMocks.createResponse(); + + jest + .spyOn(service, 'findProofPresentation') + .mockResolvedValueOnce(serviceResult); + const res: any = await controller.findProofPresentation(query, response); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(resData.data).toStrictEqual(result); + }); + + it('should return an no data found', async () => { + const query: FindProofPresentationDto = { + pageSize: '0', + page: '0', + }; + const serviceResult: any = [0, []]; + + const result: any = { statusCode: 404, message: 'No Data found' }; + const response = httpMocks.createResponse(); + jest + .spyOn(service, 'findProofPresentation') + .mockResolvedValueOnce(serviceResult); + const res: any = await controller.findProofPresentation(query, response); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(resData.statusCode).toBe(HttpStatus.NOT_FOUND); + expect(resData).toStrictEqual(result); + }); + }); + + describe('find-by-presentation-id', () => { + it('should return an proof presentation', async () => { + const query = { + proof_record_id: '6703e2e3-4bb3-463d-b2e4-5ea41ccd031f', + participant_id: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + }; + const serviceResult: any = { + _tags: { + state: 'done', + connectionId: 'f2e80e21-f3ab-4b27-abbc-319141457a5b', + threadId: '1a1a6abf-e730-4d60-b33d-702527f81563', + }, + metadata: {}, + id: '6703e2e3-4bb3-463d-b2e4-5ea41ccd031f', + createdAt: '2022-04-19T11:13:10.825Z', + requestMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '1a1a6abf-e730-4d60-b33d-702527f81563', + comment: 'Tested participant', + 'request_presentations~attach': [ + { + '@id': 'libindy-request-presentation-0', + 'mime-type': 'application/json', + data: { + base64: + 'eyJuYW1lIjoiUHJvb2YgUmVxdWVzdCIsInZlcnNpb24iOiJQcm9vZiBSZXF1ZXN0Iiwibm9uY2UiOiI1MjY2MTI4Mjg3NjAiLCJyZXF1ZXN0ZWRfYXR0cmlidXRlcyI6eyJhZGRpdGlvbmFsUHJvcDEiOnsibmFtZXMiOlsiZk5hbWUiXSwicmVzdHJpY3Rpb25zIjpbeyJjcmVkX2RlZl9pZCI6IkxDNWFxcURQNnNCN055bjNHSG40ZUM6MzpDTDoyNDIwMTc6VUlEIn1dfX0sInJlcXVlc3RlZF9wcmVkaWNhdGVzIjp7fX0=', + }, + }, + ], + }, + state: 'done', + connectionId: 'f2e80e21-f3ab-4b27-abbc-319141457a5b', + threadId: '1a1a6abf-e730-4d60-b33d-702527f81563', + isVerified: true, + }; + + const result: any = { + _tags: { + state: 'done', + connectionId: 'f2e80e21-f3ab-4b27-abbc-319141457a5b', + threadId: '1a1a6abf-e730-4d60-b33d-702527f81563', + }, + metadata: {}, + id: '6703e2e3-4bb3-463d-b2e4-5ea41ccd031f', + createdAt: '2022-04-19T11:13:10.825Z', + requestMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '1a1a6abf-e730-4d60-b33d-702527f81563', + comment: 'Tested participant', + 'request_presentations~attach': [ + { + '@id': 'libindy-request-presentation-0', + 'mime-type': 'application/json', + data: { + base64: + 'eyJuYW1lIjoiUHJvb2YgUmVxdWVzdCIsInZlcnNpb24iOiJQcm9vZiBSZXF1ZXN0Iiwibm9uY2UiOiI1MjY2MTI4Mjg3NjAiLCJyZXF1ZXN0ZWRfYXR0cmlidXRlcyI6eyJhZGRpdGlvbmFsUHJvcDEiOnsibmFtZXMiOlsiZk5hbWUiXSwicmVzdHJpY3Rpb25zIjpbeyJjcmVkX2RlZl9pZCI6IkxDNWFxcURQNnNCN055bjNHSG40ZUM6MzpDTDoyNDIwMTc6VUlEIn1dfX0sInJlcXVlc3RlZF9wcmVkaWNhdGVzIjp7fX0=', + }, + }, + ], + }, + state: 'done', + connectionId: 'f2e80e21-f3ab-4b27-abbc-319141457a5b', + threadId: '1a1a6abf-e730-4d60-b33d-702527f81563', + isVerified: true, + }; + + const response = httpMocks.createResponse(); + + jest + .spyOn(service, 'findProofByProofRecordId') + .mockResolvedValueOnce(serviceResult); + const res: any = await controller.findProofByProofRecordId( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(resData.data).toStrictEqual(result); + }); + + it('should return an presentation request required following attributes ( proof_record_id, participant_id )', async () => { + const query = { + proof_record_id: '', + participant_id: '', + }; + const serviceResult: any = []; + const response = httpMocks.createResponse(); + response.status(HttpStatus.BAD_REQUEST); + const result = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Find presentation request required following attributes ( proof_record_id, participant_id )', + }; + jest + .spyOn(service, 'findProofByProofRecordId') + .mockImplementation(() => serviceResult); + + const res: any = await controller.findProofByProofRecordId( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + expect(resData).toStrictEqual(result); + }); + + it('should return an proof presentation no data found', async () => { + const query = { + proof_record_id: '6703e2e3-4bb3-463d-b2e4-5ea41ccd031f', + participant_id: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + }; + const serviceResult: any = ''; + const result: any = { statusCode: 404, message: 'No Data found' }; + const response = httpMocks.createResponse(); + jest + .spyOn(service, 'findProofByProofRecordId') + .mockResolvedValueOnce(serviceResult); + const res: any = await controller.findProofByProofRecordId( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(resData.statusCode).toBe(HttpStatus.NOT_FOUND); + expect(resData).toStrictEqual(result); + }); + }); + + describe('send presentation request', () => { + it('should return an presentation request required following attributes ( connectionId, credential_def_id, attributes )', async () => { + const query: SendProofRequest = { + credentialDefId: '', + connectionId: '', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + ], + participantId: '', + proofRecordId: '', + }; + const serviceResult: any = []; + const response = httpMocks.createResponse(); + response.status(HttpStatus.BAD_REQUEST); + const result = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Send presentation request required following attributes ( connectionId, credential_def_id, attributes )', + }; + jest + .spyOn(service, 'sendPresentationRequest') + .mockImplementation(() => serviceResult); + + const res: any = await controller.sendPresentationRequest( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + expect(resData).toStrictEqual(result); + }); + + it('should return an presentation request send successfully', async () => { + const query: SendProofRequest = { + credentialDefId: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + ], + participantId: '', + proofRecordId: '', + }; + const serviceResult: any = { + _tags: {}, + metadata: {}, + id: '03469be8-a70e-4190-952c-d1b3778e81e5', + createdAt: '2022-04-21T10:07:10.070Z', + requestMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': 'caa5a5e8-8965-4457-8df0-a6db6e18617b', + comment: 'Gaia-x Test', + 'request_presentations~attach': [[Object]], + }, + state: 'request-sent', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + threadId: 'caa5a5e8-8965-4457-8df0-a6db6e18617b', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + theirDid: 'CePQGVFWkpWBN2trZuZSx4', + }; + + const response = httpMocks.createResponse(); + + const result: any = { + id: 'aa74842c-6bf5-4647-864c-4c45012cfef3', + proof_record_id: '03469be8-a70e-4190-952c-d1b3778e81e5', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + credential_def_id: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-21T10:07:10.179Z', + updated_date: '2022-04-21T10:07:10.179Z', + }; + + jest + .spyOn(service, 'sendPresentationRequest') + .mockImplementation(() => serviceResult); + jest + .spyOn(service, 'createPresentationRequest') + .mockImplementation(() => result); + + const res: any = await controller.sendPresentationRequest( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.CREATED); + expect(resData.data).toStrictEqual(result); + }); + + it('should return an could not get agent details. please try again.', async () => { + const query: SendProofRequest = { + credentialDefId: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + ], + participantId: '', + proofRecordId: '', + }; + const serviceResult: any = { + state: 'request-sent', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + threadId: 'caa5a5e8-8965-4457-8df0-a6db6e18617b', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + theirDid: 'CePQGVFWkpWBN2trZuZSx4', + }; + + const response = httpMocks.createResponse(); + + const result: any = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Could not get agent details. please try again.', + }; + + jest + .spyOn(service, 'sendPresentationRequest') + .mockImplementation(() => serviceResult); + + const res: any = await controller.sendPresentationRequest( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + expect(resData).toStrictEqual(result); + }); + }); + + describe('send out of band presentation request', () => { + it('should return an presentation request required following attributes ( participant_id, credential_def_id, attributes )', async () => { + const query: SendProofRequest = { + credentialDefId: '', + connectionId: '', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + ], + participantId: '', + proofRecordId: '', + }; + const serviceResult: any = []; + const response = httpMocks.createResponse(); + response.status(HttpStatus.BAD_REQUEST); + const result = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Send presentation request required following attributes ( participant_id, credential_def_id, attributes )', + }; + jest + .spyOn(service, 'sendOutOfBandPresentationRequest') + .mockImplementation(() => serviceResult); + + const res: any = await controller.sendOutOfBandPresentationRequest( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + expect(resData).toStrictEqual(result); + }); + + it('should return an presentation request send successfully', async () => { + const query: SendProofRequest = { + credentialDefId: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + ], + participantId: '1d50f39b-200a-460d-8198-c2dac92d813a', + proofRecordId: '', + }; + const serviceResult: any = { + message: + 'http://3.111.77.38:4001/?d_m=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL3ByZXNlbnQtcHJvb2YvMS4wL3JlcXVlc3QtcHJlc2VudGF0aW9uIiwiQGlkIjoiNGFlNTU0N2YtNmFmMi00MTQzLThiNWYtY2JkNWRiZWI5NGIyIiwiY29tbWVudCI6IlRlc3RlZCBCeSBTcHJpbnQgNCIsInJlcXVlc3RfcHJlc2VudGF0aW9uc35hdHRhY2giOlt7IkBpZCI6ImxpYmluZHktcmVxdWVzdC1wcmVzZW50YXRpb24tMCIsIm1pbWUtdHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJkYXRhIjp7ImJhc2U2NCI6ImV5SnVZVzFsSWpvaVQzVjBJRTltSUVKaGJtUWdVSEp2YjJZZ1VtVnhkV1Z6ZENJc0luWmxjbk5wYjI0aU9pSlBkWFFnVDJZZ1FtRnVaQ0JRY205dlppQlNaWEYxWlhOMElpd2libTl1WTJVaU9pSXlNamM0TURnM01UazFOakkwSWl3aWNtVnhkV1Z6ZEdWa1gyRjBkSEpwWW5WMFpYTWlPbnNpWVdSa2FYUnBiMjVoYkZCeWIzQXhJanA3SW01aGJXVnpJanBiSW1WdFlXbHNJaXdpYVhOemRXVnlSRWxFSWwwc0luSmxjM1J5YVdOMGFXOXVjeUk2VzNzaVkzSmxaRjlrWldaZmFXUWlPaUpMYm5kNk5FdEhPVGQwWVRaRmJrTTFRbFEzZFVnek9qTTZRMHc2TWpReE9UQXhPbWRoYVdFdGVDQndjbWx1WTJsd1lXd2diV1Z0WW1WeUlHTnlaV1JsYm5ScFlXd2dNQzR5SW4xZGZYMHNJbkpsY1hWbGMzUmxaRjl3Y21Wa2FXTmhkR1Z6SWpwN2ZYMD0ifX1dLCJ-c2VydmljZSI6eyJyZWNpcGllbnRLZXlzIjpbIkJCRmZVdmVVUTZjdEJUR3liWG9XWWkzNjJuS2h6NHV0WDZ4aVF3WHNzc3pRIl0sInJvdXRpbmdLZXlzIjpbXSwic2VydmljZUVuZHBvaW50IjoiaHR0cDovLzMuMTExLjc3LjM4OjQwMDEifX0', + proofRecord: { + _tags: {}, + metadata: {}, + id: '98c9840b-f47e-4572-8666-f17c13a6efa8', + createdAt: '2022-04-21T11:24:43.014Z', + requestMessage: { + '@type': + 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '4ae5547f-6af2-4143-8b5f-cbd5dbeb94b2', + comment: 'Tested By Sprint 4', + 'request_presentations~attach': [Array], + '~service': [Object], + }, + state: 'request-sent', + threadId: '4ae5547f-6af2-4143-8b5f-cbd5dbeb94b2', + autoAcceptProof: 'always', + }, + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + }; + + const response = httpMocks.createResponse(); + + const result: any = { + id: '4cb19a07-0a3c-4a73-bbd6-006b73b26eeb', + proof_record_id: '98c9840b-f47e-4572-8666-f17c13a6efa8', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + connectionId: '', + credential_def_id: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-21T11:24:43.042Z', + updated_date: '2022-04-21T11:24:43.042Z', + presentationMessage: + 'http://3.111.77.38:4001/?d_m=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL3ByZXNlbnQtcHJvb2YvMS4wL3JlcXVlc3QtcHJlc2VudGF0aW9uIiwiQGlkIjoiNGFlNTU0N2YtNmFmMi00MTQzLThiNWYtY2JkNWRiZWI5NGIyIiwiY29tbWVudCI6IlRlc3RlZCBCeSBTcHJpbnQgNCIsInJlcXVlc3RfcHJlc2VudGF0aW9uc35hdHRhY2giOlt7IkBpZCI6ImxpYmluZHktcmVxdWVzdC1wcmVzZW50YXRpb24tMCIsIm1pbWUtdHlwZSI6ImFwcGxpY2F0aW9uL2pzb24iLCJkYXRhIjp7ImJhc2U2NCI6ImV5SnVZVzFsSWpvaVQzVjBJRTltSUVKaGJtUWdVSEp2YjJZZ1VtVnhkV1Z6ZENJc0luWmxjbk5wYjI0aU9pSlBkWFFnVDJZZ1FtRnVaQ0JRY205dlppQlNaWEYxWlhOMElpd2libTl1WTJVaU9pSXlNamM0TURnM01UazFOakkwSWl3aWNtVnhkV1Z6ZEdWa1gyRjBkSEpwWW5WMFpYTWlPbnNpWVdSa2FYUnBiMjVoYkZCeWIzQXhJanA3SW01aGJXVnpJanBiSW1WdFlXbHNJaXdpYVhOemRXVnlSRWxFSWwwc0luSmxjM1J5YVdOMGFXOXVjeUk2VzNzaVkzSmxaRjlrWldaZmFXUWlPaUpMYm5kNk5FdEhPVGQwWVRaRmJrTTFRbFEzZFVnek9qTTZRMHc2TWpReE9UQXhPbWRoYVdFdGVDQndjbWx1WTJsd1lXd2diV1Z0WW1WeUlHTnlaV1JsYm5ScFlXd2dNQzR5SW4xZGZYMHNJbkpsY1hWbGMzUmxaRjl3Y21Wa2FXTmhkR1Z6SWpwN2ZYMD0ifX1dLCJ-c2VydmljZSI6eyJyZWNpcGllbnRLZXlzIjpbIkJCRmZVdmVVUTZjdEJUR3liWG9XWWkzNjJuS2h6NHV0WDZ4aVF3WHNzc3pRIl0sInJvdXRpbmdLZXlzIjpbXSwic2VydmljZUVuZHBvaW50IjoiaHR0cDovLzMuMTExLjc3LjM4OjQwMDEifX0', + }; + + jest + .spyOn(service, 'sendOutOfBandPresentationRequest') + .mockImplementation(() => serviceResult); + jest + .spyOn(service, 'createPresentationRequest') + .mockImplementation(() => result); + + const res: any = await controller.sendOutOfBandPresentationRequest( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.CREATED); + expect(resData.data).toStrictEqual(result); + }); + + it('should return an could not get agent details. please try again.', async () => { + const query: SendProofRequest = { + credentialDefId: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + ], + participantId: '1d50f39b-200a-460d-8198-c2dac92d813a', + proofRecordId: '', + }; + const serviceResult: any = { + state: 'request-sent', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + threadId: 'caa5a5e8-8965-4457-8df0-a6db6e18617b', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + theirDid: 'CePQGVFWkpWBN2trZuZSx4', + }; + + const response = httpMocks.createResponse(); + + const result: any = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Could not get agent details. please try again.', + }; + + jest + .spyOn(service, 'sendOutOfBandPresentationRequest') + .mockImplementation(() => serviceResult); + + const res: any = await controller.sendOutOfBandPresentationRequest( + query, + response, + ); + // eslint-disable-next-line no-underscore-dangle + const resData = res._getData(); + expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + expect(resData).toStrictEqual(result); + }); + }); + + describe('webHookCredentials()', () => { + it('should return an presentation states noted.', async () => { + const query: any = { + body: { + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + id: '1d50f39b-200a-460d-8198-c2dac92d813a', + state: 'done', + isVerified: true, + }, + }; + + const serviceResult: any = { + state: 'request-sent', + connectionId: '1d50f39b-200a-460d-8198-c2dac92d813a', + threadId: 'caa5a5e8-8965-4457-8df0-a6db6e18617b', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + theirDid: 'CePQGVFWkpWBN2trZuZSx4', + }; + + const result: any = { + statusCode: HttpStatus.OK, + message: 'Presentation states noted.', + }; + + jest + .spyOn(service, 'updatePresentationStatus') + .mockImplementation(() => serviceResult); + + jest + .spyOn(service, 'makeConnectionTrusted') + .mockImplementation(() => serviceResult); + + jest + .spyOn(natsClient, 'makeConnectionTrusted') + .mockResolvedValueOnce(serviceResult); + + const res: any = await controller.webhookGetProofPresentation(query); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(res).toStrictEqual(result); + }); + }); +}); diff --git a/apps/proof-manager/src/presentationProof/controller/controller.ts b/apps/proof-manager/src/presentationProof/controller/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..271283d05b907f36b21f16ec28a9b581619acf20 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/controller/controller.ts @@ -0,0 +1,1474 @@ +import { + Body, + Controller, + Get, + HttpStatus, + Param, + Post, + Query, + Res, + Version, +} from '@nestjs/common'; +import { Response } from 'express'; +import logger from '@utils/logger'; +import PresentationProofsService from '@presentationProof/services/service'; +import ResponseType from '@common/response'; +import {ApiBody, ApiOperation, ApiQuery, ApiResponse, ApiTags} from '@nestjs/swagger'; +import SendProofRequest from '@presentationProof/entities/send-proof-request.dto'; +import GetProofRequest from '@presentationProof/entities/get-proof-request.dto'; +import AcceptPresentationDto from '@presentationProof/entities/accept-presentation.dto'; +import FindProofPresentationDto from '@presentationProof/entities/find-proof-presentation.dto'; +import { EventPattern, MessagePattern } from '@nestjs/microservices'; +import { ConfigService } from '@nestjs/config'; +import PresentationSubscriptionEndpointDto from '@presentationProof/entities/presentationSubscribeEndPoint.entity'; +import PrincipalCredentialDto from '@presentationProof/entities/membership-credential.dto'; +import { + Abstraction, + ATTESTATION, + NATSServices, + States, +} from '@src/common/constants'; +import GetPresentProofsDto from '@presentationProof/entities/get-present-proofs.dto'; +import AcceptProofRequestDto from '@presentationProof/entities/accept-proof-request.dto'; +import { Base64 } from 'js-base64'; +import SendProofRequestBody from '../entities/send-proof-request-body.dto'; + +@ApiTags('Proofs') +@Controller() +export default class PresentationProofsController { + constructor( + private readonly presentationProofsService: PresentationProofsService, + private configService: ConfigService, + ) {} + + @Version(['1']) + @ApiQuery({ name: 'page', required: false }) + @ApiQuery({ name: 'pageSize', required: false }) + @ApiQuery({ name: 'proofRecordId', required: false }) + @ApiQuery({ name: 'connectionId', required: false }) + @ApiQuery({ name: 'credentialDefId', required: false }) + @ApiQuery({ name: 'schemaId', required: false }) + @ApiQuery({ name: 'theirDid', required: false }) + @ApiQuery({ name: 'status', required: false }) + @ApiQuery({ name: 'createdDateStart', required: false }) + @ApiQuery({ name: 'createdDateEnd', required: false }) + @ApiQuery({ name: 'updatedDateStart', required: false }) + @ApiQuery({ name: 'updatedDateEnd', required: false }) + @Get('find-proof-presentation') + @ApiOperation({ + summary: 'Fetch list of proof requests', + description: 'This call provides the capability to search proofs (Credential Presentation) by using pagination and filter parameters. This call returns a list of proof requests (Proof Presentations) and overall count of records. Filter supports following parameters: page, pageSize, proofRecordId, connectionId, credentialDefId, schemaId, theirDid, status, createdDateStart, createdDateEnd, updatedDateStart, updatedDateEnd' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Proof presentations fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Proof presentations fetched successfully': { + value: { + statusCode: 200, + message: 'Proof presentations fetched successfully', + data: { + count: 1, + records: [ + { + id: '30774a7e', + proofRecordId: '9b4ab922', + connectionId: '', + credentialDefId: '', + schemaId: '', + theirDid: '', + status: 'request-sent', + createdDate: '1970-01-01T00:00:00.642Z', + updatedDate: '1970-01-01T00:00:00.642Z', + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found': { + value: { + statusCode: 404, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + async findProofPresentation( + @Query() query: FindProofPresentationDto, + @Res() response: Response, + ) { + let res: ResponseType; + const result = await this.presentationProofsService.findProofPresentation( + query.pageSize ? parseInt(query.pageSize, 10) : 10, + query.page ? parseInt(query.page, 10) : 0, + query.proofRecordId ? query.proofRecordId : false, + query.connectionId ? query.connectionId : false, + query.credentialDefId ? query.credentialDefId : false, + query.schemaId ? query.schemaId : false, + query.theirDid ? query.theirDid : false, + query.status ? query.status : false, + query.createdDateStart ? query.createdDateStart : false, + query.createdDateEnd ? query.createdDateEnd : false, + query.updatedDateStart ? query.updatedDateStart : false, + query.updatedDateEnd ? query.updatedDateEnd : false, + ); + if (Array.isArray(result) && result[0] > 0) { + response.status(HttpStatus.OK); + res = { + statusCode: HttpStatus.OK, + message: 'Proof presentations fetched successfully', + data: { + count: result[0], + records: result[1], + }, + }; + logger.info('Proof presentations fetched successfully'); + return response.send(res); + } + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + return response.send(res); + } + + @ApiQuery({ name: 'proofRecordId', required: true }) + @Version(['1']) + @Get('find-by-presentation-id') + @ApiOperation({ + summary: 'Fetch proof presentation by proofRequestId', + description: 'This call provides the capability to get proof request by providing proofRecordId (presentationId). The call returns an information about proof request and also (if user accepted proof request) information about requested user credentials' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Proof presentation fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Proof presentation fetched successfully': { + value: { + statusCode: 200, + message: 'Proof presentation fetched successfully', + data: { + state: 'request-sent', + presentations: [ + { + schemaId: '', + credDefId: '', + revRegId: '', + timestamp: '', + credentialSubject: {}, + }, + ], + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.NOT_FOUND, + description: 'No Data found', + content: { + 'application/json': { + schema: {}, + examples: { + 'No Data found': { + value: { + statusCode: 404, + message: 'No Data found', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Find presentation request required following attributes: ( proofRecordId )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Find presentation request required following attributes: ( proofRecordId )': + { + value: { + statusCode: 400, + message: + 'Find presentation request required following attributes: ( proofRecordId )', + }, + }, + }, + }, + }, + }) + async findProofByProofRecordId( + @Query() query: AcceptPresentationDto, + @Res() response: Response, + ) { + let res: ResponseType; + + if (!query.proofRecordId) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Find presentation request required following attributes: ( proofRecordId )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + const result = + await this.presentationProofsService.findProofByProofRecordId( + query.proofRecordId, + ); + let schemaId: string; + let credDefId: string; + let revRegId: string; + let timestamp: string; + let resData: { + presentations: { + schemaId: string; + credDefId: string; + revRegId: string; + timestamp: string; + credentialSubject: Record<string, string>; + }[]; + state: string; + }; + if (result) { + if (result.state === 'done') { + const data = JSON.parse( + Base64.decode( + result.presentationMessage['presentations~attach'][0].data.base64, + ), + ); + + resData = { + state: result.state, + presentations: [], + }; + + const revealedAttrGroupsKeys = Object.keys( + data.requested_proof.revealed_attr_groups, + ); + + for (let i = 0; i < revealedAttrGroupsKeys.length; i += 1) { + const revealedAttrGroupsKey = revealedAttrGroupsKeys[i]; + const subIndex = + data.requested_proof.revealed_attr_groups[revealedAttrGroupsKey] + .sub_proof_index; + + const presentationData: any = { + schemaId: data.identifiers[subIndex].schema_id, + credDefId: data.identifiers[subIndex].cred_def_id, + revRegId: data.identifiers[subIndex].rev_reg_id, + timestamp: data.identifiers[subIndex].timestamp, + credentialSubject: {}, + }; + + const keys = Object.keys( + data.requested_proof.revealed_attr_groups[revealedAttrGroupsKey] + .values, + ); + + keys.forEach((key) => { + // eslint-disable-next-line max-len + presentationData.credentialSubject[key] = + data.requested_proof.revealed_attr_groups[ + revealedAttrGroupsKey + ].values[key].raw; + }); + + resData.presentations.push(presentationData); + } + } else { + schemaId = ''; + credDefId = ''; + revRegId = ''; + timestamp = ''; + + resData = { + state: result.state, + presentations: [ + { + schemaId, + credDefId, + revRegId, + timestamp, + credentialSubject: {}, + }, + ], + }; + } + + response.status(HttpStatus.OK); + res = { + statusCode: HttpStatus.OK, + message: 'Proof presentation fetched successfully', + data: resData, + }; + return response.send(res); + } + response.status(HttpStatus.NOT_FOUND); + res = { + statusCode: HttpStatus.NOT_FOUND, + message: 'No Data found', + }; + return response.send(res); + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/sendMembershipProofRequest`, + }) + async sendPrincipalCredentialPresentationRequest(data: { + connectionId: string; + }) { + let res: ResponseType; + if (data.connectionId) { + // eslint-disable-next-line max-len + const principalCredentialDetail = + await this.presentationProofsService.getCredentialsTypeDetails( + ATTESTATION.CREDENTIAL_TYPE, + ); + const attributes: { + attributeName: string; + schemaId: string; + value: string; + condition: string; + }[] = []; + principalCredentialDetail.schema.attribute.forEach( + (member: { name: string }) => { + attributes.push({ + attributeName: member.name, + schemaId: principalCredentialDetail.schema.schemaID, + value: '', + condition: '', + }); + }, + ); + + const sendProofRes: PrincipalCredentialDto = { + connectionId: data.connectionId, + attributes, + }; + + // eslint-disable-next-line max-len + const resp = + await this.presentationProofsService.sendPrincipalCredentialPresentationRequest( + sendProofRes, + ); + const sendProofPayload: SendProofRequest = { + proofRecordId: resp.id, + theirDID: resp.theirDid, + status: resp.state, + attributes, + connectionId: data.connectionId, + }; + + res = { + statusCode: HttpStatus.CREATED, + message: 'Presentation request send successfully', + data: await this.presentationProofsService.createPresentationRequest( + sendProofPayload, + ), + }; + logger.info('Presentation request send successfully'); + } else { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Required following attributes ( connectionId )', + }; + } + return res; + } + + @EventPattern({ + endpoint: `${Abstraction.NATS_ENDPOINT}/${Abstraction.PROOF_STATE_CHANGED}`, + }) + async webhookGetProofPresentation(body: { proofRecord: GetProofRequest }) { + const getProofRequest = body.proofRecord; + let res: ResponseType; + let getProofRequestDTO: GetProofRequest; + const presentationSubscriptionEndpointDto: PresentationSubscriptionEndpointDto = + { + proofRecordId: getProofRequest.id, + status: getProofRequest.state, + }; + + /** + * Sent Connection updates to subscriber + */ + this.presentationProofsService.publishPresentationSubscriberEndpoint( + presentationSubscriptionEndpointDto, + ); + + if ( + getProofRequest.state === States.PresentationReceived || + getProofRequest.state === States.Done + ) { + getProofRequestDTO = { + id: getProofRequest.id ? getProofRequest.id : '', + state: getProofRequest.state ? getProofRequest.state : '', + connectionId: getProofRequest.connectionId + ? getProofRequest.connectionId + : '', + }; + const getResponse = + await this.presentationProofsService.updatePresentationStatus( + getProofRequestDTO, + ); + if ( + this.configService.get('ACCEPT_PRESENTATION_CONFIG') === 'AUTO' && + getProofRequest.state === States.PresentationReceived + ) { + res = { + statusCode: HttpStatus.ACCEPTED, + message: 'Presentation received request accepted successfully', + data: await this.presentationProofsService.acceptPresentation( + getResponse.proofRecordId, + ), + }; + return res; + } + if (getProofRequest.state === States.Done) { + await this.presentationProofsService.makeConnectionTrusted( + getProofRequest.connectionId, + ); + } + } + res = { + statusCode: HttpStatus.OK, + message: 'Presentation states noted.', + }; + return res; + } + + @Version(['1']) + @ApiBody({ type: SendProofRequest }) + @Post('send-presentation-request') + @ApiOperation({ + summary: 'Send presentation request', + description: 'This call provides the capability to create a new presentation request bound to existing connection. It is mandatory to provide a schema for every requested attribute and attribute name in the body information of the connection. The call returns an information about proof request (proofRecordId, connectionId, credentialDefId, schemaId, theirDid, status, createdDate, updatedDate, threadId)' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Presentation request sent successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Presentation request sent successfully': { + value: { + statusCode: 201, + message: 'Presentation request sent successfully', + data: { + id: 'a7ccc2f7', + proofRecordId: 'fb556018-1907-47c1-a6d6-c7cbca7d23b4', + connectionId: 'a9371aed-67ed-4448-ace0-d773e7b30e1c', + credentialDefId: '', + schemaId: '', + theirDid: '', + status: 'request-sent', + createdDate: '2023-03-02T13:02:43.656Z', + updatedDate: '2023-03-02T13:02:43.656Z', + threadId: '75045c1b-f0ef-4f10-831e-4e4f301333af', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Find presentation request required following attributes: ( proofRecordId )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Find presentation request required following attributes: ( proofRecordId )': + { + value: { + statusCode: 400, + message: + 'Find presentation request required following attributes: ( proofRecordId )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Could not get schema or connection details. please try again.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Could not get schema or connection details. please try again.': { + value: { + statusCode: 400, + message: + 'Could not get schema or connection details. please try again.', + }, + }, + }, + }, + }, + }) + async sendPresentationRequest( + @Body() sendProofRequest: SendProofRequest, + @Res() response: Response, + ) { + let res: ResponseType; + if ( + !( + sendProofRequest.connectionId && + Array.isArray(sendProofRequest.attributes) && + sendProofRequest.attributes.every( + (i) => + (typeof i.schemaId === 'string' && i.schemaId.trim().length > 0) || + (typeof i.credentialDefId === 'string' && + i.credentialDefId.trim().length > 0), + ) + ) + ) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Send presentation request required following attributes ( connectionId, attributes,schemaId or credentialDefId)', // eslint-disable-line + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + const resp = await this.presentationProofsService.sendPresentationRequest( + sendProofRequest, + ); + logger.info(`sendPresentationRequest response ${JSON.stringify(resp)}`); + if (resp?.id) { + const sendProofRes: SendProofRequest = sendProofRequest; + sendProofRes.proofRecordId = resp.id; + sendProofRes.theirDID = resp.theirDid; + sendProofRes.status = resp.state; + response.status(HttpStatus.CREATED); + + // eslint-disable-next-line max-len + const createPresentationRequestRes = + await this.presentationProofsService.createPresentationRequest( + // eslint-disable-line + sendProofRes, + ); + res = { + statusCode: HttpStatus.CREATED, + message: 'Presentation request sent successfully', + data: { + ...createPresentationRequestRes, + threadId: resp.threadId, + }, + }; + logger.info('Presentation request send successfully'); + } else { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Could not get schema or connection details. please try again.', + }; + } + return response.send(res); + } + + @Version(['1']) + @ApiBody({ type: SendProofRequestBody }) + @Post('send-out-of-band-presentation-request') + @ApiOperation({ + summary: 'Send out of band presentation request', + description: 'This call provides the capability to create a new presentation request not bound to any proposal or existing connection. The call returns an information about presentation request' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Presentation request sent successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Presentation request sent successfully': { + value: { + statusCode: 201, + message: 'Presentation request sent successfully', + data: { + id: 'd6667caa', + proofRecordId: '600dd422', + connectionId: '', + credentialDefId: '', + schemaId: '', + theirDid: '', + status: 'request-sent', + createdDate: '1970-01-01T00:00:00.934Z', + updatedDate: '1970-01-01T00:00:00.934Z', + presentationMessage: + 'https://serviceEndpointUrl.com:443/ocm/didcomm/?d_m=eyJAdHlwZSI6I', + presentationMessageShort: 'https://selfUrl.com/v1/url/1234abcd', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Send presentation request required following attributes( attributes, schemaId or credentialDefinitionId )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Send presentation request required following attributes( attributes, schemaId or credentialDefinitionId )': + { + value: { + statusCode: 400, + message: + 'Send presentation request required following attributes( attributes, schemaId or credentialDefinitionId )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Could not get schema details. please try again.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Could not get schema details. please try again.': { + value: { + statusCode: 400, + message: 'Could not get schema details. please try again.', + }, + }, + }, + }, + }, + }) + async sendOutOfBandPresentationRequest( + @Body() sendProofRequestBody: SendProofRequestBody, + @Res() response: Response, + ) { + const sendProofRequest: SendProofRequest = { + attributes: [], + }; + // sendProofRequest.credentialDefId = sendProofRequestBody.options?.credentialDefinitionId; + + let res: ResponseType; + if ( + !( + Array.isArray(sendProofRequestBody.attributes) && + sendProofRequestBody.attributes.every( + (i) => + (typeof i.schemaId === 'string' && i.schemaId.trim().length > 0) || + (typeof i.credentialDefId === 'string' && + i.credentialDefId.trim().length > 0), + ) + ) + ) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Send presentation request required following attributes( attributes, schemaId or credentialDefinitionId )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + // REVIEW: + // const valideSchemaIdOrCredentialId = await Promise.allSettled([ + // this.presentationProofsService.getSchemaById( + // `${sendProofRequest.schemaId}`, + // ), + // this.presentationProofsService.getCredentialDefinitionsById( + // `${sendProofRequest.credentialDefId}`, + // ), + // ]); + // logger.info( + // `valideSchemaIdOrCredentialId[0].status ${valideSchemaIdOrCredentialId[0].status}`, + // ); + // logger.info( + // `valideSchemaIdOrCredentialId[1].status ${valideSchemaIdOrCredentialId[1].status}`, + // ); + // if ( + // valideSchemaIdOrCredentialId[0].status !== 'fulfilled' + // && valideSchemaIdOrCredentialId[1].status !== 'fulfilled' + // ) { + // res = { + // statusCode: HttpStatus.BAD_REQUEST, + // message: 'Please provide a valid schema ID or credential def ID', + // }; + // return response.status(HttpStatus.BAD_REQUEST).send(res); + // } + + sendProofRequestBody.attributes.forEach((element) => { + sendProofRequest.attributes.push({ + attributeName: element.attributeName, + value: element.value, + condition: element.condition, + schemaId: element.schemaId, + credentialDefId: element.credentialDefId, + }); + }); + + const resp = + await this.presentationProofsService.sendOutOfBandPresentationRequest( + sendProofRequest, + ); + logger.info(`agent response ${JSON.stringify(resp)}`); + if (resp?.proofRecord?.id) { + const sendProofRes: SendProofRequest = sendProofRequest; + sendProofRes.proofRecordId = resp.proofRecord.id; + sendProofRes.theirDID = resp.theirDid; + sendProofRes.status = resp.proofRecord.state; + response.status(HttpStatus.CREATED); + const getResult = + await this.presentationProofsService.createPresentationRequest( + sendProofRes, + ); + const resResult = { + ...getResult, + presentationMessage: resp.message, + presentationMessageShort: resp.messageShort, + }; + res = { + statusCode: HttpStatus.CREATED, + message: 'Presentation request sent successfully', + data: resResult, + }; + logger.info('Presentation request sent successfully'); + } else { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Could not get schema details. please try again.', + }; + } + return response.send(res); + } + + @Version(['1']) + @ApiQuery({ name: 'type', required: true }) + @Post('out-of-band-proof') + @ApiOperation({ + summary: 'Send out of band proof', + description: 'This call provides the capability to create a new presentation request not bound to any proposal or existing connection but it creates just on type defined in attestation manager (type is bound to schema id there). The call returns an information about presentation request' + }) + @ApiResponse({ + status: HttpStatus.CREATED, + description: 'Presentation request sent successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Presentation request sent successfully': { + value: { + statusCode: 201, + message: 'Presentation request sent successfully', + data: { + id: '60f38aa4', + proofRecordId: '852ee278', + connectionId: '', + credentialDefId: '', + schemaId: '', + theirDid: '', + status: 'request-sent', + createdDate: '2023-03-02T13:12:38.934Z', + updatedDate: '2023-03-02T13:12:38.934Z', + presentationMessage: + 'https://serviceEndpointUrl.com:443/ocm/didcomm/?d_m=eyJAdHlwZSI6Imh0dHBzOi8', + presentationMessageShort: 'https://selfUrl/v1/url/1234abcd', + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: 'Could not get schema details. please try again.', + content: { + 'application/json': { + schema: {}, + examples: { + 'Could not get schema details. please try again.': { + value: { + statusCode: 400, + message: 'Could not get schema details. please try again.', + }, + }, + }, + }, + }, + }) + async outOfBandProof( + @Query() query: { type: string }, + @Res() response: Response, + ) { + let res: ResponseType; + // eslint-disable-next-line max-len + const typesArr = query.type.split(','); + + const principalCredentialDetailPromiseArr = []; + + for (let i = 0; i < typesArr.length; i += 1) { + principalCredentialDetailPromiseArr.push( + this.presentationProofsService.getCredentialsTypeDetails(typesArr[i]), + ); + } + + const principalCredentialDetail = await Promise.all( + principalCredentialDetailPromiseArr, + ); + const attributes: { + attributeName: string; + schemaId: string; + value: ''; + condition: ''; + }[] = []; + for (let i = 0; i < principalCredentialDetail.length; i += 1) { + principalCredentialDetail[i].schema.attribute.forEach( + (member: { name: string }) => { + attributes.push({ + attributeName: member.name, + schemaId: principalCredentialDetail[i].schema.schemaID, + value: '', + condition: '', + }); + }, + ); + } + + const sendProofRequest: SendProofRequest = { + attributes, + connectionId: '', + proofRecordId: '', + }; + const resp = + await this.presentationProofsService.sendOutOfBandPresentationRequest( + sendProofRequest, + ); + if (resp?.proofRecord?.id) { + const sendProofRes: SendProofRequest = sendProofRequest; + sendProofRes.proofRecordId = resp.proofRecord.id; + sendProofRes.theirDID = resp.theirDid; + sendProofRes.status = resp.proofRecord.state; + response.status(HttpStatus.CREATED); + const getResult = + await this.presentationProofsService.createPresentationRequest( + sendProofRes, + ); + const resResult = { + ...getResult, + presentationMessage: resp.message, + presentationMessageShort: resp.messageShort, + }; + res = { + statusCode: HttpStatus.CREATED, + message: 'Presentation request sent successfully', + data: resResult, + }; + logger.info('Presentation request sent successfully'); + } else { + response.status(HttpStatus.BAD_REQUEST); + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: 'Could not get schema details. please try again.', + }; + } + return response.send(res); + } + + @Version(['1']) + @Post('accept-presentation/:proofRecordId') + @ApiOperation({ + summary: 'Accept presentation request by proofRecordId', + description: 'Accept a presentation as prover (by sending a presentation acknowledgement message) to the connection associated with the proof record.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Presentation accepted successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Presentation accepted successfully': { + value: {}, // TODO: example + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Accept presentation request required following attributes ( proof_record_id )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Accept presentation request required following attributes ( proof_record_id )': + { + value: { + statusCode: 400, + message: + 'Accept presentation request required following attributes ( proof_record_id )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:00.891Z', + message: 'Something went wrong: Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async acceptPresentation( + @Param() params: AcceptPresentationDto, + @Res() response: Response, + ) { + let res: ResponseType; + if (!params.proofRecordId) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Accept presentation request required following attributes ( proof_record_id )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + logger.info('Presentation accepted successfully'); + res = { + statusCode: HttpStatus.OK, + message: 'Presentation accepted successfully', + data: await this.presentationProofsService.acceptPresentation( + params.proofRecordId, + ), + }; + return response.status(HttpStatus.OK).send(res); + } + + @Version(['1']) + @Post('accept-proof-request/:proofRecordId') + @ApiOperation({ + summary: 'Accept proof request by proofRecordId', + description: 'Accept a presentation request as prover (by sending a presentation message) to the connection associated with the proof record.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Request accepted successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Request accepted successfully': { + value: { + statusCode: 200, + message: 'Request accepted successfully', + data: { + _tags: { + threadId: '6b5c57b3', + state: 'request-received', + connectionId: '653b8cdc', + }, + metadata: {}, + id: '19c5269f', + createdAt: '1970-01-01T00:00:00.498Z', + requestMessage: { + '@type': + 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '6b5c57b3', + comment: 'Proof Presenation', + 'request_presentations~attach': [ + { + '@id': 'libindy-request-presentation-0', + 'mime-type': 'application/json', + data: { + base64: 'eyJuYW=', + }, + }, + ], + }, + state: 'presentation-sent', + connectionId: '653b8cdc', + threadId: '6b5c57b3', + presentationMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/presentation', + '@id': 'c1089096', + 'presentations~attach': [ + { + '@id': 'libindy-presentation-0', + 'mime-type': 'application/json', + data: { + base64: 'eyJwcm9vZ', + }, + }, + ], + '~thread': { + thid: '6b5c57b3', + }, + }, + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Accept proof request required following attributes ( proofRecordId )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Accept proof request required following attributes ( proofRecordId )': + { + value: { + statusCode: 400, + timestamp: '1970-01-01T00:00:00.891Z', + message: + 'Accept proof request required following attributes ( proofRecordId )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:00.891Z', + message: 'Something went wrong: Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async acceptProofRequest( + @Param() params: AcceptProofRequestDto, + @Res() response: Response, + ) { + let res: ResponseType; + if (!params.proofRecordId) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Accept proof request required following attributes ( proofRecordId )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + logger.info('Request accepted successfully'); + res = { + statusCode: HttpStatus.OK, + message: 'Request accepted successfully', + data: await this.presentationProofsService.acceptProofRequest( + params.proofRecordId, + ), + }; + return response.status(HttpStatus.OK).send(res); + } + + @Version(['1']) + @Post('delete-proof-request/:proofRecordId') + @ApiOperation({ + summary: 'Delete proof request by proofRecordId', + description: 'Deletes a proofRecord in the proof repository.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Delete proof request', + content: { + 'application/json': { + schema: {}, + examples: { + 'Delete proof request': { + value: { + statusCode: 200, + message: 'Proof request deleted successfully', + data: '', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Delete proof request required following attributes ( proofRecordId )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Delete proof request required following attributes ( proofRecordId )': + { + value: { + statusCode: 400, + timestamp: '1970-01-01T00:00:00.891Z', + message: + 'Delete proof request required following attributes ( proofRecordId )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:00.891Z', + message: 'Something went wrong: Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async deleteProofRequest( + @Param() params: AcceptProofRequestDto, + @Res() response: Response, + ) { + let res: ResponseType; + if (!params.proofRecordId) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Delete proof request required following attributes ( proofRecordId )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + logger.info('Proof request deleting'); + res = { + statusCode: HttpStatus.OK, + message: 'Proof request deleted successfully', + data: await this.presentationProofsService.deleteProofRequest( + params.proofRecordId, + ), + }; + return response.status(HttpStatus.OK).send(res); + } + + @Version(['1']) + @Post('decline-proof-request/:proofRecordId') + @ApiOperation({ + summary: 'Decline proof request by proofRecordId', + description: 'Decline proof request as prover (by sending a presentation message) to the connection associated with the proof record.' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Request declined successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Request declined successfully': { + value: { + statusCode: 200, + message: 'Request declined successfully', + data: { + _tags: { + threadId: '6b5c57b3', + state: 'request-received', + connectionId: '653b8cdc', + }, + metadata: {}, + id: '19c5269f', + createdAt: '1970-01-01T00:00:00.498Z', + requestMessage: { + '@type': + 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '6b5c57b3', + comment: 'Proof Presenation', + 'request_presentations~attach': [ + { + '@id': 'libindy-request-presentation-0', + 'mime-type': 'application/json', + data: { + base64: 'eyJuYW=', + }, + }, + ], + }, + state: 'presentation-sent', + connectionId: '653b8cdc', + threadId: '6b5c57b3', + presentationMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/presentation', + '@id': 'c1089096', + 'presentations~attach': [ + { + '@id': 'libindy-presentation-0', + 'mime-type': 'application/json', + data: { + base64: 'eyJwcm9vZ', + }, + }, + ], + '~thread': { + thid: '6b5c57b3', + }, + }, + }, + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.BAD_REQUEST, + description: + 'Accept proof request required following attributes ( proofRecordId )', + content: { + 'application/json': { + schema: {}, + examples: { + 'Accept proof request required following attributes ( proofRecordId )': + { + value: { + statusCode: 400, + timestamp: '1970-01-01T00:00:00.891Z', + message: + 'Accept proof request required following attributes ( proofRecordId )', + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:00.891Z', + message: 'Something went wrong: Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async declineProofRequest( + @Param() params: AcceptProofRequestDto, + @Res() response: Response, + ) { + let res: ResponseType; + if (!params.proofRecordId) { + res = { + statusCode: HttpStatus.BAD_REQUEST, + message: + 'Decline proof request required following attributes ( proofRecordId )', + }; + return response.status(HttpStatus.BAD_REQUEST).send(res); + } + logger.info('Request decline in progress...'); + res = await this.presentationProofsService.declineProofRequest( + params.proofRecordId, + ); + return response.status(HttpStatus.OK).send(res); + } + + @Version(['1']) + @ApiQuery({ name: 'threadId', required: false }) + @Get('agent-proofs') + @ApiOperation({ + summary: 'Fetch all proofs directly from the agent', + description: 'This call provides the capability to get all proof records directly from agent. Pagination and sorting does not implemented in that version of Aries Framework Javascript' + }) + @ApiResponse({ + status: HttpStatus.OK, + description: 'Proofs fetched successfully', + content: { + 'application/json': { + schema: {}, + examples: { + 'Proofs fetched successfully': { + value: { + statusCode: 200, + message: 'Proofs fetched successfully', + data: [ + { + _tags: { + threadId: '75045c1b', + state: 'request-received', + connectionId: 'e6d30380', + }, + metadata: {}, + id: '6f776996', + createdAt: '1970-01-01T00:00:00.640Z', + requestMessage: { + '@type': + 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '75045c1b', + comment: 'Proof Presenation', + 'request_presentations~attach': [ + { + '@id': 'libindy-request-presentation-0', + 'mime-type': 'application/json', + data: { + base64: 'eyJ', + }, + }, + ], + }, + state: 'request-received', + connectionId: 'e6d30380', + threadId: '75045c1b', + }, + { + _tags: { + connectionId: 'a9371aed', + state: 'request-sent', + threadId: '75045c1b', + }, + metadata: {}, + id: 'fb556018', + createdAt: '1970-01-01T00:00:00.568Z', + requestMessage: { + '@type': + 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '75045c1b', + comment: 'Proof Presenation', + 'request_presentations~attach': [ + { + '@id': 'libindy-request-presentation-0', + 'mime-type': 'application/json', + data: { + base64: 'eyJ', + }, + }, + ], + }, + state: 'request-sent', + connectionId: 'a9371aed', + threadId: '75045c1b', + }, + ], + }, + }, + }, + }, + }, + }) + @ApiResponse({ + status: HttpStatus.INTERNAL_SERVER_ERROR, + description: 'Internal Server Error', + content: { + 'application/json': { + schema: {}, + examples: { + 'Internal Server Error': { + value: { + statusCode: 500, + timestamp: '1970-01-01T00:00:00.891Z', + message: 'Something went wrong: Lorem Ipsum', + }, + }, + }, + }, + }, + }) + async getAllProofRequest( + @Query() query: { threadId: string }, + @Res() response: Response, + ) { + const res: ResponseType = { + statusCode: HttpStatus.OK, + message: 'Proofs fetched successfully', + data: await this.presentationProofsService.getAllProofRequest( + query.threadId, + ), + }; + return response.status(HttpStatus.OK).send(res); + } + + @MessagePattern({ + endpoint: `${NATSServices.SERVICE_NAME}/getPresentProofs`, + }) + async getPresentProofs(data: GetPresentProofsDto) { + return this.presentationProofsService.getPresentProofs(data); + } + + @Version(['1']) + @Get('url/:id') + @ApiOperation({ + summary: 'Get full url from short url id', + description: 'Get full url from short url id' + }) + async redirectToOriginalUrl( + @Param('id') id: string, + @Res() response: Response, + ) { + const result = await this.presentationProofsService.findUrlByShortUrlId(id); + if (!result) { + throw new Error('Not found'); + } + response.writeHead(302, { + location: result.originalUrl, + }); + return response.end(); + } +} diff --git a/apps/proof-manager/src/presentationProof/entities/accept-presentation.dto.ts b/apps/proof-manager/src/presentationProof/entities/accept-presentation.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..8b26dd14dcb885500df6fb121de87f2afa123a3a --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/accept-presentation.dto.ts @@ -0,0 +1,8 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString } from 'class-validator'; + +export default class AcceptPresentationDto { + @IsString() + @ApiProperty() + proofRecordId: string; +} diff --git a/apps/proof-manager/src/presentationProof/entities/accept-proof-request.dto.ts b/apps/proof-manager/src/presentationProof/entities/accept-proof-request.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..c9035dca960434aee902160e0033c1207833a7ab --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/accept-proof-request.dto.ts @@ -0,0 +1,6 @@ +import { IsString } from 'class-validator'; + +export default class AcceptProofRequestDto { + @IsString() + proofRecordId: string; +} diff --git a/apps/proof-manager/src/presentationProof/entities/find-proof-presentation.dto.ts b/apps/proof-manager/src/presentationProof/entities/find-proof-presentation.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..8dc31ea58bbaab1d9a82d94dc56202f68798d449 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/find-proof-presentation.dto.ts @@ -0,0 +1,39 @@ +import { IsNumber, IsString, IsDateString } from 'class-validator'; + +export default class FindProofPresentationDto { + @IsNumber() + page: string; + + @IsNumber() + pageSize: string; + + @IsString() + proofRecordId: string; + + @IsString() + connectionId: string; + + @IsString() + credentialDefId: string; + + @IsString() + schemaId: string; + + @IsString() + theirDid: string; + + @IsString() + status: string; + + @IsDateString() + createdDateStart: string; + + @IsDateString() + createdDateEnd: string; + + @IsDateString() + updatedDateStart: string; + + @IsDateString() + updatedDateEnd: string; +} diff --git a/apps/proof-manager/src/presentationProof/entities/get-present-proofs.dto.ts b/apps/proof-manager/src/presentationProof/entities/get-present-proofs.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..b02a94d0770e81769782437039d20e42e99d0958 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/get-present-proofs.dto.ts @@ -0,0 +1,6 @@ +import { IsString } from 'class-validator'; + +export default class GetPresentProofsDto { + @IsString() + connectionId: string; +} diff --git a/apps/proof-manager/src/presentationProof/entities/get-proof-request.dto.ts b/apps/proof-manager/src/presentationProof/entities/get-proof-request.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..b5677433d0f499793e5087328f7e530e1e322350 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/get-proof-request.dto.ts @@ -0,0 +1,14 @@ +import { IsString } from 'class-validator'; + +export default class GetProofRequest { + @IsString() + state: string; + + @IsString() + id: string; + + @IsString() + connectionId: string; + + isVerified?: boolean; +} diff --git a/apps/proof-manager/src/presentationProof/entities/membership-credential.dto.ts b/apps/proof-manager/src/presentationProof/entities/membership-credential.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..bbc2793ee420771e18b96f8ac4388ac7b37940e7 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/membership-credential.dto.ts @@ -0,0 +1,12 @@ +import { IsString } from 'class-validator'; + +export default class MembershipCredentialDto { + @IsString() + connectionId: string; + + attributes: { + attributeName: string; + schemaId?: string; + credentialDefId?: string; + }[]; +} diff --git a/apps/proof-manager/src/presentationProof/entities/presentationSubscribeEndPoint.entity.ts b/apps/proof-manager/src/presentationProof/entities/presentationSubscribeEndPoint.entity.ts new file mode 100644 index 0000000000000000000000000000000000000000..3dc7e1dffb73531f39fd8d15e31a3b5d5d7f7f6c --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/presentationSubscribeEndPoint.entity.ts @@ -0,0 +1,11 @@ +import { IsString, IsNotEmpty } from 'class-validator'; + +export default class PresentationSubscriptionEndpointDto { + @IsString() + @IsNotEmpty() + proofRecordId: string; + + @IsString() + @IsNotEmpty() + status: string; +} diff --git a/apps/proof-manager/src/presentationProof/entities/send-proof-request-body.dto.ts b/apps/proof-manager/src/presentationProof/entities/send-proof-request-body.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..a0a31022c6a0f16d3597bbe9565809ddd1156663 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/send-proof-request-body.dto.ts @@ -0,0 +1,46 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString } from 'class-validator'; +import InvitationDTO from '@src/presentationProof/entities/get-proof-request.dto'; + +export default class SendProofRequestBody { + @ApiProperty({ example: 'comments' }) + comment?: string; + + @IsString() + status?: string; + + @ApiProperty({ example: 'WgWxqztrNooG92RXvxSTWv:3:CL:20:tag' }) + @IsString() + schemaId: string; + + @IsString() + theirDID?: string; + + @IsString() + presentationMessage?: string; + + @ApiProperty({ + example: { + type: 'Aries1.0', + credentialDefinitionId: 'credentialDefinitionId', + }, + }) + options?: { + type: string; + credentialDefinitionId: string; + }; + + @IsString() + invitation?: InvitationDTO; + + @ApiProperty({ example: ['attributeName'] }) + attributes: [ + { + attributeName: string; + schemaId: string; + credentialDefId: string; + value: string; + condition: string; + }, + ]; +} diff --git a/apps/proof-manager/src/presentationProof/entities/send-proof-request.dto.ts b/apps/proof-manager/src/presentationProof/entities/send-proof-request.dto.ts new file mode 100644 index 0000000000000000000000000000000000000000..6a8eadad4492e13b9b0e8ec78950a41843bb4f00 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/entities/send-proof-request.dto.ts @@ -0,0 +1,43 @@ +import { ApiProperty } from '@nestjs/swagger'; +import { IsString } from 'class-validator'; +import InvitationDTO from '@src/presentationProof/entities/get-proof-request.dto'; + +export default class SendProofRequest { + @ApiProperty({ example: 'comments' }) + comment?: string; + + @ApiProperty({ example: '3fa85f64-5717-4562-b3fc-2c963f66afa6' }) + connectionId?: string; + + @IsString() + proofRecordId?: string; + + @IsString() + status?: string; + + @IsString() + theirDID?: string; + + @IsString() + presentationMessage?: string; + + @IsString() + invitation?: InvitationDTO; + + @ApiProperty({ + example: [ + { + attributeName: 'attributeName', + schemaId: 'schemaId', + credentialDefId: 'credentialDefId', + }, + ], + }) + attributes: { + attributeName: string; + schemaId?: string; + credentialDefId?: string; + value: string; + condition: string; + }[]; +} diff --git a/apps/proof-manager/src/presentationProof/module.spec.ts b/apps/proof-manager/src/presentationProof/module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..4d9b6af615c81f391407fe126d0998db8cc89f8f --- /dev/null +++ b/apps/proof-manager/src/presentationProof/module.spec.ts @@ -0,0 +1,7 @@ +import PresentationProofsModule from './module'; + +describe('Check if the module is working', () => { + it('should be defined', () => { + expect(PresentationProofsModule).toBeDefined(); + }); +}); diff --git a/apps/proof-manager/src/presentationProof/module.ts b/apps/proof-manager/src/presentationProof/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..5da7fd0d3c95acf5f3d66d31242ddf72531342ff --- /dev/null +++ b/apps/proof-manager/src/presentationProof/module.ts @@ -0,0 +1,33 @@ +import { Module } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { HttpModule } from '@nestjs/axios'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import PresentationProofsService from '@presentationProof/services/service'; +import PresentationProofsController from '@presentationProof/controller/controller'; +import NatsClientService from '@src/client/nats.client'; +import RestClientService from '@src/client/rest.client'; +import config from '@config/config'; + +@Module({ + imports: [ + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + ], + controllers: [PresentationProofsController], + providers: [ + PresentationProofsService, + PrismaService, + NatsClientService, + RestClientService, + ], +}) +export default class PresentationProofsModule {} diff --git a/apps/proof-manager/src/presentationProof/repository/presentationProof.respository.ts b/apps/proof-manager/src/presentationProof/repository/presentationProof.respository.ts new file mode 100644 index 0000000000000000000000000000000000000000..8ae0368761b61d2a8a12eea145e77f990885e8e6 --- /dev/null +++ b/apps/proof-manager/src/presentationProof/repository/presentationProof.respository.ts @@ -0,0 +1,69 @@ +import { Injectable } from '@nestjs/common'; +import PrismaService from '@DB/prisma.service'; +import { Prisma } from '@prisma/client'; + +@Injectable() +export default class PresentationProofRepository { + constructor(private readonly prismaService: PrismaService) {} + + async createPresentationProof(data: Prisma.ProofCreateInput) { + return this.prismaService.proof.create({ + data, + }); + } + + async updatePresentationStatus(params: { + where: Prisma.ProofWhereUniqueInput; + data: Prisma.ProofUpdateInput; + }) { + const { where, data } = params; + return this.prismaService.proof.update({ + data, + where, + }); + } + + async findProofPresentation(params: { + skip?: number; + take?: number; + cursor?: Prisma.ProofWhereUniqueInput; + where?: Prisma.ProofWhereInput; + orderBy?: Prisma.ProofOrderByWithRelationInput; + }) { + const { skip, take, cursor, where, orderBy } = params; + return this.prismaService.$transaction([ + this.prismaService.proof.count({ + where, + }), + this.prismaService.proof.findMany({ + skip, + take, + cursor, + where, + orderBy, + }), + ]); + } + + async deleteProofRequest(proofRecordId: string) { + return this.prismaService.proof.delete({ + where: { proofRecordId }, + }); + } + + async createShortUrl(originalUrl: string) { + return this.prismaService.shortUrl.create({ + data: { + originalUrl, + }, + }); + } + + async getShortUrl(id: string) { + return this.prismaService.shortUrl.findUnique({ + where: { + id, + }, + }); + } +} diff --git a/apps/proof-manager/src/presentationProof/services/service.spec.ts b/apps/proof-manager/src/presentationProof/services/service.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1ed06a608d02bcf9606c45cadcf1ce92181c165d --- /dev/null +++ b/apps/proof-manager/src/presentationProof/services/service.spec.ts @@ -0,0 +1,475 @@ +import { HttpModule } from '@nestjs/axios'; +import { ConfigModule } from '@nestjs/config'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { Test, TestingModule } from '@nestjs/testing'; +import NatsClientService from '@src/client/nats.client'; +import { NATSServices } from '@common/constants'; +import PrismaService from '@DB/prisma.service'; +import PresentationProofsService from '@presentationProof/services/service'; +import RestClientService from '@src/client/rest.client'; +import SendProofRequest from '../entities/send-proof-request.dto'; +import MembershipCredentialDto from '../entities/membership-credential.dto'; + +describe('ConnectionsService', () => { + let service: PresentationProofsService; + let prismaService: PrismaService; + let natsClient: NatsClientService; + let restClient: RestClientService; + beforeEach(async () => { + const module: TestingModule = await Test.createTestingModule({ + imports: [ + ConfigModule, + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + }, + ]), + ], + providers: [ + PresentationProofsService, + PrismaService, + NatsClientService, + RestClientService, + ], + exports: [PrismaService], + }).compile(); + prismaService = module.get<PrismaService>(PrismaService); + service = module.get<PresentationProofsService>(PresentationProofsService); + natsClient = module.get<NatsClientService>(NatsClientService); + restClient = module.get<RestClientService>(RestClientService); + }); + + it('should be defined', () => { + expect(service).toBeDefined(); + }); + + describe('find proof presentation function', () => { + it('find proof presentation by ID', async () => { + const getAgentDetails: any = { + statusCode: 200, + message: 'Agent', + data: { + id: '15b9c7d6-8bc9-47cb-b78e-314e6c12bf16', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + agent_url: 'http://3.111.77.38:4001', + invitation_url: + 'http://3.111.77.38:4001?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiZGVhMGY1NTYtOWM4MS00OTcyLTkxZjktODhmNWQ3MDNlNDRiIiwibGFiZWwiOiJPcmdfT25lIiwicmVjaXBpZW50S2V5cyI6WyI0eFFSMVVCUXV0TGg5S2tFc1lLZ2FZNDg5VEFtMUtRTVREcnR4WEdQNnNQUiJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwMSIsInJvdXRpbmdLZXlzIjpbXX0', + public_did: 'Knwz4KG97ta6EnC5BT7uH3', + wallet_name: 'Org_One', + service_endpoint: 'http://3.111.77.38:4000', + status: true, + created_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + created_date: '2022-04-14T16:33:14.152Z', + updated_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + updated_date: '2022-04-26T06:03:32.178Z', + }, + }; + + const result: any = { + _tags: { + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + state: 'request-sent', + threadId: '34881067-b9fc-49a4-814d-dee4668b4f90', + }, + metadata: {}, + id: '117631fe-06c8-4b2c-9132-9e9f775709d8', + createdAt: '2022-04-26T08:18:19.206Z', + requestMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': '34881067-b9fc-49a4-814d-dee4668b4f90', + comment: 'Gaia-x Test', + 'request_presentations~attach': [ + { + '@id': 'libindy-request-presentation-0', + 'mime-type': 'application/json', + data: { + base64: + 'eyJuYW1lIjoiUHJvb2YgUmVxdWVzdCIsInZlcnNpb24iOiJQcm9vZiBSZXF1ZXN0Iiwibm9uY2UiOiIxMjM4NzU3NTMwMTU2IiwicmVxdWVzdGVkX2F0dHJpYnV0ZXMiOnsiYWRkaXRpb25hbFByb3AxIjp7Im5hbWVzIjpbImVtYWlsIiwiaXNzdWVyRElEIl0sInJlc3RyaWN0aW9ucyI6W3siY3JlZF9kZWZfaWQiOiJLbnd6NEtHOTd0YTZFbkM1QlQ3dUgzOjM6Q0w6MjQxOTAxOmdhaWEteCBwcmluY2lwYWwgbWVtYmVyIGNyZWRlbnRpYWwgMC4yIn1dfX0sInJlcXVlc3RlZF9wcmVkaWNhdGVzIjp7fX0=', + }, + }, + ], + }, + state: 'request-sent', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + threadId: '34881067-b9fc-49a4-814d-dee4668b4f90', + }; + jest + .spyOn(natsClient, 'getAgentByParticipantId') + .mockResolvedValueOnce(getAgentDetails); + + jest.spyOn(restClient, 'get').mockResolvedValueOnce(result); + + const res: any = await service.findProofByProofRecordId( + '117631fe-06c8-4b2c-9132-9e9f775709d8', + '662dc769-a4de-4c95-934c-f6dab8cf432c', + ); + + expect(res).toStrictEqual(result); + }); + + it('find connections by participant Id and status', async () => { + const repositoryResult: any = [ + 2, + [ + { + id: '77e98b6d-cbd0-41e4-b878-8161888ff489', + proof_record_id: '698fa724-675b-437d-bee9-b9e86a520572', + participant_id: '66398cf4-e14d-4d92-9dc4-b40a48ae97dd', + connectionId: '', + credential_def_id: + 'S2YLfsoaWyePckkhLDqn4j:3:CL:183415:gaia-x test new test', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-13T13:14:10.057Z', + updated_date: '2022-04-13T13:14:10.057Z', + }, + { + id: 'c02f4723-510a-4966-b3fa-de7ef6d8f1aa', + proof_record_id: 'ab0b3681-eccb-4c5d-9c2f-4dabc1828255', + participant_id: '66398cf4-e14d-4d92-9dc4-b40a48ae97dd', + connectionId: 'b213f9bd-3774-40dd-8f1f-085950c10c30', + credential_def_id: + 'TP6CJhQ9xuPnTPpVu1kinR:3:CL:221970:gaia-x test sprint 4', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-08T12:53:46.193Z', + updated_date: '2022-04-08T12:53:46.196Z', + }, + ], + ]; + + const result: any = [ + 2, + [ + { + id: '77e98b6d-cbd0-41e4-b878-8161888ff489', + proof_record_id: '698fa724-675b-437d-bee9-b9e86a520572', + participant_id: '66398cf4-e14d-4d92-9dc4-b40a48ae97dd', + connectionId: '', + credential_def_id: + 'S2YLfsoaWyePckkhLDqn4j:3:CL:183415:gaia-x test new test', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-13T13:14:10.057Z', + updated_date: '2022-04-13T13:14:10.057Z', + }, + { + id: 'c02f4723-510a-4966-b3fa-de7ef6d8f1aa', + proof_record_id: 'ab0b3681-eccb-4c5d-9c2f-4dabc1828255', + participant_id: '66398cf4-e14d-4d92-9dc4-b40a48ae97dd', + connectionId: 'b213f9bd-3774-40dd-8f1f-085950c10c30', + credential_def_id: + 'TP6CJhQ9xuPnTPpVu1kinR:3:CL:221970:gaia-x test sprint 4', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-08T12:53:46.193Z', + updated_date: '2022-04-08T12:53:46.196Z', + }, + ], + ]; + jest + .spyOn(prismaService, '$transaction') + .mockResolvedValueOnce(repositoryResult); + + const res: any = await service.findProofPresentation(0, 0); + + expect(res).toStrictEqual(result); + }); + }); + + describe('create presentation request function', () => { + it('create presentation request', async () => { + const serviceDto: any = [ + { + proof_record_id: '698fa724-675b-437d-bee9-b9e86a520572', + participant_id: '66398cf4-e14d-4d92-9dc4-b40a48ae97dd', + connectionId: '', + credential_def_id: + 'S2YLfsoaWyePckkhLDqn4j:3:CL:183415:gaia-x test new test', + schemaId: '', + status: 'request-sent', + created_date: '2022-04-13T13:14:10.057Z', + updated_date: '2022-04-13T13:14:10.057Z', + }, + ]; + + const repositoryResult: any = { + id: 'c7e06b9e-d796-4a54-b8f2-9746d3188c97', + proof_record_id: '117631fe-06c8-4b2c-9132-9e9f775709d8', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + credential_def_id: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-26T08:18:18.644Z', + updated_date: '2022-04-26T08:18:18.646Z', + }; + + const result: any = { + id: 'c7e06b9e-d796-4a54-b8f2-9746d3188c97', + proof_record_id: '117631fe-06c8-4b2c-9132-9e9f775709d8', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + credential_def_id: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + schemaId: '', + their_did: '', + status: 'request-sent', + created_date: '2022-04-26T08:18:18.644Z', + updated_date: '2022-04-26T08:18:18.646Z', + }; + + jest + .spyOn(prismaService.proof, 'create') + .mockResolvedValueOnce(repositoryResult); + + const res: any = await service.createPresentationRequest(serviceDto); + expect(res).toStrictEqual(result); + }); + }); + + describe('send presentation request function', () => { + it('send presentation request', async () => { + const serviceDto: SendProofRequest = { + comment: 'Gaia-x Test', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + { + attribute_name: 'issuerDID', + value: '', + condition: '', + }, + ], + credentialDefId: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + participantId: '', + proofRecordId: '', + }; + + const getAgentDetails: any = { + statusCode: 200, + message: 'Agent', + data: { + id: '15b9c7d6-8bc9-47cb-b78e-314e6c12bf16', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + agent_url: 'http://3.111.77.38:4001', + invitation_url: + 'http://3.111.77.38:4001?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiZGVhMGY1NTYtOWM4MS00OTcyLTkxZjktODhmNWQ3MDNlNDRiIiwibGFiZWwiOiJPcmdfT25lIiwicmVjaXBpZW50S2V5cyI6WyI0eFFSMVVCUXV0TGg5S2tFc1lLZ2FZNDg5VEFtMUtRTVREcnR4WEdQNnNQUiJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwMSIsInJvdXRpbmdLZXlzIjpbXX0', + public_did: 'Knwz4KG97ta6EnC5BT7uH3', + wallet_name: 'Org_One', + service_endpoint: 'http://3.111.77.38:4000', + status: true, + created_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + created_date: '2022-04-14T16:33:14.152Z', + updated_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + updated_date: '2022-04-26T06:03:32.178Z', + }, + }; + + const natsConnectionIdResponce: any = { + id: '480f4738-3d34-4b80-8160-d59e7ad91b52', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + status: 'complete', + participantDid: 'SQVgKy9CHSYN2TLRsg999E', + theirDid: '4D9hPSoWZLCkrCr57pqMqs', + theirLabel: 'Org_Two', + createdDate: '2022-04-26T08:17:45.295Z', + updatedDate: '2022-04-26T08:18:02.218Z', + isActive: false, + }; + + const result: any = { + _tags: {}, + metadata: {}, + id: '10ff9df7-c98b-48d4-b540-d5df0d91f7cd', + createdAt: '2022-04-26T10:02:59.310Z', + requestMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': 'cb5df550-36a4-4cba-8afc-3b89cedbc6bb', + comment: 'Gaia-x Test', + 'request_presentations~attach': [[Object]], + }, + state: 'request-sent', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + threadId: 'cb5df550-36a4-4cba-8afc-3b89cedbc6bb', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + theirDid: '4D9hPSoWZLCkrCr57pqMqs', + }; + + jest + .spyOn(natsClient, 'getConnectionById') + .mockResolvedValueOnce(natsConnectionIdResponce); + + jest + .spyOn(natsClient, 'getAgentByParticipantId') + .mockResolvedValueOnce(getAgentDetails); + + jest.spyOn(restClient, 'post').mockResolvedValueOnce(result); + + const res: any = await service.sendPresentationRequest(serviceDto); + + expect(res).toStrictEqual(result); + }); + }); + + describe('send out of band presentation request function', () => { + it('send out of band presentation request', async () => { + const serviceDto: SendProofRequest = { + comment: 'Gaia-x Test', + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + { + attribute_name: 'issuerDID', + value: '', + condition: '', + }, + ], + credentialDefId: + 'Knwz4KG97ta6EnC5BT7uH3:3:CL:241901:gaia-x principal member credential 0.2', + connectionId: '', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + proofRecordId: '', + }; + + const getAgentDetails: any = { + statusCode: 200, + message: 'Agent', + data: { + id: '15b9c7d6-8bc9-47cb-b78e-314e6c12bf16', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + agent_url: 'http://3.111.77.38:4001', + invitation_url: + 'http://3.111.77.38:4001?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiZGVhMGY1NTYtOWM4MS00OTcyLTkxZjktODhmNWQ3MDNlNDRiIiwibGFiZWwiOiJPcmdfT25lIiwicmVjaXBpZW50S2V5cyI6WyI0eFFSMVVCUXV0TGg5S2tFc1lLZ2FZNDg5VEFtMUtRTVREcnR4WEdQNnNQUiJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwMSIsInJvdXRpbmdLZXlzIjpbXX0', + public_did: 'Knwz4KG97ta6EnC5BT7uH3', + wallet_name: 'Org_One', + service_endpoint: 'http://3.111.77.38:4000', + status: true, + created_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + created_date: '2022-04-14T16:33:14.152Z', + updated_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + updated_date: '2022-04-26T06:03:32.178Z', + }, + }; + + const result: any = { + _tags: {}, + metadata: {}, + id: '10ff9df7-c98b-48d4-b540-d5df0d91f7cd', + createdAt: '2022-04-26T10:02:59.310Z', + requestMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': 'cb5df550-36a4-4cba-8afc-3b89cedbc6bb', + comment: 'Gaia-x Test', + 'request_presentations~attach': [[Object]], + }, + state: 'request-sent', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + threadId: 'cb5df550-36a4-4cba-8afc-3b89cedbc6bb', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + theirDid: '4D9hPSoWZLCkrCr57pqMqs', + }; + + jest + .spyOn(natsClient, 'getAgentByParticipantId') + .mockResolvedValueOnce(getAgentDetails); + + jest.spyOn(restClient, 'post').mockResolvedValueOnce(result); + + const res: any = await service.sendOutOfBandPresentationRequest( + serviceDto, + ); + + expect(res).toStrictEqual(result); + }); + }); + + describe('send membership credential presentation request function', () => { + it('send membership credential presentation request', async () => { + const serviceDto: MembershipCredentialDto = { + attributes: [ + { + attribute_name: 'email', + value: '', + condition: '', + }, + { + attribute_name: 'issuerDID', + value: '', + condition: '', + }, + ], + connectionId: '', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + schemaId: '', + }; + + const getAgentDetails: any = { + statusCode: 200, + message: 'Agent', + data: { + id: '15b9c7d6-8bc9-47cb-b78e-314e6c12bf16', + participant_id: '662dc769-a4de-4c95-934c-f6dab8cf432c', + agent_url: 'http://3.111.77.38:4001', + invitation_url: + 'http://3.111.77.38:4001?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiZGVhMGY1NTYtOWM4MS00OTcyLTkxZjktODhmNWQ3MDNlNDRiIiwibGFiZWwiOiJPcmdfT25lIiwicmVjaXBpZW50S2V5cyI6WyI0eFFSMVVCUXV0TGg5S2tFc1lLZ2FZNDg5VEFtMUtRTVREcnR4WEdQNnNQUiJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwMSIsInJvdXRpbmdLZXlzIjpbXX0', + public_did: 'Knwz4KG97ta6EnC5BT7uH3', + wallet_name: 'Org_One', + service_endpoint: 'http://3.111.77.38:4000', + status: true, + created_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + created_date: '2022-04-14T16:33:14.152Z', + updated_by: '662dc769-a4de-4c95-934c-f6dab8cf432c', + updated_date: '2022-04-26T06:03:32.178Z', + }, + }; + + const result: any = { + _tags: {}, + metadata: {}, + id: '10ff9df7-c98b-48d4-b540-d5df0d91f7cd', + createdAt: '2022-04-26T10:02:59.310Z', + requestMessage: { + '@type': 'https://didcomm.org/present-proof/1.0/request-presentation', + '@id': 'cb5df550-36a4-4cba-8afc-3b89cedbc6bb', + comment: 'Gaia-x Test', + 'request_presentations~attach': [[Object]], + }, + state: 'request-sent', + connectionId: 'b6724f85-a633-43ee-9c1c-736eaccbb6f9', + threadId: 'cb5df550-36a4-4cba-8afc-3b89cedbc6bb', + participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + theirDid: '4D9hPSoWZLCkrCr57pqMqs', + }; + + jest + .spyOn(natsClient, 'getAgentByParticipantId') + .mockResolvedValueOnce(getAgentDetails); + + jest.spyOn(restClient, 'post').mockResolvedValueOnce(result); + + const res: any = await service.sendPrincipalCredentialPresentationRequest( + serviceDto, + ); + + expect(res).toStrictEqual(result); + }); + }); +}); diff --git a/apps/proof-manager/src/presentationProof/services/service.ts b/apps/proof-manager/src/presentationProof/services/service.ts new file mode 100644 index 0000000000000000000000000000000000000000..850b7de92487b8e4bd0d051d159ea4dda8e139ea --- /dev/null +++ b/apps/proof-manager/src/presentationProof/services/service.ts @@ -0,0 +1,446 @@ +import { Injectable } from '@nestjs/common'; +import PresentationProofRepository from '@presentationProof/repository/presentationProof.respository'; +import PrismaService from '@DB/prisma.service'; +import SendProofRequest from '@presentationProof/entities/send-proof-request.dto'; +import GetPresentProofsDto from '@src/presentationProof/entities/get-present-proofs.dto'; +import { lastValueFrom, map } from 'rxjs'; +import { HttpService } from '@nestjs/axios'; +import NatsClientService from '@src/client/nats.client'; +import { Prisma } from '@prisma/client'; +import GetProofRequest from '@presentationProof/entities/get-proof-request.dto'; +import pagination from '@src/utils/pagination'; +import PresentationSubscriptionEndpointDto from '@presentationProof/entities/presentationSubscribeEndPoint.entity'; +import MembershipCredentialDto from '@presentationProof/entities/membership-credential.dto'; +import RestClientService from '@src/client/rest.client'; +import { ConfigService } from '@nestjs/config'; +import logger from '@src/utils/logger'; + +@Injectable() +export default class PresentationProofsService { + private presentationProofRepository; + + private agentURL; + + private didcommUrl; + + constructor( + private readonly natsClient: NatsClientService, + private readonly prismaService: PrismaService, + private readonly httpService: HttpService, + private readonly restClient: RestClientService, + private readonly configService: ConfigService, + ) { + this.presentationProofRepository = new PresentationProofRepository( + this.prismaService, + ); + + this.agentURL = this.configService.get('agent').agentUrl; + this.didcommUrl = this.configService.get('agent').didcommUrl; + } + + getAppUrl() { + return this.configService.get('APP_URL'); + } + + static readonly connectionStatus = { + TRUSTED: 'trusted', + }; + + async findProofByProofRecordId(proof_record_id: string) { + return this.restClient.get(`${this.agentURL}/proofs/${proof_record_id}`); + } + + async findProofPresentation( + pageSize: number, + page: number, + proofRecordId?: string | false, + connectionId?: string | false, + credentialDefId?: string | false, + schemaId?: string | false, + theirDid?: string | false, + status?: string | false, + createdDateStart?: string | false, + createdDateEnd?: string | false, + updatedDateStart?: string | false, + updatedDateEnd?: string | false, + ) { + let query: { + skip?: number; + take?: number; + cursor?: Prisma.ProofWhereUniqueInput; + where: Prisma.ProofWhereInput; + orderBy?: Prisma.ProofOrderByWithRelationInput; + } = { + where: {}, + }; + + if (status) { + const states: string[] = status.split(','); + query.where.status = { in: states }; + } + if (proofRecordId) { + query.where.proofRecordId = proofRecordId; + } + if (connectionId) { + query.where.connectionId = connectionId; + } + if (credentialDefId) { + query.where.credentialDefId = credentialDefId; + } + if (schemaId) { + query.where.schemaId = schemaId; + } + if (theirDid) { + query.where.theirDid = theirDid; + } + if (createdDateStart) { + query.where.createdDate = { gte: createdDateStart }; + } + if (createdDateEnd) { + // eslint-disable-next-line prefer-object-spread + query.where.createdDate = Object.assign({}, query.where.createdDate, { + lte: createdDateEnd, + }); + } + if (updatedDateStart) { + query.where.updatedDate = { gte: updatedDateStart }; + } + if (updatedDateEnd) { + // eslint-disable-next-line prefer-object-spread + query.where.updatedDate = Object.assign({}, query.where.updatedDate, { + lte: updatedDateEnd, + }); + } + + query = { ...query, ...pagination(pageSize, page) }; + return this.presentationProofRepository.findProofPresentation(query); + } + + async createPresentationRequest(sendProofRequest: SendProofRequest) { + const query: Prisma.ProofCreateInput = { + proofRecordId: sendProofRequest.proofRecordId || '', + connectionId: sendProofRequest.connectionId, + status: sendProofRequest.status, + }; + return this.presentationProofRepository.createPresentationProof(query); + } + + async getConnectionByID(connectionID: string) { + const connection = await this.natsClient.getConnectionById(connectionID); + + return connection; + } + + async sendPresentationRequest(sendProofRequest: SendProofRequest) { + const getPayloadRes = + PresentationProofsService.createCommonPresentationRequestPaylod( + sendProofRequest, + ); + + const proofRequestPayload = { + comment: getPayloadRes.comment, + connectionId: sendProofRequest.connectionId, + // trace: true, + autoAcceptProof: 'always', + proofRequest: { + name: 'Proof Request', + version: '1.0', + // nonce: getPayloadRes.nonce.toString(), + requested_attributes: getPayloadRes.requested_attributes, + requested_predicates: getPayloadRes.requested_predicates, + ver: '1.0', + }, + }; + + logger.info( + `proofRequestPayload for proof request ${JSON.stringify( + proofRequestPayload, + )}`, + ); + + let responseData = null; + + const getConnection = await this.getConnectionByID( + sendProofRequest.connectionId || '', + ); + + if ( + getConnection?.status !== + PresentationProofsService.connectionStatus.TRUSTED + ) { + responseData = { + message: 'Connection is not trusted', + }; + return responseData; + } + + responseData = await this.restClient.post( + `${this.agentURL}/proofs/request-proof`, + proofRequestPayload, + ); + + responseData.theirDid = getConnection.theirDid; + return responseData; + } + + static createCommonPresentationRequestPaylod( + sendProofRequest: SendProofRequest, + ) { + const requestedAttributes: { + [key: string]: { + names: string[]; + restrictions: { + schema_id?: string; + cred_def_id?: string; + }[]; + }; + } = {}; + const requestedPredicates: { + [key: string]: Record<string, Array<object> | number>; + } = {}; + const generateNonce: number = Math.floor(Math.random() * 10000000000000); + const comment = sendProofRequest.comment ? sendProofRequest.comment : ''; + + for (let i = 0; i < sendProofRequest.attributes.length; i += 1) { + const attribute = sendProofRequest.attributes[i]; + const key = `${attribute.schemaId}_${attribute.credentialDefId}`; + requestedAttributes[key] = requestedAttributes[key] || { + names: [], + restrictions: [], + }; + + if (attribute.schemaId) { + requestedAttributes[key].restrictions[0] = requestedAttributes[key].restrictions[0] || {}; + requestedAttributes[key].restrictions[0].schema_id = attribute.schemaId; + } + + if (attribute.credentialDefId) { + requestedAttributes[key].restrictions[0] = requestedAttributes[key].restrictions[0] || {}; + requestedAttributes[key].restrictions[0].cred_def_id = attribute.credentialDefId; + } + + if (attribute.attributeName) { + requestedAttributes[key].names.push(attribute.attributeName); + } + } + + const payload = { + comment, + nonce: generateNonce.toString(), + requested_attributes: Object.fromEntries( + Object.entries(requestedAttributes).map(([, value], index) => [ + `additionalProp${index + 1}`, + value, + ]), + ), + requested_predicates: requestedPredicates, + }; + return payload; + } + + async sendOutOfBandPresentationRequest(sendProofRequest: SendProofRequest) { + const getPayloadRes = + PresentationProofsService.createCommonPresentationRequestPaylod( + sendProofRequest, + ); + + const proofRequestPayload = { + comment: getPayloadRes.comment, + autoAcceptProof: 'always', + proofRequest: { + name: 'Out Of Band Proof Request', + version: '1.0', + nonce: getPayloadRes.nonce.toString(), + requested_attributes: getPayloadRes.requested_attributes, + requested_predicates: getPayloadRes.requested_predicates, + ver: '1.0', + }, + }; + let responseData = null; + + responseData = await this.restClient.post( + `${this.agentURL}/proofs/request-outofband-proof`, + proofRequestPayload, + ); + + const shortRow = await this.presentationProofRepository.createShortUrl( + responseData.message, + ); + const appUrl = this.getAppUrl(); + responseData.messageShort = `${appUrl}/v1/url/${shortRow.id}`; + + return responseData; + } + + async sendPrincipalCredentialPresentationRequest( + sendProofRequest: MembershipCredentialDto, + ) { + const requestedAttributes: { + [key: string]: Record<string, Array<{ schema_id: string }>>; + } = {}; + const requestedPredicates: { + [key: string]: Record<string, Array<object> | number>; + } = {}; + const generateNonce: number = Math.floor(Math.random() * 10000000000000); + const comment = ''; + for ( + let index = 0; + index < sendProofRequest.attributes.length; + index += 1 + ) { + const attributeElement: any = + sendProofRequest.attributes[index].attributeName; + const attributeReferent = `additionalProp${index + 1}`; + const keys = Object.keys(requestedAttributes); + if (keys.length > 0) { + keys.forEach((attr, i) => { + if ( + requestedAttributes[attr].restrictions[i].schema_id === + sendProofRequest.attributes[index].schemaId + ) { + requestedAttributes[attr].names.push(attributeElement); + } else if (keys.length === i + 1) { + requestedAttributes[attributeReferent] = { + names: [attributeElement], + restrictions: [ + { + schema_id: sendProofRequest.attributes[index].schemaId || '', + }, + ], + }; + } + }); + } else { + requestedAttributes[attributeReferent] = { + names: [attributeElement], + restrictions: [ + { + schema_id: sendProofRequest.attributes[index].schemaId || '', + }, + ], + }; + } + } + + const proofRequestPayload = { + comment, + connectionId: sendProofRequest.connectionId, + trace: true, + proofRequest: { + name: 'Membership Credential Proof Request', + version: '1.0', + nonce: generateNonce.toString(), + requested_attributes: requestedAttributes, + requested_predicates: requestedPredicates, + }, + }; + + let responseData = null; + + responseData = await this.restClient.post( + `${this.agentURL}/proofs/request-proof`, + proofRequestPayload, + ); + + return responseData; + } + + async updatePresentationStatus(getProofRequest: GetProofRequest) { + const getRes = + await this.presentationProofRepository.updatePresentationStatus({ + where: { proofRecordId: getProofRequest.id }, + data: { + status: getProofRequest.state, + updatedDate: new Date(), + }, + }); + return getRes; + } + + async acceptPresentation(proof_record_id: string) { + return lastValueFrom( + this.httpService + .post(`${this.agentURL}/proofs/${proof_record_id}/accept-presentation`) + .pipe(map((response) => response.data)), + ); + } + + async acceptProofRequest(proofRecordId: string) { + return lastValueFrom( + this.httpService + .post(`${this.agentURL}/proofs/${proofRecordId}/accept-request`) + .pipe(map((response) => response.data)), + ); + } + + async deleteProofRequest(proofRecordId: string) { + const response = lastValueFrom( + this.httpService + .delete(`${this.agentURL}/proofs/${proofRecordId}`) + .pipe(map((response) => response.data)), + ); + + await this.presentationProofRepository.deleteProofRequest(proofRecordId); + + return response; + } + + async declineProofRequest(proofRecordId: string) { + return lastValueFrom( + this.httpService + .post(`${this.didcommUrl}/v1/agent/proofs/declineRequest`, { + data: [proofRecordId], + }) + .pipe(map((response) => response.data)), + ); + } + + async getAllProofRequest(threadId: string) { + const url = threadId + ? `${this.agentURL}/proofs/?threadId=${threadId}` + : `${this.agentURL}/proofs/`; + return lastValueFrom( + this.httpService.get(url).pipe(map((response) => response.data)), + ); + } + + async getSchemaById(schemaId: string) { + const url = `${this.agentURL}/schemas/${schemaId}`; + return lastValueFrom( + this.httpService.get(url).pipe(map((response) => response.data)), + ); + } + + async getCredentialDefinitionsById(credentialDefinitionsId: string) { + const url = `${this.agentURL}/credential-definitions/${credentialDefinitionsId}`; + return lastValueFrom( + this.httpService.get(url).pipe(map((response) => response.data)), + ); + } + + publishPresentationSubscriberEndpoint( + data: PresentationSubscriptionEndpointDto, + ) { + this.natsClient.publishPresentation(data); + } + + getCredentialsTypeDetails(type: string) { + return this.natsClient.getCredentialsTypeDetails(type); + } + + makeConnectionTrusted(connectionId: string) { + return this.natsClient.makeConnectionTrusted(connectionId); + } + + async getPresentProofs(data: GetPresentProofsDto) { + return this.presentationProofRepository.findProofPresentation({ + where: { + connectionId: data.connectionId, + }, + }); + } + + async findUrlByShortUrlId(id: string) { + return this.presentationProofRepository.getShortUrl(id); + } +} diff --git a/apps/proof-manager/src/prisma/prisma.module.spec.ts b/apps/proof-manager/src/prisma/prisma.module.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e557fe14e4a4d0a516b645ce88cfe11e613eb8f6 --- /dev/null +++ b/apps/proof-manager/src/prisma/prisma.module.spec.ts @@ -0,0 +1,7 @@ +import PrismaModule from './prisma.module'; + +describe('Check if the module is working', () => { + it('should be defined', () => { + expect(PrismaModule).toBeDefined(); + }); +}); diff --git a/apps/proof-manager/src/prisma/prisma.module.ts b/apps/proof-manager/src/prisma/prisma.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..a120dadd2a18fbdeb7cfc5d8706c9447bdc66c8d --- /dev/null +++ b/apps/proof-manager/src/prisma/prisma.module.ts @@ -0,0 +1,11 @@ +import { Module } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import PrismaService from '@DB/prisma.service'; + +@Module({ + imports: [ConfigModule], + controllers: [], + providers: [PrismaService], + exports: [PrismaService], +}) +export default class PrismaModule {} diff --git a/apps/proof-manager/src/prisma/prisma.service.ts b/apps/proof-manager/src/prisma/prisma.service.ts new file mode 100644 index 0000000000000000000000000000000000000000..7d885d9af71da2594144d53712047afd50c53f05 --- /dev/null +++ b/apps/proof-manager/src/prisma/prisma.service.ts @@ -0,0 +1,28 @@ +import { Injectable, OnModuleInit, OnModuleDestroy } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { PrismaClient } from '@prisma/client'; + +@Injectable() +export default class PrismaService + extends PrismaClient + implements OnModuleInit, OnModuleDestroy +{ + constructor(private configService: ConfigService) { + super(); + } + + async onModuleInit() { + const prisma = new PrismaClient({ + datasources: { + db: { + url: this.configService.get('DATABASE_URL'), + }, + }, + }); + await prisma.$connect(); + } + + async onModuleDestroy() { + await this.$disconnect(); + } +} diff --git a/apps/proof-manager/src/prisma/schema.prisma b/apps/proof-manager/src/prisma/schema.prisma new file mode 100644 index 0000000000000000000000000000000000000000..2e5855f9e389c7efad0f93f5e54f7966af565aab --- /dev/null +++ b/apps/proof-manager/src/prisma/schema.prisma @@ -0,0 +1,26 @@ + +generator client { + provider = "prisma-client-js" +} + +datasource db { + provider = "postgresql" + url = env("DATABASE_URL") +} + +model Proof { + id String @id @default(uuid()) + proofRecordId String @unique @map("proof_record_id") + connectionId String @default("") @map("connection_id") + credentialDefId String @default("") @map("credential_def_id") + schemaId String @default("") @map("schema_id") + theirDid String @default("") @map("their_did") + status String @default("") + createdDate DateTime @default(now()) @map("created_date") + updatedDate DateTime @default(now()) @map("updated_date") +} + +model ShortUrl { + id String @id @default(uuid()) + originalUrl String +} diff --git a/apps/proof-manager/src/utils/exceptionsFilter.ts b/apps/proof-manager/src/utils/exceptionsFilter.ts new file mode 100644 index 0000000000000000000000000000000000000000..647308cb01b41a9f0bc71c1dc1c9260ddd30b333 --- /dev/null +++ b/apps/proof-manager/src/utils/exceptionsFilter.ts @@ -0,0 +1,86 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus, + Logger, +} from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; +import { Request } from 'express'; +import { Prisma } from '@prisma/client'; + +const { PrismaClientKnownRequestError, PrismaClientValidationError } = Prisma; + +@Catch() +export default class AllExceptionsFilter implements ExceptionFilter { + constructor(private readonly httpAdapterHost: HttpAdapterHost) {} + + catch(exception: any, host: ArgumentsHost): void { + const { httpAdapter } = this.httpAdapterHost; + + const ctx = host.switchToHttp(); + const request = ctx.getRequest<Request>(); + + let httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + let message = ''; + switch (exception.constructor) { + case HttpException: + httpStatus = (exception as HttpException).getStatus(); + message = exception?.message || 'Internal server error'; + break; + case PrismaClientKnownRequestError: + switch (exception.code) { + case 'P2002': // Unique constraint failed on the {constraint} + case 'P2000': // The provided value for the column is too long for the column's type. Column: {column_name} + case 'P2001': // The record searched for in the where condition ({model_name}.{argument_name} = {argument_value}) does not exist + case 'P2005': // The value {field_value} stored in the database for the field {field_name} is invalid for the field's type + case 'P2006': // The provided value {field_value} for {model_name} field {field_name} is not valid + case 'P2010': // Raw query failed. Code: {code}. Message: {message} + case 'P2011': // Null constraint violation on the {constraint} + case 'P2017': // The records for relation {relation_name} between the {parent_name} and {child_name} models are not connected. + case 'P2021': // The table {table} does not exist in the current database. + case 'P2022': // The column {column} does not exist in the current database. + httpStatus = HttpStatus.BAD_REQUEST; + message = exception?.message; + break; + case 'P2018': // The required connected records were not found. {details} + case 'P2025': // An operation failed because it depends on one or more records that were required but not found. {cause} + case 'P2015': // A related record could not be found. {details} + httpStatus = HttpStatus.NOT_FOUND; + message = exception?.message; + break; + default: + httpStatus = HttpStatus.INTERNAL_SERVER_ERROR; + message = exception?.message || 'Internal server error'; + } + break; + case PrismaClientValidationError: + httpStatus = HttpStatus.BAD_REQUEST; + message = exception?.message; + break; + default: + httpStatus = + exception.response?.status || HttpStatus.INTERNAL_SERVER_ERROR; + message = + exception.response?.data?.message || + exception?.message || + 'Internal server error'; + } + + Logger.error( + 'Exception Filter :', + message, + (exception as any).stack, + `${request.method} ${request.url}`, + ); + + const responseBody = { + statusCode: httpStatus, + timestamp: new Date().toISOString(), + message, + }; + + httpAdapter.reply(ctx.getResponse(), responseBody, httpStatus); + } +} diff --git a/apps/proof-manager/src/utils/logger.spec.ts b/apps/proof-manager/src/utils/logger.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..e6aed70b3861a170b74f5255b68c742cb8a5b091 --- /dev/null +++ b/apps/proof-manager/src/utils/logger.spec.ts @@ -0,0 +1,15 @@ +// import * as fs from 'fs'; + +describe('Logger', () => { + // beforeEach(() => { + // jest.mock('fs'); + // }); + it('should create a directory if not exists', async () => { + // jest.spyOn(fs, 'existsSync').mockImplementation(() => false); + // jest.spyOn(fs, 'mkdirSync').mockImplementation(() => 'mocked'); + const logger = await import('./logger'); + expect(logger).toBeDefined(); + // expect(fs.existsSync).toHaveBeenCalled(); + // expect(fs.mkdirSync).toHaveBeenCalled(); + }); +}); diff --git a/apps/proof-manager/src/utils/logger.ts b/apps/proof-manager/src/utils/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..be9e4f5ad723015d32984294b3a63d961aa113f9 --- /dev/null +++ b/apps/proof-manager/src/utils/logger.ts @@ -0,0 +1,42 @@ +import { existsSync, mkdirSync } from 'fs'; +import { Logger } from 'winston'; +import ecsFormat = require('@elastic/ecs-winston-format'); + +import winston = require('winston'); +// import { ElasticsearchTransport } from 'winston-elasticsearch'; +import { LoggerConfig } from '@common/constants'; + +if (!existsSync(LoggerConfig.lOG_DIR)) { + mkdirSync(LoggerConfig.lOG_DIR); +} + +// const esTransportOpts = { +// clientOpts: { node: process.env.ECSURL }, +// }; + +// const esTransport = new ElasticsearchTransport(esTransportOpts); + +// esTransport.on('error', (error) => { +// console.error(error); +// }); + +const logger: Logger = winston.createLogger({ + format: ecsFormat({ convertReqRes: true }), + + transports: [ + new winston.transports.Console(), + + // new winston.transports.File({ + // // path to log file + // filename: LoggerConfig.FILE_PATH, + // }), + // // Path to Elasticsearch + // esTransport, + ], +}); + +logger.on('error', (error) => { + console.error('Error in logger caught', error); +}); + +export default logger; diff --git a/apps/proof-manager/src/utils/pagination.spec.ts b/apps/proof-manager/src/utils/pagination.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..a75d3bbe936ea957448f53237a8d2dc2329ab038 --- /dev/null +++ b/apps/proof-manager/src/utils/pagination.spec.ts @@ -0,0 +1,17 @@ +import pagination from './pagination'; + +describe('Check if the module is working', () => { + it('should be defined', () => { + expect(pagination).toBeDefined(); + }); + + it('should be return default value', () => { + const result = { skip: 0, take: 10 }; + expect(pagination(0, 0)).toStrictEqual(result); + }); + + it('should be return next page value', () => { + const result = { skip: 0, take: 10 }; + expect(pagination(10, 0)).toStrictEqual(result); + }); +}); diff --git a/apps/proof-manager/src/utils/pagination.ts b/apps/proof-manager/src/utils/pagination.ts new file mode 100644 index 0000000000000000000000000000000000000000..953e8fc5941366794cf0fafa9cc4f32c8847d781 --- /dev/null +++ b/apps/proof-manager/src/utils/pagination.ts @@ -0,0 +1,16 @@ +const pagination = (pageSize: number, page: number) => { + const query: { + skip?: number; + take?: number; + } = {}; + if (pageSize && (page || page === 0)) { + query.skip = page * pageSize; + query.take = pageSize; + } else { + query.skip = 0; + query.take = 10; + } + return query; +}; + +export default pagination; diff --git a/apps/proof-manager/start.sh b/apps/proof-manager/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..5c6b740ec5f3ab0374a1d669cf98cc4ffb8c0c90 --- /dev/null +++ b/apps/proof-manager/start.sh @@ -0,0 +1 @@ +./node_modules/.bin/prisma db push --schema=./prisma/schema.prisma && node dist/src/main.js diff --git a/apps/proof-manager/swagger.json b/apps/proof-manager/swagger.json new file mode 100644 index 0000000000000000000000000000000000000000..2e4faaff64fefb89767a88f78b5d276cfedd84d6 --- /dev/null +++ b/apps/proof-manager/swagger.json @@ -0,0 +1,1003 @@ +{ + "openapi": "3.0.0", + "paths": { + "/v1/health": { + "get": { + "operationId": "HealthController_getHealth", + "summary": "Health check", + "description": "This call provides the capability to check the service is working and up. The call returns 200 Status Code and current server time in json body", + "parameters": [], + "responses": { + "200": { + "description": "Service is up and running.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Service is up and running.": { + "value": { + "statusCode": 200, + "message": "Thu Jan 01 1970 00:00:00 GMT+0000 (Coordinated Universal Time)" + } + } + } + } + } + } + } + } + }, + "/v1/find-proof-presentation": { + "get": { + "operationId": "PresentationProofsController_findProofPresentation", + "summary": "Fetch list of proof requests", + "description": "This call provides the capability to search proofs (Credential Presentation) by using pagination and filter parameters. This call returns a list of proof requests (Proof Presentations) and overall count of records. Filter supports following parameters: page, pageSize, proofRecordId, connectionId, credentialDefId, schemaId, theirDid, status, createdDateStart, createdDateEnd, updatedDateStart, updatedDateEnd", + "parameters": [ + { + "name": "updatedDateEnd", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "updatedDateStart", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "createdDateEnd", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "createdDateStart", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "status", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "theirDid", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "schemaId", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "credentialDefId", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "connectionId", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "proofRecordId", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "pageSize", + "required": false, + "in": "query", + "schema": {} + }, + { + "name": "page", + "required": false, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Proof presentations fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Proof presentations fetched successfully": { + "value": { + "statusCode": 200, + "message": "Proof presentations fetched successfully", + "data": { + "count": 1, + "records": [ + { + "id": "30774a7e", + "proofRecordId": "9b4ab922", + "connectionId": "", + "credentialDefId": "", + "schemaId": "", + "theirDid": "", + "status": "request-sent", + "createdDate": "1970-01-01T00:00:00.642Z", + "updatedDate": "1970-01-01T00:00:00.642Z" + } + ] + } + } + } + } + } + } + }, + "404": { + "description": "No Data found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/find-by-presentation-id": { + "get": { + "operationId": "PresentationProofsController_findProofByProofRecordId", + "summary": "Fetch proof presentation by proofRequestId", + "description": "This call provides the capability to get proof request by providing proofRecordId (presentationId). The call returns an information about proof request and also (if user accepted proof request) information about requested user credentials", + "parameters": [ + { + "name": "proofRecordId", + "required": true, + "in": "query", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Proof presentation fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Proof presentation fetched successfully": { + "value": { + "statusCode": 200, + "message": "Proof presentation fetched successfully", + "data": { + "state": "request-sent", + "presentations": [ + { + "schemaId": "", + "credDefId": "", + "revRegId": "", + "timestamp": "", + "credentialSubject": {} + } + ] + } + } + } + } + } + } + }, + "400": { + "description": "Find presentation request required following attributes: ( proofRecordId )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Find presentation request required following attributes: ( proofRecordId )": { + "value": { + "statusCode": 400, + "message": "Find presentation request required following attributes: ( proofRecordId )" + } + } + } + } + } + }, + "404": { + "description": "No Data found", + "content": { + "application/json": { + "schema": {}, + "examples": { + "No Data found": { + "value": { + "statusCode": 404, + "message": "No Data found" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/send-presentation-request": { + "post": { + "operationId": "PresentationProofsController_sendPresentationRequest", + "summary": "Send presentation request", + "description": "This call provides the capability to create a new presentation request bound to existing connection. It is mandatory to provide a schema for every requested attribute and attribute name in the body information of the connection. The call returns an information about proof request (proofRecordId, connectionId, credentialDefId, schemaId, theirDid, status, createdDate, updatedDate, threadId)", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendProofRequest" + } + } + } + }, + "responses": { + "201": { + "description": "Presentation request sent successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Presentation request sent successfully": { + "value": { + "statusCode": 201, + "message": "Presentation request sent successfully", + "data": { + "id": "a7ccc2f7", + "proofRecordId": "fb556018-1907-47c1-a6d6-c7cbca7d23b4", + "connectionId": "a9371aed-67ed-4448-ace0-d773e7b30e1c", + "credentialDefId": "", + "schemaId": "", + "theirDid": "", + "status": "request-sent", + "createdDate": "2023-03-02T13:02:43.656Z", + "updatedDate": "2023-03-02T13:02:43.656Z", + "threadId": "75045c1b-f0ef-4f10-831e-4e4f301333af" + } + } + } + } + } + } + }, + "400": { + "description": "Find presentation request required following attributes: ( proofRecordId )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Find presentation request required following attributes: ( proofRecordId )": { + "value": { + "statusCode": 400, + "message": "Find presentation request required following attributes: ( proofRecordId )" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/send-out-of-band-presentation-request": { + "post": { + "operationId": "PresentationProofsController_sendOutOfBandPresentationRequest", + "summary": "Send out of band presentation request", + "description": "This call provides the capability to create a new presentation request not bound to any proposal or existing connection. The call returns an information about presentation request", + "parameters": [], + "requestBody": { + "required": true, + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SendProofRequestBody" + } + } + } + }, + "responses": { + "201": { + "description": "Presentation request sent successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Presentation request sent successfully": { + "value": { + "statusCode": 201, + "message": "Presentation request sent successfully", + "data": { + "id": "d6667caa", + "proofRecordId": "600dd422", + "connectionId": "", + "credentialDefId": "", + "schemaId": "", + "theirDid": "", + "status": "request-sent", + "createdDate": "1970-01-01T00:00:00.934Z", + "updatedDate": "1970-01-01T00:00:00.934Z", + "presentationMessage": "https://serviceEndpointUrl.com:443/ocm/didcomm/?d_m=eyJAdHlwZSI6I", + "presentationMessageShort": "https://selfUrl.com/v1/url/1234abcd" + } + } + } + } + } + } + }, + "400": { + "description": "Send presentation request required following attributes( attributes, schemaId or credentialDefinitionId )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Send presentation request required following attributes( attributes, schemaId or credentialDefinitionId )": { + "value": { + "statusCode": 400, + "message": "Send presentation request required following attributes( attributes, schemaId or credentialDefinitionId )" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/out-of-band-proof": { + "post": { + "operationId": "PresentationProofsController_outOfBandProof", + "summary": "Send out of band proof", + "description": "This call provides the capability to create a new presentation request not bound to any proposal or existing connection but it creates just on type defined in attestation manager (type is bound to schema id there). The call returns an information about presentation request", + "parameters": [ + { + "name": "type", + "required": true, + "in": "query", + "schema": {} + } + ], + "responses": { + "201": { + "description": "Presentation request sent successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Presentation request sent successfully": { + "value": { + "statusCode": 201, + "message": "Presentation request sent successfully", + "data": { + "id": "60f38aa4", + "proofRecordId": "852ee278", + "connectionId": "", + "credentialDefId": "", + "schemaId": "", + "theirDid": "", + "status": "request-sent", + "createdDate": "2023-03-02T13:12:38.934Z", + "updatedDate": "2023-03-02T13:12:38.934Z", + "presentationMessage": "https://serviceEndpointUrl.com:443/ocm/didcomm/?d_m=eyJAdHlwZSI6Imh0dHBzOi8", + "presentationMessageShort": "https://selfUrl/v1/url/1234abcd" + } + } + } + } + } + } + }, + "400": { + "description": "Could not get schema details. please try again.", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Could not get schema details. please try again.": { + "value": { + "statusCode": 400, + "message": "Could not get schema details. please try again." + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/accept-presentation/{proofRecordId}": { + "post": { + "operationId": "PresentationProofsController_acceptPresentation", + "summary": "Accept presentation request by proofRecordId", + "description": "Accept a presentation as prover (by sending a presentation acknowledgement message) to the connection associated with the proof record.", + "parameters": [ + { + "name": "proofRecordId", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "Presentation accepted successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Presentation accepted successfully": { + "value": {} + } + } + } + } + }, + "400": { + "description": "Accept presentation request required following attributes ( proof_record_id )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Accept presentation request required following attributes ( proof_record_id )": { + "value": { + "statusCode": 400, + "message": "Accept presentation request required following attributes ( proof_record_id )" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Something went wrong: Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/accept-proof-request/{proofRecordId}": { + "post": { + "operationId": "PresentationProofsController_acceptProofRequest", + "summary": "Accept proof request by proofRecordId", + "description": "Accept a presentation request as prover (by sending a presentation message) to the connection associated with the proof record.", + "parameters": [], + "responses": { + "200": { + "description": "Request accepted successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Request accepted successfully": { + "value": { + "statusCode": 200, + "message": "Request accepted successfully", + "data": { + "_tags": { + "threadId": "6b5c57b3", + "state": "request-received", + "connectionId": "653b8cdc" + }, + "metadata": {}, + "id": "19c5269f", + "createdAt": "1970-01-01T00:00:00.498Z", + "requestMessage": { + "@type": "https://didcomm.org/present-proof/1.0/request-presentation", + "@id": "6b5c57b3", + "comment": "Proof Presenation", + "request_presentations~attach": [ + { + "@id": "libindy-request-presentation-0", + "mime-type": "application/json", + "data": { + "base64": "eyJuYW=" + } + } + ] + }, + "state": "presentation-sent", + "connectionId": "653b8cdc", + "threadId": "6b5c57b3", + "presentationMessage": { + "@type": "https://didcomm.org/present-proof/1.0/presentation", + "@id": "c1089096", + "presentations~attach": [ + { + "@id": "libindy-presentation-0", + "mime-type": "application/json", + "data": { + "base64": "eyJwcm9vZ" + } + } + ], + "~thread": { + "thid": "6b5c57b3" + } + } + } + } + } + } + } + } + }, + "400": { + "description": "Accept proof request required following attributes ( proofRecordId )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Accept proof request required following attributes ( proofRecordId )": { + "value": { + "statusCode": 400, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Accept proof request required following attributes ( proofRecordId )" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Something went wrong: Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/delete-proof-request/{proofRecordId}": { + "post": { + "operationId": "PresentationProofsController_deleteProofRequest", + "summary": "Delete proof request by proofRecordId", + "description": "Deletes a proofRecord in the proof repository.", + "parameters": [], + "responses": { + "200": { + "description": "Delete proof request", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Delete proof request": { + "value": { + "statusCode": 200, + "message": "Proof request deleted successfully", + "data": "" + } + } + } + } + } + }, + "400": { + "description": "Delete proof request required following attributes ( proofRecordId )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Delete proof request required following attributes ( proofRecordId )": { + "value": { + "statusCode": 400, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Delete proof request required following attributes ( proofRecordId )" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Something went wrong: Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/decline-proof-request/{proofRecordId}": { + "post": { + "operationId": "PresentationProofsController_declineProofRequest", + "summary": "Decline proof request by proofRecordId", + "description": "Decline proof request as prover (by sending a presentation message) to the connection associated with the proof record.", + "parameters": [], + "responses": { + "200": { + "description": "Request declined successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Request declined successfully": { + "value": { + "statusCode": 200, + "message": "Request declined successfully", + "data": { + "_tags": { + "threadId": "6b5c57b3", + "state": "request-received", + "connectionId": "653b8cdc" + }, + "metadata": {}, + "id": "19c5269f", + "createdAt": "1970-01-01T00:00:00.498Z", + "requestMessage": { + "@type": "https://didcomm.org/present-proof/1.0/request-presentation", + "@id": "6b5c57b3", + "comment": "Proof Presenation", + "request_presentations~attach": [ + { + "@id": "libindy-request-presentation-0", + "mime-type": "application/json", + "data": { + "base64": "eyJuYW=" + } + } + ] + }, + "state": "presentation-sent", + "connectionId": "653b8cdc", + "threadId": "6b5c57b3", + "presentationMessage": { + "@type": "https://didcomm.org/present-proof/1.0/presentation", + "@id": "c1089096", + "presentations~attach": [ + { + "@id": "libindy-presentation-0", + "mime-type": "application/json", + "data": { + "base64": "eyJwcm9vZ" + } + } + ], + "~thread": { + "thid": "6b5c57b3" + } + } + } + } + } + } + } + } + }, + "400": { + "description": "Accept proof request required following attributes ( proofRecordId )", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Accept proof request required following attributes ( proofRecordId )": { + "value": { + "statusCode": 400, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Accept proof request required following attributes ( proofRecordId )" + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Something went wrong: Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/agent-proofs": { + "get": { + "operationId": "PresentationProofsController_getAllProofRequest", + "summary": "Fetch all proofs directly from the agent", + "description": "This call provides the capability to get all proof records directly from agent. Pagination and sorting does not implemented in that version of Aries Framework Javascript", + "parameters": [ + { + "name": "threadId", + "required": false, + "in": "query", + "schema": {} + } + ], + "responses": { + "200": { + "description": "Proofs fetched successfully", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Proofs fetched successfully": { + "value": { + "statusCode": 200, + "message": "Proofs fetched successfully", + "data": [ + { + "_tags": { + "threadId": "75045c1b", + "state": "request-received", + "connectionId": "e6d30380" + }, + "metadata": {}, + "id": "6f776996", + "createdAt": "1970-01-01T00:00:00.640Z", + "requestMessage": { + "@type": "https://didcomm.org/present-proof/1.0/request-presentation", + "@id": "75045c1b", + "comment": "Proof Presenation", + "request_presentations~attach": [ + { + "@id": "libindy-request-presentation-0", + "mime-type": "application/json", + "data": { + "base64": "eyJ" + } + } + ] + }, + "state": "request-received", + "connectionId": "e6d30380", + "threadId": "75045c1b" + }, + { + "_tags": { + "connectionId": "a9371aed", + "state": "request-sent", + "threadId": "75045c1b" + }, + "metadata": {}, + "id": "fb556018", + "createdAt": "1970-01-01T00:00:00.568Z", + "requestMessage": { + "@type": "https://didcomm.org/present-proof/1.0/request-presentation", + "@id": "75045c1b", + "comment": "Proof Presenation", + "request_presentations~attach": [ + { + "@id": "libindy-request-presentation-0", + "mime-type": "application/json", + "data": { + "base64": "eyJ" + } + } + ] + }, + "state": "request-sent", + "connectionId": "a9371aed", + "threadId": "75045c1b" + } + ] + } + } + } + } + } + }, + "500": { + "description": "Internal Server Error", + "content": { + "application/json": { + "schema": {}, + "examples": { + "Internal Server Error": { + "value": { + "statusCode": 500, + "timestamp": "1970-01-01T00:00:00.891Z", + "message": "Something went wrong: Lorem Ipsum" + } + } + } + } + } + } + }, + "tags": [ + "Proofs" + ] + } + }, + "/v1/url/{id}": { + "get": { + "operationId": "PresentationProofsController_redirectToOriginalUrl", + "summary": "Get full url from short url id", + "description": "Get full url from short url id", + "parameters": [ + { + "name": "id", + "required": true, + "in": "path", + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "description": "" + } + }, + "tags": [ + "Proofs" + ] + } + } + }, + "info": { + "title": "Gaia-x Proof Manager API", + "description": "API documentation for GAIA-X Proof Manager", + "version": "1.0", + "contact": {} + }, + "tags": [], + "servers": [], + "components": { + "schemas": { + "SendProofRequest": { + "type": "object", + "properties": { + "comment": { + "type": "string", + "example": "comments" + }, + "connectionId": { + "type": "string", + "example": "3fa85f64-5717-4562-b3fc-2c963f66afa6" + }, + "attributes": { + "example": [ + { + "attributeName": "attributeName", + "schemaId": "schemaId", + "credentialDefId": "credentialDefId" + } + ], + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "comment", + "connectionId", + "attributes" + ] + }, + "SendProofRequestBody": { + "type": "object", + "properties": { + "comment": { + "type": "string", + "example": "comments" + }, + "schemaId": { + "type": "string", + "example": "WgWxqztrNooG92RXvxSTWv:3:CL:20:tag" + }, + "options": { + "type": "object", + "example": { + "type": "Aries1.0", + "credentialDefinitionId": "credentialDefinitionId" + } + }, + "attributes": { + "example": [ + "attributeName" + ], + "type": "array", + "items": { + "type": "string" + } + } + }, + "required": [ + "comment", + "schemaId", + "options", + "attributes" + ] + } + } + } +} diff --git a/apps/proof-manager/test/app.e2e-spec.ts b/apps/proof-manager/test/app.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c9e926283795349068b9069749065c5e19af2fb --- /dev/null +++ b/apps/proof-manager/test/app.e2e-spec.ts @@ -0,0 +1,20 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import AppModule from '../src/app.module'; + +describe('AppController (e2e)', () => { + let app: INestApplication; + + beforeEach(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + + it('/ (GET)', () => + request(app.getHttpServer()).get('/').expect(200).expect('Hello World!')); +}); diff --git a/apps/proof-manager/test/jest-e2e.json b/apps/proof-manager/test/jest-e2e.json new file mode 100644 index 0000000000000000000000000000000000000000..e9d912f3e3cefc18505d3cd19b3a5a9f567f5de0 --- /dev/null +++ b/apps/proof-manager/test/jest-e2e.json @@ -0,0 +1,9 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + } +} diff --git a/apps/proof-manager/tsconfig.build.json b/apps/proof-manager/tsconfig.build.json new file mode 100644 index 0000000000000000000000000000000000000000..64f86c6bd2bb30e3d22e752295eb7c7923fc191e --- /dev/null +++ b/apps/proof-manager/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts"] +} diff --git a/apps/proof-manager/tsconfig.json b/apps/proof-manager/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..d577f952f1e34dfd8de5463e4c4a36d6699660d3 --- /dev/null +++ b/apps/proof-manager/tsconfig.json @@ -0,0 +1,35 @@ +{ + "compilerOptions": { + "target": "es6", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "module": "commonjs", + "declaration": true, + "removeComments": true, + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "strict": true, + "skipLibCheck": true, + "baseUrl": "./", + "incremental": true, + "strictPropertyInitialization": false, + "sourceMap": true, + "strictNullChecks": true, + "paths": { + "@src/*": ["src/*"], + "@config/*": ["config/*"], + "@utils/*" :["src/utils/*"], + "@common/*":["src/common/*"], + "@presentationProof/*": ["src/presentationProof/*"], + "@health/*":["src/health/*"], + "@DB/*":["src/prisma/*"] + } + }, + "include": [ + "**/*.ts", + "src", + "config", + ], + "exclude": ["node_modules", "./dist/**/*"] +} diff --git a/apps/ssi-abstraction/.dockerignore b/apps/ssi-abstraction/.dockerignore new file mode 100644 index 0000000000000000000000000000000000000000..db6bf0bb299a1377dc57287e3aadba36447c80fb --- /dev/null +++ b/apps/ssi-abstraction/.dockerignore @@ -0,0 +1,22 @@ +Dockerfile +Jenkinsfile +coverage +docker-compose.yml +docs +node_modules +yarn-error.log +*.md +!README.md +.circle* +.codecov* +.coveralls* +.dockerignore +.drone* +.editorconfig +# .env +.git* +.huskyrc* +.lintstagedrc* +.npmignore +.prettierrc* +dist \ No newline at end of file diff --git a/apps/ssi-abstraction/.env.example b/apps/ssi-abstraction/.env.example new file mode 100644 index 0000000000000000000000000000000000000000..8c262a25ba4913ace0fe299be6f53afadeaf42d3 --- /dev/null +++ b/apps/ssi-abstraction/.env.example @@ -0,0 +1,18 @@ +PORT=3009 +AFJ_EXT_PORT=3010 +NATS_URL=nats://localhost:4222 +ECSURL=http://localhost:9200/ +AGENT_HOST=https://gaiax.vereign.com + +AGENT_NAME=ssi-abstraction-agent +AGENT_PEER_PORT=:4000 +AGENT_URL_PATH=/ocm/abstraction +AGENT_PUBLIC_DID_SEED=6b8b882e2618fa5d45ee7229ca880083 +AGENT_AUTO_ACCEPT_CONNECTION=true +AGENT_AUTO_ACCEPT_CREDENTIAL=contentApproved + +AGENT_WALLET_KEY=ssi-wallet-key +AGENT_WALLET_ID=ssi-wallet-id + +AGENT_LEDGER_ID=ID_UNION,BCOVRIN_TEST +AGENT_ID_UNION_KEY=example-example-example-example diff --git a/apps/ssi-abstraction/.eslintrc.js b/apps/ssi-abstraction/.eslintrc.js new file mode 100644 index 0000000000000000000000000000000000000000..ba9f72b7a08be673285f0735893214409c8d2137 --- /dev/null +++ b/apps/ssi-abstraction/.eslintrc.js @@ -0,0 +1,25 @@ +module.exports = { + parser: '@typescript-eslint/parser', + parserOptions: { + project: 'tsconfig.json', + sourceType: 'module', + }, + plugins: ['@typescript-eslint/eslint-plugin'], + extends: [ + 'plugin:@typescript-eslint/recommended', + 'airbnb-base', + 'airbnb-typescript/base' + ], + root: true, + env: { + node: true, + jest: true, + }, + ignorePatterns: ['.eslintrc.js'], + rules: { + '@typescript-eslint/interface-name-prefix': 'off', + '@typescript-eslint/explicit-function-return-type': 'off', + '@typescript-eslint/explicit-module-boundary-types': 'off', + '@typescript-eslint/no-explicit-any': 'off', + }, +}; diff --git a/apps/ssi-abstraction/.gitignore b/apps/ssi-abstraction/.gitignore new file mode 100644 index 0000000000000000000000000000000000000000..e581273d26590ce3cc83e6b339325e0124147cd5 --- /dev/null +++ b/apps/ssi-abstraction/.gitignore @@ -0,0 +1,44 @@ +# compiled output +dist/ +node_modules/ + +# Logs +/logs +*.log +npm-debug.log* +pnpm-debug.log* +yarn-debug.log* +yarn-error.log* +lerna-debug.log* +logs/log.json + +# OS +.DS_Store + +# Tests +/coverage +/.nyc_output + +# IDEs and editors +/.idea +.project +.classpath +.c9/ +*.launch +.settings/ +*.sublime-workspace + +# IDE - VSCode +.vscode/* +!.vscode/settings.json +!.vscode/tasks.json +!.vscode/launch.json +!.vscode/extensions.json + +#Env files +**/*.env +!config/env/development.env +.idea + +#DOCS +AGENT-DOCUMENTATION.md \ No newline at end of file diff --git a/apps/ssi-abstraction/.prettierrc b/apps/ssi-abstraction/.prettierrc new file mode 100644 index 0000000000000000000000000000000000000000..dcb72794f5300a3e0ccd2ad0669d802b62f3d370 --- /dev/null +++ b/apps/ssi-abstraction/.prettierrc @@ -0,0 +1,4 @@ +{ + "singleQuote": true, + "trailingComma": "all" +} \ No newline at end of file diff --git a/apps/ssi-abstraction/EVENTS-DOCUMENTATION.md b/apps/ssi-abstraction/EVENTS-DOCUMENTATION.md new file mode 100644 index 0000000000000000000000000000000000000000..2f8ac63fcb832b9a408662a3e8a1f078a12e9c99 --- /dev/null +++ b/apps/ssi-abstraction/EVENTS-DOCUMENTATION.md @@ -0,0 +1,40 @@ + +<hr/> + +# Event types published on nats + +* ``` + { + endpoint: 'SSI_ABSTRACTION_SERVICE/BasicMessageStateChanged', + } + ``` +* ``` + { + endpoint: 'SSI_ABSTRACTION_SERVICE/ConnectionStateChanged', + } + ``` +* ``` + { + endpoint: 'SSI_ABSTRACTION_SERVICE/CredentialStateChanged', + } + ``` +* ``` + { + endpoint: 'SSI_ABSTRACTION_SERVICE/ProofStateChanged', + } + ``` +* ``` + { + endpoint: 'SSI_ABSTRACTION_SERVICE/MediationStateChanged', + } + ``` +* ``` + { + endpoint: 'SSI_ABSTRACTION_SERVICE/RecipientKeylistUpdated', + } + ``` +* ``` + { + endpoint: 'SSI_ABSTRACTION_SERVICE/OutboundWebSocketClosedEvent', + } + ``` \ No newline at end of file diff --git a/apps/ssi-abstraction/GDPR.md b/apps/ssi-abstraction/GDPR.md new file mode 100644 index 0000000000000000000000000000000000000000..bc74bc15ac673fd523611f8cb7cb6e0c8984e0c3 --- /dev/null +++ b/apps/ssi-abstraction/GDPR.md @@ -0,0 +1,28 @@ +# GDPR Compliance Document +The objective of this document is to detail, the data being stored and proccessed by the Organization Credential Manager's, SSI Abstraction Services. + +## What information is stored +### Source User Information +- Verifiable Credential Specific Information - The various VC's issued by the particular OCM. +- Proof Presentation Specific Information - Credential Claims. + +### Technical User Information (Public) +- Connection Information - The list of connections with different PCM and OCM agents and Pairwise DID. +- Schema information (public) +- Credential/credential definition ids and states +- DID of issuer +- DID of holder +- Created/updated dates + +## How is the information stored +### Source User Information +User specific Source User Information is encrypted using the Private Key of the Organizations SSI Agent and stored until the issuance of credential in Organization's SSI Agent's PostgreSQL database. + +### Technical User Information (Public) +Technical User Information is encrypted using the Private Key of the Organizations SSI Agent and stored internally (on the agent) on PostgreSQL. + +## Who can access the information +The Source User Information and Technical User Information both are accessible only by the Organization specific SSI agent's private key. + +## How long will the information stay +The Source User Information and Technical User Information is never wiped out unless the Agent Database is cleared. diff --git a/apps/ssi-abstraction/LICENSE b/apps/ssi-abstraction/LICENSE new file mode 100644 index 0000000000000000000000000000000000000000..e48e7a105adb4a3ca3837d4376b3a731e4f030b8 --- /dev/null +++ b/apps/ssi-abstraction/LICENSE @@ -0,0 +1,651 @@ +GAIA-X "SSI-Abstraction" + +core GAIA-X service for the Organizational Credential Manager, providing the DIDComm +functionality and initializing the agent, wallet and ledger interactions of the whole application. + +Copyright 2022 Vereign AG + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This SSI-Abstraction incorporates + +"aries-framework" + +Aries Framework JavaScript is a framework written in TypeScript for building +SSI Agents and DIDComm services that aims to be compliant and interoperable with +the standards defined in the Aries RFCs, which is covered by the following +copyright and permission notice: + +Copyright 2020-present Hyperledger Contributors. +Copyright 2021 Queen’s Printer for Ontario. Mostafa Youssef (https://github.com/MosCD3), +Amit Padmani (https://github.com/nbAmit), Prasad Katkar (https://github.com/NB-PrasadKatkar), +Mike Richardson (https://github.com/NB-MikeRichardson) + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This SSI-Abstraction incorporates + +"elastic/ecs-winston-format", + +a Node.js package to provide a formatter for the winston logger compatible +with Elastic Common Schema (ECS) logging, which is covered by the following copyright +and permission notice: + +Copyright 2020 Elastic and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This SSI-Abstraction also incorporates + +"nestjs", + +a progressive Node.js framework for building efficient and scalable server-side applications, +which is covered by the following copyright and permission notice: + +Copyright (c) 2017-2022 Kamil Mysliwiec <https://kamilmysliwiec.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"nestjs/terminus" + +, integrated healthchecks for Nest, which contains the +following copyright and permission notice: + +Copyright (c) 2018-2021 Livio Brunner, Kamil Myśliwiec + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"types/node" + +,type definitions for Node, which is covered by the following copyright and +permission notice: + +Copyright Microsoft TypeScript, DefinitelyTyped, Alberto Schiabel, +Alvis HT Tang, Andrew Makarov, Benjamin Toueg, Chigozirim C., David Junger, Deividas Bakanas, Eugene Y. Q. Shen, +Hannes Magnusson, Huw, Kelvin Jin, Klaus Meinhardt, Lishude, Mariusz Wiktorczyk, Mohsen Azimi, Nicolas Even, +Nikita Galkin, Parambir Singh, Sebastian Silbermann, Simon Schick, Thomas den Hollander, Wilco Bakker, wwwy3y3, +Samuel Ainsworth, Kyle Uehlein, Thanik Bhongbhibhat, Marcin Kopacz, Trivikram Kamat, Junxiao Shi, Ilia Baryshnikov, +ExE Boss, Piotr Błażejewicz, Anna Henningsen, Victor Perin, Yongsheng Zhang, NodeJS Contributors, +Linus Unnebäck, wafuwafu13, and Matteo Collina. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"types/express" + +,type definitions for Express (http://expressjs.com), which is covered by the following +copyright and permission notice: + +Copyright Boris Yankov, China Medical University Hospital, Puneet Arora, and Dylan Frankland. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"types/jest" + +type definitions for Jest, which is covered by the following copyright and permission notice: + +Copyright Asana (https://asana.com)// Ivo Stratev, jwbay, Alexey Svetliakov, Alex Jover Morales, Allan Lukwago, +Ika, Waseem Dahman, Jamie Mason, Douglas Duteil, Ahn, Jeff Lau, Andrew Makarov, Martin Hochel, Sebastian Sebald, +Andy, Antoine Brault, Gregor Stamać, ExE Boss, Alex Bolenok, Mario Beltrán Alarcón, Tony Hallett, Jason Yu, Pawel Fajfer, +Regev Brody, Alexandre Germain, and Adam Jones. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +This Proof Manager also incorporates + +"DefinitelyTyped, types/shelljs, types/supertest" + +, the repository for high quality TypeScript type definitions, which is covered by the +following copyright and permission notice: + +Copyrights are respective of each contributor listed at the beginning of each +definition file. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"axios" + +, promise based HTTP client for the browser and node.js, which is covered +by the following license and permission notice: + +Copyright (c) 2014-present Matt Zabriskie & Collaborators + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"class-validator" + +, a tool to allow decorator and non-decorator based validation, + +Copyright 2015-2020 TypeStack + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"express" + +,a fast, unopinionated, minimalist web framework for node, which is covered by the following copyright +and permission notice: + +Copyright (c) 2009-2014 TJ Holowaychuk <tj@vision-media.ca> +Copyright (c) 2013-2014 Roman Shtylman <shtylman+expressjs@gmail.com> +Copyright (c) 2014-2015 Douglas Christopher Wilson <doug@somethingdoug.com> + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining +a copy of this software and associated documentation files (the +'Software'), to deal in the Software without restriction, including +without limitation the rights to use, copy, modify, merge, publish, +distribute, sublicense, and/or sell copies of the Software, and to +permit persons to whom the Software is furnished to do so, subject to +the following conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF +MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. +IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY +CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, +TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"joi" + +, the most powerful schema description language and data validator for JavaScript, which is +covered by the following copyright and permission notice: + +Copyright (c) 2012-2020, Sideway. Inc, and project contributors. +Copyright (c) 2012-2014, Walmart. +All rights reserved. + +Redistribution and use in source and binary forms, with or without modification, are permitted provided that the following conditions are met: + +- Redistributions of source code must retain the above copyright notice, this list of conditions and the following disclaimer. +- Redistributions in binary form must reproduce the above copyright notice, this list of conditions and the following disclaimer in the documentation and/or +other materials provided with the distribution. +- The names of any contributors may not be used to endorse or promote products derived from this software without +specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDERS AND CONTRIBUTORS +BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS +OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +This SSI-Abstraction also incorporates + +"moment" + +, a JavaScript date library for parsing, validating, manipulating, and formatting dates, +which is covered by the following copyright and permission notice: + +Copyright (c) JS Foundation and other contributors + +(The MIT License) +Permission is hereby granted, free of charge, to any person +obtaining a copy of this software and associated documentation +files (the "Software"), to deal in the Software without +restriction, including without limitation the rights to use, +copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the +Software is furnished to do so, subject to the following +conditions: + +The above copyright notice and this permission notice shall be +included in all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, +EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES +OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND +NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, +WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING +FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR +OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"nats" + +, a Node.js client for the NATS messaging system, which is covered by +the following copyright and permission notice: + +Copyright 2013-2018 The NATS Authors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This SSI-Abstraction also incorporates + +"pg - node postgres" + +, non-blocking PostgreSQL client for Node.js, which is covered by +the following copyright and permission notice: + +Copyright (c) 2010-2020 Brian Carlson (brian.m.carlson@gmail.com) + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy of +this software and associated documentation files (the "Software"), to deal in the +Software without restriction, including without limitation the rights to use, copy, +modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, +and to permit persons to whom the Software is furnished to do so, subject to the +following conditions: + +The above copyright notice and this permission notice shall be included in all copies +or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, +INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A +PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT +HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION +OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE +SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"reflect-metadata" + +, prototype for a Metadata Reflection API for ECMAScript, which is covered +by the following copyright and permission notice: + +Copyright 2019 Ron Buckton + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This SSI-Abstraction also incorporates + +"rimraf" + +, a `rm -rf` util for nodejs, which is covered by the following copyright +and permission notice: + +Copyright (c) 2011-2022 Isaac Z. Schlueter and Contributors + +(The ISC License) +Permission to use, copy, modify, and/or distribute this software for any +purpose with or without fee is hereby granted, provided that the above +copyright notice and this permission notice appear in all copies. + +THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES +WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF +MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR +ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES +WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN +ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR +IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. + + +This SSI-Abstraction also incorporates + +"rxjs" + +, reactive extensions for JavaScript, which is covered by the following copyright +and permission notice: + +Copyright (c) 2015-2018 Google, Inc., Netflix, Inc., Microsoft Corp. and contributors + +Licensed under the Apache License, Version 2.0 (the "License"); +you may not use this file except in compliance with the License. +You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + +Unless required by applicable law or agreed to in writing, software +distributed under the License is distributed on an "AS IS" BASIS, +WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +See the License for the specific language governing permissions and +limitations under the License. + + +This SSI-Abstraction also incorporates + +"ShellJS" + +, portable Unix shell commands for Node.js, which is covered by the following +copyright and permission notice: + +Copyright (c) 2012, Artur Adib <arturadib@gmail.com> +All rights reserved. + +(BSD 3-Clause License) +Redistribution and use in source and binary forms, with or without +modification, are permitted provided that the following conditions are met: + +* Redistributions of source code must retain the above copyright notice, this + list of conditions and the following disclaimer. + +* Redistributions in binary form must reproduce the above copyright notice, + this list of conditions and the following disclaimer in the documentation + and/or other materials provided with the distribution. + +* Neither the name of the copyright holder nor the names of its + contributors may be used to endorse or promote products derived from + this software without specific prior written permission. + +THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" +AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE +IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE +DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE +FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL +DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR +SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER +CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, +OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE +OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + + +This SSI-Abstraction also incorporates + +"Swagger UI Express" + +, allows to serve auto-generated swagger-ui generated API docs from express, +based on a swagger.json file, which is covered by the following copyright and +permission notice: + +Copyright (c) 2018 Scott IT London + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"winston" + +, a logger for just about everything, which is covered by the following copyright and +permission notice: + +Copyright (c) 2010 Charlie Robbins + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. + + +This SSI-Abstraction also incorporates + +"winston-elasticsearch" + +, an elasticsearch transport for winston, which is covered by the following copyright and +permission notice: + +Copyright (c) 2015 - 2018 Thomas Hoppe. +Copyright (c) 2013 Jacques-Olivier D. Bernier. + +(The MIT License) +Permission is hereby granted, free of charge, to any person obtaining a copy +of this software and associated documentation files (the "Software"), to deal +in the Software without restriction, including without limitation the rights +to use, copy, modify, merge, publish, distribute, sublicense, and/or sell +copies of the Software, and to permit persons to whom the Software is +furnished to do so, subject to the following conditions: + +The above copyright notice and this permission notice shall be included in +all copies or substantial portions of the Software. + +THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR +IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, +FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE +AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER +LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, +OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN +THE SOFTWARE. diff --git a/apps/ssi-abstraction/README.md b/apps/ssi-abstraction/README.md new file mode 100644 index 0000000000000000000000000000000000000000..d0bcaf3ae5679a46314c50dfcd07ed145d2c1795 --- /dev/null +++ b/apps/ssi-abstraction/README.md @@ -0,0 +1,112 @@ +# SSI Abstraction Service +## Description + +<hr/> + <p align="center">A core service for the Organizational Credential Manager, providing the DIDComm functionality and initializing the agent, wallet and ledger interactions of the whole application.</p> + +## Usage +<hr/> + +### Endpoint documentation at: + +[Aries REST Extension](swagger.json) + +[Full Agent Events](EVENTS-DOCUMENTATION.md) + +[Sign and Verify Interface](SIGN-AND-VERIFY.md) + +with the default exposed ports: +* 3010 - Aries REST extension +* 3009 - Sign and Veify interface exposed +* 4000 - didcomm interface + + +## Installation +<hr/> + +Dependencies: +```bash +$ yarn +``` + +* **If docker is not installed, [Install docker](https://docs.docker.com/engine/install/)**. + + +* **If docker-compose is not installed, [Install docker-compose](https://docs.docker.com/compose/install/)**. + +* (optional) Postgres GUI +https://dbeaver.io/download/ + +<hr/> + + +## Running the app +<hr/> + +### Environment variables +[.env.example](.env.example) +* PORT is the port for the signing and verification interface +* AFJ_EXT_PORT is the port for the openapi documentation described in [swagger.json](swagger.json) +* AGENT_AUTO_ACCEPT_CONNECTION can be either true or false +* AGENT_AUTO_ACCEPT_CREDENTIAL can be either: always, contentApproved, never +* AGENT_PUBLIC_DID_SEED will generate the did and verkey (32 symbols) +* for security reasons AGENT_WALLET_KEY and AGENT_WALLET_ID should be different +* AGENT_LEDGER_ID can be: ID_UNION,BCOVRIN_TEST,GREEN_LIGHT + - the three pool transaction genesis are inside the code configuration + - every ledger can be provided on its own + - multiple ledgers can also be specified, separated by a comma + +* AGENT_ID_UNION_KEY is needed if the ledger of choice is IDUnion + + +**Each service in the Organizational Credential Manager can be run from the infrastructure repository with Docker.** + +**The .env files are in the infrastructure repository under /env** + +### There are two separate Dockefiles in "./deployment" of every project: +```bash + ## production in: + ./deployment/ci + ## development in: + ./deployment/dev +``` + + +* (optional) Edit docker-compose.yml in "infrastructure" to use either **/ci/** or **/dev/** Dockerfiles. + +* Run while in **"infrastructure"** project: +```bash +$ docker-compose up --build +``` + + +## Test +<hr/> + +```bash +# unit tests +$ yarn test + +# e2e tests +$ yarn test:e2e + +# test coverage +$ yarn test:cov +``` + + + +## GDPR +<hr/> + +[GDPR](GDPR.md) + +## Dependencies +<hr/> + +[Dependencies](package.json) + +## License +<hr/> + +[Apache 2.0 license](LICENSE) diff --git a/apps/ssi-abstraction/SIGN-AND-VERIFY.md b/apps/ssi-abstraction/SIGN-AND-VERIFY.md new file mode 100644 index 0000000000000000000000000000000000000000..2999e0cd9f369142c786e12da9fe3403e6a06d3e --- /dev/null +++ b/apps/ssi-abstraction/SIGN-AND-VERIFY.md @@ -0,0 +1,84 @@ + +## Signing and verification interface is accessible on SSI Abstraction + +### METHOD: POST +**type: "buffer" is necessary to know internally what transformation needs to be done** +``` +:3009/v1/agent/wallet/sign + +body : { + data: [ + { + type: "buffer", + dataBase64: base64 string + }, + verkey: string + ] +} + + +``` +### Returns +``` +{ + statusCode: Number, + message: string, // The message is the path you followed on the agent object + data: base64 string, // signature +} +``` + +<hr/> +and +<hr/> + + +### METHOD: POST +``` +:3009/v1/agent/wallet/verify + +body : { + data: [ + signerVerkey: string, + { + type: "buffer", + dataBase64: base64 string //// This is the data to be verified + }, + { + type: "buffer", + dataBase64: base64 string //// This is the signature + } + ] +} +``` +### Returns +``` +{ + statusCode: Number, + message: string, // The message is the path you followed on the agent object + data: boolean // returns validity of signature on the data +} +``` + + + + + +## Get Agent Info endpoint (did, verkey) on SSI Abstraction + +### METHOD: GET + +``` +:3009/v1/agent/info +``` + +### Returns +``` +{ + "statusCode": 200, + "message": "Success", + "data": { + "did": string, // did of the OCM agent + "verkey": string // verkey needed for signing and verification + } +} +``` \ No newline at end of file diff --git a/apps/ssi-abstraction/config/config.ts b/apps/ssi-abstraction/config/config.ts new file mode 100644 index 0000000000000000000000000000000000000000..210fbcde7a67ed167a503d28dee15715df81617e --- /dev/null +++ b/apps/ssi-abstraction/config/config.ts @@ -0,0 +1,58 @@ +import { AutoAcceptCredential } from '@aries-framework/core/build/modules/credentials/CredentialAutoAcceptType'; +import * as process from 'process'; + +interface Config { + agentHost: string; + port: number; + afjExtPort: number; + jwtSecret: string; + + nats: { + url: string; + }, + + agent: { + name: string; + walletId: string; + walletKey: string; + ledgerIds: string[] | undefined; + host: string; + peerPort: string; + path: string; + publicDidSeed: string; + autoAcceptConnection: boolean; + autoAcceptCredential: AutoAcceptCredential; + idUnionKey: string; + basicUser: string, + basicPass: string + }, +} + +const config = (): Config => ({ + agentHost: process.env.AGENT_HOST || '', + port: Number(process.env.PORT), + afjExtPort: Number(process.env.AFJ_EXT_PORT), + jwtSecret: process.env.JWT_SECRET || '', + + nats: { + url: process.env.NATS_URL || '', + }, + + agent: { + name: process.env.AGENT_NAME || '', + walletId: process.env.AGENT_WALLET_ID || '', + walletKey: process.env.AGENT_WALLET_KEY || '', + ledgerIds: process.env.AGENT_LEDGER_ID?.split(',') || undefined, + host: process.env.AGENT_HOST || '', + peerPort: process.env.AGENT_PEER_PORT || '', + path: process.env.AGENT_URL_PATH || '', + publicDidSeed: process.env.AGENT_PUBLIC_DID_SEED || '', + autoAcceptConnection: process.env.AGENT_AUTO_ACCEPT_CONNECTION === 'true', + autoAcceptCredential: process.env.AGENT_AUTO_ACCEPT_CREDENTIAL as AutoAcceptCredential, + idUnionKey: process.env.AGENT_ID_UNION_KEY || '', + basicUser: process.env.BASIC_USER!, + basicPass: process.env.BASIC_PASS!, + }, +}); + +export default config; diff --git a/apps/ssi-abstraction/config/validation.ts b/apps/ssi-abstraction/config/validation.ts new file mode 100644 index 0000000000000000000000000000000000000000..974089a5198975c6182ee629b0980631b475df23 --- /dev/null +++ b/apps/ssi-abstraction/config/validation.ts @@ -0,0 +1,20 @@ +import * as Joi from 'joi'; + +const validationSchema = Joi.object({ + NATS_URL: Joi.string().required(), + PORT: Joi.number().required(), + AFJ_EXT_PORT: Joi.number().required(), + + AGENT_NAME: Joi.string().required(), + AGENT_WALLET_ID: Joi.string().required(), + AGENT_WALLET_KEY: Joi.string().required(), + AGENT_HOST: Joi.string().required(), + AGENT_PEER_PORT: Joi.string(), + AGENT_URL_PATH: Joi.string(), + AGENT_PUBLIC_DID_SEED: Joi.string().required(), + AGENT_AUTO_ACCEPT_CONNECTION: Joi.boolean().required(), + AGENT_AUTO_ACCEPT_CREDENTIAL: Joi.string().required(), + AGENT_ID_UNION_KEY: Joi.string(), +}); + +export default validationSchema; diff --git a/apps/ssi-abstraction/deployment/ci/Dockerfile b/apps/ssi-abstraction/deployment/ci/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..824e003e419448fdd1b1ab7286a4a4f30b921225 --- /dev/null +++ b/apps/ssi-abstraction/deployment/ci/Dockerfile @@ -0,0 +1,86 @@ +FROM ubuntu:18.04 as base + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt-get update -y && apt-get install -y \ + software-properties-common \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + libsodium-dev \ + libzmq3-dev \ + git \ + openssl \ + libssl-dev \ + pkg-config \ + # Only needed to build indy-sdk + build-essential + +# libindy +#RUN apt-key adv --keyserver keyserver.ubuntu.com --recv-keys CE7709D068DB5E88 +#RUN echo "deb https://repo.sovrin.org/sdk/deb xenial stable" >> /etc/apt/sources.list +# +# nodejs +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash + +# yarn +RUN curl -sS https://dl.yarnpkg.com/debian/pubkey.gpg | apt-key add - && \ + echo "deb https://dl.yarnpkg.com/debian/ stable main" | tee /etc/apt/sources.list.d/yarn.list + + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + +RUN git clone https://github.com/hyperledger/indy-sdk + +RUN cd indy-sdk/libindy && ~/.cargo/bin/cargo build --release + +RUN cd indy-sdk/libindy && mv target/release/libindy.so /usr/lib/libindy.so + +RUN apt-get update -y + +## install depdencies +RUN apt-get install -y \ + nodejs + +# Install yarn seperately due to `no-install-recommends` to skip nodejs install +RUN apt-get install -y --no-install-recommends yarn + +WORKDIR /usr/src/app + +RUN yarn global add @nestjs/cli@8.2.4 + +COPY package.json ./ +COPY yarn.lock ./ + +# --prod works if @types/node is in deps (not devDeps) +RUN yarn --frozen-lockfile --prod + +COPY . . + +RUN yarn build + + + +FROM base as final + +# ENV RUN_MODE="docker" + +WORKDIR /usr/src/app + +ENV PATH /usr/src/app/node_modules/.bin:$PATH + +COPY package.json ./ + +COPY --from=base /usr/src/app/dist ./dist +COPY --from=base /usr/src/app/start.sh ./start.sh +COPY --from=base /usr/src/app/node_modules ./node_modules + +EXPOSE 3009 +EXPOSE 3010 +EXPOSE 4000 + +RUN chmod +x ./start.sh + +CMD ["./start.sh"] + diff --git a/apps/ssi-abstraction/deployment/dev/Dockerfile b/apps/ssi-abstraction/deployment/dev/Dockerfile new file mode 100644 index 0000000000000000000000000000000000000000..e566c2c5108b840c6275b9aeb3585c61b3a7464d --- /dev/null +++ b/apps/ssi-abstraction/deployment/dev/Dockerfile @@ -0,0 +1,55 @@ +FROM ubuntu:18.04 as base + +ENV DEBIAN_FRONTEND noninteractive + +RUN apt-get update -y && apt-get install -y \ + software-properties-common \ + apt-transport-https \ + ca-certificates \ + curl \ + gnupg \ + libsodium-dev \ + libzmq3-dev \ + git \ + openssl \ + libssl-dev \ + pkg-config \ + # Only needed to build indy-sdk + build-essential + +# nodejs +RUN curl -fsSL https://deb.nodesource.com/setup_16.x | bash + +RUN curl --proto '=https' --tlsv1.2 -sSf https://sh.rustup.rs | sh -s -- -y + +RUN git clone https://github.com/hyperledger/indy-sdk + +RUN cd indy-sdk/libindy && ~/.cargo/bin/cargo build --release + +RUN cd indy-sdk/libindy && mv target/release/libindy.so /usr/lib/libindy.so + +## install depdencies +RUN apt-get install -y \ + nodejs + +RUN curl -fsSL https://get.pnpm.io/install.sh | sh - + +FROM base as final + +ENV RUN_MODE="docker" + +WORKDIR /usr/src/app + +ENV PATH /usr/src/app/node_modules/.bin:$PATH + +COPY . . +RUN pnpm install --frozen-lockfile + +EXPOSE 3009 +EXPOSE 3010 +EXPOSE 4000 + +CMD ["pnpm","-F", "ssi-absctracion", "start"] + + + diff --git a/apps/ssi-abstraction/docs/.nojekyll b/apps/ssi-abstraction/docs/.nojekyll new file mode 100644 index 0000000000000000000000000000000000000000..e2ac6616addc2d4975edda1dfb80bfdd51549686 --- /dev/null +++ b/apps/ssi-abstraction/docs/.nojekyll @@ -0,0 +1 @@ +TypeDoc added this file to prevent GitHub Pages from using Jekyll. You can turn off this behavior by setting the `githubPages` option to false. \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/assets/highlight.css b/apps/ssi-abstraction/docs/assets/highlight.css new file mode 100644 index 0000000000000000000000000000000000000000..cfddb7750332f7ad95fd8c5363b87eba996283b4 --- /dev/null +++ b/apps/ssi-abstraction/docs/assets/highlight.css @@ -0,0 +1,36 @@ +:root { + --light-hl-0: #000000; + --dark-hl-0: #D4D4D4; + --light-hl-1: #008000; + --dark-hl-1: #6A9955; + --light-code-background: #F5F5F5; + --dark-code-background: #1E1E1E; +} + +@media (prefers-color-scheme: light) { :root { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --code-background: var(--light-code-background); +} } + +@media (prefers-color-scheme: dark) { :root { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --code-background: var(--dark-code-background); +} } + +body.light { + --hl-0: var(--light-hl-0); + --hl-1: var(--light-hl-1); + --code-background: var(--light-code-background); +} + +body.dark { + --hl-0: var(--dark-hl-0); + --hl-1: var(--dark-hl-1); + --code-background: var(--dark-code-background); +} + +.hl-0 { color: var(--hl-0); } +.hl-1 { color: var(--hl-1); } +pre, code { background: var(--code-background); } diff --git a/apps/ssi-abstraction/docs/assets/icons.css b/apps/ssi-abstraction/docs/assets/icons.css new file mode 100644 index 0000000000000000000000000000000000000000..776a3562d6fce4c40a6024bc321497cf19716b61 --- /dev/null +++ b/apps/ssi-abstraction/docs/assets/icons.css @@ -0,0 +1,1043 @@ +.tsd-kind-icon { + display: block; + position: relative; + padding-left: 20px; + text-indent: -20px; +} +.tsd-kind-icon:before { + content: ""; + display: inline-block; + vertical-align: middle; + width: 17px; + height: 17px; + margin: 0 3px 2px 0; + background-image: url(./icons.png); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-kind-icon:before { + background-image: url(./icons@2x.png); + background-size: 238px 204px; + } +} + +.tsd-signature.tsd-kind-icon:before { + background-position: 0 -153px; +} + +.tsd-kind-object-literal > .tsd-kind-icon:before { + background-position: 0px -17px; +} +.tsd-kind-object-literal.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -17px; +} +.tsd-kind-object-literal.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -17px; +} + +.tsd-kind-class > .tsd-kind-icon:before { + background-position: 0px -34px; +} +.tsd-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -34px; +} +.tsd-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -34px; +} + +.tsd-kind-class.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -51px; +} +.tsd-kind-class.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -51px; +} + +.tsd-kind-interface > .tsd-kind-icon:before { + background-position: 0px -68px; +} +.tsd-kind-interface.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -68px; +} +.tsd-kind-interface.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -68px; +} + +.tsd-kind-interface.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -85px; +} +.tsd-kind-interface.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -34px -85px; +} + +.tsd-kind-namespace > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-namespace.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-namespace.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-module > .tsd-kind-icon:before { + background-position: 0px -102px; +} +.tsd-kind-module.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -102px; +} +.tsd-kind-module.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -102px; +} + +.tsd-kind-enum > .tsd-kind-icon:before { + background-position: 0px -119px; +} +.tsd-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -119px; +} +.tsd-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -119px; +} + +.tsd-kind-enum-member > .tsd-kind-icon:before { + background-position: 0px -136px; +} +.tsd-kind-enum-member.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -136px; +} +.tsd-kind-enum-member.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -136px; +} + +.tsd-kind-signature > .tsd-kind-icon:before { + background-position: 0px -153px; +} +.tsd-kind-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -153px; +} +.tsd-kind-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -153px; +} + +.tsd-kind-type-alias > .tsd-kind-icon:before { + background-position: 0px -170px; +} +.tsd-kind-type-alias.tsd-is-protected > .tsd-kind-icon:before { + background-position: -17px -170px; +} +.tsd-kind-type-alias.tsd-is-private > .tsd-kind-icon:before { + background-position: -34px -170px; +} + +.tsd-kind-type-alias.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: 0px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -17px -187px; +} +.tsd-kind-type-alias.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -34px -187px; +} + +.tsd-kind-variable > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-variable.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-variable.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-variable.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-variable.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-variable.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-property > .tsd-kind-icon:before { + background-position: -136px -0px; +} +.tsd-kind-property.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -0px; +} +.tsd-kind-property.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -0px; +} +.tsd-kind-property.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -0px; +} +.tsd-kind-property.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -0px; +} +.tsd-kind-property.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -0px; +} + +.tsd-kind-get-signature > .tsd-kind-icon:before { + background-position: -136px -17px; +} +.tsd-kind-get-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -17px; +} +.tsd-kind-get-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -17px; +} +.tsd-kind-get-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -17px; +} + +.tsd-kind-set-signature > .tsd-kind-icon:before { + background-position: -136px -34px; +} +.tsd-kind-set-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -34px; +} +.tsd-kind-set-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -34px; +} +.tsd-kind-set-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -34px; +} + +.tsd-kind-accessor > .tsd-kind-icon:before { + background-position: -136px -51px; +} +.tsd-kind-accessor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -51px; +} +.tsd-kind-accessor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -51px; +} +.tsd-kind-accessor.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -51px; +} + +.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-function.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-method.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -68px; +} +.tsd-kind-call-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -68px; +} +.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -68px; +} +.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -68px; +} + +.tsd-kind-function.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-function.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-method.tsd-has-type-parameter > .tsd-kind-icon:before { + background-position: -136px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -85px; +} +.tsd-kind-method.tsd-has-type-parameter.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -85px; +} + +.tsd-kind-constructor > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-constructor-signature > .tsd-kind-icon:before { + background-position: -136px -102px; +} +.tsd-kind-constructor-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -102px; +} +.tsd-kind-constructor-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -102px; +} +.tsd-kind-constructor-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -102px; +} + +.tsd-kind-index-signature > .tsd-kind-icon:before { + background-position: -136px -119px; +} +.tsd-kind-index-signature.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -119px; +} +.tsd-kind-index-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -119px; +} +.tsd-kind-index-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -119px; +} + +.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -136px; +} +.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -136px; +} +.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -136px; +} +.tsd-kind-event.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -136px; +} +.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -136px; +} +.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -136px; +} + +.tsd-is-static > .tsd-kind-icon:before { + background-position: -136px -153px; +} +.tsd-is-static.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -153px; +} +.tsd-is-static.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-inherited > .tsd-kind-icon:before { + background-position: -68px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected > .tsd-kind-icon:before { + background-position: -85px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -153px; +} +.tsd-is-static.tsd-parent-kind-class.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-protected > .tsd-kind-icon:before { + background-position: -187px -153px; +} +.tsd-is-static.tsd-parent-kind-enum.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -153px; +} +.tsd-is-static.tsd-parent-kind-interface > .tsd-kind-icon:before { + background-position: -204px -153px; +} +.tsd-is-static.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -153px; +} + +.tsd-is-static.tsd-kind-function > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-function.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-method > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-method.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-call-signature > .tsd-kind-icon:before { + background-position: -136px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -153px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class + > .tsd-kind-icon:before { + background-position: -51px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum + > .tsd-kind-icon:before { + background-position: -170px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -170px; +} +.tsd-is-static.tsd-kind-call-signature.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -170px; +} + +.tsd-is-static.tsd-kind-event > .tsd-kind-icon:before { + background-position: -136px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-protected > .tsd-kind-icon:before { + background-position: -153px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-is-private > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class > .tsd-kind-icon:before { + background-position: -51px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -68px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -85px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-protected.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -102px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-class.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum > .tsd-kind-icon:before { + background-position: -170px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-protected + > .tsd-kind-icon:before { + background-position: -187px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-enum.tsd-is-private + > .tsd-kind-icon:before { + background-position: -119px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface + > .tsd-kind-icon:before { + background-position: -204px -187px; +} +.tsd-is-static.tsd-kind-event.tsd-parent-kind-interface.tsd-is-inherited + > .tsd-kind-icon:before { + background-position: -221px -187px; +} diff --git a/apps/ssi-abstraction/docs/assets/icons.png b/apps/ssi-abstraction/docs/assets/icons.png new file mode 100644 index 0000000000000000000000000000000000000000..3836d5fe46e48bbe186116855aae879c23935327 Binary files /dev/null and b/apps/ssi-abstraction/docs/assets/icons.png differ diff --git a/apps/ssi-abstraction/docs/assets/icons@2x.png b/apps/ssi-abstraction/docs/assets/icons@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..5a209e2f6d7f915cc9cb6fe7a4264c8be4db87b0 Binary files /dev/null and b/apps/ssi-abstraction/docs/assets/icons@2x.png differ diff --git a/apps/ssi-abstraction/docs/assets/main.js b/apps/ssi-abstraction/docs/assets/main.js new file mode 100644 index 0000000000000000000000000000000000000000..b13205a3d1cc6952af6c826a3b89791244534b74 --- /dev/null +++ b/apps/ssi-abstraction/docs/assets/main.js @@ -0,0 +1,52 @@ +(()=>{var Ce=Object.create;var ue=Object.defineProperty;var Pe=Object.getOwnPropertyDescriptor;var Oe=Object.getOwnPropertyNames;var Re=Object.getPrototypeOf,_e=Object.prototype.hasOwnProperty;var Me=(t,e)=>()=>(e||t((e={exports:{}}).exports,e),e.exports);var De=(t,e,r,n)=>{if(e&&typeof e=="object"||typeof e=="function")for(let i of Oe(e))!_e.call(t,i)&&i!==r&&ue(t,i,{get:()=>e[i],enumerable:!(n=Pe(e,i))||n.enumerable});return t};var Fe=(t,e,r)=>(r=t!=null?Ce(Re(t)):{},De(e||!t||!t.__esModule?ue(r,"default",{value:t,enumerable:!0}):r,t));var pe=Me((de,fe)=>{(function(){var t=function(e){var r=new t.Builder;return r.pipeline.add(t.trimmer,t.stopWordFilter,t.stemmer),r.searchPipeline.add(t.stemmer),e.call(r,r),r.build()};t.version="2.3.9";t.utils={},t.utils.warn=function(e){return function(r){e.console&&console.warn&&console.warn(r)}}(this),t.utils.asString=function(e){return e==null?"":e.toString()},t.utils.clone=function(e){if(e==null)return e;for(var r=Object.create(null),n=Object.keys(e),i=0;i<n.length;i++){var s=n[i],o=e[s];if(Array.isArray(o)){r[s]=o.slice();continue}if(typeof o=="string"||typeof o=="number"||typeof o=="boolean"){r[s]=o;continue}throw new TypeError("clone is not deep and does not support nested objects")}return r},t.FieldRef=function(e,r,n){this.docRef=e,this.fieldName=r,this._stringValue=n},t.FieldRef.joiner="/",t.FieldRef.fromString=function(e){var r=e.indexOf(t.FieldRef.joiner);if(r===-1)throw"malformed field ref string";var n=e.slice(0,r),i=e.slice(r+1);return new t.FieldRef(i,n,e)},t.FieldRef.prototype.toString=function(){return this._stringValue==null&&(this._stringValue=this.fieldName+t.FieldRef.joiner+this.docRef),this._stringValue};t.Set=function(e){if(this.elements=Object.create(null),e){this.length=e.length;for(var r=0;r<this.length;r++)this.elements[e[r]]=!0}else this.length=0},t.Set.complete={intersect:function(e){return e},union:function(){return this},contains:function(){return!0}},t.Set.empty={intersect:function(){return this},union:function(e){return e},contains:function(){return!1}},t.Set.prototype.contains=function(e){return!!this.elements[e]},t.Set.prototype.intersect=function(e){var r,n,i,s=[];if(e===t.Set.complete)return this;if(e===t.Set.empty)return e;this.length<e.length?(r=this,n=e):(r=e,n=this),i=Object.keys(r.elements);for(var o=0;o<i.length;o++){var a=i[o];a in n.elements&&s.push(a)}return new t.Set(s)},t.Set.prototype.union=function(e){return e===t.Set.complete?t.Set.complete:e===t.Set.empty?this:new t.Set(Object.keys(this.elements).concat(Object.keys(e.elements)))},t.idf=function(e,r){var n=0;for(var i in e)i!="_index"&&(n+=Object.keys(e[i]).length);var s=(r-n+.5)/(n+.5);return Math.log(1+Math.abs(s))},t.Token=function(e,r){this.str=e||"",this.metadata=r||{}},t.Token.prototype.toString=function(){return this.str},t.Token.prototype.update=function(e){return this.str=e(this.str,this.metadata),this},t.Token.prototype.clone=function(e){return e=e||function(r){return r},new t.Token(e(this.str,this.metadata),this.metadata)};t.tokenizer=function(e,r){if(e==null||e==null)return[];if(Array.isArray(e))return e.map(function(p){return new t.Token(t.utils.asString(p).toLowerCase(),t.utils.clone(r))});for(var n=e.toString().toLowerCase(),i=n.length,s=[],o=0,a=0;o<=i;o++){var u=n.charAt(o),l=o-a;if(u.match(t.tokenizer.separator)||o==i){if(l>0){var h=t.utils.clone(r)||{};h.position=[a,l],h.index=s.length,s.push(new t.Token(n.slice(a,o),h))}a=o+1}}return s},t.tokenizer.separator=/[\s\-]+/;t.Pipeline=function(){this._stack=[]},t.Pipeline.registeredFunctions=Object.create(null),t.Pipeline.registerFunction=function(e,r){r in this.registeredFunctions&&t.utils.warn("Overwriting existing registered function: "+r),e.label=r,t.Pipeline.registeredFunctions[e.label]=e},t.Pipeline.warnIfFunctionNotRegistered=function(e){var r=e.label&&e.label in this.registeredFunctions;r||t.utils.warn(`Function is not registered with pipeline. This may cause problems when serialising the index. +`,e)},t.Pipeline.load=function(e){var r=new t.Pipeline;return e.forEach(function(n){var i=t.Pipeline.registeredFunctions[n];if(i)r.add(i);else throw new Error("Cannot load unregistered function: "+n)}),r},t.Pipeline.prototype.add=function(){var e=Array.prototype.slice.call(arguments);e.forEach(function(r){t.Pipeline.warnIfFunctionNotRegistered(r),this._stack.push(r)},this)},t.Pipeline.prototype.after=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");n=n+1,this._stack.splice(n,0,r)},t.Pipeline.prototype.before=function(e,r){t.Pipeline.warnIfFunctionNotRegistered(r);var n=this._stack.indexOf(e);if(n==-1)throw new Error("Cannot find existingFn");this._stack.splice(n,0,r)},t.Pipeline.prototype.remove=function(e){var r=this._stack.indexOf(e);r!=-1&&this._stack.splice(r,1)},t.Pipeline.prototype.run=function(e){for(var r=this._stack.length,n=0;n<r;n++){for(var i=this._stack[n],s=[],o=0;o<e.length;o++){var a=i(e[o],o,e);if(!(a==null||a===""))if(Array.isArray(a))for(var u=0;u<a.length;u++)s.push(a[u]);else s.push(a)}e=s}return e},t.Pipeline.prototype.runString=function(e,r){var n=new t.Token(e,r);return this.run([n]).map(function(i){return i.toString()})},t.Pipeline.prototype.reset=function(){this._stack=[]},t.Pipeline.prototype.toJSON=function(){return this._stack.map(function(e){return t.Pipeline.warnIfFunctionNotRegistered(e),e.label})};t.Vector=function(e){this._magnitude=0,this.elements=e||[]},t.Vector.prototype.positionForIndex=function(e){if(this.elements.length==0)return 0;for(var r=0,n=this.elements.length/2,i=n-r,s=Math.floor(i/2),o=this.elements[s*2];i>1&&(o<e&&(r=s),o>e&&(n=s),o!=e);)i=n-r,s=r+Math.floor(i/2),o=this.elements[s*2];if(o==e||o>e)return s*2;if(o<e)return(s+1)*2},t.Vector.prototype.insert=function(e,r){this.upsert(e,r,function(){throw"duplicate index"})},t.Vector.prototype.upsert=function(e,r,n){this._magnitude=0;var i=this.positionForIndex(e);this.elements[i]==e?this.elements[i+1]=n(this.elements[i+1],r):this.elements.splice(i,0,e,r)},t.Vector.prototype.magnitude=function(){if(this._magnitude)return this._magnitude;for(var e=0,r=this.elements.length,n=1;n<r;n+=2){var i=this.elements[n];e+=i*i}return this._magnitude=Math.sqrt(e)},t.Vector.prototype.dot=function(e){for(var r=0,n=this.elements,i=e.elements,s=n.length,o=i.length,a=0,u=0,l=0,h=0;l<s&&h<o;)a=n[l],u=i[h],a<u?l+=2:a>u?h+=2:a==u&&(r+=n[l+1]*i[h+1],l+=2,h+=2);return r},t.Vector.prototype.similarity=function(e){return this.dot(e)/this.magnitude()||0},t.Vector.prototype.toArray=function(){for(var e=new Array(this.elements.length/2),r=1,n=0;r<this.elements.length;r+=2,n++)e[n]=this.elements[r];return e},t.Vector.prototype.toJSON=function(){return this.elements};t.stemmer=function(){var e={ational:"ate",tional:"tion",enci:"ence",anci:"ance",izer:"ize",bli:"ble",alli:"al",entli:"ent",eli:"e",ousli:"ous",ization:"ize",ation:"ate",ator:"ate",alism:"al",iveness:"ive",fulness:"ful",ousness:"ous",aliti:"al",iviti:"ive",biliti:"ble",logi:"log"},r={icate:"ic",ative:"",alize:"al",iciti:"ic",ical:"ic",ful:"",ness:""},n="[^aeiou]",i="[aeiouy]",s=n+"[^aeiouy]*",o=i+"[aeiou]*",a="^("+s+")?"+o+s,u="^("+s+")?"+o+s+"("+o+")?$",l="^("+s+")?"+o+s+o+s,h="^("+s+")?"+i,p=new RegExp(a),v=new RegExp(l),b=new RegExp(u),y=new RegExp(h),E=/^(.+?)(ss|i)es$/,f=/^(.+?)([^s])s$/,m=/^(.+?)eed$/,T=/^(.+?)(ed|ing)$/,w=/.$/,I=/(at|bl|iz)$/,M=new RegExp("([^aeiouylsz])\\1$"),B=new RegExp("^"+s+i+"[^aeiouwxy]$"),V=/^(.+?[^aeiou])y$/,q=/^(.+?)(ational|tional|enci|anci|izer|bli|alli|entli|eli|ousli|ization|ation|ator|alism|iveness|fulness|ousness|aliti|iviti|biliti|logi)$/,$=/^(.+?)(icate|ative|alize|iciti|ical|ful|ness)$/,H=/^(.+?)(al|ance|ence|er|ic|able|ible|ant|ement|ment|ent|ou|ism|ate|iti|ous|ive|ize)$/,W=/^(.+?)(s|t)(ion)$/,P=/^(.+?)e$/,U=/ll$/,G=new RegExp("^"+s+i+"[^aeiouwxy]$"),z=function(c){var g,O,S,d,x,R,F;if(c.length<3)return c;if(S=c.substr(0,1),S=="y"&&(c=S.toUpperCase()+c.substr(1)),d=E,x=f,d.test(c)?c=c.replace(d,"$1$2"):x.test(c)&&(c=c.replace(x,"$1$2")),d=m,x=T,d.test(c)){var L=d.exec(c);d=p,d.test(L[1])&&(d=w,c=c.replace(d,""))}else if(x.test(c)){var L=x.exec(c);g=L[1],x=y,x.test(g)&&(c=g,x=I,R=M,F=B,x.test(c)?c=c+"e":R.test(c)?(d=w,c=c.replace(d,"")):F.test(c)&&(c=c+"e"))}if(d=V,d.test(c)){var L=d.exec(c);g=L[1],c=g+"i"}if(d=q,d.test(c)){var L=d.exec(c);g=L[1],O=L[2],d=p,d.test(g)&&(c=g+e[O])}if(d=$,d.test(c)){var L=d.exec(c);g=L[1],O=L[2],d=p,d.test(g)&&(c=g+r[O])}if(d=H,x=W,d.test(c)){var L=d.exec(c);g=L[1],d=v,d.test(g)&&(c=g)}else if(x.test(c)){var L=x.exec(c);g=L[1]+L[2],x=v,x.test(g)&&(c=g)}if(d=P,d.test(c)){var L=d.exec(c);g=L[1],d=v,x=b,R=G,(d.test(g)||x.test(g)&&!R.test(g))&&(c=g)}return d=U,x=v,d.test(c)&&x.test(c)&&(d=w,c=c.replace(d,"")),S=="y"&&(c=S.toLowerCase()+c.substr(1)),c};return function(D){return D.update(z)}}(),t.Pipeline.registerFunction(t.stemmer,"stemmer");t.generateStopWordFilter=function(e){var r=e.reduce(function(n,i){return n[i]=i,n},{});return function(n){if(n&&r[n.toString()]!==n.toString())return n}},t.stopWordFilter=t.generateStopWordFilter(["a","able","about","across","after","all","almost","also","am","among","an","and","any","are","as","at","be","because","been","but","by","can","cannot","could","dear","did","do","does","either","else","ever","every","for","from","get","got","had","has","have","he","her","hers","him","his","how","however","i","if","in","into","is","it","its","just","least","let","like","likely","may","me","might","most","must","my","neither","no","nor","not","of","off","often","on","only","or","other","our","own","rather","said","say","says","she","should","since","so","some","than","that","the","their","them","then","there","these","they","this","tis","to","too","twas","us","wants","was","we","were","what","when","where","which","while","who","whom","why","will","with","would","yet","you","your"]),t.Pipeline.registerFunction(t.stopWordFilter,"stopWordFilter");t.trimmer=function(e){return e.update(function(r){return r.replace(/^\W+/,"").replace(/\W+$/,"")})},t.Pipeline.registerFunction(t.trimmer,"trimmer");t.TokenSet=function(){this.final=!1,this.edges={},this.id=t.TokenSet._nextId,t.TokenSet._nextId+=1},t.TokenSet._nextId=1,t.TokenSet.fromArray=function(e){for(var r=new t.TokenSet.Builder,n=0,i=e.length;n<i;n++)r.insert(e[n]);return r.finish(),r.root},t.TokenSet.fromClause=function(e){return"editDistance"in e?t.TokenSet.fromFuzzyString(e.term,e.editDistance):t.TokenSet.fromString(e.term)},t.TokenSet.fromFuzzyString=function(e,r){for(var n=new t.TokenSet,i=[{node:n,editsRemaining:r,str:e}];i.length;){var s=i.pop();if(s.str.length>0){var o=s.str.charAt(0),a;o in s.node.edges?a=s.node.edges[o]:(a=new t.TokenSet,s.node.edges[o]=a),s.str.length==1&&(a.final=!0),i.push({node:a,editsRemaining:s.editsRemaining,str:s.str.slice(1)})}if(s.editsRemaining!=0){if("*"in s.node.edges)var u=s.node.edges["*"];else{var u=new t.TokenSet;s.node.edges["*"]=u}if(s.str.length==0&&(u.final=!0),i.push({node:u,editsRemaining:s.editsRemaining-1,str:s.str}),s.str.length>1&&i.push({node:s.node,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)}),s.str.length==1&&(s.node.final=!0),s.str.length>=1){if("*"in s.node.edges)var l=s.node.edges["*"];else{var l=new t.TokenSet;s.node.edges["*"]=l}s.str.length==1&&(l.final=!0),i.push({node:l,editsRemaining:s.editsRemaining-1,str:s.str.slice(1)})}if(s.str.length>1){var h=s.str.charAt(0),p=s.str.charAt(1),v;p in s.node.edges?v=s.node.edges[p]:(v=new t.TokenSet,s.node.edges[p]=v),s.str.length==1&&(v.final=!0),i.push({node:v,editsRemaining:s.editsRemaining-1,str:h+s.str.slice(2)})}}}return n},t.TokenSet.fromString=function(e){for(var r=new t.TokenSet,n=r,i=0,s=e.length;i<s;i++){var o=e[i],a=i==s-1;if(o=="*")r.edges[o]=r,r.final=a;else{var u=new t.TokenSet;u.final=a,r.edges[o]=u,r=u}}return n},t.TokenSet.prototype.toArray=function(){for(var e=[],r=[{prefix:"",node:this}];r.length;){var n=r.pop(),i=Object.keys(n.node.edges),s=i.length;n.node.final&&(n.prefix.charAt(0),e.push(n.prefix));for(var o=0;o<s;o++){var a=i[o];r.push({prefix:n.prefix.concat(a),node:n.node.edges[a]})}}return e},t.TokenSet.prototype.toString=function(){if(this._str)return this._str;for(var e=this.final?"1":"0",r=Object.keys(this.edges).sort(),n=r.length,i=0;i<n;i++){var s=r[i],o=this.edges[s];e=e+s+o.id}return e},t.TokenSet.prototype.intersect=function(e){for(var r=new t.TokenSet,n=void 0,i=[{qNode:e,output:r,node:this}];i.length;){n=i.pop();for(var s=Object.keys(n.qNode.edges),o=s.length,a=Object.keys(n.node.edges),u=a.length,l=0;l<o;l++)for(var h=s[l],p=0;p<u;p++){var v=a[p];if(v==h||h=="*"){var b=n.node.edges[v],y=n.qNode.edges[h],E=b.final&&y.final,f=void 0;v in n.output.edges?(f=n.output.edges[v],f.final=f.final||E):(f=new t.TokenSet,f.final=E,n.output.edges[v]=f),i.push({qNode:y,output:f,node:b})}}}return r},t.TokenSet.Builder=function(){this.previousWord="",this.root=new t.TokenSet,this.uncheckedNodes=[],this.minimizedNodes={}},t.TokenSet.Builder.prototype.insert=function(e){var r,n=0;if(e<this.previousWord)throw new Error("Out of order word insertion");for(var i=0;i<e.length&&i<this.previousWord.length&&e[i]==this.previousWord[i];i++)n++;this.minimize(n),this.uncheckedNodes.length==0?r=this.root:r=this.uncheckedNodes[this.uncheckedNodes.length-1].child;for(var i=n;i<e.length;i++){var s=new t.TokenSet,o=e[i];r.edges[o]=s,this.uncheckedNodes.push({parent:r,char:o,child:s}),r=s}r.final=!0,this.previousWord=e},t.TokenSet.Builder.prototype.finish=function(){this.minimize(0)},t.TokenSet.Builder.prototype.minimize=function(e){for(var r=this.uncheckedNodes.length-1;r>=e;r--){var n=this.uncheckedNodes[r],i=n.child.toString();i in this.minimizedNodes?n.parent.edges[n.char]=this.minimizedNodes[i]:(n.child._str=i,this.minimizedNodes[i]=n.child),this.uncheckedNodes.pop()}};t.Index=function(e){this.invertedIndex=e.invertedIndex,this.fieldVectors=e.fieldVectors,this.tokenSet=e.tokenSet,this.fields=e.fields,this.pipeline=e.pipeline},t.Index.prototype.search=function(e){return this.query(function(r){var n=new t.QueryParser(e,r);n.parse()})},t.Index.prototype.query=function(e){for(var r=new t.Query(this.fields),n=Object.create(null),i=Object.create(null),s=Object.create(null),o=Object.create(null),a=Object.create(null),u=0;u<this.fields.length;u++)i[this.fields[u]]=new t.Vector;e.call(r,r);for(var u=0;u<r.clauses.length;u++){var l=r.clauses[u],h=null,p=t.Set.empty;l.usePipeline?h=this.pipeline.runString(l.term,{fields:l.fields}):h=[l.term];for(var v=0;v<h.length;v++){var b=h[v];l.term=b;var y=t.TokenSet.fromClause(l),E=this.tokenSet.intersect(y).toArray();if(E.length===0&&l.presence===t.Query.presence.REQUIRED){for(var f=0;f<l.fields.length;f++){var m=l.fields[f];o[m]=t.Set.empty}break}for(var T=0;T<E.length;T++)for(var w=E[T],I=this.invertedIndex[w],M=I._index,f=0;f<l.fields.length;f++){var m=l.fields[f],B=I[m],V=Object.keys(B),q=w+"/"+m,$=new t.Set(V);if(l.presence==t.Query.presence.REQUIRED&&(p=p.union($),o[m]===void 0&&(o[m]=t.Set.complete)),l.presence==t.Query.presence.PROHIBITED){a[m]===void 0&&(a[m]=t.Set.empty),a[m]=a[m].union($);continue}if(i[m].upsert(M,l.boost,function(Qe,Ie){return Qe+Ie}),!s[q]){for(var H=0;H<V.length;H++){var W=V[H],P=new t.FieldRef(W,m),U=B[W],G;(G=n[P])===void 0?n[P]=new t.MatchData(w,m,U):G.add(w,m,U)}s[q]=!0}}}if(l.presence===t.Query.presence.REQUIRED)for(var f=0;f<l.fields.length;f++){var m=l.fields[f];o[m]=o[m].intersect(p)}}for(var z=t.Set.complete,D=t.Set.empty,u=0;u<this.fields.length;u++){var m=this.fields[u];o[m]&&(z=z.intersect(o[m])),a[m]&&(D=D.union(a[m]))}var c=Object.keys(n),g=[],O=Object.create(null);if(r.isNegated()){c=Object.keys(this.fieldVectors);for(var u=0;u<c.length;u++){var P=c[u],S=t.FieldRef.fromString(P);n[P]=new t.MatchData}}for(var u=0;u<c.length;u++){var S=t.FieldRef.fromString(c[u]),d=S.docRef;if(!!z.contains(d)&&!D.contains(d)){var x=this.fieldVectors[S],R=i[S.fieldName].similarity(x),F;if((F=O[d])!==void 0)F.score+=R,F.matchData.combine(n[S]);else{var L={ref:d,score:R,matchData:n[S]};O[d]=L,g.push(L)}}}return g.sort(function(Se,ke){return ke.score-Se.score})},t.Index.prototype.toJSON=function(){var e=Object.keys(this.invertedIndex).sort().map(function(n){return[n,this.invertedIndex[n]]},this),r=Object.keys(this.fieldVectors).map(function(n){return[n,this.fieldVectors[n].toJSON()]},this);return{version:t.version,fields:this.fields,fieldVectors:r,invertedIndex:e,pipeline:this.pipeline.toJSON()}},t.Index.load=function(e){var r={},n={},i=e.fieldVectors,s=Object.create(null),o=e.invertedIndex,a=new t.TokenSet.Builder,u=t.Pipeline.load(e.pipeline);e.version!=t.version&&t.utils.warn("Version mismatch when loading serialised index. Current version of lunr '"+t.version+"' does not match serialized index '"+e.version+"'");for(var l=0;l<i.length;l++){var h=i[l],p=h[0],v=h[1];n[p]=new t.Vector(v)}for(var l=0;l<o.length;l++){var h=o[l],b=h[0],y=h[1];a.insert(b),s[b]=y}return a.finish(),r.fields=e.fields,r.fieldVectors=n,r.invertedIndex=s,r.tokenSet=a.root,r.pipeline=u,new t.Index(r)};t.Builder=function(){this._ref="id",this._fields=Object.create(null),this._documents=Object.create(null),this.invertedIndex=Object.create(null),this.fieldTermFrequencies={},this.fieldLengths={},this.tokenizer=t.tokenizer,this.pipeline=new t.Pipeline,this.searchPipeline=new t.Pipeline,this.documentCount=0,this._b=.75,this._k1=1.2,this.termIndex=0,this.metadataWhitelist=[]},t.Builder.prototype.ref=function(e){this._ref=e},t.Builder.prototype.field=function(e,r){if(/\//.test(e))throw new RangeError("Field '"+e+"' contains illegal character '/'");this._fields[e]=r||{}},t.Builder.prototype.b=function(e){e<0?this._b=0:e>1?this._b=1:this._b=e},t.Builder.prototype.k1=function(e){this._k1=e},t.Builder.prototype.add=function(e,r){var n=e[this._ref],i=Object.keys(this._fields);this._documents[n]=r||{},this.documentCount+=1;for(var s=0;s<i.length;s++){var o=i[s],a=this._fields[o].extractor,u=a?a(e):e[o],l=this.tokenizer(u,{fields:[o]}),h=this.pipeline.run(l),p=new t.FieldRef(n,o),v=Object.create(null);this.fieldTermFrequencies[p]=v,this.fieldLengths[p]=0,this.fieldLengths[p]+=h.length;for(var b=0;b<h.length;b++){var y=h[b];if(v[y]==null&&(v[y]=0),v[y]+=1,this.invertedIndex[y]==null){var E=Object.create(null);E._index=this.termIndex,this.termIndex+=1;for(var f=0;f<i.length;f++)E[i[f]]=Object.create(null);this.invertedIndex[y]=E}this.invertedIndex[y][o][n]==null&&(this.invertedIndex[y][o][n]=Object.create(null));for(var m=0;m<this.metadataWhitelist.length;m++){var T=this.metadataWhitelist[m],w=y.metadata[T];this.invertedIndex[y][o][n][T]==null&&(this.invertedIndex[y][o][n][T]=[]),this.invertedIndex[y][o][n][T].push(w)}}}},t.Builder.prototype.calculateAverageFieldLengths=function(){for(var e=Object.keys(this.fieldLengths),r=e.length,n={},i={},s=0;s<r;s++){var o=t.FieldRef.fromString(e[s]),a=o.fieldName;i[a]||(i[a]=0),i[a]+=1,n[a]||(n[a]=0),n[a]+=this.fieldLengths[o]}for(var u=Object.keys(this._fields),s=0;s<u.length;s++){var l=u[s];n[l]=n[l]/i[l]}this.averageFieldLength=n},t.Builder.prototype.createFieldVectors=function(){for(var e={},r=Object.keys(this.fieldTermFrequencies),n=r.length,i=Object.create(null),s=0;s<n;s++){for(var o=t.FieldRef.fromString(r[s]),a=o.fieldName,u=this.fieldLengths[o],l=new t.Vector,h=this.fieldTermFrequencies[o],p=Object.keys(h),v=p.length,b=this._fields[a].boost||1,y=this._documents[o.docRef].boost||1,E=0;E<v;E++){var f=p[E],m=h[f],T=this.invertedIndex[f]._index,w,I,M;i[f]===void 0?(w=t.idf(this.invertedIndex[f],this.documentCount),i[f]=w):w=i[f],I=w*((this._k1+1)*m)/(this._k1*(1-this._b+this._b*(u/this.averageFieldLength[a]))+m),I*=b,I*=y,M=Math.round(I*1e3)/1e3,l.insert(T,M)}e[o]=l}this.fieldVectors=e},t.Builder.prototype.createTokenSet=function(){this.tokenSet=t.TokenSet.fromArray(Object.keys(this.invertedIndex).sort())},t.Builder.prototype.build=function(){return this.calculateAverageFieldLengths(),this.createFieldVectors(),this.createTokenSet(),new t.Index({invertedIndex:this.invertedIndex,fieldVectors:this.fieldVectors,tokenSet:this.tokenSet,fields:Object.keys(this._fields),pipeline:this.searchPipeline})},t.Builder.prototype.use=function(e){var r=Array.prototype.slice.call(arguments,1);r.unshift(this),e.apply(this,r)},t.MatchData=function(e,r,n){for(var i=Object.create(null),s=Object.keys(n||{}),o=0;o<s.length;o++){var a=s[o];i[a]=n[a].slice()}this.metadata=Object.create(null),e!==void 0&&(this.metadata[e]=Object.create(null),this.metadata[e][r]=i)},t.MatchData.prototype.combine=function(e){for(var r=Object.keys(e.metadata),n=0;n<r.length;n++){var i=r[n],s=Object.keys(e.metadata[i]);this.metadata[i]==null&&(this.metadata[i]=Object.create(null));for(var o=0;o<s.length;o++){var a=s[o],u=Object.keys(e.metadata[i][a]);this.metadata[i][a]==null&&(this.metadata[i][a]=Object.create(null));for(var l=0;l<u.length;l++){var h=u[l];this.metadata[i][a][h]==null?this.metadata[i][a][h]=e.metadata[i][a][h]:this.metadata[i][a][h]=this.metadata[i][a][h].concat(e.metadata[i][a][h])}}}},t.MatchData.prototype.add=function(e,r,n){if(!(e in this.metadata)){this.metadata[e]=Object.create(null),this.metadata[e][r]=n;return}if(!(r in this.metadata[e])){this.metadata[e][r]=n;return}for(var i=Object.keys(n),s=0;s<i.length;s++){var o=i[s];o in this.metadata[e][r]?this.metadata[e][r][o]=this.metadata[e][r][o].concat(n[o]):this.metadata[e][r][o]=n[o]}},t.Query=function(e){this.clauses=[],this.allFields=e},t.Query.wildcard=new String("*"),t.Query.wildcard.NONE=0,t.Query.wildcard.LEADING=1,t.Query.wildcard.TRAILING=2,t.Query.presence={OPTIONAL:1,REQUIRED:2,PROHIBITED:3},t.Query.prototype.clause=function(e){return"fields"in e||(e.fields=this.allFields),"boost"in e||(e.boost=1),"usePipeline"in e||(e.usePipeline=!0),"wildcard"in e||(e.wildcard=t.Query.wildcard.NONE),e.wildcard&t.Query.wildcard.LEADING&&e.term.charAt(0)!=t.Query.wildcard&&(e.term="*"+e.term),e.wildcard&t.Query.wildcard.TRAILING&&e.term.slice(-1)!=t.Query.wildcard&&(e.term=""+e.term+"*"),"presence"in e||(e.presence=t.Query.presence.OPTIONAL),this.clauses.push(e),this},t.Query.prototype.isNegated=function(){for(var e=0;e<this.clauses.length;e++)if(this.clauses[e].presence!=t.Query.presence.PROHIBITED)return!1;return!0},t.Query.prototype.term=function(e,r){if(Array.isArray(e))return e.forEach(function(i){this.term(i,t.utils.clone(r))},this),this;var n=r||{};return n.term=e.toString(),this.clause(n),this},t.QueryParseError=function(e,r,n){this.name="QueryParseError",this.message=e,this.start=r,this.end=n},t.QueryParseError.prototype=new Error,t.QueryLexer=function(e){this.lexemes=[],this.str=e,this.length=e.length,this.pos=0,this.start=0,this.escapeCharPositions=[]},t.QueryLexer.prototype.run=function(){for(var e=t.QueryLexer.lexText;e;)e=e(this)},t.QueryLexer.prototype.sliceString=function(){for(var e=[],r=this.start,n=this.pos,i=0;i<this.escapeCharPositions.length;i++)n=this.escapeCharPositions[i],e.push(this.str.slice(r,n)),r=n+1;return e.push(this.str.slice(r,this.pos)),this.escapeCharPositions.length=0,e.join("")},t.QueryLexer.prototype.emit=function(e){this.lexemes.push({type:e,str:this.sliceString(),start:this.start,end:this.pos}),this.start=this.pos},t.QueryLexer.prototype.escapeCharacter=function(){this.escapeCharPositions.push(this.pos-1),this.pos+=1},t.QueryLexer.prototype.next=function(){if(this.pos>=this.length)return t.QueryLexer.EOS;var e=this.str.charAt(this.pos);return this.pos+=1,e},t.QueryLexer.prototype.width=function(){return this.pos-this.start},t.QueryLexer.prototype.ignore=function(){this.start==this.pos&&(this.pos+=1),this.start=this.pos},t.QueryLexer.prototype.backup=function(){this.pos-=1},t.QueryLexer.prototype.acceptDigitRun=function(){var e,r;do e=this.next(),r=e.charCodeAt(0);while(r>47&&r<58);e!=t.QueryLexer.EOS&&this.backup()},t.QueryLexer.prototype.more=function(){return this.pos<this.length},t.QueryLexer.EOS="EOS",t.QueryLexer.FIELD="FIELD",t.QueryLexer.TERM="TERM",t.QueryLexer.EDIT_DISTANCE="EDIT_DISTANCE",t.QueryLexer.BOOST="BOOST",t.QueryLexer.PRESENCE="PRESENCE",t.QueryLexer.lexField=function(e){return e.backup(),e.emit(t.QueryLexer.FIELD),e.ignore(),t.QueryLexer.lexText},t.QueryLexer.lexTerm=function(e){if(e.width()>1&&(e.backup(),e.emit(t.QueryLexer.TERM)),e.ignore(),e.more())return t.QueryLexer.lexText},t.QueryLexer.lexEditDistance=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.EDIT_DISTANCE),t.QueryLexer.lexText},t.QueryLexer.lexBoost=function(e){return e.ignore(),e.acceptDigitRun(),e.emit(t.QueryLexer.BOOST),t.QueryLexer.lexText},t.QueryLexer.lexEOS=function(e){e.width()>0&&e.emit(t.QueryLexer.TERM)},t.QueryLexer.termSeparator=t.tokenizer.separator,t.QueryLexer.lexText=function(e){for(;;){var r=e.next();if(r==t.QueryLexer.EOS)return t.QueryLexer.lexEOS;if(r.charCodeAt(0)==92){e.escapeCharacter();continue}if(r==":")return t.QueryLexer.lexField;if(r=="~")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexEditDistance;if(r=="^")return e.backup(),e.width()>0&&e.emit(t.QueryLexer.TERM),t.QueryLexer.lexBoost;if(r=="+"&&e.width()===1||r=="-"&&e.width()===1)return e.emit(t.QueryLexer.PRESENCE),t.QueryLexer.lexText;if(r.match(t.QueryLexer.termSeparator))return t.QueryLexer.lexTerm}},t.QueryParser=function(e,r){this.lexer=new t.QueryLexer(e),this.query=r,this.currentClause={},this.lexemeIdx=0},t.QueryParser.prototype.parse=function(){this.lexer.run(),this.lexemes=this.lexer.lexemes;for(var e=t.QueryParser.parseClause;e;)e=e(this);return this.query},t.QueryParser.prototype.peekLexeme=function(){return this.lexemes[this.lexemeIdx]},t.QueryParser.prototype.consumeLexeme=function(){var e=this.peekLexeme();return this.lexemeIdx+=1,e},t.QueryParser.prototype.nextClause=function(){var e=this.currentClause;this.query.clause(e),this.currentClause={}},t.QueryParser.parseClause=function(e){var r=e.peekLexeme();if(r!=null)switch(r.type){case t.QueryLexer.PRESENCE:return t.QueryParser.parsePresence;case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expected either a field or a term, found "+r.type;throw r.str.length>=1&&(n+=" with value '"+r.str+"'"),new t.QueryParseError(n,r.start,r.end)}},t.QueryParser.parsePresence=function(e){var r=e.consumeLexeme();if(r!=null){switch(r.str){case"-":e.currentClause.presence=t.Query.presence.PROHIBITED;break;case"+":e.currentClause.presence=t.Query.presence.REQUIRED;break;default:var n="unrecognised presence operator'"+r.str+"'";throw new t.QueryParseError(n,r.start,r.end)}var i=e.peekLexeme();if(i==null){var n="expecting term or field, found nothing";throw new t.QueryParseError(n,r.start,r.end)}switch(i.type){case t.QueryLexer.FIELD:return t.QueryParser.parseField;case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var n="expecting term or field, found '"+i.type+"'";throw new t.QueryParseError(n,i.start,i.end)}}},t.QueryParser.parseField=function(e){var r=e.consumeLexeme();if(r!=null){if(e.query.allFields.indexOf(r.str)==-1){var n=e.query.allFields.map(function(o){return"'"+o+"'"}).join(", "),i="unrecognised field '"+r.str+"', possible fields: "+n;throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.fields=[r.str];var s=e.peekLexeme();if(s==null){var i="expecting term, found nothing";throw new t.QueryParseError(i,r.start,r.end)}switch(s.type){case t.QueryLexer.TERM:return t.QueryParser.parseTerm;default:var i="expecting term, found '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseTerm=function(e){var r=e.consumeLexeme();if(r!=null){e.currentClause.term=r.str.toLowerCase(),r.str.indexOf("*")!=-1&&(e.currentClause.usePipeline=!1);var n=e.peekLexeme();if(n==null){e.nextClause();return}switch(n.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+n.type+"'";throw new t.QueryParseError(i,n.start,n.end)}}},t.QueryParser.parseEditDistance=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="edit distance must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.editDistance=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},t.QueryParser.parseBoost=function(e){var r=e.consumeLexeme();if(r!=null){var n=parseInt(r.str,10);if(isNaN(n)){var i="boost must be numeric";throw new t.QueryParseError(i,r.start,r.end)}e.currentClause.boost=n;var s=e.peekLexeme();if(s==null){e.nextClause();return}switch(s.type){case t.QueryLexer.TERM:return e.nextClause(),t.QueryParser.parseTerm;case t.QueryLexer.FIELD:return e.nextClause(),t.QueryParser.parseField;case t.QueryLexer.EDIT_DISTANCE:return t.QueryParser.parseEditDistance;case t.QueryLexer.BOOST:return t.QueryParser.parseBoost;case t.QueryLexer.PRESENCE:return e.nextClause(),t.QueryParser.parsePresence;default:var i="Unexpected lexeme type '"+s.type+"'";throw new t.QueryParseError(i,s.start,s.end)}}},function(e,r){typeof define=="function"&&define.amd?define(r):typeof de=="object"?fe.exports=r():e.lunr=r()}(this,function(){return t})})()});var ce=[];function N(t,e){ce.push({selector:e,constructor:t})}var Y=class{constructor(){this.createComponents(document.body)}createComponents(e){ce.forEach(r=>{e.querySelectorAll(r.selector).forEach(n=>{n.dataset.hasInstance||(new r.constructor({el:n}),n.dataset.hasInstance=String(!0))})})}};var k=class{constructor(e){this.el=e.el}};var J=class{constructor(){this.listeners={}}addEventListener(e,r){e in this.listeners||(this.listeners[e]=[]),this.listeners[e].push(r)}removeEventListener(e,r){if(!(e in this.listeners))return;let n=this.listeners[e];for(let i=0,s=n.length;i<s;i++)if(n[i]===r){n.splice(i,1);return}}dispatchEvent(e){if(!(e.type in this.listeners))return!0;let r=this.listeners[e.type].slice();for(let n=0,i=r.length;n<i;n++)r[n].call(this,e);return!e.defaultPrevented}};var ne=(t,e=100)=>{let r=Date.now();return(...n)=>{r+e-Date.now()<0&&(t(...n),r=Date.now())}};var ie=class extends J{constructor(){super();this.scrollTop=0;this.lastY=0;this.width=0;this.height=0;this.showToolbar=!0;this.toolbar=document.querySelector(".tsd-page-toolbar"),this.secondaryNav=document.querySelector(".tsd-navigation.secondary"),window.addEventListener("scroll",ne(()=>this.onScroll(),10)),window.addEventListener("resize",ne(()=>this.onResize(),10)),this.onResize(),this.onScroll()}triggerResize(){let r=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(r)}onResize(){this.width=window.innerWidth||0,this.height=window.innerHeight||0;let r=new CustomEvent("resize",{detail:{width:this.width,height:this.height}});this.dispatchEvent(r)}onScroll(){this.scrollTop=window.scrollY||0;let r=new CustomEvent("scroll",{detail:{scrollTop:this.scrollTop}});this.dispatchEvent(r),this.hideShowToolbar()}hideShowToolbar(){var n;let r=this.showToolbar;this.showToolbar=this.lastY>=this.scrollTop||this.scrollTop<=0,r!==this.showToolbar&&(this.toolbar.classList.toggle("tsd-page-toolbar--hide"),(n=this.secondaryNav)==null||n.classList.toggle("tsd-navigation--toolbar-hide")),this.lastY=this.scrollTop}},Q=ie;Q.instance=new ie;var X=class extends k{constructor(r){super(r);this.anchors=[];this.index=-1;Q.instance.addEventListener("resize",()=>this.onResize()),Q.instance.addEventListener("scroll",n=>this.onScroll(n)),this.createAnchors()}createAnchors(){let r=window.location.href;r.indexOf("#")!=-1&&(r=r.substr(0,r.indexOf("#"))),this.el.querySelectorAll("a").forEach(n=>{let i=n.href;if(i.indexOf("#")==-1||i.substr(0,r.length)!=r)return;let s=i.substr(i.indexOf("#")+1),o=document.querySelector("a.tsd-anchor[name="+s+"]"),a=n.parentNode;!o||!a||this.anchors.push({link:a,anchor:o,position:0})}),this.onResize()}onResize(){let r;for(let i=0,s=this.anchors.length;i<s;i++){r=this.anchors[i];let o=r.anchor.getBoundingClientRect();r.position=o.top+document.body.scrollTop}this.anchors.sort((i,s)=>i.position-s.position);let n=new CustomEvent("scroll",{detail:{scrollTop:Q.instance.scrollTop}});this.onScroll(n)}onScroll(r){let n=r.detail.scrollTop+5,i=this.anchors,s=i.length-1,o=this.index;for(;o>-1&&i[o].position>n;)o-=1;for(;o<s&&i[o+1].position<n;)o+=1;this.index!=o&&(this.index>-1&&this.anchors[this.index].link.classList.remove("focus"),this.index=o,this.index>-1&&this.anchors[this.index].link.classList.add("focus"))}};var he=(t,e=100)=>{let r;return(...n)=>{clearTimeout(r),r=setTimeout(()=>t(n),e)}};var ge=Fe(pe());function ye(){let t=document.getElementById("tsd-search");if(!t)return;let e=document.getElementById("search-script");t.classList.add("loading"),e&&(e.addEventListener("error",()=>{t.classList.remove("loading"),t.classList.add("failure")}),e.addEventListener("load",()=>{t.classList.remove("loading"),t.classList.add("ready")}),window.searchData&&t.classList.remove("loading"));let r=document.querySelector("#tsd-search input"),n=document.querySelector("#tsd-search .results");if(!r||!n)throw new Error("The input field or the result list wrapper was not found");let i=!1;n.addEventListener("mousedown",()=>i=!0),n.addEventListener("mouseup",()=>{i=!1,t.classList.remove("has-focus")}),r.addEventListener("focus",()=>t.classList.add("has-focus")),r.addEventListener("blur",()=>{i||(i=!1,t.classList.remove("has-focus"))});let s={base:t.dataset.base+"/"};Ae(t,n,r,s)}function Ae(t,e,r,n){r.addEventListener("input",he(()=>{He(t,e,r,n)},200));let i=!1;r.addEventListener("keydown",s=>{i=!0,s.key=="Enter"?ze(e,r):s.key=="Escape"?r.blur():s.key=="ArrowUp"?me(e,-1):s.key==="ArrowDown"?me(e,1):i=!1}),r.addEventListener("keypress",s=>{i&&s.preventDefault()}),document.body.addEventListener("keydown",s=>{s.altKey||s.ctrlKey||s.metaKey||!r.matches(":focus")&&s.key==="/"&&(r.focus(),s.preventDefault())})}function Ve(t,e){t.index||window.searchData&&(e.classList.remove("loading"),e.classList.add("ready"),t.data=window.searchData,t.index=ge.Index.load(window.searchData.index))}function He(t,e,r,n){if(Ve(n,t),!n.index||!n.data)return;e.textContent="";let i=r.value.trim(),s=i?n.index.search(`*${i}*`):[];for(let o=0,a=Math.min(10,s.length);o<a;o++){let u=n.data.rows[Number(s[o].ref)],l=ve(u.name,i);u.parent&&(l=`<span class="parent">${ve(u.parent,i)}.</span>${l}`);let h=document.createElement("li");h.classList.value=u.classes;let p=document.createElement("a");p.href=n.base+u.url,p.classList.add("tsd-kind-icon"),p.innerHTML=l,h.append(p),e.appendChild(h)}}function me(t,e){let r=t.querySelector(".current");if(!r)r=t.querySelector(e==1?"li:first-child":"li:last-child"),r&&r.classList.add("current");else{let n=r;if(e===1)do n=n.nextElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);else do n=n.previousElementSibling;while(n instanceof HTMLElement&&n.offsetParent==null);n&&(r.classList.remove("current"),n.classList.add("current"))}}function ze(t,e){let r=t.querySelector(".current");if(r||(r=t.querySelector("li:first-child")),r){let n=r.querySelector("a");n&&(window.location.href=n.href),e.blur()}}function ve(t,e){if(e==="")return t;let r=t.toLocaleLowerCase(),n=e.toLocaleLowerCase(),i=[],s=0,o=r.indexOf(n);for(;o!=-1;)i.push(se(t.substring(s,o)),`<b>${se(t.substring(o,o+n.length))}</b>`),s=o+n.length,o=r.indexOf(n,s);return i.push(se(t.substring(s))),i.join("")}var Ne={"&":"&","<":"<",">":">","'":"'",'"':"""};function se(t){return t.replace(/[&<>"'"]/g,e=>Ne[e])}var oe=class{constructor(e,r){this.signature=e,this.description=r}addClass(e){return this.signature.classList.add(e),this.description.classList.add(e),this}removeClass(e){return this.signature.classList.remove(e),this.description.classList.remove(e),this}},Z=class extends k{constructor(r){super(r);this.groups=[];this.index=-1;this.createGroups(),this.container&&(this.el.classList.add("active"),Array.from(this.el.children).forEach(n=>{n.addEventListener("touchstart",i=>this.onClick(i)),n.addEventListener("click",i=>this.onClick(i))}),this.container.classList.add("active"),this.setIndex(0))}setIndex(r){if(r<0&&(r=0),r>this.groups.length-1&&(r=this.groups.length-1),this.index==r)return;let n=this.groups[r];if(this.index>-1){let i=this.groups[this.index];i.removeClass("current").addClass("fade-out"),n.addClass("current"),n.addClass("fade-in"),Q.instance.triggerResize(),setTimeout(()=>{i.removeClass("fade-out"),n.removeClass("fade-in")},300)}else n.addClass("current"),Q.instance.triggerResize();this.index=r}createGroups(){let r=this.el.children;if(r.length<2)return;this.container=this.el.nextElementSibling;let n=this.container.children;this.groups=[];for(let i=0;i<r.length;i++)this.groups.push(new oe(r[i],n[i]))}onClick(r){this.groups.forEach((n,i)=>{n.signature===r.currentTarget&&this.setIndex(i)})}};var C="mousedown",Le="mousemove",_="mouseup",K={x:0,y:0},xe=!1,ae=!1,je=!1,A=!1,Ee=/Android|webOS|iPhone|iPad|iPod|BlackBerry|IEMobile|Opera Mini/i.test(navigator.userAgent);document.documentElement.classList.add(Ee?"is-mobile":"not-mobile");Ee&&"ontouchstart"in document.documentElement&&(je=!0,C="touchstart",Le="touchmove",_="touchend");document.addEventListener(C,t=>{ae=!0,A=!1;let e=C=="touchstart"?t.targetTouches[0]:t;K.y=e.pageY||0,K.x=e.pageX||0});document.addEventListener(Le,t=>{if(!!ae&&!A){let e=C=="touchstart"?t.targetTouches[0]:t,r=K.x-(e.pageX||0),n=K.y-(e.pageY||0);A=Math.sqrt(r*r+n*n)>10}});document.addEventListener(_,()=>{ae=!1});document.addEventListener("click",t=>{xe&&(t.preventDefault(),t.stopImmediatePropagation(),xe=!1)});var ee=class extends k{constructor(r){super(r);this.className=this.el.dataset.toggle||"",this.el.addEventListener(_,n=>this.onPointerUp(n)),this.el.addEventListener("click",n=>n.preventDefault()),document.addEventListener(C,n=>this.onDocumentPointerDown(n)),document.addEventListener(_,n=>this.onDocumentPointerUp(n))}setActive(r){if(this.active==r)return;this.active=r,document.documentElement.classList.toggle("has-"+this.className,r),this.el.classList.toggle("active",r);let n=(this.active?"to-has-":"from-has-")+this.className;document.documentElement.classList.add(n),setTimeout(()=>document.documentElement.classList.remove(n),500)}onPointerUp(r){A||(this.setActive(!0),r.preventDefault())}onDocumentPointerDown(r){if(this.active){if(r.target.closest(".col-menu, .tsd-filter-group"))return;this.setActive(!1)}}onDocumentPointerUp(r){if(!A&&this.active&&r.target.closest(".col-menu")){let n=r.target.closest("a");if(n){let i=window.location.href;i.indexOf("#")!=-1&&(i=i.substr(0,i.indexOf("#"))),n.href.substr(0,i.length)==i&&setTimeout(()=>this.setActive(!1),250)}}}};var te=class{constructor(e,r){this.key=e,this.value=r,this.defaultValue=r,this.initialize(),window.localStorage[this.key]&&this.setValue(this.fromLocalStorage(window.localStorage[this.key]))}initialize(){}setValue(e){if(this.value==e)return;let r=this.value;this.value=e,window.localStorage[this.key]=this.toLocalStorage(e),this.handleValueChange(r,e)}},re=class extends te{initialize(){let r=document.querySelector("#tsd-filter-"+this.key);!r||(this.checkbox=r,this.checkbox.addEventListener("change",()=>{this.setValue(this.checkbox.checked)}))}handleValueChange(r,n){!this.checkbox||(this.checkbox.checked=this.value,document.documentElement.classList.toggle("toggle-"+this.key,this.value!=this.defaultValue))}fromLocalStorage(r){return r=="true"}toLocalStorage(r){return r?"true":"false"}},le=class extends te{initialize(){document.documentElement.classList.add("toggle-"+this.key+this.value);let r=document.querySelector("#tsd-filter-"+this.key);if(!r)return;this.select=r;let n=()=>{this.select.classList.add("active")},i=()=>{this.select.classList.remove("active")};this.select.addEventListener(C,n),this.select.addEventListener("mouseover",n),this.select.addEventListener("mouseleave",i),this.select.querySelectorAll("li").forEach(s=>{s.addEventListener(_,o=>{r.classList.remove("active"),this.setValue(o.target.dataset.value||"")})}),document.addEventListener(C,s=>{this.select.contains(s.target)||this.select.classList.remove("active")})}handleValueChange(r,n){this.select.querySelectorAll("li.selected").forEach(o=>{o.classList.remove("selected")});let i=this.select.querySelector('li[data-value="'+n+'"]'),s=this.select.querySelector(".tsd-select-label");i&&s&&(i.classList.add("selected"),s.textContent=i.textContent),document.documentElement.classList.remove("toggle-"+r),document.documentElement.classList.add("toggle-"+n)}fromLocalStorage(r){return r}toLocalStorage(r){return r}},j=class extends k{constructor(r){super(r);this.optionVisibility=new le("visibility","private"),this.optionInherited=new re("inherited",!0),this.optionExternals=new re("externals",!0)}static isSupported(){try{return typeof window.localStorage!="undefined"}catch{return!1}}};function we(t){let e=localStorage.getItem("tsd-theme")||"os";t.value=e,be(e),t.addEventListener("change",()=>{localStorage.setItem("tsd-theme",t.value),be(t.value)})}function be(t){switch(t){case"os":document.body.classList.remove("light","dark");break;case"light":document.body.classList.remove("dark"),document.body.classList.add("light");break;case"dark":document.body.classList.remove("light"),document.body.classList.add("dark");break}}ye();N(X,".menu-highlight");N(Z,".tsd-signatures");N(ee,"a[data-toggle]");j.isSupported()?N(j,"#tsd-filter"):document.documentElement.classList.add("no-filter");var Te=document.getElementById("theme");Te&&we(Te);var Be=new Y;Object.defineProperty(window,"app",{value:Be});})(); +/*! + * lunr.Builder + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Index + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Pipeline + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Set + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.TokenSet + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.Vector + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.stemmer + * Copyright (C) 2020 Oliver Nightingale + * Includes code from - http://tartarus.org/~martin/PorterStemmer/js.txt + */ +/*! + * lunr.stopWordFilter + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.tokenizer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.trimmer + * Copyright (C) 2020 Oliver Nightingale + */ +/*! + * lunr.utils + * Copyright (C) 2020 Oliver Nightingale + */ +/** + * lunr - http://lunrjs.com - A bit like Solr, but much smaller and not as bright - 2.3.9 + * Copyright (C) 2020 Oliver Nightingale + * @license MIT + */ diff --git a/apps/ssi-abstraction/docs/assets/search.js b/apps/ssi-abstraction/docs/assets/search.js new file mode 100644 index 0000000000000000000000000000000000000000..adbdb9f6a2fe5aef79ec01b92f15de146830899f --- /dev/null +++ b/apps/ssi-abstraction/docs/assets/search.js @@ -0,0 +1 @@ +window.searchData = JSON.parse("{\"kinds\":{\"2\":\"Module\",\"8\":\"Enumeration\",\"16\":\"Enumeration member\",\"32\":\"Variable\",\"64\":\"Function\",\"128\":\"Class\",\"256\":\"Interface\",\"512\":\"Constructor\",\"1024\":\"Property\",\"2048\":\"Method\",\"65536\":\"Type literal\",\"16777216\":\"Reference\"},\"rows\":[{\"id\":0,\"kind\":2,\"name\":\"agent/agentUtils/ledgerConfig\",\"url\":\"modules/agent_agentUtils_ledgerConfig.html\",\"classes\":\"tsd-kind-module\"},{\"id\":1,\"kind\":32,\"name\":\"BCOVRIN_TEST_GENESIS\",\"url\":\"modules/agent_agentUtils_ledgerConfig.html#BCOVRIN_TEST_GENESIS\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"agent/agentUtils/ledgerConfig\"},{\"id\":2,\"kind\":32,\"name\":\"default\",\"url\":\"modules/agent_agentUtils_ledgerConfig.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"agent/agentUtils/ledgerConfig\"},{\"id\":3,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/agent_agentUtils_ledgerConfig.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"agent/agentUtils/ledgerConfig.default\"},{\"id\":4,\"kind\":1024,\"name\":\"BCOVRIN_TEST_GENESIS\",\"url\":\"modules/agent_agentUtils_ledgerConfig.html#default.__type.BCOVRIN_TEST_GENESIS-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"agent/agentUtils/ledgerConfig.default.__type\"},{\"id\":5,\"kind\":2,\"name\":\"agent/agentUtils/listenerConfig\",\"url\":\"modules/agent_agentUtils_listenerConfig.html\",\"classes\":\"tsd-kind-module\"},{\"id\":6,\"kind\":32,\"name\":\"listenerConfig\",\"url\":\"modules/agent_agentUtils_listenerConfig.html#listenerConfig-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"agent/agentUtils/listenerConfig\"},{\"id\":7,\"kind\":32,\"name\":\"default\",\"url\":\"modules/agent_agentUtils_listenerConfig.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"agent/agentUtils/listenerConfig\"},{\"id\":8,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/agent_agentUtils_listenerConfig.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"agent/agentUtils/listenerConfig.default\"},{\"id\":9,\"kind\":1024,\"name\":\"listenerConfig\",\"url\":\"modules/agent_agentUtils_listenerConfig.html#default.__type.listenerConfig\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"agent/agentUtils/listenerConfig.default.__type\"},{\"id\":10,\"kind\":2,\"name\":\"agent/agentUtils/listener\",\"url\":\"modules/agent_agentUtils_listener.html\",\"classes\":\"tsd-kind-module\"},{\"id\":11,\"kind\":64,\"name\":\"subscribe\",\"url\":\"modules/agent_agentUtils_listener.html#subscribe-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"agent/agentUtils/listener\"},{\"id\":12,\"kind\":32,\"name\":\"default\",\"url\":\"modules/agent_agentUtils_listener.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"agent/agentUtils/listener\"},{\"id\":13,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/agent_agentUtils_listener.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"agent/agentUtils/listener.default\"},{\"id\":14,\"kind\":1024,\"name\":\"subscribe\",\"url\":\"modules/agent_agentUtils_listener.html#default.__type.subscribe\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"agent/agentUtils/listener.default.__type\"},{\"id\":15,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/agent_agentUtils_listener.html#default.__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"agent/agentUtils/listener.default.__type\"},{\"id\":16,\"kind\":2,\"name\":\"agent/module\",\"url\":\"modules/agent_module.html\",\"classes\":\"tsd-kind-module\"},{\"id\":17,\"kind\":32,\"name\":\"AGENT\",\"url\":\"modules/agent_module.html#AGENT\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"agent/module\"},{\"id\":18,\"kind\":128,\"name\":\"AgentModule\",\"url\":\"classes/agent_module.AgentModule.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"agent/module\"},{\"id\":19,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/agent_module.AgentModule.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"agent/module.AgentModule\"},{\"id\":20,\"kind\":2048,\"name\":\"onModuleDestroy\",\"url\":\"classes/agent_module.AgentModule.html#onModuleDestroy\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"agent/module.AgentModule\"},{\"id\":21,\"kind\":16777216,\"name\":\"default\",\"url\":\"modules/agent_module.html#default\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"agent/module\"},{\"id\":22,\"kind\":2,\"name\":\"app.module\",\"url\":\"modules/app_module.html\",\"classes\":\"tsd-kind-module\"},{\"id\":23,\"kind\":128,\"name\":\"AppModule\",\"url\":\"classes/app_module.AppModule.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"app.module\"},{\"id\":24,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/app_module.AppModule.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"app.module.AppModule\"},{\"id\":25,\"kind\":2048,\"name\":\"configure\",\"url\":\"classes/app_module.AppModule.html#configure\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"app.module.AppModule\"},{\"id\":26,\"kind\":16777216,\"name\":\"default\",\"url\":\"modules/app_module.html#default\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"app.module\"},{\"id\":27,\"kind\":2,\"name\":\"client/nats.client\",\"url\":\"modules/client_nats_client.html\",\"classes\":\"tsd-kind-module\"},{\"id\":28,\"kind\":128,\"name\":\"NatsClientService\",\"url\":\"classes/client_nats_client.NatsClientService.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"client/nats.client\"},{\"id\":29,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/client_nats_client.NatsClientService.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"client/nats.client.NatsClientService\"},{\"id\":30,\"kind\":2048,\"name\":\"publish\",\"url\":\"classes/client_nats_client.NatsClientService.html#publish\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"client/nats.client.NatsClientService\"},{\"id\":31,\"kind\":32,\"name\":\"default\",\"url\":\"modules/client_nats_client.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"client/nats.client\"},{\"id\":32,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/client_nats_client.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"client/nats.client.default\"},{\"id\":33,\"kind\":1024,\"name\":\"NatsClientService\",\"url\":\"modules/client_nats_client.html#default.__type.NatsClientService-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"client/nats.client.default.__type\"},{\"id\":34,\"kind\":2,\"name\":\"common/constants\",\"url\":\"modules/common_constants.html\",\"classes\":\"tsd-kind-module\"},{\"id\":35,\"kind\":8,\"name\":\"NATSServices\",\"url\":\"enums/common_constants.NATSServices.html\",\"classes\":\"tsd-kind-enum tsd-parent-kind-module\",\"parent\":\"common/constants\"},{\"id\":36,\"kind\":16,\"name\":\"SERVICE_NAME\",\"url\":\"enums/common_constants.NATSServices.html#SERVICE_NAME\",\"classes\":\"tsd-kind-enum-member tsd-parent-kind-enum\",\"parent\":\"common/constants.NATSServices\"},{\"id\":37,\"kind\":32,\"name\":\"default\",\"url\":\"modules/common_constants.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"common/constants\"},{\"id\":38,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/common_constants.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"common/constants.default\"},{\"id\":39,\"kind\":1024,\"name\":\"NATSServices\",\"url\":\"modules/common_constants.html#default.__type.NATSServices-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"common/constants.default.__type\"},{\"id\":40,\"kind\":2,\"name\":\"common/response\",\"url\":\"modules/common_response.html\",\"classes\":\"tsd-kind-module\"},{\"id\":41,\"kind\":256,\"name\":\"ResponseType\",\"url\":\"interfaces/common_response.ResponseType.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"common/response\"},{\"id\":42,\"kind\":1024,\"name\":\"statusCode\",\"url\":\"interfaces/common_response.ResponseType.html#statusCode\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"common/response.ResponseType\"},{\"id\":43,\"kind\":1024,\"name\":\"message\",\"url\":\"interfaces/common_response.ResponseType.html#message\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"common/response.ResponseType\"},{\"id\":44,\"kind\":1024,\"name\":\"data\",\"url\":\"interfaces/common_response.ResponseType.html#data\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"common/response.ResponseType\"},{\"id\":45,\"kind\":1024,\"name\":\"error\",\"url\":\"interfaces/common_response.ResponseType.html#error\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"common/response.ResponseType\"},{\"id\":46,\"kind\":2,\"name\":\"didComm/controller/controller\",\"url\":\"modules/didComm_controller_controller.html\",\"classes\":\"tsd-kind-module\"},{\"id\":47,\"kind\":128,\"name\":\"DidCommController\",\"url\":\"classes/didComm_controller_controller.DidCommController.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"didComm/controller/controller\"},{\"id\":48,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/didComm_controller_controller.DidCommController.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"didComm/controller/controller.DidCommController\"},{\"id\":49,\"kind\":2048,\"name\":\"generic\",\"url\":\"classes/didComm_controller_controller.DidCommController.html#generic\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"didComm/controller/controller.DidCommController\"},{\"id\":50,\"kind\":2048,\"name\":\"getWalletInfo\",\"url\":\"classes/didComm_controller_controller.DidCommController.html#getWalletInfo\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"didComm/controller/controller.DidCommController\"},{\"id\":51,\"kind\":16777216,\"name\":\"default\",\"url\":\"modules/didComm_controller_controller.html#default\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"didComm/controller/controller\"},{\"id\":52,\"kind\":2,\"name\":\"didComm/didCommUtils\",\"url\":\"modules/didComm_didCommUtils.html\",\"classes\":\"tsd-kind-module\"},{\"id\":53,\"kind\":64,\"name\":\"objectPathLoop\",\"url\":\"modules/didComm_didCommUtils.html#objectPathLoop-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"didComm/didCommUtils\"},{\"id\":54,\"kind\":32,\"name\":\"default\",\"url\":\"modules/didComm_didCommUtils.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"didComm/didCommUtils\"},{\"id\":55,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/didComm_didCommUtils.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"didComm/didCommUtils.default\"},{\"id\":56,\"kind\":1024,\"name\":\"objectPathLoop\",\"url\":\"modules/didComm_didCommUtils.html#default.__type.objectPathLoop\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/didCommUtils.default.__type\"},{\"id\":57,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/didComm_didCommUtils.html#default.__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"didComm/didCommUtils.default.__type\"},{\"id\":58,\"kind\":2,\"name\":\"didComm/entities/GenericBody\",\"url\":\"modules/didComm_entities_GenericBody.html\",\"classes\":\"tsd-kind-module\"},{\"id\":59,\"kind\":256,\"name\":\"GenericBody\",\"url\":\"interfaces/didComm_entities_GenericBody.GenericBody.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"didComm/entities/GenericBody\"},{\"id\":60,\"kind\":1024,\"name\":\"subMethod\",\"url\":\"interfaces/didComm_entities_GenericBody.GenericBody.html#subMethod\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"didComm/entities/GenericBody.GenericBody\"},{\"id\":61,\"kind\":65536,\"name\":\"__type\",\"url\":\"interfaces/didComm_entities_GenericBody.GenericBody.html#__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-interface\",\"parent\":\"didComm/entities/GenericBody.GenericBody\"},{\"id\":62,\"kind\":1024,\"name\":\"name\",\"url\":\"interfaces/didComm_entities_GenericBody.GenericBody.html#__type.name\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/entities/GenericBody.GenericBody.__type\"},{\"id\":63,\"kind\":1024,\"name\":\"subMethodData\",\"url\":\"interfaces/didComm_entities_GenericBody.GenericBody.html#__type.subMethodData\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/entities/GenericBody.GenericBody.__type\"},{\"id\":64,\"kind\":1024,\"name\":\"data\",\"url\":\"interfaces/didComm_entities_GenericBody.GenericBody.html#data\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"didComm/entities/GenericBody.GenericBody\"},{\"id\":65,\"kind\":16777216,\"name\":\"default\",\"url\":\"modules/didComm_entities_GenericBody.html#default\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"didComm/entities/GenericBody\"},{\"id\":66,\"kind\":2,\"name\":\"didComm/module\",\"url\":\"modules/didComm_module.html\",\"classes\":\"tsd-kind-module\"},{\"id\":67,\"kind\":128,\"name\":\"default\",\"url\":\"classes/didComm_module.default.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"didComm/module\"},{\"id\":68,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/didComm_module.default.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"didComm/module.default\"},{\"id\":69,\"kind\":2,\"name\":\"didComm/utils/prepareData\",\"url\":\"modules/didComm_utils_prepareData.html\",\"classes\":\"tsd-kind-module\"},{\"id\":70,\"kind\":64,\"name\":\"prepareInputData\",\"url\":\"modules/didComm_utils_prepareData.html#prepareInputData-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"didComm/utils/prepareData\"},{\"id\":71,\"kind\":64,\"name\":\"prepareOutputData\",\"url\":\"modules/didComm_utils_prepareData.html#prepareOutputData\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"didComm/utils/prepareData\"},{\"id\":72,\"kind\":32,\"name\":\"default\",\"url\":\"modules/didComm_utils_prepareData.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"didComm/utils/prepareData\"},{\"id\":73,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/didComm_utils_prepareData.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"didComm/utils/prepareData.default\"},{\"id\":74,\"kind\":1024,\"name\":\"prepareInputData\",\"url\":\"modules/didComm_utils_prepareData.html#default.__type.prepareInputData\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/utils/prepareData.default.__type\"},{\"id\":75,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/didComm_utils_prepareData.html#default.__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"didComm/utils/prepareData.default.__type\"},{\"id\":76,\"kind\":2,\"name\":\"didComm/utils/whitelist\",\"url\":\"modules/didComm_utils_whitelist.html\",\"classes\":\"tsd-kind-module\"},{\"id\":77,\"kind\":256,\"name\":\"CheckType\",\"url\":\"interfaces/didComm_utils_whitelist.CheckType.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"didComm/utils/whitelist\"},{\"id\":78,\"kind\":1024,\"name\":\"success\",\"url\":\"interfaces/didComm_utils_whitelist.CheckType.html#success\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"didComm/utils/whitelist.CheckType\"},{\"id\":79,\"kind\":1024,\"name\":\"messages\",\"url\":\"interfaces/didComm_utils_whitelist.CheckType.html#messages\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"didComm/utils/whitelist.CheckType\"},{\"id\":80,\"kind\":256,\"name\":\"GenericParams\",\"url\":\"interfaces/didComm_utils_whitelist.GenericParams.html\",\"classes\":\"tsd-kind-interface tsd-parent-kind-module\",\"parent\":\"didComm/utils/whitelist\"},{\"id\":81,\"kind\":1024,\"name\":\"property\",\"url\":\"interfaces/didComm_utils_whitelist.GenericParams.html#property\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"didComm/utils/whitelist.GenericParams\"},{\"id\":82,\"kind\":1024,\"name\":\"method\",\"url\":\"interfaces/didComm_utils_whitelist.GenericParams.html#method\",\"classes\":\"tsd-kind-property tsd-parent-kind-interface\",\"parent\":\"didComm/utils/whitelist.GenericParams\"},{\"id\":83,\"kind\":32,\"name\":\"propertiesList\",\"url\":\"modules/didComm_utils_whitelist.html#propertiesList-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"didComm/utils/whitelist\"},{\"id\":84,\"kind\":32,\"name\":\"methodsList\",\"url\":\"modules/didComm_utils_whitelist.html#methodsList-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"didComm/utils/whitelist\"},{\"id\":85,\"kind\":32,\"name\":\"subMethodsList\",\"url\":\"modules/didComm_utils_whitelist.html#subMethodsList-1\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"didComm/utils/whitelist\"},{\"id\":86,\"kind\":64,\"name\":\"checkAll\",\"url\":\"modules/didComm_utils_whitelist.html#checkAll-1\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"didComm/utils/whitelist\"},{\"id\":87,\"kind\":32,\"name\":\"default\",\"url\":\"modules/didComm_utils_whitelist.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"didComm/utils/whitelist\"},{\"id\":88,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/didComm_utils_whitelist.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"didComm/utils/whitelist.default\"},{\"id\":89,\"kind\":1024,\"name\":\"propertiesList\",\"url\":\"modules/didComm_utils_whitelist.html#default.__type.propertiesList\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/utils/whitelist.default.__type\"},{\"id\":90,\"kind\":1024,\"name\":\"methodsList\",\"url\":\"modules/didComm_utils_whitelist.html#default.__type.methodsList\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/utils/whitelist.default.__type\"},{\"id\":91,\"kind\":1024,\"name\":\"subMethodsList\",\"url\":\"modules/didComm_utils_whitelist.html#default.__type.subMethodsList\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/utils/whitelist.default.__type\"},{\"id\":92,\"kind\":1024,\"name\":\"checkAll\",\"url\":\"modules/didComm_utils_whitelist.html#default.__type.checkAll\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"didComm/utils/whitelist.default.__type\"},{\"id\":93,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/didComm_utils_whitelist.html#default.__type.__type-1\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-type-literal\",\"parent\":\"didComm/utils/whitelist.default.__type\"},{\"id\":94,\"kind\":2,\"name\":\"globalUtils/appConfig\",\"url\":\"modules/globalUtils_appConfig.html\",\"classes\":\"tsd-kind-module\"},{\"id\":95,\"kind\":64,\"name\":\"default\",\"url\":\"modules/globalUtils_appConfig.html#default\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"globalUtils/appConfig\"},{\"id\":96,\"kind\":2,\"name\":\"globalUtils/exception.handler\",\"url\":\"modules/globalUtils_exception_handler.html\",\"classes\":\"tsd-kind-module\"},{\"id\":97,\"kind\":128,\"name\":\"ExceptionHandler\",\"url\":\"classes/globalUtils_exception_handler.ExceptionHandler.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"globalUtils/exception.handler\"},{\"id\":98,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/globalUtils_exception_handler.ExceptionHandler.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"globalUtils/exception.handler.ExceptionHandler\"},{\"id\":99,\"kind\":2048,\"name\":\"catch\",\"url\":\"classes/globalUtils_exception_handler.ExceptionHandler.html#catch\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"globalUtils/exception.handler.ExceptionHandler\"},{\"id\":100,\"kind\":16777216,\"name\":\"default\",\"url\":\"modules/globalUtils_exception_handler.html#default\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"globalUtils/exception.handler\"},{\"id\":101,\"kind\":2,\"name\":\"globalUtils/logger\",\"url\":\"modules/globalUtils_logger.html\",\"classes\":\"tsd-kind-module\"},{\"id\":102,\"kind\":32,\"name\":\"default\",\"url\":\"modules/globalUtils_logger.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"globalUtils/logger\"},{\"id\":103,\"kind\":2,\"name\":\"globalUtils/swagger\",\"url\":\"modules/globalUtils_swagger.html\",\"classes\":\"tsd-kind-module\"},{\"id\":104,\"kind\":64,\"name\":\"default\",\"url\":\"modules/globalUtils_swagger.html#default\",\"classes\":\"tsd-kind-function tsd-parent-kind-module\",\"parent\":\"globalUtils/swagger\"},{\"id\":105,\"kind\":2,\"name\":\"health/health.controller\",\"url\":\"modules/health_health_controller.html\",\"classes\":\"tsd-kind-module\"},{\"id\":106,\"kind\":128,\"name\":\"HealthController\",\"url\":\"classes/health_health_controller.HealthController.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"health/health.controller\"},{\"id\":107,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/health_health_controller.HealthController.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"health/health.controller.HealthController\"},{\"id\":108,\"kind\":2048,\"name\":\"getHealth\",\"url\":\"classes/health_health_controller.HealthController.html#getHealth\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"health/health.controller.HealthController\"},{\"id\":109,\"kind\":16777216,\"name\":\"default\",\"url\":\"modules/health_health_controller.html#default\",\"classes\":\"tsd-kind-reference tsd-parent-kind-module\",\"parent\":\"health/health.controller\"},{\"id\":110,\"kind\":2,\"name\":\"middleware/agentMid.middleware\",\"url\":\"modules/middleware_agentMid_middleware.html\",\"classes\":\"tsd-kind-module\"},{\"id\":111,\"kind\":128,\"name\":\"AgentMid\",\"url\":\"classes/middleware_agentMid_middleware.AgentMid.html\",\"classes\":\"tsd-kind-class tsd-parent-kind-module\",\"parent\":\"middleware/agentMid.middleware\"},{\"id\":112,\"kind\":512,\"name\":\"constructor\",\"url\":\"classes/middleware_agentMid_middleware.AgentMid.html#constructor\",\"classes\":\"tsd-kind-constructor tsd-parent-kind-class\",\"parent\":\"middleware/agentMid.middleware.AgentMid\"},{\"id\":113,\"kind\":2048,\"name\":\"use\",\"url\":\"classes/middleware_agentMid_middleware.AgentMid.html#use\",\"classes\":\"tsd-kind-method tsd-parent-kind-class\",\"parent\":\"middleware/agentMid.middleware.AgentMid\"},{\"id\":114,\"kind\":32,\"name\":\"default\",\"url\":\"modules/middleware_agentMid_middleware.html#default\",\"classes\":\"tsd-kind-variable tsd-parent-kind-module\",\"parent\":\"middleware/agentMid.middleware\"},{\"id\":115,\"kind\":65536,\"name\":\"__type\",\"url\":\"modules/middleware_agentMid_middleware.html#default.__type\",\"classes\":\"tsd-kind-type-literal tsd-parent-kind-variable\",\"parent\":\"middleware/agentMid.middleware.default\"},{\"id\":116,\"kind\":1024,\"name\":\"AgentMid\",\"url\":\"modules/middleware_agentMid_middleware.html#default.__type.AgentMid-1\",\"classes\":\"tsd-kind-property tsd-parent-kind-type-literal\",\"parent\":\"middleware/agentMid.middleware.default.__type\"}],\"index\":{\"version\":\"2.3.9\",\"fields\":[\"name\",\"parent\"],\"fieldVectors\":[[\"name/0\",[0,35.179]],[\"parent/0\",[]],[\"name/1\",[1,38.544]],[\"parent/1\",[0,3.244]],[\"name/2\",[2,18.003]],[\"parent/2\",[0,3.244]],[\"name/3\",[3,20.965]],[\"parent/3\",[4,4.026]],[\"name/4\",[1,38.544]],[\"parent/4\",[5,4.026]],[\"name/5\",[6,35.179]],[\"parent/5\",[]],[\"name/6\",[7,38.544]],[\"parent/6\",[6,3.244]],[\"name/7\",[2,18.003]],[\"parent/7\",[6,3.244]],[\"name/8\",[3,20.965]],[\"parent/8\",[8,4.026]],[\"name/9\",[7,38.544]],[\"parent/9\",[9,4.026]],[\"name/10\",[10,35.179]],[\"parent/10\",[]],[\"name/11\",[11,38.544]],[\"parent/11\",[10,3.244]],[\"name/12\",[2,18.003]],[\"parent/12\",[10,3.244]],[\"name/13\",[3,20.965]],[\"parent/13\",[12,4.026]],[\"name/14\",[11,38.544]],[\"parent/14\",[13,3.555]],[\"name/15\",[3,20.965]],[\"parent/15\",[13,3.555]],[\"name/16\",[14,32.666]],[\"parent/16\",[]],[\"name/17\",[15,43.652]],[\"parent/17\",[14,3.013]],[\"name/18\",[16,43.652]],[\"parent/18\",[14,3.013]],[\"name/19\",[17,26.306]],[\"parent/19\",[18,3.555]],[\"name/20\",[19,43.652]],[\"parent/20\",[18,3.555]],[\"name/21\",[2,18.003]],[\"parent/21\",[14,3.013]],[\"name/22\",[20,35.179]],[\"parent/22\",[]],[\"name/23\",[21,43.652]],[\"parent/23\",[20,3.244]],[\"name/24\",[17,26.306]],[\"parent/24\",[22,3.555]],[\"name/25\",[23,43.652]],[\"parent/25\",[22,3.555]],[\"name/26\",[2,18.003]],[\"parent/26\",[20,3.244]],[\"name/27\",[24,35.179]],[\"parent/27\",[]],[\"name/28\",[25,38.544]],[\"parent/28\",[24,3.244]],[\"name/29\",[17,26.306]],[\"parent/29\",[26,3.555]],[\"name/30\",[27,43.652]],[\"parent/30\",[26,3.555]],[\"name/31\",[2,18.003]],[\"parent/31\",[24,3.244]],[\"name/32\",[3,20.965]],[\"parent/32\",[28,4.026]],[\"name/33\",[25,38.544]],[\"parent/33\",[29,4.026]],[\"name/34\",[30,35.179]],[\"parent/34\",[]],[\"name/35\",[31,38.544]],[\"parent/35\",[30,3.244]],[\"name/36\",[32,43.652]],[\"parent/36\",[33,4.026]],[\"name/37\",[2,18.003]],[\"parent/37\",[30,3.244]],[\"name/38\",[3,20.965]],[\"parent/38\",[34,4.026]],[\"name/39\",[31,38.544]],[\"parent/39\",[35,4.026]],[\"name/40\",[36,38.544]],[\"parent/40\",[]],[\"name/41\",[37,43.652]],[\"parent/41\",[36,3.555]],[\"name/42\",[38,43.652]],[\"parent/42\",[39,3.013]],[\"name/43\",[40,43.652]],[\"parent/43\",[39,3.013]],[\"name/44\",[41,38.544]],[\"parent/44\",[39,3.013]],[\"name/45\",[42,43.652]],[\"parent/45\",[39,3.013]],[\"name/46\",[43,35.179]],[\"parent/46\",[]],[\"name/47\",[44,43.652]],[\"parent/47\",[43,3.244]],[\"name/48\",[17,26.306]],[\"parent/48\",[45,3.244]],[\"name/49\",[46,43.652]],[\"parent/49\",[45,3.244]],[\"name/50\",[47,43.652]],[\"parent/50\",[45,3.244]],[\"name/51\",[2,18.003]],[\"parent/51\",[43,3.244]],[\"name/52\",[48,35.179]],[\"parent/52\",[]],[\"name/53\",[49,38.544]],[\"parent/53\",[48,3.244]],[\"name/54\",[2,18.003]],[\"parent/54\",[48,3.244]],[\"name/55\",[3,20.965]],[\"parent/55\",[50,4.026]],[\"name/56\",[49,38.544]],[\"parent/56\",[51,3.555]],[\"name/57\",[3,20.965]],[\"parent/57\",[51,3.555]],[\"name/58\",[52,35.179]],[\"parent/58\",[]],[\"name/59\",[53,43.652]],[\"parent/59\",[52,3.244]],[\"name/60\",[54,43.652]],[\"parent/60\",[55,3.244]],[\"name/61\",[3,20.965]],[\"parent/61\",[55,3.244]],[\"name/62\",[56,43.652]],[\"parent/62\",[57,3.555]],[\"name/63\",[58,43.652]],[\"parent/63\",[57,3.555]],[\"name/64\",[41,38.544]],[\"parent/64\",[55,3.244]],[\"name/65\",[2,18.003]],[\"parent/65\",[52,3.244]],[\"name/66\",[59,38.544]],[\"parent/66\",[]],[\"name/67\",[2,18.003]],[\"parent/67\",[59,3.555]],[\"name/68\",[17,26.306]],[\"parent/68\",[60,4.026]],[\"name/69\",[61,32.666]],[\"parent/69\",[]],[\"name/70\",[62,38.544]],[\"parent/70\",[61,3.013]],[\"name/71\",[63,43.652]],[\"parent/71\",[61,3.013]],[\"name/72\",[2,18.003]],[\"parent/72\",[61,3.013]],[\"name/73\",[3,20.965]],[\"parent/73\",[64,4.026]],[\"name/74\",[62,38.544]],[\"parent/74\",[65,3.555]],[\"name/75\",[3,20.965]],[\"parent/75\",[65,3.555]],[\"name/76\",[66,26.306]],[\"parent/76\",[]],[\"name/77\",[67,43.652]],[\"parent/77\",[66,2.426]],[\"name/78\",[68,43.652]],[\"parent/78\",[69,3.555]],[\"name/79\",[70,43.652]],[\"parent/79\",[69,3.555]],[\"name/80\",[71,43.652]],[\"parent/80\",[66,2.426]],[\"name/81\",[72,43.652]],[\"parent/81\",[73,3.555]],[\"name/82\",[74,43.652]],[\"parent/82\",[73,3.555]],[\"name/83\",[75,38.544]],[\"parent/83\",[66,2.426]],[\"name/84\",[76,38.544]],[\"parent/84\",[66,2.426]],[\"name/85\",[77,38.544]],[\"parent/85\",[66,2.426]],[\"name/86\",[78,38.544]],[\"parent/86\",[66,2.426]],[\"name/87\",[2,18.003]],[\"parent/87\",[66,2.426]],[\"name/88\",[3,20.965]],[\"parent/88\",[79,4.026]],[\"name/89\",[75,38.544]],[\"parent/89\",[80,2.827]],[\"name/90\",[76,38.544]],[\"parent/90\",[80,2.827]],[\"name/91\",[77,38.544]],[\"parent/91\",[80,2.827]],[\"name/92\",[78,38.544]],[\"parent/92\",[80,2.827]],[\"name/93\",[3,20.965]],[\"parent/93\",[80,2.827]],[\"name/94\",[81,38.544]],[\"parent/94\",[]],[\"name/95\",[2,18.003]],[\"parent/95\",[81,3.555]],[\"name/96\",[82,35.179]],[\"parent/96\",[]],[\"name/97\",[83,43.652]],[\"parent/97\",[82,3.244]],[\"name/98\",[17,26.306]],[\"parent/98\",[84,3.555]],[\"name/99\",[85,43.652]],[\"parent/99\",[84,3.555]],[\"name/100\",[2,18.003]],[\"parent/100\",[82,3.244]],[\"name/101\",[86,38.544]],[\"parent/101\",[]],[\"name/102\",[2,18.003]],[\"parent/102\",[86,3.555]],[\"name/103\",[87,38.544]],[\"parent/103\",[]],[\"name/104\",[2,18.003]],[\"parent/104\",[87,3.555]],[\"name/105\",[88,35.179]],[\"parent/105\",[]],[\"name/106\",[89,43.652]],[\"parent/106\",[88,3.244]],[\"name/107\",[17,26.306]],[\"parent/107\",[90,3.555]],[\"name/108\",[91,43.652]],[\"parent/108\",[90,3.555]],[\"name/109\",[2,18.003]],[\"parent/109\",[88,3.244]],[\"name/110\",[92,35.179]],[\"parent/110\",[]],[\"name/111\",[93,38.544]],[\"parent/111\",[92,3.244]],[\"name/112\",[17,26.306]],[\"parent/112\",[94,3.555]],[\"name/113\",[95,43.652]],[\"parent/113\",[94,3.555]],[\"name/114\",[2,18.003]],[\"parent/114\",[92,3.244]],[\"name/115\",[3,20.965]],[\"parent/115\",[96,4.026]],[\"name/116\",[93,38.544]],[\"parent/116\",[97,4.026]]],\"invertedIndex\":[[\"__type\",{\"_index\":3,\"name\":{\"3\":{},\"8\":{},\"13\":{},\"15\":{},\"32\":{},\"38\":{},\"55\":{},\"57\":{},\"61\":{},\"73\":{},\"75\":{},\"88\":{},\"93\":{},\"115\":{}},\"parent\":{}}],[\"agent\",{\"_index\":15,\"name\":{\"17\":{}},\"parent\":{}}],[\"agent/agentutils/ledgerconfig\",{\"_index\":0,\"name\":{\"0\":{}},\"parent\":{\"1\":{},\"2\":{}}}],[\"agent/agentutils/ledgerconfig.default\",{\"_index\":4,\"name\":{},\"parent\":{\"3\":{}}}],[\"agent/agentutils/ledgerconfig.default.__type\",{\"_index\":5,\"name\":{},\"parent\":{\"4\":{}}}],[\"agent/agentutils/listener\",{\"_index\":10,\"name\":{\"10\":{}},\"parent\":{\"11\":{},\"12\":{}}}],[\"agent/agentutils/listener.default\",{\"_index\":12,\"name\":{},\"parent\":{\"13\":{}}}],[\"agent/agentutils/listener.default.__type\",{\"_index\":13,\"name\":{},\"parent\":{\"14\":{},\"15\":{}}}],[\"agent/agentutils/listenerconfig\",{\"_index\":6,\"name\":{\"5\":{}},\"parent\":{\"6\":{},\"7\":{}}}],[\"agent/agentutils/listenerconfig.default\",{\"_index\":8,\"name\":{},\"parent\":{\"8\":{}}}],[\"agent/agentutils/listenerconfig.default.__type\",{\"_index\":9,\"name\":{},\"parent\":{\"9\":{}}}],[\"agent/module\",{\"_index\":14,\"name\":{\"16\":{}},\"parent\":{\"17\":{},\"18\":{},\"21\":{}}}],[\"agent/module.agentmodule\",{\"_index\":18,\"name\":{},\"parent\":{\"19\":{},\"20\":{}}}],[\"agentmid\",{\"_index\":93,\"name\":{\"111\":{},\"116\":{}},\"parent\":{}}],[\"agentmodule\",{\"_index\":16,\"name\":{\"18\":{}},\"parent\":{}}],[\"app.module\",{\"_index\":20,\"name\":{\"22\":{}},\"parent\":{\"23\":{},\"26\":{}}}],[\"app.module.appmodule\",{\"_index\":22,\"name\":{},\"parent\":{\"24\":{},\"25\":{}}}],[\"appmodule\",{\"_index\":21,\"name\":{\"23\":{}},\"parent\":{}}],[\"bcovrin_test_genesis\",{\"_index\":1,\"name\":{\"1\":{},\"4\":{}},\"parent\":{}}],[\"catch\",{\"_index\":85,\"name\":{\"99\":{}},\"parent\":{}}],[\"checkall\",{\"_index\":78,\"name\":{\"86\":{},\"92\":{}},\"parent\":{}}],[\"checktype\",{\"_index\":67,\"name\":{\"77\":{}},\"parent\":{}}],[\"client/nats.client\",{\"_index\":24,\"name\":{\"27\":{}},\"parent\":{\"28\":{},\"31\":{}}}],[\"client/nats.client.default\",{\"_index\":28,\"name\":{},\"parent\":{\"32\":{}}}],[\"client/nats.client.default.__type\",{\"_index\":29,\"name\":{},\"parent\":{\"33\":{}}}],[\"client/nats.client.natsclientservice\",{\"_index\":26,\"name\":{},\"parent\":{\"29\":{},\"30\":{}}}],[\"common/constants\",{\"_index\":30,\"name\":{\"34\":{}},\"parent\":{\"35\":{},\"37\":{}}}],[\"common/constants.default\",{\"_index\":34,\"name\":{},\"parent\":{\"38\":{}}}],[\"common/constants.default.__type\",{\"_index\":35,\"name\":{},\"parent\":{\"39\":{}}}],[\"common/constants.natsservices\",{\"_index\":33,\"name\":{},\"parent\":{\"36\":{}}}],[\"common/response\",{\"_index\":36,\"name\":{\"40\":{}},\"parent\":{\"41\":{}}}],[\"common/response.responsetype\",{\"_index\":39,\"name\":{},\"parent\":{\"42\":{},\"43\":{},\"44\":{},\"45\":{}}}],[\"configure\",{\"_index\":23,\"name\":{\"25\":{}},\"parent\":{}}],[\"constructor\",{\"_index\":17,\"name\":{\"19\":{},\"24\":{},\"29\":{},\"48\":{},\"68\":{},\"98\":{},\"107\":{},\"112\":{}},\"parent\":{}}],[\"data\",{\"_index\":41,\"name\":{\"44\":{},\"64\":{}},\"parent\":{}}],[\"default\",{\"_index\":2,\"name\":{\"2\":{},\"7\":{},\"12\":{},\"21\":{},\"26\":{},\"31\":{},\"37\":{},\"51\":{},\"54\":{},\"65\":{},\"67\":{},\"72\":{},\"87\":{},\"95\":{},\"100\":{},\"102\":{},\"104\":{},\"109\":{},\"114\":{}},\"parent\":{}}],[\"didcomm/controller/controller\",{\"_index\":43,\"name\":{\"46\":{}},\"parent\":{\"47\":{},\"51\":{}}}],[\"didcomm/controller/controller.didcommcontroller\",{\"_index\":45,\"name\":{},\"parent\":{\"48\":{},\"49\":{},\"50\":{}}}],[\"didcomm/didcommutils\",{\"_index\":48,\"name\":{\"52\":{}},\"parent\":{\"53\":{},\"54\":{}}}],[\"didcomm/didcommutils.default\",{\"_index\":50,\"name\":{},\"parent\":{\"55\":{}}}],[\"didcomm/didcommutils.default.__type\",{\"_index\":51,\"name\":{},\"parent\":{\"56\":{},\"57\":{}}}],[\"didcomm/entities/genericbody\",{\"_index\":52,\"name\":{\"58\":{}},\"parent\":{\"59\":{},\"65\":{}}}],[\"didcomm/entities/genericbody.genericbody\",{\"_index\":55,\"name\":{},\"parent\":{\"60\":{},\"61\":{},\"64\":{}}}],[\"didcomm/entities/genericbody.genericbody.__type\",{\"_index\":57,\"name\":{},\"parent\":{\"62\":{},\"63\":{}}}],[\"didcomm/module\",{\"_index\":59,\"name\":{\"66\":{}},\"parent\":{\"67\":{}}}],[\"didcomm/module.default\",{\"_index\":60,\"name\":{},\"parent\":{\"68\":{}}}],[\"didcomm/utils/preparedata\",{\"_index\":61,\"name\":{\"69\":{}},\"parent\":{\"70\":{},\"71\":{},\"72\":{}}}],[\"didcomm/utils/preparedata.default\",{\"_index\":64,\"name\":{},\"parent\":{\"73\":{}}}],[\"didcomm/utils/preparedata.default.__type\",{\"_index\":65,\"name\":{},\"parent\":{\"74\":{},\"75\":{}}}],[\"didcomm/utils/whitelist\",{\"_index\":66,\"name\":{\"76\":{}},\"parent\":{\"77\":{},\"80\":{},\"83\":{},\"84\":{},\"85\":{},\"86\":{},\"87\":{}}}],[\"didcomm/utils/whitelist.checktype\",{\"_index\":69,\"name\":{},\"parent\":{\"78\":{},\"79\":{}}}],[\"didcomm/utils/whitelist.default\",{\"_index\":79,\"name\":{},\"parent\":{\"88\":{}}}],[\"didcomm/utils/whitelist.default.__type\",{\"_index\":80,\"name\":{},\"parent\":{\"89\":{},\"90\":{},\"91\":{},\"92\":{},\"93\":{}}}],[\"didcomm/utils/whitelist.genericparams\",{\"_index\":73,\"name\":{},\"parent\":{\"81\":{},\"82\":{}}}],[\"didcommcontroller\",{\"_index\":44,\"name\":{\"47\":{}},\"parent\":{}}],[\"error\",{\"_index\":42,\"name\":{\"45\":{}},\"parent\":{}}],[\"exceptionhandler\",{\"_index\":83,\"name\":{\"97\":{}},\"parent\":{}}],[\"generic\",{\"_index\":46,\"name\":{\"49\":{}},\"parent\":{}}],[\"genericbody\",{\"_index\":53,\"name\":{\"59\":{}},\"parent\":{}}],[\"genericparams\",{\"_index\":71,\"name\":{\"80\":{}},\"parent\":{}}],[\"gethealth\",{\"_index\":91,\"name\":{\"108\":{}},\"parent\":{}}],[\"getwalletinfo\",{\"_index\":47,\"name\":{\"50\":{}},\"parent\":{}}],[\"globalutils/appconfig\",{\"_index\":81,\"name\":{\"94\":{}},\"parent\":{\"95\":{}}}],[\"globalutils/exception.handler\",{\"_index\":82,\"name\":{\"96\":{}},\"parent\":{\"97\":{},\"100\":{}}}],[\"globalutils/exception.handler.exceptionhandler\",{\"_index\":84,\"name\":{},\"parent\":{\"98\":{},\"99\":{}}}],[\"globalutils/logger\",{\"_index\":86,\"name\":{\"101\":{}},\"parent\":{\"102\":{}}}],[\"globalutils/swagger\",{\"_index\":87,\"name\":{\"103\":{}},\"parent\":{\"104\":{}}}],[\"health/health.controller\",{\"_index\":88,\"name\":{\"105\":{}},\"parent\":{\"106\":{},\"109\":{}}}],[\"health/health.controller.healthcontroller\",{\"_index\":90,\"name\":{},\"parent\":{\"107\":{},\"108\":{}}}],[\"healthcontroller\",{\"_index\":89,\"name\":{\"106\":{}},\"parent\":{}}],[\"listenerconfig\",{\"_index\":7,\"name\":{\"6\":{},\"9\":{}},\"parent\":{}}],[\"message\",{\"_index\":40,\"name\":{\"43\":{}},\"parent\":{}}],[\"messages\",{\"_index\":70,\"name\":{\"79\":{}},\"parent\":{}}],[\"method\",{\"_index\":74,\"name\":{\"82\":{}},\"parent\":{}}],[\"methodslist\",{\"_index\":76,\"name\":{\"84\":{},\"90\":{}},\"parent\":{}}],[\"middleware/agentmid.middleware\",{\"_index\":92,\"name\":{\"110\":{}},\"parent\":{\"111\":{},\"114\":{}}}],[\"middleware/agentmid.middleware.agentmid\",{\"_index\":94,\"name\":{},\"parent\":{\"112\":{},\"113\":{}}}],[\"middleware/agentmid.middleware.default\",{\"_index\":96,\"name\":{},\"parent\":{\"115\":{}}}],[\"middleware/agentmid.middleware.default.__type\",{\"_index\":97,\"name\":{},\"parent\":{\"116\":{}}}],[\"name\",{\"_index\":56,\"name\":{\"62\":{}},\"parent\":{}}],[\"natsclientservice\",{\"_index\":25,\"name\":{\"28\":{},\"33\":{}},\"parent\":{}}],[\"natsservices\",{\"_index\":31,\"name\":{\"35\":{},\"39\":{}},\"parent\":{}}],[\"objectpathloop\",{\"_index\":49,\"name\":{\"53\":{},\"56\":{}},\"parent\":{}}],[\"onmoduledestroy\",{\"_index\":19,\"name\":{\"20\":{}},\"parent\":{}}],[\"prepareinputdata\",{\"_index\":62,\"name\":{\"70\":{},\"74\":{}},\"parent\":{}}],[\"prepareoutputdata\",{\"_index\":63,\"name\":{\"71\":{}},\"parent\":{}}],[\"propertieslist\",{\"_index\":75,\"name\":{\"83\":{},\"89\":{}},\"parent\":{}}],[\"property\",{\"_index\":72,\"name\":{\"81\":{}},\"parent\":{}}],[\"publish\",{\"_index\":27,\"name\":{\"30\":{}},\"parent\":{}}],[\"responsetype\",{\"_index\":37,\"name\":{\"41\":{}},\"parent\":{}}],[\"service_name\",{\"_index\":32,\"name\":{\"36\":{}},\"parent\":{}}],[\"statuscode\",{\"_index\":38,\"name\":{\"42\":{}},\"parent\":{}}],[\"submethod\",{\"_index\":54,\"name\":{\"60\":{}},\"parent\":{}}],[\"submethoddata\",{\"_index\":58,\"name\":{\"63\":{}},\"parent\":{}}],[\"submethodslist\",{\"_index\":77,\"name\":{\"85\":{},\"91\":{}},\"parent\":{}}],[\"subscribe\",{\"_index\":11,\"name\":{\"11\":{},\"14\":{}},\"parent\":{}}],[\"success\",{\"_index\":68,\"name\":{\"78\":{}},\"parent\":{}}],[\"use\",{\"_index\":95,\"name\":{\"113\":{}},\"parent\":{}}]],\"pipeline\":[]}}"); \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/assets/style.css b/apps/ssi-abstraction/docs/assets/style.css new file mode 100644 index 0000000000000000000000000000000000000000..6127b27cdabdc2791e57dfc37d9ad3b3dfd718a2 --- /dev/null +++ b/apps/ssi-abstraction/docs/assets/style.css @@ -0,0 +1,1414 @@ +@import url("./icons.css"); + +:root { + /* Light */ + --light-color-background: #fcfcfc; + --light-color-secondary-background: #fff; + --light-color-text: #222; + --light-color-text-aside: #707070; + --light-color-link: #4da6ff; + --light-color-menu-divider: #eee; + --light-color-menu-divider-focus: #000; + --light-color-menu-label: #707070; + --light-color-panel: var(--light-color-secondary-background); + --light-color-panel-divider: #eee; + --light-color-comment-tag: #707070; + --light-color-comment-tag-text: #fff; + --light-color-ts: #9600ff; + --light-color-ts-interface: #647f1b; + --light-color-ts-enum: #937210; + --light-color-ts-class: #0672de; + --light-color-ts-private: #707070; + --light-color-toolbar: #fff; + --light-color-toolbar-text: #333; + --light-icon-filter: invert(0); + --light-external-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' width='10' height='10'><path fill-opacity='0' stroke='%23000' stroke-width='10' d='m43,35H5v60h60V57M45,5v10l10,10-30,30 20,20 30-30 10,10h10V5z'/></svg>"); + + /* Dark */ + --dark-color-background: #36393f; + --dark-color-secondary-background: #2f3136; + --dark-color-text: #ffffff; + --dark-color-text-aside: #e6e4e4; + --dark-color-link: #00aff4; + --dark-color-menu-divider: #eee; + --dark-color-menu-divider-focus: #000; + --dark-color-menu-label: #707070; + --dark-color-panel: var(--dark-color-secondary-background); + --dark-color-panel-divider: #818181; + --dark-color-comment-tag: #dcddde; + --dark-color-comment-tag-text: #2f3136; + --dark-color-ts: #c97dff; + --dark-color-ts-interface: #9cbe3c; + --dark-color-ts-enum: #d6ab29; + --dark-color-ts-class: #3695f3; + --dark-color-ts-private: #e2e2e2; + --dark-color-toolbar: #34373c; + --dark-color-toolbar-text: #ffffff; + --dark-icon-filter: invert(1); + --dark-external-icon: url("data:image/svg+xml;utf8,<svg xmlns='http://www.w3.org/2000/svg' viewBox='0 0 100 100' width='10' height='10'><path fill-opacity='0' stroke='%23fff' stroke-width='10' d='m43,35H5v60h60V57M45,5v10l10,10-30,30 20,20 30-30 10,10h10V5z'/></svg>"); +} + +@media (prefers-color-scheme: light) { + :root { + --color-background: var(--light-color-background); + --color-secondary-background: var(--light-color-secondary-background); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-menu-divider: var(--light-color-menu-divider); + --color-menu-divider-focus: var(--light-color-menu-divider-focus); + --color-menu-label: var(--light-color-menu-label); + --color-panel: var(--light-color-panel); + --color-panel-divider: var(--light-color-panel-divider); + --color-comment-tag: var(--light-color-comment-tag); + --color-comment-tag-text: var(--light-color-comment-tag-text); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-private: var(--light-color-ts-private); + --color-toolbar: var(--light-color-toolbar); + --color-toolbar-text: var(--light-color-toolbar-text); + --icon-filter: var(--light-icon-filter); + --external-icon: var(--light-external-icon); + } +} + +@media (prefers-color-scheme: dark) { + :root { + --color-background: var(--dark-color-background); + --color-secondary-background: var(--dark-color-secondary-background); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-menu-divider: var(--dark-color-menu-divider); + --color-menu-divider-focus: var(--dark-color-menu-divider-focus); + --color-menu-label: var(--dark-color-menu-label); + --color-panel: var(--dark-color-panel); + --color-panel-divider: var(--dark-color-panel-divider); + --color-comment-tag: var(--dark-color-comment-tag); + --color-comment-tag-text: var(--dark-color-comment-tag-text); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-private: var(--dark-color-ts-private); + --color-toolbar: var(--dark-color-toolbar); + --color-toolbar-text: var(--dark-color-toolbar-text); + --icon-filter: var(--dark-icon-filter); + --external-icon: var(--dark-external-icon); + } +} + +body { + margin: 0; +} + +body.light { + --color-background: var(--light-color-background); + --color-secondary-background: var(--light-color-secondary-background); + --color-text: var(--light-color-text); + --color-text-aside: var(--light-color-text-aside); + --color-link: var(--light-color-link); + --color-menu-divider: var(--light-color-menu-divider); + --color-menu-divider-focus: var(--light-color-menu-divider-focus); + --color-menu-label: var(--light-color-menu-label); + --color-panel: var(--light-color-panel); + --color-panel-divider: var(--light-color-panel-divider); + --color-comment-tag: var(--light-color-comment-tag); + --color-comment-tag-text: var(--light-color-comment-tag-text); + --color-ts: var(--light-color-ts); + --color-ts-interface: var(--light-color-ts-interface); + --color-ts-enum: var(--light-color-ts-enum); + --color-ts-class: var(--light-color-ts-class); + --color-ts-private: var(--light-color-ts-private); + --color-toolbar: var(--light-color-toolbar); + --color-toolbar-text: var(--light-color-toolbar-text); + --icon-filter: var(--light-icon-filter); + --external-icon: var(--light-external-icon); +} + +body.dark { + --color-background: var(--dark-color-background); + --color-secondary-background: var(--dark-color-secondary-background); + --color-text: var(--dark-color-text); + --color-text-aside: var(--dark-color-text-aside); + --color-link: var(--dark-color-link); + --color-menu-divider: var(--dark-color-menu-divider); + --color-menu-divider-focus: var(--dark-color-menu-divider-focus); + --color-menu-label: var(--dark-color-menu-label); + --color-panel: var(--dark-color-panel); + --color-panel-divider: var(--dark-color-panel-divider); + --color-comment-tag: var(--dark-color-comment-tag); + --color-comment-tag-text: var(--dark-color-comment-tag-text); + --color-ts: var(--dark-color-ts); + --color-ts-interface: var(--dark-color-ts-interface); + --color-ts-enum: var(--dark-color-ts-enum); + --color-ts-class: var(--dark-color-ts-class); + --color-ts-private: var(--dark-color-ts-private); + --color-toolbar: var(--dark-color-toolbar); + --color-toolbar-text: var(--dark-color-toolbar-text); + --icon-filter: var(--dark-icon-filter); + --external-icon: var(--dark-external-icon); +} + +h1, +h2, +h3, +h4, +h5, +h6 { + line-height: 1.2; +} + +h1 { + font-size: 2em; + margin: 0.67em 0; +} + +h2 { + font-size: 1.5em; + margin: 0.83em 0; +} + +h3 { + font-size: 1.17em; + margin: 1em 0; +} + +h4, +.tsd-index-panel h3 { + font-size: 1em; + margin: 1.33em 0; +} + +h5 { + font-size: 0.83em; + margin: 1.67em 0; +} + +h6 { + font-size: 0.67em; + margin: 2.33em 0; +} + +pre { + white-space: pre; + white-space: pre-wrap; + word-wrap: break-word; +} + +dl, +menu, +ol, +ul { + margin: 1em 0; +} + +dd { + margin: 0 0 0 40px; +} + +.container { + max-width: 1200px; + margin: 0 auto; + padding: 0 40px; +} +@media (max-width: 640px) { + .container { + padding: 0 20px; + } +} + +.container-main { + padding-bottom: 200px; +} + +.row { + display: flex; + position: relative; + margin: 0 -10px; +} +.row:after { + visibility: hidden; + display: block; + content: ""; + clear: both; + height: 0; +} + +.col-4, +.col-8 { + box-sizing: border-box; + float: left; + padding: 0 10px; +} + +.col-4 { + width: 33.3333333333%; +} +.col-8 { + width: 66.6666666667%; +} + +ul.tsd-descriptions > li > :first-child, +.tsd-panel > :first-child, +.col-8 > :first-child, +.col-4 > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child, +.tsd-panel > :first-child > :first-child, +.col-8 > :first-child > :first-child, +.col-4 > :first-child > :first-child, +ul.tsd-descriptions > li > :first-child > :first-child > :first-child, +.tsd-panel > :first-child > :first-child > :first-child, +.col-8 > :first-child > :first-child > :first-child, +.col-4 > :first-child > :first-child > :first-child { + margin-top: 0; +} +ul.tsd-descriptions > li > :last-child, +.tsd-panel > :last-child, +.col-8 > :last-child, +.col-4 > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child, +.tsd-panel > :last-child > :last-child, +.col-8 > :last-child > :last-child, +.col-4 > :last-child > :last-child, +ul.tsd-descriptions > li > :last-child > :last-child > :last-child, +.tsd-panel > :last-child > :last-child > :last-child, +.col-8 > :last-child > :last-child > :last-child, +.col-4 > :last-child > :last-child > :last-child { + margin-bottom: 0; +} + +@keyframes fade-in { + from { + opacity: 0; + } + to { + opacity: 1; + } +} +@keyframes fade-out { + from { + opacity: 1; + visibility: visible; + } + to { + opacity: 0; + } +} +@keyframes fade-in-delayed { + 0% { + opacity: 0; + } + 33% { + opacity: 0; + } + 100% { + opacity: 1; + } +} +@keyframes fade-out-delayed { + 0% { + opacity: 1; + visibility: visible; + } + 66% { + opacity: 0; + } + 100% { + opacity: 0; + } +} +@keyframes shift-to-left { + from { + transform: translate(0, 0); + } + to { + transform: translate(-25%, 0); + } +} +@keyframes unshift-to-left { + from { + transform: translate(-25%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-in-from-right { + from { + transform: translate(100%, 0); + } + to { + transform: translate(0, 0); + } +} +@keyframes pop-out-to-right { + from { + transform: translate(0, 0); + visibility: visible; + } + to { + transform: translate(100%, 0); + } +} +body { + background: var(--color-background); + font-family: "Segoe UI", sans-serif; + font-size: 16px; + color: var(--color-text); +} + +a { + color: var(--color-link); + text-decoration: none; +} +a:hover { + text-decoration: underline; +} +a.external[target="_blank"] { + background-image: var(--external-icon); + background-position: top 3px right; + background-repeat: no-repeat; + padding-right: 13px; +} + +code, +pre { + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + padding: 0.2em; + margin: 0; + font-size: 14px; +} + +pre { + padding: 10px; +} +pre code { + padding: 0; + font-size: 100%; +} + +blockquote { + margin: 1em 0; + padding-left: 1em; + border-left: 4px solid gray; +} + +.tsd-typography { + line-height: 1.333em; +} +.tsd-typography ul { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-typography h4, +.tsd-typography .tsd-index-panel h3, +.tsd-index-panel .tsd-typography h3, +.tsd-typography h5, +.tsd-typography h6 { + font-size: 1em; + margin: 0; +} +.tsd-typography h5, +.tsd-typography h6 { + font-weight: normal; +} +.tsd-typography p, +.tsd-typography ul, +.tsd-typography ol { + margin: 1em 0; +} + +@media (min-width: 901px) and (max-width: 1024px) { + html .col-content { + width: 72%; + } + html .col-menu { + width: 28%; + } + html .tsd-navigation { + padding-left: 10px; + } +} +@media (max-width: 900px) { + html .col-content { + float: none; + width: 100%; + } + html .col-menu { + position: fixed !important; + overflow: auto; + -webkit-overflow-scrolling: touch; + z-index: 1024; + top: 0 !important; + bottom: 0 !important; + left: auto !important; + right: 0 !important; + width: 100%; + padding: 20px 20px 0 0; + max-width: 450px; + visibility: hidden; + background-color: var(--color-panel); + transform: translate(100%, 0); + } + html .col-menu > *:last-child { + padding-bottom: 20px; + } + html .overlay { + content: ""; + display: block; + position: fixed; + z-index: 1023; + top: 0; + left: 0; + right: 0; + bottom: 0; + background-color: rgba(0, 0, 0, 0.75); + visibility: hidden; + } + + .to-has-menu .overlay { + animation: fade-in 0.4s; + } + + .to-has-menu :is(header, footer, .col-content) { + animation: shift-to-left 0.4s; + } + + .to-has-menu .col-menu { + animation: pop-in-from-right 0.4s; + } + + .from-has-menu .overlay { + animation: fade-out 0.4s; + } + + .from-has-menu :is(header, footer, .col-content) { + animation: unshift-to-left 0.4s; + } + + .from-has-menu .col-menu { + animation: pop-out-to-right 0.4s; + } + + .has-menu body { + overflow: hidden; + } + .has-menu .overlay { + visibility: visible; + } + .has-menu :is(header, footer, .col-content) { + transform: translate(-25%, 0); + } + .has-menu .col-menu { + visibility: visible; + transform: translate(0, 0); + display: grid; + grid-template-rows: auto 1fr; + max-height: 100vh; + } + .has-menu .tsd-navigation { + max-height: 100%; + } +} + +.tsd-page-title { + padding: 70px 0 20px 0; + margin: 0 0 40px 0; + background: var(--color-panel); + box-shadow: 0 0 5px rgba(0, 0, 0, 0.35); +} +.tsd-page-title h1 { + margin: 0; +} + +.tsd-breadcrumb { + margin: 0; + padding: 0; + color: var(--color-text-aside); +} +.tsd-breadcrumb a { + color: var(--color-text-aside); + text-decoration: none; +} +.tsd-breadcrumb a:hover { + text-decoration: underline; +} +.tsd-breadcrumb li { + display: inline; +} +.tsd-breadcrumb li:after { + content: " / "; +} + +dl.tsd-comment-tags { + overflow: hidden; +} +dl.tsd-comment-tags dt { + float: left; + padding: 1px 5px; + margin: 0 10px 0 0; + border-radius: 4px; + border: 1px solid var(--color-comment-tag); + color: var(--color-comment-tag); + font-size: 0.8em; + font-weight: normal; +} +dl.tsd-comment-tags dd { + margin: 0 0 10px 0; +} +dl.tsd-comment-tags dd:before, +dl.tsd-comment-tags dd:after { + display: table; + content: " "; +} +dl.tsd-comment-tags dd pre, +dl.tsd-comment-tags dd:after { + clear: both; +} +dl.tsd-comment-tags p { + margin: 0; +} + +.tsd-panel.tsd-comment .lead { + font-size: 1.1em; + line-height: 1.333em; + margin-bottom: 2em; +} +.tsd-panel.tsd-comment .lead:last-child { + margin-bottom: 0; +} + +.toggle-protected .tsd-is-private { + display: none; +} + +.toggle-public .tsd-is-private, +.toggle-public .tsd-is-protected, +.toggle-public .tsd-is-private-protected { + display: none; +} + +.toggle-inherited .tsd-is-inherited { + display: none; +} + +.toggle-externals .tsd-is-external { + display: none; +} + +#tsd-filter { + position: relative; + display: inline-block; + height: 40px; + vertical-align: bottom; +} +.no-filter #tsd-filter { + display: none; +} +#tsd-filter .tsd-filter-group { + display: inline-block; + height: 40px; + vertical-align: bottom; + white-space: nowrap; +} +#tsd-filter input { + display: none; +} +@media (max-width: 900px) { + #tsd-filter .tsd-filter-group { + display: block; + position: absolute; + top: 40px; + right: 20px; + height: auto; + background-color: var(--color-panel); + visibility: hidden; + transform: translate(50%, 0); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + } + .has-options #tsd-filter .tsd-filter-group { + visibility: visible; + } + .to-has-options #tsd-filter .tsd-filter-group { + animation: fade-in 0.2s; + } + .from-has-options #tsd-filter .tsd-filter-group { + animation: fade-out 0.2s; + } + #tsd-filter label, + #tsd-filter .tsd-select { + display: block; + padding-right: 20px; + } +} + +footer { + border-top: 1px solid var(--color-panel-divider); + background-color: var(--color-panel); +} +footer:after { + content: ""; + display: table; +} +footer.with-border-bottom { + border-bottom: 1px solid var(--color-panel-divider); +} +footer .tsd-legend-group { + font-size: 0; +} +footer .tsd-legend { + display: inline-block; + width: 25%; + padding: 0; + font-size: 16px; + list-style: none; + line-height: 1.333em; + vertical-align: top; +} +@media (max-width: 900px) { + footer .tsd-legend { + width: 50%; + } +} + +.tsd-hierarchy { + list-style: square; + padding: 0 0 0 20px; + margin: 0; +} +.tsd-hierarchy .target { + font-weight: bold; +} + +.tsd-index-panel .tsd-index-content { + margin-bottom: -30px !important; +} +.tsd-index-panel .tsd-index-section { + margin-bottom: 30px !important; +} +.tsd-index-panel h3 { + margin: 0 -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 3; + -moz-column-count: 3; + -ms-column-count: 3; + -o-column-count: 3; + column-count: 3; + -webkit-column-gap: 20px; + -moz-column-gap: 20px; + -ms-column-gap: 20px; + -o-column-gap: 20px; + column-gap: 20px; + padding: 0; + list-style: none; + line-height: 1.333em; +} +@media (max-width: 900px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 1; + -moz-column-count: 1; + -ms-column-count: 1; + -o-column-count: 1; + column-count: 1; + } +} +@media (min-width: 901px) and (max-width: 1024px) { + .tsd-index-panel ul.tsd-index-list { + -webkit-column-count: 2; + -moz-column-count: 2; + -ms-column-count: 2; + -o-column-count: 2; + column-count: 2; + } +} +.tsd-index-panel ul.tsd-index-list li { + -webkit-page-break-inside: avoid; + -moz-page-break-inside: avoid; + -ms-page-break-inside: avoid; + -o-page-break-inside: avoid; + page-break-inside: avoid; +} +.tsd-index-panel a, +.tsd-index-panel .tsd-parent-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-parent-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-parent-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-parent-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-kind-module a { + color: var(--color-ts); +} +.tsd-index-panel .tsd-kind-interface a { + color: var(--color-ts-interface); +} +.tsd-index-panel .tsd-kind-enum a { + color: var(--color-ts-enum); +} +.tsd-index-panel .tsd-kind-class a { + color: var(--color-ts-class); +} +.tsd-index-panel .tsd-is-private a { + color: var(--color-ts-private); +} + +.tsd-flag { + display: inline-block; + padding: 0.25em 0.4em; + border-radius: 4px; + color: var(--color-comment-tag-text); + background-color: var(--color-comment-tag); + text-indent: 0; + font-size: 75%; + line-height: 1; + font-weight: normal; +} + +.tsd-anchor { + position: absolute; + top: -100px; +} + +.tsd-member { + position: relative; +} +.tsd-member .tsd-anchor + h3 { + margin-top: 0; + margin-bottom: 0; + border-bottom: none; +} +.tsd-member [data-tsd-kind] { + color: var(--color-ts); +} +.tsd-member [data-tsd-kind="Interface"] { + color: var(--color-ts-interface); +} +.tsd-member [data-tsd-kind="Enum"] { + color: var(--color-ts-enum); +} +.tsd-member [data-tsd-kind="Class"] { + color: var(--color-ts-class); +} +.tsd-member [data-tsd-kind="Private"] { + color: var(--color-ts-private); +} + +.tsd-navigation { + margin: 0 0 0 40px; +} +.tsd-navigation a { + display: block; + padding-top: 2px; + padding-bottom: 2px; + border-left: 2px solid transparent; + color: var(--color-text); + text-decoration: none; + transition: border-left-color 0.1s; +} +.tsd-navigation a:hover { + text-decoration: underline; +} +.tsd-navigation ul { + margin: 0; + padding: 0; + list-style: none; +} +.tsd-navigation li { + padding: 0; +} + +.tsd-navigation.primary { + padding-bottom: 40px; +} +.tsd-navigation.primary a { + display: block; + padding-top: 6px; + padding-bottom: 6px; +} +.tsd-navigation.primary ul li a { + padding-left: 5px; +} +.tsd-navigation.primary ul li li a { + padding-left: 25px; +} +.tsd-navigation.primary ul li li li a { + padding-left: 45px; +} +.tsd-navigation.primary ul li li li li a { + padding-left: 65px; +} +.tsd-navigation.primary ul li li li li li a { + padding-left: 85px; +} +.tsd-navigation.primary ul li li li li li li a { + padding-left: 105px; +} +.tsd-navigation.primary > ul { + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li { + border-top: 1px solid var(--color-panel-divider); +} +.tsd-navigation.primary li.current > a { + font-weight: bold; +} +.tsd-navigation.primary li.label span { + display: block; + padding: 20px 0 6px 5px; + color: var(--color-menu-label); +} +.tsd-navigation.primary li.globals + li > span, +.tsd-navigation.primary li.globals + li > a { + padding-top: 20px; +} + +.tsd-navigation.secondary { + max-height: calc(100vh - 1rem - 40px); + overflow: auto; + position: sticky; + top: calc(0.5rem + 40px); + transition: 0.3s; +} +.tsd-navigation.secondary.tsd-navigation--toolbar-hide { + max-height: calc(100vh - 1rem); + top: 0.5rem; +} +.tsd-navigation.secondary ul { + transition: opacity 0.2s; +} +.tsd-navigation.secondary ul li a { + padding-left: 25px; +} +.tsd-navigation.secondary ul li li a { + padding-left: 45px; +} +.tsd-navigation.secondary ul li li li a { + padding-left: 65px; +} +.tsd-navigation.secondary ul li li li li a { + padding-left: 85px; +} +.tsd-navigation.secondary ul li li li li li a { + padding-left: 105px; +} +.tsd-navigation.secondary ul li li li li li li a { + padding-left: 125px; +} +.tsd-navigation.secondary ul.current a { + border-left-color: var(--color-panel-divider); +} +.tsd-navigation.secondary li.focus > a, +.tsd-navigation.secondary ul.current li.focus > a { + border-left-color: var(--color-menu-divider-focus); +} +.tsd-navigation.secondary li.current { + margin-top: 20px; + margin-bottom: 20px; + border-left-color: var(--color-panel-divider); +} +.tsd-navigation.secondary li.current > a { + font-weight: bold; +} + +@media (min-width: 901px) { + .menu-sticky-wrap { + position: static; + } +} + +.tsd-panel { + margin: 20px 0; + padding: 20px; + background-color: var(--color-panel); + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +.tsd-panel:empty { + display: none; +} +.tsd-panel > h1, +.tsd-panel > h2, +.tsd-panel > h3 { + margin: 1.5em -20px 10px -20px; + padding: 0 20px 10px 20px; + border-bottom: 1px solid var(--color-panel-divider); +} +.tsd-panel > h1.tsd-before-signature, +.tsd-panel > h2.tsd-before-signature, +.tsd-panel > h3.tsd-before-signature { + margin-bottom: 0; + border-bottom: 0; +} +.tsd-panel table { + display: block; + width: 100%; + overflow: auto; + margin-top: 10px; + word-break: normal; + word-break: keep-all; + border-collapse: collapse; +} +.tsd-panel table th { + font-weight: bold; +} +.tsd-panel table th, +.tsd-panel table td { + padding: 6px 13px; + border: 1px solid var(--color-panel-divider); +} +.tsd-panel table tr { + background: var(--color-background); +} +.tsd-panel table tr:nth-child(even) { + background: var(--color-secondary-background); +} + +.tsd-panel-group { + margin: 60px 0; +} +.tsd-panel-group > h1, +.tsd-panel-group > h2, +.tsd-panel-group > h3 { + padding-left: 20px; + padding-right: 20px; +} + +#tsd-search { + transition: background-color 0.2s; +} +#tsd-search .title { + position: relative; + z-index: 2; +} +#tsd-search .field { + position: absolute; + left: 0; + top: 0; + right: 40px; + height: 40px; +} +#tsd-search .field input { + box-sizing: border-box; + position: relative; + top: -50px; + z-index: 1; + width: 100%; + padding: 0 10px; + opacity: 0; + outline: 0; + border: 0; + background: transparent; + color: var(--color-text); +} +#tsd-search .field label { + position: absolute; + overflow: hidden; + right: -40px; +} +#tsd-search .field input, +#tsd-search .title { + transition: opacity 0.2s; +} +#tsd-search .results { + position: absolute; + visibility: hidden; + top: 40px; + width: 100%; + margin: 0; + padding: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); +} +#tsd-search .results li { + padding: 0 10px; + background-color: var(--color-background); +} +#tsd-search .results li:nth-child(even) { + background-color: var(--color-panel); +} +#tsd-search .results li.state { + display: none; +} +#tsd-search .results li.current, +#tsd-search .results li:hover { + background-color: var(--color-panel-divider); +} +#tsd-search .results a { + display: block; +} +#tsd-search .results a:before { + top: 10px; +} +#tsd-search .results span.parent { + color: var(--color-text-aside); + font-weight: normal; +} +#tsd-search.has-focus { + background-color: var(--color-panel-divider); +} +#tsd-search.has-focus .field input { + top: 0; + opacity: 1; +} +#tsd-search.has-focus .title { + z-index: 0; + opacity: 0; +} +#tsd-search.has-focus .results { + visibility: visible; +} +#tsd-search.loading .results li.state.loading { + display: block; +} +#tsd-search.failure .results li.state.failure { + display: block; +} + +.tsd-signature { + margin: 0 0 1em 0; + padding: 10px; + border: 1px solid var(--color-panel-divider); + font-family: Menlo, Monaco, Consolas, "Courier New", monospace; + font-size: 14px; + overflow-x: auto; +} +.tsd-signature.tsd-kind-icon { + padding-left: 30px; +} +.tsd-signature.tsd-kind-icon:before { + top: 10px; + left: 10px; +} +.tsd-panel > .tsd-signature { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signature.tsd-kind-icon:before { + left: 20px; +} + +.tsd-signature-symbol { + color: var(--color-text-aside); + font-weight: normal; +} + +.tsd-signature-type { + font-style: italic; + font-weight: normal; +} + +.tsd-signatures { + padding: 0; + margin: 0 0 1em 0; + border: 1px solid var(--color-panel-divider); +} +.tsd-signatures .tsd-signature { + margin: 0; + border-width: 1px 0 0 0; + transition: background-color 0.1s; +} +.tsd-signatures .tsd-signature:first-child { + border-top-width: 0; +} +.tsd-signatures .tsd-signature.current { + background-color: var(--color-panel-divider); +} +.tsd-signatures.active > .tsd-signature { + cursor: pointer; +} +.tsd-panel > .tsd-signatures { + margin-left: -20px; + margin-right: -20px; + border-width: 1px 0; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon { + padding-left: 40px; +} +.tsd-panel > .tsd-signatures .tsd-signature.tsd-kind-icon:before { + left: 20px; +} +.tsd-panel > a.anchor + .tsd-signatures { + border-top-width: 0; + margin-top: -20px; +} + +ul.tsd-descriptions { + position: relative; + overflow: hidden; + padding: 0; + list-style: none; +} +ul.tsd-descriptions.active > .tsd-description { + display: none; +} +ul.tsd-descriptions.active > .tsd-description.current { + display: block; +} +ul.tsd-descriptions.active > .tsd-description.fade-in { + animation: fade-in-delayed 0.3s; +} +ul.tsd-descriptions.active > .tsd-description.fade-out { + animation: fade-out-delayed 0.3s; + position: absolute; + display: block; + top: 0; + left: 0; + right: 0; + opacity: 0; + visibility: hidden; +} +ul.tsd-descriptions h4, +ul.tsd-descriptions .tsd-index-panel h3, +.tsd-index-panel ul.tsd-descriptions h3 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} + +ul.tsd-parameters, +ul.tsd-type-parameters { + list-style: square; + margin: 0; + padding-left: 20px; +} +ul.tsd-parameters > li.tsd-parameter-signature, +ul.tsd-type-parameters > li.tsd-parameter-signature { + list-style: none; + margin-left: -20px; +} +ul.tsd-parameters h5, +ul.tsd-type-parameters h5 { + font-size: 16px; + margin: 1em 0 0.5em 0; +} +ul.tsd-parameters .tsd-comment, +ul.tsd-type-parameters .tsd-comment { + margin-top: -0.5em; +} + +.tsd-sources { + font-size: 14px; + color: var(--color-text-aside); + margin: 0 0 1em 0; +} +.tsd-sources a { + color: var(--color-text-aside); + text-decoration: underline; +} +.tsd-sources ul, +.tsd-sources p { + margin: 0 !important; +} +.tsd-sources ul { + list-style: none; + padding: 0; +} + +.tsd-page-toolbar { + position: fixed; + z-index: 1; + top: 0; + left: 0; + width: 100%; + height: 40px; + color: var(--color-toolbar-text); + background: var(--color-toolbar); + border-bottom: 1px solid var(--color-panel-divider); + transition: transform 0.3s linear; +} +.tsd-page-toolbar a { + color: var(--color-toolbar-text); + text-decoration: none; +} +.tsd-page-toolbar a.title { + font-weight: bold; +} +.tsd-page-toolbar a.title:hover { + text-decoration: underline; +} +.tsd-page-toolbar .table-wrap { + display: table; + width: 100%; + height: 40px; +} +.tsd-page-toolbar .table-cell { + display: table-cell; + position: relative; + white-space: nowrap; + line-height: 40px; +} +.tsd-page-toolbar .table-cell:first-child { + width: 100%; +} + +.tsd-page-toolbar--hide { + transform: translateY(-100%); +} + +.tsd-select .tsd-select-list li:before, +.tsd-select .tsd-select-label:before, +.tsd-widget:before { + content: ""; + display: inline-block; + width: 40px; + height: 40px; + margin: 0 -8px 0 0; + background-image: url(./widgets.png); + background-repeat: no-repeat; + text-indent: -1024px; + vertical-align: bottom; + filter: var(--icon-filter); +} +@media (-webkit-min-device-pixel-ratio: 1.5), (min-resolution: 144dpi) { + .tsd-select .tsd-select-list li:before, + .tsd-select .tsd-select-label:before, + .tsd-widget:before { + background-image: url(./widgets@2x.png); + background-size: 320px 40px; + } +} + +.tsd-widget { + display: inline-block; + overflow: hidden; + opacity: 0.8; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-widget:hover { + opacity: 0.9; +} +.tsd-widget.active { + opacity: 1; + background-color: var(--color-panel-divider); +} +.tsd-widget.no-caption { + width: 40px; +} +.tsd-widget.no-caption:before { + margin: 0; +} +.tsd-widget.search:before { + background-position: 0 0; +} +.tsd-widget.menu:before { + background-position: -40px 0; +} +.tsd-widget.options:before { + background-position: -80px 0; +} +.tsd-widget.options, +.tsd-widget.menu { + display: none; +} +@media (max-width: 900px) { + .tsd-widget.options, + .tsd-widget.menu { + display: inline-block; + } +} +input[type="checkbox"] + .tsd-widget:before { + background-position: -120px 0; +} +input[type="checkbox"]:checked + .tsd-widget:before { + background-position: -160px 0; +} + +.tsd-select { + position: relative; + display: inline-block; + height: 40px; + transition: opacity 0.1s, background-color 0.2s; + vertical-align: bottom; + cursor: pointer; +} +.tsd-select .tsd-select-label { + opacity: 0.6; + transition: opacity 0.2s; +} +.tsd-select .tsd-select-label:before { + background-position: -240px 0; +} +.tsd-select.active .tsd-select-label { + opacity: 0.8; +} +.tsd-select.active .tsd-select-list { + visibility: visible; + opacity: 1; + transition-delay: 0s; +} +.tsd-select .tsd-select-list { + position: absolute; + visibility: hidden; + top: 40px; + left: 0; + margin: 0; + padding: 0; + opacity: 0; + list-style: none; + box-shadow: 0 0 4px rgba(0, 0, 0, 0.25); + transition: visibility 0s 0.2s, opacity 0.2s; +} +.tsd-select .tsd-select-list li { + padding: 0 20px 0 0; + background-color: var(--color-background); +} +.tsd-select .tsd-select-list li:before { + background-position: 40px 0; +} +.tsd-select .tsd-select-list li:nth-child(even) { + background-color: var(--color-panel); +} +.tsd-select .tsd-select-list li:hover { + background-color: var(--color-panel-divider); +} +.tsd-select .tsd-select-list li.selected:before { + background-position: -200px 0; +} +@media (max-width: 900px) { + .tsd-select .tsd-select-list { + top: 0; + left: auto; + right: 100%; + margin-right: -5px; + } + .tsd-select .tsd-select-label:before { + background-position: -280px 0; + } +} + +img { + max-width: 100%; +} + +.tsd-anchor-icon { + margin-left: 10px; + vertical-align: middle; + color: var(--color-text); +} + +.tsd-anchor-icon svg { + width: 1em; + height: 1em; + visibility: hidden; +} + +.tsd-anchor-link:hover > .tsd-anchor-icon svg { + visibility: visible; +} diff --git a/apps/ssi-abstraction/docs/assets/widgets.png b/apps/ssi-abstraction/docs/assets/widgets.png new file mode 100644 index 0000000000000000000000000000000000000000..c7380532ac1b45400620011c37c4dcb7aec27a4c Binary files /dev/null and b/apps/ssi-abstraction/docs/assets/widgets.png differ diff --git a/apps/ssi-abstraction/docs/assets/widgets@2x.png b/apps/ssi-abstraction/docs/assets/widgets@2x.png new file mode 100644 index 0000000000000000000000000000000000000000..4bbbd57272f3b28f47527d4951ad10f950b8ad43 Binary files /dev/null and b/apps/ssi-abstraction/docs/assets/widgets@2x.png differ diff --git a/apps/ssi-abstraction/docs/classes/agent_module.AgentModule.html b/apps/ssi-abstraction/docs/classes/agent_module.AgentModule.html new file mode 100644 index 0000000000000000000000000000000000000000..b4ec0f010c9f27c1b3151bea2b944ca2ac759ff0 --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/agent_module.AgentModule.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>AgentModule | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/agent_module.html">agent/module</a></li><li><a href="agent_module.AgentModule.html">AgentModule</a></li></ul><h1>Class AgentModule </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">AgentModule</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="agent_module.AgentModule.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="agent_module.AgentModule.html#onModuleDestroy" class="tsd-kind-icon">on<wbr/>Module<wbr/>Destroy</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Agent<wbr/>Module<span class="tsd-signature-symbol">(</span>agent<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Agent</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="agent_module.AgentModule.html" class="tsd-signature-type" data-tsd-kind="Class">AgentModule</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in agent/module.ts:95</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>agent: <span class="tsd-signature-type">Agent</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="agent_module.AgentModule.html" class="tsd-signature-type" data-tsd-kind="Class">AgentModule</a></h4></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="onModuleDestroy" class="tsd-anchor"></a><h3 class="tsd-anchor-link">on<wbr/>Module<wbr/>Destroy<a href="#onModuleDestroy" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">on<wbr/>Module<wbr/>Destroy<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in agent/module.ts:97</li></ul></aside><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class="current tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="agent_module.AgentModule.html" class="tsd-kind-icon">Agent<wbr/>Module</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="agent_module.AgentModule.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="agent_module.AgentModule.html#onModuleDestroy" class="tsd-kind-icon">on<wbr/>Module<wbr/>Destroy</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/classes/app_module.AppModule.html b/apps/ssi-abstraction/docs/classes/app_module.AppModule.html new file mode 100644 index 0000000000000000000000000000000000000000..16208ee9140308a74dbb76d5d6e637ad1f643c15 --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/app_module.AppModule.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>AppModule | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/app_module.html">app.module</a></li><li><a href="app_module.AppModule.html">AppModule</a></li></ul><h1>Class AppModule </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">AppModule</span></li></ul></section><section class="tsd-panel"><h3>Implements</h3><ul class="tsd-hierarchy"><li><span class="tsd-signature-type">NestModule</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="app_module.AppModule.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="app_module.AppModule.html#configure" class="tsd-kind-icon">configure</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>App<wbr/>Module<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="app_module.AppModule.html" class="tsd-signature-type" data-tsd-kind="Class">AppModule</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="app_module.AppModule.html" class="tsd-signature-type" data-tsd-kind="Class">AppModule</a></h4></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="configure" class="tsd-anchor"></a><h3 class="tsd-anchor-link">configure<a href="#configure" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">configure<span class="tsd-signature-symbol">(</span>consumer<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">MiddlewareConsumer</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><p>Implementation of NestModule.configure</p><ul><li>Defined in app.module.ts:32</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>consumer: <span class="tsd-signature-type">MiddlewareConsumer</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class="current tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="app_module.AppModule.html" class="tsd-kind-icon">App<wbr/>Module</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="app_module.AppModule.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="app_module.AppModule.html#configure" class="tsd-kind-icon">configure</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/classes/client_nats_client.NatsClientService.html b/apps/ssi-abstraction/docs/classes/client_nats_client.NatsClientService.html new file mode 100644 index 0000000000000000000000000000000000000000..a593c28cc973259f5325a8ff36ce5be0aceeeb4d --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/client_nats_client.NatsClientService.html @@ -0,0 +1,9 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>NatsClientService | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/client_nats_client.html">client/nats.client</a></li><li><a href="client_nats_client.NatsClientService.html">NatsClientService</a></li></ul><h1>Class NatsClientService </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">NatsClientService</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="client_nats_client.NatsClientService.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="client_nats_client.NatsClientService.html#publish" class="tsd-kind-icon">publish</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Nats<wbr/>Client<wbr/>Service<span class="tsd-signature-symbol">(</span>client<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">ClientProxy</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in client/nats.client.ts:8</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>client: <span class="tsd-signature-type">ClientProxy</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a></h4></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="publish" class="tsd-anchor"></a><h3 class="tsd-anchor-link">publish<a href="#publish" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">publish<span class="tsd-signature-symbol">(</span>eventName<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, data<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in client/nats.client.ts:18</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Publishes events on nats +Generates the event as an object with 'endpoint' key +that specifies the ServiceName/eventName.</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>eventName: <span class="tsd-signature-type">string</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the event name</p> +</div></div></li><li><h5>data: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the data to be passed as payload of the event</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class="current tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="client_nats_client.NatsClientService.html" class="tsd-kind-icon">Nats<wbr/>Client<wbr/>Service</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="client_nats_client.NatsClientService.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="client_nats_client.NatsClientService.html#publish" class="tsd-kind-icon">publish</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/classes/didComm_controller_controller.DidCommController.html b/apps/ssi-abstraction/docs/classes/didComm_controller_controller.DidCommController.html new file mode 100644 index 0000000000000000000000000000000000000000..c39e9fd37176a5478c01fc382ef065cd3e7e285a --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/didComm_controller_controller.DidCommController.html @@ -0,0 +1,22 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>DidCommController | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/didComm_controller_controller.html">didComm/controller/controller</a></li><li><a href="didComm_controller_controller.DidCommController.html">DidCommController</a></li></ul><h1>Class DidCommController </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">DidCommController</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="didComm_controller_controller.DidCommController.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="didComm_controller_controller.DidCommController.html#generic" class="tsd-kind-icon">generic</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="didComm_controller_controller.DidCommController.html#getWalletInfo" class="tsd-kind-icon">get<wbr/>Wallet<wbr/>Info</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Did<wbr/>Comm<wbr/>Controller<span class="tsd-signature-symbol">(</span>agent<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Agent</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="didComm_controller_controller.DidCommController.html" class="tsd-signature-type" data-tsd-kind="Class">DidCommController</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in didComm/controller/controller.ts:21</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>agent: <span class="tsd-signature-type">Agent</span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="didComm_controller_controller.DidCommController.html" class="tsd-signature-type" data-tsd-kind="Class">DidCommController</a></h4></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="generic" class="tsd-anchor"></a><h3 class="tsd-anchor-link">generic<a href="#generic" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">generic<span class="tsd-signature-symbol">(</span>params<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_utils_whitelist.GenericParams.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericParams</a>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><a href="../interfaces/common_response.ResponseType.html" class="tsd-signature-type" data-tsd-kind="Interface">ResponseType</a><span class="tsd-signature-symbol">></span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in didComm/controller/controller.ts:45</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>A backup endpoint that dynamically interfaces with the agent, in case the extension +lags behind the AFJ or malfunctions</p> +</div><div><p>expected body + body: { + subMethod: { + name: 'asdas.asdasd', + subMethodData: [ + 'argument1', + 'argument2' + ] + }, + data: [ + 'argumentN', + 'argumentN+1' + ] + }</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>params: <a href="../interfaces/didComm_utils_whitelist.GenericParams.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericParams</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>-one of the allowed properties/method to be called on the agent</p> +</div></div></li><li><h5>body: <a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>-arguments of the method and/or calling a method on the returned object</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><a href="../interfaces/common_response.ResponseType.html" class="tsd-signature-type" data-tsd-kind="Interface">ResponseType</a><span class="tsd-signature-symbol">></span></h4></li></ul></section><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="getWalletInfo" class="tsd-anchor"></a><h3 class="tsd-anchor-link">get<wbr/>Wallet<wbr/>Info<a href="#getWalletInfo" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">get<wbr/>Wallet<wbr/>Info<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><a href="../interfaces/common_response.ResponseType.html" class="tsd-signature-type" data-tsd-kind="Interface">ResponseType</a><span class="tsd-signature-symbol">></span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in didComm/controller/controller.ts:95</li></ul></aside><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><a href="../interfaces/common_response.ResponseType.html" class="tsd-signature-type" data-tsd-kind="Interface">ResponseType</a><span class="tsd-signature-symbol">></span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class="current tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="didComm_controller_controller.DidCommController.html" class="tsd-kind-icon">Did<wbr/>Comm<wbr/>Controller</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="didComm_controller_controller.DidCommController.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="didComm_controller_controller.DidCommController.html#generic" class="tsd-kind-icon">generic</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="didComm_controller_controller.DidCommController.html#getWalletInfo" class="tsd-kind-icon">get<wbr/>Wallet<wbr/>Info</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/classes/didComm_module.default.html b/apps/ssi-abstraction/docs/classes/didComm_module.default.html new file mode 100644 index 0000000000000000000000000000000000000000..31a80d43dcf2cb9dcb7f450c9e689c87ca305289 --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/didComm_module.default.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>default | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/didComm_module.html">didComm/module</a></li><li><a href="didComm_module.default.html">default</a></li></ul><h1>Class default </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">default</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="didComm_module.default.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new default<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="didComm_module.default.html" class="tsd-signature-type" data-tsd-kind="Class">default</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="didComm_module.default.html" class="tsd-signature-type" data-tsd-kind="Class">default</a></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class="current tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="didComm_module.default.html" class="tsd-kind-icon">default</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="didComm_module.default.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/classes/globalUtils_exception_handler.ExceptionHandler.html b/apps/ssi-abstraction/docs/classes/globalUtils_exception_handler.ExceptionHandler.html new file mode 100644 index 0000000000000000000000000000000000000000..a37a19f633b218d58e198f76531972c199377893 --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/globalUtils_exception_handler.ExceptionHandler.html @@ -0,0 +1,7 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ExceptionHandler | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/globalUtils_exception_handler.html">globalUtils/exception.handler</a></li><li><a href="globalUtils_exception_handler.ExceptionHandler.html">ExceptionHandler</a></li></ul><h1>Class ExceptionHandler </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">ExceptionHandler</span></li></ul></section><section class="tsd-panel"><h3>Implements</h3><ul class="tsd-hierarchy"><li><span class="tsd-signature-type">ExceptionFilter</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="globalUtils_exception_handler.ExceptionHandler.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="globalUtils_exception_handler.ExceptionHandler.html#catch" class="tsd-kind-icon">catch</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Exception<wbr/>Handler<span class="tsd-signature-symbol">(</span>httpAdapterHost<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">HttpAdapterHost</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">AbstractHttpAdapter</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="globalUtils_exception_handler.ExceptionHandler.html" class="tsd-signature-type" data-tsd-kind="Class">ExceptionHandler</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in globalUtils/exception.handler.ts:13</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>httpAdapterHost: <span class="tsd-signature-type">HttpAdapterHost</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">AbstractHttpAdapter</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h5></li></ul><h4 class="tsd-returns-title">Returns <a href="globalUtils_exception_handler.ExceptionHandler.html" class="tsd-signature-type" data-tsd-kind="Class">ExceptionHandler</a></h4></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="catch" class="tsd-anchor"></a><h3 class="tsd-anchor-link">catch<a href="#catch" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">catch<span class="tsd-signature-symbol">(</span>exception<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, host<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">ArgumentsHost</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><p>Implementation of ExceptionFilter.catch</p><ul><li>Defined in globalUtils/exception.handler.ts:21</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Custom exception handler</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>exception: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>error</p> +</div></div></li><li><h5>host: <span class="tsd-signature-type">ArgumentsHost</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the execution context for exceptions</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class="current tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="globalUtils_exception_handler.ExceptionHandler.html" class="tsd-kind-icon">Exception<wbr/>Handler</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="globalUtils_exception_handler.ExceptionHandler.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="globalUtils_exception_handler.ExceptionHandler.html#catch" class="tsd-kind-icon">catch</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/classes/health_health_controller.HealthController.html b/apps/ssi-abstraction/docs/classes/health_health_controller.HealthController.html new file mode 100644 index 0000000000000000000000000000000000000000..24caed7cc4b42c87ed4c3a04bcf16639f95b49c1 --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/health_health_controller.HealthController.html @@ -0,0 +1,6 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>HealthController | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/health_health_controller.html">health/health.controller</a></li><li><a href="health_health_controller.HealthController.html">HealthController</a></li></ul><h1>Class HealthController </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">HealthController</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="health_health_controller.HealthController.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="health_health_controller.HealthController.html#getHealth" class="tsd-kind-icon">get<wbr/>Health</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Health<wbr/>Controller<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="health_health_controller.HealthController.html" class="tsd-signature-type" data-tsd-kind="Class">HealthController</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="health_health_controller.HealthController.html" class="tsd-signature-type" data-tsd-kind="Class">HealthController</a></h4></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="getHealth" class="tsd-anchor"></a><h3 class="tsd-anchor-link">get<wbr/>Health<a href="#getHealth" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">get<wbr/>Health<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="../interfaces/common_response.ResponseType.html" class="tsd-signature-type" data-tsd-kind="Interface">ResponseType</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in health/health.controller.ts:13</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Check if app is running</p> +</div></div><h4 class="tsd-returns-title">Returns <a href="../interfaces/common_response.ResponseType.html" class="tsd-signature-type" data-tsd-kind="Interface">ResponseType</a></h4><div><ul> +<li>OK (200) if app is running</li> +</ul> +</div></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class="current tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="health_health_controller.HealthController.html" class="tsd-kind-icon">Health<wbr/>Controller</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="health_health_controller.HealthController.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="health_health_controller.HealthController.html#getHealth" class="tsd-kind-icon">get<wbr/>Health</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/classes/middleware_agentMid_middleware.AgentMid.html b/apps/ssi-abstraction/docs/classes/middleware_agentMid_middleware.AgentMid.html new file mode 100644 index 0000000000000000000000000000000000000000..39191aba1bb49c8adf137ea57767af32a5483aa7 --- /dev/null +++ b/apps/ssi-abstraction/docs/classes/middleware_agentMid_middleware.AgentMid.html @@ -0,0 +1,4 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>AgentMid | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/middleware_agentMid_middleware.html">middleware/agentMid.middleware</a></li><li><a href="middleware_agentMid_middleware.AgentMid.html">AgentMid</a></li></ul><h1>Class AgentMid </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-comment"><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Middleware that checks validity of provided params and body +to the requests.</p> +</div></div></section><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">AgentMid</span></li></ul></section><section class="tsd-panel"><h3>Implements</h3><ul class="tsd-hierarchy"><li><span class="tsd-signature-type">NestMiddleware</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Constructors</h3><ul class="tsd-index-list"><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="middleware_agentMid_middleware.AgentMid.html#constructor" class="tsd-kind-icon">constructor</a></li></ul></section><section class="tsd-index-section "><h3>Methods</h3><ul class="tsd-index-list"><li class="tsd-kind-method tsd-parent-kind-class"><a href="middleware_agentMid_middleware.AgentMid.html#use" class="tsd-kind-icon">use</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Constructors</h2><section class="tsd-panel tsd-member tsd-kind-constructor tsd-parent-kind-class"><a id="constructor" class="tsd-anchor"></a><h3 class="tsd-anchor-link">constructor<a href="#constructor" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-constructor tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">new <wbr/>Agent<wbr/>Mid<span class="tsd-signature-symbol">(</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="middleware_agentMid_middleware.AgentMid.html" class="tsd-signature-type" data-tsd-kind="Class">AgentMid</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><h4 class="tsd-returns-title">Returns <a href="middleware_agentMid_middleware.AgentMid.html" class="tsd-signature-type" data-tsd-kind="Class">AgentMid</a></h4></li></ul></section></section><section class="tsd-panel-group tsd-member-group "><h2>Methods</h2><section class="tsd-panel tsd-member tsd-kind-method tsd-parent-kind-class"><a id="use" class="tsd-anchor"></a><h3 class="tsd-anchor-link">use<a href="#use" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-method tsd-parent-kind-class"><li class="tsd-signature tsd-kind-icon">use<span class="tsd-signature-symbol">(</span>req<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Request</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">ParamsDictionary</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">ParsedQs</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>, res<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Response</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span>, next<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">NextFunction</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><p>Implementation of NestMiddleware.use</p><ul><li>Defined in middleware/agentMid.middleware.ts:13</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>req: <span class="tsd-signature-type">Request</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">ParamsDictionary</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">ParsedQs</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h5></li><li><h5>res: <span class="tsd-signature-type">Response</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">></span></h5></li><li><h5>next: <span class="tsd-signature-type">NextFunction</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class="current tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-class tsd-parent-kind-module"><a href="middleware_agentMid_middleware.AgentMid.html" class="tsd-kind-icon">Agent<wbr/>Mid</a><ul><li class="tsd-kind-constructor tsd-parent-kind-class"><a href="middleware_agentMid_middleware.AgentMid.html#constructor" class="tsd-kind-icon">constructor</a></li><li class="tsd-kind-method tsd-parent-kind-class"><a href="middleware_agentMid_middleware.AgentMid.html#use" class="tsd-kind-icon">use</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li><li class="tsd-kind-constructor tsd-parent-kind-class"><span class="tsd-kind-icon">Constructor</span></li><li class="tsd-kind-method tsd-parent-kind-class"><span class="tsd-kind-icon">Method</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/enums/common_constants.NATSServices.html b/apps/ssi-abstraction/docs/enums/common_constants.NATSServices.html new file mode 100644 index 0000000000000000000000000000000000000000..b5593b77090d3bc41ecb4ea3678d6925a260c781 --- /dev/null +++ b/apps/ssi-abstraction/docs/enums/common_constants.NATSServices.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>NATSServices | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/common_constants.html">common/constants</a></li><li><a href="common_constants.NATSServices.html">NATSServices</a></li></ul><h1>Enumeration NATSServices </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Enumeration members</h3><ul class="tsd-index-list"><li class="tsd-kind-enum-member tsd-parent-kind-enum"><a href="common_constants.NATSServices.html#SERVICE_NAME" class="tsd-kind-icon">SERVICE_<wbr/>NAME</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Enumeration members</h2><section class="tsd-panel tsd-member tsd-kind-enum-member tsd-parent-kind-enum"><a id="SERVICE_NAME" class="tsd-anchor"></a><h3 class="tsd-anchor-link">SERVICE_<wbr/>NAME<a href="#SERVICE_NAME" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">SERVICE_<wbr/>NAME<span class="tsd-signature-symbol"> = "SSI_ABSTRACTION_SERVICE"</span></div><aside class="tsd-sources"><ul><li>Defined in common/constants.ts:2</li></ul></aside></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class="current tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-enum tsd-parent-kind-module"><a href="common_constants.NATSServices.html" class="tsd-kind-icon">NATSServices</a><ul><li class="tsd-kind-enum-member tsd-parent-kind-enum"><a href="common_constants.NATSServices.html#SERVICE_NAME" class="tsd-kind-icon">SERVICE_<wbr/>NAME</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/index.html b/apps/ssi-abstraction/docs/index.html new file mode 100644 index 0000000000000000000000000000000000000000..ca37d7b7f855f7290d517b2c2d51d60175884863 --- /dev/null +++ b/apps/ssi-abstraction/docs/index.html @@ -0,0 +1,85 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script async src="assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><h1> ocm-ssi-abstraction </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><div class="tsd-panel tsd-typography"> +<a href="#ssi-abstraction-service" id="ssi-abstraction-service" style="color: inherit; text-decoration: none;"> + <h1>SSI Abstraction Service</h1> +</a> + +<a href="#description" id="description" style="color: inherit; text-decoration: none;"> + <h2>Description</h2> +</a> +<hr/> + <p align="center">A core service for the Organizational Credential Manager, providing the DIDComm functionality and initializing the agent, wallet and ledger interactions of the whole application.</p> + +<p><a href="https://github.com/nestjs/nest">Nest framework github.</a> </p> + +<a href="#usage" id="usage" style="color: inherit; text-decoration: none;"> + <h2>Usage</h2> +</a> +<hr/> +### Endpoint documentation at: + +<p><a>localhost:{PORT}/docs</a></p> +<p>with the default exposed ports: </p> +<ul> +<li>3010 - Aries REST extension</li> +<li>3009 - full agent exposed</li> +<li>4000 - didcomm interface</li> +</ul> + +<a href="#installation" id="installation" style="color: inherit; text-decoration: none;"> + <h2>Installation</h2> +</a> +<hr/> + +<p>Dependencies:</p> +<pre><code class="language-bash"><span class="hl-0">$ yarn</span> +</code></pre> +<ul> +<li><p><strong>If docker is not installed, <a href="https://docs.docker.com/engine/install/">Install docker</a></strong>.</p> +</li> +<li><p><strong>If docker-compose is not installed, <a href="https://docs.docker.com/compose/install/">Install docker-compose</a></strong>.</p> +</li> +<li><p>(optional) Postgres GUI +<a href="https://dbeaver.io/download/">https://dbeaver.io/download/</a></p> +</li> +</ul> +<hr/> + + + +<a href="#running-the-app" id="running-the-app" style="color: inherit; text-decoration: none;"> + <h2>Running the app</h2> +</a> +<hr/> + +<p><strong>Each service in the Organizational Credential Manager can be run from the infrastructure repository with Docker.</strong></p> +<p><strong>The .env files are in the infrastructure repository under /env</strong></p> + +<a href="#there-are-two-separate-dockefiles-in-quotdeploymentquot-of-every-project" id="there-are-two-separate-dockefiles-in-quotdeploymentquot-of-every-project" style="color: inherit; text-decoration: none;"> + <h3>There are two separate Dockefiles in "./deployment" of every project:</h3> +</a> +<pre><code class="language-bash"><span class="hl-0"> </span><span class="hl-1">## production in:</span><br/><span class="hl-0"> ./deployment/ci</span><br/><span class="hl-0"> </span><span class="hl-1">## development in:</span><br/><span class="hl-0"> ./deployment/dev</span> +</code></pre> +<ul> +<li><p>(optional) Edit docker-compose.yml in "infrastructure" to use either <strong>/ci/</strong> or <strong>/dev/</strong> Dockerfiles.</p> +</li> +<li><p>Run while in <strong>"infrastructure"</strong> project:</p> +<pre><code class="language-bash"><span class="hl-0">$ docker-compose up --build</span> +</code></pre> +</li> +</ul> + +<a href="#gdpr" id="gdpr" style="color: inherit; text-decoration: none;"> + <h2>GDPR</h2> +</a> +<hr/> + +<p>Information regarding the agent operation is stored internally on SQLite, on ledger and in the wallet of the agent.</p> + +<a href="#license" id="license" style="color: inherit; text-decoration: none;"> + <h2>License</h2> +</a> +<hr/> + + +<p>GAIA-X OCM Connection Manager is Open Source software released under the <a href="https://www.apache.org/licenses/LICENSE-2.0.html">Apache 2.0 license</a>.</p> +</div></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class="current"><a href="modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/interfaces/common_response.ResponseType.html b/apps/ssi-abstraction/docs/interfaces/common_response.ResponseType.html new file mode 100644 index 0000000000000000000000000000000000000000..28b84600f630cb0afc4940bb3d324f065db9c57d --- /dev/null +++ b/apps/ssi-abstraction/docs/interfaces/common_response.ResponseType.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ResponseType | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/common_response.html">common/response</a></li><li><a href="common_response.ResponseType.html">ResponseType</a></li></ul><h1>Interface ResponseType </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">ResponseType</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#data" class="tsd-kind-icon">data</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#error" class="tsd-kind-icon">error</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#message" class="tsd-kind-icon">message</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#statusCode" class="tsd-kind-icon">status<wbr/>Code</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="data" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagOptional">Optional</span> data<a href="#data" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">data<span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">any</span></div><aside class="tsd-sources"><ul><li>Defined in common/response.ts:4</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="error" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagOptional">Optional</span> error<a href="#error" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">error<span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">any</span></div><aside class="tsd-sources"><ul><li>Defined in common/response.ts:5</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="message" class="tsd-anchor"></a><h3 class="tsd-anchor-link">message<a href="#message" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">message<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span></div><aside class="tsd-sources"><ul><li>Defined in common/response.ts:3</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="statusCode" class="tsd-anchor"></a><h3 class="tsd-anchor-link">status<wbr/>Code<a href="#statusCode" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">status<wbr/>Code<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">number</span></div><aside class="tsd-sources"><ul><li>Defined in common/response.ts:2</li></ul></aside></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class="current tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-interface tsd-parent-kind-module"><a href="common_response.ResponseType.html" class="tsd-kind-icon">Response<wbr/>Type</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#data" class="tsd-kind-icon">data</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#error" class="tsd-kind-icon">error</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#message" class="tsd-kind-icon">message</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="common_response.ResponseType.html#statusCode" class="tsd-kind-icon">status<wbr/>Code</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li><li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/interfaces/didComm_entities_GenericBody.GenericBody.html b/apps/ssi-abstraction/docs/interfaces/didComm_entities_GenericBody.GenericBody.html new file mode 100644 index 0000000000000000000000000000000000000000..5ae633db6da9d0ea46d321e174a11feade7e51b3 --- /dev/null +++ b/apps/ssi-abstraction/docs/interfaces/didComm_entities_GenericBody.GenericBody.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>GenericBody | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/didComm_entities_GenericBody.html">didComm/entities/GenericBody</a></li><li><a href="didComm_entities_GenericBody.GenericBody.html">GenericBody</a></li></ul><h1>Interface GenericBody </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">GenericBody</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_entities_GenericBody.GenericBody.html#data" class="tsd-kind-icon">data</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_entities_GenericBody.GenericBody.html#subMethod" class="tsd-kind-icon">sub<wbr/>Method</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="data" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagOptional">Optional</span> data<a href="#data" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">data<span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-type">any</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/entities/GenericBody.ts:6</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="subMethod" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagOptional">Optional</span> sub<wbr/>Method<a href="#subMethod" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">sub<wbr/>Method<span class="tsd-signature-symbol">?:</span> <span class="tsd-signature-symbol">{ </span>name<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">; </span>subMethodData<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/entities/GenericBody.ts:2</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5><span class="tsd-flag ts-flagOptional">Optional</span> name<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">string</span></h5></li><li class="tsd-parameter"><h5><span class="tsd-flag ts-flagOptional">Optional</span> sub<wbr/>Method<wbr/>Data<span class="tsd-signature-symbol">?: </span><span class="tsd-signature-type">any</span></h5></li></ul></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class="current tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-interface tsd-parent-kind-module"><a href="didComm_entities_GenericBody.GenericBody.html" class="tsd-kind-icon">Generic<wbr/>Body</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_entities_GenericBody.GenericBody.html#data" class="tsd-kind-icon">data</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_entities_GenericBody.GenericBody.html#subMethod" class="tsd-kind-icon">sub<wbr/>Method</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li><li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/interfaces/didComm_utils_whitelist.CheckType.html b/apps/ssi-abstraction/docs/interfaces/didComm_utils_whitelist.CheckType.html new file mode 100644 index 0000000000000000000000000000000000000000..e1e1f113c3ef67e60cdcb9b507adbadc8f9564f2 --- /dev/null +++ b/apps/ssi-abstraction/docs/interfaces/didComm_utils_whitelist.CheckType.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>CheckType | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/didComm_utils_whitelist.html">didComm/utils/whitelist</a></li><li><a href="didComm_utils_whitelist.CheckType.html">CheckType</a></li></ul><h1>Interface CheckType </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">CheckType</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.CheckType.html#messages" class="tsd-kind-icon">messages</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.CheckType.html#success" class="tsd-kind-icon">success</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="messages" class="tsd-anchor"></a><h3 class="tsd-anchor-link">messages<a href="#messages" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">messages<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:6</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="success" class="tsd-anchor"></a><h3 class="tsd-anchor-link">success<a href="#success" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">success<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">boolean</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:5</li></ul></aside></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class="current tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-interface tsd-parent-kind-module"><a href="didComm_utils_whitelist.CheckType.html" class="tsd-kind-icon">Check<wbr/>Type</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.CheckType.html#messages" class="tsd-kind-icon">messages</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.CheckType.html#success" class="tsd-kind-icon">success</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li><li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/interfaces/didComm_utils_whitelist.GenericParams.html b/apps/ssi-abstraction/docs/interfaces/didComm_utils_whitelist.GenericParams.html new file mode 100644 index 0000000000000000000000000000000000000000..0749745ae033f6677fe2b4e124487d3e70dd939f --- /dev/null +++ b/apps/ssi-abstraction/docs/interfaces/didComm_utils_whitelist.GenericParams.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>GenericParams | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="../modules/didComm_utils_whitelist.html">didComm/utils/whitelist</a></li><li><a href="didComm_utils_whitelist.GenericParams.html">GenericParams</a></li></ul><h1>Interface GenericParams </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel tsd-hierarchy"><h3>Hierarchy</h3><ul class="tsd-hierarchy"><li><span class="target">GenericParams</span></li></ul></section><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Properties</h3><ul class="tsd-index-list"><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.GenericParams.html#method" class="tsd-kind-icon">method</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.GenericParams.html#property" class="tsd-kind-icon">property</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Properties</h2><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="method" class="tsd-anchor"></a><h3 class="tsd-anchor-link">method<a href="#method" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">method<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"createConnection"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"receiveInvitation"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"receiveInvitationFromUrl"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"acceptInvitation"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"acceptRequest"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"acceptResponse"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"returnWhenIsConnected"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getAll"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getById"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findById"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"deleteById"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findByVerkey"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findByTheirKey"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findByInvitationKey"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getByThreadId"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"proposeProof"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"acceptProposal"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"requestProof"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"createOutOfBandRequest"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"declineRequest"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"acceptPresentation"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getRequestedCredentialsForProofRequest"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"autoSelectCredentialsForProofRequest"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"sendProblemReport"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"sendMessage"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findAllByQuery"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"registerPublicDid"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getPublicDid"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"registerSchema"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getSchema"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"registerCredentialDefinition"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getCredentialDefinition"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"proposeCredential"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"negotiateProposal"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"offerCredential"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"createOutOfBandOffer"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"acceptOffer"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"declineOffer"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"negotiateOffer"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"acceptCredential"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"initiateMessagePickup"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"pickupMessages"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"setDefaultMediator"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"notifyKeylistUpdate"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findDefaultMediatorConnection"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"discoverMediation"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"requestMediation"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findByConnectionId"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"getMediators"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"findDefaultMediator"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"requestAndAwaitGrant"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"provision"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"queueMessage"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"grantRequestedMediation"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"queryFeatures"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"initialize"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"create"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"open"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"close"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"delete"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"initPublicDid"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"createDid"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"pack"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"unpack"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"sign"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"verify"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"generateNonce"</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:21</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-property tsd-parent-kind-interface"><a id="property" class="tsd-anchor"></a><h3 class="tsd-anchor-link">property<a href="#property" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">property<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"connections"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"proofs"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"basicMessages"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"ledger"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"credentials"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"mediationRecipient"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"mediator"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"discovery"</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">"wallet"</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:10</li></ul></aside></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="../modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="../modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="../modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="../modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="../modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="../modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class="current tsd-kind-module"><a href="../modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="../modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="../modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="../modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="current tsd-kind-interface tsd-parent-kind-module"><a href="didComm_utils_whitelist.GenericParams.html" class="tsd-kind-icon">Generic<wbr/>Params</a><ul><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.GenericParams.html#method" class="tsd-kind-icon">method</a></li><li class="tsd-kind-property tsd-parent-kind-interface"><a href="didComm_utils_whitelist.GenericParams.html#property" class="tsd-kind-icon">property</a></li></ul></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li><li class="tsd-kind-property tsd-parent-kind-interface"><span class="tsd-kind-icon">Property</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules.html b/apps/ssi-abstraction/docs/modules.html new file mode 100644 index 0000000000000000000000000000000000000000..9e61ad701514f9bcc83afcf78a341d38b14189d8 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="assets/style.css"/><link rel="stylesheet" href="assets/highlight.css"/><script async src="assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base="."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><h1> ocm-ssi-abstraction </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Modules</h3><ul class="tsd-index-list"><li class="tsd-kind-module"><a href="modules/agent_agentUtils_ledgerConfig.html" class="tsd-kind-icon">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class="tsd-kind-module"><a href="modules/agent_agentUtils_listener.html" class="tsd-kind-icon">agent/agent<wbr/>Utils/listener</a></li><li class="tsd-kind-module"><a href="modules/agent_agentUtils_listenerConfig.html" class="tsd-kind-icon">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class="tsd-kind-module"><a href="modules/agent_module.html" class="tsd-kind-icon">agent/module</a></li><li class="tsd-kind-module"><a href="modules/app_module.html" class="tsd-kind-icon">app.module</a></li><li class="tsd-kind-module"><a href="modules/client_nats_client.html" class="tsd-kind-icon">client/nats.client</a></li><li class="tsd-kind-module"><a href="modules/common_constants.html" class="tsd-kind-icon">common/constants</a></li><li class="tsd-kind-module"><a href="modules/common_response.html" class="tsd-kind-icon">common/response</a></li><li class="tsd-kind-module"><a href="modules/didComm_controller_controller.html" class="tsd-kind-icon">did<wbr/>Comm/controller/controller</a></li><li class="tsd-kind-module"><a href="modules/didComm_didCommUtils.html" class="tsd-kind-icon">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class="tsd-kind-module"><a href="modules/didComm_entities_GenericBody.html" class="tsd-kind-icon">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class="tsd-kind-module"><a href="modules/didComm_module.html" class="tsd-kind-icon">did<wbr/>Comm/module</a></li><li class="tsd-kind-module"><a href="modules/didComm_utils_prepareData.html" class="tsd-kind-icon">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class="tsd-kind-module"><a href="modules/didComm_utils_whitelist.html" class="tsd-kind-icon">did<wbr/>Comm/utils/whitelist</a></li><li class="tsd-kind-module"><a href="modules/globalUtils_appConfig.html" class="tsd-kind-icon">global<wbr/>Utils/app<wbr/>Config</a></li><li class="tsd-kind-module"><a href="modules/globalUtils_exception_handler.html" class="tsd-kind-icon">global<wbr/>Utils/exception.handler</a></li><li class="tsd-kind-module"><a href="modules/globalUtils_logger.html" class="tsd-kind-icon">global<wbr/>Utils/logger</a></li><li class="tsd-kind-module"><a href="modules/globalUtils_swagger.html" class="tsd-kind-icon">global<wbr/>Utils/swagger</a></li><li class="tsd-kind-module"><a href="modules/health_health_controller.html" class="tsd-kind-icon">health/health.controller</a></li><li class="tsd-kind-module"><a href="modules/middleware_agentMid_middleware.html" class="tsd-kind-icon">middleware/agent<wbr/>Mid.middleware</a></li></ul></section></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class="current"><a href="modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="modules/agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="modules/agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="modules/agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="modules/agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="modules/app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="modules/client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="modules/common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="modules/common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="modules/didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="modules/didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="modules/didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="modules/didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="modules/didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="modules/didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="modules/globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="modules/health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="modules/middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/agent_agentUtils_ledgerConfig.html b/apps/ssi-abstraction/docs/modules/agent_agentUtils_ledgerConfig.html new file mode 100644 index 0000000000000000000000000000000000000000..1edea3610ef6b176d09a72dc5f77c2399364acf1 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/agent_agentUtils_ledgerConfig.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>agent/agentUtils/ledgerConfig | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="agent_agentUtils_ledgerConfig.html">agent/agentUtils/ledgerConfig</a></li></ul><h1>Module agent/agentUtils/ledgerConfig </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_ledgerConfig.html#BCOVRIN_TEST_GENESIS" class="tsd-kind-icon">BCOVRIN_<wbr/>TEST_<wbr/>GENESIS</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_ledgerConfig.html#default" class="tsd-kind-icon">default</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="BCOVRIN_TEST_GENESIS" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> BCOVRIN_<wbr/>TEST_<wbr/>GENESIS<a href="#BCOVRIN_TEST_GENESIS" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">BCOVRIN_<wbr/>TEST_<wbr/>GENESIS<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"{\"reqSignature\":{},\"txn\":{\"data\":{\"data\":{\"alias\":\"Node1\",\"blskey\":\"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba\",\"blskey_pop\":\"RahHYiCvoNCtPTrVtP7nMC5eTYrsUA8WjXbdhNc8debh1agE9bGiJxWBXYNFbnJXoXhWFMvyqhqhRoq737YQemH5ik9oL7R4NTTCz2LEZhkgLJzB3QRQqJyBNyv7acbdHrAT8nQ9UkLbaVL9NBpnWXBTw4LEMePaSHEw66RzPNdAX1\",\"client_ip\":\"138.197.138.255\",\"client_port\":9702,\"node_ip\":\"138.197.138.255\",\"node_port\":9701,\"services\":[\"VALIDATOR\"]},\"dest\":\"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv\"},\"metadata\":{\"from\":\"Th7MpTaRZVRYnPiabds81Y\"},\"type\":\"0\"},\"txnMetadata\":{\"seqNo\":1,\"txnId\":\"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62\"},\"ver\":\"1\"}\n{\"reqSignature\":{},\"txn\":{\"data\":{\"data\":{\"alias\":\"Node2\",\"blskey\":\"37rAPpXVoxzKhz7d9gkUe52XuXryuLXoM6P6LbWDB7LSbG62Lsb33sfG7zqS8TK1MXwuCHj1FKNzVpsnafmqLG1vXN88rt38mNFs9TENzm4QHdBzsvCuoBnPH7rpYYDo9DZNJePaDvRvqJKByCabubJz3XXKbEeshzpz4Ma5QYpJqjk\",\"blskey_pop\":\"Qr658mWZ2YC8JXGXwMDQTzuZCWF7NK9EwxphGmcBvCh6ybUuLxbG65nsX4JvD4SPNtkJ2w9ug1yLTj6fgmuDg41TgECXjLCij3RMsV8CwewBVgVN67wsA45DFWvqvLtu4rjNnE9JbdFTc1Z4WCPA3Xan44K1HoHAq9EVeaRYs8zoF5\",\"client_ip\":\"138.197.138.255\",\"client_port\":9704,\"node_ip\":\"138.197.138.255\",\"node_port\":9703,\"services\":[\"VALIDATOR\"]},\"dest\":\"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb\"},\"metadata\":{\"from\":\"EbP4aYNeTHL6q385GuVpRV\"},\"type\":\"0\"},\"txnMetadata\":{\"seqNo\":2,\"txnId\":\"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc\"},\"ver\":\"1\"}\n{\"reqSignature\":{},\"txn\":{\"data\":{\"data\":{\"alias\":\"Node3\",\"blskey\":\"3WFpdbg7C5cnLYZwFZevJqhubkFALBfCBBok15GdrKMUhUjGsk3jV6QKj6MZgEubF7oqCafxNdkm7eswgA4sdKTRc82tLGzZBd6vNqU8dupzup6uYUf32KTHTPQbuUM8Yk4QFXjEf2Usu2TJcNkdgpyeUSX42u5LqdDDpNSWUK5deC5\",\"blskey_pop\":\"QwDeb2CkNSx6r8QC8vGQK3GRv7Yndn84TGNijX8YXHPiagXajyfTjoR87rXUu4G4QLk2cF8NNyqWiYMus1623dELWwx57rLCFqGh7N4ZRbGDRP4fnVcaKg1BcUxQ866Ven4gw8y4N56S5HzxXNBZtLYmhGHvDtk6PFkFwCvxYrNYjh\",\"client_ip\":\"138.197.138.255\",\"client_port\":9706,\"node_ip\":\"138.197.138.255\",\"node_port\":9705,\"services\":[\"VALIDATOR\"]},\"dest\":\"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya\"},\"metadata\":{\"from\":\"4cU41vWW82ArfxJxHkzXPG\"},\"type\":\"0\"},\"txnMetadata\":{\"seqNo\":3,\"txnId\":\"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4\"},\"ver\":\"1\"}\n{\"reqSignature\":{},\"txn\":{\"data\":{\"data\":{\"alias\":\"Node4\",\"blskey\":\"2zN3bHM1m4rLz54MJHYSwvqzPchYp8jkHswveCLAEJVcX6Mm1wHQD1SkPYMzUDTZvWvhuE6VNAkK3KxVeEmsanSmvjVkReDeBEMxeDaayjcZjFGPydyey1qxBHmTvAnBKoPydvuTAqx5f7YNNRAdeLmUi99gERUU7TD8KfAa6MpQ9bw\",\"blskey_pop\":\"RPLagxaR5xdimFzwmzYnz4ZhWtYQEj8iR5ZU53T2gitPCyCHQneUn2Huc4oeLd2B2HzkGnjAff4hWTJT6C7qHYB1Mv2wU5iHHGFWkhnTX9WsEAbunJCV2qcaXScKj4tTfvdDKfLiVuU2av6hbsMztirRze7LvYBkRHV3tGwyCptsrP\",\"client_ip\":\"138.197.138.255\",\"client_port\":9708,\"node_ip\":\"138.197.138.255\",\"node_port\":9707,\"services\":[\"VALIDATOR\"]},\"dest\":\"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA\"},\"metadata\":{\"from\":\"TWwCRQRZ2ZHMJFn9TzLp7W\"},\"type\":\"0\"},\"txnMetadata\":{\"seqNo\":4,\"txnId\":\"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008\"},\"ver\":\"1\"}"</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in agent/agentUtils/ledgerConfig.ts:3</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>BCOVRIN_TEST_GENESIS<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in agent/agentUtils/ledgerConfig.ts:8</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>BCOVRIN_<wbr/>TEST_<wbr/>GENESIS<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span></h5></li></ul></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class="current tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_ledgerConfig.html#BCOVRIN_TEST_GENESIS" class="tsd-kind-icon">BCOVRIN_<wbr/>TEST_<wbr/>GENESIS</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_ledgerConfig.html#default" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/agent_agentUtils_listener.html b/apps/ssi-abstraction/docs/modules/agent_agentUtils_listener.html new file mode 100644 index 0000000000000000000000000000000000000000..0350a8d8ccfa937b213b715dad6a674553a46a8c --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/agent_agentUtils_listener.html @@ -0,0 +1,13 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>agent/agentUtils/listener | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="agent_agentUtils_listener.html">agent/agentUtils/listener</a></li></ul><h1>Module agent/agentUtils/listener </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_listener.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Functions</h3><ul class="tsd-index-list"><li class="tsd-kind-function tsd-parent-kind-module"><a href="agent_agentUtils_listener.html#subscribe-1" class="tsd-kind-icon">subscribe</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>subscribe<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>agent<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Agent</span>, natsClient<span class="tsd-signature-symbol">: </span><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in agent/agentUtils/listener.ts:26</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>subscribe<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>agent<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Agent</span>, natsClient<span class="tsd-signature-symbol">: </span><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h5><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-type-literal"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>agent<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Agent</span>, natsClient<span class="tsd-signature-symbol">: </span><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Subscribes to events on nats</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>agent: <span class="tsd-signature-type">Agent</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the agent that has been initialized on startup</p> +</div></div></li><li><h5>natsClient: <a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the client that specifies how events are published</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4></li></ul></li></ul></li></ul></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Functions</h2><section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-module"><a id="subscribe-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link">subscribe<a href="#subscribe-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module"><li class="tsd-signature tsd-kind-icon">subscribe<span class="tsd-signature-symbol">(</span>agent<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Agent</span>, natsClient<span class="tsd-signature-symbol">: </span><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in agent/agentUtils/listener.ts:12</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Subscribes to events on nats</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>agent: <span class="tsd-signature-type">Agent</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the agent that has been initialized on startup</p> +</div></div></li><li><h5>natsClient: <a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the client that specifies how events are published</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">Promise</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">void</span><span class="tsd-signature-symbol">></span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class="current tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_listener.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-function tsd-parent-kind-module"><a href="agent_agentUtils_listener.html#subscribe-1" class="tsd-kind-icon">subscribe</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/agent_agentUtils_listenerConfig.html b/apps/ssi-abstraction/docs/modules/agent_agentUtils_listenerConfig.html new file mode 100644 index 0000000000000000000000000000000000000000..8beea291067bdbf63d373d04f5f48f1ff2446faf --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/agent_agentUtils_listenerConfig.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>agent/agentUtils/listenerConfig | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="agent_agentUtils_listenerConfig.html">agent/agentUtils/listenerConfig</a></li></ul><h1>Module agent/agentUtils/listenerConfig </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_listenerConfig.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_listenerConfig.html#listenerConfig-1" class="tsd-kind-icon">listener<wbr/>Config</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>listenerConfig<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-type">BasicMessageStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ConnectionStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">CredentialStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ProofStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">RoutingEventTypes</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OutboundWebSocketClosedEvent</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in agent/agentUtils/listenerConfig.ts:20</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>listener<wbr/>Config<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span><span class="tsd-signature-type">BasicMessageStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ConnectionStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">CredentialStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ProofStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">RoutingEventTypes</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OutboundWebSocketClosedEvent</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">[]</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="listenerConfig-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> listener<wbr/>Config<a href="#listenerConfig-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">listener<wbr/>Config<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">(</span><span class="tsd-signature-type">BasicMessageStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ConnectionStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">CredentialStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">ProofStateChanged</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">RoutingEventTypes</span><span class="tsd-signature-symbol"> | </span><span class="tsd-signature-type">OutboundWebSocketClosedEvent</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in agent/agentUtils/listenerConfig.ts:10</li></ul></aside></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class="current tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_listenerConfig.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_agentUtils_listenerConfig.html#listenerConfig-1" class="tsd-kind-icon">listener<wbr/>Config</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/agent_module.html b/apps/ssi-abstraction/docs/modules/agent_module.html new file mode 100644 index 0000000000000000000000000000000000000000..e6846e027f727559ad45c2e00499c5388dac5e1f --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/agent_module.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>agent/module | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="agent_module.html">agent/module</a></li></ul><h1>Module agent/module </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>References</h3><ul class="tsd-index-list"><li class="tsd-kind-reference tsd-parent-kind-module"><a href="agent_module.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/agent_module.AgentModule.html" class="tsd-kind-icon">Agent<wbr/>Module</a></li></ul></section><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_module.html#AGENT" class="tsd-kind-icon">AGENT</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>References</h2><section class="tsd-panel tsd-member tsd-kind-reference tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="../classes/agent_module.AgentModule.html">AgentModule</a></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="AGENT" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> AGENT<a href="#AGENT" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">AGENT<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">"agent"</span><span class="tsd-signature-symbol"> = 'agent'</span></div><aside class="tsd-sources"><ul><li>Defined in agent/module.ts:17</li></ul></aside></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class="current tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-reference tsd-parent-kind-module"><a href="agent_module.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/agent_module.AgentModule.html" class="tsd-kind-icon">Agent<wbr/>Module</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="agent_module.html#AGENT" class="tsd-kind-icon">AGENT</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/app_module.html b/apps/ssi-abstraction/docs/modules/app_module.html new file mode 100644 index 0000000000000000000000000000000000000000..66432d27f6c49ef105edd06fdf07c9ce60a1048b --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/app_module.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>app.module | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="app_module.html">app.module</a></li></ul><h1>Module app.module </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>References</h3><ul class="tsd-index-list"><li class="tsd-kind-reference tsd-parent-kind-module"><a href="app_module.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/app_module.AppModule.html" class="tsd-kind-icon">App<wbr/>Module</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>References</h2><section class="tsd-panel tsd-member tsd-kind-reference tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="../classes/app_module.AppModule.html">AppModule</a></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class="current tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-reference tsd-parent-kind-module"><a href="app_module.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/app_module.AppModule.html" class="tsd-kind-icon">App<wbr/>Module</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/client_nats_client.html b/apps/ssi-abstraction/docs/modules/client_nats_client.html new file mode 100644 index 0000000000000000000000000000000000000000..a68ed0ad41e4ab0092558d34e7b9b00aa8279766 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/client_nats_client.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>client/nats.client | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="client_nats_client.html">client/nats.client</a></li></ul><h1>Module client/nats.client </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-kind-icon">Nats<wbr/>Client<wbr/>Service</a></li></ul></section><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="client_nats_client.html#default" class="tsd-kind-icon">default</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>NatsClientService<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">typeof </span><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in client/nats.client.ts:29</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>Nats<wbr/>Client<wbr/>Service<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">typeof </span><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-signature-type" data-tsd-kind="Class">NatsClientService</a></h5></li></ul></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class="current tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/client_nats_client.NatsClientService.html" class="tsd-kind-icon">Nats<wbr/>Client<wbr/>Service</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="client_nats_client.html#default" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/common_constants.html b/apps/ssi-abstraction/docs/modules/common_constants.html new file mode 100644 index 0000000000000000000000000000000000000000..dce46b5186cb7207af37b57211e255e19c9a6159 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/common_constants.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>common/constants | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="common_constants.html">common/constants</a></li></ul><h1>Module common/constants </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Enumerations</h3><ul class="tsd-index-list"><li class="tsd-kind-enum tsd-parent-kind-module"><a href="../enums/common_constants.NATSServices.html" class="tsd-kind-icon">NATSServices</a></li></ul></section><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="common_constants.html#default" class="tsd-kind-icon">default</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>NATSServices<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">typeof </span><a href="../enums/common_constants.NATSServices.html" class="tsd-signature-type" data-tsd-kind="Enumeration">NATSServices</a><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in common/constants.ts:5</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>NATSServices<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">typeof </span><a href="../enums/common_constants.NATSServices.html" class="tsd-signature-type" data-tsd-kind="Enumeration">NATSServices</a></h5></li></ul></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class="current tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-enum tsd-parent-kind-module"><a href="../enums/common_constants.NATSServices.html" class="tsd-kind-icon">NATSServices</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="common_constants.html#default" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/common_response.html b/apps/ssi-abstraction/docs/modules/common_response.html new file mode 100644 index 0000000000000000000000000000000000000000..1357677b14729ee3da0c322a7f16876597e4a82b --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/common_response.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>common/response | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="common_response.html">common/response</a></li></ul><h1>Module common/response </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Interfaces</h3><ul class="tsd-index-list"><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/common_response.ResponseType.html" class="tsd-kind-icon">Response<wbr/>Type</a></li></ul></section></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class="current tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/common_response.ResponseType.html" class="tsd-kind-icon">Response<wbr/>Type</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/didComm_controller_controller.html b/apps/ssi-abstraction/docs/modules/didComm_controller_controller.html new file mode 100644 index 0000000000000000000000000000000000000000..ea0a8cf47424086c8f50d19b74cdb4491f5d95cc --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/didComm_controller_controller.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>didComm/controller/controller | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="didComm_controller_controller.html">didComm/controller/controller</a></li></ul><h1>Module didComm/controller/controller </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>References</h3><ul class="tsd-index-list"><li class="tsd-kind-reference tsd-parent-kind-module"><a href="didComm_controller_controller.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/didComm_controller_controller.DidCommController.html" class="tsd-kind-icon">Did<wbr/>Comm<wbr/>Controller</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>References</h2><section class="tsd-panel tsd-member tsd-kind-reference tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="../classes/didComm_controller_controller.DidCommController.html">DidCommController</a></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class="current tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-reference tsd-parent-kind-module"><a href="didComm_controller_controller.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/didComm_controller_controller.DidCommController.html" class="tsd-kind-icon">Did<wbr/>Comm<wbr/>Controller</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/didComm_didCommUtils.html b/apps/ssi-abstraction/docs/modules/didComm_didCommUtils.html new file mode 100644 index 0000000000000000000000000000000000000000..2ac996d35e316b339e1cff65c0bb2a4d9a2111e8 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/didComm_didCommUtils.html @@ -0,0 +1,31 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>didComm/didCommUtils | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="didComm_didCommUtils.html">didComm/didCommUtils</a></li></ul><h1>Module didComm/didCommUtils </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_didCommUtils.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Functions</h3><ul class="tsd-index-list"><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_didCommUtils.html#objectPathLoop-1" class="tsd-kind-icon">object<wbr/>Path<wbr/>Loop</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>objectPathLoop<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>response<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span>, context<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, prevContext<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/didCommUtils.ts:43</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>object<wbr/>Path<wbr/>Loop<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>response<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span>, context<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, prevContext<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">any</span></h5><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-type-literal"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>response<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span>, context<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, prevContext<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Handles the subMethods of responses</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>response: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>generic response from the agent</p> +</div></div></li><li><h5>path: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the location of the subMethod within the response object ('.' notation)</p> +</div></div></li><li><h5>context: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>subMethod on which the body.subMethod.subMethodData is applied on</p> +</div></div></li><li><h5>prevContext: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the object which contains the subMethod</p> +</div></div></li><li><h5>body: <a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>arguments of the property method + subMethod name and arguments</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">any</span></h4><div><ul> +<li>the result from the applied subMethod arguments on the subMethod</li> +</ul> +</div></li></ul></li></ul></li></ul></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Functions</h2><section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-module"><a id="objectPathLoop-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link">object<wbr/>Path<wbr/>Loop<a href="#objectPathLoop-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module"><li class="tsd-signature tsd-kind-icon">object<wbr/>Path<wbr/>Loop<span class="tsd-signature-symbol">(</span>response<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, path<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span>, context<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, prevContext<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in didComm/didCommUtils.ts:15</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Handles the subMethods of responses</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>response: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>generic response from the agent</p> +</div></div></li><li><h5>path: <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the location of the subMethod within the response object ('.' notation)</p> +</div></div></li><li><h5>context: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>subMethod on which the body.subMethod.subMethodData is applied on</p> +</div></div></li><li><h5>prevContext: <span class="tsd-signature-type">any</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>the object which contains the subMethod</p> +</div></div></li><li><h5>body: <a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>arguments of the property method + subMethod name and arguments</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">any</span></h4><div><ul> +<li>the result from the applied subMethod arguments on the subMethod</li> +</ul> +</div></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class="current tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_didCommUtils.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_didCommUtils.html#objectPathLoop-1" class="tsd-kind-icon">object<wbr/>Path<wbr/>Loop</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/didComm_entities_GenericBody.html b/apps/ssi-abstraction/docs/modules/didComm_entities_GenericBody.html new file mode 100644 index 0000000000000000000000000000000000000000..31f0fcd71bca2e8c9fce6db9090239e015c415b8 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/didComm_entities_GenericBody.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>didComm/entities/GenericBody | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="didComm_entities_GenericBody.html">didComm/entities/GenericBody</a></li></ul><h1>Module didComm/entities/GenericBody </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>References</h3><ul class="tsd-index-list"><li class="tsd-kind-reference tsd-parent-kind-module"><a href="didComm_entities_GenericBody.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Interfaces</h3><ul class="tsd-index-list"><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-kind-icon">Generic<wbr/>Body</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>References</h2><section class="tsd-panel tsd-member tsd-kind-reference tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="../interfaces/didComm_entities_GenericBody.GenericBody.html">GenericBody</a></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class="current tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-reference tsd-parent-kind-module"><a href="didComm_entities_GenericBody.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-kind-icon">Generic<wbr/>Body</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/didComm_module.html b/apps/ssi-abstraction/docs/modules/didComm_module.html new file mode 100644 index 0000000000000000000000000000000000000000..51640dce83d0457de4c49723ac501d3645ee0d04 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/didComm_module.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>didComm/module | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="didComm_module.html">didComm/module</a></li></ul><h1>Module didComm/module </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/didComm_module.default.html" class="tsd-kind-icon">default</a></li></ul></section></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class="current tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/didComm_module.default.html" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/didComm_utils_prepareData.html b/apps/ssi-abstraction/docs/modules/didComm_utils_prepareData.html new file mode 100644 index 0000000000000000000000000000000000000000..f975812bd2b62370e82ca5a0c32173524663af17 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/didComm_utils_prepareData.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>didComm/utils/prepareData | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="didComm_utils_prepareData.html">didComm/utils/prepareData</a></li></ul><h1>Module didComm/utils/prepareData </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_prepareData.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Functions</h3><ul class="tsd-index-list"><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_utils_prepareData.html#prepareInputData-1" class="tsd-kind-icon">prepare<wbr/>Input<wbr/>Data</a></li><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_utils_prepareData.html#prepareOutputData" class="tsd-kind-icon">prepare<wbr/>Output<wbr/>Data</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>prepareInputData<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>data<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/prepareData.ts:39</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>prepare<wbr/>Input<wbr/>Data<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>data<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span></h5><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-type-literal"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>data<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>data: <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span></h4></li></ul></li></ul></li></ul></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Functions</h2><section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-module"><a id="prepareInputData-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link">prepare<wbr/>Input<wbr/>Data<a href="#prepareInputData-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module"><li class="tsd-signature tsd-kind-icon">prepare<wbr/>Input<wbr/>Data<span class="tsd-signature-symbol">(</span>data<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in didComm/utils/prepareData.ts:19</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>data: <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">[]</span></h4></li></ul></section><section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-module"><a id="prepareOutputData" class="tsd-anchor"></a><h3 class="tsd-anchor-link">prepare<wbr/>Output<wbr/>Data<a href="#prepareOutputData" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module"><li class="tsd-signature tsd-kind-icon">prepare<wbr/>Output<wbr/>Data<span class="tsd-signature-symbol">(</span>data<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">any</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in didComm/utils/prepareData.ts:32</li></ul></aside><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>data: <span class="tsd-signature-type">any</span></h5></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">any</span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class="current tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_prepareData.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_utils_prepareData.html#prepareInputData-1" class="tsd-kind-icon">prepare<wbr/>Input<wbr/>Data</a></li><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_utils_prepareData.html#prepareOutputData" class="tsd-kind-icon">prepare<wbr/>Output<wbr/>Data</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/didComm_utils_whitelist.html b/apps/ssi-abstraction/docs/modules/didComm_utils_whitelist.html new file mode 100644 index 0000000000000000000000000000000000000000..6d439e47c1a25805491861cf0571babe732e0313 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/didComm_utils_whitelist.html @@ -0,0 +1,19 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>didComm/utils/whitelist | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="didComm_utils_whitelist.html">didComm/utils/whitelist</a></li></ul><h1>Module didComm/utils/whitelist </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Interfaces</h3><ul class="tsd-index-list"><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-kind-icon">Check<wbr/>Type</a></li><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/didComm_utils_whitelist.GenericParams.html" class="tsd-kind-icon">Generic<wbr/>Params</a></li></ul></section><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#methodsList-1" class="tsd-kind-icon">methods<wbr/>List</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#propertiesList-1" class="tsd-kind-icon">properties<wbr/>List</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#subMethodsList-1" class="tsd-kind-icon">sub<wbr/>Methods<wbr/>List</a></li></ul></section><section class="tsd-index-section "><h3>Functions</h3><ul class="tsd-index-list"><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#checkAll-1" class="tsd-kind-icon">check<wbr/>All</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>checkAll<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>property<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, method<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-signature-type" data-tsd-kind="Interface">CheckType</a><span class="tsd-signature-symbol">; </span>methodsList<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">; </span>propertiesList<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol">; </span>subMethodsList<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:237</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>check<wbr/>All<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">(</span>property<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, method<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol"> => </span><a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-signature-type" data-tsd-kind="Interface">CheckType</a></h5><ul class="tsd-parameters"><li class="tsd-parameter-signature"><ul class="tsd-signatures tsd-kind-type-literal tsd-parent-kind-type-literal"><li class="tsd-signature tsd-kind-icon"><span class="tsd-signature-symbol">(</span>property<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, method<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-signature-type" data-tsd-kind="Interface">CheckType</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Checks if the property, method or subMethod are allowed</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>property: <span class="tsd-signature-type">string</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>property of the agent</p> +</div></div></li><li><h5>method: <span class="tsd-signature-type">string</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>method of the property</p> +</div></div></li><li><h5>body: <a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>arguments and subMethod name + arguments</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-signature-type" data-tsd-kind="Interface">CheckType</a></h4><div><p>-an object with the conditional message</p> +</div></li></ul></li></ul></li><li class="tsd-parameter"><h5>methods<wbr/>List<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li><li class="tsd-parameter"><h5>properties<wbr/>List<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li><li class="tsd-parameter"><h5>sub<wbr/>Methods<wbr/>List<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span></h5></li></ul></div></section><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="methodsList-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> methods<wbr/>List<a href="#methodsList-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">methods<wbr/>List<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:105</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="propertiesList-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> properties<wbr/>List<a href="#propertiesList-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">properties<wbr/>List<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:93</li></ul></aside></section><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="subMethodsList-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> sub<wbr/>Methods<wbr/>List<a href="#subMethodsList-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">sub<wbr/>Methods<wbr/>List<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">[]</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:177</li></ul></aside></section></section><section class="tsd-panel-group tsd-member-group "><h2>Functions</h2><section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-module"><a id="checkAll-1" class="tsd-anchor"></a><h3 class="tsd-anchor-link">check<wbr/>All<a href="#checkAll-1" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module"><li class="tsd-signature tsd-kind-icon">check<wbr/>All<span class="tsd-signature-symbol">(</span>property<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, method<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">string</span>, body<span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-signature-type" data-tsd-kind="Interface">CheckType</a></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in didComm/utils/whitelist.ts:204</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Checks if the property, method or subMethod are allowed</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>property: <span class="tsd-signature-type">string</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>property of the agent</p> +</div></div></li><li><h5>method: <span class="tsd-signature-type">string</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>method of the property</p> +</div></div></li><li><h5>body: <a href="../interfaces/didComm_entities_GenericBody.GenericBody.html" class="tsd-signature-type" data-tsd-kind="Interface">GenericBody</a></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>arguments and subMethod name + arguments</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-signature-type" data-tsd-kind="Interface">CheckType</a></h4><div><p>-an object with the conditional message</p> +</div></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class="current tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/didComm_utils_whitelist.CheckType.html" class="tsd-kind-icon">Check<wbr/>Type</a></li><li class="tsd-kind-interface tsd-parent-kind-module"><a href="../interfaces/didComm_utils_whitelist.GenericParams.html" class="tsd-kind-icon">Generic<wbr/>Params</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#methodsList-1" class="tsd-kind-icon">methods<wbr/>List</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#propertiesList-1" class="tsd-kind-icon">properties<wbr/>List</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#subMethodsList-1" class="tsd-kind-icon">sub<wbr/>Methods<wbr/>List</a></li><li class="tsd-kind-function tsd-parent-kind-module"><a href="didComm_utils_whitelist.html#checkAll-1" class="tsd-kind-icon">check<wbr/>All</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/globalUtils_appConfig.html b/apps/ssi-abstraction/docs/modules/globalUtils_appConfig.html new file mode 100644 index 0000000000000000000000000000000000000000..a646011d3f73cb89c7abeaa08ebc5c3145766653 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/globalUtils_appConfig.html @@ -0,0 +1,7 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>globalUtils/appConfig | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="globalUtils_appConfig.html">globalUtils/appConfig</a></li></ul><h1>Module globalUtils/appConfig </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Functions</h3><ul class="tsd-index-list"><li class="tsd-kind-function tsd-parent-kind-module"><a href="globalUtils_appConfig.html#default" class="tsd-kind-icon">default</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Functions</h2><section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module"><li class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">(</span>app<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">INestApplication</span>, configService<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">ConfigService</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">false</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in globalUtils/appConfig.ts:11</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Microservice and versioning configuration of the service</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>app: <span class="tsd-signature-type">INestApplication</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Nest.js internal configuration object</p> +</div></div></li><li><h5>configService: <span class="tsd-signature-type">ConfigService</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">Record</span><span class="tsd-signature-symbol"><</span><span class="tsd-signature-type">string</span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">unknown</span><span class="tsd-signature-symbol">></span><span class="tsd-signature-symbol">, </span><span class="tsd-signature-type">false</span><span class="tsd-signature-symbol">></span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Nest.js internal configuration object</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class="current tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-function tsd-parent-kind-module"><a href="globalUtils_appConfig.html#default" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/globalUtils_exception_handler.html b/apps/ssi-abstraction/docs/modules/globalUtils_exception_handler.html new file mode 100644 index 0000000000000000000000000000000000000000..ee8709b8ef4b1ec53e283a98560960edec2246a3 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/globalUtils_exception_handler.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>globalUtils/exception.handler | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="globalUtils_exception_handler.html">globalUtils/exception.handler</a></li></ul><h1>Module globalUtils/exception.handler </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>References</h3><ul class="tsd-index-list"><li class="tsd-kind-reference tsd-parent-kind-module"><a href="globalUtils_exception_handler.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/globalUtils_exception_handler.ExceptionHandler.html" class="tsd-kind-icon">Exception<wbr/>Handler</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>References</h2><section class="tsd-panel tsd-member tsd-kind-reference tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="../classes/globalUtils_exception_handler.ExceptionHandler.html">ExceptionHandler</a></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class="current tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-reference tsd-parent-kind-module"><a href="globalUtils_exception_handler.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/globalUtils_exception_handler.ExceptionHandler.html" class="tsd-kind-icon">Exception<wbr/>Handler</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/globalUtils_logger.html b/apps/ssi-abstraction/docs/modules/globalUtils_logger.html new file mode 100644 index 0000000000000000000000000000000000000000..d236d3a9c979e00b4a7efe723d91fd5eabfe97fd --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/globalUtils_logger.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>globalUtils/logger | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="globalUtils_logger.html">globalUtils/logger</a></li></ul><h1>Module globalUtils/logger </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="globalUtils_logger.html#default" class="tsd-kind-icon">default</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link"><span class="tsd-flag ts-flagConst">Const</span> default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-type">Logger</span><span class="tsd-signature-symbol"> = ...</span></div><aside class="tsd-sources"><ul><li>Defined in globalUtils/logger.ts:16</li></ul></aside></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class="current tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-variable tsd-parent-kind-module"><a href="globalUtils_logger.html#default" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/globalUtils_swagger.html b/apps/ssi-abstraction/docs/modules/globalUtils_swagger.html new file mode 100644 index 0000000000000000000000000000000000000000..4204bfb7aae0ab9ee85ad9fc1ceb6c164c60079b --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/globalUtils_swagger.html @@ -0,0 +1,5 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>globalUtils/swagger | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="globalUtils_swagger.html">globalUtils/swagger</a></li></ul><h1>Module globalUtils/swagger </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Functions</h3><ul class="tsd-index-list"><li class="tsd-kind-function tsd-parent-kind-module"><a href="globalUtils_swagger.html#default" class="tsd-kind-icon">default</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Functions</h2><section class="tsd-panel tsd-member tsd-kind-function tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><ul class="tsd-signatures tsd-kind-function tsd-parent-kind-module"><li class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">(</span>app<span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">INestApplication</span><span class="tsd-signature-symbol">)</span><span class="tsd-signature-symbol">: </span><span class="tsd-signature-type">void</span></li></ul><ul class="tsd-descriptions"><li class="tsd-description"><aside class="tsd-sources"><ul><li>Defined in globalUtils/swagger.ts:10</li></ul></aside><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Setup for swagger endpoint documentation</p> +</div></div><h4 class="tsd-parameters-title">Parameters</h4><ul class="tsd-parameters"><li><h5>app: <span class="tsd-signature-type">INestApplication</span></h5><div class="tsd-comment tsd-typography"><div class="lead"> +<p>Nest.js internal config object</p> +</div></div></li></ul><h4 class="tsd-returns-title">Returns <span class="tsd-signature-type">void</span></h4></li></ul></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class="current tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-function tsd-parent-kind-module"><a href="globalUtils_swagger.html#default" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/health_health_controller.html b/apps/ssi-abstraction/docs/modules/health_health_controller.html new file mode 100644 index 0000000000000000000000000000000000000000..c63aba4de6e49c05fd8854f73df43437ded5392e --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/health_health_controller.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>health/health.controller | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="health_health_controller.html">health/health.controller</a></li></ul><h1>Module health/health.controller </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>References</h3><ul class="tsd-index-list"><li class="tsd-kind-reference tsd-parent-kind-module"><a href="health_health_controller.html#default" class="tsd-kind-icon">default</a></li></ul></section><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/health_health_controller.HealthController.html" class="tsd-kind-icon">Health<wbr/>Controller</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>References</h2><section class="tsd-panel tsd-member tsd-kind-reference tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3>Renames and re-exports <a href="../classes/health_health_controller.HealthController.html">HealthController</a></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class="current tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class=" tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-reference tsd-parent-kind-module"><a href="health_health_controller.html#default" class="tsd-kind-icon">default</a></li><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/health_health_controller.HealthController.html" class="tsd-kind-icon">Health<wbr/>Controller</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/docs/modules/middleware_agentMid_middleware.html b/apps/ssi-abstraction/docs/modules/middleware_agentMid_middleware.html new file mode 100644 index 0000000000000000000000000000000000000000..634a6294fdefe49549db2949dde1d313ae477353 --- /dev/null +++ b/apps/ssi-abstraction/docs/modules/middleware_agentMid_middleware.html @@ -0,0 +1 @@ +<!DOCTYPE html><html class="default"><head><meta charSet="utf-8"/><meta http-equiv="x-ua-compatible" content="IE=edge"/><title>middleware/agentMid.middleware | ocm-ssi-abstraction</title><meta name="description" content="Documentation for ocm-ssi-abstraction"/><meta name="viewport" content="width=device-width, initial-scale=1"/><link rel="stylesheet" href="../assets/style.css"/><link rel="stylesheet" href="../assets/highlight.css"/><script async src="../assets/search.js" id="search-script"></script></head><body><script>document.body.classList.add(localStorage.getItem("tsd-theme") || "os")</script><header><div class="tsd-page-toolbar"><div class="container"><div class="table-wrap"><div class="table-cell" id="tsd-search" data-base=".."><div class="field"><label for="tsd-search-field" class="tsd-widget search no-caption">Search</label><input type="text" id="tsd-search-field"/></div><ul class="results"><li class="state loading">Preparing search index...</li><li class="state failure">The search index is not available</li></ul><a href="../index.html" class="title">ocm-ssi-abstraction</a></div><div class="table-cell" id="tsd-widgets"><div id="tsd-filter"><a href="#" class="tsd-widget options no-caption" data-toggle="options">Options</a><div class="tsd-filter-group"><div class="tsd-select" id="tsd-filter-visibility"><span class="tsd-select-label">All</span><ul class="tsd-select-list"><li data-value="public">Public</li><li data-value="protected">Public/Protected</li><li data-value="private" class="selected">All</li></ul></div> <input type="checkbox" id="tsd-filter-inherited" checked/><label class="tsd-widget" for="tsd-filter-inherited">Inherited</label><input type="checkbox" id="tsd-filter-externals" checked/><label class="tsd-widget" for="tsd-filter-externals">Externals</label></div></div><a href="#" class="tsd-widget menu no-caption" data-toggle="menu">Menu</a></div></div></div></div><div class="tsd-page-title"><div class="container"><ul class="tsd-breadcrumb"><li><a href="../modules.html">ocm-ssi-abstraction</a></li><li><a href="middleware_agentMid_middleware.html">middleware/agentMid.middleware</a></li></ul><h1>Module middleware/agentMid.middleware </h1></div></div></header><div class="container container-main"><div class="row"><div class="col-8 col-content"><section class="tsd-panel-group tsd-index-group"><h2>Index</h2><section class="tsd-panel tsd-index-panel"><div class="tsd-index-content"><section class="tsd-index-section "><h3>Classes</h3><ul class="tsd-index-list"><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/middleware_agentMid_middleware.AgentMid.html" class="tsd-kind-icon">Agent<wbr/>Mid</a></li></ul></section><section class="tsd-index-section "><h3>Variables</h3><ul class="tsd-index-list"><li class="tsd-kind-variable tsd-parent-kind-module"><a href="middleware_agentMid_middleware.html#default" class="tsd-kind-icon">default</a></li></ul></section></div></section></section><section class="tsd-panel-group tsd-member-group "><h2>Variables</h2><section class="tsd-panel tsd-member tsd-kind-variable tsd-parent-kind-module"><a id="default" class="tsd-anchor"></a><h3 class="tsd-anchor-link">default<a href="#default" aria-label="Permalink" class="tsd-anchor-icon"><svg xmlns="http://www.w3.org/2000/svg" class="icon icon-tabler icon-tabler-link" viewBox="0 0 24 24" stroke-width="2" stroke="currentColor" fill="none" stroke-linecap="round" stroke-linejoin="round"><path stroke="none" d="M0 0h24v24H0z" fill="none"></path><path d="M10 14a3.5 3.5 0 0 0 5 0l4 -4a3.5 3.5 0 0 0 -5 -5l-.5 .5"></path><path d="M14 10a3.5 3.5 0 0 0 -5 0l-4 4a3.5 3.5 0 0 0 5 5l.5 -.5"></path></svg></a></h3><div class="tsd-signature tsd-kind-icon">default<span class="tsd-signature-symbol">:</span> <span class="tsd-signature-symbol">{ </span>AgentMid<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">typeof </span><a href="../classes/middleware_agentMid_middleware.AgentMid.html" class="tsd-signature-type" data-tsd-kind="Class">AgentMid</a><span class="tsd-signature-symbol"> }</span></div><aside class="tsd-sources"><ul><li>Defined in middleware/agentMid.middleware.ts:43</li></ul></aside><div class="tsd-type-declaration"><h4>Type declaration</h4><ul class="tsd-parameters"><li class="tsd-parameter"><h5>Agent<wbr/>Mid<span class="tsd-signature-symbol">: </span><span class="tsd-signature-symbol">typeof </span><a href="../classes/middleware_agentMid_middleware.AgentMid.html" class="tsd-signature-type" data-tsd-kind="Class">AgentMid</a></h5></li></ul></div></section></section></div><div class="col-4 col-menu menu-sticky-wrap menu-highlight"><nav class="tsd-navigation primary"><ul><li class=""><a href="../modules.html">Modules</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_ledgerConfig.html">agent/agent<wbr/>Utils/ledger<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listener.html">agent/agent<wbr/>Utils/listener</a></li><li class=" tsd-kind-module"><a href="agent_agentUtils_listenerConfig.html">agent/agent<wbr/>Utils/listener<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="agent_module.html">agent/module</a></li><li class=" tsd-kind-module"><a href="app_module.html">app.module</a></li><li class=" tsd-kind-module"><a href="client_nats_client.html">client/nats.client</a></li><li class=" tsd-kind-module"><a href="common_constants.html">common/constants</a></li><li class=" tsd-kind-module"><a href="common_response.html">common/response</a></li><li class=" tsd-kind-module"><a href="didComm_controller_controller.html">did<wbr/>Comm/controller/controller</a></li><li class=" tsd-kind-module"><a href="didComm_didCommUtils.html">did<wbr/>Comm/did<wbr/>Comm<wbr/>Utils</a></li><li class=" tsd-kind-module"><a href="didComm_entities_GenericBody.html">did<wbr/>Comm/entities/<wbr/>Generic<wbr/>Body</a></li><li class=" tsd-kind-module"><a href="didComm_module.html">did<wbr/>Comm/module</a></li><li class=" tsd-kind-module"><a href="didComm_utils_prepareData.html">did<wbr/>Comm/utils/prepare<wbr/>Data</a></li><li class=" tsd-kind-module"><a href="didComm_utils_whitelist.html">did<wbr/>Comm/utils/whitelist</a></li><li class=" tsd-kind-module"><a href="globalUtils_appConfig.html">global<wbr/>Utils/app<wbr/>Config</a></li><li class=" tsd-kind-module"><a href="globalUtils_exception_handler.html">global<wbr/>Utils/exception.handler</a></li><li class=" tsd-kind-module"><a href="globalUtils_logger.html">global<wbr/>Utils/logger</a></li><li class=" tsd-kind-module"><a href="globalUtils_swagger.html">global<wbr/>Utils/swagger</a></li><li class=" tsd-kind-module"><a href="health_health_controller.html">health/health.controller</a></li><li class="current tsd-kind-module"><a href="middleware_agentMid_middleware.html">middleware/agent<wbr/>Mid.middleware</a></li></ul></nav><nav class="tsd-navigation secondary menu-sticky"><ul><li class="tsd-kind-class tsd-parent-kind-module"><a href="../classes/middleware_agentMid_middleware.AgentMid.html" class="tsd-kind-icon">Agent<wbr/>Mid</a></li><li class="tsd-kind-variable tsd-parent-kind-module"><a href="middleware_agentMid_middleware.html#default" class="tsd-kind-icon">default</a></li></ul></nav></div></div></div><footer class="with-border-bottom"><div class="container"><h2>Legend</h2><div class="tsd-legend-group"><ul class="tsd-legend"><li class="tsd-kind-variable"><span class="tsd-kind-icon">Variable</span></li><li class="tsd-kind-function"><span class="tsd-kind-icon">Function</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-enum"><span class="tsd-kind-icon">Enumeration</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-interface"><span class="tsd-kind-icon">Interface</span></li></ul><ul class="tsd-legend"><li class="tsd-kind-class"><span class="tsd-kind-icon">Class</span></li></ul></div><h2>Settings</h2><p>Theme <select id="theme"><option value="os">OS</option><option value="light">Light</option><option value="dark">Dark</option></select></p></div></footer><div class="container tsd-generator"><p>Generated using <a href="https://typedoc.org/" target="_blank">TypeDoc</a></p></div><div class="overlay"></div><script src="../assets/main.js"></script></body></html> \ No newline at end of file diff --git a/apps/ssi-abstraction/nest-cli.json b/apps/ssi-abstraction/nest-cli.json new file mode 100644 index 0000000000000000000000000000000000000000..56167b36a14c2c69eb0db57302e2c44a1128b006 --- /dev/null +++ b/apps/ssi-abstraction/nest-cli.json @@ -0,0 +1,4 @@ +{ + "collection": "@nestjs/schematics", + "sourceRoot": "src" +} diff --git a/apps/ssi-abstraction/package.json b/apps/ssi-abstraction/package.json new file mode 100644 index 0000000000000000000000000000000000000000..d840b9263787e45d2dfaabe124bdec7701b05eed --- /dev/null +++ b/apps/ssi-abstraction/package.json @@ -0,0 +1,110 @@ +{ + "name": "ssi-abstraction", + "version": "0.0.1", + "description": "A core OCM service that provides the SSI interface through REST endpoints and events.", + "author": "Vereign", + "private": true, + "license": "Apache-2.0", + "scripts": { + "clean": "rm -r dist", + "prebuild": "rimraf dist", + "build": "nest build", + "format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"", + "start": "nest start", + "start:docker": "nest start", + "lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix", + "test": "jest", + "test:watch": "jest --watch", + "test:cov": "jest --coverage", + "test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand", + "test:e2e": "jest -i --config ./test/jest-e2e.json" + }, + "dependencies": { + "@aries-framework/core": "^0.1.0", + "@aries-framework/node": "^0.1.0", + "@aries-framework/rest": "^0.8.0", + "@elastic/ecs-winston-format": "^1.3.1", + "@nestjs/axios": "0.0.5", + "@nestjs/common": "^8.0.0", + "@nestjs/config": "^1.1.6", + "@nestjs/core": "^8.0.0", + "@nestjs/mapped-types": "*", + "@nestjs/microservices": "^8.2.6", + "@nestjs/platform-express": "^8.0.0", + "@nestjs/swagger": "^5.2.0", + "@nestjs/terminus": "^8.0.4", + "@types/express": "^4.17.13", + "@types/jest": "27.0.2", + "@types/node": "^16.0.0", + "@types/shelljs": "^0.8.11", + "@types/supertest": "^2.0.11", + "axios": "^0.27.2", + "class-validator": "^0.13.2", + "express": "^4.17.3", + "joi": "^17.6.0", + "moment": "^2.29.1", + "nats": "^2.6.1", + "pg": "^8.7.3", + "reflect-metadata": "^0.1.13", + "rimraf": "^3.0.2", + "rxjs": "^7.2.0", + "shelljs": "^0.8.5", + "swagger-ui-express": "^4.3.0", + "winston": "^3.6.0", + "winston-elasticsearch": "^0.16.1" + }, + "devDependencies": { + "@nestjs/cli": "^8.0.0", + "@nestjs/schematics": "^8.0.0", + "@nestjs/testing": "^8.0.0", + "@typescript-eslint/eslint-plugin": "^5.0.0", + "@typescript-eslint/parser": "^5.0.0", + "dotenv-cli": "^4.1.1", + "eslint": "^8.0.1", + "eslint-config-airbnb-typescript": "^16.1.0", + "eslint-config-prettier": "^8.3.0", + "eslint-plugin-import": "^2.25.4", + "eslint-plugin-prettier": "^4.0.0", + "husky": "^7.0.4", + "jest": "^27.2.5", + "prettier": "^2.3.2", + "source-map-support": "^0.5.20", + "supertest": "^6.1.3", + "ts-jest": "^27.0.3", + "ts-loader": "^9.2.3", + "ts-node": "^10.0.0", + "tsconfig-paths": "^3.10.1", + "typedoc": "^0.22.15", + "typescript": "^4.3.5" + }, + "jest": { + "moduleFileExtensions": [ + "js", + "json", + "ts" + ], + "rootDir": "src", + "testRegex": ".*\\.spec\\.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "moduleNameMapper": { + "^@src/(.*)$": "<rootDir>/$1", + "@config/(.*)": "<rootDir>/../config/$1", + "@globalUtils/(.*)": "<rootDir>/globalUtils/$1", + "^@didComm/(.*)$": "<rootDir>/didComm/$1", + "^@DB/(.*)$": "<rootDir>/prisma/$1", + "^@common/(.*)$": "<rootDir>/common/$1", + "^@agent/(.*)$": "<rootDir>/agent/$1", + "^@health/(.*)$": "<rootDir>/health/$1" + }, + "collectCoverageFrom": [ + "**/agent/agentUtils/listener.(t|j)s", + "**/didComm/controller/**/*.(t|j)s", + "**/didComm/utils/**/*.(t|j)s", + "**/globalUtils/logger.(t|j)s" + ], + "coverageDirectory": "../coverage", + "testEnvironment": "node" + } +} diff --git a/apps/ssi-abstraction/src/agent/agentUtils/helperFunctions.ts b/apps/ssi-abstraction/src/agent/agentUtils/helperFunctions.ts new file mode 100644 index 0000000000000000000000000000000000000000..b58586ab0e18243ed20e2b28b74d81c173bb8748 --- /dev/null +++ b/apps/ssi-abstraction/src/agent/agentUtils/helperFunctions.ts @@ -0,0 +1,20 @@ +import logger from '@src/globalUtils/logger'; + +export function logAxiosError(err: any) { + if (err.response) { + logger.error('Request made and server responded: '); + logger.error(`Data: ${err.response.data}`); + logger.error(`Status: ${err.response.status}`); + logger.error(`Headers: ${err.response.headers}`); + } else if (err.request) { + logger.error('The request was made but no response was received: '); + logger.error(err.request); + } else { + // Something happened in setting up the request that triggered an Error + logger.error('Request error: ', err.message); + } +} + +export default { + logAxiosError, +}; diff --git a/apps/ssi-abstraction/src/agent/agentUtils/ledgerConfig.ts b/apps/ssi-abstraction/src/agent/agentUtils/ledgerConfig.ts new file mode 100644 index 0000000000000000000000000000000000000000..971e03d145c2c27b45e1edf6df95dff494e47d47 --- /dev/null +++ b/apps/ssi-abstraction/src/agent/agentUtils/ledgerConfig.ts @@ -0,0 +1,48 @@ +import config from '@config/config'; + +export const LEDGER_GENESIS = { + ID_UNION: `{"reqSignature":{},"txn":{"data":{"data":{"alias":"MainIncubator","blskey":"14MPfxHnRvCL5dnbpD3SjxekAGnKyjkmifDFLnMJAvHcvEAarDLWX6KawhubPujSmmUMqRmQfPQzBambrdUqBGgHDryDS6Aj8BioWRwZkyTcH1zzkVQ7vZjE5S6ri5epkiS1VkVX42Z22z4cohdHVuKTgeQB5mjAwi55xNeRxpxhrNb","blskey_pop":"QoqRe3vMPr5Bt1qHDstYewWkxb5VEdugnvumLCWpkZAeUpdqjjaSTSKKJtT7U7aCe8CmShGSdCZFWs9hcpmMSGfMnmon7R99UTJj4jEr48smyxo1UpBcgooznc8N8USkZ8hSec3bRbN9y6NppuaFzfgt1WmJ3cdFi9L1Wbj1fNs5CK","client_ip":"35.207.81.15","client_port":"9702","node_ip":"35.207.81.15","node_port":"9701","services":["VALIDATOR"]},"dest":"EQ2oCtWpMdUCzKgQ2hvbyQ2i6VyJuQF9LcpHRfiah6rW"},"metadata":{"from":"2MZYuPv2Km7Q1eD4GCsSb6"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"0a35c047f19448f12a0c2961d8e3085140b8149d87291acbdaf56ed956900d48"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"tubzecm","blskey":"3Zpdx6LMWPdybnQKPq62S3TaWUhwypr7RV2BBFkeFigjKuue7KJ7rh5w1gZY9qgugww9vZnpURLSjBuTonJpfyfN5nn2ofwFQQa3viiT77hhFf6kQqoMH53f66ZfBNWU2LzphQikXsma9zjZWALMtMsNWx7ftNZ8yzMrZpf1X6VqYX5","blskey_pop":"RbPQSMsV8iuxNXVFNEUPvb6k1wQe1rxaXroMMkpHTstiiJfCApER38jW79Ew1yrnt5ndz7wJeDRU7CkLNzJ6pEZaRYjLzhZL2shRgyaGqnMqkxvD1ewxNMSz7cSgBSChwUgLBxsms5iDyshwAM5dx8B1GayMyATcFxAdgCRiDv3EHm","client_ip":"141.23.35.186","client_port":"9702","node_ip":"141.23.35.186","node_port":"9701","services":["VALIDATOR"]},"dest":"Ddqm5GATTcEb5hrgMBbVL8w6R6mtTHjUpdpyCeWg3pVS"},"metadata":{"from":"JhyMn8Nn3xy2zsXjPaPu3B"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"e2f9efff1bfef015098ae299a665154fa39a898a5071d0af03c7f2311fe8577f"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Bosch","blskey":"WNBd2CBPJMSaBan72XhY1v5XSkExX7GRCqxM7WNSfveoDcHSLXbQ59K1mWAcgoJZd89NaYa5pLb7N3AcLxSNUj8HJXwjd8jMECvX9iiGESVn2ssb8VFX2TDE2RBVC4nU5jDexzpwqnhJk27ev64J8H21SpbBecbHvP49ZQpRVaq6WL","blskey_pop":"QkmprUBuiKmoUGkFLGVbozGfiFRcNnjfyL8Zg4VfjPpUT7i8YPoPExbDhFxUKofgavJ1ZEsG8VZECpNDC75anfTfivsuMBr5w4a31ZKuqwCscAXzmeTPrkTPo7QLXuYc1SQMTjrm8YEkBYzHuXktJzkJXvLERnoAdLWqPqMyYWUzGo","client_ip":"20.52.38.11","client_port":"9702","node_ip":"20.52.38.11","node_port":"9701","services":["VALIDATOR"]},"dest":"9oB1GdDzFyn4p1Pb6BotYuSXozdwDWXW5s2jRjg86KpZ"},"metadata":{"from":"K3Bf63TUe3nTj1SKuQVZ2e"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"865ce0cf621e0d5f9c2dccb9e5079733a83d80ea2e814d32c3300bc2c2755b7b"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Bundesdruckerei","blskey":"ypA6Fzaqx3WgyeBWjahz94ZYMXdyRuC9v4NruuNVehxt3VgyRPnBeiRxNcXuN9x7PgD4Y585EkAZMSEUrpego9H75hiNppqFTBppPh8cMisKKxW2qZmePnwM8AR2MkWfsytP64AcZFxhXQw1Sx9SeDZwEZAhzNFg2CGY1Ywf1VyCkB","blskey_pop":"RBGcyWimwwZhTtJrW8f3br5osAFkSbpEsEyR3UtX3Lq82kFCA2yEn1H2HHYapmQ5KQ42ZAE2srfjYa5ihZGgs96oxAHpKdkPWX4rXcnxyFcbPihDCmqY9YvnR6DrzfLMc9ew5ac6xeQfiefiEZGMENFsehLPtiQyohSzZBFEqB8Tdy","client_ip":"193.28.64.163","client_port":"9702","node_ip":"193.28.64.163","node_port":"9701","services":["VALIDATOR"]},"dest":"8CMjmTUmAULZ25XUmLx3Gd2HX8bKf5uwPvF6oxcv3qfz"},"metadata":{"from":"BdrsFY8EFRNDwQpdKb6f5k"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"8406be5a8bde1145f642a9955a80475c7256a9957b3a984c74ca6a8484f9c0f7"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"esatus_AG","blskey":"2L1Egvidsqj44HosrLCUXDgCLC9g9SwU6XD3wY6XiudgWajEM6zpxVzvyagB4SY8ZgWinAnBRjQv2zdsUHrfdFCfEm6csB9sgG2HryqcLgLUtskSrctSEd7AgYTAE3mcYdZmGAACTQgkskkcNkmFh61Rh9uADyP6xoDoT7PXPgmW5Wx","blskey_pop":"RGtbexx5BMxZhr7hnEaPqPGvEQANjZozqdZk5fDJBXRLcnQwnii4YYefpvSCpBLnsy6iTBQTFQpUfs2gvwM92Cyi1J2SivPJF1hKr7FmiZbWuoR7dRpdJGFYw7avU12T6yYFjiwLieJ5LsHVyosHVLj1XDrrHKBBsEUFRHJCp8GBhZ","client_ip":"194.110.133.202","client_port":"9702","node_ip":"194.110.133.202","node_port":"9701","services":["VALIDATOR"]},"dest":"BQ1YEL8oXssKxaF4ZVwZCCk3px4BxDjVim3pFG8Y5Gk6"},"metadata":{"from":"PbvRAYyQfi1GS8ioCNZXTp"},"type":"0"},"txnMetadata":{"seqNo":5,"txnId":"b26a8b1ec76a165330faf13f0b9565f8167211c37d83845226b7986dd0f624e3"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Commerzbank","blskey":"4Y5aB7ywZaw2Vqg63Mb2XiaQbaxCwUS1zSkczTzTS6dg8FCzqJdmvkU9PucY4A144VjoubvQLS6Cxvt9ZRcWr1NTdUX6f3LYqCyp1W5vFWn2s8pLSirimxGcZuhNp8XYRJGYsMjH781cgoriEB1R6GBxP6u7PamA7zybYqdng5GKcr7","blskey_pop":"RVYvd1Pf6wGyEXTsGQpHtV3M3vzCvXernbdLxa6ngBrkShDhR1TbbzrHsNsbkoZeimdtcJ2quNqux57k3RbyuggB86kCjH7asmkKp7w8Pa4Pzrzy3hyvTQ8qwNiZZmNb3CEXNWFctkXBeLeB6ip5z3TWoYDx7LWBC3b5KLtjbhgN6K","client_ip":"20.52.50.218","client_port":"9702","node_ip":"20.52.50.218","node_port":"9701","services":["VALIDATOR"]},"dest":"5coVfaQRWkjapQTxvJutUciSHLRwzk8yuR2CngufN78T"},"metadata":{"from":"9UMDJTxi6RHtGmYdUJr6iR"},"type":"0"},"txnMetadata":{"seqNo":6,"txnId":"f630e5a6719c639039ad66be6e3ed30b54ace3bb2ef5eaa84e7f3d5ee2b5e2a9"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"DeutscheBahn","blskey":"4nJSdxfx7MPdBH1ioFy4dk9hDgRV1D21JTKbWCkWAtvqwnMNfLgg8qrXhuNf5Ux8owBjMZPPQMiYsgwd7UbBTKmi8P4Hef6udXDq7p2EYGcM512JRRi8Z6igeijcRinnzLTM3Bso7xjJngaohMTZ2yNdRmB5WuyJKbZfr5qRbzEReMd","blskey_pop":"RZTAfkfry51g41qCVbYkKbsE9Nw16hx9k6Dnnun4vJbFLbtnyvuRfWHUVrjvfdbq48MRRRyY3miVGgxdugKMCSA9LxzmXJSCJG2Hxck2xsiFKUzznsqF6DWtGfo639WNz4Qk5xCvbDxhmmRYmZ3mJhUg8X3MEoCkQCsqAEi2oAQg9D","client_ip":"81.200.193.232","client_port":"9702","node_ip":"81.200.193.232","node_port":"9701","services":["VALIDATOR"]},"dest":"Ahb65rjbm94hNxM8jynTbWBMZyNmuuvtvsCAyntKSd3k"},"metadata":{"from":"JoCzEPXHeef6zYoXGx87aZ"},"type":"0"},"txnMetadata":{"seqNo":7,"txnId":"58b0a0cb860a20b41082d4d1b2419867156ca7aea3a0bdf2bdb318a270a6a367"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"siemens","blskey":"2DpsFyaZFWpHChf9pbHiNtZx9ze7RfzRhdnaAp3ZHZmLrZivyyMcnM7xhyKoc9LkZCAd1kuQHtfYNtAW4yY4DsoDQnXzKmWkLbRRwA8aNjxFK1uGP8npAXpVNTnWieNuQpj9EgQSDU5WJYR3SDgrV7sx51vwsa6ggkhAJNENyMRqZHY","blskey_pop":"RCx6QwyeaLpAHaD3AGgGZSNqyxQLsaAa9H2kKoQAMpQXkh9XZfsZtGbZTvPK2ZTXHMVvUyfCmWvaM8YxuJGRZ7QQTFAg9ECaqLPKexrp3P4huHMMs7nzj992ECVnuu66Dppbn6AEEF46NQXcXEDsEquHEHhuzD1JV9oAvcqaPGu2Hm","client_ip":"3.120.0.165","client_port":"9702","node_ip":"3.120.0.165","node_port":"9701","services":["VALIDATOR"]},"dest":"9XrquGpmLMXq5v5UuVLmPdZ5nPVDbdtMLSEWzE9Phm8H"},"metadata":{"from":"GewebF4Nq1LLRw5gwX1Dwv"},"type":"0"},"txnMetadata":{"seqNo":8,"txnId":"30e363d3e8c59f2c1319f8d73d48e3ad26db5e087951a4d7ab809c6f5401aea8"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"T-Labs","blskey":"qLCWHTGoARJxSM8yCj3zDnx4gUDaTwMoX2v9enhYTg1FRLN2Wcu9Dg91hrHKcrp1RiJMphAvRYbpXZLYN7AGiu3vCfiTfSuwM9qEWmhRe23KF67kQyRDNDVa8PZjPL7xhtsQRkJ5Gox3H6TmC8H2JFYBZ5JwcbieGfZMzMF5eDku1c","blskey_pop":"RPrk8q1pZAQhzEM8KhPTp9BKixe2PrJFJFhEV6M3uq8qDrUvpbZEWJUvm9iPnfh5cXrXTojNFo472XrVtbcxtnRwxz9Xrm2dfbARu5Gjxd5s9TGn145iKuzEEFrVt2usyf18E8XudD4ZwPovVVQgp9seKStnfYPKVTYTp726Ps5fQs","client_ip":"185.27.183.119","client_port":"9702","node_ip":"185.27.183.119","node_port":"9701","services":["VALIDATOR"]},"dest":"9k4Sjfxg2XqP2GcVAPHFuVJeY2bLbSUCPcVty6FRLzbY"},"metadata":{"from":"Ta94MpvKrQwTtiNMegQMvs"},"type":"0"},"txnMetadata":{"seqNo":9,"txnId":"1626d887a6323309883ab5fb8381f6176ab5e4ff4502389bb2978daee076cc39"},"ver":"1"}`, + BCOVRIN_TEST: `{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","blskey_pop":"RahHYiCvoNCtPTrVtP7nMC5eTYrsUA8WjXbdhNc8debh1agE9bGiJxWBXYNFbnJXoXhWFMvyqhqhRoq737YQemH5ik9oL7R4NTTCz2LEZhkgLJzB3QRQqJyBNyv7acbdHrAT8nQ9UkLbaVL9NBpnWXBTw4LEMePaSHEw66RzPNdAX1","client_ip":"138.197.138.255","client_port":9702,"node_ip":"138.197.138.255","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv"},"metadata":{"from":"Th7MpTaRZVRYnPiabds81Y"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Node2","blskey":"37rAPpXVoxzKhz7d9gkUe52XuXryuLXoM6P6LbWDB7LSbG62Lsb33sfG7zqS8TK1MXwuCHj1FKNzVpsnafmqLG1vXN88rt38mNFs9TENzm4QHdBzsvCuoBnPH7rpYYDo9DZNJePaDvRvqJKByCabubJz3XXKbEeshzpz4Ma5QYpJqjk","blskey_pop":"Qr658mWZ2YC8JXGXwMDQTzuZCWF7NK9EwxphGmcBvCh6ybUuLxbG65nsX4JvD4SPNtkJ2w9ug1yLTj6fgmuDg41TgECXjLCij3RMsV8CwewBVgVN67wsA45DFWvqvLtu4rjNnE9JbdFTc1Z4WCPA3Xan44K1HoHAq9EVeaRYs8zoF5","client_ip":"138.197.138.255","client_port":9704,"node_ip":"138.197.138.255","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb"},"metadata":{"from":"EbP4aYNeTHL6q385GuVpRV"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Node3","blskey":"3WFpdbg7C5cnLYZwFZevJqhubkFALBfCBBok15GdrKMUhUjGsk3jV6QKj6MZgEubF7oqCafxNdkm7eswgA4sdKTRc82tLGzZBd6vNqU8dupzup6uYUf32KTHTPQbuUM8Yk4QFXjEf2Usu2TJcNkdgpyeUSX42u5LqdDDpNSWUK5deC5","blskey_pop":"QwDeb2CkNSx6r8QC8vGQK3GRv7Yndn84TGNijX8YXHPiagXajyfTjoR87rXUu4G4QLk2cF8NNyqWiYMus1623dELWwx57rLCFqGh7N4ZRbGDRP4fnVcaKg1BcUxQ866Ven4gw8y4N56S5HzxXNBZtLYmhGHvDtk6PFkFwCvxYrNYjh","client_ip":"138.197.138.255","client_port":9706,"node_ip":"138.197.138.255","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya"},"metadata":{"from":"4cU41vWW82ArfxJxHkzXPG"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Node4","blskey":"2zN3bHM1m4rLz54MJHYSwvqzPchYp8jkHswveCLAEJVcX6Mm1wHQD1SkPYMzUDTZvWvhuE6VNAkK3KxVeEmsanSmvjVkReDeBEMxeDaayjcZjFGPydyey1qxBHmTvAnBKoPydvuTAqx5f7YNNRAdeLmUi99gERUU7TD8KfAa6MpQ9bw","blskey_pop":"RPLagxaR5xdimFzwmzYnz4ZhWtYQEj8iR5ZU53T2gitPCyCHQneUn2Huc4oeLd2B2HzkGnjAff4hWTJT6C7qHYB1Mv2wU5iHHGFWkhnTX9WsEAbunJCV2qcaXScKj4tTfvdDKfLiVuU2av6hbsMztirRze7LvYBkRHV3tGwyCptsrP","client_ip":"138.197.138.255","client_port":9708,"node_ip":"138.197.138.255","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA"},"metadata":{"from":"TWwCRQRZ2ZHMJFn9TzLp7W"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008"},"ver":"1"}`, + GREEN_LIGHT: `{"reqSignature":{},"txn":{"data":{"data":{"alias":"Node1","blskey":"4N8aUNHSgjQVgkpm8nhNEfDf6txHznoYREg9kirmJrkivgL4oSEimFF6nsQ6M41QvhM2Z33nves5vfSn9n1UwNFJBYtWVnHYMATn76vLuL3zU88KyeAYcHfsih3He6UHcXDxcaecHVz6jhCYz1P2UZn2bDVruL5wXpehgBfBaLKm3Ba","blskey_pop":"RahHYiCvoNCtPTrVtP7nMC5eTYrsUA8WjXbdhNc8debh1agE9bGiJxWBXYNFbnJXoXhWFMvyqhqhRoq737YQemH5ik9oL7R4NTTCz2LEZhkgLJzB3QRQqJyBNyv7acbdHrAT8nQ9UkLbaVL9NBpnWXBTw4LEMePaSHEw66RzPNdAX1","client_ip":"138.197.161.221","client_port":9702,"node_ip":"138.197.161.221","node_port":9701,"services":["VALIDATOR"]},"dest":"Gw6pDLhcBcoQesN72qfotTgFa7cbuqZpkX3Xo6pLhPhv"},"metadata":{"from":"Th7MpTaRZVRYnPiabds81Y"},"type":"0"},"txnMetadata":{"seqNo":1,"txnId":"fea82e10e894419fe2bea7d96296a6d46f50f93f9eeda954ec461b2ed2950b62"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Node2","blskey":"37rAPpXVoxzKhz7d9gkUe52XuXryuLXoM6P6LbWDB7LSbG62Lsb33sfG7zqS8TK1MXwuCHj1FKNzVpsnafmqLG1vXN88rt38mNFs9TENzm4QHdBzsvCuoBnPH7rpYYDo9DZNJePaDvRvqJKByCabubJz3XXKbEeshzpz4Ma5QYpJqjk","blskey_pop":"Qr658mWZ2YC8JXGXwMDQTzuZCWF7NK9EwxphGmcBvCh6ybUuLxbG65nsX4JvD4SPNtkJ2w9ug1yLTj6fgmuDg41TgECXjLCij3RMsV8CwewBVgVN67wsA45DFWvqvLtu4rjNnE9JbdFTc1Z4WCPA3Xan44K1HoHAq9EVeaRYs8zoF5","client_ip":"138.197.161.221","client_port":9704,"node_ip":"138.197.161.221","node_port":9703,"services":["VALIDATOR"]},"dest":"8ECVSk179mjsjKRLWiQtssMLgp6EPhWXtaYyStWPSGAb"},"metadata":{"from":"EbP4aYNeTHL6q385GuVpRV"},"type":"0"},"txnMetadata":{"seqNo":2,"txnId":"1ac8aece2a18ced660fef8694b61aac3af08ba875ce3026a160acbc3a3af35fc"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Node3","blskey":"3WFpdbg7C5cnLYZwFZevJqhubkFALBfCBBok15GdrKMUhUjGsk3jV6QKj6MZgEubF7oqCafxNdkm7eswgA4sdKTRc82tLGzZBd6vNqU8dupzup6uYUf32KTHTPQbuUM8Yk4QFXjEf2Usu2TJcNkdgpyeUSX42u5LqdDDpNSWUK5deC5","blskey_pop":"QwDeb2CkNSx6r8QC8vGQK3GRv7Yndn84TGNijX8YXHPiagXajyfTjoR87rXUu4G4QLk2cF8NNyqWiYMus1623dELWwx57rLCFqGh7N4ZRbGDRP4fnVcaKg1BcUxQ866Ven4gw8y4N56S5HzxXNBZtLYmhGHvDtk6PFkFwCvxYrNYjh","client_ip":"138.197.161.221","client_port":9706,"node_ip":"138.197.161.221","node_port":9705,"services":["VALIDATOR"]},"dest":"DKVxG2fXXTU8yT5N7hGEbXB3dfdAnYv1JczDUHpmDxya"},"metadata":{"from":"4cU41vWW82ArfxJxHkzXPG"},"type":"0"},"txnMetadata":{"seqNo":3,"txnId":"7e9f355dffa78ed24668f0e0e369fd8c224076571c51e2ea8be5f26479edebe4"},"ver":"1"} + {"reqSignature":{},"txn":{"data":{"data":{"alias":"Node4","blskey":"2zN3bHM1m4rLz54MJHYSwvqzPchYp8jkHswveCLAEJVcX6Mm1wHQD1SkPYMzUDTZvWvhuE6VNAkK3KxVeEmsanSmvjVkReDeBEMxeDaayjcZjFGPydyey1qxBHmTvAnBKoPydvuTAqx5f7YNNRAdeLmUi99gERUU7TD8KfAa6MpQ9bw","blskey_pop":"RPLagxaR5xdimFzwmzYnz4ZhWtYQEj8iR5ZU53T2gitPCyCHQneUn2Huc4oeLd2B2HzkGnjAff4hWTJT6C7qHYB1Mv2wU5iHHGFWkhnTX9WsEAbunJCV2qcaXScKj4tTfvdDKfLiVuU2av6hbsMztirRze7LvYBkRHV3tGwyCptsrP","client_ip":"138.197.161.221","client_port":9708,"node_ip":"138.197.161.221","node_port":9707,"services":["VALIDATOR"]},"dest":"4PS3EDQ3dW1tci1Bp6543CfuuebjFrg36kLAUcskGfaA"},"metadata":{"from":"TWwCRQRZ2ZHMJFn9TzLp7W"},"type":"0"},"txnMetadata":{"seqNo":4,"txnId":"aa5e817d7cc626170eca175822029339a444eb0ee8f0bd20d3b0b76e566fb008"},"ver":"1"}`, +}; + +const { idUnionKey } = config().agent; +export const NYM_URL = { + ID_UNION: `https://endorser.idunion.org/api/dids?apiKey=${idUnionKey}`, + BCOVRIN_TEST: 'http://test.bcovrin.vonx.io/register', + GREEN_LIGHT: 'http://greenlight.bcovrin.vonx.io/register', +}; + +export type LedgerIds = keyof typeof LEDGER_GENESIS; + +export const ledgerNamespaces = { + ID_UNION: 'idunion', + BCOVRIN_TEST: 'sovrin:test', + GREEN_LIGHT: 'sovrin', +}; + +export type LedgerInfo = { + id: string; + indyNamespace: string; + genesisTransactions?: string; + genesisPath?: any; + isProduction: boolean; +}; + +export default { + LEDGER_GENESIS, +}; diff --git a/apps/ssi-abstraction/src/agent/agentUtils/listener.spec.ts b/apps/ssi-abstraction/src/agent/agentUtils/listener.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..bb8e99ed1a6e6dd58d054cf9eb7679c6815fbf28 --- /dev/null +++ b/apps/ssi-abstraction/src/agent/agentUtils/listener.spec.ts @@ -0,0 +1,38 @@ +/* eslint-disable */ + +import { subscribe } from './listener'; + +describe('listener', () => { + it('should subscribe agent to available events', async () => { + const agent = { + events: { + on: (eventName: string, cb: () => void) => {}, + }, + }; + + const natsClient = { + publish: () => {}, + }; + const spyPublish = jest.spyOn(natsClient, 'publish'); + + let lastCb = null; + + const spy = jest + .spyOn(agent.events, 'on') + .mockImplementation((eventName: string, cb: () => void) => { + lastCb = cb; + }); + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + subscribe(agent, natsClient); + expect(spy).toHaveBeenCalled(); + expect(spy).toHaveBeenCalledTimes(7); + spy.mockRestore(); + + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + lastCb({ payload: 'payload' }); + expect(spyPublish).toHaveBeenCalled(); + expect(spyPublish).toHaveBeenCalledTimes(1); + }); +}); diff --git a/apps/ssi-abstraction/src/agent/agentUtils/listener.ts b/apps/ssi-abstraction/src/agent/agentUtils/listener.ts new file mode 100644 index 0000000000000000000000000000000000000000..27ee2a349555e21b96a29524f560b10089e1cd0c --- /dev/null +++ b/apps/ssi-abstraction/src/agent/agentUtils/listener.ts @@ -0,0 +1,28 @@ +import { Agent } from '@aries-framework/core'; +import logger from '@src/globalUtils/logger'; +import { NatsClientService } from '@src/client/nats.client'; +import { listenerConfig } from './listenerConfig'; + +/** + * Subscribes to events on nats + * + * @param agent - the agent that has been initialized on startup + * @param natsClient - the client that specifies how events are published + */ +export const subscribe = async ( + agent: Agent, + natsClient: NatsClientService, +) => { + for (let i = 0; i < listenerConfig.length; i += 1) { + agent.events.on(listenerConfig[i], async ({ payload }: any) => { + logger.info( + `${listenerConfig[i]} called. Payload: ${JSON.stringify(payload)}`, + ); + natsClient.publish(`${listenerConfig[i]}`, payload); + }); + } +}; + +export default { + subscribe, +}; diff --git a/apps/ssi-abstraction/src/agent/agentUtils/listenerConfig.ts b/apps/ssi-abstraction/src/agent/agentUtils/listenerConfig.ts new file mode 100644 index 0000000000000000000000000000000000000000..02c5bc86539f5ce2f9098491d76dc4132fcc8370 --- /dev/null +++ b/apps/ssi-abstraction/src/agent/agentUtils/listenerConfig.ts @@ -0,0 +1,22 @@ +import { + BasicMessageEventTypes, + ConnectionEventTypes, + CredentialEventTypes, + ProofEventTypes, + RoutingEventTypes, + TransportEventTypes, +} from '@aries-framework/core'; + +export const listenerConfig = [ + BasicMessageEventTypes.BasicMessageStateChanged, + ConnectionEventTypes.ConnectionStateChanged, + CredentialEventTypes.CredentialStateChanged, + ProofEventTypes.ProofStateChanged, + RoutingEventTypes.MediationStateChanged, + RoutingEventTypes.RecipientKeylistUpdated, + TransportEventTypes.OutboundWebSocketClosedEvent, +]; + +export default { + listenerConfig, +}; diff --git a/apps/ssi-abstraction/src/agent/module.ts b/apps/ssi-abstraction/src/agent/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..0c78e7379dd656a4d421e7c5fda4c36f3dccbad9 --- /dev/null +++ b/apps/ssi-abstraction/src/agent/module.ts @@ -0,0 +1,180 @@ +import { Inject, Module } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import logger from '@src/globalUtils/logger'; +import { Agent, HttpOutboundTransport } from '@aries-framework/core'; +import { + LedgerIds, + LedgerInfo, + ledgerNamespaces, + LEDGER_GENESIS, + NYM_URL, +} from '@src/agent/agentUtils/ledgerConfig'; +import { agentDependencies, HttpInboundTransport } from '@aries-framework/node'; +import { subscribe } from '@src/agent/agentUtils/listener'; +import { NatsClientService } from '@src/client/nats.client'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import config from '@config/config'; +import axios from 'axios'; +import LedgerRegistationBody from '@src/didComm/entities/LedgerRegistrationBody'; +import { logAxiosError } from './agentUtils/helperFunctions'; + +export const AGENT = 'agent'; + +const agentFactory = { + provide: AGENT, + useFactory: async ( + configService: ConfigService, + natsClient: NatsClientService, + ) => { + logger.info('Agent initializing...'); + + const { + name, + walletId, + walletKey, + ledgerIds, + host, + peerPort, + path, + publicDidSeed, + autoAcceptConnection, + autoAcceptCredential, + basicUser, + basicPass, + } = configService.get('agent'); + + const endpoints = [`${host}${peerPort}${path}`]; + + if (!ledgerIds || ledgerIds.length < 1 || ledgerIds[0] === '') { + throw new Error( + 'Agent could not start, please provide a ledger environment variable.', + ); + } + + const indyLedgers: LedgerInfo[] = ledgerIds.map((id: LedgerIds) => { + const ledgerId: LedgerIds = id; + + if (!LEDGER_GENESIS?.[ledgerId]) { + throw new Error( + `No pool transaction genesis provided for ledger ${ledgerId}`, + ); + } + + const ledger: LedgerInfo = { + id: `${ledgerId}_Genesis`, + indyNamespace: `${ledgerNamespaces[ledgerId]}`, + genesisTransactions: LEDGER_GENESIS?.[ledgerId], + isProduction: false, + }; + + return ledger; + }); + + const agentConfig = { + label: name, + walletConfig: { + id: walletId, + key: walletKey, + }, + indyLedgers, + publicDidSeed, + endpoints, + autoAcceptConnections: autoAcceptConnection, + autoAcceptCredentials: autoAcceptCredential, + }; + + const agent = new Agent(agentConfig, agentDependencies); + + const httpInbound = new HttpInboundTransport({ + port: Number(peerPort.replace(':', '')), + }); + + agent.registerInboundTransport(httpInbound); + + agent.registerOutboundTransport(new HttpOutboundTransport()); + + await agent.initialize(); + await subscribe(agent, natsClient); + + if (agent.isInitialized) { + ledgerIds.map(async (id: LedgerIds) => { + let body: LedgerRegistationBody = { + role: 'ENDORSER', + alias: name, + did: agent.publicDid?.did, + verkey: agent.publicDid?.verkey, + }; + + if (id === 'ID_UNION') { + body = { + did: agent.publicDid?.did, + verkey: agent.publicDid?.verkey, + }; + } + + if (id === 'ID_UNION' && basicPass && basicPass) { + await axios + .post(NYM_URL[id], body, { + auth: { + username: basicUser, + password: basicPass, + }, + }) + .then((res: any) => { + if (res.data) { + logger.info('Agent DID registered.'); + } + }) + .catch((err: any) => { + // if did is already registered on IdUnion it will catch 500, but it's ok + logAxiosError(err); + }); + } else { + await axios + .post(NYM_URL[id], body) + .then((res: any) => { + if (res.data) { + logger.info('Agent DID registered.'); + } + }) + .catch((err: any) => { + // if did is already registered on IdUnion it will catch 500, but it's ok + logAxiosError(err); + }); + } + }); + } + + logger.info('Agent initialized'); + + return agent; + }, + inject: [ConfigService, NatsClientService], +}; + +@Module({ + imports: [ + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + ], + controllers: [], + providers: [agentFactory, NatsClientService], + exports: [AGENT], +}) +export class AgentModule { + constructor(@Inject(AGENT) private agent: Agent) {} + + async onModuleDestroy() { + await this.agent.shutdown(); + } +} + +export default AgentModule; diff --git a/apps/ssi-abstraction/src/app.module.ts b/apps/ssi-abstraction/src/app.module.ts new file mode 100644 index 0000000000000000000000000000000000000000..5c23be67d6325a75d0bdeb313753821417c46fa3 --- /dev/null +++ b/apps/ssi-abstraction/src/app.module.ts @@ -0,0 +1,37 @@ +import { APP_FILTER } from '@nestjs/core'; +import { Module, NestModule, MiddlewareConsumer } from '@nestjs/common'; +import { ConfigModule } from '@nestjs/config'; +import { TerminusModule } from '@nestjs/terminus'; +import config from '@config/config'; +import validationSchema from '@config/validation'; +import HealthController from '@src/health/health.controller'; +import ExceptionHandler from '@src/globalUtils/exception.handler'; +import DidCommModule from '@didComm/module'; +import { AgentMid } from './middleware/agentMid.middleware'; + +@Module({ + imports: [ + TerminusModule, + ConfigModule.forRoot({ + isGlobal: true, + load: [config], + validationSchema, + }), + DidCommModule, + ], + controllers: [HealthController], + providers: [ + { + provide: APP_FILTER, + useClass: ExceptionHandler, + }, + ], +}) +export class AppModule implements NestModule { + // eslint-disable-next-line + configure(consumer: MiddlewareConsumer) { + consumer.apply(AgentMid).forRoutes('agent', '*/agent'); + } +} + +export default AppModule; diff --git a/apps/ssi-abstraction/src/client/nats.client.ts b/apps/ssi-abstraction/src/client/nats.client.ts new file mode 100644 index 0000000000000000000000000000000000000000..5ba22876627064325cbb5edfba01c0e81564b286 --- /dev/null +++ b/apps/ssi-abstraction/src/client/nats.client.ts @@ -0,0 +1,29 @@ +import { Inject, Injectable } from '@nestjs/common'; +import { ClientProxy } from '@nestjs/microservices'; +import { NATSServices } from '@common/constants'; +import logger from '@globalUtils/logger'; + +@Injectable() +export class NatsClientService { + constructor(@Inject(NATSServices.SERVICE_NAME) private client: ClientProxy) {} + + /** + * Publishes events on nats + * Generates the event as an object with 'endpoint' key + * that specifies the ServiceName/eventName. + * + * @param eventName - the event name + * @param data - the data to be passed as payload of the event + */ + publish(eventName: string, data: any) { + logger.info( + `Publish nats event: ${NATSServices.SERVICE_NAME}/${eventName}`, + ); + const event = { + endpoint: `${NATSServices.SERVICE_NAME}/${eventName}`, + }; + this.client.emit(event, data); + } +} + +export default { NatsClientService }; diff --git a/apps/ssi-abstraction/src/common/constants.ts b/apps/ssi-abstraction/src/common/constants.ts new file mode 100644 index 0000000000000000000000000000000000000000..75991ce1ec30351a41dbde128bc2cec199e1803d --- /dev/null +++ b/apps/ssi-abstraction/src/common/constants.ts @@ -0,0 +1,7 @@ +export enum NATSServices { + SERVICE_NAME = 'SSI_ABSTRACTION_SERVICE', +} + +export default { + NATSServices, +}; diff --git a/apps/ssi-abstraction/src/common/response.ts b/apps/ssi-abstraction/src/common/response.ts new file mode 100644 index 0000000000000000000000000000000000000000..0bbcc92e4d925953b397eef308a732f34e36c7ef --- /dev/null +++ b/apps/ssi-abstraction/src/common/response.ts @@ -0,0 +1,6 @@ +export interface ResponseType { + statusCode: number; + message: string; + data?: any; + error?: any; +} diff --git a/apps/ssi-abstraction/src/didComm/controller/controller.spec.ts b/apps/ssi-abstraction/src/didComm/controller/controller.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..389e62c39e1c85192f9f3abb602aacc9a139fda1 --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/controller/controller.spec.ts @@ -0,0 +1,846 @@ +/* eslint-disable */ + +import { HttpStatus } from '@nestjs/common'; +import DidCommController from './controller'; +import { Agent } from '@aries-framework/core'; + +describe('DidCommController', () => { + let didCommController: DidCommController; + let agent: Agent; + // const connection = new ConnectionDto(); + beforeEach(async () => { + agent = { + connections: { + createConnection: () => {}, + getAll: () => {}, + }, + } as Agent; + + didCommController = new DidCommController(agent); + }); + it('should be defined', () => { + expect(didCommController).toBeDefined(); + }); + + it('should call agent.connections.getAll', async () => { + const getAllSpy = jest.spyOn(agent.connections, 'getAll'); + + const res: any = await didCommController.generic( + { property: 'connections', method: 'getAll' }, + {}, + ); + expect(getAllSpy).toHaveBeenCalled(); + expect(res.statusCode).toBe(HttpStatus.OK); + getAllSpy.mockRestore(); + }); + + it('should call agent.connections.createConnection', async () => { + const getAllSpy = jest + .spyOn(agent.connections, 'createConnection') + // eslint-disable-next-line @typescript-eslint/ban-ts-comment + // @ts-ignore + .mockImplementation(() => ({ + invitation: { + toUrl: () => 'abcd', + }, + })); + + const res: any = await didCommController.generic( + { property: 'connections', method: 'createConnection' }, + { + subMethod: { + name: 'invitation.toUrl', + subMethodData: [ + { + domain: 'http://localhost:4000', + }, + ], + }, + data: [], + }, + ); + expect(getAllSpy).toHaveBeenCalled(); + expect(res.statusCode).toBe(HttpStatus.OK); + expect(res.data).toBe('abcd'); + getAllSpy.mockRestore(); + }); + + // describe('Get all connections', () => { + // it('should return an array of connection', async () => { + // const param = {}; + // const query = { + // pageSize: '0', + // page: '0', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // }; + // const serviceResult: any = [ + // 1, + // { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: true, + // }, + // ]; + // + // const result: any = { + // count: 1, + // records: { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: true, + // }, + // }; + // + // const response = httpMocks.createResponse(); + // jest + // .spyOn(connectionService, 'findConnections') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.getConnection( + // param, + // query, + // response, + // ); + // // eslint-disable-next-line no-underscore-dangle + // const resData = res._getData(); + // expect(res.statusCode).toBe(HttpStatus.OK); + // expect(JSON.parse(resData).data).toStrictEqual(result); + // }); + // + // it('If Not provided required parameter response should be bad request', async () => { + // const param = {}; + // const query = { + // pageSize: '0', + // page: '0', + // }; + // const serviceResult: any = [ + // 1, + // { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: true, + // }, + // ]; + // + // const response = httpMocks.createResponse(); + // jest + // .spyOn(connectionService, 'findConnections') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.getConnection( + // param, + // query, + // response, + // ); + // // eslint-disable-next-line no-underscore-dangle + // const resData = res._getData(); + // expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + // expect(JSON.parse(resData).message).toStrictEqual( + // 'Participant ID/ connection ID / participant DID must be provided', + // ); + // }); + // + // it('Get connection against connection id', async () => { + // const param = { + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // }; + // const query = {}; + // const serviceResult: any = { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: true, + // }; + // + // const result: any = { + // statusCode: 200, + // message: 'Connections fetch successfully', + // data: { + // records: { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: true, + // }, + // }, + // }; + // + // const response = httpMocks.createResponse(); + // jest + // .spyOn(connectionService, 'findConnections') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.getConnection( + // param, + // query, + // response, + // ); + // // eslint-disable-next-line no-underscore-dangle + // const resData = res._getData(); + // expect(res.statusCode).toBe(HttpStatus.OK); + // expect(JSON.parse(resData)).toStrictEqual(result); + // }); + // + // it('Not fount if data is not present against connection id ', async () => { + // const param = { + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // }; + // const query = {}; + // const serviceResult: any = { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: false, + // }; + // + // const result: any = { + // statusCode: HttpStatus.NOT_FOUND, + // message: 'No Data found', + // }; + // + // const response = httpMocks.createResponse(); + // jest + // .spyOn(connectionService, 'findConnections') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.getConnection( + // param, + // query, + // response, + // ); + // // eslint-disable-next-line no-underscore-dangle + // const resData = res._getData(); + // expect(res.statusCode).toBe(HttpStatus.NOT_FOUND); + // expect(JSON.parse(resData)).toStrictEqual(result); + // }); + // + // it('should return an array of connection with status filter', async () => { + // const param = {}; + // const query = { + // pageSize: '0', + // page: '0', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // status: 'trusted,complete', + // }; + // const serviceResult: any = [ + // 1, + // { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: true, + // }, + // ]; + // + // const result: any = { + // count: 1, + // records: { + // id: '1a7f0b09-b20e-4971-b9b1-7adde7256bbc', + // connectionId: '7b821264-2ae3-4459-b45f-19fa975d91f7', + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // status: 'trusted', + // participantDid: 'SU1SHqQiDcc6gDvqH8wwYF', + // theirDid: 'Ax9xMqE89F9LStfGnTpDzg', + // theirLabel: 'sagar@getnada.com', + // createdDate: '2022-04-18T11:03:58.099Z', + // updatedDate: '2022-04-18T11:05:10.004Z', + // isActive: true, + // }, + // }; + // + // const response = httpMocks.createResponse(); + // jest + // .spyOn(connectionService, 'findConnections') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.getConnection( + // param, + // query, + // response, + // ); + // // eslint-disable-next-line no-underscore-dangle + // const resData = res._getData(); + // expect(res.statusCode).toBe(HttpStatus.OK); + // expect(JSON.parse(resData).data).toStrictEqual(result); + // }); + // }); + // + // describe('Connection webhook calls', () => { + // it('Create connection webhook call', async () => { + // const webHook: ConnectionStateDto = { + // _tags: {}, + // metadata: {}, + // id: '7edc871d-9fa3-4f30-8763-59c80bf346f5', + // createdAt: '2022-04-21T10:52:27.151Z', + // did: 'DD8Aue5tuohjBaCLM9GMU7', + // didDoc: { + // '@context': 'https://w3id.org/did/v1', + // publicKey: [ + // [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#1', + // controller: 'C1buxAXWiisjFpVVyUGM5D', + // type: 'Ed25519VerificationKey2018', + // publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + // }, + // ], + // ], + // service: [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + // serviceEndpoint: 'http://localhost:4011', + // type: 'IndyAgent', + // priority: 0, + // recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + // routingKeys: [], + // }, + // ], + // authentication: [[Object]], + // id: 'DD8Aue5tuohjBaCLM9GMU7', + // }, + // theirDid: '', + // theirLabel: '', + // verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + // state: 'invited', + // role: 'inviter', + // alias: 'member', + // invitation: { + // '@type': 'https://didcomm.org/connections/1.0/invitation', + // '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + // label: 'State_University', + // recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + // serviceEndpoint: 'http://localhost:4017', + // routingKeys: [], + // }, + // multiUseInvitation: false, + // }; + // const serviceResult: any = {}; + // jest + // .spyOn(connectionService, 'createConnections') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.createConnection({ + // body: webHook, + // }); + // + // expect(res.statusCode).toBe(HttpStatus.CREATED); + // // expect(JSON.parse(resData).data).toStrictEqual(result); + // }); + // + // it('Create connection webhook call', async () => { + // const webHook: ConnectionStateDto = { + // _tags: {}, + // metadata: {}, + // id: '7edc871d-9fa3-4f30-8763-59c80bf346f5', + // createdAt: '2022-04-21T10:52:27.151Z', + // did: 'DD8Aue5tuohjBaCLM9GMU7', + // didDoc: { + // '@context': 'https://w3id.org/did/v1', + // publicKey: [ + // [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#1', + // controller: 'C1buxAXWiisjFpVVyUGM5D', + // type: 'Ed25519VerificationKey2018', + // publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + // }, + // ], + // ], + // service: [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + // serviceEndpoint: 'http://localhost:4011', + // type: 'IndyAgent', + // priority: 0, + // recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + // routingKeys: [], + // }, + // ], + // authentication: [[Object]], + // id: 'DD8Aue5tuohjBaCLM9GMU7', + // }, + // theirDid: '', + // theirLabel: '', + // verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + // state: 'invited', + // role: 'inviter', + // alias: 'member', + // invitation: { + // '@type': 'https://didcomm.org/connections/1.0/invitation', + // '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + // label: 'State_University', + // recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + // serviceEndpoint: 'http://localhost:4017', + // routingKeys: [], + // }, + // multiUseInvitation: false, + // }; + // const serviceResult: any = {}; + // jest + // .spyOn(connectionService, 'createConnections') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.createConnection({ + // body: webHook, + // }); + // + // expect(res.statusCode).toBe(HttpStatus.CREATED); + // // expect(JSON.parse(resData).data).toStrictEqual(result); + // }); + // + // it('Update connection webhook call -> member flow', async () => { + // const webHook: ConnectionStateDto = { + // _tags: {}, + // metadata: {}, + // id: '72534911-9be0-4e3f-8539-2a8a09e4e409', + // createdAt: '2022-04-21T10:52:27.151Z', + // did: 'DD8Aue5tuohjBaCLM9GMU7', + // didDoc: { + // '@context': 'https://w3id.org/did/v1', + // publicKey: [ + // [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#1', + // controller: 'C1buxAXWiisjFpVVyUGM5D', + // type: 'Ed25519VerificationKey2018', + // publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + // }, + // ], + // ], + // service: [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + // serviceEndpoint: 'http://localhost:4011', + // type: 'IndyAgent', + // priority: 0, + // recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + // routingKeys: [], + // }, + // ], + // authentication: [[Object]], + // id: 'DD8Aue5tuohjBaCLM9GMU7', + // }, + // theirDid: '', + // theirLabel: '', + // verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + // state: 'complete', + // role: 'inviter', + // alias: 'member', + // invitation: { + // '@type': 'https://didcomm.org/connections/1.0/invitation', + // '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + // label: 'State_University', + // recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + // serviceEndpoint: 'http://localhost:4017', + // routingKeys: [], + // }, + // multiUseInvitation: false, + // }; + // + // const restConnection: any = { + // id: '29701e41-60e8-4fca-8504-ea3bcefa6486', + // connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', + // participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + // status: 'trusted', + // participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', + // theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', + // theirLabel: 'Attest12', + // createdDate: '2022-04-15T11:30:04.660Z', + // updatedDate: '2022-04-15T11:36:58.560Z', + // isActive: true, + // }; + // const serviceResult: any = {}; + // jest + // .spyOn(connectionService, 'updateStatusByConnectionId') + // .mockResolvedValueOnce(serviceResult); + // + // jest + // .spyOn(connectionService, 'getConnectionByID') + // .mockResolvedValueOnce(restConnection); + // const res: any = await didCommController.createConnection({ + // body: webHook, + // }); + // + // expect(res.statusCode).toBe(HttpStatus.OK); + // // expect(JSON.parse(resData).data).toStrictEqual(result); + // }); + // + // it('Update connection webhook call -> subscriber flow', async () => { + // const webHook: ConnectionStateDto = { + // _tags: {}, + // metadata: {}, + // id: '72534911-9be0-4e3f-8539-2a8a09e4e409', + // createdAt: '2022-04-21T10:52:27.151Z', + // did: 'DD8Aue5tuohjBaCLM9GMU7', + // didDoc: { + // '@context': 'https://w3id.org/did/v1', + // publicKey: [ + // [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#1', + // controller: 'C1buxAXWiisjFpVVyUGM5D', + // type: 'Ed25519VerificationKey2018', + // publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + // }, + // ], + // ], + // service: [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + // serviceEndpoint: 'http://localhost:4011', + // type: 'IndyAgent', + // priority: 0, + // recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + // routingKeys: [], + // }, + // ], + // authentication: [[Object]], + // id: 'DD8Aue5tuohjBaCLM9GMU7', + // }, + // theirDid: '', + // theirLabel: '', + // verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + // state: 'complete', + // role: 'inviter', + // alias: 'subscriber', + // invitation: { + // '@type': 'https://didcomm.org/connections/1.0/invitation', + // '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + // label: 'State_University', + // recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + // serviceEndpoint: 'http://localhost:4017', + // routingKeys: [], + // }, + // multiUseInvitation: false, + // }; + // + // const restConnection: any = { + // id: '29701e41-60e8-4fca-8504-ea3bcefa6486', + // connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', + // participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + // status: 'trusted', + // participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', + // theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', + // theirLabel: 'Attest12', + // createdDate: '2022-04-15T11:30:04.660Z', + // updatedDate: '2022-04-15T11:36:58.560Z', + // isActive: true, + // }; + // const serviceResult: any = {}; + // jest + // .spyOn(connectionService, 'updateStatusByConnectionId') + // .mockResolvedValueOnce(serviceResult); + // + // jest + // .spyOn(connectionService, 'getConnectionByID') + // .mockResolvedValueOnce(restConnection); + // const res: any = await didCommController.createConnection({ + // body: webHook, + // }); + // + // expect(res.statusCode).toBe(HttpStatus.OK); + // // expect(JSON.parse(resData).data).toStrictEqual(result); + // }); + // + // it('Connection webhook call with wrong role', async () => { + // const webHook: ConnectionStateDto = { + // _tags: {}, + // metadata: {}, + // id: '72534911-9be0-4e3f-8539-2a8a09e4e409', + // createdAt: '2022-04-21T10:52:27.151Z', + // did: 'DD8Aue5tuohjBaCLM9GMU7', + // didDoc: { + // '@context': 'https://w3id.org/did/v1', + // publicKey: [ + // [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#1', + // controller: 'C1buxAXWiisjFpVVyUGM5D', + // type: 'Ed25519VerificationKey2018', + // publicKeyBase58: '714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y', + // }, + // ], + // ], + // service: [ + // { + // id: 'C1buxAXWiisjFpVVyUGM5D#IndyAgentService', + // serviceEndpoint: 'http://localhost:4011', + // type: 'IndyAgent', + // priority: 0, + // recipientKeys: ['714U4GdQqyeqhCANgJmTrGqUPg4QTGuEhJcEGYAvEH1Y'], + // routingKeys: [], + // }, + // ], + // authentication: [[Object]], + // id: 'DD8Aue5tuohjBaCLM9GMU7', + // }, + // theirDid: '', + // theirLabel: '', + // verkey: '7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX', + // state: 'complete', + // role: 'invitee', + // alias: 'subscriber', + // invitation: { + // '@type': 'https://didcomm.org/connections/1.0/invitation', + // '@id': '8578735f-eef8-4748-b791-ba2f8f7002e2', + // label: 'State_University', + // recipientKeys: ['7exBgFhenY8hqBwBF56D8sp6akLstqXxS1MUUCpDErvX'], + // serviceEndpoint: 'http://localhost:4017', + // routingKeys: [], + // }, + // multiUseInvitation: false, + // }; + // + // const restConnection: any = { + // id: '29701e41-60e8-4fca-8504-ea3bcefa6486', + // connectionId: '72534911-9be0-4e3f-8539-2a8a09e4e409', + // participantId: '662dc769-a4de-4c95-934c-f6dab8cf432c', + // status: 'trusted', + // participantDid: 'PyLDJRKzmKmJShyEtjC4AQ', + // theirDid: 'UgR1Rrp6p3VJGwLFZnBdwB', + // theirLabel: 'Attest12', + // createdDate: '2022-04-15T11:30:04.660Z', + // updatedDate: '2022-04-15T11:36:58.560Z', + // isActive: true, + // }; + // const serviceResult: any = {}; + // jest + // .spyOn(connectionService, 'updateStatusByConnectionId') + // .mockResolvedValueOnce(serviceResult); + // + // jest + // .spyOn(connectionService, 'getConnectionByID') + // .mockResolvedValueOnce(restConnection); + // const res: any = await didCommController.createConnection({ + // body: webHook, + // }); + // + // expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST); + // // expect(JSON.parse(resData).data).toStrictEqual(result); + // }); + // }); + // + // describe('Get invitation URL ', () => { + // it('Get Member invitation URL', async () => { + // const body = { + // autoAcceptConnection: true, + // }; + // const query = { + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // process: 'member', + // }; + // const serviceResult: any = { + // invitationUrl: + // 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', + // invitation: { + // '@type': + // 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', + // '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + // label: 'technica_corp', + // recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + // serviceEndpoint: 'http://localhost:4005', + // routingKeys: [], + // }, + // connection: { + // _tags: {}, + // metadata: {}, + // id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', + // createdAt: '2022-04-21T10:52:18.161Z', + // did: '9nYw7CSdHPqXf6ayfA7Wo2', + // didDoc: { + // '@context': 'https://w3id.org/did/v1', + // publicKey: [ + // { + // id: '9nYw7CSdHPqXf6ayfA7Wo2#1', + // controller: '9nYw7CSdHPqXf6ayfA7Wo2', + // type: 'Ed25519VerificationKey2018', + // publicKeyBase58: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + // }, + // ], + // service: [ + // { + // id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', + // serviceEndpoint: 'http://localhost:4005', + // type: 'IndyAgent', + // priority: 0, + // recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + // routingKeys: [], + // }, + // ], + // authentication: [ + // { + // publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', + // type: 'Ed25519SignatureAuthentication2018', + // }, + // ], + // id: '9nYw7CSdHPqXf6ayfA7Wo2', + // }, + // verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + // state: 'invited', + // role: 'inviter', + // alias: 'member', + // autoAcceptConnection: true, + // invitation: { + // '@type': 'https://didcomm.org/connections/1.0/invitation', + // '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + // label: 'technica_corp', + // recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + // serviceEndpoint: 'http://localhost:4005', + // routingKeys: [], + // }, + // multiUseInvitation: false, + // }, + // }; + // + // const result: any = { + // statusCode: 200, + // message: 'Connection created successfully', + // data: { + // invitationUrl: + // 'http://localhost:4005?c_i=eyJAdHlwZSI6ImRpZDpzb3Y6QnpDYnNOWWhNcmpIaXFaRFRVQVNIZztzcGVjL2Nvbm5lY3Rpb25zLzEuMC9pbnZpdGF0aW9uIiwiQGlkIjoiYWMzYjE0NjktY2Y0Ni00M2ZjLWE4M2EtZGNmZjJjMDA1YjRlIiwibGFiZWwiOiJ0ZWNobmljYV9jb3JwIiwicmVjaXBpZW50S2V5cyI6WyI1bml1NWZmZmVnYkZlS2F3bU5OblRBTEpzaHB1cXpjRm5CUGpBOFFWU2dtWCJdLCJzZXJ2aWNlRW5kcG9pbnQiOiJodHRwOi8vMy4xMTEuNzcuMzg6NDAwNSIsInJvdXRpbmdLZXlzIjpbXX0', + // invitation: { + // '@type': + // 'did:sov:BzCbsNYhMrjHiqZDTUASHg;spec/connections/1.0/invitation', + // '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + // label: 'technica_corp', + // recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + // serviceEndpoint: 'http://localhost:4005', + // routingKeys: [], + // }, + // connection: { + // _tags: {}, + // metadata: {}, + // id: 'c1d73d9e-6988-4c84-9ebc-068c265d2fb6', + // createdAt: '2022-04-21T10:52:18.161Z', + // did: '9nYw7CSdHPqXf6ayfA7Wo2', + // didDoc: { + // '@context': 'https://w3id.org/did/v1', + // publicKey: [ + // { + // id: '9nYw7CSdHPqXf6ayfA7Wo2#1', + // controller: '9nYw7CSdHPqXf6ayfA7Wo2', + // type: 'Ed25519VerificationKey2018', + // publicKeyBase58: + // '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + // }, + // ], + // service: [ + // { + // id: '9nYw7CSdHPqXf6ayfA7Wo2#In7780cd24-af13-423e-b1ff-ae944ab6fd71dyAgentService', + // serviceEndpoint: 'http://localhost:4005', + // type: 'IndyAgent', + // priority: 0, + // recipientKeys: [ + // '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + // ], + // routingKeys: [], + // }, + // ], + // authentication: [ + // { + // publicKey: '9nYw7CSdHPqXf6ayfA7Wo2#1', + // type: 'Ed25519SignatureAuthentication2018', + // }, + // ], + // id: '9nYw7CSdHPqXf6ayfA7Wo2', + // }, + // verkey: '5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX', + // state: 'invited', + // role: 'inviter', + // alias: 'member', + // autoAcceptConnection: true, + // invitation: { + // '@type': 'https://didcomm.org/connections/1.0/invitation', + // '@id': 'ac3b1469-cf46-43fc-a83a-dcff2c005b4e', + // label: 'technica_corp', + // recipientKeys: ['5niu5fffegbFeKawmNNnTALJshpuqzcFnBPjA8QVSgmX'], + // serviceEndpoint: 'http://localhost:4005', + // routingKeys: [], + // }, + // multiUseInvitation: false, + // }, + // }, + // }; + // + // const response = httpMocks.createResponse(); + // jest + // .spyOn(connectionService, 'createInvitationURL') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.createConnectionInvitation( + // body, + // query, + // response, + // ); + // // eslint-disable-next-line no-underscore-dangle + // const resData = res._getData(); + // expect(res.statusCode).toBe(HttpStatus.OK); + // expect(resData).toStrictEqual(result); + // }); + // + // it('Get Member invitation URL-> Agent is not present', async () => { + // const body = { + // autoAcceptConnection: true, + // }; + // const query = { + // participantId: '7780cd24-af13-423e-b1ff-ae944ab6fd71', + // process: 'member', + // }; + // const serviceResult: any = undefined; + // + // const result: any = { + // statusCode: HttpStatus.NOT_FOUND, + // message: 'Agent Data not found.', + // }; + // + // const response = httpMocks.createResponse(); + // jest + // .spyOn(connectionService, 'createInvitationURL') + // .mockResolvedValueOnce(serviceResult); + // const res: any = await didCommController.createConnectionInvitation( + // body, + // query, + // response, + // ); + // // eslint-disable-next-line no-underscore-dangle + // const resData = res._getData(); + // expect(res.statusCode).toBe(HttpStatus.NOT_FOUND); + // expect(resData).toStrictEqual(result); + // }); + // }); +}); diff --git a/apps/ssi-abstraction/src/didComm/controller/controller.ts b/apps/ssi-abstraction/src/didComm/controller/controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..241099ddda22e4dce81fa776f51c9db9788ac03a --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/controller/controller.ts @@ -0,0 +1,109 @@ +import { + All, + Body, + Controller, + Get, + HttpStatus, + Inject, + Param, +} from '@nestjs/common'; +import { ResponseType } from '@common/response'; +import { AGENT } from '@agent/module'; +import logger from '@src/globalUtils/logger'; +import { Agent } from '@aries-framework/core'; +import { GenericBody } from '@didComm/entities/GenericBody'; +import { GenericParams } from '../utils/whitelist'; +import { objectPathLoop } from '../didCommUtils'; +import { prepareInputData, prepareOutputData } from '../utils/prepareData'; + +@Controller('agent') +export class DidCommController { + constructor(@Inject(AGENT) private readonly agent: Agent) {} + + /** + * A backup endpoint that dynamically interfaces with the agent, in case the extension + * lags behind the AFJ or malfunctions + * + * expected body: + * { + * "subMethod": { + * "name": "asdas.asdasd", + * "subMethodData": [ + * "argument1", + * "argument2" + * ] + * }, + * "data": [ + * "argumentN", + * "argumentN+1" + * ] + * } + * @param params -one of the allowed properties/method to be called on the agent + * @param body -arguments of the method and/or calling a method on the returned object + */ + @All('/:property/:method') + async generic(@Param() params: GenericParams, @Body() body: GenericBody) { + logger.info( + `Received request ${params.property}/${params.method}, body: ${body}`, + ); + const { property, method } = params; + + const prop: any = this.agent[property]; + + let response = await prop[method].apply(prop, prepareInputData(body.data)); // eslint-disable-line + + if (body.subMethod && body.subMethod.name) { + const path = body.subMethod.name.split('.'); + let result: any; + + if (Array.isArray(response)) { + const results = []; + for (let j = 0; j < response.length; j += 1) { + const prevContext = response[j]; + const context = response[j][path[0]]; + + result = objectPathLoop(response, path, context, prevContext, body); + + results.push(prepareOutputData(result)); + } + + return { + statusCode: HttpStatus.OK, + message: `${property}.${method}(${JSON.stringify(body.data)}) => ${ + body.subMethod.name + }`, + data: results, + } as ResponseType; + } + + const prevContext = response; + const context = response[path[0]]; + + response = objectPathLoop(response, path, context, prevContext, body); + } + + return { + statusCode: HttpStatus.OK, + message: `${property}.${method}(${JSON.stringify(body.data)}) => ${ + body.subMethod && body.subMethod.name && body.subMethod.name + }`, + data: prepareOutputData(response), + } as ResponseType; + } + + @Get('info') + async getWalletInfo() { + const { publicDid } = this.agent.wallet; + if (!publicDid) { + throw new Error('Wallet is not initialized'); + } + + return { + statusCode: HttpStatus.OK, + message: 'Success', + data: publicDid, + } as ResponseType; + } +} + +export default DidCommController; diff --git a/apps/ssi-abstraction/src/didComm/didCommUtils.ts b/apps/ssi-abstraction/src/didComm/didCommUtils.ts new file mode 100644 index 0000000000000000000000000000000000000000..663e4c62000aa0f226773e7166834fd6f8bb8a63 --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/didCommUtils.ts @@ -0,0 +1,45 @@ +import GenericBody from '@didComm/entities/GenericBody'; +import { prepareInputData } from './utils/prepareData'; + +/** + * + * Handles the subMethods of responses + * + * @param response - generic response from the agent + * @param path - the location of the subMethod within the response object ('.' notation) + * @param context - subMethod on which the body.subMethod.subMethodData is applied on + * @param prevContext - the object which contains the subMethod + * @param body - arguments of the property method + subMethod name and arguments + * @returns - the result from the applied subMethod arguments on the subMethod + */ +export function objectPathLoop( + response: any, + path: string[], + context: any, + prevContext: any, + body: GenericBody, +) { + let responseRe = response; + let contextRe = context; + let prevContextRe = prevContext; + + for (let i = 1; i < path.length; i += 1) { + prevContextRe = contextRe; + contextRe = contextRe[path[i]]; + } + + responseRe = contextRe; + + if (typeof contextRe === 'function' && body.subMethod) { + responseRe = contextRe.apply( + prevContextRe, + prepareInputData(body.subMethod.subMethodData), + ); // eslint-disable-line + } + + return responseRe; +} + +export default { + objectPathLoop, +}; diff --git a/apps/ssi-abstraction/src/didComm/entities/GenericBody.spec.ts b/apps/ssi-abstraction/src/didComm/entities/GenericBody.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..b083bf8248b73a3ecb70b88e92f840ab665e3fbd --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/entities/GenericBody.spec.ts @@ -0,0 +1,5 @@ +describe('check GenericBody', () => { + it('should return module', async () => { + jest.requireActual('./GenericBody'); + }); +}); diff --git a/apps/ssi-abstraction/src/didComm/entities/GenericBody.ts b/apps/ssi-abstraction/src/didComm/entities/GenericBody.ts new file mode 100644 index 0000000000000000000000000000000000000000..66c7aad6a74b8288779df19d12dfe085b21fe623 --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/entities/GenericBody.ts @@ -0,0 +1,9 @@ +export interface GenericBody { + subMethod?: { + name?: string; + subMethodData?: any[] | any; + }; + data?: any[] | any; +} + +export default GenericBody; diff --git a/apps/ssi-abstraction/src/didComm/entities/LedgerRegistrationBody.ts b/apps/ssi-abstraction/src/didComm/entities/LedgerRegistrationBody.ts new file mode 100644 index 0000000000000000000000000000000000000000..bb0d833ccadb2e7e37665eb274206eaa3c57dd8a --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/entities/LedgerRegistrationBody.ts @@ -0,0 +1,8 @@ +export interface LedgerRegistationBody { + role?: string; + alias?: string; + did?: string; + verkey?: string; +} + +export default LedgerRegistationBody; diff --git a/apps/ssi-abstraction/src/didComm/module.ts b/apps/ssi-abstraction/src/didComm/module.ts new file mode 100644 index 0000000000000000000000000000000000000000..b285420e541e8bb30ab962f3d9213ca429f2299a --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/module.ts @@ -0,0 +1,26 @@ +import { Module } from '@nestjs/common'; +import { ClientsModule, Transport } from '@nestjs/microservices'; +import { HttpModule } from '@nestjs/axios'; +import DidCommController from '@didComm/controller/controller'; +import AgentModule from '@agent/module'; +import { NATSServices } from '@common/constants'; +import config from '@config/config'; + +@Module({ + imports: [ + HttpModule, + ClientsModule.register([ + { + name: NATSServices.SERVICE_NAME, + transport: Transport.NATS, + options: { + servers: [config().nats.url as string], + }, + }, + ]), + AgentModule, + ], + controllers: [DidCommController], + providers: [], +}) +export default class DidCommModule {} diff --git a/apps/ssi-abstraction/src/didComm/tests/didCommUtils.spec.ts b/apps/ssi-abstraction/src/didComm/tests/didCommUtils.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..7b45f3d2c64f6a0648f9c362016c17f449c03599 --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/tests/didCommUtils.spec.ts @@ -0,0 +1,55 @@ +import { objectPathLoop } from '../didCommUtils'; + +describe('loop through objects with methods', () => { + let response: any; + let path: string[]; + let context: any; + let prevContext: any; + let body: { + subMethod?: { + name?: string; + subMethodData?: any[] | any; + }; + data?: any[] | any; + }; + + it('should return modified response from executing a method of original response', async () => { + const expected = { + method1Res: 'method1Res', + }; + + response = { + key: 'asd', + method1: () => expected, + }; + path = ['method1']; + context = response[path[0]]; + prevContext = response; + body = { + subMethod: { + name: 'method1', + }, + }; + + const actual = objectPathLoop(response, path, context, prevContext, body); + + expect(actual).toEqual(expected); + }); + + it('should return property when no method is specified', async () => { + response = { + key: 'asd', + key2: 'asd123', + }; + path = ['key2']; + context = response[path[0]]; + prevContext = response; + body = {}; + + const expected = 'asd123'; + + const actual = objectPathLoop(response, path, context, prevContext, body); + + expect(actual).toEqual(expected); + }); +}); diff --git a/apps/ssi-abstraction/src/didComm/utils/prepareData.ts b/apps/ssi-abstraction/src/didComm/utils/prepareData.ts new file mode 100644 index 0000000000000000000000000000000000000000..b72ef873fdf310cfb94d1214a6423de6a3a8f369 --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/utils/prepareData.ts @@ -0,0 +1,41 @@ +interface ConvertableObject { + type: 'buffer'; + dataBase64: string; +} + +const ensureExists = (data: any) => { + if (!data) throw new Error('Please provide dataBase64 for type: buffer'); +}; + +const processObject = (obj: ConvertableObject | any): any => { + if (obj.type === 'buffer') { + ensureExists(obj.dataBase64); + const buffer = Buffer.from(obj.dataBase64, 'base64'); + return buffer; + } + return obj; +}; + +export const prepareInputData = (data: any[]): any[] => { + if (!data) return []; + const result: any[] = []; + data.forEach((p) => { + if (typeof p === 'object') { + result.push(processObject(p)); + return; + } + result.push(p); + }); + return result; +}; + +export const prepareOutputData = (data: any): any => { + if (data instanceof Buffer) { + return (data as Buffer).toString('base64'); + } + return data; +}; + +export default { + prepareInputData, +}; diff --git a/apps/ssi-abstraction/src/didComm/utils/tests/prepareData.spec.ts b/apps/ssi-abstraction/src/didComm/utils/tests/prepareData.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..02fc6b968a2ad43429005d44d3626c711ef9ccf0 --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/utils/tests/prepareData.spec.ts @@ -0,0 +1,72 @@ +import { prepareInputData, prepareOutputData } from '../prepareData'; + +describe('prepare data for signing', () => { + let data: any | any[]; + + it('should return buffer from base64', async () => { + data = [ + { + type: 'buffer', + dataBase64: 'YXNkMTIz', + }, + { + type: 'buffer', + dataBase64: 'cXdlcnR5', + }, + ]; + + const actual = prepareInputData(data); + + const expected = [ + Buffer.from(data[0].dataBase64), + Buffer.from(data[1].dataBase64), + ]; + + expect(expected[0]).toEqual(actual[0]); + + expect(actual.length).toEqual(2); + }); + + it('should return empty array', async () => { + data = undefined; + const actual = prepareInputData(data); + expect(actual.length).toEqual(0); + }); + + it('should return unchanged', async () => { + data = [1]; + const expected = prepareInputData(data); + expect(expected[0]).toEqual(data[0]); + }); + + it('should return original object', async () => { + data = [ + { + type: 'notbuffer', + dataBase64: 'YXNkMTIz', + }, + ]; + const expected = prepareInputData(data); + expect(expected[0]).toEqual(data[0]); + }); +}); + +describe('prepare data for returning', () => { + let data: any; + + it('should return base64 from buffer', async () => { + data = Buffer.from('asd123'); + + const expected = prepareOutputData(data); + + expect(expected).toEqual('YXNkMTIz'); + }); + + it('should return unchanged', async () => { + data = 'asd123'; + + const expected = prepareOutputData(data); + + expect(expected).toEqual('asd123'); + }); +}); diff --git a/apps/ssi-abstraction/src/didComm/utils/tests/whitelist.spec.ts b/apps/ssi-abstraction/src/didComm/utils/tests/whitelist.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..d2253758b3c54872fc6d3c699356ab7c7ca391b5 --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/utils/tests/whitelist.spec.ts @@ -0,0 +1,53 @@ +import { checkAll } from '../whitelist'; + +describe('Whitelist', () => { + let property: string; + let method: string; + let body: { + subMethod?: { + name?: string; + subMethodData?: any[] | any; + }; + data?: any[] | any; + }; + + it('should return all error messages and success false', async () => { + property = 'propertyName'; + method = 'methodName'; + body = { + subMethod: { + name: 'toUrl', + subMethodData: [ + { + domain: 'localhost', + }, + ], + }, + data: [], + }; + + const res = checkAll(property, method, body); + + expect(res).toEqual({ + success: false, + messages: [ + '"property" either does not exist or is not allowed.', + '"method" either does not exist or is not allowed.', + '"subMethod name" either does not exist or is not allowed.', + ], + }); + }); + + it('should return no messages and success true', async () => { + property = 'connections'; + method = 'createConnection'; + body = {}; + + const res = checkAll(property, method, body); + + expect(res).toEqual({ + success: true, + messages: [], + }); + }); +}); diff --git a/apps/ssi-abstraction/src/didComm/utils/whitelist.ts b/apps/ssi-abstraction/src/didComm/utils/whitelist.ts new file mode 100644 index 0000000000000000000000000000000000000000..8560d5f18dc27a64e55879a1076195e210a1b91e --- /dev/null +++ b/apps/ssi-abstraction/src/didComm/utils/whitelist.ts @@ -0,0 +1,240 @@ +import GenericBody from '@didComm/entities/GenericBody'; +// import { SuccessResponse } from 'nats/lib/nats-base-client/types'; + +export interface CheckType { + success: boolean; + messages: string[]; +} + +export interface GenericParams { + property: // | 'connections' + // 'proofs' + // | 'basicMessages' + // | 'ledger' + // | 'credentials' + // | 'mediationRecipient' + // | 'mediator' + // | 'discovery' + 'wallet'; + + method: // | 'createConnection' + // | 'receiveInvitation' + // | 'receiveInvitationFromUrl' + // | 'acceptInvitation' + // | 'acceptRequest' + // | 'acceptResponse' + // | 'returnWhenIsConnected' + // | 'getAll' + // | 'getById' + // | 'findById' + // | 'deleteById' + // | 'findByVerkey' + // | 'findByTheirKey' + // | 'findByInvitationKey' + // | 'getByThreadId' + // | 'proposeProof' + // | 'acceptProposal' + // | 'requestProof' + // | 'createOutOfBandRequest' + // | 'acceptRequest' + | 'declineRequest' + // | 'acceptPresentation' + // | 'getRequestedCredentialsForProofRequest' + // | 'autoSelectCredentialsForProofRequest' + // | 'sendProblemReport' + // | 'sendMessage' + // | 'findAllByQuery' + // | 'registerPublicDid' + // | 'getPublicDid' + // | 'registerSchema' + // | 'getSchema' + // | 'registerCredentialDefinition' + // | 'getCredentialDefinition' + // | 'proposeCredential' + // | 'acceptProposal' + // | 'negotiateProposal' + // | 'offerCredential' + // | 'createOutOfBandOffer' + // | 'acceptOffer' + // | 'declineOffer' + // | 'negotiateOffer' + // | 'acceptCredential' + // | 'initiateMessagePickup' + // | 'pickupMessages' + // | 'setDefaultMediator' + // | 'notifyKeylistUpdate' + // | 'findDefaultMediatorConnection' + // | 'discoverMediation' + // | 'requestMediation' + // | 'findByConnectionId' + // | 'getMediators' + // | 'findDefaultMediator' + // | 'requestAndAwaitGrant' + // | 'provision' + // | 'queueMessage' + // | 'grantRequestedMediation' + // | 'queryFeatures' + // | 'initialize' + // | 'create' + // | 'open' + // | 'close' + // | 'delete' + // | 'initPublicDid' + // | 'createDid' + // | 'pack' + // | 'unpack' + | 'sign' + | 'verify'; + // | 'generateNonce'; +} + +export const propertiesList = [ + // 'connections', + 'proofs', + // 'basicMessages', + // 'ledger', + // 'credentials', + // 'mediationRecipient', + // 'mediator', + // 'discovery', + 'wallet', +]; + +export const methodsList = [ + // 'createConnection', + // 'receiveInvitation', + // 'receiveInvitationFromUrl', + // 'acceptInvitation', + // 'acceptRequest', + // 'acceptResponse', + // 'returnWhenIsConnected', + // 'getAll', + // 'getById', + // 'findById', + // 'deleteById', + // 'findByVerkey', + // 'findByTheirKey', + // 'findByInvitationKey', + // 'getByThreadId', + // 'proposeProof', + // 'acceptProposal', + // 'requestProof', + // 'createOutOfBandRequest', + // 'acceptRequest', + 'declineRequest', + // 'acceptPresentation', + // 'getRequestedCredentialsForProofRequest', + // 'autoSelectCredentialsForProofRequest', + // 'sendProblemReport', + // 'sendMessage', + // 'findAllByQuery', + // 'registerPublicDid', + // 'getPublicDid', + // 'registerSchema', + // 'getSchema', + // 'registerCredentialDefinition', + // 'getCredentialDefinition', + // 'proposeCredential', + // 'acceptProposal', + // 'negotiateProposal', + // 'offerCredential', + // 'createOutOfBandOffer', + // 'acceptOffer', + // 'declineOffer', + // 'negotiateOffer', + // 'acceptCredential', + // 'initiateMessagePickup', + // 'pickupMessages', + // 'setDefaultMediator', + // 'notifyKeylistUpdate', + // 'findDefaultMediatorConnection', + // 'discoverMediation', + // 'requestMediation', + // 'findByConnectionId', + // 'getMediators', + // 'findDefaultMediator', + // 'requestAndAwaitGrant', + // 'provision', + // 'queueMessage', + // 'grantRequestedMediation', + // 'queryFeatures', + // 'initialize', + // 'create', + // 'open', + // 'close', + // 'delete', + // 'initPublicDid', + // 'createDid', + // 'pack', + // 'unpack', + 'sign', + 'verify', + // 'generateNonce', +]; + +export const subMethodsList = [ + 'invitation', + 'invitation.toUrl', + 'invitation.fromUrl', + 'getTags', + 'myKey', + 'theirKey', + 'isReady', + 'assertReady', + 'assertState', + 'assertRole', + 'getCredentialInfo', + 'assertConnection', + // REVIEW: + // maybe we could allow some generic methods? + // i.e. 'toJSON', 'toString', etc. +]; + +/** + * + * Checks if the property, method or subMethod are allowed + * + * @param property - property of the agent + * @param method - method of the property + * @param body - arguments and subMethod name + arguments + * @returns {CheckType} -an object with the conditional message + */ +export const checkAll = ( + property: string, + method: string, + body: GenericBody, +): CheckType => { + const messages: string[] = []; + let success = true; + + if (property && propertiesList.indexOf(property) <= -1) { + success = false; + messages.push(`"${property}" either does not exist or is not allowed.`); + } + + if (method && methodsList.indexOf(method) <= -1) { + success = false; + messages.push(`"${method}" either does not exist or is not allowed.`); + } + + if ( + body.subMethod && + body.subMethod.name && + subMethodsList.indexOf(body.subMethod.name) <= -1 + ) { + success = false; + messages.push('"subMethod name" either does not exist or is not allowed.'); + } + + return { + success, + messages, + }; +}; + +export default { + propertiesList, + methodsList, + subMethodsList, + checkAll, +}; diff --git a/apps/ssi-abstraction/src/globalUtils/appConfig.spec.ts b/apps/ssi-abstraction/src/globalUtils/appConfig.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..13097b32f30081fc461198cd6715a51d4cc60bda --- /dev/null +++ b/apps/ssi-abstraction/src/globalUtils/appConfig.spec.ts @@ -0,0 +1,5 @@ +describe('check getConfig', () => { + it('should return appConfig module', async () => { + jest.requireActual('./appConfig'); + }); +}); diff --git a/apps/ssi-abstraction/src/globalUtils/appConfig.ts b/apps/ssi-abstraction/src/globalUtils/appConfig.ts new file mode 100644 index 0000000000000000000000000000000000000000..7005ea6c17e5b90db1013ace914b82a4a366610b --- /dev/null +++ b/apps/ssi-abstraction/src/globalUtils/appConfig.ts @@ -0,0 +1,43 @@ +import { VersioningType, INestApplication } from '@nestjs/common'; +import { ConfigService } from '@nestjs/config'; +import { Transport, MicroserviceOptions } from '@nestjs/microservices'; +import logger from './logger'; + +/** + * Microservice and versioning configuration of the service + * + * @param app - Nest.js internal configuration object + * @param configService - Nest.js internal configuration object + */ +export default async function appConf( + app: INestApplication, + configService: ConfigService, +): Promise<void> { + try { + app.connectMicroservice<MicroserviceOptions>({ + transport: Transport.NATS, + options: { + servers: [configService.get('nats')?.url], + }, + }); + } catch (err) { + await new Promise((resolve) => { + setTimeout(() => { + resolve('Trying again to connect to nats.'); + }, 2000); + }); + logger.error(err); + logger.info('Retrying connection to NATS.'); + app.connectMicroservice<MicroserviceOptions>({ + transport: Transport.NATS, + options: { + servers: [configService.get('nats')?.url], + }, + }); + } + + app.enableVersioning({ + defaultVersion: ['1'], + type: VersioningType.URI, + }); +} diff --git a/apps/ssi-abstraction/src/globalUtils/exception.handler.ts b/apps/ssi-abstraction/src/globalUtils/exception.handler.ts new file mode 100644 index 0000000000000000000000000000000000000000..cee8e186c51adb418f0885b119fe8c1cc2f6bb0f --- /dev/null +++ b/apps/ssi-abstraction/src/globalUtils/exception.handler.ts @@ -0,0 +1,50 @@ +import { + ExceptionFilter, + Catch, + ArgumentsHost, + HttpException, + HttpStatus, +} from '@nestjs/common'; +import { HttpAdapterHost } from '@nestjs/core'; +import { ResponseType } from '@common/response'; + +@Catch() +export class ExceptionHandler implements ExceptionFilter { + constructor(private readonly httpAdapterHost: HttpAdapterHost) {} + + /** + * Custom exception handler + * + * @param exception - error + * @param host - the execution context for exceptions + */ + catch(exception: any, host: ArgumentsHost): void { + // In certain situations `httpAdapter` might not be available in the + // constructor method, thus we should resolve it here. + const { httpAdapter } = this.httpAdapterHost; + + const ctx = host.switchToHttp(); + const response = ctx.getResponse(); + + let statusCode = HttpStatus.INTERNAL_SERVER_ERROR; + let message = + exception.message.error || exception.message || 'Something went wrong!'; + + if (exception instanceof HttpException) { + const errorResponse: any = exception.getResponse(); + + statusCode = exception.getStatus(); + message = errorResponse.error || message; + } + + const responseBody: ResponseType = { + statusCode, + message, + error: exception.message, + }; + + httpAdapter.reply(response, responseBody, statusCode); + } +} + +export default ExceptionHandler; diff --git a/apps/ssi-abstraction/src/globalUtils/logger.spec.ts b/apps/ssi-abstraction/src/globalUtils/logger.spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..3247bad1b74884cb96ccd76ce9728dbe93cca092 --- /dev/null +++ b/apps/ssi-abstraction/src/globalUtils/logger.spec.ts @@ -0,0 +1,5 @@ +describe('check logger', () => { + it('should return module', async () => { + jest.requireActual('./logger'); + }); +}); diff --git a/apps/ssi-abstraction/src/globalUtils/logger.ts b/apps/ssi-abstraction/src/globalUtils/logger.ts new file mode 100644 index 0000000000000000000000000000000000000000..27a053c3826962fe8010be590465854d2988bca3 --- /dev/null +++ b/apps/ssi-abstraction/src/globalUtils/logger.ts @@ -0,0 +1,28 @@ +import { Logger } from 'winston'; +import ecsFormat from '@elastic/ecs-winston-format'; +// import { ElasticsearchTransport } from 'winston-elasticsearch'; +import winston = require('winston'); + +// const esTransportOpts = { +// clientOpts: { node: process.env.ECSURL }, +// }; +// +// const esTransport = new ElasticsearchTransport(esTransportOpts); +// +// esTransport.on('error', (error: any) => { +// console.error('Error in logger caught', error); +// }); + +const logger: Logger = winston.createLogger({ + format: ecsFormat({ convertReqRes: true }), + transports: [ + new winston.transports.Console(), + // esTransport, + ], +}); + +logger.on('error', (error) => { + console.error('Error in logger caught', error); +}); + +export default logger; diff --git a/apps/ssi-abstraction/src/globalUtils/swagger.ts b/apps/ssi-abstraction/src/globalUtils/swagger.ts new file mode 100644 index 0000000000000000000000000000000000000000..4adc4721814713af25d6e2a573817a2c68242eb3 --- /dev/null +++ b/apps/ssi-abstraction/src/globalUtils/swagger.ts @@ -0,0 +1,20 @@ +import { DocumentBuilder, SwaggerModule } from '@nestjs/swagger'; +import { INestApplication } from '@nestjs/common'; + +/** + * Setup for swagger endpoint documentation + * + * + * @param app - Nest.js internal config object + */ +export default function swaggerSetup(app: INestApplication): void { + const swaggerConfig = new DocumentBuilder() + .setTitle('Gaia-x SSI Abstraction service') + .setDescription('API documentation for GAIA-X SSI Abstraction service') + .setVersion('1.0') + .build(); + + const document = SwaggerModule.createDocument(app, swaggerConfig); + + SwaggerModule.setup('/swagger', app, document); +} diff --git a/apps/ssi-abstraction/src/health/health.controller.ts b/apps/ssi-abstraction/src/health/health.controller.ts new file mode 100644 index 0000000000000000000000000000000000000000..f0a2b9d177e4bac3da34d19a54ee13d7c205aab9 --- /dev/null +++ b/apps/ssi-abstraction/src/health/health.controller.ts @@ -0,0 +1,21 @@ +import { Controller, Get, HttpStatus } from '@nestjs/common'; +import { ResponseType } from '@common/response'; + +@Controller('health') +export class HealthController { + /** + * Check if app is running + * + * @returns - OK (200) if app is running + */ + // eslint-disable-next-line class-methods-use-this + @Get() + getHealth() { + return { + statusCode: HttpStatus.OK, + message: `${new Date()}`, + } as ResponseType; + } +} + +export default HealthController; diff --git a/apps/ssi-abstraction/src/main.ts b/apps/ssi-abstraction/src/main.ts new file mode 100644 index 0000000000000000000000000000000000000000..8ebe5c5d4c02d48a632d554a9efc29ae43b79a13 --- /dev/null +++ b/apps/ssi-abstraction/src/main.ts @@ -0,0 +1,33 @@ +import { NestFactory } from '@nestjs/core'; +import { ConfigService } from '@nestjs/config'; +import { startServer } from '@aries-framework/rest'; +import AppModule from '@src/app.module'; +import { AGENT } from '@agent/module'; +import logger from './globalUtils/logger'; +import swaggerSetup from './globalUtils/swagger'; +import appConf from './globalUtils/appConfig'; + +async function bootstrap() { + const app = await NestFactory.create(AppModule); + const agent = await app.resolve(AGENT); + const configService = app.get(ConfigService); + + appConf(app, configService); + + swaggerSetup(app); + + await app.startAllMicroservices(); + + const afjExtConfig = { + port: configService.get('afjExtPort') || 3001, + }; + await startServer(agent, afjExtConfig); + + logger.info( + `Listening AFJ ext on Port:${configService.get('afjExtPort')}` || 3001, + ); + await app.listen(configService.get('PORT') || 3000, () => { + logger.info(`Listening on Port:${configService.get('PORT')}` || 3000); + }); +} +bootstrap(); diff --git a/apps/ssi-abstraction/src/middleware/agentMid.middleware.ts b/apps/ssi-abstraction/src/middleware/agentMid.middleware.ts new file mode 100644 index 0000000000000000000000000000000000000000..c10d5f7aa5d94b0070bed3ded9e0c6ce3b13d7f9 --- /dev/null +++ b/apps/ssi-abstraction/src/middleware/agentMid.middleware.ts @@ -0,0 +1,43 @@ +import { Injectable, NestMiddleware, HttpStatus } from '@nestjs/common'; +import { Request, NextFunction, Response } from 'express'; +import { checkAll } from '../didComm/utils/whitelist'; +import { ResponseType } from '../common/response'; + +/** + * Middleware that checks validity of provided params and body + * to the requests. + */ +@Injectable() +export class AgentMid implements NestMiddleware { + // eslint-disable-next-line + use(req: Request, res: Response, next: NextFunction) { + const [, prop, method] = req.url.split('/'); + if (prop === 'info') { + next(); + return; + } + + const whiteListErrors = checkAll(prop, method, req.body); + if (whiteListErrors && !whiteListErrors.success) { + res.send({ + statusCode: HttpStatus.BAD_REQUEST, + error: whiteListErrors.messages, + } as ResponseType); + res.end(); + return; + } + + if (req.body.subMethod && !req.body.subMethod.name) { + res.send({ + statusCode: HttpStatus.BAD_REQUEST, + message: 'subMethod.name has to be specified', + } as ResponseType); + res.end(); + return; + } + + next(); + } +} + +export default { AgentMid }; diff --git a/apps/ssi-abstraction/start.sh b/apps/ssi-abstraction/start.sh new file mode 100644 index 0000000000000000000000000000000000000000..dc3bc1b36cfabdb4ed5834ef1b9dffd431c7d22e --- /dev/null +++ b/apps/ssi-abstraction/start.sh @@ -0,0 +1,3 @@ +#!/bin/bash + +node dist/src/main.js diff --git a/apps/ssi-abstraction/swagger.json b/apps/ssi-abstraction/swagger.json new file mode 100644 index 0000000000000000000000000000000000000000..929bc8cbc06b97546a5388a4e6f75aa8a0354ce0 --- /dev/null +++ b/apps/ssi-abstraction/swagger.json @@ -0,0 +1,4358 @@ +{ + "components": { + "schemas": { + "AttachmentData": { + "properties": { + "base64": { + "format": "base64", + "type": "string" + }, + "json": {}, + "links": { + "items": { + "type": "string" + }, + "type": "array" + }, + "jws": {}, + "sha256": { + "type": "string" + } + }, + "type": "object" + }, + "Attachment": { + "properties": { + "description": { + "type": "string" + }, + "filename": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "lastmodTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "byteCount": { + "type": "integer" + }, + "data": { + "$ref": "#/components/schemas/AttachmentData" + } + }, + "type": "object", + "required": [ + "data" + ] + }, + "Service": { + "properties": { + "id": { + "type": "string" + }, + "serviceEndpoint": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object", + "required": [ + "id", + "serviceEndpoint", + "type" + ] + }, + "DidCommService": { + "properties": { + "recipientKeys": { + "items": { + "type": "string" + }, + "type": "array", + "minItems": 1 + }, + "routingKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "accept": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "serviceEndpoint": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object", + "required": [ + "recipientKeys", + "id", + "serviceEndpoint", + "type" + ] + }, + "ServiceDecorator": { + "properties": { + "recipientKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "routingKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "serviceEndpoint": { + "type": "string" + } + }, + "type": "object", + "required": [ + "recipientKeys", + "serviceEndpoint" + ] + }, + "BaseMessage": { + "properties": { + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "ThreadDecorator": { + "properties": { + "threadId": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "parentThreadId": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "senderOrder": { + "type": "integer" + }, + "receivedOrders": {} + }, + "type": "object" + }, + "TimingDecorator": { + "properties": { + "inTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "outTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "staleTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "expiresTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "delayMilli": { + "type": "number" + }, + "waitUntilTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + } + }, + "type": "object" + }, + "TransportDecorator": { + "properties": { + "returnRoute": { + "enum": [ + "none", + "all", + "thread" + ], + "type": "string" + }, + "returnRouteThread": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + } + }, + "type": "object" + }, + "ThreadDecoratorExtension": { + "properties": { + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "L10nDecoratorExtension": { + "properties": { + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "TransportDecoratorExtension": { + "properties": { + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "TimingDecoratorExtension": { + "properties": { + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "AckDecoratorExtension": { + "properties": { + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "AttachmentDecoratorExtension": { + "properties": { + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "ServiceDecoratorExtension": { + "properties": { + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "type": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + } + }, + "type": "object", + "required": [ + "id", + "type" + ] + }, + "ProblemReportMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/notification/1.0/problem-report" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "problemItems": {}, + "whoRetries": { + "enum": [ + "YOU", + "ME", + "BOTH", + "NONE" + ], + "type": "string" + }, + "fixHint": {}, + "where": { + "enum": [ + "CLOUD", + "EDGE", + "WIRE", + "AGENCY" + ], + "type": "string" + }, + "impact": { + "enum": [ + "MESSAGE", + "THREAD", + "CONNECTION" + ], + "type": "string" + }, + "noticedTime": { + "type": "string" + }, + "trackingUri": { + "type": "string" + }, + "escalationUri": { + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "id" + ] + }, + "BatchMessageMessage": { + "properties": { + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "message": { + "type": "object" + } + }, + "type": "object", + "required": [ + "id", + "message" + ] + }, + "BatchMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/messagepickup/1.0/batch" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "messages": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "messages", + "id" + ] + }, + "BatchPickupMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/messagepickup/1.0/batch-pickup" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "batchSize": { + "type": "integer" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "batchSize", + "id" + ] + }, + "ForwardMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/routing/1.0/forward" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "to": { + "type": "string" + }, + "message": { + "type": "object" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "to", + "message", + "id" + ] + }, + "KeylistUpdate": { + "properties": { + "recipientKey": { + "type": "string" + }, + "action": { + "enum": [ + "add", + "remove" + ], + "type": "string" + } + }, + "type": "object", + "required": [ + "recipientKey", + "action" + ] + }, + "KeylistUpdateMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/coordinate-mediation/1.0/keylist-update" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "updates": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "updates", + "id" + ] + }, + "KeylistUpdated": { + "properties": { + "recipientKey": { + "type": "string" + }, + "action": { + "enum": [ + "add", + "remove" + ], + "type": "string" + }, + "result": { + "enum": [ + "client_error", + "server_error", + "no_change", + "success" + ], + "type": "string" + } + }, + "type": "object", + "required": [ + "recipientKey", + "action", + "result" + ] + }, + "KeylistUpdateResponseMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/coordinate-mediation/1.0/keylist-update-response" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "updated": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "updated", + "id" + ] + }, + "MediationGrantMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/coordinate-mediation/1.0/mediate-grant" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "routingKeys": { + "items": {}, + "type": "string", + "minLength": 1 + }, + "endpoint": { + "type": "string", + "minLength": 1 + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "routingKeys", + "endpoint", + "id" + ] + }, + "MediationDenyMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/coordinate-mediation/1.0/mediate-deny" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "id" + ] + }, + "MediationRequestMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/coordinate-mediation/1.0/mediate-request" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "sentTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "sentTime", + "id" + ] + }, + "PublicKey": { + "properties": { + "id": { + "type": "string" + }, + "controller": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object", + "required": [ + "id", + "controller", + "type" + ] + }, + "Ed25119Sig2018": { + "properties": { + "type": { + "type": "string", + "enum": [ + "Ed25519VerificationKey2018" + ] + }, + "value": { + "type": "string" + }, + "id": { + "type": "string" + }, + "controller": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "value", + "id", + "controller" + ] + }, + "EddsaSaSigSecp256k1": { + "properties": { + "type": { + "type": "string", + "enum": [ + "Secp256k1VerificationKey2018" + ] + }, + "value": { + "type": "string" + }, + "id": { + "type": "string" + }, + "controller": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "value", + "id", + "controller" + ] + }, + "RsaSig2018": { + "properties": { + "type": { + "type": "string", + "enum": [ + "RsaVerificationKey2018" + ] + }, + "value": { + "type": "string" + }, + "id": { + "type": "string" + }, + "controller": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "value", + "id", + "controller" + ] + }, + "EmbeddedAuthentication": { + "properties": { + "publicKey": { + "$ref": "#/components/schemas/PublicKey", + "minLength": 1, + "type": "string" + } + }, + "type": "object", + "required": [ + "publicKey" + ] + }, + "ReferencedAuthentication": { + "properties": { + "type": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type" + ] + }, + "IndyAgentService": { + "properties": { + "recipientKeys": { + "items": { + "type": "string" + }, + "type": "array", + "minItems": 1 + }, + "routingKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "id": { + "type": "string" + }, + "serviceEndpoint": { + "type": "string" + }, + "type": { + "type": "string" + } + }, + "type": "object", + "required": [ + "recipientKeys", + "id", + "serviceEndpoint", + "type" + ] + }, + "DidDoc": { + "properties": { + "context": { + "type": "string", + "enum": [ + "https://w3id.org/did/v1" + ] + }, + "id": { + "type": "string" + }, + "publicKey": { + "$ref": "#/components/schemas/Array", + "items": {}, + "type": "array" + }, + "service": { + "$ref": "#/components/schemas/Array", + "items": {}, + "type": "array" + }, + "authentication": { + "$ref": "#/components/schemas/Array", + "items": {}, + "type": "array" + } + }, + "type": "object", + "required": [ + "context", + "id", + "publicKey", + "service", + "authentication" + ] + }, + "Connection": { + "properties": { + "did": { + "type": "string" + }, + "didDoc": { + "$ref": "#/components/schemas/DidDoc" + } + }, + "type": "object", + "required": [ + "did" + ] + }, + "ConnectionInvitationMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/connections/1.0/invitation" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "label": { + "type": "string" + }, + "did": { + "type": "string" + }, + "recipientKeys": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "serviceEndpoint": { + "type": "string" + }, + "routingKeys": { + "items": { + "type": "string" + }, + "type": "array" + }, + "imageUrl": { + "format": "url", + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "label", + "id" + ] + }, + "ConnectionRequestMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/connections/1.0/request" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "label": { + "type": "string" + }, + "connection": { + "$ref": "#/components/schemas/Connection" + }, + "imageUrl": { + "format": "url", + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "label", + "connection", + "id" + ] + }, + "SignatureDecorator": { + "properties": { + "signatureType": { + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$", + "type": "string" + }, + "signatureData": { + "type": "string" + }, + "signer": { + "type": "string" + }, + "signature": { + "type": "string" + } + }, + "type": "object", + "required": [ + "signatureType", + "signatureData", + "signer", + "signature" + ] + }, + "ConnectionResponseMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/connections/1.0/response" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "connectionSig": { + "$ref": "#/components/schemas/SignatureDecorator" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "connectionSig", + "id" + ] + }, + "TrustPingMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/trust_ping/1.0/ping" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "responseRequested": { + "type": "boolean" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "responseRequested", + "id" + ] + }, + "TrustPingResponseMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/trust_ping/1.0/ping_response" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "id" + ] + }, + "ConnectionProblemReportMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/connection/1.0/problem-report" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + }, + "problemItems": {}, + "whoRetries": { + "enum": [ + "YOU", + "ME", + "BOTH", + "NONE" + ], + "type": "string" + }, + "fixHint": {}, + "where": { + "enum": [ + "CLOUD", + "EDGE", + "WIRE", + "AGENCY" + ], + "type": "string" + }, + "impact": { + "enum": [ + "MESSAGE", + "THREAD", + "CONNECTION" + ], + "type": "string" + }, + "noticedTime": { + "type": "string" + }, + "trackingUri": { + "type": "string" + }, + "escalationUri": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "id" + ] + }, + "AckMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/notification/1.0/ack" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "status": { + "enum": [ + "OK", + "FAIL", + "PENDING" + ], + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "status", + "id" + ] + }, + "BasicMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/basicmessage/1.0/message" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "sentTime": { + "oneOf": [ + { + "format": "date", + "type": "string" + }, + { + "format": "date-time", + "type": "string" + } + ] + }, + "content": { + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "sentTime", + "content", + "id" + ] + }, + "CredentialPreviewAttribute": { + "properties": { + "name": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object", + "required": [ + "name", + "value" + ] + }, + "CredentialPreview": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/issue-credential/1.0/credential-preview" + ] + }, + "attributes": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + } + }, + "type": "object", + "required": [ + "type", + "attributes" + ] + }, + "CredentialAckMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/issue-credential/1.0/ack" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + }, + "status": { + "enum": [ + "OK", + "FAIL", + "PENDING" + ], + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "id", + "status" + ] + }, + "RequestCredentialMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/issue-credential/1.0/request-credential" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "requestAttachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "requestAttachments", + "id" + ] + }, + "IssueCredentialMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/issue-credential/1.0/issue-credential" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "credentialAttachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "credentialAttachments", + "id" + ] + }, + "OfferCredentialMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/issue-credential/1.0/offer-credential" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "credentialPreview": { + "$ref": "#/components/schemas/CredentialPreview" + }, + "offerAttachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "credentialPreview", + "offerAttachments", + "id" + ] + }, + "ProposeCredentialMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/issue-credential/1.0/propose-credential" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "credentialProposal": { + "$ref": "#/components/schemas/CredentialPreview" + }, + "schemaIssuerDid": { + "type": "string" + }, + "schemaId": { + "type": "string" + }, + "schemaName": { + "type": "string" + }, + "schemaVersion": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "issuerDid": { + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "id" + ] + }, + "CredentialProblemReportMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/issue-credential/1.0/problem-report" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + }, + "problemItems": {}, + "whoRetries": { + "enum": [ + "YOU", + "ME", + "BOTH", + "NONE" + ], + "type": "string" + }, + "fixHint": {}, + "where": { + "enum": [ + "CLOUD", + "EDGE", + "WIRE", + "AGENCY" + ], + "type": "string" + }, + "impact": { + "enum": [ + "MESSAGE", + "THREAD", + "CONNECTION" + ], + "type": "string" + }, + "noticedTime": { + "type": "string" + }, + "trackingUri": { + "type": "string" + }, + "escalationUri": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "id" + ] + }, + "DiscloseProtocol": { + "properties": { + "protocolId": { + "type": "string" + }, + "roles": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "required": [ + "protocolId" + ] + }, + "DiscloseMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/discover-features/1.0/disclose" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "protocols": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "protocols", + "id" + ] + }, + "QueryMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/discover-features/1.0/query" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "query": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "query", + "id" + ] + }, + "PresentationPreviewAttribute": { + "properties": { + "credentialDefinitionId": { + "type": "string" + }, + "mimeType": { + "type": "string" + }, + "value": { + "type": "string" + }, + "referent": { + "type": "string" + } + }, + "type": "object" + }, + "PresentationPreviewPredicate": { + "properties": { + "name": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "predicate": { + "enum": [ + "<", + "<=", + ">", + ">=" + ], + "type": "string" + }, + "threshold": { + "type": "integer" + } + }, + "type": "object", + "required": [ + "name", + "credentialDefinitionId", + "predicate", + "threshold" + ] + }, + "PresentationPreview": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/present-proof/1.0/presentation-preview" + ] + }, + "attributes": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "predicates": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + } + }, + "type": "object", + "required": [ + "type", + "attributes", + "predicates" + ] + }, + "ProposePresentationMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/present-proof/1.0/propose-presentation" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "presentationProposal": { + "$ref": "#/components/schemas/PresentationPreview" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "presentationProposal", + "id" + ] + }, + "AttributeValue": { + "properties": { + "name": { + "type": "string" + }, + "value": { + "type": "string" + } + }, + "type": "object", + "required": [ + "name", + "value" + ] + }, + "AttributeFilter": { + "properties": { + "schemaId": { + "type": "string" + }, + "schemaIssuerDid": { + "type": "string" + }, + "schemaName": { + "type": "string" + }, + "schemaVersion": { + "type": "string" + }, + "issuerDid": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "attributeValue": { + "$ref": "#/components/schemas/AttributeValue" + } + }, + "type": "object" + }, + "ProofIdentifier": { + "properties": { + "schemaId": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "revocationRegistryId": { + "type": "string" + }, + "timestamp": { + "type": "number" + } + }, + "type": "object", + "required": [ + "schemaId", + "credentialDefinitionId" + ] + }, + "ProofAttribute": { + "properties": { + "subProofIndex": { + "type": "integer" + }, + "raw": { + "type": "string" + }, + "encoded": { + "type": "string" + } + }, + "type": "object", + "required": [ + "subProofIndex", + "raw", + "encoded" + ] + }, + "RequestedProof": { + "properties": { + "revealedAttributes": { + "items": { + "$ref": "#/components/schemas/Map" + }, + "type": "array" + }, + "selfAttestedAttributes": { + "items": { + "type": "string" + }, + "type": "array" + } + }, + "type": "object", + "required": [ + "revealedAttributes", + "selfAttestedAttributes" + ] + }, + "PartialProof": { + "properties": { + "identifiers": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "requestedProof": { + "$ref": "#/components/schemas/RequestedProof" + } + }, + "type": "object", + "required": [ + "identifiers", + "requestedProof" + ] + }, + "IndyCredentialInfo": { + "properties": { + "referent": { + "type": "string" + }, + "attributes": { + "items": { + "type": "string" + }, + "type": "array" + }, + "schemaId": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "revocationRegistryId": { + "type": "string" + }, + "credentialRevocationId": { + "type": "string" + } + }, + "type": "object", + "required": [ + "referent", + "attributes", + "schemaId", + "credentialDefinitionId" + ] + }, + "RevocationInterval": { + "properties": { + "from": { + "type": "integer" + }, + "to": { + "type": "integer" + } + }, + "type": "object" + }, + "Credential": { + "properties": { + "credentialInfo": { + "$ref": "#/components/schemas/IndyCredentialInfo" + }, + "interval": { + "$ref": "#/components/schemas/RevocationInterval" + } + }, + "type": "object", + "required": [ + "credentialInfo" + ] + }, + "ProofAttributeInfo": { + "properties": { + "name": { + "type": "string" + }, + "names": { + "items": { + "type": "string" + }, + "minItems": 1, + "type": "array" + }, + "nonRevoked": { + "$ref": "#/components/schemas/RevocationInterval" + }, + "restrictions": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + } + }, + "type": "object" + }, + "ProofPredicateInfo": { + "properties": { + "name": { + "type": "string" + }, + "predicateType": { + "enum": [ + "<", + "<=", + ">", + ">=" + ], + "type": "string" + }, + "predicateValue": { + "type": "integer" + }, + "nonRevoked": { + "$ref": "#/components/schemas/RevocationInterval" + }, + "restrictions": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + } + }, + "type": "object", + "required": [ + "name", + "predicateType", + "predicateValue" + ] + }, + "ProofRequest": { + "properties": { + "name": { + "type": "string" + }, + "version": { + "type": "string" + }, + "nonce": { + "type": "string" + }, + "requestedAttributes": { + "items": { + "$ref": "#/components/schemas/Map" + }, + "type": "array", + "$ref": "#/components/schemas/Map" + }, + "requestedPredicates": { + "items": { + "$ref": "#/components/schemas/Map" + }, + "type": "array", + "$ref": "#/components/schemas/Map" + }, + "nonRevoked": { + "$ref": "#/components/schemas/RevocationInterval" + }, + "ver": { + "type": "string", + "enum": [ + "1.0", + "2.0" + ] + } + }, + "type": "object", + "required": [ + "name", + "version", + "requestedAttributes", + "requestedPredicates" + ] + }, + "RequestedAttribute": { + "properties": { + "credentialId": { + "type": "string" + }, + "timestamp": { + "type": "integer" + }, + "revealed": { + "type": "boolean" + } + }, + "type": "object", + "required": [ + "credentialId", + "revealed" + ] + }, + "RequestedPredicate": { + "properties": { + "credentialId": { + "type": "string" + }, + "timestamp": { + "type": "integer" + } + }, + "type": "object", + "required": [ + "credentialId" + ] + }, + "RequestedCredentials": { + "properties": { + "requestedAttributes": { + "items": { + "$ref": "#/components/schemas/Object" + }, + "type": "array" + }, + "requestedPredicates": { + "items": { + "$ref": "#/components/schemas/Object" + }, + "type": "array" + } + }, + "type": "object", + "required": [ + "requestedAttributes", + "requestedPredicates" + ] + }, + "RequestPresentationMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/present-proof/1.0/request-presentation" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "requestPresentationAttachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "requestPresentationAttachments", + "id" + ] + }, + "PresentationMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/present-proof/1.0/presentation" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "comment": { + "type": "string" + }, + "presentationAttachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + } + }, + "type": "object", + "required": [ + "type", + "presentationAttachments", + "id" + ] + }, + "PresentationAckMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/present-proof/1.0/ack" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + }, + "status": { + "enum": [ + "OK", + "FAIL", + "PENDING" + ], + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "id", + "status" + ] + }, + "PresentationProblemReportMessage": { + "properties": { + "type": { + "type": "string", + "enum": [ + "https://didcomm.org/present-proof/1.0/problem-report" + ], + "pattern": "(.*?)([a-zA-Z0-9._-]+)\\/(\\d[^/]*)\\/([a-zA-Z0-9._-]+)$" + }, + "id": { + "pattern": "[-_./a-zA-Z0-9]{8,64}", + "type": "string" + }, + "thread": { + "$ref": "#/components/schemas/ThreadDecorator" + }, + "l10n": { + "$ref": "#/components/schemas/L10nDecorator" + }, + "transport": { + "$ref": "#/components/schemas/TransportDecorator" + }, + "timing": { + "$ref": "#/components/schemas/TimingDecorator" + }, + "pleaseAck": { + "$ref": "#/components/schemas/AckDecorator" + }, + "attachments": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array", + "$ref": "#/components/schemas/Array" + }, + "service": { + "$ref": "#/components/schemas/ServiceDecorator" + }, + "problemItems": {}, + "whoRetries": { + "enum": [ + "YOU", + "ME", + "BOTH", + "NONE" + ], + "type": "string" + }, + "fixHint": {}, + "where": { + "enum": [ + "CLOUD", + "EDGE", + "WIRE", + "AGENCY" + ], + "type": "string" + }, + "impact": { + "enum": [ + "MESSAGE", + "THREAD", + "CONNECTION" + ], + "type": "string" + }, + "noticedTime": { + "type": "string" + }, + "trackingUri": { + "type": "string" + }, + "escalationUri": { + "type": "string" + } + }, + "type": "object", + "required": [ + "type", + "id" + ] + }, + "BasicMessageRequest": { + "properties": { + "content": { + "type": "string" + } + }, + "type": "object", + "required": [ + "content" + ] + }, + "InvitationConfigRequest": { + "properties": { + "autoAcceptConnection": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "mediatorId": { + "type": "string" + }, + "myLabel": { + "type": "string" + }, + "myImageUrl": { + "type": "string" + } + }, + "type": "object" + }, + "ReceiveInvitationByUrlRequest": { + "properties": { + "invitationUrl": { + "type": "string" + }, + "autoAcceptConnection": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "mediatorId": { + "type": "string" + }, + "myLabel": { + "type": "string" + }, + "myImageUrl": { + "type": "string" + } + }, + "type": "object", + "required": [ + "invitationUrl" + ] + }, + "InvitationRequest": { + "properties": { + "label": { + "type": "string" + }, + "did": { + "type": "string" + }, + "recipientKeys": { + "items": {}, + "type": "array" + }, + "serviceEndpoint": { + "type": "string" + }, + "routingKeys": { + "items": {}, + "type": "array" + } + }, + "type": "object", + "required": [ + "label" + ] + }, + "ReceiveInvitationRequest": { + "properties": { + "invitation": { + "$ref": "#/components/schemas/InvitationRequest" + }, + "autoAcceptConnection": { + "type": "boolean" + }, + "alias": { + "type": "string" + }, + "mediatorId": { + "type": "string" + }, + "myLabel": { + "type": "string" + }, + "myImageUrl": { + "type": "string" + } + }, + "type": "object", + "required": [ + "invitation" + ] + }, + "AcceptCredentialProposalRequest": { + "properties": { + "comment": { + "type": "string" + }, + "credentialDefinitionId": { + "type": "string" + }, + "autoAcceptCredential": { + "enum": [ + "always", + "contentApproved", + "never" + ], + "type": "string" + } + }, + "type": "object" + }, + "LinkedAttachment": { + "properties": { + "attributeName": { + "type": "string" + } + }, + "type": "object", + "required": [ + "attributeName" + ] + }, + "CredentialOfferTemp": { + "properties": { + "credentialDefinitionId": { + "pattern": "^([a-zA-Z0-9]{21,22}):3:CL:(([1-9][0-9]*)|([a-zA-Z0-9]{21,22}:2:.+:[0-9.]+)):(.+)?$", + "type": "string" + }, + "comment": { + "type": "string" + }, + "preview": { + "$ref": "#/components/schemas/CredentialPreview" + }, + "autoAcceptCredential": { + "enum": [ + "always", + "contentApproved", + "never" + ], + "type": "string" + }, + "attachments": { + "$ref": "#/components/schemas/Array" + }, + "linkedAttachments": { + "$ref": "#/components/schemas/Array" + } + }, + "type": "object", + "required": [ + "credentialDefinitionId", + "preview" + ] + }, + "CredentialOfferRequest": { + "properties": { + "connectionId": { + "type": "string" + }, + "credentialDefinitionId": { + "pattern": "^([a-zA-Z0-9]{21,22}):3:CL:(([1-9][0-9]*)|([a-zA-Z0-9]{21,22}:2:.+:[0-9.]+)):(.+)?$", + "type": "string" + }, + "comment": { + "type": "string" + }, + "preview": { + "$ref": "#/components/schemas/CredentialPreview" + }, + "autoAcceptCredential": { + "enum": [ + "always", + "contentApproved", + "never" + ], + "type": "string" + }, + "attachments": { + "$ref": "#/components/schemas/Array" + }, + "linkedAttachments": { + "$ref": "#/components/schemas/Array" + } + }, + "type": "object", + "required": [ + "connectionId", + "credentialDefinitionId", + "preview" + ] + }, + "CredentialProposalRequest": { + "properties": { + "connectionId": { + "type": "string" + }, + "comment": { + "type": "string" + }, + "credentialProposal": { + "not": { + "type": "null" + }, + "$ref": "#/components/schemas/CredentialPreview" + }, + "schemaIssuerDid": { + "pattern": "^(did:sov:)?[a-zA-Z0-9]{21,22}$", + "type": "string" + }, + "schemaId": { + "pattern": "^[a-zA-Z0-9]{21,22}:2:.+:[0-9.]+$", + "type": "string" + }, + "schemaName": { + "type": "string" + }, + "schemaVersion": { + "pattern": "^(\\d+\\.)?(\\d+\\.)?(\\*|\\d+)$", + "type": "string" + }, + "credentialDefinitionId": { + "pattern": "^([a-zA-Z0-9]{21,22}):3:CL:(([1-9][0-9]*)|([a-zA-Z0-9]{21,22}:2:.+:[0-9.]+)):(.+)?$", + "type": "string" + }, + "issuerDid": { + "pattern": "^(did:sov:)?[a-zA-Z0-9]{21,22}$", + "type": "string" + }, + "attachments": {}, + "linkedAttachments": {}, + "autoAcceptCredential": { + "enum": [ + "always", + "contentApproved", + "never" + ], + "type": "string" + } + }, + "type": "object", + "required": [ + "connectionId", + "credentialProposal" + ] + }, + "CredentialDefinitionRequest": { + "properties": { + "tag": { + "type": "string" + }, + "supportRevocation": { + "type": "boolean" + }, + "schemaId": { + "pattern": "^[a-zA-Z0-9]{21,22}:2:.+:[0-9.]+$", + "type": "string" + } + }, + "type": "object", + "required": [ + "tag", + "supportRevocation", + "schemaId" + ] + }, + "SchemaTemplate": { + "properties": { + "name": { + "type": "string" + }, + "version": { + "pattern": "^(\\d+\\.)?(\\d+\\.)?(\\*|\\d+)$", + "type": "string" + }, + "attributes": { + "items": {}, + "type": "array" + } + }, + "type": "object", + "required": [ + "name", + "version", + "attributes" + ] + }, + "AcceptProofProposalRequest": { + "properties": { + "request": {}, + "comment": { + "type": "string" + } + }, + "type": "object" + }, + "PresentationProofRequest": { + "properties": { + "filterByPresentationPreview": { + "type": "boolean" + }, + "comment": { + "type": "string" + } + }, + "type": "object" + }, + "ProofRequestTemplate": { + "properties": { + "proofRequest": { + "$ref": "#/components/schemas/ProofRequest" + }, + "comment": { + "type": "string" + }, + "autoAcceptProof": { + "enum": [ + "always", + "contentApproved", + "never" + ], + "type": "string" + } + }, + "type": "object", + "required": [ + "proofRequest" + ] + }, + "ProofPresentationRequest": { + "properties": { + "connectionId": { + "type": "string" + }, + "proofRequest": { + "$ref": "#/components/schemas/ProofRequest" + }, + "comment": { + "type": "string" + }, + "autoAcceptProof": { + "enum": [ + "always", + "contentApproved", + "never" + ], + "type": "string" + } + }, + "type": "object", + "required": [ + "connectionId", + "proofRequest" + ] + }, + "ProofProposalRequest": { + "properties": { + "connectionId": { + "type": "string" + }, + "attributes": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "predicates": { + "items": { + "$ref": "#/components/schemas/Array" + }, + "type": "array" + }, + "autoAcceptProof": { + "enum": [ + "always", + "contentApproved", + "never" + ], + "type": "string" + }, + "comment": { + "type": "string" + } + }, + "type": "object", + "required": [ + "connectionId", + "attributes", + "predicates" + ] + } + } + }, + "info": { + "title": "ssi-abstraction-agent", + "version": "0.8.0", + "description": "Rest endpoint wrapper for using your agent over HTTP" + }, + "openapi": "3.0.0", + "paths": { + "/agent/": { + "get": { + "operationId": "AgentController.getAgentInfo", + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get agent info", + "tags": [ + "Agent" + ] + } + }, + "/basic-messages/{connectionId}": { + "get": { + "operationId": "BasicMessageController.getBasicMessages", + "parameters": [ + { + "in": "path", + "name": "connectionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get basic messages", + "tags": [ + "Basic Message" + ] + }, + "post": { + "operationId": "BasicMessageController.sendMessage", + "parameters": [ + { + "in": "path", + "name": "connectionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/BasicMessageRequest" + } + } + }, + "description": "BasicMessageRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Send message", + "tags": [ + "Basic Message" + ] + } + }, + "/connections/{connectionId}": { + "get": { + "operationId": "ConnectionController.getConnectionById", + "parameters": [ + { + "in": "path", + "name": "connectionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get connection by id", + "tags": [ + "Connection" + ] + }, + "delete": { + "operationId": "ConnectionController.deleteConnection", + "parameters": [ + { + "in": "path", + "name": "connectionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Delete connection", + "tags": [ + "Connection" + ] + } + }, + "/connections/": { + "get": { + "operationId": "ConnectionController.getAllConnections", + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get all connections", + "tags": [ + "Connection" + ] + } + }, + "/connections/create-invitation": { + "post": { + "operationId": "ConnectionController.createInvitation", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/InvitationConfigRequest" + } + } + }, + "description": "InvitationConfigRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Create invitation", + "tags": [ + "Connection" + ] + } + }, + "/connections/receive-invitation": { + "post": { + "operationId": "ConnectionController.receiveInvitation", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReceiveInvitationRequest" + } + } + }, + "description": "ReceiveInvitationRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Receive invitation", + "tags": [ + "Connection" + ] + } + }, + "/connections/receive-invitation-url": { + "post": { + "operationId": "ConnectionController.receiveInvitationByUrl", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ReceiveInvitationByUrlRequest" + } + } + }, + "description": "ReceiveInvitationByUrlRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Receive invitation by url", + "tags": [ + "Connection" + ] + } + }, + "/connections/{connectionId}/accept-invitation": { + "post": { + "operationId": "ConnectionController.acceptInvitation", + "parameters": [ + { + "in": "path", + "name": "connectionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept invitation", + "tags": [ + "Connection" + ] + } + }, + "/connections/{connectionId}/accept-request": { + "post": { + "operationId": "ConnectionController.acceptRequest", + "parameters": [ + { + "in": "path", + "name": "connectionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept request", + "tags": [ + "Connection" + ] + } + }, + "/connections/{connectionId}/accept-response": { + "post": { + "operationId": "ConnectionController.acceptResponse", + "parameters": [ + { + "in": "path", + "name": "connectionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept response", + "tags": [ + "Connection" + ] + } + }, + "/credentials/{credentialId}": { + "get": { + "operationId": "CredentialController.getCredentialById", + "parameters": [ + { + "in": "path", + "name": "credentialId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get credential by id", + "tags": [ + "Credential" + ] + }, + "delete": { + "operationId": "CredentialController.deleteCredential", + "parameters": [ + { + "in": "path", + "name": "credentialId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Delete credential", + "tags": [ + "Credential" + ] + } + }, + "/credentials/": { + "get": { + "operationId": "CredentialController.getAllCredentials", + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get all credentials", + "tags": [ + "Credential" + ] + } + }, + "/credentials/propose-credential": { + "post": { + "operationId": "CredentialController.proposeCredential", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialProposalRequest" + } + } + }, + "description": "CredentialProposalRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Propose credential", + "tags": [ + "Credential" + ] + } + }, + "/credentials/{credentialId}/accept-proposal": { + "post": { + "operationId": "CredentialController.acceptProposal", + "parameters": [ + { + "in": "path", + "name": "credentialId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AcceptCredentialProposalRequest" + } + } + }, + "description": "AcceptCredentialProposalRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept proposal", + "tags": [ + "Credential" + ] + } + }, + "/credentials/offer-outofband-credential": { + "post": { + "operationId": "CredentialController.offerCredentialOutOfBand", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialOfferTemp" + } + } + }, + "description": "CredentialOfferTemp", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Offer credential out of band", + "tags": [ + "Credential" + ] + } + }, + "/credentials/offer-credential": { + "post": { + "operationId": "CredentialController.offerCredential", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialOfferRequest" + } + } + }, + "description": "CredentialOfferRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Offer credential", + "tags": [ + "Credential" + ] + } + }, + "/credentials/{credentialId}/accept-offer": { + "post": { + "operationId": "CredentialController.acceptOffer", + "parameters": [ + { + "in": "path", + "name": "credentialId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept offer", + "tags": [ + "Credential" + ] + } + }, + "/credentials/{credentialId}/accept-request": { + "post": { + "operationId": "CredentialController.acceptRequest", + "parameters": [ + { + "in": "path", + "name": "credentialId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept request", + "tags": [ + "Credential" + ] + } + }, + "/credentials/{credentialId}/accept-credential": { + "post": { + "operationId": "CredentialController.acceptCredential", + "parameters": [ + { + "in": "path", + "name": "credentialId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept credential", + "tags": [ + "Credential" + ] + } + }, + "/credential-definitions/{credentialDefinitionId}": { + "get": { + "operationId": "CredentialDefinitionController.getCredentialDefinitionById", + "parameters": [ + { + "in": "path", + "name": "credentialDefinitionId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get credential definition by id", + "tags": [ + "Credential Definition" + ] + } + }, + "/credential-definitions/": { + "post": { + "operationId": "CredentialDefinitionController.createCredentialDefinition", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/CredentialDefinitionRequest" + } + } + }, + "description": "CredentialDefinitionRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Create credential definition", + "tags": [ + "Credential Definition" + ] + } + }, + "/schemas/{schemaId}": { + "get": { + "operationId": "SchemaController.getSchemaById", + "parameters": [ + { + "in": "path", + "name": "schemaId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get schema by id", + "tags": [ + "Schema" + ] + } + }, + "/schemas/": { + "post": { + "operationId": "SchemaController.createSchema", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/SchemaTemplate" + } + } + }, + "description": "SchemaTemplate", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Create schema", + "tags": [ + "Schema" + ] + } + }, + "/proofs/{proofRecordId}": { + "get": { + "operationId": "ProofController.getProofById", + "parameters": [ + { + "in": "path", + "name": "proofRecordId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get proof by id", + "tags": [ + "Proof" + ] + }, + "delete": { + "operationId": "ProofController.deleteProof", + "parameters": [ + { + "in": "path", + "name": "proofRecordId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Delete proof", + "tags": [ + "Proof" + ] + } + }, + "/proofs/": { + "get": { + "operationId": "ProofController.getAllProofs", + "parameters": [ + { + "in": "query", + "name": "threadId", + "required": false, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Get all proofs", + "tags": [ + "Proof" + ] + } + }, + "/proofs/propose-proof": { + "post": { + "operationId": "ProofController.proposeProof", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProofProposalRequest" + } + } + }, + "description": "ProofProposalRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Propose proof", + "tags": [ + "Proof" + ] + } + }, + "/proofs/{proofRecordId}/accept-proposal": { + "post": { + "operationId": "ProofController.acceptProposal", + "parameters": [ + { + "in": "path", + "name": "proofRecordId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/AcceptProofProposalRequest" + } + } + }, + "description": "AcceptProofProposalRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept proposal", + "tags": [ + "Proof" + ] + } + }, + "/proofs/request-outofband-proof": { + "post": { + "operationId": "ProofController.requestProofOutOfBand", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProofRequestTemplate" + } + } + }, + "description": "ProofRequestTemplate", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Request proof out of band", + "tags": [ + "Proof" + ] + } + }, + "/proofs/request-proof": { + "post": { + "operationId": "ProofController.requestProof", + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/ProofPresentationRequest" + } + } + }, + "description": "ProofPresentationRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Request proof", + "tags": [ + "Proof" + ] + } + }, + "/proofs/{proofRecordId}/accept-request": { + "post": { + "operationId": "ProofController.acceptRequest", + "parameters": [ + { + "in": "path", + "name": "proofRecordId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "requestBody": { + "content": { + "application/json": { + "schema": { + "$ref": "#/components/schemas/PresentationProofRequest" + } + } + }, + "description": "PresentationProofRequest", + "required": false + }, + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept request", + "tags": [ + "Proof" + ] + } + }, + "/proofs/{proofRecordId}/accept-presentation": { + "post": { + "operationId": "ProofController.acceptPresentation", + "parameters": [ + { + "in": "path", + "name": "proofRecordId", + "required": true, + "schema": { + "type": "string" + } + } + ], + "responses": { + "200": { + "content": { + "application/json": {} + }, + "description": "Successful response" + } + }, + "summary": "Accept presentation", + "tags": [ + "Proof" + ] + } + } + } +} \ No newline at end of file diff --git a/apps/ssi-abstraction/test/didComm.e2e-spec.ts b/apps/ssi-abstraction/test/didComm.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..94bd4bacf3b884cfa8f61179d0fa31a1c35cd457 --- /dev/null +++ b/apps/ssi-abstraction/test/didComm.e2e-spec.ts @@ -0,0 +1,30 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import AppModule from '@src/app.module'; + +describe('DidCommController (e2e)', () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + afterAll(async () => { + await app.close(); + }); + + it('/v1/agent/connections/createConnection (POST)', () => { + request(app.getHttpServer()) + .post('v1/agent/connections/createConnection') + .expect(200); + }); + + it('/v1/agent/info (GET)', () => { + request(app.getHttpServer()).post('v1/agent/info').expect(200); + }); +}); diff --git a/apps/ssi-abstraction/test/health.e2e-spec.ts b/apps/ssi-abstraction/test/health.e2e-spec.ts new file mode 100644 index 0000000000000000000000000000000000000000..1f685c6552d18d69697207fec9add092ae2cb56d --- /dev/null +++ b/apps/ssi-abstraction/test/health.e2e-spec.ts @@ -0,0 +1,23 @@ +import { Test, TestingModule } from '@nestjs/testing'; +import { INestApplication } from '@nestjs/common'; +import request from 'supertest'; +import AppModule from '@src/app.module'; + +describe('HealthController (e2e)', () => { + let app: INestApplication; + + beforeAll(async () => { + const moduleFixture: TestingModule = await Test.createTestingModule({ + imports: [AppModule], + }).compile(); + + app = moduleFixture.createNestApplication(); + await app.init(); + }); + afterAll(async () => { + await app.close(); + }); + + it('/health (GET)', () => + request(app.getHttpServer()).get('/health').expect(200)); +}); diff --git a/apps/ssi-abstraction/test/jest-e2e.json b/apps/ssi-abstraction/test/jest-e2e.json new file mode 100644 index 0000000000000000000000000000000000000000..4a8635e2f768ed6352e0341b685e1bc65d3bb426 --- /dev/null +++ b/apps/ssi-abstraction/test/jest-e2e.json @@ -0,0 +1,23 @@ +{ + "moduleFileExtensions": ["js", "json", "ts"], + "rootDir": ".", + "testEnvironment": "node", + "testRegex": ".e2e-spec.ts$", + "transform": { + "^.+\\.(t|j)s$": "ts-jest" + }, + "moduleNameMapper": { + "@src/(.*)": ["<rootDir>/../src/$1"], + "@config/(.*)": ["<rootDir>/../config/$1"], + "@globalUtils/(.*)" :["<rootDir>/../src/globalUtils/$1"], + "@common/(.*)":["<rootDir>/../src/common/$1"], + "@agent/(.*)":["<rootDir>/../src/agent/$1"], + "@didComm/(.*)":["<rootDir>/../src/didComm/$1"], + "@eventHandler/(.*)":["<rootDir>/../src/eventHandler/$1"], + "@health/(.*)":["<rootDir>/../src/health/$1"], + "@DB/(.*)":["<rootDir>/../src/prisma/$1"] + }, + "setupFiles": [ + "./setEnvVars.js" + ] +} \ No newline at end of file diff --git a/apps/ssi-abstraction/test/setEnvVars.js b/apps/ssi-abstraction/test/setEnvVars.js new file mode 100644 index 0000000000000000000000000000000000000000..62f9981d5da3c53245a69ab0decc1a0f78e9a7ab --- /dev/null +++ b/apps/ssi-abstraction/test/setEnvVars.js @@ -0,0 +1,15 @@ +process.env.PORT = 3009; +process.env.AFJ_EXT_PORT = 3010; +process.env.DATABASE_URL = 'postgresql://postgres:postgres@localhost:5432/postgres?schema=agent'; +process.env.NATS_URL = 'nats://localhost:4222'; +process.env.ECSURL = 'http://localhost:9200/'; +process.env.AGENT_HOST = 'http://localhost'; +process.env.AGENT_NAME = 'ssi-abstraction-agent'; +process.env.AGENT_PEER_PORT = ':4000'; +process.env.AGENT_URL_PATH = '/ocm/abstraction'; +process.env.AGENT_PUBLIC_DID_SEED = '6b8b882e2618fa5d45ee7229ca880083'; +process.env.AGENT_AUTO_ACCEPT_CONNECTION = true; +process.env.AGENT_AUTO_ACCEPT_CREDENTIAL = true; +process.env.AGENT_WALLET_KEY = 'ssi-wallet-key'; +process.env.AGENT_WALLET_ID = 'ssi-wallet-id'; +process.env.AGENT_LEDGER_ID = 'ID_UNION'; \ No newline at end of file diff --git a/apps/ssi-abstraction/tsconfig.build.json b/apps/ssi-abstraction/tsconfig.build.json new file mode 100644 index 0000000000000000000000000000000000000000..62ab6b8061cdf4c5ab0bde5967ae2853ee4dbfd2 --- /dev/null +++ b/apps/ssi-abstraction/tsconfig.build.json @@ -0,0 +1,4 @@ +{ + "extends": "./tsconfig.json", + "exclude": ["node_modules", "test", "dist", "**/*spec.ts", "agent-spinup"] +} diff --git a/apps/ssi-abstraction/tsconfig.json b/apps/ssi-abstraction/tsconfig.json new file mode 100644 index 0000000000000000000000000000000000000000..22c429bbfc492b7dacaf3af5f3579538db30bff9 --- /dev/null +++ b/apps/ssi-abstraction/tsconfig.json @@ -0,0 +1,31 @@ +{ + "compilerOptions": { + "target": "es6", + "experimentalDecorators": true, + "emitDecoratorMetadata": true, + "module": "commonjs", + "outDir": "./dist", + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true /* Ensure that casing is correct in imports. */, + "strict": true, + "skipLibCheck": true, + "baseUrl": "./", + "strictPropertyInitialization": false, + "sourceMap": true, + "strictNullChecks": true, + "paths": { + "@src/*": ["src/*"], + "@config/*": ["config/*"], + "@globalUtils/*" :["src/globalUtils/*"], + "@common/*":["src/common/*"], + "@agent/*":["src/agent/*"], + "@didComm/*":["src/didComm/*"], + "@health/*":["src/health/*"], + "@DB/*":["src/prisma/*"] + } + }, + "exclude": [ + "node_modules", + "./dist/**/*" + ] +} diff --git a/compose/docker-compose.yml b/compose/docker-compose.yml new file mode 100644 index 0000000000000000000000000000000000000000..668a3be8389bf491d0e92f5ba0d324d7e4f74505 --- /dev/null +++ b/compose/docker-compose.yml @@ -0,0 +1,85 @@ +version: "3.3" + +services: + + conn-m: + container_name: ocm-connection-manager + build: + context: ../apps/connection-manager + dockerfile: deployment/dev/Dockerfile + ports: + - "3003:3003" + env_file: + ./env/connection-manager.env + depends_on: + - db + - nats + - ssi + + att-m: + container_name: ocm-attestation-manager + build: + context: ../apps/attestation-manager + dockerfile: deployment/dev/Dockerfile + ports: + - "3005:3005" + env_file: + ./env/attestation-manager.env + depends_on: + - db + - nats + - ssi + + proof-m: + container_name: ocm-proof-manager + build: + context: ../apps/proof-manager + dockerfile: deployment/ci/Dockerfile + ports: + - "3007:3007" + env_file: + ./env/proof-manager.env + depends_on: + - db + - nats + - ssi + + ssi: + container_name: ocm-ssi-abstraction + build: + context: ../apps/ssi-abstraction + dockerfile: deployment/dev/Dockerfile + ports: + - "3009:3009" + - "3010:3010" + - "4000:4000" + env_file: + ./env/ssi-abstraction.env + depends_on: + - db + - nats + + db: + container_name: db + image: postgres:latest + volumes: + - ./volumes/postgres-data:/postgres/postgres-data:z + ports: + - 5432:5432 + healthcheck: + test: [ "CMD", "pg_isready", "-q", "-d", "postgres", "-U", "root" ] + timeout: 45s + interval: 10s + retries: 10 + restart: always + environment: + - POSTGRES_USER=root + - POSTGRES_PASSWORD=password + - POSTGRES_DB=postgres + + nats: + container_name: nats + image: nats + ports: + - '4222:4222' #Nats server port + - '8222:8222' #Nats server Monitering port diff --git a/package.json b/package.json new file mode 100644 index 0000000000000000000000000000000000000000..75c94a16078e8bae6d270abb98a5ef289f2d8a25 --- /dev/null +++ b/package.json @@ -0,0 +1,9 @@ +{ + "name": "ocm-engine", + "author": "Vereign AG", + "packageManager": "yarn@3.6.3", + "private": true, + "workspaces": [ + "apps/*" + ] +} diff --git a/pnpm-lock.yaml b/pnpm-lock.yaml new file mode 100644 index 0000000000000000000000000000000000000000..aca60b9e19002176c6373a452c63d25a69bed850 --- /dev/null +++ b/pnpm-lock.yaml @@ -0,0 +1,9046 @@ +lockfileVersion: '6.0' + +settings: + autoInstallPeers: true + excludeLinksFromLockfile: false + +importers: + + .: {} + + apps/attestation-manager: + dependencies: + '@elastic/ecs-winston-format': + specifier: ^1.3.1 + version: 1.3.1 + '@nestjs/axios': + specifier: 0.0.5 + version: 0.0.5(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': + specifier: ^8.0.0 + version: 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^1.1.6 + version: 1.2.1(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': + specifier: '*' + version: 2.0.2(@nestjs/common@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13) + '@nestjs/microservices': + specifier: ^8.2.6 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(nats@2.17.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-express': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7) + '@nestjs/swagger': + specifier: ^5.2.0 + version: 5.2.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(swagger-ui-express@4.6.3) + '@nestjs/terminus': + specifier: ^8.0.4 + version: 8.1.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@prisma/client': + specifier: ^3.9.2 + version: 3.15.2(prisma@3.15.2) + '@types/express': + specifier: ^4.17.13 + version: 4.17.18 + '@types/jest': + specifier: 27.0.2 + version: 27.0.2 + '@types/jsonwebtoken': + specifier: ^8.5.9 + version: 8.5.9 + '@types/node': + specifier: ^16.0.0 + version: 16.18.57 + class-transformer: + specifier: ^0.5.1 + version: 0.5.1 + class-validator: + specifier: ^0.13.2 + version: 0.13.2 + express: + specifier: ^4.17.3 + version: 4.18.2 + husky: + specifier: ^7.0.4 + version: 7.0.4 + joi: + specifier: ^17.6.0 + version: 17.11.0 + jsonwebtoken: + specifier: ^8.5.1 + version: 8.5.1 + jwks-rsa: + specifier: ^3.0.0 + version: 3.1.0 + liquibase: + specifier: ^4.4.0 + version: 4.4.0 + moment: + specifier: ^2.29.1 + version: 2.29.4 + nats: + specifier: ^2.6.0 + version: 2.17.0 + pg: + specifier: ^8.7.3 + version: 8.11.3 + prisma: + specifier: ^3.9.2 + version: 3.15.2 + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.13 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rxjs: + specifier: ^7.2.0 + version: 7.8.1 + swagger-ui-express: + specifier: ^4.3.0 + version: 4.6.3(express@4.18.2) + winston: + specifier: ^3.6.0 + version: 3.10.0 + winston-elasticsearch: + specifier: ^0.16.1 + version: 0.16.1 + devDependencies: + '@nestjs/cli': + specifier: ^8.0.0 + version: 8.2.8 + '@nestjs/schematics': + specifier: ^8.0.0 + version: 8.0.11(typescript@4.9.5) + '@nestjs/testing': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7) + '@types/supertest': + specifier: ^2.0.11 + version: 2.0.14 + '@typescript-eslint/eslint-plugin': + specifier: ^5.0.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.0.0 + version: 5.62.0(eslint@8.50.0)(typescript@4.9.5) + dotenv-cli: + specifier: ^4.1.1 + version: 4.1.1 + eslint: + specifier: ^8.0.1 + version: 8.50.0 + eslint-config-airbnb-typescript: + specifier: ^16.1.0 + version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.10.0(eslint@8.50.0) + eslint-plugin-import: + specifier: ^2.25.4 + version: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.50.0)(prettier@2.8.8) + jest: + specifier: ^27.2.5 + version: 27.5.1(ts-node@10.9.1) + node-mocks-http: + specifier: ^1.11.0 + version: 1.13.0 + prettier: + specifier: ^2.3.2 + version: 2.8.8 + source-map-support: + specifier: ^0.5.20 + version: 0.5.21 + supertest: + specifier: ^6.1.3 + version: 6.3.3 + ts-jest: + specifier: ^27.0.3 + version: 27.1.5(@babel/core@7.23.0)(@types/jest@27.0.2)(jest@27.5.1)(typescript@4.9.5) + ts-loader: + specifier: ^9.2.3 + version: 9.4.4(typescript@4.9.5)(webpack@5.88.2) + ts-node: + specifier: ^10.0.0 + version: 10.9.1(@types/node@16.18.57)(typescript@4.9.5) + tsconfig-paths: + specifier: ^3.10.1 + version: 3.14.2 + typescript: + specifier: ^4.3.5 + version: 4.9.5 + + apps/connection-manager: + dependencies: + '@elastic/ecs-winston-format': + specifier: ^1.3.1 + version: 1.3.1 + '@nestjs/axios': + specifier: ^0.0.5 + version: 0.0.5(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/cli': + specifier: ^8.0.0 + version: 8.2.8 + '@nestjs/common': + specifier: ^8.0.0 + version: 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^1.1.6 + version: 1.2.1(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': + specifier: '*' + version: 2.0.2(@nestjs/common@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13) + '@nestjs/microservices': + specifier: ^8.2.6 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(nats@2.17.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-express': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7) + '@nestjs/schedule': + specifier: ^1.0.2 + version: 1.1.0(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(reflect-metadata@0.1.13) + '@nestjs/schematics': + specifier: ^8.0.0 + version: 8.0.11(typescript@4.9.5) + '@nestjs/swagger': + specifier: ^5.2.0 + version: 5.2.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(swagger-ui-express@4.6.3) + '@nestjs/terminus': + specifier: ^8.0.4 + version: 8.1.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/testing': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7) + '@prisma/client': + specifier: ^3.15.2 + version: 3.15.2(prisma@3.15.2) + '@types/node': + specifier: ^16.0.0 + version: 16.18.57 + class-validator: + specifier: ^0.13.2 + version: 0.13.2 + express: + specifier: ^4.17.3 + version: 4.18.2 + joi: + specifier: ^17.6.0 + version: 17.11.0 + jsonwebtoken: + specifier: ^8.5.1 + version: 8.5.1 + jwks-rsa: + specifier: ^3.0.0 + version: 3.1.0 + moment: + specifier: ^2.29.1 + version: 2.29.4 + nats: + specifier: ^2.6.0 + version: 2.17.0 + prisma: + specifier: ^3.15.2 + version: 3.15.2 + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.13 + rxjs: + specifier: ^7.2.0 + version: 7.8.1 + simple-oauth2: + specifier: ^5.0.0 + version: 5.0.0 + winston: + specifier: ^3.6.0 + version: 3.10.0 + winston-elasticsearch: + specifier: ^0.16.1 + version: 0.16.1 + devDependencies: + '@types/express': + specifier: ^4.17.13 + version: 4.17.18 + '@types/jest': + specifier: 27.0.2 + version: 27.0.2 + '@types/jsonwebtoken': + specifier: ^8.5.9 + version: 8.5.9 + '@types/simple-oauth2': + specifier: ^4.1.1 + version: 4.1.3 + '@types/supertest': + specifier: ^2.0.11 + version: 2.0.14 + '@typescript-eslint/eslint-plugin': + specifier: ^5.14.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.14.0 + version: 5.62.0(eslint@8.50.0)(typescript@4.9.5) + dotenv-cli: + specifier: ^4.1.1 + version: 4.1.1 + eslint: + specifier: ^8.0.1 + version: 8.50.0 + eslint-config-airbnb-typescript: + specifier: ^16.1.0 + version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.10.0(eslint@8.50.0) + eslint-plugin-import: + specifier: ^2.26.0 + version: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.50.0)(prettier@2.8.8) + husky: + specifier: ^7.0.4 + version: 7.0.4 + jest: + specifier: ^27.2.5 + version: 27.5.1(ts-node@10.9.1) + node-mocks-http: + specifier: ^1.11.0 + version: 1.13.0 + prettier: + specifier: ^2.3.2 + version: 2.8.8 + source-map-support: + specifier: ^0.5.20 + version: 0.5.21 + supertest: + specifier: ^6.1.3 + version: 6.3.3 + swagger-ui-express: + specifier: ^4.3.0 + version: 4.6.3(express@4.18.2) + ts-jest: + specifier: ^27.0.3 + version: 27.1.5(@babel/core@7.23.0)(@types/jest@27.0.2)(jest@27.5.1)(typescript@4.9.5) + ts-loader: + specifier: ^9.2.3 + version: 9.4.4(typescript@4.9.5)(webpack@5.88.2) + ts-node: + specifier: ^10.0.0 + version: 10.9.1(@types/node@16.18.57)(typescript@4.9.5) + tsconfig-paths: + specifier: ^3.10.1 + version: 3.14.2 + typescript: + specifier: ^4.3.5 + version: 4.9.5 + + apps/proof-manager: + dependencies: + '@elastic/ecs-winston-format': + specifier: ^1.3.1 + version: 1.3.1 + '@nestjs/axios': + specifier: 0.0.5 + version: 0.0.5(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': + specifier: ^8.0.0 + version: 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^1.1.6 + version: 1.2.1(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': + specifier: '*' + version: 2.0.2(@nestjs/common@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13) + '@nestjs/microservices': + specifier: ^8.2.6 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(nats@2.17.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-express': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7) + '@nestjs/swagger': + specifier: ^5.2.0 + version: 5.2.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(swagger-ui-express@4.6.3) + '@nestjs/terminus': + specifier: ^8.0.4 + version: 8.1.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@prisma/client': + specifier: ^3.15.2 + version: 3.15.2(prisma@3.15.2) + '@types/express': + specifier: ^4.17.13 + version: 4.17.18 + '@types/jest': + specifier: 27.0.2 + version: 27.0.2 + '@types/jsonwebtoken': + specifier: ^8.5.9 + version: 8.5.9 + '@types/node': + specifier: ^16.0.0 + version: 16.18.57 + class-validator: + specifier: ^0.13.2 + version: 0.13.2 + express: + specifier: ^4.17.3 + version: 4.18.2 + joi: + specifier: ^17.6.0 + version: 17.11.0 + js-base64: + specifier: ^3.7.2 + version: 3.7.5 + jsonwebtoken: + specifier: ^8.5.1 + version: 8.5.1 + jwks-rsa: + specifier: ^3.0.0 + version: 3.1.0 + moment: + specifier: ^2.29.1 + version: 2.29.4 + nats: + specifier: ^2.6.0 + version: 2.17.0 + pg: + specifier: ^8.7.3 + version: 8.11.3 + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.13 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rxjs: + specifier: ^7.2.0 + version: 7.8.1 + winston: + specifier: ^3.6.0 + version: 3.10.0 + winston-elasticsearch: + specifier: ^0.16.1 + version: 0.16.1 + devDependencies: + '@nestjs/cli': + specifier: ^8.0.0 + version: 8.2.8 + '@nestjs/schematics': + specifier: ^8.0.0 + version: 8.0.11(typescript@4.9.5) + '@nestjs/testing': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7) + '@types/supertest': + specifier: ^2.0.11 + version: 2.0.14 + '@typescript-eslint/eslint-plugin': + specifier: ^5.0.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.0.0 + version: 5.62.0(eslint@8.50.0)(typescript@4.9.5) + dotenv-cli: + specifier: ^4.1.1 + version: 4.1.1 + eslint: + specifier: ^8.0.1 + version: 8.50.0 + eslint-config-airbnb-typescript: + specifier: ^16.1.0 + version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.10.0(eslint@8.50.0) + eslint-plugin-import: + specifier: ^2.25.4 + version: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.50.0)(prettier@2.8.8) + husky: + specifier: ^7.0.4 + version: 7.0.4 + jest: + specifier: ^27.2.5 + version: 27.5.1(ts-node@10.9.1) + node-mocks-http: + specifier: ^1.11.0 + version: 1.13.0 + prettier: + specifier: ^2.3.2 + version: 2.8.8 + prisma: + specifier: ^3.15.2 + version: 3.15.2 + source-map-support: + specifier: ^0.5.20 + version: 0.5.21 + supertest: + specifier: ^6.1.3 + version: 6.3.3 + swagger-ui-express: + specifier: ^4.3.0 + version: 4.6.3(express@4.18.2) + ts-jest: + specifier: ^27.0.3 + version: 27.1.5(@babel/core@7.23.0)(@types/jest@27.0.2)(jest@27.5.1)(typescript@4.9.5) + ts-loader: + specifier: ^9.2.3 + version: 9.4.4(typescript@4.9.5)(webpack@5.88.2) + ts-node: + specifier: ^10.0.0 + version: 10.9.1(@types/node@16.18.57)(typescript@4.9.5) + tsconfig-paths: + specifier: ^3.10.1 + version: 3.14.2 + typescript: + specifier: ^4.3.5 + version: 4.9.5 + + apps/ssi-abstraction: + dependencies: + '@aries-framework/core': + specifier: ^0.1.0 + version: 0.1.0 + '@aries-framework/node': + specifier: ^0.1.0 + version: 0.1.0 + '@aries-framework/rest': + specifier: ^0.8.0 + version: 0.8.0 + '@elastic/ecs-winston-format': + specifier: ^1.3.1 + version: 1.3.1 + '@nestjs/axios': + specifier: 0.0.5 + version: 0.0.5(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/common': + specifier: ^8.0.0 + version: 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/config': + specifier: ^1.1.6 + version: 1.2.1(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': + specifier: '*' + version: 2.0.2(@nestjs/common@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13) + '@nestjs/microservices': + specifier: ^8.2.6 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(nats@2.17.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-express': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7) + '@nestjs/swagger': + specifier: ^5.2.0 + version: 5.2.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(swagger-ui-express@4.6.3) + '@nestjs/terminus': + specifier: ^8.0.4 + version: 8.1.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@types/express': + specifier: ^4.17.13 + version: 4.17.18 + '@types/jest': + specifier: 27.0.2 + version: 27.0.2 + '@types/node': + specifier: ^16.0.0 + version: 16.18.57 + '@types/shelljs': + specifier: ^0.8.11 + version: 0.8.13 + '@types/supertest': + specifier: ^2.0.11 + version: 2.0.14 + axios: + specifier: ^0.27.2 + version: 0.27.2 + class-validator: + specifier: ^0.13.2 + version: 0.13.2 + express: + specifier: ^4.17.3 + version: 4.18.2 + joi: + specifier: ^17.6.0 + version: 17.11.0 + moment: + specifier: ^2.29.1 + version: 2.29.4 + nats: + specifier: ^2.6.1 + version: 2.17.0 + pg: + specifier: ^8.7.3 + version: 8.11.3 + reflect-metadata: + specifier: ^0.1.13 + version: 0.1.13 + rimraf: + specifier: ^3.0.2 + version: 3.0.2 + rxjs: + specifier: ^7.2.0 + version: 7.8.1 + shelljs: + specifier: ^0.8.5 + version: 0.8.5 + swagger-ui-express: + specifier: ^4.3.0 + version: 4.6.3(express@4.18.2) + winston: + specifier: ^3.6.0 + version: 3.10.0 + winston-elasticsearch: + specifier: ^0.16.1 + version: 0.16.1 + devDependencies: + '@nestjs/cli': + specifier: ^8.0.0 + version: 8.2.8 + '@nestjs/schematics': + specifier: ^8.0.0 + version: 8.0.11(typescript@4.9.5) + '@nestjs/testing': + specifier: ^8.0.0 + version: 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7) + '@typescript-eslint/eslint-plugin': + specifier: ^5.0.0 + version: 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/parser': + specifier: ^5.0.0 + version: 5.62.0(eslint@8.50.0)(typescript@4.9.5) + dotenv-cli: + specifier: ^4.1.1 + version: 4.1.1 + eslint: + specifier: ^8.0.1 + version: 8.50.0 + eslint-config-airbnb-typescript: + specifier: ^16.1.0 + version: 16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-config-prettier: + specifier: ^8.3.0 + version: 8.10.0(eslint@8.50.0) + eslint-plugin-import: + specifier: ^2.25.4 + version: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) + eslint-plugin-prettier: + specifier: ^4.0.0 + version: 4.2.1(eslint-config-prettier@8.10.0)(eslint@8.50.0)(prettier@2.8.8) + husky: + specifier: ^7.0.4 + version: 7.0.4 + jest: + specifier: ^27.2.5 + version: 27.5.1(ts-node@10.9.1) + prettier: + specifier: ^2.3.2 + version: 2.8.8 + source-map-support: + specifier: ^0.5.20 + version: 0.5.21 + supertest: + specifier: ^6.1.3 + version: 6.3.3 + ts-jest: + specifier: ^27.0.3 + version: 27.1.5(@babel/core@7.23.0)(@types/jest@27.0.2)(jest@27.5.1)(typescript@4.9.5) + ts-loader: + specifier: ^9.2.3 + version: 9.4.4(typescript@4.9.5)(webpack@5.88.2) + ts-node: + specifier: ^10.0.0 + version: 10.9.1(@types/node@16.18.57)(typescript@4.9.5) + tsconfig-paths: + specifier: ^3.10.1 + version: 3.14.2 + typedoc: + specifier: ^0.22.15 + version: 0.22.18(typescript@4.9.5) + typescript: + specifier: ^4.3.5 + version: 4.9.5 + +packages: + + /@aashutoshrathi/word-wrap@1.2.6: + resolution: {integrity: sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==} + engines: {node: '>=0.10.0'} + dev: true + + /@ampproject/remapping@2.2.1: + resolution: {integrity: sha512-lFMjJTrFL3j7L9yBxwYfCq2k6qqwHyzuUl/XBnif78PWTJYyL/dfowQHWE3sp6U6ZzqWiiIZnpTMO96zhkjwtg==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + dev: true + + /@angular-devkit/core@13.3.5(chokidar@3.5.3): + resolution: {integrity: sha512-w7vzK4VoYP9rLgxJ2SwEfrkpKybdD+QgQZlsDBzT0C6Ebp7b4gkNcNVFo8EiZvfDl6Yplw2IAP7g7fs3STn0hQ==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.9.0 + ajv-formats: 2.1.1(ajv@8.9.0) + chokidar: 3.5.3 + fast-json-stable-stringify: 2.1.0 + magic-string: 0.25.7 + rxjs: 6.6.7 + source-map: 0.7.3 + + /@angular-devkit/core@13.3.6(chokidar@3.5.3): + resolution: {integrity: sha512-ZmD586B+RnM2CG5+jbXh2NVfIydTc/yKSjppYDDOv4I530YBm6vpfZMwClpiNk6XLbMv7KqX4Tlr4wfxlPYYbA==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + peerDependencies: + chokidar: ^3.5.2 + peerDependenciesMeta: + chokidar: + optional: true + dependencies: + ajv: 8.9.0 + ajv-formats: 2.1.1(ajv@8.9.0) + chokidar: 3.5.3 + fast-json-stable-stringify: 2.1.0 + magic-string: 0.25.7 + rxjs: 6.6.7 + source-map: 0.7.3 + + /@angular-devkit/schematics-cli@13.3.6(chokidar@3.5.3): + resolution: {integrity: sha512-5tTuu9gbXM0bMk0sin4phmWA3U1Qz53zT/rpEfzQ/+c/s8CoqZ5N1qOnYtemRct3Jxsz1kn4TBpHeriR4r5hHg==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 13.3.6(chokidar@3.5.3) + '@angular-devkit/schematics': 13.3.6(chokidar@3.5.3) + ansi-colors: 4.1.1 + inquirer: 8.2.0 + minimist: 1.2.6 + symbol-observable: 4.0.0 + transitivePeerDependencies: + - chokidar + + /@angular-devkit/schematics@13.3.5(chokidar@3.5.3): + resolution: {integrity: sha512-0N/kL/Vfx0yVAEwa3HYxNx9wYb+G9r1JrLjJQQzDp+z9LtcojNf7j3oey6NXrDUs1WjVZOa/AIdRl3/DuaoG5w==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 13.3.5(chokidar@3.5.3) + jsonc-parser: 3.0.0 + magic-string: 0.25.7 + ora: 5.4.1 + rxjs: 6.6.7 + transitivePeerDependencies: + - chokidar + + /@angular-devkit/schematics@13.3.6(chokidar@3.5.3): + resolution: {integrity: sha512-yLh5xc92C/FiaAp27coPiKWpSUmwoXF7vMxbJYJTyOXlt0mUITAEAwtrZQNr4yAxW/yvgTdyg7PhXaveQNTUuQ==} + engines: {node: ^12.20.0 || ^14.15.0 || >=16.10.0, npm: ^6.11.0 || ^7.5.6 || >=8.0.0, yarn: '>= 1.13.0'} + dependencies: + '@angular-devkit/core': 13.3.6(chokidar@3.5.3) + jsonc-parser: 3.0.0 + magic-string: 0.25.7 + ora: 5.4.1 + rxjs: 6.6.7 + transitivePeerDependencies: + - chokidar + + /@aries-framework/core@0.1.0: + resolution: {integrity: sha512-NwlPgDKh7f6N0wVB6SvDh7Vr2nZJKGR4+v+8OJCB/Wx7sIAfL8MyLCMEhxkdRF+uIB1QjTzHQ2k9ID0K/NNQQQ==} + dependencies: + '@multiformats/base-x': 4.0.1 + '@types/indy-sdk': 1.16.28 + '@types/node-fetch': 2.6.6 + '@types/ws': 7.4.7 + abort-controller: 3.0.0 + bn.js: 5.2.1 + borc: 3.0.0 + buffer: 6.0.3 + class-transformer: 0.5.1 + class-validator: 0.13.1 + js-sha256: 0.9.0 + lru_map: 0.4.1 + luxon: 1.28.1 + make-error: 1.3.6 + multibase: 4.0.6 + multihashes: 4.0.3 + object-inspect: 1.12.3 + query-string: 7.1.3 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + tsyringe: 4.8.0 + uuid: 8.3.2 + dev: false + + /@aries-framework/node@0.1.0: + resolution: {integrity: sha512-ejqmIiTiIOo1xCH826ZHOUtIUB9ysvHZQuXgNc6FNqnmN2p50Z+xBJEtzz8qD4GJ1E4v3woXUG1FE8IOOQKf9A==} + hasBin: true + dependencies: + '@aries-framework/core': 0.1.0 + express: 4.18.2 + indy-sdk: 1.16.0-dev-1655 + node-fetch: 2.7.0 + ws: 7.5.9 + transitivePeerDependencies: + - bluebird + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@aries-framework/rest@0.8.0: + resolution: {integrity: sha512-jOgyY3+J6g3oSwLV5w/KZCijIE8jywqiew8aPiYVIYUJ9y3hSjqHiUKEorj3bO6DBho3YvZJ8c19KBzn67uchQ==} + hasBin: true + dependencies: + '@aries-framework/core': 0.1.0 + '@aries-framework/node': 0.1.0 + class-transformer: 0.5.1 + class-validator: 0.13.1 + class-validator-jsonschema: 3.1.1(class-transformer@0.5.1)(class-validator@0.13.1) + cors: 2.8.5 + express: 4.18.2 + node-fetch: 2.7.0 + reflect-metadata: 0.1.13 + routing-controllers: 0.9.0(class-transformer@0.5.1)(class-validator@0.13.2) + routing-controllers-openapi: 3.1.0(routing-controllers@0.9.0) + swagger-ui-express: 4.6.3(express@4.18.2) + tslog: 3.3.4 + typedi: 0.10.0 + yargs: 17.7.2 + transitivePeerDependencies: + - bluebird + - bufferutil + - encoding + - supports-color + - utf-8-validate + dev: false + + /@babel/code-frame@7.22.13: + resolution: {integrity: sha512-XktuhWlJ5g+3TJXc5upd9Ks1HutSArik6jf2eAjYFyIOf4ej3RN+184cZbzDvbPnuTJIUhPKKJE3cIsYTiAT3w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/highlight': 7.22.20 + chalk: 2.4.2 + + /@babel/compat-data@7.22.20: + resolution: {integrity: sha512-BQYjKbpXjoXwFW5jGqiizJQQT/aC7pFm9Ok1OWssonuguICi264lbgMzRp2ZMmRSlfkX6DsWDDcsrctK8Rwfiw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/core@7.23.0: + resolution: {integrity: sha512-97z/ju/Jy1rZmDxybphrBuI+jtJjFVoz7Mr9yUQVVVi+DNZE333uFQeMOqcCIy1x3WYBIbWftUSLmbNXNT7qFQ==} + engines: {node: '>=6.9.0'} + dependencies: + '@ampproject/remapping': 2.2.1 + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-compilation-targets': 7.22.15 + '@babel/helper-module-transforms': 7.23.0(@babel/core@7.23.0) + '@babel/helpers': 7.23.1 + '@babel/parser': 7.23.0 + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + convert-source-map: 2.0.0 + debug: 4.3.4 + gensync: 1.0.0-beta.2 + json5: 2.2.3 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/generator@7.23.0: + resolution: {integrity: sha512-lN85QRR+5IbYrMWM6Y4pE/noaQtg4pNiqeNGX60eqOfo6gtEj6uw/JagelB8vVztSd7R6M5n1+PQkDbHbBRU4g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + jsesc: 2.5.2 + dev: true + + /@babel/helper-compilation-targets@7.22.15: + resolution: {integrity: sha512-y6EEzULok0Qvz8yyLkCvVX+02ic+By2UdOhylwUOvOn9dvYc9mKICJuuU1n1XBI02YWsNsnrY1kc6DVbjcXbtw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/compat-data': 7.22.20 + '@babel/helper-validator-option': 7.22.15 + browserslist: 4.22.1 + lru-cache: 5.1.1 + semver: 6.3.1 + dev: true + + /@babel/helper-environment-visitor@7.22.20: + resolution: {integrity: sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-function-name@7.23.0: + resolution: {integrity: sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-hoist-variables@7.22.5: + resolution: {integrity: sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-imports@7.22.15: + resolution: {integrity: sha512-0pYVBnDKZO2fnSPCrgM/6WMc7eS20Fbok+0r88fp+YtWVLZrp4CkafFGIp+W0VKw4a22sgebPT99y+FDNMdP4w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-module-transforms@7.23.0(@babel/core@7.23.0): + resolution: {integrity: sha512-WhDWw1tdrlT0gMgUJSlX0IQvoO1eN279zrAUbVB+KpV2c3Tylz8+GnKOLllCS6Z/iZQEyVYxhZVUdPTqs2YYPw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-module-imports': 7.22.15 + '@babel/helper-simple-access': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/helper-validator-identifier': 7.22.20 + dev: true + + /@babel/helper-plugin-utils@7.22.5: + resolution: {integrity: sha512-uLls06UVKgFG9QD4OeFYLEGteMIAa5kpTPcFL28yuCIIzsf6ZyKZMllKVOCZFhiZ5ptnwX4mtKdWCBE/uT4amg==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-simple-access@7.22.5: + resolution: {integrity: sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-split-export-declaration@7.22.6: + resolution: {integrity: sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/helper-string-parser@7.22.5: + resolution: {integrity: sha512-mM4COjgZox8U+JcXQwPijIZLElkgEpO5rsERVDJTc2qfCDfERyob6k5WegS14SX18IIjv+XD+GrqNumY5JRCDw==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helper-validator-identifier@7.22.20: + resolution: {integrity: sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==} + engines: {node: '>=6.9.0'} + + /@babel/helper-validator-option@7.22.15: + resolution: {integrity: sha512-bMn7RmyFjY/mdECUbgn9eoSY4vqvacUnS9i9vGAGttgFWesO6B4CYWA7XlpbWgBt71iv/hfbPlynohStqnu5hA==} + engines: {node: '>=6.9.0'} + dev: true + + /@babel/helpers@7.23.1: + resolution: {integrity: sha512-chNpneuK18yW5Oxsr+t553UZzzAs3aZnFm4bxhebsNTeshrC95yA7l5yl7GBAG+JG1rF0F7zzD2EixK9mWSDoA==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/template': 7.22.15 + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/highlight@7.22.20: + resolution: {integrity: sha512-dkdMCN3py0+ksCgYmGG8jKeGA/8Tk+gJwSYYlFGxG5lmhfKNoAy004YpLxpS1W2J8m/EK2Ew+yOs9pVRwO89mg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-validator-identifier': 7.22.20 + chalk: 2.4.2 + js-tokens: 4.0.0 + + /@babel/parser@7.23.0: + resolution: {integrity: sha512-vvPKKdMemU85V9WE/l5wZEmImpCtLqbnTvqDS2U1fJ96KrxoW7KrXhNsNCblQlg8Ck4b85yxdTyelsMUgFUXiw==} + engines: {node: '>=6.0.0'} + hasBin: true + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@babel/plugin-syntax-async-generators@7.8.4(@babel/core@7.23.0): + resolution: {integrity: sha512-tycmZxkGfZaxhMRbXlPXuVFpdWlXpir2W4AMhSJgRKzk/eDlIXOhb2LHWoLpDF7TEHylV5zNhykX6KAgHJmTNw==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-bigint@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-wnTnFlG+YxQm3vDxpGE57Pj0srRU4sHE/mDkt1qv2YJJSeUAec2ma4WLUnUPeKjyrfntVwe/N6dCXpU+zL3Npg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-class-properties@7.12.13(@babel/core@7.23.0): + resolution: {integrity: sha512-fm4idjKla0YahUNgFNLCB0qySdsoPiZP3iQE3rky0mBUtMZ23yDJ9SJdg6dXTSDnulOVqiF3Hgr9nbXvXTQZYA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-import-meta@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-Yqfm+XDx0+Prh3VSeEQCPU81yC+JWZ2pDPFSS4ZdpfZhp4MkFMaDC1UqseovEKwSUpnIL7+vK+Clp7bfh0iD7g==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-json-strings@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-lY6kdGpWHvjoe2vk4WrAapEuBR69EMxZl+RoGRhrFGNYVK8mOPAW8VfbT/ZgrFbXlDNiiaxQnAtgVCZ6jv30EA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-logical-assignment-operators@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-d8waShlpFDinQ5MtvGU9xDAOzKH47+FFoney2baFIoMr952hKOLp1HR7VszoZvOsV/4+RRszNY7D17ba0te0ig==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-nullish-coalescing-operator@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-aSff4zPII1u2QD7y+F8oDsz19ew4IGEJg9SVW+bqwpwtfFleiQDMdzA/R+UlWDzfnHFCxxleFT0PMIrR36XLNQ==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-numeric-separator@7.10.4(@babel/core@7.23.0): + resolution: {integrity: sha512-9H6YdfkcK/uOnY/K7/aA2xpzaAgkQn37yzWUMRK7OaPOqOpGS1+n0H5hxT9AUw9EsSjPW8SVyMJwYRtWs3X3ug==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-object-rest-spread@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-XoqMijGZb9y3y2XskN+P1wUGiVwWZ5JmoDRwx5+3GmEplNyVM2s2Dg8ILFQm8rWM48orGy5YpI5Bl8U1y7ydlA==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-catch-binding@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-6VPD0Pc1lpTqw0aKoeRTMiB+kWhAoT24PA+ksWSBrFtl5SIRVpZlwN3NNPQjehA2E/91FV3RjLWoVTglWcSV3Q==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-optional-chaining@7.8.3(@babel/core@7.23.0): + resolution: {integrity: sha512-KoK9ErH1MBlCPxV0VANkXW2/dw4vlbGDrFgz8bmUsBGYkFRcbRwMh6cIJubdPrkxRwuGdtCk0v/wPTKbQgBjkg==} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-top-level-await@7.14.5(@babel/core@7.23.0): + resolution: {integrity: sha512-hx++upLv5U1rgYfwe1xBQUhRmU41NEvpUvrp8jkrSCdvGSnM5/qdRMtylJ6PG5OFkBaHkbTAKTnd3/YyESRHFw==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/plugin-syntax-typescript@7.22.5(@babel/core@7.23.0): + resolution: {integrity: sha512-1mS2o03i7t1c6VzH6fdQ3OA8tcEIxwG18zIPRp+UY1Ihv6W+XZzBCVxExF9upussPXJ0xE9XRHwMoNs1ep/nRQ==} + engines: {node: '>=6.9.0'} + peerDependencies: + '@babel/core': ^7.0.0-0 + dependencies: + '@babel/core': 7.23.0 + '@babel/helper-plugin-utils': 7.22.5 + dev: true + + /@babel/template@7.22.15: + resolution: {integrity: sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: true + + /@babel/traverse@7.23.0: + resolution: {integrity: sha512-t/QaEvyIoIkwzpiZ7aoSKK8kObQYeF7T2v+dazAYCb8SXtp58zEVkWW7zAnju8FNKNdr4ScAOEDmMItbyOmEYw==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/code-frame': 7.22.13 + '@babel/generator': 7.23.0 + '@babel/helper-environment-visitor': 7.22.20 + '@babel/helper-function-name': 7.23.0 + '@babel/helper-hoist-variables': 7.22.5 + '@babel/helper-split-export-declaration': 7.22.6 + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + debug: 4.3.4 + globals: 11.12.0 + transitivePeerDependencies: + - supports-color + dev: true + + /@babel/types@7.23.0: + resolution: {integrity: sha512-0oIyUfKoI3mSqMvsxBdclDwxXKXAUA8v/apZbc+iSyARYou1o8ZGDxbUYyLFoW2arqS2jDGqJuZvv1d/io1axg==} + engines: {node: '>=6.9.0'} + dependencies: + '@babel/helper-string-parser': 7.22.5 + '@babel/helper-validator-identifier': 7.22.20 + to-fast-properties: 2.0.0 + dev: true + + /@bcoe/v8-coverage@0.2.3: + resolution: {integrity: sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw==} + dev: true + + /@colors/colors@1.5.0: + resolution: {integrity: sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==} + engines: {node: '>=0.1.90'} + + /@cspotcode/source-map-support@0.8.1: + resolution: {integrity: sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==} + engines: {node: '>=12'} + dependencies: + '@jridgewell/trace-mapping': 0.3.9 + dev: true + + /@dabh/diagnostics@2.0.3: + resolution: {integrity: sha512-hrlQOIi7hAfzsMqlGSFyVucrx38O+j6wiGOf//H2ecvIEqYN4ADBSS2iLMh5UFyDunCNniUIPk/q3riFv45xRA==} + dependencies: + colorspace: 1.1.4 + enabled: 2.0.0 + kuler: 2.0.0 + dev: false + + /@elastic/ecs-helpers@1.1.0: + resolution: {integrity: sha512-MDLb2aFeGjg46O5mLpdCzT5yOUDnXToJSrco2ShqGIXxNJaM8uJjX+4nd+hRYV4Vex8YJyDtOFEVBldQct6ndg==} + engines: {node: '>=10'} + dependencies: + fast-json-stringify: 2.7.13 + dev: false + + /@elastic/ecs-pino-format@1.3.0: + resolution: {integrity: sha512-U8D57gPECYoRCcwREsrXKBtqeyFFF/KAwHi4rG1u/oQhAg91Kzw8ZtUQJXD/DMDieLOqtbItFr2FRBWI3t3wog==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + '@elastic/ecs-helpers': 1.1.0 + dev: false + optional: true + + /@elastic/ecs-winston-format@1.3.1: + resolution: {integrity: sha512-cbDaTU6zUXNpAZSJoLUgNqB0kq2YZ1hmDePVdKrJmw7OBDbzUUMfaK+7S21yFpln/tUF4KRSSPbSwEBgtTLp7Q==} + engines: {node: '>=10'} + dependencies: + '@elastic/ecs-helpers': 1.1.0 + dev: false + + /@elastic/elasticsearch@7.17.13: + resolution: {integrity: sha512-GMXtFVqd3FgUlTtPL/GDc+3GhwvfZ0kSuegCvVVqb58kd+0I6U6u7PL8QFRLHtwzqLEBmYLdwr4PRkBAWKGlzA==} + engines: {node: '>=12'} + dependencies: + debug: 4.3.4 + hpagent: 0.1.2 + ms: 2.1.3 + secure-json-parse: 2.7.0 + transitivePeerDependencies: + - supports-color + dev: false + + /@eslint-community/eslint-utils@4.4.0(eslint@8.50.0): + resolution: {integrity: sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || >=8.0.0 + dependencies: + eslint: 8.50.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@eslint-community/regexpp@4.9.1: + resolution: {integrity: sha512-Y27x+MBLjXa+0JWDhykM3+JE+il3kHKAEqabfEWq3SDhZjLYb6/BHL/JKFnH3fe207JaXkyDo685Oc2Glt6ifA==} + engines: {node: ^12.0.0 || ^14.0.0 || >=16.0.0} + dev: true + + /@eslint/eslintrc@2.1.2: + resolution: {integrity: sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + ajv: 6.12.6 + debug: 4.3.4 + espree: 9.6.1 + globals: 13.23.0 + ignore: 5.2.4 + import-fresh: 3.3.0 + js-yaml: 4.1.0 + minimatch: 3.1.2 + strip-json-comments: 3.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@eslint/js@8.50.0: + resolution: {integrity: sha512-NCC3zz2+nvYd+Ckfh87rA47zfu2QsQpvc6k1yzTk+b9KzRj0wkGa8LSoGOXN6Zv4lRf/EIoZ80biDh9HOI+RNQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@gar/promisify@1.1.3: + resolution: {integrity: sha512-k2Ty1JcVojjJFwrg/ThKi2ujJ7XNLYaFGNB/bWT9wGR+oSMJHMa5w+CUq6p/pVrKeNNgA7pCqEcjSnHVoqJQFw==} + dev: false + + /@hapi/boom@10.0.1: + resolution: {integrity: sha512-ERcCZaEjdH3OgSJlyjVk8pHIFeus91CjKP3v+MpgBNp5IvGzP2l/bRiD78nqYcKPaZdbKkK5vDBVPd2ohHBlsA==} + dependencies: + '@hapi/hoek': 11.0.2 + dev: false + + /@hapi/bourne@3.0.0: + resolution: {integrity: sha512-Waj1cwPXJDucOib4a3bAISsKJVb15MKi9IvmTI/7ssVEm6sywXGjVJDhl6/umt1pK1ZS7PacXU3A1PmFKHEZ2w==} + dev: false + + /@hapi/hoek@10.0.1: + resolution: {integrity: sha512-CvlW7jmOhWzuqOqiJQ3rQVLMcREh0eel4IBnxDx2FAcK8g7qoJRQK4L1CPBASoCY6y8e6zuCy3f2g+HWdkzcMw==} + dev: false + + /@hapi/hoek@11.0.2: + resolution: {integrity: sha512-aKmlCO57XFZ26wso4rJsW4oTUnrgTFw2jh3io7CAtO9w4UltBNwRXvXIVzzyfkaaLRo3nluP/19msA8vDUUuKw==} + dev: false + + /@hapi/hoek@9.3.0: + resolution: {integrity: sha512-/c6rf4UJlmHlC9b5BaNvzAcFv7HZ2QHaV0D4/HNlBdvFnvQq8RI4kYdhyPCl7Xj+oWvTWQ8ujhqS53LIgAe6KQ==} + dev: false + + /@hapi/topo@5.1.0: + resolution: {integrity: sha512-foQZKJig7Ob0BMAYBfcJk8d77QtOe7Wo4ox7ff1lQYoNNAb6jwcY1ncdoy2e9wQZzvNy7ODZCYJkK8kzmcAnAg==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: false + + /@hapi/wreck@18.0.1: + resolution: {integrity: sha512-OLHER70+rZxvDl75xq3xXOfd3e8XIvz8fWY0dqg92UvhZ29zo24vQgfqgHSYhB5ZiuFpSLeriOisAlxAo/1jWg==} + dependencies: + '@hapi/boom': 10.0.1 + '@hapi/bourne': 3.0.0 + '@hapi/hoek': 11.0.2 + dev: false + + /@humanwhocodes/config-array@0.11.11: + resolution: {integrity: sha512-N2brEuAadi0CcdeMXUkhbZB84eskAc8MEX1By6qEchoVywSgXPIjou4rYsl0V3Hj0ZnuGycGCjdNgockbzeWNA==} + engines: {node: '>=10.10.0'} + dependencies: + '@humanwhocodes/object-schema': 1.2.1 + debug: 4.3.4 + minimatch: 3.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /@humanwhocodes/module-importer@1.0.1: + resolution: {integrity: sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==} + engines: {node: '>=12.22'} + dev: true + + /@humanwhocodes/object-schema@1.2.1: + resolution: {integrity: sha512-ZnQMnLV4e7hDlUvw8H+U8ASL02SS2Gn6+9Ac3wGGLIe7+je2AeAOxPY+izIPJDfFDb7eDjev0Us8MO1iFRN8hA==} + dev: true + + /@istanbuljs/load-nyc-config@1.1.0: + resolution: {integrity: sha512-VjeHSlIzpv/NyD3N0YuHfXOPDIixcA1q2ZV98wsMqcYlPmv2n3Yb2lYP9XMElnaFVXg5A7YLTeLu6V84uQDjmQ==} + engines: {node: '>=8'} + dependencies: + camelcase: 5.3.1 + find-up: 4.1.0 + get-package-type: 0.1.0 + js-yaml: 3.14.1 + resolve-from: 5.0.0 + dev: true + + /@istanbuljs/schema@0.1.3: + resolution: {integrity: sha512-ZXRY4jNvVgSVQ8DL3LTcakaAtXwTVUxE81hslsyD2AtoXW/wVob10HkOJ1X/pAlcI7D+2YoZKg5do8G/w6RYgA==} + engines: {node: '>=8'} + dev: true + + /@jest/console@27.5.1: + resolution: {integrity: sha512-kZ/tNpS3NXn0mlXXXPNuDZnb4c0oZ20r4K5eemM2k30ZC3G0T02nXUvyhf5YdbXWHPEJLc9qGLxEZ216MdL+Zg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + chalk: 4.1.2 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + dev: true + + /@jest/core@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-AK6/UTrvQD0Cd24NSqmIA6rKsu0tKIxfiCducZvqxYdmMisOYAsdItspT+fQDQYARPf8XgjAFZi0ogW2agH5nQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/console': 27.5.1 + '@jest/reporters': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + emittery: 0.8.1 + exit: 0.1.2 + graceful-fs: 4.2.11 + jest-changed-files: 27.5.1 + jest-config: 27.5.1(ts-node@10.9.1) + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-resolve-dependencies: 27.5.1 + jest-runner: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + jest-watcher: 27.5.1 + micromatch: 4.0.5 + rimraf: 3.0.2 + slash: 3.0.0 + strip-ansi: 6.0.1 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /@jest/environment@27.5.1: + resolution: {integrity: sha512-/WQjhPJe3/ghaol/4Bq480JKXV/Rfw8nQdN7f41fM8VDHLcxKXou6QyXAh3EFr9/bVG3x74z1NWDkP87EiY8gA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + jest-mock: 27.5.1 + dev: true + + /@jest/fake-timers@27.5.1: + resolution: {integrity: sha512-/aPowoolwa07k7/oM3aASneNeBGCmGQsc3ugN4u6s4C/+s5M64MFo/+djTdiwcbQlRfFElGuDXWzaWj6QgKObQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@sinonjs/fake-timers': 8.1.0 + '@types/node': 16.18.57 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /@jest/globals@27.5.1: + resolution: {integrity: sha512-ZEJNB41OBQQgGzgyInAv0UUfDDj3upmHydjieSxFvTRuZElrx7tXg/uVQ5hYVEwiXs3+aMsAeEc9X7xiSKCm4Q==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/types': 27.5.1 + expect: 27.5.1 + dev: true + + /@jest/reporters@27.5.1: + resolution: {integrity: sha512-cPXh9hWIlVJMQkVk84aIvXuBB4uQQmFqZiacloFuGiP3ah1sbCxCosidXFDfqG8+6fO1oR2dTJTlsOy4VFmUfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@bcoe/v8-coverage': 0.2.3 + '@jest/console': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + chalk: 4.1.2 + collect-v8-coverage: 1.0.2 + exit: 0.1.2 + glob: 7.2.3 + graceful-fs: 4.2.11 + istanbul-lib-coverage: 3.2.0 + istanbul-lib-instrument: 5.2.1 + istanbul-lib-report: 3.0.1 + istanbul-lib-source-maps: 4.0.1 + istanbul-reports: 3.1.6 + jest-haste-map: 27.5.1 + jest-resolve: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + slash: 3.0.0 + source-map: 0.6.1 + string-length: 4.0.2 + terminal-link: 2.1.1 + v8-to-istanbul: 8.1.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/source-map@27.5.1: + resolution: {integrity: sha512-y9NIHUYF3PJRlHk98NdC/N1gl88BL08aQQgu4k4ZopQkCw9t9cV8mtl3TV8b/YCB8XaVTFrmUTAJvjsntDireg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + callsites: 3.1.0 + graceful-fs: 4.2.11 + source-map: 0.6.1 + dev: true + + /@jest/test-result@27.5.1: + resolution: {integrity: sha512-EW35l2RYFUcUQxFJz5Cv5MTOxlJIQs4I7gxzi2zVU7PJhOwfYq1MdC5nhSmYjX1gmMmLPvB3sIaC+BkcHRBfag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/types': 27.5.1 + '@types/istanbul-lib-coverage': 2.0.4 + collect-v8-coverage: 1.0.2 + dev: true + + /@jest/test-sequencer@27.5.1: + resolution: {integrity: sha512-LCheJF7WB2+9JuCS7VB/EmGIdQuhtqjRNI9A43idHv3E4KltCTsPsLxvdaubFHSYwY/fNjMWjl6vNRhDiN7vpQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-runtime: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/transform@27.5.1: + resolution: {integrity: sha512-ipON6WtYgl/1329g5AIJVbUuEh0wZVbdpGwC99Jw4LwuoBNS95MVphU6zOeD9pDkon+LLbFL7lOQRapbB8SCHw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.23.0 + '@jest/types': 27.5.1 + babel-plugin-istanbul: 6.1.1 + chalk: 4.1.2 + convert-source-map: 1.9.0 + fast-json-stable-stringify: 2.1.0 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-regex-util: 27.5.1 + jest-util: 27.5.1 + micromatch: 4.0.5 + pirates: 4.0.6 + slash: 3.0.0 + source-map: 0.6.1 + write-file-atomic: 3.0.3 + transitivePeerDependencies: + - supports-color + dev: true + + /@jest/types@27.5.1: + resolution: {integrity: sha512-Cx46iJ9QpwQTjIdq5VJu2QTMMs3QlEjI0x1QbBP5W1+nMzyc2XmimiRR/CbX9TO0cPTeUlxWMOu8mslYsJ8DEw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + '@types/istanbul-reports': 3.0.2 + '@types/node': 16.18.57 + '@types/yargs': 16.0.6 + chalk: 4.1.2 + dev: true + + /@jridgewell/gen-mapping@0.3.3: + resolution: {integrity: sha512-HLhSWOLRi875zjjMG/r+Nv0oCW8umGb0BgEhyX3dDX3egwZtB8PqLnjz3yedt8R5StBrzcg4aBpnh8UA9D1BoQ==} + engines: {node: '>=6.0.0'} + dependencies: + '@jridgewell/set-array': 1.1.2 + '@jridgewell/sourcemap-codec': 1.4.15 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/resolve-uri@3.1.1: + resolution: {integrity: sha512-dSYZh7HhCDtCKm4QakX0xFpsRDqjjtZf/kjI/v3T3Nwt5r8/qz/M19F9ySyOqU94SXBmeG9ttTul+YnR4LOxFA==} + engines: {node: '>=6.0.0'} + + /@jridgewell/set-array@1.1.2: + resolution: {integrity: sha512-xnkseuNADM0gt2bs+BvhO0p78Mk762YnZdsuzFV018NoG1Sj1SCQvpSqa7XUaTam5vAGasABV9qXASMKnFMwMw==} + engines: {node: '>=6.0.0'} + + /@jridgewell/source-map@0.3.5: + resolution: {integrity: sha512-UTYAUj/wviwdsMfzoSJspJxbkH5o1snzwX0//0ENX1u/55kkZZkcTZP6u9bwKGkv+dkk9at4m1Cpt0uY80kcpQ==} + dependencies: + '@jridgewell/gen-mapping': 0.3.3 + '@jridgewell/trace-mapping': 0.3.19 + + /@jridgewell/sourcemap-codec@1.4.15: + resolution: {integrity: sha512-eF2rxCRulEKXHTRiDrDy6erMYWqNw4LPdQ8UQA4huuxaQsVeRPFl2oM8oDGxMFhJUWZf9McpLtJasDDZb/Bpeg==} + + /@jridgewell/trace-mapping@0.3.19: + resolution: {integrity: sha512-kf37QtfW+Hwx/buWGMPcR60iF9ziHa6r/CZJIHbmcm4+0qrXiVdxegAH0F6yddEVQ7zdkjcGCgCzUu+BcbhQxw==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + + /@jridgewell/trace-mapping@0.3.9: + resolution: {integrity: sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==} + dependencies: + '@jridgewell/resolve-uri': 3.1.1 + '@jridgewell/sourcemap-codec': 1.4.15 + dev: true + + /@multiformats/base-x@4.0.1: + resolution: {integrity: sha512-eMk0b9ReBbV23xXU693TAIrLyeO5iTgBZGSJfpqriG8UkYvr/hC9u9pyMlAakDNHWmbhMZCDs6KQO0jzKD8OTw==} + dev: false + + /@nestjs/axios@0.0.5(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-kpgCX6JAXcntj+4fk5Sk7Nu6HXvyOKyhRgnuaIQpwbcdthrPfOBVmJo+ZJf2bbSze+YaoodeH9Fe1WkSiN1xrg==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^6.0.0 || ^7.0.0 + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + axios: 0.25.0 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + transitivePeerDependencies: + - debug + dev: false + + /@nestjs/cli@8.2.8: + resolution: {integrity: sha512-y5Imcw1EY0OxD3POAM7SLUB1rFdn5FjbfSsyJrokjKmXY+i6KcBdbRrv3Ox7aeJ4W7wXuckIXZEUlK6lC52dnA==} + engines: {node: '>= 10.13.0', npm: '>= 6.11.0'} + hasBin: true + dependencies: + '@angular-devkit/core': 13.3.6(chokidar@3.5.3) + '@angular-devkit/schematics': 13.3.6(chokidar@3.5.3) + '@angular-devkit/schematics-cli': 13.3.6(chokidar@3.5.3) + '@nestjs/schematics': 8.0.11(chokidar@3.5.3)(typescript@4.7.4) + chalk: 3.0.0 + chokidar: 3.5.3 + cli-table3: 0.6.2 + commander: 4.1.1 + fork-ts-checker-webpack-plugin: 7.2.11(typescript@4.7.4)(webpack@5.73.0) + inquirer: 7.3.3 + node-emoji: 1.11.0 + ora: 5.4.1 + os-name: 4.0.1 + rimraf: 3.0.2 + shelljs: 0.8.5 + source-map-support: 0.5.21 + tree-kill: 1.2.2 + tsconfig-paths: 3.14.1 + tsconfig-paths-webpack-plugin: 3.5.2 + typescript: 4.7.4 + webpack: 5.73.0 + webpack-node-externals: 3.0.0 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + - vue-template-compiler + - webpack-cli + + /@nestjs/common@8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-m/YsbcBal+gA5CFrDpqXqsSfylo+DIQrkFY3qhVIltsYRfu8ct8J9pqsTO6OPf3mvqdOpFGrV5sBjoyAzOBvsw==} + peerDependencies: + cache-manager: '*' + class-transformer: '*' + class-validator: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + cache-manager: + optional: true + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + axios: 0.27.2 + class-transformer: 0.5.1 + class-validator: 0.13.2 + iterare: 1.2.1 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + tslib: 2.4.0 + uuid: 8.3.2 + transitivePeerDependencies: + - debug + + /@nestjs/config@1.2.1(@nestjs/common@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-EgaGTXvG4unD5lGWmdSrUFrkGpX32lQGE/8qS60EnL82sIZV7HT1ZL7ib5S86P1nB+DnFDbDhDqTaZ3mivTyOg==} + peerDependencies: + '@nestjs/common': ^7.0.0 || ^8.0.0 + reflect-metadata: ^0.1.13 + rxjs: ^6.0.0 || ^7.2.0 + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + dotenv: 16.0.0 + dotenv-expand: 5.1.0 + lodash: 4.17.21 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + uuid: 8.3.2 + dev: false + + /@nestjs/core@8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-XB9uexHqzr2xkPo6QSiQWJJttyYYLmvQ5My64cFvWFi7Wk2NIus0/xUNInwX3kmFWB6pF1ab5Y2ZBvWdPwGBhw==} + requiresBuild: true + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/microservices': ^8.0.0 + '@nestjs/platform-express': ^8.0.0 + '@nestjs/websockets': ^8.0.0 + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + '@nestjs/websockets': + optional: true + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/microservices': 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(nats@2.17.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-express': 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7) + '@nuxtjs/opencollective': 0.3.2 + fast-safe-stringify: 2.1.1 + iterare: 1.2.1 + object-hash: 3.0.0 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + tslib: 2.4.0 + uuid: 8.3.2 + transitivePeerDependencies: + - encoding + + /@nestjs/mapped-types@1.0.1(@nestjs/common@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-NFvofzSinp00j5rzUd4tf+xi9od6383iY0JP7o0Bnu1fuItAUkWBgc4EKuIQ3D+c2QI3i9pG1kDWAeY27EMGtg==} + peerDependencies: + '@nestjs/common': ^7.0.8 || ^8.0.0 + class-transformer: ^0.2.0 || ^0.3.0 || ^0.4.0 || ^0.5.0 + class-validator: ^0.11.1 || ^0.12.0 || ^0.13.0 + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + class-transformer: 0.5.1 + class-validator: 0.13.2 + reflect-metadata: 0.1.13 + dev: false + + /@nestjs/mapped-types@2.0.2(@nestjs/common@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-V0izw6tWs6fTp9+KiiPUbGHWALy563Frn8X6Bm87ANLRuE46iuBMD5acKBDP5lKL/75QFvrzSJT7HkCbB0jTpg==} + peerDependencies: + '@nestjs/common': ^8.0.0 || ^9.0.0 || ^10.0.0 + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.0 || ^0.14.0 + reflect-metadata: ^0.1.12 + peerDependenciesMeta: + class-transformer: + optional: true + class-validator: + optional: true + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + class-transformer: 0.5.1 + class-validator: 0.13.2 + reflect-metadata: 0.1.13 + dev: false + + /@nestjs/microservices@8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(nats@2.17.0)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-JZX29tBWbbPa+Q06QcCbwKTyEsOFHAPrxgfEkRNwoaiEqqCsITT9w2n5bcz3vlUurdpy5dIgX3/almbitghbKg==} + peerDependencies: + '@grpc/grpc-js': '*' + '@nestjs/common': ^8.0.0 + '@nestjs/core': ^8.0.0 + '@nestjs/websockets': ^8.0.0 + amqp-connection-manager: '*' + amqplib: '*' + cache-manager: '*' + kafkajs: '*' + mqtt: '*' + nats: '*' + redis: '*' + reflect-metadata: ^0.1.12 + rxjs: ^7.1.0 + peerDependenciesMeta: + '@grpc/grpc-js': + optional: true + '@nestjs/websockets': + optional: true + amqp-connection-manager: + optional: true + amqplib: + optional: true + cache-manager: + optional: true + kafkajs: + optional: true + mqtt: + optional: true + nats: + optional: true + redis: + optional: true + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + iterare: 1.2.1 + nats: 2.17.0 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + tslib: 2.4.0 + + /@nestjs/platform-express@8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7): + resolution: {integrity: sha512-lPE5Ltg2NbQGRQIwXWY+4cNrXhJdycbxFDQ8mNxSIuv+LbrJBIdEB/NONk+LLn9N/8d2+I2LsIETGQrPvsejBg==} + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/core': ^8.0.0 + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + body-parser: 1.20.0 + cors: 2.8.5 + express: 4.18.1 + multer: 1.4.4-lts.1 + tslib: 2.4.0 + transitivePeerDependencies: + - supports-color + + /@nestjs/schedule@1.1.0(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(reflect-metadata@0.1.13): + resolution: {integrity: sha512-0QpbwClUildXqlyoaygG+aIQZNNMv31XDyQxX+Ob1zw/3I8+AVrDlBwZHQ+tlhIcJFR8aG+VTH8xwIjXwtS1UA==} + peerDependencies: + '@nestjs/common': ^6.10.11 || ^7.0.0 || ^8.0.0 + '@nestjs/core': ^7.0.0 || ^8.0.0 + reflect-metadata: ^0.1.12 + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + cron: 1.8.2 + reflect-metadata: 0.1.13 + uuid: 8.3.2 + dev: false + + /@nestjs/schematics@8.0.11(chokidar@3.5.3)(typescript@4.7.4): + resolution: {integrity: sha512-W/WzaxgH5aE01AiIErE9QrQJ73VR/M/8p8pq0LZmjmNcjZqU5kQyOWUxZg13WYfSpJdOa62t6TZRtFDmgZPoIg==} + peerDependencies: + typescript: ^3.4.5 || ^4.3.5 + dependencies: + '@angular-devkit/core': 13.3.5(chokidar@3.5.3) + '@angular-devkit/schematics': 13.3.5(chokidar@3.5.3) + fs-extra: 10.1.0 + jsonc-parser: 3.0.0 + pluralize: 8.0.0 + typescript: 4.7.4 + transitivePeerDependencies: + - chokidar + + /@nestjs/schematics@8.0.11(typescript@4.9.5): + resolution: {integrity: sha512-W/WzaxgH5aE01AiIErE9QrQJ73VR/M/8p8pq0LZmjmNcjZqU5kQyOWUxZg13WYfSpJdOa62t6TZRtFDmgZPoIg==} + peerDependencies: + typescript: ^3.4.5 || ^4.3.5 + dependencies: + '@angular-devkit/core': 13.3.5(chokidar@3.5.3) + '@angular-devkit/schematics': 13.3.5(chokidar@3.5.3) + fs-extra: 10.1.0 + jsonc-parser: 3.0.0 + pluralize: 8.0.0 + typescript: 4.9.5 + transitivePeerDependencies: + - chokidar + + /@nestjs/swagger@5.2.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(swagger-ui-express@4.6.3): + resolution: {integrity: sha512-7dNa08WCnTsW/oAk3Ujde+z64JMfNm19DhpXasFR8oJp/9pggYAbYU927HpA+GJsSFJX6adjIRZsCKUqaGWznw==} + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/core': ^8.0.0 + fastify-swagger: '*' + reflect-metadata: ^0.1.12 + swagger-ui-express: '*' + peerDependenciesMeta: + fastify-swagger: + optional: true + swagger-ui-express: + optional: true + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/mapped-types': 1.0.1(@nestjs/common@8.4.7)(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13) + lodash: 4.17.21 + path-to-regexp: 3.2.0 + reflect-metadata: 0.1.13 + swagger-ui-express: 4.6.3(express@4.18.2) + transitivePeerDependencies: + - class-transformer + - class-validator + dev: false + + /@nestjs/terminus@8.1.1(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1): + resolution: {integrity: sha512-C+Pm1LZse8ZSfXeZXMTmUIGAmDpov1WRury/cyWj50ceCCCWz7csACNouGBEvjDmBklzfbkxgDH9mOSbm1r54A==} + peerDependencies: + '@nestjs/common': 8.x + '@nestjs/core': 8.x + reflect-metadata: 0.1.x + rxjs: 7.x + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + check-disk-space: 3.3.0 + reflect-metadata: 0.1.13 + rxjs: 7.8.1 + dev: false + + /@nestjs/testing@8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7): + resolution: {integrity: sha512-aedpeJFicTBeiTCvJWUG45WMMS53f5eu8t2fXsfjsU1t+WdDJqYcZyrlCzA4dL1B7MfbqaTURdvuVVHTmJO8ag==} + peerDependencies: + '@nestjs/common': ^8.0.0 + '@nestjs/core': ^8.0.0 + '@nestjs/microservices': ^8.0.0 + '@nestjs/platform-express': ^8.0.0 + peerDependenciesMeta: + '@nestjs/microservices': + optional: true + '@nestjs/platform-express': + optional: true + dependencies: + '@nestjs/common': 8.4.7(class-transformer@0.5.1)(class-validator@0.13.2)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/core': 8.4.7(@nestjs/common@8.4.7)(@nestjs/microservices@8.4.7)(@nestjs/platform-express@8.4.7)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/microservices': 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7)(nats@2.17.0)(reflect-metadata@0.1.13)(rxjs@7.8.1) + '@nestjs/platform-express': 8.4.7(@nestjs/common@8.4.7)(@nestjs/core@8.4.7) + tslib: 2.4.0 + + /@nodelib/fs.scandir@2.1.5: + resolution: {integrity: sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + run-parallel: 1.2.0 + dev: true + + /@nodelib/fs.stat@2.0.5: + resolution: {integrity: sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==} + engines: {node: '>= 8'} + dev: true + + /@nodelib/fs.walk@1.2.8: + resolution: {integrity: sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==} + engines: {node: '>= 8'} + dependencies: + '@nodelib/fs.scandir': 2.1.5 + fastq: 1.15.0 + dev: true + + /@npmcli/fs@1.1.1: + resolution: {integrity: sha512-8KG5RD0GVP4ydEzRn/I4BNDuxDtqVbOdm8675T49OIG/NGhaK0pjPX7ZcDlvKYbA+ulvVK3ztfcF4uBdOxuJbQ==} + dependencies: + '@gar/promisify': 1.1.3 + semver: 7.5.4 + dev: false + + /@npmcli/move-file@1.1.2: + resolution: {integrity: sha512-1SUf/Cg2GzGDyaf15aR9St9TWlb+XvbZXWpDx8YKs7MLzMH/BCeopv+y9vzrzgkfykCGuWOlSu3mZhj2+FQcrg==} + engines: {node: '>=10'} + deprecated: This functionality has been moved to @npmcli/fs + dependencies: + mkdirp: 1.0.4 + rimraf: 3.0.2 + dev: false + + /@nuxtjs/opencollective@0.3.2: + resolution: {integrity: sha512-um0xL3fO7Mf4fDxcqx9KryrB7zgRM5JSlvGN5AGkP6JLM5XEKyjeAiPbNxdXVXQ16isuAhYpvP88NgL2BGd6aA==} + engines: {node: '>=8.0.0', npm: '>=5.0.0'} + hasBin: true + dependencies: + chalk: 4.1.2 + consola: 2.15.3 + node-fetch: 2.7.0 + transitivePeerDependencies: + - encoding + + /@opentelemetry/api@1.6.0: + resolution: {integrity: sha512-OWlrQAnWn9577PhVgqjUvMr1pg57Bc4jv0iL4w0PRuOSRvq67rvHW9Ie/dZVMvCzhSCB+UxhcY/PmCmFj33Q+g==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dev: false + optional: true + + /@opentelemetry/core@1.17.0(@opentelemetry/api@1.6.0): + resolution: {integrity: sha512-tfnl3h+UefCgx1aeN2xtrmr6BmdWGKXypk0pflQR0urFS40aE88trnkOMc2HTJZbMrqEEl4HsaBeFhwLVXsrJg==} + engines: {node: '>=14'} + requiresBuild: true + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.7.0' + dependencies: + '@opentelemetry/api': 1.6.0 + '@opentelemetry/semantic-conventions': 1.17.0 + dev: false + optional: true + + /@opentelemetry/resources@1.17.0(@opentelemetry/api@1.6.0): + resolution: {integrity: sha512-+u0ciVnj8lhuL/qGRBPeVYvk7fL+H/vOddfvmOeJaA1KC+5/3UED1c9KoZQlRsNT5Kw1FaK8LkY2NVLYfOVZQw==} + engines: {node: '>=14'} + requiresBuild: true + peerDependencies: + '@opentelemetry/api': '>=1.0.0 <1.7.0' + dependencies: + '@opentelemetry/api': 1.6.0 + '@opentelemetry/core': 1.17.0(@opentelemetry/api@1.6.0) + '@opentelemetry/semantic-conventions': 1.17.0 + dev: false + optional: true + + /@opentelemetry/sdk-metrics@1.17.0(@opentelemetry/api@1.6.0): + resolution: {integrity: sha512-HlWM27yGmYuwCoVRe3yg2PqKnIsq0kEF0HQgvkeDWz2NYkq9fFaSspR6kvjxUTbghAlZrabiqbgyKoYpYaXS3w==} + engines: {node: '>=14'} + requiresBuild: true + peerDependencies: + '@opentelemetry/api': '>=1.3.0 <1.7.0' + dependencies: + '@opentelemetry/api': 1.6.0 + '@opentelemetry/core': 1.17.0(@opentelemetry/api@1.6.0) + '@opentelemetry/resources': 1.17.0(@opentelemetry/api@1.6.0) + lodash.merge: 4.6.2 + dev: false + optional: true + + /@opentelemetry/semantic-conventions@1.17.0: + resolution: {integrity: sha512-+fguCd2d8d2qruk0H0DsCEy2CTK3t0Tugg7MhZ/UQMvmewbZLNnJ6heSYyzIZWG5IPfAXzoj4f4F/qpM7l4VBA==} + engines: {node: '>=14'} + requiresBuild: true + dev: false + optional: true + + /@prisma/client@3.15.2(prisma@3.15.2): + resolution: {integrity: sha512-ErqtwhX12ubPhU4d++30uFY/rPcyvjk+mdifaZO5SeM21zS3t4jQrscy8+6IyB0GIYshl5ldTq6JSBo1d63i8w==} + engines: {node: '>=12.6'} + requiresBuild: true + peerDependencies: + prisma: '*' + peerDependenciesMeta: + prisma: + optional: true + dependencies: + '@prisma/engines-version': 3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e + prisma: 3.15.2 + dev: false + + /@prisma/engines-version@3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e: + resolution: {integrity: sha512-e3k2Vd606efd1ZYy2NQKkT4C/pn31nehyLhVug6To/q8JT8FpiMrDy7zmm3KLF0L98NOQQcutaVtAPhzKhzn9w==} + dev: false + + /@prisma/engines@3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e: + resolution: {integrity: sha512-NHlojO1DFTsSi3FtEleL9QWXeSF/UjhCW0fgpi7bumnNZ4wj/eQ+BJJ5n2pgoOliTOGv9nX2qXvmHap7rJMNmg==} + requiresBuild: true + + /@sideway/address@4.1.4: + resolution: {integrity: sha512-7vwq+rOHVWjyXxVlR76Agnvhy8I9rpzjosTESvmhNeXOXdZZB15Fl+TI9x1SiHZH5Jv2wTGduSxFDIaq0m3DUw==} + dependencies: + '@hapi/hoek': 9.3.0 + dev: false + + /@sideway/formula@3.0.1: + resolution: {integrity: sha512-/poHZJJVjx3L+zVD6g9KgHfYnb443oi7wLu/XKojDviHy6HOEOA6z1Trk5aR1dGcmPenJEgb2sK2I80LeS3MIg==} + dev: false + + /@sideway/pinpoint@2.0.0: + resolution: {integrity: sha512-RNiOoTPkptFtSVzQevY/yWtZwf/RxyVnPy/OcA9HBM3MlGDnBEYL5B41H0MTn0Uec8Hi+2qUtTfG2WWZBmMejQ==} + dev: false + + /@sinonjs/commons@1.8.6: + resolution: {integrity: sha512-Ky+XkAkqPZSm3NLBeUng77EBQl3cmeJhITaGHdYH8kjVB+aun3S4XBRti2zt17mtt0mIUDiNxYeoJm6drVvBJQ==} + dependencies: + type-detect: 4.0.8 + dev: true + + /@sinonjs/fake-timers@8.1.0: + resolution: {integrity: sha512-OAPJUAtgeINhh/TAlUID4QTs53Njm7xzddaVlEs/SXwgtiD1tW22zAB/W1wdqfrpmikgaWQ9Fw6Ws+hsiRm5Vg==} + dependencies: + '@sinonjs/commons': 1.8.6 + dev: true + + /@sovpro/delimited-stream@1.1.0: + resolution: {integrity: sha512-kQpk267uxB19X3X2T1mvNMjyvIEonpNSHrMlK5ZaBU6aZxw7wPbpgKJOjHN3+/GPVpXgAV9soVT2oyHpLkLtyw==} + engines: {node: '>= 8'} + dev: false + + /@tootallnate/once@1.1.2: + resolution: {integrity: sha512-RbzJvlNzmRq5c3O09UipeuXno4tA1FE6ikOjxZK0tuxVv3412l64l5t1W5pj4+rJq9vpkm/kwiR07aZXnsKPxw==} + engines: {node: '>= 6'} + + /@tsconfig/node10@1.0.9: + resolution: {integrity: sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==} + dev: true + + /@tsconfig/node12@1.0.11: + resolution: {integrity: sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==} + dev: true + + /@tsconfig/node14@1.0.3: + resolution: {integrity: sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==} + dev: true + + /@tsconfig/node16@1.0.4: + resolution: {integrity: sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==} + dev: true + + /@types/babel__core@7.20.2: + resolution: {integrity: sha512-pNpr1T1xLUc2l3xJKuPtsEky3ybxN3m4fJkknfIpTCTfIZCDW57oAg+EfCgIIp2rvCe0Wn++/FfodDS4YXxBwA==} + dependencies: + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + '@types/babel__generator': 7.6.5 + '@types/babel__template': 7.4.2 + '@types/babel__traverse': 7.20.2 + dev: true + + /@types/babel__generator@7.6.5: + resolution: {integrity: sha512-h9yIuWbJKdOPLJTbmSpPzkF67e659PbQDba7ifWm5BJ8xTv+sDmS7rFmywkWOvXedGTivCdeGSIIX8WLcRTz8w==} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@types/babel__template@7.4.2: + resolution: {integrity: sha512-/AVzPICMhMOMYoSx9MoKpGDKdBRsIXMNByh1PXSZoa+v6ZoLa8xxtsT/uLQ/NJm0XVAWl/BvId4MlDeXJaeIZQ==} + dependencies: + '@babel/parser': 7.23.0 + '@babel/types': 7.23.0 + dev: true + + /@types/babel__traverse@7.20.2: + resolution: {integrity: sha512-ojlGK1Hsfce93J0+kn3H5R73elidKUaZonirN33GSmgTUMpzI/MIFfSpF3haANe3G1bEBS9/9/QEqwTzwqFsKw==} + dependencies: + '@babel/types': 7.23.0 + dev: true + + /@types/body-parser@1.19.3: + resolution: {integrity: sha512-oyl4jvAfTGX9Bt6Or4H9ni1Z447/tQuxnZsytsCaExKlmJiU8sFgnIBRzJUpKwB5eWn9HuBYlUlVA74q/yN0eQ==} + dependencies: + '@types/connect': 3.4.36 + '@types/node': 16.18.57 + + /@types/connect@3.4.36: + resolution: {integrity: sha512-P63Zd/JUGq+PdrM1lv0Wv5SBYeA2+CORvbrXbngriYY0jzLUWfQMQQxOhjONEz/wlHOAxOdY7CY65rgQdTjq2w==} + dependencies: + '@types/node': 16.18.57 + + /@types/cookiejar@2.1.2: + resolution: {integrity: sha512-t73xJJrvdTjXrn4jLS9VSGRbz0nUY3cl2DMGDU48lKl+HR9dbbjW2A9r3g40VA++mQpy6uuHg33gy7du2BKpog==} + + /@types/eslint-scope@3.7.5: + resolution: {integrity: sha512-JNvhIEyxVW6EoMIFIvj93ZOywYFatlpu9deeH6eSx6PE3WHYvHaQtmHmQeNw7aA81bYGBPPQqdtBm6b1SsQMmA==} + dependencies: + '@types/eslint': 8.44.3 + '@types/estree': 0.0.51 + + /@types/eslint@8.44.3: + resolution: {integrity: sha512-iM/WfkwAhwmPff3wZuPLYiHX18HI24jU8k1ZSH7P8FHwxTjZ2P6CoX2wnF43oprR+YXJM6UUxATkNvyv/JHd+g==} + dependencies: + '@types/estree': 0.0.51 + '@types/json-schema': 7.0.13 + + /@types/estree@0.0.51: + resolution: {integrity: sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ==} + + /@types/estree@1.0.2: + resolution: {integrity: sha512-VeiPZ9MMwXjO32/Xu7+OwflfmeoRwkE/qzndw42gGtgJwZopBnzy2gD//NN1+go1mADzkDcqf/KnFRSjTJ8xJA==} + dev: true + + /@types/express-serve-static-core@4.17.37: + resolution: {integrity: sha512-ZohaCYTgGFcOP7u6aJOhY9uIZQgZ2vxC2yWoArY+FeDXlqeH66ZVBjgvg+RLVAS/DWNq4Ap9ZXu1+SUQiiWYMg==} + dependencies: + '@types/node': 16.18.57 + '@types/qs': 6.9.8 + '@types/range-parser': 1.2.5 + '@types/send': 0.17.2 + + /@types/express@4.17.18: + resolution: {integrity: sha512-Sxv8BSLLgsBYmcnGdGjjEjqET2U+AKAdCRODmMiq02FgjwuV75Ut85DRpvFjyw/Mk0vgUOliGRU0UUmuuZHByQ==} + dependencies: + '@types/body-parser': 1.19.3 + '@types/express-serve-static-core': 4.17.37 + '@types/qs': 6.9.8 + '@types/serve-static': 1.15.3 + + /@types/glob@7.2.0: + resolution: {integrity: sha512-ZUxbzKl0IfJILTS6t7ip5fQQM/J3TJYubDm3nMbgubNNYS62eXeUpoLUC8/7fJNiFYHTrGPQn7hspDUzIHX3UA==} + dependencies: + '@types/minimatch': 5.1.2 + '@types/node': 16.18.57 + dev: false + + /@types/graceful-fs@4.1.7: + resolution: {integrity: sha512-MhzcwU8aUygZroVwL2jeYk6JisJrPl/oov/gsgGCue9mkgl9wjGbzReYQClxiUgFDnib9FuHqTndccKeZKxTRw==} + dependencies: + '@types/node': 16.18.57 + dev: true + + /@types/http-errors@2.0.2: + resolution: {integrity: sha512-lPG6KlZs88gef6aD85z3HNkztpj7w2R7HmR3gygjfXCQmsLloWNARFkMuzKiiY8FGdh1XDpgBdrSf4aKDiA7Kg==} + + /@types/indy-sdk@1.16.28: + resolution: {integrity: sha512-hJs2jnVyewse6qY3zO8dfgJppWJ3GdRwTUeiXW/XVbrUpj3rJO4Doi5wYbO0az/YePEqu7lHvZzFn0hltmDLsg==} + dependencies: + buffer: 6.0.3 + dev: false + + /@types/istanbul-lib-coverage@2.0.4: + resolution: {integrity: sha512-z/QT1XN4K4KYuslS23k62yDIDLwLFkzxOuMplDtObz0+y7VqJCaO2o+SPwHCvLFZh7xazvvoor2tA/hPz9ee7g==} + dev: true + + /@types/istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-gPQuzaPR5h/djlAv2apEG1HVOyj1IUs7GpfMZixU0/0KXT3pm64ylHuMUI1/Akh+sq/iikxg6Z2j+fcMDXaaTQ==} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + dev: true + + /@types/istanbul-reports@3.0.2: + resolution: {integrity: sha512-kv43F9eb3Lhj+lr/Hn6OcLCs/sSM8bt+fIaP11rCYngfV6NVjzWXJ17owQtDQTL9tQ8WSLUrGsSJ6rJz0F1w1A==} + dependencies: + '@types/istanbul-lib-report': 3.0.1 + dev: true + + /@types/jest@27.0.2: + resolution: {integrity: sha512-4dRxkS/AFX0c5XW6IPMNOydLn2tEhNhJV7DnYK+0bjoJZ+QTmfucBlihX7aoEsh/ocYtkLC73UbnBXBXIxsULA==} + dependencies: + jest-diff: 27.5.1 + pretty-format: 27.5.1 + + /@types/json-schema@7.0.13: + resolution: {integrity: sha512-RbSSoHliUbnXj3ny0CNFOoxrIDV6SUGyStHsvDqosw6CkdPV8TtWGlfecuK4ToyMEAql6pzNxgCFKanovUzlgQ==} + + /@types/json5@0.0.29: + resolution: {integrity: sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==} + + /@types/jsonwebtoken@8.5.9: + resolution: {integrity: sha512-272FMnFGzAVMGtu9tkr29hRL6bZj4Zs1KZNeHLnKqAvp06tAIcarTMwOh8/8bz4FmKRcMxZhZNeUAQsNLoiPhg==} + dependencies: + '@types/node': 16.18.57 + + /@types/jsonwebtoken@9.0.3: + resolution: {integrity: sha512-b0jGiOgHtZ2jqdPgPnP6WLCXZk1T8p06A/vPGzUvxpFGgKMbjXJDjC5m52ErqBnIuWZFgGoIJyRdeG5AyreJjA==} + dependencies: + '@types/node': 16.18.57 + dev: false + + /@types/mime@1.3.3: + resolution: {integrity: sha512-Ys+/St+2VF4+xuY6+kDIXGxbNRO0mesVg0bbxEfB97Od1Vjpjx9KD1qxs64Gcb3CWPirk9Xe+PT4YiiHQ9T+eg==} + + /@types/mime@3.0.2: + resolution: {integrity: sha512-Wj+fqpTLtTbG7c0tH47dkahefpLKEbB+xAZuLq7b4/IDHPl/n6VoXcyUQ2bypFlbSwvCr0y+bD4euTTqTJsPxQ==} + + /@types/minimatch@5.1.2: + resolution: {integrity: sha512-K0VQKziLUWkVKiRVrx4a40iPaxTUefQmjtkQofBkYRcoaaL/8rhwDWww9qWbrgicNOgnpIsMxyNIUM4+n6dUIA==} + dev: false + + /@types/node-fetch@2.6.6: + resolution: {integrity: sha512-95X8guJYhfqiuVVhRFxVQcf4hW/2bCuoPwDasMf/531STFoNoWTT7YDnWdXHEZKqAGUigmpG31r2FE70LwnzJw==} + dependencies: + '@types/node': 16.18.57 + form-data: 4.0.0 + dev: false + + /@types/node@16.18.57: + resolution: {integrity: sha512-piPoDozdPaX1hNWFJQzzgWqE40gh986VvVx/QO9RU4qYRE55ld7iepDVgZ3ccGUw0R4wge0Oy1dd+3xOQNkkUQ==} + + /@types/parse-json@4.0.0: + resolution: {integrity: sha512-//oorEZjL6sbPcKUaCdIGlIUeH26mgzimjBB77G6XRgnDl/L5wOnpyBGRe/Mmf5CVW3PwEBE1NjiMZ/ssFh4wA==} + + /@types/prettier@2.7.3: + resolution: {integrity: sha512-+68kP9yzs4LMp7VNh8gdzMSPZFL44MLGqiHWvttYJe+6qnuVr4Ek9wSBQoveqY/r+LwjCcU29kNVkidwim+kYA==} + dev: true + + /@types/qs@6.9.8: + resolution: {integrity: sha512-u95svzDlTysU5xecFNTgfFG5RUWu1A9P0VzgpcIiGZA9iraHOdSzcxMxQ55DyeRaGCSxQi7LxXDI4rzq/MYfdg==} + + /@types/range-parser@1.2.5: + resolution: {integrity: sha512-xrO9OoVPqFuYyR/loIHjnbvvyRZREYKLjxV4+dY6v3FQR3stQ9ZxIGkaclF7YhI9hfjpuTbu14hZEy94qKLtOA==} + + /@types/semver@7.5.3: + resolution: {integrity: sha512-OxepLK9EuNEIPxWNME+C6WwbRAOOI2o2BaQEGzz5Lu2e4Z5eDnEo+/aVEDMIXywoJitJ7xWd641wrGLZdtwRyw==} + dev: true + + /@types/send@0.17.2: + resolution: {integrity: sha512-aAG6yRf6r0wQ29bkS+x97BIs64ZLxeE/ARwyS6wrldMm3C1MdKwCcnnEwMC1slI8wuxJOpiUH9MioC0A0i+GJw==} + dependencies: + '@types/mime': 1.3.3 + '@types/node': 16.18.57 + + /@types/serve-static@1.15.3: + resolution: {integrity: sha512-yVRvFsEMrv7s0lGhzrggJjNOSmZCdgCjw9xWrPr/kNNLp6FaDfMC1KaYl3TSJ0c58bECwNBMoQrZJ8hA8E1eFg==} + dependencies: + '@types/http-errors': 2.0.2 + '@types/mime': 3.0.2 + '@types/node': 16.18.57 + + /@types/shelljs@0.8.13: + resolution: {integrity: sha512-++uMLOQSLlse1kCfEOwhgmHuaABZwinkylmUKCpvcEGZUov3TtM+gJZloSkW/W+9pEAEg/VBOwiSR05oqJsa5A==} + dependencies: + '@types/glob': 7.2.0 + '@types/node': 16.18.57 + dev: false + + /@types/simple-oauth2@4.1.3: + resolution: {integrity: sha512-fj4Qxko32X75+pM/IUDIhWct/tAcV2s/5EY6oM9RcRmLGk23CBlxecdNaW/w87RAdo3rGnlK2t+A1JRYFqVWFw==} + dev: true + + /@types/stack-utils@2.0.1: + resolution: {integrity: sha512-Hl219/BT5fLAaz6NDkSuhzasy49dwQS/DSdu4MdggFB8zcXv7vflBI3xp7FEmkmdDkBUI2bPUNeMttp2knYdxw==} + dev: true + + /@types/superagent@4.1.19: + resolution: {integrity: sha512-McM1mlc7PBZpCaw0fw/36uFqo0YeA6m8JqoyE4OfqXsZCIg0hPP2xdE6FM7r6fdprDZHlJwDpydUj1R++93hCA==} + dependencies: + '@types/cookiejar': 2.1.2 + '@types/node': 16.18.57 + + /@types/supertest@2.0.14: + resolution: {integrity: sha512-Q900DeeHNFF3ZYYepf/EyJfZDA2JrnWLaSQ0YNV7+2GTo8IlJzauEnDGhya+hauncpBYTYGpVHwGdssJeAQ7eA==} + dependencies: + '@types/superagent': 4.1.19 + + /@types/triple-beam@1.3.3: + resolution: {integrity: sha512-6tOUG+nVHn0cJbVp25JFayS5UE6+xlbcNF9Lo9mU7U0zk3zeUShZied4YEQZjy1JBF043FSkdXw8YkUJuVtB5g==} + dev: false + + /@types/validator@13.11.2: + resolution: {integrity: sha512-nIKVVQKT6kGKysnNt+xLobr+pFJNssJRi2s034wgWeFBUx01fI8BeHTW2TcRp7VcFu9QCYG8IlChTuovcm0oKQ==} + dev: false + + /@types/ws@7.4.7: + resolution: {integrity: sha512-JQbbmxZTZehdc2iszGKs5oC3NFnjeay7mtAWrdt7qNtAVK0g19muApzAy4bm9byz79xa2ZnO/BOBC2R8RC5Lww==} + dependencies: + '@types/node': 16.18.57 + dev: false + + /@types/yargs-parser@21.0.1: + resolution: {integrity: sha512-axdPBuLuEJt0c4yI5OZssC19K2Mq1uKdrfZBzuxLvaztgqUtFYZUNw7lETExPYJR9jdEoIg4mb7RQKRQzOkeGQ==} + dev: true + + /@types/yargs@16.0.6: + resolution: {integrity: sha512-oTP7/Q13GSPrgcwEwdlnkoZSQ1Hg9THe644qq8PG6hhJzjZ3qj1JjEFPIwWV/IXVs5XGIVqtkNOS9kh63WIJ+A==} + dependencies: + '@types/yargs-parser': 21.0.1 + dev: true + + /@typescript-eslint/eslint-plugin@5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@4.9.5): + resolution: {integrity: sha512-TiZzBSJja/LbhNPvk6yc0JrX9XqhQ0hdh6M2svYfsHGejaKFIAGd9MQ+ERIMzLGlN/kZoYIgdxFV0PuljTKXag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + '@typescript-eslint/parser': ^5.0.0 + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@eslint-community/regexpp': 4.9.1 + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/type-utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.50.0 + graphemer: 1.4.0 + ignore: 5.2.4 + natural-compare-lite: 1.4.0 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/parser@5.62.0(eslint@8.50.0)(typescript@4.9.5): + resolution: {integrity: sha512-VlJEV0fOQ7BExOsHYAGrgbEiZoi8D+Bl2+f6V2RrXerRSylnp+ZBHmPvaIa8cz0Ajx7WO7Z5RqfgYg7ED1nRhA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.50.0 + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/scope-manager@5.62.0: + resolution: {integrity: sha512-VXuvVvZeQCQb5Zgf4HAxc04q5j+WrNAtNh9OwCsCgpKqESMTu3tF/jhZ3xG6T4NZwWl65Bg8KuS2uEvhSfLl0w==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + dev: true + + /@typescript-eslint/type-utils@5.62.0(eslint@8.50.0)(typescript@4.9.5): + resolution: {integrity: sha512-xsSQreu+VnfbqQpW5vnCJdq1Z3Q0U31qiWmRhr98ONQmcp/yhiPJFPq8MXiJVLiksmOKSjIldZzkebzHuCGzew==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: '*' + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + '@typescript-eslint/utils': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + debug: 4.3.4 + eslint: 8.50.0 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/types@5.62.0: + resolution: {integrity: sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /@typescript-eslint/typescript-estree@5.62.0(typescript@4.9.5): + resolution: {integrity: sha512-CmcQ6uY7b9y694lKdRB8FEel7JbU/40iSAPomu++SjLMntB+2Leay2LO6i8VnJk58MtE9/nQSFIH6jpyRWyYzA==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + typescript: '*' + peerDependenciesMeta: + typescript: + optional: true + dependencies: + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/visitor-keys': 5.62.0 + debug: 4.3.4 + globby: 11.1.0 + is-glob: 4.0.3 + semver: 7.5.4 + tsutils: 3.21.0(typescript@4.9.5) + typescript: 4.9.5 + transitivePeerDependencies: + - supports-color + dev: true + + /@typescript-eslint/utils@5.62.0(eslint@8.50.0)(typescript@4.9.5): + resolution: {integrity: sha512-n8oxjeb5aIbPFEtmQxQYOLI0i9n5ySBEY/ZEHHZqKQSFnxio1rv6dthascc9dLuwrL0RC5mPCxB7vnAVGAYWAQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + peerDependencies: + eslint: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@types/json-schema': 7.0.13 + '@types/semver': 7.5.3 + '@typescript-eslint/scope-manager': 5.62.0 + '@typescript-eslint/types': 5.62.0 + '@typescript-eslint/typescript-estree': 5.62.0(typescript@4.9.5) + eslint: 8.50.0 + eslint-scope: 5.1.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + - typescript + dev: true + + /@typescript-eslint/visitor-keys@5.62.0: + resolution: {integrity: sha512-07ny+LHRzQXepkGg6w0mFY41fVUNBrL2Roj/++7V1txKugfjm/Ci/qSND03r2RhlJhJYMcTn9AhhSSqQp0Ysyw==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + '@typescript-eslint/types': 5.62.0 + eslint-visitor-keys: 3.4.3 + dev: true + + /@webassemblyjs/ast@1.11.1: + resolution: {integrity: sha512-ukBh14qFLjxTQNTXocdyksN5QdM28S1CxHt2rdskFyL+xFV7VremuBLVbmCePj+URalXBENx/9Lm7lnhihtCSw==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + + /@webassemblyjs/ast@1.11.6: + resolution: {integrity: sha512-IN1xI7PwOvLPgjcf180gC1bqn3q/QaOCwYUahIOhbYUu8KA/3tw2RT/T0Gidi1l7Hhj5D/INhJxiICObqpMu4Q==} + dependencies: + '@webassemblyjs/helper-numbers': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + dev: true + + /@webassemblyjs/floating-point-hex-parser@1.11.1: + resolution: {integrity: sha512-iGRfyc5Bq+NnNuX8b5hwBrRjzf0ocrJPI6GWFodBFzmFnyvrQ83SHKhmilCU/8Jv67i4GJZBMhEzltxzcNagtQ==} + + /@webassemblyjs/floating-point-hex-parser@1.11.6: + resolution: {integrity: sha512-ejAj9hfRJ2XMsNHk/v6Fu2dGS+i4UaXBXGemOfQ/JfQ6mdQg/WXtwleQRLLS4OvfDhv8rYnVwH27YJLMyYsxhw==} + dev: true + + /@webassemblyjs/helper-api-error@1.11.1: + resolution: {integrity: sha512-RlhS8CBCXfRUR/cwo2ho9bkheSXG0+NwooXcc3PAILALf2QLdFyj7KGsKRbVc95hZnhnERon4kW/D3SZpp6Tcg==} + + /@webassemblyjs/helper-api-error@1.11.6: + resolution: {integrity: sha512-o0YkoP4pVu4rN8aTJgAyj9hC2Sv5UlkzCHhxqWj8butaLvnpdc2jOwh4ewE6CX0txSfLn/UYaV/pheS2Txg//Q==} + dev: true + + /@webassemblyjs/helper-buffer@1.11.1: + resolution: {integrity: sha512-gwikF65aDNeeXa8JxXa2BAk+REjSyhrNC9ZwdT0f8jc4dQQeDQ7G4m0f2QCLPJiMTTO6wfDmRmj/pW0PsUvIcA==} + + /@webassemblyjs/helper-buffer@1.11.6: + resolution: {integrity: sha512-z3nFzdcp1mb8nEOFFk8DrYLpHvhKC3grJD2ardfKOzmbmJvEf/tPIqCY+sNcwZIY8ZD7IkB2l7/pqhUhqm7hLA==} + dev: true + + /@webassemblyjs/helper-numbers@1.11.1: + resolution: {integrity: sha512-vDkbxiB8zfnPdNK9Rajcey5C0w+QJugEglN0of+kmO8l7lDb77AnlKYQF7aarZuCrv+l0UvqL+68gSDr3k9LPQ==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/helper-numbers@1.11.6: + resolution: {integrity: sha512-vUIhZ8LZoIWHBohiEObxVm6hwP034jwmc9kuq5GdHZH0wiLVLIPcMCdpJzG4C11cHoQ25TFIQj9kaVADVX7N3g==} + dependencies: + '@webassemblyjs/floating-point-hex-parser': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/helper-wasm-bytecode@1.11.1: + resolution: {integrity: sha512-PvpoOGiJwXeTrSf/qfudJhwlvDQxFgelbMqtq52WWiXC6Xgg1IREdngmPN3bs4RoO83PnL/nFrxucXj1+BX62Q==} + + /@webassemblyjs/helper-wasm-bytecode@1.11.6: + resolution: {integrity: sha512-sFFHKwcmBprO9e7Icf0+gddyWYDViL8bpPjJJl0WHxCdETktXdmtWLGVzoHbqUcY4Be1LkNfwTmXOJUFZYSJdA==} + dev: true + + /@webassemblyjs/helper-wasm-section@1.11.1: + resolution: {integrity: sha512-10P9No29rYX1j7F3EVPX3JvGPQPae+AomuSTPiF9eBQeChHI6iqjMIwR9JmOJXwpnn/oVGDk7I5IlskuMwU/pg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + + /@webassemblyjs/helper-wasm-section@1.11.6: + resolution: {integrity: sha512-LPpZbSOwTpEC2cgn4hTydySy1Ke+XEu+ETXuoyvuyezHO3Kjdu90KK95Sh9xTbmjrCsUwvWwCOQQNta37VrS9g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + dev: true + + /@webassemblyjs/ieee754@1.11.1: + resolution: {integrity: sha512-hJ87QIPtAMKbFq6CGTkZYJivEwZDbQUgYd3qKSadTNOhVY7p+gfP6Sr0lLRVTaG1JjFj+r3YchoqRYxNH3M0GQ==} + dependencies: + '@xtuc/ieee754': 1.2.0 + + /@webassemblyjs/ieee754@1.11.6: + resolution: {integrity: sha512-LM4p2csPNvbij6U1f19v6WR56QZ8JcHg3QIJTlSwzFcmx6WSORicYj6I63f9yU1kEUtrpG+kjkiIAkevHpDXrg==} + dependencies: + '@xtuc/ieee754': 1.2.0 + dev: true + + /@webassemblyjs/leb128@1.11.1: + resolution: {integrity: sha512-BJ2P0hNZ0u+Th1YZXJpzW6miwqQUGcIHT1G/sf72gLVD9DZ5AdYTqPNbHZh6K1M5VmKvFXwGSWZADz+qBWxeRw==} + dependencies: + '@xtuc/long': 4.2.2 + + /@webassemblyjs/leb128@1.11.6: + resolution: {integrity: sha512-m7a0FhE67DQXgouf1tbN5XQcdWoNgaAuoULHIfGFIEVKA6tu/edls6XnIlkmS6FrXAquJRPni3ZZKjw6FSPjPQ==} + dependencies: + '@xtuc/long': 4.2.2 + dev: true + + /@webassemblyjs/utf8@1.11.1: + resolution: {integrity: sha512-9kqcxAEdMhiwQkHpkNiorZzqpGrodQQ2IGrHHxCy+Ozng0ofyMA0lTqiLkVs1uzTRejX+/O0EOT7KxqVPuXosQ==} + + /@webassemblyjs/utf8@1.11.6: + resolution: {integrity: sha512-vtXf2wTQ3+up9Zsg8sa2yWiQpzSsMyXj0qViVP6xKGCUT8p8YJ6HqI7l5eCnWx1T/FYdsv07HQs2wTFbbof/RA==} + dev: true + + /@webassemblyjs/wasm-edit@1.11.1: + resolution: {integrity: sha512-g+RsupUC1aTHfR8CDgnsVRVZFJqdkFHpsHMfJuWQzWU3tvnLC07UqHICfP+4XyL2tnr1amvl1Sdp06TnYCmVkA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/helper-wasm-section': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-opt': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + '@webassemblyjs/wast-printer': 1.11.1 + + /@webassemblyjs/wasm-edit@1.11.6: + resolution: {integrity: sha512-Ybn2I6fnfIGuCR+Faaz7YcvtBKxvoLV3Lebn1tM4o/IAJzmi9AWYIPWpyBfU8cC+JxAO57bk4+zdsTjJR+VTOw==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/helper-wasm-section': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-opt': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + '@webassemblyjs/wast-printer': 1.11.6 + dev: true + + /@webassemblyjs/wasm-gen@1.11.1: + resolution: {integrity: sha512-F7QqKXwwNlMmsulj6+O7r4mmtAlCWfO/0HdgOxSklZfQcDu0TpLiD1mRt/zF25Bk59FIjEuGAIyn5ei4yMfLhA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + + /@webassemblyjs/wasm-gen@1.11.6: + resolution: {integrity: sha512-3XOqkZP/y6B4F0PBAXvI1/bky7GryoogUtfwExeP/v7Nzwo1QLcq5oQmpKlftZLbT+ERUOAZVQjuNVak6UXjPA==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wasm-opt@1.11.1: + resolution: {integrity: sha512-VqnkNqnZlU5EB64pp1l7hdm3hmQw7Vgqa0KF/KCNO9sIpI6Fk6brDEiX+iCOYrvMuBWDws0NkTOxYEb85XQHHw==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-buffer': 1.11.1 + '@webassemblyjs/wasm-gen': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + + /@webassemblyjs/wasm-opt@1.11.6: + resolution: {integrity: sha512-cOrKuLRE7PCe6AsOVl7WasYf3wbSo4CeOk6PkrjS7g57MFfVUF9u6ysQBBODX0LdgSvQqRiGz3CXvIDKcPNy4g==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-buffer': 1.11.6 + '@webassemblyjs/wasm-gen': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + dev: true + + /@webassemblyjs/wasm-parser@1.11.1: + resolution: {integrity: sha512-rrBujw+dJu32gYB7/Lup6UhdkPx9S9SnobZzRVL7VcBH9Bt9bCBLEuX/YXOOtBsOZ4NQrRykKhffRWHvigQvOA==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/helper-api-error': 1.11.1 + '@webassemblyjs/helper-wasm-bytecode': 1.11.1 + '@webassemblyjs/ieee754': 1.11.1 + '@webassemblyjs/leb128': 1.11.1 + '@webassemblyjs/utf8': 1.11.1 + + /@webassemblyjs/wasm-parser@1.11.6: + resolution: {integrity: sha512-6ZwPeGzMJM3Dqp3hCsLgESxBGtT/OeCvCZ4TA1JUPYgmhAx38tTPR9JaKy0S5H3evQpO/h2uWs2j6Yc/fjkpTQ==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/helper-api-error': 1.11.6 + '@webassemblyjs/helper-wasm-bytecode': 1.11.6 + '@webassemblyjs/ieee754': 1.11.6 + '@webassemblyjs/leb128': 1.11.6 + '@webassemblyjs/utf8': 1.11.6 + dev: true + + /@webassemblyjs/wast-printer@1.11.1: + resolution: {integrity: sha512-IQboUWM4eKzWW+N/jij2sRatKMh99QEelo3Eb2q0qXkvPRISAj8Qxtmw5itwqK+TTkBuUIE45AxYPToqPtL5gg==} + dependencies: + '@webassemblyjs/ast': 1.11.1 + '@xtuc/long': 4.2.2 + + /@webassemblyjs/wast-printer@1.11.6: + resolution: {integrity: sha512-JM7AhRcE+yW2GWYaKeHL5vt4xqee5N2WcezptmgyhNS+ScggqcT1OtXykhAb13Sn5Yas0j2uv9tHgrjwvzAP4A==} + dependencies: + '@webassemblyjs/ast': 1.11.6 + '@xtuc/long': 4.2.2 + dev: true + + /@xtuc/ieee754@1.2.0: + resolution: {integrity: sha512-DX8nKgqcGwsc0eJSqYt5lwP4DH5FlHnmuWWBRy7X0NcaGR0ZtuyeESgMwTYVEtxmsNGY+qit4QYT/MIYTOTPeA==} + + /@xtuc/long@4.2.2: + resolution: {integrity: sha512-NuHqBY1PB/D8xU6s/thBgOAiAP7HOYDQ32+BFZILJ8ivkUkAHQnWfn6WhL79Owj1qmUnoN/YPhktdIoucipkAQ==} + + /abab@2.0.6: + resolution: {integrity: sha512-j2afSsaIENvHZN2B8GOpF566vZ5WVk5opAiMTvWgaQT8DkbOqsTfvNAvHoRGU2zzP8cPoqys+xHTRDWW8L+/BA==} + dev: true + + /abbrev@1.1.1: + resolution: {integrity: sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==} + dev: false + + /abort-controller@3.0.0: + resolution: {integrity: sha512-h8lQ8tacZYnR3vNQTgibj+tODHI5/+l06Au2Pcriv/Gmet0eaj4TwWH41sO9wnHDiQsEj19q0drzdWdeAHtweg==} + engines: {node: '>=6.5'} + dependencies: + event-target-shim: 5.0.1 + dev: false + + /accepts@1.3.8: + resolution: {integrity: sha512-PYAthTa2m2VKxuvSD3DPC/Gy+U+sOA1LAuT8mkmRuvw+NACSaeXEQ+NHcVF7rONl6qcaxV3Uuemwawk+7+SJLw==} + engines: {node: '>= 0.6'} + dependencies: + mime-types: 2.1.35 + negotiator: 0.6.3 + + /acorn-globals@6.0.0: + resolution: {integrity: sha512-ZQl7LOWaF5ePqqcX4hLuv/bLXYQNfNWw2c0/yX/TsPRKamzHcTGQnlCjHT3TsmkOUVEPS3crCxiPfdzE/Trlhg==} + dependencies: + acorn: 7.4.1 + acorn-walk: 7.2.0 + dev: true + + /acorn-import-assertions@1.9.0(acorn@8.10.0): + resolution: {integrity: sha512-cmMwop9x+8KFhxvKrKfPYmN6/pKTYYHBqLa0DfvVZcKMJWNyWLnaqND7dx/qn66R7ewM1UX5XMaDVP5wlVTaVA==} + peerDependencies: + acorn: ^8 + dependencies: + acorn: 8.10.0 + + /acorn-jsx@5.3.2(acorn@8.10.0): + resolution: {integrity: sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==} + peerDependencies: + acorn: ^6.0.0 || ^7.0.0 || ^8.0.0 + dependencies: + acorn: 8.10.0 + dev: true + + /acorn-walk@7.2.0: + resolution: {integrity: sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn-walk@8.2.0: + resolution: {integrity: sha512-k+iyHEuPgSw6SbuDpGQM+06HQUa04DZ3o+F6CSzXMvvI5KMvnaEqXe+YVe555R9nn6GPt404fos4wcgpw12SDA==} + engines: {node: '>=0.4.0'} + dev: true + + /acorn@7.4.1: + resolution: {integrity: sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A==} + engines: {node: '>=0.4.0'} + hasBin: true + dev: true + + /acorn@8.10.0: + resolution: {integrity: sha512-F0SAmZ8iUtS//m8DmCTA0jlh6TDKkHQyK6xc6V4KDTyZKA9dnvX9/3sRTVQrWm79glUAZbnmmNcdYwUIHWVybw==} + engines: {node: '>=0.4.0'} + hasBin: true + + /after-all-results@2.0.0: + resolution: {integrity: sha512-2zHEyuhSJOuCrmas9YV0YL/MFCWLxe1dS6k/ENhgYrb/JqyMnadLN4iIAc9kkZrbElMDyyAGH/0J18OPErOWLg==} + requiresBuild: true + dev: false + optional: true + + /agent-base@6.0.2: + resolution: {integrity: sha512-RZNwNclF7+MS/8bDg70amg32dyeZGZxiDuQmZxKLAlQjr3jGyLx+4Kkk58UO7D2QdgFIQCovuSuZESne6RG6XQ==} + engines: {node: '>= 6.0.0'} + dependencies: + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /agentkeepalive@4.5.0: + resolution: {integrity: sha512-5GG/5IbQQpC9FpkRGsSvZI5QYeSCzlJHdpBQntCsuTOxhKD8lqKhrleg2Yi7yvMIf82Ycmmqln9U8V9qwEiJew==} + engines: {node: '>= 8.0.0'} + dependencies: + humanize-ms: 1.2.1 + dev: false + + /aggregate-error@3.1.0: + resolution: {integrity: sha512-4I7Td01quW/RpocfNayFdFVk1qSuoh0E7JrbRJ16nH01HhKFQ88INq9Sd+nd72zqRySlr9BmDA8xlEJ6vJMrYA==} + engines: {node: '>=8'} + dependencies: + clean-stack: 2.2.0 + indent-string: 4.0.0 + dev: false + + /ajv-formats@2.1.1(ajv@8.9.0): + resolution: {integrity: sha512-Wx0Kx52hxE7C18hkMEggYlEifqWZtYaRgouJor+WMdPnQyEK13vgEWyVNup7SoeeoLMsr4kf5h6dOW11I15MUA==} + peerDependencies: + ajv: ^8.0.0 + peerDependenciesMeta: + ajv: + optional: true + dependencies: + ajv: 8.9.0 + + /ajv-keywords@3.5.2(ajv@6.12.6): + resolution: {integrity: sha512-5p6WTN0DdTGVQk6VjcEju19IgaHudalcfabD7yhDGeA6bcQnmL+CpveLJq/3hvfwd1aof6L386Ougkx6RfyMIQ==} + peerDependencies: + ajv: ^6.9.1 + dependencies: + ajv: 6.12.6 + + /ajv@6.12.6: + resolution: {integrity: sha512-j3fVLgvTo527anyYyJOGTYJbG+vnnQYvE0m5mmkc1TK+nxAppkCLMIL0aZ4dblVCNoGShhm+kzE4ZUykBoMg4g==} + dependencies: + fast-deep-equal: 3.1.3 + fast-json-stable-stringify: 2.1.0 + json-schema-traverse: 0.4.1 + uri-js: 4.4.1 + + /ajv@8.9.0: + resolution: {integrity: sha512-qOKJyNj/h+OWx7s5DePL6Zu1KeM9jPZhwBqs+7DzP6bGOvqzVCSf0xueYmVuaC/oQ/VtS2zLMLHdQFbkka+XDQ==} + dependencies: + fast-deep-equal: 3.1.3 + json-schema-traverse: 1.0.0 + require-from-string: 2.0.2 + uri-js: 4.4.1 + + /ansi-colors@4.1.1: + resolution: {integrity: sha512-JoX0apGbHaUJBNl6yF+p6JAFYZ666/hhCGKN5t9QFjbJQKUU/g8MNbFDbvfrgKXvI1QpZplPOnwIo99lX/AAmA==} + engines: {node: '>=6'} + + /ansi-escapes@4.3.2: + resolution: {integrity: sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.21.3 + + /ansi-regex@5.0.1: + resolution: {integrity: sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==} + engines: {node: '>=8'} + + /ansi-styles@3.2.1: + resolution: {integrity: sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==} + engines: {node: '>=4'} + dependencies: + color-convert: 1.9.3 + + /ansi-styles@4.3.0: + resolution: {integrity: sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==} + engines: {node: '>=8'} + dependencies: + color-convert: 2.0.1 + + /ansi-styles@5.2.0: + resolution: {integrity: sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA==} + engines: {node: '>=10'} + + /any-promise@1.3.0: + resolution: {integrity: sha512-7UvmKalWRt1wgjL1RrGxoSJW/0QZFIegpeGvZG9kjp8vrRu55XTHbwnqq2GpXm9uLbcuhxm3IqX9OB4MZR1b2A==} + requiresBuild: true + dev: false + optional: true + + /anymatch@3.1.3: + resolution: {integrity: sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==} + engines: {node: '>= 8'} + dependencies: + normalize-path: 3.0.0 + picomatch: 2.3.1 + + /append-field@0.1.0: + resolution: {integrity: sha512-8BgHoIwbQZaAQgDZLBu2vQoXHgUpSx4vQK1qv7e6R8YfbiSf4fCaBPJRtM1BaxVn1rIHc5ftv0cklsJ78BkouQ==} + requiresBuild: true + dev: false + optional: true + + /append-field@1.0.0: + resolution: {integrity: sha512-klpgFSWLW1ZEs8svjfb7g4qWY0YS5imI82dTg+QahUvJ8YqAY0P10Uk8tTyh9ZGuYEZEMaeJYCF5BFuX552hsw==} + + /aproba@2.0.0: + resolution: {integrity: sha512-lYe4Gx7QT+MKGbDsA+Z+he/Wtef0BiwDOlK/XkBrdfsh9J/jPPXbX0tE9x9cl27Tmu5gg3QUbUrQYa/y+KOHPQ==} + dev: false + + /are-we-there-yet@3.0.1: + resolution: {integrity: sha512-QZW4EDmGwlYur0Yyf/b2uGucHQMa8aFUP7eu9ddR73vvhFyt4V0Vl3QHPcTNJ8l6qYOBdxgXdnBXQrHilfRQBg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + delegates: 1.0.0 + readable-stream: 3.6.2 + dev: false + + /arg@4.1.3: + resolution: {integrity: sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==} + dev: true + + /argparse@1.0.10: + resolution: {integrity: sha512-o5Roy6tNG4SL/FOkCAN6RzjiakZS25RLYFrcMttJqbdd8BWrnA+fGz57iN5Pb06pvBGvl5gQ0B48dJlslXvoTg==} + dependencies: + sprintf-js: 1.0.3 + dev: true + + /argparse@2.0.1: + resolution: {integrity: sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==} + dev: true + + /array-buffer-byte-length@1.0.0: + resolution: {integrity: sha512-LPuwb2P+NrQw3XhxGc36+XSvuBPopovXYTR9Ew++Du9Yb/bx5AzBfrIsBoj0EZUifjQU+sHL21sseZ3jerWO/A==} + dependencies: + call-bind: 1.0.2 + is-array-buffer: 3.0.2 + + /array-flatten@1.1.1: + resolution: {integrity: sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==} + + /array-includes@3.1.7: + resolution: {integrity: sha512-dlcsNBIiWhPkHdOEEKnehA+RNUWDc4UqFtnIXU4uuYDPtA4LDkr7qip2p0VvFAEXNDr0yWZ9PJyIRiGjRLQzwQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + is-string: 1.0.7 + dev: true + + /array-union@2.1.0: + resolution: {integrity: sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==} + engines: {node: '>=8'} + dev: true + + /array.prototype.findlastindex@1.2.3: + resolution: {integrity: sha512-LzLoiOMAxvy+Gd3BAq3B7VeIgPdo+Q8hthvKtXybMvRV0jrXfJM/t8mw7nNlpEcVlVUnCnM2KSX4XU5HmpodOA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + es-shim-unscopables: 1.0.0 + get-intrinsic: 1.2.1 + dev: true + + /array.prototype.flat@1.3.2: + resolution: {integrity: sha512-djYB+Zx2vLewY8RWlNCUdHjDXs2XOgm602S9E7P/UpHgfeHL00cRiIF+IN/G/aUJ7kGPb6yO/ErDI5V2s8iycA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + es-shim-unscopables: 1.0.0 + dev: true + + /array.prototype.flatmap@1.3.2: + resolution: {integrity: sha512-Ewyx0c9PmpcsByhSW4r+9zDU7sGjFc86qf/kKtuSCRdhfbk0SNLLkaT5qvcHnRGgc5NP/ly/y+qkXkqONX54CQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + es-shim-unscopables: 1.0.0 + dev: true + + /arraybuffer.prototype.slice@1.0.2: + resolution: {integrity: sha512-yMBKppFur/fbHu9/6USUe03bZ4knMYiwFBcyiaXB8Go0qNehwX6inYPzK9U0NeQvGxKthcmHcaR8P5MStSRBAw==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + is-array-buffer: 3.0.2 + is-shared-array-buffer: 1.0.2 + + /asap@2.0.6: + resolution: {integrity: sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==} + + /async-cache@1.1.0: + resolution: {integrity: sha512-YDQc4vBn5NFhY6g6HhVshyi3Fy9+SQ5ePnE7JLDJn1DoL+i7ER+vMwtTNOYk9leZkYMnOwpBCWqyLDPw8Aig8g==} + deprecated: No longer maintained. Use [lru-cache](http://npm.im/lru-cache) version 7.6 or higher, and provide an asynchronous `fetchMethod` option. + requiresBuild: true + dependencies: + lru-cache: 4.1.5 + dev: false + optional: true + + /async-value-promise@1.1.1: + resolution: {integrity: sha512-c2RFDKjJle1rHa0YxN9Ysu97/QBu3Wa+NOejJxsX+1qVDJrkD3JL/GN1B3gaILAEXJXbu/4Z1lcoCHFESe/APA==} + requiresBuild: true + dependencies: + async-value: 1.2.2 + dev: false + optional: true + + /async-value@1.2.2: + resolution: {integrity: sha512-8rwtYe32OAS1W9CTwvknoyts+mc3ta8N7Pi0h7AjkMaKvsFbr39K+gEfZ7Z81aPXQ1sK5M23lgLy1QfZpcpadQ==} + requiresBuild: true + dev: false + optional: true + + /async@3.2.4: + resolution: {integrity: sha512-iAB+JbDEGXhyIUavoDl9WP/Jj106Kz9DEn1DPgYw5ruDn0e3Wgi3sKFm55sASdGBNOQB8F59d9qQ7deqrHA8wQ==} + dev: false + + /asynckit@0.4.0: + resolution: {integrity: sha512-Oei9OH4tRh0YqU3GxhX79dM/mwVgvbZJaSNaRk+bshkj0S5cfHcgYakreBjrHwatXKbz+IoIdYLxrKim2MjW0Q==} + + /atomic-sleep@1.0.0: + resolution: {integrity: sha512-kNOjDqAh7px0XWNI+4QbzoiR/nTkHAWNud2uvnJquD1/x5a7EQZMJT0AczqK0Qn67oY/TTQ1LbUKajZpp3I9tQ==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dev: false + optional: true + + /available-typed-arrays@1.0.5: + resolution: {integrity: sha512-DMD0KiN46eipeziST1LPP/STfDU0sufISXmjSgvVsoU2tqxctQeASejWcfNtxYKqETM1UxQ8sp2OrSBWpHY6sw==} + engines: {node: '>= 0.4'} + + /axios@0.25.0: + resolution: {integrity: sha512-cD8FOb0tRH3uuEe6+evtAbgJtfxr7ly3fQjYcMcuPlgkwVS9xboaVIpcDV+cYQe+yGykgwZCs1pzjntcGa6l5g==} + dependencies: + follow-redirects: 1.15.3 + transitivePeerDependencies: + - debug + dev: false + + /axios@0.27.2: + resolution: {integrity: sha512-t+yRIyySRTp/wua5xEr+z1q60QmLq8ABsS5O9Me1AsE5dfKqgnCFzwiCZZ/cGNd1lq4/7akDWMxdhVlucjmnOQ==} + dependencies: + follow-redirects: 1.15.3 + form-data: 4.0.0 + transitivePeerDependencies: + - debug + + /babel-jest@27.5.1(@babel/core@7.23.0): + resolution: {integrity: sha512-cdQ5dXjGRd0IBRATiQ4mZGlGlRE8kJpjPOixdNRdT+m3UcNqmYWN6rK6nvtXYfY3D76cb8s/O1Ss8ea24PIwcg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.8.0 + dependencies: + '@babel/core': 7.23.0 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__core': 7.20.2 + babel-plugin-istanbul: 6.1.1 + babel-preset-jest: 27.5.1(@babel/core@7.23.0) + chalk: 4.1.2 + graceful-fs: 4.2.11 + slash: 3.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-istanbul@6.1.1: + resolution: {integrity: sha512-Y1IQok9821cC9onCx5otgFfRm7Lm+I+wwxOx738M/WLPZ9Q42m4IG5W0FNX8WLL2gYMZo3JkuXIH2DOpWM+qwA==} + engines: {node: '>=8'} + dependencies: + '@babel/helper-plugin-utils': 7.22.5 + '@istanbuljs/load-nyc-config': 1.1.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-instrument: 5.2.1 + test-exclude: 6.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /babel-plugin-jest-hoist@27.5.1: + resolution: {integrity: sha512-50wCwD5EMNW4aRpOwtqzyZHIewTYNxLA4nhB+09d8BIssfNfzBRhkBIHiaPv1Si226TQSvp8gxAJm2iY2qs2hQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/template': 7.22.15 + '@babel/types': 7.23.0 + '@types/babel__core': 7.20.2 + '@types/babel__traverse': 7.20.2 + dev: true + + /babel-preset-current-node-syntax@1.0.1(@babel/core@7.23.0): + resolution: {integrity: sha512-M7LQ0bxarkxQoN+vz5aJPsLBn77n8QgTFmo8WK0/44auK2xlCXrYcUxHFxgU7qW5Yzw/CjmLRK2uJzaCd7LvqQ==} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + '@babel/plugin-syntax-async-generators': 7.8.4(@babel/core@7.23.0) + '@babel/plugin-syntax-bigint': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-class-properties': 7.12.13(@babel/core@7.23.0) + '@babel/plugin-syntax-import-meta': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-json-strings': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-logical-assignment-operators': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-nullish-coalescing-operator': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-numeric-separator': 7.10.4(@babel/core@7.23.0) + '@babel/plugin-syntax-object-rest-spread': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-catch-binding': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-optional-chaining': 7.8.3(@babel/core@7.23.0) + '@babel/plugin-syntax-top-level-await': 7.14.5(@babel/core@7.23.0) + dev: true + + /babel-preset-jest@27.5.1(@babel/core@7.23.0): + resolution: {integrity: sha512-Nptf2FzlPCWYuJg41HBqXVT8ym6bXOevuCTbhxlUpjwtysGaIWFvDEjp4y+G7fl13FgOdjs7P/DmErqH7da0Ag==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + '@babel/core': ^7.0.0 + dependencies: + '@babel/core': 7.23.0 + babel-plugin-jest-hoist: 27.5.1 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + dev: true + + /balanced-match@1.0.2: + resolution: {integrity: sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==} + + /base64-js@1.5.1: + resolution: {integrity: sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==} + + /basic-auth@2.0.1: + resolution: {integrity: sha512-NF+epuEdnUYVlGuhaxbbq+dvJttwLnGY+YixlXlME5KpQ5W3CnXA5cVTneY3SPbPDRkcjMbifrwmFYcClgOZeg==} + engines: {node: '>= 0.8'} + requiresBuild: true + dependencies: + safe-buffer: 5.1.2 + dev: false + optional: true + + /bignumber.js@9.1.2: + resolution: {integrity: sha512-2/mKyZH9K85bzOEfhXDBFZTGd1CTs+5IHpeFQo9luiBG7hghdC851Pj2WAhb6E3R6b9tZj/XKhbg4fum+Kepug==} + dev: false + + /binary-extensions@2.2.0: + resolution: {integrity: sha512-jDctJ/IVQbZoJykoeHbhXpOlNBqGNcwXJKJog42E5HDPUwQTSdjCHdihjj0DlnheQ7blbT6dHOafNAiS8ooQKA==} + engines: {node: '>=8'} + + /binary-search@1.3.6: + resolution: {integrity: sha512-nbE1WxOTTrUWIfsfZ4aHGYu5DOuNkbxGokjV6Z2kxfJK3uaAb8zNK1muzOeipoLHZjInT4Br88BHpzevc681xA==} + requiresBuild: true + dev: false + optional: true + + /bindings@1.5.0: + resolution: {integrity: sha512-p2q/t/mhvuOj/UeLlV6566GD/guowlr0hHxClI0W9m7MWYkL1F0hLo+0Aexs9HSPCtR1SXQ0TD3MMKrXZajbiQ==} + dependencies: + file-uri-to-path: 1.0.0 + dev: false + + /bl@4.1.0: + resolution: {integrity: sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==} + dependencies: + buffer: 5.7.1 + inherits: 2.0.4 + readable-stream: 3.6.2 + + /bn.js@5.2.1: + resolution: {integrity: sha512-eXRvHzWyYPBuB4NBy0cmYQjGitUrtqwbvlzP3G6VFnNRbsZQIxQ10PbKKHt8gZ/HW/D/747aDl+QkDqg3KQLMQ==} + dev: false + + /body-parser@1.20.0: + resolution: {integrity: sha512-DfJ+q6EPcGKZD1QWUjSpqp+Q7bDQTsQIF4zfUAtZ6qk+H/3/QRhg9CEp39ss+/T2vw0+HaidC0ecJj/DRLIaKg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.10.3 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /body-parser@1.20.1: + resolution: {integrity: sha512-jWi7abTbYwajOytWCQc37VulmWiRae5RyTpaCyDcS5/lMdtwSz5lOpDE67srw/HYe35f1z3fDQw+3txg7gNtWw==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.1 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /body-parser@1.20.2: + resolution: {integrity: sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + requiresBuild: true + dependencies: + bytes: 3.1.2 + content-type: 1.0.5 + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + on-finished: 2.4.1 + qs: 6.11.0 + raw-body: 2.5.2 + type-is: 1.6.18 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /borc@3.0.0: + resolution: {integrity: sha512-ec4JmVC46kE0+layfnwM3l15O70MlFiEbmQHY/vpqIKiUtPVntv4BY4NVnz3N4vb21edV3mY97XVckFvYHWF9g==} + engines: {node: '>=4'} + hasBin: true + dependencies: + bignumber.js: 9.1.2 + buffer: 6.0.3 + commander: 2.20.3 + ieee754: 1.2.1 + iso-url: 1.2.1 + json-text-sequence: 0.3.0 + readable-stream: 3.6.2 + dev: false + + /brace-expansion@1.1.11: + resolution: {integrity: sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==} + dependencies: + balanced-match: 1.0.2 + concat-map: 0.0.1 + + /brace-expansion@2.0.1: + resolution: {integrity: sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==} + dependencies: + balanced-match: 1.0.2 + dev: true + + /braces@3.0.2: + resolution: {integrity: sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==} + engines: {node: '>=8'} + dependencies: + fill-range: 7.0.1 + + /breadth-filter@2.0.0: + resolution: {integrity: sha512-thQShDXnFWSk2oVBixRCyrWsFoV5tfOpWKHmxwafHQDNxCfDBk539utpvytNjmlFrTMqz41poLwJvA1MW3z0MQ==} + requiresBuild: true + dependencies: + object.entries: 1.1.7 + dev: false + optional: true + + /browser-process-hrtime@1.0.0: + resolution: {integrity: sha512-9o5UecI3GhkpM6DrXr69PblIuWxPKk9Y0jHBRhdocZ2y7YECBFCsHm79Pr3OyR2AvjhDkabFJaDJMYRazHgsow==} + dev: true + + /browserslist@4.22.1: + resolution: {integrity: sha512-FEVc202+2iuClEhZhrWy6ZiAcRLvNMyYcxZ8raemul1DYVOVdFsbqckWLdsixQZCpJlwe77Z3UTalE7jsjnKfQ==} + engines: {node: ^6 || ^7 || ^8 || ^9 || ^10 || ^11 || ^12 || >=13.7} + hasBin: true + dependencies: + caniuse-lite: 1.0.30001546 + electron-to-chromium: 1.4.543 + node-releases: 2.0.13 + update-browserslist-db: 1.0.13(browserslist@4.22.1) + + /bs-logger@0.2.6: + resolution: {integrity: sha512-pd8DCoxmbgc7hyPKOvxtqNcjYoOsABPQdcCUjGp3d42VR2CX1ORhk2A87oqqu5R1kk+76nsxZupkmyd+MVtCog==} + engines: {node: '>= 6'} + dependencies: + fast-json-stable-stringify: 2.1.0 + dev: true + + /bser@2.1.1: + resolution: {integrity: sha512-gQxTNE/GAfIIrmHLUE3oJyp5FO6HRBfhjnw4/wMmA63ZGDJnWBmgY/lyQBpnDUkGmAhbSe39tx2d/iTOAfglwQ==} + dependencies: + node-int64: 0.4.0 + dev: true + + /buffer-equal-constant-time@1.0.1: + resolution: {integrity: sha512-zRpUiDwd/xk6ADqPMATG8vc9VPrkck7T07OIx0gnjmJAnHnTVXNQG3vfvWNuiZIkwu9KrKdA1iJKfsfTVxE6NA==} + dev: false + + /buffer-from@1.1.2: + resolution: {integrity: sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==} + + /buffer-writer@2.0.0: + resolution: {integrity: sha512-a7ZpuTZU1TRtnwyCNW3I5dc0wWNC3VR9S++Ewyk2HHZdrO3CQJqSpd+95Us590V6AL7JqUAH2IwZ/398PmNFgw==} + engines: {node: '>=4'} + dev: false + + /buffer@5.7.1: + resolution: {integrity: sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + + /buffer@6.0.3: + resolution: {integrity: sha512-FTiCpNxtwiZZHEZbcbTIcZjERVICn9yq/pDFkTl95/AxzD1naBctN7YO68riM/gLSDY7sdrMby8hofADYuuqOA==} + dependencies: + base64-js: 1.5.1 + ieee754: 1.2.1 + dev: false + + /busboy@0.2.14: + resolution: {integrity: sha512-InWFDomvlkEj+xWLBfU3AvnbVYqeTWmQopiW0tWWEy5yehYm2YkGEc59sUmw/4ty5Zj/b0WHGs1LgecuBSBGrg==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + dicer: 0.2.5 + readable-stream: 1.1.14 + dev: false + optional: true + + /busboy@1.6.0: + resolution: {integrity: sha512-8SFQbg/0hQ9xy3UNTB0YEnsNBbWfhf7RtnzpL7TkBiTBRfrQ9Fxcnz7VJsleJpyp6rVLvXiuORqjlHi5q+PYuA==} + engines: {node: '>=10.16.0'} + dependencies: + streamsearch: 1.1.0 + + /bytes@3.1.2: + resolution: {integrity: sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==} + engines: {node: '>= 0.8'} + + /cacache@15.3.0: + resolution: {integrity: sha512-VVdYzXEn+cnbXpFgWs5hTT7OScegHVmLhJIR8Ufqk3iFD6A6j5iSX1KuBTfNEv4tdJWE2PzA6IVFtcLC7fN9wQ==} + engines: {node: '>= 10'} + dependencies: + '@npmcli/fs': 1.1.1 + '@npmcli/move-file': 1.1.2 + chownr: 2.0.0 + fs-minipass: 2.1.0 + glob: 7.2.3 + infer-owner: 1.0.4 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + mkdirp: 1.0.4 + p-map: 4.0.0 + promise-inflight: 1.0.1 + rimraf: 3.0.2 + ssri: 8.0.1 + tar: 6.2.0 + unique-filename: 1.1.1 + transitivePeerDependencies: + - bluebird + dev: false + + /cache-content-type@1.0.1: + resolution: {integrity: sha512-IKufZ1o4Ut42YUrZSo8+qnMTrFuKkvyoLXUywKz9GJ5BrhOFGhLdkx9sG4KAnVvbY6kEcSFjLQul+DVmBm2bgA==} + engines: {node: '>= 6.0.0'} + requiresBuild: true + dependencies: + mime-types: 2.1.35 + ylru: 1.3.2 + dev: false + optional: true + + /call-bind@1.0.2: + resolution: {integrity: sha512-7O+FbCihrB5WGbFYesctwmTKae6rOiIzmz1icreWJ+0aA7LJfuqhEso2T9ncpcFtzMQtzXf2QGGueWJGTYsqrA==} + dependencies: + function-bind: 1.1.1 + get-intrinsic: 1.2.1 + + /callsites@3.1.0: + resolution: {integrity: sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==} + engines: {node: '>=6'} + + /camelcase@5.3.1: + resolution: {integrity: sha512-L28STB170nwWS63UjtlEOE3dldQApaJXZkOI1uMFfzf3rRuPegHaHesyee+YxQ+W6SvRDQV6UrdOdRiR153wJg==} + engines: {node: '>=6'} + dev: true + + /camelcase@6.3.0: + resolution: {integrity: sha512-Gmy6FhYlCY7uOElZUSbxo2UCDH8owEk996gkbrpsgGtrJLM3J7jGxl9Ic7Qwwj4ivOE5AWZWRMecDdF7hqGjFA==} + engines: {node: '>=10'} + dev: true + + /caniuse-lite@1.0.30001546: + resolution: {integrity: sha512-zvtSJwuQFpewSyRrI3AsftF6rM0X80mZkChIt1spBGEvRglCrjTniXvinc8JKRoqTwXAgvqTImaN9igfSMtUBw==} + + /chalk@2.4.2: + resolution: {integrity: sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==} + engines: {node: '>=4'} + dependencies: + ansi-styles: 3.2.1 + escape-string-regexp: 1.0.5 + supports-color: 5.5.0 + + /chalk@3.0.0: + resolution: {integrity: sha512-4D3B6Wf41KOYRFdszmDqMCGq5VV/uMAB273JILmO+3jAlh8X4qDtdtgCR3fxtbLEMzSx22QdhnDcJvu2u1fVwg==} + engines: {node: '>=8'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /chalk@4.1.2: + resolution: {integrity: sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + supports-color: 7.2.0 + + /char-regex@1.0.2: + resolution: {integrity: sha512-kWWXztvZ5SBQV+eRgKFeh8q5sLuZY2+8WUIzlxWVTg+oGwY14qylx1KbKzHd8P6ZYkAg0xyIDU9JMHhyJMZ1jw==} + engines: {node: '>=10'} + dev: true + + /chardet@0.7.0: + resolution: {integrity: sha512-mT8iDcrh03qDGRRmoA2hmBJnxpllMR+0/0qlzjqZES6NdiWDcZkCNAk4rPFZ9Q85r27unkiNNg8ZOiwZXBHwcA==} + + /check-disk-space@3.3.0: + resolution: {integrity: sha512-Hvr+Nr01xSSvuCpXvJ8oZ2iXjIu4XT3uHbw3g7F/Uiw6O5xk8c/Ot7ZGFDaTRDf2Bz8AdWA4DvpAgCJVKt8arw==} + engines: {node: '>=12'} + dev: false + + /chokidar@3.5.3: + resolution: {integrity: sha512-Dr3sfKRP6oTcjf2JmUmFJfeVMvXBdegxB0iVQ5eb2V10uFJUCAS8OByZdVAyVb8xXNz3GjjTgj9kLWsZTqE6kw==} + engines: {node: '>= 8.10.0'} + dependencies: + anymatch: 3.1.3 + braces: 3.0.2 + glob-parent: 5.1.2 + is-binary-path: 2.1.0 + is-glob: 4.0.3 + normalize-path: 3.0.0 + readdirp: 3.6.0 + optionalDependencies: + fsevents: 2.3.3 + + /chownr@2.0.0: + resolution: {integrity: sha512-bIomtDF5KGpdogkLd9VspvFzk9KfpyyGlS8YFVZl7TGPBHL5snIOnxeshwVgPteQ9b4Eydl+pVbIyE1DcvCWgQ==} + engines: {node: '>=10'} + dev: false + + /chrome-trace-event@1.0.3: + resolution: {integrity: sha512-p3KULyQg4S7NIHixdwbGX+nFHkoBiA4YQmyWtjb8XngSKV124nJmRysgAeujbUVb15vh+RvFUfCPqU7rXk+hZg==} + engines: {node: '>=6.0'} + + /ci-info@3.9.0: + resolution: {integrity: sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ==} + engines: {node: '>=8'} + dev: true + + /cjs-module-lexer@1.2.3: + resolution: {integrity: sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ==} + + /class-transformer@0.5.1: + resolution: {integrity: sha512-SQa1Ws6hUbfC98vKGxZH3KFY0Y1lm5Zm0SY8XX9zbK7FJCyVEac3ATW0RIpwzW+oOfmHE5PMPufDG9hCfoEOMw==} + + /class-validator-jsonschema@3.1.1(class-transformer@0.5.1)(class-validator@0.13.1): + resolution: {integrity: sha512-xga/5rTDKaYysivdX6OWaVllAS2OGeXgRRaXRo5QAW+mSDOpbjrf5JhmdPvUKMEkGyQer0gCoferB3COl170Rg==} + peerDependencies: + class-transformer: ^0.4.0 || ^0.5.0 + class-validator: ^0.13.1 + dependencies: + class-transformer: 0.5.1 + class-validator: 0.13.1 + lodash.groupby: 4.6.0 + lodash.merge: 4.6.2 + openapi3-ts: 2.0.2 + reflect-metadata: 0.1.13 + tslib: 2.6.2 + dev: false + + /class-validator@0.13.1: + resolution: {integrity: sha512-zWIeYFhUitvAHBwNhDdCRK09hWx+P0HUwFE8US8/CxFpMVzkUK8RJl7yOIE+BVu2lxyPNgeOaFv78tLE47jBIg==} + dependencies: + '@types/validator': 13.11.2 + libphonenumber-js: 1.10.47 + validator: 13.11.0 + dev: false + + /class-validator@0.13.2: + resolution: {integrity: sha512-yBUcQy07FPlGzUjoLuUfIOXzgynnQPPruyK1Ge2B74k9ROwnle1E+NxLWnUv5OLU8hA/qL5leAE9XnXq3byaBw==} + dependencies: + libphonenumber-js: 1.10.47 + validator: 13.11.0 + + /clean-stack@2.2.0: + resolution: {integrity: sha512-4diC9HaTE+KRAMWhDhrGOECgWZxoevMc5TlkObMqNSsVU62PYzXZ/SMTjzyGAFF1YusgxGcSWTEXBhp0CPwQ1A==} + engines: {node: '>=6'} + dev: false + + /cli-cursor@3.1.0: + resolution: {integrity: sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==} + engines: {node: '>=8'} + dependencies: + restore-cursor: 3.1.0 + + /cli-spinners@2.9.1: + resolution: {integrity: sha512-jHgecW0pxkonBJdrKsqxgRX9AcG+u/5k0Q7WPDfi8AogLAdwxEkyYYNWwZ5GvVFoFx2uiY1eNcSK00fh+1+FyQ==} + engines: {node: '>=6'} + + /cli-table3@0.6.2: + resolution: {integrity: sha512-QyavHCaIC80cMivimWu4aWHilIpiDpfm3hGmqAmXVL1UsnbLuBSMd21hTX6VY4ZSDSM73ESLeF8TOYId3rBTbw==} + engines: {node: 10.* || >= 12.*} + dependencies: + string-width: 4.2.3 + optionalDependencies: + '@colors/colors': 1.5.0 + + /cli-width@3.0.0: + resolution: {integrity: sha512-FxqpkPPwu1HjuN93Omfm4h8uIanXofW0RxVEW3k5RKx+mJJYSthzNhp32Kzxxy3YAEZ/Dc/EWN1vZRY0+kOhbw==} + engines: {node: '>= 10'} + + /cliui@7.0.4: + resolution: {integrity: sha512-OcRE68cOsVMXp1Yvonl/fzkQOyjLSu/8bhPDfQt0e0/Eb283TKP20Fs2MqoPsr9SwA595rRCA+QMzYc9nBP+JQ==} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: true + + /cliui@8.0.1: + resolution: {integrity: sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==} + engines: {node: '>=12'} + dependencies: + string-width: 4.2.3 + strip-ansi: 6.0.1 + wrap-ansi: 7.0.0 + dev: false + + /clone@1.0.4: + resolution: {integrity: sha512-JQHZ2QMW6l3aH/j6xCqQThY/9OH4D/9ls34cgkUBiEeocRTU04tHfKPBsUK1PqZCUQM7GiA0IIXJSuXHI64Kbg==} + engines: {node: '>=0.8'} + + /co-body@6.1.0: + resolution: {integrity: sha512-m7pOT6CdLN7FuXUcpuz/8lfQ/L77x8SchHCF4G0RBTJO20Wzmhn5Sp4/5WsKy8OSpifBSUrmg83qEqaDHdyFuQ==} + requiresBuild: true + dependencies: + inflation: 2.0.0 + qs: 6.11.2 + raw-body: 2.5.2 + type-is: 1.6.18 + dev: false + optional: true + + /co@4.6.0: + resolution: {integrity: sha512-QVb0dM5HvG+uaxitm8wONl7jltx8dqhfU33DcqtOZcLSVIKSDDLDi7+0LbAKiyI8hD9u42m2YxXSkMGWThaecQ==} + engines: {iojs: '>= 1.0.0', node: '>= 0.12.0'} + + /collect-v8-coverage@1.0.2: + resolution: {integrity: sha512-lHl4d5/ONEbLlJvaJNtsF/Lz+WvB07u2ycqTYbdrq7UypDXailES4valYb2eWiJFxZlVmpGekfqoxQhzyFdT4Q==} + dev: true + + /color-convert@1.9.3: + resolution: {integrity: sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==} + dependencies: + color-name: 1.1.3 + + /color-convert@2.0.1: + resolution: {integrity: sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==} + engines: {node: '>=7.0.0'} + dependencies: + color-name: 1.1.4 + + /color-name@1.1.3: + resolution: {integrity: sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==} + + /color-name@1.1.4: + resolution: {integrity: sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==} + + /color-string@1.9.1: + resolution: {integrity: sha512-shrVawQFojnZv6xM40anx4CkoDP+fZsw/ZerEMsW/pyzsRbElpsL/DBVW7q3ExxwusdNXI3lXpuhEZkzs8p5Eg==} + dependencies: + color-name: 1.1.4 + simple-swizzle: 0.2.2 + dev: false + + /color-support@1.1.3: + resolution: {integrity: sha512-qiBjkpbMLO/HL68y+lh4q0/O1MZFj2RX6X/KmMa3+gJD3z+WwI1ZzDHysvqHGS3mP6mznPckpXmw1nI9cJjyRg==} + hasBin: true + dev: false + + /color@3.2.1: + resolution: {integrity: sha512-aBl7dZI9ENN6fUGC7mWpMTPNHmWUSNan9tuWN6ahh5ZLNk9baLJOnSMlrQkHcrfFgz2/RigjUVAjdx36VcemKA==} + dependencies: + color-convert: 1.9.3 + color-string: 1.9.1 + dev: false + + /colorspace@1.1.4: + resolution: {integrity: sha512-BgvKJiuVu1igBUF2kEjRCZXol6wiiGbY5ipL/oVPwm0BL9sIpMIzM8IK7vwuxIIzOXMV3Ey5w+vxhm0rR/TN8w==} + dependencies: + color: 3.2.1 + text-hex: 1.0.0 + dev: false + + /combined-stream@1.0.8: + resolution: {integrity: sha512-FQN4MRfuJeHf7cBbBMJFXhKSDq+2kAArBlmRBvcvFE5BB1HZKXtSFASDhdlz9zOYwxh8lDdnvmMOe/+5cdoEdg==} + engines: {node: '>= 0.8'} + dependencies: + delayed-stream: 1.0.0 + + /commander@2.20.3: + resolution: {integrity: sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==} + + /commander@4.1.1: + resolution: {integrity: sha512-NOKm8xhkzAjzFx8B2v5OAHT+u5pRQc2UCa2Vq9jYL/31o2wi9mxBA7LIFs3sV5VSC49z6pEhfbMULvShKj26WA==} + engines: {node: '>= 6'} + + /component-emitter@1.3.0: + resolution: {integrity: sha512-Rd3se6QB+sO1TwqZjscQrurpEPIfO0/yYnSin6Q/rD3mOutHvUrCAhJub3r90uNb+SESBuE0QYoB90YdfatsRg==} + dev: true + + /concat-map@0.0.1: + resolution: {integrity: sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==} + + /concat-stream@1.6.2: + resolution: {integrity: sha512-27HBghJxjiZtIk3Ycvn/4kbJk/1uZuJFfuPEns6LaEvpvG1f0hTea8lilrouyo9mVc2GWdcEZ8OLoGmSADlrCw==} + engines: {'0': node >= 0.8} + dependencies: + buffer-from: 1.1.2 + inherits: 2.0.4 + readable-stream: 2.3.8 + typedarray: 0.0.6 + + /confusing-browser-globals@1.0.11: + resolution: {integrity: sha512-JsPKdmh8ZkmnHxDk55FZ1TqVLvEQTvoByJZRN9jzI0UjxK/QgAmsphz7PGtqgPieQZ/CQcHWXCR7ATDNhGe+YA==} + dev: true + + /consola@2.15.3: + resolution: {integrity: sha512-9vAdYbHj6x2fLKC4+oPH0kFzY/orMZyG2Aj+kNylHxKGJ/Ed4dpNyAQYwJOdqO4zdM7XpVHmyejQDcQHrnuXbw==} + + /console-control-strings@1.1.0: + resolution: {integrity: sha512-ty/fTekppD2fIwRvnZAVdeOiGd1c7YXEixbgJTNzqcxJWKQnjJ/V1bNEEE6hygpM3WjwHFUVK6HTjWSzV4a8sQ==} + dev: false + + /console-log-level@1.4.1: + resolution: {integrity: sha512-VZzbIORbP+PPcN/gg3DXClTLPLg5Slwd5fL2MIc+o1qZ4BXBvWyc6QxPk6T/Mkr6IVjRpoAGf32XxP3ZWMVRcQ==} + requiresBuild: true + dev: false + optional: true + + /content-disposition@0.5.4: + resolution: {integrity: sha512-FveZTNuGw04cxlAiWbzi6zTAL/lhehaWbTtgluJh4/E95DqMwTmha3KZN1aAWA8cFIhHzMZUvLevkw5Rqk+tSQ==} + engines: {node: '>= 0.6'} + dependencies: + safe-buffer: 5.2.1 + + /content-type@1.0.5: + resolution: {integrity: sha512-nTjqfcBFEipKdXCv4YDQWCfmcLZKm81ldF0pAopTvyrFGVbcR6P/VAAd5G7N+0tTr8QqiU0tFadD6FK4NtJwOA==} + engines: {node: '>= 0.6'} + + /convert-source-map@1.9.0: + resolution: {integrity: sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==} + dev: true + + /convert-source-map@2.0.0: + resolution: {integrity: sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==} + dev: true + + /cookie-signature@1.0.6: + resolution: {integrity: sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==} + + /cookie@0.4.2: + resolution: {integrity: sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==} + engines: {node: '>= 0.6'} + dev: false + + /cookie@0.5.0: + resolution: {integrity: sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw==} + engines: {node: '>= 0.6'} + + /cookiejar@2.1.4: + resolution: {integrity: sha512-LDx6oHrK+PhzLKJU9j5S7/Y3jM/mUHvD/DeI1WQmJn652iPC5Y4TBzC9l+5OMOXlyTTA+SmVUPm0HQUwpD5Jqw==} + dev: true + + /cookies@0.8.0: + resolution: {integrity: sha512-8aPsApQfebXnuI+537McwYsDtjVxGm8gTIzQI3FDW6t5t/DAhERxtnbEPN/8RX+uZthoz4eCOgloXaE5cYyNow==} + engines: {node: '>= 0.8'} + requiresBuild: true + dependencies: + depd: 2.0.0 + keygrip: 1.1.0 + dev: false + optional: true + + /copy-to@2.0.1: + resolution: {integrity: sha512-3DdaFaU/Zf1AnpLiFDeNCD4TOWe3Zl2RZaTzUvWiIk5ERzcCodOE20Vqq4fzCbNoHURFHT4/us/Lfq+S2zyY4w==} + requiresBuild: true + dev: false + optional: true + + /core-util-is@1.0.3: + resolution: {integrity: sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==} + + /cors@2.8.5: + resolution: {integrity: sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==} + engines: {node: '>= 0.10'} + dependencies: + object-assign: 4.1.1 + vary: 1.1.2 + + /cosmiconfig@7.1.0: + resolution: {integrity: sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==} + engines: {node: '>=10'} + dependencies: + '@types/parse-json': 4.0.0 + import-fresh: 3.3.0 + parse-json: 5.2.0 + path-type: 4.0.0 + yaml: 1.10.2 + + /create-require@1.1.1: + resolution: {integrity: sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==} + dev: true + + /cron@1.8.2: + resolution: {integrity: sha512-Gk2c4y6xKEO8FSAUTklqtfSr7oTq0CiPQeLBG5Fl0qoXpZyMcj1SG59YL+hqq04bu6/IuEA7lMkYDAplQNKkyg==} + dependencies: + moment-timezone: 0.5.43 + dev: false + + /cross-spawn@7.0.3: + resolution: {integrity: sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==} + engines: {node: '>= 8'} + dependencies: + path-key: 3.1.1 + shebang-command: 2.0.0 + which: 2.0.2 + + /cssom@0.3.8: + resolution: {integrity: sha512-b0tGHbfegbhPJpxpiBPU2sCkigAqtM9O121le6bbOlgyV+NyGyCmVfJ6QW9eRjz8CpNfWEOYBIMIGRYkLwsIYg==} + dev: true + + /cssom@0.4.4: + resolution: {integrity: sha512-p3pvU7r1MyyqbTk+WbNJIgJjG2VmTIaB10rI93LzVPrmDJKkzKYMtxxyAvQXR/NS6otuzveI7+7BBq3SjBS2mw==} + dev: true + + /cssstyle@2.3.0: + resolution: {integrity: sha512-AZL67abkUzIuvcHqk7c09cezpGNcxUxU4Ioi/05xHk4DQeTkWmGYftIE6ctU6AEt+Gn4n1lDStOtj7FKycP71A==} + engines: {node: '>=8'} + dependencies: + cssom: 0.3.8 + dev: true + + /data-urls@2.0.0: + resolution: {integrity: sha512-X5eWTSXO/BJmpdIKCRuKUgSCgAN0OwliVK3yPKbwIWU1Tdw5BRajxlzMidvh+gwko9AfQ9zIj52pzF91Q3YAvQ==} + engines: {node: '>=10'} + dependencies: + abab: 2.0.6 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + dev: true + + /dayjs@1.11.10: + resolution: {integrity: sha512-vjAczensTgRcqDERK0SR2XMwsF/tSvnvlv6VcF2GIhg6Sx4yOIt/irsr1RDJsKiIyBzJDpCoXiWWq28MqH2cnQ==} + dev: false + + /debug@2.6.9: + resolution: {integrity: sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.0.0 + + /debug@3.2.7: + resolution: {integrity: sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.3 + + /debug@4.3.4: + resolution: {integrity: sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==} + engines: {node: '>=6.0'} + peerDependencies: + supports-color: '*' + peerDependenciesMeta: + supports-color: + optional: true + dependencies: + ms: 2.1.2 + + /decimal.js@10.4.3: + resolution: {integrity: sha512-VBBaLc1MgL5XpzgIP7ny5Z6Nx3UrRkIViUkPUdtl9aya5amy3De1gsUUSB1g3+3sExYNjCAsAznmukyxCb1GRA==} + dev: true + + /decode-uri-component@0.2.2: + resolution: {integrity: sha512-FqUYQ+8o158GyGTrMFJms9qh3CqTKvAqgqsTnkLI8sKu0028orqBhxNMFkFen0zGyg6epACD32pjVk58ngIErQ==} + engines: {node: '>=0.10'} + dev: false + + /dedent@0.7.0: + resolution: {integrity: sha512-Q6fKUPqnAHAyhiUgFU7BUzLiv0kd8saH9al7tnu5Q/okj6dnupxyTgFIBjVzJATdfIAm9NAsvXNzjaKa+bxVyA==} + dev: true + + /deep-equal@1.0.1: + resolution: {integrity: sha512-bHtC0iYvWhyaTzvV3CZgPeZQqCOBGyGsVV7v4eevpdkLHfiSrXUdBG+qAuSz4RI70sszvjQ1QSZ98An1yNwpSw==} + requiresBuild: true + dev: false + optional: true + + /deep-is@0.1.4: + resolution: {integrity: sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==} + dev: true + + /deepmerge@4.3.1: + resolution: {integrity: sha512-3sUqbMEc77XqpdNO7FRyRog+eW3ph+GYCbj+rK+uYyRMuwsVy0rMiVtPn+QJlKFvWP/1PYpapqYn0Me2knFn+A==} + engines: {node: '>=0.10.0'} + + /defaults@1.0.4: + resolution: {integrity: sha512-eFuaLoy/Rxalv2kr+lqMlUnrDWV+3j4pljOIJgLIhI058IQfWJ7vXhyEIHu+HtC738klGALYxOKDO0bQP3tg8A==} + dependencies: + clone: 1.0.4 + + /define-data-property@1.1.0: + resolution: {integrity: sha512-UzGwzcjyv3OtAvolTj1GoyNYzfFR+iqbGjcnBEENZVCpM4/Ng1yhGNvS3lR/xDS74Tb2wGG9WzNSNIOS9UVb2g==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + gopd: 1.0.1 + has-property-descriptors: 1.0.0 + + /define-properties@1.2.1: + resolution: {integrity: sha512-8QmQKqEASLd5nx0U1B1okLElbUuuttJ/AnYmRXbbbGDWh6uS208EjD4Xqq/I9wK7u0v6O08XhTWnt5XtEbR6Dg==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.0 + has-property-descriptors: 1.0.0 + object-keys: 1.1.1 + + /delayed-stream@1.0.0: + resolution: {integrity: sha512-ZySD7Nf91aLB0RxL4KGrKHBXl7Eds1DAmEdcoVawXnLD7SDhpNgtuII2aAkg7a7QS41jxPSZ17p4VdGnMHk3MQ==} + engines: {node: '>=0.4.0'} + + /delegates@1.0.0: + resolution: {integrity: sha512-bd2L678uiWATM6m5Z1VzNCErI3jiGzt6HGY8OVICs40JQq/HALfbyNJmp0UDakEY4pMMaN0Ly5om/B1VI/+xfQ==} + dev: false + + /depd@1.1.2: + resolution: {integrity: sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==} + engines: {node: '>= 0.6'} + + /depd@2.0.0: + resolution: {integrity: sha512-g7nH6P6dyDioJogAAGprGpCtVImJhpPk/roCzdb3fIh61/s/nPsfR6onyMwkCAR/OlC3yBC0lESvUoQEAssIrw==} + engines: {node: '>= 0.8'} + + /destroy@1.2.0: + resolution: {integrity: sha512-2sJGJTaXIIaR1w4iJSNoN0hnMY7Gpc/n8D4qSCJw8QqFWXf7cuAgnEHxBpweaVcPevC2l3KpjYCx3NypQQgaJg==} + engines: {node: '>= 0.8', npm: 1.2.8000 || >= 1.4.16} + + /detect-newline@3.1.0: + resolution: {integrity: sha512-TLz+x/vEXm/Y7P7wn1EJFNLxYpUD4TgMosxY6fAVJUnJMbupHBOncxyWUG9OpTaH9EBD7uFI5LfEgmMOc54DsA==} + engines: {node: '>=8'} + dev: true + + /dezalgo@1.0.4: + resolution: {integrity: sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==} + dependencies: + asap: 2.0.6 + wrappy: 1.0.2 + dev: true + + /dicer@0.2.5: + resolution: {integrity: sha512-FDvbtnq7dzlPz0wyYlOExifDEZcu8h+rErEXgfxqmLfRfC/kJidEFh4+effJRO3P0xmfqyPbSMG0LveNRfTKVg==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dependencies: + readable-stream: 1.1.14 + streamsearch: 0.1.2 + dev: false + optional: true + + /diff-sequences@27.5.1: + resolution: {integrity: sha512-k1gCAXAsNgLwEL+Y8Wvl+M6oEFj5bgazfZULpS5CneoPPXRaCCW7dm+q21Ky2VEE5X+VeRDBVg1Pcvvsr4TtNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + /diff@4.0.2: + resolution: {integrity: sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==} + engines: {node: '>=0.3.1'} + dev: true + + /dir-glob@3.0.1: + resolution: {integrity: sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==} + engines: {node: '>=8'} + dependencies: + path-type: 4.0.0 + dev: true + + /doctrine@2.1.0: + resolution: {integrity: sha512-35mSku4ZXK0vfCuHEDAwt55dg2jNajHZ1odvF+8SSr82EsZY4QmXfuWso8oEd8zRhVObSN18aM0CjSdoBX7zIw==} + engines: {node: '>=0.10.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /doctrine@3.0.0: + resolution: {integrity: sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==} + engines: {node: '>=6.0.0'} + dependencies: + esutils: 2.0.3 + dev: true + + /domexception@2.0.1: + resolution: {integrity: sha512-yxJ2mFy/sibVQlu5qHjOkf9J3K6zgmCxgJ94u2EdvDOV09H+32LtRswEcUsmUWN72pVLOEnTSRaIVVzVQgS0dg==} + engines: {node: '>=8'} + dependencies: + webidl-conversions: 5.0.0 + dev: true + + /dotenv-cli@4.1.1: + resolution: {integrity: sha512-XvKv1pa+UBrsr3CtLGBsR6NdsoS7znqaHUf4Knj0eZO+gOI/hjj9KgWDP+KjpfEbj6wAba1UpbhaP9VezNkWhg==} + hasBin: true + dependencies: + cross-spawn: 7.0.3 + dotenv: 8.6.0 + dotenv-expand: 5.1.0 + minimist: 1.2.8 + dev: true + + /dotenv-expand@5.1.0: + resolution: {integrity: sha512-YXQl1DSa4/PQyRfgrv6aoNjhasp/p4qs9FjJ4q4cQk+8m4r6k4ZSiEyytKG8f8W9gi8WsQtIObNmKd+tMzNTmA==} + + /dotenv@16.0.0: + resolution: {integrity: sha512-qD9WU0MPM4SWLPJy/r2Be+2WgQj8plChsyrCNQzW/0WjvcJQiKQJ9mH3ZgB3fxbUUxgc/11ZJ0Fi5KiimWGz2Q==} + engines: {node: '>=12'} + dev: false + + /dotenv@8.6.0: + resolution: {integrity: sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g==} + engines: {node: '>=10'} + dev: true + + /ecdsa-sig-formatter@1.0.11: + resolution: {integrity: sha512-nagl3RYrbNv6kQkeJIpt6NJZy8twLB/2vtz6yN9Z4vRKHN4/QZJIEbqohALSgwKdnksuY3k5Addp5lg8sVoVcQ==} + dependencies: + safe-buffer: 5.2.1 + dev: false + + /ee-first@1.1.1: + resolution: {integrity: sha512-WMwm9LhRUo+WUaRN+vRuETqG89IgZphVSNkdFgeb6sS/E4OrDIN7t48CAewSHXc6C8lefD8KKfr5vY61brQlow==} + + /elastic-apm-node@3.50.0: + resolution: {integrity: sha512-5OT+oQ1idKIlJPXWRc8LfGbGooCfncN3tnb1cze5i2mHpYdFHXu1UouhxxXmv87jQY1bB8aMM87E83IJmUnihQ==} + engines: {node: '>=8.6.0'} + requiresBuild: true + dependencies: + '@elastic/ecs-pino-format': 1.3.0 + '@opentelemetry/api': 1.6.0 + '@opentelemetry/core': 1.17.0(@opentelemetry/api@1.6.0) + '@opentelemetry/sdk-metrics': 1.17.0(@opentelemetry/api@1.6.0) + after-all-results: 2.0.0 + agentkeepalive: 4.5.0 + async-cache: 1.1.0 + async-value-promise: 1.1.1 + basic-auth: 2.0.1 + breadth-filter: 2.0.0 + cookie: 0.5.0 + core-util-is: 1.0.3 + end-of-stream: 1.4.4 + error-callsites: 2.0.4 + error-stack-parser: 2.1.4 + escape-string-regexp: 4.0.0 + fast-safe-stringify: 2.1.1 + fast-stream-to-buffer: 1.0.0 + http-headers: 3.0.2 + import-in-the-middle: 1.4.2 + is-native: 1.0.1 + lru-cache: 6.0.0 + measured-reporting: 1.51.1 + module-details-from-path: 1.0.3 + monitor-event-loop-delay: 1.0.0 + object-filter-sequence: 1.0.0 + object-identity-map: 1.0.2 + original-url: 1.2.3 + pino: 6.14.0 + readable-stream: 3.6.2 + relative-microtime: 2.0.0 + require-in-the-middle: 7.2.0 + semver: 6.3.1 + shallow-clone-shim: 2.0.0 + source-map: 0.8.0-beta.0 + sql-summary: 1.0.1 + stream-chopper: 3.0.1 + unicode-byte-truncate: 1.0.0 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /electron-to-chromium@1.4.543: + resolution: {integrity: sha512-t2ZP4AcGE0iKCCQCBx/K2426crYdxD3YU6l0uK2EO3FZH0pbC4pFz/sZm2ruZsND6hQBTcDWWlo/MLpiOdif5g==} + + /emittery@0.8.1: + resolution: {integrity: sha512-uDfvUjVrfGJJhymx/kz6prltenw1u7WrCg1oa94zYY8xxVpLLUu045LAT0dhDZdXG58/EpPL/5kA180fQ/qudg==} + engines: {node: '>=10'} + dev: true + + /emoji-regex@8.0.0: + resolution: {integrity: sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==} + + /enabled@2.0.0: + resolution: {integrity: sha512-AKrN98kuwOzMIdAizXGI86UFBoo26CL21UM763y1h/GMSJ4/OHU9k2YlsmBpyScFo/wbLzWQJBMCW4+IO3/+OQ==} + dev: false + + /encodeurl@1.0.2: + resolution: {integrity: sha512-TPJXq8JqFaVYm2CWmPvnP2Iyo4ZSM7/QKcSmuMLDObfpH5fi7RUGmd/rTDf+rut/saiDiQEeVTNgAmJEdAOx0w==} + engines: {node: '>= 0.8'} + + /encoding@0.1.13: + resolution: {integrity: sha512-ETBauow1T35Y/WZMkio9jiM0Z5xjHHmJ4XmjZOq1l/dXz3lr2sRn87nJy20RupqSh1F2m3HHPSp8ShIPQJrJ3A==} + requiresBuild: true + dependencies: + iconv-lite: 0.6.3 + dev: false + optional: true + + /end-of-stream@1.4.4: + resolution: {integrity: sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==} + dependencies: + once: 1.4.0 + + /enhanced-resolve@5.15.0: + resolution: {integrity: sha512-LXYT42KJ7lpIKECr2mAXIaMldcNCh/7E0KBKOu4KSfkHmP+mZmSs+8V5gBAqisWBy0OO4W5Oyys0GO1Y8KtdKg==} + engines: {node: '>=10.13.0'} + dependencies: + graceful-fs: 4.2.11 + tapable: 2.2.1 + + /env-paths@2.2.1: + resolution: {integrity: sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==} + engines: {node: '>=6'} + dev: false + + /err-code@2.0.3: + resolution: {integrity: sha512-2bmlRpNKBxT/CRmPOlyISQpNj+qSeYvcym/uT0Jx2bMOlKLtSy1ZmLuVxSEKKyor/N5yhvp/ZiG1oE3DEYMSFA==} + dev: false + + /error-callsites@2.0.4: + resolution: {integrity: sha512-V877Ch4FC4FN178fDK1fsrHN4I1YQIBdtjKrHh3BUHMnh3SMvwUVrqkaOgDpUuevgSNna0RBq6Ox9SGlxYrigA==} + engines: {node: '>=6.x'} + requiresBuild: true + dev: false + optional: true + + /error-ex@1.3.2: + resolution: {integrity: sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==} + dependencies: + is-arrayish: 0.2.1 + + /error-stack-parser@2.1.4: + resolution: {integrity: sha512-Sk5V6wVazPhq5MhpO+AUxJn5x7XSXGl1R93Vn7i+zS15KDVxQijejNCrz8340/2bgLBjR9GtEG8ZVKONDjcqGQ==} + requiresBuild: true + dependencies: + stackframe: 1.3.4 + dev: false + optional: true + + /es-abstract@1.22.2: + resolution: {integrity: sha512-YoxfFcDmhjOgWPWsV13+2RNjq1F6UQnfs+8TftwNqtzlmFzEXvlUwdrNrYeaizfjQzRMxkZ6ElWMOJIFKdVqwA==} + engines: {node: '>= 0.4'} + dependencies: + array-buffer-byte-length: 1.0.0 + arraybuffer.prototype.slice: 1.0.2 + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + es-set-tostringtag: 2.0.1 + es-to-primitive: 1.2.1 + function.prototype.name: 1.1.6 + get-intrinsic: 1.2.1 + get-symbol-description: 1.0.0 + globalthis: 1.0.3 + gopd: 1.0.1 + has: 1.0.4 + has-property-descriptors: 1.0.0 + has-proto: 1.0.1 + has-symbols: 1.0.3 + internal-slot: 1.0.5 + is-array-buffer: 3.0.2 + is-callable: 1.2.7 + is-negative-zero: 2.0.2 + is-regex: 1.1.4 + is-shared-array-buffer: 1.0.2 + is-string: 1.0.7 + is-typed-array: 1.1.12 + is-weakref: 1.0.2 + object-inspect: 1.12.3 + object-keys: 1.1.1 + object.assign: 4.1.4 + regexp.prototype.flags: 1.5.1 + safe-array-concat: 1.0.1 + safe-regex-test: 1.0.0 + string.prototype.trim: 1.2.8 + string.prototype.trimend: 1.0.7 + string.prototype.trimstart: 1.0.7 + typed-array-buffer: 1.0.0 + typed-array-byte-length: 1.0.0 + typed-array-byte-offset: 1.0.0 + typed-array-length: 1.0.4 + unbox-primitive: 1.0.2 + which-typed-array: 1.1.11 + + /es-module-lexer@0.9.3: + resolution: {integrity: sha512-1HQ2M2sPtxwnvOvT1ZClHyQDiggdNjURWpY2we6aMKCQiUVxTmVs2UYPLIrD84sS+kMdUwfBSylbJPwNnBrnHQ==} + + /es-module-lexer@1.3.1: + resolution: {integrity: sha512-JUFAyicQV9mXc3YRxPnDlrfBKpqt6hUYzz9/boprUJHs4e4KVr3XwOF70doO6gwXUor6EWZJAyWAfKki84t20Q==} + dev: true + + /es-set-tostringtag@2.0.1: + resolution: {integrity: sha512-g3OMbtlwY3QewlqAiMLI47KywjWZoEytKr8pf6iTC8uJq5bIAH52Z9pnQ8pVL6whrCto53JZDuUIsifGeLorTg==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.4 + has-tostringtag: 1.0.0 + + /es-shim-unscopables@1.0.0: + resolution: {integrity: sha512-Jm6GPcCdC30eMLbZ2x8z2WuRwAws3zTBBKuusffYVUrNj/GVSUAZ+xKMaUpfNDR5IbyNA5LJbaecoUVbmUcB1w==} + dependencies: + has: 1.0.4 + dev: true + + /es-to-primitive@1.2.1: + resolution: {integrity: sha512-QCOllgZJtaUo9miYBcLChTUaHNjJF3PYs1VidD7AwiEj1kYxKeQTctLAezAOH5ZKRH0g2IgPn6KwB4IT8iRpvA==} + engines: {node: '>= 0.4'} + dependencies: + is-callable: 1.2.7 + is-date-object: 1.0.5 + is-symbol: 1.0.4 + + /escalade@3.1.1: + resolution: {integrity: sha512-k0er2gUkLf8O0zKJiAhmkTnJlTvINGv7ygDNPbeIsX/TJjGJZHuh9B2UxbsaEkmlEo9MfhrSzmhIlhRlI2GXnw==} + engines: {node: '>=6'} + + /escape-html@1.0.3: + resolution: {integrity: sha512-NiSupZ4OeuGwr68lGIeym/ksIZMJodUGOSCZ/FSnTxcrekbvqrgdUxlJOMpijaKZVjAJrWrGs/6Jy8OMuyj9ow==} + + /escape-string-regexp@1.0.5: + resolution: {integrity: sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==} + engines: {node: '>=0.8.0'} + + /escape-string-regexp@2.0.0: + resolution: {integrity: sha512-UpzcLCXolUWcNu5HtVMHYdXJjArjsF9C0aNnquZYY4uW/Vu0miy5YoWvbV345HauVvcAUnpRuhMMcqTcGOY2+w==} + engines: {node: '>=8'} + dev: true + + /escape-string-regexp@4.0.0: + resolution: {integrity: sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==} + engines: {node: '>=10'} + + /escodegen@2.1.0: + resolution: {integrity: sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==} + engines: {node: '>=6.0'} + hasBin: true + dependencies: + esprima: 4.0.1 + estraverse: 5.3.0 + esutils: 2.0.3 + optionalDependencies: + source-map: 0.6.1 + dev: true + + /eslint-config-airbnb-base@15.0.0(eslint-plugin-import@2.28.1)(eslint@8.50.0): + resolution: {integrity: sha512-xaX3z4ZZIcFLvh2oUNvcX5oEofXda7giYmuplVxoOg5A7EXJMrUyqRgR+mhDhPK8LZ4PttFOBvCYDbX3sUoUig==} + engines: {node: ^10.12.0 || >=12.0.0} + peerDependencies: + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.2 + dependencies: + confusing-browser-globals: 1.0.11 + eslint: 8.50.0 + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) + object.assign: 4.1.4 + object.entries: 1.1.7 + semver: 6.3.1 + dev: true + + /eslint-config-airbnb-typescript@16.2.0(@typescript-eslint/eslint-plugin@5.62.0)(@typescript-eslint/parser@5.62.0)(eslint-plugin-import@2.28.1)(eslint@8.50.0): + resolution: {integrity: sha512-OUaMPZpTOZGKd5tXOjJ9PRU4iYNW/Z5DoHIynjsVK/FpkWdiY5+nxQW6TiJAlLwVI1l53xUOrnlZWtVBVQzuWA==} + peerDependencies: + '@typescript-eslint/eslint-plugin': ^5.0.0 + '@typescript-eslint/parser': ^5.0.0 + eslint: ^7.32.0 || ^8.2.0 + eslint-plugin-import: ^2.25.3 + dependencies: + '@typescript-eslint/eslint-plugin': 5.62.0(@typescript-eslint/parser@5.62.0)(eslint@8.50.0)(typescript@4.9.5) + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + eslint: 8.50.0 + eslint-config-airbnb-base: 15.0.0(eslint-plugin-import@2.28.1)(eslint@8.50.0) + eslint-plugin-import: 2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0) + dev: true + + /eslint-config-prettier@8.10.0(eslint@8.50.0): + resolution: {integrity: sha512-SM8AMJdeQqRYT9O9zguiruQZaN7+z+E4eAP9oiLNGKMtomwaB1E9dcgUD6ZAn/eQAb52USbvezbiljfZUhbJcg==} + hasBin: true + peerDependencies: + eslint: '>=7.0.0' + dependencies: + eslint: 8.50.0 + dev: true + + /eslint-import-resolver-node@0.3.9: + resolution: {integrity: sha512-WFj2isz22JahUv+B788TlO3N6zL3nNJGU8CcZbPZvVEkBPaJdCV4vy5wyghty5ROFbCRnm132v8BScu5/1BQ8g==} + dependencies: + debug: 3.2.7 + is-core-module: 2.13.0 + resolve: 1.22.6 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-module-utils@2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0): + resolution: {integrity: sha512-aWajIYfsqCKRDgUfjEXNN/JlrzauMuSEy5sbd7WXbtW3EH6A6MpwEh42c7qD+MqQo9QMJ6fWLAeIJynx0g6OAw==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: '*' + eslint-import-resolver-node: '*' + eslint-import-resolver-typescript: '*' + eslint-import-resolver-webpack: '*' + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + eslint: + optional: true + eslint-import-resolver-node: + optional: true + eslint-import-resolver-typescript: + optional: true + eslint-import-resolver-webpack: + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + debug: 3.2.7 + eslint: 8.50.0 + eslint-import-resolver-node: 0.3.9 + transitivePeerDependencies: + - supports-color + dev: true + + /eslint-plugin-import@2.28.1(@typescript-eslint/parser@5.62.0)(eslint@8.50.0): + resolution: {integrity: sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==} + engines: {node: '>=4'} + peerDependencies: + '@typescript-eslint/parser': '*' + eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8 + peerDependenciesMeta: + '@typescript-eslint/parser': + optional: true + dependencies: + '@typescript-eslint/parser': 5.62.0(eslint@8.50.0)(typescript@4.9.5) + array-includes: 3.1.7 + array.prototype.findlastindex: 1.2.3 + array.prototype.flat: 1.3.2 + array.prototype.flatmap: 1.3.2 + debug: 3.2.7 + doctrine: 2.1.0 + eslint: 8.50.0 + eslint-import-resolver-node: 0.3.9 + eslint-module-utils: 2.8.0(@typescript-eslint/parser@5.62.0)(eslint-import-resolver-node@0.3.9)(eslint@8.50.0) + has: 1.0.4 + is-core-module: 2.13.0 + is-glob: 4.0.3 + minimatch: 3.1.2 + object.fromentries: 2.0.7 + object.groupby: 1.0.1 + object.values: 1.1.7 + semver: 6.3.1 + tsconfig-paths: 3.14.2 + transitivePeerDependencies: + - eslint-import-resolver-typescript + - eslint-import-resolver-webpack + - supports-color + dev: true + + /eslint-plugin-prettier@4.2.1(eslint-config-prettier@8.10.0)(eslint@8.50.0)(prettier@2.8.8): + resolution: {integrity: sha512-f/0rXLXUt0oFYs8ra4w49wYZBG5GKZpAYsJSm6rnYL5uVDjd+zowwMwVZHnAjf4edNrKpCDYfXDgmRE/Ak7QyQ==} + engines: {node: '>=12.0.0'} + peerDependencies: + eslint: '>=7.28.0' + eslint-config-prettier: '*' + prettier: '>=2.0.0' + peerDependenciesMeta: + eslint-config-prettier: + optional: true + dependencies: + eslint: 8.50.0 + eslint-config-prettier: 8.10.0(eslint@8.50.0) + prettier: 2.8.8 + prettier-linter-helpers: 1.0.0 + dev: true + + /eslint-scope@5.1.1: + resolution: {integrity: sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==} + engines: {node: '>=8.0.0'} + dependencies: + esrecurse: 4.3.0 + estraverse: 4.3.0 + + /eslint-scope@7.2.2: + resolution: {integrity: sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + esrecurse: 4.3.0 + estraverse: 5.3.0 + dev: true + + /eslint-visitor-keys@3.4.3: + resolution: {integrity: sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dev: true + + /eslint@8.50.0: + resolution: {integrity: sha512-FOnOGSuFuFLv/Sa+FDVRZl4GGVAAFFi8LecRsI5a1tMO5HIE8nCm4ivAlzt4dT3ol/PaaGC0rJEEXQmHJBGoOg==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + hasBin: true + dependencies: + '@eslint-community/eslint-utils': 4.4.0(eslint@8.50.0) + '@eslint-community/regexpp': 4.9.1 + '@eslint/eslintrc': 2.1.2 + '@eslint/js': 8.50.0 + '@humanwhocodes/config-array': 0.11.11 + '@humanwhocodes/module-importer': 1.0.1 + '@nodelib/fs.walk': 1.2.8 + ajv: 6.12.6 + chalk: 4.1.2 + cross-spawn: 7.0.3 + debug: 4.3.4 + doctrine: 3.0.0 + escape-string-regexp: 4.0.0 + eslint-scope: 7.2.2 + eslint-visitor-keys: 3.4.3 + espree: 9.6.1 + esquery: 1.5.0 + esutils: 2.0.3 + fast-deep-equal: 3.1.3 + file-entry-cache: 6.0.1 + find-up: 5.0.0 + glob-parent: 6.0.2 + globals: 13.23.0 + graphemer: 1.4.0 + ignore: 5.2.4 + imurmurhash: 0.1.4 + is-glob: 4.0.3 + is-path-inside: 3.0.3 + js-yaml: 4.1.0 + json-stable-stringify-without-jsonify: 1.0.1 + levn: 0.4.1 + lodash.merge: 4.6.2 + minimatch: 3.1.2 + natural-compare: 1.4.0 + optionator: 0.9.3 + strip-ansi: 6.0.1 + text-table: 0.2.0 + transitivePeerDependencies: + - supports-color + dev: true + + /espree@9.6.1: + resolution: {integrity: sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==} + engines: {node: ^12.22.0 || ^14.17.0 || >=16.0.0} + dependencies: + acorn: 8.10.0 + acorn-jsx: 5.3.2(acorn@8.10.0) + eslint-visitor-keys: 3.4.3 + dev: true + + /esprima@4.0.1: + resolution: {integrity: sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /esquery@1.5.0: + resolution: {integrity: sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==} + engines: {node: '>=0.10'} + dependencies: + estraverse: 5.3.0 + dev: true + + /esrecurse@4.3.0: + resolution: {integrity: sha512-KmfKL3b6G+RXvP8N1vr3Tq1kL/oCFgn2NYXEtqP8/L3pKapUA4G8cFVaoF3SU323CD4XypR/ffioHmkti6/Tag==} + engines: {node: '>=4.0'} + dependencies: + estraverse: 5.3.0 + + /estraverse@4.3.0: + resolution: {integrity: sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==} + engines: {node: '>=4.0'} + + /estraverse@5.3.0: + resolution: {integrity: sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==} + engines: {node: '>=4.0'} + + /esutils@2.0.3: + resolution: {integrity: sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==} + engines: {node: '>=0.10.0'} + dev: true + + /etag@1.8.1: + resolution: {integrity: sha512-aIL5Fx7mawVa300al2BnEE4iNvo1qETxLrPI/o05L7z6go7fCw1J6EQmbK4FmJ2AS7kgVF/KEZWufBfdClMcPg==} + engines: {node: '>= 0.6'} + + /event-target-shim@5.0.1: + resolution: {integrity: sha512-i/2XbnSz/uxRCU6+NdVJgKWDTM427+MqYbkQzD321DuCQJUqOuJKIA0IM2+W2xtYHdKOmZ4dR6fExsd4SXL+WQ==} + engines: {node: '>=6'} + dev: false + + /events@3.3.0: + resolution: {integrity: sha512-mQw+2fkQbALzQ7V0MY0IqdnXNOeTtP4r0lN9z7AAawCXgqea7bDii20AYrIBrFd/Hx0M2Ocz6S111CaFkUcb0Q==} + engines: {node: '>=0.8.x'} + + /execa@4.1.0: + resolution: {integrity: sha512-j5W0//W7f8UxAn8hXVnwG8tLwdiUy4FJLcSupCg6maBYZDpyBvTApK7KyuI4bKj8KOh1r2YH+6ucuYtJv1bTZA==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 5.2.0 + human-signals: 1.1.1 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + + /execa@5.1.1: + resolution: {integrity: sha512-8uSpZZocAZRBAPIEINJj3Lo9HyGitllczc27Eh5YYojjMFMn8yHMDMaUHE2Jqfq05D/wucwI4JGURyXt1vchyg==} + engines: {node: '>=10'} + dependencies: + cross-spawn: 7.0.3 + get-stream: 6.0.1 + human-signals: 2.1.0 + is-stream: 2.0.1 + merge-stream: 2.0.0 + npm-run-path: 4.0.1 + onetime: 5.1.2 + signal-exit: 3.0.7 + strip-final-newline: 2.0.0 + dev: true + + /exit@0.1.2: + resolution: {integrity: sha512-Zk/eNKV2zbjpKzrsQ+n1G6poVbErQxJ0LBOJXaKZ1EViLzH+hrLu9cdXI4zw9dBQJslwBEpbQ2P1oS7nDxs6jQ==} + engines: {node: '>= 0.8.0'} + dev: true + + /expect@27.5.1: + resolution: {integrity: sha512-E1q5hSUG2AmYQwQJ041nvgpkODHQvB+RKlB4IYdru6uJsyFTRyZAP463M+1lINorwbqAmUggi6+WwkD8lCS/Dw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-get-type: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + dev: true + + /express-session@1.17.3: + resolution: {integrity: sha512-4+otWXlShYlG1Ma+2Jnn+xgKUZTMJ5QD3YvfilX3AcocOAbIkVylSWEklzALe/+Pu4qV6TYBj5GwOBFfdKqLBw==} + engines: {node: '>= 0.8.0'} + dependencies: + cookie: 0.4.2 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + on-headers: 1.0.2 + parseurl: 1.3.3 + safe-buffer: 5.2.1 + uid-safe: 2.1.5 + transitivePeerDependencies: + - supports-color + dev: false + + /express@4.18.1: + resolution: {integrity: sha512-zZBcOX9TfehHQhtupq57OF8lFZ3UZi08Y97dwFCkD8p9d/d2Y3M+ykKcwaMDEL+4qyUolgBDX6AblpR3fL212Q==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.0 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.10.3 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /express@4.18.2: + resolution: {integrity: sha512-5/PsL6iGPdfQ/lKM1UuielYgv3BUoJfz1aUwU9vHZ+J7gyvwdQXFEBIEIaxeGf0GIcreATNyBExtalisDbuMqQ==} + engines: {node: '>= 0.10.0'} + dependencies: + accepts: 1.3.8 + array-flatten: 1.1.1 + body-parser: 1.20.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookie: 0.5.0 + cookie-signature: 1.0.6 + debug: 2.6.9 + depd: 2.0.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + finalhandler: 1.2.0 + fresh: 0.5.2 + http-errors: 2.0.0 + merge-descriptors: 1.0.1 + methods: 1.1.2 + on-finished: 2.4.1 + parseurl: 1.3.3 + path-to-regexp: 0.1.7 + proxy-addr: 2.0.7 + qs: 6.11.0 + range-parser: 1.2.1 + safe-buffer: 5.2.1 + send: 0.18.0 + serve-static: 1.15.0 + setprototypeof: 1.2.0 + statuses: 2.0.1 + type-is: 1.6.18 + utils-merge: 1.0.1 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + + /external-editor@3.1.0: + resolution: {integrity: sha512-hMQ4CX1p1izmuLYyZqLMO/qGNw10wSv9QDCPfzXfyFrOaCSSoRfqE1Kf1s5an66J5JZC62NewG+mK49jOCtQew==} + engines: {node: '>=4'} + dependencies: + chardet: 0.7.0 + iconv-lite: 0.4.24 + tmp: 0.0.33 + + /fast-deep-equal@3.1.3: + resolution: {integrity: sha512-f3qQ9oQy9j2AhBe/H9VC91wLmKBCCU/gDOnKNAYG5hswO7BLKj09Hc5HYNz9cGI++xlpDCIgDaitVs03ATR84Q==} + + /fast-diff@1.3.0: + resolution: {integrity: sha512-VxPP4NqbUjj6MaAOafWeUn2cXWLcCtljklUtZf0Ind4XQ+QPtmA0b18zZy0jIQx+ExRVCR/ZQpBmik5lXshNsw==} + dev: true + + /fast-glob@3.3.1: + resolution: {integrity: sha512-kNFPyjhh5cKjrUltxs+wFx+ZkbRaxxmZ+X0ZU31SOsxCEtP9VPgtq2teZw1DebupL5GmDaNQ6yKMMVcM41iqDg==} + engines: {node: '>=8.6.0'} + dependencies: + '@nodelib/fs.stat': 2.0.5 + '@nodelib/fs.walk': 1.2.8 + glob-parent: 5.1.2 + merge2: 1.4.1 + micromatch: 4.0.5 + dev: true + + /fast-json-stable-stringify@2.1.0: + resolution: {integrity: sha512-lhd/wF+Lk98HZoTCtlVraHtfh5XYijIjalXck7saUtuanSDyLMxnHhSXEDJqHxD7msR8D0uCmqlkwjCV8xvwHw==} + + /fast-json-stringify@2.7.13: + resolution: {integrity: sha512-ar+hQ4+OIurUGjSJD1anvYSDcUflywhKjfxnsW4TBTD7+u0tJufv6DKRWoQk3vI6YBOWMoz0TQtfbe7dxbQmvA==} + engines: {node: '>= 10.0.0'} + dependencies: + ajv: 6.12.6 + deepmerge: 4.3.1 + rfdc: 1.3.0 + string-similarity: 4.0.4 + dev: false + + /fast-levenshtein@2.0.6: + resolution: {integrity: sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==} + dev: true + + /fast-redact@3.3.0: + resolution: {integrity: sha512-6T5V1QK1u4oF+ATxs1lWUmlEk6P2T9HqJG3e2DnHOdVgZy2rFJBoEnrIedcTXlkAHU/zKC+7KETJ+KGGKwxgMQ==} + engines: {node: '>=6'} + requiresBuild: true + dev: false + optional: true + + /fast-safe-stringify@2.1.1: + resolution: {integrity: sha512-W+KJc2dmILlPplD/H4K9l9LcAHAfPtP6BY84uVLXQ6Evcz9Lcg33Y2z1IVblT6xdY54PXYVHEv+0Wpq8Io6zkA==} + + /fast-stream-to-buffer@1.0.0: + resolution: {integrity: sha512-bI/544WUQlD2iXBibQbOMSmG07Hay7YrpXlKaeGTPT7H7pC0eitt3usak5vUwEvCGK/O7rUAM3iyQValGU22TQ==} + requiresBuild: true + dependencies: + end-of-stream: 1.4.4 + dev: false + optional: true + + /fastq@1.15.0: + resolution: {integrity: sha512-wBrocU2LCXXa+lWBt8RoIRD89Fi8OdABODa/kEnyeyjS5aZO5/GNvI5sEINADqP/h8M29UHTHUb53sUu5Ihqdw==} + dependencies: + reusify: 1.0.4 + dev: true + + /fb-watchman@2.0.2: + resolution: {integrity: sha512-p5161BqbuCaSnB8jIbzQHOlpgsPmK5rJVDfDKO91Axs5NC1uu3HRQm6wt9cd9/+GtQQIO53JdGXXoyDpTAsgYA==} + dependencies: + bser: 2.1.1 + dev: true + + /fecha@4.2.3: + resolution: {integrity: sha512-OP2IUU6HeYKJi3i0z4A19kHMQoLVs4Hc+DPqqxI2h/DPZHTm/vjsfC6P0b4jCMy14XizLBqvndQ+UilD7707Jw==} + dev: false + + /figures@3.2.0: + resolution: {integrity: sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg==} + engines: {node: '>=8'} + dependencies: + escape-string-regexp: 1.0.5 + + /file-entry-cache@6.0.1: + resolution: {integrity: sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==} + engines: {node: ^10.12.0 || >=12.0.0} + dependencies: + flat-cache: 3.1.0 + dev: true + + /file-uri-to-path@1.0.0: + resolution: {integrity: sha512-0Zt+s3L7Vf1biwWZ29aARiVYLx7iMGnEUl9x33fbB/j3jR81u/O2LbqK+Bm1CDSNDKVtJ/YjwY7TUd5SkeLQLw==} + dev: false + + /fill-range@7.0.1: + resolution: {integrity: sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==} + engines: {node: '>=8'} + dependencies: + to-regex-range: 5.0.1 + + /filter-obj@1.1.0: + resolution: {integrity: sha512-8rXg1ZnX7xzy2NGDVkBVaAy+lSlPNwad13BtgSlLuxfIslyt5Vg64U7tFcCt4WS1R0hvtnQybT/IyCkGZ3DpXQ==} + engines: {node: '>=0.10.0'} + dev: false + + /finalhandler@1.2.0: + resolution: {integrity: sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==} + engines: {node: '>= 0.8'} + dependencies: + debug: 2.6.9 + encodeurl: 1.0.2 + escape-html: 1.0.3 + on-finished: 2.4.1 + parseurl: 1.3.3 + statuses: 2.0.1 + unpipe: 1.0.0 + transitivePeerDependencies: + - supports-color + + /find-up@4.1.0: + resolution: {integrity: sha512-PpOwAdQ/YlXQ2vj8a3h8IipDuYRi3wceVQQGYWxNINccq40Anw7BlsEXCMbt1Zt+OLA6Fq9suIpIWD0OsnISlw==} + engines: {node: '>=8'} + dependencies: + locate-path: 5.0.0 + path-exists: 4.0.0 + dev: true + + /find-up@5.0.0: + resolution: {integrity: sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==} + engines: {node: '>=10'} + dependencies: + locate-path: 6.0.0 + path-exists: 4.0.0 + dev: true + + /flat-cache@3.1.0: + resolution: {integrity: sha512-OHx4Qwrrt0E4jEIcI5/Xb+f+QmJYNj2rrK8wiIdQOIrB9WrrJL8cjZvXdXuBTkkEwEqLycb5BeZDV1o2i9bTew==} + engines: {node: '>=12.0.0'} + dependencies: + flatted: 3.2.9 + keyv: 4.5.3 + rimraf: 3.0.2 + dev: true + + /flatstr@1.0.12: + resolution: {integrity: sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw==} + requiresBuild: true + dev: false + optional: true + + /flatted@3.2.9: + resolution: {integrity: sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ==} + dev: true + + /fn.name@1.1.0: + resolution: {integrity: sha512-GRnmB5gPyJpAhTQdSZTSp9uaPSvl09KoYcMQtsB9rQoOmzs9dH6ffeccH+Z+cv6P68Hu5bC6JjRh4Ah/mHSNRw==} + dev: false + + /follow-redirects@1.15.3: + resolution: {integrity: sha512-1VzOtuEM8pC9SFU1E+8KfTjZyMztRsgEfwQl44z8A25uy13jSzTj6dyK2Df52iV0vgHCfBwLhDWevLn95w5v6Q==} + engines: {node: '>=4.0'} + peerDependencies: + debug: '*' + peerDependenciesMeta: + debug: + optional: true + + /for-each@0.3.3: + resolution: {integrity: sha512-jqYfLp7mo9vIyQf8ykW2v7A+2N4QjeCeI5+Dz9XraiO1ign81wjiH7Fb9vSOWvQfNtmSa4H2RoQTrrXivdUZmw==} + dependencies: + is-callable: 1.2.7 + + /fork-ts-checker-webpack-plugin@7.2.11(typescript@4.7.4)(webpack@5.73.0): + resolution: {integrity: sha512-2e5+NyTUTE1Xq4fWo7KFEQblCaIvvINQwUX3jRmEGlgCTc1Ecqw/975EfQrQ0GEraxJTnp8KB9d/c8hlCHUMJA==} + engines: {node: '>=12.13.0', yarn: '>=1.0.0'} + peerDependencies: + typescript: '>3.6.0' + vue-template-compiler: '*' + webpack: ^5.11.0 + peerDependenciesMeta: + vue-template-compiler: + optional: true + dependencies: + '@babel/code-frame': 7.22.13 + chalk: 4.1.2 + chokidar: 3.5.3 + cosmiconfig: 7.1.0 + deepmerge: 4.3.1 + fs-extra: 10.1.0 + memfs: 3.5.3 + minimatch: 3.1.2 + schema-utils: 3.3.0 + semver: 7.5.4 + tapable: 2.2.1 + typescript: 4.7.4 + webpack: 5.73.0 + + /form-data@3.0.1: + resolution: {integrity: sha512-RHkBKtLWUVwd7SqRIvCZMEvAMoGUp0XU+seQiZejj0COz3RI3hWP4sCv3gZWWLjJTd7rGwcsF5eKZGii0r/hbg==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + dev: true + + /form-data@4.0.0: + resolution: {integrity: sha512-ETEklSGi5t0QMZuiXoA/Q6vcnxcLQP5vdugSpuAyi6SVGi2clPPp+xgEhuMaHC+zGgn31Kd235W35f7Hykkaww==} + engines: {node: '>= 6'} + dependencies: + asynckit: 0.4.0 + combined-stream: 1.0.8 + mime-types: 2.1.35 + + /formidable@2.1.2: + resolution: {integrity: sha512-CM3GuJ57US06mlpQ47YcunuUZ9jpm8Vx+P2CGt2j7HpgkKZO/DJYQ0Bobim8G6PFQmK5lOqOOdUXboU+h73A4g==} + dependencies: + dezalgo: 1.0.4 + hexoid: 1.0.0 + once: 1.4.0 + qs: 6.11.2 + dev: true + + /forwarded-parse@2.1.2: + resolution: {integrity: sha512-alTFZZQDKMporBH77856pXgzhEzaUVmLCDk+egLgIgHst3Tpndzz8MnKe+GzRJRfvVdn69HhpW7cmXzvtLvJAw==} + requiresBuild: true + dev: false + optional: true + + /forwarded@0.2.0: + resolution: {integrity: sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==} + engines: {node: '>= 0.6'} + + /fresh@0.5.2: + resolution: {integrity: sha512-zJ2mQYM18rEFOudeV4GShTGIQ7RbzA7ozbU9I/XBpm7kqgMywgmylMwXHxZJmkVoYkna9d2pVXVXPdYTP9ej8Q==} + engines: {node: '>= 0.6'} + + /fs-extra@10.1.0: + resolution: {integrity: sha512-oRXApq54ETRj4eMiFzGnHWGy+zo5raudjuxN0b8H7s/RU2oW0Wvsx9O0ACRN/kRq9E8Vu/ReskGB5o3ji+FzHQ==} + engines: {node: '>=12'} + dependencies: + graceful-fs: 4.2.11 + jsonfile: 6.1.0 + universalify: 2.0.0 + + /fs-minipass@2.1.0: + resolution: {integrity: sha512-V/JgOLFCS+R6Vcq0slCuaeWEdNC3ouDlJMNIsacH2VtALiu9mV4LPrHc5cDl8k5aw6J8jwgWWpiTo5RYhmIzvg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /fs-monkey@1.0.5: + resolution: {integrity: sha512-8uMbBjrhzW76TYgEV27Y5E//W2f/lTFmx78P2w19FZSxarhI/798APGQyuGCwmkNxgwGRhrLfvWyLBvNtuOmew==} + + /fs.realpath@1.0.0: + resolution: {integrity: sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==} + + /fsevents@2.3.3: + resolution: {integrity: sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==} + engines: {node: ^8.16.0 || ^10.6.0 || >=11.0.0} + os: [darwin] + requiresBuild: true + optional: true + + /function-bind@1.1.1: + resolution: {integrity: sha512-yIovAzMX49sF8Yl58fSCWJ5svSLuaibPxXQJFLmBObTuCr0Mf1KiPopGM9NiFjiYBCbfaa2Fh6breQ6ANVTI0A==} + + /function.prototype.name@1.1.6: + resolution: {integrity: sha512-Z5kx79swU5P27WEayXM1tBi5Ze/lbIyiNgU3qyXUOf9b2rgXYyF9Dy9Cx+IQv/Lc8WCG6L82zwUPpSS9hGehIg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + functions-have-names: 1.2.3 + + /functions-have-names@1.2.3: + resolution: {integrity: sha512-xckBUXyTIqT97tq2x2AMb+g163b5JFysYk0x4qxNFwbfQkmNZoiRHb6sPzI9/QV33WeuvVYBUIiD4NzNIyqaRQ==} + + /gauge@4.0.4: + resolution: {integrity: sha512-f9m+BEN5jkg6a0fZjleidjN51VE1X+mPFQ2DJ0uv1V39oCLCbsGe6yjbBnp7eK7z/+GAon99a3nHuqbuuthyPg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + aproba: 2.0.0 + color-support: 1.1.3 + console-control-strings: 1.1.0 + has-unicode: 2.0.1 + signal-exit: 3.0.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + wide-align: 1.1.5 + dev: false + + /gensync@1.0.0-beta.2: + resolution: {integrity: sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==} + engines: {node: '>=6.9.0'} + dev: true + + /get-caller-file@2.0.5: + resolution: {integrity: sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==} + engines: {node: 6.* || 8.* || >= 10.*} + + /get-intrinsic@1.2.1: + resolution: {integrity: sha512-2DcsyfABl+gVHEfCOaTrWgyt+tb6MSEGmKq+kI5HwLbIYgjgmMcV8KQ41uaKz1xxUcn9tJtgFbQUEVcEbd0FYw==} + dependencies: + function-bind: 1.1.1 + has: 1.0.4 + has-proto: 1.0.1 + has-symbols: 1.0.3 + + /get-package-type@0.1.0: + resolution: {integrity: sha512-pjzuKtY64GYfWizNAJ0fr9VqttZkNiK2iS430LtIHzjBEr6bX8Am2zm4sW4Ro5wjWW5cAlRL1qAMTcXbjNAO2Q==} + engines: {node: '>=8.0.0'} + dev: true + + /get-stream@5.2.0: + resolution: {integrity: sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==} + engines: {node: '>=8'} + dependencies: + pump: 3.0.0 + + /get-stream@6.0.1: + resolution: {integrity: sha512-ts6Wi+2j3jQjqi70w5AlN8DFnkSwC+MqmxEzdEALB2qXZYV3X/b1CTfgPLGJNMeAWxdPfU8FO1ms3NUfaHCPYg==} + engines: {node: '>=10'} + dev: true + + /get-symbol-description@1.0.0: + resolution: {integrity: sha512-2EmdH1YvIQiZpltCNgkuiUnyukzxM/R6NDJX31Ke3BG1Nq5b0S2PhX59UKi9vZpPDQVdqn+1IcaAwnzTT5vCjw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + + /glob-parent@5.1.2: + resolution: {integrity: sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==} + engines: {node: '>= 6'} + dependencies: + is-glob: 4.0.3 + + /glob-parent@6.0.2: + resolution: {integrity: sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==} + engines: {node: '>=10.13.0'} + dependencies: + is-glob: 4.0.3 + dev: true + + /glob-to-regexp@0.4.1: + resolution: {integrity: sha512-lkX1HJXwyMcprw/5YUZc2s7DrpAiHB21/V+E1rHUrVNokkvB6bqMzT0VfV6/86ZNabt1k14YOIaT7nDvOX3Iiw==} + + /glob@7.2.3: + resolution: {integrity: sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 3.1.2 + once: 1.4.0 + path-is-absolute: 1.0.1 + + /glob@8.1.0: + resolution: {integrity: sha512-r8hpEjiQEYlF2QU0df3dS+nxxSIreXQS1qRhMJM0Q5NDdR386C7jb7Hwwod8Fgiuex+k0GFjgft18yvxm5XoCQ==} + engines: {node: '>=12'} + dependencies: + fs.realpath: 1.0.0 + inflight: 1.0.6 + inherits: 2.0.4 + minimatch: 5.1.6 + once: 1.4.0 + dev: true + + /globals@11.12.0: + resolution: {integrity: sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==} + engines: {node: '>=4'} + dev: true + + /globals@13.23.0: + resolution: {integrity: sha512-XAmF0RjlrjY23MA51q3HltdlGxUpXPvg0GioKiD9X6HD28iMjo2dKC8Vqwm7lne4GNr78+RHTfliktR6ZH09wA==} + engines: {node: '>=8'} + dependencies: + type-fest: 0.20.2 + dev: true + + /globalthis@1.0.3: + resolution: {integrity: sha512-sFdI5LyBiNTHjRd7cGPWapiHWMOXKyuBNX/cWJ3NfzrZQVa8GI/8cofCl74AOVqq9W5kNmguTIzJ/1s2gyI9wA==} + engines: {node: '>= 0.4'} + dependencies: + define-properties: 1.2.1 + + /globby@11.1.0: + resolution: {integrity: sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==} + engines: {node: '>=10'} + dependencies: + array-union: 2.1.0 + dir-glob: 3.0.1 + fast-glob: 3.3.1 + ignore: 5.2.4 + merge2: 1.4.1 + slash: 3.0.0 + dev: true + + /gopd@1.0.1: + resolution: {integrity: sha512-d65bNlIadxvpb/A2abVdlqKqV563juRnZ1Wtk6s1sIR8uNsXR70xqIzVqxVf1eTqDunwT2MkczEeaezCKTZhwA==} + dependencies: + get-intrinsic: 1.2.1 + + /graceful-fs@4.2.11: + resolution: {integrity: sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==} + + /graphemer@1.4.0: + resolution: {integrity: sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==} + dev: true + + /has-bigints@1.0.2: + resolution: {integrity: sha512-tSvCKtBr9lkF0Ex0aQiP9N+OpV4zi2r/Nee5VkRDbaqv35RLYMzbwQfFSZZH0kR+Rd6302UJZ2p/bJCEoR3VoQ==} + + /has-flag@3.0.0: + resolution: {integrity: sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==} + engines: {node: '>=4'} + + /has-flag@4.0.0: + resolution: {integrity: sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==} + engines: {node: '>=8'} + + /has-property-descriptors@1.0.0: + resolution: {integrity: sha512-62DVLZGoiEBDHQyqG4w9xCuZ7eJEwNmJRWw2VY84Oedb7WFcA27fiEVe8oUQx9hAUJ4ekurquucTGwsyO1XGdQ==} + dependencies: + get-intrinsic: 1.2.1 + + /has-proto@1.0.1: + resolution: {integrity: sha512-7qE+iP+O+bgF9clE5+UoBFzE65mlBiVj3tKCrlNQ0Ogwm0BjpT/gK4SlLYDMybDh5I3TCTKnPPa0oMG7JDYrhg==} + engines: {node: '>= 0.4'} + + /has-symbols@1.0.3: + resolution: {integrity: sha512-l3LCuF6MgDNwTDKkdYGEihYjt5pRPbEg46rtlmnSPlUbgmB8LOIrKJbYYFBSbnPaJexMKtiPO8hmeRjRz2Td+A==} + engines: {node: '>= 0.4'} + + /has-tostringtag@1.0.0: + resolution: {integrity: sha512-kFjcSNhnlGV1kyoGk7OXKSawH5JOb/LzUc5w9B02hOTO0dfFRjbHQKvg1d6cf3HbeUmtU9VbbV3qzZ2Teh97WQ==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /has-unicode@2.0.1: + resolution: {integrity: sha512-8Rf9Y83NBReMnx0gFzA8JImQACstCYWUplepDa9xprwwtmgEZUF0h/i5xSA625zB/I37EtrswSST6OXxwaaIJQ==} + dev: false + + /has@1.0.4: + resolution: {integrity: sha512-qdSAmqLF6209RFj4VVItywPMbm3vWylknmB3nvNiUIs72xAimcM8nVYxYr7ncvZq5qzk9MKIZR8ijqD/1QuYjQ==} + engines: {node: '>= 0.4.0'} + + /hexoid@1.0.0: + resolution: {integrity: sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==} + engines: {node: '>=8'} + dev: true + + /hpagent@0.1.2: + resolution: {integrity: sha512-ePqFXHtSQWAFXYmj+JtOTHr84iNrII4/QRlAAPPE+zqnKy4xJo7Ie1Y4kC7AdB+LxLxSTTzBMASsEcy0q8YyvQ==} + dev: false + + /html-encoding-sniffer@2.0.1: + resolution: {integrity: sha512-D5JbOMBIR/TVZkubHT+OyT2705QvogUW4IBn6nHd756OwieSF9aDYFj4dv6HHEVGYbHaLETa3WggZYWWMyy3ZQ==} + engines: {node: '>=10'} + dependencies: + whatwg-encoding: 1.0.5 + dev: true + + /html-escaper@2.0.2: + resolution: {integrity: sha512-H2iMtd0I4Mt5eYiapRdIDjp+XzelXQ0tFE4JS7YFwFevXXMmOp9myNrUvCg0D6ws8iqkRPBfKHgbwig1SmlLfg==} + dev: true + + /http-assert@1.5.0: + resolution: {integrity: sha512-uPpH7OKX4H25hBmU6G1jWNaqJGpTXxey+YOUizJUAgu0AjLUeC8D73hTrhvDS5D+GJN1DN1+hhc/eF/wpxtp0w==} + engines: {node: '>= 0.8'} + requiresBuild: true + dependencies: + deep-equal: 1.0.1 + http-errors: 1.8.1 + dev: false + optional: true + + /http-cache-semantics@4.1.1: + resolution: {integrity: sha512-er295DKPVsV82j5kw1Gjt+ADA/XYHsajl82cGNQG2eyoPkvgUhX+nDIyelzhIWbbsXP39EHcI6l5tYs2FYqYXQ==} + dev: false + + /http-errors@1.8.1: + resolution: {integrity: sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==} + engines: {node: '>= 0.6'} + requiresBuild: true + dependencies: + depd: 1.1.2 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 1.5.0 + toidentifier: 1.0.1 + dev: false + optional: true + + /http-errors@2.0.0: + resolution: {integrity: sha512-FtwrG/euBzaEjYeRqOgly7G0qviiXoJWnvEH2Z1plBdXgbyjv34pHTSb9zoeHMyDy33+DWy5Wt9Wo+TURtOYSQ==} + engines: {node: '>= 0.8'} + dependencies: + depd: 2.0.0 + inherits: 2.0.4 + setprototypeof: 1.2.0 + statuses: 2.0.1 + toidentifier: 1.0.1 + + /http-headers@3.0.2: + resolution: {integrity: sha512-87E1I+2Wg4dxxz4rcxElo3dxO/w1ZtgL1yA0Sb6vH3qU16vRKq1NjWQv9SCY3ly2OQROcoxHZOUpmelS+k6wOw==} + requiresBuild: true + dependencies: + next-line: 1.1.0 + dev: false + optional: true + + /http-proxy-agent@4.0.1: + resolution: {integrity: sha512-k0zdNgqWTGA6aeIRVpvfVob4fL52dTfaehylg0Y4UvSySvOq/Y+BOyPrgpUrA7HylqvU8vIZGsRuXmspskV0Tg==} + engines: {node: '>= 6'} + dependencies: + '@tootallnate/once': 1.1.2 + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /https-proxy-agent@5.0.1: + resolution: {integrity: sha512-dFcAjpTQFgoLMzC2VwU+C/CbS7uRL0lWmxDITmqm7C+7F0Odmj6s9l6alZc6AELXhrnggM2CeWSXHGOdX2YtwA==} + engines: {node: '>= 6'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + transitivePeerDependencies: + - supports-color + + /human-signals@1.1.1: + resolution: {integrity: sha512-SEQu7vl8KjNL2eoGBLF3+wAjpsNfA9XMlXAYj/3EdaNfAlxKthD1xjEQfGOUhllCGGJVNY34bRr6lPINhNjyZw==} + engines: {node: '>=8.12.0'} + + /human-signals@2.1.0: + resolution: {integrity: sha512-B4FFZ6q/T2jhhksgkbEW3HBvWIfDW85snkQgawt07S7J5QXTk6BkNV+0yAeZrM5QpMAdYlocGoljn0sJ/WQkFw==} + engines: {node: '>=10.17.0'} + dev: true + + /humanize-ms@1.2.1: + resolution: {integrity: sha512-Fl70vYtsAFb/C06PTS9dZBo7ihau+Tu/DNCk/OyHhea07S+aeMWpFFkUaXRa8fI+ScZbEI8dfSxwY7gxZ9SAVQ==} + requiresBuild: true + dependencies: + ms: 2.1.3 + dev: false + + /husky@7.0.4: + resolution: {integrity: sha512-vbaCKN2QLtP/vD4yvs6iz6hBEo6wkSzs8HpRah1Z6aGmF2KW5PdYuAd7uX5a+OyBZHBhd+TFLqgjUgytQr4RvQ==} + engines: {node: '>=12'} + hasBin: true + + /iconv-lite@0.4.24: + resolution: {integrity: sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==} + engines: {node: '>=0.10.0'} + dependencies: + safer-buffer: 2.1.2 + + /iconv-lite@0.6.3: + resolution: {integrity: sha512-4fCk79wshMdzMp2rH06qWrJE4iolqLhCUH+OiuIgU++RB0+94NlDL81atO7GX55uUKueo0txHNtvEyI6D7WdMw==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dependencies: + safer-buffer: 2.1.2 + dev: false + optional: true + + /ieee754@1.2.1: + resolution: {integrity: sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==} + + /ignore@5.2.4: + resolution: {integrity: sha512-MAb38BcSbH0eHNBxn7ql2NH/kX33OkB3lZ1BNdh7ENeRChHTYsTvWrMubiIAMNS2llXEEgZ1MUOBtXChP3kaFQ==} + engines: {node: '>= 4'} + dev: true + + /import-fresh@3.3.0: + resolution: {integrity: sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==} + engines: {node: '>=6'} + dependencies: + parent-module: 1.0.1 + resolve-from: 4.0.0 + + /import-in-the-middle@1.4.2: + resolution: {integrity: sha512-9WOz1Yh/cvO/p69sxRmhyQwrIGGSp7EIdcb+fFNVi7CzQGQB8U1/1XrKVSbEd/GNOAeM0peJtmi7+qphe7NvAw==} + requiresBuild: true + dependencies: + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + cjs-module-lexer: 1.2.3 + module-details-from-path: 1.0.3 + dev: false + optional: true + + /import-local@3.1.0: + resolution: {integrity: sha512-ASB07uLtnDs1o6EHjKpX34BKYDSqnFerfTOJL2HvMqF70LnxpjkzDB8J44oT9pu4AMPkQwf8jl6szgvNd2tRIg==} + engines: {node: '>=8'} + hasBin: true + dependencies: + pkg-dir: 4.2.0 + resolve-cwd: 3.0.0 + dev: true + + /imurmurhash@0.1.4: + resolution: {integrity: sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==} + engines: {node: '>=0.8.19'} + + /indent-string@4.0.0: + resolution: {integrity: sha512-EdDDZu4A2OyIK7Lr/2zG+w5jmbuk1DVBnEwREQvBzspBJkCEbRa8GxU1lghYcaGJCnRWibjDXlq779X1/y5xwg==} + engines: {node: '>=8'} + dev: false + + /indy-sdk@1.16.0-dev-1655: + resolution: {integrity: sha512-MSWRY8rdnGAegs4v4AnzE6CT9O/3JBMUiE45I0Ihj2DMuH+XS1EJZUQEJsyis6aOQzRavv/xVtaBC8o+6azKuw==} + engines: {node: '>=10'} + requiresBuild: true + dependencies: + bindings: 1.5.0 + nan: 2.18.0 + node-gyp: 8.4.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + + /infer-owner@1.0.4: + resolution: {integrity: sha512-IClj+Xz94+d7irH5qRyfJonOdfTzuDaifE6ZPWfx0N0+/ATZCbuTPq2prFl526urkQd90WyUKIh1DfBQ2hMz9A==} + dev: false + + /inflation@2.0.0: + resolution: {integrity: sha512-m3xv4hJYR2oXw4o4Y5l6P5P16WYmazYof+el6Al3f+YlggGj6qT9kImBAnzDelRALnP5d3h4jGBPKzYCizjZZw==} + engines: {node: '>= 0.8.0'} + requiresBuild: true + dev: false + optional: true + + /inflight@1.0.6: + resolution: {integrity: sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==} + dependencies: + once: 1.4.0 + wrappy: 1.0.2 + + /inherits@2.0.4: + resolution: {integrity: sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==} + + /inquirer@7.3.3: + resolution: {integrity: sha512-JG3eIAj5V9CwcGvuOmoo6LB9kbAYT8HXffUl6memuszlwDC/qvFAJw49XJ5NROSFNPxp3iQg1GqkFhaY/CR0IA==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + run-async: 2.4.1 + rxjs: 6.6.7 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + + /inquirer@8.2.0: + resolution: {integrity: sha512-0crLweprevJ02tTuA6ThpoAERAGyVILC4sS74uib58Xf/zSr1/ZWtmm7D5CI+bSQEaA04f0K7idaHpQbSWgiVQ==} + engines: {node: '>=8.0.0'} + dependencies: + ansi-escapes: 4.3.2 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-width: 3.0.0 + external-editor: 3.1.0 + figures: 3.2.0 + lodash: 4.17.21 + mute-stream: 0.0.8 + ora: 5.4.1 + run-async: 2.4.1 + rxjs: 7.8.1 + string-width: 4.2.3 + strip-ansi: 6.0.1 + through: 2.3.8 + + /internal-slot@1.0.5: + resolution: {integrity: sha512-Y+R5hJrzs52QCG2laLn4udYVnxsfny9CpOhNhUvk/SSSVyF6T27FzRbF0sroPidSu3X8oEAkOn2K804mjpt6UQ==} + engines: {node: '>= 0.4'} + dependencies: + get-intrinsic: 1.2.1 + has: 1.0.4 + side-channel: 1.0.4 + + /interpret@1.4.0: + resolution: {integrity: sha512-agE4QfB2Lkp9uICn7BAqoscw4SZP9kTE2hxiFI3jBPmXJfdqiahTbUuKGsMoN2GtqL9AxhYioAcVvgsb1HvRbA==} + engines: {node: '>= 0.10'} + + /ip@2.0.0: + resolution: {integrity: sha512-WKa+XuLG1A1R0UWhl2+1XQSi+fZWMsYKffMZTTYsiZaUD8k2yDAj5atimTUD2TZkyCkNEeYE5NhFZmupOGtjYQ==} + dev: false + + /ipaddr.js@1.9.1: + resolution: {integrity: sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==} + engines: {node: '>= 0.10'} + + /is-array-buffer@3.0.2: + resolution: {integrity: sha512-y+FyyR/w8vfIRq4eQcM1EYgSTnmHXPqaF+IgzgraytCFq5Xh8lllDVmAZolPJiZttZLeFSINPYMaEJ7/vWUa1w==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /is-arrayish@0.2.1: + resolution: {integrity: sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==} + + /is-arrayish@0.3.2: + resolution: {integrity: sha512-eVRqCvVlZbuw3GrM63ovNSNAeA1K16kaR/LRY/92w0zxQ5/1YzwblUX652i4Xs9RwAGjW9d9y6X88t8OaAJfWQ==} + dev: false + + /is-bigint@1.0.4: + resolution: {integrity: sha512-zB9CruMamjym81i2JZ3UMn54PKGsQzsJeo6xvN3HJJ4CAsQNB6iRutp2To77OfCNuoxspsIhzaPoO1zyCEhFOg==} + dependencies: + has-bigints: 1.0.2 + + /is-binary-path@2.1.0: + resolution: {integrity: sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==} + engines: {node: '>=8'} + dependencies: + binary-extensions: 2.2.0 + + /is-boolean-object@1.1.2: + resolution: {integrity: sha512-gDYaKHJmnj4aWxyj6YHyXVpdQawtVLHU5cb+eztPGczf6cjuTdwve5ZIEfgXqH4e57An1D1AKf8CZ3kYrQRqYA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-callable@1.2.7: + resolution: {integrity: sha512-1BC0BVFhS/p0qtw6enp8e+8OD0UrK0oFLztSjNzhcKA3WDuJxxAPXzPuPtKkjEY9UUoEWlX/8fgKeu2S8i9JTA==} + engines: {node: '>= 0.4'} + + /is-core-module@2.13.0: + resolution: {integrity: sha512-Z7dk6Qo8pOCp3l4tsX2C5ZVas4V+UxwQodwZhLopL91TX8UyyHEXafPcyoeeWuLrwzHcr3igO78wNLwHJHsMCQ==} + dependencies: + has: 1.0.4 + + /is-date-object@1.0.5: + resolution: {integrity: sha512-9YQaSxsAiSwcvS33MBk3wTCVnWK+HhF8VZR2jRxehM16QcVOdHqPn4VPHmRK4lSr38n9JriurInLcP90xsYNfQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-extglob@2.1.1: + resolution: {integrity: sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==} + engines: {node: '>=0.10.0'} + + /is-finite@1.1.0: + resolution: {integrity: sha512-cdyMtqX/BOqqNBBiKlIVkytNHm49MtMlYyn1zxzvJKWmFMlGzm+ry5BBfYyeY9YmNKbRSo/o7OX9w9ale0wg3w==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + + /is-fullwidth-code-point@3.0.0: + resolution: {integrity: sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg==} + engines: {node: '>=8'} + + /is-generator-fn@2.1.0: + resolution: {integrity: sha512-cTIB4yPYL/Grw0EaSzASzg6bBy9gqCofvWN8okThAYIxKJZC+udlRAmGbM0XLeniEJSs8uEgHPGuHSe1XsOLSQ==} + engines: {node: '>=6'} + dev: true + + /is-generator-function@1.0.10: + resolution: {integrity: sha512-jsEjy9l3yiXEQ+PsXdmBwEPcOxaXWLspKdplFUVI9vq1iZgIekeC0L167qeu86czQaxed3q/Uzuw0swL0irL8A==} + engines: {node: '>= 0.4'} + requiresBuild: true + dependencies: + has-tostringtag: 1.0.0 + dev: false + optional: true + + /is-glob@4.0.3: + resolution: {integrity: sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==} + engines: {node: '>=0.10.0'} + dependencies: + is-extglob: 2.1.1 + + /is-integer@1.0.7: + resolution: {integrity: sha512-RPQc/s9yBHSvpi+hs9dYiJ2cuFeU6x3TyyIp8O2H6SKEltIvJOzRj9ToyvcStDvPR/pS4rxgr1oBFajQjZ2Szg==} + requiresBuild: true + dependencies: + is-finite: 1.1.0 + dev: false + optional: true + + /is-interactive@1.0.0: + resolution: {integrity: sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==} + engines: {node: '>=8'} + + /is-lambda@1.0.1: + resolution: {integrity: sha512-z7CMFGNrENq5iFB9Bqo64Xk6Y9sg+epq1myIcdHaGnbMTYOxvzsEtdYqQUylB7LxfkvgrrjP32T6Ywciio9UIQ==} + dev: false + + /is-native@1.0.1: + resolution: {integrity: sha512-I4z9hx+4u3/zyvpvGtAR+n7SodJugE+i2jiS8yfq1A9QAZY0KldLQz0SBptLC9ti7kBlpghWUwTKE2BA62eCcw==} + requiresBuild: true + dependencies: + is-nil: 1.0.1 + to-source-code: 1.0.2 + dev: false + optional: true + + /is-negative-zero@2.0.2: + resolution: {integrity: sha512-dqJvarLawXsFbNDeJW7zAz8ItJ9cd28YufuuFzh0G8pNHjJMnY08Dv7sYX2uF5UpQOwieAeOExEYAWWfu7ZZUA==} + engines: {node: '>= 0.4'} + + /is-nil@1.0.1: + resolution: {integrity: sha512-m2Rm8PhUFDNNhgvwZJjJG74a9h5CHU0fkA8WT+WGlCjyEbZ2jPwgb+ZxHu4np284EqNVyOsgppReK4qy/TwEwg==} + requiresBuild: true + dev: false + optional: true + + /is-number-object@1.0.7: + resolution: {integrity: sha512-k1U0IRzLMo7ZlYIfzRu23Oh6MiIFasgpb9X76eqfFZAqwH44UI4KTBvBYIZ1dSL9ZzChTB9ShHfLkR4pdW5krQ==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-number@7.0.0: + resolution: {integrity: sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==} + engines: {node: '>=0.12.0'} + + /is-path-inside@3.0.3: + resolution: {integrity: sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==} + engines: {node: '>=8'} + dev: true + + /is-potential-custom-element-name@1.0.1: + resolution: {integrity: sha512-bCYeRA2rVibKZd+s2625gGnGF/t7DSqDs4dP7CrLA1m7jKWz6pps0LpYLJN8Q64HtmPKJ1hrN3nzPNKFEKOUiQ==} + dev: true + + /is-regex@1.1.4: + resolution: {integrity: sha512-kvRdxDsxZjhzUX07ZnLydzS1TU/TJlTUHHY4YLL87e37oUA49DfkLqgy+VjFocowy29cKvcSiu+kIv728jTTVg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + has-tostringtag: 1.0.0 + + /is-shared-array-buffer@1.0.2: + resolution: {integrity: sha512-sqN2UDu1/0y6uvXyStCOzyhAjCSlHceFoMKJW8W9EU9cvic/QdsZ0kEU93HEy3IUEFZIiH/3w+AH/UQbPHNdhA==} + dependencies: + call-bind: 1.0.2 + + /is-stream@2.0.1: + resolution: {integrity: sha512-hFoiJiTl63nn+kstHGBtewWSKnQLpyb155KHheA1l39uvtO9nWIop1p3udqPcUd/xbF1VLMO4n7OI6p7RbngDg==} + engines: {node: '>=8'} + + /is-string@1.0.7: + resolution: {integrity: sha512-tE2UXzivje6ofPW7l23cjDOMa09gb7xlAqG6jG5ej6uPV32TlWP3NKPigtaGeHNu9fohccRYvIiZMfOOnOYUtg==} + engines: {node: '>= 0.4'} + dependencies: + has-tostringtag: 1.0.0 + + /is-symbol@1.0.4: + resolution: {integrity: sha512-C/CPBqKWnvdcxqIARxyOh4v1UUEOCHpgDa0WYgpKDFMszcrPcffg5uhwSgPCLD2WWxmq6isisz87tzT01tuGhg==} + engines: {node: '>= 0.4'} + dependencies: + has-symbols: 1.0.3 + + /is-typed-array@1.1.12: + resolution: {integrity: sha512-Z14TF2JNG8Lss5/HMqt0//T9JeHXttXy5pH/DBU4vi98ozO2btxzq9MwYDZYnKwU8nRsz/+GVFVRDq3DkVuSPg==} + engines: {node: '>= 0.4'} + dependencies: + which-typed-array: 1.1.11 + + /is-typedarray@1.0.0: + resolution: {integrity: sha512-cyA56iCMHAh5CdzjJIa4aohJyeO1YbwLi3Jc35MmRU6poroFjIGZzUzupGiRPOjgHg9TLu43xbpwXk523fMxKA==} + dev: true + + /is-unicode-supported@0.1.0: + resolution: {integrity: sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==} + engines: {node: '>=10'} + + /is-weakref@1.0.2: + resolution: {integrity: sha512-qctsuLZmIQ0+vSSMfoVvyFe2+GSEvnmZ2ezTup1SBse9+twCCeial6EEi3Nc2KFcf6+qz2FBPnjXsk8xhKSaPQ==} + dependencies: + call-bind: 1.0.2 + + /isarray@0.0.1: + resolution: {integrity: sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==} + requiresBuild: true + dev: false + optional: true + + /isarray@1.0.0: + resolution: {integrity: sha512-VLghIWNM6ELQzo7zwmcg0NmTVyWKYjvIeM83yjp0wRDTmUnrM678fQbcKBo6n2CJEF0szoG//ytg+TKla89ALQ==} + + /isarray@2.0.5: + resolution: {integrity: sha512-xHjhDr3cNBK0BzdUJSPXZntQUx/mwMS5Rw4A7lPJ90XGAO6ISP/ePDNuo0vhqOZU+UD5JoodwCAAoZQd3FeAKw==} + + /isexe@2.0.0: + resolution: {integrity: sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==} + + /iso-url@1.2.1: + resolution: {integrity: sha512-9JPDgCN4B7QPkLtYAAOrEuAWvP9rWvR5offAr0/SeF046wIkglqH3VXgYYP6NcsKslH80UIVgmPqNe3j7tG2ng==} + engines: {node: '>=12'} + dev: false + + /istanbul-lib-coverage@3.2.0: + resolution: {integrity: sha512-eOeJ5BHCmHYvQK7xt9GkdHuzuCGS1Y6g9Gvnx3Ym33fz/HpLRYxiS0wHNr+m/MBC8B647Xt608vCDEvhl9c6Mw==} + engines: {node: '>=8'} + dev: true + + /istanbul-lib-instrument@5.2.1: + resolution: {integrity: sha512-pzqtp31nLv/XFOzXGuvhCb8qhjmTVo5vjVk19XE4CRlSWz0KoeJ3bw9XsA7nOp9YBf4qHjwBxkDzKcME/J29Yg==} + engines: {node: '>=8'} + dependencies: + '@babel/core': 7.23.0 + '@babel/parser': 7.23.0 + '@istanbuljs/schema': 0.1.3 + istanbul-lib-coverage: 3.2.0 + semver: 6.3.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-lib-report@3.0.1: + resolution: {integrity: sha512-GCfE1mtsHGOELCU8e/Z7YWzpmybrx/+dSTfLrvY8qRmaY6zXTKWn6WQIjaAFw069icm6GVMNkgu0NzI4iPZUNw==} + engines: {node: '>=10'} + dependencies: + istanbul-lib-coverage: 3.2.0 + make-dir: 4.0.0 + supports-color: 7.2.0 + dev: true + + /istanbul-lib-source-maps@4.0.1: + resolution: {integrity: sha512-n3s8EwkdFIJCG3BPKBYvskgXGoy88ARzvegkitk60NxRdwltLOTaH7CUiMRXvwYorl0Q712iEjcWB+fK/MrWVw==} + engines: {node: '>=10'} + dependencies: + debug: 4.3.4 + istanbul-lib-coverage: 3.2.0 + source-map: 0.6.1 + transitivePeerDependencies: + - supports-color + dev: true + + /istanbul-reports@3.1.6: + resolution: {integrity: sha512-TLgnMkKg3iTDsQ9PbPTdpfAK2DzjF9mqUG7RMgcQl8oFjad8ob4laGxv5XV5U9MAfx8D6tSJiUyuAwzLicaxlg==} + engines: {node: '>=8'} + dependencies: + html-escaper: 2.0.2 + istanbul-lib-report: 3.0.1 + dev: true + + /iterare@1.2.1: + resolution: {integrity: sha512-RKYVTCjAnRthyJes037NX/IiqeidgN1xc3j1RjFfECFp28A1GVwK9nA+i0rJPaHqSZwygLzRnFlzUuHFoWWy+Q==} + engines: {node: '>=6'} + + /jest-changed-files@27.5.1: + resolution: {integrity: sha512-buBLMiByfWGCoMsLLzGUUSpAmIAGnbR2KJoMN10ziLhOLvP4e0SlypHnAel8iqQXTrcbmfEY9sSqae5sgUsTvw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + execa: 5.1.1 + throat: 6.0.2 + dev: true + + /jest-circus@27.5.1: + resolution: {integrity: sha512-D95R7x5UtlMA5iBYsOHFFbMD/GVA4R/Kdq15f7xYWUfWHBto9NYRsOvnSauTgdF+ogCpJ4tyKOXhUifxS65gdw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + chalk: 4.1.2 + co: 4.6.0 + dedent: 0.7.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-cli@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-Hc6HOOwYq4/74/c62dEE3r5elx8wjYqxY0r0G/nFrLDPMFRu6RA/u8qINOIkvhxG7mMQ5EJsOGfRpI8L6eFUVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.1) + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + exit: 0.1.2 + graceful-fs: 4.2.11 + import-local: 3.1.0 + jest-config: 27.5.1(ts-node@10.9.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + prompts: 2.4.2 + yargs: 16.2.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /jest-config@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-5sAsjm6tGdsVbW9ahcChPAFCk4IlkQUknH5AvKjuLTSlcO/wCZKyFdn7Rg0EkC+OGgWODEy2hDpWB1PgzH0JNA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + peerDependencies: + ts-node: '>=9.0.0' + peerDependenciesMeta: + ts-node: + optional: true + dependencies: + '@babel/core': 7.23.0 + '@jest/test-sequencer': 27.5.1 + '@jest/types': 27.5.1 + babel-jest: 27.5.1(@babel/core@7.23.0) + chalk: 4.1.2 + ci-info: 3.9.0 + deepmerge: 4.3.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-circus: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-get-type: 27.5.1 + jest-jasmine2: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runner: 27.5.1 + jest-util: 27.5.1 + jest-validate: 27.5.1 + micromatch: 4.0.5 + parse-json: 5.2.0 + pretty-format: 27.5.1 + slash: 3.0.0 + strip-json-comments: 3.1.1 + ts-node: 10.9.1(@types/node@16.18.57)(typescript@4.9.5) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-diff@27.5.1: + resolution: {integrity: sha512-m0NvkX55LDt9T4mctTEgnZk3fmEg3NRYutvMPWM/0iPnkFj2wIeF45O1718cMSOFO1vINkqmxqD8vE37uTEbqw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + diff-sequences: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + + /jest-docblock@27.5.1: + resolution: {integrity: sha512-rl7hlABeTsRYxKiUfpHrQrG4e2obOiTQWfMEH3PxPjOtdsfLQO4ReWSZaQ7DETm4xu07rl4q/h4zcKXyU0/OzQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + detect-newline: 3.1.0 + dev: true + + /jest-each@27.5.1: + resolution: {integrity: sha512-1Ff6p+FbhT/bXQnEouYy00bkNSY7OUpfIcmdl8vZ31A1UUaurOLPA8a8BbJOF2RDUElwJhmeaV7LnagI+5UwNQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + jest-get-type: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-environment-jsdom@27.5.1: + resolution: {integrity: sha512-TFBvkTC1Hnnnrka/fUb56atfDtJ9VMZ94JkjTbggl1PEpwrYtUBKMezB3inLmWqQsXYLcMwNoDQwoBTAvFfsfw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + jest-mock: 27.5.1 + jest-util: 27.5.1 + jsdom: 16.7.0 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-environment-node@27.5.1: + resolution: {integrity: sha512-Jt4ZUnxdOsTGwSRAfKEnE6BcwsSPNOijjwifq5sDFSA2kesnXTvNqKHYgM0hDq3549Uf/KzdXNYn4wMZJPlFLw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + jest-mock: 27.5.1 + jest-util: 27.5.1 + dev: true + + /jest-get-type@27.5.1: + resolution: {integrity: sha512-2KY95ksYSaK7DMBWQn6dQz3kqAf3BB64y2udeG+hv4KfSOb9qwcYQstTJc1KCbsix+wLZWZYN8t7nwX3GOBLRw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + + /jest-haste-map@27.5.1: + resolution: {integrity: sha512-7GgkZ4Fw4NFbMSDSpZwXeBiIbx+t/46nJ2QitkOjvwPYyZmqttu2TDSimMHP1EkPOi4xUZAN1doE5Vd25H4Jng==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/graceful-fs': 4.1.7 + '@types/node': 16.18.57 + anymatch: 3.1.3 + fb-watchman: 2.0.2 + graceful-fs: 4.2.11 + jest-regex-util: 27.5.1 + jest-serializer: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + micromatch: 4.0.5 + walker: 1.0.8 + optionalDependencies: + fsevents: 2.3.3 + dev: true + + /jest-jasmine2@27.5.1: + resolution: {integrity: sha512-jtq7VVyG8SqAorDpApwiJJImd0V2wv1xzdheGHRGyuT7gZm6gG47QEskOlzsN1PG/6WNaCo5pmwMHDf3AkG2pQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + chalk: 4.1.2 + co: 4.6.0 + expect: 27.5.1 + is-generator-fn: 2.1.0 + jest-each: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-runtime: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + pretty-format: 27.5.1 + throat: 6.0.2 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-leak-detector@27.5.1: + resolution: {integrity: sha512-POXfWAMvfU6WMUXftV4HolnJfnPOGEu10fscNCA76KBpRRhcMN2c8d3iT2pxQS3HLbA+5X4sOUPzYO2NUyIlHQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-matcher-utils@27.5.1: + resolution: {integrity: sha512-z2uTx/T6LBaCoNWNFWwChLBKYxTMcGBRjAt+2SbP929/Fflb9aa5LGma654Rz8z9HLxsrUaYzxE9T/EFIL/PAw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + chalk: 4.1.2 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + pretty-format: 27.5.1 + dev: true + + /jest-message-util@27.5.1: + resolution: {integrity: sha512-rMyFe1+jnyAAf+NHwTclDz0eAaLkVDdKVHHBFWsBWHnnh5YeJMNWWsv7AbFYXfK3oTqvL7VTWkhNLu1jX24D+g==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/code-frame': 7.22.13 + '@jest/types': 27.5.1 + '@types/stack-utils': 2.0.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + micromatch: 4.0.5 + pretty-format: 27.5.1 + slash: 3.0.0 + stack-utils: 2.0.6 + dev: true + + /jest-mock@27.5.1: + resolution: {integrity: sha512-K4jKbY1d4ENhbrG2zuPWaQBvDly+iZ2yAW+T1fATN78hc0sInwn7wZB8XtlNnvHug5RMwV897Xm4LqmPM4e2Og==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + dev: true + + /jest-pnp-resolver@1.2.3(jest-resolve@27.5.1): + resolution: {integrity: sha512-+3NpwQEnRoIBtx4fyhblQDPgJI0H1IEIkX7ShLUjPGA7TtUTvI1oiKi3SR4oBR0hQhQR80l4WAe5RrXBwWMA8w==} + engines: {node: '>=6'} + peerDependencies: + jest-resolve: '*' + peerDependenciesMeta: + jest-resolve: + optional: true + dependencies: + jest-resolve: 27.5.1 + dev: true + + /jest-regex-util@27.5.1: + resolution: {integrity: sha512-4bfKq2zie+x16okqDXjXn9ql2B0dScQu+vcwe4TvFVhkVyuWLqpZrZtXxLLWoXYgn0E87I6r6GRYHF7wFZBUvg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dev: true + + /jest-resolve-dependencies@27.5.1: + resolution: {integrity: sha512-QQOOdY4PE39iawDn5rzbIePNigfe5B9Z91GDD1ae/xNDlu9kaat8QQ5EKnNmVWPV54hUdxCVwwj6YMgR2O7IOg==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + jest-regex-util: 27.5.1 + jest-snapshot: 27.5.1 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-resolve@27.5.1: + resolution: {integrity: sha512-FFDy8/9E6CV83IMbDpcjOhumAQPDyETnU2KZ1O98DwTnz8AOBsW/Xv3GySr1mOZdItLR+zDZ7I/UdTFbgSOVCw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + chalk: 4.1.2 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-pnp-resolver: 1.2.3(jest-resolve@27.5.1) + jest-util: 27.5.1 + jest-validate: 27.5.1 + resolve: 1.22.6 + resolve.exports: 1.1.1 + slash: 3.0.0 + dev: true + + /jest-runner@27.5.1: + resolution: {integrity: sha512-g4NPsM4mFCOwFKXO4p/H/kWGdJp9V8kURY2lX8Me2drgXqG7rrZAx5kv+5H7wtt/cdFIjhqYx1HrlqWHaOvDaQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/console': 27.5.1 + '@jest/environment': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + chalk: 4.1.2 + emittery: 0.8.1 + graceful-fs: 4.2.11 + jest-docblock: 27.5.1 + jest-environment-jsdom: 27.5.1 + jest-environment-node: 27.5.1 + jest-haste-map: 27.5.1 + jest-leak-detector: 27.5.1 + jest-message-util: 27.5.1 + jest-resolve: 27.5.1 + jest-runtime: 27.5.1 + jest-util: 27.5.1 + jest-worker: 27.5.1 + source-map-support: 0.5.21 + throat: 6.0.2 + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - utf-8-validate + dev: true + + /jest-runtime@27.5.1: + resolution: {integrity: sha512-o7gxw3Gf+H2IGt8fv0RiyE1+r83FJBRruoA+FXrlHw6xEyBsU8ugA6IPfTdVyA0w8HClpbK+DGJxH59UrNMx8A==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/environment': 27.5.1 + '@jest/fake-timers': 27.5.1 + '@jest/globals': 27.5.1 + '@jest/source-map': 27.5.1 + '@jest/test-result': 27.5.1 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + chalk: 4.1.2 + cjs-module-lexer: 1.2.3 + collect-v8-coverage: 1.0.2 + execa: 5.1.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + jest-haste-map: 27.5.1 + jest-message-util: 27.5.1 + jest-mock: 27.5.1 + jest-regex-util: 27.5.1 + jest-resolve: 27.5.1 + jest-snapshot: 27.5.1 + jest-util: 27.5.1 + slash: 3.0.0 + strip-bom: 4.0.0 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-serializer@27.5.1: + resolution: {integrity: sha512-jZCyo6iIxO1aqUxpuBlwTDMkzOAJS4a3eYz3YzgxxVQFwLeSA7Jfq5cbqCY+JLvTDrWirgusI/0KwxKMgrdf7w==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@types/node': 16.18.57 + graceful-fs: 4.2.11 + dev: true + + /jest-snapshot@27.5.1: + resolution: {integrity: sha512-yYykXI5a0I31xX67mgeLw1DZ0bJB+gpq5IpSuCAoyDi0+BhgU/RIrL+RTzDmkNTchvDFWKP8lp+w/42Z3us5sA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@babel/core': 7.23.0 + '@babel/generator': 7.23.0 + '@babel/plugin-syntax-typescript': 7.22.5(@babel/core@7.23.0) + '@babel/traverse': 7.23.0 + '@babel/types': 7.23.0 + '@jest/transform': 27.5.1 + '@jest/types': 27.5.1 + '@types/babel__traverse': 7.20.2 + '@types/prettier': 2.7.3 + babel-preset-current-node-syntax: 1.0.1(@babel/core@7.23.0) + chalk: 4.1.2 + expect: 27.5.1 + graceful-fs: 4.2.11 + jest-diff: 27.5.1 + jest-get-type: 27.5.1 + jest-haste-map: 27.5.1 + jest-matcher-utils: 27.5.1 + jest-message-util: 27.5.1 + jest-util: 27.5.1 + natural-compare: 1.4.0 + pretty-format: 27.5.1 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /jest-util@27.5.1: + resolution: {integrity: sha512-Kv2o/8jNvX1MQ0KGtw480E/w4fBCDOnH6+6DmeKi6LZUIlKA5kwY0YNdlzaWTiVgxqAqik11QyxDOKk543aKXw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + chalk: 4.1.2 + ci-info: 3.9.0 + graceful-fs: 4.2.11 + picomatch: 2.3.1 + dev: true + + /jest-validate@27.5.1: + resolution: {integrity: sha512-thkNli0LYTmOI1tDB3FI1S1RTp/Bqyd9pTarJwL87OIBFuqEb5Apv5EaApEudYg4g86e3CT6kM0RowkhtEnCBQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/types': 27.5.1 + camelcase: 6.3.0 + chalk: 4.1.2 + jest-get-type: 27.5.1 + leven: 3.1.0 + pretty-format: 27.5.1 + dev: true + + /jest-watcher@27.5.1: + resolution: {integrity: sha512-z676SuD6Z8o8qbmEGhoEUFOM1+jfEiL3DXHK/xgEiG2EyNYfFG60jluWcupY6dATjfEsKQuibReS1djInQnoVw==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + '@jest/test-result': 27.5.1 + '@jest/types': 27.5.1 + '@types/node': 16.18.57 + ansi-escapes: 4.3.2 + chalk: 4.1.2 + jest-util: 27.5.1 + string-length: 4.0.2 + dev: true + + /jest-worker@27.5.1: + resolution: {integrity: sha512-7vuh85V5cdDofPyxn58nrPjBktZo0u9x1g8WtjQol+jZDaE+fhN+cIvTj11GndBnMnyfrUOG1sZQxCdjKh+DKg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/node': 16.18.57 + merge-stream: 2.0.0 + supports-color: 8.1.1 + + /jest@27.5.1(ts-node@10.9.1): + resolution: {integrity: sha512-Yn0mADZB89zTtjkPJEXwrac3LHudkQMR+Paqa8uxJHCBr9agxztUifWCyiYrjhMPBoUVBjyny0I7XH6ozDr7QQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + node-notifier: ^8.0.1 || ^9.0.0 || ^10.0.0 + peerDependenciesMeta: + node-notifier: + optional: true + dependencies: + '@jest/core': 27.5.1(ts-node@10.9.1) + import-local: 3.1.0 + jest-cli: 27.5.1(ts-node@10.9.1) + transitivePeerDependencies: + - bufferutil + - canvas + - supports-color + - ts-node + - utf-8-validate + dev: true + + /joi@17.11.0: + resolution: {integrity: sha512-NgB+lZLNoqISVy1rZocE9PZI36bL/77ie924Ri43yEvi9GUUMPeyVIr8KdFTMUlby1p0PBYMk9spIxEUQYqrJQ==} + dependencies: + '@hapi/hoek': 9.3.0 + '@hapi/topo': 5.1.0 + '@sideway/address': 4.1.4 + '@sideway/formula': 3.0.1 + '@sideway/pinpoint': 2.0.0 + dev: false + + /jose@4.15.2: + resolution: {integrity: sha512-IY73F228OXRl9ar3jJagh7Vnuhj/GzBunPiZP13K0lOl7Am9SoWW3kEzq3MCllJMTtZqHTiDXQvoRd4U95aU6A==} + dev: false + + /js-base64@3.7.5: + resolution: {integrity: sha512-3MEt5DTINKqfScXKfJFrRbxkrnk2AxPWGBL/ycjz4dK8iqiSJ06UxD8jh8xuh6p10TX4t2+7FsBYVxxQbMg+qA==} + dev: false + + /js-sha256@0.9.0: + resolution: {integrity: sha512-sga3MHh9sgQN2+pJ9VYZ+1LPwXOxuBJBA5nrR5/ofPfuiJBE2hnjsaN8se8JznOmGLN2p49Pe5U/ttafcs/apA==} + dev: false + + /js-tokens@4.0.0: + resolution: {integrity: sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==} + + /js-yaml@3.14.1: + resolution: {integrity: sha512-okMH7OXXJ7YrN9Ok3/SXrnu4iX9yOk+25nqX4imS2npuvTYDmo/QEZoqwZkYaIDk3jVvBOTOIEgEhaLOynBS9g==} + hasBin: true + dependencies: + argparse: 1.0.10 + esprima: 4.0.1 + dev: true + + /js-yaml@4.1.0: + resolution: {integrity: sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==} + hasBin: true + dependencies: + argparse: 2.0.1 + dev: true + + /jsdom@16.7.0: + resolution: {integrity: sha512-u9Smc2G1USStM+s/x1ru5Sxrl6mPYCbByG1U/hUmqaVsm4tbNyS7CicOSRyuGQYZhTu0h84qkZZQ/I+dzizSVw==} + engines: {node: '>=10'} + peerDependencies: + canvas: ^2.5.0 + peerDependenciesMeta: + canvas: + optional: true + dependencies: + abab: 2.0.6 + acorn: 8.10.0 + acorn-globals: 6.0.0 + cssom: 0.4.4 + cssstyle: 2.3.0 + data-urls: 2.0.0 + decimal.js: 10.4.3 + domexception: 2.0.1 + escodegen: 2.1.0 + form-data: 3.0.1 + html-encoding-sniffer: 2.0.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-potential-custom-element-name: 1.0.1 + nwsapi: 2.2.7 + parse5: 6.0.1 + saxes: 5.0.1 + symbol-tree: 3.2.4 + tough-cookie: 4.1.3 + w3c-hr-time: 1.0.2 + w3c-xmlserializer: 2.0.0 + webidl-conversions: 6.1.0 + whatwg-encoding: 1.0.5 + whatwg-mimetype: 2.3.0 + whatwg-url: 8.7.0 + ws: 7.5.9 + xml-name-validator: 3.0.0 + transitivePeerDependencies: + - bufferutil + - supports-color + - utf-8-validate + dev: true + + /jsesc@2.5.2: + resolution: {integrity: sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==} + engines: {node: '>=4'} + hasBin: true + dev: true + + /json-buffer@3.0.1: + resolution: {integrity: sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==} + dev: true + + /json-parse-even-better-errors@2.3.1: + resolution: {integrity: sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==} + + /json-schema-traverse@0.4.1: + resolution: {integrity: sha512-xbbCH5dCYU5T8LcEhhuh7HJ88HXuW3qsI3Y0zOZFKfZEHcpWiHU/Jxzk629Brsab/mMiHQti9wMP+845RPe3Vg==} + + /json-schema-traverse@1.0.0: + resolution: {integrity: sha512-NM8/P9n3XjXhIZn1lLhkFaACTOURQXjWhV4BA/RnOv8xvgqtqpAX9IO4mRQxSx1Rlo4tqzeqb0sOlruaOy3dug==} + + /json-stable-stringify-without-jsonify@1.0.1: + resolution: {integrity: sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==} + dev: true + + /json-text-sequence@0.3.0: + resolution: {integrity: sha512-7khKIYPKwXQem4lWXfpIN/FEnhztCeRPSxH4qm3fVlqulwujrRDD54xAwDDn/qVKpFtV550+QAkcWJcufzqQuA==} + engines: {node: '>=10.18.0'} + dependencies: + '@sovpro/delimited-stream': 1.1.0 + dev: false + + /json5@1.0.2: + resolution: {integrity: sha512-g1MWMLBiz8FKi1e4w0UyVL3w+iJceWAFBAaBnnGKOpNa5f8TLktkbre1+s6oICydWAm+HRUGTmI+//xv2hvXYA==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /json5@2.2.3: + resolution: {integrity: sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==} + engines: {node: '>=6'} + hasBin: true + dev: true + + /jsonc-parser@3.0.0: + resolution: {integrity: sha512-fQzRfAbIBnR0IQvftw9FJveWiHp72Fg20giDrHz6TdfB12UH/uue0D3hm57UB5KgAVuniLMCaS8P1IMj9NR7cA==} + + /jsonc-parser@3.2.0: + resolution: {integrity: sha512-gfFQZrcTc8CnKXp6Y4/CBT3fTc0OVuDofpre4aEeEpSBPV5X5v4+Vmx+8snU7RLPrNHPKSgLxGo9YuQzz20o+w==} + dev: true + + /jsonfile@6.1.0: + resolution: {integrity: sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==} + dependencies: + universalify: 2.0.0 + optionalDependencies: + graceful-fs: 4.2.11 + + /jsonwebtoken@8.5.1: + resolution: {integrity: sha512-XjwVfRS6jTMsqYs0EsuJ4LGxXV14zQybNd4L2r0UvbVnSF9Af8x7p5MzbJ90Ioz/9TI41/hTCvznF/loiSzn8w==} + engines: {node: '>=4', npm: '>=1.4.28'} + dependencies: + jws: 3.2.2 + lodash.includes: 4.3.0 + lodash.isboolean: 3.0.3 + lodash.isinteger: 4.0.4 + lodash.isnumber: 3.0.3 + lodash.isplainobject: 4.0.6 + lodash.isstring: 4.0.1 + lodash.once: 4.1.1 + ms: 2.1.3 + semver: 5.7.2 + dev: false + + /jwa@1.4.1: + resolution: {integrity: sha512-qiLX/xhEEFKUAJ6FiBMbes3w9ATzyk5W7Hvzpa/SLYdxNtng+gcurvrI7TbACjIXlsJyr05/S1oUhZrc63evQA==} + dependencies: + buffer-equal-constant-time: 1.0.1 + ecdsa-sig-formatter: 1.0.11 + safe-buffer: 5.2.1 + dev: false + + /jwks-rsa@3.1.0: + resolution: {integrity: sha512-v7nqlfezb9YfHHzYII3ef2a2j1XnGeSE/bK3WfumaYCqONAIstJbrEGapz4kadScZzEt7zYCN7bucj8C0Mv/Rg==} + engines: {node: '>=14'} + dependencies: + '@types/express': 4.17.18 + '@types/jsonwebtoken': 9.0.3 + debug: 4.3.4 + jose: 4.15.2 + limiter: 1.1.5 + lru-memoizer: 2.2.0 + transitivePeerDependencies: + - supports-color + dev: false + + /jws@3.2.2: + resolution: {integrity: sha512-YHlZCB6lMTllWDtSPHz/ZXTsi8S00usEV6v1tjq8tOUZzw7DpSDWVXjXDre6ed1w/pd495ODpHZYSdkRTsa0HA==} + dependencies: + jwa: 1.4.1 + safe-buffer: 5.2.1 + dev: false + + /keygrip@1.1.0: + resolution: {integrity: sha512-iYSchDJ+liQ8iwbSI2QqsQOvqv58eJCEanyJPJi+Khyu8smkcKSFUCbPwzFcL7YVtZ6eONjqRX/38caJ7QjRAQ==} + engines: {node: '>= 0.6'} + requiresBuild: true + dependencies: + tsscmp: 1.0.6 + dev: false + optional: true + + /keyv@4.5.3: + resolution: {integrity: sha512-QCiSav9WaX1PgETJ+SpNnx2PRRapJ/oRSXM4VO5OGYGSjrxbKPVFVhB3l2OCbLCk329N8qyAtsJjSjvVBWzEug==} + dependencies: + json-buffer: 3.0.1 + dev: true + + /kleur@3.0.3: + resolution: {integrity: sha512-eTIzlVOSUR+JxdDFepEYcBMtZ9Qqdef+rnzWdRZuMbOywu5tO2w2N7rqjoANZ5k9vywhL6Br1VRjUIgTQx4E8w==} + engines: {node: '>=6'} + dev: true + + /koa-bodyparser@4.4.1: + resolution: {integrity: sha512-kBH3IYPMb+iAXnrxIhXnW+gXV8OTzCu8VPDqvcDHW9SQrbkHmqPQtiZwrltNmSq6/lpipHnT7k7PsjlVD7kK0w==} + engines: {node: '>=8.0.0'} + requiresBuild: true + dependencies: + co-body: 6.1.0 + copy-to: 2.0.1 + type-is: 1.6.18 + dev: false + optional: true + + /koa-compose@3.2.1: + resolution: {integrity: sha512-8gen2cvKHIZ35eDEik5WOo8zbVp9t4cP8p4hW4uE55waxolLRexKKrqfCpwhGVppnB40jWeF8bZeTVg99eZgPw==} + requiresBuild: true + dependencies: + any-promise: 1.3.0 + dev: false + optional: true + + /koa-compose@4.1.0: + resolution: {integrity: sha512-8ODW8TrDuMYvXRwra/Kh7/rJo9BtOfPc6qO8eAfC80CnCvSjSl0bkRM24X6/XBBEyj0v1nRUQ1LyOy3dbqOWXw==} + requiresBuild: true + dev: false + optional: true + + /koa-convert@2.0.0: + resolution: {integrity: sha512-asOvN6bFlSnxewce2e/DK3p4tltyfC4VM7ZwuTuepI7dEQVcvpyFuBcEARu1+Hxg8DIwytce2n7jrZtRlPrARA==} + engines: {node: '>= 10'} + requiresBuild: true + dependencies: + co: 4.6.0 + koa-compose: 4.1.0 + dev: false + optional: true + + /koa-multer@1.0.2: + resolution: {integrity: sha512-0kFzN4atVd+9oiG+4fYxQ9S2T3dPhKNvmhITIY606Qn9wLEmfhW0DhSpOzRYhddN//4rh/TCK95TMtflmFa5lA==} + engines: {node: '>= 4'} + deprecated: Please use @koa/multer instead, see <https://github.com/koajs/multer> + requiresBuild: true + dependencies: + multer: 1.3.0 + dev: false + optional: true + + /koa-router@7.4.0: + resolution: {integrity: sha512-IWhaDXeAnfDBEpWS6hkGdZ1ablgr6Q6pGdXCyK38RbzuH4LkUOpPqPw+3f8l8aTDrQmBQ7xJc0bs2yV4dzcO+g==} + engines: {node: '>= 4'} + requiresBuild: true + dependencies: + debug: 3.2.7 + http-errors: 1.8.1 + koa-compose: 3.2.1 + methods: 1.1.2 + path-to-regexp: 1.8.0 + urijs: 1.19.11 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /koa@2.14.2: + resolution: {integrity: sha512-VFI2bpJaodz6P7x2uyLiX6RLYpZmOJqNmoCst/Yyd7hQlszyPwG/I9CQJ63nOtKSxpt5M7NH67V6nJL2BwCl7g==} + engines: {node: ^4.8.4 || ^6.10.1 || ^7.10.1 || >= 8.1.4} + requiresBuild: true + dependencies: + accepts: 1.3.8 + cache-content-type: 1.0.1 + content-disposition: 0.5.4 + content-type: 1.0.5 + cookies: 0.8.0 + debug: 4.3.4 + delegates: 1.0.0 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + fresh: 0.5.2 + http-assert: 1.5.0 + http-errors: 1.8.1 + is-generator-function: 1.0.10 + koa-compose: 4.1.0 + koa-convert: 2.0.0 + on-finished: 2.4.1 + only: 0.0.2 + parseurl: 1.3.3 + statuses: 1.5.0 + type-is: 1.6.18 + vary: 1.1.2 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /kuler@2.0.0: + resolution: {integrity: sha512-Xq9nH7KlWZmXAtodXDDRE7vs6DU1gTU8zYDHDiWLSip45Egwq3plLHzPn27NgvzL2r1LMPC1vdqh98sQxtqj4A==} + dev: false + + /leven@3.1.0: + resolution: {integrity: sha512-qsda+H8jTaUaN/x5vzW2rzc+8Rw4TAQ/4KjB46IwK5VH+IlVeeeje/EoZRpiXvIqjFgK84QffqPztGI3VBLG1A==} + engines: {node: '>=6'} + dev: true + + /levn@0.4.1: + resolution: {integrity: sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /libphonenumber-js@1.10.47: + resolution: {integrity: sha512-b4t7VQDV29xx/ni+58yl9KWPGjnDLDXCeCTLrD4V8vDpObXZRZBrg7uX/HWZ7YXiJKqdBDGgc+barUUTNB6Slw==} + + /limiter@1.1.5: + resolution: {integrity: sha512-FWWMIEOxz3GwUI4Ts/IvgVy6LPvoMPgjMdQ185nN6psJyBJ4yOpzqm695/h5umdLJg2vW3GR5iG11MAkR2AzJA==} + dev: false + + /lines-and-columns@1.2.4: + resolution: {integrity: sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==} + + /liquibase@4.4.0: + resolution: {integrity: sha512-oD/ZJgxpoR43V5Vt7o3r9ftYl16PyFco5l1EpKI4VKDQLtm1acHsyqxjA96S6c+rP51PafC4xug1Z6IJLyyAXA==} + engines: {node: '>=6.9.0'} + hasBin: true + dev: false + + /loader-runner@4.3.0: + resolution: {integrity: sha512-3R/1M+yS3j5ou80Me59j7F9IMs4PXs3VqRrm0TU3AbKPxlmpoY1TNscJV/oGJXo8qCatFGTfDbY6W6ipGOYXfg==} + engines: {node: '>=6.11.5'} + + /locate-path@5.0.0: + resolution: {integrity: sha512-t7hw9pI+WvuwNJXwk5zVHpyhIqzg2qTlklJOf0mVxGSbe3Fp2VieZcduNYjaLDoy6p9uGpQEGWG87WpMKlNq8g==} + engines: {node: '>=8'} + dependencies: + p-locate: 4.1.0 + dev: true + + /locate-path@6.0.0: + resolution: {integrity: sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==} + engines: {node: '>=10'} + dependencies: + p-locate: 5.0.0 + dev: true + + /lodash.capitalize@4.2.1: + resolution: {integrity: sha512-kZzYOKspf8XVX5AvmQF94gQW0lejFVgb80G85bU4ZWzoJ6C03PQg3coYAUpSTpQWelrZELd3XWgHzw4Ck5kaIw==} + dev: false + + /lodash.clonedeep@4.5.0: + resolution: {integrity: sha512-H5ZhCF25riFd9uB5UCkVKo61m3S/xZk1x4wA6yp/L3RFP6Z/eHH1ymQcGLo7J3GMPfm0V/7m1tryHuGVxpqEBQ==} + dev: false + + /lodash.defaults@4.2.0: + resolution: {integrity: sha512-qjxPLHd3r5DnsdGacqOMU6pb/avJzdh9tFX2ymgoZE27BmjXrNy/y4LoaiTeAb+O3gL8AfpJGtqfX/ae2leYYQ==} + dev: false + + /lodash.groupby@4.6.0: + resolution: {integrity: sha512-5dcWxm23+VAoz+awKmBaiBvzox8+RqMgFhi7UvX9DHZr2HdxHXM/Wrf8cfKpsW37RNrvtPn6hSwNqurSILbmJw==} + dev: false + + /lodash.includes@4.3.0: + resolution: {integrity: sha512-W3Bx6mdkRTGtlJISOvVD/lbqjTlPPUDTMnlXZFnVwi9NKJ6tiAk6LVdlhZMm17VZisqhKcgzpO5Wz91PCt5b0w==} + dev: false + + /lodash.isboolean@3.0.3: + resolution: {integrity: sha512-Bz5mupy2SVbPHURB98VAcw+aHh4vRV5IPNhILUCsOzRmsTmSQ17jIuqopAentWoehktxGd9e/hbIXq980/1QJg==} + dev: false + + /lodash.isinteger@4.0.4: + resolution: {integrity: sha512-DBwtEWN2caHQ9/imiNeEA5ys1JoRtRfY3d7V9wkqtbycnAmTvRRmbHKDV4a0EYc678/dia0jrte4tjYwVBaZUA==} + dev: false + + /lodash.isnumber@3.0.3: + resolution: {integrity: sha512-QYqzpfwO3/CWf3XP+Z+tkQsfaLL/EnUlXWVkIk5FUPc4sBdTehEqZONuyRt2P67PXAk+NXmTBcc97zw9t1FQrw==} + dev: false + + /lodash.isplainobject@4.0.6: + resolution: {integrity: sha512-oSXzaWypCMHkPC3NvBEaPHf0KsA5mvPrOPgQWDsbg8n7orZ290M0BmC/jgRZ4vcJ6DTAhjrsSYgdsW/F+MFOBA==} + dev: false + + /lodash.isstring@4.0.1: + resolution: {integrity: sha512-0wJxfxH1wgO3GrbuP+dTTk7op+6L41QCXbGINEmD+ny/G/eCqGzxyCsh7159S+mgDDcoarnBw6PC1PS5+wUGgw==} + dev: false + + /lodash.memoize@4.1.2: + resolution: {integrity: sha512-t7j+NzmgnQzTAYXcsHYLgimltOV1MXHtlOWf6GjL9Kj8GK5FInw5JotxvbOs+IvV1/Dzo04/fCGfLVs7aXb4Ag==} + dev: true + + /lodash.merge@4.6.2: + resolution: {integrity: sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==} + + /lodash.omit@4.5.0: + resolution: {integrity: sha512-XeqSp49hNGmlkj2EJlfrQFIzQ6lXdNro9sddtQzcJY8QaoC2GO0DT7xaIokHeyM+mIT0mPMlPvkYzg2xCuHdZg==} + dev: false + + /lodash.once@4.1.1: + resolution: {integrity: sha512-Sb487aTOCr9drQVL8pIxOzVhafOjZN9UU54hiN8PU3uAiSV7lx1yYNpbNmex2PK6dSJoNTSJUUswT651yww3Mg==} + dev: false + + /lodash.sortby@4.7.0: + resolution: {integrity: sha512-HDWXG8isMntAyRF5vZ7xKuEvOhT4AhlRt/3czTSjvGUxjYCBVRQY48ViDHyfYz9VIoBkW4TMGQNapx+l3RUwdA==} + requiresBuild: true + dev: false + optional: true + + /lodash.startcase@4.4.0: + resolution: {integrity: sha512-+WKqsK294HMSc2jEbNgpHpd0JfIBhp7rEV4aqXWqFr6AlXov+SlcgB1Fv01y2kGe3Gc8nMW7VA0SrGuSkRfIEg==} + dev: false + + /lodash@4.17.21: + resolution: {integrity: sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==} + + /log-symbols@4.1.0: + resolution: {integrity: sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==} + engines: {node: '>=10'} + dependencies: + chalk: 4.1.2 + is-unicode-supported: 0.1.0 + + /logform@2.5.1: + resolution: {integrity: sha512-9FyqAm9o9NKKfiAKfZoYo9bGXXuwMkxQiQttkT4YjjVtQVIQtK6LmVtlxmCaFswo6N4AfEkHqZTV0taDtPotNg==} + dependencies: + '@colors/colors': 1.5.0 + '@types/triple-beam': 1.3.3 + fecha: 4.2.3 + ms: 2.1.3 + safe-stable-stringify: 2.4.3 + triple-beam: 1.4.1 + dev: false + + /lru-cache@4.0.2: + resolution: {integrity: sha512-uQw9OqphAGiZhkuPlpFGmdTU2tEuhxTourM/19qGJrxBPHAr/f8BT1a0i/lOclESnGatdJG/UCkP9kZB/Lh1iw==} + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: false + + /lru-cache@4.1.5: + resolution: {integrity: sha512-sWZlbEP2OsHNkXrMl5GYk/jKk70MBng6UU4YI/qGDYbgf6YbP4EvmqISbXCoJiRKs+1bSpFHVgQxvJ17F2li5g==} + requiresBuild: true + dependencies: + pseudomap: 1.0.2 + yallist: 2.1.2 + dev: false + optional: true + + /lru-cache@5.1.1: + resolution: {integrity: sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==} + dependencies: + yallist: 3.1.1 + dev: true + + /lru-cache@6.0.0: + resolution: {integrity: sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==} + engines: {node: '>=10'} + dependencies: + yallist: 4.0.0 + + /lru-memoizer@2.2.0: + resolution: {integrity: sha512-QfOZ6jNkxCcM/BkIPnFsqDhtrazLRsghi9mBwFAzol5GCvj4EkFT899Za3+QwikCg5sRX8JstioBDwOxEyzaNw==} + dependencies: + lodash.clonedeep: 4.5.0 + lru-cache: 4.0.2 + dev: false + + /lru_map@0.4.1: + resolution: {integrity: sha512-I+lBvqMMFfqaV8CJCISjI3wbjmwVu/VyOoU7+qtu9d7ioW5klMgsTTiUOUp+DJvfTTzKXoPbyC6YfgkNcyPSOg==} + dev: false + + /lunr@2.3.9: + resolution: {integrity: sha512-zTU3DaZaF3Rt9rhN3uBMGQD3dD2/vFQqnvZCDv4dl5iOzq2IZQqTxu90r4E5J+nP70J3ilqVCrbho2eWaeW8Ow==} + dev: true + + /luxon@1.28.1: + resolution: {integrity: sha512-gYHAa180mKrNIUJCbwpmD0aTu9kV0dREDrwNnuyFAsO1Wt0EVYSZelPnJlbj9HplzXX/YWXHFTL45kvZ53M0pw==} + dev: false + + /macos-release@2.5.1: + resolution: {integrity: sha512-DXqXhEM7gW59OjZO8NIjBCz9AQ1BEMrfiOAl4AYByHCtVHRF4KoGNO8mqQeM8lRCtQe/UnJ4imO/d2HdkKsd+A==} + engines: {node: '>=6'} + + /magic-string@0.25.7: + resolution: {integrity: sha512-4CrMT5DOHTDk4HYDlzmwu4FVCcIYI8gauveasrdCu2IKIFOJ3f0v/8MDGJCDL9oD2ppz/Av1b0Nj345H9M+XIA==} + dependencies: + sourcemap-codec: 1.4.8 + + /make-dir@4.0.0: + resolution: {integrity: sha512-hXdUTZYIVOt1Ex//jAQi+wTZZpUpwBj/0QsOzqegb3rGMMeJiSEu5xLHnYfBrRV4RH2+OCSOO95Is/7x1WJ4bw==} + engines: {node: '>=10'} + dependencies: + semver: 7.5.4 + dev: true + + /make-error@1.3.6: + resolution: {integrity: sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==} + + /make-fetch-happen@9.1.0: + resolution: {integrity: sha512-+zopwDy7DNknmwPQplem5lAZX/eCOzSvSNNcSKm5eVwTkOBzoktEfXsa9L23J/GIRhxRsaxzkPEhrJEpE2F4Gg==} + engines: {node: '>= 10'} + dependencies: + agentkeepalive: 4.5.0 + cacache: 15.3.0 + http-cache-semantics: 4.1.1 + http-proxy-agent: 4.0.1 + https-proxy-agent: 5.0.1 + is-lambda: 1.0.1 + lru-cache: 6.0.0 + minipass: 3.3.6 + minipass-collect: 1.0.2 + minipass-fetch: 1.4.1 + minipass-flush: 1.0.5 + minipass-pipeline: 1.2.4 + negotiator: 0.6.3 + promise-retry: 2.0.1 + socks-proxy-agent: 6.2.1 + ssri: 8.0.1 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + + /makeerror@1.0.12: + resolution: {integrity: sha512-JmqCvUhmt43madlpFzG4BQzG2Z3m6tvQDNKdClZnO3VbIudJYmxsT0FNJMeiB2+JTSlTQTSbU8QdesVmwJcmLg==} + dependencies: + tmpl: 1.0.5 + dev: true + + /mapcap@1.0.0: + resolution: {integrity: sha512-KcNlZSlFPx+r1jYZmxEbTVymG+dIctf10WmWkuhrhrblM+KMoF77HelwihL5cxYlORye79KoR4IlOOk99lUJ0g==} + requiresBuild: true + dev: false + optional: true + + /marked@4.3.0: + resolution: {integrity: sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==} + engines: {node: '>= 12'} + hasBin: true + dev: true + + /measured-core@1.51.1: + resolution: {integrity: sha512-DZQP9SEwdqqYRvT2slMK81D/7xwdxXosZZBtLVfPSo6y5P672FBTbzHVdN4IQyUkUpcVOR9pIvtUy5Ryl7NKyg==} + engines: {node: '>= 5.12'} + requiresBuild: true + dependencies: + binary-search: 1.3.6 + optional-js: 2.3.0 + dev: false + optional: true + + /measured-reporting@1.51.1: + resolution: {integrity: sha512-JCt+2u6XT1I5lG3SuYqywE0e62DJuAzBcfMzWGUhIYtPQV2Vm4HiYt/durqmzsAbZV181CEs+o/jMKWJKkYIWw==} + engines: {node: '>= 5.12'} + requiresBuild: true + dependencies: + console-log-level: 1.4.1 + mapcap: 1.0.0 + measured-core: 1.51.1 + optional-js: 2.3.0 + dev: false + optional: true + + /media-typer@0.3.0: + resolution: {integrity: sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==} + engines: {node: '>= 0.6'} + + /memfs@3.5.3: + resolution: {integrity: sha512-UERzLsxzllchadvbPs5aolHh65ISpKpM+ccLbOJ8/vvpBKmAWf+la7dXFy7Mr0ySHbdHrFv5kGFCUHHe6GFEmw==} + engines: {node: '>= 4.0.0'} + dependencies: + fs-monkey: 1.0.5 + + /merge-descriptors@1.0.1: + resolution: {integrity: sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==} + + /merge-stream@2.0.0: + resolution: {integrity: sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==} + + /merge2@1.4.1: + resolution: {integrity: sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==} + engines: {node: '>= 8'} + dev: true + + /methods@1.1.2: + resolution: {integrity: sha512-iclAHeNqNm68zFtnZ0e+1L2yUIdvzNoauKU4WBA3VvH/vPFieF7qfRlwUZU+DA9P9bPXIS90ulxoUoCH23sV2w==} + engines: {node: '>= 0.6'} + + /micromatch@4.0.5: + resolution: {integrity: sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==} + engines: {node: '>=8.6'} + dependencies: + braces: 3.0.2 + picomatch: 2.3.1 + dev: true + + /mime-db@1.52.0: + resolution: {integrity: sha512-sPU4uV7dYlvtWJxwwxHD0PuihVNiE7TyAbQ5SWxDCB9mUYvOgroQOwYQQOKPJ8CIbE+1ETVlOoK1UC2nU3gYvg==} + engines: {node: '>= 0.6'} + + /mime-types@2.1.35: + resolution: {integrity: sha512-ZDY+bPm5zTTF+YpCrAU9nK0UgICYPT0QtT1NZWFv4s++TNkcgVaT0g6+4R2uI4MjQjzysHB1zxuWL50hzaeXiw==} + engines: {node: '>= 0.6'} + dependencies: + mime-db: 1.52.0 + + /mime@1.6.0: + resolution: {integrity: sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==} + engines: {node: '>=4'} + hasBin: true + + /mime@2.6.0: + resolution: {integrity: sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==} + engines: {node: '>=4.0.0'} + hasBin: true + dev: true + + /mimic-fn@2.1.0: + resolution: {integrity: sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==} + engines: {node: '>=6'} + + /minimatch@3.1.2: + resolution: {integrity: sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==} + dependencies: + brace-expansion: 1.1.11 + + /minimatch@5.1.6: + resolution: {integrity: sha512-lKwV/1brpG6mBUFHtb7NUmtABCb2WZZmm2wNiOA5hAb8VdCS4B3dtMWyvcoViccwAW/COERjXLt0zP1zXUN26g==} + engines: {node: '>=10'} + dependencies: + brace-expansion: 2.0.1 + dev: true + + /minimist@1.2.6: + resolution: {integrity: sha512-Jsjnk4bw3YJqYzbdyBiNsPWHPfO++UGG749Cxs6peCu5Xg4nrena6OVxOYxrQTqww0Jmwt+Ref8rggumkTLz9Q==} + + /minimist@1.2.8: + resolution: {integrity: sha512-2yyAR8qBkN3YuheJanUpWC5U3bb5osDywNB8RzDVlDwDHbocAJveqqj1u8+SVD7jkWT4yvsHCpWqqWqAxb0zCA==} + + /minipass-collect@1.0.2: + resolution: {integrity: sha512-6T6lH0H8OG9kITm/Jm6tdooIbogG9e0tLgpY6mphXSm/A9u8Nq1ryBG+Qspiub9LjWlBPsPS3tWQ/Botq4FdxA==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-fetch@1.4.1: + resolution: {integrity: sha512-CGH1eblLq26Y15+Azk7ey4xh0J/XfJfrCox5LDJiKqI2Q2iwOLOKrlmIaODiSQS8d18jalF6y2K2ePUm0CmShw==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + minipass-sized: 1.0.3 + minizlib: 2.1.2 + optionalDependencies: + encoding: 0.1.13 + dev: false + + /minipass-flush@1.0.5: + resolution: {integrity: sha512-JmQSYYpPUqX5Jyn1mXaRwOda1uQ8HP5KAT/oDSLCzt1BYRhQU0/hDtsB1ufZfEEzMZ9aAVmsBw8+FWsIXlClWw==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-pipeline@1.2.4: + resolution: {integrity: sha512-xuIq7cIOt09RPRJ19gdi4b+RiNvDFYe5JH+ggNvBqGqpQXcru3PcRmOZuHBKWK1Txf9+cQ+HMVN4d6z46LZP7A==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass-sized@1.0.3: + resolution: {integrity: sha512-MbkQQ2CTiBMlA2Dm/5cY+9SWFEN8pzzOXi6rlM5Xxq0Yqbda5ZQy9sU75a673FE9ZK0Zsbr6Y5iP6u9nktfg2g==} + engines: {node: '>=8'} + dependencies: + minipass: 3.3.6 + dev: false + + /minipass@3.3.6: + resolution: {integrity: sha512-DxiNidxSEK+tHG6zOIklvNOwm3hvCrbUrdtzY74U6HKTJxvIDfOUL5W5P2Ghd3DTkhhKPYGqeNUIh5qcM4YBfw==} + engines: {node: '>=8'} + dependencies: + yallist: 4.0.0 + dev: false + + /minipass@5.0.0: + resolution: {integrity: sha512-3FnjYuehv9k6ovOEbyOswadCDPX1piCfhV8ncmYtHOjuPwylVWsghTLo7rabjC3Rx5xD4HDx8Wm1xnMF7S5qFQ==} + engines: {node: '>=8'} + dev: false + + /minizlib@2.1.2: + resolution: {integrity: sha512-bAxsR8BVfj60DWXHE3u30oHzfl4G7khkSuPW+qvpd7jFRHm7dLxOjUk1EHACJ/hxLY8phGJ0YhYHZo7jil7Qdg==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + yallist: 4.0.0 + dev: false + + /mkdirp@0.5.6: + resolution: {integrity: sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==} + hasBin: true + dependencies: + minimist: 1.2.8 + + /mkdirp@1.0.4: + resolution: {integrity: sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==} + engines: {node: '>=10'} + hasBin: true + dev: false + + /module-details-from-path@1.0.3: + resolution: {integrity: sha512-ySViT69/76t8VhE1xXHK6Ch4NcDd26gx0MzKXLO+F7NOtnqH68d9zF94nT8ZWSxXh8ELOERsnJO/sWt1xZYw5A==} + requiresBuild: true + dev: false + optional: true + + /moment-timezone@0.5.43: + resolution: {integrity: sha512-72j3aNyuIsDxdF1i7CEgV2FfxM1r6aaqJyLB2vwb33mXYyoyLly+F1zbWqhA3/bVIoJ4szlUoMbUnVdid32NUQ==} + dependencies: + moment: 2.29.4 + dev: false + + /moment@2.29.4: + resolution: {integrity: sha512-5LC9SOxjSc2HF6vO2CyuTDNivEdoz2IvyJJGj6X8DJ0eFyfszE0QiEd+iXmBvUP3WHxSjFH/vIsA0EN00cgr8w==} + dev: false + + /monitor-event-loop-delay@1.0.0: + resolution: {integrity: sha512-YRIr1exCIfBDLZle8WHOfSo7Xg3M+phcZfq9Fx1L6Abo+atGp7cge5pM7PjyBn4s1oZI/BRD4EMrzQBbPpVb5Q==} + requiresBuild: true + dev: false + optional: true + + /ms@2.0.0: + resolution: {integrity: sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==} + + /ms@2.1.2: + resolution: {integrity: sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==} + + /ms@2.1.3: + resolution: {integrity: sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==} + + /multer@1.3.0: + resolution: {integrity: sha512-wbAkTsh0QXkvqvHCU2qSLEXLuRN7IKMEe80+JrXfJzANniPNgrNcDOMKfGgR1EhL7y7MHIbODVwT7uaVY20ggw==} + engines: {node: '>= 0.10.0'} + deprecated: Multer 1.x is affected by CVE-2022-24434. This is fixed in v1.4.4-lts.1 which drops support for versions of Node.js before 6. Please upgrade to at least Node.js 6 and version 1.4.4-lts.1 of Multer. If you need support for older versions of Node.js, we are open to accepting patches that would fix the CVE on the main 1.x release line, whilst maintaining compatibility with Node.js 0.10. + requiresBuild: true + dependencies: + append-field: 0.1.0 + busboy: 0.2.14 + concat-stream: 1.6.2 + mkdirp: 0.5.6 + object-assign: 3.0.0 + on-finished: 2.4.1 + type-is: 1.6.18 + xtend: 4.0.2 + dev: false + optional: true + + /multer@1.4.4: + resolution: {integrity: sha512-2wY2+xD4udX612aMqMcB8Ws2Voq6NIUPEtD1be6m411T4uDH/VtL9i//xvcyFlTVfRdaBsk7hV5tgrGQqhuBiw==} + engines: {node: '>= 0.10.0'} + deprecated: Multer 1.x is affected by CVE-2022-24434. This is fixed in v1.4.4-lts.1 which drops support for versions of Node.js before 6. Please upgrade to at least Node.js 6 and version 1.4.4-lts.1 of Multer. If you need support for older versions of Node.js, we are open to accepting patches that would fix the CVE on the main 1.x release line, whilst maintaining compatibility with Node.js 0.10. + requiresBuild: true + dependencies: + append-field: 1.0.0 + busboy: 0.2.14 + concat-stream: 1.6.2 + mkdirp: 0.5.6 + object-assign: 4.1.1 + on-finished: 2.4.1 + type-is: 1.6.18 + xtend: 4.0.2 + dev: false + optional: true + + /multer@1.4.4-lts.1: + resolution: {integrity: sha512-WeSGziVj6+Z2/MwQo3GvqzgR+9Uc+qt8SwHKh3gvNPiISKfsMfG4SvCOFYlxxgkXt7yIV2i1yczehm0EOKIxIg==} + engines: {node: '>= 6.0.0'} + dependencies: + append-field: 1.0.0 + busboy: 1.6.0 + concat-stream: 1.6.2 + mkdirp: 0.5.6 + object-assign: 4.1.1 + type-is: 1.6.18 + xtend: 4.0.2 + + /multibase@4.0.6: + resolution: {integrity: sha512-x23pDe5+svdLz/k5JPGCVdfn7Q5mZVMBETiC+ORfO+sor9Sgs0smJzAjfTbM5tckeCqnaUuMYoz+k3RXMmJClQ==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + deprecated: This module has been superseded by the multiformats module + dependencies: + '@multiformats/base-x': 4.0.1 + dev: false + + /multiformats@9.9.0: + resolution: {integrity: sha512-HoMUjhH9T8DDBNT+6xzkrd9ga/XiBI4xLr58LJACwK6G3HTOPeMz4nB4KJs33L2BelrIJa7P0VuNaVF3hMYfjg==} + dev: false + + /multihashes@4.0.3: + resolution: {integrity: sha512-0AhMH7Iu95XjDLxIeuCOOE4t9+vQZsACyKZ9Fxw2pcsRmlX4iCn1mby0hS0bb+nQOVpdQYWPpnyusw4da5RPhA==} + engines: {node: '>=12.0.0', npm: '>=6.0.0'} + dependencies: + multibase: 4.0.6 + uint8arrays: 3.1.1 + varint: 5.0.2 + dev: false + + /mute-stream@0.0.8: + resolution: {integrity: sha512-nnbWWOkoWyUsTjKrhgD0dcz22mdkSnpYqbEjIm2nhwhuxlSkpywJmBo8h0ZqJdkp73mb90SssHkN4rsRaBAfAA==} + + /nan@2.18.0: + resolution: {integrity: sha512-W7tfG7vMOGtD30sHoZSSc/JVYiyDPEyQVso/Zz+/uQd0B0L46gtC+pHha5FFMRpil6fm/AoEcRWyOVi4+E/f8w==} + dev: false + + /nats@2.17.0: + resolution: {integrity: sha512-749TtweWL6bc9R9yNra4a+tuk8J0bqurxcPV/9R2D+WPTplY4PPde/LPSXspqR/eCCTxiM80/AjVlfboEafRxA==} + engines: {node: '>= 14.0.0'} + dependencies: + nkeys.js: 1.0.5 + + /natural-compare-lite@1.4.0: + resolution: {integrity: sha512-Tj+HTDSJJKaZnfiuw+iaF9skdPpTo2GtEly5JHnWV/hfv2Qj/9RKsGISQtLh2ox3l5EAGw487hnBee0sIJ6v2g==} + dev: true + + /natural-compare@1.4.0: + resolution: {integrity: sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==} + dev: true + + /negotiator@0.6.3: + resolution: {integrity: sha512-+EUsqGPLsM+j/zdChZjsnX51g4XrHFOIXwfnCVPGlQk/k5giakcKsuxCObBRu6DSm9opw/O6slWbJdghQM4bBg==} + engines: {node: '>= 0.6'} + + /neo-async@2.6.2: + resolution: {integrity: sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==} + + /next-line@1.1.0: + resolution: {integrity: sha512-+I10J3wKNoKddNxn0CNpoZ3eTZuqxjNM3b1GImVx22+ePI+Y15P8g/j3WsbP0fhzzrFzrtjOAoq5NCCucswXOQ==} + requiresBuild: true + dev: false + optional: true + + /nkeys.js@1.0.5: + resolution: {integrity: sha512-u25YnRPHiGVsNzwyHnn+PT90sgAhnS8jUJ1nxmkHMFYCJ6+Ic0lv291w7uhRBpJVJ3PH2GWbYqA151lGCRrB5g==} + engines: {node: '>=10.0.0'} + dependencies: + tweetnacl: 1.0.3 + + /node-emoji@1.11.0: + resolution: {integrity: sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==} + dependencies: + lodash: 4.17.21 + + /node-fetch@2.7.0: + resolution: {integrity: sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==} + engines: {node: 4.x || >=6.0.0} + peerDependencies: + encoding: ^0.1.0 + peerDependenciesMeta: + encoding: + optional: true + dependencies: + whatwg-url: 5.0.0 + + /node-gyp@8.4.1: + resolution: {integrity: sha512-olTJRgUtAb/hOXG0E93wZDs5YiJlgbXxTwQAFHyNlRsXQnYzUaF2aGgujZbw+hR8aF4ZG/rST57bWMWD16jr9w==} + engines: {node: '>= 10.12.0'} + hasBin: true + dependencies: + env-paths: 2.2.1 + glob: 7.2.3 + graceful-fs: 4.2.11 + make-fetch-happen: 9.1.0 + nopt: 5.0.0 + npmlog: 6.0.2 + rimraf: 3.0.2 + semver: 7.5.4 + tar: 6.2.0 + which: 2.0.2 + transitivePeerDependencies: + - bluebird + - supports-color + dev: false + + /node-int64@0.4.0: + resolution: {integrity: sha512-O5lz91xSOeoXP6DulyHfllpq+Eg00MWitZIbtPfoSEvqIHdl5gfcY6hYzDWnj0qD5tz52PI08u9qUvSVeUBeHw==} + dev: true + + /node-mocks-http@1.13.0: + resolution: {integrity: sha512-lArD6sJMPJ53WF50GX0nJ89B1nkV1TdMvNwq8WXXFrUXF80ujSyye1T30mgiHh4h2It0/svpF3C4kZ2OAONVlg==} + engines: {node: '>=14'} + dependencies: + accepts: 1.3.8 + content-disposition: 0.5.4 + depd: 1.1.2 + fresh: 0.5.2 + merge-descriptors: 1.0.1 + methods: 1.1.2 + mime: 1.6.0 + parseurl: 1.3.3 + range-parser: 1.2.1 + type-is: 1.6.18 + dev: true + + /node-releases@2.0.13: + resolution: {integrity: sha512-uYr7J37ae/ORWdZeQ1xxMJe3NtdmqMC/JZK+geofDrkLUApKRHPd18/TxtBOJ4A0/+uUIliorNrfYV6s1b02eQ==} + + /nopt@5.0.0: + resolution: {integrity: sha512-Tbj67rffqceeLpcRXrT7vKAN8CwfPeIBgM7E6iBkmKLV7bEMwpGgYLGv0jACUsECaa/vuxP0IjEont6umdMgtQ==} + engines: {node: '>=6'} + hasBin: true + dependencies: + abbrev: 1.1.1 + dev: false + + /normalize-path@3.0.0: + resolution: {integrity: sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==} + engines: {node: '>=0.10.0'} + + /npm-run-path@4.0.1: + resolution: {integrity: sha512-S48WzZW777zhNIrn7gxOlISNAqi9ZC/uQFnRdbeIHhZhCA6UqpkOT8T1G7BvfdgP4Er8gF4sUbaS0i7QvIfCWw==} + engines: {node: '>=8'} + dependencies: + path-key: 3.1.1 + + /npmlog@6.0.2: + resolution: {integrity: sha512-/vBvz5Jfr9dT/aFWd0FIRf+T/Q2WBsLENygUaFUqstqsycmZAP/t5BvFJTK0viFmSUxiUKTUplWy5vt+rvKIxg==} + engines: {node: ^12.13.0 || ^14.15.0 || >=16.0.0} + dependencies: + are-we-there-yet: 3.0.1 + console-control-strings: 1.1.0 + gauge: 4.0.4 + set-blocking: 2.0.0 + dev: false + + /nwsapi@2.2.7: + resolution: {integrity: sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ==} + dev: true + + /object-assign@3.0.0: + resolution: {integrity: sha512-jHP15vXVGeVh1HuaA2wY6lxk+whK/x4KBG88VXeRma7CCun7iGD5qPc4eYykQ9sdQvg8jkwFKsSxHln2ybW3xQ==} + engines: {node: '>=0.10.0'} + requiresBuild: true + dev: false + optional: true + + /object-assign@4.1.1: + resolution: {integrity: sha512-rJgTQnkUnH1sFw8yT6VSU3zD3sWmu6sZhIseY8VX+GRu3P6F7Fu+JNDoXfklElbLJSnc3FUQHVe4cU5hj+BcUg==} + engines: {node: '>=0.10.0'} + + /object-filter-sequence@1.0.0: + resolution: {integrity: sha512-CsubGNxhIEChNY4cXYuA6KXafztzHqzLLZ/y3Kasf3A+sa3lL9thq3z+7o0pZqzEinjXT6lXDPAfVWI59dUyzQ==} + requiresBuild: true + dev: false + optional: true + + /object-hash@3.0.0: + resolution: {integrity: sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==} + engines: {node: '>= 6'} + + /object-identity-map@1.0.2: + resolution: {integrity: sha512-a2XZDGyYTngvGS67kWnqVdpoaJWsY7C1GhPJvejWAFCsUioTAaiTu8oBad7c6cI4McZxr4CmvnZeycK05iav5A==} + requiresBuild: true + dependencies: + object.entries: 1.1.7 + dev: false + optional: true + + /object-inspect@1.12.3: + resolution: {integrity: sha512-geUvdk7c+eizMNUDkRpW1wJwgfOiOeHbxBR/hLXK1aT6zmVSO0jsQcs7fj6MGw89jC/cjGfLcNOrtMYtGqm81g==} + + /object-keys@1.1.1: + resolution: {integrity: sha512-NuAESUOUMrlIXOfHKzD6bpPu3tYt3xvjNdRIQ+FeT0lNb4K8WR70CaDxhuNguS2XG+GjkyMwOzsN5ZktImfhLA==} + engines: {node: '>= 0.4'} + + /object.assign@4.1.4: + resolution: {integrity: sha512-1mxKf0e58bvyjSCtKYY4sRe9itRk3PJpquJOjeIkz885CczcI4IvJJDLPS72oowuSh+pBxUFROpX+TU++hxhZQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + has-symbols: 1.0.3 + object-keys: 1.1.1 + + /object.entries@1.1.7: + resolution: {integrity: sha512-jCBs/0plmPsOnrKAfFQXRG2NFjlhZgjjcBLSmTnEhU8U6vVTsVe8ANeQJCHTl3gSsI4J+0emOoCgoKlmQPMgmA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + + /object.fromentries@2.0.7: + resolution: {integrity: sha512-UPbPHML6sL8PI/mOqPwsH4G6iyXcCGzLin8KvEPenOZN5lpCNBZZQ+V62vdjB1mQHrmqGQt5/OJzemUA+KJmEA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + dev: true + + /object.groupby@1.0.1: + resolution: {integrity: sha512-HqaQtqLnp/8Bn4GL16cj+CUYbnpe1bh0TtEaWvybszDG4tgxCJuRpV8VGuvNaI1fAnI4lUJzDG55MXcOH4JZcQ==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + get-intrinsic: 1.2.1 + dev: true + + /object.values@1.1.7: + resolution: {integrity: sha512-aU6xnDFYT3x17e/f0IiiwlGPTy2jzMySGfUB4fq6z7CV8l85CWHDk5ErhyhpfDHhrOMwGFhSQkhMGHaIotA6Ng==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + dev: true + + /on-finished@2.4.1: + resolution: {integrity: sha512-oVlzkg3ENAhCk2zdv7IJwd/QUD4z2RxRwpkcGY8psCVcCYZNq4wYnVWALHM+brtuJjePWiYF/ClmuDr8Ch5+kg==} + engines: {node: '>= 0.8'} + dependencies: + ee-first: 1.1.1 + + /on-headers@1.0.2: + resolution: {integrity: sha512-pZAE+FJLoyITytdqK0U5s+FIpjN0JP3OzFi/u8Rx+EV5/W+JTWGXG8xFzevE7AjBfDqHv/8vL8qQsIhHnqRkrA==} + engines: {node: '>= 0.8'} + dev: false + + /once@1.4.0: + resolution: {integrity: sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==} + dependencies: + wrappy: 1.0.2 + + /one-time@1.0.0: + resolution: {integrity: sha512-5DXOiRKwuSEcQ/l0kGCF6Q3jcADFv5tSmRaJck/OqkVFcOzutB134KRSfF0xDrL39MNnqxbHBbUUcjZIhTgb2g==} + dependencies: + fn.name: 1.1.0 + dev: false + + /onetime@5.1.2: + resolution: {integrity: sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==} + engines: {node: '>=6'} + dependencies: + mimic-fn: 2.1.0 + + /only@0.0.2: + resolution: {integrity: sha512-Fvw+Jemq5fjjyWz6CpKx6w9s7xxqo3+JCyM0WXWeCSOboZ8ABkyvP8ID4CZuChA/wxSx+XSJmdOm8rGVyJ1hdQ==} + requiresBuild: true + dev: false + optional: true + + /openapi3-ts@2.0.2: + resolution: {integrity: sha512-TxhYBMoqx9frXyOgnRHufjQfPXomTIHYKhSKJ6jHfj13kS8OEIhvmE8CTuQyKtjjWttAjX5DPxM1vmalEpo8Qw==} + dependencies: + yaml: 1.10.2 + dev: false + + /optional-js@2.3.0: + resolution: {integrity: sha512-B0LLi+Vg+eko++0z/b8zIv57kp7HKEzaPJo7LowJXMUKYdf+3XJGu/cw03h/JhIOsLnP+cG5QnTHAuicjA5fMw==} + requiresBuild: true + dev: false + optional: true + + /optionator@0.9.3: + resolution: {integrity: sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==} + engines: {node: '>= 0.8.0'} + dependencies: + '@aashutoshrathi/word-wrap': 1.2.6 + deep-is: 0.1.4 + fast-levenshtein: 2.0.6 + levn: 0.4.1 + prelude-ls: 1.2.1 + type-check: 0.4.0 + dev: true + + /ora@5.4.1: + resolution: {integrity: sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==} + engines: {node: '>=10'} + dependencies: + bl: 4.1.0 + chalk: 4.1.2 + cli-cursor: 3.1.0 + cli-spinners: 2.9.1 + is-interactive: 1.0.0 + is-unicode-supported: 0.1.0 + log-symbols: 4.1.0 + strip-ansi: 6.0.1 + wcwidth: 1.0.1 + + /original-url@1.2.3: + resolution: {integrity: sha512-BYm+pKYLtS4mVe/mgT3YKGtWV5HzN/XKiaIu1aK4rsxyjuHeTW9N+xVBEpJcY1onB3nccfH0RbzUEoimMqFUHQ==} + requiresBuild: true + dependencies: + forwarded-parse: 2.1.2 + dev: false + optional: true + + /os-name@4.0.1: + resolution: {integrity: sha512-xl9MAoU97MH1Xt5K9ERft2YfCAoaO6msy1OBA0ozxEC0x0TmIoE6K3QvgJMMZA9yKGLmHXNY/YZoDbiGDj4zYw==} + engines: {node: '>=10'} + dependencies: + macos-release: 2.5.1 + windows-release: 4.0.0 + + /os-tmpdir@1.0.2: + resolution: {integrity: sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g==} + engines: {node: '>=0.10.0'} + + /p-limit@2.3.0: + resolution: {integrity: sha512-//88mFWSJx8lxCzwdAABTJL2MyWB12+eIY7MDL2SqLmAkeKU9qxRvWuSyTjm3FUmpBEMuFfckAIqEaVGUDxb6w==} + engines: {node: '>=6'} + dependencies: + p-try: 2.2.0 + dev: true + + /p-limit@3.1.0: + resolution: {integrity: sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==} + engines: {node: '>=10'} + dependencies: + yocto-queue: 0.1.0 + dev: true + + /p-locate@4.1.0: + resolution: {integrity: sha512-R79ZZ/0wAxKGu3oYMlz8jy/kbhsNrS7SKZ7PxEHBgJ5+F2mtFW2fK2cOtBh1cHYkQsbzFV7I+EoRKe6Yt0oK7A==} + engines: {node: '>=8'} + dependencies: + p-limit: 2.3.0 + dev: true + + /p-locate@5.0.0: + resolution: {integrity: sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==} + engines: {node: '>=10'} + dependencies: + p-limit: 3.1.0 + dev: true + + /p-map@4.0.0: + resolution: {integrity: sha512-/bjOqmgETBYB5BoEeGVea8dmvHb2m9GLy1E9W43yeyfP6QQCZGFNa+XRceJEuDB6zqr+gKpIAmlLebMpykw/MQ==} + engines: {node: '>=10'} + dependencies: + aggregate-error: 3.1.0 + dev: false + + /p-try@2.2.0: + resolution: {integrity: sha512-R4nPAVTAU0B9D35/Gk3uJf/7XYbQcyohSKdvAxIRSNghFl4e71hVoGnBNQz9cWaXxO2I10KTC+3jMdvvoKw6dQ==} + engines: {node: '>=6'} + dev: true + + /packet-reader@1.0.0: + resolution: {integrity: sha512-HAKu/fG3HpHFO0AA8WE8q2g+gBJaZ9MG7fcKk+IJPLTGAD6Psw4443l+9DGRbOIh3/aXr7Phy0TjilYivJo5XQ==} + dev: false + + /parent-module@1.0.1: + resolution: {integrity: sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==} + engines: {node: '>=6'} + dependencies: + callsites: 3.1.0 + + /parse-json@5.2.0: + resolution: {integrity: sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==} + engines: {node: '>=8'} + dependencies: + '@babel/code-frame': 7.22.13 + error-ex: 1.3.2 + json-parse-even-better-errors: 2.3.1 + lines-and-columns: 1.2.4 + + /parse5@6.0.1: + resolution: {integrity: sha512-Ofn/CTFzRGTTxwpNEs9PP93gXShHcTq255nzRYSKe8AkVpZY7e1fpmTfOyoIvjP5HG7Z2ZM7VS9PPhQGW2pOpw==} + dev: true + + /parseurl@1.3.3: + resolution: {integrity: sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==} + engines: {node: '>= 0.8'} + + /path-exists@4.0.0: + resolution: {integrity: sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==} + engines: {node: '>=8'} + dev: true + + /path-is-absolute@1.0.1: + resolution: {integrity: sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==} + engines: {node: '>=0.10.0'} + + /path-key@3.1.1: + resolution: {integrity: sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==} + engines: {node: '>=8'} + + /path-parse@1.0.7: + resolution: {integrity: sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==} + + /path-to-regexp@0.1.7: + resolution: {integrity: sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==} + + /path-to-regexp@1.8.0: + resolution: {integrity: sha512-n43JRhlUKUAlibEJhPeir1ncUID16QnEjNpwzNdO3Lm4ywrBpBZ5oLD0I6br9evr1Y9JTqwRtAh7JLoOzAQdVA==} + requiresBuild: true + dependencies: + isarray: 0.0.1 + dev: false + optional: true + + /path-to-regexp@2.4.0: + resolution: {integrity: sha512-G6zHoVqC6GGTQkZwF4lkuEyMbVOjoBKAEybQUypI1WTkqinCOrq2x6U2+phkJ1XsEMTy4LjtwPI7HW+NVrRR2w==} + dev: false + + /path-to-regexp@3.2.0: + resolution: {integrity: sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==} + + /path-type@4.0.0: + resolution: {integrity: sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==} + engines: {node: '>=8'} + + /pg-cloudflare@1.1.1: + resolution: {integrity: sha512-xWPagP/4B6BgFO+EKz3JONXv3YDgvkbVrGw2mTo3D6tVDQRh1e7cqVGvyR3BE+eQgAvx1XhW/iEASj4/jCWl3Q==} + requiresBuild: true + dev: false + optional: true + + /pg-connection-string@2.6.2: + resolution: {integrity: sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==} + dev: false + + /pg-int8@1.0.1: + resolution: {integrity: sha512-WCtabS6t3c8SkpDBUlb1kjOs7l66xsGdKpIPZsg4wR+B3+u9UAum2odSsF9tnvxg80h4ZxLWMy4pRjOsFIqQpw==} + engines: {node: '>=4.0.0'} + dev: false + + /pg-pool@3.6.1(pg@8.11.3): + resolution: {integrity: sha512-jizsIzhkIitxCGfPRzJn1ZdcosIt3pz9Sh3V01fm1vZnbnCMgmGl5wvGGdNN2EL9Rmb0EcFoCkixH4Pu+sP9Og==} + peerDependencies: + pg: '>=8.0' + dependencies: + pg: 8.11.3 + dev: false + + /pg-protocol@1.6.0: + resolution: {integrity: sha512-M+PDm637OY5WM307051+bsDia5Xej6d9IR4GwJse1qA1DIhiKlksvrneZOYQq42OM+spubpcNYEo2FcKQrDk+Q==} + dev: false + + /pg-types@2.2.0: + resolution: {integrity: sha512-qTAAlrEsl8s4OiEQY69wDvcMIdQN6wdz5ojQiOy6YRMuynxenON0O5oCpJI6lshc6scgAY8qvJ2On/p+CXY0GA==} + engines: {node: '>=4'} + dependencies: + pg-int8: 1.0.1 + postgres-array: 2.0.0 + postgres-bytea: 1.0.0 + postgres-date: 1.0.7 + postgres-interval: 1.2.0 + dev: false + + /pg@8.11.3: + resolution: {integrity: sha512-+9iuvG8QfaaUrrph+kpF24cXkH1YOOUeArRNYIxq1viYHZagBxrTno7cecY1Fa44tJeZvaoG+Djpkc3JwehN5g==} + engines: {node: '>= 8.0.0'} + peerDependencies: + pg-native: '>=3.0.1' + peerDependenciesMeta: + pg-native: + optional: true + dependencies: + buffer-writer: 2.0.0 + packet-reader: 1.0.0 + pg-connection-string: 2.6.2 + pg-pool: 3.6.1(pg@8.11.3) + pg-protocol: 1.6.0 + pg-types: 2.2.0 + pgpass: 1.0.5 + optionalDependencies: + pg-cloudflare: 1.1.1 + dev: false + + /pgpass@1.0.5: + resolution: {integrity: sha512-FdW9r/jQZhSeohs1Z3sI1yxFQNFvMcnmfuj4WBMUTxOrAyLMaTcE1aAMBiTlbMNaXvBCQuVi0R7hd8udDSP7ug==} + dependencies: + split2: 4.2.0 + dev: false + + /picocolors@1.0.0: + resolution: {integrity: sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==} + + /picomatch@2.3.1: + resolution: {integrity: sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==} + engines: {node: '>=8.6'} + + /pino-std-serializers@3.2.0: + resolution: {integrity: sha512-EqX4pwDPrt3MuOAAUBMU0Tk5kR/YcCM5fNPEzgCO2zJ5HfX0vbiH9HbJglnyeQsN96Kznae6MWD47pZB5avTrg==} + requiresBuild: true + dev: false + optional: true + + /pino@6.14.0: + resolution: {integrity: sha512-iuhEDel3Z3hF9Jfe44DPXR8l07bhjuFY3GMHIXbjnY9XcafbyDDwl2sN2vw2GjMPf5Nkoe+OFao7ffn9SXaKDg==} + hasBin: true + requiresBuild: true + dependencies: + fast-redact: 3.3.0 + fast-safe-stringify: 2.1.1 + flatstr: 1.0.12 + pino-std-serializers: 3.2.0 + process-warning: 1.0.0 + quick-format-unescaped: 4.0.4 + sonic-boom: 1.4.1 + dev: false + optional: true + + /pirates@4.0.6: + resolution: {integrity: sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg==} + engines: {node: '>= 6'} + dev: true + + /pkg-dir@4.2.0: + resolution: {integrity: sha512-HRDzbaKjC+AOWVXxAU/x54COGeIv9eb+6CkDSQoNTt4XyWoIJvuPsXizxu/Fr23EiekbtZwmh1IcIG/l/a10GQ==} + engines: {node: '>=8'} + dependencies: + find-up: 4.1.0 + dev: true + + /pluralize@8.0.0: + resolution: {integrity: sha512-Nc3IT5yHzflTfbjgqWcCPpo7DaKy4FnpB0l/zCAW0Tc7jxAiuqSxHasntB3D7887LSrA93kDJ9IXovxJYxyLCA==} + engines: {node: '>=4'} + + /postgres-array@2.0.0: + resolution: {integrity: sha512-VpZrUqU5A69eQyW2c5CA1jtLecCsN2U/bD6VilrFDWq5+5UIEVO7nazS3TEcHf1zuPYO/sqGvUvW62g86RXZuA==} + engines: {node: '>=4'} + dev: false + + /postgres-bytea@1.0.0: + resolution: {integrity: sha512-xy3pmLuQqRBZBXDULy7KbaitYqLcmxigw14Q5sj8QBVLqEwXfeybIKVWiqAXTlcvdvb0+xkOtDbfQMOf4lST1w==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-date@1.0.7: + resolution: {integrity: sha512-suDmjLVQg78nMK2UZ454hAG+OAW+HQPZ6n++TNDUX+L0+uUlLywnoxJKDou51Zm+zTCjrCl0Nq6J9C5hP9vK/Q==} + engines: {node: '>=0.10.0'} + dev: false + + /postgres-interval@1.2.0: + resolution: {integrity: sha512-9ZhXKM/rw350N1ovuWHbGxnGh/SNJ4cnxHiM0rxE4VN41wsg8P8zWn9hv/buK00RP4WvlOyr/RBDiptyxVbkZQ==} + engines: {node: '>=0.10.0'} + dependencies: + xtend: 4.0.2 + dev: false + + /prelude-ls@1.2.1: + resolution: {integrity: sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==} + engines: {node: '>= 0.8.0'} + dev: true + + /prettier-linter-helpers@1.0.0: + resolution: {integrity: sha512-GbK2cP9nraSSUF9N2XwUwqfzlAFlMNYYl+ShE/V+H8a9uNl/oUqB1w2EL54Jh0OlyRSd8RfWYJ3coVS4TROP2w==} + engines: {node: '>=6.0.0'} + dependencies: + fast-diff: 1.3.0 + dev: true + + /prettier@2.8.8: + resolution: {integrity: sha512-tdN8qQGvNjw4CHbY+XXk0JgCXn9QiF21a55rBe5LJAU+kDyC4WQn4+awm2Xfk2lQMk5fKup9XgzTZtGkjBdP9Q==} + engines: {node: '>=10.13.0'} + hasBin: true + dev: true + + /pretty-format@27.5.1: + resolution: {integrity: sha512-Qb1gy5OrP5+zDf2Bvnzdl3jsTf1qXVMazbvCoKhtKqVs4/YK4ozX4gKQJJVyNe+cajNPn0KoC0MC3FUmaHWEmQ==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + dependencies: + ansi-regex: 5.0.1 + ansi-styles: 5.2.0 + react-is: 17.0.2 + + /prisma@3.15.2: + resolution: {integrity: sha512-nMNSMZvtwrvoEQ/mui8L/aiCLZRCj5t6L3yujKpcDhIPk7garp8tL4nMx2+oYsN0FWBacevJhazfXAbV1kfBzA==} + engines: {node: '>=12.6'} + hasBin: true + requiresBuild: true + dependencies: + '@prisma/engines': 3.15.1-1.461d6a05159055555eb7dfb337c9fb271cbd4d7e + + /process-nextick-args@2.0.1: + resolution: {integrity: sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==} + + /process-warning@1.0.0: + resolution: {integrity: sha512-du4wfLyj4yCZq1VupnVSZmRsPJsNuxoDQFdCFHLaYiEbFBD7QE0a+I4D7hOxrVnh78QE/YipFAj9lXHiXocV+Q==} + requiresBuild: true + dev: false + optional: true + + /promise-inflight@1.0.1: + resolution: {integrity: sha512-6zWPyEOFaQBJYcGMHBKTKJ3u6TBsnMFOIZSa6ce1e/ZrrsOlnHRHbabMjLiBYKp+n44X9eUI6VUPaukCXHuG4g==} + peerDependencies: + bluebird: '*' + peerDependenciesMeta: + bluebird: + optional: true + dev: false + + /promise-retry@2.0.1: + resolution: {integrity: sha512-y+WKFlBR8BGXnsNlIHFGPZmyDf3DFMoLhaflAnyZgV6rG6xu+JwesTo2Q9R6XwYmtmwAFCkAk3e35jEdoeh/3g==} + engines: {node: '>=10'} + dependencies: + err-code: 2.0.3 + retry: 0.12.0 + dev: false + + /promise@8.3.0: + resolution: {integrity: sha512-rZPNPKTOYVNEEKFaq1HqTgOwZD+4/YHS5ukLzQCypkj+OkYx7iv0mA91lJlpPPZ8vMau3IIGj5Qlwrx+8iiSmg==} + dependencies: + asap: 2.0.6 + dev: false + + /prompts@2.4.2: + resolution: {integrity: sha512-NxNv/kLguCA7p3jE8oL2aEBsrJWgAakBpgmgK6lpPWV+WuOmY6r2/zbAVnP+T8bQlA0nzHXSJSJW0Hq7ylaD2Q==} + engines: {node: '>= 6'} + dependencies: + kleur: 3.0.3 + sisteransi: 1.0.5 + dev: true + + /proxy-addr@2.0.7: + resolution: {integrity: sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==} + engines: {node: '>= 0.10'} + dependencies: + forwarded: 0.2.0 + ipaddr.js: 1.9.1 + + /pseudomap@1.0.2: + resolution: {integrity: sha512-b/YwNhb8lk1Zz2+bXXpS/LK9OisiZZ1SNsSLxN1x2OXVEhW2Ckr/7mWE5vrC1ZTiJlD9g19jWszTmJsB+oEpFQ==} + dev: false + + /psl@1.9.0: + resolution: {integrity: sha512-E/ZsdU4HLs/68gYzgGTkMicWTLPdAftJLfJFlLUAAKZGkStNU72sZjT66SnMDVOfOWY/YAoiD7Jxa9iHvngcag==} + dev: true + + /pump@3.0.0: + resolution: {integrity: sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==} + dependencies: + end-of-stream: 1.4.4 + once: 1.4.0 + + /punycode@2.3.0: + resolution: {integrity: sha512-rRV+zQD8tVFys26lAGR9WUuS4iUAngJScM+ZRSKtvl5tKeZ2t5bvdNFdNHBW9FWR4guGHlgmsZ1G7BSm2wTbuA==} + engines: {node: '>=6'} + + /qs@6.10.3: + resolution: {integrity: sha512-wr7M2E0OFRfIfJZjKGieI8lBKb7fRCH4Fv5KNPEs7gJ8jadvotdsS08PzOKR7opXhZ/Xkjtt3WF9g38drmyRqQ==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.11.0: + resolution: {integrity: sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /qs@6.11.2: + resolution: {integrity: sha512-tDNIz22aBzCDxLtVH++VnTfzxlfeK5CbqohpSqpJgj1Wg/cQbStNAz3NuqCs5vV+pjBsK4x4pN9HlVh7rcYRiA==} + engines: {node: '>=0.6'} + dependencies: + side-channel: 1.0.4 + + /query-string@7.1.3: + resolution: {integrity: sha512-hh2WYhq4fi8+b+/2Kg9CEge4fDPvHS534aOOvOZeQ3+Vf2mCFsaFBYj0i+iXcAq6I9Vzp5fjMFBlONvayDC1qg==} + engines: {node: '>=6'} + dependencies: + decode-uri-component: 0.2.2 + filter-obj: 1.1.0 + split-on-first: 1.1.0 + strict-uri-encode: 2.0.0 + dev: false + + /querystringify@2.2.0: + resolution: {integrity: sha512-FIqgj2EUvTa7R50u0rGsyTftzjYmv/a3hO345bZNrqabNqjtgiDMgmo4mkUjd+nzU5oF3dClKqFIPUKybUyqoQ==} + dev: true + + /queue-microtask@1.2.3: + resolution: {integrity: sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==} + dev: true + + /quick-format-unescaped@4.0.4: + resolution: {integrity: sha512-tYC1Q1hgyRuHgloV/YXs2w15unPVh8qfu/qCTfhTYamaw7fyhumKa2yGpdSo87vY32rIclj+4fWYQXUMs9EHvg==} + requiresBuild: true + dev: false + optional: true + + /random-bytes@1.0.0: + resolution: {integrity: sha512-iv7LhNVO047HzYR3InF6pUcUsPQiHTM1Qal51DcGSuZFBil1aBBWG5eHPNek7bvILMaYJ/8RU1e8w1AMdHmLQQ==} + engines: {node: '>= 0.8'} + dev: false + + /randombytes@2.1.0: + resolution: {integrity: sha512-vYl3iOX+4CKUWuxGi9Ukhie6fsqXqS9FE2Zaic4tNFD2N2QQaXOMFbuKK4QmDHC0JO6B1Zp41J0LpT0oR68amQ==} + dependencies: + safe-buffer: 5.2.1 + + /range-parser@1.2.1: + resolution: {integrity: sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==} + engines: {node: '>= 0.6'} + + /raw-body@2.5.1: + resolution: {integrity: sha512-qqJBtEyVgS0ZmPGdCFPWJ3FreoqvG4MVQln/kCgF7Olq95IbOp0/BWyMwbdtn4VTvkM8Y7khCQ2Xgk/tcrCXig==} + engines: {node: '>= 0.8'} + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + + /raw-body@2.5.2: + resolution: {integrity: sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==} + engines: {node: '>= 0.8'} + requiresBuild: true + dependencies: + bytes: 3.1.2 + http-errors: 2.0.0 + iconv-lite: 0.4.24 + unpipe: 1.0.0 + dev: false + optional: true + + /react-is@17.0.2: + resolution: {integrity: sha512-w2GsyukL62IJnlaff/nRegPQR94C/XXamvMWmSHRJ4y7Ts/4ocGRmTHvOs8PSE6pB3dWOrD/nueuU5sduBsQ4w==} + + /readable-stream@1.1.14: + resolution: {integrity: sha512-+MeVjFf4L44XUkhM1eYbD8fyEsxcV81pqMSR5gblfcLCHfZvbrqy4/qYHE+/R5HoBUT11WV5O08Cr1n3YXkWVQ==} + requiresBuild: true + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 0.0.1 + string_decoder: 0.10.31 + dev: false + optional: true + + /readable-stream@2.3.8: + resolution: {integrity: sha512-8p0AUk4XODgIewSi0l8Epjs+EVnWiK7NoDIEGU0HhE7+ZyY8D1IMY7odu5lRrFXGg71L15KG8QrPmum45RTtdA==} + dependencies: + core-util-is: 1.0.3 + inherits: 2.0.4 + isarray: 1.0.0 + process-nextick-args: 2.0.1 + safe-buffer: 5.1.2 + string_decoder: 1.1.1 + util-deprecate: 1.0.2 + + /readable-stream@3.6.2: + resolution: {integrity: sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==} + engines: {node: '>= 6'} + dependencies: + inherits: 2.0.4 + string_decoder: 1.3.0 + util-deprecate: 1.0.2 + + /readdirp@3.6.0: + resolution: {integrity: sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==} + engines: {node: '>=8.10.0'} + dependencies: + picomatch: 2.3.1 + + /rechoir@0.6.2: + resolution: {integrity: sha512-HFM8rkZ+i3zrV+4LQjwQ0W+ez98pApMGM3HUrN04j3CqzPOzl9nmP15Y8YXNm8QHGv/eacOVEjqhmWpkRV0NAw==} + engines: {node: '>= 0.10'} + dependencies: + resolve: 1.22.6 + + /reflect-metadata@0.1.13: + resolution: {integrity: sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg==} + + /regexp.prototype.flags@1.5.1: + resolution: {integrity: sha512-sy6TXMN+hnP/wMy+ISxg3krXx7BAtWVO4UouuCN/ziM9UEne0euamVNafDfvC83bRNr95y0V5iijeDQFUNpvrg==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + set-function-name: 2.0.1 + + /relative-microtime@2.0.0: + resolution: {integrity: sha512-l18ha6HEZc+No/uK4GyAnNxgKW7nvEe35IaeN54sShMojtqik2a6GbTyuiezkjpPaqP874Z3lW5ysBo5irz4NA==} + requiresBuild: true + dev: false + optional: true + + /require-directory@2.1.1: + resolution: {integrity: sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==} + engines: {node: '>=0.10.0'} + + /require-from-string@2.0.2: + resolution: {integrity: sha512-Xf0nWe6RseziFMu+Ap9biiUbmplq6S9/p+7w7YXP/JBHhrUDDUhwa+vANyubuqfZWTveU//DYVGsDG7RKL/vEw==} + engines: {node: '>=0.10.0'} + + /require-in-the-middle@7.2.0: + resolution: {integrity: sha512-3TLx5TGyAY6AOqLBoXmHkNql0HIf2RGbuMgCDT2WO/uGVAPJs6h7Kl+bN6TIZGd9bWhWPwnDnTHGtW8Iu77sdw==} + engines: {node: '>=8.6.0'} + requiresBuild: true + dependencies: + debug: 4.3.4 + module-details-from-path: 1.0.3 + resolve: 1.22.6 + transitivePeerDependencies: + - supports-color + dev: false + optional: true + + /requires-port@1.0.0: + resolution: {integrity: sha512-KigOCHcocU3XODJxsu8i/j8T9tzT4adHiecwORRQ0ZZFcp7ahwXuRU1m+yuO90C5ZUyGeGfocHDI14M3L3yDAQ==} + dev: true + + /resolve-cwd@3.0.0: + resolution: {integrity: sha512-OrZaX2Mb+rJCpH/6CpSqt9xFVpN++x01XnN2ie9g6P5/3xelLAkXWVADpdz1IHD/KFfEXyE6V0U01OQ3UO2rEg==} + engines: {node: '>=8'} + dependencies: + resolve-from: 5.0.0 + dev: true + + /resolve-from@4.0.0: + resolution: {integrity: sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==} + engines: {node: '>=4'} + + /resolve-from@5.0.0: + resolution: {integrity: sha512-qYg9KP24dD5qka9J47d0aVky0N+b4fTU89LN9iDnjB5waksiC49rvMB0PrUJQGoTmH50XPiqOvAjDfaijGxYZw==} + engines: {node: '>=8'} + dev: true + + /resolve.exports@1.1.1: + resolution: {integrity: sha512-/NtpHNDN7jWhAaQ9BvBUYZ6YTXsRBgfqWFWP7BZBaoMJO/I3G5OFzvTuWNlZC3aPjins1F+TNrLKsGbH4rfsRQ==} + engines: {node: '>=10'} + dev: true + + /resolve@1.22.6: + resolution: {integrity: sha512-njhxM7mV12JfufShqGy3Rz8j11RPdLy4xi15UurGJeoHLfJpVXKdh3ueuOqbYUcDZnffr6X739JBo5LzyahEsw==} + hasBin: true + dependencies: + is-core-module: 2.13.0 + path-parse: 1.0.7 + supports-preserve-symlinks-flag: 1.0.0 + + /restore-cursor@3.1.0: + resolution: {integrity: sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==} + engines: {node: '>=8'} + dependencies: + onetime: 5.1.2 + signal-exit: 3.0.7 + + /retry@0.12.0: + resolution: {integrity: sha512-9LkiTwjUh6rT555DtE9rTX+BKByPfrMzEAtnlEtdEwr3Nkffwiihqe2bWADg+OQRjt9gl6ICdmB/ZFDCGAtSow==} + engines: {node: '>= 4'} + dev: false + + /retry@0.13.1: + resolution: {integrity: sha512-XQBQ3I8W1Cge0Seh+6gjj03LbmRFWuoszgK9ooCpwYIrhhoO80pfq4cUkU5DkknwfOfFteRwlZ56PYOGYyFWdg==} + engines: {node: '>= 4'} + dev: false + + /reusify@1.0.4: + resolution: {integrity: sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==} + engines: {iojs: '>=1.0.0', node: '>=0.10.0'} + dev: true + + /rfdc@1.3.0: + resolution: {integrity: sha512-V2hovdzFbOi77/WajaSMXk2OLm+xNIeQdMMuB7icj7bk6zi2F8GGAxigcnDFpJHbNyNcgyJDiP+8nOrY5cZGrA==} + dev: false + + /rimraf@3.0.2: + resolution: {integrity: sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==} + hasBin: true + dependencies: + glob: 7.2.3 + + /routing-controllers-openapi@3.1.0(routing-controllers@0.9.0): + resolution: {integrity: sha512-FnTYnbNfsCN+vTDAc7rhCm5u0nLAH+p+UpbJXZT10cgo2t7xiZ23BrrzsR5nnqMGwe/iwsDUEEr8lxs6KarscQ==} + peerDependencies: + routing-controllers: ^0.9.0 + dependencies: + lodash.capitalize: 4.2.1 + lodash.merge: 4.6.2 + lodash.startcase: 4.4.0 + openapi3-ts: 2.0.2 + path-to-regexp: 2.4.0 + reflect-metadata: 0.1.13 + routing-controllers: 0.9.0(class-transformer@0.5.1)(class-validator@0.13.2) + tslib: 2.6.2 + dev: false + + /routing-controllers@0.9.0(class-transformer@0.5.1)(class-validator@0.13.2): + resolution: {integrity: sha512-OtARLKA6j8enNgGqi/hoRqBsTjVo2hbxc1+MeKi8mvelNn18+LXUdHpzY3z4GbCERBtaj8CwVjcsiQR+2w6ZFg==} + peerDependencies: + class-transformer: ^0.3.1 + class-validator: ^0.12.2 + dependencies: + class-transformer: 0.5.1 + class-validator: 0.13.2 + cookie: 0.4.2 + express-session: 1.17.3 + glob: 7.2.3 + reflect-metadata: 0.1.13 + template-url: 1.0.0 + optionalDependencies: + body-parser: 1.20.2 + express: 4.18.2 + koa: 2.14.2 + koa-bodyparser: 4.4.1 + koa-multer: 1.0.2 + koa-router: 7.4.0 + multer: 1.4.4 + transitivePeerDependencies: + - supports-color + dev: false + + /run-async@2.4.1: + resolution: {integrity: sha512-tvVnVv01b8c1RrA6Ep7JkStj85Guv/YrMcwqYQnwjsAS2cTmmPGBBjAjpCW7RrSodNSoE2/qg9O4bceNvUuDgQ==} + engines: {node: '>=0.12.0'} + + /run-parallel@1.2.0: + resolution: {integrity: sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==} + dependencies: + queue-microtask: 1.2.3 + dev: true + + /rxjs@6.6.7: + resolution: {integrity: sha512-hTdwr+7yYNIT5n4AMYp85KA6yw2Va0FLa3Rguvbpa4W3I5xynaBZo41cM3XM+4Q6fRMj3sBYIR1VAmZMXYJvRQ==} + engines: {npm: '>=2.0.0'} + dependencies: + tslib: 1.14.1 + + /rxjs@7.8.1: + resolution: {integrity: sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==} + dependencies: + tslib: 2.6.2 + + /safe-array-concat@1.0.1: + resolution: {integrity: sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q==} + engines: {node: '>=0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + has-symbols: 1.0.3 + isarray: 2.0.5 + + /safe-buffer@5.1.2: + resolution: {integrity: sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==} + + /safe-buffer@5.2.1: + resolution: {integrity: sha512-rp3So07KcdmmKbGvgaNxQSJr7bGVSVk5S9Eq1F+ppbRo70+YeaDxkw5Dd8NPN+GD6bjnYm2VuPuCXmpuYvmCXQ==} + + /safe-regex-test@1.0.0: + resolution: {integrity: sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-regex: 1.1.4 + + /safe-stable-stringify@2.4.3: + resolution: {integrity: sha512-e2bDA2WJT0wxseVd4lsDP4+3ONX6HpMXQa1ZhFQ7SU+GjvORCmShbCMltrtIDfkYhVHrOcPtj+KhmDBdPdZD1g==} + engines: {node: '>=10'} + dev: false + + /safer-buffer@2.1.2: + resolution: {integrity: sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==} + + /saxes@5.0.1: + resolution: {integrity: sha512-5LBh1Tls8c9xgGjw3QrMwETmTMVk0oFgvrFSvWx62llR2hcEInrKNZ2GZCCuuy2lvWrdl5jhbpeqc5hRYKFOcw==} + engines: {node: '>=10'} + dependencies: + xmlchars: 2.2.0 + dev: true + + /schema-utils@3.3.0: + resolution: {integrity: sha512-pN/yOAvcC+5rQ5nERGuwrjLlYvLTbCibnZ1I7B1LaiAz9BRBlE9GMgE/eqV30P7aJQUf7Ddimy/RsbYO/GrVGg==} + engines: {node: '>= 10.13.0'} + dependencies: + '@types/json-schema': 7.0.13 + ajv: 6.12.6 + ajv-keywords: 3.5.2(ajv@6.12.6) + + /secure-json-parse@2.7.0: + resolution: {integrity: sha512-6aU+Rwsezw7VR8/nyvKTx8QpWH9FrcYiXXlqC4z5d5XQBDRqtbfsRjnwGyqbi3gddNtWHuEk9OANUotL26qKUw==} + dev: false + + /semver@5.7.2: + resolution: {integrity: sha512-cBznnQ9KjJqU67B52RMC65CMarK2600WFnbkcaiwWq3xy/5haFJlshgnpjovMVJ+Hff49d8GEn0b87C5pDQ10g==} + hasBin: true + dev: false + + /semver@6.3.1: + resolution: {integrity: sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==} + hasBin: true + + /semver@7.5.4: + resolution: {integrity: sha512-1bCSESV6Pv+i21Hvpxp3Dx+pSD8lIPt8uVjRrxAUt/nbswYc+tK6Y2btiULjd4+fnq15PX+nqQDC7Oft7WkwcA==} + engines: {node: '>=10'} + hasBin: true + dependencies: + lru-cache: 6.0.0 + + /send@0.18.0: + resolution: {integrity: sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==} + engines: {node: '>= 0.8.0'} + dependencies: + debug: 2.6.9 + depd: 2.0.0 + destroy: 1.2.0 + encodeurl: 1.0.2 + escape-html: 1.0.3 + etag: 1.8.1 + fresh: 0.5.2 + http-errors: 2.0.0 + mime: 1.6.0 + ms: 2.1.3 + on-finished: 2.4.1 + range-parser: 1.2.1 + statuses: 2.0.1 + transitivePeerDependencies: + - supports-color + + /serialize-javascript@6.0.1: + resolution: {integrity: sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w==} + dependencies: + randombytes: 2.1.0 + + /serve-static@1.15.0: + resolution: {integrity: sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==} + engines: {node: '>= 0.8.0'} + dependencies: + encodeurl: 1.0.2 + escape-html: 1.0.3 + parseurl: 1.3.3 + send: 0.18.0 + transitivePeerDependencies: + - supports-color + + /set-blocking@2.0.0: + resolution: {integrity: sha512-KiKBS8AnWGEyLzofFfmvKwpdPzqiy16LvQfK3yv/fVH7Bj13/wl3JSR1J+rfgRE9q7xUJK4qvgS8raSOeLUehw==} + dev: false + + /set-function-name@2.0.1: + resolution: {integrity: sha512-tMNCiqYVkXIZgc2Hnoy2IvC/f8ezc5koaRFkCjrpWzGpCd3qbZXPzVy9MAZzK1ch/X0jvSkojys3oqJN0qCmdA==} + engines: {node: '>= 0.4'} + dependencies: + define-data-property: 1.1.0 + functions-have-names: 1.2.3 + has-property-descriptors: 1.0.0 + + /setprototypeof@1.2.0: + resolution: {integrity: sha512-E5LDX7Wrp85Kil5bhZv46j8jOeboKq5JMmYM3gVGdGH8xFpPWXUMsNrlODCrkoxMEeNi/XZIwuRvY4XNwYMJpw==} + + /shallow-clone-shim@2.0.0: + resolution: {integrity: sha512-YRNymdiL3KGOoS67d73TEmk4tdPTO9GSMCoiphQsTcC9EtC+AOmMPjkyBkRoCJfW9ASsaZw1craaiw1dPN2D3Q==} + requiresBuild: true + dev: false + optional: true + + /shebang-command@2.0.0: + resolution: {integrity: sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==} + engines: {node: '>=8'} + dependencies: + shebang-regex: 3.0.0 + + /shebang-regex@3.0.0: + resolution: {integrity: sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==} + engines: {node: '>=8'} + + /shelljs@0.8.5: + resolution: {integrity: sha512-TiwcRcrkhHvbrZbnRcFYMLl30Dfov3HKqzp5tO5b4pt6G/SezKcYhmDg15zXVBswHmctSAQKznqNW2LO5tTDow==} + engines: {node: '>=4'} + hasBin: true + dependencies: + glob: 7.2.3 + interpret: 1.4.0 + rechoir: 0.6.2 + + /shiki@0.10.1: + resolution: {integrity: sha512-VsY7QJVzU51j5o1+DguUd+6vmCmZ5v/6gYu4vyYAhzjuNQU6P/vmSy4uQaOhvje031qQMiW0d2BwgMH52vqMng==} + dependencies: + jsonc-parser: 3.2.0 + vscode-oniguruma: 1.7.0 + vscode-textmate: 5.2.0 + dev: true + + /side-channel@1.0.4: + resolution: {integrity: sha512-q5XPytqFEIKHkGdiMIrY10mvLRvnQh42/+GoBlFW3b2LXLE2xxJpZFdm94we0BaoV3RwJyGqg5wS7epxTv0Zvw==} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + object-inspect: 1.12.3 + + /signal-exit@3.0.7: + resolution: {integrity: sha512-wnD2ZE+l+SPC/uoS0vXeE9L1+0wuaMqKlfz9AMUo38JsyLSBWSFcHR1Rri62LZc12vLr1gb3jl7iwQhgwpAbGQ==} + + /simple-oauth2@5.0.0: + resolution: {integrity: sha512-8291lo/z5ZdpmiOFzOs1kF3cxn22bMj5FFH+DNUppLJrpoIlM1QnFiE7KpshHu3J3i21TVcx4yW+gXYjdCKDLQ==} + dependencies: + '@hapi/hoek': 10.0.1 + '@hapi/wreck': 18.0.1 + debug: 4.3.4 + joi: 17.11.0 + transitivePeerDependencies: + - supports-color + dev: false + + /simple-swizzle@0.2.2: + resolution: {integrity: sha512-JA//kQgZtbuY83m+xT+tXJkmJncGMTFT+C+g2h2R9uxkYIrE2yy9sgmcLhCnw57/WSD+Eh3J97FPEDFnbXnDUg==} + dependencies: + is-arrayish: 0.3.2 + dev: false + + /sisteransi@1.0.5: + resolution: {integrity: sha512-bLGGlR1QxBcynn2d5YmDX4MGjlZvy2MRBDRNHLJ8VI6l6+9FUiyTFNJ0IveOSP0bcXgVDPRcfGqA0pjaqUpfVg==} + dev: true + + /slash@3.0.0: + resolution: {integrity: sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==} + engines: {node: '>=8'} + dev: true + + /smart-buffer@4.2.0: + resolution: {integrity: sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==} + engines: {node: '>= 6.0.0', npm: '>= 3.0.0'} + dev: false + + /socks-proxy-agent@6.2.1: + resolution: {integrity: sha512-a6KW9G+6B3nWZ1yB8G7pJwL3ggLy1uTzKAgCb7ttblwqdz9fMGJUuTy3uFzEP48FAs9FLILlmzDlE2JJhVQaXQ==} + engines: {node: '>= 10'} + dependencies: + agent-base: 6.0.2 + debug: 4.3.4 + socks: 2.7.1 + transitivePeerDependencies: + - supports-color + dev: false + + /socks@2.7.1: + resolution: {integrity: sha512-7maUZy1N7uo6+WVEX6psASxtNlKaNVMlGQKkG/63nEDdLOWNbiUMoLK7X4uYoLhQstau72mLgfEWcXcwsaHbYQ==} + engines: {node: '>= 10.13.0', npm: '>= 3.0.0'} + dependencies: + ip: 2.0.0 + smart-buffer: 4.2.0 + dev: false + + /sonic-boom@1.4.1: + resolution: {integrity: sha512-LRHh/A8tpW7ru89lrlkU4AszXt1dbwSjVWguGrmlxE7tawVmDBlI1PILMkXAxJTwqhgsEeTHzj36D5CmHgQmNg==} + requiresBuild: true + dependencies: + atomic-sleep: 1.0.0 + flatstr: 1.0.12 + dev: false + optional: true + + /source-map-support@0.5.21: + resolution: {integrity: sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==} + dependencies: + buffer-from: 1.1.2 + source-map: 0.6.1 + + /source-map@0.6.1: + resolution: {integrity: sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==} + engines: {node: '>=0.10.0'} + + /source-map@0.7.3: + resolution: {integrity: sha512-CkCj6giN3S+n9qrYiBTX5gystlENnRW5jZeNLHpe6aue+SrHcG5VYwujhW9s4dY31mEGsxBDrHR6oI69fTXsaQ==} + engines: {node: '>= 8'} + + /source-map@0.7.4: + resolution: {integrity: sha512-l3BikUxvPOcn5E74dZiq5BGsTb5yEwhaTSzccU6t4sDOH8NWJCstKO5QT2CvtFoK6F0saL7p9xHAqHOlCPJygA==} + engines: {node: '>= 8'} + dev: true + + /source-map@0.8.0-beta.0: + resolution: {integrity: sha512-2ymg6oRBpebeZi9UUNsgQ89bhx01TcTkmNTGnNO88imTmbSgy4nfujrgVEFKWpMTEGA11EDkTt7mqObTPdigIA==} + engines: {node: '>= 8'} + requiresBuild: true + dependencies: + whatwg-url: 7.1.0 + dev: false + optional: true + + /sourcemap-codec@1.4.8: + resolution: {integrity: sha512-9NykojV5Uih4lgo5So5dtw+f0JgJX30KCNI8gwhz2J9A15wD0Ml6tjHKwf6fTSa6fAdVBdZeNOs9eJ71qCk8vA==} + deprecated: Please use @jridgewell/sourcemap-codec instead + + /split-on-first@1.1.0: + resolution: {integrity: sha512-43ZssAJaMusuKWL8sKUBQXHWOpq8d6CfN/u1p4gUzfJkM05C8rxTmYrkIPTXapZpORA6LkkzcUulJ8FqA7Uudw==} + engines: {node: '>=6'} + dev: false + + /split2@4.2.0: + resolution: {integrity: sha512-UcjcJOWknrNkF6PLX83qcHM6KHgVKNkV62Y8a5uYDVv9ydGQVwAHMKqHdJje1VTWpljG0WYpCDhrCdAOYH4TWg==} + engines: {node: '>= 10.x'} + dev: false + + /sprintf-js@1.0.3: + resolution: {integrity: sha512-D9cPgkvLlV3t3IzL0D0YLvGA9Ahk4PcvVwUbN0dSGr1aP0Nrt4AEnTUbuGvquEC0mA64Gqt1fzirlRs5ibXx8g==} + dev: true + + /sql-summary@1.0.1: + resolution: {integrity: sha512-IpCr2tpnNkP3Jera4ncexsZUp0enJBLr+pHCyTweMUBrbJsTgQeLWx1FXLhoBj/MvcnUQpkgOn2EY8FKOkUzww==} + requiresBuild: true + dev: false + optional: true + + /ssri@8.0.1: + resolution: {integrity: sha512-97qShzy1AiyxvPNIkLWoGua7xoQzzPjQ0HAH4B0rWKo7SZ6USuPcrUiAFrws0UH8RrbWmgq3LMTObhPIHbbBeQ==} + engines: {node: '>= 8'} + dependencies: + minipass: 3.3.6 + dev: false + + /stack-trace@0.0.10: + resolution: {integrity: sha512-KGzahc7puUKkzyMt+IqAep+TVNbKP+k2Lmwhub39m1AsTSkaDutx56aDCo+HLDzf/D26BIHTJWNiTG1KAJiQCg==} + dev: false + + /stack-utils@2.0.6: + resolution: {integrity: sha512-XlkWvfIm6RmsWtNJx+uqtKLS8eqFbxUg0ZzLXqY0caEy9l7hruX8IpiDnjsLavoBgqCCR71TqWO8MaXYheJ3RQ==} + engines: {node: '>=10'} + dependencies: + escape-string-regexp: 2.0.0 + dev: true + + /stackframe@1.3.4: + resolution: {integrity: sha512-oeVtt7eWQS+Na6F//S4kJ2K2VbRlS9D43mAlMyVpVWovy9o+jfgH8O9agzANzaiLjclA0oYzUXEM4PurhSUChw==} + requiresBuild: true + dev: false + optional: true + + /statuses@1.5.0: + resolution: {integrity: sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==} + engines: {node: '>= 0.6'} + requiresBuild: true + dev: false + optional: true + + /statuses@2.0.1: + resolution: {integrity: sha512-RwNA9Z/7PrK06rYLIzFMlaF+l73iwpzsqRIFgbMLbTcLD6cOao82TaWefPXQvB2fOC4AjuYSEndS7N/mTCbkdQ==} + engines: {node: '>= 0.8'} + + /stream-chopper@3.0.1: + resolution: {integrity: sha512-f7h+ly8baAE26iIjcp3VbnBkbIRGtrvV0X0xxFM/d7fwLTYnLzDPTXRKNxa2HZzohOrc96NTrR+FaV3mzOelNA==} + requiresBuild: true + dependencies: + readable-stream: 3.6.2 + dev: false + optional: true + + /streamsearch@0.1.2: + resolution: {integrity: sha512-jos8u++JKm0ARcSUTAZXOVC0mSox7Bhn6sBgty73P1f3JGf7yG2clTbBNHUdde/kdvP2FESam+vM6l8jBrNxHA==} + engines: {node: '>=0.8.0'} + requiresBuild: true + dev: false + optional: true + + /streamsearch@1.1.0: + resolution: {integrity: sha512-Mcc5wHehp9aXz1ax6bZUyY5afg9u2rv5cqQI3mRrYkGC8rW2hM02jWuwjtL++LS5qinSyhj2QfLyNsuc+VsExg==} + engines: {node: '>=10.0.0'} + + /strict-uri-encode@2.0.0: + resolution: {integrity: sha512-QwiXZgpRcKkhTj2Scnn++4PKtWsH0kpzZ62L2R6c/LUVYv7hVnZqcg2+sMuT6R7Jusu1vviK/MFsu6kNJfWlEQ==} + engines: {node: '>=4'} + dev: false + + /string-length@4.0.2: + resolution: {integrity: sha512-+l6rNN5fYHNhZZy41RXsYptCjA2Igmq4EG7kZAYFQI1E1VTXarr6ZPXBg6eq7Y6eK4FEhY6AJlyuFIb/v/S0VQ==} + engines: {node: '>=10'} + dependencies: + char-regex: 1.0.2 + strip-ansi: 6.0.1 + dev: true + + /string-similarity@4.0.4: + resolution: {integrity: sha512-/q/8Q4Bl4ZKAPjj8WerIBJWALKkaPRfrvhfF8k/B23i4nzrlRj2/go1m90In7nG/3XDSbOo0+pu6RvCTM9RGMQ==} + deprecated: Package no longer supported. Contact Support at https://www.npmjs.com/support for more info. + dev: false + + /string-width@4.2.3: + resolution: {integrity: sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==} + engines: {node: '>=8'} + dependencies: + emoji-regex: 8.0.0 + is-fullwidth-code-point: 3.0.0 + strip-ansi: 6.0.1 + + /string.prototype.trim@1.2.8: + resolution: {integrity: sha512-lfjY4HcixfQXOfaqCvcBuOIapyaroTXhbkfJN3gcB1OtyupngWK4sEET9Knd0cXd28kTUqu/kHoV4HKSJdnjiQ==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + + /string.prototype.trimend@1.0.7: + resolution: {integrity: sha512-Ni79DqeB72ZFq1uH/L6zJ+DKZTkOtPIHovb3YZHQViE+HDouuU4mBrLOLDn5Dde3RF8qw5qVETEjhu9locMLvA==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + + /string.prototype.trimstart@1.0.7: + resolution: {integrity: sha512-NGhtDFu3jCEm7B4Fy0DpLewdJQOZcQ0rGbwQ/+stjnrp2i+rlKeCvos9hOIeCmqwratM47OBxY7uFZzjxHXmrg==} + dependencies: + call-bind: 1.0.2 + define-properties: 1.2.1 + es-abstract: 1.22.2 + + /string_decoder@0.10.31: + resolution: {integrity: sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==} + requiresBuild: true + dev: false + optional: true + + /string_decoder@1.1.1: + resolution: {integrity: sha512-n/ShnvDi6FHbbVfviro+WojiFzv+s8MPMHBczVePfUpDJLwoLT0ht1l4YwBCbi8pJAveEEdnkHyPyTP/mzRfwg==} + dependencies: + safe-buffer: 5.1.2 + + /string_decoder@1.3.0: + resolution: {integrity: sha512-hkRX8U1WjJFd8LsDJ2yQ/wWWxaopEsABU1XfkM8A+j0+85JAGppt16cr1Whg6KIbb4okU6Mql6BOj+uup/wKeA==} + dependencies: + safe-buffer: 5.2.1 + + /strip-ansi@6.0.1: + resolution: {integrity: sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==} + engines: {node: '>=8'} + dependencies: + ansi-regex: 5.0.1 + + /strip-bom@3.0.0: + resolution: {integrity: sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==} + engines: {node: '>=4'} + + /strip-bom@4.0.0: + resolution: {integrity: sha512-3xurFv5tEgii33Zi8Jtp55wEIILR9eh34FAW00PZf+JnSsTmV/ioewSgQl97JHvgjoRGwPShsWm+IdrxB35d0w==} + engines: {node: '>=8'} + dev: true + + /strip-final-newline@2.0.0: + resolution: {integrity: sha512-BrpvfNAE3dcvq7ll3xVumzjKjZQ5tI1sEUIKr3Uoks0XUl45St3FlatVqef9prk4jRDzhW6WZg+3bk93y6pLjA==} + engines: {node: '>=6'} + + /strip-json-comments@3.1.1: + resolution: {integrity: sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==} + engines: {node: '>=8'} + dev: true + + /superagent@8.1.2: + resolution: {integrity: sha512-6WTxW1EB6yCxV5VFOIPQruWGHqc3yI7hEmZK6h+pyk69Lk/Ut7rLUY6W/ONF2MjBuGjvmMiIpsrVJ2vjrHlslA==} + engines: {node: '>=6.4.0 <13 || >=14'} + dependencies: + component-emitter: 1.3.0 + cookiejar: 2.1.4 + debug: 4.3.4 + fast-safe-stringify: 2.1.1 + form-data: 4.0.0 + formidable: 2.1.2 + methods: 1.1.2 + mime: 2.6.0 + qs: 6.11.2 + semver: 7.5.4 + transitivePeerDependencies: + - supports-color + dev: true + + /supertest@6.3.3: + resolution: {integrity: sha512-EMCG6G8gDu5qEqRQ3JjjPs6+FYT1a7Hv5ApHvtSghmOFJYtsU5S+pSb6Y2EUeCEY3CmEL3mmQ8YWlPOzQomabA==} + engines: {node: '>=6.4.0'} + dependencies: + methods: 1.1.2 + superagent: 8.1.2 + transitivePeerDependencies: + - supports-color + dev: true + + /supports-color@5.5.0: + resolution: {integrity: sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==} + engines: {node: '>=4'} + dependencies: + has-flag: 3.0.0 + + /supports-color@7.2.0: + resolution: {integrity: sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + + /supports-color@8.1.1: + resolution: {integrity: sha512-MpUEN2OodtUzxvKQl72cUF7RQ5EiHsGvSsVG0ia9c5RbWGL2CI4C7EpPS8UTBIplnlzZiNuV56w+FuNxy3ty2Q==} + engines: {node: '>=10'} + dependencies: + has-flag: 4.0.0 + + /supports-hyperlinks@2.3.0: + resolution: {integrity: sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==} + engines: {node: '>=8'} + dependencies: + has-flag: 4.0.0 + supports-color: 7.2.0 + dev: true + + /supports-preserve-symlinks-flag@1.0.0: + resolution: {integrity: sha512-ot0WnXS9fgdkgIcePe6RHNk1WA8+muPa6cSjeR3V8K27q9BB1rTE3R1p7Hv0z1ZyAc8s6Vvv8DIyWf681MAt0w==} + engines: {node: '>= 0.4'} + + /swagger-ui-dist@5.9.0: + resolution: {integrity: sha512-NUHSYoe5XRTk/Are8jPJ6phzBh3l9l33nEyXosM17QInoV95/jng8+PuSGtbD407QoPf93MH3Bkh773OgesJpA==} + + /swagger-ui-express@4.6.3(express@4.18.2): + resolution: {integrity: sha512-CDje4PndhTD2HkgyKH3pab+LKspDeB/NhPN2OF1j+piYIamQqBYwAXWESOT1Yju2xFg51bRW9sUng2WxDjzArw==} + engines: {node: '>= v0.10.32'} + peerDependencies: + express: '>=4.0.0 || >=5.0.0-beta' + dependencies: + express: 4.18.2 + swagger-ui-dist: 5.9.0 + + /symbol-observable@4.0.0: + resolution: {integrity: sha512-b19dMThMV4HVFynSAM1++gBHAbk2Tc/osgLIBZMKsyqh34jb2e8Os7T6ZW/Bt3pJFdBTd2JwAnAAEQV7rSNvcQ==} + engines: {node: '>=0.10'} + + /symbol-tree@3.2.4: + resolution: {integrity: sha512-9QNk5KwDF+Bvz+PyObkmSYjI5ksVUYtjW7AU22r2NKcfLJcXp96hkDWU3+XndOsUb+AQ9QhfzfCT2O+CNWT5Tw==} + dev: true + + /tapable@2.2.1: + resolution: {integrity: sha512-GNzQvQTOIP6RyTfE2Qxb8ZVlNmw0n88vp1szwWRimP02mnTsx3Wtn5qRdqY9w2XduFNUgvOwhNnQsjwCp+kqaQ==} + engines: {node: '>=6'} + + /tar@6.2.0: + resolution: {integrity: sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==} + engines: {node: '>=10'} + dependencies: + chownr: 2.0.0 + fs-minipass: 2.1.0 + minipass: 5.0.0 + minizlib: 2.1.2 + mkdirp: 1.0.4 + yallist: 4.0.0 + dev: false + + /template-url@1.0.0: + resolution: {integrity: sha512-QUjZNE7yTdIzB91sITTSYcSX5GRF5FulKvIYCqV5350NfSNfiuuCYQIJZ5PIN7k/uJ+kpurEEv9hFqRRc+JilA==} + dev: false + + /terminal-link@2.1.1: + resolution: {integrity: sha512-un0FmiRUQNr5PJqy9kP7c40F5BOfpGlYTrxonDChEZB7pzZxRNp/bt+ymiy9/npwXya9KH99nJ/GXFIiUkYGFQ==} + engines: {node: '>=8'} + dependencies: + ansi-escapes: 4.3.2 + supports-hyperlinks: 2.3.0 + dev: true + + /terser-webpack-plugin@5.3.9(webpack@5.73.0): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.21.0 + webpack: 5.73.0 + + /terser-webpack-plugin@5.3.9(webpack@5.88.2): + resolution: {integrity: sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA==} + engines: {node: '>= 10.13.0'} + peerDependencies: + '@swc/core': '*' + esbuild: '*' + uglify-js: '*' + webpack: ^5.1.0 + peerDependenciesMeta: + '@swc/core': + optional: true + esbuild: + optional: true + uglify-js: + optional: true + dependencies: + '@jridgewell/trace-mapping': 0.3.19 + jest-worker: 27.5.1 + schema-utils: 3.3.0 + serialize-javascript: 6.0.1 + terser: 5.21.0 + webpack: 5.88.2 + dev: true + + /terser@5.21.0: + resolution: {integrity: sha512-WtnFKrxu9kaoXuiZFSGrcAvvBqAdmKx0SFNmVNYdJamMu9yyN3I/QF0FbH4QcqJQ+y1CJnzxGIKH0cSj+FGYRw==} + engines: {node: '>=10'} + hasBin: true + dependencies: + '@jridgewell/source-map': 0.3.5 + acorn: 8.10.0 + commander: 2.20.3 + source-map-support: 0.5.21 + + /test-exclude@6.0.0: + resolution: {integrity: sha512-cAGWPIyOHU6zlmg88jwm7VRyXnMN7iV68OGAbYDk/Mh/xC/pzVPlQtY6ngoIH/5/tciuhGfvESU8GrHrcxD56w==} + engines: {node: '>=8'} + dependencies: + '@istanbuljs/schema': 0.1.3 + glob: 7.2.3 + minimatch: 3.1.2 + dev: true + + /text-hex@1.0.0: + resolution: {integrity: sha512-uuVGNWzgJ4yhRaNSiubPY7OjISw4sw4E5Uv0wbjp+OzcbmVU/rsT8ujgcXJhn9ypzsgr5vlzpPqP+MBBKcGvbg==} + dev: false + + /text-table@0.2.0: + resolution: {integrity: sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==} + dev: true + + /throat@6.0.2: + resolution: {integrity: sha512-WKexMoJj3vEuK0yFEapj8y64V0A6xcuPuK9Gt1d0R+dzCSJc0lHqQytAbSB4cDAK0dWh4T0E2ETkoLE2WZ41OQ==} + dev: true + + /through@2.3.8: + resolution: {integrity: sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==} + + /tmp@0.0.33: + resolution: {integrity: sha512-jRCJlojKnZ3addtTOjdIqoRuPEKBvNXcGYqzO6zWZX8KfKEpnGY5jfggJQ3EjKuu8D4bJRr0y+cYJFmYbImXGw==} + engines: {node: '>=0.6.0'} + dependencies: + os-tmpdir: 1.0.2 + + /tmpl@1.0.5: + resolution: {integrity: sha512-3f0uOEAQwIqGuWW2MVzYg8fV/QNnc/IpuJNG837rLuczAaLVHslWHZQj4IGiEl5Hs3kkbhwL9Ab7Hrsmuj+Smw==} + dev: true + + /to-fast-properties@2.0.0: + resolution: {integrity: sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==} + engines: {node: '>=4'} + dev: true + + /to-regex-range@5.0.1: + resolution: {integrity: sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==} + engines: {node: '>=8.0'} + dependencies: + is-number: 7.0.0 + + /to-source-code@1.0.2: + resolution: {integrity: sha512-YzWtjmNIf3E75eZYa7m1SCyl0vgOGoTzdpH3svfa8SUm5rqTgl9hnDolrAGOghCF9P2gsITXQoMrlujOoz+RPw==} + requiresBuild: true + dependencies: + is-nil: 1.0.1 + dev: false + optional: true + + /toidentifier@1.0.1: + resolution: {integrity: sha512-o5sSPKEkg/DIQNmH43V0/uerLrpzVedkUh8tGNvaeXpfpuwjKenlSox/2O/BTlZUtEe+JG7s5YhEz608PlAHRA==} + engines: {node: '>=0.6'} + + /tough-cookie@4.1.3: + resolution: {integrity: sha512-aX/y5pVRkfRnfmuX+OdbSdXvPe6ieKX/G2s7e98f4poJHnqH3281gDPm/metm6E/WRamfx7WC4HUqkWHfQHprw==} + engines: {node: '>=6'} + dependencies: + psl: 1.9.0 + punycode: 2.3.0 + universalify: 0.2.0 + url-parse: 1.5.10 + dev: true + + /tr46@0.0.3: + resolution: {integrity: sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==} + + /tr46@1.0.1: + resolution: {integrity: sha512-dTpowEjclQ7Kgx5SdBkqRzVhERQXov8/l9Ft9dVM9fmg0W0KQSVaXX9T4i6twCPNtYiZM53lpSSUAwJbFPOHxA==} + requiresBuild: true + dependencies: + punycode: 2.3.0 + dev: false + optional: true + + /tr46@2.1.0: + resolution: {integrity: sha512-15Ih7phfcdP5YxqiB+iDtLoaTz4Nd35+IiAv0kQ5FNKHzXgdWqPoTIqEDDJmXceQt4JZk6lVPT8lnDlPpGDppw==} + engines: {node: '>=8'} + dependencies: + punycode: 2.3.0 + dev: true + + /tree-kill@1.2.2: + resolution: {integrity: sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==} + hasBin: true + + /triple-beam@1.4.1: + resolution: {integrity: sha512-aZbgViZrg1QNcG+LULa7nhZpJTZSLm/mXnHXnbAbjmN5aSa0y7V+wvv6+4WaBtpISJzThKy+PIPxc1Nq1EJ9mg==} + engines: {node: '>= 14.0.0'} + dev: false + + /ts-jest@27.1.5(@babel/core@7.23.0)(@types/jest@27.0.2)(jest@27.5.1)(typescript@4.9.5): + resolution: {integrity: sha512-Xv6jBQPoBEvBq/5i2TeSG9tt/nqkbpcurrEG1b+2yfBrcJelOZF9Ml6dmyMh7bcW9JyFbRYpR5rxROSlBLTZHA==} + engines: {node: ^10.13.0 || ^12.13.0 || ^14.15.0 || >=15.0.0} + hasBin: true + peerDependencies: + '@babel/core': '>=7.0.0-beta.0 <8' + '@types/jest': ^27.0.0 + babel-jest: '>=27.0.0 <28' + esbuild: '*' + jest: ^27.0.0 + typescript: '>=3.8 <5.0' + peerDependenciesMeta: + '@babel/core': + optional: true + '@types/jest': + optional: true + babel-jest: + optional: true + esbuild: + optional: true + dependencies: + '@babel/core': 7.23.0 + '@types/jest': 27.0.2 + bs-logger: 0.2.6 + fast-json-stable-stringify: 2.1.0 + jest: 27.5.1(ts-node@10.9.1) + jest-util: 27.5.1 + json5: 2.2.3 + lodash.memoize: 4.1.2 + make-error: 1.3.6 + semver: 7.5.4 + typescript: 4.9.5 + yargs-parser: 20.2.9 + dev: true + + /ts-loader@9.4.4(typescript@4.9.5)(webpack@5.88.2): + resolution: {integrity: sha512-MLukxDHBl8OJ5Dk3y69IsKVFRA/6MwzEqBgh+OXMPB/OD01KQuWPFd1WAQP8a5PeSCAxfnkhiuWqfmFJzJQt9w==} + engines: {node: '>=12.0.0'} + peerDependencies: + typescript: '*' + webpack: ^5.0.0 + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + micromatch: 4.0.5 + semver: 7.5.4 + typescript: 4.9.5 + webpack: 5.88.2 + dev: true + + /ts-node@10.9.1(@types/node@16.18.57)(typescript@4.9.5): + resolution: {integrity: sha512-NtVysVPkxxrwFGUUxGYhfux8k78pQB3JqYBXlLRZgdGUqTO5wU/UyHop5p70iEbGhB7q5KmiZiU0Y3KlJrScEw==} + hasBin: true + peerDependencies: + '@swc/core': '>=1.2.50' + '@swc/wasm': '>=1.2.50' + '@types/node': '*' + typescript: '>=2.7' + peerDependenciesMeta: + '@swc/core': + optional: true + '@swc/wasm': + optional: true + dependencies: + '@cspotcode/source-map-support': 0.8.1 + '@tsconfig/node10': 1.0.9 + '@tsconfig/node12': 1.0.11 + '@tsconfig/node14': 1.0.3 + '@tsconfig/node16': 1.0.4 + '@types/node': 16.18.57 + acorn: 8.10.0 + acorn-walk: 8.2.0 + arg: 4.1.3 + create-require: 1.1.1 + diff: 4.0.2 + make-error: 1.3.6 + typescript: 4.9.5 + v8-compile-cache-lib: 3.0.1 + yn: 3.1.1 + dev: true + + /tsconfig-paths-webpack-plugin@3.5.2: + resolution: {integrity: sha512-EhnfjHbzm5IYI9YPNVIxx1moxMI4bpHD2e0zTXeDNQcwjjRaGepP7IhTHJkyDBG0CAOoxRfe7jCG630Ou+C6Pw==} + dependencies: + chalk: 4.1.2 + enhanced-resolve: 5.15.0 + tsconfig-paths: 3.14.2 + + /tsconfig-paths@3.14.1: + resolution: {integrity: sha512-fxDhWnFSLt3VuTwtvJt5fpwxBHg5AdKWMsgcPOOIilyjymcYVZoCQF8fvFRezCNfblEXmi+PcM1eYHeOAgXCOQ==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + /tsconfig-paths@3.14.2: + resolution: {integrity: sha512-o/9iXgCYc5L/JxCHPe3Hvh8Q/2xm5Z+p18PESBU6Ff33695QnCHBEjcytY2q19ua7Mbl/DavtBOLq+oG0RCL+g==} + dependencies: + '@types/json5': 0.0.29 + json5: 1.0.2 + minimist: 1.2.8 + strip-bom: 3.0.0 + + /tslib@1.14.1: + resolution: {integrity: sha512-Xni35NKzjgMrwevysHTCArtLDpPvye8zV/0E4EyYn43P7/7qvQwPh9BGkHewbMulVntbigmcT7rdX3BNo9wRJg==} + + /tslib@2.4.0: + resolution: {integrity: sha512-d6xOpEDfsi2CZVlPQzGeux8XMwLT9hssAsaPYExaQMuYskwb+x1x7J371tWlbBdWHroy99KnVB6qIkUbs5X3UQ==} + + /tslib@2.6.2: + resolution: {integrity: sha512-AEYxH93jGFPn/a2iVAwW87VuUIkR1FVUKB77NwMF7nBTDkDrrT/Hpt/IrCJ0QXhW27jTBDcf5ZY7w6RiqTMw2Q==} + + /tslog@3.3.4: + resolution: {integrity: sha512-N0HHuHE0e/o75ALfkioFObknHR5dVchUad4F0XyFf3gXJYB++DewEzwGI/uIOM216E5a43ovnRNEeQIq9qgm4Q==} + engines: {node: '>=10'} + dependencies: + source-map-support: 0.5.21 + dev: false + + /tsscmp@1.0.6: + resolution: {integrity: sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==} + engines: {node: '>=0.6.x'} + requiresBuild: true + dev: false + optional: true + + /tsutils@3.21.0(typescript@4.9.5): + resolution: {integrity: sha512-mHKK3iUXL+3UF6xL5k0PEhKRUBKPBCv/+RkEOpjRWxxx27KKRBmmA60A9pgOUvMi8GKhRMPEmjBRPzs2W7O1OA==} + engines: {node: '>= 6'} + peerDependencies: + typescript: '>=2.8.0 || >= 3.2.0-dev || >= 3.3.0-dev || >= 3.4.0-dev || >= 3.5.0-dev || >= 3.6.0-dev || >= 3.6.0-beta || >= 3.7.0-dev || >= 3.7.0-beta' + dependencies: + tslib: 1.14.1 + typescript: 4.9.5 + dev: true + + /tsyringe@4.8.0: + resolution: {integrity: sha512-YB1FG+axdxADa3ncEtRnQCFq/M0lALGLxSZeVNbTU8NqhOVc51nnv2CISTcvc1kyv6EGPtXVr0v6lWeDxiijOA==} + engines: {node: '>= 6.0.0'} + dependencies: + tslib: 1.14.1 + dev: false + + /tweetnacl@1.0.3: + resolution: {integrity: sha512-6rt+RN7aOi1nGMyC4Xa5DdYiukl2UWCbcJft7YhxReBGQD7OAM8Pbxw6YMo4r2diNEA8FEmu32YOn9rhaiE5yw==} + + /type-check@0.4.0: + resolution: {integrity: sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==} + engines: {node: '>= 0.8.0'} + dependencies: + prelude-ls: 1.2.1 + dev: true + + /type-detect@4.0.8: + resolution: {integrity: sha512-0fr/mIH1dlO+x7TlcMy+bIDqKPsw/70tVyeHW787goQjhmqaZe10uwLujubK9q9Lg6Fiho1KUKDYz0Z7k7g5/g==} + engines: {node: '>=4'} + dev: true + + /type-fest@0.20.2: + resolution: {integrity: sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==} + engines: {node: '>=10'} + dev: true + + /type-fest@0.21.3: + resolution: {integrity: sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w==} + engines: {node: '>=10'} + + /type-is@1.6.18: + resolution: {integrity: sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==} + engines: {node: '>= 0.6'} + dependencies: + media-typer: 0.3.0 + mime-types: 2.1.35 + + /typed-array-buffer@1.0.0: + resolution: {integrity: sha512-Y8KTSIglk9OZEr8zywiIHG/kmQ7KWyjseXs1CbSo8vC42w7hg2HgYTxSWwP0+is7bWDc1H+Fo026CpHFwm8tkw==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + get-intrinsic: 1.2.1 + is-typed-array: 1.1.12 + + /typed-array-byte-length@1.0.0: + resolution: {integrity: sha512-Or/+kvLxNpeQ9DtSydonMxCx+9ZXOswtwJn17SNLvhptaXYDJvkFFP5zbfU/uLmvnBJlI4yrnXRxpdWH/M5tNA==} + engines: {node: '>= 0.4'} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-byte-offset@1.0.0: + resolution: {integrity: sha512-RD97prjEt9EL8YgAgpOkf3O4IF9lhJFr9g0htQkm0rchFp/Vx7LW5Q8fSXXub7BXAODyUQohRMyOc3faCPd0hg==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + has-proto: 1.0.1 + is-typed-array: 1.1.12 + + /typed-array-length@1.0.4: + resolution: {integrity: sha512-KjZypGq+I/H7HI5HlOoGHkWUUGq+Q0TPhQurLbyrVrvnKTBgzLhIJ7j6J/XTQOi0d1RjyZ0wdas8bKs2p0x3Ng==} + dependencies: + call-bind: 1.0.2 + for-each: 0.3.3 + is-typed-array: 1.1.12 + + /typedarray-to-buffer@3.1.5: + resolution: {integrity: sha512-zdu8XMNEDepKKR+XYOXAVPtWui0ly0NtohUscw+UmaHiAWT8hrV1rr//H6V+0DvJ3OQ19S979M0laLfX8rm82Q==} + dependencies: + is-typedarray: 1.0.0 + dev: true + + /typedarray@0.0.6: + resolution: {integrity: sha512-/aCDEGatGvZ2BIk+HmLf4ifCJFwvKFNb9/JeZPMulfgFracn9QFcAf5GO8B/mweUjSoblS5In0cWhqpfs/5PQA==} + + /typedi@0.10.0: + resolution: {integrity: sha512-v3UJF8xm68BBj6AF4oQML3ikrfK2c9EmZUyLOfShpJuItAqVBHWP/KtpGinkSsIiP6EZyyb6Z3NXyW9dgS9X1w==} + dev: false + + /typedoc@0.22.18(typescript@4.9.5): + resolution: {integrity: sha512-NK9RlLhRUGMvc6Rw5USEYgT4DVAUFk7IF7Q6MYfpJ88KnTZP7EneEa4RcP+tX1auAcz7QT1Iy0bUSZBYYHdoyA==} + engines: {node: '>= 12.10.0'} + hasBin: true + peerDependencies: + typescript: 4.0.x || 4.1.x || 4.2.x || 4.3.x || 4.4.x || 4.5.x || 4.6.x || 4.7.x + dependencies: + glob: 8.1.0 + lunr: 2.3.9 + marked: 4.3.0 + minimatch: 5.1.6 + shiki: 0.10.1 + typescript: 4.9.5 + dev: true + + /typescript@4.7.4: + resolution: {integrity: sha512-C0WQT0gezHuw6AdY1M2jxUO83Rjf0HP7Sk1DtXj6j1EwkQNZrHAg2XPWlq62oqEhYvONq5pkC2Y9oPljWToLmQ==} + engines: {node: '>=4.2.0'} + hasBin: true + + /typescript@4.9.5: + resolution: {integrity: sha512-1FXk9E2Hm+QzZQ7z+McJiHL4NW1F2EzMu9Nq9i3zAaGqibafqYwCVU6WyWAuyQRRzOlxou8xZSyXLEN8oKj24g==} + engines: {node: '>=4.2.0'} + hasBin: true + + /uid-safe@2.1.5: + resolution: {integrity: sha512-KPHm4VL5dDXKz01UuEd88Df+KzynaohSL9fBh096KWAxSKZQDI2uBrVqtvRM4rwrIrRRKsdLNML/lnaaVSRioA==} + engines: {node: '>= 0.8'} + dependencies: + random-bytes: 1.0.0 + dev: false + + /uint8arrays@3.1.1: + resolution: {integrity: sha512-+QJa8QRnbdXVpHYjLoTpJIdCTiw9Ir62nocClWuXIq2JIh4Uta0cQsTSpFL678p2CN8B+XSApwcU+pQEqVpKWg==} + dependencies: + multiformats: 9.9.0 + dev: false + + /unbox-primitive@1.0.2: + resolution: {integrity: sha512-61pPlCD9h51VoreyJ0BReideM3MDKMKnh6+V9L08331ipq6Q8OFXZYiqP6n/tbHx4s5I9uRhcye6BrbkizkBDw==} + dependencies: + call-bind: 1.0.2 + has-bigints: 1.0.2 + has-symbols: 1.0.3 + which-boxed-primitive: 1.0.2 + + /unicode-byte-truncate@1.0.0: + resolution: {integrity: sha512-GQgHk6DodEoKddKQdjnv7xKS9G09XCfHWX0R4RKht+EbUMSiVEmtWHGFO8HUm+6NvWik3E2/DG4MxTitOLL64A==} + requiresBuild: true + dependencies: + is-integer: 1.0.7 + unicode-substring: 0.1.0 + dev: false + optional: true + + /unicode-substring@0.1.0: + resolution: {integrity: sha512-36Xaw9wXi7MB/3/EQZZHkZyyiRNa9i3k9YtPAz2KfqMVH2xutdXyMHn4Igarmnvr+wOrfWa/6njhY+jPpXN2EQ==} + requiresBuild: true + dev: false + optional: true + + /unique-filename@1.1.1: + resolution: {integrity: sha512-Vmp0jIp2ln35UTXuryvjzkjGdRyf9b2lTXuSYUiPmzRcl3FDtYqAwOnTJkAngD9SWhnoJzDbTKwaOrZ+STtxNQ==} + dependencies: + unique-slug: 2.0.2 + dev: false + + /unique-slug@2.0.2: + resolution: {integrity: sha512-zoWr9ObaxALD3DOPfjPSqxt4fnZiWblxHIgeWqW8x7UqDzEtHEQLzji2cuJYQFCU6KmoJikOYAZlrTHHebjx2w==} + dependencies: + imurmurhash: 0.1.4 + dev: false + + /universalify@0.2.0: + resolution: {integrity: sha512-CJ1QgKmNg3CwvAv/kOFmtnEN05f0D/cn9QntgNOQlQF9dgvVTHj3t+8JPdjqawCHk7V/KA+fbUqzZ9XWhcqPUg==} + engines: {node: '>= 4.0.0'} + dev: true + + /universalify@2.0.0: + resolution: {integrity: sha512-hAZsKq7Yy11Zu1DE0OzWjw7nnLZmJZYTDZZyEFHZdUhV8FkH5MCfoU1XMaxXovpyW5nq5scPqq0ZDP9Zyl04oQ==} + engines: {node: '>= 10.0.0'} + + /unpipe@1.0.0: + resolution: {integrity: sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==} + engines: {node: '>= 0.8'} + + /update-browserslist-db@1.0.13(browserslist@4.22.1): + resolution: {integrity: sha512-xebP81SNcPuNpPP3uzeW1NYXxI3rxyJzF3pD6sH4jE7o/IX+WtSpwnVU+qIsDPyk0d3hmFQ7mjqc6AtV604hbg==} + hasBin: true + peerDependencies: + browserslist: '>= 4.21.0' + dependencies: + browserslist: 4.22.1 + escalade: 3.1.1 + picocolors: 1.0.0 + + /uri-js@4.4.1: + resolution: {integrity: sha512-7rKUyy33Q1yc98pQ1DAmLtwX109F7TIfWlW1Ydo8Wl1ii1SeHieeh0HHfPeL2fMXK6z0s8ecKs9frCuLJvndBg==} + dependencies: + punycode: 2.3.0 + + /urijs@1.19.11: + resolution: {integrity: sha512-HXgFDgDommxn5/bIv0cnQZsPhHDA90NPHD6+c/v21U5+Sx5hoP8+dP9IZXBU1gIfvdRfhG8cel9QNPeionfcCQ==} + requiresBuild: true + dev: false + optional: true + + /url-parse@1.5.10: + resolution: {integrity: sha512-WypcfiRhfeUP9vvF0j6rw0J3hrWrw6iZv3+22h6iRMJ/8z1Tj6XfLP4DsUix5MhMPnXpiHDoKyoZ/bdCkwBCiQ==} + dependencies: + querystringify: 2.2.0 + requires-port: 1.0.0 + dev: true + + /util-deprecate@1.0.2: + resolution: {integrity: sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==} + + /utils-merge@1.0.1: + resolution: {integrity: sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==} + engines: {node: '>= 0.4.0'} + + /uuid@8.3.2: + resolution: {integrity: sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==} + hasBin: true + + /v8-compile-cache-lib@3.0.1: + resolution: {integrity: sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==} + dev: true + + /v8-to-istanbul@8.1.1: + resolution: {integrity: sha512-FGtKtv3xIpR6BYhvgH8MI/y78oT7d8Au3ww4QIxymrCtZEh5b8gCw2siywE+puhEmuWKDtmfrvF5UlB298ut3w==} + engines: {node: '>=10.12.0'} + dependencies: + '@types/istanbul-lib-coverage': 2.0.4 + convert-source-map: 1.9.0 + source-map: 0.7.4 + dev: true + + /validator@13.11.0: + resolution: {integrity: sha512-Ii+sehpSfZy+At5nPdnyMhx78fEoPDkR2XW/zimHEL3MyGJQOCQ7WeP20jPYRz7ZCpcKLB21NxuXHF3bxjStBQ==} + engines: {node: '>= 0.10'} + + /varint@5.0.2: + resolution: {integrity: sha512-lKxKYG6H03yCZUpAGOPOsMcGxd1RHCu1iKvEHYDPmTyq2HueGhD73ssNBqqQWfvYs04G9iUFRvmAVLW20Jw6ow==} + dev: false + + /vary@1.1.2: + resolution: {integrity: sha512-BNGbWLfd0eUPabhkXUVm0j8uuvREyTh5ovRa/dyow/BqAbZJyC+5fU+IzQOzmAKzYqYRAISoRhdQr3eIZ/PXqg==} + engines: {node: '>= 0.8'} + + /vscode-oniguruma@1.7.0: + resolution: {integrity: sha512-L9WMGRfrjOhgHSdOYgCt/yRMsXzLDJSL7BPrOZt73gU0iWO4mpqzqQzOz5srxqTvMBaR0XZTSrVWo4j55Rc6cA==} + dev: true + + /vscode-textmate@5.2.0: + resolution: {integrity: sha512-Uw5ooOQxRASHgu6C7GVvUxisKXfSgW4oFlO+aa+PAkgmH89O3CXxEEzNRNtHSqtXFTl0nAC1uYj0GMSH27uwtQ==} + dev: true + + /w3c-hr-time@1.0.2: + resolution: {integrity: sha512-z8P5DvDNjKDoFIHK7q8r8lackT6l+jo/Ye3HOle7l9nICP9lf1Ci25fy9vHd0JOWewkIFzXIEig3TdKT7JQ5fQ==} + deprecated: Use your platform's native performance.now() and performance.timeOrigin. + dependencies: + browser-process-hrtime: 1.0.0 + dev: true + + /w3c-xmlserializer@2.0.0: + resolution: {integrity: sha512-4tzD0mF8iSiMiNs30BiLO3EpfGLZUT2MSX/G+o7ZywDzliWQ3OPtTZ0PTC3B3ca1UAf4cJMHB+2Bf56EriJuRA==} + engines: {node: '>=10'} + dependencies: + xml-name-validator: 3.0.0 + dev: true + + /walker@1.0.8: + resolution: {integrity: sha512-ts/8E8l5b7kY0vlWLewOkDXMmPdLcVV4GmOQLyxuSswIJsweeFZtAsMF7k1Nszz+TYBQrlYRmzOnr398y1JemQ==} + dependencies: + makeerror: 1.0.12 + dev: true + + /watchpack@2.4.0: + resolution: {integrity: sha512-Lcvm7MGST/4fup+ifyKi2hjyIAwcdI4HRgtvTpIUxBRhB+RFtUh8XtDOxUfctVCnhVi+QQj49i91OyvzkJl6cg==} + engines: {node: '>=10.13.0'} + dependencies: + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + + /wcwidth@1.0.1: + resolution: {integrity: sha512-XHPEwS0q6TaxcvG85+8EYkbiCux2XtWG2mkc47Ng2A77BQu9+DqIOJldST4HgPkuea7dvKSj5VgX3P1d4rW8Tg==} + dependencies: + defaults: 1.0.4 + + /webidl-conversions@3.0.1: + resolution: {integrity: sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==} + + /webidl-conversions@4.0.2: + resolution: {integrity: sha512-YQ+BmxuTgd6UXZW3+ICGfyqRyHXVlD5GtQr5+qjiNW7bF0cqrzX500HVXPBOvgXb5YnzDd+h0zqyv61KUD7+Sg==} + requiresBuild: true + dev: false + optional: true + + /webidl-conversions@5.0.0: + resolution: {integrity: sha512-VlZwKPCkYKxQgeSbH5EyngOmRp7Ww7I9rQLERETtf5ofd9pGeswWiOtogpEO850jziPRarreGxn5QIiTqpb2wA==} + engines: {node: '>=8'} + dev: true + + /webidl-conversions@6.1.0: + resolution: {integrity: sha512-qBIvFLGiBpLjfwmYAaHPXsn+ho5xZnGvyGvsarywGNc8VyQJUMHJ8OBKGGrPER0okBeMDaan4mNBlgBROxuI8w==} + engines: {node: '>=10.4'} + dev: true + + /webpack-node-externals@3.0.0: + resolution: {integrity: sha512-LnL6Z3GGDPht/AigwRh2dvL9PQPFQ8skEpVrWZXLWBYmqcaojHNN0onvHzie6rq7EWKrrBfPYqNEzTJgiwEQDQ==} + engines: {node: '>=6'} + + /webpack-sources@3.2.3: + resolution: {integrity: sha512-/DyMEOrDgLKKIG0fmvtz+4dUX/3Ghozwgm6iPp8KRhvn+eQf9+Q7GWxVNMk3+uCPWfdXYC4ExGBckIXdFEfH1w==} + engines: {node: '>=10.13.0'} + + /webpack@5.73.0: + resolution: {integrity: sha512-svjudQRPPa0YiOYa2lM/Gacw0r6PvxptHj4FuEKQ2kX05ZLkjbVc5MnPs6its5j7IZljnIqSVo/OsY2X0IpHGA==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.5 + '@types/estree': 0.0.51 + '@webassemblyjs/ast': 1.11.1 + '@webassemblyjs/wasm-edit': 1.11.1 + '@webassemblyjs/wasm-parser': 1.11.1 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.22.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 0.9.3 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.73.0) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + + /webpack@5.88.2: + resolution: {integrity: sha512-JmcgNZ1iKj+aiR0OvTYtWQqJwq37Pf683dY9bVORwVbUrDhLhdn/PlO2sHsFHPkj7sHNQF3JwaAkp49V+Sq1tQ==} + engines: {node: '>=10.13.0'} + hasBin: true + peerDependencies: + webpack-cli: '*' + peerDependenciesMeta: + webpack-cli: + optional: true + dependencies: + '@types/eslint-scope': 3.7.5 + '@types/estree': 1.0.2 + '@webassemblyjs/ast': 1.11.6 + '@webassemblyjs/wasm-edit': 1.11.6 + '@webassemblyjs/wasm-parser': 1.11.6 + acorn: 8.10.0 + acorn-import-assertions: 1.9.0(acorn@8.10.0) + browserslist: 4.22.1 + chrome-trace-event: 1.0.3 + enhanced-resolve: 5.15.0 + es-module-lexer: 1.3.1 + eslint-scope: 5.1.1 + events: 3.3.0 + glob-to-regexp: 0.4.1 + graceful-fs: 4.2.11 + json-parse-even-better-errors: 2.3.1 + loader-runner: 4.3.0 + mime-types: 2.1.35 + neo-async: 2.6.2 + schema-utils: 3.3.0 + tapable: 2.2.1 + terser-webpack-plugin: 5.3.9(webpack@5.88.2) + watchpack: 2.4.0 + webpack-sources: 3.2.3 + transitivePeerDependencies: + - '@swc/core' + - esbuild + - uglify-js + dev: true + + /whatwg-encoding@1.0.5: + resolution: {integrity: sha512-b5lim54JOPN9HtzvK9HFXvBma/rnfFeqsic0hSpjtDbVxR3dJKLc+KB4V6GgiGOvl7CY/KNh8rxSo9DKQrnUEw==} + dependencies: + iconv-lite: 0.4.24 + dev: true + + /whatwg-mimetype@2.3.0: + resolution: {integrity: sha512-M4yMwr6mAnQz76TbJm914+gPpB/nCwvZbJU28cUD6dR004SAxDLOOSUaB1JDRqLtaOV/vi0IC5lEAGFgrjGv/g==} + dev: true + + /whatwg-url@5.0.0: + resolution: {integrity: sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==} + dependencies: + tr46: 0.0.3 + webidl-conversions: 3.0.1 + + /whatwg-url@7.1.0: + resolution: {integrity: sha512-WUu7Rg1DroM7oQvGWfOiAK21n74Gg+T4elXEQYkOhtyLeWiJFoOGLXPKI/9gzIie9CtwVLm8wtw6YJdKyxSjeg==} + requiresBuild: true + dependencies: + lodash.sortby: 4.7.0 + tr46: 1.0.1 + webidl-conversions: 4.0.2 + dev: false + optional: true + + /whatwg-url@8.7.0: + resolution: {integrity: sha512-gAojqb/m9Q8a5IV96E3fHJM70AzCkgt4uXYX2O7EmuyOnLrViCQlsEBmF9UQIu3/aeAIp2U17rtbpZWNntQqdg==} + engines: {node: '>=10'} + dependencies: + lodash: 4.17.21 + tr46: 2.1.0 + webidl-conversions: 6.1.0 + dev: true + + /which-boxed-primitive@1.0.2: + resolution: {integrity: sha512-bwZdv0AKLpplFY2KZRX6TvyuN7ojjr7lwkg6ml0roIy9YeuSr7JS372qlNW18UQYzgYK9ziGcerWqZOmEn9VNg==} + dependencies: + is-bigint: 1.0.4 + is-boolean-object: 1.1.2 + is-number-object: 1.0.7 + is-string: 1.0.7 + is-symbol: 1.0.4 + + /which-typed-array@1.1.11: + resolution: {integrity: sha512-qe9UWWpkeG5yzZ0tNYxDmd7vo58HDBc39mZ0xWWpolAGADdFOzkfamWLDxkOWcvHQKVmdTyQdLD4NOfjLWTKew==} + engines: {node: '>= 0.4'} + dependencies: + available-typed-arrays: 1.0.5 + call-bind: 1.0.2 + for-each: 0.3.3 + gopd: 1.0.1 + has-tostringtag: 1.0.0 + + /which@2.0.2: + resolution: {integrity: sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==} + engines: {node: '>= 8'} + hasBin: true + dependencies: + isexe: 2.0.0 + + /wide-align@1.1.5: + resolution: {integrity: sha512-eDMORYaPNZ4sQIuuYPDHdQvf4gyCF9rEEV/yPxGfwPkRodwEgiMUUXTx/dex+Me0wxx53S+NgUHaP7y3MGlDmg==} + dependencies: + string-width: 4.2.3 + dev: false + + /windows-release@4.0.0: + resolution: {integrity: sha512-OxmV4wzDKB1x7AZaZgXMVsdJ1qER1ed83ZrTYd5Bwq2HfJVg3DJS8nqlAG4sMoJ7mu8cuRmLEYyU13BKwctRAg==} + engines: {node: '>=10'} + dependencies: + execa: 4.1.0 + + /winston-elasticsearch@0.16.1: + resolution: {integrity: sha512-IZ7NWs+tBYSRf9CKYs0xmS42IIfyKnd+miWrGl58WLfDLBphIhqwol6im5dUcW2xjMCP4hSovaqipAgzC5MCYQ==} + engines: {node: '>= 8.0.0'} + dependencies: + '@elastic/elasticsearch': 7.17.13 + dayjs: 1.11.10 + debug: 4.3.4 + lodash.defaults: 4.2.0 + lodash.omit: 4.5.0 + promise: 8.3.0 + retry: 0.13.1 + winston: 3.10.0 + winston-transport: 4.5.0 + optionalDependencies: + elastic-apm-node: 3.50.0 + transitivePeerDependencies: + - supports-color + dev: false + + /winston-transport@4.5.0: + resolution: {integrity: sha512-YpZzcUzBedhlTAfJg6vJDlyEai/IFMIVcaEZZyl3UXIl4gmqRpU7AE89AHLkbzLUsv0NVmw7ts+iztqKxxPW1Q==} + engines: {node: '>= 6.4.0'} + dependencies: + logform: 2.5.1 + readable-stream: 3.6.2 + triple-beam: 1.4.1 + dev: false + + /winston@3.10.0: + resolution: {integrity: sha512-nT6SIDaE9B7ZRO0u3UvdrimG0HkB7dSTAgInQnNR2SOPJ4bvq5q79+pXLftKmP52lJGW15+H5MCK0nM9D3KB/g==} + engines: {node: '>= 12.0.0'} + dependencies: + '@colors/colors': 1.5.0 + '@dabh/diagnostics': 2.0.3 + async: 3.2.4 + is-stream: 2.0.1 + logform: 2.5.1 + one-time: 1.0.0 + readable-stream: 3.6.2 + safe-stable-stringify: 2.4.3 + stack-trace: 0.0.10 + triple-beam: 1.4.1 + winston-transport: 4.5.0 + dev: false + + /wrap-ansi@7.0.0: + resolution: {integrity: sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==} + engines: {node: '>=10'} + dependencies: + ansi-styles: 4.3.0 + string-width: 4.2.3 + strip-ansi: 6.0.1 + + /wrappy@1.0.2: + resolution: {integrity: sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==} + + /write-file-atomic@3.0.3: + resolution: {integrity: sha512-AvHcyZ5JnSfq3ioSyjrBkH9yW4m7Ayk8/9My/DD9onKeu/94fwrMocemO2QAJFAlnnDN+ZDS+ZjAR5ua1/PV/Q==} + dependencies: + imurmurhash: 0.1.4 + is-typedarray: 1.0.0 + signal-exit: 3.0.7 + typedarray-to-buffer: 3.1.5 + dev: true + + /ws@7.5.9: + resolution: {integrity: sha512-F+P9Jil7UiSKSkppIiD94dN07AwvFixvLIj1Og1Rl9GGMuNipJnV9JzjD6XuqmAeiswGvUmNLjr5cFuXwNS77Q==} + engines: {node: '>=8.3.0'} + peerDependencies: + bufferutil: ^4.0.1 + utf-8-validate: ^5.0.2 + peerDependenciesMeta: + bufferutil: + optional: true + utf-8-validate: + optional: true + + /xml-name-validator@3.0.0: + resolution: {integrity: sha512-A5CUptxDsvxKJEU3yO6DuWBSJz/qizqzJKOMIfUJHETbBw/sFaDxgd6fxm1ewUaM0jZ444Fc5vC5ROYurg/4Pw==} + dev: true + + /xmlchars@2.2.0: + resolution: {integrity: sha512-JZnDKK8B0RCDw84FNdDAIpZK+JuJw+s7Lz8nksI7SIuU3UXJJslUthsi+uWBUYOwPFwW7W7PRLRfUKpxjtjFCw==} + dev: true + + /xtend@4.0.2: + resolution: {integrity: sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==} + engines: {node: '>=0.4'} + + /y18n@5.0.8: + resolution: {integrity: sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==} + engines: {node: '>=10'} + + /yallist@2.1.2: + resolution: {integrity: sha512-ncTzHV7NvsQZkYe1DW7cbDLm0YpzHmZF5r/iyP3ZnQtMiJ+pjzisCiMNI+Sj+xQF5pXhSHxSB3uDbsBTzY/c2A==} + dev: false + + /yallist@3.1.1: + resolution: {integrity: sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==} + dev: true + + /yallist@4.0.0: + resolution: {integrity: sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==} + + /yaml@1.10.2: + resolution: {integrity: sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==} + engines: {node: '>= 6'} + + /yargs-parser@20.2.9: + resolution: {integrity: sha512-y11nGElTIV+CT3Zv9t7VKl+Q3hTQoT9a1Qzezhhl6Rp21gJ/IVTW7Z3y9EWXhuUBC2Shnf+DX0antecpAwSP8w==} + engines: {node: '>=10'} + dev: true + + /yargs-parser@21.1.1: + resolution: {integrity: sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==} + engines: {node: '>=12'} + dev: false + + /yargs@16.2.0: + resolution: {integrity: sha512-D1mvvtDG0L5ft/jGWkLpG1+m0eQxOfaBvTNELraWj22wSVUMWxZUvYgJYcKh6jGGIkJFhH4IZPQhR4TKpc8mBw==} + engines: {node: '>=10'} + dependencies: + cliui: 7.0.4 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 20.2.9 + dev: true + + /yargs@17.7.2: + resolution: {integrity: sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==} + engines: {node: '>=12'} + dependencies: + cliui: 8.0.1 + escalade: 3.1.1 + get-caller-file: 2.0.5 + require-directory: 2.1.1 + string-width: 4.2.3 + y18n: 5.0.8 + yargs-parser: 21.1.1 + dev: false + + /ylru@1.3.2: + resolution: {integrity: sha512-RXRJzMiK6U2ye0BlGGZnmpwJDPgakn6aNQ0A7gHRbD4I0uvK4TW6UqkK1V0pp9jskjJBAXd3dRrbzWkqJ+6cxA==} + engines: {node: '>= 4.0.0'} + requiresBuild: true + dev: false + optional: true + + /yn@3.1.1: + resolution: {integrity: sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==} + engines: {node: '>=6'} + dev: true + + /yocto-queue@0.1.0: + resolution: {integrity: sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==} + engines: {node: '>=10'} + dev: true diff --git a/pnpm-workspace.yaml b/pnpm-workspace.yaml new file mode 100644 index 0000000000000000000000000000000000000000..855160bd11b2e81bdb37abb69f3f02461412b277 --- /dev/null +++ b/pnpm-workspace.yaml @@ -0,0 +1,2 @@ +packages: + - apps/* \ No newline at end of file