@xyo-network/hash 7.0.2 → 7.0.3
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/index-browser.mjs +1 -1
- package/dist/browser/index-browser.mjs.map +2 -2
- package/dist/browser/sortFields.d.ts.map +1 -1
- package/dist/neutral/index-browser.mjs +1 -1
- package/dist/neutral/index-browser.mjs.map +2 -2
- package/dist/neutral/sortFields.d.ts.map +1 -1
- package/dist/node/index.mjs +1 -1
- package/dist/node/index.mjs.map +2 -2
- package/dist/node/sortFields.d.ts.map +1 -1
- package/package.json +6 -4
- package/dist/browser/index.mjs +0 -279
- package/dist/browser/index.mjs.map +0 -7
- package/dist/neutral/index.mjs +0 -279
- package/dist/neutral/index.mjs.map +0 -7
|
@@ -68,7 +68,7 @@ var subSort = (value) => {
|
|
|
68
68
|
var sortFields = (obj) => {
|
|
69
69
|
const result = {};
|
|
70
70
|
const keys = Object.keys(obj);
|
|
71
|
-
for (const key of keys.toSorted(
|
|
71
|
+
for (const key of keys.toSorted()) {
|
|
72
72
|
result[key] = subSort(obj[key]);
|
|
73
73
|
}
|
|
74
74
|
return result;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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"],
|
|
4
|
-
"sourcesContent": ["import { Worker } from '@xylabs/threads/master'\n\nexport const createBrowserWorker = (url?: URL): Worker => {\n try {\n return new Worker(url as unknown as string)\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n", "import { Worker } from '@xylabs/threads/master'\n\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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((a, b) => String(a).localeCompare(String(b)))) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
-
"mappings": ";;;;;;;;AAAA,SAAS,cAAc;AAEhB,IAAM,sBAAsB,CAAC,QAAsB;AACxD,MAAI;AACF,WAAO,IAAI,OAAO,GAAwB;AAAA,EAC5C,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACRA,SAAS,UAAAA,eAAc;AAIhB,IAAM,mBAAmB,CAAC,SAAiC;AAChE,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK;AAC1C,WAAO,IAAIA;AAAA,MACT;AAAA,MACA,EAAE,YAAY,KAAK;AAAA,IACrB;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACbA;AAAA,EACE;AAAA,EAAQ;AAAA,EACR;AAAA,EAAoB;AAAA,EAAe;AAAA,OAC9B;AAEP,SAAS,MAAM,aAAa;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,cAAc;;;ACPvB,SAAS,cAAc;AAEhB,IAAM,oBAAoB,CAAwB,QAAc;AACrE,MAAI,OAAO,KAAM,QAAO;AAExB,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAM,MAAM;AACZ,WAAO,IAAI,IAAI,WAAU,OAAO,UAAU,WAAW,kBAAkB,KAAgC,IAAI,KAAM;AAAA,EACnH;AAEA,QAAM,YAAuB,CAAC;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,OAAO,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;;;ACnBA,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;
|
|
4
|
+
"sourcesContent": ["import { Worker } from '@xylabs/threads/master'\n\nexport const createBrowserWorker = (url?: URL): Worker => {\n try {\n return new Worker(url as unknown as string)\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n", "import { Worker } from '@xylabs/threads/master'\n\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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 // Use default UTF-16 code-unit ordering \u2014 not localeCompare. Locale-aware sorting\n // places \"_\" before \"$\", which breaks stable payload hashes for schema definitions\n // that mix $-prefixed and _-prefixed property names (e.g. storage-meta schemas).\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Worker", "sha256", "asHash"]
|
|
7
7
|
}
|
|
@@ -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,
|
|
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,KASrC,CAClB,CAAA"}
|
|
@@ -68,7 +68,7 @@ var subSort = (value) => {
|
|
|
68
68
|
var sortFields = (obj) => {
|
|
69
69
|
const result = {};
|
|
70
70
|
const keys = Object.keys(obj);
|
|
71
|
-
for (const key of keys.toSorted(
|
|
71
|
+
for (const key of keys.toSorted()) {
|
|
72
72
|
result[key] = subSort(obj[key]);
|
|
73
73
|
}
|
|
74
74
|
return result;
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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"],
|
|
4
|
-
"sourcesContent": ["import { Worker } from '@xylabs/threads/master'\n\nexport const createBrowserWorker = (url?: URL): Worker => {\n try {\n return new Worker(url as unknown as string)\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n", "import { Worker } from '@xylabs/threads/master'\n\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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((a, b) => String(a).localeCompare(String(b)))) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
-
"mappings": ";;;;;;;;AAAA,SAAS,cAAc;AAEhB,IAAM,sBAAsB,CAAC,QAAsB;AACxD,MAAI;AACF,WAAO,IAAI,OAAO,GAAwB;AAAA,EAC5C,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACRA,SAAS,UAAAA,eAAc;AAIhB,IAAM,mBAAmB,CAAC,SAAiC;AAChE,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK;AAC1C,WAAO,IAAIA;AAAA,MACT;AAAA,MACA,EAAE,YAAY,KAAK;AAAA,IACrB;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACbA;AAAA,EACE;AAAA,EAAQ;AAAA,EACR;AAAA,EAAoB;AAAA,EAAe;AAAA,OAC9B;AAEP,SAAS,MAAM,aAAa;AAC5B,SAAS,mBAAmB;AAC5B,SAAS,cAAc;;;ACPvB,SAAS,cAAc;AAEhB,IAAM,oBAAoB,CAAwB,QAAc;AACrE,MAAI,OAAO,KAAM,QAAO;AAExB,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,UAAM,MAAM;AACZ,WAAO,IAAI,IAAI,WAAU,OAAO,UAAU,WAAW,kBAAkB,KAAgC,IAAI,KAAM;AAAA,EACnH;AAEA,QAAM,YAAuB,CAAC;AAC9B,aAAW,CAAC,KAAK,KAAK,KAAK,OAAO,QAAQ,GAAG,GAAG;AAC9C,QAAI,OAAO,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;;;ACnBA,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;
|
|
4
|
+
"sourcesContent": ["import { Worker } from '@xylabs/threads/master'\n\nexport const createBrowserWorker = (url?: URL): Worker => {\n try {\n return new Worker(url as unknown as string)\n } catch {\n throw new Error('Unable to create worker')\n }\n}\n", "import { Worker } from '@xylabs/threads/master'\n\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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 // Use default UTF-16 code-unit ordering \u2014 not localeCompare. Locale-aware sorting\n // places \"_\" before \"$\", which breaks stable payload hashes for schema definitions\n // that mix $-prefixed and _-prefixed property names (e.g. storage-meta schemas).\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["Worker", "sha256", "asHash"]
|
|
7
7
|
}
|
|
@@ -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,
|
|
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,KASrC,CAClB,CAAA"}
|
package/dist/node/index.mjs
CHANGED
|
@@ -73,7 +73,7 @@ var subSort = (value) => {
|
|
|
73
73
|
var sortFields = (obj) => {
|
|
74
74
|
const result = {};
|
|
75
75
|
const keys = Object.keys(obj);
|
|
76
|
-
for (const key of keys.toSorted(
|
|
76
|
+
for (const key of keys.toSorted()) {
|
|
77
77
|
result[key] = subSort(obj[key]);
|
|
78
78
|
}
|
|
79
79
|
return result;
|
package/dist/node/index.mjs.map
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
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"],
|
|
4
|
-
"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\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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((a, b) => String(a).localeCompare(String(b)))) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
-
"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;AAIhB,IAAM,mBAAmB,CAAC,SAAiC;AAChE,MAAI;AACF,UAAM,OAAO,MAAM,SAAS,EAAE,MAAM,CAAC,KAAK;AAC1C,WAAO,IAAI;AAAA,MACT;AAAA,MACA,EAAE,YAAY,KAAK;AAAA,IACrB;AAAA,EACF,QAAQ;AACN,UAAM,IAAI,MAAM,yBAAyB;AAAA,EAC3C;AACF;;;ACbA;AAAA,EACE;AAAA,EAAQ;AAAA,EACR;AAAA,EAAoB;AAAA,EAAe;AAAA,OAC9B;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,UAAM,MAAM;AACZ,WAAO,IAAI,IAAI,WAAU,OAAO,UAAU,WAAW,kBAAkB,KAAgC,IAAI,KAAM;AAAA,EACnH;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;;;ACnBA,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;
|
|
4
|
+
"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\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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 // Use default UTF-16 code-unit ordering \u2014 not localeCompare. Locale-aware sorting\n // places \"_\" before \"$\", which breaks stable payload hashes for schema definitions\n // that mix $-prefixed and _-prefixed property names (e.g. storage-meta schemas).\n for (const key of keys.toSorted()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["typeOf", "sha256", "asHash"]
|
|
7
7
|
}
|
|
@@ -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,
|
|
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,KASrC,CAClB,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@xyo-network/hash",
|
|
3
|
-
"version": "7.0.
|
|
3
|
+
"version": "7.0.3",
|
|
4
4
|
"description": "Primary SDK for using XYO Protocol 2.0",
|
|
5
5
|
"homepage": "https://xyo.network",
|
|
6
6
|
"bugs": {
|
|
@@ -21,7 +21,6 @@
|
|
|
21
21
|
"type": "module",
|
|
22
22
|
"exports": {
|
|
23
23
|
".": {
|
|
24
|
-
"types": "./dist/neutral/index.d.ts",
|
|
25
24
|
"browser": {
|
|
26
25
|
"types": "./dist/browser/index-browser.d.ts",
|
|
27
26
|
"default": "./dist/browser/index-browser.mjs"
|
|
@@ -30,7 +29,10 @@
|
|
|
30
29
|
"types": "./dist/node/index.d.ts",
|
|
31
30
|
"default": "./dist/node/index.mjs"
|
|
32
31
|
},
|
|
33
|
-
"default":
|
|
32
|
+
"default": {
|
|
33
|
+
"types": "./dist/neutral/index-browser.d.ts",
|
|
34
|
+
"default": "./dist/neutral/index-browser.mjs"
|
|
35
|
+
}
|
|
34
36
|
},
|
|
35
37
|
"./worker/subtleHash-bundle.mjs": {
|
|
36
38
|
"browser": "./dist/browser/worker/subtleHash-bundle.mjs"
|
|
@@ -48,7 +50,7 @@
|
|
|
48
50
|
"README.md"
|
|
49
51
|
],
|
|
50
52
|
"dependencies": {
|
|
51
|
-
"@xyo-network/wasm": "~7.0.
|
|
53
|
+
"@xyo-network/wasm": "~7.0.3"
|
|
52
54
|
},
|
|
53
55
|
"devDependencies": {
|
|
54
56
|
"@opentelemetry/api": "^1.9.1",
|
package/dist/browser/index.mjs
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
// src/hasEmptyFields.ts
|
|
9
|
-
import { typeOf } from "@xylabs/sdk-js";
|
|
10
|
-
var hasEmptyFields = (obj) => {
|
|
11
|
-
if (obj == null || Array.isArray(obj)) return false;
|
|
12
|
-
if (obj == void 0 || Object.keys(obj).length === 0) return true;
|
|
13
|
-
for (const [value] of Object.values(obj)) {
|
|
14
|
-
if (typeOf(value) === "object") {
|
|
15
|
-
if (hasEmptyFields(value)) return true;
|
|
16
|
-
} else if (value === void 0) {
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return false;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// src/createNodeWorker.ts
|
|
24
|
-
import { Worker } from "@xylabs/threads/master";
|
|
25
|
-
var createNodeWorker = (func) => {
|
|
26
|
-
try {
|
|
27
|
-
const code = func?.toString().slice(6) ?? "";
|
|
28
|
-
return new Worker(
|
|
29
|
-
code,
|
|
30
|
-
{ fromSource: true }
|
|
31
|
-
);
|
|
32
|
-
} catch {
|
|
33
|
-
throw new Error("Unable to create worker");
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// src/ObjectHasher.ts
|
|
38
|
-
import {
|
|
39
|
-
asHash,
|
|
40
|
-
assertEx,
|
|
41
|
-
hexFromArrayBuffer,
|
|
42
|
-
ObjectWrapper,
|
|
43
|
-
omitBy
|
|
44
|
-
} from "@xylabs/sdk-js";
|
|
45
|
-
import { Pool, spawn } from "@xylabs/threads/master";
|
|
46
|
-
import { WasmSupport } from "@xyo-network/wasm";
|
|
47
|
-
import { sha256 } from "hash-wasm";
|
|
48
|
-
|
|
49
|
-
// src/removeEmptyFields.ts
|
|
50
|
-
import { typeOf as typeOf2 } from "@xylabs/sdk-js";
|
|
51
|
-
var removeEmptyFields = (obj) => {
|
|
52
|
-
if (obj == null) return obj;
|
|
53
|
-
if (Array.isArray(obj)) {
|
|
54
|
-
const arr = obj;
|
|
55
|
-
return arr.map((value) => typeof value === "object" ? removeEmptyFields(value) : value);
|
|
56
|
-
}
|
|
57
|
-
const newObject = {};
|
|
58
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
59
|
-
if (typeOf2(value) === "object") {
|
|
60
|
-
newObject[key] = removeEmptyFields(value);
|
|
61
|
-
} else if (value !== void 0) {
|
|
62
|
-
newObject[key] = value;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return newObject;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// src/sortFields.ts
|
|
69
|
-
import { isObject } from "@xylabs/sdk-js";
|
|
70
|
-
var subSort = (value) => {
|
|
71
|
-
return isObject(value) ? sortFields(value) : value;
|
|
72
|
-
};
|
|
73
|
-
var sortFields = (obj) => {
|
|
74
|
-
const result = {};
|
|
75
|
-
const keys = Object.keys(obj);
|
|
76
|
-
for (const key of keys.toSorted((a, b) => String(a).localeCompare(String(b)))) {
|
|
77
|
-
result[key] = subSort(obj[key]);
|
|
78
|
-
}
|
|
79
|
-
return result;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
// src/worker/subtleHashNode.ts
|
|
83
|
-
var subtleHashFunc = () => {
|
|
84
|
-
const { subtle } = __require("@xylabs/platform");
|
|
85
|
-
const { expose } = __require("@xylabs/threads/worker");
|
|
86
|
-
expose({ hash: async (data) => await subtle.digest("SHA-256", data) });
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// src/worker/wasmHashNode.ts
|
|
90
|
-
var wasmHashFunc = () => {
|
|
91
|
-
const { sha256: sha2562 } = __require("hash-wasm");
|
|
92
|
-
const { asHash: asHash2 } = __require("@xylabs/hex");
|
|
93
|
-
const { expose } = __require("@xylabs/threads/worker");
|
|
94
|
-
expose({ hash: async (data) => asHash2(await sha2562(data), true) });
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
// src/ObjectHasher.ts
|
|
98
|
-
var wasmSupportStatic = new WasmSupport(["bigInt"]);
|
|
99
|
-
var omitByPredicate = (prefix) => (_, key) => {
|
|
100
|
-
assertEx(typeof key === "string", () => `Invalid key type [${String(key)}, ${typeof key}]`);
|
|
101
|
-
return String(key).startsWith(prefix);
|
|
102
|
-
};
|
|
103
|
-
var ObjectHasher = class _ObjectHasher extends ObjectWrapper {
|
|
104
|
-
static allowHashPooling = true;
|
|
105
|
-
static allowSubtle = true;
|
|
106
|
-
static createBrowserWorker;
|
|
107
|
-
static createNodeWorker;
|
|
108
|
-
static subtleHashWorkerUrl;
|
|
109
|
-
static warnIfUsingJsHash = true;
|
|
110
|
-
static wasmHashWorkerUrl;
|
|
111
|
-
static wasmInitialized = wasmSupportStatic.initialize();
|
|
112
|
-
static wasmSupport = wasmSupportStatic;
|
|
113
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
114
|
-
static _subtleHashPool;
|
|
115
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
|
-
static _wasmHashPool;
|
|
117
|
-
static get subtleHashPool() {
|
|
118
|
-
if (!this.allowHashPooling || this._subtleHashPool === null) {
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
return this._subtleHashPool = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null);
|
|
123
|
-
} catch {
|
|
124
|
-
console.warn("Creating subtle hash worker failed");
|
|
125
|
-
this._subtleHashPool = null;
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
static get wasmHashPool() {
|
|
130
|
-
if (!this.allowHashPooling || this._wasmHashPool === null) {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
try {
|
|
134
|
-
return this._wasmHashPool = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null);
|
|
135
|
-
} catch {
|
|
136
|
-
console.warn("Creating wasm hash worker failed");
|
|
137
|
-
this._wasmHashPool = null;
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
static createWorker(url, func) {
|
|
142
|
-
if (url) console.debug(`createWorker: ${url.href}`);
|
|
143
|
-
return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => "Unable to create worker");
|
|
144
|
-
}
|
|
145
|
-
static async filterExcludeByHash(objs = [], hash) {
|
|
146
|
-
const hashes = Array.isArray(hash) ? hash : [hash];
|
|
147
|
-
const pairs = await this.hashPairs(objs);
|
|
148
|
-
return pairs.filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0]);
|
|
149
|
-
}
|
|
150
|
-
static async filterIncludeByHash(objs = [], hash) {
|
|
151
|
-
const hashes = Array.isArray(hash) ? hash : [hash];
|
|
152
|
-
const pairs = await this.hashPairs(objs);
|
|
153
|
-
return pairs.filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0]);
|
|
154
|
-
}
|
|
155
|
-
static async findByHash(objs = [], hash) {
|
|
156
|
-
const pairs = await this.hashPairs(objs);
|
|
157
|
-
return pairs.find(([_, objHash]) => objHash === hash)?.[0];
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Asynchronously hashes a payload
|
|
161
|
-
* @param obj A payload
|
|
162
|
-
* @returns The payload hash
|
|
163
|
-
*/
|
|
164
|
-
static async hash(obj) {
|
|
165
|
-
const stringToHash = this.stringifyHashFields(obj);
|
|
166
|
-
const enc = new TextEncoder();
|
|
167
|
-
const data = enc.encode(stringToHash);
|
|
168
|
-
if (_ObjectHasher.allowSubtle) {
|
|
169
|
-
try {
|
|
170
|
-
const hashArray = await this.subtleHash(data);
|
|
171
|
-
return hexFromArrayBuffer(hashArray, { bitLength: 256 });
|
|
172
|
-
} catch {
|
|
173
|
-
_ObjectHasher.allowSubtle = false;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
await this.wasmInitialized;
|
|
177
|
-
if (_ObjectHasher.wasmSupport.canUseWasm) {
|
|
178
|
-
try {
|
|
179
|
-
return await this.wasmHash(data);
|
|
180
|
-
} catch {
|
|
181
|
-
_ObjectHasher.wasmSupport.allowWasm = false;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
throw new Error("No subtle or wasm hashing available");
|
|
185
|
-
}
|
|
186
|
-
static async hashBytes(bytes) {
|
|
187
|
-
const bytesArray = new Uint8Array(bytes);
|
|
188
|
-
if (_ObjectHasher.allowSubtle) {
|
|
189
|
-
const hashArray = await this.subtleHash(bytesArray);
|
|
190
|
-
return hexFromArrayBuffer(hashArray, { bitLength: 256 });
|
|
191
|
-
}
|
|
192
|
-
await this.wasmInitialized;
|
|
193
|
-
if (_ObjectHasher.wasmSupport.canUseWasm) {
|
|
194
|
-
return await this.wasmHash(bytesArray);
|
|
195
|
-
}
|
|
196
|
-
throw new Error("No subtle or wasm hashing available");
|
|
197
|
-
}
|
|
198
|
-
static hashFields(obj) {
|
|
199
|
-
const filtered = omitBy(obj, omitByPredicate("_"));
|
|
200
|
-
const cleaned = removeEmptyFields(filtered);
|
|
201
|
-
return sortFields(cleaned);
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
205
|
-
* @param objs Any array of payloads
|
|
206
|
-
* @returns An array of payload/hash tuples
|
|
207
|
-
*/
|
|
208
|
-
static async hashPairs(objs) {
|
|
209
|
-
return await Promise.all(objs.map(async (obj) => [obj, await this.hash(obj)]));
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Creates an array of payload hashes based on the payloads passed in
|
|
213
|
-
* @param objs Any array of payloads
|
|
214
|
-
* @returns An array of payload hashes
|
|
215
|
-
*/
|
|
216
|
-
static async hashes(objs) {
|
|
217
|
-
return objs ? await Promise.all(objs.map((obj) => this.hash(obj))) : void 0;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Returns a clone of the payload that is JSON safe
|
|
221
|
-
* @param obj A payload
|
|
222
|
-
* @param meta Keeps underscore (meta) fields if set to true
|
|
223
|
-
* @returns Returns a clone of the payload that is JSON safe
|
|
224
|
-
*/
|
|
225
|
-
static json(payload, meta = false) {
|
|
226
|
-
const source = meta ? payload : omitBy(payload, omitByPredicate("_"));
|
|
227
|
-
const cleaned = removeEmptyFields(source);
|
|
228
|
-
return sortFields(cleaned);
|
|
229
|
-
}
|
|
230
|
-
/** @deprecated us JSON instead */
|
|
231
|
-
static jsonPayload(payload, meta = false) {
|
|
232
|
-
return this.json(payload, meta);
|
|
233
|
-
}
|
|
234
|
-
static stringifyHashFields(obj) {
|
|
235
|
-
return JSON.stringify(this.hashFields(obj));
|
|
236
|
-
}
|
|
237
|
-
static async subtleHash(data) {
|
|
238
|
-
const pool = this.subtleHashPool;
|
|
239
|
-
if (pool === null) return await globalThis.crypto.subtle.digest("SHA-256", data);
|
|
240
|
-
const result = await pool.queue(async (thread) => await thread.hash(data));
|
|
241
|
-
return result;
|
|
242
|
-
}
|
|
243
|
-
static async wasmHash(data) {
|
|
244
|
-
const pool = this.wasmHashPool;
|
|
245
|
-
if (pool === null) return asHash(await sha256(data), true);
|
|
246
|
-
const result = await pool.queue(async (thread) => await thread.hash(data));
|
|
247
|
-
return result;
|
|
248
|
-
}
|
|
249
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
|
-
static createWorkerPool(url, func, size = 8) {
|
|
251
|
-
if (url) console.debug(`createWorkerPool: ${url.href}`);
|
|
252
|
-
const createFunc = () => spawn(this.createWorker(url, func));
|
|
253
|
-
return Pool(createFunc, size);
|
|
254
|
-
}
|
|
255
|
-
async hash() {
|
|
256
|
-
return await _ObjectHasher.hash(this.obj);
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Returns a clone of the payload that is JSON safe
|
|
260
|
-
* @param meta Keeps underscore (meta) fields if set to true
|
|
261
|
-
* @returns Returns a clone of the payload that is JSON safe
|
|
262
|
-
*/
|
|
263
|
-
json(meta = false) {
|
|
264
|
-
return _ObjectHasher.json(this.obj, meta);
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
// src/NodeObjectHasher.ts
|
|
269
|
-
ObjectHasher.createNodeWorker = createNodeWorker;
|
|
270
|
-
var NodeObjectHasher = class extends ObjectHasher {
|
|
271
|
-
static createNodeWorker = createNodeWorker;
|
|
272
|
-
};
|
|
273
|
-
export {
|
|
274
|
-
NodeObjectHasher as ObjectHasher,
|
|
275
|
-
hasEmptyFields,
|
|
276
|
-
removeEmptyFields,
|
|
277
|
-
sortFields
|
|
278
|
-
};
|
|
279
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
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"],
|
|
4
|
-
"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\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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((a, b) => String(a).localeCompare(String(b)))) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["typeOf", "sha256", "asHash"]
|
|
7
|
-
}
|
package/dist/neutral/index.mjs
DELETED
|
@@ -1,279 +0,0 @@
|
|
|
1
|
-
var __require = /* @__PURE__ */ ((x) => typeof require !== "undefined" ? require : typeof Proxy !== "undefined" ? new Proxy(x, {
|
|
2
|
-
get: (a, b) => (typeof require !== "undefined" ? require : a)[b]
|
|
3
|
-
}) : x)(function(x) {
|
|
4
|
-
if (typeof require !== "undefined") return require.apply(this, arguments);
|
|
5
|
-
throw Error('Dynamic require of "' + x + '" is not supported');
|
|
6
|
-
});
|
|
7
|
-
|
|
8
|
-
// src/hasEmptyFields.ts
|
|
9
|
-
import { typeOf } from "@xylabs/sdk-js";
|
|
10
|
-
var hasEmptyFields = (obj) => {
|
|
11
|
-
if (obj == null || Array.isArray(obj)) return false;
|
|
12
|
-
if (obj == void 0 || Object.keys(obj).length === 0) return true;
|
|
13
|
-
for (const [value] of Object.values(obj)) {
|
|
14
|
-
if (typeOf(value) === "object") {
|
|
15
|
-
if (hasEmptyFields(value)) return true;
|
|
16
|
-
} else if (value === void 0) {
|
|
17
|
-
return true;
|
|
18
|
-
}
|
|
19
|
-
}
|
|
20
|
-
return false;
|
|
21
|
-
};
|
|
22
|
-
|
|
23
|
-
// src/createNodeWorker.ts
|
|
24
|
-
import { Worker } from "@xylabs/threads/master";
|
|
25
|
-
var createNodeWorker = (func) => {
|
|
26
|
-
try {
|
|
27
|
-
const code = func?.toString().slice(6) ?? "";
|
|
28
|
-
return new Worker(
|
|
29
|
-
code,
|
|
30
|
-
{ fromSource: true }
|
|
31
|
-
);
|
|
32
|
-
} catch {
|
|
33
|
-
throw new Error("Unable to create worker");
|
|
34
|
-
}
|
|
35
|
-
};
|
|
36
|
-
|
|
37
|
-
// src/ObjectHasher.ts
|
|
38
|
-
import {
|
|
39
|
-
asHash,
|
|
40
|
-
assertEx,
|
|
41
|
-
hexFromArrayBuffer,
|
|
42
|
-
ObjectWrapper,
|
|
43
|
-
omitBy
|
|
44
|
-
} from "@xylabs/sdk-js";
|
|
45
|
-
import { Pool, spawn } from "@xylabs/threads/master";
|
|
46
|
-
import { WasmSupport } from "@xyo-network/wasm";
|
|
47
|
-
import { sha256 } from "hash-wasm";
|
|
48
|
-
|
|
49
|
-
// src/removeEmptyFields.ts
|
|
50
|
-
import { typeOf as typeOf2 } from "@xylabs/sdk-js";
|
|
51
|
-
var removeEmptyFields = (obj) => {
|
|
52
|
-
if (obj == null) return obj;
|
|
53
|
-
if (Array.isArray(obj)) {
|
|
54
|
-
const arr = obj;
|
|
55
|
-
return arr.map((value) => typeof value === "object" ? removeEmptyFields(value) : value);
|
|
56
|
-
}
|
|
57
|
-
const newObject = {};
|
|
58
|
-
for (const [key, value] of Object.entries(obj)) {
|
|
59
|
-
if (typeOf2(value) === "object") {
|
|
60
|
-
newObject[key] = removeEmptyFields(value);
|
|
61
|
-
} else if (value !== void 0) {
|
|
62
|
-
newObject[key] = value;
|
|
63
|
-
}
|
|
64
|
-
}
|
|
65
|
-
return newObject;
|
|
66
|
-
};
|
|
67
|
-
|
|
68
|
-
// src/sortFields.ts
|
|
69
|
-
import { isObject } from "@xylabs/sdk-js";
|
|
70
|
-
var subSort = (value) => {
|
|
71
|
-
return isObject(value) ? sortFields(value) : value;
|
|
72
|
-
};
|
|
73
|
-
var sortFields = (obj) => {
|
|
74
|
-
const result = {};
|
|
75
|
-
const keys = Object.keys(obj);
|
|
76
|
-
for (const key of keys.toSorted((a, b) => String(a).localeCompare(String(b)))) {
|
|
77
|
-
result[key] = subSort(obj[key]);
|
|
78
|
-
}
|
|
79
|
-
return result;
|
|
80
|
-
};
|
|
81
|
-
|
|
82
|
-
// src/worker/subtleHashNode.ts
|
|
83
|
-
var subtleHashFunc = () => {
|
|
84
|
-
const { subtle } = __require("@xylabs/platform");
|
|
85
|
-
const { expose } = __require("@xylabs/threads/worker");
|
|
86
|
-
expose({ hash: async (data) => await subtle.digest("SHA-256", data) });
|
|
87
|
-
};
|
|
88
|
-
|
|
89
|
-
// src/worker/wasmHashNode.ts
|
|
90
|
-
var wasmHashFunc = () => {
|
|
91
|
-
const { sha256: sha2562 } = __require("hash-wasm");
|
|
92
|
-
const { asHash: asHash2 } = __require("@xylabs/hex");
|
|
93
|
-
const { expose } = __require("@xylabs/threads/worker");
|
|
94
|
-
expose({ hash: async (data) => asHash2(await sha2562(data), true) });
|
|
95
|
-
};
|
|
96
|
-
|
|
97
|
-
// src/ObjectHasher.ts
|
|
98
|
-
var wasmSupportStatic = new WasmSupport(["bigInt"]);
|
|
99
|
-
var omitByPredicate = (prefix) => (_, key) => {
|
|
100
|
-
assertEx(typeof key === "string", () => `Invalid key type [${String(key)}, ${typeof key}]`);
|
|
101
|
-
return String(key).startsWith(prefix);
|
|
102
|
-
};
|
|
103
|
-
var ObjectHasher = class _ObjectHasher extends ObjectWrapper {
|
|
104
|
-
static allowHashPooling = true;
|
|
105
|
-
static allowSubtle = true;
|
|
106
|
-
static createBrowserWorker;
|
|
107
|
-
static createNodeWorker;
|
|
108
|
-
static subtleHashWorkerUrl;
|
|
109
|
-
static warnIfUsingJsHash = true;
|
|
110
|
-
static wasmHashWorkerUrl;
|
|
111
|
-
static wasmInitialized = wasmSupportStatic.initialize();
|
|
112
|
-
static wasmSupport = wasmSupportStatic;
|
|
113
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
114
|
-
static _subtleHashPool;
|
|
115
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
116
|
-
static _wasmHashPool;
|
|
117
|
-
static get subtleHashPool() {
|
|
118
|
-
if (!this.allowHashPooling || this._subtleHashPool === null) {
|
|
119
|
-
return null;
|
|
120
|
-
}
|
|
121
|
-
try {
|
|
122
|
-
return this._subtleHashPool = this._subtleHashPool ?? (this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null);
|
|
123
|
-
} catch {
|
|
124
|
-
console.warn("Creating subtle hash worker failed");
|
|
125
|
-
this._subtleHashPool = null;
|
|
126
|
-
return null;
|
|
127
|
-
}
|
|
128
|
-
}
|
|
129
|
-
static get wasmHashPool() {
|
|
130
|
-
if (!this.allowHashPooling || this._wasmHashPool === null) {
|
|
131
|
-
return null;
|
|
132
|
-
}
|
|
133
|
-
try {
|
|
134
|
-
return this._wasmHashPool = this._wasmHashPool ?? (this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null);
|
|
135
|
-
} catch {
|
|
136
|
-
console.warn("Creating wasm hash worker failed");
|
|
137
|
-
this._wasmHashPool = null;
|
|
138
|
-
return null;
|
|
139
|
-
}
|
|
140
|
-
}
|
|
141
|
-
static createWorker(url, func) {
|
|
142
|
-
if (url) console.debug(`createWorker: ${url.href}`);
|
|
143
|
-
return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), () => "Unable to create worker");
|
|
144
|
-
}
|
|
145
|
-
static async filterExcludeByHash(objs = [], hash) {
|
|
146
|
-
const hashes = Array.isArray(hash) ? hash : [hash];
|
|
147
|
-
const pairs = await this.hashPairs(objs);
|
|
148
|
-
return pairs.filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0]);
|
|
149
|
-
}
|
|
150
|
-
static async filterIncludeByHash(objs = [], hash) {
|
|
151
|
-
const hashes = Array.isArray(hash) ? hash : [hash];
|
|
152
|
-
const pairs = await this.hashPairs(objs);
|
|
153
|
-
return pairs.filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0]);
|
|
154
|
-
}
|
|
155
|
-
static async findByHash(objs = [], hash) {
|
|
156
|
-
const pairs = await this.hashPairs(objs);
|
|
157
|
-
return pairs.find(([_, objHash]) => objHash === hash)?.[0];
|
|
158
|
-
}
|
|
159
|
-
/**
|
|
160
|
-
* Asynchronously hashes a payload
|
|
161
|
-
* @param obj A payload
|
|
162
|
-
* @returns The payload hash
|
|
163
|
-
*/
|
|
164
|
-
static async hash(obj) {
|
|
165
|
-
const stringToHash = this.stringifyHashFields(obj);
|
|
166
|
-
const enc = new TextEncoder();
|
|
167
|
-
const data = enc.encode(stringToHash);
|
|
168
|
-
if (_ObjectHasher.allowSubtle) {
|
|
169
|
-
try {
|
|
170
|
-
const hashArray = await this.subtleHash(data);
|
|
171
|
-
return hexFromArrayBuffer(hashArray, { bitLength: 256 });
|
|
172
|
-
} catch {
|
|
173
|
-
_ObjectHasher.allowSubtle = false;
|
|
174
|
-
}
|
|
175
|
-
}
|
|
176
|
-
await this.wasmInitialized;
|
|
177
|
-
if (_ObjectHasher.wasmSupport.canUseWasm) {
|
|
178
|
-
try {
|
|
179
|
-
return await this.wasmHash(data);
|
|
180
|
-
} catch {
|
|
181
|
-
_ObjectHasher.wasmSupport.allowWasm = false;
|
|
182
|
-
}
|
|
183
|
-
}
|
|
184
|
-
throw new Error("No subtle or wasm hashing available");
|
|
185
|
-
}
|
|
186
|
-
static async hashBytes(bytes) {
|
|
187
|
-
const bytesArray = new Uint8Array(bytes);
|
|
188
|
-
if (_ObjectHasher.allowSubtle) {
|
|
189
|
-
const hashArray = await this.subtleHash(bytesArray);
|
|
190
|
-
return hexFromArrayBuffer(hashArray, { bitLength: 256 });
|
|
191
|
-
}
|
|
192
|
-
await this.wasmInitialized;
|
|
193
|
-
if (_ObjectHasher.wasmSupport.canUseWasm) {
|
|
194
|
-
return await this.wasmHash(bytesArray);
|
|
195
|
-
}
|
|
196
|
-
throw new Error("No subtle or wasm hashing available");
|
|
197
|
-
}
|
|
198
|
-
static hashFields(obj) {
|
|
199
|
-
const filtered = omitBy(obj, omitByPredicate("_"));
|
|
200
|
-
const cleaned = removeEmptyFields(filtered);
|
|
201
|
-
return sortFields(cleaned);
|
|
202
|
-
}
|
|
203
|
-
/**
|
|
204
|
-
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
205
|
-
* @param objs Any array of payloads
|
|
206
|
-
* @returns An array of payload/hash tuples
|
|
207
|
-
*/
|
|
208
|
-
static async hashPairs(objs) {
|
|
209
|
-
return await Promise.all(objs.map(async (obj) => [obj, await this.hash(obj)]));
|
|
210
|
-
}
|
|
211
|
-
/**
|
|
212
|
-
* Creates an array of payload hashes based on the payloads passed in
|
|
213
|
-
* @param objs Any array of payloads
|
|
214
|
-
* @returns An array of payload hashes
|
|
215
|
-
*/
|
|
216
|
-
static async hashes(objs) {
|
|
217
|
-
return objs ? await Promise.all(objs.map((obj) => this.hash(obj))) : void 0;
|
|
218
|
-
}
|
|
219
|
-
/**
|
|
220
|
-
* Returns a clone of the payload that is JSON safe
|
|
221
|
-
* @param obj A payload
|
|
222
|
-
* @param meta Keeps underscore (meta) fields if set to true
|
|
223
|
-
* @returns Returns a clone of the payload that is JSON safe
|
|
224
|
-
*/
|
|
225
|
-
static json(payload, meta = false) {
|
|
226
|
-
const source = meta ? payload : omitBy(payload, omitByPredicate("_"));
|
|
227
|
-
const cleaned = removeEmptyFields(source);
|
|
228
|
-
return sortFields(cleaned);
|
|
229
|
-
}
|
|
230
|
-
/** @deprecated us JSON instead */
|
|
231
|
-
static jsonPayload(payload, meta = false) {
|
|
232
|
-
return this.json(payload, meta);
|
|
233
|
-
}
|
|
234
|
-
static stringifyHashFields(obj) {
|
|
235
|
-
return JSON.stringify(this.hashFields(obj));
|
|
236
|
-
}
|
|
237
|
-
static async subtleHash(data) {
|
|
238
|
-
const pool = this.subtleHashPool;
|
|
239
|
-
if (pool === null) return await globalThis.crypto.subtle.digest("SHA-256", data);
|
|
240
|
-
const result = await pool.queue(async (thread) => await thread.hash(data));
|
|
241
|
-
return result;
|
|
242
|
-
}
|
|
243
|
-
static async wasmHash(data) {
|
|
244
|
-
const pool = this.wasmHashPool;
|
|
245
|
-
if (pool === null) return asHash(await sha256(data), true);
|
|
246
|
-
const result = await pool.queue(async (thread) => await thread.hash(data));
|
|
247
|
-
return result;
|
|
248
|
-
}
|
|
249
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
|
-
static createWorkerPool(url, func, size = 8) {
|
|
251
|
-
if (url) console.debug(`createWorkerPool: ${url.href}`);
|
|
252
|
-
const createFunc = () => spawn(this.createWorker(url, func));
|
|
253
|
-
return Pool(createFunc, size);
|
|
254
|
-
}
|
|
255
|
-
async hash() {
|
|
256
|
-
return await _ObjectHasher.hash(this.obj);
|
|
257
|
-
}
|
|
258
|
-
/**
|
|
259
|
-
* Returns a clone of the payload that is JSON safe
|
|
260
|
-
* @param meta Keeps underscore (meta) fields if set to true
|
|
261
|
-
* @returns Returns a clone of the payload that is JSON safe
|
|
262
|
-
*/
|
|
263
|
-
json(meta = false) {
|
|
264
|
-
return _ObjectHasher.json(this.obj, meta);
|
|
265
|
-
}
|
|
266
|
-
};
|
|
267
|
-
|
|
268
|
-
// src/NodeObjectHasher.ts
|
|
269
|
-
ObjectHasher.createNodeWorker = createNodeWorker;
|
|
270
|
-
var NodeObjectHasher = class extends ObjectHasher {
|
|
271
|
-
static createNodeWorker = createNodeWorker;
|
|
272
|
-
};
|
|
273
|
-
export {
|
|
274
|
-
NodeObjectHasher as ObjectHasher,
|
|
275
|
-
hasEmptyFields,
|
|
276
|
-
removeEmptyFields,
|
|
277
|
-
sortFields
|
|
278
|
-
};
|
|
279
|
-
//# sourceMappingURL=index.mjs.map
|
|
@@ -1,7 +0,0 @@
|
|
|
1
|
-
{
|
|
2
|
-
"version": 3,
|
|
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"],
|
|
4
|
-
"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\ntype WorkerOptions = ConstructorParameters<typeof Worker>[1]\n\nexport const createNodeWorker = (func?: () => unknown): Worker => {\n try {\n const code = func?.toString().slice(6) ?? ''\n return new Worker(\n code,\n { fromSource: true } as unknown as WorkerOptions,\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,\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.href}`)\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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 const pairs = await this.hashPairs(objs)\n return pairs.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 // Base-class static flags are intentionally referenced by name so subclass\n // test overrides on NodeObjectHasher/BrowserObjectHasher do not shadow them.\n /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\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 (ObjectHasher.wasmSupport.canUseWasm) {\n try {\n return await this.wasmHash(data)\n } catch {\n ObjectHasher.wasmSupport.allowWasm = false\n }\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\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 /* eslint-disable unicorn/class-reference-in-static-methods -- shared static config on base class */\n if (ObjectHasher.allowSubtle) {\n const hashArray = await this.subtleHash(bytesArray)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 }) as Hash\n }\n await this.wasmInitialized\n if (ObjectHasher.wasmSupport.canUseWasm) {\n return await this.wasmHash(bytesArray)\n }\n /* eslint-enable unicorn/class-reference-in-static-methods */\n throw new Error('No subtle or wasm hashing available')\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n const filtered = omitBy(obj, omitByPredicate('_'))\n const cleaned = removeEmptyFields(filtered)\n return sortFields(cleaned) 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 this.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 const source = meta ? payload : omitBy(payload, omitByPredicate('_'))\n const cleaned = removeEmptyFields(source)\n return sortFields(cleaned) 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 if (pool === null) return await globalThis.crypto.subtle.digest('SHA-256', data)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as ArrayBuffer\n }\n\n static async wasmHash(data: Uint8Array): Promise<Hash> {\n const pool = this.wasmHashPool\n if (pool === null) return asHash(await sha256(data), true)\n const result: unknown = await pool.queue(async thread => await thread.hash(data))\n return result as Hash\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.href}`)\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 const arr = obj as unknown[]\n return arr.map(value => (typeof value === 'object' ? removeEmptyFields(value as Record<string, unknown>) : 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((a, b) => String(a).localeCompare(String(b)))) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const subtleHashFunc = () => {\n const { subtle } = require<{ subtle: { digest: (algorithm: string, data: ArrayBuffer) => Promise<ArrayBuffer> } }>('@xylabs/platform')\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: ArrayBuffer) => await subtle.digest('SHA-256', data) })\n}\n", "declare const require: <T = unknown>(id: string) => T\n\nexport const wasmHashFunc = () => {\n const { sha256 } = require<{ sha256: (data: string) => Promise<string> }>('hash-wasm')\n const { asHash } = require<{ asHash: (value: string, branded: true) => string }>('@xylabs/hex')\n\n const { expose } = require<{ expose: (api: unknown) => void }>('@xylabs/threads/worker')\n\n expose({ hash: async (data: string) => asHash(await sha256(data), true) })\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"],
|
|
5
|
-
"mappings": "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",
|
|
6
|
-
"names": ["typeOf", "sha256", "asHash"]
|
|
7
|
-
}
|