@xyo-network/payload-builder 3.11.0 → 3.12.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -108,19 +108,19 @@ var PayloadBuilder = class _PayloadBuilder {
108
108
  static async hashes(payloads) {
109
109
  return await ObjectHasher.hashes(payloads);
110
110
  }
111
- static omitClientMeta(payloads, maxDepth = 100) {
111
+ static omitClientMeta(payloads, maxDepth = 1) {
112
112
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitClientMeta(payload, maxDepth)) : omitByPrefix(payloads, "$", maxDepth);
113
113
  }
114
- static omitMeta(payloads, maxDepth = 100) {
114
+ static omitMeta(payloads, maxDepth = 1) {
115
115
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitMeta(payload, maxDepth)) : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth);
116
116
  }
117
- static omitPrivateStorageMeta(payloads, maxDepth = 100) {
117
+ static omitPrivateStorageMeta(payloads, maxDepth = 1) {
118
118
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitPrivateStorageMeta(payload, maxDepth)) : omitByPrefix(payloads, "__", maxDepth);
119
119
  }
120
- static omitStorageMeta(payloads, maxDepth = 100) {
120
+ static omitStorageMeta(payloads, maxDepth = 1) {
121
121
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitStorageMeta(payload, maxDepth)) : omitByPrefix(payloads, "_", maxDepth);
122
122
  }
123
- static pickClientMeta(payloads, maxDepth = 100) {
123
+ static pickClientMeta(payloads, maxDepth = 1) {
124
124
  return Array.isArray(payloads) ? payloads.map((payload) => this.pickClientMeta(payload, maxDepth)) : pickByPrefix(payloads, "$", maxDepth);
125
125
  }
126
126
  static sortByStorageMeta(payloads, direction = 1, comparer = SequenceComparer.local) {
@@ -194,7 +194,24 @@ var PayloadBuilder = class _PayloadBuilder {
194
194
  );
195
195
  }
196
196
  fields(fields) {
197
- this._fields = omitSchema(_PayloadBuilder.omitStorageMeta(removeEmptyFields(structuredClone(fields))));
197
+ this._fields = _PayloadBuilder.omitClientMeta(
198
+ _PayloadBuilder.omitStorageMeta(
199
+ omitSchema(
200
+ removeEmptyFields(structuredClone(fields))
201
+ )
202
+ )
203
+ );
204
+ return this;
205
+ }
206
+ from(bw) {
207
+ const clone = structuredClone(bw);
208
+ delete clone.$signatures;
209
+ this._fields = _PayloadBuilder.omitStorageMeta(
210
+ _PayloadBuilder.omitClientMeta(
211
+ omitSchema(removeEmptyFields(clone))
212
+ )
213
+ );
214
+ this._meta = pickByPrefix(bw, "$", 100);
198
215
  return this;
199
216
  }
200
217
  meta(meta) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Builder.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type {\n AnyObject, Compare, EmptyObject,\n} from '@xylabs/object'\nimport {\n isJsonObject, omitByPrefix, pickByPrefix, toJson,\n} from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\nimport { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'\nimport type {\n Payload, Schema,\n Sequence,\n WithHashStorageMeta,\n WithOnlyClientMeta,\n WithOptionalSchema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutPrivateStorageMeta,\n WithoutSchema,\n WithoutStorageMeta,\n WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n SequenceComparer,\n SequenceParser,\n} from '@xyo-network/payload-model'\n\nimport type { PayloadBuilderOptions } from './Options.ts'\n\nexport const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {\n const result = structuredClone(payload)\n delete result.schema\n return result\n}\n\nexport class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {\n protected _fields?: WithoutStorageMeta<WithoutSchema<T>>\n protected _meta?: WithOnlyClientMeta<T>\n protected _schema: Schema\n\n constructor(readonly options: PayloadBuilderOptions) {\n const { schema } = options\n this._schema = schema\n }\n\n static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>\n static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>\n static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {\n return Array.isArray(payloads)\n ? await (async () => {\n const timestamp = Date.now()\n return (await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(\n payload,\n timestamp,\n i,\n )))).sort(this.compareStorageMeta)\n })()\n : this.addSequencedStorageMeta(\n payloads,\n index,\n )\n }\n\n static compareStorageMeta(\n a: WithStorageMeta<Payload>,\n b: WithStorageMeta<Payload>,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return comparer(a._sequence, b._sequence)\n }\n\n static async dataHash<T extends Payload>(payload: T): Promise<Hash> {\n return await ObjectHasher.hash(this.omitMeta(payload))\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const dataHash = await this.dataHash(payload)\n return [payload, dataHash]\n }),\n )\n }\n\n static dataHashableFields<T extends Payload>(\n schema: Schema,\n payload: WithoutSchema<T>,\n\n ): Promisable<WithoutMeta<T>> {\n const cleanFields = removeEmptyFields({ ...payload, schema })\n assertEx(\n cleanFields == undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return this.omitMeta(cleanFields) as WithoutMeta<T>\n }\n\n static async dataHashes(payloads: undefined): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return payloads\n ? await Promise.all(\n payloads.map(async (payload) => {\n return await this.dataHash(payload)\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await ObjectHasher.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 filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n const map = await PayloadBuilder.toAllHashMap(payloads)\n return hashes.map(hash => map[hash]).filter(exists)\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): Promise<Hash> {\n return await ObjectHasher.hash(this.omitStorageMeta(payload))\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<[T, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[T, Hash]>>(async (payload) => {\n return [payload, await this.hash(payload)]\n }),\n )\n }\n\n static hashableFields<T extends Payload>(\n payload: T,\n ): WithoutStorageMeta<T> {\n return this.omitStorageMeta(payload)\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 ObjectHasher.hashes(payloads)\n }\n\n static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutClientMeta<T> | WithoutClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))\n : omitByPrefix(payloads, '$', maxDepth)\n }\n\n static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>\n static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutMeta<T> | WithoutMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitMeta(payload, maxDepth))\n : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>\n }\n\n static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '__', maxDepth)\n }\n\n static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]\n static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '_', maxDepth)\n }\n\n static pickClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>\n static pickClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]\n static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))\n : pickByPrefix(payloads, '$', maxDepth)\n }\n\n static sortByStorageMeta<T extends Payload>(\n payloads: WithStorageMeta<T>[],\n direction: -1 | 1 = 1,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return payloads.sort((a, b) => direction * comparer(a._sequence, b._sequence))\n }\n\n static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(payloads)) {\n const dataHash = await this.dataHash(pair[0])\n result[pair[1]] = pair[0]\n result[dataHash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, 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, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n private static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashStorageMeta<T>>\n private static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashStorageMeta<T>[]>\n private static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashStorageMeta<T>[] | WithHashStorageMeta<T>> {\n if (Array.isArray(payloads)) {\n return await Promise.all(\n payloads.map(async (payload) => {\n return await this.addHashMeta(payload)\n }),\n )\n } else {\n const _hash = await this.hash(payloads)\n const _dataHash = await this.dataHash(payloads)\n return {\n ...payloads,\n _dataHash,\n _hash,\n }\n }\n }\n\n private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {\n const withHashMeta = await this.addHashMeta(payload)\n const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence\n return {\n ...withHashMeta,\n _sequence,\n }\n }\n\n build(): R {\n return {\n schema: this._schema,\n ...this._fields,\n ...this._meta,\n } as R\n }\n\n async dataHashableFields() {\n return await PayloadBuilder.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n // TODO: Add verification that required fields are present\n this._fields as WithoutSchema<T>,\n )\n }\n\n fields(fields: WithoutStorageMeta<WithoutSchema<T>>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields = omitSchema(PayloadBuilder.omitStorageMeta(removeEmptyFields(structuredClone(fields)))) as unknown as WithoutStorageMeta<WithoutSchema<T>>\n return this\n }\n\n meta(meta: WithOnlyClientMeta<T>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n}\n"],"mappings":"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","names":["hash"]}
1
+ {"version":3,"sources":["../../src/Builder.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type {\n AnyObject, Compare, EmptyObject,\n} from '@xylabs/object'\nimport {\n isJsonObject, omitByPrefix, pickByPrefix, toJson,\n} from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\nimport { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'\nimport type {\n Payload, Schema,\n Sequence,\n WithHashStorageMeta,\n WithOnlyClientMeta,\n WithOptionalSchema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutPrivateStorageMeta,\n WithoutSchema,\n WithoutStorageMeta,\n WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n SequenceComparer,\n SequenceParser,\n} from '@xyo-network/payload-model'\n\nimport type { PayloadBuilderOptions } from './Options.ts'\n\nexport const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {\n const result = structuredClone(payload)\n delete result.schema\n return result\n}\n\nexport class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {\n protected _fields?: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n protected _meta?: WithOnlyClientMeta<T>\n protected _schema: Schema\n\n constructor(readonly options: PayloadBuilderOptions) {\n const { schema } = options\n this._schema = schema\n }\n\n static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>\n static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>\n static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {\n return Array.isArray(payloads)\n ? await (async () => {\n const timestamp = Date.now()\n return (await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(\n payload,\n timestamp,\n i,\n )))).sort(this.compareStorageMeta)\n })()\n : this.addSequencedStorageMeta(\n payloads,\n index,\n )\n }\n\n static compareStorageMeta(\n a: WithStorageMeta<Payload>,\n b: WithStorageMeta<Payload>,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return comparer(a._sequence, b._sequence)\n }\n\n static async dataHash<T extends Payload>(payload: T): Promise<Hash> {\n return await ObjectHasher.hash(this.omitMeta(payload))\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const dataHash = await this.dataHash(payload)\n return [payload, dataHash]\n }),\n )\n }\n\n static dataHashableFields<T extends Payload>(\n schema: Schema,\n payload: WithoutSchema<T>,\n\n ): Promisable<WithoutMeta<T>> {\n const cleanFields = removeEmptyFields({ ...payload, schema })\n assertEx(\n cleanFields == undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return this.omitMeta(cleanFields) as WithoutMeta<T>\n }\n\n static async dataHashes(payloads: undefined): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return payloads\n ? await Promise.all(\n payloads.map(async (payload) => {\n return await this.dataHash(payload)\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await ObjectHasher.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 filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n const map = await PayloadBuilder.toAllHashMap(payloads)\n return hashes.map(hash => map[hash]).filter(exists)\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): Promise<Hash> {\n return await ObjectHasher.hash(this.omitStorageMeta(payload))\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<[T, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[T, Hash]>>(async (payload) => {\n return [payload, await this.hash(payload)]\n }),\n )\n }\n\n static hashableFields<T extends Payload>(\n payload: T,\n ): WithoutStorageMeta<T> {\n return this.omitStorageMeta(payload)\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 ObjectHasher.hashes(payloads)\n }\n\n static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutClientMeta<T> | WithoutClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))\n : omitByPrefix(payloads, '$', maxDepth)\n }\n\n static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>\n static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutMeta<T> | WithoutMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitMeta(payload, maxDepth))\n : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>\n }\n\n static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '__', maxDepth)\n }\n\n static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]\n static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '_', maxDepth)\n }\n\n static pickClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>\n static pickClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]\n static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))\n : pickByPrefix(payloads, '$', maxDepth)\n }\n\n static sortByStorageMeta<T extends Payload>(\n payloads: WithStorageMeta<T>[],\n direction: -1 | 1 = 1,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return payloads.sort((a, b) => direction * comparer(a._sequence, b._sequence))\n }\n\n static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(payloads)) {\n const dataHash = await this.dataHash(pair[0])\n result[pair[1]] = pair[0]\n result[dataHash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, 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, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n private static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashStorageMeta<T>>\n private static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashStorageMeta<T>[]>\n private static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashStorageMeta<T>[] | WithHashStorageMeta<T>> {\n if (Array.isArray(payloads)) {\n return await Promise.all(\n payloads.map(async (payload) => {\n return await this.addHashMeta(payload)\n }),\n )\n } else {\n const _hash = await this.hash(payloads)\n const _dataHash = await this.dataHash(payloads)\n return {\n ...payloads,\n _dataHash,\n _hash,\n }\n }\n }\n\n private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {\n const withHashMeta = await this.addHashMeta(payload)\n const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence\n return {\n ...withHashMeta,\n _sequence,\n }\n }\n\n build(): R {\n return {\n schema: this._schema,\n ...this._fields,\n ...this._meta,\n } as R\n }\n\n async dataHashableFields() {\n return await PayloadBuilder.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n // TODO: Add verification that required fields are present\n this._fields as WithoutSchema<T>,\n )\n }\n\n fields(fields: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields = PayloadBuilder.omitClientMeta(\n PayloadBuilder.omitStorageMeta(\n omitSchema(\n removeEmptyFields(structuredClone(fields)),\n ),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n return this\n }\n\n from(\n bw: WithoutSchema<T>,\n ) {\n // clean it up just incase\n const clone = structuredClone(bw) as unknown as Partial<T>\n\n // delete the $signatures if they are there\n delete (clone as AnyObject).$signatures\n\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = PayloadBuilder.omitStorageMeta(\n PayloadBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta\n = pickByPrefix(bw, '$', 100) as unknown as WithOnlyClientMeta<T>\n return this\n }\n\n meta(meta: WithOnlyClientMeta<T>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n}\n"],"mappings":"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","names":["hash"]}
@@ -108,19 +108,19 @@ var PayloadBuilder = class _PayloadBuilder {
108
108
  static async hashes(payloads) {
109
109
  return await ObjectHasher.hashes(payloads);
110
110
  }
111
- static omitClientMeta(payloads, maxDepth = 100) {
111
+ static omitClientMeta(payloads, maxDepth = 1) {
112
112
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitClientMeta(payload, maxDepth)) : omitByPrefix(payloads, "$", maxDepth);
113
113
  }
114
- static omitMeta(payloads, maxDepth = 100) {
114
+ static omitMeta(payloads, maxDepth = 1) {
115
115
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitMeta(payload, maxDepth)) : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth);
116
116
  }
117
- static omitPrivateStorageMeta(payloads, maxDepth = 100) {
117
+ static omitPrivateStorageMeta(payloads, maxDepth = 1) {
118
118
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitPrivateStorageMeta(payload, maxDepth)) : omitByPrefix(payloads, "__", maxDepth);
119
119
  }
120
- static omitStorageMeta(payloads, maxDepth = 100) {
120
+ static omitStorageMeta(payloads, maxDepth = 1) {
121
121
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitStorageMeta(payload, maxDepth)) : omitByPrefix(payloads, "_", maxDepth);
122
122
  }
123
- static pickClientMeta(payloads, maxDepth = 100) {
123
+ static pickClientMeta(payloads, maxDepth = 1) {
124
124
  return Array.isArray(payloads) ? payloads.map((payload) => this.pickClientMeta(payload, maxDepth)) : pickByPrefix(payloads, "$", maxDepth);
125
125
  }
126
126
  static sortByStorageMeta(payloads, direction = 1, comparer = SequenceComparer.local) {
@@ -194,7 +194,24 @@ var PayloadBuilder = class _PayloadBuilder {
194
194
  );
195
195
  }
196
196
  fields(fields) {
197
- this._fields = omitSchema(_PayloadBuilder.omitStorageMeta(removeEmptyFields(structuredClone(fields))));
197
+ this._fields = _PayloadBuilder.omitClientMeta(
198
+ _PayloadBuilder.omitStorageMeta(
199
+ omitSchema(
200
+ removeEmptyFields(structuredClone(fields))
201
+ )
202
+ )
203
+ );
204
+ return this;
205
+ }
206
+ from(bw) {
207
+ const clone = structuredClone(bw);
208
+ delete clone.$signatures;
209
+ this._fields = _PayloadBuilder.omitStorageMeta(
210
+ _PayloadBuilder.omitClientMeta(
211
+ omitSchema(removeEmptyFields(clone))
212
+ )
213
+ );
214
+ this._meta = pickByPrefix(bw, "$", 100);
198
215
  return this;
199
216
  }
200
217
  meta(meta) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Builder.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type {\n AnyObject, Compare, EmptyObject,\n} from '@xylabs/object'\nimport {\n isJsonObject, omitByPrefix, pickByPrefix, toJson,\n} from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\nimport { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'\nimport type {\n Payload, Schema,\n Sequence,\n WithHashStorageMeta,\n WithOnlyClientMeta,\n WithOptionalSchema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutPrivateStorageMeta,\n WithoutSchema,\n WithoutStorageMeta,\n WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n SequenceComparer,\n SequenceParser,\n} from '@xyo-network/payload-model'\n\nimport type { PayloadBuilderOptions } from './Options.ts'\n\nexport const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {\n const result = structuredClone(payload)\n delete result.schema\n return result\n}\n\nexport class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {\n protected _fields?: WithoutStorageMeta<WithoutSchema<T>>\n protected _meta?: WithOnlyClientMeta<T>\n protected _schema: Schema\n\n constructor(readonly options: PayloadBuilderOptions) {\n const { schema } = options\n this._schema = schema\n }\n\n static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>\n static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>\n static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {\n return Array.isArray(payloads)\n ? await (async () => {\n const timestamp = Date.now()\n return (await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(\n payload,\n timestamp,\n i,\n )))).sort(this.compareStorageMeta)\n })()\n : this.addSequencedStorageMeta(\n payloads,\n index,\n )\n }\n\n static compareStorageMeta(\n a: WithStorageMeta<Payload>,\n b: WithStorageMeta<Payload>,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return comparer(a._sequence, b._sequence)\n }\n\n static async dataHash<T extends Payload>(payload: T): Promise<Hash> {\n return await ObjectHasher.hash(this.omitMeta(payload))\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const dataHash = await this.dataHash(payload)\n return [payload, dataHash]\n }),\n )\n }\n\n static dataHashableFields<T extends Payload>(\n schema: Schema,\n payload: WithoutSchema<T>,\n\n ): Promisable<WithoutMeta<T>> {\n const cleanFields = removeEmptyFields({ ...payload, schema })\n assertEx(\n cleanFields == undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return this.omitMeta(cleanFields) as WithoutMeta<T>\n }\n\n static async dataHashes(payloads: undefined): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return payloads\n ? await Promise.all(\n payloads.map(async (payload) => {\n return await this.dataHash(payload)\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await ObjectHasher.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 filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n const map = await PayloadBuilder.toAllHashMap(payloads)\n return hashes.map(hash => map[hash]).filter(exists)\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): Promise<Hash> {\n return await ObjectHasher.hash(this.omitStorageMeta(payload))\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<[T, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[T, Hash]>>(async (payload) => {\n return [payload, await this.hash(payload)]\n }),\n )\n }\n\n static hashableFields<T extends Payload>(\n payload: T,\n ): WithoutStorageMeta<T> {\n return this.omitStorageMeta(payload)\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 ObjectHasher.hashes(payloads)\n }\n\n static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutClientMeta<T> | WithoutClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))\n : omitByPrefix(payloads, '$', maxDepth)\n }\n\n static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>\n static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutMeta<T> | WithoutMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitMeta(payload, maxDepth))\n : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>\n }\n\n static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '__', maxDepth)\n }\n\n static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]\n static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '_', maxDepth)\n }\n\n static pickClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>\n static pickClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]\n static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))\n : pickByPrefix(payloads, '$', maxDepth)\n }\n\n static sortByStorageMeta<T extends Payload>(\n payloads: WithStorageMeta<T>[],\n direction: -1 | 1 = 1,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return payloads.sort((a, b) => direction * comparer(a._sequence, b._sequence))\n }\n\n static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(payloads)) {\n const dataHash = await this.dataHash(pair[0])\n result[pair[1]] = pair[0]\n result[dataHash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, 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, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n private static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashStorageMeta<T>>\n private static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashStorageMeta<T>[]>\n private static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashStorageMeta<T>[] | WithHashStorageMeta<T>> {\n if (Array.isArray(payloads)) {\n return await Promise.all(\n payloads.map(async (payload) => {\n return await this.addHashMeta(payload)\n }),\n )\n } else {\n const _hash = await this.hash(payloads)\n const _dataHash = await this.dataHash(payloads)\n return {\n ...payloads,\n _dataHash,\n _hash,\n }\n }\n }\n\n private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {\n const withHashMeta = await this.addHashMeta(payload)\n const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence\n return {\n ...withHashMeta,\n _sequence,\n }\n }\n\n build(): R {\n return {\n schema: this._schema,\n ...this._fields,\n ...this._meta,\n } as R\n }\n\n async dataHashableFields() {\n return await PayloadBuilder.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n // TODO: Add verification that required fields are present\n this._fields as WithoutSchema<T>,\n )\n }\n\n fields(fields: WithoutStorageMeta<WithoutSchema<T>>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields = omitSchema(PayloadBuilder.omitStorageMeta(removeEmptyFields(structuredClone(fields)))) as unknown as WithoutStorageMeta<WithoutSchema<T>>\n return this\n }\n\n meta(meta: WithOnlyClientMeta<T>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n}\n"],"mappings":"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","names":["hash"]}
1
+ {"version":3,"sources":["../../src/Builder.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type {\n AnyObject, Compare, EmptyObject,\n} from '@xylabs/object'\nimport {\n isJsonObject, omitByPrefix, pickByPrefix, toJson,\n} from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\nimport { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'\nimport type {\n Payload, Schema,\n Sequence,\n WithHashStorageMeta,\n WithOnlyClientMeta,\n WithOptionalSchema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutPrivateStorageMeta,\n WithoutSchema,\n WithoutStorageMeta,\n WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n SequenceComparer,\n SequenceParser,\n} from '@xyo-network/payload-model'\n\nimport type { PayloadBuilderOptions } from './Options.ts'\n\nexport const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {\n const result = structuredClone(payload)\n delete result.schema\n return result\n}\n\nexport class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {\n protected _fields?: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n protected _meta?: WithOnlyClientMeta<T>\n protected _schema: Schema\n\n constructor(readonly options: PayloadBuilderOptions) {\n const { schema } = options\n this._schema = schema\n }\n\n static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>\n static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>\n static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {\n return Array.isArray(payloads)\n ? await (async () => {\n const timestamp = Date.now()\n return (await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(\n payload,\n timestamp,\n i,\n )))).sort(this.compareStorageMeta)\n })()\n : this.addSequencedStorageMeta(\n payloads,\n index,\n )\n }\n\n static compareStorageMeta(\n a: WithStorageMeta<Payload>,\n b: WithStorageMeta<Payload>,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return comparer(a._sequence, b._sequence)\n }\n\n static async dataHash<T extends Payload>(payload: T): Promise<Hash> {\n return await ObjectHasher.hash(this.omitMeta(payload))\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const dataHash = await this.dataHash(payload)\n return [payload, dataHash]\n }),\n )\n }\n\n static dataHashableFields<T extends Payload>(\n schema: Schema,\n payload: WithoutSchema<T>,\n\n ): Promisable<WithoutMeta<T>> {\n const cleanFields = removeEmptyFields({ ...payload, schema })\n assertEx(\n cleanFields == undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return this.omitMeta(cleanFields) as WithoutMeta<T>\n }\n\n static async dataHashes(payloads: undefined): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return payloads\n ? await Promise.all(\n payloads.map(async (payload) => {\n return await this.dataHash(payload)\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await ObjectHasher.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 filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n const map = await PayloadBuilder.toAllHashMap(payloads)\n return hashes.map(hash => map[hash]).filter(exists)\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): Promise<Hash> {\n return await ObjectHasher.hash(this.omitStorageMeta(payload))\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<[T, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[T, Hash]>>(async (payload) => {\n return [payload, await this.hash(payload)]\n }),\n )\n }\n\n static hashableFields<T extends Payload>(\n payload: T,\n ): WithoutStorageMeta<T> {\n return this.omitStorageMeta(payload)\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 ObjectHasher.hashes(payloads)\n }\n\n static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutClientMeta<T> | WithoutClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))\n : omitByPrefix(payloads, '$', maxDepth)\n }\n\n static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>\n static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutMeta<T> | WithoutMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitMeta(payload, maxDepth))\n : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>\n }\n\n static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '__', maxDepth)\n }\n\n static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]\n static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '_', maxDepth)\n }\n\n static pickClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>\n static pickClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]\n static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))\n : pickByPrefix(payloads, '$', maxDepth)\n }\n\n static sortByStorageMeta<T extends Payload>(\n payloads: WithStorageMeta<T>[],\n direction: -1 | 1 = 1,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return payloads.sort((a, b) => direction * comparer(a._sequence, b._sequence))\n }\n\n static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(payloads)) {\n const dataHash = await this.dataHash(pair[0])\n result[pair[1]] = pair[0]\n result[dataHash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, 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, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n private static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashStorageMeta<T>>\n private static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashStorageMeta<T>[]>\n private static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashStorageMeta<T>[] | WithHashStorageMeta<T>> {\n if (Array.isArray(payloads)) {\n return await Promise.all(\n payloads.map(async (payload) => {\n return await this.addHashMeta(payload)\n }),\n )\n } else {\n const _hash = await this.hash(payloads)\n const _dataHash = await this.dataHash(payloads)\n return {\n ...payloads,\n _dataHash,\n _hash,\n }\n }\n }\n\n private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {\n const withHashMeta = await this.addHashMeta(payload)\n const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence\n return {\n ...withHashMeta,\n _sequence,\n }\n }\n\n build(): R {\n return {\n schema: this._schema,\n ...this._fields,\n ...this._meta,\n } as R\n }\n\n async dataHashableFields() {\n return await PayloadBuilder.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n // TODO: Add verification that required fields are present\n this._fields as WithoutSchema<T>,\n )\n }\n\n fields(fields: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields = PayloadBuilder.omitClientMeta(\n PayloadBuilder.omitStorageMeta(\n omitSchema(\n removeEmptyFields(structuredClone(fields)),\n ),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n return this\n }\n\n from(\n bw: WithoutSchema<T>,\n ) {\n // clean it up just incase\n const clone = structuredClone(bw) as unknown as Partial<T>\n\n // delete the $signatures if they are there\n delete (clone as AnyObject).$signatures\n\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = PayloadBuilder.omitStorageMeta(\n PayloadBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta\n = pickByPrefix(bw, '$', 100) as unknown as WithOnlyClientMeta<T>\n return this\n }\n\n meta(meta: WithOnlyClientMeta<T>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n}\n"],"mappings":"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","names":["hash"]}
@@ -108,19 +108,19 @@ var PayloadBuilder = class _PayloadBuilder {
108
108
  static async hashes(payloads) {
109
109
  return await ObjectHasher.hashes(payloads);
110
110
  }
111
- static omitClientMeta(payloads, maxDepth = 100) {
111
+ static omitClientMeta(payloads, maxDepth = 1) {
112
112
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitClientMeta(payload, maxDepth)) : omitByPrefix(payloads, "$", maxDepth);
113
113
  }
114
- static omitMeta(payloads, maxDepth = 100) {
114
+ static omitMeta(payloads, maxDepth = 1) {
115
115
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitMeta(payload, maxDepth)) : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth);
116
116
  }
117
- static omitPrivateStorageMeta(payloads, maxDepth = 100) {
117
+ static omitPrivateStorageMeta(payloads, maxDepth = 1) {
118
118
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitPrivateStorageMeta(payload, maxDepth)) : omitByPrefix(payloads, "__", maxDepth);
119
119
  }
120
- static omitStorageMeta(payloads, maxDepth = 100) {
120
+ static omitStorageMeta(payloads, maxDepth = 1) {
121
121
  return Array.isArray(payloads) ? payloads.map((payload) => this.omitStorageMeta(payload, maxDepth)) : omitByPrefix(payloads, "_", maxDepth);
122
122
  }
123
- static pickClientMeta(payloads, maxDepth = 100) {
123
+ static pickClientMeta(payloads, maxDepth = 1) {
124
124
  return Array.isArray(payloads) ? payloads.map((payload) => this.pickClientMeta(payload, maxDepth)) : pickByPrefix(payloads, "$", maxDepth);
125
125
  }
126
126
  static sortByStorageMeta(payloads, direction = 1, comparer = SequenceComparer.local) {
@@ -194,7 +194,24 @@ var PayloadBuilder = class _PayloadBuilder {
194
194
  );
195
195
  }
196
196
  fields(fields) {
197
- this._fields = omitSchema(_PayloadBuilder.omitStorageMeta(removeEmptyFields(structuredClone(fields))));
197
+ this._fields = _PayloadBuilder.omitClientMeta(
198
+ _PayloadBuilder.omitStorageMeta(
199
+ omitSchema(
200
+ removeEmptyFields(structuredClone(fields))
201
+ )
202
+ )
203
+ );
204
+ return this;
205
+ }
206
+ from(bw) {
207
+ const clone = structuredClone(bw);
208
+ delete clone.$signatures;
209
+ this._fields = _PayloadBuilder.omitStorageMeta(
210
+ _PayloadBuilder.omitClientMeta(
211
+ omitSchema(removeEmptyFields(clone))
212
+ )
213
+ );
214
+ this._meta = pickByPrefix(bw, "$", 100);
198
215
  return this;
199
216
  }
200
217
  meta(meta) {
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/Builder.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type {\n AnyObject, Compare, EmptyObject,\n} from '@xylabs/object'\nimport {\n isJsonObject, omitByPrefix, pickByPrefix, toJson,\n} from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\nimport { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'\nimport type {\n Payload, Schema,\n Sequence,\n WithHashStorageMeta,\n WithOnlyClientMeta,\n WithOptionalSchema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutPrivateStorageMeta,\n WithoutSchema,\n WithoutStorageMeta,\n WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n SequenceComparer,\n SequenceParser,\n} from '@xyo-network/payload-model'\n\nimport type { PayloadBuilderOptions } from './Options.ts'\n\nexport const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {\n const result = structuredClone(payload)\n delete result.schema\n return result\n}\n\nexport class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {\n protected _fields?: WithoutStorageMeta<WithoutSchema<T>>\n protected _meta?: WithOnlyClientMeta<T>\n protected _schema: Schema\n\n constructor(readonly options: PayloadBuilderOptions) {\n const { schema } = options\n this._schema = schema\n }\n\n static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>\n static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>\n static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {\n return Array.isArray(payloads)\n ? await (async () => {\n const timestamp = Date.now()\n return (await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(\n payload,\n timestamp,\n i,\n )))).sort(this.compareStorageMeta)\n })()\n : this.addSequencedStorageMeta(\n payloads,\n index,\n )\n }\n\n static compareStorageMeta(\n a: WithStorageMeta<Payload>,\n b: WithStorageMeta<Payload>,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return comparer(a._sequence, b._sequence)\n }\n\n static async dataHash<T extends Payload>(payload: T): Promise<Hash> {\n return await ObjectHasher.hash(this.omitMeta(payload))\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const dataHash = await this.dataHash(payload)\n return [payload, dataHash]\n }),\n )\n }\n\n static dataHashableFields<T extends Payload>(\n schema: Schema,\n payload: WithoutSchema<T>,\n\n ): Promisable<WithoutMeta<T>> {\n const cleanFields = removeEmptyFields({ ...payload, schema })\n assertEx(\n cleanFields == undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return this.omitMeta(cleanFields) as WithoutMeta<T>\n }\n\n static async dataHashes(payloads: undefined): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return payloads\n ? await Promise.all(\n payloads.map(async (payload) => {\n return await this.dataHash(payload)\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await ObjectHasher.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 filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n const map = await PayloadBuilder.toAllHashMap(payloads)\n return hashes.map(hash => map[hash]).filter(exists)\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): Promise<Hash> {\n return await ObjectHasher.hash(this.omitStorageMeta(payload))\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<[T, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[T, Hash]>>(async (payload) => {\n return [payload, await this.hash(payload)]\n }),\n )\n }\n\n static hashableFields<T extends Payload>(\n payload: T,\n ): WithoutStorageMeta<T> {\n return this.omitStorageMeta(payload)\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 ObjectHasher.hashes(payloads)\n }\n\n static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutClientMeta<T> | WithoutClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))\n : omitByPrefix(payloads, '$', maxDepth)\n }\n\n static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>\n static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutMeta<T> | WithoutMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitMeta(payload, maxDepth))\n : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>\n }\n\n static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '__', maxDepth)\n }\n\n static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]\n static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '_', maxDepth)\n }\n\n static pickClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>\n static pickClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]\n static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))\n : pickByPrefix(payloads, '$', maxDepth)\n }\n\n static sortByStorageMeta<T extends Payload>(\n payloads: WithStorageMeta<T>[],\n direction: -1 | 1 = 1,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return payloads.sort((a, b) => direction * comparer(a._sequence, b._sequence))\n }\n\n static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(payloads)) {\n const dataHash = await this.dataHash(pair[0])\n result[pair[1]] = pair[0]\n result[dataHash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, 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, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n private static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashStorageMeta<T>>\n private static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashStorageMeta<T>[]>\n private static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashStorageMeta<T>[] | WithHashStorageMeta<T>> {\n if (Array.isArray(payloads)) {\n return await Promise.all(\n payloads.map(async (payload) => {\n return await this.addHashMeta(payload)\n }),\n )\n } else {\n const _hash = await this.hash(payloads)\n const _dataHash = await this.dataHash(payloads)\n return {\n ...payloads,\n _dataHash,\n _hash,\n }\n }\n }\n\n private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {\n const withHashMeta = await this.addHashMeta(payload)\n const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence\n return {\n ...withHashMeta,\n _sequence,\n }\n }\n\n build(): R {\n return {\n schema: this._schema,\n ...this._fields,\n ...this._meta,\n } as R\n }\n\n async dataHashableFields() {\n return await PayloadBuilder.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n // TODO: Add verification that required fields are present\n this._fields as WithoutSchema<T>,\n )\n }\n\n fields(fields: WithoutStorageMeta<WithoutSchema<T>>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields = omitSchema(PayloadBuilder.omitStorageMeta(removeEmptyFields(structuredClone(fields)))) as unknown as WithoutStorageMeta<WithoutSchema<T>>\n return this\n }\n\n meta(meta: WithOnlyClientMeta<T>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n}\n"],"mappings":"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","names":["hash"]}
1
+ {"version":3,"sources":["../../src/Builder.ts"],"sourcesContent":["import { assertEx } from '@xylabs/assert'\nimport { exists } from '@xylabs/exists'\nimport type { Hash } from '@xylabs/hex'\nimport type {\n AnyObject, Compare, EmptyObject,\n} from '@xylabs/object'\nimport {\n isJsonObject, omitByPrefix, pickByPrefix, toJson,\n} from '@xylabs/object'\nimport type { Promisable } from '@xylabs/promise'\nimport { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'\nimport type {\n Payload, Schema,\n Sequence,\n WithHashStorageMeta,\n WithOnlyClientMeta,\n WithOptionalSchema,\n WithoutClientMeta,\n WithoutMeta,\n WithoutPrivateStorageMeta,\n WithoutSchema,\n WithoutStorageMeta,\n WithStorageMeta,\n} from '@xyo-network/payload-model'\nimport {\n SequenceComparer,\n SequenceParser,\n} from '@xyo-network/payload-model'\n\nimport type { PayloadBuilderOptions } from './Options.ts'\n\nexport const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {\n const result = structuredClone(payload)\n delete result.schema\n return result\n}\n\nexport class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {\n protected _fields?: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n protected _meta?: WithOnlyClientMeta<T>\n protected _schema: Schema\n\n constructor(readonly options: PayloadBuilderOptions) {\n const { schema } = options\n this._schema = schema\n }\n\n static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>\n static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>\n static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {\n return Array.isArray(payloads)\n ? await (async () => {\n const timestamp = Date.now()\n return (await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(\n payload,\n timestamp,\n i,\n )))).sort(this.compareStorageMeta)\n })()\n : this.addSequencedStorageMeta(\n payloads,\n index,\n )\n }\n\n static compareStorageMeta(\n a: WithStorageMeta<Payload>,\n b: WithStorageMeta<Payload>,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return comparer(a._sequence, b._sequence)\n }\n\n static async dataHash<T extends Payload>(payload: T): Promise<Hash> {\n return await ObjectHasher.hash(this.omitMeta(payload))\n }\n\n static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {\n return await Promise.all(\n payloads.map(async (payload) => {\n const dataHash = await this.dataHash(payload)\n return [payload, dataHash]\n }),\n )\n }\n\n static dataHashableFields<T extends Payload>(\n schema: Schema,\n payload: WithoutSchema<T>,\n\n ): Promisable<WithoutMeta<T>> {\n const cleanFields = removeEmptyFields({ ...payload, schema })\n assertEx(\n cleanFields == undefined || isJsonObject(cleanFields),\n () => `Fields must be JsonObject: ${JSON.stringify(toJson(cleanFields), null, 2)}`,\n )\n return this.omitMeta(cleanFields) as WithoutMeta<T>\n }\n\n static async dataHashes(payloads: undefined): Promise<undefined>\n static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>\n static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {\n return payloads\n ? await Promise.all(\n payloads.map(async (payload) => {\n return await this.dataHash(payload)\n }),\n )\n : undefined\n }\n\n static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n return await ObjectHasher.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 filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n const map = await PayloadBuilder.toAllHashMap(payloads)\n return hashes.map(hash => map[hash]).filter(exists)\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): Promise<Hash> {\n return await ObjectHasher.hash(this.omitStorageMeta(payload))\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<[T, Hash][]> {\n return await Promise.all(\n payloads.map<Promise<[T, Hash]>>(async (payload) => {\n return [payload, await this.hash(payload)]\n }),\n )\n }\n\n static hashableFields<T extends Payload>(\n payload: T,\n ): WithoutStorageMeta<T> {\n return this.omitStorageMeta(payload)\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 ObjectHasher.hashes(payloads)\n }\n\n static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>\n static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]\n static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutClientMeta<T> | WithoutClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))\n : omitByPrefix(payloads, '$', maxDepth)\n }\n\n static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>\n static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]\n static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutMeta<T> | WithoutMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitMeta(payload, maxDepth))\n : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>\n }\n\n static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]\n static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '__', maxDepth)\n }\n\n static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>\n static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]\n static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))\n : omitByPrefix(payloads, '_', maxDepth)\n }\n\n static pickClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>\n static pickClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]\n static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {\n return Array.isArray(payloads)\n ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))\n : pickByPrefix(payloads, '$', maxDepth)\n }\n\n static sortByStorageMeta<T extends Payload>(\n payloads: WithStorageMeta<T>[],\n direction: -1 | 1 = 1,\n comparer: Compare<Sequence> = SequenceComparer.local,\n ) {\n return payloads.sort((a, b) => direction * comparer(a._sequence, b._sequence))\n }\n\n static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(payloads)) {\n const dataHash = await this.dataHash(pair[0])\n result[pair[1]] = pair[0]\n result[dataHash] = pair[0]\n }\n return result\n }\n\n static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<Hash, 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, T>> {\n const result: Record<Hash, T> = {}\n for (const pair of await this.hashPairs(objs)) {\n result[pair[1]] = pair[0]\n }\n return result\n }\n\n private static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashStorageMeta<T>>\n private static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashStorageMeta<T>[]>\n private static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashStorageMeta<T>[] | WithHashStorageMeta<T>> {\n if (Array.isArray(payloads)) {\n return await Promise.all(\n payloads.map(async (payload) => {\n return await this.addHashMeta(payload)\n }),\n )\n } else {\n const _hash = await this.hash(payloads)\n const _dataHash = await this.dataHash(payloads)\n return {\n ...payloads,\n _dataHash,\n _hash,\n }\n }\n }\n\n private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {\n const withHashMeta = await this.addHashMeta(payload)\n const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence\n return {\n ...withHashMeta,\n _sequence,\n }\n }\n\n build(): R {\n return {\n schema: this._schema,\n ...this._fields,\n ...this._meta,\n } as R\n }\n\n async dataHashableFields() {\n return await PayloadBuilder.dataHashableFields(\n assertEx(this._schema, () => 'Payload: Missing Schema'),\n // TODO: Add verification that required fields are present\n this._fields as WithoutSchema<T>,\n )\n }\n\n fields(fields: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields = PayloadBuilder.omitClientMeta(\n PayloadBuilder.omitStorageMeta(\n omitSchema(\n removeEmptyFields(structuredClone(fields)),\n ),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n return this\n }\n\n from(\n bw: WithoutSchema<T>,\n ) {\n // clean it up just incase\n const clone = structuredClone(bw) as unknown as Partial<T>\n\n // delete the $signatures if they are there\n delete (clone as AnyObject).$signatures\n\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._fields\n = PayloadBuilder.omitStorageMeta(\n PayloadBuilder.omitClientMeta(\n omitSchema(removeEmptyFields(clone)),\n ),\n ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>\n\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta\n = pickByPrefix(bw, '$', 100) as unknown as WithOnlyClientMeta<T>\n return this\n }\n\n meta(meta: WithOnlyClientMeta<T>) {\n // we need to do the cast here since ts seems to not like nested, yet same, generics\n this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>\n return this\n }\n\n schema(value: Schema) {\n this._schema = value\n }\n}\n"],"mappings":"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","names":["hash"]}
@@ -6,7 +6,7 @@ import type { PayloadBuilderOptions } from './Options.ts';
6
6
  export declare const omitSchema: <T extends WithOptionalSchema>(payload: T) => WithoutSchema<T>;
7
7
  export declare class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
8
8
  readonly options: PayloadBuilderOptions;
9
- protected _fields?: WithoutStorageMeta<WithoutSchema<T>>;
9
+ protected _fields?: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>;
10
10
  protected _meta?: WithOnlyClientMeta<T>;
11
11
  protected _schema: Schema;
12
12
  constructor(options: PayloadBuilderOptions);
@@ -56,7 +56,8 @@ export declare class PayloadBuilder<T extends Payload = Payload<AnyObject>, R =
56
56
  private static addSequencedStorageMeta;
57
57
  build(): R;
58
58
  dataHashableFields(): Promise<import("@xylabs/object").DeepOmitStartsWith<import("@xylabs/object").DeepOmitStartsWith<T, "_">, "$">>;
59
- fields(fields: WithoutStorageMeta<WithoutSchema<T>>): this;
59
+ fields(fields: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>): this;
60
+ from(bw: WithoutSchema<T>): this;
60
61
  meta(meta: WithOnlyClientMeta<T>): this;
61
62
  schema(value: Schema): void;
62
63
  }
@@ -1 +1 @@
1
- {"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Builder.d.ts","sourceRoot":"","sources":["../../src/Builder.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/payload-builder",
3
- "version": "3.11.0",
3
+ "version": "3.12.1",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -29,19 +29,19 @@
29
29
  "module": "dist/neutral/index.mjs",
30
30
  "types": "dist/types/index.d.ts",
31
31
  "dependencies": {
32
- "@xylabs/assert": "^4.8.0",
33
- "@xylabs/exists": "^4.8.0",
34
- "@xylabs/hex": "^4.8.0",
35
- "@xylabs/logger": "^4.8.0",
36
- "@xylabs/object": "^4.8.0",
37
- "@xylabs/promise": "^4.8.0",
38
- "@xyo-network/hash": "^3.11.0",
39
- "@xyo-network/payload-model": "^3.11.0"
32
+ "@xylabs/assert": "^4.8.1",
33
+ "@xylabs/exists": "^4.8.1",
34
+ "@xylabs/hex": "^4.8.1",
35
+ "@xylabs/logger": "^4.8.1",
36
+ "@xylabs/object": "^4.8.1",
37
+ "@xylabs/promise": "^4.8.1",
38
+ "@xyo-network/hash": "^3.12.1",
39
+ "@xyo-network/payload-model": "^3.12.1"
40
40
  },
41
41
  "devDependencies": {
42
42
  "@xylabs/ts-scripts-yarn3": "^6.2.1",
43
43
  "@xylabs/tsconfig": "^6.2.1",
44
- "@xylabs/vitest-extended": "^4.8.0",
44
+ "@xylabs/vitest-extended": "^4.8.1",
45
45
  "typescript": "^5.8.3",
46
46
  "vitest": "^3.1.1"
47
47
  },
package/src/Builder.ts CHANGED
@@ -36,7 +36,7 @@ export const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSch
36
36
  }
37
37
 
38
38
  export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
39
- protected _fields?: WithoutStorageMeta<WithoutSchema<T>>
39
+ protected _fields?: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>
40
40
  protected _meta?: WithOnlyClientMeta<T>
41
41
  protected _schema: Schema
42
42
 
@@ -164,7 +164,7 @@ export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
164
164
 
165
165
  static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>
166
166
  static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]
167
- static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutClientMeta<T> | WithoutClientMeta<T>[] {
167
+ static omitClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutClientMeta<T> | WithoutClientMeta<T>[] {
168
168
  return Array.isArray(payloads)
169
169
  ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))
170
170
  : omitByPrefix(payloads, '$', maxDepth)
@@ -172,7 +172,7 @@ export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
172
172
 
173
173
  static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>
174
174
  static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]
175
- static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutMeta<T> | WithoutMeta<T>[] {
175
+ static omitMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutMeta<T> | WithoutMeta<T>[] {
176
176
  return Array.isArray(payloads)
177
177
  ? payloads.map(payload => this.omitMeta(payload, maxDepth))
178
178
  : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth) as unknown as WithoutMeta<T>
@@ -180,7 +180,7 @@ export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
180
180
 
181
181
  static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>
182
182
  static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]
183
- static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {
183
+ static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutPrivateStorageMeta<T> | WithoutPrivateStorageMeta<T>[] {
184
184
  return Array.isArray(payloads)
185
185
  ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))
186
186
  : omitByPrefix(payloads, '__', maxDepth)
@@ -188,7 +188,7 @@ export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
188
188
 
189
189
  static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>
190
190
  static omitStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutStorageMeta<T>[]
191
- static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {
191
+ static omitStorageMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithoutStorageMeta<T> | WithoutStorageMeta<T>[] {
192
192
  return Array.isArray(payloads)
193
193
  ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))
194
194
  : omitByPrefix(payloads, '_', maxDepth)
@@ -196,7 +196,7 @@ export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
196
196
 
197
197
  static pickClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>
198
198
  static pickClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]
199
- static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 100): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {
199
+ static pickClientMeta<T extends EmptyObject>(payloads: T | T[], maxDepth = 1): WithOnlyClientMeta<T> | WithOnlyClientMeta<T>[] {
200
200
  return Array.isArray(payloads)
201
201
  ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))
202
202
  : pickByPrefix(payloads, '$', maxDepth)
@@ -286,9 +286,38 @@ export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
286
286
  )
287
287
  }
288
288
 
289
- fields(fields: WithoutStorageMeta<WithoutSchema<T>>) {
289
+ fields(fields: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>) {
290
290
  // we need to do the cast here since ts seems to not like nested, yet same, generics
291
- this._fields = omitSchema(PayloadBuilder.omitStorageMeta(removeEmptyFields(structuredClone(fields)))) as unknown as WithoutStorageMeta<WithoutSchema<T>>
291
+ this._fields = PayloadBuilder.omitClientMeta(
292
+ PayloadBuilder.omitStorageMeta(
293
+ omitSchema(
294
+ removeEmptyFields(structuredClone(fields)),
295
+ ),
296
+ ),
297
+ ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>
298
+ return this
299
+ }
300
+
301
+ from(
302
+ bw: WithoutSchema<T>,
303
+ ) {
304
+ // clean it up just incase
305
+ const clone = structuredClone(bw) as unknown as Partial<T>
306
+
307
+ // delete the $signatures if they are there
308
+ delete (clone as AnyObject).$signatures
309
+
310
+ // we need to do the cast here since ts seems to not like nested, yet same, generics
311
+ this._fields
312
+ = PayloadBuilder.omitStorageMeta(
313
+ PayloadBuilder.omitClientMeta(
314
+ omitSchema(removeEmptyFields(clone)),
315
+ ),
316
+ ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>
317
+
318
+ // we need to do the cast here since ts seems to not like nested, yet same, generics
319
+ this._meta
320
+ = pickByPrefix(bw, '$', 100) as unknown as WithOnlyClientMeta<T>
292
321
  return this
293
322
  }
294
323