{"_id":"@digitalcredentials/credential-status-manager-db","_rev":"2-296c84ac68dea73585948c3e75295853","name":"@digitalcredentials/credential-status-manager-db","dist-tags":{"latest":"0.0.1","beta":"0.0.1-beta.1"},"versions":{"0.0.1-beta.0":{"name":"@digitalcredentials/credential-status-manager-db","version":"0.0.1-beta.0","keywords":["dcc"],"author":{"url":"https://github.com/digitalcredentials","name":"Digital Credentials Consortium"},"license":"MIT","_id":"@digitalcredentials/credential-status-manager-db@0.0.1-beta.0","maintainers":[{"name":"kezike","email":"kezike13@gmail.com"},{"name":"klemoie","email":"klemoie@mit.edu"},{"name":"codenamedmitri","email":"dzagidulin@gmail.com"},{"name":"kimhd","email":"kimdhamilton@gmail.com"},{"name":"uligall","email":"npm@ulig.io"},{"name":"alexander.muehle","email":"Alexander.Muehle@hpi.de"},{"name":"stuartf","email":"stuart.freeman@c21u.gatech.edu"},{"name":"jchartrand","email":"jc.chartrand@gmail.com"},{"name":"kiliankae","email":"kilian.kaeslin@googlemail.com"}],"homepage":"https://github.com/digitalcredentials/credential-status-manager-db","bugs":{"url":"https://github.com/digitalcredentials/credential-status-manager-db/issues"},"dist":{"shasum":"eff19ad1713d9d99da0ad985789aa57851706607","tarball":"https://registry.npmjs.org/@digitalcredentials/credential-status-manager-db/-/credential-status-manager-db-0.0.1-beta.0.tgz","fileCount":21,"integrity":"sha512-gtK8iWmvDuRFhqxoJp7flxi1Xx3iU/fB1seFb4tvfPqi7RGCVqCC8SjjYR0ic+BPlFSxbkAF/qoyW8UR/jvwOg==","signatures":[{"sig":"MEQCID8fs/QW62+NTdJtpM/QH3HHjKBZJQlhlCD2wf5jHs95AiBCnLgBb5y7gjrkf800NuXLBsACaYSNLdeIdPhmdn96iQ==","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":223710},"main":"dist/index.js","type":"module","mocha":{"spec":"dist/test/**/*.js","require":"ts-node/register","extension":["js"]},"types":"dist/esm/index.d.ts","module":"dist/esm/index.js","engines":{"node":">=20.0"},"exports":{".":{"import":"./dist/esm/index.js","require":"./dist/index.js"}},"gitHead":"330d126309692900c1e354be7754a87d75f93763","scripts":{"lint":"eslint .","test":"npm run lint && npm run test-node","build":"npm run clear && tsc -d && tsc -p tsconfig.esm.json","clear":"rimraf dist/*","prepare":"npm run build","lint:fix":"eslint --fix .","prettier":"prettier src --write","test-node":"npm run build-test && mocha dist/test/*.spec.js && rm -rf dist/test || true","build-test":"npm run clear && tsc -d && tsc -p tsconfig.spec.json"},"_npmUser":{"name":"jchartrand","email":"jc.chartrand@gmail.com"},"repository":{"url":"git+https://github.com/digitalcredentials/credential-status-manager-db.git","type":"git"},"_npmVersion":"9.5.0","description":"A Typescript library for managing the status of Verifiable Credentials in a Database using Bitstring Status List.","directories":{},"_nodeVersion":"18.14.2","dependencies":{"bnid":"^3.0.0","uuid":"^9.0.1","mongodb":"^6.3.0","crypto-ld":"^7.0.0","@digitalbazaar/vc":"^7.0.0","@interop/did-web-resolver":"^3.0.1","@digitalbazaar/did-method-key":"^5.2.0","@digitalcredentials/vc-data-model":"^2.0.0","@digitalbazaar/ed25519-signature-2020":"^5.4.0","@digitalbazaar/vc-bitstring-status-list":"^1.0.0","@digitalbazaar/ed25519-verification-key-2020":"^4.1.0","@digitalbazaar/x25519-key-agreement-key-2020":"^3.0.1","@digitalcredentials/security-document-loader":"^6.0.0","@digitalbazaar/vc-bitstring-status-list-context":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"devDependencies":{"chai":"^4.3.7","karma":"^6.4.2","mocha":"^10.3.0","sinon":"^17.0.1","eslint":"^8.56.0","rimraf":"^5.0.5","ts-node":"^10.9.2","prettier":"^3.2.5","karma-chai":"^0.1.0","typescript":"^5.1.6","@types/chai":"^4.3.11","@types/node":"^20.11.19","karma-mocha":"^2.0.1","@types/mocha":"^10.0.6","@types/sinon":"^17.0.3","karma-typescript":"^5.5.4","@npmcli/package-json":"^5.0.0","eslint-plugin-import":"^2.29.1","karma-mocha-reporter":"^2.2.5","karma-chrome-launcher":"^3.2.0","mongodb-memory-server":"^9.1.6","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","karma-sourcemap-loader":"^0.4.0","@typescript-eslint/parser":"^5.62.0","karma-typescript-es6-transform":"^5.5.4","@typescript-eslint/eslint-plugin":"^5.46.1","eslint-config-standard-with-typescript":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/credential-status-manager-db_0.0.1-beta.0_1724446066405_0.392253845002801","host":"s3://npm-registry-packages"}},"0.0.1-beta.1":{"name":"@digitalcredentials/credential-status-manager-db","version":"0.0.1-beta.1","keywords":["dcc"],"author":{"url":"https://github.com/digitalcredentials","name":"Digital Credentials Consortium"},"license":"MIT","_id":"@digitalcredentials/credential-status-manager-db@0.0.1-beta.1","maintainers":[{"name":"kezike","email":"kezike13@gmail.com"},{"name":"klemoie","email":"klemoie@mit.edu"},{"name":"codenamedmitri","email":"dzagidulin@gmail.com"},{"name":"kimhd","email":"kimdhamilton@gmail.com"},{"name":"uligall","email":"npm@ulig.io"},{"name":"alexander.muehle","email":"Alexander.Muehle@hpi.de"},{"name":"stuartf","email":"stuart.freeman@c21u.gatech.edu"},{"name":"jchartrand","email":"jc.chartrand@gmail.com"},{"name":"kiliankae","email":"kilian.kaeslin@googlemail.com"}],"homepage":"https://github.com/digitalcredentials/credential-status-manager-db","bugs":{"url":"https://github.com/digitalcredentials/credential-status-manager-db/issues"},"dist":{"shasum":"1b7a24b1a778a5e0ae51677a12c95c7f02f2d8fe","tarball":"https://registry.npmjs.org/@digitalcredentials/credential-status-manager-db/-/credential-status-manager-db-0.0.1-beta.1.tgz","fileCount":9,"integrity":"sha512-ZhFPVbbLzMMSVCWd3Pd4tSZMtnmC0ao6I6W6EgIxOlfmi6NgOZ+1c7mvPlWBdKBtSJd4HAvXMikzNqo1ALVvMA==","signatures":[{"sig":"MEUCIAhGsS6nfMbTmmyWCMSPrVAT+LxliyoeT5wh8qw6V3ztAiEA2kgKlIraLB/bF5CApVQNwc39Cis/IRIATakFip9cup0=","keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA"}],"unpackedSize":104195},"main":"dist/index.js","type":"module","mocha":{"spec":"dist/test/**/*.js","require":"ts-node/register","extension":["js"]},"types":"dist/index.d.ts","module":"dist/index.js","engines":{"node":">=20.0"},"exports":{".":{"import":"./dist/index.js"}},"gitHead":"bb0fec8872fc742b4254b803e1b53bf59947a11a","scripts":{"lint":"eslint .","test":"npm run lint && npm run test-node","build":"npm run clear && tsc -p tsconfig.json","clear":"rimraf dist/*","prepare":"npm run build","lint:fix":"eslint --fix .","prettier":"prettier src --write","test-node":"npm run build-test && mocha dist/test/*.spec.js && rm -rf dist/test || true","build-test":"npm run clear && tsc -p tsconfig.spec.json"},"_npmUser":{"name":"jchartrand","email":"jc.chartrand@gmail.com"},"repository":{"url":"git+https://github.com/digitalcredentials/credential-status-manager-db.git","type":"git"},"_npmVersion":"9.5.0","description":"A Typescript library for managing the status of Verifiable Credentials in a Database using Bitstring Status List.","directories":{},"_nodeVersion":"18.14.2","dependencies":{"bnid":"^3.0.0","uuid":"^9.0.1","mongodb":"^6.3.0","crypto-ld":"^7.0.0","@digitalbazaar/vc":"^7.0.0","@interop/did-web-resolver":"^3.0.1","@digitalbazaar/did-method-key":"^5.2.0","@digitalcredentials/vc-data-model":"^2.0.0","@digitalbazaar/ed25519-signature-2020":"^5.4.0","@digitalbazaar/vc-bitstring-status-list":"^1.0.0","@digitalbazaar/ed25519-verification-key-2020":"^4.1.0","@digitalbazaar/x25519-key-agreement-key-2020":"^3.0.1","@digitalcredentials/security-document-loader":"^6.0.0","@digitalbazaar/vc-bitstring-status-list-context":"^1.0.0"},"publishConfig":{"access":"public"},"_hasShrinkwrap":false,"readmeFilename":"README.md","devDependencies":{"chai":"^4.3.7","karma":"^6.4.2","mocha":"^10.3.0","sinon":"^17.0.1","eslint":"^8.56.0","rimraf":"^5.0.5","ts-node":"^10.9.2","prettier":"^3.2.5","karma-chai":"^0.1.0","typescript":"^5.1.6","@types/chai":"^4.3.11","@types/node":"^20.11.19","karma-mocha":"^2.0.1","@types/mocha":"^10.0.6","@types/sinon":"^17.0.3","karma-typescript":"^5.5.4","@npmcli/package-json":"^5.0.0","eslint-plugin-import":"^2.29.1","karma-mocha-reporter":"^2.2.5","karma-chrome-launcher":"^3.2.0","mongodb-memory-server":"^9.1.6","eslint-config-prettier":"^9.1.0","eslint-plugin-prettier":"^5.1.3","karma-sourcemap-loader":"^0.4.0","@typescript-eslint/parser":"^5.62.0","karma-typescript-es6-transform":"^5.5.4","@typescript-eslint/eslint-plugin":"^5.46.1","eslint-config-standard-with-typescript":"^24.0.0"},"_npmOperationalInternal":{"tmp":"tmp/credential-status-manager-db_0.0.1-beta.1_1725398811387_0.9784340244569163","host":"s3://npm-registry-packages"}},"0.0.1":{"name":"@digitalcredentials/credential-status-manager-db","description":"A Typescript library for managing the status of Verifiable Credentials in a Database using Bitstring Status List.","version":"0.0.1","license":"MIT","engines":{"node":">=20.0"},"author":{"name":"Digital Credentials Consortium","url":"https://github.com/digitalcredentials"},"repository":{"type":"git","url":"git+https://github.com/digitalcredentials/credential-status-manager-db.git"},"homepage":"https://github.com/digitalcredentials/credential-status-manager-db","bugs":{"url":"https://github.com/digitalcredentials/credential-status-manager-db/issues"},"keywords":["dcc"],"main":"dist/index.js","module":"dist/index.js","types":"dist/index.d.ts","exports":{".":{"import":"./dist/index.js"}},"publishConfig":{"access":"public"},"mocha":{"require":"ts-node/register","extension":["js"],"spec":"dist/test/**/*.js"},"scripts":{"build":"npm run clear && tsc -p tsconfig.json","build-test":"npm run clear && tsc -p tsconfig.spec.json","clear":"rimraf dist/*","lint":"eslint .","lint:fix":"eslint --fix .","prepare":"npm run build","prettier":"prettier src --write","test":"npm run lint && npm run test-node","test-node":"npm run build-test && mocha dist/test/*.spec.js && rm -rf dist/test || true"},"dependencies":{"@digitalbazaar/did-method-key":"^5.2.0","@digitalbazaar/ed25519-signature-2020":"^5.4.0","@digitalbazaar/ed25519-verification-key-2020":"^4.1.0","@digitalbazaar/vc":"^7.0.0","@digitalbazaar/vc-bitstring-status-list":"^1.0.0","@digitalbazaar/vc-bitstring-status-list-context":"^1.0.0","@digitalbazaar/x25519-key-agreement-key-2020":"^3.0.1","@digitalcredentials/security-document-loader":"^6.0.0","@digitalcredentials/vc-data-model":"^2.0.0","@interop/did-web-resolver":"^3.0.1","bnid":"^3.0.0","crypto-ld":"^7.0.0","mongodb":"^6.3.0","uuid":"^9.0.1"},"devDependencies":{"@npmcli/package-json":"^5.0.0","@types/chai":"^4.3.11","@types/mocha":"^10.0.6","@types/node":"^20.11.19","@types/sinon":"^17.0.3","@typescript-eslint/eslint-plugin":"^5.46.1","@typescript-eslint/parser":"^5.62.0","chai":"^4.3.7","eslint":"^8.56.0","eslint-config-prettier":"^9.1.0","eslint-config-standard-with-typescript":"^24.0.0","eslint-plugin-import":"^2.29.1","eslint-plugin-prettier":"^5.1.3","karma":"^6.4.2","karma-chai":"^0.1.0","karma-chrome-launcher":"^3.2.0","karma-mocha":"^2.0.1","karma-mocha-reporter":"^2.2.5","karma-sourcemap-loader":"^0.4.0","karma-typescript":"^5.5.4","karma-typescript-es6-transform":"^5.5.4","mocha":"^10.3.0","mongodb-memory-server":"^9.1.6","prettier":"^3.2.5","rimraf":"^5.0.5","sinon":"^17.0.1","ts-node":"^10.9.2","typescript":"^5.1.6"},"type":"module","gitHead":"0271a8fbf2f8d64e96cf57c889c1990522db2771","_id":"@digitalcredentials/credential-status-manager-db@0.0.1","_nodeVersion":"18.14.2","_npmVersion":"9.5.0","dist":{"integrity":"sha512-4TBPCecUFuj27wffQvurAOpAFKRG6m/kPDRqVk8e6Lg33oMrWs2V87kbsKCvgimFDAf7fstKQV39BCJtEAdwRA==","shasum":"ab93f9870984ba29df1a36e2515f3c06ca70bd7e","tarball":"https://registry.npmjs.org/@digitalcredentials/credential-status-manager-db/-/credential-status-manager-db-0.0.1.tgz","fileCount":9,"unpackedSize":104188,"signatures":[{"keyid":"SHA256:jl3bwswu80PjjokCgh0o2w5c2U4LhQAE57gj9cz1kzA","sig":"MEUCIQD1vmeqkuuVGYts9a9Okg3ViTN5W7meRhYTsHkFKZxEQgIgTi4f9YBT9iSkNsdp7WU4yp0l1IyBQ1EX5Zy4diodhlE="}]},"_npmUser":{"name":"jchartrand","email":"jc.chartrand@gmail.com"},"directories":{},"maintainers":[{"name":"kezike","email":"kezike13@gmail.com"},{"name":"klemoie","email":"klemoie@mit.edu"},{"name":"codenamedmitri","email":"dzagidulin@gmail.com"},{"name":"kimhd","email":"kimdhamilton@gmail.com"},{"name":"uligall","email":"npm@ulig.io"},{"name":"alexander.muehle","email":"Alexander.Muehle@hpi.de"},{"name":"stuartf","email":"stuart.freeman@c21u.gatech.edu"},{"name":"jchartrand","email":"jc.chartrand@gmail.com"},{"name":"kiliankae","email":"kilian.kaeslin@googlemail.com"}],"_npmOperationalInternal":{"host":"s3://npm-registry-packages","tmp":"tmp/credential-status-manager-db_0.0.1_1725450623527_0.10827821052241027"},"_hasShrinkwrap":false}},"time":{"created":"2024-08-23T20:47:46.308Z","modified":"2024-09-04T11:50:23.988Z","0.0.1-beta.0":"2024-08-23T20:47:46.589Z","0.0.1-beta.1":"2024-09-03T21:26:51.590Z","0.0.1":"2024-09-04T11:50:23.714Z"},"bugs":{"url":"https://github.com/digitalcredentials/credential-status-manager-db/issues"},"author":{"name":"Digital Credentials Consortium","url":"https://github.com/digitalcredentials"},"license":"MIT","homepage":"https://github.com/digitalcredentials/credential-status-manager-db","keywords":["dcc"],"repository":{"type":"git","url":"git+https://github.com/digitalcredentials/credential-status-manager-db.git"},"description":"A Typescript library for managing the status of Verifiable Credentials in a Database using Bitstring Status List.","maintainers":[{"name":"kezike","email":"kezike13@gmail.com"},{"name":"klemoie","email":"klemoie@mit.edu"},{"name":"codenamedmitri","email":"dzagidulin@gmail.com"},{"name":"kimhd","email":"kimdhamilton@gmail.com"},{"name":"uligall","email":"npm@ulig.io"},{"name":"alexander.muehle","email":"Alexander.Muehle@hpi.de"},{"name":"stuartf","email":"stuart.freeman@c21u.gatech.edu"},{"name":"jchartrand","email":"jc.chartrand@gmail.com"},{"name":"kiliankae","email":"kilian.kaeslin@googlemail.com"}],"readme":"# credential-status-manager-db\n\n[![Build status](https://img.shields.io/github/actions/workflow/status/digitalcredentials/credential-status-manager-db/main.yml?branch=main)](https://github.com/digitalcredentials/credential-status-manager-db/actions?query=workflow%3A%22Node.js+CI%22)\n[![NPM Version](https://img.shields.io/npm/v/@digitalcredentials/credential-status-manager-db.svg)](https://npm.im/@digitalcredentials/credential-status-manager-db)\n\n> A Typescript library for managing the status of [Verifiable Credentials](https://www.w3.org/TR/vc-data-model-2.0) in a database using [Bitstring Status List](https://www.w3.org/TR/vc-bitstring-status-list)\n\n## Table of Contents\n\n- [Background](#background)\n- [Install](#install)\n  - [NPM](#npm)\n  - [Development](#development)\n- [Usage](#usage)\n  - [Create credential status manager](#create-credential-status-manager)\n  - [Allocate status for credential](#allocate-status-for-credential)\n  - [Update status of credential](#update-status-of-credential)\n  - [Check status of credential](#check-status-of-credential)\n- [Schemas](schemas)\n  - [`StatusCredential`](#statuscredential)\n  - [`UserCredential`](#usercredential)\n  - [`Config`](#config)\n  - [`Event`](#event)\n  - [`CredentialEvent`](#credentialevent)\n- [Dependencies](#dependencies)\n  - [Generate DID seeds](#generate-did-seeds)\n- [Contribute](#contribute)\n- [License](#license)\n\n## Background\n\nCredentials are dynamic artifacts with a lifecycle that goes well beyond issuance. This lifecycle is liable to span revocation, suspension, and expiry, among other common states. Many proposals have been put forth to capture these statuses in Verifiable Credentials. One of the most mature specifications for this is [Bitstring Status List](https://www.w3.org/TR/vc-bitstring-status-list). This library provides an implementation of this specification that leverages database services like MongoDB and MySQL for storage and authentication.\n\n## Install\n\n- Node.js 20+ is recommended.\n\n### NPM\n\nTo install via NPM:\n\n```bash\nnpm install @digitalcredentials/credential-status-manager-db\n```\n\n### Development\n\nTo install locally (for development):\n\n```bash\ngit clone https://github.com/digitalcredentials/credential-status-manager-db.git\ncd credential-status-manager-db\nnpm install\n```\n\n## Usage\n\n### Create credential status manager\n\nThe `createStatusManager` function is the only exported pure function of this library. It is an asynchronous function that accepts configuration options and returns a credential status manager that aligns with these options. Here are all the possible configuration options:\n\n| Key | Description | Type | Required |\n| --- | --- | --- | --- |\n| `databaseService` | name of the database service used to manage credential status data | `mongodb` | yes |\n| `statusCredentialSiteOrigin` | base URL of status credentials managed by a given deployment | string | yes |\n| `databaseUrl` | URL of the database instance used to manage credential status data | string | yes (if `databaseHost`, `databasePort`, `databaseUsername`, and `databasePassword` are not set) |\n| `databaseHost` | host of the database instance used to manage credential status data | string | yes (if `databaseUrl` is not set) |\n| `databasePort` | port of the database instance used to manage credential status data | number | yes (if `databaseUrl` is not set) |\n| `databaseUsername` | username of user with read/write privileges on the database instance used to manage credential status data | string | yes (if `databaseUrl` is not set) |\n| `databasePassword` | password associated with `databaseUsername` | string | yes (if `databaseUrl` is not set) |\n| `databaseName` | name of the database instance used to manage credential status data | string | no (default: `credentialStatus`) |\n| `statusCredentialTableName` | name of the database table used to manage status credentials ([schema](#statuscredential)) | string | no (default: `StatusCredential`) |\n| `userCredentialTableName` | name of the database table used to manage user credentials ([schema](#usercredential)) | string | no (default: `UserCredential`) |\n| `configTableName` | name of the database table used to manage application configuration ([schema](#config)) | string | no (default: `Config`) |\n| `eventTableName` | name of the database table used to manage credential status events ([schema](#event)) | string | no (default: `Event`) |\n| `credentialEventTableName` | name of the database table used to manage the latest status event for a given credential ([schema](#credentialevent)) | string | no (default: `CredentialEvent`) |\n| `autoDeployDatabase` | whether or not to automatically create the database (`databaseName`) and the initial tables (`statusCredentialTableName` and `configTableName`) | string | no (default: `true`) |\n| `didMethod` | name of the DID method used for signing | `key` \\| `web` | yes |\n| `didSeed` | seed used to deterministically generate DID | string | yes |\n| `didWebUrl` | URL for `did:web` | string | yes (if `didMethod` = `web`) |\n| `signStatusCredential` | whether or not to sign status credentials | boolean | no (default: `true`) |\n| `signUserCredential` | whether or not to sign user credentials | boolean | no (default: `false`) |\n\nHere is a sample call to `createStatusManager`:\n\n```ts\nimport { createStatusManager } from '@digitalcredentials/credential-status-manager-db';\n\nconst statusManager = await createStatusManager({\n  databaseService: 'mongodb',\n  statusCredentialSiteOrigin: 'https://credentials.example.edu/status',\n  databaseUrl: 'mongodb+srv://testuser:testpass@domain.mongodb.net?retryWrites=false',\n  databaseUsername: 'testuser',\n  databasePassword: 'testpass',\n  didMethod: 'key',\n  didSeed: 'DsnrHBHFQP0ab59dQELh3uEwy7i5ArcOTwxkwRO2hM87CBRGWBEChPO7AjmwkAZ2' // Please create your own DID seed (see Dependencies section for detailed instructions)\n});\n```\n\n### Allocate status for credential\n\n`allocateStatus` is an instance method that is called on a credential status manager initialized by `createStatusManager`. It is an asynchronous method that accepts a credential and an array of status purposes as input (options: `revocation` | `suspension`), records its status in a previously configured database instance, and returns the credential with status metadata attached.\n\nHere is a sample call to `allocateStatus`:\n\n```ts\nconst credential = {\n  '@context': [\n    'https://www.w3.org/ns/credentials/v2',\n    'https://w3id.org/security/suites/ed25519-2020/v1'\n  ],\n  id: 'https://credentials.example.edu/3732',\n  type: [\n    'VerifiableCredential'\n  ],\n  issuer: 'did:key:z6MkhVTX9BF3NGYX6cc7jWpbNnR7cAjH8LUffabZP8Qu4ysC',\n  validFrom: '2020-03-10T04:24:12.164Z',\n  credentialSubject: {\n    id: 'did:example:abcdef'\n  }\n};\nconst credentialWithStatus = await statusManager.allocateStatus({\n  credential,\n  statusPurposes: ['revocation', 'suspension']\n});\nconsole.log(credentialWithStatus);\n/*\n{\n  '@context': [\n    'https://www.w3.org/ns/credentials/v2'\n  ],\n  id: 'https://credentials.example.edu/3732',\n  type: [ 'VerifiableCredential' ],\n  issuer: 'did:key:z6MkhVTX9BF3NGYX6cc7jWpbNnR7cAjH8LUffabZP8Qu4ysC',\n  validFrom: '2020-03-10T04:24:12.164Z',\n  credentialSubject: { id: 'did:example:abcdef' },\n  credentialStatus: [\n    {\n      id: 'https://credentials.example.edu/status/Uz42qSDSXTcoLH7kZ6ST#6',\n      type: 'BitstringStatusListEntry',\n      statusPurpose: 'revocation',\n      statusListIndex: '6',\n      statusListCredential: 'https://credentials.example.edu/status/Uz42qSDSXTcoLH7kZ6ST'\n    },\n    {\n      id: 'https://credentials.example.edu/status/9kGimd8POqM88l32F9aT#3',\n      type: 'BitstringStatusListEntry',\n      statusPurpose: 'suspension',\n      statusListIndex: '3',\n      statusListCredential: 'https://credentials.example.edu/status/9kGimd8POqM88l32F9aT'\n    }\n  ]\n}\n*/\n```\n\n**Note:** You can also call `allocateRevocationStatus(credential)` to achieve the same effect as `allocateStatus({ credential, statusPurposes: ['revocation'] })`, `allocateSuspensionStatus(credential)` to achieve the same effect as `allocateStatus({ credential, statusPurposes: ['suspension'] })`, and `allocateSupportedStatuses(credential)` to achieve the same effect as `allocateStatus({ credential, statusPurposes: ['revocation', 'suspension'] })`.\n\nAdditionally, if the caller invokes `allocateStatus` multiple times with the same credential ID against the same instance of a credential status manager, the library will not allocate a new entry. It will just return a credential with the same status info as it did in the previous invocation.\n\n### Update status of credential\n\n`updateStatus` is an instance method that is called on a credential status manager initialized by `createStatusManager`. It is an asynchronous method that accepts as input a credential ID, a status purpose (options: `revocation` | `suspension`), and whether to invalidate the status; records its new status in a previously configured database instance; and returns the status credential.\n\nHere is a sample call to `updateStatus`:\n\n```ts\nconst statusCredential = await statusManager.updateStatus({\n  credentialId: credentialWithStatus.id,\n  statusPurpose: 'revocation',\n  invalidate: true\n});\nconsole.log(statusCredential);\n/*\n{\n  '@context': [\n    'https://www.w3.org/ns/credentials/v2'\n  ],\n  id: 'https://credentials.example.edu/status/Uz42qSDSXTcoLH7kZ6ST',\n  type: [ 'VerifiableCredential', 'BitstringStatusListCredential' ],\n  credentialSubject: {\n    id: 'https://credentials.example.edu/status/Uz42qSDSXTcoLH7kZ6ST#list',\n    type: 'BitstringStatusList',\n    encodedList: 'H4sIAAAAAAAAA-3BMQ0AAAACIGf_0LbwAhoAAAAAAAAAAAAAAIC_AfqBUGnUMAAA',\n    statusPurpose: 'revocation'\n  },\n  issuer: 'did:key:z6MkhVTX9BF3NGYX6cc7jWpbNnR7cAjH8LUffabZP8Qu4ysC',\n  validFrom: '2024-03-10T00:00:00.000Z'\n}\n*/\n```\n\n**Note:** You can also call `revokeCredential(credentialId)` to achieve the same effect as `updateStatus({ credentialId, statusPurpose: 'revocation', invalidate: true })` and `suspendCredential(credentialId)` to achieve the same effect as `updateStatus({ credentialId, statusPurpose: 'suspension', invalidate: true })`. Also note that `unsuspendCredential(credentialId)` will lift a suspension from a credential, while there is no equivalent reversal logic for revocation, since it is not allowed.\n\n### Check status of credential\n\n`getStatus` is an instance method that is called on a credential status manager initialized by `createStatusManager`. It is an asynchronous method that accepts a credential ID as input and returns status information for the credential.\n\nHere is a sample call to `getStatus`:\n\n```ts\nconst credentialStatus = await statusManager.getStatus(credentialWithStatus.id);\nconsole.log(credentialStatus);\n/*\n{\n  revocation: {\n    statusCredentialId: 'Uz42qSDSXTcoLH7kZ6ST',\n    statusListIndex: 6,\n    valid: true\n  },\n  suspension: {\n    statusCredentialId: '9kGimd8POqM88l32F9aT',\n    statusListIndex: 3,\n    valid: false\n  }\n}\n*/\n```\n\n## Schemas\n\nThere is a lot of data that is managed by this service. In this section, we will outline the schemas for each database table maintained by a given deployment.\n\n### `StatusCredential`\n\n| Key | Description | Type |\n| --- | --- | --- |\n| `id` | ID of the status credential database record | string |\n| `credential` | Bitstring Status List Verifiable Credential | object ([BitstringStatusListCredential](https://www.w3.org/TR/vc-bitstring-status-list#bitstringstatuslistcredential)) |\n\n### `UserCredential`\n\n| Key | Description | Type |\n| --- | --- | --- |\n| `id` | ID of the user credential database record | string |\n| `issuer` | ID of the issuer of the credential | string |\n| `subject` | ID of the subject of the credential | string |\n| `statusInfo` | mapping from status purpose to status info | object |\n| `statusInfo[PURPOSE].statusCredentialId` | ID of the status credential associated with the credential for a given purpose | string |\n| `statusInfo[PURPOSE].statusListIndex` | position allocated on the status credential for the credential for a given purpose | number |\n| `statusInfo[PURPOSE].valid` | validity of the credential according to the status credential tracking its status for a given purpose | boolean |\n\n### `Config`\n\n| Key | Description | Type |\n| --- | --- | --- |\n| `id` | ID of the config database record | string |\n| `statusCredentialSiteOrigin` | base URL of status credentials managed by a given deployment | string |\n| `statusCredentialInfo` | mapping from status purpose to status credential info | object |\n| `statusCredentialInfo[PURPOSE].latestStatusCredentialId` | ID of the latest status credential to be created for a given purpose in a given deployment | string |\n| `statusCredentialInfo[PURPOSE].latestCredentialsIssuedCounter` | number of credentials issued against the latest status credential for a given purpose in a given deployment | number |\n| `statusCredentialInfo[PURPOSE].statusCredentialsCounter` | total number of status credentials for a given purpose in a given deployment | number |\n| `credentialsIssuedCounter` | total number of credentials issued in a given deployment | number |\n\n### `Event`\n\n| Key | Description | Type |\n| --- | --- | --- |\n| `id` | ID of the event database record | string |\n| `timestamp` | ISO timestamp of the moment that the event was recorded | string |\n| `credentialId` | ID of the credential associated with the event | string |\n| `statusPurpose` | name of the purpose of the credential status whose modification is being tracked by the event | `revocation` \\| `suspension` (see `statusPurpose` [here](https://www.w3.org/TR/vc-bitstring-status-list#bitstringstatuslistcredential)) |\n| `valid` | validity of the credential that is being applied by the event | boolean |\n\n### `CredentialEvent`\n\n| Key | Description | Type |\n| --- | --- | --- |\n| `credentialId` | ID of a previously issued credential database record | string |\n| `eventId` | ID of the latest status event database record for credential with ID `credentialId` | string |\n\n## Dependencies\n\n### Generate DID seeds\n\nIn order to generate a DID seed, you will need to use software that is capable of creating it in a format that corresponds to a valid DID document. Here is sample code that does this:\n\n```ts\nimport { generateSecretKeySeed } from '@digitalcredentials/bnid';\n\n// Set `didSeed` key to this value\nconst secretKeySeed = await generateSecretKeySeed();\n```\n\nIf `didMethod` = `web`, you must also generate a DID document and host it at `didWebUrl`/.well-known/did.json. Here is sample code that does this:\n\n```ts\nimport { decodeSecretKeySeed } from '@digitalcredentials/bnid';\nimport { Ed25519VerificationKey2020 } from '@digitalcredentials/ed25519-verification-key-2020';\nimport { X25519KeyAgreementKey2020 } from '@digitalcredentials/x25519-key-agreement-key-2020';\nimport * as DidWeb from '@interop/did-web-resolver';\nimport { CryptoLD } from '@digitalcredentials/crypto-ld';\n\nconst cryptoLd = new CryptoLD();\ncryptoLd.use(Ed25519VerificationKey2020);\ncryptoLd.use(X25519KeyAgreementKey2020);\nconst didWebDriver = DidWeb.driver({ cryptoLd });\n\nconst decodedSeed = decodeSecretKeySeed({secretKeySeed});\n\n// Host this document at `didWebUrl`/.well-known/did.json\nconst didWebUrl = 'https://example.edu';\nconst didDocument = didWebDriver.generate({ url: didWebUrl, seed: decodedSeed });\n```\n\n## Contribute\n\nPRs accepted.\n\nIf editing the Readme, please conform to the\n[standard-readme](https://github.com/RichardLitt/standard-readme) specification.\n\n## License\n\n[MIT License](LICENSE.md) © 2024 Digital Credentials Consortium.\n","readmeFilename":"README.md"}