@xyo-network/hash 5.3.30 → 5.4.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -3,9 +3,7 @@ import { ObjectWrapper } from '@xylabs/sdk-js';
3
3
  import type { Worker } from '@xylabs/threads/master';
4
4
  import { WasmSupport } from '@xyo-network/wasm';
5
5
  export type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown);
6
- export type WorkerModule<Keys extends string> = {
7
- [key in Keys]: WorkerFunction;
8
- };
6
+ export type WorkerModule<Keys extends string> = Record<Keys, WorkerFunction>;
9
7
  export declare class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
10
8
  static allowHashPooling: boolean;
11
9
  static allowSubtle: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectHasher.d.ts","sourceRoot":"","sources":["../../src/ObjectHasher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObjectHasher.d.ts","sourceRoot":"","sources":["../../src/ObjectHasher.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/createBrowserWorker.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/BrowserObjectHasher.ts"],"sourcesContent":["import { Worker } from '@xylabs/threads/master'\n\nexport const createBrowserWorker = (url?: URL): Worker => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Worker(url as any)\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","/* eslint-disable sonarjs/public-static-readonly */\n\nimport type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = {\n [key in Keys]: WorkerFunction\n}\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n // eslint-disable-next-line sonarjs/no-alphabetical-sort\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createBrowserWorker } from './createBrowserWorker.ts'\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createBrowserWorker = createBrowserWorker\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class BrowserObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createBrowserWorker = createBrowserWorker\n static override readonly createNodeWorker = createNodeWorker\n static override readonly subtleHashWorkerUrl = (() => {\n try {\n return new URL('worker/subtleHash-bundle.mjs', import.meta.url)\n } catch {\n return\n }\n })()\n\n static override readonly wasmHashWorkerUrl = (() => {\n try {\n return new URL('worker/wasmHash-bundle.mjs', import.meta.url)\n } catch {\n return\n }\n })()\n}\n"],"mappings":"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","names":["Worker","subtle","sha256","asHash"]}
1
+ {"version":3,"sources":["../../src/createBrowserWorker.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/BrowserObjectHasher.ts"],"sourcesContent":["import { Worker } from '@xylabs/threads/master'\n\nexport const createBrowserWorker = (url?: URL): Worker => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Worker(url as any)\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","import type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = Record<Keys, WorkerFunction>\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createBrowserWorker } from './createBrowserWorker.ts'\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createBrowserWorker = createBrowserWorker\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class BrowserObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createBrowserWorker = createBrowserWorker\n static override readonly createNodeWorker = createNodeWorker\n static override readonly subtleHashWorkerUrl = (() => {\n try {\n return new URL('worker/subtleHash-bundle.mjs', import.meta.url)\n } catch {\n return\n }\n })()\n\n static override readonly wasmHashWorkerUrl = (() => {\n try {\n return new URL('worker/wasmHash-bundle.mjs', import.meta.url)\n } catch {\n return\n }\n })()\n}\n"],"mappings":"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","names":["Worker","subtle","sha256","asHash"]}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodeObjectHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const hasEmptyFields = <T extends EmptyObject>(obj: T): boolean => {\n if (obj == null || Array.isArray(obj)) return false\n\n if (obj == undefined || Object.keys(obj).length === 0) return true\n\n for (const [value] of Object.values(obj)) {\n if (typeOf(value) === 'object') {\n if (hasEmptyFields(value as Record<string, unknown>)) return true\n } else if (value === undefined) {\n return true\n }\n }\n return false\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","/* eslint-disable sonarjs/public-static-readonly */\n\nimport type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = {\n [key in Keys]: WorkerFunction\n}\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n // eslint-disable-next-line sonarjs/no-alphabetical-sort\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["typeOf","subtle","sha256","asHash"]}
1
+ {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodeObjectHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const hasEmptyFields = <T extends EmptyObject>(obj: T): boolean => {\n if (obj == null || Array.isArray(obj)) return false\n\n if (obj == undefined || Object.keys(obj).length === 0) return true\n\n for (const [value] of Object.values(obj)) {\n if (typeOf(value) === 'object') {\n if (hasEmptyFields(value as Record<string, unknown>)) return true\n } else if (value === undefined) {\n return true\n }\n }\n return false\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","import type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = Record<Keys, WorkerFunction>\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createNodeWorker = createNodeWorker\n}\n"],"mappings":";;;;;;;;AACA,SAAS,cAAc;AAEhB,IAAM,iBAAiB,CAAwB,QAAoB;AACxE,MAAI,OAAO,QAAQ,MAAM,QAAQ,GAAG,EAAG,QAAO;AAE9C,MAAI,OAAO,UAAa,OAAO,KAAK,GAAG,EAAE,WAAW,EAAG,QAAO;AAE9D,aAAW,CAAC,KAAK,KAAK,OAAO,OAAO,GAAG,GAAG;AACxC,QAAI,OAAO,KAAK,MAAM,UAAU;AAC9B,UAAI,eAAe,KAAgC,EAAG,QAAO;AAAA,IAC/D,WAAW,UAAU,QAAW;AAC9B,aAAO;AAAA,IACT;AAAA,EACF;AACA,SAAO;AACT;;;AChBA,SAAS,cAAc;AAEhB,IAAM,mBAAmB,CAAC,SAAiC;AAChE,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK;AAC1C,WAAO,IAAI;AAAA,MACT;AAAA;AAAA,MAEA,EAAE,YAAY,KAAK;AAAA,IACrB;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACZA;AAAA,EACE;AAAA,EAAQ;AAAA,EACR;AAAA,EAAoB;AAAA,EAAe;AAAA,EAAQ;AAAA,OACtC;AAEP,SAAS,MAAM,aAAa;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,cAAc;;;ACPvB,SAAS,UAAAA,eAAc;AAEhB,IAAM,oBAAoB,CAAwB,QAAc;AACrE,MAAI,OAAO,KAAM,QAAO;AAExB,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO,IAAI,IAAI,WAAU,OAAO,UAAU,WAAW,kBAAkB,KAAK,IAAI,KAAM;AAAA,EACxF;AAEA,QAAM,YAAuB,CAAC;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAIA,QAAO,KAAK,MAAM,UAAU;AAC9B,gBAAU,GAAG,IAAI,kBAAkB,KAAgC;AAAA,IACrE,WAAW,UAAU,QAAW;AAC9B,gBAAU,GAAG,IAAI;AAAA,IACnB;AAAA,EACF;AACA,SAAO;AACT;;;AClBA,SAAS,gBAAgB;AAGzB,IAAM,UAAU,CAAC,UAAmB;AAClC,SAAO,SAAS,KAAK,IAAI,WAAW,KAAK,IAAI;AAC/C;AAEO,IAAM,aAAa,CAAwB,QAAW;AAC3D,QAAM,SAAoB,CAAC;AAC3B,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,aAAW,OAAO,KAAK,SAAS,GAAG;AACjC,WAAO,GAAG,IAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,EAChC;AACA,SAAO;AACT;;;ACdO,IAAM,iBAAiB,MAAM;AAClC,QAAM,EAAE,QAAAC,QAAO,IAAI,UAAQ,kBAAkB;AAC7C,QAAM,EAAE,OAAO,IAAI,UAAQ,wBAAwB;AAEnD,SAAO;AAAA,IACL,MAAM,KAAK,MAAmB;AAC5B,aAAO,MAAMA,QAAO,OAAO,WAAW,IAAI;AAAA,IAC5C;AAAA,EACF,CAAC;AACH;;;ACTO,IAAM,eAAe,MAAM;AAChC,QAAM,EAAE,QAAAC,QAAO,IAAI,UAAQ,WAAW;AACtC,QAAM,EAAE,QAAAC,QAAO,IAAI,UAAQ,aAAa;AAExC,QAAM,EAAE,OAAO,IAAI,UAAQ,wBAAwB;AAEnD,SAAO;AAAA,IACL,MAAM,KAAK,MAAc;AACvB,aAAOA,QAAO,MAAMD,QAAO,IAAI,GAAG,IAAI;AAAA,IACxC;AAAA,EACF,CAAC;AACH;;;AJKA,IAAM,oBAAoB,IAAI,YAAY,CAAC,QAAQ,CAAC;AAEpD,IAAM,kBAAkB,CAAC,WAAmB,CAAC,GAAY,QAAgB;AACvE,WAAS,OAAO,QAAQ,UAAU,MAAM,qBAAqB,OAAO,GAAG,CAAC,KAAK,OAAO,GAAG,GAAG;AAC1F,SAAO,OAAO,GAAG,EAAE,WAAW,MAAM;AACtC;AAEO,IAAM,eAAN,MAAM,sBAA0D,cAAiB;AAAA,EACtF,OAAO,mBAAmB;AAAA,EAC1B,OAAO,cAAc;AAAA,EACrB,OAAO;AAAA,EACP,OAAO;AAAA,EAEP,OAAgB;AAAA,EAEhB,OAAO,oBAAoB;AAAA,EAE3B,OAAgB;AAAA,EAEhB,OAAgB,kBAAkB,kBAAkB,WAAW;AAAA,EAC/D,OAAgB,cAAc;AAAA;AAAA,EAG9B,OAAe;AAAA;AAAA,EAEf,OAAe;AAAA,EAEf,WAAmB,iBAAiB;AAClC,QAAI,CAAC,KAAK,oBAAoB,KAAK,oBAAoB,MAAM;AAC3D,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAQ,KAAK,kBACT,KAAK,oBAAoB,KAAK,sBAAsB,KAAK,iBAAiB,KAAK,qBAAqB,cAAc,IAAI;AAAA,IAC5H,QAAQ;AACN,cAAQ,KAAK,oCAAoC;AACjD,WAAK,kBAAkB;AACvB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,WAAmB,eAAe;AAChC,QAAI,CAAC,KAAK,oBAAoB,KAAK,kBAAkB,MAAM;AACzD,aAAO;AAAA,IACT;AACA,QAAI;AACF,aAAQ,KAAK,gBACT,KAAK,kBAAkB,KAAK,oBAAoB,KAAK,iBAAiB,KAAK,mBAAmB,YAAY,IAAI;AAAA,IACpH,QAAQ;AACN,cAAQ,KAAK,kCAAkC;AAC/C,WAAK,gBAAgB;AACrB,aAAO;AAAA,IACT;AAAA,EACF;AAAA,EAEA,OAAO,aAAa,KAAW,MAA8B;AAC3D,QAAI,IAAK,SAAQ,MAAM,iBAAiB,GAAG,EAAE;AAC7C,WAAO,SAAS,KAAK,sBAAsB,GAAG,KAAK,KAAK,mBAAmB,IAAI,GAAG,MAAM,yBAAyB;AAAA,EACnH;AAAA,EAEA,aAAa,oBAA2C,OAAY,CAAC,GAAG,MAAmC;AACzG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,UAAQ,KAAK,CAAC,CAAC;AAAA,EAC9G;AAAA,EAEA,aAAa,oBAA2C,OAAY,CAAC,GAAG,MAAmC;AACzG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,UAAQ,KAAK,CAAC,CAAC;AAAA,EAC7G;AAAA,EAEA,aAAa,WAAkC,OAAY,CAAC,GAAG,MAAoC;AACjG,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,OAAO,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,EAClF;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,KAA4B,KAAuB;AAC9D,UAAM,eAAe,KAAK,oBAAoB,GAAG;AACjD,UAAM,MAAM,IAAI,YAAY;AAC5B,UAAM,OAAO,IAAI,OAAO,YAAY;AAEpC,QAAI,cAAa,aAAa;AAC5B,UAAI;AACF,cAAM,YAAY,MAAM,KAAK,WAAW,IAAI;AAC5C,eAAO,mBAAmB,WAAW,EAAE,WAAW,IAAI,CAAC;AAAA,MACzD,QAAQ;AACN,sBAAa,cAAc;AAAA,MAC7B;AAAA,IACF;AAEA,UAAM,KAAK;AACX,QAAI,KAAK,YAAY,YAAY;AAC/B,UAAI;AACF,eAAO,MAAM,KAAK,SAAS,IAAI;AAAA,MACjC,QAAQ;AACN,aAAK,YAAY,YAAY;AAAA,MAC/B;AAAA,IACF;AACA,UAAM,IAAI,MAAM,qCAAqC;AAAA,EACvD;AAAA,EAEA,aAAa,UAAU,OAAgD;AACrE,UAAM,aAAa,IAAI,WAAW,KAAK;AACvC,QAAI,cAAa,aAAa;AAC5B,YAAM,YAAY,MAAM,KAAK,WAAW,UAAU;AAClD,aAAO,mBAAmB,WAAW,EAAE,WAAW,IAAI,CAAC;AAAA,IACzD,OAAO;AACL,YAAM,KAAK;AACX,UAAI,KAAK,YAAY,YAAY;AAC/B,eAAO,MAAM,KAAK,SAAS,UAAU;AAAA,MACvC;AACA,YAAM,IAAI,MAAM,qCAAqC;AAAA,IACvD;AAAA,EACF;AAAA,EAEA,OAAO,WAAkC,KAAW;AAClD,WAAO,WAAW,kBAAkB,OAAO,KAAK,gBAAgB,GAAG,CAAC,CAAC,CAAC;AAAA,EACxE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,UAAiC,MAAiC;AAC7E,WAAO,MAAM,QAAQ,IAAI,KAAK,IAAwB,OAAM,QAAO,CAAC,KAAK,MAAM,cAAa,KAAK,GAAG,CAAC,CAAC,CAAC;AAAA,EACzG;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,aAAa,OAA8B,MAAyC;AAClF,WAAO,OAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,SAAO,KAAK,KAAK,GAAG,CAAC,CAAC,IAAI;AAAA,EACrE;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAQA,OAAO,KAA4B,SAAY,OAAO,OAAU;AAC9D,WAAO,WAAW,kBAAkB,OAAO,UAAU,OAAO,SAAS,gBAAgB,GAAG,CAAC,CAAC,CAAC;AAAA,EAC7F;AAAA;AAAA,EAGA,OAAO,YAAmC,SAAY,OAAO,OAAU;AACrE,WAAO,KAAK,KAAK,SAAS,IAAI;AAAA,EAChC;AAAA,EAEA,OAAO,oBAA2C,KAAQ;AACxD,WAAO,KAAK,UAAU,KAAK,WAAW,GAAG,CAAC;AAAA,EAC5C;AAAA,EAEA,aAAa,WAAW,MAAqD;AAC3E,UAAM,OAAO,KAAK;AAClB,WAAO,SAAS,OAAO,MAAM,OAAO,OAAO,WAAW,IAAI,IAAI,KAAK,MAAM,OAAM,WAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,EAClH;AAAA,EAEA,aAAa,SAAS,MAAiC;AACrD,UAAM,OAAO,KAAK;AAClB,WAAO,SAAS,OAAO,OAAO,MAAM,OAAO,IAAI,GAAG,IAAI,IAAI,KAAK,MAAM,OAAM,WAAU,MAAM,OAAO,KAAK,IAAI,CAAC;AAAA,EAC9G;AAAA;AAAA,EAGA,OAAe,iBAA8C,KAAW,MAAsB,OAAO,GAAG;AACtG,QAAI,IAAK,SAAQ,MAAM,qBAAqB,GAAG,EAAE;AACjD,UAAM,aAAa,MAAM,MAAS,KAAK,aAAa,KAAK,IAAI,CAAC;AAC9D,WAAO,KAAK,YAAY,IAAI;AAAA,EAC9B;AAAA,EAEA,MAAM,OAAsB;AAC1B,WAAO,MAAM,cAAa,KAAK,KAAK,GAAG;AAAA,EACzC;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA,EAOA,KAAK,OAAO,OAAU;AACpB,WAAO,cAAa,KAAK,KAAK,KAAK,IAAI;AAAA,EACzC;AACF;;;AKxMA,aAAa,mBAAmB;AAEzB,IAAM,mBAAN,cAAoE,aAAgB;AAAA,EACzF,OAAyB,mBAAmB;AAC9C;","names":["typeOf","subtle","sha256","asHash"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sortFields.d.ts","sourceRoot":"","sources":["../../src/sortFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAQ5D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,KAOrC,CAClB,CAAA"}
1
+ {"version":3,"file":"sortFields.d.ts","sourceRoot":"","sources":["../../src/sortFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAQ5D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,KAMrC,CAClB,CAAA"}
@@ -45,10 +45,10 @@
45
45
  }
46
46
  });
47
47
 
48
- // ../../../../../../node_modules/.pnpm/@xylabs+platform@5.0.95/node_modules/@xylabs/platform/dist/browser/index-browser.mjs
48
+ // ../../../../../../node_modules/.pnpm/@xylabs+platform@5.0.97/node_modules/@xylabs/platform/dist/browser/index-browser.mjs
49
49
  var subtle = globalThis.crypto.subtle;
50
50
 
51
- // ../../../../../../node_modules/.pnpm/@xylabs+threads@5.0.95/node_modules/@xylabs/threads/dist/browser/worker/worker.browser.mjs
51
+ // ../../../../../../node_modules/.pnpm/@xylabs+threads@5.0.97/node_modules/@xylabs/threads/dist/browser/worker/worker.browser.mjs
52
52
  var import_is_observable_2_1_0 = __toESM(require_is_observable(), 1);
53
53
  var DefaultErrorSerializer = {
54
54
  deserialize(message) {
@@ -86,12 +86,12 @@
86
86
  function isTransferDescriptor(thing) {
87
87
  return thing && typeof thing === "object" && thing[$transferable];
88
88
  }
89
- var isErrorEvent = (value) => value && value.error;
89
+ var isErrorEvent = (value) => value !== void 0 && value.error !== void 0;
90
90
  function createExpose(implementation, self2) {
91
91
  let exposeCalled = false;
92
92
  const activeSubscriptions = /* @__PURE__ */ new Map();
93
- const isMasterJobCancelMessage = (thing) => thing && thing.type === "cancel";
94
- const isMasterJobRunMessage = (thing) => thing && thing.type === "run";
93
+ const isMasterJobCancelMessage = (thing) => thing?.type === "cancel";
94
+ const isMasterJobRunMessage = (thing) => thing?.type === "run";
95
95
  const isObservable = (thing) => (0, import_is_observable_2_1_0.default)(thing) || isZenObservable(thing);
96
96
  function isZenObservable(thing) {
97
97
  return thing && typeof thing === "object" && typeof thing.subscribe === "function";
@@ -204,14 +204,14 @@
204
204
  exposeCalled = true;
205
205
  if (typeof exposed === "function") {
206
206
  implementation.subscribeToMasterMessages((messageData) => {
207
- if (isMasterJobRunMessage(messageData) && !messageData.method) {
207
+ if (isMasterJobRunMessage(messageData) && messageData.method === void 0) {
208
208
  runFunction(messageData.uid, exposed, messageData.args.map(deserialize));
209
209
  }
210
210
  });
211
211
  postFunctionInitMessage();
212
- } else if (typeof exposed === "object" && exposed) {
212
+ } else if (typeof exposed === "object" && exposed !== null) {
213
213
  implementation.subscribeToMasterMessages((messageData) => {
214
- if (isMasterJobRunMessage(messageData) && messageData.method) {
214
+ if (isMasterJobRunMessage(messageData) && messageData.method !== void 0) {
215
215
  runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize));
216
216
  }
217
217
  });
@@ -256,7 +256,7 @@
256
256
  }
257
257
  var isWorkerRuntime = function isWorkerRuntime2() {
258
258
  const isWindowContext = self !== void 0 && typeof Window !== "undefined" && self instanceof Window;
259
- return self !== void 0 && self["postMessage"] && !isWindowContext ? true : false;
259
+ return self?.postMessage !== void 0 && !isWindowContext;
260
260
  };
261
261
  var postMessageToMaster = function postMessageToMaster2(data, transferList) {
262
262
  self.postMessage(data, transferList);
@@ -49,7 +49,7 @@
49
49
  }
50
50
  });
51
51
 
52
- // ../../../../../../node_modules/.pnpm/@xylabs+typeof@5.0.95/node_modules/@xylabs/typeof/dist/neutral/index.mjs
52
+ // ../../../../../../node_modules/.pnpm/@xylabs+typeof@5.0.97/node_modules/@xylabs/typeof/dist/neutral/index.mjs
53
53
  function isUndefined(value) {
54
54
  return value === void 0;
55
55
  }
@@ -4005,7 +4005,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4005
4005
  return _superRefine(fn);
4006
4006
  }
4007
4007
 
4008
- // ../../../../../../node_modules/.pnpm/@xylabs+error@5.0.95/node_modules/@xylabs/error/dist/neutral/index.mjs
4008
+ // ../../../../../../node_modules/.pnpm/@xylabs+error@5.0.97/node_modules/@xylabs/error/dist/neutral/index.mjs
4009
4009
  var assertError = (value, assert2, defaultMessage) => {
4010
4010
  if (!isUndefined(assert2)) {
4011
4011
  const assertString = typeof assert2 === "string" ? assert2 : typeof assert2 === "boolean" ? defaultMessage : assert2(value, defaultMessage);
@@ -4016,7 +4016,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4016
4016
  return void 0;
4017
4017
  };
4018
4018
 
4019
- // ../../../../../../node_modules/.pnpm/@xylabs+hex@5.0.95_zod@4.3.6/node_modules/@xylabs/hex/dist/neutral/index.mjs
4019
+ // ../../../../../../node_modules/.pnpm/@xylabs+hex@5.0.97_zod@4.3.6/node_modules/@xylabs/hex/dist/neutral/index.mjs
4020
4020
  var HexRegExMinMax = (minBytes = 0, maxBytes = Number.MAX_SAFE_INTEGER / 2) => {
4021
4021
  return new RegExp(`^[a-f0-9]{${minBytes * 2},${maxBytes * 2}}$`);
4022
4022
  };
@@ -4153,7 +4153,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4153
4153
  var BigIntToJsonZod = bigint2().nonnegative().transform((x) => toHex(x));
4154
4154
  var JsonToBigIntZod = string2().transform((x) => toHex(x)).transform((x) => hexToBigInt(x));
4155
4155
 
4156
- // ../../../../../../node_modules/.pnpm/@xylabs+threads@5.0.95/node_modules/@xylabs/threads/dist/browser/worker/worker.browser.mjs
4156
+ // ../../../../../../node_modules/.pnpm/@xylabs+threads@5.0.97/node_modules/@xylabs/threads/dist/browser/worker/worker.browser.mjs
4157
4157
  var import_is_observable_2_1_0 = __toESM(require_is_observable(), 1);
4158
4158
  var DefaultErrorSerializer = {
4159
4159
  deserialize(message) {
@@ -4191,12 +4191,12 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4191
4191
  function isTransferDescriptor(thing) {
4192
4192
  return thing && typeof thing === "object" && thing[$transferable];
4193
4193
  }
4194
- var isErrorEvent = (value) => value && value.error;
4194
+ var isErrorEvent = (value) => value !== void 0 && value.error !== void 0;
4195
4195
  function createExpose(implementation, self2) {
4196
4196
  let exposeCalled = false;
4197
4197
  const activeSubscriptions = /* @__PURE__ */ new Map();
4198
- const isMasterJobCancelMessage = (thing) => thing && thing.type === "cancel";
4199
- const isMasterJobRunMessage = (thing) => thing && thing.type === "run";
4198
+ const isMasterJobCancelMessage = (thing) => thing?.type === "cancel";
4199
+ const isMasterJobRunMessage = (thing) => thing?.type === "run";
4200
4200
  const isObservable = (thing) => (0, import_is_observable_2_1_0.default)(thing) || isZenObservable(thing);
4201
4201
  function isZenObservable(thing) {
4202
4202
  return thing && typeof thing === "object" && typeof thing.subscribe === "function";
@@ -4309,14 +4309,14 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4309
4309
  exposeCalled = true;
4310
4310
  if (typeof exposed === "function") {
4311
4311
  implementation.subscribeToMasterMessages((messageData) => {
4312
- if (isMasterJobRunMessage(messageData) && !messageData.method) {
4312
+ if (isMasterJobRunMessage(messageData) && messageData.method === void 0) {
4313
4313
  runFunction(messageData.uid, exposed, messageData.args.map(deserialize));
4314
4314
  }
4315
4315
  });
4316
4316
  postFunctionInitMessage();
4317
- } else if (typeof exposed === "object" && exposed) {
4317
+ } else if (typeof exposed === "object" && exposed !== null) {
4318
4318
  implementation.subscribeToMasterMessages((messageData) => {
4319
- if (isMasterJobRunMessage(messageData) && messageData.method) {
4319
+ if (isMasterJobRunMessage(messageData) && messageData.method !== void 0) {
4320
4320
  runFunction(messageData.uid, exposed[messageData.method], messageData.args.map(deserialize));
4321
4321
  }
4322
4322
  });
@@ -4361,7 +4361,7 @@ Set the \`cycles\` parameter to \`"ref"\` to resolve cyclical schemas with defs.
4361
4361
  }
4362
4362
  var isWorkerRuntime = function isWorkerRuntime2() {
4363
4363
  const isWindowContext = self !== void 0 && typeof Window !== "undefined" && self instanceof Window;
4364
- return self !== void 0 && self["postMessage"] && !isWindowContext ? true : false;
4364
+ return self?.postMessage !== void 0 && !isWindowContext;
4365
4365
  };
4366
4366
  var postMessageToMaster = function postMessageToMaster2(data, transferList) {
4367
4367
  self.postMessage(data, transferList);
@@ -3,9 +3,7 @@ import { ObjectWrapper } from '@xylabs/sdk-js';
3
3
  import type { Worker } from '@xylabs/threads/master';
4
4
  import { WasmSupport } from '@xyo-network/wasm';
5
5
  export type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown);
6
- export type WorkerModule<Keys extends string> = {
7
- [key in Keys]: WorkerFunction;
8
- };
6
+ export type WorkerModule<Keys extends string> = Record<Keys, WorkerFunction>;
9
7
  export declare class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
10
8
  static allowHashPooling: boolean;
11
9
  static allowSubtle: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectHasher.d.ts","sourceRoot":"","sources":["../../src/ObjectHasher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObjectHasher.d.ts","sourceRoot":"","sources":["../../src/ObjectHasher.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodeObjectHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const hasEmptyFields = <T extends EmptyObject>(obj: T): boolean => {\n if (obj == null || Array.isArray(obj)) return false\n\n if (obj == undefined || Object.keys(obj).length === 0) return true\n\n for (const [value] of Object.values(obj)) {\n if (typeOf(value) === 'object') {\n if (hasEmptyFields(value as Record<string, unknown>)) return true\n } else if (value === undefined) {\n return true\n }\n }\n return false\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","/* eslint-disable sonarjs/public-static-readonly */\n\nimport type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = {\n [key in Keys]: WorkerFunction\n}\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n // eslint-disable-next-line sonarjs/no-alphabetical-sort\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["typeOf","subtle","sha256","asHash"]}
1
+ {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodeObjectHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const hasEmptyFields = <T extends EmptyObject>(obj: T): boolean => {\n if (obj == null || Array.isArray(obj)) return false\n\n if (obj == undefined || Object.keys(obj).length === 0) return true\n\n for (const [value] of Object.values(obj)) {\n if (typeOf(value) === 'object') {\n if (hasEmptyFields(value as Record<string, unknown>)) return true\n } else if (value === undefined) {\n return true\n }\n }\n return false\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","import type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = Record<Keys, WorkerFunction>\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["typeOf","subtle","sha256","asHash"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sortFields.d.ts","sourceRoot":"","sources":["../../src/sortFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAQ5D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,KAOrC,CAClB,CAAA"}
1
+ {"version":3,"file":"sortFields.d.ts","sourceRoot":"","sources":["../../src/sortFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAQ5D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,KAMrC,CAClB,CAAA"}
@@ -3,9 +3,7 @@ import { ObjectWrapper } from '@xylabs/sdk-js';
3
3
  import type { Worker } from '@xylabs/threads/master';
4
4
  import { WasmSupport } from '@xyo-network/wasm';
5
5
  export type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown);
6
- export type WorkerModule<Keys extends string> = {
7
- [key in Keys]: WorkerFunction;
8
- };
6
+ export type WorkerModule<Keys extends string> = Record<Keys, WorkerFunction>;
9
7
  export declare class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
10
8
  static allowHashPooling: boolean;
11
9
  static allowSubtle: boolean;
@@ -1 +1 @@
1
- {"version":3,"file":"ObjectHasher.d.ts","sourceRoot":"","sources":["../../src/ObjectHasher.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ObjectHasher.d.ts","sourceRoot":"","sources":["../../src/ObjectHasher.ts"],"names":[],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodeObjectHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const hasEmptyFields = <T extends EmptyObject>(obj: T): boolean => {\n if (obj == null || Array.isArray(obj)) return false\n\n if (obj == undefined || Object.keys(obj).length === 0) return true\n\n for (const [value] of Object.values(obj)) {\n if (typeOf(value) === 'object') {\n if (hasEmptyFields(value as Record<string, unknown>)) return true\n } else if (value === undefined) {\n return true\n }\n }\n return false\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","/* eslint-disable sonarjs/public-static-readonly */\n\nimport type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = {\n [key in Keys]: WorkerFunction\n}\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n // eslint-disable-next-line sonarjs/no-alphabetical-sort\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["typeOf","subtle","sha256","asHash"]}
1
+ {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/ObjectHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodeObjectHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const hasEmptyFields = <T extends EmptyObject>(obj: T): boolean => {\n if (obj == null || Array.isArray(obj)) return false\n\n if (obj == undefined || Object.keys(obj).length === 0) return true\n\n for (const [value] of Object.values(obj)) {\n if (typeOf(value) === 'object') {\n if (hasEmptyFields(value as Record<string, unknown>)) return true\n } else if (value === undefined) {\n return true\n }\n }\n return false\n}\n","import { Worker } from '@xylabs/threads/master'\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n","import type { EmptyObject, Hash } from '@xylabs/sdk-js'\nimport {\n asHash, assertEx,\n hexFromArrayBuffer, ObjectWrapper, omitBy, subtle,\n} from '@xylabs/sdk-js'\nimport type { ModuleThread, Worker } from '@xylabs/threads/master'\nimport { Pool, spawn } from '@xylabs/threads/master'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\n\nimport { removeEmptyFields } from './removeEmptyFields.ts'\nimport { sortFields } from './sortFields.ts'\nimport { subtleHashFunc, wasmHashFunc } from './worker/index.ts'\n\nexport type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)\nexport type WorkerModule<Keys extends string> = Record<Keys, WorkerFunction>\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = (prefix: string) => (_: unknown, key: string) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowHashPooling = true\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static readonly subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static readonly wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n\n private static get subtleHashPool() {\n if (!this.allowHashPooling || this._subtleHashPool === null) {\n return null\n }\n try {\n return (this._subtleHashPool\n = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null))\n } catch {\n console.warn('Creating subtle hash worker failed')\n this._subtleHashPool = null\n return null\n }\n }\n\n private static get wasmHashPool() {\n if (!this.allowHashPooling || this._wasmHashPool === null) {\n return null\n }\n try {\n return (this._wasmHashPool\n = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null))\n } catch {\n console.warn('Creating wasm hash worker failed')\n this._wasmHashPool = null\n return null\n }\n }\n\n static createWorker(url?: URL, func?: () => unknown): Worker {\n if (url) console.debug(`createWorker: ${url}`)\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map(pair => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n\n if (ObjectHasher.allowSubtle) {\n try {\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No subtle or wasm hashing available')\n }\n\n static async hashBytes(bytes: ArrayBuffer | Uint8Array): Promise<Hash> {\n const bytesArray = new Uint8Array(bytes)\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n } else {\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n throw new Error('No subtle or wasm hashing available')\n }\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(omitBy(obj, omitByPredicate('_')))) as T\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 EmptyObject>(objs: T[]): Promise<[T, Hash][]> {\n return await Promise.all(objs.map<Promise<[T, Hash]>>(async obj => [obj, await ObjectHasher.hash(obj)]))\n }\n\n /**\n * Creates an array of payload hashes based on the payloads passed in\n * @param objs Any array of payloads\n * @returns An array of payload hashes\n */\n static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {\n return objs ? await Promise.all(objs.map(obj => this.hash(obj))) : undefined\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : omitBy(payload, omitByPredicate('_')))) as T\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array<ArrayBuffer>): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async thread => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n if (url) console.debug(`createWorkerPool: ${url}`)\n const createFunc = () => spawn<T>(this.createWorker(url, func))\n return Pool(createFunc, size)\n }\n\n async hash(): Promise<Hash> {\n return await ObjectHasher.hash(this.obj)\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n json(meta = false): T {\n return ObjectHasher.json(this.obj, meta)\n }\n}\n\n/** @deprecated use PayloadBuilder or ObjectHasher instead */\nexport class PayloadHasher<T extends object> extends ObjectHasher<T> {}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { typeOf } from '@xylabs/sdk-js'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj == null) return obj\n\n if (Array.isArray(obj)) {\n return obj.map(value => (typeof value === 'object' ? removeEmptyFields(value) : value)) as T\n }\n\n const newObject: AnyObject = {}\n for (const [key, value] of Object.entries(obj)) {\n if (typeOf(value) === 'object') {\n newObject[key] = removeEmptyFields(value as Record<string, unknown>)\n } else if (value !== undefined) {\n newObject[key] = value\n }\n }\n return newObject as T\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/sdk-js'\nimport { isObject } from '@xylabs/sdk-js'\n\n// if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-require-imports */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n\n const { expose } = require('@xylabs/threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import type { EmptyObject } from '@xylabs/sdk-js'\n\nimport { createNodeWorker } from './createNodeWorker.ts'\nimport { ObjectHasher } from './ObjectHasher.ts'\n\nObjectHasher.createNodeWorker = createNodeWorker\n\nexport class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {\n static override readonly createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["typeOf","subtle","sha256","asHash"]}
@@ -1 +1 @@
1
- {"version":3,"file":"sortFields.d.ts","sourceRoot":"","sources":["../../src/sortFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAQ5D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,KAOrC,CAClB,CAAA"}
1
+ {"version":3,"file":"sortFields.d.ts","sourceRoot":"","sources":["../../src/sortFields.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAa,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAQ5D,eAAO,MAAM,UAAU,GAAI,CAAC,SAAS,WAAW,EAAE,KAAK,CAAC,KAMrC,CAClB,CAAA"}