@xyo-network/payload-builder 5.3.20 → 5.3.24

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/payload-builder",
3
- "version": "5.3.20",
3
+ "version": "5.3.24",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -30,22 +30,32 @@
30
30
  "types": "dist/neutral/index.d.ts",
31
31
  "files": [
32
32
  "dist",
33
- "src",
34
33
  "!**/*.bench.*",
35
34
  "!**/*.spec.*",
36
- "!**/*.test.*"
35
+ "!**/*.test.*",
36
+ "README.md"
37
37
  ],
38
38
  "dependencies": {
39
- "@xyo-network/hash": "~5.3.20",
40
- "@xyo-network/payload-model": "~5.3.20"
39
+ "@xyo-network/hash": "~5.3.24",
40
+ "@xyo-network/payload-model": "~5.3.24"
41
41
  },
42
42
  "devDependencies": {
43
- "@xylabs/sdk-js": "^5.0.90",
44
- "@xylabs/tsconfig": "~7.5.6",
45
- "@xylabs/vitest-extended": "~5.0.90",
43
+ "@opentelemetry/api": "^1.9.1",
44
+ "@types/node": "^25.5.0",
45
+ "@xylabs/sdk-js": "^5.0.93",
46
+ "@xylabs/ts-scripts-common": "~7.6.16",
47
+ "@xylabs/ts-scripts-pnpm": "~7.6.16",
48
+ "@xylabs/tsconfig": "~7.6.16",
49
+ "@xylabs/vitest-extended": "~5.0.93",
50
+ "acorn": "^8.16.0",
51
+ "axios": "^1.14.0",
52
+ "esbuild": "^0.28.0",
46
53
  "typescript": "~5.9.3",
54
+ "vite": "^8.0.3",
47
55
  "vitest": "~4.1.2",
48
- "zod": "^4.3.6"
56
+ "zod": "^4.3.6",
57
+ "@xyo-network/hash": "~5.3.24",
58
+ "@xyo-network/payload-model": "~5.3.24"
49
59
  },
50
60
  "peerDependencies": {
51
61
  "@xylabs/sdk-js": "^5",
@@ -54,4 +64,4 @@
54
64
  "publishConfig": {
55
65
  "access": "public"
56
66
  }
57
- }
67
+ }
package/src/Builder.ts DELETED
@@ -1,317 +0,0 @@
1
- import type {
2
- AnyObject, Compare, EmptyObject, Hash, Promisable,
3
- } from '@xylabs/sdk-js'
4
- import {
5
- assertEx,
6
- exists,
7
- isJsonObject, omitByPrefix, pickByPrefix, toSafeJson,
8
- } from '@xylabs/sdk-js'
9
- import { ObjectHasher, removeEmptyFields } from '@xyo-network/hash'
10
- import type {
11
- Payload, Schema,
12
- Sequence,
13
- WithHashMeta,
14
- WithOnlyClientMeta,
15
- WithOptionalSchema,
16
- WithoutClientMeta,
17
- WithoutMeta,
18
- WithoutPrivateStorageMeta,
19
- WithoutSchema,
20
- WithoutStorageMeta,
21
- WithStorageMeta,
22
- } from '@xyo-network/payload-model'
23
- import {
24
- SequenceComparer,
25
- SequenceParser,
26
- } from '@xyo-network/payload-model'
27
-
28
- import type { PayloadBuilderOptions } from './Options.ts'
29
-
30
- export const omitSchema = <T extends WithOptionalSchema>(payload: T): WithoutSchema<T> => {
31
- const result = structuredClone(payload)
32
- delete result.schema
33
- return result
34
- }
35
-
36
- export class PayloadBuilder<T extends Payload = Payload<AnyObject>, R = T> {
37
- readonly options: PayloadBuilderOptions
38
-
39
- protected _fields?: WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>
40
- protected _meta?: WithOnlyClientMeta<T>
41
- protected _schema: Schema
42
-
43
- constructor(options: PayloadBuilderOptions) {
44
- this.options = options
45
- const { schema } = options
46
- this._schema = schema
47
- }
48
-
49
- static async addHashMeta<T extends Payload>(payload: T): Promise<WithHashMeta<T>>
50
- static async addHashMeta<T extends Payload>(payloads: T[]): Promise<WithHashMeta<T>[]>
51
- static async addHashMeta<T extends Payload>(payloads: T | T[]): Promise<WithHashMeta<T>[] | WithHashMeta<T>> {
52
- if (Array.isArray(payloads)) {
53
- return await Promise.all(
54
- payloads.map(async (payload) => {
55
- return await this.addHashMeta(payload)
56
- }),
57
- )
58
- } else {
59
- const _hash = await this.hash(payloads)
60
- const _dataHash = await this.dataHash(payloads)
61
- return {
62
- ...payloads,
63
- _dataHash,
64
- _hash,
65
- }
66
- }
67
- }
68
-
69
- static async addStorageMeta<T extends Payload>(payload: T, index?: number): Promise<WithStorageMeta<T>>
70
- static async addStorageMeta<T extends Payload>(payloads: T[]): Promise<WithStorageMeta<T>[]>
71
- static async addStorageMeta<T extends Payload>(payloads: T | T[], index = 0): Promise<WithStorageMeta<T>[] | WithStorageMeta<T>> {
72
- return Array.isArray(payloads)
73
- ? await (async () => {
74
- const timestamp = Date.now()
75
- return (await Promise.all(payloads.map(async (payload, i) => await this.addSequencedStorageMeta(
76
- payload,
77
- timestamp,
78
- i,
79
- )))).toSorted(this.compareStorageMeta)
80
- })()
81
- : this.addSequencedStorageMeta(
82
- payloads,
83
- index,
84
- )
85
- }
86
-
87
- static compareStorageMeta(
88
- a: WithStorageMeta<Payload>,
89
- b: WithStorageMeta<Payload>,
90
- comparer: Compare<Sequence> = SequenceComparer.local,
91
- ) {
92
- return comparer(a._sequence, b._sequence)
93
- }
94
-
95
- static async dataHash<T extends Payload>(payload: T): Promise<Hash> {
96
- return await ObjectHasher.hash(this.omitMeta(payload))
97
- }
98
-
99
- static async dataHashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {
100
- return await Promise.all(
101
- payloads.map(async (payload) => {
102
- const dataHash = await this.dataHash(payload)
103
- return [payload, dataHash]
104
- }),
105
- )
106
- }
107
-
108
- static dataHashableFields<T extends Payload>(
109
- schema: Schema,
110
- payload: WithoutSchema<T>,
111
-
112
- ): Promisable<WithoutMeta<T>> {
113
- const cleanFields = removeEmptyFields({ ...payload, schema })
114
- assertEx(
115
- cleanFields == undefined || isJsonObject(cleanFields),
116
- () => `Fields must be JsonObject: ${JSON.stringify(toSafeJson(cleanFields), null, 2)}`,
117
- )
118
- return this.omitMeta(cleanFields) as WithoutMeta<T>
119
- }
120
-
121
- static async dataHashes(payloads: undefined): Promise<undefined>
122
- static async dataHashes<T extends Payload>(payloads: T[]): Promise<Hash[]>
123
- static async dataHashes<T extends Payload>(payloads?: T[]): Promise<Hash[] | undefined> {
124
- return payloads
125
- ? await Promise.all(
126
- payloads.map(async (payload) => {
127
- return await this.dataHash(payload)
128
- }),
129
- )
130
- : undefined
131
- }
132
-
133
- static async filterExclude<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
134
- return await ObjectHasher.filterExcludeByHash(await this.filterExcludeByDataHash(payloads, hash), hash)
135
- }
136
-
137
- static async filterExcludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
138
- const hashes = Array.isArray(hash) ? hash : [hash]
139
- return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])
140
- }
141
-
142
- static async filterIncludeByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
143
- const hashes = Array.isArray(hash) ? hash : [hash]
144
- return (await this.dataHashPairs(payloads)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])
145
- }
146
-
147
- static async filterIncludeByEitherHash<T extends Payload>(payloads: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
148
- const hashes = Array.isArray(hash) ? hash : [hash]
149
- const map = await PayloadBuilder.toAllHashMap(payloads)
150
- return hashes.map(hash => map[hash]).filter(exists)
151
- }
152
-
153
- static async findByDataHash<T extends Payload>(payloads: T[] = [], hash: Hash): Promise<T | undefined> {
154
- return (await this.dataHashPairs(payloads)).find(([_, objHash]) => objHash === hash)?.[0]
155
- }
156
-
157
- static async hash<T extends Payload>(payload: T): Promise<Hash> {
158
- return await ObjectHasher.hash(this.omitStorageMeta(payload))
159
- }
160
-
161
- /**
162
- * Creates an array of payload/hash tuples based on the payloads passed in
163
- * @param objs Any array of payloads
164
- * @returns An array of payload/hash tuples
165
- */
166
- static async hashPairs<T extends Payload>(payloads: T[]): Promise<[T, Hash][]> {
167
- return await Promise.all(
168
- payloads.map<Promise<[T, Hash]>>(async (payload) => {
169
- return [payload, await this.hash(payload)]
170
- }),
171
- )
172
- }
173
-
174
- static hashableFields<T extends Payload>(
175
- payload: T,
176
- ): WithoutStorageMeta<T> {
177
- return this.omitStorageMeta(payload)
178
- }
179
-
180
- static async hashes(payloads: undefined): Promise<undefined>
181
- static async hashes<T extends Payload>(payloads: T[]): Promise<Hash[]>
182
- static async hashes<T extends Payload>(payloads?: T[]) {
183
- return await ObjectHasher.hashes(payloads)
184
- }
185
-
186
- static omitClientMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]
187
- static omitClientMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutClientMeta<T>[]
188
- static omitClientMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutClientMeta<T>
189
- static omitClientMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutClientMeta<T>
190
- static omitClientMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {
191
- return Array.isArray(payloads)
192
- ? payloads.map(payload => this.omitClientMeta(payload, maxDepth))
193
- : omitByPrefix(payloads, '$', maxDepth)
194
- }
195
-
196
- static omitMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]
197
- static omitMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutMeta<T>[]
198
- static omitMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutMeta<T>
199
- static omitMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutMeta<T>
200
- static omitMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {
201
- return Array.isArray(payloads)
202
- ? payloads.map(payload => this.omitMeta(payload, maxDepth))
203
- : this.omitStorageMeta(this.omitClientMeta(payloads, maxDepth), maxDepth)
204
- }
205
-
206
- static omitPrivateStorageMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]
207
- static omitPrivateStorageMeta<T extends EmptyObject>(payloads: T[], maxDepth?: number): WithoutPrivateStorageMeta<T>[]
208
- static omitPrivateStorageMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>
209
- static omitPrivateStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutPrivateStorageMeta<T>
210
- static omitPrivateStorageMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {
211
- return Array.isArray(payloads)
212
- ? payloads.map(payload => this.omitPrivateStorageMeta(payload, maxDepth))
213
- : omitByPrefix(payloads, '__', maxDepth)
214
- }
215
-
216
- static omitStorageMeta<T extends EmptyObject[]>(payloads: T, maxDepth?: number): WithoutStorageMeta<T[number]>[]
217
- static omitStorageMeta<T extends Payload[]>(payloads: T, maxDepth?: number): WithoutStorageMeta<T[number]>[]
218
- static omitStorageMeta<T extends EmptyObject>(payload: T, maxDepth?: number): WithoutStorageMeta<T>
219
- static omitStorageMeta<T extends Payload>(payload: T, maxDepth?: number): WithoutStorageMeta<T>
220
- static omitStorageMeta<T extends Payload | EmptyObject>(payloads: T | T[], maxDepth = 1) {
221
- return Array.isArray(payloads)
222
- ? payloads.map(payload => this.omitStorageMeta(payload, maxDepth))
223
- : omitByPrefix(payloads, '_', maxDepth)
224
- }
225
-
226
- static pickClientMeta<T extends Payload>(payloads: T[], maxDepth?: number): WithOnlyClientMeta<T>[]
227
- static pickClientMeta<T extends Payload>(payload: T, maxDepth?: number): WithOnlyClientMeta<T>
228
- static pickClientMeta<T extends Payload>(payloads: T | T[], maxDepth = 1) {
229
- return Array.isArray(payloads)
230
- ? payloads.map(payload => this.pickClientMeta(payload, maxDepth))
231
- : pickByPrefix(payloads, '$', maxDepth)
232
- }
233
-
234
- static sortByStorageMeta<T extends Payload>(
235
- payloads: WithStorageMeta<T>[],
236
- direction: -1 | 1 = 1,
237
- comparer: Compare<Sequence> = SequenceComparer.local,
238
- ) {
239
- return payloads.toSorted((a, b) => direction * comparer(a._sequence, b._sequence))
240
- }
241
-
242
- static async toAllHashMap<T extends Payload>(payloads: T[]): Promise<Record<Hash, T>> {
243
- const result: Record<Hash, T> = {}
244
- for (const pair of await this.hashPairs(payloads)) {
245
- const dataHash = await this.dataHash(pair[0])
246
- result[pair[1]] = pair[0]
247
- result[dataHash] = pair[0]
248
- }
249
- return result
250
- }
251
-
252
- static async toDataHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {
253
- const result: Record<Hash, T> = {}
254
- for (const pair of await this.dataHashPairs(objs)) {
255
- result[pair[1]] = pair[0]
256
- }
257
- return result
258
- }
259
-
260
- /**
261
- * Creates an object map of payload hashes to payloads based on the payloads passed in
262
- * @param objs Any array of payloads
263
- * @returns A map of hashes to payloads
264
- */
265
- static async toHashMap<T extends Payload>(objs: T[]): Promise<Record<Hash, T>> {
266
- const result: Record<Hash, T> = {}
267
- for (const pair of await this.hashPairs(objs)) {
268
- result[pair[1]] = pair[0]
269
- }
270
- return result
271
- }
272
-
273
- private static async addSequencedStorageMeta<T extends Payload = Payload>(payload: T, timestamp: number, index = 0): Promise<WithStorageMeta<T>> {
274
- const withHashMeta = await this.addHashMeta(payload)
275
- const _sequence = SequenceParser.from(timestamp, withHashMeta._hash, index).localSequence
276
- return {
277
- ...withHashMeta,
278
- _sequence,
279
- }
280
- }
281
-
282
- build(): R {
283
- return {
284
- schema: this._schema,
285
- ...this._fields,
286
- ...this._meta,
287
- } as R
288
- }
289
-
290
- async dataHashableFields() {
291
- return await PayloadBuilder.dataHashableFields(
292
- assertEx(this._schema, () => 'Payload: Missing Schema'),
293
- // TODO: Add verification that required fields are present
294
- this._fields as WithoutSchema<T>,
295
- )
296
- }
297
-
298
- fields(fields: WithoutSchema<WithoutStorageMeta<WithoutClientMeta<T>>>) {
299
- // we need to do the cast here since ts seems to not like nested, yet same, generics
300
- this._fields = PayloadBuilder.omitClientMeta(
301
- PayloadBuilder.omitStorageMeta(
302
- omitSchema(removeEmptyFields(structuredClone(fields))),
303
- ),
304
- ) as unknown as WithoutStorageMeta<WithoutClientMeta<WithoutSchema<T>>>
305
- return this
306
- }
307
-
308
- meta(meta: WithOnlyClientMeta<T>) {
309
- // we need to do the cast here since ts seems to not like nested, yet same, generics
310
- this._meta = pickByPrefix(meta, '$') as WithOnlyClientMeta<T>
311
- return this
312
- }
313
-
314
- schema(value: Schema) {
315
- this._schema = value
316
- }
317
- }
package/src/Options.ts DELETED
@@ -1,7 +0,0 @@
1
- import type { Logger } from '@xylabs/sdk-js'
2
- import type { Schema } from '@xyo-network/payload-model'
3
-
4
- export interface PayloadBuilderOptions {
5
- readonly logger?: Logger
6
- readonly schema: Schema
7
- }
package/src/index.ts DELETED
@@ -1,3 +0,0 @@
1
- export * from './Builder.ts'
2
- export * from './Builder.ts'
3
- export * from './Options.ts'