@xyo-network/boundwitness-builder 2.89.0 → 2.89.2
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/Builder.d.cts +1 -1
- package/dist/browser/Builder.d.cts.map +1 -1
- package/dist/browser/Builder.d.mts +1 -1
- package/dist/browser/Builder.d.mts.map +1 -1
- package/dist/browser/Builder.d.ts +1 -1
- package/dist/browser/Builder.d.ts.map +1 -1
- package/dist/browser/Query/QueryBoundWitnessBuilder.d.cts +3 -2
- package/dist/browser/Query/QueryBoundWitnessBuilder.d.cts.map +1 -1
- package/dist/browser/Query/QueryBoundWitnessBuilder.d.mts +3 -2
- package/dist/browser/Query/QueryBoundWitnessBuilder.d.mts.map +1 -1
- package/dist/browser/Query/QueryBoundWitnessBuilder.d.ts +3 -2
- package/dist/browser/Query/QueryBoundWitnessBuilder.d.ts.map +1 -1
- package/dist/browser/index.cjs +29 -22
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +29 -22
- package/dist/browser/index.js.map +1 -1
- package/dist/node/Builder.d.cts +1 -1
- package/dist/node/Builder.d.cts.map +1 -1
- package/dist/node/Builder.d.mts +1 -1
- package/dist/node/Builder.d.mts.map +1 -1
- package/dist/node/Builder.d.ts +1 -1
- package/dist/node/Builder.d.ts.map +1 -1
- package/dist/node/Query/QueryBoundWitnessBuilder.d.cts +3 -2
- package/dist/node/Query/QueryBoundWitnessBuilder.d.cts.map +1 -1
- package/dist/node/Query/QueryBoundWitnessBuilder.d.mts +3 -2
- package/dist/node/Query/QueryBoundWitnessBuilder.d.mts.map +1 -1
- package/dist/node/Query/QueryBoundWitnessBuilder.d.ts +3 -2
- package/dist/node/Query/QueryBoundWitnessBuilder.d.ts.map +1 -1
- package/dist/node/index.cjs +29 -22
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +29 -22
- package/dist/node/index.js.map +1 -1
- package/package.json +10 -10
- package/src/Builder.ts +26 -31
- package/src/Query/QueryBoundWitnessBuilder.ts +10 -2
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { QueryBoundWitness } from '@xyo-network/boundwitness-model';
|
|
2
|
-
import { Query } from '@xyo-network/payload-model';
|
|
2
|
+
import { Query, WithMeta } from '@xyo-network/payload-model';
|
|
3
3
|
import { BoundWitnessBuilder } from '../Builder';
|
|
4
4
|
export declare class QueryBoundWitnessBuilder<TBoundWitness extends QueryBoundWitness = QueryBoundWitness, TQuery extends Query = Query> extends BoundWitnessBuilder<TBoundWitness> {
|
|
5
5
|
private _query;
|
|
6
|
-
|
|
6
|
+
dataHashableFields(): Promise<Omit<TBoundWitness, '$hash' | '$meta'>>;
|
|
7
|
+
hashableFields(): Promise<WithMeta<TBoundWitness>>;
|
|
7
8
|
query<T extends TQuery>(query: T): Promise<this>;
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=QueryBoundWitnessBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,iCAAiC,CAAA;AAE5F,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,iCAAiC,CAAA;AAE5F,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAA8B;IAE7B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAQrE,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAQ3D,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKvC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { QueryBoundWitness } from '@xyo-network/boundwitness-model';
|
|
2
|
-
import { Query } from '@xyo-network/payload-model';
|
|
2
|
+
import { Query, WithMeta } from '@xyo-network/payload-model';
|
|
3
3
|
import { BoundWitnessBuilder } from '../Builder';
|
|
4
4
|
export declare class QueryBoundWitnessBuilder<TBoundWitness extends QueryBoundWitness = QueryBoundWitness, TQuery extends Query = Query> extends BoundWitnessBuilder<TBoundWitness> {
|
|
5
5
|
private _query;
|
|
6
|
-
|
|
6
|
+
dataHashableFields(): Promise<Omit<TBoundWitness, '$hash' | '$meta'>>;
|
|
7
|
+
hashableFields(): Promise<WithMeta<TBoundWitness>>;
|
|
7
8
|
query<T extends TQuery>(query: T): Promise<this>;
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=QueryBoundWitnessBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,iCAAiC,CAAA;AAE5F,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,iCAAiC,CAAA;AAE5F,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAA8B;IAE7B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAQrE,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAQ3D,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKvC"}
|
|
@@ -1,9 +1,10 @@
|
|
|
1
1
|
import { QueryBoundWitness } from '@xyo-network/boundwitness-model';
|
|
2
|
-
import { Query } from '@xyo-network/payload-model';
|
|
2
|
+
import { Query, WithMeta } from '@xyo-network/payload-model';
|
|
3
3
|
import { BoundWitnessBuilder } from '../Builder';
|
|
4
4
|
export declare class QueryBoundWitnessBuilder<TBoundWitness extends QueryBoundWitness = QueryBoundWitness, TQuery extends Query = Query> extends BoundWitnessBuilder<TBoundWitness> {
|
|
5
5
|
private _query;
|
|
6
|
-
|
|
6
|
+
dataHashableFields(): Promise<Omit<TBoundWitness, '$hash' | '$meta'>>;
|
|
7
|
+
hashableFields(): Promise<WithMeta<TBoundWitness>>;
|
|
7
8
|
query<T extends TQuery>(query: T): Promise<this>;
|
|
8
9
|
}
|
|
9
10
|
//# sourceMappingURL=QueryBoundWitnessBuilder.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,iCAAiC,CAAA;AAE5F,OAAO,EAAE,KAAK,
|
|
1
|
+
{"version":3,"file":"QueryBoundWitnessBuilder.d.ts","sourceRoot":"","sources":["../../../src/Query/QueryBoundWitnessBuilder.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,iBAAiB,EAA2B,MAAM,iCAAiC,CAAA;AAE5F,OAAO,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,4BAA4B,CAAA;AAE5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,YAAY,CAAA;AAEhD,qBAAa,wBAAwB,CACnC,aAAa,SAAS,iBAAiB,GAAG,iBAAiB,EAC3D,MAAM,SAAS,KAAK,GAAG,KAAK,CAC5B,SAAQ,mBAAmB,CAAC,aAAa,CAAC;IAC1C,OAAO,CAAC,MAAM,CAA8B;IAE7B,kBAAkB,IAAI,OAAO,CAAC,IAAI,CAAC,aAAa,EAAE,OAAO,GAAG,OAAO,CAAC,CAAC;IAQrE,cAAc,IAAI,OAAO,CAAC,QAAQ,CAAC,aAAa,CAAC,CAAC;IAQ3D,KAAK,CAAC,CAAC,SAAS,MAAM,EAAE,KAAK,EAAE,CAAC;CAKvC"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -84,7 +84,7 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
|
|
|
84
84
|
}
|
|
85
85
|
async build() {
|
|
86
86
|
return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
87
|
-
const hashableFields = await this.
|
|
87
|
+
const hashableFields = await this.dataHashableFields();
|
|
88
88
|
const hash = (await import_payload.PayloadBuilder.build(hashableFields)).$hash;
|
|
89
89
|
const previousHashes = this._accounts.map((account) => account.previousHash);
|
|
90
90
|
const metaHolder = {};
|
|
@@ -112,25 +112,7 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
|
|
|
112
112
|
];
|
|
113
113
|
});
|
|
114
114
|
}
|
|
115
|
-
async
|
|
116
|
-
const unwrappedPayload = await import_payload.PayloadWrapper.unwrap(payload);
|
|
117
|
-
(0, import_assert.assertEx)(this._errorHashes === void 0, "Can not set errors when hashes already set");
|
|
118
|
-
if (unwrappedPayload) {
|
|
119
|
-
this._errors.push((0, import_assert.assertEx)((0, import_hash.sortFields)(unwrappedPayload)));
|
|
120
|
-
}
|
|
121
|
-
return this;
|
|
122
|
-
}
|
|
123
|
-
async errors(errors) {
|
|
124
|
-
if (errors) {
|
|
125
|
-
await Promise.all(errors.map(async (error) => {
|
|
126
|
-
if (error !== null) {
|
|
127
|
-
await this.error(error);
|
|
128
|
-
}
|
|
129
|
-
}));
|
|
130
|
-
}
|
|
131
|
-
return this;
|
|
132
|
-
}
|
|
133
|
-
async hashableFields() {
|
|
115
|
+
async dataHashableFields() {
|
|
134
116
|
var _a, _b;
|
|
135
117
|
const addresses = this._accounts.map((account) => (0, import_hex.hexFromArrayBuffer)(account.addressBytes, {
|
|
136
118
|
prefix: false
|
|
@@ -138,13 +120,13 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
|
|
|
138
120
|
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
|
|
139
121
|
const payload_hashes = (0, import_assert.assertEx)(await this.getPayloadHashes(), "Missing payload_hashes");
|
|
140
122
|
const payload_schemas = (0, import_assert.assertEx)(this._payload_schemas, "Missing payload_schemas");
|
|
141
|
-
const
|
|
142
|
-
...await super.hashableFields(),
|
|
123
|
+
const fields = {
|
|
143
124
|
addresses,
|
|
144
125
|
payload_hashes,
|
|
145
126
|
payload_schemas,
|
|
146
127
|
previous_hashes
|
|
147
128
|
};
|
|
129
|
+
const result = await _BoundWitnessBuilder.dataHashableFields(this._schema, fields);
|
|
148
130
|
(0, import_assert.assertEx)(((_a = result.payload_hashes) == null ? void 0 : _a.length) === ((_b = result.payload_schemas) == null ? void 0 : _b.length), "Payload hash/schema mismatch");
|
|
149
131
|
(0, import_assert.assertEx)(!result.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
|
|
150
132
|
(0, import_assert.assertEx)(!result.payload_schemas.some((schema) => !schema), "nulls found in schemas");
|
|
@@ -155,6 +137,24 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
|
|
|
155
137
|
}
|
|
156
138
|
return result;
|
|
157
139
|
}
|
|
140
|
+
async error(payload) {
|
|
141
|
+
const unwrappedPayload = await import_payload.PayloadWrapper.unwrap(payload);
|
|
142
|
+
(0, import_assert.assertEx)(this._errorHashes === void 0, "Can not set errors when hashes already set");
|
|
143
|
+
if (unwrappedPayload) {
|
|
144
|
+
this._errors.push((0, import_assert.assertEx)((0, import_hash.sortFields)(unwrappedPayload)));
|
|
145
|
+
}
|
|
146
|
+
return this;
|
|
147
|
+
}
|
|
148
|
+
async errors(errors) {
|
|
149
|
+
if (errors) {
|
|
150
|
+
await Promise.all(errors.map(async (error) => {
|
|
151
|
+
if (error !== null) {
|
|
152
|
+
await this.error(error);
|
|
153
|
+
}
|
|
154
|
+
}));
|
|
155
|
+
}
|
|
156
|
+
return this;
|
|
157
|
+
}
|
|
158
158
|
hashes(hashes, schema) {
|
|
159
159
|
(0, import_assert.assertEx)(this.payloads.length === 0, "Can not set hashes when payloads already set");
|
|
160
160
|
this._payloadHashes = hashes;
|
|
@@ -215,6 +215,13 @@ var import_boundwitness_model2 = require("@xyo-network/boundwitness-model");
|
|
|
215
215
|
var import_payload2 = require("@xyo-network/payload");
|
|
216
216
|
var _QueryBoundWitnessBuilder = class _QueryBoundWitnessBuilder extends BoundWitnessBuilder {
|
|
217
217
|
_query;
|
|
218
|
+
async dataHashableFields() {
|
|
219
|
+
return {
|
|
220
|
+
...await super.dataHashableFields(),
|
|
221
|
+
query: (0, import_assert2.assertEx)(this._query, "No Query Specified").$hash,
|
|
222
|
+
schema: import_boundwitness_model2.QueryBoundWitnessSchema
|
|
223
|
+
};
|
|
224
|
+
}
|
|
218
225
|
async hashableFields() {
|
|
219
226
|
return {
|
|
220
227
|
...await super.hashableFields(),
|
package/dist/node/index.cjs.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 { toArrayBuffer, toUint8Array } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport { Address, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { JsonObject } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { sortFields } from '@xyo-network/hash'\nimport { PayloadBuilder, PayloadBuilderBase, PayloadBuilderOptions, PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\ntype GeneratedBoundWitnessFields = 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'\n\nexport interface BoundWitnessBuilderOptions<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload>\n extends Omit<PayloadBuilderOptions<Omit<T, GeneratedBoundWitnessFields>>, 'schema'> {\n readonly accounts?: AccountInstance[]\n readonly destination?: string[]\n readonly payloadHashes?: T['payload_hashes']\n readonly payloadSchemas?: T['payload_schemas']\n readonly payloads?: TPayload[]\n readonly sourceQuery?: Hash\n readonly timestamp?: boolean | number\n}\n\nexport class BoundWitnessBuilder<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload> extends PayloadBuilderBase<\n Omit<T, GeneratedBoundWitnessFields>,\n BoundWitnessBuilderOptions<T> & { schema: BoundWitnessSchema }\n> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[]\n private _destination?: string[]\n private _errorHashes?: string[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: string[]\n private _payloadSchemas?: string[]\n private _payloads: TPayload[]\n private _sourceQuery?: Hash\n private _timestamp: boolean | number\n\n constructor(options?: BoundWitnessBuilderOptions<T, TPayload>) {\n super({ ...options, schema: BoundWitnessSchema })\n const { accounts, payloadHashes, payloadSchemas, payloads, sourceQuery, timestamp, destination } = options ?? {}\n this._accounts = accounts ?? []\n this._payloadHashes = payloadHashes\n this._payloadSchemas = payloadSchemas\n this._payloads = payloads ?? []\n this._sourceQuery = sourceQuery\n this._destination = destination\n this._timestamp = timestamp ?? true\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 static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(payload: T, address: Address) {\n return payload.previous_hashes[this.addressIndex(payload, address)]\n }\n\n static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$meta.signatures[this.addressIndex(payload, address)]\n }\n\n async build(): Promise<[WithMeta<T>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const hash = (await PayloadBuilder.build(hashableFields)).$hash\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const metaHolder: { $meta?: JsonObject } = {}\n\n if (hashableFields.addresses.length > 0) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.signatures = await this.signatures(hash, previousHashes)\n }\n\n if (this._sourceQuery) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.sourceQuery = this._sourceQuery\n }\n\n if (this._destination) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.destination = this._destination\n }\n\n const ret: WithMeta<T> = {\n ...hashableFields,\n $hash: hash,\n ...metaHolder,\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n async error(payload?: ModuleError) {\n const unwrappedPayload = await 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 async errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n await Promise.all(\n errors.map(async (error) => {\n if (error !== null) {\n await this.error(error)\n }\n }),\n )\n }\n return this\n }\n\n override async hashableFields(): Promise<T> {\n const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))\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: T = {\n ...(await super.hashableFields()),\n addresses,\n payload_hashes,\n payload_schemas,\n previous_hashes,\n } as T\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.some((schema) => !schema), 'nulls found in schemas')\n\n if (typeof this._timestamp === 'number') {\n result.timestamp = this._timestamp\n } else if (this._timestamp) {\n result.timestamp = Date.now()\n }\n\n return result\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\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 async payload(payload?: TPayload) {\n const unwrappedPayload = await 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 async payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n await Promise.all(\n payloads.map(async (payload) => {\n if (payload !== null) {\n await this.payload(payload)\n }\n }),\n )\n return this\n }\n\n sourceQuery(query?: Hash) {\n this._sourceQuery = query\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: Hash, previousHashes: (Hash | ArrayBuffer | undefined)[]): Promise<string[]> {\n const hash = toArrayBuffer(_hash)\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hash, previousHashesBytes[index]))))\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map(async (payload) => (await PayloadBuilder.build(payload)).$hash)))\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Query, WithMeta } from '@xyo-network/payload-model'\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: WithMeta<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(this._query, 'No Query Specified').$hash,\n schema: QueryBoundWitnessSchema,\n }\n }\n\n async query<T extends TQuery>(query: T) {\n this._query = await PayloadBuilder.build(query)\n await this.payload(this._query)\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Payload, 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\n static async parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): Promise<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 =\n castWrapper instanceof QueryBoundWitnessWrapper\n ? castWrapper\n : new QueryBoundWitnessWrapper<T>(\n await PayloadBuilder.build(obj as QueryBoundWitness),\n payloads ? await Promise.all(payloads.map((payload) => PayloadBuilder.build(payload))) : undefined,\n )\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 new Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getPayloadsWithoutQuery(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n (await Promise.all(\n compact((await PayloadBuilder.filterExclude(this.payloads, this.jsonPayload().query)).map((payload) => PayloadWrapper.wrap(payload))),\n ))\n return this._payloadsWithoutQuery\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.payloadsDataHashMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, () => `Missing Query [${this.boundwitness}]`)\n }\n}\n"],"mappings":"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","names":["BoundWitnessBuilder","PayloadBuilderBase","_accounts","_destination","_errorHashes","_errors","_payloadHashes","_payloadSchemas","_payloads","_sourceQuery","_timestamp","constructor","options","schema","BoundWitnessSchema","accounts","payloadHashes","payloadSchemas","payloads","sourceQuery","timestamp","destination","_payload_schemas","map","payload","assertEx","missingSchemaMessage","addressIndex","address","index","addresses","indexOf","Error","previousHash","previous_hashes","signature","$meta","signatures","build","_buildMutex","runExclusive","hashableFields","hash","PayloadBuilder","$hash","previousHashes","account","metaHolder","length","ret","error","unwrappedPayload","PayloadWrapper","unwrap","undefined","push","sortFields","errors","Promise","all","hexFromArrayBuffer","addressBytes","prefix","payload_hashes","getPayloadHashes","payload_schemas","result","some","Date","now","hashes","query","witness","witnesses","_hash","toArrayBuffer","previousHashesBytes","ph","toUint8Array","sign","JSON","stringify","Mutex","import_assert","import_boundwitness_model","import_payload","QueryBoundWitnessBuilder","BoundWitnessBuilder","_query","hashableFields","query","assertEx","$hash","schema","QueryBoundWitnessSchema","PayloadBuilder","build","payload","import_assert","import_payload","QueryBoundWitnessWrapper","BoundWitnessWrapper","_payloadsWithoutQuery","_query","parseQuery","obj","payloads","assertEx","Array","isArray","castWrapper","wrapper","PayloadBuilder","build","Promise","all","map","payload","undefined","Error","getPayloadsWithoutQuery","compact","filterExclude","jsonPayload","query","PayloadWrapper","wrap","getQuery","payloadMap","payloadsDataHashMap","boundwitness"]}
|
|
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 { toArrayBuffer, toUint8Array } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport { Address, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { JsonObject } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { sortFields } from '@xyo-network/hash'\nimport { PayloadBuilder, PayloadBuilderBase, PayloadBuilderOptions, PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\ntype GeneratedBoundWitnessFields = 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'\n\nexport interface BoundWitnessBuilderOptions<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload>\n extends Omit<PayloadBuilderOptions<Omit<T, GeneratedBoundWitnessFields>>, 'schema'> {\n readonly accounts?: AccountInstance[]\n readonly destination?: string[]\n readonly payloadHashes?: T['payload_hashes']\n readonly payloadSchemas?: T['payload_schemas']\n readonly payloads?: TPayload[]\n readonly sourceQuery?: Hash\n readonly timestamp?: boolean | number\n}\n\nexport class BoundWitnessBuilder<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload> extends PayloadBuilderBase<\n Omit<T, GeneratedBoundWitnessFields>,\n BoundWitnessBuilderOptions<T> & { schema: BoundWitnessSchema }\n> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[]\n private _destination?: string[]\n private _errorHashes?: string[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: string[]\n private _payloadSchemas?: string[]\n private _payloads: TPayload[]\n private _sourceQuery?: Hash\n private _timestamp: boolean | number\n\n constructor(options?: BoundWitnessBuilderOptions<T, TPayload>) {\n super({ ...options, schema: BoundWitnessSchema })\n const { accounts, payloadHashes, payloadSchemas, payloads, sourceQuery, timestamp, destination } = options ?? {}\n this._accounts = accounts ?? []\n this._payloadHashes = payloadHashes\n this._payloadSchemas = payloadSchemas\n this._payloads = payloads ?? []\n this._sourceQuery = sourceQuery\n this._destination = destination\n this._timestamp = timestamp ?? true\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 static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(payload: T, address: Address) {\n return payload.previous_hashes[this.addressIndex(payload, address)]\n }\n\n static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$meta.signatures[this.addressIndex(payload, address)]\n }\n\n async build(): Promise<[WithMeta<T>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.dataHashableFields()\n const hash = (await PayloadBuilder.build(hashableFields)).$hash\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const metaHolder: { $meta?: JsonObject } = {}\n\n if (hashableFields.addresses.length > 0) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.signatures = await this.signatures(hash, previousHashes)\n }\n\n if (this._sourceQuery) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.sourceQuery = this._sourceQuery\n }\n\n if (this._destination) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.destination = this._destination\n }\n\n const ret = {\n ...hashableFields,\n $hash: hash,\n ...metaHolder,\n } as WithMeta<T>\n return [ret, this._payloads, this._errors]\n })\n }\n\n override async dataHashableFields(): Promise<Omit<T, '$meta' | '$hash'>> {\n const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))\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 fields = { addresses, payload_hashes, payload_schemas, previous_hashes } as Omit<T, '$meta' | '$hash' | 'schema'>\n const result = await BoundWitnessBuilder.dataHashableFields<T>(this._schema, fields)\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.some((schema) => !schema), 'nulls found in schemas')\n\n if (typeof this._timestamp === 'number') {\n result.timestamp = this._timestamp\n } else if (this._timestamp) {\n result.timestamp = Date.now()\n }\n\n return result as Omit<T, '$meta' | '$hash'>\n }\n\n async error(payload?: ModuleError) {\n const unwrappedPayload = await 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 async errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n await Promise.all(\n errors.map(async (error) => {\n if (error !== null) {\n await this.error(error)\n }\n }),\n )\n }\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\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 async payload(payload?: TPayload) {\n const unwrappedPayload = await 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 async payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n await Promise.all(\n payloads.map(async (payload) => {\n if (payload !== null) {\n await this.payload(payload)\n }\n }),\n )\n return this\n }\n\n sourceQuery(query?: Hash) {\n this._sourceQuery = query\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: Hash, previousHashes: (Hash | ArrayBuffer | undefined)[]): Promise<string[]> {\n const hash = toArrayBuffer(_hash)\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hash, previousHashesBytes[index]))))\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map(async (payload) => (await PayloadBuilder.build(payload)).$hash)))\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Query, WithMeta } from '@xyo-network/payload-model'\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: WithMeta<TQuery> | undefined\n\n override async dataHashableFields(): Promise<Omit<TBoundWitness, '$hash' | '$meta'>> {\n return {\n ...(await super.dataHashableFields()),\n query: assertEx(this._query, 'No Query Specified').$hash,\n schema: QueryBoundWitnessSchema,\n } as Omit<TBoundWitness, '$hash' | '$meta'>\n }\n\n override async hashableFields(): Promise<WithMeta<TBoundWitness>> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(this._query, 'No Query Specified').$hash,\n schema: QueryBoundWitnessSchema,\n } as WithMeta<TBoundWitness>\n }\n\n async query<T extends TQuery>(query: T) {\n this._query = await PayloadBuilder.build(query)\n await this.payload(this._query)\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Payload, 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\n static async parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): Promise<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 =\n castWrapper instanceof QueryBoundWitnessWrapper\n ? castWrapper\n : new QueryBoundWitnessWrapper<T>(\n await PayloadBuilder.build(obj as QueryBoundWitness),\n payloads ? await Promise.all(payloads.map((payload) => PayloadBuilder.build(payload))) : undefined,\n )\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 new Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getPayloadsWithoutQuery(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n (await Promise.all(\n compact((await PayloadBuilder.filterExclude(this.payloads, this.jsonPayload().query)).map((payload) => PayloadWrapper.wrap(payload))),\n ))\n return this._payloadsWithoutQuery\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.payloadsDataHashMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, () => `Missing Query [${this.boundwitness}]`)\n }\n}\n"],"mappings":"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","names":["BoundWitnessBuilder","PayloadBuilderBase","_accounts","_destination","_errorHashes","_errors","_payloadHashes","_payloadSchemas","_payloads","_sourceQuery","_timestamp","constructor","options","schema","BoundWitnessSchema","accounts","payloadHashes","payloadSchemas","payloads","sourceQuery","timestamp","destination","_payload_schemas","map","payload","assertEx","missingSchemaMessage","addressIndex","address","index","addresses","indexOf","Error","previousHash","previous_hashes","signature","$meta","signatures","build","_buildMutex","runExclusive","hashableFields","dataHashableFields","hash","PayloadBuilder","$hash","previousHashes","account","metaHolder","length","ret","hexFromArrayBuffer","addressBytes","prefix","payload_hashes","getPayloadHashes","payload_schemas","fields","result","_schema","some","Date","now","error","unwrappedPayload","PayloadWrapper","unwrap","undefined","push","sortFields","errors","Promise","all","hashes","query","witness","witnesses","_hash","toArrayBuffer","previousHashesBytes","ph","toUint8Array","sign","JSON","stringify","Mutex","import_assert","import_boundwitness_model","import_payload","QueryBoundWitnessBuilder","BoundWitnessBuilder","_query","dataHashableFields","query","assertEx","$hash","schema","QueryBoundWitnessSchema","hashableFields","PayloadBuilder","build","payload","import_assert","import_payload","QueryBoundWitnessWrapper","BoundWitnessWrapper","_payloadsWithoutQuery","_query","parseQuery","obj","payloads","assertEx","Array","isArray","castWrapper","wrapper","PayloadBuilder","build","Promise","all","map","payload","undefined","Error","getPayloadsWithoutQuery","compact","filterExclude","jsonPayload","query","PayloadWrapper","wrap","getQuery","payloadMap","payloadsDataHashMap","boundwitness"]}
|
package/dist/node/index.js
CHANGED
|
@@ -58,7 +58,7 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
|
|
|
58
58
|
}
|
|
59
59
|
async build() {
|
|
60
60
|
return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
61
|
-
const hashableFields = await this.
|
|
61
|
+
const hashableFields = await this.dataHashableFields();
|
|
62
62
|
const hash = (await PayloadBuilder.build(hashableFields)).$hash;
|
|
63
63
|
const previousHashes = this._accounts.map((account) => account.previousHash);
|
|
64
64
|
const metaHolder = {};
|
|
@@ -86,25 +86,7 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
|
|
|
86
86
|
];
|
|
87
87
|
});
|
|
88
88
|
}
|
|
89
|
-
async
|
|
90
|
-
const unwrappedPayload = await PayloadWrapper.unwrap(payload);
|
|
91
|
-
assertEx(this._errorHashes === void 0, "Can not set errors when hashes already set");
|
|
92
|
-
if (unwrappedPayload) {
|
|
93
|
-
this._errors.push(assertEx(sortFields(unwrappedPayload)));
|
|
94
|
-
}
|
|
95
|
-
return this;
|
|
96
|
-
}
|
|
97
|
-
async errors(errors) {
|
|
98
|
-
if (errors) {
|
|
99
|
-
await Promise.all(errors.map(async (error) => {
|
|
100
|
-
if (error !== null) {
|
|
101
|
-
await this.error(error);
|
|
102
|
-
}
|
|
103
|
-
}));
|
|
104
|
-
}
|
|
105
|
-
return this;
|
|
106
|
-
}
|
|
107
|
-
async hashableFields() {
|
|
89
|
+
async dataHashableFields() {
|
|
108
90
|
var _a, _b;
|
|
109
91
|
const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, {
|
|
110
92
|
prefix: false
|
|
@@ -112,13 +94,13 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
|
|
|
112
94
|
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
|
|
113
95
|
const payload_hashes = assertEx(await this.getPayloadHashes(), "Missing payload_hashes");
|
|
114
96
|
const payload_schemas = assertEx(this._payload_schemas, "Missing payload_schemas");
|
|
115
|
-
const
|
|
116
|
-
...await super.hashableFields(),
|
|
97
|
+
const fields = {
|
|
117
98
|
addresses,
|
|
118
99
|
payload_hashes,
|
|
119
100
|
payload_schemas,
|
|
120
101
|
previous_hashes
|
|
121
102
|
};
|
|
103
|
+
const result = await _BoundWitnessBuilder.dataHashableFields(this._schema, fields);
|
|
122
104
|
assertEx(((_a = result.payload_hashes) == null ? void 0 : _a.length) === ((_b = result.payload_schemas) == null ? void 0 : _b.length), "Payload hash/schema mismatch");
|
|
123
105
|
assertEx(!result.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
|
|
124
106
|
assertEx(!result.payload_schemas.some((schema) => !schema), "nulls found in schemas");
|
|
@@ -129,6 +111,24 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
|
|
|
129
111
|
}
|
|
130
112
|
return result;
|
|
131
113
|
}
|
|
114
|
+
async error(payload) {
|
|
115
|
+
const unwrappedPayload = await PayloadWrapper.unwrap(payload);
|
|
116
|
+
assertEx(this._errorHashes === void 0, "Can not set errors when hashes already set");
|
|
117
|
+
if (unwrappedPayload) {
|
|
118
|
+
this._errors.push(assertEx(sortFields(unwrappedPayload)));
|
|
119
|
+
}
|
|
120
|
+
return this;
|
|
121
|
+
}
|
|
122
|
+
async errors(errors) {
|
|
123
|
+
if (errors) {
|
|
124
|
+
await Promise.all(errors.map(async (error) => {
|
|
125
|
+
if (error !== null) {
|
|
126
|
+
await this.error(error);
|
|
127
|
+
}
|
|
128
|
+
}));
|
|
129
|
+
}
|
|
130
|
+
return this;
|
|
131
|
+
}
|
|
132
132
|
hashes(hashes, schema) {
|
|
133
133
|
assertEx(this.payloads.length === 0, "Can not set hashes when payloads already set");
|
|
134
134
|
this._payloadHashes = hashes;
|
|
@@ -189,6 +189,13 @@ import { QueryBoundWitnessSchema } from "@xyo-network/boundwitness-model";
|
|
|
189
189
|
import { PayloadBuilder as PayloadBuilder2 } from "@xyo-network/payload";
|
|
190
190
|
var _QueryBoundWitnessBuilder = class _QueryBoundWitnessBuilder extends BoundWitnessBuilder {
|
|
191
191
|
_query;
|
|
192
|
+
async dataHashableFields() {
|
|
193
|
+
return {
|
|
194
|
+
...await super.dataHashableFields(),
|
|
195
|
+
query: assertEx2(this._query, "No Query Specified").$hash,
|
|
196
|
+
schema: QueryBoundWitnessSchema
|
|
197
|
+
};
|
|
198
|
+
}
|
|
192
199
|
async hashableFields() {
|
|
193
200
|
return {
|
|
194
201
|
...await super.hashableFields(),
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["import { toArrayBuffer, toUint8Array } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport { Address, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { JsonObject } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { sortFields } from '@xyo-network/hash'\nimport { PayloadBuilder, PayloadBuilderBase, PayloadBuilderOptions, PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\ntype GeneratedBoundWitnessFields = 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'\n\nexport interface BoundWitnessBuilderOptions<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload>\n extends Omit<PayloadBuilderOptions<Omit<T, GeneratedBoundWitnessFields>>, 'schema'> {\n readonly accounts?: AccountInstance[]\n readonly destination?: string[]\n readonly payloadHashes?: T['payload_hashes']\n readonly payloadSchemas?: T['payload_schemas']\n readonly payloads?: TPayload[]\n readonly sourceQuery?: Hash\n readonly timestamp?: boolean | number\n}\n\nexport class BoundWitnessBuilder<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload> extends PayloadBuilderBase<\n Omit<T, GeneratedBoundWitnessFields>,\n BoundWitnessBuilderOptions<T> & { schema: BoundWitnessSchema }\n> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[]\n private _destination?: string[]\n private _errorHashes?: string[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: string[]\n private _payloadSchemas?: string[]\n private _payloads: TPayload[]\n private _sourceQuery?: Hash\n private _timestamp: boolean | number\n\n constructor(options?: BoundWitnessBuilderOptions<T, TPayload>) {\n super({ ...options, schema: BoundWitnessSchema })\n const { accounts, payloadHashes, payloadSchemas, payloads, sourceQuery, timestamp, destination } = options ?? {}\n this._accounts = accounts ?? []\n this._payloadHashes = payloadHashes\n this._payloadSchemas = payloadSchemas\n this._payloads = payloads ?? []\n this._sourceQuery = sourceQuery\n this._destination = destination\n this._timestamp = timestamp ?? true\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 static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(payload: T, address: Address) {\n return payload.previous_hashes[this.addressIndex(payload, address)]\n }\n\n static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$meta.signatures[this.addressIndex(payload, address)]\n }\n\n async build(): Promise<[WithMeta<T>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.hashableFields()\n const hash = (await PayloadBuilder.build(hashableFields)).$hash\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const metaHolder: { $meta?: JsonObject } = {}\n\n if (hashableFields.addresses.length > 0) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.signatures = await this.signatures(hash, previousHashes)\n }\n\n if (this._sourceQuery) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.sourceQuery = this._sourceQuery\n }\n\n if (this._destination) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.destination = this._destination\n }\n\n const ret: WithMeta<T> = {\n ...hashableFields,\n $hash: hash,\n ...metaHolder,\n }\n return [ret, this._payloads, this._errors]\n })\n }\n\n async error(payload?: ModuleError) {\n const unwrappedPayload = await 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 async errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n await Promise.all(\n errors.map(async (error) => {\n if (error !== null) {\n await this.error(error)\n }\n }),\n )\n }\n return this\n }\n\n override async hashableFields(): Promise<T> {\n const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))\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: T = {\n ...(await super.hashableFields()),\n addresses,\n payload_hashes,\n payload_schemas,\n previous_hashes,\n } as T\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.some((schema) => !schema), 'nulls found in schemas')\n\n if (typeof this._timestamp === 'number') {\n result.timestamp = this._timestamp\n } else if (this._timestamp) {\n result.timestamp = Date.now()\n }\n\n return result\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\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 async payload(payload?: TPayload) {\n const unwrappedPayload = await 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 async payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n await Promise.all(\n payloads.map(async (payload) => {\n if (payload !== null) {\n await this.payload(payload)\n }\n }),\n )\n return this\n }\n\n sourceQuery(query?: Hash) {\n this._sourceQuery = query\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: Hash, previousHashes: (Hash | ArrayBuffer | undefined)[]): Promise<string[]> {\n const hash = toArrayBuffer(_hash)\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hash, previousHashesBytes[index]))))\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map(async (payload) => (await PayloadBuilder.build(payload)).$hash)))\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Query, WithMeta } from '@xyo-network/payload-model'\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: WithMeta<TQuery> | undefined\n\n override async hashableFields(): Promise<TBoundWitness> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(this._query, 'No Query Specified').$hash,\n schema: QueryBoundWitnessSchema,\n }\n }\n\n async query<T extends TQuery>(query: T) {\n this._query = await PayloadBuilder.build(query)\n await this.payload(this._query)\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Payload, 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\n static async parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): Promise<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 =\n castWrapper instanceof QueryBoundWitnessWrapper\n ? castWrapper\n : new QueryBoundWitnessWrapper<T>(\n await PayloadBuilder.build(obj as QueryBoundWitness),\n payloads ? await Promise.all(payloads.map((payload) => PayloadBuilder.build(payload))) : undefined,\n )\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 new Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getPayloadsWithoutQuery(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n (await Promise.all(\n compact((await PayloadBuilder.filterExclude(this.payloads, this.jsonPayload().query)).map((payload) => PayloadWrapper.wrap(payload))),\n ))\n return this._payloadsWithoutQuery\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.payloadsDataHashMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, () => `Missing Query [${this.boundwitness}]`)\n }\n}\n"],"mappings":"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","names":["toArrayBuffer","toUint8Array","assertEx","hexFromArrayBuffer","BoundWitnessSchema","sortFields","PayloadBuilder","PayloadBuilderBase","PayloadWrapper","Mutex","BoundWitnessBuilder","PayloadBuilderBase","_accounts","_destination","_errorHashes","_errors","_payloadHashes","_payloadSchemas","_payloads","_sourceQuery","_timestamp","constructor","options","schema","BoundWitnessSchema","accounts","payloadHashes","payloadSchemas","payloads","sourceQuery","timestamp","destination","_payload_schemas","map","payload","assertEx","missingSchemaMessage","addressIndex","address","index","addresses","indexOf","Error","previousHash","previous_hashes","signature","$meta","signatures","build","_buildMutex","runExclusive","hashableFields","hash","PayloadBuilder","$hash","previousHashes","account","metaHolder","length","ret","error","unwrappedPayload","PayloadWrapper","unwrap","undefined","push","sortFields","errors","Promise","all","hexFromArrayBuffer","addressBytes","prefix","payload_hashes","getPayloadHashes","payload_schemas","result","some","Date","now","hashes","query","witness","witnesses","_hash","toArrayBuffer","previousHashesBytes","ph","toUint8Array","sign","JSON","stringify","Mutex","assertEx","QueryBoundWitnessSchema","PayloadBuilder","QueryBoundWitnessBuilder","BoundWitnessBuilder","_query","hashableFields","query","assertEx","$hash","schema","QueryBoundWitnessSchema","PayloadBuilder","build","payload","assertEx","compact","BoundWitnessWrapper","PayloadBuilder","PayloadWrapper","QueryBoundWitnessWrapper","BoundWitnessWrapper","_payloadsWithoutQuery","_query","parseQuery","obj","payloads","assertEx","Array","isArray","castWrapper","wrapper","PayloadBuilder","build","Promise","all","map","payload","undefined","Error","getPayloadsWithoutQuery","compact","filterExclude","jsonPayload","query","PayloadWrapper","wrap","getQuery","payloadMap","payloadsDataHashMap","boundwitness"]}
|
|
1
|
+
{"version":3,"sources":["../../src/Builder.ts","../../src/Query/QueryBoundWitnessBuilder.ts","../../src/Query/QueryBoundWitnessWrapper.ts"],"sourcesContent":["import { toArrayBuffer, toUint8Array } from '@xylabs/arraybuffer'\nimport { assertEx } from '@xylabs/assert'\nimport { Address, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { JsonObject } from '@xylabs/object'\nimport { AccountInstance } from '@xyo-network/account-model'\nimport { BoundWitness, BoundWitnessSchema } from '@xyo-network/boundwitness-model'\nimport { sortFields } from '@xyo-network/hash'\nimport { PayloadBuilder, PayloadBuilderBase, PayloadBuilderOptions, PayloadWrapper } from '@xyo-network/payload'\nimport { ModuleError, Payload, Schema, WithMeta } from '@xyo-network/payload-model'\nimport { Mutex } from 'async-mutex'\n\ntype GeneratedBoundWitnessFields = 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'\n\nexport interface BoundWitnessBuilderOptions<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload>\n extends Omit<PayloadBuilderOptions<Omit<T, GeneratedBoundWitnessFields>>, 'schema'> {\n readonly accounts?: AccountInstance[]\n readonly destination?: string[]\n readonly payloadHashes?: T['payload_hashes']\n readonly payloadSchemas?: T['payload_schemas']\n readonly payloads?: TPayload[]\n readonly sourceQuery?: Hash\n readonly timestamp?: boolean | number\n}\n\nexport class BoundWitnessBuilder<T extends BoundWitness = BoundWitness, TPayload extends Payload = Payload> extends PayloadBuilderBase<\n Omit<T, GeneratedBoundWitnessFields>,\n BoundWitnessBuilderOptions<T> & { schema: BoundWitnessSchema }\n> {\n private static readonly _buildMutex = new Mutex()\n private _accounts: AccountInstance[]\n private _destination?: string[]\n private _errorHashes?: string[]\n private _errors: ModuleError[] = []\n private _payloadHashes?: string[]\n private _payloadSchemas?: string[]\n private _payloads: TPayload[]\n private _sourceQuery?: Hash\n private _timestamp: boolean | number\n\n constructor(options?: BoundWitnessBuilderOptions<T, TPayload>) {\n super({ ...options, schema: BoundWitnessSchema })\n const { accounts, payloadHashes, payloadSchemas, payloads, sourceQuery, timestamp, destination } = options ?? {}\n this._accounts = accounts ?? []\n this._payloadHashes = payloadHashes\n this._payloadSchemas = payloadSchemas\n this._payloads = payloads ?? []\n this._sourceQuery = sourceQuery\n this._destination = destination\n this._timestamp = timestamp ?? true\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 static addressIndex<T extends BoundWitness>(payload: T, address: Address) {\n const index = payload.addresses.indexOf(address)\n if (index === -1) {\n throw new Error('Invalid address')\n }\n return index\n }\n\n static previousHash<T extends BoundWitness>(payload: T, address: Address) {\n return payload.previous_hashes[this.addressIndex(payload, address)]\n }\n\n static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$meta.signatures[this.addressIndex(payload, address)]\n }\n\n async build(): Promise<[WithMeta<T>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const hashableFields = await this.dataHashableFields()\n const hash = (await PayloadBuilder.build(hashableFields)).$hash\n\n /* get all the previousHashes to verify atomic signing */\n const previousHashes = this._accounts.map((account) => account.previousHash)\n\n const metaHolder: { $meta?: JsonObject } = {}\n\n if (hashableFields.addresses.length > 0) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.signatures = await this.signatures(hash, previousHashes)\n }\n\n if (this._sourceQuery) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.sourceQuery = this._sourceQuery\n }\n\n if (this._destination) {\n metaHolder.$meta = metaHolder.$meta ?? {}\n metaHolder.$meta.destination = this._destination\n }\n\n const ret = {\n ...hashableFields,\n $hash: hash,\n ...metaHolder,\n } as WithMeta<T>\n return [ret, this._payloads, this._errors]\n })\n }\n\n override async dataHashableFields(): Promise<Omit<T, '$meta' | '$hash'>> {\n const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))\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 fields = { addresses, payload_hashes, payload_schemas, previous_hashes } as Omit<T, '$meta' | '$hash' | 'schema'>\n const result = await BoundWitnessBuilder.dataHashableFields<T>(this._schema, fields)\n\n assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')\n\n assertEx(!result.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')\n\n assertEx(!result.payload_schemas.some((schema) => !schema), 'nulls found in schemas')\n\n if (typeof this._timestamp === 'number') {\n result.timestamp = this._timestamp\n } else if (this._timestamp) {\n result.timestamp = Date.now()\n }\n\n return result as Omit<T, '$meta' | '$hash'>\n }\n\n async error(payload?: ModuleError) {\n const unwrappedPayload = await 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 async errors(errors?: (ModuleError | null)[]) {\n if (errors) {\n await Promise.all(\n errors.map(async (error) => {\n if (error !== null) {\n await this.error(error)\n }\n }),\n )\n }\n return this\n }\n\n hashes(hashes: Hash[], schema: Schema[]) {\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 async payload(payload?: TPayload) {\n const unwrappedPayload = await 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 async payloads(payloads?: (TPayload | null)[]) {\n if (payloads)\n await Promise.all(\n payloads.map(async (payload) => {\n if (payload !== null) {\n await this.payload(payload)\n }\n }),\n )\n return this\n }\n\n sourceQuery(query?: Hash) {\n this._sourceQuery = query\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: Hash, previousHashes: (Hash | ArrayBuffer | undefined)[]): Promise<string[]> {\n const hash = toArrayBuffer(_hash)\n const previousHashesBytes = previousHashes.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(this._accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hash, previousHashesBytes[index]))))\n }\n\n private async getPayloadHashes(): Promise<string[]> {\n return this._payloadHashes ?? (await Promise.all(this._payloads.map(async (payload) => (await PayloadBuilder.build(payload)).$hash)))\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Query, WithMeta } from '@xyo-network/payload-model'\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: WithMeta<TQuery> | undefined\n\n override async dataHashableFields(): Promise<Omit<TBoundWitness, '$hash' | '$meta'>> {\n return {\n ...(await super.dataHashableFields()),\n query: assertEx(this._query, 'No Query Specified').$hash,\n schema: QueryBoundWitnessSchema,\n } as Omit<TBoundWitness, '$hash' | '$meta'>\n }\n\n override async hashableFields(): Promise<WithMeta<TBoundWitness>> {\n return {\n ...(await super.hashableFields()),\n query: assertEx(this._query, 'No Query Specified').$hash,\n schema: QueryBoundWitnessSchema,\n } as WithMeta<TBoundWitness>\n }\n\n async query<T extends TQuery>(query: T) {\n this._query = await PayloadBuilder.build(query)\n await this.payload(this._query)\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 { PayloadBuilder } from '@xyo-network/payload'\nimport { Payload, 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\n static async parseQuery<T extends Query = Query>(obj: unknown, payloads?: Payload[]): Promise<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 =\n castWrapper instanceof QueryBoundWitnessWrapper\n ? castWrapper\n : new QueryBoundWitnessWrapper<T>(\n await PayloadBuilder.build(obj as QueryBoundWitness),\n payloads ? await Promise.all(payloads.map((payload) => PayloadBuilder.build(payload))) : undefined,\n )\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 new Error(`Unable to parse [${typeof obj}]`)\n }\n\n async getPayloadsWithoutQuery(): Promise<PayloadWrapper<Payload>[]> {\n this._payloadsWithoutQuery =\n this._payloadsWithoutQuery ??\n (await Promise.all(\n compact((await PayloadBuilder.filterExclude(this.payloads, this.jsonPayload().query)).map((payload) => PayloadWrapper.wrap(payload))),\n ))\n return this._payloadsWithoutQuery\n }\n\n async getQuery(): Promise<T> {\n const payloadMap = await this.payloadsDataHashMap()\n this._query = this._query ?? (payloadMap[this.boundwitness.query] as T | undefined)\n return assertEx(this._query, () => `Missing Query [${this.boundwitness}]`)\n }\n}\n"],"mappings":"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","names":["toArrayBuffer","toUint8Array","assertEx","hexFromArrayBuffer","BoundWitnessSchema","sortFields","PayloadBuilder","PayloadBuilderBase","PayloadWrapper","Mutex","BoundWitnessBuilder","PayloadBuilderBase","_accounts","_destination","_errorHashes","_errors","_payloadHashes","_payloadSchemas","_payloads","_sourceQuery","_timestamp","constructor","options","schema","BoundWitnessSchema","accounts","payloadHashes","payloadSchemas","payloads","sourceQuery","timestamp","destination","_payload_schemas","map","payload","assertEx","missingSchemaMessage","addressIndex","address","index","addresses","indexOf","Error","previousHash","previous_hashes","signature","$meta","signatures","build","_buildMutex","runExclusive","hashableFields","dataHashableFields","hash","PayloadBuilder","$hash","previousHashes","account","metaHolder","length","ret","hexFromArrayBuffer","addressBytes","prefix","payload_hashes","getPayloadHashes","payload_schemas","fields","result","_schema","some","Date","now","error","unwrappedPayload","PayloadWrapper","unwrap","undefined","push","sortFields","errors","Promise","all","hashes","query","witness","witnesses","_hash","toArrayBuffer","previousHashesBytes","ph","toUint8Array","sign","JSON","stringify","Mutex","assertEx","QueryBoundWitnessSchema","PayloadBuilder","QueryBoundWitnessBuilder","BoundWitnessBuilder","_query","dataHashableFields","query","assertEx","$hash","schema","QueryBoundWitnessSchema","hashableFields","PayloadBuilder","build","payload","assertEx","compact","BoundWitnessWrapper","PayloadBuilder","PayloadWrapper","QueryBoundWitnessWrapper","BoundWitnessWrapper","_payloadsWithoutQuery","_query","parseQuery","obj","payloads","assertEx","Array","isArray","castWrapper","wrapper","PayloadBuilder","build","Promise","all","map","payload","undefined","Error","getPayloadsWithoutQuery","compact","filterExclude","jsonPayload","query","PayloadWrapper","wrap","getQuery","payloadMap","payloadsDataHashMap","boundwitness"]}
|
package/package.json
CHANGED
|
@@ -16,14 +16,14 @@
|
|
|
16
16
|
"@xylabs/hex": "^2.14.0",
|
|
17
17
|
"@xylabs/lodash": "^2.14.0",
|
|
18
18
|
"@xylabs/object": "^2.89.0",
|
|
19
|
-
"@xyo-network/account-model": "~2.89.
|
|
20
|
-
"@xyo-network/boundwitness-model": "~2.89.
|
|
21
|
-
"@xyo-network/boundwitness-validator": "~2.89.
|
|
22
|
-
"@xyo-network/boundwitness-wrapper": "~2.89.
|
|
23
|
-
"@xyo-network/hash": "~2.89.
|
|
24
|
-
"@xyo-network/payload": "~2.89.
|
|
25
|
-
"@xyo-network/payload-model": "~2.89.
|
|
26
|
-
"@xyo-network/payload-wrapper": "~2.89.
|
|
19
|
+
"@xyo-network/account-model": "~2.89.2",
|
|
20
|
+
"@xyo-network/boundwitness-model": "~2.89.2",
|
|
21
|
+
"@xyo-network/boundwitness-validator": "~2.89.2",
|
|
22
|
+
"@xyo-network/boundwitness-wrapper": "~2.89.2",
|
|
23
|
+
"@xyo-network/hash": "~2.89.2",
|
|
24
|
+
"@xyo-network/payload": "~2.89.2",
|
|
25
|
+
"@xyo-network/payload-model": "~2.89.2",
|
|
26
|
+
"@xyo-network/payload-wrapper": "~2.89.2",
|
|
27
27
|
"async-mutex": "^0.4.1"
|
|
28
28
|
},
|
|
29
29
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
@@ -31,7 +31,7 @@
|
|
|
31
31
|
"@xylabs/object": "^2.89.0",
|
|
32
32
|
"@xylabs/ts-scripts-yarn3": "^3.2.42",
|
|
33
33
|
"@xylabs/tsconfig": "^3.2.42",
|
|
34
|
-
"@xyo-network/account": "~2.89.
|
|
34
|
+
"@xyo-network/account": "~2.89.2",
|
|
35
35
|
"typescript": "^5.3.3"
|
|
36
36
|
},
|
|
37
37
|
"exports": {
|
|
@@ -72,6 +72,6 @@
|
|
|
72
72
|
},
|
|
73
73
|
"sideEffects": false,
|
|
74
74
|
"types": "dist/node/index.d.ts",
|
|
75
|
-
"version": "2.89.
|
|
75
|
+
"version": "2.89.2",
|
|
76
76
|
"type": "module"
|
|
77
77
|
}
|
package/src/Builder.ts
CHANGED
|
@@ -76,7 +76,7 @@ export class BoundWitnessBuilder<T extends BoundWitness = BoundWitness, TPayload
|
|
|
76
76
|
|
|
77
77
|
async build(): Promise<[WithMeta<T>, TPayload[], ModuleError[]]> {
|
|
78
78
|
return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {
|
|
79
|
-
const hashableFields = await this.
|
|
79
|
+
const hashableFields = await this.dataHashableFields()
|
|
80
80
|
const hash = (await PayloadBuilder.build(hashableFields)).$hash
|
|
81
81
|
|
|
82
82
|
/* get all the previousHashes to verify atomic signing */
|
|
@@ -99,15 +99,38 @@ export class BoundWitnessBuilder<T extends BoundWitness = BoundWitness, TPayload
|
|
|
99
99
|
metaHolder.$meta.destination = this._destination
|
|
100
100
|
}
|
|
101
101
|
|
|
102
|
-
const ret
|
|
102
|
+
const ret = {
|
|
103
103
|
...hashableFields,
|
|
104
104
|
$hash: hash,
|
|
105
105
|
...metaHolder,
|
|
106
|
-
}
|
|
106
|
+
} as WithMeta<T>
|
|
107
107
|
return [ret, this._payloads, this._errors]
|
|
108
108
|
})
|
|
109
109
|
}
|
|
110
110
|
|
|
111
|
+
override async dataHashableFields(): Promise<Omit<T, '$meta' | '$hash'>> {
|
|
112
|
+
const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))
|
|
113
|
+
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)
|
|
114
|
+
const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes')
|
|
115
|
+
const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')
|
|
116
|
+
const fields = { addresses, payload_hashes, payload_schemas, previous_hashes } as Omit<T, '$meta' | '$hash' | 'schema'>
|
|
117
|
+
const result = await BoundWitnessBuilder.dataHashableFields<T>(this._schema, fields)
|
|
118
|
+
|
|
119
|
+
assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')
|
|
120
|
+
|
|
121
|
+
assertEx(!result.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')
|
|
122
|
+
|
|
123
|
+
assertEx(!result.payload_schemas.some((schema) => !schema), 'nulls found in schemas')
|
|
124
|
+
|
|
125
|
+
if (typeof this._timestamp === 'number') {
|
|
126
|
+
result.timestamp = this._timestamp
|
|
127
|
+
} else if (this._timestamp) {
|
|
128
|
+
result.timestamp = Date.now()
|
|
129
|
+
}
|
|
130
|
+
|
|
131
|
+
return result as Omit<T, '$meta' | '$hash'>
|
|
132
|
+
}
|
|
133
|
+
|
|
111
134
|
async error(payload?: ModuleError) {
|
|
112
135
|
const unwrappedPayload = await PayloadWrapper.unwrap(payload)
|
|
113
136
|
assertEx(this._errorHashes === undefined, 'Can not set errors when hashes already set')
|
|
@@ -130,34 +153,6 @@ export class BoundWitnessBuilder<T extends BoundWitness = BoundWitness, TPayload
|
|
|
130
153
|
return this
|
|
131
154
|
}
|
|
132
155
|
|
|
133
|
-
override async hashableFields(): Promise<T> {
|
|
134
|
-
const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))
|
|
135
|
-
const previous_hashes = this._accounts.map((account) => account.previousHash ?? null)
|
|
136
|
-
const payload_hashes = assertEx(await this.getPayloadHashes(), 'Missing payload_hashes')
|
|
137
|
-
const payload_schemas = assertEx(this._payload_schemas, 'Missing payload_schemas')
|
|
138
|
-
const result: T = {
|
|
139
|
-
...(await super.hashableFields()),
|
|
140
|
-
addresses,
|
|
141
|
-
payload_hashes,
|
|
142
|
-
payload_schemas,
|
|
143
|
-
previous_hashes,
|
|
144
|
-
} as T
|
|
145
|
-
|
|
146
|
-
assertEx(result.payload_hashes?.length === result.payload_schemas?.length, 'Payload hash/schema mismatch')
|
|
147
|
-
|
|
148
|
-
assertEx(!result.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')
|
|
149
|
-
|
|
150
|
-
assertEx(!result.payload_schemas.some((schema) => !schema), 'nulls found in schemas')
|
|
151
|
-
|
|
152
|
-
if (typeof this._timestamp === 'number') {
|
|
153
|
-
result.timestamp = this._timestamp
|
|
154
|
-
} else if (this._timestamp) {
|
|
155
|
-
result.timestamp = Date.now()
|
|
156
|
-
}
|
|
157
|
-
|
|
158
|
-
return result
|
|
159
|
-
}
|
|
160
|
-
|
|
161
156
|
hashes(hashes: Hash[], schema: Schema[]) {
|
|
162
157
|
assertEx(this.payloads.length === 0, 'Can not set hashes when payloads already set')
|
|
163
158
|
this._payloadHashes = hashes
|
|
@@ -11,12 +11,20 @@ export class QueryBoundWitnessBuilder<
|
|
|
11
11
|
> extends BoundWitnessBuilder<TBoundWitness> {
|
|
12
12
|
private _query: WithMeta<TQuery> | undefined
|
|
13
13
|
|
|
14
|
-
override async
|
|
14
|
+
override async dataHashableFields(): Promise<Omit<TBoundWitness, '$hash' | '$meta'>> {
|
|
15
|
+
return {
|
|
16
|
+
...(await super.dataHashableFields()),
|
|
17
|
+
query: assertEx(this._query, 'No Query Specified').$hash,
|
|
18
|
+
schema: QueryBoundWitnessSchema,
|
|
19
|
+
} as Omit<TBoundWitness, '$hash' | '$meta'>
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
override async hashableFields(): Promise<WithMeta<TBoundWitness>> {
|
|
15
23
|
return {
|
|
16
24
|
...(await super.hashableFields()),
|
|
17
25
|
query: assertEx(this._query, 'No Query Specified').$hash,
|
|
18
26
|
schema: QueryBoundWitnessSchema,
|
|
19
|
-
}
|
|
27
|
+
} as WithMeta<TBoundWitness>
|
|
20
28
|
}
|
|
21
29
|
|
|
22
30
|
async query<T extends TQuery>(query: T) {
|