@xyo-network/hash 3.4.2 → 3.5.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.
Files changed (53) hide show
  1. package/dist/browser/BrowserObjectHasher.d.ts +12 -0
  2. package/dist/browser/BrowserObjectHasher.d.ts.map +1 -0
  3. package/dist/browser/NodePayloadHasher.d.ts +6 -2
  4. package/dist/browser/NodePayloadHasher.d.ts.map +1 -1
  5. package/dist/{neutral/PayloadHasher.d.ts → browser/ObjectHasher.d.ts} +6 -4
  6. package/dist/browser/ObjectHasher.d.ts.map +1 -0
  7. package/dist/browser/index-browser.d.ts +2 -1
  8. package/dist/browser/index-browser.d.ts.map +1 -1
  9. package/dist/browser/index-browser.mjs +17 -15
  10. package/dist/browser/index-browser.mjs.map +1 -1
  11. package/dist/browser/index.d.ts +1 -0
  12. package/dist/browser/index.d.ts.map +1 -1
  13. package/dist/browser/worker/subtleHash-bundle.mjs +41 -41
  14. package/dist/browser/worker/wasmHash-bundle.mjs +50 -48
  15. package/dist/neutral/BrowserObjectHasher.d.ts +12 -0
  16. package/dist/neutral/BrowserObjectHasher.d.ts.map +1 -0
  17. package/dist/neutral/NodePayloadHasher.d.ts +6 -2
  18. package/dist/neutral/NodePayloadHasher.d.ts.map +1 -1
  19. package/dist/{node/PayloadHasher.d.ts → neutral/ObjectHasher.d.ts} +6 -4
  20. package/dist/neutral/ObjectHasher.d.ts.map +1 -0
  21. package/dist/neutral/index-browser.d.ts +2 -1
  22. package/dist/neutral/index-browser.d.ts.map +1 -1
  23. package/dist/neutral/index.d.ts +1 -0
  24. package/dist/neutral/index.d.ts.map +1 -1
  25. package/dist/neutral/index.mjs +15 -13
  26. package/dist/neutral/index.mjs.map +1 -1
  27. package/dist/node/BrowserObjectHasher.d.ts +12 -0
  28. package/dist/node/BrowserObjectHasher.d.ts.map +1 -0
  29. package/dist/node/NodePayloadHasher.d.ts +6 -2
  30. package/dist/node/NodePayloadHasher.d.ts.map +1 -1
  31. package/dist/{browser/PayloadHasher.d.ts → node/ObjectHasher.d.ts} +6 -4
  32. package/dist/node/ObjectHasher.d.ts.map +1 -0
  33. package/dist/node/index-browser.d.ts +2 -1
  34. package/dist/node/index-browser.d.ts.map +1 -1
  35. package/dist/node/index.d.ts +1 -0
  36. package/dist/node/index.d.ts.map +1 -1
  37. package/dist/node/index.mjs +15 -13
  38. package/dist/node/index.mjs.map +1 -1
  39. package/package.json +13 -11
  40. package/src/{BrowserPayloadHasher.ts → BrowserObjectHasher.ts} +9 -4
  41. package/src/NodePayloadHasher.ts +8 -3
  42. package/src/{PayloadHasher.ts → ObjectHasher.ts} +8 -10
  43. package/src/index-browser.ts +2 -1
  44. package/src/index.ts +1 -0
  45. package/dist/browser/BrowserPayloadHasher.d.ts +0 -8
  46. package/dist/browser/BrowserPayloadHasher.d.ts.map +0 -1
  47. package/dist/browser/PayloadHasher.d.ts.map +0 -1
  48. package/dist/neutral/BrowserPayloadHasher.d.ts +0 -8
  49. package/dist/neutral/BrowserPayloadHasher.d.ts.map +0 -1
  50. package/dist/neutral/PayloadHasher.d.ts.map +0 -1
  51. package/dist/node/BrowserPayloadHasher.d.ts +0 -8
  52. package/dist/node/BrowserPayloadHasher.d.ts.map +0 -1
  53. package/dist/node/PayloadHasher.d.ts.map +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodePayloadHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\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'\n\nexport const createNodeWorker = (func?: () => unknown) => {\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 return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport { asHash, hexFromArrayBuffer } from '@xylabs/hex'\nimport type { EmptyObject } from '@xylabs/object'\nimport { ObjectWrapper, omitBy } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport type { ModuleThread, Worker } from '@xylabs/threads'\nimport { Pool, spawn } from '@xylabs/threads'\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\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerFunction = ((...args: any[]) => any) | (() => any)\nexport type WorkerModule<Keys extends string> = {\n [key in Keys]: WorkerFunction\n}\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = <T extends object>(prefix: string) => (_: T[keyof T], key: keyof T) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class PayloadHasher<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 initialized = (() => {\n globalThis.xyo = globalThis.xyo ?? {}\n if (globalThis.xyo.hashing) {\n console.warn('Two static instances of PayloadHasher detected')\n }\n })()\n\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // These get set to null if they fail to create and then we just don't use workers - needed for storybook\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\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) {\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\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No wasm hashing available')\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 PayloadHasher.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): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\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 PayloadHasher.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 PayloadHasher.json(this.obj, meta)\n }\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\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/object'\nimport { isObject } from '@xylabs/object'\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.sort()) {\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 { createNodeWorker } from './createNodeWorker.ts'\nimport { PayloadHasher } from './PayloadHasher.ts'\n\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class NodePayloadHasher extends PayloadHasher {\n static override 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/NodePayloadHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\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'\n\nexport const createNodeWorker = (func?: () => unknown) => {\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 return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport { asHash, hexFromArrayBuffer } from '@xylabs/hex'\nimport type { EmptyObject } from '@xylabs/object'\nimport { ObjectWrapper, omitBy } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport type { ModuleThread, Worker } from '@xylabs/threads'\nimport { Pool, spawn } from '@xylabs/threads'\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 = <T extends EmptyObject>(prefix: string) => (_: T[keyof T], key: keyof T) => {\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 initialized = (() => {\n globalThis.xyo = globalThis.xyo ?? {}\n if (globalThis.xyo.hashing) {\n console.warn('Two static instances of PayloadHasher detected')\n }\n })()\n\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static 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) {\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\n if (ObjectHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No wasm hashing available')\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 PayloadHasher.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): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\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 PayloadHasher.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 PayloadHasher.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/object'\nimport { typeOf } from '@xylabs/typeof'\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/object'\nimport { isObject } from '@xylabs/object'\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.sort()) {\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/object'\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 createNodeWorker = createNodeWorker\n}\n\n/** @deprecated use NodeObjectHasher instead */\nexport class NodePayloadHasher<T extends EmptyObject = EmptyObject> extends NodeObjectHasher<T> {}\n"],"mappings":"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","names":["typeOf","subtle","sha256","asHash"]}
@@ -0,0 +1,12 @@
1
+ import type { EmptyObject } from '@xylabs/object';
2
+ import { ObjectHasher } from './ObjectHasher.ts';
3
+ export declare class BrowserObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {
4
+ static createBrowserWorker: (url?: URL) => import("@xylabs/threads/master").WorkerImplementation | undefined;
5
+ static createNodeWorker: (func?: () => unknown) => import("@xylabs/threads/master").WorkerImplementation | undefined;
6
+ static subtleHashWorkerUrl: import("url").URL | undefined;
7
+ static wasmHashWorkerUrl: import("url").URL | undefined;
8
+ }
9
+ /** @deprecated use BrowserObjectHasher instead */
10
+ export declare class BrowserPayloadHasher<T extends EmptyObject = EmptyObject> extends BrowserObjectHasher<T> {
11
+ }
12
+ //# sourceMappingURL=BrowserObjectHasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"BrowserObjectHasher.d.ts","sourceRoot":"","sources":["../../src/BrowserObjectHasher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAIjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAOhD,qBAAa,mBAAmB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IAC3F,OAAgB,mBAAmB,mFAAsB;IACzD,OAAgB,gBAAgB,8FAAmB;IACnD,OAAgB,mBAAmB,gCAM/B;IAEJ,OAAgB,iBAAiB,gCAM7B;CACL;AAED,kDAAkD;AAClD,qBAAa,oBAAoB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,mBAAmB,CAAC,CAAC,CAAC;CAAG"}
@@ -1,5 +1,9 @@
1
- import { PayloadHasher } from './PayloadHasher.ts';
2
- export declare class NodePayloadHasher extends PayloadHasher {
1
+ import type { EmptyObject } from '@xylabs/object';
2
+ import { ObjectHasher } from './ObjectHasher.ts';
3
+ export declare class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {
3
4
  static createNodeWorker: (func?: () => unknown) => import("@xylabs/threads/master").WorkerImplementation | undefined;
4
5
  }
6
+ /** @deprecated use NodeObjectHasher instead */
7
+ export declare class NodePayloadHasher<T extends EmptyObject = EmptyObject> extends NodeObjectHasher<T> {
8
+ }
5
9
  //# sourceMappingURL=NodePayloadHasher.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"NodePayloadHasher.d.ts","sourceRoot":"","sources":["../../src/NodePayloadHasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAIlD,qBAAa,iBAAkB,SAAQ,aAAa;IAClD,OAAgB,gBAAgB,8FAAmB;CACpD"}
1
+ {"version":3,"file":"NodePayloadHasher.d.ts","sourceRoot":"","sources":["../../src/NodePayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAA;AAGjD,OAAO,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AAIhD,qBAAa,gBAAgB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,YAAY,CAAC,CAAC,CAAC;IACxF,OAAgB,gBAAgB,8FAAmB;CACpD;AAED,+CAA+C;AAC/C,qBAAa,iBAAiB,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,gBAAgB,CAAC,CAAC,CAAC;CAAG"}
@@ -3,11 +3,11 @@ import type { EmptyObject } from '@xylabs/object';
3
3
  import { ObjectWrapper } from '@xylabs/object';
4
4
  import type { Worker } from '@xylabs/threads';
5
5
  import { WasmSupport } from '@xyo-network/wasm';
6
- export type WorkerFunction = ((...args: any[]) => any) | (() => any);
6
+ export type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown);
7
7
  export type WorkerModule<Keys extends string> = {
8
8
  [key in Keys]: WorkerFunction;
9
9
  };
10
- export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
10
+ export declare class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
11
11
  static allowHashPooling: boolean;
12
12
  static allowSubtle: boolean;
13
13
  static createBrowserWorker?: (url?: URL) => Worker | undefined;
@@ -18,7 +18,6 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
18
18
  static wasmHashWorkerUrl?: URL;
19
19
  static readonly wasmInitialized: Promise<void>;
20
20
  static readonly wasmSupport: WasmSupport;
21
- private static _jsHashPool?;
22
21
  private static _subtleHashPool?;
23
22
  private static _wasmHashPool?;
24
23
  private static get subtleHashPool();
@@ -67,4 +66,7 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
67
66
  */
68
67
  json(meta?: boolean): T;
69
68
  }
70
- //# sourceMappingURL=PayloadHasher.d.ts.map
69
+ /** @deprecated use PayloadBuilder or ObjectHasher instead */
70
+ export declare class PayloadHasher<T extends object> extends ObjectHasher<T> {
71
+ }
72
+ //# sourceMappingURL=ObjectHasher.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ObjectHasher.d.ts","sourceRoot":"","sources":["../../src/ObjectHasher.ts"],"names":[],"mappings":"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"}
@@ -1,4 +1,5 @@
1
- export { BrowserPayloadHasher as PayloadHasher } from './BrowserPayloadHasher.ts';
1
+ export { BrowserObjectHasher as ObjectHasher } from './BrowserObjectHasher.ts';
2
+ export { BrowserPayloadHasher as PayloadHasher } from './BrowserObjectHasher.ts';
2
3
  export * from './removeEmptyFields.ts';
3
4
  export * from './sortFields.ts';
4
5
  //# sourceMappingURL=index-browser.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,oBAAoB,IAAI,aAAa,EAAE,MAAM,2BAA2B,CAAA;AACjF,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,mBAAmB,IAAI,YAAY,EAAE,MAAM,0BAA0B,CAAA;AAC9E,OAAO,EAAE,oBAAoB,IAAI,aAAa,EAAE,MAAM,0BAA0B,CAAA;AAChF,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA"}
@@ -1,4 +1,5 @@
1
1
  export * from './hasEmptyFields.ts';
2
+ export { NodeObjectHasher as ObjectHasher } from './NodePayloadHasher.ts';
2
3
  export { NodePayloadHasher as PayloadHasher } from './NodePayloadHasher.ts';
3
4
  export * from './removeEmptyFields.ts';
4
5
  export * from './sortFields.ts';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,iBAAiB,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3E,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,qBAAqB,CAAA;AACnC,OAAO,EAAE,gBAAgB,IAAI,YAAY,EAAE,MAAM,wBAAwB,CAAA;AACzE,OAAO,EAAE,iBAAiB,IAAI,aAAa,EAAE,MAAM,wBAAwB,CAAA;AAC3E,cAAc,wBAAwB,CAAA;AACtC,cAAc,iBAAiB,CAAA"}
@@ -35,7 +35,7 @@ var createNodeWorker = (func) => {
35
35
  }
36
36
  };
37
37
 
38
- // src/PayloadHasher.ts
38
+ // src/ObjectHasher.ts
39
39
  import { assertEx } from "@xylabs/assert";
40
40
  import { asHash, hexFromArrayBuffer } from "@xylabs/hex";
41
41
  import { ObjectWrapper, omitBy } from "@xylabs/object";
@@ -99,13 +99,13 @@ var wasmHashFunc = () => {
99
99
  });
100
100
  };
101
101
 
102
- // src/PayloadHasher.ts
102
+ // src/ObjectHasher.ts
103
103
  var wasmSupportStatic = new WasmSupport(["bigInt"]);
104
104
  var omitByPredicate = (prefix) => (_, key) => {
105
105
  assertEx(typeof key === "string", () => `Invalid key type [${String(key)}, ${typeof key}]`);
106
106
  return String(key).startsWith(prefix);
107
107
  };
108
- var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
108
+ var ObjectHasher = class _ObjectHasher extends ObjectWrapper {
109
109
  static allowHashPooling = true;
110
110
  static allowSubtle = true;
111
111
  static createBrowserWorker;
@@ -121,9 +121,6 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
121
121
  static wasmHashWorkerUrl;
122
122
  static wasmInitialized = wasmSupportStatic.initialize();
123
123
  static wasmSupport = wasmSupportStatic;
124
- // These get set to null if they fail to create and then we just don't use workers - needed for storybook
125
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
126
- static _jsHashPool;
127
124
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
128
125
  static _subtleHashPool;
129
126
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -174,14 +171,14 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
174
171
  */
175
172
  static async hash(obj) {
176
173
  const stringToHash = this.stringifyHashFields(obj);
177
- if (_PayloadHasher.allowSubtle) {
174
+ if (_ObjectHasher.allowSubtle) {
178
175
  try {
179
176
  const enc = new TextEncoder();
180
177
  const data = enc.encode(stringToHash);
181
178
  const hashArray = await this.subtleHash(data);
182
179
  return hexFromArrayBuffer(hashArray, { bitLength: 256 });
183
180
  } catch {
184
- _PayloadHasher.allowSubtle = false;
181
+ _ObjectHasher.allowSubtle = false;
185
182
  }
186
183
  }
187
184
  await this.wasmInitialized;
@@ -203,7 +200,7 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
203
200
  * @returns An array of payload/hash tuples
204
201
  */
205
202
  static async hashPairs(objs) {
206
- return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hash(obj)]));
203
+ return await Promise.all(objs.map(async (obj) => [obj, await PayloadHasher.hash(obj)]));
207
204
  }
208
205
  /**
209
206
  * Creates an array of payload hashes based on the payloads passed in
@@ -244,7 +241,7 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
244
241
  return Pool(createFunc, size);
245
242
  }
246
243
  async hash() {
247
- return await _PayloadHasher.hash(this.obj);
244
+ return await PayloadHasher.hash(this.obj);
248
245
  }
249
246
  /**
250
247
  * Returns a clone of the payload that is JSON safe
@@ -252,16 +249,21 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
252
249
  * @returns Returns a clone of the payload that is JSON safe
253
250
  */
254
251
  json(meta = false) {
255
- return _PayloadHasher.json(this.obj, meta);
252
+ return PayloadHasher.json(this.obj, meta);
256
253
  }
257
254
  };
255
+ var PayloadHasher = class extends ObjectHasher {
256
+ };
258
257
 
259
258
  // src/NodePayloadHasher.ts
260
- PayloadHasher.createNodeWorker = createNodeWorker;
261
- var NodePayloadHasher = class extends PayloadHasher {
259
+ ObjectHasher.createNodeWorker = createNodeWorker;
260
+ var NodeObjectHasher = class extends ObjectHasher {
262
261
  static createNodeWorker = createNodeWorker;
263
262
  };
263
+ var NodePayloadHasher = class extends NodeObjectHasher {
264
+ };
264
265
  export {
266
+ NodeObjectHasher as ObjectHasher,
265
267
  NodePayloadHasher as PayloadHasher,
266
268
  hasEmptyFields,
267
269
  removeEmptyFields,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../src/hasEmptyFields.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/sortFields.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodePayloadHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\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'\n\nexport const createNodeWorker = (func?: () => unknown) => {\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 return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport { asHash, hexFromArrayBuffer } from '@xylabs/hex'\nimport type { EmptyObject } from '@xylabs/object'\nimport { ObjectWrapper, omitBy } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport type { ModuleThread, Worker } from '@xylabs/threads'\nimport { Pool, spawn } from '@xylabs/threads'\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\n// eslint-disable-next-line @typescript-eslint/no-explicit-any\nexport type WorkerFunction = ((...args: any[]) => any) | (() => any)\nexport type WorkerModule<Keys extends string> = {\n [key in Keys]: WorkerFunction\n}\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nconst omitByPredicate = <T extends object>(prefix: string) => (_: T[keyof T], key: keyof T) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)\n return String(key).startsWith(prefix)\n}\n\nexport class PayloadHasher<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 initialized = (() => {\n globalThis.xyo = globalThis.xyo ?? {}\n if (globalThis.xyo.hashing) {\n console.warn('Two static instances of PayloadHasher detected')\n }\n })()\n\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // These get set to null if they fail to create and then we just don't use workers - needed for storybook\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\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) {\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\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No wasm hashing available')\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 PayloadHasher.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): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\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 PayloadHasher.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 PayloadHasher.json(this.obj, meta)\n }\n}\n","import type { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\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/object'\nimport { isObject } from '@xylabs/object'\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.sort()) {\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 { createNodeWorker } from './createNodeWorker.ts'\nimport { PayloadHasher } from './PayloadHasher.ts'\n\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class NodePayloadHasher extends PayloadHasher {\n static override 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/NodePayloadHasher.ts"],"sourcesContent":["import type { EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\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'\n\nexport const createNodeWorker = (func?: () => unknown) => {\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 return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport type { Hash } from '@xylabs/hex'\nimport { asHash, hexFromArrayBuffer } from '@xylabs/hex'\nimport type { EmptyObject } from '@xylabs/object'\nimport { ObjectWrapper, omitBy } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport type { ModuleThread, Worker } from '@xylabs/threads'\nimport { Pool, spawn } from '@xylabs/threads'\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 = <T extends EmptyObject>(prefix: string) => (_: T[keyof T], key: keyof T) => {\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 initialized = (() => {\n globalThis.xyo = globalThis.xyo ?? {}\n if (globalThis.xyo.hashing) {\n console.warn('Two static instances of PayloadHasher detected')\n }\n })()\n\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static 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) {\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\n if (ObjectHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n ObjectHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n throw new Error('No wasm hashing available')\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 PayloadHasher.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): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async thread => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\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 PayloadHasher.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 PayloadHasher.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/object'\nimport { typeOf } from '@xylabs/typeof'\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/object'\nimport { isObject } from '@xylabs/object'\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.sort()) {\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/object'\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 createNodeWorker = createNodeWorker\n}\n\n/** @deprecated use NodeObjectHasher instead */\nexport class NodePayloadHasher<T extends EmptyObject = EmptyObject> extends NodeObjectHasher<T> {}\n"],"mappings":"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","names":["typeOf","subtle","sha256","asHash"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@xyo-network/hash",
3
- "version": "3.4.2",
3
+ "version": "3.5.0",
4
4
  "description": "Primary SDK for using XYO Protocol 2.0",
5
5
  "homepage": "https://xyo.network",
6
6
  "bugs": {
@@ -50,22 +50,24 @@
50
50
  "wasmHashBundle": "esbuild src/worker/wasmHash.ts --bundle --outfile=dist/browser/worker/wasmHash-bundle.mjs --target=chrome120,firefox120,safari14,edge120"
51
51
  },
52
52
  "dependencies": {
53
- "@xylabs/assert": "^4.3.13",
54
- "@xylabs/hex": "^4.3.13",
55
- "@xylabs/object": "^4.3.13",
56
- "@xylabs/platform": "^4.3.13",
57
- "@xylabs/threads": "^4.3.13",
58
- "@xylabs/typeof": "^4.3.13",
59
- "@xyo-network/wasm": "^3.4.2",
60
- "hash-wasm": "^4.11.0"
53
+ "@xylabs/assert": "^4.4.4",
54
+ "@xylabs/hex": "^4.4.4",
55
+ "@xylabs/object": "^4.4.4",
56
+ "@xylabs/platform": "^4.4.4",
57
+ "@xylabs/threads": "^4.4.4",
58
+ "@xylabs/typeof": "^4.4.4",
59
+ "@xyo-network/wasm": "^3.5.0",
60
+ "hash-wasm": "^4.12.0"
61
61
  },
62
62
  "devDependencies": {
63
- "@xylabs/delay": "^4.3.13",
63
+ "@xylabs/delay": "^4.4.4",
64
64
  "@xylabs/ts-scripts-yarn3": "^4.2.4",
65
65
  "@xylabs/tsconfig": "^4.2.4",
66
+ "@xylabs/vitest-extended": "^4.4.4",
66
67
  "esbuild": "^0.24.0",
67
68
  "publint": "^0.2.12",
68
- "typescript": "^5.6.3"
69
+ "typescript": "^5.7.2",
70
+ "vitest": "^2.1.5"
69
71
  },
70
72
  "publishConfig": {
71
73
  "access": "public"
@@ -1,13 +1,15 @@
1
+ import type { EmptyObject } from '@xylabs/object'
2
+
1
3
  import { createBrowserWorker } from './createBrowserWorker.ts'
2
4
  import { createNodeWorker } from './createNodeWorker.ts'
3
- import { PayloadHasher } from './PayloadHasher.ts'
5
+ import { ObjectHasher } from './ObjectHasher.ts'
4
6
 
5
7
  // We put both in here so that things will work in jsdom/jest
6
8
 
7
- PayloadHasher.createBrowserWorker = createBrowserWorker
8
- PayloadHasher.createNodeWorker = createNodeWorker
9
+ ObjectHasher.createBrowserWorker = createBrowserWorker
10
+ ObjectHasher.createNodeWorker = createNodeWorker
9
11
 
10
- export class BrowserPayloadHasher extends PayloadHasher {
12
+ export class BrowserObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {
11
13
  static override createBrowserWorker = createBrowserWorker
12
14
  static override createNodeWorker = createNodeWorker
13
15
  static override subtleHashWorkerUrl = (() => {
@@ -26,3 +28,6 @@ export class BrowserPayloadHasher extends PayloadHasher {
26
28
  }
27
29
  })()
28
30
  }
31
+
32
+ /** @deprecated use BrowserObjectHasher instead */
33
+ export class BrowserPayloadHasher<T extends EmptyObject = EmptyObject> extends BrowserObjectHasher<T> {}
@@ -1,8 +1,13 @@
1
+ import type { EmptyObject } from '@xylabs/object'
2
+
1
3
  import { createNodeWorker } from './createNodeWorker.ts'
2
- import { PayloadHasher } from './PayloadHasher.ts'
4
+ import { ObjectHasher } from './ObjectHasher.ts'
3
5
 
4
- PayloadHasher.createNodeWorker = createNodeWorker
6
+ ObjectHasher.createNodeWorker = createNodeWorker
5
7
 
6
- export class NodePayloadHasher extends PayloadHasher {
8
+ export class NodeObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectHasher<T> {
7
9
  static override createNodeWorker = createNodeWorker
8
10
  }
11
+
12
+ /** @deprecated use NodeObjectHasher instead */
13
+ export class NodePayloadHasher<T extends EmptyObject = EmptyObject> extends NodeObjectHasher<T> {}
@@ -13,20 +13,19 @@ import { removeEmptyFields } from './removeEmptyFields.ts'
13
13
  import { sortFields } from './sortFields.ts'
14
14
  import { subtleHashFunc, wasmHashFunc } from './worker/index.ts'
15
15
 
16
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
17
- export type WorkerFunction = ((...args: any[]) => any) | (() => any)
16
+ export type WorkerFunction = ((...args: unknown[]) => unknown) | (() => unknown)
18
17
  export type WorkerModule<Keys extends string> = {
19
18
  [key in Keys]: WorkerFunction
20
19
  }
21
20
 
22
21
  const wasmSupportStatic = new WasmSupport(['bigInt'])
23
22
 
24
- const omitByPredicate = <T extends object>(prefix: string) => (_: T[keyof T], key: keyof T) => {
23
+ const omitByPredicate = <T extends EmptyObject>(prefix: string) => (_: T[keyof T], key: keyof T) => {
25
24
  assertEx(typeof key === 'string', () => `Invalid key type [${String(key)}, ${typeof key}]`)
26
25
  return String(key).startsWith(prefix)
27
26
  }
28
27
 
29
- export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
28
+ export class ObjectHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
30
29
  static allowHashPooling = true
31
30
  static allowSubtle = true
32
31
  static createBrowserWorker?: (url?: URL) => Worker | undefined
@@ -48,10 +47,6 @@ export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWr
48
47
  static readonly wasmInitialized = wasmSupportStatic.initialize()
49
48
  static readonly wasmSupport = wasmSupportStatic
50
49
 
51
- // These get set to null if they fail to create and then we just don't use workers - needed for storybook
52
- // eslint-disable-next-line @typescript-eslint/no-explicit-any
53
- private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null
54
-
55
50
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
56
51
  private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null
57
52
  // eslint-disable-next-line @typescript-eslint/no-explicit-any
@@ -112,14 +107,14 @@ export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWr
112
107
  static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {
113
108
  const stringToHash = this.stringifyHashFields(obj)
114
109
 
115
- if (PayloadHasher.allowSubtle) {
110
+ if (ObjectHasher.allowSubtle) {
116
111
  try {
117
112
  const enc = new TextEncoder()
118
113
  const data = enc.encode(stringToHash)
119
114
  const hashArray = await this.subtleHash(data)
120
115
  return hexFromArrayBuffer(hashArray, { bitLength: 256 })
121
116
  } catch {
122
- PayloadHasher.allowSubtle = false
117
+ ObjectHasher.allowSubtle = false
123
118
  }
124
119
  }
125
120
 
@@ -205,3 +200,6 @@ export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWr
205
200
  return PayloadHasher.json(this.obj, meta)
206
201
  }
207
202
  }
203
+
204
+ /** @deprecated use PayloadBuilder or ObjectHasher instead */
205
+ export class PayloadHasher<T extends object> extends ObjectHasher<T> {}
@@ -1,3 +1,4 @@
1
- export { BrowserPayloadHasher as PayloadHasher } from './BrowserPayloadHasher.ts'
1
+ export { BrowserObjectHasher as ObjectHasher } from './BrowserObjectHasher.ts'
2
+ export { BrowserPayloadHasher as PayloadHasher } from './BrowserObjectHasher.ts'
2
3
  export * from './removeEmptyFields.ts'
3
4
  export * from './sortFields.ts'
package/src/index.ts CHANGED
@@ -1,4 +1,5 @@
1
1
  export * from './hasEmptyFields.ts'
2
+ export { NodeObjectHasher as ObjectHasher } from './NodePayloadHasher.ts'
2
3
  export { NodePayloadHasher as PayloadHasher } from './NodePayloadHasher.ts'
3
4
  export * from './removeEmptyFields.ts'
4
5
  export * from './sortFields.ts'
@@ -1,8 +0,0 @@
1
- import { PayloadHasher } from './PayloadHasher.ts';
2
- export declare class BrowserPayloadHasher extends PayloadHasher {
3
- static createBrowserWorker: (url?: URL) => import("@xylabs/threads/master").WorkerImplementation | undefined;
4
- static createNodeWorker: (func?: () => unknown) => import("@xylabs/threads/master").WorkerImplementation | undefined;
5
- static subtleHashWorkerUrl: import("url").URL | undefined;
6
- static wasmHashWorkerUrl: import("url").URL | undefined;
7
- }
8
- //# sourceMappingURL=BrowserPayloadHasher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserPayloadHasher.d.ts","sourceRoot":"","sources":["../../src/BrowserPayloadHasher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOlD,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAgB,mBAAmB,mFAAsB;IACzD,OAAgB,gBAAgB,8FAAmB;IACnD,OAAgB,mBAAmB,gCAM/B;IAEJ,OAAgB,iBAAiB,gCAM7B;CACL"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { PayloadHasher } from './PayloadHasher.ts';
2
- export declare class BrowserPayloadHasher extends PayloadHasher {
3
- static createBrowserWorker: (url?: URL) => import("@xylabs/threads/master").WorkerImplementation | undefined;
4
- static createNodeWorker: (func?: () => unknown) => import("@xylabs/threads/master").WorkerImplementation | undefined;
5
- static subtleHashWorkerUrl: import("url").URL | undefined;
6
- static wasmHashWorkerUrl: import("url").URL | undefined;
7
- }
8
- //# sourceMappingURL=BrowserPayloadHasher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserPayloadHasher.d.ts","sourceRoot":"","sources":["../../src/BrowserPayloadHasher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOlD,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAgB,mBAAmB,mFAAsB;IACzD,OAAgB,gBAAgB,8FAAmB;IACnD,OAAgB,mBAAmB,gCAM/B;IAEJ,OAAgB,iBAAiB,gCAM7B;CACL"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
@@ -1,8 +0,0 @@
1
- import { PayloadHasher } from './PayloadHasher.ts';
2
- export declare class BrowserPayloadHasher extends PayloadHasher {
3
- static createBrowserWorker: (url?: URL) => import("@xylabs/threads/master").WorkerImplementation | undefined;
4
- static createNodeWorker: (func?: () => unknown) => import("@xylabs/threads/master").WorkerImplementation | undefined;
5
- static subtleHashWorkerUrl: import("url").URL | undefined;
6
- static wasmHashWorkerUrl: import("url").URL | undefined;
7
- }
8
- //# sourceMappingURL=BrowserPayloadHasher.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"BrowserPayloadHasher.d.ts","sourceRoot":"","sources":["../../src/BrowserPayloadHasher.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AAOlD,qBAAa,oBAAqB,SAAQ,aAAa;IACrD,OAAgB,mBAAmB,mFAAsB;IACzD,OAAgB,gBAAgB,8FAAmB;IACnD,OAAgB,mBAAmB,gCAM/B;IAEJ,OAAgB,iBAAiB,gCAM7B;CACL"}
@@ -1 +0,0 @@
1
- {"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}