@xyo-network/hash 2.89.3 → 2.90.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/browser/PayloadHasher.d.cts +13 -0
- package/dist/browser/PayloadHasher.d.cts.map +1 -1
- package/dist/browser/PayloadHasher.d.mts +13 -0
- package/dist/browser/PayloadHasher.d.mts.map +1 -1
- package/dist/browser/PayloadHasher.d.ts +13 -0
- package/dist/browser/PayloadHasher.d.ts.map +1 -1
- package/dist/browser/index.cjs +75 -8
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +75 -8
- package/dist/browser/index.js.map +1 -1
- package/dist/browser/worker/jsHash.cjs +34 -0
- package/dist/browser/worker/jsHash.cjs.map +1 -0
- package/dist/browser/worker/jsHash.js +10 -0
- package/dist/browser/worker/jsHash.js.map +1 -0
- package/dist/browser/worker/subtleHash.cjs +11 -0
- package/dist/browser/worker/subtleHash.cjs.map +1 -0
- package/dist/browser/worker/subtleHash.js +9 -0
- package/dist/browser/worker/subtleHash.js.map +1 -0
- package/dist/browser/worker/wasmHash.cjs +12 -0
- package/dist/browser/worker/wasmHash.cjs.map +1 -0
- package/dist/browser/worker/wasmHash.js +10 -0
- package/dist/browser/worker/wasmHash.js.map +1 -0
- package/dist/node/PayloadHasher.d.cts +13 -0
- package/dist/node/PayloadHasher.d.cts.map +1 -1
- package/dist/node/PayloadHasher.d.mts +13 -0
- package/dist/node/PayloadHasher.d.mts.map +1 -1
- package/dist/node/PayloadHasher.d.ts +13 -0
- package/dist/node/PayloadHasher.d.ts.map +1 -1
- package/dist/node/index.cjs +75 -8
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +75 -8
- package/dist/node/index.js.map +1 -1
- package/dist/node/worker/jsHash.cjs +34 -0
- package/dist/node/worker/jsHash.cjs.map +1 -0
- package/dist/node/worker/jsHash.js +10 -0
- package/dist/node/worker/jsHash.js.map +1 -0
- package/dist/node/worker/subtleHash.cjs +11 -0
- package/dist/node/worker/subtleHash.cjs.map +1 -0
- package/dist/node/worker/subtleHash.js +9 -0
- package/dist/node/worker/subtleHash.js.map +1 -0
- package/dist/node/worker/wasmHash.cjs +12 -0
- package/dist/node/worker/wasmHash.cjs.map +1 -0
- package/dist/node/worker/wasmHash.js +10 -0
- package/dist/node/worker/wasmHash.js.map +1 -0
- package/package.json +6 -3
- package/src/PayloadHasher.ts +86 -8
- package/src/worker/jsHash.js +10 -0
- package/src/worker/subtleHash.js +9 -0
- package/src/worker/wasmHash.js +10 -0
- package/xy.config.ts +14 -0
|
@@ -1,9 +1,19 @@
|
|
|
1
1
|
import { Hash } from '@xylabs/hex';
|
|
2
2
|
import { EmptyObject, ObjectWrapper } from '@xylabs/object';
|
|
3
3
|
import { WasmSupport } from '@xyo-network/wasm';
|
|
4
|
+
import { Semaphore } from 'async-mutex';
|
|
4
5
|
export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
|
|
5
6
|
static allowSubtle: boolean;
|
|
7
|
+
static readonly jsHashThreads: any[];
|
|
8
|
+
static readonly jsSemaphore: Semaphore;
|
|
9
|
+
static lastJsThreadUsed: number;
|
|
10
|
+
static lastSubtleThreadUsed: number;
|
|
11
|
+
static lastWasmThreadUsed: number;
|
|
12
|
+
static readonly subtleHashThreads: any[];
|
|
13
|
+
static readonly subtleSemaphore: Semaphore;
|
|
14
|
+
static readonly wasmHashThreads: any[];
|
|
6
15
|
static readonly wasmInitialized: Promise<void>;
|
|
16
|
+
static readonly wasmSemaphore: Semaphore;
|
|
7
17
|
static readonly wasmSupport: WasmSupport;
|
|
8
18
|
static filterExcludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
9
19
|
static filterIncludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
@@ -33,6 +43,7 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
33
43
|
* @returns An array of payload hashes
|
|
34
44
|
*/
|
|
35
45
|
static hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined>;
|
|
46
|
+
static jsHash(data: string): Promise<any>;
|
|
36
47
|
/**
|
|
37
48
|
* Returns a clone of the payload that is JSON safe
|
|
38
49
|
* @param obj A payload
|
|
@@ -43,6 +54,8 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
43
54
|
/** @deprecated us json instead */
|
|
44
55
|
static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
|
|
45
56
|
static stringifyHashFields<T extends EmptyObject>(obj: T): string;
|
|
57
|
+
static subtleHash(data: Uint8Array): Promise<ArrayBuffer>;
|
|
58
|
+
static wasmHash(data: string): Promise<any>;
|
|
46
59
|
hash(): Promise<Hash>;
|
|
47
60
|
hashSync(): Hash;
|
|
48
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,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,9 +1,19 @@
|
|
|
1
1
|
import { Hash } from '@xylabs/hex';
|
|
2
2
|
import { EmptyObject, ObjectWrapper } from '@xylabs/object';
|
|
3
3
|
import { WasmSupport } from '@xyo-network/wasm';
|
|
4
|
+
import { Semaphore } from 'async-mutex';
|
|
4
5
|
export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
|
|
5
6
|
static allowSubtle: boolean;
|
|
7
|
+
static readonly jsHashThreads: any[];
|
|
8
|
+
static readonly jsSemaphore: Semaphore;
|
|
9
|
+
static lastJsThreadUsed: number;
|
|
10
|
+
static lastSubtleThreadUsed: number;
|
|
11
|
+
static lastWasmThreadUsed: number;
|
|
12
|
+
static readonly subtleHashThreads: any[];
|
|
13
|
+
static readonly subtleSemaphore: Semaphore;
|
|
14
|
+
static readonly wasmHashThreads: any[];
|
|
6
15
|
static readonly wasmInitialized: Promise<void>;
|
|
16
|
+
static readonly wasmSemaphore: Semaphore;
|
|
7
17
|
static readonly wasmSupport: WasmSupport;
|
|
8
18
|
static filterExcludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
9
19
|
static filterIncludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
@@ -33,6 +43,7 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
33
43
|
* @returns An array of payload hashes
|
|
34
44
|
*/
|
|
35
45
|
static hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined>;
|
|
46
|
+
static jsHash(data: string): Promise<any>;
|
|
36
47
|
/**
|
|
37
48
|
* Returns a clone of the payload that is JSON safe
|
|
38
49
|
* @param obj A payload
|
|
@@ -43,6 +54,8 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
43
54
|
/** @deprecated us json instead */
|
|
44
55
|
static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
|
|
45
56
|
static stringifyHashFields<T extends EmptyObject>(obj: T): string;
|
|
57
|
+
static subtleHash(data: Uint8Array): Promise<ArrayBuffer>;
|
|
58
|
+
static wasmHash(data: string): Promise<any>;
|
|
46
59
|
hash(): Promise<Hash>;
|
|
47
60
|
hashSync(): Hash;
|
|
48
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,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,9 +1,19 @@
|
|
|
1
1
|
import { Hash } from '@xylabs/hex';
|
|
2
2
|
import { EmptyObject, ObjectWrapper } from '@xylabs/object';
|
|
3
3
|
import { WasmSupport } from '@xyo-network/wasm';
|
|
4
|
+
import { Semaphore } from 'async-mutex';
|
|
4
5
|
export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
|
|
5
6
|
static allowSubtle: boolean;
|
|
7
|
+
static readonly jsHashThreads: any[];
|
|
8
|
+
static readonly jsSemaphore: Semaphore;
|
|
9
|
+
static lastJsThreadUsed: number;
|
|
10
|
+
static lastSubtleThreadUsed: number;
|
|
11
|
+
static lastWasmThreadUsed: number;
|
|
12
|
+
static readonly subtleHashThreads: any[];
|
|
13
|
+
static readonly subtleSemaphore: Semaphore;
|
|
14
|
+
static readonly wasmHashThreads: any[];
|
|
6
15
|
static readonly wasmInitialized: Promise<void>;
|
|
16
|
+
static readonly wasmSemaphore: Semaphore;
|
|
7
17
|
static readonly wasmSupport: WasmSupport;
|
|
8
18
|
static filterExcludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
9
19
|
static filterIncludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
@@ -33,6 +43,7 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
33
43
|
* @returns An array of payload hashes
|
|
34
44
|
*/
|
|
35
45
|
static hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined>;
|
|
46
|
+
static jsHash(data: string): Promise<any>;
|
|
36
47
|
/**
|
|
37
48
|
* Returns a clone of the payload that is JSON safe
|
|
38
49
|
* @param obj A payload
|
|
@@ -43,6 +54,8 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
43
54
|
/** @deprecated us json instead */
|
|
44
55
|
static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
|
|
45
56
|
static stringifyHashFields<T extends EmptyObject>(obj: T): string;
|
|
57
|
+
static subtleHash(data: Uint8Array): Promise<ArrayBuffer>;
|
|
58
|
+
static wasmHash(data: string): Promise<any>;
|
|
46
59
|
hash(): Promise<Hash>;
|
|
47
60
|
hashSync(): Hash;
|
|
48
61
|
/**
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,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/browser/index.cjs
CHANGED
|
@@ -43,10 +43,10 @@ module.exports = __toCommonJS(src_exports);
|
|
|
43
43
|
// src/PayloadHasher.ts
|
|
44
44
|
var import_hex = require("@xylabs/hex");
|
|
45
45
|
var import_object3 = require("@xylabs/object");
|
|
46
|
-
var import_platform = require("@xylabs/platform");
|
|
47
46
|
var import_wasm = require("@xyo-network/wasm");
|
|
48
|
-
var
|
|
47
|
+
var import_async_mutex = require("async-mutex");
|
|
49
48
|
var import_sha = __toESM(require("sha.js"), 1);
|
|
49
|
+
var import_threads = require("threads");
|
|
50
50
|
|
|
51
51
|
// src/removeEmptyFields.ts
|
|
52
52
|
var import_typeof = require("@xylabs/typeof");
|
|
@@ -110,12 +110,26 @@ var sortFields = /* @__PURE__ */ __name((obj) => {
|
|
|
110
110
|
var wasmSupportStatic = new import_wasm.WasmSupport([
|
|
111
111
|
"bigInt"
|
|
112
112
|
]);
|
|
113
|
+
var maxHashThreads = 8;
|
|
114
|
+
var maxListenersPerThread = 1;
|
|
113
115
|
var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
114
116
|
static {
|
|
115
117
|
__name(this, "PayloadHasher");
|
|
116
118
|
}
|
|
117
119
|
static allowSubtle = true;
|
|
120
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
121
|
+
static jsHashThreads = [];
|
|
122
|
+
static jsSemaphore = new import_async_mutex.Semaphore(maxHashThreads * maxListenersPerThread);
|
|
123
|
+
static lastJsThreadUsed;
|
|
124
|
+
static lastSubtleThreadUsed;
|
|
125
|
+
static lastWasmThreadUsed;
|
|
126
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
127
|
+
static subtleHashThreads = [];
|
|
128
|
+
static subtleSemaphore = new import_async_mutex.Semaphore(maxHashThreads * maxListenersPerThread);
|
|
129
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
130
|
+
static wasmHashThreads = [];
|
|
118
131
|
static wasmInitialized = wasmSupportStatic.initialize();
|
|
132
|
+
static wasmSemaphore = new import_async_mutex.Semaphore(maxHashThreads * maxListenersPerThread);
|
|
119
133
|
static wasmSupport = wasmSupportStatic;
|
|
120
134
|
static async filterExcludeByHash(objs = [], hash) {
|
|
121
135
|
const hashes = Array.isArray(hash) ? hash : [
|
|
@@ -138,12 +152,12 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
138
152
|
* @returns The payload hash
|
|
139
153
|
*/
|
|
140
154
|
static async hash(obj) {
|
|
155
|
+
const stringToHash = this.stringifyHashFields(obj);
|
|
141
156
|
if (_PayloadHasher.allowSubtle) {
|
|
142
157
|
try {
|
|
143
158
|
const enc = new TextEncoder();
|
|
144
|
-
const
|
|
145
|
-
const
|
|
146
|
-
const hashArray = await import_platform.subtle.digest("SHA-256", b);
|
|
159
|
+
const data = enc.encode(stringToHash);
|
|
160
|
+
const hashArray = await this.subtleHash(data);
|
|
147
161
|
return (0, import_hex.hexFromArrayBuffer)(hashArray, {
|
|
148
162
|
bitLength: 256
|
|
149
163
|
});
|
|
@@ -156,14 +170,13 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
156
170
|
}
|
|
157
171
|
await this.wasmInitialized;
|
|
158
172
|
if (this.wasmSupport.canUseWasm) {
|
|
159
|
-
const stringToHash = this.stringifyHashFields(obj);
|
|
160
173
|
try {
|
|
161
|
-
return
|
|
174
|
+
return this.wasmHash(stringToHash);
|
|
162
175
|
} catch {
|
|
163
176
|
this.wasmSupport.allowWasm = false;
|
|
164
177
|
}
|
|
165
178
|
}
|
|
166
|
-
return this.
|
|
179
|
+
return await this.jsHash(stringToHash);
|
|
167
180
|
}
|
|
168
181
|
static hashFields(obj) {
|
|
169
182
|
return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, "_")));
|
|
@@ -195,6 +208,24 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
195
208
|
static async hashes(objs) {
|
|
196
209
|
return objs ? await Promise.all(objs.map((obj) => this.hash(obj))) : void 0;
|
|
197
210
|
}
|
|
211
|
+
static async jsHash(data) {
|
|
212
|
+
await this.jsSemaphore.acquire();
|
|
213
|
+
try {
|
|
214
|
+
if (this.jsHashThreads.length < maxHashThreads) {
|
|
215
|
+
const w = new import_threads.Worker("./worker/jsHash.js");
|
|
216
|
+
const worker = await (0, import_threads.spawn)(w);
|
|
217
|
+
this.jsHashThreads.push(worker);
|
|
218
|
+
}
|
|
219
|
+
let threadToUse = this.lastJsThreadUsed === void 0 ? 0 : this.lastJsThreadUsed + 1;
|
|
220
|
+
if (threadToUse >= this.jsHashThreads.length) {
|
|
221
|
+
threadToUse = 0;
|
|
222
|
+
}
|
|
223
|
+
this.lastJsThreadUsed = threadToUse;
|
|
224
|
+
return await this.jsHashThreads[threadToUse].hash(data);
|
|
225
|
+
} finally {
|
|
226
|
+
this.jsSemaphore.release();
|
|
227
|
+
}
|
|
228
|
+
}
|
|
198
229
|
/**
|
|
199
230
|
* Returns a clone of the payload that is JSON safe
|
|
200
231
|
* @param obj A payload
|
|
@@ -211,6 +242,42 @@ var PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
211
242
|
static stringifyHashFields(obj) {
|
|
212
243
|
return JSON.stringify(this.hashFields(obj));
|
|
213
244
|
}
|
|
245
|
+
static async subtleHash(data) {
|
|
246
|
+
await this.subtleSemaphore.acquire();
|
|
247
|
+
try {
|
|
248
|
+
if (this.subtleHashThreads.length < maxHashThreads) {
|
|
249
|
+
const w = new import_threads.Worker("./worker/subtleHash.js");
|
|
250
|
+
const worker = await (0, import_threads.spawn)(w);
|
|
251
|
+
this.subtleHashThreads.push(worker);
|
|
252
|
+
}
|
|
253
|
+
let threadToUse = this.lastSubtleThreadUsed === void 0 ? 0 : this.lastSubtleThreadUsed + 1;
|
|
254
|
+
if (threadToUse >= this.subtleHashThreads.length) {
|
|
255
|
+
threadToUse = 0;
|
|
256
|
+
}
|
|
257
|
+
this.lastSubtleThreadUsed = threadToUse;
|
|
258
|
+
return await this.subtleHashThreads[threadToUse].hash(data);
|
|
259
|
+
} finally {
|
|
260
|
+
this.subtleSemaphore.release();
|
|
261
|
+
}
|
|
262
|
+
}
|
|
263
|
+
static async wasmHash(data) {
|
|
264
|
+
await this.wasmSemaphore.acquire();
|
|
265
|
+
try {
|
|
266
|
+
if (this.wasmHashThreads.length < maxHashThreads) {
|
|
267
|
+
const w = new import_threads.Worker("./worker/wasmHash.js");
|
|
268
|
+
const worker = await (0, import_threads.spawn)(w);
|
|
269
|
+
this.wasmHashThreads.push(worker);
|
|
270
|
+
}
|
|
271
|
+
let threadToUse = this.lastWasmThreadUsed === void 0 ? 0 : this.lastWasmThreadUsed + 1;
|
|
272
|
+
if (threadToUse >= this.wasmHashThreads.length) {
|
|
273
|
+
threadToUse = 0;
|
|
274
|
+
}
|
|
275
|
+
this.lastWasmThreadUsed = threadToUse;
|
|
276
|
+
return await this.wasmHashThreads[threadToUse].hash(data);
|
|
277
|
+
} finally {
|
|
278
|
+
this.wasmSemaphore.release();
|
|
279
|
+
}
|
|
280
|
+
}
|
|
214
281
|
async hash() {
|
|
215
282
|
return await _PayloadHasher.hash(this.obj);
|
|
216
283
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["export * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { 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'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\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 if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const stringToHash = this.stringifyHashFields(obj)\n const b = enc.encode(stringToHash)\n const hashArray = await subtle.digest('SHA-256', b)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return asHash(await sha256(stringToHash), true)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\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 /**\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 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"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;;;;;;;;;;;;ACAA,iBAAiD;AACjD,IAAAA,iBAA2C;AAC3C,sBAAuB;AACvB,kBAA4B;AAC5B,uBAAuB;AACvB,iBAAkB;;;ACJlB,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;;;AHI1B,IAAMK,oBAAoB,IAAIC,wBAAY;EAAC;CAAS;AAE7C,IAAMC,gBAAN,MAAMA,uBAA2DC,6BAAAA;EAbxE,OAawEA;;;EACtE,OAAOC,cAAc;EACrB,OAAgBC,kBAAkBL,kBAAkBM,WAAU;EAC9D,OAAgBC,cAAcP;EAE9B,aAAaQ,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,QAAItB,eAAcE,aAAa;AAC7B,UAAI;AACF,cAAMqB,MAAM,IAAIC,YAAAA;AAChB,cAAMC,eAAe,KAAKC,oBAAoBJ,GAAAA;AAC9C,cAAMK,IAAIJ,IAAIK,OAAOH,YAAAA;AACrB,cAAMI,YAAY,MAAMC,uBAAOC,OAAO,WAAWJ,CAAAA;AACjD,mBAAOK,+BAAmBH,WAAW;UAAEI,WAAW;QAAI,CAAA;MACxD,SAASC,IAAI;AACX,cAAMC,QAAQD;AACdE,gBAAQD,MAAM,iCAAiCA,MAAME,OAAO,GAAG;AAC/DD,gBAAQE,IAAIH,MAAMI,KAAK;AACvBvC,uBAAcE,cAAc;MAC9B;IACF;AAEA,UAAM,KAAKC;AACX,QAAI,KAAKE,YAAYmC,YAAY;AAC/B,YAAMf,eAAe,KAAKC,oBAAoBJ,GAAAA;AAC9C,UAAI;AACF,mBAAOmB,mBAAO,UAAMC,yBAAOjB,YAAAA,GAAe,IAAA;MAC5C,QAAQ;AACN,aAAKpB,YAAYsC,YAAY;MAC/B;IACF;AACA,WAAO,KAAKC,SAAStB,GAAAA;EACvB;EAEA,OAAOuB,WAAkCvB,KAAW;AAClD,WAAOwB,WAAWC,kBAAkBC,uBAAuB1B,KAAK,GAAA,CAAA,CAAA;EAClE;;;;;;EAOA,aAAaV,UAAiCL,MAAiC;AAC7E,WAAO,MAAM0C,QAAQC,IAAI3C,KAAKU,IAA0B,OAAOK,QAAQ;MAACA;MAAK,MAAMtB,eAAcQ,KAAKc,GAAAA;KAAK,CAAA;EAC7G;;;;;;EAOA,OAAOsB,SAAgCtB,KAAc;AACnD,eAAOmB,uBAAOU,WAAAA,SAAM,QAAA,EAAUC,OAAO,KAAK1B,oBAAoBJ,GAAAA,CAAAA,EAAMS,OAAM,EAAGsB,SAAS,KAAA,GAAQ,IAAA;EAChG;;;;;;EAOA,aAAa5C,OAA8BF,MAAyC;AAClF,WAAOA,OAAO,MAAM0C,QAAQC,IAAI3C,KAAKU,IAAI,CAACK,QAAQ,KAAKd,KAAKc,GAAAA,CAAAA,CAAAA,IAASgC;EACvE;;;;;;;EAQA,OAAOC,KAA4BC,SAAYC,OAAO,OAAU;AAC9D,WAAOX,WAAWC,kBAAkBU,OAAOD,UAAUR,uBAAuBQ,SAAS,GAAA,CAAA,CAAA;EACvF;;EAGA,OAAOE,YAAmCF,SAAYC,OAAO,OAAU;AACrE,WAAO,KAAKF,KAAKC,SAASC,IAAAA;EAC5B;EAEA,OAAO/B,oBAA2CJ,KAAQ;AACxD,WAAOqC,KAAKC,UAAU,KAAKf,WAAWvB,GAAAA,CAAAA;EACxC;EAEA,MAAMd,OAAsB;AAC1B,WAAO,MAAMR,eAAcQ,KAAK,KAAKc,GAAG;EAC1C;EAEAsB,WAAiB;AACf,WAAO5C,eAAc4C,SAAS,KAAKtB,GAAG;EACxC;;;;;;EAOAoC,YAAYD,OAAO,OAAU;AAC3B,WAAOzD,eAAc0D,YAAY,KAAKpC,KAAKmC,IAAAA;EAC7C;AACF;","names":["import_object","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","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","wasmInitialized","initialize","wasmSupport","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","enc","TextEncoder","stringToHash","stringifyHashFields","b","encode","hashArray","subtle","digest","hexFromArrayBuffer","bitLength","ex","error","console","message","log","stack","canUseWasm","asHash","sha256","allowWasm","hashSync","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","shajs","update","toString","undefined","json","payload","meta","jsonPayload","JSON","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["export * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { Semaphore } from 'async-mutex'\nimport shajs from 'sha.js'\nimport { spawn, Worker } from 'threads'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\nconst maxHashThreads = 8\nconst maxListenersPerThread = 1\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly jsHashThreads: any[] = []\n static readonly jsSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)\n\n static lastJsThreadUsed: number\n static lastSubtleThreadUsed: number\n static lastWasmThreadUsed: number\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly subtleHashThreads: any[] = []\n static readonly subtleSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly wasmHashThreads: any[] = []\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)\n static readonly wasmSupport = wasmSupportStatic\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 (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\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 await this.jsSemaphore.acquire()\n try {\n if (this.jsHashThreads.length < maxHashThreads) {\n const w = new Worker('./worker/jsHash.js')\n const worker = await spawn(w)\n this.jsHashThreads.push(worker)\n }\n let threadToUse = this.lastJsThreadUsed === undefined ? 0 : this.lastJsThreadUsed + 1\n if (threadToUse >= this.jsHashThreads.length) {\n threadToUse = 0\n }\n this.lastJsThreadUsed = threadToUse\n\n return await this.jsHashThreads[threadToUse].hash(data)\n } finally {\n this.jsSemaphore.release()\n }\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 await this.subtleSemaphore.acquire()\n try {\n if (this.subtleHashThreads.length < maxHashThreads) {\n const w = new Worker('./worker/subtleHash.js')\n const worker = await spawn(w)\n this.subtleHashThreads.push(worker)\n }\n let threadToUse = this.lastSubtleThreadUsed === undefined ? 0 : this.lastSubtleThreadUsed + 1\n if (threadToUse >= this.subtleHashThreads.length) {\n threadToUse = 0\n }\n this.lastSubtleThreadUsed = threadToUse\n\n return await this.subtleHashThreads[threadToUse].hash(data)\n } finally {\n this.subtleSemaphore.release()\n }\n }\n\n static async wasmHash(data: string) {\n await this.wasmSemaphore.acquire()\n try {\n if (this.wasmHashThreads.length < maxHashThreads) {\n const w = new Worker('./worker/wasmHash.js')\n const worker = await spawn(w)\n this.wasmHashThreads.push(worker)\n }\n let threadToUse = this.lastWasmThreadUsed === undefined ? 0 : this.lastWasmThreadUsed + 1\n if (threadToUse >= this.wasmHashThreads.length) {\n threadToUse = 0\n }\n this.lastWasmThreadUsed = threadToUse\n\n return await this.wasmHashThreads[threadToUse].hash(data)\n } finally {\n this.wasmSemaphore.release()\n }\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"],"mappings":"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","names":["import_object","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","wasmSupportStatic","WasmSupport","maxHashThreads","maxListenersPerThread","PayloadHasher","ObjectWrapper","allowSubtle","jsHashThreads","jsSemaphore","Semaphore","lastJsThreadUsed","lastSubtleThreadUsed","lastWasmThreadUsed","subtleHashThreads","subtleSemaphore","wasmHashThreads","wasmInitialized","initialize","wasmSemaphore","wasmSupport","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","ex","error","console","message","log","stack","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","acquire","length","w","Worker","worker","spawn","push","threadToUse","release","json","payload","meta","jsonPayload","JSON","stringify"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -4,10 +4,10 @@ var __name = (target, value) => __defProp(target, "name", { value, configurable:
|
|
|
4
4
|
// src/PayloadHasher.ts
|
|
5
5
|
import { asHash, hexFromArrayBuffer } from "@xylabs/hex";
|
|
6
6
|
import { ObjectWrapper } from "@xylabs/object";
|
|
7
|
-
import { subtle } from "@xylabs/platform";
|
|
8
7
|
import { WasmSupport } from "@xyo-network/wasm";
|
|
9
|
-
import {
|
|
8
|
+
import { Semaphore } from "async-mutex";
|
|
10
9
|
import shajs from "sha.js";
|
|
10
|
+
import { spawn, Worker } from "threads";
|
|
11
11
|
|
|
12
12
|
// src/removeEmptyFields.ts
|
|
13
13
|
import { typeOf } from "@xylabs/typeof";
|
|
@@ -71,12 +71,26 @@ var sortFields = /* @__PURE__ */ __name((obj) => {
|
|
|
71
71
|
var wasmSupportStatic = new WasmSupport([
|
|
72
72
|
"bigInt"
|
|
73
73
|
]);
|
|
74
|
+
var maxHashThreads = 8;
|
|
75
|
+
var maxListenersPerThread = 1;
|
|
74
76
|
var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
75
77
|
static {
|
|
76
78
|
__name(this, "PayloadHasher");
|
|
77
79
|
}
|
|
78
80
|
static allowSubtle = true;
|
|
81
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
82
|
+
static jsHashThreads = [];
|
|
83
|
+
static jsSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread);
|
|
84
|
+
static lastJsThreadUsed;
|
|
85
|
+
static lastSubtleThreadUsed;
|
|
86
|
+
static lastWasmThreadUsed;
|
|
87
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
88
|
+
static subtleHashThreads = [];
|
|
89
|
+
static subtleSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread);
|
|
90
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
91
|
+
static wasmHashThreads = [];
|
|
79
92
|
static wasmInitialized = wasmSupportStatic.initialize();
|
|
93
|
+
static wasmSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread);
|
|
80
94
|
static wasmSupport = wasmSupportStatic;
|
|
81
95
|
static async filterExcludeByHash(objs = [], hash) {
|
|
82
96
|
const hashes = Array.isArray(hash) ? hash : [
|
|
@@ -99,12 +113,12 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
99
113
|
* @returns The payload hash
|
|
100
114
|
*/
|
|
101
115
|
static async hash(obj) {
|
|
116
|
+
const stringToHash = this.stringifyHashFields(obj);
|
|
102
117
|
if (_PayloadHasher.allowSubtle) {
|
|
103
118
|
try {
|
|
104
119
|
const enc = new TextEncoder();
|
|
105
|
-
const
|
|
106
|
-
const
|
|
107
|
-
const hashArray = await subtle.digest("SHA-256", b);
|
|
120
|
+
const data = enc.encode(stringToHash);
|
|
121
|
+
const hashArray = await this.subtleHash(data);
|
|
108
122
|
return hexFromArrayBuffer(hashArray, {
|
|
109
123
|
bitLength: 256
|
|
110
124
|
});
|
|
@@ -117,14 +131,13 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
117
131
|
}
|
|
118
132
|
await this.wasmInitialized;
|
|
119
133
|
if (this.wasmSupport.canUseWasm) {
|
|
120
|
-
const stringToHash = this.stringifyHashFields(obj);
|
|
121
134
|
try {
|
|
122
|
-
return
|
|
135
|
+
return this.wasmHash(stringToHash);
|
|
123
136
|
} catch {
|
|
124
137
|
this.wasmSupport.allowWasm = false;
|
|
125
138
|
}
|
|
126
139
|
}
|
|
127
|
-
return this.
|
|
140
|
+
return await this.jsHash(stringToHash);
|
|
128
141
|
}
|
|
129
142
|
static hashFields(obj) {
|
|
130
143
|
return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, "_")));
|
|
@@ -156,6 +169,24 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
156
169
|
static async hashes(objs) {
|
|
157
170
|
return objs ? await Promise.all(objs.map((obj) => this.hash(obj))) : void 0;
|
|
158
171
|
}
|
|
172
|
+
static async jsHash(data) {
|
|
173
|
+
await this.jsSemaphore.acquire();
|
|
174
|
+
try {
|
|
175
|
+
if (this.jsHashThreads.length < maxHashThreads) {
|
|
176
|
+
const w = new Worker("./worker/jsHash.js");
|
|
177
|
+
const worker = await spawn(w);
|
|
178
|
+
this.jsHashThreads.push(worker);
|
|
179
|
+
}
|
|
180
|
+
let threadToUse = this.lastJsThreadUsed === void 0 ? 0 : this.lastJsThreadUsed + 1;
|
|
181
|
+
if (threadToUse >= this.jsHashThreads.length) {
|
|
182
|
+
threadToUse = 0;
|
|
183
|
+
}
|
|
184
|
+
this.lastJsThreadUsed = threadToUse;
|
|
185
|
+
return await this.jsHashThreads[threadToUse].hash(data);
|
|
186
|
+
} finally {
|
|
187
|
+
this.jsSemaphore.release();
|
|
188
|
+
}
|
|
189
|
+
}
|
|
159
190
|
/**
|
|
160
191
|
* Returns a clone of the payload that is JSON safe
|
|
161
192
|
* @param obj A payload
|
|
@@ -172,6 +203,42 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
172
203
|
static stringifyHashFields(obj) {
|
|
173
204
|
return JSON.stringify(this.hashFields(obj));
|
|
174
205
|
}
|
|
206
|
+
static async subtleHash(data) {
|
|
207
|
+
await this.subtleSemaphore.acquire();
|
|
208
|
+
try {
|
|
209
|
+
if (this.subtleHashThreads.length < maxHashThreads) {
|
|
210
|
+
const w = new Worker("./worker/subtleHash.js");
|
|
211
|
+
const worker = await spawn(w);
|
|
212
|
+
this.subtleHashThreads.push(worker);
|
|
213
|
+
}
|
|
214
|
+
let threadToUse = this.lastSubtleThreadUsed === void 0 ? 0 : this.lastSubtleThreadUsed + 1;
|
|
215
|
+
if (threadToUse >= this.subtleHashThreads.length) {
|
|
216
|
+
threadToUse = 0;
|
|
217
|
+
}
|
|
218
|
+
this.lastSubtleThreadUsed = threadToUse;
|
|
219
|
+
return await this.subtleHashThreads[threadToUse].hash(data);
|
|
220
|
+
} finally {
|
|
221
|
+
this.subtleSemaphore.release();
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
static async wasmHash(data) {
|
|
225
|
+
await this.wasmSemaphore.acquire();
|
|
226
|
+
try {
|
|
227
|
+
if (this.wasmHashThreads.length < maxHashThreads) {
|
|
228
|
+
const w = new Worker("./worker/wasmHash.js");
|
|
229
|
+
const worker = await spawn(w);
|
|
230
|
+
this.wasmHashThreads.push(worker);
|
|
231
|
+
}
|
|
232
|
+
let threadToUse = this.lastWasmThreadUsed === void 0 ? 0 : this.lastWasmThreadUsed + 1;
|
|
233
|
+
if (threadToUse >= this.wasmHashThreads.length) {
|
|
234
|
+
threadToUse = 0;
|
|
235
|
+
}
|
|
236
|
+
this.lastWasmThreadUsed = threadToUse;
|
|
237
|
+
return await this.wasmHashThreads[threadToUse].hash(data);
|
|
238
|
+
} finally {
|
|
239
|
+
this.wasmSemaphore.release();
|
|
240
|
+
}
|
|
241
|
+
}
|
|
175
242
|
async hash() {
|
|
176
243
|
return await _PayloadHasher.hash(this.obj);
|
|
177
244
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["import { 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'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSupport = wasmSupportStatic\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 if (PayloadHasher.allowSubtle) {\n try {\n const enc = new TextEncoder()\n const stringToHash = this.stringifyHashFields(obj)\n const b = enc.encode(stringToHash)\n const hashArray = await subtle.digest('SHA-256', b)\n return hexFromArrayBuffer(hashArray, { bitLength: 256 })\n } catch (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\n PayloadHasher.allowSubtle = false\n }\n }\n\n await this.wasmInitialized\n if (this.wasmSupport.canUseWasm) {\n const stringToHash = this.stringifyHashFields(obj)\n try {\n return asHash(await sha256(stringToHash), true)\n } catch {\n this.wasmSupport.allowWasm = false\n }\n }\n return this.hashSync(obj)\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 /**\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 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"],"mappings":"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","names":["asHash","hexFromArrayBuffer","ObjectWrapper","subtle","WasmSupport","sha256","shajs","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","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","allowSubtle","wasmInitialized","initialize","wasmSupport","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","enc","TextEncoder","stringToHash","stringifyHashFields","b","encode","hashArray","subtle","digest","hexFromArrayBuffer","bitLength","ex","error","console","message","log","stack","canUseWasm","asHash","sha256","allowWasm","hashSync","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","shajs","update","toString","undefined","json","payload","meta","jsonPayload","JSON","stringify"]}
|
|
1
|
+
{"version":3,"sources":["../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { EmptyObject, ObjectWrapper } from '@xylabs/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { Semaphore } from 'async-mutex'\nimport shajs from 'sha.js'\nimport { spawn, Worker } from 'threads'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitPrefixedFields } from './removeFields'\nimport { sortFields } from './sortFields'\n\nconst wasmSupportStatic = new WasmSupport(['bigInt'])\nconst maxHashThreads = 8\nconst maxListenersPerThread = 1\n\nexport class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {\n static allowSubtle = true\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly jsHashThreads: any[] = []\n static readonly jsSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)\n\n static lastJsThreadUsed: number\n static lastSubtleThreadUsed: number\n static lastWasmThreadUsed: number\n\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly subtleHashThreads: any[] = []\n static readonly subtleSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n static readonly wasmHashThreads: any[] = []\n\n static readonly wasmInitialized = wasmSupportStatic.initialize()\n static readonly wasmSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)\n static readonly wasmSupport = wasmSupportStatic\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 (ex) {\n const error = ex as Error\n console.error(`Setting allowSubtle to false [${error.message}]`)\n console.log(error.stack)\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 await this.jsSemaphore.acquire()\n try {\n if (this.jsHashThreads.length < maxHashThreads) {\n const w = new Worker('./worker/jsHash.js')\n const worker = await spawn(w)\n this.jsHashThreads.push(worker)\n }\n let threadToUse = this.lastJsThreadUsed === undefined ? 0 : this.lastJsThreadUsed + 1\n if (threadToUse >= this.jsHashThreads.length) {\n threadToUse = 0\n }\n this.lastJsThreadUsed = threadToUse\n\n return await this.jsHashThreads[threadToUse].hash(data)\n } finally {\n this.jsSemaphore.release()\n }\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 await this.subtleSemaphore.acquire()\n try {\n if (this.subtleHashThreads.length < maxHashThreads) {\n const w = new Worker('./worker/subtleHash.js')\n const worker = await spawn(w)\n this.subtleHashThreads.push(worker)\n }\n let threadToUse = this.lastSubtleThreadUsed === undefined ? 0 : this.lastSubtleThreadUsed + 1\n if (threadToUse >= this.subtleHashThreads.length) {\n threadToUse = 0\n }\n this.lastSubtleThreadUsed = threadToUse\n\n return await this.subtleHashThreads[threadToUse].hash(data)\n } finally {\n this.subtleSemaphore.release()\n }\n }\n\n static async wasmHash(data: string) {\n await this.wasmSemaphore.acquire()\n try {\n if (this.wasmHashThreads.length < maxHashThreads) {\n const w = new Worker('./worker/wasmHash.js')\n const worker = await spawn(w)\n this.wasmHashThreads.push(worker)\n }\n let threadToUse = this.lastWasmThreadUsed === undefined ? 0 : this.lastWasmThreadUsed + 1\n if (threadToUse >= this.wasmHashThreads.length) {\n threadToUse = 0\n }\n this.lastWasmThreadUsed = threadToUse\n\n return await this.wasmHashThreads[threadToUse].hash(data)\n } finally {\n this.wasmSemaphore.release()\n }\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"],"mappings":"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","names":["asHash","hexFromArrayBuffer","ObjectWrapper","WasmSupport","Semaphore","shajs","spawn","Worker","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","wasmSupportStatic","WasmSupport","maxHashThreads","maxListenersPerThread","PayloadHasher","ObjectWrapper","allowSubtle","jsHashThreads","jsSemaphore","Semaphore","lastJsThreadUsed","lastSubtleThreadUsed","lastWasmThreadUsed","subtleHashThreads","subtleSemaphore","wasmHashThreads","wasmInitialized","initialize","wasmSemaphore","wasmSupport","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","ex","error","console","message","log","stack","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","acquire","length","w","Worker","worker","spawn","push","threadToUse","release","json","payload","meta","jsonPayload","JSON","stringify"]}
|
|
@@ -0,0 +1,34 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __create = Object.create;
|
|
3
|
+
var __defProp = Object.defineProperty;
|
|
4
|
+
var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
5
|
+
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
|
+
var __getProtoOf = Object.getPrototypeOf;
|
|
7
|
+
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __copyProps = (to, from, except, desc) => {
|
|
9
|
+
if (from && typeof from === "object" || typeof from === "function") {
|
|
10
|
+
for (let key of __getOwnPropNames(from))
|
|
11
|
+
if (!__hasOwnProp.call(to, key) && key !== except)
|
|
12
|
+
__defProp(to, key, { get: () => from[key], enumerable: !(desc = __getOwnPropDesc(from, key)) || desc.enumerable });
|
|
13
|
+
}
|
|
14
|
+
return to;
|
|
15
|
+
};
|
|
16
|
+
var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__getProtoOf(mod)) : {}, __copyProps(
|
|
17
|
+
// If the importer is in node compatibility mode or this is not an ESM
|
|
18
|
+
// file that has been converted to a CommonJS file using a Babel-
|
|
19
|
+
// compatible transform (i.e. "__esModule" has not been set), then set
|
|
20
|
+
// "default" to the CommonJS "module.exports" for node compatibility.
|
|
21
|
+
isNodeMode || !mod || !mod.__esModule ? __defProp(target, "default", { value: mod, enumerable: true }) : target,
|
|
22
|
+
mod
|
|
23
|
+
));
|
|
24
|
+
|
|
25
|
+
// src/worker/jsHash.js
|
|
26
|
+
var import_hex = require("@xylabs/hex");
|
|
27
|
+
var import_sha = __toESM(require("sha.js"), 1);
|
|
28
|
+
var import_worker = require("threads/worker");
|
|
29
|
+
(0, import_worker.expose)({
|
|
30
|
+
hash(data) {
|
|
31
|
+
return (0, import_hex.asHash)((0, import_sha.default)("sha256").update(data).digest().toString("hex"), true);
|
|
32
|
+
}
|
|
33
|
+
});
|
|
34
|
+
//# sourceMappingURL=jsHash.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/worker/jsHash.js"],"sourcesContent":["import { asHash } from '@xylabs/hex'\nimport shajs from 'sha.js'\n// eslint-disable-next-line import/no-internal-modules\nimport { expose } from 'threads/worker'\n\nexpose({\n hash(data) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n})\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;AAAA,iBAAuB;AACvB,iBAAkB;AAElB,oBAAuB;IAEvBA,sBAAO;EACLC,KAAKC,MAAI;AACP,eAAOC,uBAAOC,WAAAA,SAAM,QAAA,EAAUC,OAAOH,IAAAA,EAAMI,OAAM,EAAGC,SAAS,KAAA,GAAQ,IAAA;EACvE;AACF,CAAA;","names":["expose","hash","data","asHash","shajs","update","digest","toString"]}
|