@xyo-network/boundwitness-builder 2.81.6 → 2.82.0-rc.1
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.
- package/dist/browser/Builder.d.cts +2 -3
- package/dist/browser/Builder.d.cts.map +1 -1
- package/dist/browser/Builder.d.mts +2 -3
- package/dist/browser/Builder.d.mts.map +1 -1
- package/dist/browser/Builder.d.ts +2 -3
- package/dist/browser/Builder.d.ts.map +1 -1
- package/dist/browser/index.cjs +10 -12
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +11 -13
- package/dist/browser/index.js.map +1 -1
- package/dist/node/Builder.d.cts +2 -3
- package/dist/node/Builder.d.cts.map +1 -1
- package/dist/node/Builder.d.mts +2 -3
- package/dist/node/Builder.d.mts.map +1 -1
- package/dist/node/Builder.d.ts +2 -3
- package/dist/node/Builder.d.ts.map +1 -1
- package/dist/node/index.js +10 -12
- package/dist/node/index.js.map +1 -1
- package/dist/node/index.mjs +11 -13
- package/dist/node/index.mjs.map +1 -1
- package/package.json +18 -17
- package/src/Builder.ts +14 -16
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Logger } from '@xylabs/logger';
|
|
2
2
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
3
3
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
4
|
-
import { Data } from '@xyo-network/core';
|
|
5
4
|
import { ModuleError, Payload } from '@xyo-network/payload-model';
|
|
6
5
|
export interface BoundWitnessBuilderConfig {
|
|
7
6
|
/** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */
|
|
@@ -32,13 +31,13 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
32
31
|
error(payload?: ModuleError): this;
|
|
33
32
|
errors(errors?: (ModuleError | null)[]): this;
|
|
34
33
|
hashableFields(): Promise<TBoundWitness>;
|
|
35
|
-
hashes(hashes:
|
|
34
|
+
hashes(hashes: ArrayBuffer[], schema: string[]): this;
|
|
36
35
|
payload(payload?: TPayload): this;
|
|
37
36
|
payloads(payloads?: (TPayload | null)[]): this;
|
|
38
37
|
sourceQuery(hash?: string): this;
|
|
39
38
|
witness(account: AccountInstance): this;
|
|
40
39
|
witnesses(accounts: AccountInstance[]): this;
|
|
41
|
-
protected signatures(
|
|
40
|
+
protected signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]): Promise<ArrayBuffer[]>;
|
|
42
41
|
private getPayloadHashes;
|
|
43
42
|
private inlinePayloads;
|
|
44
43
|
private missingSchemaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;AAIlF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGjE,MAAM,WAAW,yBAAyB;IACxC,8GAA8G;IAC9G,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,mBAAmB,CAAC,aAAa,SAAS,YAAY,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,SAAS,OAAO,GAAG,OAAO;IAYtI,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAZ5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IACjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAa;gBAGpB,MAAM,GAAE,yBAAqD,EACnD,MAAM,CAAC,oBAAQ;IAGpC,OAAO,KAAK,gBAAgB,GAO3B;IAEK,KAAK,CAAC,IAAI,UAAQ,GAAG,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAgC9E,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;IAS3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;IAShC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA8B9C,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAO9C,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAS1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IASvC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;IAKzB,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE;YAK3E,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,oBAAoB;CAG7B"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Logger } from '@xylabs/logger';
|
|
2
2
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
3
3
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
4
|
-
import { Data } from '@xyo-network/core';
|
|
5
4
|
import { ModuleError, Payload } from '@xyo-network/payload-model';
|
|
6
5
|
export interface BoundWitnessBuilderConfig {
|
|
7
6
|
/** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */
|
|
@@ -32,13 +31,13 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
32
31
|
error(payload?: ModuleError): this;
|
|
33
32
|
errors(errors?: (ModuleError | null)[]): this;
|
|
34
33
|
hashableFields(): Promise<TBoundWitness>;
|
|
35
|
-
hashes(hashes:
|
|
34
|
+
hashes(hashes: ArrayBuffer[], schema: string[]): this;
|
|
36
35
|
payload(payload?: TPayload): this;
|
|
37
36
|
payloads(payloads?: (TPayload | null)[]): this;
|
|
38
37
|
sourceQuery(hash?: string): this;
|
|
39
38
|
witness(account: AccountInstance): this;
|
|
40
39
|
witnesses(accounts: AccountInstance[]): this;
|
|
41
|
-
protected signatures(
|
|
40
|
+
protected signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]): Promise<ArrayBuffer[]>;
|
|
42
41
|
private getPayloadHashes;
|
|
43
42
|
private inlinePayloads;
|
|
44
43
|
private missingSchemaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;AAIlF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGjE,MAAM,WAAW,yBAAyB;IACxC,8GAA8G;IAC9G,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,mBAAmB,CAAC,aAAa,SAAS,YAAY,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,SAAS,OAAO,GAAG,OAAO;IAYtI,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAZ5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IACjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAa;gBAGpB,MAAM,GAAE,yBAAqD,EACnD,MAAM,CAAC,oBAAQ;IAGpC,OAAO,KAAK,gBAAgB,GAO3B;IAEK,KAAK,CAAC,IAAI,UAAQ,GAAG,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAgC9E,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;IAS3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;IAShC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA8B9C,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAO9C,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAS1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IASvC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;IAKzB,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE;YAK3E,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,oBAAoB;CAG7B"}
|
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Logger } from '@xylabs/logger';
|
|
2
2
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
3
3
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
4
|
-
import { Data } from '@xyo-network/core';
|
|
5
4
|
import { ModuleError, Payload } from '@xyo-network/payload-model';
|
|
6
5
|
export interface BoundWitnessBuilderConfig {
|
|
7
6
|
/** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */
|
|
@@ -32,13 +31,13 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
32
31
|
error(payload?: ModuleError): this;
|
|
33
32
|
errors(errors?: (ModuleError | null)[]): this;
|
|
34
33
|
hashableFields(): Promise<TBoundWitness>;
|
|
35
|
-
hashes(hashes:
|
|
34
|
+
hashes(hashes: ArrayBuffer[], schema: string[]): this;
|
|
36
35
|
payload(payload?: TPayload): this;
|
|
37
36
|
payloads(payloads?: (TPayload | null)[]): this;
|
|
38
37
|
sourceQuery(hash?: string): this;
|
|
39
38
|
witness(account: AccountInstance): this;
|
|
40
39
|
witnesses(accounts: AccountInstance[]): this;
|
|
41
|
-
protected signatures(
|
|
40
|
+
protected signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]): Promise<ArrayBuffer[]>;
|
|
42
41
|
private getPayloadHashes;
|
|
43
42
|
private inlinePayloads;
|
|
44
43
|
private missingSchemaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;AAIlF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGjE,MAAM,WAAW,yBAAyB;IACxC,8GAA8G;IAC9G,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,mBAAmB,CAAC,aAAa,SAAS,YAAY,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,SAAS,OAAO,GAAG,OAAO;IAYtI,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAZ5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IACjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAa;gBAGpB,MAAM,GAAE,yBAAqD,EACnD,MAAM,CAAC,oBAAQ;IAGpC,OAAO,KAAK,gBAAgB,GAO3B;IAEK,KAAK,CAAC,IAAI,UAAQ,GAAG,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAgC9E,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;IAS3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;IAShC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA8B9C,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAO9C,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAS1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IASvC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;IAKzB,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE;YAK3E,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,oBAAoB;CAG7B"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -28,7 +28,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
28
28
|
|
|
29
29
|
// src/Builder.ts
|
|
30
30
|
var import_assert = require("@xylabs/assert");
|
|
31
|
-
var
|
|
31
|
+
var import_hex = require("@xylabs/hex");
|
|
32
32
|
var import_boundwitness_model = require("@xyo-network/boundwitness-model");
|
|
33
33
|
var import_boundwitness_wrapper = require("@xyo-network/boundwitness-wrapper");
|
|
34
34
|
var import_core = require("@xyo-network/core");
|
|
@@ -59,16 +59,16 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
59
59
|
}
|
|
60
60
|
return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
61
61
|
const hashableFields = await this.hashableFields();
|
|
62
|
-
const
|
|
63
|
-
const previousHashes = this._accounts.map((account) => account.previousHash);
|
|
62
|
+
const hash = await import_boundwitness_wrapper.BoundWitnessWrapper.hashAsync(hashableFields, "buffer");
|
|
63
|
+
const previousHashes = this._accounts.map((account) => (0, import_core.toUint8Array)(account.previousHash));
|
|
64
64
|
const ret = {
|
|
65
65
|
...hashableFields,
|
|
66
|
-
_signatures: await this.signatures(
|
|
66
|
+
_signatures: await this.signatures(hash, previousHashes)
|
|
67
67
|
};
|
|
68
68
|
if (meta ?? this.config?.meta) {
|
|
69
69
|
const bwWithMeta = ret;
|
|
70
70
|
bwWithMeta._client = "js";
|
|
71
|
-
bwWithMeta._hash =
|
|
71
|
+
bwWithMeta._hash = hash;
|
|
72
72
|
bwWithMeta._timestamp = this._timestamp;
|
|
73
73
|
}
|
|
74
74
|
if (this.config.inlinePayloads) {
|
|
@@ -97,7 +97,7 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
97
97
|
async hashableFields() {
|
|
98
98
|
const addresses = this._accounts.map((account) => account.address);
|
|
99
99
|
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
|
|
100
|
-
const payload_hashes = (0, import_assert.assertEx)(await this.getPayloadHashes(), "Missing payload_hashes");
|
|
100
|
+
const payload_hashes = (0, import_assert.assertEx)(await this.getPayloadHashes(), "Missing payload_hashes").map((x) => (0, import_hex.asHex)(x));
|
|
101
101
|
const payload_schemas = (0, import_assert.assertEx)(this._payload_schemas, "Missing payload_schemas");
|
|
102
102
|
const result = {
|
|
103
103
|
addresses: (0, import_assert.assertEx)(addresses, "Missing addresses"),
|
|
@@ -151,14 +151,12 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
151
151
|
this._accounts?.push(...accounts);
|
|
152
152
|
return this;
|
|
153
153
|
}
|
|
154
|
-
async signatures(
|
|
155
|
-
const
|
|
156
|
-
return await Promise.all(
|
|
157
|
-
this._accounts.map(async (account, index) => import_buffer.Buffer.from(await account.sign(hash, previousHashes[index])).toString("hex"))
|
|
158
|
-
);
|
|
154
|
+
async signatures(hash, previousHashes) {
|
|
155
|
+
const previousHashesBytes = previousHashes.map((ph) => ph ? (0, import_core.toUint8Array)(ph) : void 0);
|
|
156
|
+
return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])));
|
|
159
157
|
}
|
|
160
158
|
async getPayloadHashes() {
|
|
161
|
-
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => import_core.PayloadHasher.hashAsync(payload)));
|
|
159
|
+
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => import_core.PayloadHasher.hashAsync(payload, "buffer")));
|
|
162
160
|
}
|
|
163
161
|
inlinePayloads() {
|
|
164
162
|
console.log("BoundWitnessBuilder: Using inlinePayloads will soon be disallowed");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["export * from './Builder'\nexport * from './Query'\n","import { assertEx } from '@xylabs/assert'\nimport { Buffer } from '@xylabs/buffer'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { Data, PayloadHasher, sortFields } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: string[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const _hash = await BoundWitnessWrapper.hashAsync(hashableFields)\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(_hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = _hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes')\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: string[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(_hash: string, previousHashes: (string | Data | undefined)[]) {\n const hash = Buffer.from(_hash, 'hex')\n return await Promise.all(\n this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString('hex')),\n )\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["import_assert","import_boundwitness_model","import_assert","import_boundwitness_wrapper","import_core","import_payload_wrapper"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["export * from './Builder'\nexport * from './Query'\n","import { assertEx } from '@xylabs/assert'\nimport { asHex } from '@xylabs/hex'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher, sortFields, toUint8Array } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: ArrayBuffer[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const hash = await BoundWitnessWrapper.hashAsync(hashableFields, 'buffer')\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => toUint8Array(account.previousHash))\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes').map((x) => asHex(x))\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: ArrayBuffer[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]) {\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])))\n }\n\n private async getPayloadHashes(): Promise<ArrayBuffer[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload, 'buffer'))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["import_assert","import_boundwitness_model","import_assert","import_boundwitness_wrapper","import_core","import_payload_wrapper"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/Builder.ts
|
|
2
2
|
import { assertEx } from "@xylabs/assert";
|
|
3
|
-
import {
|
|
3
|
+
import { asHex } from "@xylabs/hex";
|
|
4
4
|
import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
5
5
|
import { BoundWitnessWrapper } from "@xyo-network/boundwitness-wrapper";
|
|
6
|
-
import { PayloadHasher, sortFields } from "@xyo-network/core";
|
|
6
|
+
import { PayloadHasher, sortFields, toUint8Array } from "@xyo-network/core";
|
|
7
7
|
import { PayloadWrapper } from "@xyo-network/payload";
|
|
8
8
|
import { Mutex } from "async-mutex";
|
|
9
9
|
var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
@@ -31,16 +31,16 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
31
31
|
}
|
|
32
32
|
return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
33
33
|
const hashableFields = await this.hashableFields();
|
|
34
|
-
const
|
|
35
|
-
const previousHashes = this._accounts.map((account) => account.previousHash);
|
|
34
|
+
const hash = await BoundWitnessWrapper.hashAsync(hashableFields, "buffer");
|
|
35
|
+
const previousHashes = this._accounts.map((account) => toUint8Array(account.previousHash));
|
|
36
36
|
const ret = {
|
|
37
37
|
...hashableFields,
|
|
38
|
-
_signatures: await this.signatures(
|
|
38
|
+
_signatures: await this.signatures(hash, previousHashes)
|
|
39
39
|
};
|
|
40
40
|
if (meta ?? this.config?.meta) {
|
|
41
41
|
const bwWithMeta = ret;
|
|
42
42
|
bwWithMeta._client = "js";
|
|
43
|
-
bwWithMeta._hash =
|
|
43
|
+
bwWithMeta._hash = hash;
|
|
44
44
|
bwWithMeta._timestamp = this._timestamp;
|
|
45
45
|
}
|
|
46
46
|
if (this.config.inlinePayloads) {
|
|
@@ -69,7 +69,7 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
69
69
|
async hashableFields() {
|
|
70
70
|
const addresses = this._accounts.map((account) => account.address);
|
|
71
71
|
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
|
|
72
|
-
const payload_hashes = assertEx(await this.getPayloadHashes(), "Missing payload_hashes");
|
|
72
|
+
const payload_hashes = assertEx(await this.getPayloadHashes(), "Missing payload_hashes").map((x) => asHex(x));
|
|
73
73
|
const payload_schemas = assertEx(this._payload_schemas, "Missing payload_schemas");
|
|
74
74
|
const result = {
|
|
75
75
|
addresses: assertEx(addresses, "Missing addresses"),
|
|
@@ -123,14 +123,12 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
123
123
|
this._accounts?.push(...accounts);
|
|
124
124
|
return this;
|
|
125
125
|
}
|
|
126
|
-
async signatures(
|
|
127
|
-
const
|
|
128
|
-
return await Promise.all(
|
|
129
|
-
this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString("hex"))
|
|
130
|
-
);
|
|
126
|
+
async signatures(hash, previousHashes) {
|
|
127
|
+
const previousHashesBytes = previousHashes.map((ph) => ph ? toUint8Array(ph) : void 0);
|
|
128
|
+
return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])));
|
|
131
129
|
}
|
|
132
130
|
async getPayloadHashes() {
|
|
133
|
-
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload)));
|
|
131
|
+
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload, "buffer")));
|
|
134
132
|
}
|
|
135
133
|
inlinePayloads() {
|
|
136
134
|
console.log("BoundWitnessBuilder: Using inlinePayloads will soon be disallowed");
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Buffer } from '@xylabs/buffer'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { Data, PayloadHasher, sortFields } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: string[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const _hash = await BoundWitnessWrapper.hashAsync(hashableFields)\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(_hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = _hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes')\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: string[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(_hash: string, previousHashes: (string | Data | undefined)[]) {\n const hash = Buffer.from(_hash, 'hex')\n return await Promise.all(\n this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString('hex')),\n )\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadWrapper","assertEx","PayloadWrapper","assertEx","BoundWitnessWrapper","PayloadHasher","PayloadWrapper"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { asHex } from '@xylabs/hex'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher, sortFields, toUint8Array } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: ArrayBuffer[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const hash = await BoundWitnessWrapper.hashAsync(hashableFields, 'buffer')\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => toUint8Array(account.previousHash))\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes').map((x) => asHex(x))\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: ArrayBuffer[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]) {\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])))\n }\n\n private async getPayloadHashes(): Promise<ArrayBuffer[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload, 'buffer'))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadWrapper","assertEx","PayloadWrapper","assertEx","BoundWitnessWrapper","PayloadHasher","PayloadWrapper"]}
|
package/dist/node/Builder.d.cts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Logger } from '@xylabs/logger';
|
|
2
2
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
3
3
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
4
|
-
import { Data } from '@xyo-network/core';
|
|
5
4
|
import { ModuleError, Payload } from '@xyo-network/payload-model';
|
|
6
5
|
export interface BoundWitnessBuilderConfig {
|
|
7
6
|
/** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */
|
|
@@ -32,13 +31,13 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
32
31
|
error(payload?: ModuleError): this;
|
|
33
32
|
errors(errors?: (ModuleError | null)[]): this;
|
|
34
33
|
hashableFields(): Promise<TBoundWitness>;
|
|
35
|
-
hashes(hashes:
|
|
34
|
+
hashes(hashes: ArrayBuffer[], schema: string[]): this;
|
|
36
35
|
payload(payload?: TPayload): this;
|
|
37
36
|
payloads(payloads?: (TPayload | null)[]): this;
|
|
38
37
|
sourceQuery(hash?: string): this;
|
|
39
38
|
witness(account: AccountInstance): this;
|
|
40
39
|
witnesses(accounts: AccountInstance[]): this;
|
|
41
|
-
protected signatures(
|
|
40
|
+
protected signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]): Promise<ArrayBuffer[]>;
|
|
42
41
|
private getPayloadHashes;
|
|
43
42
|
private inlinePayloads;
|
|
44
43
|
private missingSchemaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;AAIlF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGjE,MAAM,WAAW,yBAAyB;IACxC,8GAA8G;IAC9G,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,mBAAmB,CAAC,aAAa,SAAS,YAAY,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,SAAS,OAAO,GAAG,OAAO;IAYtI,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAZ5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IACjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAa;gBAGpB,MAAM,GAAE,yBAAqD,EACnD,MAAM,CAAC,oBAAQ;IAGpC,OAAO,KAAK,gBAAgB,GAO3B;IAEK,KAAK,CAAC,IAAI,UAAQ,GAAG,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAgC9E,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;IAS3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;IAShC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA8B9C,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAO9C,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAS1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IASvC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;IAKzB,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE;YAK3E,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,oBAAoB;CAG7B"}
|
package/dist/node/Builder.d.mts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Logger } from '@xylabs/logger';
|
|
2
2
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
3
3
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
4
|
-
import { Data } from '@xyo-network/core';
|
|
5
4
|
import { ModuleError, Payload } from '@xyo-network/payload-model';
|
|
6
5
|
export interface BoundWitnessBuilderConfig {
|
|
7
6
|
/** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */
|
|
@@ -32,13 +31,13 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
32
31
|
error(payload?: ModuleError): this;
|
|
33
32
|
errors(errors?: (ModuleError | null)[]): this;
|
|
34
33
|
hashableFields(): Promise<TBoundWitness>;
|
|
35
|
-
hashes(hashes:
|
|
34
|
+
hashes(hashes: ArrayBuffer[], schema: string[]): this;
|
|
36
35
|
payload(payload?: TPayload): this;
|
|
37
36
|
payloads(payloads?: (TPayload | null)[]): this;
|
|
38
37
|
sourceQuery(hash?: string): this;
|
|
39
38
|
witness(account: AccountInstance): this;
|
|
40
39
|
witnesses(accounts: AccountInstance[]): this;
|
|
41
|
-
protected signatures(
|
|
40
|
+
protected signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]): Promise<ArrayBuffer[]>;
|
|
42
41
|
private getPayloadHashes;
|
|
43
42
|
private inlinePayloads;
|
|
44
43
|
private missingSchemaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;AAIlF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGjE,MAAM,WAAW,yBAAyB;IACxC,8GAA8G;IAC9G,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,mBAAmB,CAAC,aAAa,SAAS,YAAY,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,SAAS,OAAO,GAAG,OAAO;IAYtI,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAZ5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IACjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAa;gBAGpB,MAAM,GAAE,yBAAqD,EACnD,MAAM,CAAC,oBAAQ;IAGpC,OAAO,KAAK,gBAAgB,GAO3B;IAEK,KAAK,CAAC,IAAI,UAAQ,GAAG,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAgC9E,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;IAS3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;IAShC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA8B9C,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAO9C,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAS1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IASvC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;IAKzB,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE;YAK3E,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,oBAAoB;CAG7B"}
|
package/dist/node/Builder.d.ts
CHANGED
|
@@ -1,7 +1,6 @@
|
|
|
1
1
|
import { Logger } from '@xylabs/logger';
|
|
2
2
|
import { AccountInstance } from '@xyo-network/account-model';
|
|
3
3
|
import { BoundWitness } from '@xyo-network/boundwitness-model';
|
|
4
|
-
import { Data } from '@xyo-network/core';
|
|
5
4
|
import { ModuleError, Payload } from '@xyo-network/payload-model';
|
|
6
5
|
export interface BoundWitnessBuilderConfig {
|
|
7
6
|
/** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */
|
|
@@ -32,13 +31,13 @@ export declare class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{
|
|
|
32
31
|
error(payload?: ModuleError): this;
|
|
33
32
|
errors(errors?: (ModuleError | null)[]): this;
|
|
34
33
|
hashableFields(): Promise<TBoundWitness>;
|
|
35
|
-
hashes(hashes:
|
|
34
|
+
hashes(hashes: ArrayBuffer[], schema: string[]): this;
|
|
36
35
|
payload(payload?: TPayload): this;
|
|
37
36
|
payloads(payloads?: (TPayload | null)[]): this;
|
|
38
37
|
sourceQuery(hash?: string): this;
|
|
39
38
|
witness(account: AccountInstance): this;
|
|
40
39
|
witnesses(accounts: AccountInstance[]): this;
|
|
41
|
-
protected signatures(
|
|
40
|
+
protected signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]): Promise<ArrayBuffer[]>;
|
|
42
41
|
private getPayloadHashes;
|
|
43
42
|
private inlinePayloads;
|
|
44
43
|
private missingSchemaMessage;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;
|
|
1
|
+
{"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,MAAM,EAAE,MAAM,gBAAgB,CAAA;AACvC,OAAO,EAAE,eAAe,EAAE,MAAM,4BAA4B,CAAA;AAC5D,OAAO,EAAE,YAAY,EAAsB,MAAM,iCAAiC,CAAA;AAIlF,OAAO,EAAE,WAAW,EAAE,OAAO,EAAE,MAAM,4BAA4B,CAAA;AAGjE,MAAM,WAAW,yBAAyB;IACxC,8GAA8G;IAC9G,sEAAsE;IACtE,QAAQ,CAAC,cAAc,CAAC,EAAE,OAAO,CAAA;IACjC,4DAA4D;IAC5D,QAAQ,CAAC,IAAI,CAAC,EAAE,OAAO,CAAA;IACvB,iEAAiE;IACjE,QAAQ,CAAC,SAAS,CAAC,EAAE,OAAO,CAAA;CAC7B;AAED,qBAAa,mBAAmB,CAAC,aAAa,SAAS,YAAY,CAAC;IAAE,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,GAAG,YAAY,EAAE,QAAQ,SAAS,OAAO,GAAG,OAAO;IAYtI,QAAQ,CAAC,MAAM,EAAE,yBAAyB;IAC1C,SAAS,CAAC,QAAQ,CAAC,MAAM,CAAC;IAZ5B,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,WAAW,CAAc;IACjD,OAAO,CAAC,SAAS,CAAwB;IACzC,OAAO,CAAC,YAAY,CAAsB;IAC1C,OAAO,CAAC,OAAO,CAAoB;IACnC,OAAO,CAAC,cAAc,CAA2B;IACjD,OAAO,CAAC,eAAe,CAAsB;IAC7C,OAAO,CAAC,SAAS,CAAiB;IAClC,OAAO,CAAC,YAAY,CAAoB;IACxC,OAAO,CAAC,UAAU,CAAa;gBAGpB,MAAM,GAAE,yBAAqD,EACnD,MAAM,CAAC,oBAAQ;IAGpC,OAAO,KAAK,gBAAgB,GAO3B;IAEK,KAAK,CAAC,IAAI,UAAQ,GAAG,OAAO,CAAC,CAAC,aAAa,EAAE,QAAQ,EAAE,EAAE,WAAW,EAAE,CAAC,CAAC;IAgC9E,KAAK,CAAC,OAAO,CAAC,EAAE,WAAW;IAS3B,MAAM,CAAC,MAAM,CAAC,EAAE,CAAC,WAAW,GAAG,IAAI,CAAC,EAAE;IAShC,cAAc,IAAI,OAAO,CAAC,aAAa,CAAC;IA8B9C,MAAM,CAAC,MAAM,EAAE,WAAW,EAAE,EAAE,MAAM,EAAE,MAAM,EAAE;IAO9C,OAAO,CAAC,OAAO,CAAC,EAAE,QAAQ;IAS1B,QAAQ,CAAC,QAAQ,CAAC,EAAE,CAAC,QAAQ,GAAG,IAAI,CAAC,EAAE;IASvC,WAAW,CAAC,IAAI,CAAC,EAAE,MAAM;IAKzB,OAAO,CAAC,OAAO,EAAE,eAAe;IAKhC,SAAS,CAAC,QAAQ,EAAE,eAAe,EAAE;cAKrB,UAAU,CAAC,IAAI,EAAE,WAAW,EAAE,cAAc,EAAE,CAAC,WAAW,GAAG,SAAS,CAAC,EAAE;YAK3E,gBAAgB;IAI9B,OAAO,CAAC,cAAc;IAWtB,OAAO,CAAC,oBAAoB;CAG7B"}
|
package/dist/node/index.js
CHANGED
|
@@ -28,7 +28,7 @@ module.exports = __toCommonJS(src_exports);
|
|
|
28
28
|
|
|
29
29
|
// src/Builder.ts
|
|
30
30
|
var import_assert = require("@xylabs/assert");
|
|
31
|
-
var
|
|
31
|
+
var import_hex = require("@xylabs/hex");
|
|
32
32
|
var import_boundwitness_model = require("@xyo-network/boundwitness-model");
|
|
33
33
|
var import_boundwitness_wrapper = require("@xyo-network/boundwitness-wrapper");
|
|
34
34
|
var import_core = require("@xyo-network/core");
|
|
@@ -60,16 +60,16 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
60
60
|
return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
61
61
|
var _a;
|
|
62
62
|
const hashableFields = await this.hashableFields();
|
|
63
|
-
const
|
|
64
|
-
const previousHashes = this._accounts.map((account) => account.previousHash);
|
|
63
|
+
const hash = await import_boundwitness_wrapper.BoundWitnessWrapper.hashAsync(hashableFields, "buffer");
|
|
64
|
+
const previousHashes = this._accounts.map((account) => (0, import_core.toUint8Array)(account.previousHash));
|
|
65
65
|
const ret = {
|
|
66
66
|
...hashableFields,
|
|
67
|
-
_signatures: await this.signatures(
|
|
67
|
+
_signatures: await this.signatures(hash, previousHashes)
|
|
68
68
|
};
|
|
69
69
|
if (meta ?? ((_a = this.config) == null ? void 0 : _a.meta)) {
|
|
70
70
|
const bwWithMeta = ret;
|
|
71
71
|
bwWithMeta._client = "js";
|
|
72
|
-
bwWithMeta._hash =
|
|
72
|
+
bwWithMeta._hash = hash;
|
|
73
73
|
bwWithMeta._timestamp = this._timestamp;
|
|
74
74
|
}
|
|
75
75
|
if (this.config.inlinePayloads) {
|
|
@@ -99,7 +99,7 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
99
99
|
var _a, _b;
|
|
100
100
|
const addresses = this._accounts.map((account) => account.address);
|
|
101
101
|
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
|
|
102
|
-
const payload_hashes = (0, import_assert.assertEx)(await this.getPayloadHashes(), "Missing payload_hashes");
|
|
102
|
+
const payload_hashes = (0, import_assert.assertEx)(await this.getPayloadHashes(), "Missing payload_hashes").map((x) => (0, import_hex.asHex)(x));
|
|
103
103
|
const payload_schemas = (0, import_assert.assertEx)(this._payload_schemas, "Missing payload_schemas");
|
|
104
104
|
const result = {
|
|
105
105
|
addresses: (0, import_assert.assertEx)(addresses, "Missing addresses"),
|
|
@@ -155,14 +155,12 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
155
155
|
(_a = this._accounts) == null ? void 0 : _a.push(...accounts);
|
|
156
156
|
return this;
|
|
157
157
|
}
|
|
158
|
-
async signatures(
|
|
159
|
-
const
|
|
160
|
-
return await Promise.all(
|
|
161
|
-
this._accounts.map(async (account, index) => import_buffer.Buffer.from(await account.sign(hash, previousHashes[index])).toString("hex"))
|
|
162
|
-
);
|
|
158
|
+
async signatures(hash, previousHashes) {
|
|
159
|
+
const previousHashesBytes = previousHashes.map((ph) => ph ? (0, import_core.toUint8Array)(ph) : void 0);
|
|
160
|
+
return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])));
|
|
163
161
|
}
|
|
164
162
|
async getPayloadHashes() {
|
|
165
|
-
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => import_core.PayloadHasher.hashAsync(payload)));
|
|
163
|
+
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => import_core.PayloadHasher.hashAsync(payload, "buffer")));
|
|
166
164
|
}
|
|
167
165
|
inlinePayloads() {
|
|
168
166
|
console.log("BoundWitnessBuilder: Using inlinePayloads will soon be disallowed");
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["export * from './Builder'\nexport * from './Query'\n","import { assertEx } from '@xylabs/assert'\nimport { Buffer } from '@xylabs/buffer'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { Data, PayloadHasher, sortFields } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: string[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const _hash = await BoundWitnessWrapper.hashAsync(hashableFields)\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(_hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = _hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes')\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: string[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(_hash: string, previousHashes: (string | Data | undefined)[]) {\n const hash = Buffer.from(_hash, 'hex')\n return await Promise.all(\n this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString('hex')),\n )\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["import_assert","import_boundwitness_model","import_assert","import_boundwitness_wrapper","import_core","import_payload_wrapper"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["export * from './Builder'\nexport * from './Query'\n","import { assertEx } from '@xylabs/assert'\nimport { asHex } from '@xylabs/hex'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher, sortFields, toUint8Array } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: ArrayBuffer[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const hash = await BoundWitnessWrapper.hashAsync(hashableFields, 'buffer')\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => toUint8Array(account.previousHash))\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes').map((x) => asHex(x))\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: ArrayBuffer[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]) {\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])))\n }\n\n private async getPayloadHashes(): Promise<ArrayBuffer[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload, 'buffer'))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["import_assert","import_boundwitness_model","import_assert","import_boundwitness_wrapper","import_core","import_payload_wrapper"]}
|
package/dist/node/index.mjs
CHANGED
|
@@ -1,9 +1,9 @@
|
|
|
1
1
|
// src/Builder.ts
|
|
2
2
|
import { assertEx } from "@xylabs/assert";
|
|
3
|
-
import {
|
|
3
|
+
import { asHex } from "@xylabs/hex";
|
|
4
4
|
import { BoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
5
5
|
import { BoundWitnessWrapper } from "@xyo-network/boundwitness-wrapper";
|
|
6
|
-
import { PayloadHasher, sortFields } from "@xyo-network/core";
|
|
6
|
+
import { PayloadHasher, sortFields, toUint8Array } from "@xyo-network/core";
|
|
7
7
|
import { PayloadWrapper } from "@xyo-network/payload";
|
|
8
8
|
import { Mutex } from "async-mutex";
|
|
9
9
|
var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
@@ -32,16 +32,16 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
32
32
|
return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
33
33
|
var _a;
|
|
34
34
|
const hashableFields = await this.hashableFields();
|
|
35
|
-
const
|
|
36
|
-
const previousHashes = this._accounts.map((account) => account.previousHash);
|
|
35
|
+
const hash = await BoundWitnessWrapper.hashAsync(hashableFields, "buffer");
|
|
36
|
+
const previousHashes = this._accounts.map((account) => toUint8Array(account.previousHash));
|
|
37
37
|
const ret = {
|
|
38
38
|
...hashableFields,
|
|
39
|
-
_signatures: await this.signatures(
|
|
39
|
+
_signatures: await this.signatures(hash, previousHashes)
|
|
40
40
|
};
|
|
41
41
|
if (meta ?? ((_a = this.config) == null ? void 0 : _a.meta)) {
|
|
42
42
|
const bwWithMeta = ret;
|
|
43
43
|
bwWithMeta._client = "js";
|
|
44
|
-
bwWithMeta._hash =
|
|
44
|
+
bwWithMeta._hash = hash;
|
|
45
45
|
bwWithMeta._timestamp = this._timestamp;
|
|
46
46
|
}
|
|
47
47
|
if (this.config.inlinePayloads) {
|
|
@@ -71,7 +71,7 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
71
71
|
var _a, _b;
|
|
72
72
|
const addresses = this._accounts.map((account) => account.address);
|
|
73
73
|
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
|
|
74
|
-
const payload_hashes = assertEx(await this.getPayloadHashes(), "Missing payload_hashes");
|
|
74
|
+
const payload_hashes = assertEx(await this.getPayloadHashes(), "Missing payload_hashes").map((x) => asHex(x));
|
|
75
75
|
const payload_schemas = assertEx(this._payload_schemas, "Missing payload_schemas");
|
|
76
76
|
const result = {
|
|
77
77
|
addresses: assertEx(addresses, "Missing addresses"),
|
|
@@ -127,14 +127,12 @@ var BoundWitnessBuilder = class _BoundWitnessBuilder {
|
|
|
127
127
|
(_a = this._accounts) == null ? void 0 : _a.push(...accounts);
|
|
128
128
|
return this;
|
|
129
129
|
}
|
|
130
|
-
async signatures(
|
|
131
|
-
const
|
|
132
|
-
return await Promise.all(
|
|
133
|
-
this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString("hex"))
|
|
134
|
-
);
|
|
130
|
+
async signatures(hash, previousHashes) {
|
|
131
|
+
const previousHashesBytes = previousHashes.map((ph) => ph ? toUint8Array(ph) : void 0);
|
|
132
|
+
return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])));
|
|
135
133
|
}
|
|
136
134
|
async getPayloadHashes() {
|
|
137
|
-
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload)));
|
|
135
|
+
return this._payloadHashes ?? await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload, "buffer")));
|
|
138
136
|
}
|
|
139
137
|
inlinePayloads() {
|
|
140
138
|
console.log("BoundWitnessBuilder: Using inlinePayloads will soon be disallowed");
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Buffer } from '@xylabs/buffer'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { Data, PayloadHasher, sortFields } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: string[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const _hash = await BoundWitnessWrapper.hashAsync(hashableFields)\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(_hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = _hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes')\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: string[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(_hash: string, previousHashes: (string | Data | undefined)[]) {\n const hash = Buffer.from(_hash, 'hex')\n return await Promise.all(\n this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString('hex')),\n )\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadWrapper","assertEx","PayloadWrapper","assertEx","BoundWitnessWrapper","PayloadHasher","PayloadWrapper"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { asHex } from '@xylabs/hex'\nimport { Logger } from '@xylabs/logger'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher, sortFields, toUint8Array } from '@xyo-network/core'\nimport { PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\nexport interface BoundWitnessBuilderConfig {\n /** Whether or not the payloads should be included in the metadata sent to and recorded by the ArchivistApi */\n /** @deprecated We will be removing support for inlinePayloads soon */\n readonly inlinePayloads?: boolean\n /** @deprecated We will be removing support for meta soon */\n readonly meta?: boolean\n /** @deprecated We will be removing support for timestamp soon */\n readonly timestamp?: boolean\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: string }> = BoundWitness, TPayload extends Payload = Payload> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[] = []\n private _errorHashes: string[] | undefined\n private _errors: ModuleError[] = []\n private _payloadHashes: ArrayBuffer[] | undefined\n private _payloadSchemas: string[] | undefined\n private _payloads: TPayload[] = []\n private _sourceQuery: string | undefined\n private _timestamp = Date.now()\n\n constructor(\n readonly config: BoundWitnessBuilderConfig = { inlinePayloads: false },\n protected readonly logger?: Logger,\n ) {}\n\n private get _payload_schemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n async build(meta = false): Promise<[TBoundWitness, TPayload[], ModuleError[]]> {\n if (meta) {\n console.log('BoundWitnessBuilder: Calling build with meta=true will be disallowed soon')\n }\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const hash = await BoundWitnessWrapper.hashAsync(hashableFields, 'buffer')\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => toUint8Array(account.previousHash))\n\n const ret: TBoundWitness = {\n ...hashableFields,\n _signatures: await this.signatures(hash, previousHashes),\n }\n if (meta ?? this.config?.meta) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const bwWithMeta = ret as any\n bwWithMeta._client = 'js'\n bwWithMeta._hash = hash\n bwWithMeta._timestamp = this._timestamp\n }\n if (this.config.inlinePayloads) {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n const anyRet = ret as any\n //leaving this in here to prevent breaking code (for now)\n anyRet._payloads = this.inlinePayloads()\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n error(payload?: ModuleError) {\n const unwrappedPayload = PayloadWrapper.unwrap(payload)\n assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')\n if (unwrappedPayload) {\n this._errors.push(assertEx(sortFields(unwrappedPayload)))\n }\n return this\n }\n\n errors(errors?: (ModuleError | null)[]) {\n errors?.forEach((error) => {\n if (error !== null) {\n this.error(error)\n }\n })\n return this\n }\n\n async hashableFields(): Promise<TBoundWitness> {\n const addresses = this._accounts.map((account) => account.address)\n const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes').map((x) => asHex(x))\n const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')\n const result: TBoundWitness = {\n addresses: assertEx(addresses, 'Missing addresses'),\n payload_hashes,\n payload_schemas,\n previous_hashes,\n schema: BoundWitnessSchema,\n } as TBoundWitness\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.reduce((inValid, hash) => inValid || !hash, false), 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.reduce((inValid, schema) => inValid || !schema, false), 'nulls found in schemas')\n\n if (this.config.timestamp ?? true) {\n result.timestamp = this._timestamp\n }\n\n if (this._sourceQuery) {\n result.sourceQuery = this._sourceQuery\n }\n\n return result\n }\n\n hashes(hashes: ArrayBuffer[], schema: string[]) {\n assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')\n this._payloadHashes = hashes\n this._payloadSchemas = schema\n return this\n }\n\n payload(payload?: TPayload) {\n const unwrappedPayload = PayloadWrapper.unwrap<TPayload>(payload)\n assertEx(this._payloadHashes === undefined, 'Can not set payloads when hashes already set')\n if (unwrappedPayload) {\n this._payloads.push(assertEx(sortFields<TPayload>(unwrappedPayload)))\n }\n return this\n }\n\n payloads(payloads?: (TPayload | null)[]) {\n payloads?.forEach((payload) => {\n if (payload !== null) {\n this.payload(payload)\n }\n })\n return this\n }\n\n sourceQuery(hash?: string) {\n this._sourceQuery = hash\n return this\n }\n\n witness(account: AccountInstance) {\n this._accounts?.push(account)\n return this\n }\n\n witnesses(accounts: AccountInstance[]) {\n this._accounts?.push(...accounts)\n return this\n }\n\n protected async signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]) {\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])))\n }\n\n private async getPayloadHashes(): Promise<ArrayBuffer[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload, 'buffer'))))\n }\n\n private inlinePayloads() {\n console.log('BoundWitnessBuilder: Using inlinePayloads will soon be disallowed')\n\n return this._payloads.map<TPayload>((payload, index) => {\n return {\n ...payload,\n schema: this._payload_schemas[index],\n }\n })\n }\n\n private missingSchemaMessage(payload: Payload) {\n return `Builder: Missing Schema\\n${JSON.stringify(payload, null, 2)}`\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { QueryBoundWitness, QueryBoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nimport { BoundWitnessBuilder } from '../Builder'\n\nexport class QueryBoundWitnessBuilder<\n TBoundWitness extends QueryBoundWitness = QueryBoundWitness,\n TQuery extends Query = Query,\n> extends BoundWitnessBuilder<TBoundWitness> {\n private _query: PayloadWrapper<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(await this._query?.hashAsync(), 'No Query Specified'),\n schema: QueryBoundWitnessSchema,\n }\n }\n\n query<T extends TQuery>(query: T) {\n this._query = PayloadWrapper.wrap(query)\n this.payload(this._query.payload())\n return this\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { compact } from '@xylabs/lodash'\nimport { QueryBoundWitness } from '@xyo-network/boundwitness-model'\nimport { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'\nimport { PayloadHasher } from '@xyo-network/core'\nimport { Payload, PayloadSetPayload, Query } from '@xyo-network/payload-model'\nimport { PayloadWrapper } from '@xyo-network/payload-wrapper'\n\nexport class QueryBoundWitnessWrapper<T extends Query = Query> extends BoundWitnessWrapper<QueryBoundWitness> {\n private _payloadsWithoutQuery: PayloadWrapper<Payload>[] | undefined\n private _query: T | undefined\n private _resultSet: PayloadSetPayload | undefined\n\n private isQueryBoundWitnessWrapper = true\n\n static parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): QueryBoundWitnessWrapper<T> {\n assertEx(!Array.isArray(obj), 'Array can not be converted to QueryBoundWitnessWrapper')\n switch (typeof obj) {\n case 'object': {\n const castWrapper = obj as QueryBoundWitnessWrapper<T>\n const wrapper = castWrapper?.isQueryBoundWitnessWrapper ? castWrapper : new QueryBoundWitnessWrapper<T>(obj as QueryBoundWitness, payloads)\n /*if (!wrapper.valid) {\n console.warn(`Parsed invalid QueryBoundWitness ${JSON.stringify(wrapper.errors.map((error) => error.message))}`)\n }*/\n return wrapper\n }\n }\n throw Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.allPayloadMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, `Missing Query [${this.boundwitness}]`)\n }\n\n override async getWrappedPayloads(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n compact(\n (\n await PayloadHasher.filterExclude(\n (await super.getWrappedPayloads()).map((wrapper) => wrapper.payload()),\n this.payload().query,\n )\n ).map((payload) => PayloadWrapper.wrap(payload)),\n )\n return this._payloadsWithoutQuery\n }\n}\n"],"mappings":"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","names":["assertEx","PayloadWrapper","assertEx","PayloadWrapper","assertEx","BoundWitnessWrapper","PayloadHasher","PayloadWrapper"]}
|
package/package.json
CHANGED
|
@@ -10,26 +10,26 @@
|
|
|
10
10
|
"url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js/issues"
|
|
11
11
|
},
|
|
12
12
|
"dependencies": {
|
|
13
|
-
"@xylabs/assert": "^2.13.
|
|
14
|
-
"@xylabs/
|
|
15
|
-
"@xylabs/
|
|
16
|
-
"@xylabs/lodash": "^2.13.
|
|
17
|
-
"@xylabs/logger": "^2.13.
|
|
18
|
-
"@xyo-network/account-model": "~2.
|
|
19
|
-
"@xyo-network/boundwitness-model": "~2.
|
|
20
|
-
"@xyo-network/boundwitness-validator": "~2.
|
|
21
|
-
"@xyo-network/boundwitness-wrapper": "~2.
|
|
22
|
-
"@xyo-network/core": "~2.
|
|
23
|
-
"@xyo-network/payload": "~2.
|
|
24
|
-
"@xyo-network/payload-model": "~2.
|
|
25
|
-
"@xyo-network/payload-wrapper": "~2.
|
|
13
|
+
"@xylabs/assert": "^2.13.10",
|
|
14
|
+
"@xylabs/error": "^2.13.10",
|
|
15
|
+
"@xylabs/hex": "^2.13.10",
|
|
16
|
+
"@xylabs/lodash": "^2.13.10",
|
|
17
|
+
"@xylabs/logger": "^2.13.10",
|
|
18
|
+
"@xyo-network/account-model": "~2.82.0-rc.1",
|
|
19
|
+
"@xyo-network/boundwitness-model": "~2.82.0-rc.1",
|
|
20
|
+
"@xyo-network/boundwitness-validator": "~2.82.0-rc.1",
|
|
21
|
+
"@xyo-network/boundwitness-wrapper": "~2.82.0-rc.1",
|
|
22
|
+
"@xyo-network/core": "~2.82.0-rc.1",
|
|
23
|
+
"@xyo-network/payload": "~2.82.0-rc.1",
|
|
24
|
+
"@xyo-network/payload-model": "~2.82.0-rc.1",
|
|
25
|
+
"@xyo-network/payload-wrapper": "~2.82.0-rc.1",
|
|
26
26
|
"async-mutex": "^0.4.0"
|
|
27
27
|
},
|
|
28
28
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
29
29
|
"devDependencies": {
|
|
30
|
-
"@xylabs/ts-scripts-yarn3": "^3.2.
|
|
31
|
-
"@xylabs/tsconfig": "^3.2.
|
|
32
|
-
"@xyo-network/account": "~2.
|
|
30
|
+
"@xylabs/ts-scripts-yarn3": "^3.2.10",
|
|
31
|
+
"@xylabs/tsconfig": "^3.2.10",
|
|
32
|
+
"@xyo-network/account": "~2.82.0-rc.1",
|
|
33
33
|
"typescript": "^5.3.2"
|
|
34
34
|
},
|
|
35
35
|
"docs": "dist/docs.json",
|
|
@@ -71,5 +71,6 @@
|
|
|
71
71
|
},
|
|
72
72
|
"sideEffects": false,
|
|
73
73
|
"types": "dist/node/index.d.ts",
|
|
74
|
-
"version": "2.
|
|
74
|
+
"version": "2.82.0-rc.1",
|
|
75
|
+
"stableVersion": "2.81.7"
|
|
75
76
|
}
|
package/src/Builder.ts
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
|
-
import {
|
|
2
|
+
import { asHex } from '@xylabs/hex'
|
|
3
3
|
import { Logger } from '@xylabs/logger'
|
|
4
4
|
import { AccountInstance } from '@xyo-network/account-model'
|
|
5
5
|
import { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'
|
|
6
6
|
import { BoundWitnessWrapper } from '@xyo-network/boundwitness-wrapper'
|
|
7
|
-
import {
|
|
7
|
+
import { PayloadHasher, sortFields, toUint8Array } from '@xyo-network/core'
|
|
8
8
|
import { PayloadWrapper } from '@xyo-network/payload'
|
|
9
9
|
import { ModuleError, Payload } from '@xyo-network/payload-model'
|
|
10
10
|
import { Mutex } from 'async-mutex'
|
|
@@ -24,7 +24,7 @@ export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: st
|
|
|
24
24
|
private _accounts: AccountInstance[] = []
|
|
25
25
|
private _errorHashes: string[] | undefined
|
|
26
26
|
private _errors: ModuleError[] = []
|
|
27
|
-
private _payloadHashes:
|
|
27
|
+
private _payloadHashes: ArrayBuffer[] | undefined
|
|
28
28
|
private _payloadSchemas: string[] | undefined
|
|
29
29
|
private _payloads: TPayload[] = []
|
|
30
30
|
private _sourceQuery: string | undefined
|
|
@@ -50,20 +50,20 @@ export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: st
|
|
|
50
50
|
}
|
|
51
51
|
return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
52
52
|
const hashableFields = await this.hashableFields()
|
|
53
|
-
const
|
|
53
|
+
const hash = await BoundWitnessWrapper.hashAsync(hashableFields, 'buffer')
|
|
54
54
|
|
|
55
55
|
/* get all the previousHashes to verify atomic signing */
|
|
56
|
-
const previousHashes = this._accounts.map((account) => account.previousHash)
|
|
56
|
+
const previousHashes = this._accounts.map((account) => toUint8Array(account.previousHash))
|
|
57
57
|
|
|
58
58
|
const ret: TBoundWitness = {
|
|
59
59
|
...hashableFields,
|
|
60
|
-
_signatures: await this.signatures(
|
|
60
|
+
_signatures: await this.signatures(hash, previousHashes),
|
|
61
61
|
}
|
|
62
62
|
if (meta ?? this.config?.meta) {
|
|
63
63
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
64
64
|
const bwWithMeta = ret as any
|
|
65
65
|
bwWithMeta._client = 'js'
|
|
66
|
-
bwWithMeta._hash =
|
|
66
|
+
bwWithMeta._hash = hash
|
|
67
67
|
bwWithMeta._timestamp = this._timestamp
|
|
68
68
|
}
|
|
69
69
|
if (this.config.inlinePayloads) {
|
|
@@ -97,7 +97,7 @@ export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: st
|
|
|
97
97
|
async hashableFields(): Promise<TBoundWitness> {
|
|
98
98
|
const addresses = this._accounts.map((account) => account.address)
|
|
99
99
|
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)
|
|
100
|
-
const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes')
|
|
100
|
+
const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes').map((x) => asHex(x))
|
|
101
101
|
const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')
|
|
102
102
|
const result: TBoundWitness = {
|
|
103
103
|
addresses: assertEx(addresses, 'Missing addresses'),
|
|
@@ -124,7 +124,7 @@ export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: st
|
|
|
124
124
|
return result
|
|
125
125
|
}
|
|
126
126
|
|
|
127
|
-
hashes(hashes:
|
|
127
|
+
hashes(hashes: ArrayBuffer[], schema: string[]) {
|
|
128
128
|
assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')
|
|
129
129
|
this._payloadHashes = hashes
|
|
130
130
|
this._payloadSchemas = schema
|
|
@@ -164,15 +164,13 @@ export class BoundWitnessBuilder<TBoundWitness extends BoundWitness<{ schema: st
|
|
|
164
164
|
return this
|
|
165
165
|
}
|
|
166
166
|
|
|
167
|
-
protected async signatures(
|
|
168
|
-
const
|
|
169
|
-
return await Promise.all(
|
|
170
|
-
this._accounts.map(async (account, index) => Buffer.from(await account.sign(hash, previousHashes[index])).toString('hex')),
|
|
171
|
-
)
|
|
167
|
+
protected async signatures(hash: ArrayBuffer, previousHashes: (ArrayBuffer | undefined)[]) {
|
|
168
|
+
const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))
|
|
169
|
+
return await Promise.all(this._accounts.map(async (account, index) => await account.sign(hash, previousHashesBytes[index])))
|
|
172
170
|
}
|
|
173
171
|
|
|
174
|
-
private async getPayloadHashes(): Promise<
|
|
175
|
-
return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload))))
|
|
172
|
+
private async getPayloadHashes(): Promise<ArrayBuffer[]> {
|
|
173
|
+
return this._payloadHashes ?? (await Promise.all(this._payloads.map((payload) => PayloadHasher.hashAsync(payload, 'buffer'))))
|
|
176
174
|
}
|
|
177
175
|
|
|
178
176
|
private inlinePayloads() {
|