@did-btcr2/method 0.29.0 → 0.33.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (115) hide show
  1. package/README.md +36 -16
  2. package/dist/.tsbuildinfo +1 -1
  3. package/dist/browser.js +6763 -6170
  4. package/dist/browser.mjs +6763 -6170
  5. package/dist/cjs/index.js +1860 -467
  6. package/dist/esm/core/aggregation/beacon-strategy.js +5 -4
  7. package/dist/esm/core/aggregation/beacon-strategy.js.map +1 -1
  8. package/dist/esm/core/aggregation/transport/factory.js +15 -6
  9. package/dist/esm/core/aggregation/transport/factory.js.map +1 -1
  10. package/dist/esm/core/aggregation/transport/http/client.js +350 -0
  11. package/dist/esm/core/aggregation/transport/http/client.js.map +1 -0
  12. package/dist/esm/core/aggregation/transport/http/envelope.js +126 -0
  13. package/dist/esm/core/aggregation/transport/http/envelope.js.map +1 -0
  14. package/dist/esm/core/aggregation/transport/http/errors.js +11 -0
  15. package/dist/esm/core/aggregation/transport/http/errors.js.map +1 -0
  16. package/dist/esm/core/aggregation/transport/http/inbox-buffer.js +45 -0
  17. package/dist/esm/core/aggregation/transport/http/inbox-buffer.js.map +1 -0
  18. package/dist/esm/core/aggregation/transport/http/index.js +12 -0
  19. package/dist/esm/core/aggregation/transport/http/index.js.map +1 -0
  20. package/dist/esm/core/aggregation/transport/http/nonce-cache.js +38 -0
  21. package/dist/esm/core/aggregation/transport/http/nonce-cache.js.map +1 -0
  22. package/dist/esm/core/aggregation/transport/http/protocol.js +28 -0
  23. package/dist/esm/core/aggregation/transport/http/protocol.js.map +1 -0
  24. package/dist/esm/core/aggregation/transport/http/rate-limiter.js +45 -0
  25. package/dist/esm/core/aggregation/transport/http/rate-limiter.js.map +1 -0
  26. package/dist/esm/core/aggregation/transport/http/request-auth.js +100 -0
  27. package/dist/esm/core/aggregation/transport/http/request-auth.js.map +1 -0
  28. package/dist/esm/core/aggregation/transport/http/server.js +481 -0
  29. package/dist/esm/core/aggregation/transport/http/server.js.map +1 -0
  30. package/dist/esm/core/aggregation/transport/http/sse-stream.js +110 -0
  31. package/dist/esm/core/aggregation/transport/http/sse-stream.js.map +1 -0
  32. package/dist/esm/core/aggregation/transport/http/sse-writer.js +25 -0
  33. package/dist/esm/core/aggregation/transport/http/sse-writer.js.map +1 -0
  34. package/dist/esm/core/aggregation/transport/index.js +1 -0
  35. package/dist/esm/core/aggregation/transport/index.js.map +1 -1
  36. package/dist/esm/core/beacon/beacon.js +197 -51
  37. package/dist/esm/core/beacon/beacon.js.map +1 -1
  38. package/dist/esm/core/beacon/cas-beacon.js +3 -3
  39. package/dist/esm/core/beacon/cas-beacon.js.map +1 -1
  40. package/dist/esm/core/beacon/singleton-beacon.js +3 -3
  41. package/dist/esm/core/beacon/singleton-beacon.js.map +1 -1
  42. package/dist/esm/core/beacon/smt-beacon.js +22 -14
  43. package/dist/esm/core/beacon/smt-beacon.js.map +1 -1
  44. package/dist/esm/core/resolver.js +7 -4
  45. package/dist/esm/core/resolver.js.map +1 -1
  46. package/dist/esm/core/updater.js +63 -55
  47. package/dist/esm/core/updater.js.map +1 -1
  48. package/dist/types/core/aggregation/beacon-strategy.d.ts.map +1 -1
  49. package/dist/types/core/aggregation/transport/factory.d.ts +22 -7
  50. package/dist/types/core/aggregation/transport/factory.d.ts.map +1 -1
  51. package/dist/types/core/aggregation/transport/http/client.d.ts +48 -0
  52. package/dist/types/core/aggregation/transport/http/client.d.ts.map +1 -0
  53. package/dist/types/core/aggregation/transport/http/envelope.d.ts +64 -0
  54. package/dist/types/core/aggregation/transport/http/envelope.d.ts.map +1 -0
  55. package/dist/types/core/aggregation/transport/http/errors.d.ts +9 -0
  56. package/dist/types/core/aggregation/transport/http/errors.d.ts.map +1 -0
  57. package/dist/types/core/aggregation/transport/http/inbox-buffer.d.ts +32 -0
  58. package/dist/types/core/aggregation/transport/http/inbox-buffer.d.ts.map +1 -0
  59. package/dist/types/core/aggregation/transport/http/index.d.ts +12 -0
  60. package/dist/types/core/aggregation/transport/http/index.d.ts.map +1 -0
  61. package/dist/types/core/aggregation/transport/http/nonce-cache.d.ts +26 -0
  62. package/dist/types/core/aggregation/transport/http/nonce-cache.d.ts.map +1 -0
  63. package/dist/types/core/aggregation/transport/http/protocol.d.ts +53 -0
  64. package/dist/types/core/aggregation/transport/http/protocol.d.ts.map +1 -0
  65. package/dist/types/core/aggregation/transport/http/rate-limiter.d.ts +41 -0
  66. package/dist/types/core/aggregation/transport/http/rate-limiter.d.ts.map +1 -0
  67. package/dist/types/core/aggregation/transport/http/request-auth.d.ts +50 -0
  68. package/dist/types/core/aggregation/transport/http/request-auth.d.ts.map +1 -0
  69. package/dist/types/core/aggregation/transport/http/server.d.ts +110 -0
  70. package/dist/types/core/aggregation/transport/http/server.d.ts.map +1 -0
  71. package/dist/types/core/aggregation/transport/http/sse-stream.d.ts +34 -0
  72. package/dist/types/core/aggregation/transport/http/sse-stream.d.ts.map +1 -0
  73. package/dist/types/core/aggregation/transport/http/sse-writer.d.ts +12 -0
  74. package/dist/types/core/aggregation/transport/http/sse-writer.d.ts.map +1 -0
  75. package/dist/types/core/aggregation/transport/index.d.ts +1 -0
  76. package/dist/types/core/aggregation/transport/index.d.ts.map +1 -1
  77. package/dist/types/core/aggregation/transport/transport.d.ts +1 -1
  78. package/dist/types/core/aggregation/transport/transport.d.ts.map +1 -1
  79. package/dist/types/core/beacon/beacon.d.ts +72 -12
  80. package/dist/types/core/beacon/beacon.d.ts.map +1 -1
  81. package/dist/types/core/beacon/cas-beacon.d.ts +3 -3
  82. package/dist/types/core/beacon/cas-beacon.d.ts.map +1 -1
  83. package/dist/types/core/beacon/singleton-beacon.d.ts +3 -3
  84. package/dist/types/core/beacon/singleton-beacon.d.ts.map +1 -1
  85. package/dist/types/core/beacon/smt-beacon.d.ts +3 -3
  86. package/dist/types/core/beacon/smt-beacon.d.ts.map +1 -1
  87. package/dist/types/core/interfaces.d.ts +14 -11
  88. package/dist/types/core/interfaces.d.ts.map +1 -1
  89. package/dist/types/core/resolver.d.ts.map +1 -1
  90. package/dist/types/core/updater.d.ts +27 -12
  91. package/dist/types/core/updater.d.ts.map +1 -1
  92. package/package.json +20 -8
  93. package/src/core/aggregation/beacon-strategy.ts +5 -4
  94. package/src/core/aggregation/transport/factory.ts +48 -12
  95. package/src/core/aggregation/transport/http/client.ts +409 -0
  96. package/src/core/aggregation/transport/http/envelope.ts +204 -0
  97. package/src/core/aggregation/transport/http/errors.ts +11 -0
  98. package/src/core/aggregation/transport/http/inbox-buffer.ts +53 -0
  99. package/src/core/aggregation/transport/http/index.ts +11 -0
  100. package/src/core/aggregation/transport/http/nonce-cache.ts +43 -0
  101. package/src/core/aggregation/transport/http/protocol.ts +57 -0
  102. package/src/core/aggregation/transport/http/rate-limiter.ts +75 -0
  103. package/src/core/aggregation/transport/http/request-auth.ts +164 -0
  104. package/src/core/aggregation/transport/http/server.ts +615 -0
  105. package/src/core/aggregation/transport/http/sse-stream.ts +121 -0
  106. package/src/core/aggregation/transport/http/sse-writer.ts +23 -0
  107. package/src/core/aggregation/transport/index.ts +1 -0
  108. package/src/core/aggregation/transport/transport.ts +1 -1
  109. package/src/core/beacon/beacon.ts +255 -64
  110. package/src/core/beacon/cas-beacon.ts +4 -4
  111. package/src/core/beacon/singleton-beacon.ts +4 -4
  112. package/src/core/beacon/smt-beacon.ts +24 -16
  113. package/src/core/interfaces.ts +14 -11
  114. package/src/core/resolver.ts +8 -5
  115. package/src/core/updater.ts +113 -67
package/README.md CHANGED
@@ -1,6 +1,6 @@
1
1
  # @did-btcr2/method
2
2
 
3
- TypeScript reference implementation of the [did:btcr2 DID Method](https://dcdpr.github.io/did-btcr2/) a censorship-resistant Decentralized Identifier method using Bitcoin as a verifiable data registry.
3
+ TypeScript reference implementation of the [did:btcr2 DID Method](https://dcdpr.github.io/did-btcr2/): a censorship-resistant Decentralized Identifier method using Bitcoin as a verifiable data registry.
4
4
 
5
5
  This package is the core of the `did-btcr2-js` monorepo. It implements DID create/resolve/update operations, the three beacon types (Singleton, CAS, SMT), multi-party aggregation over MuSig2, and a pluggable transport layer for peer-to-peer coordination.
6
6
 
@@ -16,12 +16,13 @@ pnpm add @did-btcr2/method
16
16
  |---|---|
17
17
  | Create a DID (offline, deterministic or external) | `DidBtcr2.create()` |
18
18
  | Resolve a DID (sans-I/O state machine) | `DidBtcr2.resolve()` |
19
- | Update a DID (sans-I/O state machine) | `DidBtcr2.update()` `Updater` |
19
+ | Update a DID (sans-I/O state machine) | `DidBtcr2.update()` returns an `Updater` |
20
20
  | Update utilities (construct, sign, announce) | `Updater.construct()`, `Updater.sign()`, `Updater.announce()` |
21
21
  | Beacon types (Singleton, CAS, SMT) | `SingletonBeacon`, `CASBeacon`, `SMTBeacon` |
22
22
  | Fee estimation (pluggable) | `FeeEstimator`, `StaticFeeEstimator` |
23
23
  | Multi-party aggregation (MuSig2) | `AggregationServiceRunner`, `AggregationParticipantRunner` |
24
- | Transport abstraction (Nostr, DIDComm stub) | `Transport`, `NostrTransport` |
24
+ | Transport abstraction (Nostr, HTTP/REST, DIDComm stub) | `Transport`, `NostrTransport`, `HttpClientTransport`, `HttpServerTransport` |
25
+ | Signer abstraction (local key, KMS, custom) | `Signer` / `LocalSigner` from `@did-btcr2/keypair`; `KeyManagerSigner` from `@did-btcr2/key-manager` |
25
26
  | DID document types and builders | `Btcr2DidDocument`, `DidDocumentBuilder` |
26
27
 
27
28
  ## Quick Start
@@ -32,7 +33,7 @@ pnpm add @did-btcr2/method
32
33
  import { DidBtcr2 } from '@did-btcr2/method';
33
34
  import { SchnorrKeyPair } from '@did-btcr2/keypair';
34
35
 
35
- // Deterministic (k-type) the identifier IS the public key
36
+ // Deterministic (k-type): the identifier IS the public key
36
37
  const keys = SchnorrKeyPair.generate();
37
38
  const did = DidBtcr2.create(keys.publicKey.compressed, {
38
39
  idType : 'KEY',
@@ -66,10 +67,17 @@ See [`src/core/resolver.ts`](./src/core/resolver.ts) for the full `DataNeed` uni
66
67
 
67
68
  ### Update a DID
68
69
 
69
- `DidBtcr2.update()` returns a sans-I/O state machine the counterpart to the Resolver. The caller drives the update by fulfilling typed data needs (signing key, funding confirmation, broadcast).
70
+ `DidBtcr2.update()` returns a sans-I/O state machine: the counterpart to the Resolver. The caller drives the update by fulfilling typed data needs (signing key, funding confirmation, broadcast).
70
71
 
71
72
  ```typescript
72
73
  import { DidBtcr2, Updater } from '@did-btcr2/method';
74
+ import { LocalSigner } from '@did-btcr2/keypair';
75
+ import { BitcoinConnection } from '@did-btcr2/bitcoin';
76
+
77
+ // Build a Signer from a raw secret key. For KMS-backed keys use KeyManagerSigner
78
+ // from '@did-btcr2/key-manager' instead.
79
+ const signer = new LocalSigner(secretKeyBytes);
80
+ const bitcoin = BitcoinConnection.forNetwork('mutinynet');
73
81
 
74
82
  const updater = DidBtcr2.update({
75
83
  sourceDocument,
@@ -84,14 +92,14 @@ while (state.status === 'action-required') {
84
92
  for (const need of state.needs) {
85
93
  switch (need.kind) {
86
94
  case 'NeedSigningKey':
87
- updater.provide(need, secretKeyBytes);
95
+ updater.provide(need, signer);
88
96
  break;
89
97
  case 'NeedFunding':
90
98
  // Check UTXOs at need.beaconAddress, fund if needed
91
99
  updater.provide(need);
92
100
  break;
93
101
  case 'NeedBroadcast':
94
- await Updater.announce(need.beaconService, need.signedUpdate, secretKey, bitcoin);
102
+ await Updater.announce(need.beaconService, need.signedUpdate, signer, bitcoin);
95
103
  updater.provide(need);
96
104
  break;
97
105
  }
@@ -109,9 +117,16 @@ See [`src/core/updater.ts`](./src/core/updater.ts) for the full `UpdaterDataNeed
109
117
  Aggregation lets multiple DID controllers coordinate a single Bitcoin transaction that announces all of their updates at once, signed n-of-n with MuSig2. The high-level `Runner` API hides the message routing and decision plumbing:
110
118
 
111
119
  ```typescript
112
- import { AggregationServiceRunner, NostrTransport } from '@did-btcr2/method';
120
+ import { AggregationServiceRunner, TransportFactory } from '@did-btcr2/method';
121
+
122
+ // Pick a transport. Nostr (relay-based) or HTTP/REST (operator-hosted).
123
+ const transport = TransportFactory.establish({
124
+ type : 'nostr',
125
+ relays : ['wss://relay.damus.io'],
126
+ });
127
+ // Or for HTTP: { type: 'http', role: 'server' } on the operator side,
128
+ // { type: 'http', role: 'client', baseUrl: '...' } on the participant side.
113
129
 
114
- const transport = new NostrTransport({ relays: ['wss://relay.damus.io'] });
115
130
  transport.registerActor(serviceDid, serviceKeys);
116
131
  transport.start();
117
132
 
@@ -127,13 +142,13 @@ runner.on('signing-complete', (result) => console.log('done'));
127
142
  const result = await runner.run();
128
143
  ```
129
144
 
130
- The full step-by-step protocol walkthrough service flow, participant flow, decision callbacks, events, the low-level state machine API, and production deployment notes is in [`docs/aggregation.md`](./docs/aggregation.md).
145
+ The full step-by-step protocol walkthrough (service flow, participant flow, decision callbacks, events, the low-level state machine API, and production deployment notes) is in [`docs/aggregation.md`](./docs/aggregation.md). The HTTP/REST transport has its own walkthrough in [`docs/http-transport.md`](./docs/http-transport.md).
131
146
 
132
147
  ## Architecture Principles
133
148
 
134
149
  - **Sans-I/O core.** Resolver, Updater, and aggregation state machines perform zero I/O. They compute state transitions and emit typed needs or messages. Callers handle all network operations.
135
150
  - **Layered APIs.** High-level facades (like `AggregationServiceRunner`) encapsulate boilerplate; low-level state machines stay available for tests, custom transports, and fine-grained control.
136
- - **Pluggable transport.** The `Transport` interface decouples protocol logic from the wire format. Ships with `NostrTransport`; add your own for DIDComm, libp2p, or anything else.
151
+ - **Pluggable transport.** The `Transport` interface decouples protocol logic from the wire format. Ships with `NostrTransport` (relay-based) and `HttpClientTransport` + `HttpServerTransport` (HTTP/REST, framework-agnostic, browser-compatible). Add your own for DIDComm, libp2p, or anything else.
137
152
  - **Browser-compatible.** All code targets both Node.js (>= 22) and modern browsers. No Node-only APIs in the core.
138
153
 
139
154
  ## Build & Test
@@ -150,8 +165,13 @@ Tests run from compiled JS, so run `pnpm build:tests` before `pnpm test` after a
150
165
 
151
166
  ## Documentation
152
167
 
153
- - **Package docs on btcr2.dev** [btcr2.dev/impls/ts](https://btcr2.dev/impls/ts)
154
- - **[`docs/beacon-system-overview.md`](./docs/beacon-system-overview.md)** Beacon architecture, Singleton / CAS / SMT behavior, signal discovery
155
- - **[`docs/aggregation.md`](./docs/aggregation.md)** Multi-party aggregation protocol, Runner and state machine APIs, e2e examples
156
- - **[`docs/test-vectors.md`](./docs/test-vectors.md)** CLI tool for generating did:btcr2 test vectors via a stepped workflow
157
- - **Source reference** — See JSDoc comments on public classes; the most important entry points are `DidBtcr2` (facade), `Resolver` (read path), `Updater` (write path), and the aggregation runners.
168
+ - **Package docs on btcr2.dev** [btcr2.dev/impls/ts](https://btcr2.dev/impls/ts)
169
+ - **[`docs/beacon-system-overview.md`](./docs/beacon-system-overview.md)** Beacon architecture, Singleton / CAS / SMT behavior, signal discovery
170
+ - **[`docs/aggregation.md`](./docs/aggregation.md)** Multi-party aggregation protocol, Runner and state machine APIs, e2e examples
171
+ - **[`docs/http-transport.md`](./docs/http-transport.md)** HTTP/REST transport: wire protocol, signed envelopes, SSE subscriptions, Hono/Node framework mount example, permissive CORS
172
+ - **[`docs/test-vectors.md`](./docs/test-vectors.md)** CLI tool for generating did:btcr2 test vectors via a stepped workflow
173
+ - **Source reference** See JSDoc comments on public classes; the most important entry points are `DidBtcr2` (facade), `Resolver` (read path), `Updater` (write path), and the aggregation runners.
174
+
175
+ ## License
176
+
177
+ [MPL-2.0](https://github.com/dcdpr/did-btcr2-js/blob/main/LICENSE)