@xyo-network/boundwitness-builder 2.89.2 → 2.90.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -64,11 +64,23 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
64
64
  this._destination = destination;
65
65
  this._timestamp = timestamp ?? true;
66
66
  }
67
- get _payload_schemas() {
67
+ get addresses() {
68
+ return this._accounts.map((account) => account.address);
69
+ }
70
+ get payloadSchemas() {
68
71
  return this._payloadSchemas ?? this._payloads.map((payload) => {
69
72
  return (0, import_assert.assertEx)(payload.schema, () => this.missingSchemaMessage(payload));
70
73
  });
71
74
  }
75
+ get previousHashBuffers() {
76
+ return this._accounts.map((account) => account.previousHashBytes ?? null);
77
+ }
78
+ get previousHashes() {
79
+ return this._accounts.map((account) => account.previousHash ?? null);
80
+ }
81
+ get timestamp() {
82
+ return this._timestamp = typeof this._timestamp === "number" ? this._timestamp : Date.now();
83
+ }
72
84
  static addressIndex(payload, address) {
73
85
  const index = payload.addresses.indexOf(address);
74
86
  if (index === -1) {
@@ -76,34 +88,72 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
76
88
  }
77
89
  return index;
78
90
  }
79
- static previousHash(payload, address) {
80
- return payload.previous_hashes[this.addressIndex(payload, address)];
91
+ static async build(options) {
92
+ return await new _BoundWitnessBuilder(options).build();
93
+ }
94
+ static async dataHashableFields(schema, fields) {
95
+ return await import_payload.PayloadBuilderBase.dataHashableFields(schema, fields);
96
+ }
97
+ static async hashableFields(schema, fields, $meta, $hash, timestamp) {
98
+ return await import_payload.PayloadBuilderBase.hashableFields(schema, fields, $meta, $hash, timestamp);
99
+ }
100
+ static previousHash(boundWitness, address) {
101
+ return boundWitness.previous_hashes[this.addressIndex(boundWitness, address)];
102
+ }
103
+ static async linkingFields(accounts, payloads, timestamp = Date.now()) {
104
+ const addresses = accounts.map((account) => (0, import_hex.hexFromArrayBuffer)(account.addressBytes, {
105
+ prefix: false
106
+ }));
107
+ const previous_hashes = accounts.map((account) => account.previousHash ?? null);
108
+ const payload_hashes = payloads ? await import_payload.PayloadBuilder.dataHashes(payloads) : [];
109
+ const payload_schemas = payloads == null ? void 0 : payloads.map(({ schema }) => schema);
110
+ return {
111
+ addresses,
112
+ payload_hashes,
113
+ payload_schemas,
114
+ previous_hashes,
115
+ timestamp
116
+ };
117
+ }
118
+ static async metaFields(dataHash, otherMeta, accounts, previousHashes, destination, sourceQuery) {
119
+ const meta = {
120
+ ...otherMeta
121
+ };
122
+ if ((accounts == null ? void 0 : accounts.length) && (previousHashes == null ? void 0 : previousHashes.length)) {
123
+ (0, import_assert.assertEx)(accounts.length === previousHashes.length, "accounts and previousHashes must have same length");
124
+ meta.signatures = await this.signatures(accounts, dataHash, previousHashes);
125
+ }
126
+ if (sourceQuery) {
127
+ meta.sourceQuery = sourceQuery;
128
+ }
129
+ if (destination) {
130
+ meta.destination = destination;
131
+ }
132
+ return meta;
81
133
  }
82
134
  static signature(payload, address) {
83
135
  return payload.$meta.signatures[this.addressIndex(payload, address)];
84
136
  }
137
+ static async signatures(accounts, hash, previousHashes) {
138
+ const hashBytes = (0, import_arraybuffer.toArrayBuffer)(hash);
139
+ const previousHashesBytes = previousHashes == null ? void 0 : previousHashes.map((ph) => ph ? (0, import_arraybuffer.toUint8Array)(ph) : void 0);
140
+ return await Promise.all(accounts.map(async (account, index) => (0, import_hex.hexFromArrayBuffer)(await account.sign(hashBytes, previousHashesBytes[index]))));
141
+ }
142
+ static validateLinkingFields(bw) {
143
+ var _a, _b;
144
+ (0, import_assert.assertEx)(((_a = bw.payload_hashes) == null ? void 0 : _a.length) === ((_b = bw.payload_schemas) == null ? void 0 : _b.length), "Payload hash/schema mismatch");
145
+ (0, import_assert.assertEx)(!bw.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
146
+ (0, import_assert.assertEx)(!bw.payload_schemas.some((schema) => !schema), "nulls found in schemas");
147
+ }
85
148
  async build() {
86
149
  return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
87
- const hashableFields = await this.dataHashableFields();
88
- const hash = (await import_payload.PayloadBuilder.build(hashableFields)).$hash;
89
- const previousHashes = this._accounts.map((account) => account.previousHash);
90
- const metaHolder = {};
91
- if (hashableFields.addresses.length > 0) {
92
- metaHolder.$meta = metaHolder.$meta ?? {};
93
- metaHolder.$meta.signatures = await this.signatures(hash, previousHashes);
94
- }
95
- if (this._sourceQuery) {
96
- metaHolder.$meta = metaHolder.$meta ?? {};
97
- metaHolder.$meta.sourceQuery = this._sourceQuery;
98
- }
99
- if (this._destination) {
100
- metaHolder.$meta = metaHolder.$meta ?? {};
101
- metaHolder.$meta.destination = this._destination;
102
- }
150
+ const dataHashableFields = await this.dataHashableFields();
151
+ const $hash = (await import_payload.PayloadBuilder.build(dataHashableFields)).$hash;
152
+ const $meta = await this.metaFields($hash);
103
153
  const ret = {
104
- ...hashableFields,
105
- $hash: hash,
106
- ...metaHolder
154
+ ...dataHashableFields,
155
+ $hash,
156
+ $meta
107
157
  };
108
158
  return [
109
159
  ret,
@@ -113,28 +163,9 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
113
163
  });
114
164
  }
115
165
  async dataHashableFields() {
116
- var _a, _b;
117
- const addresses = this._accounts.map((account) => (0, import_hex.hexFromArrayBuffer)(account.addressBytes, {
118
- prefix: false
119
- }));
120
- const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
121
- const payload_hashes = (0, import_assert.assertEx)(await this.getPayloadHashes(), "Missing payload_hashes");
122
- const payload_schemas = (0, import_assert.assertEx)(this._payload_schemas, "Missing payload_schemas");
123
- const fields = {
124
- addresses,
125
- payload_hashes,
126
- payload_schemas,
127
- previous_hashes
128
- };
166
+ const fields = await this.linkingFields();
129
167
  const result = await _BoundWitnessBuilder.dataHashableFields(this._schema, fields);
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");
131
- (0, import_assert.assertEx)(!result.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
132
- (0, import_assert.assertEx)(!result.payload_schemas.some((schema) => !schema), "nulls found in schemas");
133
- if (typeof this._timestamp === "number") {
134
- result.timestamp = this._timestamp;
135
- } else if (this._timestamp) {
136
- result.timestamp = Date.now();
137
- }
168
+ _BoundWitnessBuilder.validateLinkingFields(result);
138
169
  return result;
139
170
  }
140
171
  async error(payload) {
@@ -197,8 +228,11 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends import_payload.Pay
197
228
  const previousHashesBytes = previousHashes.map((ph) => ph ? (0, import_arraybuffer.toUint8Array)(ph) : void 0);
198
229
  return await Promise.all(this._accounts.map(async (account, index) => (0, import_hex.hexFromArrayBuffer)(await account.sign(hash, previousHashesBytes[index]))));
199
230
  }
200
- async getPayloadHashes() {
201
- return this._payloadHashes ?? await Promise.all(this._payloads.map(async (payload) => (await import_payload.PayloadBuilder.build(payload)).$hash));
231
+ async linkingFields() {
232
+ return await _BoundWitnessBuilder.linkingFields(this._accounts, this._payloads, this.timestamp);
233
+ }
234
+ async metaFields(dataHash) {
235
+ return await _BoundWitnessBuilder.metaFields(dataHash, this._$meta, this._accounts, this.previousHashes, this._destination, this._sourceQuery);
202
236
  }
203
237
  missingSchemaMessage(payload) {
204
238
  return `Builder: Missing Schema
@@ -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.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"]}
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 { AnyObject, 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\nexport type GeneratedBoundWitnessFields = 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'\n\nexport interface BoundWitnessBuilderOptions<TBoundWitness extends BoundWitness = BoundWitness, TPayload extends Payload = Payload>\n extends Omit<PayloadBuilderOptions<Omit<TBoundWitness, GeneratedBoundWitnessFields>>, 'schema'> {\n readonly accounts?: AccountInstance[]\n readonly destination?: string[]\n readonly payloadHashes?: TBoundWitness['payload_hashes']\n readonly payloadSchemas?: TBoundWitness['payload_schemas']\n readonly payloads?: TPayload[]\n readonly sourceQuery?: Hash\n readonly timestamp?: number\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness = BoundWitness, TPayload extends Payload = Payload> extends PayloadBuilderBase<\n Omit<TBoundWitness, GeneratedBoundWitnessFields>,\n BoundWitnessBuilderOptions<TBoundWitness> & { 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<TBoundWitness, 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 protected get addresses(): Address[] {\n return this._accounts.map((account) => account.address)\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBuffers(): (ArrayBuffer | null)[] {\n return this._accounts.map((account) => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map((account) => account.previousHash ?? null)\n }\n\n protected get timestamp(): number {\n return (this._timestamp = typeof this._timestamp === 'number' ? this._timestamp : Date.now())\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 async build<TBoundWitness extends BoundWitness>(options: BoundWitnessBuilderOptions<TBoundWitness>) {\n return await new BoundWitnessBuilder(options).build()\n }\n\n static override async dataHashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: Omit<T, 'schema' | '$hash' | '$meta'>,\n ): Promise<Omit<T, '$hash' | '$meta'>> {\n return await PayloadBuilderBase.dataHashableFields(schema, fields)\n }\n\n static override async hashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: Omit<T, 'schema' | '$hash' | '$meta'>,\n $meta?: JsonObject,\n $hash?: Hash,\n timestamp?: number,\n ): Promise<WithMeta<T>> {\n return await PayloadBuilderBase.hashableFields(schema, fields, $meta, $hash, timestamp)\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return boundWitness.previous_hashes[this.addressIndex(boundWitness, address)]\n }\n\n protected static async linkingFields<T extends BoundWitness = BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n timestamp = Date.now(),\n ) {\n const addresses = accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))\n const previous_hashes = accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = payloads ? await PayloadBuilder.dataHashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema)\n return { addresses, payload_hashes, payload_schemas, previous_hashes, timestamp } as Omit<T, '$meta' | '$hash' | 'schema'>\n }\n\n protected static async metaFields(\n dataHash: Hash,\n otherMeta?: JsonObject,\n accounts?: AccountInstance[],\n previousHashes?: (Hash | null)[],\n destination?: Address[],\n sourceQuery?: Hash,\n ): Promise<JsonObject> {\n const meta: JsonObject = { ...otherMeta }\n\n if (accounts?.length && previousHashes?.length) {\n assertEx(accounts.length === previousHashes.length, 'accounts and previousHashes must have same length')\n meta.signatures = await this.signatures(accounts, dataHash, previousHashes)\n }\n\n if (sourceQuery) {\n meta.sourceQuery = sourceQuery\n }\n\n if (destination) {\n meta.destination = destination\n }\n\n return meta\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$meta.signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], hash: Hash, previousHashes: (Hash | ArrayBuffer | null)[]): Promise<string[]> {\n const hashBytes = toArrayBuffer(hash)\n const previousHashesBytes = previousHashes?.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hashBytes, previousHashesBytes[index]))))\n }\n\n private static validateLinkingFields(bw: Pick<BoundWitness, 'payload_hashes' | 'payload_schemas'>) {\n assertEx(bw.payload_hashes?.length === bw.payload_schemas?.length, 'Payload hash/schema mismatch')\n assertEx(!bw.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')\n assertEx(!bw.payload_schemas.some((schema) => !schema), 'nulls found in schemas')\n }\n\n async build(): Promise<[WithMeta<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = (await this.dataHashableFields()) as TBoundWitness\n const $hash = (await PayloadBuilder.build(dataHashableFields)).$hash\n const $meta = await this.metaFields($hash)\n\n const ret = {\n ...dataHashableFields,\n $hash,\n $meta,\n } as WithMeta<TBoundWitness>\n return [ret, this._payloads, this._errors]\n })\n }\n\n override async dataHashableFields(): Promise<Omit<TBoundWitness, '$meta' | '$hash'>> {\n const fields = await this.linkingFields()\n const result = await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n\n BoundWitnessBuilder.validateLinkingFields(result)\n\n return result as Omit<TBoundWitness, '$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 | null)[]): 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 linkingFields() {\n return await BoundWitnessBuilder.linkingFields<TBoundWitness>(this._accounts, this._payloads, this.timestamp)\n }\n\n private async metaFields(dataHash: Hash): Promise<JsonObject> {\n return await BoundWitnessBuilder.metaFields(dataHash, this._$meta, this._accounts, this.previousHashes, this._destination, this._sourceQuery)\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","addresses","map","account","address","payload","assertEx","missingSchemaMessage","previousHashBuffers","previousHashBytes","previousHashes","previousHash","Date","now","addressIndex","index","indexOf","Error","build","dataHashableFields","fields","hashableFields","$meta","$hash","boundWitness","previous_hashes","linkingFields","hexFromArrayBuffer","addressBytes","prefix","payload_hashes","PayloadBuilder","dataHashes","payload_schemas","metaFields","dataHash","otherMeta","meta","length","signatures","signature","hash","hashBytes","toArrayBuffer","previousHashesBytes","ph","toUint8Array","undefined","Promise","all","sign","validateLinkingFields","bw","some","_buildMutex","runExclusive","ret","result","_schema","error","unwrappedPayload","PayloadWrapper","unwrap","push","sortFields","errors","hashes","query","witness","witnesses","_hash","_$meta","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"]}
@@ -38,11 +38,23 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
38
38
  this._destination = destination;
39
39
  this._timestamp = timestamp ?? true;
40
40
  }
41
- get _payload_schemas() {
41
+ get addresses() {
42
+ return this._accounts.map((account) => account.address);
43
+ }
44
+ get payloadSchemas() {
42
45
  return this._payloadSchemas ?? this._payloads.map((payload) => {
43
46
  return assertEx(payload.schema, () => this.missingSchemaMessage(payload));
44
47
  });
45
48
  }
49
+ get previousHashBuffers() {
50
+ return this._accounts.map((account) => account.previousHashBytes ?? null);
51
+ }
52
+ get previousHashes() {
53
+ return this._accounts.map((account) => account.previousHash ?? null);
54
+ }
55
+ get timestamp() {
56
+ return this._timestamp = typeof this._timestamp === "number" ? this._timestamp : Date.now();
57
+ }
46
58
  static addressIndex(payload, address) {
47
59
  const index = payload.addresses.indexOf(address);
48
60
  if (index === -1) {
@@ -50,34 +62,72 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
50
62
  }
51
63
  return index;
52
64
  }
53
- static previousHash(payload, address) {
54
- return payload.previous_hashes[this.addressIndex(payload, address)];
65
+ static async build(options) {
66
+ return await new _BoundWitnessBuilder(options).build();
67
+ }
68
+ static async dataHashableFields(schema, fields) {
69
+ return await PayloadBuilderBase.dataHashableFields(schema, fields);
70
+ }
71
+ static async hashableFields(schema, fields, $meta, $hash, timestamp) {
72
+ return await PayloadBuilderBase.hashableFields(schema, fields, $meta, $hash, timestamp);
73
+ }
74
+ static previousHash(boundWitness, address) {
75
+ return boundWitness.previous_hashes[this.addressIndex(boundWitness, address)];
76
+ }
77
+ static async linkingFields(accounts, payloads, timestamp = Date.now()) {
78
+ const addresses = accounts.map((account) => hexFromArrayBuffer(account.addressBytes, {
79
+ prefix: false
80
+ }));
81
+ const previous_hashes = accounts.map((account) => account.previousHash ?? null);
82
+ const payload_hashes = payloads ? await PayloadBuilder.dataHashes(payloads) : [];
83
+ const payload_schemas = payloads == null ? void 0 : payloads.map(({ schema }) => schema);
84
+ return {
85
+ addresses,
86
+ payload_hashes,
87
+ payload_schemas,
88
+ previous_hashes,
89
+ timestamp
90
+ };
91
+ }
92
+ static async metaFields(dataHash, otherMeta, accounts, previousHashes, destination, sourceQuery) {
93
+ const meta = {
94
+ ...otherMeta
95
+ };
96
+ if ((accounts == null ? void 0 : accounts.length) && (previousHashes == null ? void 0 : previousHashes.length)) {
97
+ assertEx(accounts.length === previousHashes.length, "accounts and previousHashes must have same length");
98
+ meta.signatures = await this.signatures(accounts, dataHash, previousHashes);
99
+ }
100
+ if (sourceQuery) {
101
+ meta.sourceQuery = sourceQuery;
102
+ }
103
+ if (destination) {
104
+ meta.destination = destination;
105
+ }
106
+ return meta;
55
107
  }
56
108
  static signature(payload, address) {
57
109
  return payload.$meta.signatures[this.addressIndex(payload, address)];
58
110
  }
111
+ static async signatures(accounts, hash, previousHashes) {
112
+ const hashBytes = toArrayBuffer(hash);
113
+ const previousHashesBytes = previousHashes == null ? void 0 : previousHashes.map((ph) => ph ? toUint8Array(ph) : void 0);
114
+ return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hashBytes, previousHashesBytes[index]))));
115
+ }
116
+ static validateLinkingFields(bw) {
117
+ var _a, _b;
118
+ assertEx(((_a = bw.payload_hashes) == null ? void 0 : _a.length) === ((_b = bw.payload_schemas) == null ? void 0 : _b.length), "Payload hash/schema mismatch");
119
+ assertEx(!bw.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
120
+ assertEx(!bw.payload_schemas.some((schema) => !schema), "nulls found in schemas");
121
+ }
59
122
  async build() {
60
123
  return await _BoundWitnessBuilder._buildMutex.runExclusive(async () => {
61
- const hashableFields = await this.dataHashableFields();
62
- const hash = (await PayloadBuilder.build(hashableFields)).$hash;
63
- const previousHashes = this._accounts.map((account) => account.previousHash);
64
- const metaHolder = {};
65
- if (hashableFields.addresses.length > 0) {
66
- metaHolder.$meta = metaHolder.$meta ?? {};
67
- metaHolder.$meta.signatures = await this.signatures(hash, previousHashes);
68
- }
69
- if (this._sourceQuery) {
70
- metaHolder.$meta = metaHolder.$meta ?? {};
71
- metaHolder.$meta.sourceQuery = this._sourceQuery;
72
- }
73
- if (this._destination) {
74
- metaHolder.$meta = metaHolder.$meta ?? {};
75
- metaHolder.$meta.destination = this._destination;
76
- }
124
+ const dataHashableFields = await this.dataHashableFields();
125
+ const $hash = (await PayloadBuilder.build(dataHashableFields)).$hash;
126
+ const $meta = await this.metaFields($hash);
77
127
  const ret = {
78
- ...hashableFields,
79
- $hash: hash,
80
- ...metaHolder
128
+ ...dataHashableFields,
129
+ $hash,
130
+ $meta
81
131
  };
82
132
  return [
83
133
  ret,
@@ -87,28 +137,9 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
87
137
  });
88
138
  }
89
139
  async dataHashableFields() {
90
- var _a, _b;
91
- const addresses = this._accounts.map((account) => hexFromArrayBuffer(account.addressBytes, {
92
- prefix: false
93
- }));
94
- const previous_hashes = this._accounts.map((account) => account.previousHash ?? null);
95
- const payload_hashes = assertEx(await this.getPayloadHashes(), "Missing payload_hashes");
96
- const payload_schemas = assertEx(this._payload_schemas, "Missing payload_schemas");
97
- const fields = {
98
- addresses,
99
- payload_hashes,
100
- payload_schemas,
101
- previous_hashes
102
- };
140
+ const fields = await this.linkingFields();
103
141
  const result = await _BoundWitnessBuilder.dataHashableFields(this._schema, fields);
104
- assertEx(((_a = result.payload_hashes) == null ? void 0 : _a.length) === ((_b = result.payload_schemas) == null ? void 0 : _b.length), "Payload hash/schema mismatch");
105
- assertEx(!result.payload_hashes.some((hash) => !hash), () => "nulls found in hashes");
106
- assertEx(!result.payload_schemas.some((schema) => !schema), "nulls found in schemas");
107
- if (typeof this._timestamp === "number") {
108
- result.timestamp = this._timestamp;
109
- } else if (this._timestamp) {
110
- result.timestamp = Date.now();
111
- }
142
+ _BoundWitnessBuilder.validateLinkingFields(result);
112
143
  return result;
113
144
  }
114
145
  async error(payload) {
@@ -171,8 +202,11 @@ var _BoundWitnessBuilder = class _BoundWitnessBuilder extends PayloadBuilderBase
171
202
  const previousHashesBytes = previousHashes.map((ph) => ph ? toUint8Array(ph) : void 0);
172
203
  return await Promise.all(this._accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hash, previousHashesBytes[index]))));
173
204
  }
174
- async getPayloadHashes() {
175
- return this._payloadHashes ?? await Promise.all(this._payloads.map(async (payload) => (await PayloadBuilder.build(payload)).$hash));
205
+ async linkingFields() {
206
+ return await _BoundWitnessBuilder.linkingFields(this._accounts, this._payloads, this.timestamp);
207
+ }
208
+ async metaFields(dataHash) {
209
+ return await _BoundWitnessBuilder.metaFields(dataHash, this._$meta, this._accounts, this.previousHashes, this._destination, this._sourceQuery);
176
210
  }
177
211
  missingSchemaMessage(payload) {
178
212
  return `Builder: Missing Schema
@@ -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.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"]}
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 { AnyObject, 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\nexport type GeneratedBoundWitnessFields = 'addresses' | 'payload_hashes' | 'payload_schemas' | 'previous_hashes'\n\nexport interface BoundWitnessBuilderOptions<TBoundWitness extends BoundWitness = BoundWitness, TPayload extends Payload = Payload>\n extends Omit<PayloadBuilderOptions<Omit<TBoundWitness, GeneratedBoundWitnessFields>>, 'schema'> {\n readonly accounts?: AccountInstance[]\n readonly destination?: string[]\n readonly payloadHashes?: TBoundWitness['payload_hashes']\n readonly payloadSchemas?: TBoundWitness['payload_schemas']\n readonly payloads?: TPayload[]\n readonly sourceQuery?: Hash\n readonly timestamp?: number\n}\n\nexport class BoundWitnessBuilder<TBoundWitness extends BoundWitness = BoundWitness, TPayload extends Payload = Payload> extends PayloadBuilderBase<\n Omit<TBoundWitness, GeneratedBoundWitnessFields>,\n BoundWitnessBuilderOptions<TBoundWitness> & { 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<TBoundWitness, 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 protected get addresses(): Address[] {\n return this._accounts.map((account) => account.address)\n }\n\n protected get payloadSchemas(): string[] {\n return (\n this._payloadSchemas ??\n this._payloads.map((payload) => {\n return assertEx(payload.schema, () => this.missingSchemaMessage(payload))\n })\n )\n }\n\n protected get previousHashBuffers(): (ArrayBuffer | null)[] {\n return this._accounts.map((account) => account.previousHashBytes ?? null)\n }\n\n protected get previousHashes(): (Hash | null)[] {\n return this._accounts.map((account) => account.previousHash ?? null)\n }\n\n protected get timestamp(): number {\n return (this._timestamp = typeof this._timestamp === 'number' ? this._timestamp : Date.now())\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 async build<TBoundWitness extends BoundWitness>(options: BoundWitnessBuilderOptions<TBoundWitness>) {\n return await new BoundWitnessBuilder(options).build()\n }\n\n static override async dataHashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: Omit<T, 'schema' | '$hash' | '$meta'>,\n ): Promise<Omit<T, '$hash' | '$meta'>> {\n return await PayloadBuilderBase.dataHashableFields(schema, fields)\n }\n\n static override async hashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: Omit<T, 'schema' | '$hash' | '$meta'>,\n $meta?: JsonObject,\n $hash?: Hash,\n timestamp?: number,\n ): Promise<WithMeta<T>> {\n return await PayloadBuilderBase.hashableFields(schema, fields, $meta, $hash, timestamp)\n }\n\n static previousHash<T extends BoundWitness>(boundWitness: T, address: Address) {\n return boundWitness.previous_hashes[this.addressIndex(boundWitness, address)]\n }\n\n protected static async linkingFields<T extends BoundWitness = BoundWitness>(\n accounts: AccountInstance[],\n payloads?: Payload[],\n timestamp = Date.now(),\n ) {\n const addresses = accounts.map((account) => hexFromArrayBuffer(account.addressBytes, { prefix: false }))\n const previous_hashes = accounts.map((account) => account.previousHash ?? null)\n const payload_hashes = payloads ? await PayloadBuilder.dataHashes(payloads) : []\n const payload_schemas = payloads?.map(({ schema }) => schema)\n return { addresses, payload_hashes, payload_schemas, previous_hashes, timestamp } as Omit<T, '$meta' | '$hash' | 'schema'>\n }\n\n protected static async metaFields(\n dataHash: Hash,\n otherMeta?: JsonObject,\n accounts?: AccountInstance[],\n previousHashes?: (Hash | null)[],\n destination?: Address[],\n sourceQuery?: Hash,\n ): Promise<JsonObject> {\n const meta: JsonObject = { ...otherMeta }\n\n if (accounts?.length && previousHashes?.length) {\n assertEx(accounts.length === previousHashes.length, 'accounts and previousHashes must have same length')\n meta.signatures = await this.signatures(accounts, dataHash, previousHashes)\n }\n\n if (sourceQuery) {\n meta.sourceQuery = sourceQuery\n }\n\n if (destination) {\n meta.destination = destination\n }\n\n return meta\n }\n\n protected static signature<T extends BoundWitness>(payload: T, address: Address) {\n return payload.$meta.signatures[this.addressIndex(payload, address)]\n }\n\n protected static async signatures(accounts: AccountInstance[], hash: Hash, previousHashes: (Hash | ArrayBuffer | null)[]): Promise<string[]> {\n const hashBytes = toArrayBuffer(hash)\n const previousHashesBytes = previousHashes?.map((ph) => (ph ? toUint8Array(ph) : undefined))\n return await Promise.all(accounts.map(async (account, index) => hexFromArrayBuffer(await account.sign(hashBytes, previousHashesBytes[index]))))\n }\n\n private static validateLinkingFields(bw: Pick<BoundWitness, 'payload_hashes' | 'payload_schemas'>) {\n assertEx(bw.payload_hashes?.length === bw.payload_schemas?.length, 'Payload hash/schema mismatch')\n assertEx(!bw.payload_hashes.some((hash) => !hash), () => 'nulls found in hashes')\n assertEx(!bw.payload_schemas.some((schema) => !schema), 'nulls found in schemas')\n }\n\n async build(): Promise<[WithMeta<TBoundWitness>, TPayload[], ModuleError[]]> {\n return await BoundWitnessBuilder._buildMutex.runExclusive(async () => {\n const dataHashableFields = (await this.dataHashableFields()) as TBoundWitness\n const $hash = (await PayloadBuilder.build(dataHashableFields)).$hash\n const $meta = await this.metaFields($hash)\n\n const ret = {\n ...dataHashableFields,\n $hash,\n $meta,\n } as WithMeta<TBoundWitness>\n return [ret, this._payloads, this._errors]\n })\n }\n\n override async dataHashableFields(): Promise<Omit<TBoundWitness, '$meta' | '$hash'>> {\n const fields = await this.linkingFields()\n const result = await BoundWitnessBuilder.dataHashableFields<TBoundWitness>(this._schema, fields)\n\n BoundWitnessBuilder.validateLinkingFields(result)\n\n return result as Omit<TBoundWitness, '$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 | null)[]): 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 linkingFields() {\n return await BoundWitnessBuilder.linkingFields<TBoundWitness>(this._accounts, this._payloads, this.timestamp)\n }\n\n private async metaFields(dataHash: Hash): Promise<JsonObject> {\n return await BoundWitnessBuilder.metaFields(dataHash, this._$meta, this._accounts, this.previousHashes, this._destination, this._sourceQuery)\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","addresses","map","account","address","payload","assertEx","missingSchemaMessage","previousHashBuffers","previousHashBytes","previousHashes","previousHash","Date","now","addressIndex","index","indexOf","Error","build","dataHashableFields","fields","hashableFields","$meta","$hash","boundWitness","previous_hashes","linkingFields","hexFromArrayBuffer","addressBytes","prefix","payload_hashes","PayloadBuilder","dataHashes","payload_schemas","metaFields","dataHash","otherMeta","meta","length","signatures","signature","hash","hashBytes","toArrayBuffer","previousHashesBytes","ph","toUint8Array","undefined","Promise","all","sign","validateLinkingFields","bw","some","_buildMutex","runExclusive","ret","result","_schema","error","unwrappedPayload","PayloadWrapper","unwrap","push","sortFields","errors","hashes","query","witness","witnesses","_hash","_$meta","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.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",
19
+ "@xyo-network/account-model": "~2.90.0",
20
+ "@xyo-network/boundwitness-model": "~2.90.0",
21
+ "@xyo-network/boundwitness-validator": "~2.90.0",
22
+ "@xyo-network/boundwitness-wrapper": "~2.90.0",
23
+ "@xyo-network/hash": "~2.90.0",
24
+ "@xyo-network/payload": "~2.90.0",
25
+ "@xyo-network/payload-model": "~2.90.0",
26
+ "@xyo-network/payload-wrapper": "~2.90.0",
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.2",
34
+ "@xyo-network/account": "~2.90.0",
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.2",
75
+ "version": "2.90.0",
76
76
  "type": "module"
77
77
  }