@did-btcr2/method 0.24.1 → 0.25.2

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 (101) hide show
  1. package/dist/browser.js +1541 -26561
  2. package/dist/browser.mjs +1541 -26561
  3. package/dist/cjs/core/beacon/aggregation/cohort/index.js +2 -1
  4. package/dist/cjs/core/beacon/aggregation/cohort/index.js.map +1 -1
  5. package/dist/cjs/core/beacon/aggregation/communication/adapter/nostr.js +3 -2
  6. package/dist/cjs/core/beacon/aggregation/communication/adapter/nostr.js.map +1 -1
  7. package/dist/cjs/core/beacon/aggregation/coordinator.js +2 -1
  8. package/dist/cjs/core/beacon/aggregation/coordinator.js.map +1 -1
  9. package/dist/cjs/core/beacon/aggregation/participant.js +3 -2
  10. package/dist/cjs/core/beacon/aggregation/participant.js.map +1 -1
  11. package/dist/cjs/core/beacon/beacon.js.map +1 -1
  12. package/dist/cjs/core/beacon/cas-beacon.js +120 -7
  13. package/dist/cjs/core/beacon/cas-beacon.js.map +1 -1
  14. package/dist/cjs/core/beacon/factory.js +1 -1
  15. package/dist/cjs/core/beacon/factory.js.map +1 -1
  16. package/dist/cjs/core/beacon/signal-discovery.js +1 -1
  17. package/dist/cjs/core/beacon/signal-discovery.js.map +1 -1
  18. package/dist/cjs/core/beacon/{singleton.js → singleton-beacon.js} +20 -27
  19. package/dist/cjs/core/beacon/singleton-beacon.js.map +1 -0
  20. package/dist/cjs/core/beacon/smt-beacon.js +1 -1
  21. package/dist/cjs/core/beacon/smt-beacon.js.map +1 -1
  22. package/dist/{esm/core/resolve.js → cjs/core/resolver.js} +241 -93
  23. package/dist/cjs/core/resolver.js.map +1 -0
  24. package/dist/cjs/core/update.js +5 -5
  25. package/dist/cjs/core/update.js.map +1 -1
  26. package/dist/cjs/did-btcr2.js +39 -96
  27. package/dist/cjs/did-btcr2.js.map +1 -1
  28. package/dist/cjs/index.js +2 -2
  29. package/dist/cjs/index.js.map +1 -1
  30. package/dist/esm/core/beacon/aggregation/cohort/index.js +2 -1
  31. package/dist/esm/core/beacon/aggregation/cohort/index.js.map +1 -1
  32. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js +3 -2
  33. package/dist/esm/core/beacon/aggregation/communication/adapter/nostr.js.map +1 -1
  34. package/dist/esm/core/beacon/aggregation/coordinator.js +2 -1
  35. package/dist/esm/core/beacon/aggregation/coordinator.js.map +1 -1
  36. package/dist/esm/core/beacon/aggregation/participant.js +3 -2
  37. package/dist/esm/core/beacon/aggregation/participant.js.map +1 -1
  38. package/dist/esm/core/beacon/beacon.js.map +1 -1
  39. package/dist/esm/core/beacon/cas-beacon.js +120 -7
  40. package/dist/esm/core/beacon/cas-beacon.js.map +1 -1
  41. package/dist/esm/core/beacon/factory.js +1 -1
  42. package/dist/esm/core/beacon/factory.js.map +1 -1
  43. package/dist/esm/core/beacon/signal-discovery.js +1 -1
  44. package/dist/esm/core/beacon/signal-discovery.js.map +1 -1
  45. package/dist/esm/core/beacon/{singleton.js → singleton-beacon.js} +20 -27
  46. package/dist/esm/core/beacon/singleton-beacon.js.map +1 -0
  47. package/dist/esm/core/beacon/smt-beacon.js +1 -1
  48. package/dist/esm/core/beacon/smt-beacon.js.map +1 -1
  49. package/dist/{cjs/core/resolve.js → esm/core/resolver.js} +241 -93
  50. package/dist/esm/core/resolver.js.map +1 -0
  51. package/dist/esm/core/update.js +5 -5
  52. package/dist/esm/core/update.js.map +1 -1
  53. package/dist/esm/did-btcr2.js +39 -96
  54. package/dist/esm/did-btcr2.js.map +1 -1
  55. package/dist/esm/index.js +2 -2
  56. package/dist/esm/index.js.map +1 -1
  57. package/dist/types/core/beacon/aggregation/cohort/index.d.ts.map +1 -1
  58. package/dist/types/core/beacon/aggregation/communication/adapter/nostr.d.ts.map +1 -1
  59. package/dist/types/core/beacon/aggregation/coordinator.d.ts.map +1 -1
  60. package/dist/types/core/beacon/aggregation/participant.d.ts.map +1 -1
  61. package/dist/types/core/beacon/beacon.d.ts +9 -4
  62. package/dist/types/core/beacon/beacon.d.ts.map +1 -1
  63. package/dist/types/core/beacon/cas-beacon.d.ts +26 -7
  64. package/dist/types/core/beacon/cas-beacon.d.ts.map +1 -1
  65. package/dist/types/core/beacon/{singleton.d.ts → singleton-beacon.d.ts} +7 -5
  66. package/dist/types/core/beacon/singleton-beacon.d.ts.map +1 -0
  67. package/dist/types/core/beacon/smt-beacon.d.ts +4 -3
  68. package/dist/types/core/beacon/smt-beacon.d.ts.map +1 -1
  69. package/dist/types/core/interfaces.d.ts +5 -15
  70. package/dist/types/core/interfaces.d.ts.map +1 -1
  71. package/dist/types/core/resolver.d.ts +167 -0
  72. package/dist/types/core/resolver.d.ts.map +1 -0
  73. package/dist/types/core/update.d.ts +3 -3
  74. package/dist/types/core/update.d.ts.map +1 -1
  75. package/dist/types/did-btcr2.d.ts +16 -16
  76. package/dist/types/did-btcr2.d.ts.map +1 -1
  77. package/dist/types/index.d.ts +2 -2
  78. package/dist/types/index.d.ts.map +1 -1
  79. package/package.json +5 -6
  80. package/src/core/beacon/aggregation/cohort/index.ts +2 -1
  81. package/src/core/beacon/aggregation/communication/adapter/nostr.ts +3 -2
  82. package/src/core/beacon/aggregation/coordinator.ts +2 -1
  83. package/src/core/beacon/aggregation/participant.ts +3 -2
  84. package/src/core/beacon/beacon.ts +9 -5
  85. package/src/core/beacon/cas-beacon.ts +157 -10
  86. package/src/core/beacon/factory.ts +1 -1
  87. package/src/core/beacon/signal-discovery.ts +1 -1
  88. package/src/core/beacon/{singleton.ts → singleton-beacon.ts} +21 -36
  89. package/src/core/beacon/smt-beacon.ts +4 -3
  90. package/src/core/interfaces.ts +5 -16
  91. package/src/core/{resolve.ts → resolver.ts} +355 -130
  92. package/src/core/update.ts +7 -7
  93. package/src/did-btcr2.ts +42 -132
  94. package/src/index.ts +2 -2
  95. package/dist/cjs/core/beacon/singleton.js.map +0 -1
  96. package/dist/cjs/core/resolve.js.map +0 -1
  97. package/dist/esm/core/beacon/singleton.js.map +0 -1
  98. package/dist/esm/core/resolve.js.map +0 -1
  99. package/dist/types/core/beacon/singleton.d.ts.map +0 -1
  100. package/dist/types/core/resolve.d.ts +0 -93
  101. package/dist/types/core/resolve.d.ts.map +0 -1
@@ -1,25 +1,81 @@
1
1
  import { getNetwork } from '@did-btcr2/bitcoin';
2
- import { canonicalHash, canonicalize, DateUtils, IdentifierHrp, INVALID_DID, INVALID_DID_DOCUMENT, INVALID_DID_UPDATE, JSONPatch, JSONUtils, LATE_PUBLISHING_ERROR, MISSING_UPDATE_DATA, ResolveError } from '@did-btcr2/common';
2
+ import { canonicalHash, canonicalize, DateUtils, encode as encodeHash, decode as decodeHash, INVALID_DID_DOCUMENT, INVALID_DID_UPDATE, JSONPatch, JSONUtils, LATE_PUBLISHING_ERROR, ResolveError } from '@did-btcr2/common';
3
3
  import { BIP340Cryptosuite, BIP340DataIntegrityProof, SchnorrMultikey } from '@did-btcr2/cryptosuite';
4
4
  import { CompressedSecp256k1PublicKey } from '@did-btcr2/keypair';
5
- import { hex } from '@scure/base';
6
5
  import { DidBtcr2 } from '../did-btcr2.js';
7
6
  import { Appendix } from '../utils/appendix.js';
8
7
  import { DidDocument, ID_PLACEHOLDER_VALUE } from '../utils/did-document.js';
9
8
  import { BeaconFactory } from './beacon/factory.js';
10
- import { BeaconSignalDiscovery } from './beacon/signal-discovery.js';
11
9
  import { BeaconUtils } from './beacon/utils.js';
12
10
  import { Identifier } from './identifier.js';
13
11
  /**
14
- * Implements {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html | 7.2 Resolve}.
15
- * Resolving a did:btcr2 identifier iteratively builds a DID document by applying BTCR2 Updates
16
- * to an Initial DID Document that have been committed to the Bitcoin blockchain by Authorized
17
- * Beacon Signals. The Initial DID Document is either deterministically created from the DID or
18
- * provided by Sidecar Data.
19
- * @class Resolve
20
- * @type {Resolve}
12
+ * Different possible Resolver states representing phases in the resolution process.
21
13
  */
22
- export class Resolve {
14
+ var ResolverPhase;
15
+ (function (ResolverPhase) {
16
+ ResolverPhase["GenesisDocument"] = "GenesisDocument";
17
+ ResolverPhase["BeaconDiscovery"] = "BeaconDiscovery";
18
+ ResolverPhase["BeaconProcess"] = "BeaconProcess";
19
+ ResolverPhase["ApplyUpdates"] = "ApplyUpdates";
20
+ ResolverPhase["Complete"] = "Complete";
21
+ })(ResolverPhase || (ResolverPhase = {}));
22
+ /**
23
+ * Sans-I/O state machine for did:btcr2 resolution.
24
+ *
25
+ * Created by {@link DidBtcr2.resolve} (the factory). The caller drives resolution
26
+ * by repeatedly calling {@link resolve} and {@link provide}:
27
+ *
28
+ * ```typescript
29
+ * const resolver = DidBtcr2.resolve(did, { sidecar });
30
+ * let state = resolver.resolve();
31
+ *
32
+ * while (state.status === 'action-required') {
33
+ * for (const need of state.needs) { ... fetch & provide ... }
34
+ * state = resolver.resolve();
35
+ * }
36
+ * const { didDocument, metadata } = state.result;
37
+ * ```
38
+ *
39
+ * The Resolver performs **zero I/O**. All external data (Bitcoin signals, CAS
40
+ * data, genesis documents) flows through the advance/provide protocol.
41
+ *
42
+ * @class Resolver
43
+ */
44
+ export class Resolver {
45
+ // --- Immutable inputs ---
46
+ #didComponents;
47
+ #versionId;
48
+ #versionTime;
49
+ /**
50
+ * The specific phase the Resolver is current in.
51
+ */
52
+ #phase;
53
+ #sidecarData;
54
+ #currentDocument;
55
+ #providedGenesisDocument = null;
56
+ #beaconServicesSignals = new Map();
57
+ #processedServices = new Set();
58
+ #requestCache = new Set();
59
+ #unsortedUpdates = [];
60
+ #resolvedResponse = null;
61
+ /**
62
+ * @internal — Use {@link DidBtcr2.resolve} to create instances.
63
+ */
64
+ constructor(didComponents, sidecarData, currentDocument, options) {
65
+ this.#didComponents = didComponents;
66
+ this.#sidecarData = sidecarData;
67
+ this.#currentDocument = currentDocument;
68
+ this.#versionId = options?.versionId;
69
+ this.#versionTime = options?.versionTime;
70
+ // If a genesis document was provided (from sidecar), pre-seed it for validation
71
+ if (options?.genesisDocument) {
72
+ this.#providedGenesisDocument = options.genesisDocument;
73
+ }
74
+ // If current document was established by the factory, skip GenesisDocument phase
75
+ this.#phase = currentDocument
76
+ ? ResolverPhase.BeaconDiscovery
77
+ : ResolverPhase.GenesisDocument;
78
+ }
23
79
  /**
24
80
  * Implements subsection {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html#if-genesis_bytes-is-a-secp256k1-public-key | 7.2.d.1 if genesis bytes is a secp256k1 Public Key}.
25
81
  * @param {DidComponents} didComponents The decoded components of the did.
@@ -27,11 +83,11 @@ export class Resolve {
27
83
  */
28
84
  static deterministic(didComponents) {
29
85
  // Deconstruct the bytes from the given components
30
- const { genesisBytes } = didComponents;
86
+ const genesisBytes = didComponents.genesisBytes;
31
87
  // Encode the did from the didComponents
32
88
  const did = Identifier.encode(genesisBytes, didComponents);
33
89
  // Construct a new CompressedSecp256k1PublicKey and deconstruct the publicKey and publicKeyMultibase
34
- const { multibase: publicKeyMultibase } = new CompressedSecp256k1PublicKey(genesisBytes);
90
+ const { multibase } = new CompressedSecp256k1PublicKey(genesisBytes);
35
91
  // Generate the service field for the DID Document
36
92
  const service = BeaconUtils.generateBeaconServices({
37
93
  id: did,
@@ -45,7 +101,7 @@ export class Resolve {
45
101
  id: `${did}#initialKey`,
46
102
  type: 'Multikey',
47
103
  controller: did,
48
- publicKeyMultibase: publicKeyMultibase.encoded
104
+ publicKeyMultibase: multibase.encoded
49
105
  }],
50
106
  service
51
107
  });
@@ -53,23 +109,21 @@ export class Resolve {
53
109
  /**
54
110
  * Implements subsection {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html#if-genesis_bytes-is-a-sha-256-hash | 7.2.d.2 if genesis_bytes is a SHA-256 Hash}.
55
111
  * @param {DidComponents} didComponents BTCR2 DID components used to resolve the DID Document
56
- * @param {GenesisDocument} genesisDocument The genesis document for resolving the DID Document.
57
- * @returns {Promise<DidDocument>} The resolved DID Document object
112
+ * @param {object} genesisDocument The genesis document for resolving the DID Document.
113
+ * @returns {DidDocument} The resolved DID Document object
58
114
  * @throws {ResolveError} InvalidDidDocument if not conformant to DID Core v1.1
59
115
  */
60
- static async external(didComponents, genesisDocument) {
61
- // Get the genesis bytes from the did components
62
- const { genesisBytes } = didComponents;
63
- // Convert the genesis bytes to a hex string
64
- const genesisHex = hex.encode(genesisBytes);
116
+ static external(didComponents, genesisDocument) {
117
+ // Encode the genesis bytes from the did components
118
+ const genesisBytes = encodeHash(didComponents.genesisBytes);
65
119
  // Canonicalize and sha256 hash the currentDocument
66
- const hashBytes = canonicalHash(genesisDocument);
120
+ const genesisDocumentBytes = canonicalHash(genesisDocument);
67
121
  // If the genesisBytes do not match the hashBytes, throw an error
68
- if (genesisHex !== hashBytes) {
69
- throw new ResolveError(`Initial document mismatch: genesisBytes ${genesisHex} !== hashBytes ${hashBytes}`, INVALID_DID_DOCUMENT, { genesisBytes, hashBytes });
122
+ if (genesisBytes !== genesisDocumentBytes) {
123
+ throw new ResolveError(`Initial document mismatch: genesisBytes !== genesisDocumentBytes`, INVALID_DID_DOCUMENT, { genesisBytes, genesisDocumentBytes });
70
124
  }
71
125
  // Encode the did from the didComponents
72
- const did = Identifier.encode(genesisBytes, didComponents);
126
+ const did = Identifier.encode(decodeHash(genesisBytes), didComponents);
73
127
  // Replace the placeholder did with the did throughout the currentDocument.
74
128
  const currentDocument = JSON.parse(JSON.stringify(genesisDocument).replaceAll(ID_PLACEHOLDER_VALUE, did));
75
129
  // Return a W3C conformant DID Document
@@ -78,20 +132,20 @@ export class Resolve {
78
132
  /**
79
133
  * Implements subsection {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html#process-sidecar-data | Process Sidecar Data}
80
134
  * @param {Sidecar} sidecar The sidecar data to process.
81
- * @returns {ProcessedSidecar} The processed sidecar data containing maps of updates, CAS announcements, and SMT proofs.
135
+ * @returns {SidecarData} The processed sidecar data containing maps of updates, CAS announcements, and SMT proofs.
82
136
  */
83
137
  static sidecarData(sidecar = {}) {
84
138
  // BTCR2 Signed Updates map
85
139
  const updateMap = new Map();
86
140
  if (sidecar.updates?.length)
87
141
  for (const update of sidecar.updates) {
88
- updateMap.set(canonicalHash(update, { encoding: 'hex' }), update);
142
+ updateMap.set(canonicalHash(update), update);
89
143
  }
90
144
  // CAS Announcements map
91
145
  const casMap = new Map();
92
146
  if (sidecar.casUpdates?.length)
93
147
  for (const update of sidecar.casUpdates) {
94
- casMap.set(canonicalHash(update, { encoding: 'hex' }), update);
148
+ casMap.set(canonicalHash(update), update);
95
149
  }
96
150
  // SMT Proofs map
97
151
  const smtMap = new Map();
@@ -101,68 +155,15 @@ export class Resolve {
101
155
  }
102
156
  return { updateMap, casMap, smtMap };
103
157
  }
104
- /**
105
- * Implements subsection {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html#establish-current-document | 7.2.d Establish current_document}.
106
- * Resolution begins by creating an Initial Did Document called current_document (Current DID Document).
107
- * The current_document is iteratively patched with BTCR2 Signed Updates announced by Authorized Beacon Signals.
108
- * @param {DidComponents} didComponents The decoded components of the did.
109
- * @param {GenesisDocument} genesisDocument The genesis document for resolving the DID Document.
110
- * @returns {Promise<DidDocument>} The resolved DID Document object.
111
- * @throws {ResolveError} if the DID hrp is invalid, no sidecarData passed and hrp = "x".
112
- */
113
- static async currentDocument(didComponents, genesisDocument) {
114
- // Deconstruct the hrp from the components
115
- const { hrp, genesisBytes } = didComponents;
116
- // If hrp `x`, perform external resolution
117
- if (hrp === IdentifierHrp.x) {
118
- if (!genesisDocument)
119
- throw new ResolveError('External resolution requires genesisDocument', MISSING_UPDATE_DATA, { didComponents });
120
- return await this.external(didComponents, genesisDocument);
121
- }
122
- // Check for hrp `k`
123
- if (hrp === IdentifierHrp.k) {
124
- // Validate genesis bytes as a compressed secp256k1 public key
125
- if (!CompressedSecp256k1PublicKey.isValid(genesisBytes)) {
126
- throw new ResolveError('Deterministic resolution requires valid secp256k1 public key', INVALID_DID, { genesisBytes });
127
- }
128
- // Perform deterministic resolution
129
- return this.deterministic(didComponents);
130
- }
131
- // Else, throw an error for unsupported hrp
132
- throw new ResolveError(`Unsupported DID hrp ${hrp}`, INVALID_DID, { hrp });
133
- }
134
- /**
135
- * Finds uses the beacon services in the currentDocument to scan for onchain Beacon Signals (transactions) containing
136
- * Signal Bytes (last output in OP_RETURN transaction).
137
- * @param {Array<BeaconService>} beaconServices The array of BeaconService objects to search for signals.
138
- * @param {SidecarData} sidecarData The sidecar data containing maps of updates, CAS announcements, and SMT proofs.
139
- * @param {BitcoinConnection} bitcoin The bitcoin network connection used to fetch beacon signals
140
- * @returns {Promise<Array<[SignedBTCR2Update, BlockMetadata]>>} The array of BTCR2 Signed Updates announced by the Beacon Signals.
141
- */
142
- static async beaconSignals(beaconServices, sidecarData, bitcoin) {
143
- // Discover Beacon Signals via indexer server (esplora/electrs) or full node
144
- const beaconServicesSignals = bitcoin.rest
145
- ? await BeaconSignalDiscovery.indexer(beaconServices, bitcoin)
146
- : await BeaconSignalDiscovery.fullnode(beaconServices, bitcoin);
147
- // Process each beacon's signals in parallel
148
- const promises = await Promise.all(Array.from(beaconServicesSignals.entries()).map(async ([service, signals]) => {
149
- // Skip beacons with no signals
150
- if (!signals.length)
151
- return [];
152
- // Establish a typed beacon and process its signals
153
- return BeaconFactory.establish(service).processSignals(signals, sidecarData);
154
- }));
155
- return promises.flat();
156
- }
157
158
  /**
158
159
  * Implements subsection {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html#process-updates | 7.2.f Process updates Array}.
159
160
  * @param {DidDocument} currentDocument The current DID Document to apply the updates to.
160
161
  * @param {Array<[SignedBTCR2Update, BlockMetadata]>} unsortedUpdates The unsorted array of BTCR2 Signed Updates and their associated Block Metadata.
161
162
  * @param {string} [versionTime] The optional version time to limit updates to.
162
163
  * @param {string} [versionId] The optional version id to limit updates to.
163
- * @returns {Promise<DidResolutionResponse>} The updated DID Document, number of confirmations, and version id.
164
+ * @returns {DidResolutionResponse} The updated DID Document, number of confirmations, and version id.
164
165
  */
165
- static async updates(currentDocument, unsortedUpdates, versionTime, versionId) {
166
+ static updates(currentDocument, unsortedUpdates, versionTime, versionId) {
166
167
  // Start the version number being processed at 1
167
168
  let currentVersionId = 1;
168
169
  // Initialize an empty array to hold the update hashes
@@ -182,7 +183,7 @@ export class Resolve {
182
183
  // Iterate over each (update block) pair
183
184
  for (const [update, block] of updates) {
184
185
  // Get the hash of the current document
185
- const currentDocumentHash = canonicalHash(response.didDocument, { encoding: 'base64url' });
186
+ const currentDocumentHash = canonicalHash(response.didDocument);
186
187
  // Safely convert block.time to timestamp
187
188
  const blocktime = DateUtils.blocktimeToTimestamp(block.time);
188
189
  // TODO: How to detect if block is unconfirmed and exit gracefully or return without it
@@ -211,11 +212,11 @@ export class Resolve {
211
212
  throw new ResolveError(`Hash mismatch: update.sourceHash !== currentDocumentHash`, INVALID_DID_UPDATE, { sourceHash: update.sourceHash, currentDocumentHash });
212
213
  }
213
214
  // Apply the update to the currentDocument and set it in the response
214
- response.didDocument = await this.applyUpdate(response.didDocument, update);
215
+ response.didDocument = this.applyUpdate(response.didDocument, update);
215
216
  // Create unsigned_update by removing the proof property from update.
216
217
  const unsignedUpdate = JSONUtils.deleteKeys(update, ['proof']);
217
218
  // Push the canonicalized unsigned update hash to the updateHashHistory
218
- updateHashHistory.push(canonicalHash(unsignedUpdate, { encoding: 'base64url' }));
219
+ updateHashHistory.push(canonicalHash(unsignedUpdate));
219
220
  }
220
221
  // If update.targetVersionId > currentVersionId + 1, throw LATE_PUBLISHING error
221
222
  else if (update.targetVersionId > currentVersionId + 1) {
@@ -229,13 +230,14 @@ export class Resolve {
229
230
  // Set response.versionId to be the new currentVersionId
230
231
  response.metadata.versionId = `${currentVersionId}`;
231
232
  // If resolutionOptions.versionId is defined and <= currentVersionId, return currentDocument
232
- if (currentVersionId >= Number(versionId)) {
233
+ const versionIdNumber = Number(versionId);
234
+ if (!isNaN(versionIdNumber) && versionIdNumber <= currentVersionId) {
233
235
  return response;
234
236
  }
235
237
  // Check if the current document is deactivated before further processing
236
- if (currentDocument.deactivated) {
238
+ if (response.didDocument.deactivated) {
237
239
  // Set the response deactivated flag to true
238
- response.metadata.deactivated = currentDocument.deactivated;
240
+ response.metadata.deactivated = response.didDocument.deactivated;
239
241
  // If deactivated, stop processing further updates and return the response
240
242
  return response;
241
243
  }
@@ -243,10 +245,12 @@ export class Resolve {
243
245
  // Return response data
244
246
  return response;
245
247
  }
248
+ // ─── Private static: update internals ──────────────────────────────
246
249
  /**
247
250
  * Implements subsection {@link https://dcdpr.github.io/did-btcr2/#confirm-duplicate-update | 7.2.f.1 Confirm Duplicate Update}.
248
251
  * This step confirms that an update with a lower-than-expected targetVersionId is a true duplicate.
249
252
  * @param {SignedBTCR2Update} update The BTCR2 Signed Update to confirm as a duplicate.
253
+ * @param {string[]} updateHashHistory The accumulated hash history for comparison.
250
254
  * @returns {void} Does not return a value, but throws an error if the update is not a valid duplicate.
251
255
  */
252
256
  static confirmDuplicate(update, updateHashHistory) {
@@ -265,10 +269,10 @@ export class Resolve {
265
269
  * Implements subsection {@link https://dcdpr.github.io/did-btcr2/operations/resolve.html#apply-update | 7.2.f.3 Apply Update}.
266
270
  * @param {DidDocument} currentDocument The current DID Document to apply the update to.
267
271
  * @param {SignedBTCR2Update} update The BTCR2 Signed Update to apply.
268
- * @returns {Promise<DidDocument>} The updated DID Document after applying the update.
272
+ * @returns {DidDocument} The updated DID Document after applying the update.
269
273
  * @throws {ResolveError} If the update is invalid or cannot be applied.
270
274
  */
271
- static async applyUpdate(currentDocument, update) {
275
+ static applyUpdate(currentDocument, update) {
272
276
  // Get the capability id from the to update proof.
273
277
  const capabilityId = update.proof?.capability;
274
278
  // Since this field is optional, check that it exists
@@ -313,7 +317,7 @@ export class Resolve {
313
317
  // Verify that updatedDocument is conformant to DID Core v1.1.
314
318
  DidDocument.validate(updatedDocument);
315
319
  // Canonicalize and hash the updatedDocument to get the currentDocumentHash.
316
- const currentDocumentHash = canonicalHash(updatedDocument, { encoding: 'base64url' });
320
+ const currentDocumentHash = canonicalHash(updatedDocument);
317
321
  // Prepare the update targetHash for comparison with currentDocumentHash.
318
322
  const updateTargetHash = update.targetHash;
319
323
  // Make sure the update.targetHash equals currentDocumentHash.
@@ -324,5 +328,149 @@ export class Resolve {
324
328
  // Return final updatedDocument.
325
329
  return updatedDocument;
326
330
  }
331
+ // ─── Instance: state machine ───────────────────────────────────────
332
+ /**
333
+ * Advance the state machine. Returns either:
334
+ * - `{ status: 'action-required', needs }` — caller must provide data via {@link provide}
335
+ * - `{ status: 'resolved', result }` — resolution complete
336
+ *
337
+ * Analogous to Rust's `Resolver::resolve()`.
338
+ */
339
+ resolve() {
340
+ // Internal loop — keeps advancing through phases until data is needed or done
341
+ while (true) {
342
+ switch (this.#phase) {
343
+ // Phase: GenesisDocument
344
+ // Only entered for EXTERNAL (x HRP) identifiers when genesis doc was not in sidecar.
345
+ case ResolverPhase.GenesisDocument: {
346
+ if (this.#providedGenesisDocument) {
347
+ // Genesis doc was provided — establish the current document
348
+ this.#currentDocument = Resolver.external(this.#didComponents, this.#providedGenesisDocument);
349
+ this.#providedGenesisDocument = null;
350
+ this.#phase = ResolverPhase.BeaconDiscovery;
351
+ continue;
352
+ }
353
+ // Need genesis document from caller
354
+ const genesisHash = encodeHash(this.#didComponents.genesisBytes);
355
+ return {
356
+ status: 'action-required',
357
+ needs: [{ kind: 'NeedGenesisDocument', genesisHash }]
358
+ };
359
+ }
360
+ // Phase: BeaconDiscovery
361
+ // Extract beacon services, emit NeedBeaconSignals for addresses not yet queried.
362
+ case ResolverPhase.BeaconDiscovery: {
363
+ const beaconServices = BeaconUtils.getBeaconServices(this.#currentDocument);
364
+ // Filter to services whose addresses haven't been requested yet
365
+ const newServices = beaconServices.filter(service => {
366
+ const address = BeaconUtils.parseBitcoinAddress(service.serviceEndpoint);
367
+ return !this.#requestCache.has(address);
368
+ });
369
+ if (newServices.length > 0) {
370
+ // Mark addresses as requested so we don't re-request on subsequent rounds
371
+ for (const service of newServices) {
372
+ const address = BeaconUtils.parseBitcoinAddress(service.serviceEndpoint);
373
+ this.#requestCache.add(address);
374
+ }
375
+ return {
376
+ status: 'action-required',
377
+ needs: [{ kind: 'NeedBeaconSignals', beaconServices: newServices }]
378
+ };
379
+ }
380
+ // No new beacon services to query — move to processing
381
+ this.#phase = ResolverPhase.BeaconProcess;
382
+ continue;
383
+ }
384
+ // Phase: BeaconProcess
385
+ // Process each beacon's signals. Collect updates and data needs.
386
+ case ResolverPhase.BeaconProcess: {
387
+ const allNeeds = [];
388
+ for (const [service, signals] of this.#beaconServicesSignals) {
389
+ // Skip already-processed services and services with no signals
390
+ if (this.#processedServices.has(service.id) || !signals.length)
391
+ continue;
392
+ // Establish a typed beacon and process its signals
393
+ const beacon = BeaconFactory.establish(service);
394
+ const result = beacon.processSignals(signals, this.#sidecarData);
395
+ if (result.needs.length > 0) {
396
+ // This service has unmet data needs — collect them
397
+ allNeeds.push(...result.needs);
398
+ }
399
+ else {
400
+ // All signals for this service resolved — collect updates, mark processed
401
+ this.#unsortedUpdates.push(...result.updates);
402
+ this.#processedServices.add(service.id);
403
+ }
404
+ }
405
+ if (allNeeds.length > 0) {
406
+ return { status: 'action-required', needs: allNeeds };
407
+ }
408
+ this.#phase = ResolverPhase.ApplyUpdates;
409
+ continue;
410
+ }
411
+ // Phase: ApplyUpdates
412
+ // Apply collected updates, then check for new beacon services (multi-round).
413
+ case ResolverPhase.ApplyUpdates: {
414
+ if (this.#unsortedUpdates.length > 0) {
415
+ // Apply all collected updates to the current document
416
+ this.#resolvedResponse = Resolver.updates(this.#currentDocument, this.#unsortedUpdates, this.#versionTime, this.#versionId);
417
+ this.#currentDocument = this.#resolvedResponse.didDocument;
418
+ this.#unsortedUpdates = [];
419
+ // Check for new beacon services added by updates (multi-round discovery)
420
+ const beaconServices = BeaconUtils.getBeaconServices(this.#currentDocument);
421
+ const hasNewServices = beaconServices.some(service => {
422
+ const address = BeaconUtils.parseBitcoinAddress(service.serviceEndpoint);
423
+ return !this.#requestCache.has(address);
424
+ });
425
+ if (hasNewServices) {
426
+ // Loop back to discover signals for new beacon services
427
+ this.#phase = ResolverPhase.BeaconDiscovery;
428
+ continue;
429
+ }
430
+ }
431
+ this.#phase = ResolverPhase.Complete;
432
+ continue;
433
+ }
434
+ // Phase: Complete
435
+ case ResolverPhase.Complete: {
436
+ return {
437
+ status: 'resolved',
438
+ result: this.#resolvedResponse ?? {
439
+ didDocument: this.#currentDocument,
440
+ metadata: {
441
+ versionId: this.#versionId ?? '1',
442
+ deactivated: this.#currentDocument.deactivated || false
443
+ }
444
+ }
445
+ };
446
+ }
447
+ }
448
+ }
449
+ }
450
+ provide(need, data) {
451
+ switch (need.kind) {
452
+ case 'NeedGenesisDocument': {
453
+ this.#providedGenesisDocument = data;
454
+ break;
455
+ }
456
+ case 'NeedBeaconSignals': {
457
+ const signals = data;
458
+ for (const [service, serviceSignals] of signals) {
459
+ this.#beaconServicesSignals.set(service, serviceSignals);
460
+ }
461
+ break;
462
+ }
463
+ case 'NeedCASAnnouncement': {
464
+ const announcement = data;
465
+ this.#sidecarData.casMap.set(canonicalHash(announcement), announcement);
466
+ break;
467
+ }
468
+ case 'NeedSignedUpdate': {
469
+ const update = data;
470
+ this.#sidecarData.updateMap.set(canonicalHash(update), update);
471
+ break;
472
+ }
473
+ }
474
+ }
327
475
  }
328
- //# sourceMappingURL=resolve.js.map
476
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../../src/core/resolver.ts"],"names":[],"mappings":"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"}
@@ -22,10 +22,10 @@ export class Update {
22
22
  * @param {Btcr2DidDocument} sourceDocument The source DID document to be updated.
23
23
  * @param {PatchOperation[]} patches The array of JSON Patch operations to apply to the sourceDocument.
24
24
  * @param {number} sourceVersionId The version ID of the source document.
25
- * @returns {Promise<SignedBTCR2Update>} The constructed SignedBTCR2Update object.
25
+ * @returns {UnsignedBTCR2Update} The constructed UnsignedBTCR2Update object.
26
26
  * @throws {UpdateError} InvalidDid if sourceDocument.id does not match identifier.
27
27
  */
28
- static async construct(sourceDocument, patches, sourceVersionId) {
28
+ static construct(sourceDocument, patches, sourceVersionId) {
29
29
  // Initialize an unsigned update conformant to btcr2 spec.
30
30
  const unsignedUpdate = {
31
31
  '@context': [
@@ -37,7 +37,7 @@ export class Update {
37
37
  patch: patches,
38
38
  targetHash: '',
39
39
  targetVersionId: sourceVersionId + 1,
40
- sourceHash: canonicalHash(sourceDocument, { encoding: 'base64url' }),
40
+ sourceHash: canonicalHash(sourceDocument),
41
41
  };
42
42
  // Apply all JSON patches to sourceDocument.
43
43
  const targetDocument = JSONPatch.apply(sourceDocument, patches);
@@ -50,7 +50,7 @@ export class Update {
50
50
  throw new UpdateError('Error validating targetDocument: ' + (error instanceof Error ? error.message : String(error)), INVALID_DID_UPDATE, targetDocument);
51
51
  }
52
52
  // Set the targetHash by canonicalizing the targetDocument and encoding it in base64url.
53
- unsignedUpdate.targetHash = canonicalHash(targetDocument, { encoding: 'base64url' });
53
+ unsignedUpdate.targetHash = canonicalHash(targetDocument);
54
54
  // Return unsignedUpdate.
55
55
  return unsignedUpdate;
56
56
  }
@@ -64,7 +64,7 @@ export class Update {
64
64
  * @returns {SignedBTCR2Update} Did update payload secured with a proof => SignedBTCR2Update
65
65
  * @throws {UpdateError} if the privateKeyBytes are invalid
66
66
  */
67
- static async sign(did, unsignedUpdate, verificationMethod, secretKey) {
67
+ static sign(did, unsignedUpdate, verificationMethod, secretKey) {
68
68
  // Parse the controller from the verificationMethod
69
69
  const controller = verificationMethod.controller;
70
70
  // Parse the fragment from the vmId
@@ -1 +1 @@
1
- {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/core/update.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"update.js","sourceRoot":"","sources":["../../../src/core/update.ts"],"names":[],"mappings":"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"}