@xyo-network/hash 2.90.17 → 2.90.18
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/PayloadHasher.d.cts.map +1 -1
- package/dist/browser/PayloadHasher.d.mts.map +1 -1
- package/dist/browser/PayloadHasher.d.ts.map +1 -1
- package/dist/browser/index-browser.cjs +25 -10
- package/dist/browser/index-browser.cjs.map +1 -1
- package/dist/browser/index-browser.js +25 -10
- package/dist/browser/index-browser.js.map +1 -1
- package/dist/node/PayloadHasher.d.cts.map +1 -1
- package/dist/node/PayloadHasher.d.mts.map +1 -1
- package/dist/node/PayloadHasher.d.ts.map +1 -1
- package/dist/node/index.cjs +25 -10
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +25 -10
- package/dist/node/index.js.map +1 -1
- package/package.json +2 -2
- package/src/PayloadHasher.ts +27 -9
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
|
|
@@ -72,7 +72,9 @@ var createNodeWorker = /* @__PURE__ */ __name((func) => {
|
|
|
72
72
|
var import_assert2 = require("@xylabs/assert");
|
|
73
73
|
var import_hex = require("@xylabs/hex");
|
|
74
74
|
var import_object3 = require("@xylabs/object");
|
|
75
|
+
var import_platform = require("@xylabs/platform");
|
|
75
76
|
var import_wasm = require("@xyo-network/wasm");
|
|
77
|
+
var import_hash_wasm = require("hash-wasm");
|
|
76
78
|
var import_sha = __toESM(require("sha.js"), 1);
|
|
77
79
|
var import_threads3 = require("threads");
|
|
78
80
|
|
|
@@ -148,23 +150,23 @@ var jsHashFunc = /* @__PURE__ */ __name(() => {
|
|
|
148
150
|
|
|
149
151
|
// src/worker/subtleHashNode.ts
|
|
150
152
|
var subtleHashFunc = /* @__PURE__ */ __name(() => {
|
|
151
|
-
const { subtle } = require("@xylabs/platform");
|
|
153
|
+
const { subtle: subtle2 } = require("@xylabs/platform");
|
|
152
154
|
const { expose } = require("threads/worker");
|
|
153
155
|
expose({
|
|
154
156
|
async hash(data) {
|
|
155
|
-
return await
|
|
157
|
+
return await subtle2.digest("SHA-256", data);
|
|
156
158
|
}
|
|
157
159
|
});
|
|
158
160
|
}, "subtleHashFunc");
|
|
159
161
|
|
|
160
162
|
// src/worker/wasmHashNode.ts
|
|
161
163
|
var wasmHashFunc = /* @__PURE__ */ __name(() => {
|
|
162
|
-
const { sha256 } = require("hash-wasm");
|
|
164
|
+
const { sha256: sha2562 } = require("hash-wasm");
|
|
163
165
|
const { asHash: asHash2 } = require("@xylabs/hex");
|
|
164
166
|
const { expose } = require("threads/worker");
|
|
165
167
|
expose({
|
|
166
168
|
async hash(data) {
|
|
167
|
-
return asHash2(await
|
|
169
|
+
return asHash2(await sha2562(data), true);
|
|
168
170
|
}
|
|
169
171
|
});
|
|
170
172
|
}, "wasmHashFunc");
|
|
@@ -186,6 +188,7 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
186
188
|
static wasmHashWorkerUrl;
|
|
187
189
|
static wasmInitialized = wasmSupportStatic.initialize();
|
|
188
190
|
static wasmSupport = wasmSupportStatic;
|
|
191
|
+
// These get set to null if they fail to create and then we just don't use workers - needed for storybook
|
|
189
192
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
190
193
|
static _jsHashPool;
|
|
191
194
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -193,13 +196,22 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
193
196
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
194
197
|
static _wasmHashPool;
|
|
195
198
|
static get jsHashPool() {
|
|
196
|
-
|
|
199
|
+
if (this._jsHashPool === null) {
|
|
200
|
+
return null;
|
|
201
|
+
}
|
|
202
|
+
return this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null;
|
|
197
203
|
}
|
|
198
204
|
static get subtleHashPool() {
|
|
199
|
-
|
|
205
|
+
if (this._subtleHashPool === null) {
|
|
206
|
+
return null;
|
|
207
|
+
}
|
|
208
|
+
return this._subtleHashPool = this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null;
|
|
200
209
|
}
|
|
201
210
|
static get wasmHashPool() {
|
|
202
|
-
|
|
211
|
+
if (this._wasmHashPool === null) {
|
|
212
|
+
return null;
|
|
213
|
+
}
|
|
214
|
+
return this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null;
|
|
203
215
|
}
|
|
204
216
|
static createWorker(url, func) {
|
|
205
217
|
return (0, import_assert2.assertEx)(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), "Unable to create worker");
|
|
@@ -282,7 +294,8 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
282
294
|
if (_PayloadHasher.warnIfUsingJsHash) {
|
|
283
295
|
console.warn("Using jsHash [No subtle or wasm?]");
|
|
284
296
|
}
|
|
285
|
-
|
|
297
|
+
const pool = this.jsHashPool;
|
|
298
|
+
return pool === null ? (0, import_hex.asHash)((0, import_sha.default)("sha256").update(data).digest().toString("hex"), true) : await pool.queue(async (thread) => await thread.hash(data));
|
|
286
299
|
}
|
|
287
300
|
/**
|
|
288
301
|
* Returns a clone of the payload that is JSON safe
|
|
@@ -301,10 +314,12 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
301
314
|
return JSON.stringify(this.hashFields(obj));
|
|
302
315
|
}
|
|
303
316
|
static async subtleHash(data) {
|
|
304
|
-
|
|
317
|
+
const pool = this.subtleHashPool;
|
|
318
|
+
return pool === null ? await import_platform.subtle.digest("SHA-256", data) : await pool.queue(async (thread) => await thread.hash(data));
|
|
305
319
|
}
|
|
306
320
|
static async wasmHash(data) {
|
|
307
|
-
|
|
321
|
+
const pool = this.wasmHashPool;
|
|
322
|
+
return pool === null ? (0, import_hex.asHash)(await (0, import_hash_wasm.sha256)(data), true) : pool.queue(async (thread) => await thread.hash(data));
|
|
308
323
|
}
|
|
309
324
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
310
325
|
static createWorkerPool(url, func, size = 8) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index-browser.ts","../../src/createBrowserWorker.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/BrowserPayloadHasher.ts"],"sourcesContent":["export { BrowserPayloadHasher as PayloadHasher } from './BrowserPayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { Worker } from 'threads'\n\nexport const createBrowserWorker = (url?: URL) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Worker(url as any)\n } catch {\n return\n }\n}\n","import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n\n private static get jsHashPool() {\n return (this._jsHashPool = this._jsHashPool ?? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc))\n }\n\n private static get subtleHashPool() {\n return (this._subtleHashPool = this._subtleHashPool ?? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc))\n }\n\n private static get wasmHashPool() {\n return (this._wasmHashPool = this._wasmHashPool ?? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc))\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n return await this.jsHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n return await this.subtleHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n return await this.wasmHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createBrowserWorker } from './createBrowserWorker'\nimport { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\n// We put both in here so that things will work in jsdom/jest\n\nPayloadHasher.createBrowserWorker = createBrowserWorker\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class BrowserPayloadHasher extends PayloadHasher {\n static override createBrowserWorker = createBrowserWorker\n static override createNodeWorker = createNodeWorker\n static override jsHashWorkerUrl = (() => {\n try {\n return new URL('worker/jsHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override subtleHashWorkerUrl = (() => {\n try {\n return new URL('worker/subtleHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override wasmHashWorkerUrl = (() => {\n try {\n return new URL('worker/wasmHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n}\n"],"mappings":"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","names":["createBrowserWorker","url","Worker","import_threads","createNodeWorker","func","code","toString","slice","w","Worker","fromSource","import_assert","import_object","import_threads","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","import_object","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","createBrowserWorker","createNodeWorker","jsHashWorkerUrl","subtleHashWorkerUrl","warnIfUsingJsHash","wasmHashWorkerUrl","wasmInitialized","initialize","wasmSupport","_jsHashPool","_subtleHashPool","_wasmHashPool","jsHashPool","createWorkerPool","jsHashFunc","subtleHashPool","subtleHashFunc","wasmHashPool","wasmHashFunc","createWorker","url","func","assertEx","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","console","warn","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","size","Pool","spawn","PayloadHasher","createBrowserWorker","createNodeWorker","BrowserPayloadHasher","jsHashWorkerUrl","URL","url","subtleHashWorkerUrl","wasmHashWorkerUrl"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index-browser.ts","../../src/createBrowserWorker.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/BrowserPayloadHasher.ts"],"sourcesContent":["export { BrowserPayloadHasher as PayloadHasher } from './BrowserPayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { Worker } from 'threads'\n\nexport const createBrowserWorker = (url?: URL) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Worker(url as any)\n } catch {\n return\n }\n}\n","import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // These get set to null if they fail to create and then we just don't use workers - needed for storybook\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // 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 jsHashPool() {\n if (this._jsHashPool === null) {\n return null\n }\n return (this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null)\n }\n\n private static get subtleHashPool() {\n if (this._subtleHashPool === null) {\n return null\n }\n return (this._subtleHashPool =\n this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null)\n }\n\n private static get wasmHashPool() {\n if (this._wasmHashPool === null) {\n return null\n }\n return (this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null)\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n const pool = this.jsHashPool\n return pool === null\n ? asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createBrowserWorker } from './createBrowserWorker'\nimport { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\n// We put both in here so that things will work in jsdom/jest\n\nPayloadHasher.createBrowserWorker = createBrowserWorker\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class BrowserPayloadHasher extends PayloadHasher {\n static override createBrowserWorker = createBrowserWorker\n static override createNodeWorker = createNodeWorker\n static override jsHashWorkerUrl = (() => {\n try {\n return new URL('worker/jsHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override subtleHashWorkerUrl = (() => {\n try {\n return new URL('worker/subtleHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override wasmHashWorkerUrl = (() => {\n try {\n return new URL('worker/wasmHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;ACAA,qBAAuB;AAEhB,IAAMA,sBAAsB,wBAACC,QAAAA;AAClC,MAAI;AAEF,WAAO,IAAIC,sBAAOD,GAAAA;EACpB,QAAQ;AACN;EACF;AACF,GAPmC;;;ACFnC,IAAAE,kBAAuB;AAEhB,IAAMC,mBAAmB,wBAACC,SAAAA;AAC/B,MAAI;AACF,UAAMC,OAAOD,MAAME,SAAAA,EAAWC,MAAM,CAAA,KAAM;AAC1C,UAAMC,IAAI,IAAIC;MACZJ;;MAEA;QAAEK,YAAY;MAAK;IAAA;AAErB,WAAOF;EACT,QAAQ;AACN;EACF;AACF,GAZgC;;;ACFhC,IAAAG,iBAAyB;AACzB,iBAAiD;AACjD,IAAAC,iBAA2C;AAC3C,sBAAuB;AACvB,kBAA4B;AAC5B,uBAAuB;AACvB,iBAAkB;AAClB,IAAAC,kBAAkD;;;ACNlD,oBAAuB;AAEhB,IAAMC,oBAAoB,wBAAwBC,QAAAA;AACvD,MAAIA,QAAQ,QAAQC,MAAMC,QAAQF,GAAAA;AAAM,WAAOA;AAE/C,QAAMG,YAAuB,CAAC;AAC9B,aAAW,CAACC,KAAKC,KAAAA,KAAUC,OAAOC,QAAQP,GAAAA,GAAM;AAC9C,YAAIQ,sBAAOH,KAAAA,MAAW,UAAU;AAC9BF,gBAAUC,GAAAA,IAAOL,kBAAkBM,KAAAA;IACrC,WAAWA,UAAUI,QAAW;AAC9BN,gBAAUC,GAAAA,IAAOC;IACnB;EACF;AACA,SAAOF;AACT,GAZiC;;;ACHjC,oBAAyB;AACzB,oBAAiD;AACjD,oBAAsC;AAI/B,IAAMO,SAAS,wBAAwBC,KAAQC,WAAgCC,SAAAA;AACpF,MAAIC,MAAMC,QAAQJ,GAAAA,GAAM;AACtB,WAAOA;EACT;AAGA,QAAMK,kBAAcC,sBAAUN,KAAKO,sBAAAA;AAGnC,QAAMC,iBAAaF,sBAAUN,KAAK,CAACS,UAAU,KAACF,wBAASE,KAAAA,CAAAA;AAEvD,QAAMC,oBAAgBC,sBAAON,aAAaJ,SAAAA;AAC1C,QAAMW,uBAAmBD,sBAAOH,YAAYP,SAAAA;AAE5C,QAAMY,uBAAmBC,yBAAUJ,eAAe,CAACV,SAAWD,OAAOC,MAAKC,WAAWC,IAAAA,CAAAA;AAErF,aAAOa,qBAAM,CAAC,GAAGH,kBAAkBC,gBAAAA;AACrC,GAjBsB;AAmBf,IAAMG,yBAAyB,wBAAwBhB,KAAQiB,WAAAA;AACpE,SAAOlB,OACLC,KACA,CAACkB,GAAGC,QAAAA;AACFC,gCAAS,OAAOD,QAAQ,UAAU,MAAM,qBAAqBA,GAAAA,KAAQ,OAAOA,GAAAA,GAAM;AAClF,WAAOA,IAAIE,WAAWJ,MAAAA;EACxB,GACAN,oBAAAA;AAEJ,GATsC;AAW/B,IAAMW,2BAA2B,wBAAwBtB,QAAAA;AAC9D,SAAOD,OACLC,KACA,CAACkB,GAAGC,QAAAA;AACFC,gCAAS,OAAOD,QAAQ,UAAU,MAAM,qBAAqBA,GAAAA,KAAQ,OAAOA,GAAAA,GAAM;AAClF,WAAOA,IAAIE,WAAW,GAAA;EACxB,GACAf,oBAAAA;AAEJ,GATwC;;;ACpCxC,IAAAiB,iBAAiD;AAGjD,IAAMC,UAAU,wBAACC,UAAAA;AACf,aAAOC,yBAASD,KAAAA,IAASE,WAAWF,KAAAA,IAASA;AAC/C,GAFgB;AAIT,IAAME,aAAa,wBAAwBC,QAAAA;AAChD,QAAMC,SAAoB,CAAC;AAC3B,QAAMC,OAAOC,OAAOD,KAAKF,GAAAA;AACzB,aAAWI,OAAOF,KAAKG,KAAI,GAAI;AAC7BJ,WAAOG,GAAAA,IAAOR,QAAQI,IAAII,GAAAA,CAAI;EAChC;AACA,SAAOH;AACT,GAP0B;;;ACNnB,IAAMK,aAAa,6BAAA;AACxB,QAAMC,SAAQC,QAAQ,QAAA;AACtB,QAAM,EAAEC,QAAAA,QAAM,IAAKD,QAAQ,aAAA;AAE3B,QAAM,EAAEE,OAAM,IAAKF,QAAQ,gBAAA;AAE3BE,SAAO;IACLC,KAAKC,MAAY;AACf,aAAOH,QAAOF,OAAM,QAAA,EAAUM,OAAOD,IAAAA,EAAME,OAAM,EAAGC,SAAS,KAAA,GAAQ,IAAA;IACvE;EACF,CAAA;AACF,GAX0B;;;ACAnB,IAAMC,iBAAiB,6BAAA;AAC5B,QAAM,EAAEC,QAAAA,QAAM,IAAKC,QAAQ,kBAAA;AAE3B,QAAM,EAAEC,OAAM,IAAKD,QAAQ,gBAAA;AAE3BC,SAAO;IACL,MAAMC,KAAKC,MAAiB;AAC1B,aAAO,MAAMJ,QAAOK,OAAO,WAAWD,IAAAA;IACxC;EACF,CAAA;AACF,GAV8B;;;ACAvB,IAAME,eAAe,6BAAA;AAC1B,QAAM,EAAEC,QAAAA,QAAM,IAAKC,QAAQ,WAAA;AAC3B,QAAM,EAAEC,QAAAA,QAAM,IAAKD,QAAQ,aAAA;AAE3B,QAAM,EAAEE,OAAM,IAAKF,QAAQ,gBAAA;AAE3BE,SAAO;IACL,MAAMC,KAAKC,MAAY;AACrB,aAAOH,QAAO,MAAMF,QAAOK,IAAAA,GAAO,IAAA;IACpC;EACF,CAAA;AACF,GAX4B;;;ANe5B,IAAMC,oBAAoB,IAAIC,wBAAY;EAAC;CAAS;AAE7C,IAAMC,gBAAN,MAAMA,uBAA2DC,6BAAAA;EAlBxE,OAkBwEA;;;EACtE,OAAOC,cAAc;EACrB,OAAOC;EACP,OAAOC;EAEP,OAAOC;EACP,OAAOC;EAEP,OAAOC,oBAAoB;EAE3B,OAAOC;EAEP,OAAgBC,kBAAkBX,kBAAkBY,WAAU;EAC9D,OAAgBC,cAAcb;;;EAI9B,OAAec;;EAEf,OAAeC;;EAEf,OAAeC;EAEf,WAAmBC,aAAa;AAC9B,QAAI,KAAKH,gBAAgB,MAAM;AAC7B,aAAO;IACT;AACA,WAAQ,KAAKA,cAAc,KAAKA,eAAe,KAAKP,kBAAkB,KAAKW,iBAAiB,KAAKX,iBAAiBY,UAAAA,IAAc;EAClI;EAEA,WAAmBC,iBAAiB;AAClC,QAAI,KAAKL,oBAAoB,MAAM;AACjC,aAAO;IACT;AACA,WAAQ,KAAKA,kBACX,KAAKA,mBAAmB,KAAKP,sBAAsB,KAAKU,iBAAiB,KAAKV,qBAAqBa,cAAAA,IAAkB;EACzH;EAEA,WAAmBC,eAAe;AAChC,QAAI,KAAKN,kBAAkB,MAAM;AAC/B,aAAO;IACT;AACA,WAAQ,KAAKA,gBAAgB,KAAKA,iBAAiB,KAAKN,oBAAoB,KAAKQ,iBAAiB,KAAKR,mBAAmBa,YAAAA,IAAgB;EAC5I;EAEA,OAAOC,aAAaC,KAAWC,MAAsB;AACnD,eAAOC,yBAAS,KAAKtB,sBAAsBoB,GAAAA,KAAQ,KAAKnB,mBAAmBoB,IAAAA,GAAO,yBAAA;EACpF;EAEA,aAAaE,oBAA2CC,OAAY,CAAA,GAAIC,MAAmC;AACzG,UAAMC,SAASC,MAAMC,QAAQH,IAAAA,IAAQA,OAAO;MAACA;;AAC7C,YAAQ,MAAM,KAAKI,UAAUL,IAAAA,GAAOM,OAAO,CAAC,CAACC,GAAGC,OAAAA,MAAa,CAACN,OAAOO,SAASD,OAAAA,CAAAA,GAAWE,IAAI,CAACC,SAASA,KAAK,CAAA,CAAE;EAChH;EAEA,aAAaC,oBAA2CZ,OAAY,CAAA,GAAIC,MAAmC;AACzG,UAAMC,SAASC,MAAMC,QAAQH,IAAAA,IAAQA,OAAO;MAACA;;AAC7C,YAAQ,MAAM,KAAKI,UAAUL,IAAAA,GAAOM,OAAO,CAAC,CAACC,GAAGC,OAAAA,MAAaN,OAAOO,SAASD,OAAAA,CAAAA,GAAWE,IAAI,CAACC,SAASA,KAAK,CAAA,CAAE;EAC/G;EAEA,aAAaE,WAAkCb,OAAY,CAAA,GAAIC,MAAoC;AACjG,YAAQ,MAAM,KAAKI,UAAUL,IAAAA,GAAOc,KAAK,CAAC,CAACP,GAAGC,OAAAA,MAAaA,YAAYP,IAAAA,IAAQ,CAAA;EACjF;;;;;;EAOA,aAAaA,KAA4Bc,KAAuB;AAC9D,UAAMC,eAAe,KAAKC,oBAAoBF,GAAAA;AAE9C,QAAI1C,eAAcE,aAAa;AAC7B,UAAI;AACF,cAAM2C,MAAM,IAAIC,YAAAA;AAChB,cAAMC,OAAOF,IAAIG,OAAOL,YAAAA;AACxB,cAAMM,YAAY,MAAM,KAAKC,WAAWH,IAAAA;AACxC,mBAAOI,+BAAmBF,WAAW;UAAEG,WAAW;QAAI,CAAA;MACxD,QAAQ;AACNpD,uBAAcE,cAAc;MAC9B;IACF;AAEA,UAAM,KAAKO;AACX,QAAI,KAAKE,YAAY0C,YAAY;AAC/B,UAAI;AACF,eAAO,KAAKC,SAASX,YAAAA;MACvB,QAAQ;AACN,aAAKhC,YAAY4C,YAAY;MAC/B;IACF;AACA,WAAO,MAAM,KAAKC,OAAOb,YAAAA;EAC3B;EAEA,OAAOc,WAAkCf,KAAW;AAClD,WAAOgB,WAAWC,kBAAkBC,uBAAuBlB,KAAK,GAAA,CAAA,CAAA;EAClE;;;;;;EAOA,aAAaV,UAAiCL,MAAiC;AAC7E,WAAO,MAAMkC,QAAQC,IAAInC,KAAKU,IAA0B,OAAOK,QAAQ;MAACA;MAAK,MAAM1C,eAAc4B,KAAKc,GAAAA;KAAK,CAAA;EAC7G;;;;;;EAOA,OAAOqB,SAAgCrB,KAAc;AACnD,eAAOsB,uBAAOC,WAAAA,SAAM,QAAA,EAAUC,OAAO,KAAKtB,oBAAoBF,GAAAA,CAAAA,EAAMyB,OAAM,EAAGC,SAAS,KAAA,GAAQ,IAAA;EAChG;;;;;;EAOA,aAAavC,OAA8BF,MAAyC;AAClF,WAAOA,OAAO,MAAMkC,QAAQC,IAAInC,KAAKU,IAAI,CAACK,QAAQ,KAAKd,KAAKc,GAAAA,CAAAA,CAAAA,IAAS2B;EACvE;EAEA,aAAab,OAAOT,MAAc;AAChC,QAAI/C,eAAcO,mBAAmB;AACnC+D,cAAQC,KAAK,mCAAA;IACf;AACA,UAAMC,OAAO,KAAKzD;AAClB,WAAOyD,SAAS,WACZR,uBAAOC,WAAAA,SAAM,QAAA,EAAUC,OAAOnB,IAAAA,EAAMoB,OAAM,EAAGC,SAAS,KAAA,GAAQ,IAAA,IAC9D,MAAMI,KAAKC,MAAM,OAAOC,WAAW,MAAMA,OAAO9C,KAAKmB,IAAAA,CAAAA;EAC3D;;;;;;;EAQA,OAAO4B,KAA4BC,SAAYC,OAAO,OAAU;AAC9D,WAAOnB,WAAWC,kBAAkBkB,OAAOD,UAAUhB,uBAAuBgB,SAAS,GAAA,CAAA,CAAA;EACvF;;EAGA,OAAOE,YAAmCF,SAAYC,OAAO,OAAU;AACrE,WAAO,KAAKF,KAAKC,SAASC,IAAAA;EAC5B;EAEA,OAAOjC,oBAA2CF,KAAQ;AACxD,WAAOqC,KAAKC,UAAU,KAAKvB,WAAWf,GAAAA,CAAAA;EACxC;EAEA,aAAaQ,WAAWH,MAAwC;AAC9D,UAAMyB,OAAO,KAAKtD;AAClB,WAAOsD,SAAS,OAAO,MAAMS,uBAAOd,OAAO,WAAWpB,IAAAA,IAAQ,MAAMyB,KAAKC,MAAM,OAAOC,WAAW,MAAMA,OAAO9C,KAAKmB,IAAAA,CAAAA;EACrH;EAEA,aAAaO,SAASP,MAAc;AAClC,UAAMyB,OAAO,KAAKpD;AAClB,WAAOoD,SAAS,WAAOR,mBAAO,UAAMkB,yBAAOnC,IAAAA,GAAO,IAAA,IAAQyB,KAAKC,MAAM,OAAOC,WAAW,MAAMA,OAAO9C,KAAKmB,IAAAA,CAAAA;EAC3G;;EAGA,OAAe/B,iBAA8CO,KAAWC,MAAsB2D,OAAO,GAAG;AACtG,eAAOC,sBAAK,UAAMC,uBAAS,KAAK/D,aAAaC,KAAKC,IAAAA,CAAAA,GAAQ2D,IAAAA;EAC5D;EAEA,MAAMvD,OAAsB;AAC1B,WAAO,MAAM5B,eAAc4B,KAAK,KAAKc,GAAG;EAC1C;EAEAqB,WAAiB;AACf,WAAO/D,eAAc+D,SAAS,KAAKrB,GAAG;EACxC;;;;;;EAOAoC,YAAYD,OAAO,OAAU;AAC3B,WAAO7E,eAAc8E,YAAY,KAAKpC,KAAKmC,IAAAA;EAC7C;AACF;;;AO1MA;AAMAS,cAAcC,sBAAsBA;AACpCD,cAAcE,mBAAmBA;AAE1B,IAAMC,uBAAN,cAAmCH,cAAAA;EAT1C,OAS0CA;;;EACxC,OAAgBC,sBAAsBA;EACtC,OAAgBC,mBAAmBA;EACnC,OAAgBE,mBAAmB,MAAA;AACjC,QAAI;AACF,aAAO,IAAIC,IAAI,2BAA2B,YAAYC,GAAG;IAC3D,QAAQ;AACN;IACF;EACF,GAAA;EACA,OAAgBC,uBAAuB,MAAA;AACrC,QAAI;AACF,aAAO,IAAIF,IAAI,+BAA+B,YAAYC,GAAG;IAC/D,QAAQ;AACN;IACF;EACF,GAAA;EACA,OAAgBE,qBAAqB,MAAA;AACnC,QAAI;AACF,aAAO,IAAIH,IAAI,6BAA6B,YAAYC,GAAG;IAC7D,QAAQ;AACN;IACF;EACF,GAAA;AACF;","names":["createBrowserWorker","url","Worker","import_threads","createNodeWorker","func","code","toString","slice","w","Worker","fromSource","import_assert","import_object","import_threads","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","import_object","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","createBrowserWorker","createNodeWorker","jsHashWorkerUrl","subtleHashWorkerUrl","warnIfUsingJsHash","wasmHashWorkerUrl","wasmInitialized","initialize","wasmSupport","_jsHashPool","_subtleHashPool","_wasmHashPool","jsHashPool","createWorkerPool","jsHashFunc","subtleHashPool","subtleHashFunc","wasmHashPool","wasmHashFunc","createWorker","url","func","assertEx","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","console","warn","pool","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","subtle","sha256","size","Pool","spawn","PayloadHasher","createBrowserWorker","createNodeWorker","BrowserPayloadHasher","jsHashWorkerUrl","URL","url","subtleHashWorkerUrl","wasmHashWorkerUrl"]}
|
|
@@ -40,7 +40,9 @@ var createNodeWorker = /* @__PURE__ */ __name((func) => {
|
|
|
40
40
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
41
41
|
import { asHash, hexFromArrayBuffer } from "@xylabs/hex";
|
|
42
42
|
import { ObjectWrapper } from "@xylabs/object";
|
|
43
|
+
import { subtle } from "@xylabs/platform";
|
|
43
44
|
import { WasmSupport } from "@xyo-network/wasm";
|
|
45
|
+
import { sha256 } from "hash-wasm";
|
|
44
46
|
import shajs from "sha.js";
|
|
45
47
|
import { Pool, spawn } from "threads";
|
|
46
48
|
|
|
@@ -116,23 +118,23 @@ var jsHashFunc = /* @__PURE__ */ __name(() => {
|
|
|
116
118
|
|
|
117
119
|
// src/worker/subtleHashNode.ts
|
|
118
120
|
var subtleHashFunc = /* @__PURE__ */ __name(() => {
|
|
119
|
-
const { subtle } = __require("@xylabs/platform");
|
|
121
|
+
const { subtle: subtle2 } = __require("@xylabs/platform");
|
|
120
122
|
const { expose } = __require("threads/worker");
|
|
121
123
|
expose({
|
|
122
124
|
async hash(data) {
|
|
123
|
-
return await
|
|
125
|
+
return await subtle2.digest("SHA-256", data);
|
|
124
126
|
}
|
|
125
127
|
});
|
|
126
128
|
}, "subtleHashFunc");
|
|
127
129
|
|
|
128
130
|
// src/worker/wasmHashNode.ts
|
|
129
131
|
var wasmHashFunc = /* @__PURE__ */ __name(() => {
|
|
130
|
-
const { sha256 } = __require("hash-wasm");
|
|
132
|
+
const { sha256: sha2562 } = __require("hash-wasm");
|
|
131
133
|
const { asHash: asHash2 } = __require("@xylabs/hex");
|
|
132
134
|
const { expose } = __require("threads/worker");
|
|
133
135
|
expose({
|
|
134
136
|
async hash(data) {
|
|
135
|
-
return asHash2(await
|
|
137
|
+
return asHash2(await sha2562(data), true);
|
|
136
138
|
}
|
|
137
139
|
});
|
|
138
140
|
}, "wasmHashFunc");
|
|
@@ -154,6 +156,7 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
154
156
|
static wasmHashWorkerUrl;
|
|
155
157
|
static wasmInitialized = wasmSupportStatic.initialize();
|
|
156
158
|
static wasmSupport = wasmSupportStatic;
|
|
159
|
+
// These get set to null if they fail to create and then we just don't use workers - needed for storybook
|
|
157
160
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
158
161
|
static _jsHashPool;
|
|
159
162
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -161,13 +164,22 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
161
164
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
162
165
|
static _wasmHashPool;
|
|
163
166
|
static get jsHashPool() {
|
|
164
|
-
|
|
167
|
+
if (this._jsHashPool === null) {
|
|
168
|
+
return null;
|
|
169
|
+
}
|
|
170
|
+
return this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null;
|
|
165
171
|
}
|
|
166
172
|
static get subtleHashPool() {
|
|
167
|
-
|
|
173
|
+
if (this._subtleHashPool === null) {
|
|
174
|
+
return null;
|
|
175
|
+
}
|
|
176
|
+
return this._subtleHashPool = this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null;
|
|
168
177
|
}
|
|
169
178
|
static get wasmHashPool() {
|
|
170
|
-
|
|
179
|
+
if (this._wasmHashPool === null) {
|
|
180
|
+
return null;
|
|
181
|
+
}
|
|
182
|
+
return this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null;
|
|
171
183
|
}
|
|
172
184
|
static createWorker(url, func) {
|
|
173
185
|
return assertEx2(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), "Unable to create worker");
|
|
@@ -250,7 +262,8 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
250
262
|
if (_PayloadHasher.warnIfUsingJsHash) {
|
|
251
263
|
console.warn("Using jsHash [No subtle or wasm?]");
|
|
252
264
|
}
|
|
253
|
-
|
|
265
|
+
const pool = this.jsHashPool;
|
|
266
|
+
return pool === null ? asHash(shajs("sha256").update(data).digest().toString("hex"), true) : await pool.queue(async (thread) => await thread.hash(data));
|
|
254
267
|
}
|
|
255
268
|
/**
|
|
256
269
|
* Returns a clone of the payload that is JSON safe
|
|
@@ -269,10 +282,12 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
269
282
|
return JSON.stringify(this.hashFields(obj));
|
|
270
283
|
}
|
|
271
284
|
static async subtleHash(data) {
|
|
272
|
-
|
|
285
|
+
const pool = this.subtleHashPool;
|
|
286
|
+
return pool === null ? await subtle.digest("SHA-256", data) : await pool.queue(async (thread) => await thread.hash(data));
|
|
273
287
|
}
|
|
274
288
|
static async wasmHash(data) {
|
|
275
|
-
|
|
289
|
+
const pool = this.wasmHashPool;
|
|
290
|
+
return pool === null ? asHash(await sha256(data), true) : pool.queue(async (thread) => await thread.hash(data));
|
|
276
291
|
}
|
|
277
292
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
278
293
|
static createWorkerPool(url, func, size = 8) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/createBrowserWorker.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/BrowserPayloadHasher.ts"],"sourcesContent":["import { Worker } from 'threads'\n\nexport const createBrowserWorker = (url?: URL) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Worker(url as any)\n } catch {\n return\n }\n}\n","import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n\n private static get jsHashPool() {\n return (this._jsHashPool = this._jsHashPool ?? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc))\n }\n\n private static get subtleHashPool() {\n return (this._subtleHashPool = this._subtleHashPool ?? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc))\n }\n\n private static get wasmHashPool() {\n return (this._wasmHashPool = this._wasmHashPool ?? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc))\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n return await this.jsHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n return await this.subtleHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n return await this.wasmHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createBrowserWorker } from './createBrowserWorker'\nimport { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\n// We put both in here so that things will work in jsdom/jest\n\nPayloadHasher.createBrowserWorker = createBrowserWorker\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class BrowserPayloadHasher extends PayloadHasher {\n static override createBrowserWorker = createBrowserWorker\n static override createNodeWorker = createNodeWorker\n static override jsHashWorkerUrl = (() => {\n try {\n return new URL('worker/jsHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override subtleHashWorkerUrl = (() => {\n try {\n return new URL('worker/subtleHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override wasmHashWorkerUrl = (() => {\n try {\n return new URL('worker/wasmHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n}\n"],"mappings":"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","names":["Worker","createBrowserWorker","url","Worker","Worker","createNodeWorker","func","code","toString","slice","w","Worker","fromSource","assertEx","asHash","hexFromArrayBuffer","ObjectWrapper","WasmSupport","shajs","Pool","spawn","typeOf","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","assertEx","mapValues","merge","omitBy","pickBy","isObject","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","isObject","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","createBrowserWorker","createNodeWorker","jsHashWorkerUrl","subtleHashWorkerUrl","warnIfUsingJsHash","wasmHashWorkerUrl","wasmInitialized","initialize","wasmSupport","_jsHashPool","_subtleHashPool","_wasmHashPool","jsHashPool","createWorkerPool","jsHashFunc","subtleHashPool","subtleHashFunc","wasmHashPool","wasmHashFunc","createWorker","url","func","assertEx","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","console","warn","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","size","Pool","spawn","PayloadHasher","createBrowserWorker","createNodeWorker","BrowserPayloadHasher","jsHashWorkerUrl","URL","url","subtleHashWorkerUrl","wasmHashWorkerUrl"]}
|
|
1
|
+
{"version":3,"sources":["../../src/createBrowserWorker.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/BrowserPayloadHasher.ts"],"sourcesContent":["import { Worker } from 'threads'\n\nexport const createBrowserWorker = (url?: URL) => {\n try {\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n return new Worker(url as any)\n } catch {\n return\n }\n}\n","import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // These get set to null if they fail to create and then we just don't use workers - needed for storybook\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // 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 jsHashPool() {\n if (this._jsHashPool === null) {\n return null\n }\n return (this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null)\n }\n\n private static get subtleHashPool() {\n if (this._subtleHashPool === null) {\n return null\n }\n return (this._subtleHashPool =\n this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null)\n }\n\n private static get wasmHashPool() {\n if (this._wasmHashPool === null) {\n return null\n }\n return (this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null)\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n const pool = this.jsHashPool\n return pool === null\n ? asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createBrowserWorker } from './createBrowserWorker'\nimport { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\n// We put both in here so that things will work in jsdom/jest\n\nPayloadHasher.createBrowserWorker = createBrowserWorker\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class BrowserPayloadHasher extends PayloadHasher {\n static override createBrowserWorker = createBrowserWorker\n static override createNodeWorker = createNodeWorker\n static override jsHashWorkerUrl = (() => {\n try {\n return new URL('worker/jsHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override subtleHashWorkerUrl = (() => {\n try {\n return new URL('worker/subtleHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n static override wasmHashWorkerUrl = (() => {\n try {\n return new URL('worker/wasmHash-bundle.js', import.meta.url)\n } catch {\n return\n }\n })()\n}\n"],"mappings":"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","names":["Worker","createBrowserWorker","url","Worker","Worker","createNodeWorker","func","code","toString","slice","w","Worker","fromSource","assertEx","asHash","hexFromArrayBuffer","ObjectWrapper","subtle","WasmSupport","sha256","shajs","Pool","spawn","typeOf","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","assertEx","mapValues","merge","omitBy","pickBy","isObject","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","isObject","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","createBrowserWorker","createNodeWorker","jsHashWorkerUrl","subtleHashWorkerUrl","warnIfUsingJsHash","wasmHashWorkerUrl","wasmInitialized","initialize","wasmSupport","_jsHashPool","_subtleHashPool","_wasmHashPool","jsHashPool","createWorkerPool","jsHashFunc","subtleHashPool","subtleHashFunc","wasmHashPool","wasmHashFunc","createWorker","url","func","assertEx","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","console","warn","pool","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","subtle","sha256","size","Pool","spawn","PayloadHasher","createBrowserWorker","createNodeWorker","BrowserPayloadHasher","jsHashWorkerUrl","URL","url","subtleHashWorkerUrl","wasmHashWorkerUrl"]}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AACA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAC9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,gBAAgB,CAAA;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"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"}
|
package/dist/node/index.cjs
CHANGED
|
@@ -67,7 +67,9 @@ var createNodeWorker = /* @__PURE__ */ __name((func) => {
|
|
|
67
67
|
var import_assert2 = require("@xylabs/assert");
|
|
68
68
|
var import_hex = require("@xylabs/hex");
|
|
69
69
|
var import_object3 = require("@xylabs/object");
|
|
70
|
+
var import_platform = require("@xylabs/platform");
|
|
70
71
|
var import_wasm = require("@xyo-network/wasm");
|
|
72
|
+
var import_hash_wasm = require("hash-wasm");
|
|
71
73
|
var import_sha = __toESM(require("sha.js"), 1);
|
|
72
74
|
var import_threads2 = require("threads");
|
|
73
75
|
|
|
@@ -143,23 +145,23 @@ var jsHashFunc = /* @__PURE__ */ __name(() => {
|
|
|
143
145
|
|
|
144
146
|
// src/worker/subtleHashNode.ts
|
|
145
147
|
var subtleHashFunc = /* @__PURE__ */ __name(() => {
|
|
146
|
-
const { subtle } = require("@xylabs/platform");
|
|
148
|
+
const { subtle: subtle2 } = require("@xylabs/platform");
|
|
147
149
|
const { expose } = require("threads/worker");
|
|
148
150
|
expose({
|
|
149
151
|
async hash(data) {
|
|
150
|
-
return await
|
|
152
|
+
return await subtle2.digest("SHA-256", data);
|
|
151
153
|
}
|
|
152
154
|
});
|
|
153
155
|
}, "subtleHashFunc");
|
|
154
156
|
|
|
155
157
|
// src/worker/wasmHashNode.ts
|
|
156
158
|
var wasmHashFunc = /* @__PURE__ */ __name(() => {
|
|
157
|
-
const { sha256 } = require("hash-wasm");
|
|
159
|
+
const { sha256: sha2562 } = require("hash-wasm");
|
|
158
160
|
const { asHash: asHash2 } = require("@xylabs/hex");
|
|
159
161
|
const { expose } = require("threads/worker");
|
|
160
162
|
expose({
|
|
161
163
|
async hash(data) {
|
|
162
|
-
return asHash2(await
|
|
164
|
+
return asHash2(await sha2562(data), true);
|
|
163
165
|
}
|
|
164
166
|
});
|
|
165
167
|
}, "wasmHashFunc");
|
|
@@ -170,13 +172,22 @@ var wasmSupportStatic = new import_wasm.WasmSupport([
|
|
|
170
172
|
]);
|
|
171
173
|
var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
172
174
|
static get jsHashPool() {
|
|
173
|
-
|
|
175
|
+
if (this._jsHashPool === null) {
|
|
176
|
+
return null;
|
|
177
|
+
}
|
|
178
|
+
return this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null;
|
|
174
179
|
}
|
|
175
180
|
static get subtleHashPool() {
|
|
176
|
-
|
|
181
|
+
if (this._subtleHashPool === null) {
|
|
182
|
+
return null;
|
|
183
|
+
}
|
|
184
|
+
return this._subtleHashPool = this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null;
|
|
177
185
|
}
|
|
178
186
|
static get wasmHashPool() {
|
|
179
|
-
|
|
187
|
+
if (this._wasmHashPool === null) {
|
|
188
|
+
return null;
|
|
189
|
+
}
|
|
190
|
+
return this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null;
|
|
180
191
|
}
|
|
181
192
|
static createWorker(url, func) {
|
|
182
193
|
var _a, _b;
|
|
@@ -263,7 +274,8 @@ var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
263
274
|
if (_PayloadHasher.warnIfUsingJsHash) {
|
|
264
275
|
console.warn("Using jsHash [No subtle or wasm?]");
|
|
265
276
|
}
|
|
266
|
-
|
|
277
|
+
const pool = this.jsHashPool;
|
|
278
|
+
return pool === null ? (0, import_hex.asHash)((0, import_sha.default)("sha256").update(data).digest().toString("hex"), true) : await pool.queue(async (thread) => await thread.hash(data));
|
|
267
279
|
}
|
|
268
280
|
/**
|
|
269
281
|
* Returns a clone of the payload that is JSON safe
|
|
@@ -282,10 +294,12 @@ var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
282
294
|
return JSON.stringify(this.hashFields(obj));
|
|
283
295
|
}
|
|
284
296
|
static async subtleHash(data) {
|
|
285
|
-
|
|
297
|
+
const pool = this.subtleHashPool;
|
|
298
|
+
return pool === null ? await import_platform.subtle.digest("SHA-256", data) : await pool.queue(async (thread) => await thread.hash(data));
|
|
286
299
|
}
|
|
287
300
|
static async wasmHash(data) {
|
|
288
|
-
|
|
301
|
+
const pool = this.wasmHashPool;
|
|
302
|
+
return pool === null ? (0, import_hex.asHash)(await (0, import_hash_wasm.sha256)(data), true) : pool.queue(async (thread) => await thread.hash(data));
|
|
289
303
|
}
|
|
290
304
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
291
305
|
static createWorkerPool(url, func, size = 8) {
|
|
@@ -316,6 +330,7 @@ __publicField(_PayloadHasher, "warnIfUsingJsHash", true);
|
|
|
316
330
|
__publicField(_PayloadHasher, "wasmHashWorkerUrl");
|
|
317
331
|
__publicField(_PayloadHasher, "wasmInitialized", wasmSupportStatic.initialize());
|
|
318
332
|
__publicField(_PayloadHasher, "wasmSupport", wasmSupportStatic);
|
|
333
|
+
// These get set to null if they fail to create and then we just don't use workers - needed for storybook
|
|
319
334
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
320
335
|
__publicField(_PayloadHasher, "_jsHashPool");
|
|
321
336
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodePayloadHasher.ts"],"sourcesContent":["export { NodePayloadHasher as PayloadHasher } from './NodePayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n\n private static get jsHashPool() {\n return (this._jsHashPool = this._jsHashPool ?? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc))\n }\n\n private static get subtleHashPool() {\n return (this._subtleHashPool = this._subtleHashPool ?? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc))\n }\n\n private static get wasmHashPool() {\n return (this._wasmHashPool = this._wasmHashPool ?? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc))\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n return await this.jsHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n return await this.subtleHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n return await this.wasmHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class NodePayloadHasher extends PayloadHasher {\n static override createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["createNodeWorker","func","code","toString","slice","w","Worker","fromSource","import_assert","import_object","import_threads","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","import_object","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","jsHashPool","_jsHashPool","createWorkerPool","jsHashWorkerUrl","jsHashFunc","subtleHashPool","_subtleHashPool","subtleHashWorkerUrl","subtleHashFunc","wasmHashPool","_wasmHashPool","wasmHashWorkerUrl","wasmHashFunc","createWorker","url","func","assertEx","createBrowserWorker","createNodeWorker","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","allowSubtle","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","wasmInitialized","wasmSupport","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","warnIfUsingJsHash","console","warn","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","size","Pool","spawn","initialize","PayloadHasher","createNodeWorker","NodePayloadHasher"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodePayloadHasher.ts"],"sourcesContent":["export { NodePayloadHasher as PayloadHasher } from './NodePayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // These get set to null if they fail to create and then we just don't use workers - needed for storybook\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // 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 jsHashPool() {\n if (this._jsHashPool === null) {\n return null\n }\n return (this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null)\n }\n\n private static get subtleHashPool() {\n if (this._subtleHashPool === null) {\n return null\n }\n return (this._subtleHashPool =\n this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null)\n }\n\n private static get wasmHashPool() {\n if (this._wasmHashPool === null) {\n return null\n }\n return (this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null)\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n const pool = this.jsHashPool\n return pool === null\n ? asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class NodePayloadHasher extends PayloadHasher {\n static override createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["createNodeWorker","func","code","toString","slice","w","Worker","fromSource","import_assert","import_object","import_threads","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","import_object","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","jsHashPool","_jsHashPool","jsHashWorkerUrl","createWorkerPool","jsHashFunc","subtleHashPool","_subtleHashPool","subtleHashWorkerUrl","subtleHashFunc","wasmHashPool","_wasmHashPool","wasmHashWorkerUrl","wasmHashFunc","createWorker","url","func","assertEx","createBrowserWorker","createNodeWorker","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","allowSubtle","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","wasmInitialized","wasmSupport","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","warnIfUsingJsHash","console","warn","pool","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","subtle","sha256","size","Pool","spawn","initialize","PayloadHasher","createNodeWorker","NodePayloadHasher"]}
|
package/dist/node/index.js
CHANGED
|
@@ -35,7 +35,9 @@ var createNodeWorker = /* @__PURE__ */ __name((func) => {
|
|
|
35
35
|
import { assertEx as assertEx2 } from "@xylabs/assert";
|
|
36
36
|
import { asHash, hexFromArrayBuffer } from "@xylabs/hex";
|
|
37
37
|
import { ObjectWrapper } from "@xylabs/object";
|
|
38
|
+
import { subtle } from "@xylabs/platform";
|
|
38
39
|
import { WasmSupport } from "@xyo-network/wasm";
|
|
40
|
+
import { sha256 } from "hash-wasm";
|
|
39
41
|
import shajs from "sha.js";
|
|
40
42
|
import { Pool, spawn } from "threads";
|
|
41
43
|
|
|
@@ -111,23 +113,23 @@ var jsHashFunc = /* @__PURE__ */ __name(() => {
|
|
|
111
113
|
|
|
112
114
|
// src/worker/subtleHashNode.ts
|
|
113
115
|
var subtleHashFunc = /* @__PURE__ */ __name(() => {
|
|
114
|
-
const { subtle } = __require("@xylabs/platform");
|
|
116
|
+
const { subtle: subtle2 } = __require("@xylabs/platform");
|
|
115
117
|
const { expose } = __require("threads/worker");
|
|
116
118
|
expose({
|
|
117
119
|
async hash(data) {
|
|
118
|
-
return await
|
|
120
|
+
return await subtle2.digest("SHA-256", data);
|
|
119
121
|
}
|
|
120
122
|
});
|
|
121
123
|
}, "subtleHashFunc");
|
|
122
124
|
|
|
123
125
|
// src/worker/wasmHashNode.ts
|
|
124
126
|
var wasmHashFunc = /* @__PURE__ */ __name(() => {
|
|
125
|
-
const { sha256 } = __require("hash-wasm");
|
|
127
|
+
const { sha256: sha2562 } = __require("hash-wasm");
|
|
126
128
|
const { asHash: asHash2 } = __require("@xylabs/hex");
|
|
127
129
|
const { expose } = __require("threads/worker");
|
|
128
130
|
expose({
|
|
129
131
|
async hash(data) {
|
|
130
|
-
return asHash2(await
|
|
132
|
+
return asHash2(await sha2562(data), true);
|
|
131
133
|
}
|
|
132
134
|
});
|
|
133
135
|
}, "wasmHashFunc");
|
|
@@ -138,13 +140,22 @@ var wasmSupportStatic = new WasmSupport([
|
|
|
138
140
|
]);
|
|
139
141
|
var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
140
142
|
static get jsHashPool() {
|
|
141
|
-
|
|
143
|
+
if (this._jsHashPool === null) {
|
|
144
|
+
return null;
|
|
145
|
+
}
|
|
146
|
+
return this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null;
|
|
142
147
|
}
|
|
143
148
|
static get subtleHashPool() {
|
|
144
|
-
|
|
149
|
+
if (this._subtleHashPool === null) {
|
|
150
|
+
return null;
|
|
151
|
+
}
|
|
152
|
+
return this._subtleHashPool = this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null;
|
|
145
153
|
}
|
|
146
154
|
static get wasmHashPool() {
|
|
147
|
-
|
|
155
|
+
if (this._wasmHashPool === null) {
|
|
156
|
+
return null;
|
|
157
|
+
}
|
|
158
|
+
return this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null;
|
|
148
159
|
}
|
|
149
160
|
static createWorker(url, func) {
|
|
150
161
|
var _a, _b;
|
|
@@ -231,7 +242,8 @@ var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
231
242
|
if (_PayloadHasher.warnIfUsingJsHash) {
|
|
232
243
|
console.warn("Using jsHash [No subtle or wasm?]");
|
|
233
244
|
}
|
|
234
|
-
|
|
245
|
+
const pool = this.jsHashPool;
|
|
246
|
+
return pool === null ? asHash(shajs("sha256").update(data).digest().toString("hex"), true) : await pool.queue(async (thread) => await thread.hash(data));
|
|
235
247
|
}
|
|
236
248
|
/**
|
|
237
249
|
* Returns a clone of the payload that is JSON safe
|
|
@@ -250,10 +262,12 @@ var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
250
262
|
return JSON.stringify(this.hashFields(obj));
|
|
251
263
|
}
|
|
252
264
|
static async subtleHash(data) {
|
|
253
|
-
|
|
265
|
+
const pool = this.subtleHashPool;
|
|
266
|
+
return pool === null ? await subtle.digest("SHA-256", data) : await pool.queue(async (thread) => await thread.hash(data));
|
|
254
267
|
}
|
|
255
268
|
static async wasmHash(data) {
|
|
256
|
-
|
|
269
|
+
const pool = this.wasmHashPool;
|
|
270
|
+
return pool === null ? asHash(await sha256(data), true) : pool.queue(async (thread) => await thread.hash(data));
|
|
257
271
|
}
|
|
258
272
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
273
|
static createWorkerPool(url, func, size = 8) {
|
|
@@ -284,6 +298,7 @@ __publicField(_PayloadHasher, "warnIfUsingJsHash", true);
|
|
|
284
298
|
__publicField(_PayloadHasher, "wasmHashWorkerUrl");
|
|
285
299
|
__publicField(_PayloadHasher, "wasmInitialized", wasmSupportStatic.initialize());
|
|
286
300
|
__publicField(_PayloadHasher, "wasmSupport", wasmSupportStatic);
|
|
301
|
+
// These get set to null if they fail to create and then we just don't use workers - needed for storybook
|
|
287
302
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
288
303
|
__publicField(_PayloadHasher, "_jsHashPool");
|
|
289
304
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
package/dist/node/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodePayloadHasher.ts"],"sourcesContent":["import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>>\n\n private static get jsHashPool() {\n return (this._jsHashPool = this._jsHashPool ?? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc))\n }\n\n private static get subtleHashPool() {\n return (this._subtleHashPool = this._subtleHashPool ?? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc))\n }\n\n private static get wasmHashPool() {\n return (this._wasmHashPool = this._wasmHashPool ?? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc))\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n return await this.jsHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n return await this.subtleHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n return await this.wasmHashPool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class NodePayloadHasher extends PayloadHasher {\n static override createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["Worker","createNodeWorker","func","code","toString","slice","w","Worker","fromSource","assertEx","asHash","hexFromArrayBuffer","ObjectWrapper","WasmSupport","shajs","Pool","spawn","typeOf","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","assertEx","mapValues","merge","omitBy","pickBy","isObject","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","isObject","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","jsHashPool","_jsHashPool","createWorkerPool","jsHashWorkerUrl","jsHashFunc","subtleHashPool","_subtleHashPool","subtleHashWorkerUrl","subtleHashFunc","wasmHashPool","_wasmHashPool","wasmHashWorkerUrl","wasmHashFunc","createWorker","url","func","assertEx","createBrowserWorker","createNodeWorker","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","allowSubtle","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","wasmInitialized","wasmSupport","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","warnIfUsingJsHash","console","warn","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","size","Pool","spawn","initialize","PayloadHasher","createNodeWorker","NodePayloadHasher"]}
|
|
1
|
+
{"version":3,"sources":["../../src/createNodeWorker.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHashNode.ts","../../src/worker/subtleHashNode.ts","../../src/worker/wasmHashNode.ts","../../src/NodePayloadHasher.ts"],"sourcesContent":["import { Worker } from 'threads'\n\nexport const createNodeWorker = (func?: () => unknown) => {\n try {\n const code = func?.toString().slice(6) ?? ''\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n return w\n } catch {\n return\n }\n}\n","import { assertEx } from '@xylabs/assert'\nimport { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { subtle } from '@xylabs/platform'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\nimport { ModuleThread, Pool, spawn, Worker } from 'threads'\n// eslint-disable-next-line import/no-internal-modules\nimport { WorkerModule } from 'threads/dist/types/worker'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static createBrowserWorker?: (url?: URL) => Worker | undefined\n static createNodeWorker?: (func?: () => unknown) => Worker | undefined\n\n static jsHashWorkerUrl?: URL\n static subtleHashWorkerUrl?: URL\n\n static warnIfUsingJsHash = true\n\n static wasmHashWorkerUrl?: URL\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\n\n // These get set to null if they fail to create and then we just don't use workers - needed for storybook\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null\n // 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 jsHashPool() {\n if (this._jsHashPool === null) {\n return null\n }\n return (this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null)\n }\n\n private static get subtleHashPool() {\n if (this._subtleHashPool === null) {\n return null\n }\n return (this._subtleHashPool =\n this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null)\n }\n\n private static get wasmHashPool() {\n if (this._wasmHashPool === null) {\n return null\n }\n return (this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null)\n }\n\n static createWorker(url?: URL, func?: () => unknown) {\n return assertEx(this.createBrowserWorker?.(url) ?? this.createNodeWorker?.(func), 'Unable to create worker')\n }\n\n static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {\n const hashes = Array.isArray(hash) ? hash : [hash]\n return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])\n }\n\n static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n /**\n * Asynchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {\n const stringToHash = this.stringifyHashFields(obj)\n\n if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const data = enc.encode(stringToHash)\n const hashArray = await this.subtleHash(data)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch {\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n try {\n return this.wasmHash(stringToHash)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return await this.jsHash(stringToHash)\n }\n\n static hashFields<T extends EmptyObject>(obj: T): T {\n return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))\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, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))\n }\n\n /**\n * Synchronously hashes a payload\n * @param obj A payload\n * @returns The payload hash\n */\n static hashSync<T extends EmptyObject>(obj: T): Hash {\n return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)\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 static async jsHash(data: string) {\n if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n const pool = this.jsHashPool\n return pool === null\n ? asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n /**\n * Returns a clone of the payload that is JSON safe\n * @param obj A payload\n * @param meta Keeps underscore (meta) fields if set to true\n * @returns Returns a clone of the payload that is JSON safe\n */\n static json<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))\n }\n\n /** @deprecated us json instead */\n static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return this.json(payload, meta)\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {\n const pool = this.subtleHashPool\n return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async (thread) => await thread.hash(data))\n }\n\n static async wasmHash(data: string) {\n const pool = this.wasmHashPool\n return pool === null ? asHash(await sha256(data), true) : pool.queue(async (thread) => await thread.hash(data))\n }\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n private static createWorkerPool<T extends WorkerModule<any>>(url?: URL, func?: () => unknown, size = 8) {\n return Pool(() => spawn<T>(this.createWorker(url, func)), size)\n }\n\n async hash(): Promise<Hash> {\n return await PayloadHasher.hash(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(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 jsonPayload(meta = false): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { AnyObject, EmptyObject } from '@xylabs/object'\nimport { typeOf } from '@xylabs/typeof'\n\nexport const removeEmptyFields = <T extends EmptyObject>(obj: T): T => {\n if (obj === null || Array.isArray(obj)) return obj\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 { assertEx } from '@xylabs/assert'\nimport { mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject, isObject } from '@xylabs/object'\n// eslint-disable-next-line no-restricted-imports\ntype ValueKeyIteratee<T> = (value: T, key: string) => unknown\n\nexport const deepBy = <T extends EmptyObject>(obj: T, predicate: ValueKeyIteratee<T>, func: typeof omitBy | typeof pickBy): T => {\n if (Array.isArray(obj)) {\n return obj\n }\n\n //pick the child objects\n const onlyObjects = pickBy<T>(obj, isObject)\n\n //pick the child non-objects\n const nonObjects = pickBy<T>(obj, (value) => !isObject(value))\n\n const pickedObjects = omitBy(onlyObjects, predicate)\n const pickedNonObjects = omitBy(nonObjects, predicate)\n\n const processedObjects = mapValues(pickedObjects, (obj: T) => deepBy(obj, predicate, func))\n\n return merge({}, pickedNonObjects, processedObjects) as T\n}\n\nexport const deepOmitPrefixedFields = <T extends EmptyObject>(obj: T, prefix: string): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith(prefix)\n },\n omitBy,\n )\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(\n obj,\n (_, key) => {\n assertEx(typeof key === 'string', () => `Invalid key type [${key}, ${typeof key}]`)\n return key.startsWith('_')\n },\n pickBy,\n )\n}\n","import { AnyObject, EmptyObject, isObject } from '@xylabs/object'\n\n//if an object, sub-sort\nconst subSort = (value: unknown) => {\n return isObject(value) ? sortFields(value) : value\n}\n\nexport const sortFields = <T extends EmptyObject>(obj: T) => {\n const result: AnyObject = {}\n const keys = Object.keys(obj) as (keyof T)[]\n for (const key of keys.sort()) {\n result[key] = subSort(obj[key])\n }\n return result as T\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n","import { createNodeWorker } from './createNodeWorker'\nimport { PayloadHasher } from './PayloadHasher'\n\nPayloadHasher.createNodeWorker = createNodeWorker\n\nexport class NodePayloadHasher extends PayloadHasher {\n static override createNodeWorker = createNodeWorker\n}\n"],"mappings":"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","names":["Worker","createNodeWorker","func","code","toString","slice","w","Worker","fromSource","assertEx","asHash","hexFromArrayBuffer","ObjectWrapper","subtle","WasmSupport","sha256","shajs","Pool","spawn","typeOf","removeEmptyFields","obj","Array","isArray","newObject","key","value","Object","entries","typeOf","undefined","assertEx","mapValues","merge","omitBy","pickBy","isObject","deepBy","obj","predicate","func","Array","isArray","onlyObjects","pickBy","isObject","nonObjects","value","pickedObjects","omitBy","pickedNonObjects","processedObjects","mapValues","merge","deepOmitPrefixedFields","prefix","_","key","assertEx","startsWith","deepPickUnderscoreFields","isObject","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","jsHashPool","_jsHashPool","jsHashWorkerUrl","createWorkerPool","jsHashFunc","subtleHashPool","_subtleHashPool","subtleHashWorkerUrl","subtleHashFunc","wasmHashPool","_wasmHashPool","wasmHashWorkerUrl","wasmHashFunc","createWorker","url","func","assertEx","createBrowserWorker","createNodeWorker","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","stringToHash","stringifyHashFields","allowSubtle","enc","TextEncoder","data","encode","hashArray","subtleHash","hexFromArrayBuffer","bitLength","wasmInitialized","wasmSupport","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","warnIfUsingJsHash","console","warn","pool","queue","thread","json","payload","meta","jsonPayload","JSON","stringify","subtle","sha256","size","Pool","spawn","initialize","PayloadHasher","createNodeWorker","NodePayloadHasher"]}
|
package/package.json
CHANGED
|
@@ -16,7 +16,7 @@
|
|
|
16
16
|
"@xylabs/object": "^2.89.2",
|
|
17
17
|
"@xylabs/platform": "^2.14.2",
|
|
18
18
|
"@xylabs/typeof": "^2.14.2",
|
|
19
|
-
"@xyo-network/wasm": "~2.90.
|
|
19
|
+
"@xyo-network/wasm": "~2.90.18",
|
|
20
20
|
"hash-wasm": "^4.11.0",
|
|
21
21
|
"sha.js": "^2.4.11",
|
|
22
22
|
"threads": "^1.7.0"
|
|
@@ -75,6 +75,6 @@
|
|
|
75
75
|
"package-compile": "package-compile-only && yarn bundle"
|
|
76
76
|
},
|
|
77
77
|
"sideEffects": false,
|
|
78
|
-
"version": "2.90.
|
|
78
|
+
"version": "2.90.18",
|
|
79
79
|
"type": "module"
|
|
80
80
|
}
|
package/src/PayloadHasher.ts
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
1
1
|
import { assertEx } from '@xylabs/assert'
|
|
2
2
|
import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'
|
|
3
3
|
import { EmptyObject, ObjectWrapper } from '@xylabs/object'
|
|
4
|
+
import { subtle } from '@xylabs/platform'
|
|
4
5
|
import { WasmSupport } from '@xyo-network/wasm'
|
|
6
|
+
import { sha256 } from 'hash-wasm'
|
|
5
7
|
import shajs from 'sha.js'
|
|
6
8
|
import { ModuleThread, Pool, spawn, Worker } from 'threads'
|
|
7
9
|
// eslint-disable-next-line import/no-internal-modules
|
|
@@ -29,23 +31,34 @@ export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWr
|
|
|
29
31
|
static readonly wasmInitialized = wasmSupportStatic.initialize()
|
|
30
32
|
static readonly wasmSupport = wasmSupportStatic
|
|
31
33
|
|
|
34
|
+
// These get set to null if they fail to create and then we just don't use workers - needed for storybook
|
|
32
35
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
33
|
-
private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>>
|
|
36
|
+
private static _jsHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null
|
|
34
37
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
35
|
-
private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>>
|
|
38
|
+
private static _subtleHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null
|
|
36
39
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
37
|
-
private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>>
|
|
40
|
+
private static _wasmHashPool?: Pool<ModuleThread<WorkerModule<any>>> | null
|
|
38
41
|
|
|
39
42
|
private static get jsHashPool() {
|
|
40
|
-
|
|
43
|
+
if (this._jsHashPool === null) {
|
|
44
|
+
return null
|
|
45
|
+
}
|
|
46
|
+
return (this._jsHashPool = this._jsHashPool ?? this.jsHashWorkerUrl ? this.createWorkerPool(this.jsHashWorkerUrl, jsHashFunc) : null)
|
|
41
47
|
}
|
|
42
48
|
|
|
43
49
|
private static get subtleHashPool() {
|
|
44
|
-
|
|
50
|
+
if (this._subtleHashPool === null) {
|
|
51
|
+
return null
|
|
52
|
+
}
|
|
53
|
+
return (this._subtleHashPool =
|
|
54
|
+
this._subtleHashPool ?? this.subtleHashWorkerUrl ? this.createWorkerPool(this.subtleHashWorkerUrl, subtleHashFunc) : null)
|
|
45
55
|
}
|
|
46
56
|
|
|
47
57
|
private static get wasmHashPool() {
|
|
48
|
-
|
|
58
|
+
if (this._wasmHashPool === null) {
|
|
59
|
+
return null
|
|
60
|
+
}
|
|
61
|
+
return (this._wasmHashPool = this._wasmHashPool ?? this.wasmHashWorkerUrl ? this.createWorkerPool(this.wasmHashWorkerUrl, wasmHashFunc) : null)
|
|
49
62
|
}
|
|
50
63
|
|
|
51
64
|
static createWorker(url?: URL, func?: () => unknown) {
|
|
@@ -131,7 +144,10 @@ export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWr
|
|
|
131
144
|
if (PayloadHasher.warnIfUsingJsHash) {
|
|
132
145
|
console.warn('Using jsHash [No subtle or wasm?]')
|
|
133
146
|
}
|
|
134
|
-
|
|
147
|
+
const pool = this.jsHashPool
|
|
148
|
+
return pool === null
|
|
149
|
+
? asHash(shajs('sha256').update(data).digest().toString('hex'), true)
|
|
150
|
+
: await pool.queue(async (thread) => await thread.hash(data))
|
|
135
151
|
}
|
|
136
152
|
|
|
137
153
|
/**
|
|
@@ -154,11 +170,13 @@ export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWr
|
|
|
154
170
|
}
|
|
155
171
|
|
|
156
172
|
static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {
|
|
157
|
-
|
|
173
|
+
const pool = this.subtleHashPool
|
|
174
|
+
return pool === null ? await subtle.digest('SHA-256', data) : await pool.queue(async (thread) => await thread.hash(data))
|
|
158
175
|
}
|
|
159
176
|
|
|
160
177
|
static async wasmHash(data: string) {
|
|
161
|
-
|
|
178
|
+
const pool = this.wasmHashPool
|
|
179
|
+
return pool === null ? asHash(await sha256(data), true) : pool.queue(async (thread) => await thread.hash(data))
|
|
162
180
|
}
|
|
163
181
|
|
|
164
182
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|