@xyo-network/payload-builder 2.95.9 → 2.96.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.
@@ -63,11 +63,13 @@ var _PayloadBuilderBase = class _PayloadBuilderBase {
63
63
  ...cleanFields
64
64
  }, "$"), "_");
65
65
  }
66
- static metaFields(dataHash, otherMeta) {
66
+ static metaFields(dataHash, otherMeta, stamp = true) {
67
67
  const meta = {
68
68
  ...otherMeta
69
69
  };
70
- meta.timestamp = meta.timestamp ?? Date.now();
70
+ if (!meta.timestamp && stamp) {
71
+ meta.timestamp = meta.timestamp ?? Date.now();
72
+ }
71
73
  return meta;
72
74
  }
73
75
  $meta(meta) {
@@ -94,8 +96,8 @@ var _PayloadBuilderBase = class _PayloadBuilderBase {
94
96
  schema(value) {
95
97
  this._schema = value;
96
98
  }
97
- async metaFields(dataHash) {
98
- return await _PayloadBuilderBase.metaFields(dataHash, this._$meta);
99
+ async metaFields(dataHash, stamp = true) {
100
+ return await _PayloadBuilderBase.metaFields(dataHash, this._$meta, stamp);
99
101
  }
100
102
  };
101
103
  __name(_PayloadBuilderBase, "PayloadBuilderBase");
@@ -103,40 +105,47 @@ var PayloadBuilderBase = _PayloadBuilderBase;
103
105
 
104
106
  // src/Builder.ts
105
107
  var _PayloadBuilder = class _PayloadBuilder extends PayloadBuilderBase {
106
- static async build(payload, validate = true) {
108
+ static async build(payload, options = {}) {
107
109
  if (Array.isArray(payload)) {
108
- return await Promise.all(payload.map((payload2) => this.build(payload2)));
110
+ return await Promise.all(payload.map((payload2) => this.build(payload2, options)));
109
111
  } else {
110
- const { schema, $hash: incomingDataHash, $meta } = payload;
112
+ const { stamp = true, validate = true } = options;
113
+ const { schema, $hash: incomingDataHash, $meta: incomingMeta } = payload;
111
114
  const fields = removeMetaAndSchema(payload);
112
115
  const dataHashableFields = await _PayloadBuilder.dataHashableFields(schema, fields);
113
116
  const $hash = validate || incomingDataHash === void 0 ? await import_hash2.PayloadHasher.hash(dataHashableFields) : incomingDataHash;
117
+ const $meta = {
118
+ ...incomingMeta
119
+ };
120
+ if ($meta.timestamp === void 0 && stamp) {
121
+ $meta.timestamp = Date.now();
122
+ }
114
123
  const hashableFields = {
115
124
  ...dataHashableFields,
116
125
  $hash,
117
- $meta: {
118
- ...$meta,
119
- timestamp: ($meta == null ? void 0 : $meta.timestamp) ?? Date.now()
120
- }
126
+ schema
121
127
  };
128
+ if (Object.keys($meta).length > 0) {
129
+ hashableFields.$meta = $meta;
130
+ }
122
131
  return hashableFields;
123
132
  }
124
133
  }
125
- static async dataHash(payload, validate = true) {
126
- return (await this.build(payload, validate)).$hash;
134
+ static async dataHash(payload, options) {
135
+ return (await this.build(payload, options)).$hash;
127
136
  }
128
- static async dataHashPairs(payloads, validate = true) {
137
+ static async dataHashPairs(payloads, options) {
129
138
  return await Promise.all(payloads.map(async (payload) => {
130
- const built = await _PayloadBuilder.build(payload, validate);
139
+ const built = await _PayloadBuilder.build(payload, options);
131
140
  return [
132
141
  built,
133
142
  built.$hash
134
143
  ];
135
144
  }));
136
145
  }
137
- static async dataHashes(payloads, validate = true) {
146
+ static async dataHashes(payloads, options) {
138
147
  return payloads ? await Promise.all(payloads.map(async (payload) => {
139
- const built = await _PayloadBuilder.build(payload, validate);
148
+ const built = await _PayloadBuilder.build(payload, options);
140
149
  return built.$hash;
141
150
  })) : void 0;
142
151
  }
@@ -161,35 +170,46 @@ var _PayloadBuilder = class _PayloadBuilder extends PayloadBuilderBase {
161
170
  var _a;
162
171
  return (_a = (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)) == null ? void 0 : _a[0];
163
172
  }
164
- static async hash(payload, validate = false) {
165
- return await import_hash2.PayloadHasher.hash(await _PayloadBuilder.build(payload, validate));
173
+ static async hash(payload, options) {
174
+ return await import_hash2.PayloadHasher.hash(await _PayloadBuilder.build(payload, options));
166
175
  }
167
176
  /**
168
177
  * Creates an array of payload/hash tuples based on the payloads passed in
169
178
  * @param objs Any array of payloads
170
179
  * @returns An array of payload/hash tuples
171
180
  */
172
- static async hashPairs(payloads) {
181
+ static async hashPairs(payloads, stamp = true) {
173
182
  return await Promise.all(payloads.map(async (payload) => {
174
- const built = await _PayloadBuilder.build(payload);
183
+ const built = await _PayloadBuilder.build(payload, {
184
+ stamp
185
+ });
175
186
  return [
176
187
  built,
177
188
  await _PayloadBuilder.hash(built)
178
189
  ];
179
190
  }));
180
191
  }
181
- static async hashableFields(schema, fields, $meta, $hash, timestamp) {
192
+ static async hashableFields(schema, fields, $meta, $hash, timestamp, stamp = true) {
182
193
  const dataFields = await this.dataHashableFields(schema, fields);
183
194
  (0, import_assert2.assertEx)($meta === void 0 || (0, import_object2.isJsonObject)($meta), () => "$meta must be JsonObject");
184
- return (0, import_hash2.deepOmitPrefixedFields)({
195
+ const result = (0, import_hash2.deepOmitPrefixedFields)({
185
196
  ...dataFields,
186
197
  $hash: $hash ?? await _PayloadBuilder.dataHash(dataFields),
187
- $meta: {
188
- ...$meta,
189
- timestamp: timestamp ?? ($meta == null ? void 0 : $meta.timestamp) ?? Date.now()
190
- },
191
198
  schema
192
199
  }, "_");
200
+ const clonedMeta = {
201
+ ...$meta
202
+ };
203
+ if (timestamp) {
204
+ clonedMeta.timestamp = timestamp;
205
+ }
206
+ if (clonedMeta.timestamp === void 0 && stamp) {
207
+ clonedMeta.timestamp = Date.now();
208
+ }
209
+ if (Object.keys(clonedMeta).length > 0) {
210
+ result.$meta = clonedMeta;
211
+ }
212
+ return result;
193
213
  }
194
214
  static async hashes(payloads) {
195
215
  return await import_hash2.PayloadHasher.hashes(payloads);
@@ -231,16 +251,13 @@ var _PayloadBuilder = class _PayloadBuilder extends PayloadBuilderBase {
231
251
  }
232
252
  }
233
253
  }
234
- async build() {
254
+ async build(options) {
235
255
  const dataHashableFields = await this.dataHashableFields();
236
- const $hash = await import_hash2.PayloadHasher.hash(dataHashableFields);
237
- const $meta = await this.metaFields($hash);
238
- const hashableFields = {
256
+ return await _PayloadBuilder.build({
239
257
  ...dataHashableFields,
240
- $hash,
241
- $meta
242
- };
243
- return hashableFields;
258
+ $meta: this._$meta,
259
+ schema: this._schema
260
+ }, options);
244
261
  }
245
262
  async hashableFields() {
246
263
  return await _PayloadBuilder.hashableFields((0, import_assert2.assertEx)(this._schema, () => "Payload: Missing Schema"), this._fields, this._$meta);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/Builder.ts","../../src/BuilderBase.ts"],"sourcesContent":["export * from './Builder'\nexport * from './BuilderBase'\nexport * from './Options'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject } from '@xylabs/object'\nimport { deepOmitPrefixedFields, PayloadHasher } from '@xyo-network/hash'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderBase, removeMetaAndSchema, WithoutMeta, WithoutSchema } from './BuilderBase'\nimport { PayloadBuilderOptions } from './Options'\n\nexport class PayloadBuilder<\n T extends Payload = Payload<AnyObject>,\n O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>,\n> extends PayloadBuilderBase<T, O> {\n static async build<T extends Payload = Payload<AnyObject>>(payload: T, validate?: boolean): Promise<WithMeta<T>>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T[], validate?: boolean): Promise<WithMeta<T>[]>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T | T[], validate = true) {\n if (Array.isArray(payload)) {\n return await Promise.all(payload.map((payload) => this.build(payload)))\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { schema, $hash: incomingDataHash, $meta } = payload as WithMeta<T>\n const fields = removeMetaAndSchema(payload)\n const dataHashableFields = await PayloadBuilder.dataHashableFields(schema, fields)\n const $hash = validate || incomingDataHash === undefined ? await PayloadHasher.hash(dataHashableFields) : incomingDataHash\n const hashableFields = { ...dataHashableFields, $hash, $meta: { ...$meta, timestamp: $meta?.timestamp ?? Date.now() } as JsonObject }\n\n return hashableFields as WithMeta<T>\n }\n }\n\n static async dataHash<T extends Payload>(payload: T, validate = true): Promise<Hash> {\n return (await this.build(payload, validate)).$hash\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[], validate = true): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, validate)\n return [built, built.$hash]\n }),\n )\n }\n\n static async dataHashes(payloads: undefined, validate?: boolean): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[], validate?: boolean): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[], validate = true): Promise<Hash[] | undefined> {\n return payloads ?\n await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, validate)\n return built.$hash\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await PayloadHasher.filterExcludeByHash(await this.filterExcludeByDataHash(payloads, hash), hash)\n }\n\n static async filterExcludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hash<T extends Payload>(payload: T, validate = false): Promise<Hash> {\n return await PayloadHasher.hash(await PayloadBuilder.build(payload, validate))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends Payload>(payloads: T[]): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[WithMeta<T>, Hash]>>(async (payload) => {\n const built = await PayloadBuilder.build(payload)\n return [built, await PayloadBuilder.hash(built)]\n }),\n )\n }\n\n static async hashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n $meta?: JsonObject,\n $hash?: Hash,\n timestamp?: number,\n ): Promise<WithMeta<T>> {\n const dataFields = await this.dataHashableFields<T>(schema, fields)\n assertEx($meta === undefined || isJsonObject($meta), () => '$meta must be JsonObject')\n return deepOmitPrefixedFields<WithMeta<T>>(\n {\n ...dataFields,\n $hash: $hash ?? (await PayloadBuilder.dataHash(dataFields)),\n $meta: { ...$meta, timestamp: timestamp ?? $meta?.timestamp ?? Date.now() } as JsonObject,\n schema,\n } as WithMeta<T>,\n '_',\n )\n }\n\n static async hashes(payloads: undefined): Promise<undefined>\n static async hashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async hashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return await PayloadHasher.hashes(payloads)\n }\n\n static async toAllHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n result[pair[0].$hash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.dataHashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n static withoutMeta(payload: undefined): undefined\n static withoutMeta<T extends PayloadWithMeta>(payload: T): Omit<T, '$meta'>\n static withoutMeta<T extends PayloadWithMeta>(payloads: T[]): Omit<T, '$meta'>[]\n static withoutMeta<T extends PayloadWithMeta>(payloads: T | T[]) {\n if (Array.isArray(payloads)) {\n return payloads.map((payload) => this.withoutMeta(payload))\n } else {\n if (payloads) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, ...result } = payloads\n return result as Omit<T, '$meta'>\n }\n }\n }\n\n async build(): Promise<WithMeta<T>> {\n const dataHashableFields = await this.dataHashableFields()\n const $hash = await PayloadHasher.hash(dataHashableFields)\n const $meta = await this.metaFields($hash)\n const hashableFields: PayloadWithMeta = { ...dataHashableFields, $hash, $meta }\n\n return hashableFields as WithMeta<T>\n }\n\n async hashableFields() {\n return await PayloadBuilder.hashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n this._$meta,\n )\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject, toJson } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { deepOmitPrefixedFields, removeEmptyFields } from '@xyo-network/hash'\nimport { Payload, Schema, WithMeta, WithOptionalMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderOptions } from './Options'\n\nexport type WithOptionalSchema<T extends Payload> = Omit<T, 'schema'> & Partial<T>\n\nexport type WithoutSchema<T extends WithOptionalSchema<Payload>> = Omit<T, 'schema'>\n\nexport type WithoutMeta<T extends WithOptionalMeta<Payload>> = Omit<T, '$hash' | '$meta'>\n\nexport const removeMetaAndSchema = <T extends Payload>(payload: WithOptionalSchema<WithOptionalMeta<T>>): WithoutSchema<WithoutMeta<T>> => {\n const { ...result } = payload\n delete result.$hash\n delete result.$meta\n delete result.schema\n return result as Omit<T, 'schema'>\n}\n\nexport class PayloadBuilderBase<T extends Payload = Payload<AnyObject>, O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>> {\n protected _$meta?: JsonObject\n protected _fields?: WithoutSchema<WithoutMeta<T>>\n protected _schema: Schema\n\n constructor(readonly options: O) {\n const { schema, fields, meta } = options\n this._schema = schema\n this._fields = removeEmptyFields(fields ?? {}) as WithoutSchema<WithoutMeta<T>>\n this._$meta = meta\n }\n\n static dataHashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n ): Promisable<Omit<T, '$hash' | '$meta'>> {\n const cleanFields = fields ? removeEmptyFields(fields) : undefined\n assertEx(\n cleanFields === undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return deepOmitPrefixedFields(deepOmitPrefixedFields({ schema, ...cleanFields }, '$'), '_') as T\n }\n\n protected static metaFields(dataHash: Hash, otherMeta?: JsonObject): Promisable<JsonObject> {\n const meta: JsonObject = { ...otherMeta }\n\n meta.timestamp = meta.timestamp ?? Date.now()\n\n return meta\n }\n\n $meta(meta?: JsonObject) {\n this._$meta = meta ?? (this._fields as WithMeta<T>).$meta\n return this\n }\n\n async dataHashableFields() {\n return await PayloadBuilderBase.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n )\n }\n\n //we do not require sending in $hash since it will be generated anyway\n fields(fields: WithOptionalSchema<WithOptionalMeta<T>>) {\n if (fields) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, $hash, schema, ...fieldsOnly } = fields\n if ($meta) {\n this.$meta($meta)\n }\n if (schema) {\n this.schema(schema)\n }\n this._fields = removeMetaAndSchema<T>(fields)\n }\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n\n protected async metaFields(dataHash: Hash): Promise<JsonObject> {\n return await PayloadBuilderBase.metaFields(dataHash, this._$meta)\n }\n}\n"],"mappings":"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","names":["import_assert","import_object","import_hash","removeMetaAndSchema","payload","result","$hash","$meta","schema","PayloadBuilderBase","_$meta","_fields","_schema","constructor","options","fields","meta","removeEmptyFields","dataHashableFields","cleanFields","undefined","assertEx","isJsonObject","JSON","stringify","toJson","deepOmitPrefixedFields","metaFields","dataHash","otherMeta","timestamp","Date","now","fieldsOnly","value","PayloadBuilder","PayloadBuilderBase","build","payload","validate","Array","isArray","Promise","all","map","schema","$hash","incomingDataHash","$meta","fields","removeMetaAndSchema","dataHashableFields","undefined","PayloadHasher","hash","hashableFields","timestamp","Date","now","dataHash","dataHashPairs","payloads","built","dataHashes","filterExclude","filterExcludeByHash","filterExcludeByDataHash","hashes","filter","_","objHash","includes","pair","filterIncludeByDataHash","findByDataHash","find","hashPairs","dataFields","assertEx","isJsonObject","deepOmitPrefixedFields","toAllHashMap","objs","result","toDataHashMap","toHashMap","withoutMeta","metaFields","_schema","_fields","_$meta"]}
1
+ {"version":3,"sources":["../../src/index.ts","../../src/Builder.ts","../../src/BuilderBase.ts"],"sourcesContent":["export * from './Builder'\nexport * from './BuilderBase'\nexport * from './Options'\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject } from '@xylabs/object'\nimport { deepOmitPrefixedFields, PayloadHasher } from '@xyo-network/hash'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderBase, removeMetaAndSchema, WithoutMeta, WithoutSchema } from './BuilderBase'\nimport { PayloadBuilderOptions } from './Options'\n\nexport interface BuildOptions {\n stamp?: boolean\n validate?: boolean\n}\n\nexport class PayloadBuilder<\n T extends Payload = Payload<AnyObject>,\n O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>,\n> extends PayloadBuilderBase<T, O> {\n static async build<T extends Payload = Payload<AnyObject>>(payload: T, options?: BuildOptions): Promise<WithMeta<T>>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T[], options?: BuildOptions): Promise<WithMeta<T>[]>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T | T[], options: BuildOptions = {}) {\n if (Array.isArray(payload)) {\n return await Promise.all(payload.map((payload) => this.build(payload, options)))\n } else {\n const { stamp = true, validate = true } = options\n const { schema, $hash: incomingDataHash, $meta: incomingMeta } = payload as WithMeta<T>\n const fields = removeMetaAndSchema(payload)\n const dataHashableFields = await PayloadBuilder.dataHashableFields(schema, fields)\n const $hash = validate || incomingDataHash === undefined ? await PayloadHasher.hash(dataHashableFields) : incomingDataHash\n const $meta: JsonObject = { ...incomingMeta }\n if ($meta.timestamp === undefined && stamp) {\n $meta.timestamp = Date.now()\n }\n const hashableFields: WithMeta<Payload> = { ...dataHashableFields, $hash, schema }\n\n if (Object.keys($meta).length > 0) {\n hashableFields.$meta = $meta\n }\n\n return hashableFields as WithMeta<T>\n }\n }\n\n static async dataHash<T extends Payload>(payload: T, options?: BuildOptions): Promise<Hash> {\n return (await this.build(payload, options)).$hash\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[], options?: BuildOptions): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, options)\n return [built, built.$hash]\n }),\n )\n }\n\n static async dataHashes(payloads: undefined, options?: BuildOptions): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[], options?: BuildOptions): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[], options?: BuildOptions): Promise<Hash[] | undefined> {\n return payloads ?\n await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, options)\n return built.$hash\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await PayloadHasher.filterExcludeByHash(await this.filterExcludeByDataHash(payloads, hash), hash)\n }\n\n static async filterExcludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hash<T extends Payload>(payload: T, options?: BuildOptions): Promise<Hash> {\n return await PayloadHasher.hash(await PayloadBuilder.build(payload, options))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends Payload>(payloads: T[], stamp = true): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[WithMeta<T>, Hash]>>(async (payload) => {\n const built = await PayloadBuilder.build(payload, { stamp })\n return [built, await PayloadBuilder.hash(built)]\n }),\n )\n }\n\n static async hashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n $meta?: JsonObject,\n $hash?: Hash,\n timestamp?: number,\n stamp = true,\n ): Promise<WithMeta<T>> {\n const dataFields = await this.dataHashableFields<T>(schema, fields)\n assertEx($meta === undefined || isJsonObject($meta), () => '$meta must be JsonObject')\n const result: WithMeta<T> = deepOmitPrefixedFields<WithMeta<T>>(\n {\n ...dataFields,\n $hash: $hash ?? (await PayloadBuilder.dataHash(dataFields)),\n schema,\n } as WithMeta<T>,\n '_',\n )\n\n const clonedMeta = { ...$meta }\n\n if (timestamp) {\n clonedMeta.timestamp = timestamp\n }\n\n if (clonedMeta.timestamp === undefined && stamp) {\n clonedMeta.timestamp = Date.now()\n }\n\n if (Object.keys(clonedMeta).length > 0) {\n result.$meta = clonedMeta\n }\n\n return result\n }\n\n static async hashes(payloads: undefined): Promise<undefined>\n static async hashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async hashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return await PayloadHasher.hashes(payloads)\n }\n\n static async toAllHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n result[pair[0].$hash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.dataHashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n static withoutMeta(payload: undefined): undefined\n static withoutMeta<T extends PayloadWithMeta>(payload: T): Omit<T, '$meta'>\n static withoutMeta<T extends PayloadWithMeta>(payloads: T[]): Omit<T, '$meta'>[]\n static withoutMeta<T extends PayloadWithMeta>(payloads: T | T[]) {\n if (Array.isArray(payloads)) {\n return payloads.map((payload) => this.withoutMeta(payload))\n } else {\n if (payloads) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, ...result } = payloads\n return result as Omit<T, '$meta'>\n }\n }\n }\n\n async build(options?: BuildOptions): Promise<WithMeta<T>> {\n const dataHashableFields = await this.dataHashableFields()\n return await PayloadBuilder.build<T>({ ...dataHashableFields, $meta: this._$meta, schema: this._schema } as Payload as T, options)\n }\n\n async hashableFields() {\n return await PayloadBuilder.hashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n this._$meta,\n )\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject, toJson } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { deepOmitPrefixedFields, removeEmptyFields } from '@xyo-network/hash'\nimport { Payload, Schema, WithMeta, WithOptionalMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderOptions } from './Options'\n\nexport type WithOptionalSchema<T extends Payload> = Omit<T, 'schema'> & Partial<T>\n\nexport type WithoutSchema<T extends WithOptionalSchema<Payload>> = Omit<T, 'schema'>\n\nexport type WithoutMeta<T extends WithOptionalMeta<Payload>> = Omit<T, '$hash' | '$meta'>\n\nexport const removeMetaAndSchema = <T extends Payload>(payload: WithOptionalSchema<WithOptionalMeta<T>>): WithoutSchema<WithoutMeta<T>> => {\n const { ...result } = payload\n delete result.$hash\n delete result.$meta\n delete result.schema\n return result as Omit<T, 'schema'>\n}\n\nexport class PayloadBuilderBase<T extends Payload = Payload<AnyObject>, O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>> {\n protected _$meta?: JsonObject\n protected _fields?: WithoutSchema<WithoutMeta<T>>\n protected _schema: Schema\n\n constructor(readonly options: O) {\n const { schema, fields, meta } = options\n this._schema = schema\n this._fields = removeEmptyFields(fields ?? {}) as WithoutSchema<WithoutMeta<T>>\n this._$meta = meta\n }\n\n static dataHashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n ): Promisable<Omit<T, '$hash' | '$meta'>> {\n const cleanFields = fields ? removeEmptyFields(fields) : undefined\n assertEx(\n cleanFields === undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return deepOmitPrefixedFields(deepOmitPrefixedFields({ schema, ...cleanFields }, '$'), '_') as T\n }\n\n protected static metaFields(dataHash: Hash, otherMeta?: JsonObject, stamp = true): Promisable<JsonObject> {\n const meta: JsonObject = { ...otherMeta }\n\n if (!meta.timestamp && stamp) {\n meta.timestamp = meta.timestamp ?? Date.now()\n }\n\n return meta\n }\n\n $meta(meta?: JsonObject) {\n this._$meta = meta ?? (this._fields as WithMeta<T>).$meta\n return this\n }\n\n async dataHashableFields() {\n return await PayloadBuilderBase.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n )\n }\n\n //we do not require sending in $hash since it will be generated anyway\n fields(fields: WithOptionalSchema<WithOptionalMeta<T>>) {\n if (fields) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, $hash, schema, ...fieldsOnly } = fields\n if ($meta) {\n this.$meta($meta)\n }\n if (schema) {\n this.schema(schema)\n }\n this._fields = removeMetaAndSchema<T>(fields)\n }\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n\n protected async metaFields(dataHash: Hash, stamp = true): Promise<JsonObject> {\n return await PayloadBuilderBase.metaFields(dataHash, this._$meta, stamp)\n }\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;ACAA,IAAAA,iBAAyB;AAEzB,IAAAC,iBAAoD;AACpD,IAAAC,eAAsD;;;ACHtD,oBAAyB;AAEzB,oBAA4D;AAE5D,kBAA0D;AAWnD,IAAMC,sBAAsB,wBAAoBC,YAAAA;AACrD,QAAM,EAAE,GAAGC,OAAAA,IAAWD;AACtB,SAAOC,OAAOC;AACd,SAAOD,OAAOE;AACd,SAAOF,OAAOG;AACd,SAAOH;AACT,GANmC;AAQ5B,IAAMI,sBAAN,MAAMA,oBAAAA;;EACDC;EACAC;EACAC;EAEVC,YAAqBC,SAAY;SAAZA,UAAAA;AACnB,UAAM,EAAEN,QAAQO,QAAQC,KAAI,IAAKF;AACjC,SAAKF,UAAUJ;AACf,SAAKG,cAAUM,+BAAkBF,UAAU,CAAC,CAAA;AAC5C,SAAKL,SAASM;EAChB;EAEA,OAAOE,mBACLV,QACAO,QACwC;AACxC,UAAMI,cAAcJ,aAASE,+BAAkBF,MAAAA,IAAUK;AACzDC,gCACEF,gBAAgBC,cAAaE,4BAAaH,WAAAA,GAC1C,MAAM,8BAA8BI,KAAKC,cAAUC,sBAAON,WAAAA,GAAc,MAAM,CAAA,CAAA,EAAI;AAEpF,eAAOO,wCAAuBA,oCAAuB;MAAElB;MAAQ,GAAGW;IAAY,GAAG,GAAA,GAAM,GAAA;EACzF;EAEA,OAAiBQ,WAAWC,UAAgBC,WAAwBC,QAAQ,MAA8B;AACxG,UAAMd,OAAmB;MAAE,GAAGa;IAAU;AAExC,QAAI,CAACb,KAAKe,aAAaD,OAAO;AAC5Bd,WAAKe,YAAYf,KAAKe,aAAaC,KAAKC,IAAG;IAC7C;AAEA,WAAOjB;EACT;EAEAT,MAAMS,MAAmB;AACvB,SAAKN,SAASM,QAAS,KAAKL,QAAwBJ;AACpD,WAAO;EACT;EAEA,MAAMW,qBAAqB;AACzB,WAAO,MAAMT,oBAAmBS,uBAC9BG,wBAAS,KAAKT,SAAS,MAAM,yBAAA,GAC7B,KAAKD,OAAO;EAEhB;;EAGAI,OAAOA,QAAiD;AACtD,QAAIA,QAAQ;AAEV,YAAM,EAAER,OAAOD,OAAOE,QAAQ,GAAG0B,WAAAA,IAAenB;AAChD,UAAIR,OAAO;AACT,aAAKA,MAAMA,KAAAA;MACb;AACA,UAAIC,QAAQ;AACV,aAAKA,OAAOA,MAAAA;MACd;AACA,WAAKG,UAAUR,oBAAuBY,MAAAA;IACxC;AACA,WAAO;EACT;EAEAP,OAAO2B,OAAe;AACpB,SAAKvB,UAAUuB;EACjB;EAEA,MAAgBR,WAAWC,UAAgBE,QAAQ,MAA2B;AAC5E,WAAO,MAAMrB,oBAAmBkB,WAAWC,UAAU,KAAKlB,QAAQoB,KAAAA;EACpE;AACF;AArEarB;AAAN,IAAMA,qBAAN;;;ADTA,IAAM2B,kBAAN,MAAMA,wBAGHC,mBAAAA;EAGR,aAAaC,MAA8CC,SAAkBC,UAAwB,CAAC,GAAG;AACvG,QAAIC,MAAMC,QAAQH,OAAAA,GAAU;AAC1B,aAAO,MAAMI,QAAQC,IAAIL,QAAQM,IAAI,CAACN,aAAY,KAAKD,MAAMC,UAASC,OAAAA,CAAAA,CAAAA;IACxE,OAAO;AACL,YAAM,EAAEM,QAAQ,MAAMC,WAAW,KAAI,IAAKP;AAC1C,YAAM,EAAEQ,QAAQC,OAAOC,kBAAkBC,OAAOC,aAAY,IAAKb;AACjE,YAAMc,SAASC,oBAAoBf,OAAAA;AACnC,YAAMgB,qBAAqB,MAAMnB,gBAAemB,mBAAmBP,QAAQK,MAAAA;AAC3E,YAAMJ,QAAQF,YAAYG,qBAAqBM,SAAY,MAAMC,2BAAcC,KAAKH,kBAAAA,IAAsBL;AAC1G,YAAMC,QAAoB;QAAE,GAAGC;MAAa;AAC5C,UAAID,MAAMQ,cAAcH,UAAaV,OAAO;AAC1CK,cAAMQ,YAAYC,KAAKC,IAAG;MAC5B;AACA,YAAMC,iBAAoC;QAAE,GAAGP;QAAoBN;QAAOD;MAAO;AAEjF,UAAIe,OAAOC,KAAKb,KAAAA,EAAOc,SAAS,GAAG;AACjCH,uBAAeX,QAAQA;MACzB;AAEA,aAAOW;IACT;EACF;EAEA,aAAaI,SAA4B3B,SAAYC,SAAuC;AAC1F,YAAQ,MAAM,KAAKF,MAAMC,SAASC,OAAAA,GAAUS;EAC9C;EAEA,aAAakB,cAAiCC,UAAe5B,SAAwD;AACnH,WAAO,MAAMG,QAAQC,IACnBwB,SAASvB,IAAI,OAAON,YAAAA;AAClB,YAAM8B,QAAQ,MAAMjC,gBAAeE,MAAMC,SAASC,OAAAA;AAClD,aAAO;QAAC6B;QAAOA,MAAMpB;;IACvB,CAAA,CAAA;EAEJ;EAIA,aAAaqB,WAA8BF,UAAgB5B,SAAqD;AAC9G,WAAO4B,WACH,MAAMzB,QAAQC,IACZwB,SAASvB,IAAI,OAAON,YAAAA;AAClB,YAAM8B,QAAQ,MAAMjC,gBAAeE,MAAMC,SAASC,OAAAA;AAClD,aAAO6B,MAAMpB;IACf,CAAA,CAAA,IAEFO;EACN;EAEA,aAAae,cAAiCH,WAAgB,CAAA,GAAIV,MAAmC;AACnG,WAAO,MAAMD,2BAAce,oBAAoB,MAAM,KAAKC,wBAAwBL,UAAUV,IAAAA,GAAOA,IAAAA;EACrG;EAEA,aAAae,wBAA2CL,WAAgB,CAAA,GAAIV,MAAmC;AAzEjH;AA0EI,UAAMgB,SAASjC,MAAMC,QAAQgB,IAAAA,IAAQA,OAAO;MAACA;;AAC7C,YAAQ,YAAM,KAAKS,cAAcC,QAAAA,GAAWO,OAAO,CAAC,CAACC,GAAGC,OAAAA,MAAa,CAACH,OAAOI,SAASD,OAAAA,CAAAA,MAA9E,mBAAyFhC,IAAI,CAACkC,SAASA,KAAK,CAAA;EACtH;EAEA,aAAaC,wBAA2CZ,WAAgB,CAAA,GAAIV,MAAmC;AA9EjH;AA+EI,UAAMgB,SAASjC,MAAMC,QAAQgB,IAAAA,IAAQA,OAAO;MAACA;;AAC7C,YAAQ,YAAM,KAAKS,cAAcC,QAAAA,GAAWO,OAAO,CAAC,CAACC,GAAGC,OAAAA,MAAaH,OAAOI,SAASD,OAAAA,CAAAA,MAA7E,mBAAwFhC,IAAI,CAACkC,SAASA,KAAK,CAAA;EACrH;EAEA,aAAaE,eAAkCb,WAAgB,CAAA,GAAIV,MAAoC;AAnFzG;AAoFI,YAAQ,YAAM,KAAKS,cAAcC,QAAAA,GAAWc,KAAK,CAAC,CAACN,GAAGC,OAAAA,MAAaA,YAAYnB,IAAAA,MAAvE,mBAA+E;EACzF;EAEA,aAAaA,KAAwBnB,SAAYC,SAAuC;AACtF,WAAO,MAAMiB,2BAAcC,KAAK,MAAMtB,gBAAeE,MAAMC,SAASC,OAAAA,CAAAA;EACtE;;;;;;EAOA,aAAa2C,UAA6Bf,UAAetB,QAAQ,MAAsC;AACrG,WAAO,MAAMH,QAAQC,IACnBwB,SAASvB,IAAkC,OAAON,YAAAA;AAChD,YAAM8B,QAAQ,MAAMjC,gBAAeE,MAAMC,SAAS;QAAEO;MAAM,CAAA;AAC1D,aAAO;QAACuB;QAAO,MAAMjC,gBAAesB,KAAKW,KAAAA;;IAC3C,CAAA,CAAA;EAEJ;EAEA,aAAaP,eACXd,QACAK,QACAF,OACAF,OACAU,WACAb,QAAQ,MACc;AACtB,UAAMsC,aAAa,MAAM,KAAK7B,mBAAsBP,QAAQK,MAAAA;AAC5DgC,iCAASlC,UAAUK,cAAa8B,6BAAanC,KAAAA,GAAQ,MAAM,0BAAA;AAC3D,UAAMoC,aAAsBC,qCAC1B;MACE,GAAGJ;MACHnC,OAAOA,SAAU,MAAMb,gBAAe8B,SAASkB,UAAAA;MAC/CpC;IACF,GACA,GAAA;AAGF,UAAMyC,aAAa;MAAE,GAAGtC;IAAM;AAE9B,QAAIQ,WAAW;AACb8B,iBAAW9B,YAAYA;IACzB;AAEA,QAAI8B,WAAW9B,cAAcH,UAAaV,OAAO;AAC/C2C,iBAAW9B,YAAYC,KAAKC,IAAG;IACjC;AAEA,QAAIE,OAAOC,KAAKyB,UAAAA,EAAYxB,SAAS,GAAG;AACtCsB,aAAOpC,QAAQsC;IACjB;AAEA,WAAOF;EACT;EAIA,aAAab,OAA0BN,UAA6C;AAClF,WAAO,MAAMX,2BAAciB,OAAON,QAAAA;EACpC;EAEA,aAAasB,aAAgCC,MAA+C;AAC1F,UAAMJ,SAAoC,CAAC;AAC3C,eAAWR,QAAQ,MAAM,KAAKI,UAAUQ,IAAAA,GAAO;AAC7CJ,aAAOR,KAAK,CAAA,CAAE,IAAIA,KAAK,CAAA;AACvBQ,aAAOR,KAAK,CAAA,EAAG9B,KAAK,IAAI8B,KAAK,CAAA;IAC/B;AACA,WAAOQ;EACT;EAEA,aAAaK,cAAiCD,MAA+C;AAC3F,UAAMJ,SAAoC,CAAC;AAC3C,eAAWR,QAAQ,MAAM,KAAKZ,cAAcwB,IAAAA,GAAO;AACjDJ,aAAOR,KAAK,CAAA,CAAE,IAAIA,KAAK,CAAA;IACzB;AACA,WAAOQ;EACT;;;;;;EAOA,aAAaM,UAA6BF,MAA+C;AACvF,UAAMJ,SAAoC,CAAC;AAC3C,eAAWR,QAAQ,MAAM,KAAKI,UAAUQ,IAAAA,GAAO;AAC7CJ,aAAOR,KAAK,CAAA,CAAE,IAAIA,KAAK,CAAA;IACzB;AACA,WAAOQ;EACT;EAKA,OAAOO,YAAuC1B,UAAmB;AAC/D,QAAI3B,MAAMC,QAAQ0B,QAAAA,GAAW;AAC3B,aAAOA,SAASvB,IAAI,CAACN,YAAY,KAAKuD,YAAYvD,OAAAA,CAAAA;IACpD,OAAO;AACL,UAAI6B,UAAU;AAEZ,cAAM,EAAEjB,OAAO,GAAGoC,OAAAA,IAAWnB;AAC7B,eAAOmB;MACT;IACF;EACF;EAEA,MAAMjD,MAAME,SAA8C;AACxD,UAAMe,qBAAqB,MAAM,KAAKA,mBAAkB;AACxD,WAAO,MAAMnB,gBAAeE,MAAS;MAAE,GAAGiB;MAAoBJ,OAAO,KAAK4C;MAAQ/C,QAAQ,KAAKgD;IAAQ,GAAmBxD,OAAAA;EAC5H;EAEA,MAAMsB,iBAAiB;AACrB,WAAO,MAAM1B,gBAAe0B,mBAC1BuB,yBAAS,KAAKW,SAAS,MAAM,yBAAA,GAC7B,KAAKC,SACL,KAAKF,MAAM;EAEf;AACF;AA3LU1D;AAHH,IAAMD,iBAAN;","names":["import_assert","import_object","import_hash","removeMetaAndSchema","payload","result","$hash","$meta","schema","PayloadBuilderBase","_$meta","_fields","_schema","constructor","options","fields","meta","removeEmptyFields","dataHashableFields","cleanFields","undefined","assertEx","isJsonObject","JSON","stringify","toJson","deepOmitPrefixedFields","metaFields","dataHash","otherMeta","stamp","timestamp","Date","now","fieldsOnly","value","PayloadBuilder","PayloadBuilderBase","build","payload","options","Array","isArray","Promise","all","map","stamp","validate","schema","$hash","incomingDataHash","$meta","incomingMeta","fields","removeMetaAndSchema","dataHashableFields","undefined","PayloadHasher","hash","timestamp","Date","now","hashableFields","Object","keys","length","dataHash","dataHashPairs","payloads","built","dataHashes","filterExclude","filterExcludeByHash","filterExcludeByDataHash","hashes","filter","_","objHash","includes","pair","filterIncludeByDataHash","findByDataHash","find","hashPairs","dataFields","assertEx","isJsonObject","result","deepOmitPrefixedFields","clonedMeta","toAllHashMap","objs","toDataHashMap","toHashMap","withoutMeta","_$meta","_schema","_fields"]}
@@ -37,11 +37,13 @@ var _PayloadBuilderBase = class _PayloadBuilderBase {
37
37
  ...cleanFields
38
38
  }, "$"), "_");
39
39
  }
40
- static metaFields(dataHash, otherMeta) {
40
+ static metaFields(dataHash, otherMeta, stamp = true) {
41
41
  const meta = {
42
42
  ...otherMeta
43
43
  };
44
- meta.timestamp = meta.timestamp ?? Date.now();
44
+ if (!meta.timestamp && stamp) {
45
+ meta.timestamp = meta.timestamp ?? Date.now();
46
+ }
45
47
  return meta;
46
48
  }
47
49
  $meta(meta) {
@@ -68,8 +70,8 @@ var _PayloadBuilderBase = class _PayloadBuilderBase {
68
70
  schema(value) {
69
71
  this._schema = value;
70
72
  }
71
- async metaFields(dataHash) {
72
- return await _PayloadBuilderBase.metaFields(dataHash, this._$meta);
73
+ async metaFields(dataHash, stamp = true) {
74
+ return await _PayloadBuilderBase.metaFields(dataHash, this._$meta, stamp);
73
75
  }
74
76
  };
75
77
  __name(_PayloadBuilderBase, "PayloadBuilderBase");
@@ -77,40 +79,47 @@ var PayloadBuilderBase = _PayloadBuilderBase;
77
79
 
78
80
  // src/Builder.ts
79
81
  var _PayloadBuilder = class _PayloadBuilder extends PayloadBuilderBase {
80
- static async build(payload, validate = true) {
82
+ static async build(payload, options = {}) {
81
83
  if (Array.isArray(payload)) {
82
- return await Promise.all(payload.map((payload2) => this.build(payload2)));
84
+ return await Promise.all(payload.map((payload2) => this.build(payload2, options)));
83
85
  } else {
84
- const { schema, $hash: incomingDataHash, $meta } = payload;
86
+ const { stamp = true, validate = true } = options;
87
+ const { schema, $hash: incomingDataHash, $meta: incomingMeta } = payload;
85
88
  const fields = removeMetaAndSchema(payload);
86
89
  const dataHashableFields = await _PayloadBuilder.dataHashableFields(schema, fields);
87
90
  const $hash = validate || incomingDataHash === void 0 ? await PayloadHasher.hash(dataHashableFields) : incomingDataHash;
91
+ const $meta = {
92
+ ...incomingMeta
93
+ };
94
+ if ($meta.timestamp === void 0 && stamp) {
95
+ $meta.timestamp = Date.now();
96
+ }
88
97
  const hashableFields = {
89
98
  ...dataHashableFields,
90
99
  $hash,
91
- $meta: {
92
- ...$meta,
93
- timestamp: ($meta == null ? void 0 : $meta.timestamp) ?? Date.now()
94
- }
100
+ schema
95
101
  };
102
+ if (Object.keys($meta).length > 0) {
103
+ hashableFields.$meta = $meta;
104
+ }
96
105
  return hashableFields;
97
106
  }
98
107
  }
99
- static async dataHash(payload, validate = true) {
100
- return (await this.build(payload, validate)).$hash;
108
+ static async dataHash(payload, options) {
109
+ return (await this.build(payload, options)).$hash;
101
110
  }
102
- static async dataHashPairs(payloads, validate = true) {
111
+ static async dataHashPairs(payloads, options) {
103
112
  return await Promise.all(payloads.map(async (payload) => {
104
- const built = await _PayloadBuilder.build(payload, validate);
113
+ const built = await _PayloadBuilder.build(payload, options);
105
114
  return [
106
115
  built,
107
116
  built.$hash
108
117
  ];
109
118
  }));
110
119
  }
111
- static async dataHashes(payloads, validate = true) {
120
+ static async dataHashes(payloads, options) {
112
121
  return payloads ? await Promise.all(payloads.map(async (payload) => {
113
- const built = await _PayloadBuilder.build(payload, validate);
122
+ const built = await _PayloadBuilder.build(payload, options);
114
123
  return built.$hash;
115
124
  })) : void 0;
116
125
  }
@@ -135,35 +144,46 @@ var _PayloadBuilder = class _PayloadBuilder extends PayloadBuilderBase {
135
144
  var _a;
136
145
  return (_a = (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)) == null ? void 0 : _a[0];
137
146
  }
138
- static async hash(payload, validate = false) {
139
- return await PayloadHasher.hash(await _PayloadBuilder.build(payload, validate));
147
+ static async hash(payload, options) {
148
+ return await PayloadHasher.hash(await _PayloadBuilder.build(payload, options));
140
149
  }
141
150
  /**
142
151
  * Creates an array of payload/hash tuples based on the payloads passed in
143
152
  * @param objs Any array of payloads
144
153
  * @returns An array of payload/hash tuples
145
154
  */
146
- static async hashPairs(payloads) {
155
+ static async hashPairs(payloads, stamp = true) {
147
156
  return await Promise.all(payloads.map(async (payload) => {
148
- const built = await _PayloadBuilder.build(payload);
157
+ const built = await _PayloadBuilder.build(payload, {
158
+ stamp
159
+ });
149
160
  return [
150
161
  built,
151
162
  await _PayloadBuilder.hash(built)
152
163
  ];
153
164
  }));
154
165
  }
155
- static async hashableFields(schema, fields, $meta, $hash, timestamp) {
166
+ static async hashableFields(schema, fields, $meta, $hash, timestamp, stamp = true) {
156
167
  const dataFields = await this.dataHashableFields(schema, fields);
157
168
  assertEx2($meta === void 0 || isJsonObject2($meta), () => "$meta must be JsonObject");
158
- return deepOmitPrefixedFields2({
169
+ const result = deepOmitPrefixedFields2({
159
170
  ...dataFields,
160
171
  $hash: $hash ?? await _PayloadBuilder.dataHash(dataFields),
161
- $meta: {
162
- ...$meta,
163
- timestamp: timestamp ?? ($meta == null ? void 0 : $meta.timestamp) ?? Date.now()
164
- },
165
172
  schema
166
173
  }, "_");
174
+ const clonedMeta = {
175
+ ...$meta
176
+ };
177
+ if (timestamp) {
178
+ clonedMeta.timestamp = timestamp;
179
+ }
180
+ if (clonedMeta.timestamp === void 0 && stamp) {
181
+ clonedMeta.timestamp = Date.now();
182
+ }
183
+ if (Object.keys(clonedMeta).length > 0) {
184
+ result.$meta = clonedMeta;
185
+ }
186
+ return result;
167
187
  }
168
188
  static async hashes(payloads) {
169
189
  return await PayloadHasher.hashes(payloads);
@@ -205,16 +225,13 @@ var _PayloadBuilder = class _PayloadBuilder extends PayloadBuilderBase {
205
225
  }
206
226
  }
207
227
  }
208
- async build() {
228
+ async build(options) {
209
229
  const dataHashableFields = await this.dataHashableFields();
210
- const $hash = await PayloadHasher.hash(dataHashableFields);
211
- const $meta = await this.metaFields($hash);
212
- const hashableFields = {
230
+ return await _PayloadBuilder.build({
213
231
  ...dataHashableFields,
214
- $hash,
215
- $meta
216
- };
217
- return hashableFields;
232
+ $meta: this._$meta,
233
+ schema: this._schema
234
+ }, options);
218
235
  }
219
236
  async hashableFields() {
220
237
  return await _PayloadBuilder.hashableFields(assertEx2(this._schema, () => "Payload: Missing Schema"), this._fields, this._$meta);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Builder.ts","../../src/BuilderBase.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject } from '@xylabs/object'\nimport { deepOmitPrefixedFields, PayloadHasher } from '@xyo-network/hash'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderBase, removeMetaAndSchema, WithoutMeta, WithoutSchema } from './BuilderBase'\nimport { PayloadBuilderOptions } from './Options'\n\nexport class PayloadBuilder<\n T extends Payload = Payload<AnyObject>,\n O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>,\n> extends PayloadBuilderBase<T, O> {\n static async build<T extends Payload = Payload<AnyObject>>(payload: T, validate?: boolean): Promise<WithMeta<T>>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T[], validate?: boolean): Promise<WithMeta<T>[]>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T | T[], validate = true) {\n if (Array.isArray(payload)) {\n return await Promise.all(payload.map((payload) => this.build(payload)))\n } else {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { schema, $hash: incomingDataHash, $meta } = payload as WithMeta<T>\n const fields = removeMetaAndSchema(payload)\n const dataHashableFields = await PayloadBuilder.dataHashableFields(schema, fields)\n const $hash = validate || incomingDataHash === undefined ? await PayloadHasher.hash(dataHashableFields) : incomingDataHash\n const hashableFields = { ...dataHashableFields, $hash, $meta: { ...$meta, timestamp: $meta?.timestamp ?? Date.now() } as JsonObject }\n\n return hashableFields as WithMeta<T>\n }\n }\n\n static async dataHash<T extends Payload>(payload: T, validate = true): Promise<Hash> {\n return (await this.build(payload, validate)).$hash\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[], validate = true): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, validate)\n return [built, built.$hash]\n }),\n )\n }\n\n static async dataHashes(payloads: undefined, validate?: boolean): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[], validate?: boolean): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[], validate = true): Promise<Hash[] | undefined> {\n return payloads ?\n await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, validate)\n return built.$hash\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await PayloadHasher.filterExcludeByHash(await this.filterExcludeByDataHash(payloads, hash), hash)\n }\n\n static async filterExcludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hash<T extends Payload>(payload: T, validate = false): Promise<Hash> {\n return await PayloadHasher.hash(await PayloadBuilder.build(payload, validate))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends Payload>(payloads: T[]): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[WithMeta<T>, Hash]>>(async (payload) => {\n const built = await PayloadBuilder.build(payload)\n return [built, await PayloadBuilder.hash(built)]\n }),\n )\n }\n\n static async hashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n $meta?: JsonObject,\n $hash?: Hash,\n timestamp?: number,\n ): Promise<WithMeta<T>> {\n const dataFields = await this.dataHashableFields<T>(schema, fields)\n assertEx($meta === undefined || isJsonObject($meta), () => '$meta must be JsonObject')\n return deepOmitPrefixedFields<WithMeta<T>>(\n {\n ...dataFields,\n $hash: $hash ?? (await PayloadBuilder.dataHash(dataFields)),\n $meta: { ...$meta, timestamp: timestamp ?? $meta?.timestamp ?? Date.now() } as JsonObject,\n schema,\n } as WithMeta<T>,\n '_',\n )\n }\n\n static async hashes(payloads: undefined): Promise<undefined>\n static async hashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async hashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return await PayloadHasher.hashes(payloads)\n }\n\n static async toAllHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n result[pair[0].$hash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.dataHashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n static withoutMeta(payload: undefined): undefined\n static withoutMeta<T extends PayloadWithMeta>(payload: T): Omit<T, '$meta'>\n static withoutMeta<T extends PayloadWithMeta>(payloads: T[]): Omit<T, '$meta'>[]\n static withoutMeta<T extends PayloadWithMeta>(payloads: T | T[]) {\n if (Array.isArray(payloads)) {\n return payloads.map((payload) => this.withoutMeta(payload))\n } else {\n if (payloads) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, ...result } = payloads\n return result as Omit<T, '$meta'>\n }\n }\n }\n\n async build(): Promise<WithMeta<T>> {\n const dataHashableFields = await this.dataHashableFields()\n const $hash = await PayloadHasher.hash(dataHashableFields)\n const $meta = await this.metaFields($hash)\n const hashableFields: PayloadWithMeta = { ...dataHashableFields, $hash, $meta }\n\n return hashableFields as WithMeta<T>\n }\n\n async hashableFields() {\n return await PayloadBuilder.hashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n this._$meta,\n )\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject, toJson } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { deepOmitPrefixedFields, removeEmptyFields } from '@xyo-network/hash'\nimport { Payload, Schema, WithMeta, WithOptionalMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderOptions } from './Options'\n\nexport type WithOptionalSchema<T extends Payload> = Omit<T, 'schema'> & Partial<T>\n\nexport type WithoutSchema<T extends WithOptionalSchema<Payload>> = Omit<T, 'schema'>\n\nexport type WithoutMeta<T extends WithOptionalMeta<Payload>> = Omit<T, '$hash' | '$meta'>\n\nexport const removeMetaAndSchema = <T extends Payload>(payload: WithOptionalSchema<WithOptionalMeta<T>>): WithoutSchema<WithoutMeta<T>> => {\n const { ...result } = payload\n delete result.$hash\n delete result.$meta\n delete result.schema\n return result as Omit<T, 'schema'>\n}\n\nexport class PayloadBuilderBase<T extends Payload = Payload<AnyObject>, O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>> {\n protected _$meta?: JsonObject\n protected _fields?: WithoutSchema<WithoutMeta<T>>\n protected _schema: Schema\n\n constructor(readonly options: O) {\n const { schema, fields, meta } = options\n this._schema = schema\n this._fields = removeEmptyFields(fields ?? {}) as WithoutSchema<WithoutMeta<T>>\n this._$meta = meta\n }\n\n static dataHashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n ): Promisable<Omit<T, '$hash' | '$meta'>> {\n const cleanFields = fields ? removeEmptyFields(fields) : undefined\n assertEx(\n cleanFields === undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return deepOmitPrefixedFields(deepOmitPrefixedFields({ schema, ...cleanFields }, '$'), '_') as T\n }\n\n protected static metaFields(dataHash: Hash, otherMeta?: JsonObject): Promisable<JsonObject> {\n const meta: JsonObject = { ...otherMeta }\n\n meta.timestamp = meta.timestamp ?? Date.now()\n\n return meta\n }\n\n $meta(meta?: JsonObject) {\n this._$meta = meta ?? (this._fields as WithMeta<T>).$meta\n return this\n }\n\n async dataHashableFields() {\n return await PayloadBuilderBase.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n )\n }\n\n //we do not require sending in $hash since it will be generated anyway\n fields(fields: WithOptionalSchema<WithOptionalMeta<T>>) {\n if (fields) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, $hash, schema, ...fieldsOnly } = fields\n if ($meta) {\n this.$meta($meta)\n }\n if (schema) {\n this.schema(schema)\n }\n this._fields = removeMetaAndSchema<T>(fields)\n }\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n\n protected async metaFields(dataHash: Hash): Promise<JsonObject> {\n return await PayloadBuilderBase.metaFields(dataHash, this._$meta)\n }\n}\n"],"mappings":"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","names":["assertEx","isJsonObject","deepOmitPrefixedFields","PayloadHasher","assertEx","isJsonObject","toJson","deepOmitPrefixedFields","removeEmptyFields","removeMetaAndSchema","payload","result","$hash","$meta","schema","PayloadBuilderBase","_$meta","_fields","_schema","constructor","options","fields","meta","removeEmptyFields","dataHashableFields","cleanFields","undefined","assertEx","isJsonObject","JSON","stringify","toJson","deepOmitPrefixedFields","metaFields","dataHash","otherMeta","timestamp","Date","now","fieldsOnly","value","PayloadBuilder","PayloadBuilderBase","build","payload","validate","Array","isArray","Promise","all","map","schema","$hash","incomingDataHash","$meta","fields","removeMetaAndSchema","dataHashableFields","undefined","PayloadHasher","hash","hashableFields","timestamp","Date","now","dataHash","dataHashPairs","payloads","built","dataHashes","filterExclude","filterExcludeByHash","filterExcludeByDataHash","hashes","filter","_","objHash","includes","pair","filterIncludeByDataHash","findByDataHash","find","hashPairs","dataFields","assertEx","isJsonObject","deepOmitPrefixedFields","toAllHashMap","objs","result","toDataHashMap","toHashMap","withoutMeta","metaFields","_schema","_fields","_$meta"]}
1
+ {"version":3,"sources":["../../src/Builder.ts","../../src/BuilderBase.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject } from '@xylabs/object'\nimport { deepOmitPrefixedFields, PayloadHasher } from '@xyo-network/hash'\nimport { Payload, PayloadWithMeta, WithMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderBase, removeMetaAndSchema, WithoutMeta, WithoutSchema } from './BuilderBase'\nimport { PayloadBuilderOptions } from './Options'\n\nexport interface BuildOptions {\n stamp?: boolean\n validate?: boolean\n}\n\nexport class PayloadBuilder<\n T extends Payload = Payload<AnyObject>,\n O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>,\n> extends PayloadBuilderBase<T, O> {\n static async build<T extends Payload = Payload<AnyObject>>(payload: T, options?: BuildOptions): Promise<WithMeta<T>>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T[], options?: BuildOptions): Promise<WithMeta<T>[]>\n static async build<T extends Payload = Payload<AnyObject>>(payload: T | T[], options: BuildOptions = {}) {\n if (Array.isArray(payload)) {\n return await Promise.all(payload.map((payload) => this.build(payload, options)))\n } else {\n const { stamp = true, validate = true } = options\n const { schema, $hash: incomingDataHash, $meta: incomingMeta } = payload as WithMeta<T>\n const fields = removeMetaAndSchema(payload)\n const dataHashableFields = await PayloadBuilder.dataHashableFields(schema, fields)\n const $hash = validate || incomingDataHash === undefined ? await PayloadHasher.hash(dataHashableFields) : incomingDataHash\n const $meta: JsonObject = { ...incomingMeta }\n if ($meta.timestamp === undefined && stamp) {\n $meta.timestamp = Date.now()\n }\n const hashableFields: WithMeta<Payload> = { ...dataHashableFields, $hash, schema }\n\n if (Object.keys($meta).length > 0) {\n hashableFields.$meta = $meta\n }\n\n return hashableFields as WithMeta<T>\n }\n }\n\n static async dataHash<T extends Payload>(payload: T, options?: BuildOptions): Promise<Hash> {\n return (await this.build(payload, options)).$hash\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[], options?: BuildOptions): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, options)\n return [built, built.$hash]\n }),\n )\n }\n\n static async dataHashes(payloads: undefined, options?: BuildOptions): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[], options?: BuildOptions): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[], options?: BuildOptions): Promise<Hash[] | undefined> {\n return payloads ?\n await Promise.all(\n payloads.map(async (payload) => {\n const built = await PayloadBuilder.build(payload, options)\n return built.$hash\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await PayloadHasher.filterExcludeByHash(await this.filterExcludeByDataHash(payloads, hash), hash)\n }\n\n static async filterExcludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hash<T extends Payload>(payload: T, options?: BuildOptions): Promise<Hash> {\n return await PayloadHasher.hash(await PayloadBuilder.build(payload, options))\n }\n\n /**\n * Creates an array of payload/hash tuples based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload/hash tuples\n */\n static async hashPairs<T extends Payload>(payloads: T[], stamp = true): Promise<[WithMeta<T>, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[WithMeta<T>, Hash]>>(async (payload) => {\n const built = await PayloadBuilder.build(payload, { stamp })\n return [built, await PayloadBuilder.hash(built)]\n }),\n )\n }\n\n static async hashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n $meta?: JsonObject,\n $hash?: Hash,\n timestamp?: number,\n stamp = true,\n ): Promise<WithMeta<T>> {\n const dataFields = await this.dataHashableFields<T>(schema, fields)\n assertEx($meta === undefined || isJsonObject($meta), () => '$meta must be JsonObject')\n const result: WithMeta<T> = deepOmitPrefixedFields<WithMeta<T>>(\n {\n ...dataFields,\n $hash: $hash ?? (await PayloadBuilder.dataHash(dataFields)),\n schema,\n } as WithMeta<T>,\n '_',\n )\n\n const clonedMeta = { ...$meta }\n\n if (timestamp) {\n clonedMeta.timestamp = timestamp\n }\n\n if (clonedMeta.timestamp === undefined && stamp) {\n clonedMeta.timestamp = Date.now()\n }\n\n if (Object.keys(clonedMeta).length > 0) {\n result.$meta = clonedMeta\n }\n\n return result\n }\n\n static async hashes(payloads: undefined): Promise<undefined>\n static async hashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async hashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return await PayloadHasher.hashes(payloads)\n }\n\n static async toAllHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n result[pair[0].$hash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.dataHashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, WithMeta<T>>> {\n const result: Record<Hash, WithMeta<T>> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n static withoutMeta(payload: undefined): undefined\n static withoutMeta<T extends PayloadWithMeta>(payload: T): Omit<T, '$meta'>\n static withoutMeta<T extends PayloadWithMeta>(payloads: T[]): Omit<T, '$meta'>[]\n static withoutMeta<T extends PayloadWithMeta>(payloads: T | T[]) {\n if (Array.isArray(payloads)) {\n return payloads.map((payload) => this.withoutMeta(payload))\n } else {\n if (payloads) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, ...result } = payloads\n return result as Omit<T, '$meta'>\n }\n }\n }\n\n async build(options?: BuildOptions): Promise<WithMeta<T>> {\n const dataHashableFields = await this.dataHashableFields()\n return await PayloadBuilder.build<T>({ ...dataHashableFields, $meta: this._$meta, schema: this._schema } as Payload as T, options)\n }\n\n async hashableFields() {\n return await PayloadBuilder.hashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n this._$meta,\n )\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { Hash } from '@xylabs/hex'\nimport { AnyObject, isJsonObject, JsonObject, toJson } from '@xylabs/object'\nimport { Promisable } from '@xylabs/promise'\nimport { deepOmitPrefixedFields, removeEmptyFields } from '@xyo-network/hash'\nimport { Payload, Schema, WithMeta, WithOptionalMeta } from '@xyo-network/payload-model'\n\nimport { PayloadBuilderOptions } from './Options'\n\nexport type WithOptionalSchema<T extends Payload> = Omit<T, 'schema'> & Partial<T>\n\nexport type WithoutSchema<T extends WithOptionalSchema<Payload>> = Omit<T, 'schema'>\n\nexport type WithoutMeta<T extends WithOptionalMeta<Payload>> = Omit<T, '$hash' | '$meta'>\n\nexport const removeMetaAndSchema = <T extends Payload>(payload: WithOptionalSchema<WithOptionalMeta<T>>): WithoutSchema<WithoutMeta<T>> => {\n const { ...result } = payload\n delete result.$hash\n delete result.$meta\n delete result.schema\n return result as Omit<T, 'schema'>\n}\n\nexport class PayloadBuilderBase<T extends Payload = Payload<AnyObject>, O extends PayloadBuilderOptions<T> = PayloadBuilderOptions<T>> {\n protected _$meta?: JsonObject\n protected _fields?: WithoutSchema<WithoutMeta<T>>\n protected _schema: Schema\n\n constructor(readonly options: O) {\n const { schema, fields, meta } = options\n this._schema = schema\n this._fields = removeEmptyFields(fields ?? {}) as WithoutSchema<WithoutMeta<T>>\n this._$meta = meta\n }\n\n static dataHashableFields<T extends Payload = Payload<AnyObject>>(\n schema: string,\n fields?: WithoutSchema<WithoutMeta<T>>,\n ): Promisable<Omit<T, '$hash' | '$meta'>> {\n const cleanFields = fields ? removeEmptyFields(fields) : undefined\n assertEx(\n cleanFields === undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return deepOmitPrefixedFields(deepOmitPrefixedFields({ schema, ...cleanFields }, '$'), '_') as T\n }\n\n protected static metaFields(dataHash: Hash, otherMeta?: JsonObject, stamp = true): Promisable<JsonObject> {\n const meta: JsonObject = { ...otherMeta }\n\n if (!meta.timestamp && stamp) {\n meta.timestamp = meta.timestamp ?? Date.now()\n }\n\n return meta\n }\n\n $meta(meta?: JsonObject) {\n this._$meta = meta ?? (this._fields as WithMeta<T>).$meta\n return this\n }\n\n async dataHashableFields() {\n return await PayloadBuilderBase.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n this._fields,\n )\n }\n\n //we do not require sending in $hash since it will be generated anyway\n fields(fields: WithOptionalSchema<WithOptionalMeta<T>>) {\n if (fields) {\n // eslint-disable-next-line @typescript-eslint/no-unused-vars\n const { $meta, $hash, schema, ...fieldsOnly } = fields\n if ($meta) {\n this.$meta($meta)\n }\n if (schema) {\n this.schema(schema)\n }\n this._fields = removeMetaAndSchema<T>(fields)\n }\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n\n protected async metaFields(dataHash: Hash, stamp = true): Promise<JsonObject> {\n return await PayloadBuilderBase.metaFields(dataHash, this._$meta, stamp)\n }\n}\n"],"mappings":"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","names":["assertEx","isJsonObject","deepOmitPrefixedFields","PayloadHasher","assertEx","isJsonObject","toJson","deepOmitPrefixedFields","removeEmptyFields","removeMetaAndSchema","payload","result","$hash","$meta","schema","PayloadBuilderBase","_$meta","_fields","_schema","constructor","options","fields","meta","removeEmptyFields","dataHashableFields","cleanFields","undefined","assertEx","isJsonObject","JSON","stringify","toJson","deepOmitPrefixedFields","metaFields","dataHash","otherMeta","stamp","timestamp","Date","now","fieldsOnly","value","PayloadBuilder","PayloadBuilderBase","build","payload","options","Array","isArray","Promise","all","map","stamp","validate","schema","$hash","incomingDataHash","$meta","incomingMeta","fields","removeMetaAndSchema","dataHashableFields","undefined","PayloadHasher","hash","timestamp","Date","now","hashableFields","Object","keys","length","dataHash","dataHashPairs","payloads","built","dataHashes","filterExclude","filterExcludeByHash","filterExcludeByDataHash","hashes","filter","_","objHash","includes","pair","filterIncludeByDataHash","findByDataHash","find","hashPairs","dataFields","assertEx","isJsonObject","result","deepOmitPrefixedFields","clonedMeta","toAllHashMap","objs","toDataHashMap","toHashMap","withoutMeta","_$meta","_schema","_fields"]}
package/package.json CHANGED
@@ -15,8 +15,8 @@
15
15
  "@xylabs/logger": "^3.1.8",
16
16
  "@xylabs/object": "^3.1.8",
17
17
  "@xylabs/promise": "^3.1.8",
18
- "@xyo-network/hash": "~2.95.9",
19
- "@xyo-network/payload-model": "~2.95.9"
18
+ "@xyo-network/hash": "~2.96.0",
19
+ "@xyo-network/payload-model": "~2.96.0"
20
20
  },
21
21
  "devDependencies": {
22
22
  "@xylabs/ts-scripts-yarn3": "^3.9.1",
@@ -62,6 +62,6 @@
62
62
  },
63
63
  "sideEffects": false,
64
64
  "types": "dist/node/index.d.ts",
65
- "version": "2.95.9",
65
+ "version": "2.96.0",
66
66
  "type": "module"
67
67
  }