@digitalbazaar/edv-client

中文文档
16.3.0发布于 2025/09/18BSD-3-ClauseES Module近 30 天下载 2307

JavaScript Encrypted Data Vault

原始使用文档
文档目录11 节
  1. Table of Contents
  2. Background
  3. Install
  4. Usage
  5. Creating and registering an Encrypted Data Vault (EDV)
  6. Loading a saved EDV config
  7. Using a EdvClient instance for document storage
  8. API
  9. EdvClient
  10. Contribute
  11. License

JavaScript Encrypted Data Vault Client (@digitalbazaar/edv-client)

A JavaScript library for Web and node.js apps for interfacing with a remote Encrypted Data Vault server

Table of Contents

Background

This library provides a client that Web and node.js apps can use to interface with remote Encrypted Data Vault (EDV) servers.

It consists of one main class:

  • EdvClient - instances provide a CRUD (+ find) interface to a specific configured Encrypted Data Vault server and ensure appropriate database indexes are set up. Static methods allow for the creation of EDVs with a remote storage service, e.g. Encrypted Data Vault storage servers.

Encrypted Data Vault storage servers:

Install

  • Browsers and Node.js 18+ are supported.
  • Streams API required. Older browsers must use a polyfill.
  • Web Crypto API required. Older browsers must use a polyfill.

To install from NPM:

npm install @digitalbazaar/edv-client

To install locally (for development):

git clone https://github.com/digitalbazaar/edv-client.git
cd edv-client
npm install

Usage

Creating and registering an Encrypted Data Vault (EDV)

First, create a key agreement key and an HMAC (hash-based message authentication code) key for encrypting your documents and blinding any indexed attributes in them. This requires creating some cryptographic key material which can be done locally or via a KMS system. The current example shows using a KMS system (TODO: show a simpler local example):

import {CapabilityAgent, KeystoreAgent, KmsClient} from 'webkms-client';
import {EdvClient} from 'edv-client';

Although Encrypted Data Vaults are not bound to any particular key management system, we recommend that you set up a Key Management Service using an implementation such as webkms-switch which you can connect to using webkms-client.

Optional:

// create a CapabilityAgent (for invoking zcaps)
const capabilityAgent = await CapabilityAgent.fromSecret({secret, handle});

// create a keystore and an agent for working with it
// the baseUrl can be set to a dev API or production API
const kmsBaseUrl = `${config.server.baseUri}/kms`;
const keystore = KmsClient.createKeystore({
  // the url for the keystore is configurable
  url: `${kmsBaseUrl}/keystores`,
  config: {
    // on init the sequence must be 0
    sequence: 0,
    controller: capabilityAgent.id,
    invoker: capabilityAgent.id,
    // this allows the capabilityAgent to delegate zCaps
    delegator: capabilityAgent.id
  },
  /**
   * optional `httpsAgent`,
   * usually not applicable for front-end (you may use axios),
   * for back-end use cases a nodejs `https.Agent`
   * may be used to allow the use of self signed certificates using
   * the `rejectUnauthorized: false` flag in the contructor.
  */
  httpsAgent
});
const keystoreAgent = new KeystoreAgent({keystore, capabilityAgent});

// use the keystore agent to create key agreement and HMAC keys
const keyAgreementKey = await keystoreAgent.generateKey({type: 'keyAgreement'});
const hmac = await keystoreAgent.generateKey({type: 'hmac'});

Now you can create and register a new EDV configuration:

// TODO: explain EDV service must be able to authenticate user
const controller = 'account id goes here';

const config = {
  // on init the sequence must be 0 and is required
  sequence: 0,
  controller,
  // TODO: Explain what 'referenceId' is
  referenceId: 'primary',
  keyAgreementKey: {id: keyAgreementKey.id, type: keyAgreementKey.type},
  hmac: {id: hmac.id, type: hmac.type}
};

// sends a POST request to the remote service to create an EDV
const remoteConfig = await EdvClient.createEdv({config});

// connect to the new EDV via a `EdvClient`
const client = new EdvClient({id: remoteConfig.id, keyAgreementKey, hmac});
// to only use fips-compliant key agreement and encryption algorithms:
const client = new EdvClient(
  {id: remoteConfig.id, keyAgreementKey, hmac, cipherVersion: 'fips'});

You can specify a url when you create and register a new EDV configuration:

// TODO: explain EDV service must be able to authenticate user
const controller = 'account id (or DID if using zcaps) goes here';

const config = {
  // on init the sequence must be 0 and is required
  sequence: 0,
  controller,
  // TODO: Explain what 'referenceId' is
  referenceId: 'primary',
  keyAgreementKey: {id: keyAgreementKey.id, type: keyAgreementKey.type},
  hmac: {id: hmac.id, type: hmac.type}
};

// sends a POST request to the remote service to create an EDV
const remoteConfig = await EdvClient.createEdv({
  url: 'https://server.example/edvs',
  config,
  // must pass `invocationSigner` and optional `capability` if `controller`
  // is a DID
  /* invocationSigner, capability */
});

// connect to the new EDV via a `EdvClient`
const client = new EdvClient({id: remoteConfig.id, keyAgreementKey, hmac});

Loading a saved EDV config

If you have previously registered an EDV config (via createEdv()), and you know its id, you can fetch its config via get():

// registered config
const {id} = await EdvClient.createEdv({config});

// later, it can be fetched via the id
const remoteConfig = await EdvClient.getConfig({id});

// connect to the existing EDV via an `EdvClient` instance
const client = new EdvClient({id: remoteConfig.id, keyAgreementKey, hmac});

If you know a controller/accountId but do not know a specific EDV id, you can create a client for an EDV by a controller-scoped custom referenceId:

// get the account's 'primary' EDV config to connect to the EDV
// note that a referenceId can be any string but must be unique per controller
const config = await EdvClient.findConfig(
  {controller: accountId, referenceId: 'primary'});
const client = new EdvClient({id: config.id, keyAgreementKey, hmac});

Using a EdvClient instance for document storage

See the API section below.

API

EdvClient

constructor

insert

get

update

delete

find

ensureIndex

updateIndex

Contribute

Please follow the existing code style.

PRs accepted.

If editing the Readme, please conform to the standard-readme specification.

License

BSD-3-Clause Copyright 2019-2025 Digital Bazaar, Inc.

Commercial support is available by contacting Digital Bazaar [email protected].

版本与发布记录

@digitalbazaar/edv-client 共发布 23 个版本,首次发布于 2022/01/12;过去 12 个月发布了 0 个版本。

版本发布日期距今
16.3.0latest2025/09/181.2 年前
16.2.02025/09/121.2 年前
16.1.02023/11/073 年前
16.0.12023/11/063 年前
16.0.02023/09/153 年前
15.0.22022/08/184 年前

关于 @digitalbazaar/edv-client 的常见问题

@digitalbazaar/edv-client 是什么?

JavaScript Encrypted Data Vault

如何安装 @digitalbazaar/edv-client?

在项目目录运行 npm install @digitalbazaar/edv-client,或使用 pnpm add / yarn add / bun add。

@digitalbazaar/edv-client 支持 TypeScript 吗?

该包的 package.json 没有声明类型入口。需要类型提示时,可以在 npm 上查找社区维护的 @types/digitalbazaar__edv-client 是否存在。

@digitalbazaar/edv-client 支持 ESM 还是 CommonJS?

以 ES Module 形式发布,推荐使用 import 引入。在 CommonJS 项目中,Node.js 20.19+ / 22.12+ 可以直接 require() 不含顶层 await 的 ES Module,更早的版本需要改用动态 import()。

@digitalbazaar/edv-client 需要什么版本的 Node.js?

package.json 的 engines 字段要求 Node.js >=18。版本不符时 npm 默认只给出警告,开启 engine-strict 后会拒绝安装。

@digitalbazaar/edv-client 可以商用吗?

@digitalbazaar/edv-client 使用 BSD-3-Clause 许可。宽松许可:允许商业使用、修改和再分发,通常只需在分发时保留原版权与许可声明。另外不得用原作者名义为衍生产品背书。以上为概括,不构成法律意见,请以许可原文为准。

@digitalbazaar/edv-client 的下载量有多少?

根据 npm 官方下载统计,@digitalbazaar/edv-client 在 2026/10/12 – 2026/11/10 这 30 天内被下载 2,307 次,日均约 77 次。下载量会把 CI 构建、镜像同步和作为其他包依赖的安装一并计入,适合横向比较热度,不能直接等同于使用人数。

@digitalbazaar/edv-client 还在维护吗?

最新版本 16.3.0 发布于 2025/09/18(1.2 年前);至今共发布 23 个版本,其中过去 12 个月发布了 0 个;首次发布于 2022/01/12。发布频率只是参考信号:功能稳定的工具可能很少需要更新,建议结合源码仓库的 issue 和提交记录判断。