@did-btcr2/common 2.2.2 → 3.0.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 (85) hide show
  1. package/dist/cjs/canonicalization.js +66 -54
  2. package/dist/cjs/canonicalization.js.map +1 -1
  3. package/dist/cjs/constants.js +17 -11
  4. package/dist/cjs/constants.js.map +1 -1
  5. package/dist/cjs/index.js +5 -3
  6. package/dist/cjs/index.js.map +1 -1
  7. package/dist/cjs/json-patch.js +98 -0
  8. package/dist/cjs/json-patch.js.map +1 -0
  9. package/dist/cjs/logger.js +46 -12
  10. package/dist/cjs/logger.js.map +1 -1
  11. package/dist/cjs/utils/date.js +32 -0
  12. package/dist/cjs/utils/date.js.map +1 -0
  13. package/dist/cjs/utils/json.js +280 -0
  14. package/dist/cjs/utils/json.js.map +1 -0
  15. package/dist/cjs/utils/set.js +23 -0
  16. package/dist/cjs/utils/set.js.map +1 -0
  17. package/dist/cjs/utils/string.js +55 -0
  18. package/dist/cjs/utils/string.js.map +1 -0
  19. package/dist/esm/canonicalization.js +66 -54
  20. package/dist/esm/canonicalization.js.map +1 -1
  21. package/dist/esm/constants.js +17 -11
  22. package/dist/esm/constants.js.map +1 -1
  23. package/dist/esm/index.js +5 -3
  24. package/dist/esm/index.js.map +1 -1
  25. package/dist/esm/json-patch.js +98 -0
  26. package/dist/esm/json-patch.js.map +1 -0
  27. package/dist/esm/logger.js +46 -12
  28. package/dist/esm/logger.js.map +1 -1
  29. package/dist/esm/utils/date.js +32 -0
  30. package/dist/esm/utils/date.js.map +1 -0
  31. package/dist/esm/utils/json.js +280 -0
  32. package/dist/esm/utils/json.js.map +1 -0
  33. package/dist/esm/utils/set.js +23 -0
  34. package/dist/esm/utils/set.js.map +1 -0
  35. package/dist/esm/utils/string.js +55 -0
  36. package/dist/esm/utils/string.js.map +1 -0
  37. package/dist/types/canonicalization.d.ts +38 -29
  38. package/dist/types/canonicalization.d.ts.map +1 -1
  39. package/dist/types/constants.d.ts +6 -8
  40. package/dist/types/constants.d.ts.map +1 -1
  41. package/dist/types/index.d.ts +5 -3
  42. package/dist/types/index.d.ts.map +1 -1
  43. package/dist/types/interfaces.d.ts +2 -2
  44. package/dist/types/interfaces.d.ts.map +1 -1
  45. package/dist/types/json-patch.d.ts +47 -0
  46. package/dist/types/json-patch.d.ts.map +1 -0
  47. package/dist/types/logger.d.ts +31 -8
  48. package/dist/types/logger.d.ts.map +1 -1
  49. package/dist/types/types.d.ts +11 -4
  50. package/dist/types/types.d.ts.map +1 -1
  51. package/dist/types/utils/date.d.ts +19 -0
  52. package/dist/types/utils/date.d.ts.map +1 -0
  53. package/dist/types/utils/json.d.ts +89 -0
  54. package/dist/types/utils/json.d.ts.map +1 -0
  55. package/dist/types/utils/set.d.ts +14 -0
  56. package/dist/types/utils/set.d.ts.map +1 -0
  57. package/dist/types/utils/string.d.ts +39 -0
  58. package/dist/types/utils/string.d.ts.map +1 -0
  59. package/package.json +3 -4
  60. package/src/canonicalization.ts +75 -58
  61. package/src/constants.ts +19 -12
  62. package/src/index.ts +5 -5
  63. package/src/interfaces.ts +2 -2
  64. package/src/json-patch.ts +103 -0
  65. package/src/logger.ts +59 -27
  66. package/src/types.ts +11 -6
  67. package/src/utils/date.ts +32 -0
  68. package/src/utils/json.ts +315 -0
  69. package/src/utils/set.ts +23 -0
  70. package/src/utils/string.ts +59 -0
  71. package/dist/cjs/exts.js +0 -189
  72. package/dist/cjs/exts.js.map +0 -1
  73. package/dist/cjs/patch.js +0 -163
  74. package/dist/cjs/patch.js.map +0 -1
  75. package/dist/esm/exts.js +0 -189
  76. package/dist/esm/exts.js.map +0 -1
  77. package/dist/esm/patch.js +0 -163
  78. package/dist/esm/patch.js.map +0 -1
  79. package/dist/types/exts.d.ts +0 -90
  80. package/dist/types/exts.d.ts.map +0 -1
  81. package/dist/types/patch.d.ts +0 -63
  82. package/dist/types/patch.d.ts.map +0 -1
  83. package/src/exts.ts +0 -310
  84. package/src/patch.ts +0 -181
  85. package/src/rdf-canonize.d.ts +0 -6
@@ -0,0 +1,280 @@
1
+ /**
2
+ * Utilities for working with JSON data.
3
+ * @name JSONUtils
4
+ * @class JSONUtils
5
+ */
6
+ export class JSONUtils {
7
+ /**
8
+ * Check if a value is a JSON object (not an array, not null, and has Object prototype).
9
+ * @param {unknown} value - The value to check.
10
+ * @returns {boolean} True if the value is a JSON object.
11
+ */
12
+ static isObject(value) {
13
+ if (value === null || typeof value !== 'object')
14
+ return false;
15
+ if (Array.isArray(value))
16
+ return false;
17
+ const proto = Object.getPrototypeOf(value);
18
+ return proto === Object.prototype || proto === null;
19
+ }
20
+ /**
21
+ * Check if a value is a parsable JSON string.
22
+ * @param {unknown} value - The value to check.
23
+ * @returns {boolean} True if the value is a parsable JSON string.
24
+ */
25
+ static isParsable(value) {
26
+ if (typeof value !== 'string')
27
+ return false;
28
+ try {
29
+ JSON.parse(value);
30
+ return true;
31
+ }
32
+ catch {
33
+ return false;
34
+ }
35
+ }
36
+ /**
37
+ * Check if a value is an unprototyped object (i.e., Object.create(null)).
38
+ * @param {unknown} value - The value to check.
39
+ * @returns {boolean} True if the value is an unprototyped object.
40
+ */
41
+ static isUnprototyped(value) {
42
+ if (value === null || typeof value !== 'object')
43
+ return false;
44
+ return Object.getPrototypeOf(value) === null;
45
+ }
46
+ /**
47
+ * Normalize a JSON value by stripping prototypes from all objects within it.
48
+ * @param {T} value - The JSON value to normalize.
49
+ * @returns {Prototyped} The normalized JSON value.
50
+ */
51
+ static normalize(value) {
52
+ return this.cloneInternal(value, { stripPrototypes: true });
53
+ }
54
+ /**
55
+ * Shallow copy of a JSON object.
56
+ * @param {T extends JSONObject} value - The JSON object to copy.
57
+ * @returns {T} The copied JSON object.
58
+ */
59
+ static copy(value) {
60
+ return { ...value };
61
+ }
62
+ /**
63
+ * Deep clone a JSON value.
64
+ * @param {T} value - The JSON value to clone.
65
+ * @returns {T} The cloned JSON value.
66
+ */
67
+ static clone(value) {
68
+ if (typeof structuredClone === 'function') {
69
+ return structuredClone(value);
70
+ }
71
+ return this.cloneInternal(value);
72
+ }
73
+ /**
74
+ * Deep clone a JSON value, replacing strings that match a pattern.
75
+ * @param {T} value - The JSON value to clone.
76
+ * @param {RegExp} pattern - The regex pattern to match strings.
77
+ * @param {string} replacement - The replacement string.
78
+ * @returns {T} The cloned JSON value with replacements.
79
+ */
80
+ static cloneReplace(value, pattern, replacement) {
81
+ return this.cloneInternal(value, {
82
+ transform: (candidate) => typeof candidate === 'string'
83
+ ? candidate.replace(pattern, replacement)
84
+ : candidate
85
+ });
86
+ }
87
+ /**
88
+ * Deep equality check between two values.
89
+ * @param {unknown} a - The first value to compare.
90
+ * @param {unknown} b - The second value to compare.
91
+ * @param {WeakMap<object, object>} seen - A WeakMap to track seen object pairs for circular reference detection.
92
+ * @returns {boolean} True if the values are deeply equal.
93
+ */
94
+ static deepEqual(a, b, seen = new WeakMap(), depth = 0) {
95
+ if (depth > 1024) {
96
+ throw new Error('Maximum comparison depth exceeded');
97
+ }
98
+ if (Object.is(a, b))
99
+ return true;
100
+ if (typeof a !== typeof b)
101
+ return false;
102
+ if (a === null || b === null)
103
+ return false;
104
+ if (typeof a !== 'object')
105
+ return false;
106
+ if (seen.get(a) === b)
107
+ return true;
108
+ seen.set(a, b);
109
+ if (ArrayBuffer.isView(a) && ArrayBuffer.isView(b)) {
110
+ const viewA = new Uint8Array(a.buffer, a.byteOffset, a.byteLength);
111
+ const viewB = new Uint8Array(b.buffer, b.byteOffset, b.byteLength);
112
+ if (viewA.byteLength !== viewB.byteLength)
113
+ return false;
114
+ for (let i = 0; i < viewA.byteLength; i++) {
115
+ if (viewA[i] !== viewB[i])
116
+ return false;
117
+ }
118
+ return true;
119
+ }
120
+ if (a instanceof Date && b instanceof Date) {
121
+ return a.getTime() === b.getTime();
122
+ }
123
+ if (a instanceof Set && b instanceof Set) {
124
+ if (a.size !== b.size)
125
+ return false;
126
+ for (const itemA of a) {
127
+ let matched = false;
128
+ for (const itemB of b) {
129
+ if (this.deepEqual(itemA, itemB, seen, depth + 1)) {
130
+ matched = true;
131
+ break;
132
+ }
133
+ }
134
+ if (!matched)
135
+ return false;
136
+ }
137
+ return true;
138
+ }
139
+ if (a instanceof Map && b instanceof Map) {
140
+ if (a.size !== b.size)
141
+ return false;
142
+ for (const [keyA, valueA] of a) {
143
+ let matched = false;
144
+ if (b.has(keyA)) {
145
+ matched = this.deepEqual(valueA, b.get(keyA), seen, depth + 1);
146
+ }
147
+ else {
148
+ for (const [keyB, valueB] of b) {
149
+ if (this.deepEqual(keyA, keyB, seen, depth + 1)
150
+ && this.deepEqual(valueA, valueB, seen, depth + 1)) {
151
+ matched = true;
152
+ break;
153
+ }
154
+ }
155
+ }
156
+ if (!matched)
157
+ return false;
158
+ }
159
+ return true;
160
+ }
161
+ if (Array.isArray(a) && Array.isArray(b)) {
162
+ if (a.length !== b.length)
163
+ return false;
164
+ for (let i = 0; i < a.length; i++) {
165
+ if (!this.deepEqual(a[i], b[i], seen, depth + 1))
166
+ return false;
167
+ }
168
+ return true;
169
+ }
170
+ const keysA = Object.keys(a);
171
+ const keysB = Object.keys(b);
172
+ if (keysA.length !== keysB.length)
173
+ return false;
174
+ for (const key of keysA) {
175
+ if (!Object.prototype.hasOwnProperty.call(b, key))
176
+ return false;
177
+ if (!this.deepEqual(a[key], b[key], seen, depth + 1))
178
+ return false;
179
+ }
180
+ return true;
181
+ }
182
+ /**
183
+ * Delete specified keys from a JSON value.
184
+ * @param {T} value - The JSON value to process.
185
+ * @param {Array<string | number | symbol>} keys - The keys to delete.
186
+ * @returns {T} The JSON value with specified keys deleted.
187
+ */
188
+ static deleteKeys(value, keys) {
189
+ const keySet = new Set(keys.map(key => typeof key === 'number' ? key.toString() : key));
190
+ const walk = (candidate) => {
191
+ if (Array.isArray(candidate)) {
192
+ return candidate.map(item => walk(item));
193
+ }
194
+ if (candidate && typeof candidate === 'object') {
195
+ const result = Array.isArray(candidate) ? [] : {};
196
+ for (const key of Object.keys(candidate)) {
197
+ if (keySet.has(key))
198
+ continue;
199
+ result[key] = walk(candidate[key]);
200
+ }
201
+ return result;
202
+ }
203
+ return candidate;
204
+ };
205
+ return walk(value);
206
+ }
207
+ /**
208
+ * Sanitize a JSON value by removing undefined values from objects and arrays.
209
+ * @param {T} value - The JSON value to sanitize.
210
+ * @returns {T} The sanitized JSON value.
211
+ */
212
+ static sanitize(value) {
213
+ const walk = (candidate) => {
214
+ if (Array.isArray(candidate)) {
215
+ return candidate.map(item => walk(item));
216
+ }
217
+ if (candidate && typeof candidate === 'object') {
218
+ const result = {};
219
+ for (const [key, val] of Object.entries(candidate)) {
220
+ const sanitized = walk(val);
221
+ if (sanitized !== undefined) {
222
+ result[key] = sanitized;
223
+ }
224
+ }
225
+ return result;
226
+ }
227
+ return candidate;
228
+ };
229
+ return walk(value);
230
+ }
231
+ /**
232
+ * Internal function to clone JSON values with options.
233
+ * @param {T} value - The value to clone.
234
+ * @param {CloneOptions} options - The cloning options.
235
+ * @param {WeakMap<object, any>} seen - A WeakMap to track seen objects for circular reference detection.
236
+ * @returns {any} The cloned value.
237
+ */
238
+ static cloneInternal(value, options = {}, seen = new WeakMap(), depth = 0) {
239
+ if (depth > 1024) {
240
+ throw new Error('Maximum clone depth exceeded');
241
+ }
242
+ const transformed = options.transform ? options.transform(value) : value;
243
+ if (transformed !== value)
244
+ return transformed;
245
+ if (typeof value !== 'object' || value === null) {
246
+ return transformed;
247
+ }
248
+ if (seen.has(value)) {
249
+ throw new Error('Cannot clone circular structure');
250
+ }
251
+ // Handle arrays and typed arrays
252
+ if (Array.isArray(value)) {
253
+ const clone = [];
254
+ seen.set(value, clone);
255
+ for (const item of value) {
256
+ clone.push(this.cloneInternal(item, options, seen, depth + 1));
257
+ }
258
+ return clone;
259
+ }
260
+ // Handle ArrayBuffer views (typed arrays, DataView)
261
+ if (ArrayBuffer.isView(value)) {
262
+ if (value instanceof DataView) {
263
+ return new DataView(value.buffer.slice(value.byteOffset, value.byteOffset + value.byteLength));
264
+ }
265
+ if (typeof value.slice === 'function') {
266
+ return value.slice();
267
+ }
268
+ }
269
+ if (value instanceof Date) {
270
+ return new Date(value.getTime());
271
+ }
272
+ const result = options.stripPrototypes ? {} : Object.create(Object.getPrototypeOf(value));
273
+ seen.set(value, result);
274
+ for (const key of Object.keys(value)) {
275
+ result[key] = this.cloneInternal(value[key], options, seen, depth + 1);
276
+ }
277
+ return result;
278
+ }
279
+ }
280
+ //# sourceMappingURL=json.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"json.js","sourceRoot":"","sources":["../../../src/utils/json.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Utility class for set operations.
3
+ * @name SetUtils
4
+ * @class SetUtils
5
+ */
6
+ export class SetUtils {
7
+ /**
8
+ * Compute the set difference without mutating the inputs.
9
+ * @param {Set<T>} left - The left set.
10
+ * @param {Set<T>} right - The right set.
11
+ * @returns {Set<T>} A new set containing elements in `left` that are not in `right`.
12
+ */
13
+ static difference(left, right) {
14
+ const result = new Set();
15
+ for (const value of left) {
16
+ if (!right.has(value)) {
17
+ result.add(value);
18
+ }
19
+ }
20
+ return result;
21
+ }
22
+ }
23
+ //# sourceMappingURL=set.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"set.js","sourceRoot":"","sources":["../../../src/utils/set.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,QAAQ;IACnB;;;;;OAKG;IACH,MAAM,CAAC,UAAU,CAAI,IAAY,EAAE,KAAa;QAC9C,MAAM,MAAM,GAAG,IAAI,GAAG,EAAK,CAAC;QAC5B,KAAK,MAAM,KAAK,IAAI,IAAI,EAAE,CAAC;YACzB,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CAAC;gBACtB,MAAM,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;YACpB,CAAC;QACH,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;CAEF"}
@@ -0,0 +1,55 @@
1
+ /**
2
+ * Utility class string-related operations.
3
+ * @name StringUtils
4
+ * @class StringUtils
5
+ */
6
+ export class StringUtils {
7
+ /**
8
+ * Escape special characters in a string for use in a regular expression.
9
+ * @param {string} value - The string to escape.
10
+ * @returns {string} The escaped string.
11
+ */
12
+ static escapeRegExp(value) {
13
+ return value.replace(/[-/\\^$*+?.()|[\]{}]/g, '\\$&');
14
+ }
15
+ /**
16
+ * Convert a camelCase string to snake_case.
17
+ * @param {string} value - The camelCase string to convert.
18
+ * @returns {string} The converted snake_case string.
19
+ */
20
+ static toSnake(value) {
21
+ return value
22
+ .replace(/([a-z0-9])([A-Z])/g, '$1_$2')
23
+ .toLowerCase();
24
+ }
25
+ /**
26
+ * Convert a string to SNAKE_SCREAMING_CASE.
27
+ * @param {string} value - The string to convert.
28
+ * @returns {string} The converted SNAKE_SCREAMING_CASE string.
29
+ */
30
+ static toSnakeScream(value) {
31
+ return this.toSnake(value).toUpperCase();
32
+ }
33
+ /**
34
+ * Remove the last character from a string.
35
+ * @param {string} value - The string to chop.
36
+ * @returns {string} The chopped string.
37
+ */
38
+ static chop(value) {
39
+ return value.length > 0 ? value.slice(0, -1) : '';
40
+ }
41
+ /**
42
+ * Replace the end of a string if it matches a given pattern.
43
+ * @param {string} value - The string to modify.
44
+ * @param {string | RegExp} pattern - The pattern to match at the end of the string.
45
+ * @param {string} [replacement=''] - The replacement string.
46
+ * @returns {string} The modified string.
47
+ */
48
+ static replaceEnd(value, pattern, replacement = '') {
49
+ const regex = pattern instanceof RegExp
50
+ ? new RegExp(pattern.source.endsWith('$') ? pattern.source : `${pattern.source}$`, pattern.flags.replace(/g/g, ''))
51
+ : new RegExp(`${this.escapeRegExp(pattern)}$`);
52
+ return value.replace(regex, replacement);
53
+ }
54
+ }
55
+ //# sourceMappingURL=string.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"string.js","sourceRoot":"","sources":["../../../src/utils/string.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AACH,MAAM,OAAO,WAAW;IACtB;;;;OAIG;IACH,MAAM,CAAC,YAAY,CAAC,KAAa;QAC/B,OAAO,KAAK,CAAC,OAAO,CAAC,uBAAuB,EAAE,MAAM,CAAC,CAAC;IACxD,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,OAAO,CAAC,KAAa;QAC1B,OAAO,KAAK;aACT,OAAO,CAAC,oBAAoB,EAAE,OAAO,CAAC;aACtC,WAAW,EAAE,CAAC;IACnB,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,aAAa,CAAC,KAAa;QAChC,OAAO,IAAI,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,WAAW,EAAE,CAAC;IAC3C,CAAC;IAED;;;;OAIG;IACH,MAAM,CAAC,IAAI,CAAC,KAAa;QACvB,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC,EAAE,CAAC;IACpD,CAAC;IAED;;;;;;OAMG;IACH,MAAM,CAAC,UAAU,CAAC,KAAa,EAAE,OAAwB,EAAE,cAAsB,EAAE;QACjF,MAAM,KAAK,GAAG,OAAO,YAAY,MAAM;YACrC,CAAC,CAAC,IAAI,MAAM,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,MAAM,GAAG,EAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC;YACnH,CAAC,CAAC,IAAI,MAAM,CAAC,GAAG,IAAI,CAAC,YAAY,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;QAEjD,OAAO,KAAK,CAAC,OAAO,CAAC,KAAK,EAAE,WAAW,CAAC,CAAC;IAC3C,CAAC;CACF"}
@@ -2,7 +2,6 @@ import { sha256 } from '@noble/hashes/sha2';
2
2
  import { bytesToHex } from '@noble/hashes/utils';
3
3
  import { canonicalize as jcsa } from 'json-canonicalize';
4
4
  import { base58btc } from 'multiformats/bases/base58';
5
- import rdf from 'rdf-canonize';
6
5
  import { CanonicalizationError } from './errors.js';
7
6
  /**
8
7
  * Canonicalization class provides methods for canonicalizing JSON objects
@@ -12,35 +11,46 @@ import { CanonicalizationError } from './errors.js';
12
11
  * @type {Canonicalization}
13
12
  */
14
13
  export class Canonicalization {
15
- _algorithm;
14
+ _defaultAlgorithm;
16
15
  /**
17
16
  * Initializes the Canonicalization class with the specified algorithm.
18
- * @param {CanonicalizationAlgorithm} algorithm The canonicalization algorithm to use ('jcs' or 'rdfc').
17
+ * @param {CanonicalizationAlgorithm} algorithm The canonicalization algorithm to use ('jcs').
19
18
  */
20
- // TODO: Need to move to using RDFC by default
21
19
  constructor(algorithm = 'jcs') {
22
- this._algorithm = algorithm;
20
+ this._defaultAlgorithm = Canonicalization.normalizeAlgorithm(algorithm);
23
21
  }
24
22
  /**
25
- * Sets the canonicalization algorithm.
26
- * @param {'jcs' | 'rdfc'} algorithm Either 'jcs' or 'rdfc'.
23
+ * Gets the canonicalization algorithm.
24
+ * @returns {CanonicalizationAlgorithm} The current canonicalization algorithm.
27
25
  */
28
- set algorithm(algorithm) {
29
- // Normalize the passed algorithm to lowercase
30
- algorithm = algorithm.toLowerCase();
31
- // Validate the algorithm is either 'jcs' or 'rdfc'
32
- if (!['jcs', 'rdfc'].includes(algorithm)) {
26
+ get algorithm() {
27
+ return this._defaultAlgorithm;
28
+ }
29
+ /**
30
+ * Normalizes the canonicalization algorithm.
31
+ * @param {CanonicalizationAlgorithm} algorithm
32
+ * @returns {CanonicalizationAlgorithm} The normalized algorithm.
33
+ * @throws {CanonicalizationError} If the algorithm is not supported.
34
+ */
35
+ static normalizeAlgorithm(algorithm) {
36
+ const normalized = algorithm.toLowerCase();
37
+ if (normalized !== 'jcs') {
33
38
  throw new CanonicalizationError(`Unsupported algorithm: ${algorithm}`, 'ALGORITHM_ERROR');
34
39
  }
35
- // Set the algorithm
36
- this._algorithm = algorithm;
40
+ return normalized;
37
41
  }
38
42
  /**
39
- * Gets the canonicalization algorithm.
40
- * @returns {CanonicalizationAlgorithm} The current canonicalization algorithm.
43
+ * Normalizes the canonicalization encoding.
44
+ * @param {CanonicalizationEncoding} encoding - The encoding to normalize.
45
+ * @returns {CanonicalizationEncoding} The normalized encoding.
46
+ * @throws {CanonicalizationError} If the encoding is not supported.
41
47
  */
42
- get algorithm() {
43
- return this._algorithm;
48
+ static normalizeEncoding(encoding) {
49
+ const normalized = encoding.toLowerCase();
50
+ if (normalized !== 'hex' && normalized !== 'base58') {
51
+ throw new CanonicalizationError(`Unsupported encoding: ${encoding}`, 'ENCODING_ERROR');
52
+ }
53
+ return normalized;
44
54
  }
45
55
  /**
46
56
  * Implements {@link http://dcdpr.github.io/did-btcr2/#json-canonicalization-and-hash | 9.2 JSON Canonicalization and Hash}.
@@ -49,46 +59,48 @@ export class Canonicalization {
49
59
  * Scheme. The function returns the canonicalizedBytes.
50
60
  *
51
61
  * Optionally encodes a sha256 hashed canonicalized JSON object.
52
- * Step 1 Canonicalize (JCS/RDFC) → Step 2 Hash (SHA256) → Step 3 Encode (Hex/Base58).
62
+ * Step 1 Canonicalize (JCS) → Step 2 Hash (SHA256) → Step 3 Encode (Hex/Base58).
53
63
  *
54
- * @param {JSONObject} object The object to process.
55
- * @param {string} encoding The encoding format ('hex' or 'base58').
64
+ * @param {Record<any, any>} object The object to process.
65
+ * @param {Object} [options] Options for processing.
66
+ * @param {CanonicalizationEncoding} [options.encoding='hex'] The encoding format ('hex' or 'base58').
67
+ * @param {CanonicalizationAlgorithm} [options.algorithm] The canonicalization algorithm to use.
56
68
  * @returns {Promise<string>} The final SHA-256 hash bytes as a hex string.
57
69
  */
58
- async process(object, encoding = 'hex') {
70
+ async process(object, options = {}) {
71
+ const algorithm = Canonicalization.normalizeAlgorithm(options.algorithm ?? this._defaultAlgorithm);
72
+ const encoding = Canonicalization.normalizeEncoding(options.encoding ?? 'hex');
59
73
  // Step 1: Canonicalize
60
- const canonicalized = await this.canonicalize(object);
74
+ const canonicalized = await this.canonicalize(object, algorithm);
61
75
  // Step 2: Hash
62
76
  const hashed = this.hash(canonicalized);
63
77
  // Step 3: Encode
64
- const encoded = this.encode(hashed, encoding);
78
+ const encoded = this.encode(hashed, encoding, options.multibase ?? false);
65
79
  // Return the encoded string
66
80
  return encoded;
67
81
  }
68
82
  /**
69
- * Step 1: Uses this.algorithm to determine the method (JCS/RDFC).
70
- * @param {JSONObject} object The object to canonicalize.
83
+ * Step 1: Uses this.algorithm to determine the method (JCS).
84
+ * @param {Record<any, any>} object The object to canonicalize.
85
+ * @param {CanonicalizationAlgorithm} [algorithm] The algorithm to use.
71
86
  * @returns {Promise<string>} The canonicalized object.
72
87
  */
73
- async canonicalize(object) {
74
- return await this[this.algorithm](object);
88
+ async canonicalize(object, algorithm = this._defaultAlgorithm) {
89
+ switch (Canonicalization.normalizeAlgorithm(algorithm)) {
90
+ case 'jcs':
91
+ return this.jcs(object);
92
+ default:
93
+ throw new CanonicalizationError(`Unsupported algorithm: ${algorithm}`, 'ALGORITHM_ERROR');
94
+ }
75
95
  }
76
96
  /**
77
97
  * Step 1: Canonicalizes an object using JCS (JSON Canonicalization Scheme).
78
- * @param {JSONObject} object The object to canonicalize.
98
+ * @param {Record<any, any>} object The object to canonicalize.
79
99
  * @returns {string} The canonicalized object.
80
100
  */
81
101
  jcs(object) {
82
102
  return jcsa(object);
83
103
  }
84
- /**
85
- * Step 1: Canonicalizes an object using RDF Canonicalization (RDFC).
86
- * @param {JSONObject} object The object to canonicalize.
87
- * @returns {Promise<string>} The canonicalized object.
88
- */
89
- rdfc(object) {
90
- return rdf.canonize([object], { algorithm: 'RDFC-1.0' });
91
- }
92
104
  /**
93
105
  * Step 2: SHA-256 hashes a canonicalized object.
94
106
  * @param {string} canonicalized The canonicalized object.
@@ -100,19 +112,19 @@ export class Canonicalization {
100
112
  /**
101
113
  * Step 3: Encodes SHA-256 hashed, canonicalized object as a hex or base58 string.
102
114
  * @param {string} canonicalizedhash The canonicalized object to encode.
103
- * @param {string} encoding The encoding format ('hex' or 'base58').
115
+ * @param {CanonicalizationEncoding} encoding The encoding format ('hex' or 'base58').
104
116
  * @throws {CanonicalizationError} If the encoding format is not supported.
105
117
  * @returns {string} The encoded string.
106
118
  */
107
- encode(canonicalizedhash, encoding = 'hex') {
108
- switch (encoding) {
109
- case 'hex':
110
- return this.hex(canonicalizedhash);
111
- case 'base58':
112
- return this.base58(canonicalizedhash);
113
- default:
114
- throw new CanonicalizationError(`Unsupported encoding: ${encoding}`, 'ENCODING_ERROR');
119
+ encode(canonicalizedhash, encoding = 'hex', multibase = false) {
120
+ const normalized = Canonicalization.normalizeEncoding(encoding);
121
+ if (normalized === 'hex')
122
+ return this.hex(canonicalizedhash);
123
+ if (normalized === 'base58') {
124
+ const encoded = this.base58(canonicalizedhash);
125
+ return multibase ? `z${encoded}` : encoded;
115
126
  }
127
+ throw new CanonicalizationError(`Unsupported encoding: ${encoding}`, 'ENCODING_ERROR');
116
128
  }
117
129
  /**
118
130
  * Step 3.1: Encodes HashBytes (Uint8Array) to a hex string.
@@ -128,16 +140,17 @@ export class Canonicalization {
128
140
  * @returns {string} The hash as a hex string.
129
141
  */
130
142
  base58(hashBytes) {
131
- return base58btc.encode(hashBytes);
143
+ const encoded = base58btc.encode(hashBytes);
144
+ return encoded.startsWith('z') ? encoded.slice(1) : encoded;
132
145
  }
133
146
  /**
134
147
  * Canonicalizes an object, hashes it and returns it as hash bytes.
135
148
  * Step 1-2: Canonicalize → Hash.
136
- * @param {JSONObject} object The object to process.
149
+ * @param {Record<any, any>} object The object to process.
137
150
  * @returns {Promise<HashBytes>} The final SHA-256 hash bytes.
138
151
  */
139
- async canonicalhash(object) {
140
- const canonicalized = await this.canonicalize(object);
152
+ async canonicalhash(object, algorithm = this._defaultAlgorithm) {
153
+ const canonicalized = await this.canonicalize(object, algorithm);
141
154
  return this.hash(canonicalized);
142
155
  }
143
156
  /**
@@ -147,7 +160,7 @@ export class Canonicalization {
147
160
  * @returns {string} The SHA-256 hash as a hex string.
148
161
  */
149
162
  hashhex(canonicalized) {
150
- return this.encode(this.hash(canonicalized));
163
+ return this.encode(this.hash(canonicalized), 'hex');
151
164
  }
152
165
  /**
153
166
  * Computes the SHA-256 hashes of canonicalized object and encodes it as a base58 string.
@@ -155,9 +168,8 @@ export class Canonicalization {
155
168
  * @param {string} canonicalized The canonicalized object to hash.
156
169
  * @returns {string} The SHA-256 hash as a base58 string.
157
170
  */
158
- hashb58(canonicalized) {
159
- return this.encode(this.hash(canonicalized), 'base58');
171
+ hashbase58(canonicalized) {
172
+ return this.encode(this.hash(canonicalized), 'base58', false);
160
173
  }
161
174
  }
162
- export const canonicalization = new Canonicalization();
163
175
  //# sourceMappingURL=canonicalization.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"canonicalization.js","sourceRoot":"","sources":["../../src/canonicalization.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"canonicalization.js","sourceRoot":"","sources":["../../src/canonicalization.ts"],"names":[],"mappings":"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"}