@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
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/worker/jsHash.js
|
|
2
|
+
import { asHash } from "@xylabs/hex";
|
|
3
|
+
import shajs from "sha.js";
|
|
4
|
+
import { expose } from "threads/worker";
|
|
5
|
+
expose({
|
|
6
|
+
hash(data) {
|
|
7
|
+
return asHash(shajs("sha256").update(data).digest().toString("hex"), true);
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=jsHash.js.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,SAASA,cAAc;AACvB,OAAOC,WAAW;AAElB,SAASC,cAAc;AAEvBA,OAAO;EACLC,KAAKC,MAAI;AACP,WAAOJ,OAAOC,MAAM,QAAA,EAAUI,OAAOD,IAAAA,EAAME,OAAM,EAAGC,SAAS,KAAA,GAAQ,IAAA;EACvE;AACF,CAAA;","names":["asHash","shajs","expose","hash","data","update","digest","toString"]}
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/worker/subtleHash.js
|
|
4
|
+
var import_platform = require("@xylabs/platform");
|
|
5
|
+
var import_worker = require("threads/worker");
|
|
6
|
+
(0, import_worker.expose)({
|
|
7
|
+
async hash(data) {
|
|
8
|
+
return await import_platform.subtle.digest("SHA-256", data);
|
|
9
|
+
}
|
|
10
|
+
});
|
|
11
|
+
//# sourceMappingURL=subtleHash.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/worker/subtleHash.js"],"sourcesContent":["import { subtle } from '@xylabs/platform'\n// eslint-disable-next-line import/no-internal-modules\nimport { expose } from 'threads/worker'\n\nexpose({\n async hash(data) {\n return await subtle.digest('SHA-256', data)\n },\n})\n"],"mappings":";;;AAAA,sBAAuB;AAEvB,oBAAuB;IAEvBA,sBAAO;EACL,MAAMC,KAAKC,MAAI;AACb,WAAO,MAAMC,uBAAOC,OAAO,WAAWF,IAAAA;EACxC;AACF,CAAA;","names":["expose","hash","data","subtle","digest"]}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/worker/subtleHash.js"],"sourcesContent":["import { subtle } from '@xylabs/platform'\n// eslint-disable-next-line import/no-internal-modules\nimport { expose } from 'threads/worker'\n\nexpose({\n async hash(data) {\n return await subtle.digest('SHA-256', data)\n },\n})\n"],"mappings":";AAAA,SAASA,cAAc;AAEvB,SAASC,cAAc;AAEvBA,OAAO;EACL,MAAMC,KAAKC,MAAI;AACb,WAAO,MAAMH,OAAOI,OAAO,WAAWD,IAAAA;EACxC;AACF,CAAA;","names":["subtle","expose","hash","data","digest"]}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
|
|
3
|
+
// src/worker/wasmHash.js
|
|
4
|
+
var import_hex = require("@xylabs/hex");
|
|
5
|
+
var import_hash_wasm = require("hash-wasm");
|
|
6
|
+
var import_worker = require("threads/worker");
|
|
7
|
+
(0, import_worker.expose)({
|
|
8
|
+
async hash(data) {
|
|
9
|
+
return (0, import_hex.asHash)(await (0, import_hash_wasm.sha256)(data), true);
|
|
10
|
+
}
|
|
11
|
+
});
|
|
12
|
+
//# sourceMappingURL=wasmHash.cjs.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/worker/wasmHash.js"],"sourcesContent":["import { asHash } from '@xylabs/hex'\nimport { sha256 } from 'hash-wasm'\n// eslint-disable-next-line import/no-internal-modules\nimport { expose } from 'threads/worker'\n\nexpose({\n async hash(data) {\n return asHash(await sha256(data), true)\n },\n})\n"],"mappings":";;;AAAA,iBAAuB;AACvB,uBAAuB;AAEvB,oBAAuB;IAEvBA,sBAAO;EACL,MAAMC,KAAKC,MAAI;AACb,eAAOC,mBAAO,UAAMC,yBAAOF,IAAAA,GAAO,IAAA;EACpC;AACF,CAAA;","names":["expose","hash","data","asHash","sha256"]}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
// src/worker/wasmHash.js
|
|
2
|
+
import { asHash } from "@xylabs/hex";
|
|
3
|
+
import { sha256 } from "hash-wasm";
|
|
4
|
+
import { expose } from "threads/worker";
|
|
5
|
+
expose({
|
|
6
|
+
async hash(data) {
|
|
7
|
+
return asHash(await sha256(data), true);
|
|
8
|
+
}
|
|
9
|
+
});
|
|
10
|
+
//# sourceMappingURL=wasmHash.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../src/worker/wasmHash.js"],"sourcesContent":["import { asHash } from '@xylabs/hex'\nimport { sha256 } from 'hash-wasm'\n// eslint-disable-next-line import/no-internal-modules\nimport { expose } from 'threads/worker'\n\nexpose({\n async hash(data) {\n return asHash(await sha256(data), true)\n },\n})\n"],"mappings":";AAAA,SAASA,cAAc;AACvB,SAASC,cAAc;AAEvB,SAASC,cAAc;AAEvBA,OAAO;EACL,MAAMC,KAAKC,MAAI;AACb,WAAOJ,OAAO,MAAMC,OAAOG,IAAAA,GAAO,IAAA;EACpC;AACF,CAAA;","names":["asHash","sha256","expose","hash","data"]}
|
|
@@ -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/node/index.cjs
CHANGED
|
@@ -48,10 +48,10 @@ module.exports = __toCommonJS(src_exports);
|
|
|
48
48
|
// src/PayloadHasher.ts
|
|
49
49
|
var import_hex = require("@xylabs/hex");
|
|
50
50
|
var import_object3 = require("@xylabs/object");
|
|
51
|
-
var import_platform = require("@xylabs/platform");
|
|
52
51
|
var import_wasm = require("@xyo-network/wasm");
|
|
53
|
-
var
|
|
52
|
+
var import_async_mutex = require("async-mutex");
|
|
54
53
|
var import_sha = __toESM(require("sha.js"), 1);
|
|
54
|
+
var import_threads = require("threads");
|
|
55
55
|
|
|
56
56
|
// src/removeEmptyFields.ts
|
|
57
57
|
var import_typeof = require("@xylabs/typeof");
|
|
@@ -115,6 +115,8 @@ var sortFields = /* @__PURE__ */ __name((obj) => {
|
|
|
115
115
|
var wasmSupportStatic = new import_wasm.WasmSupport([
|
|
116
116
|
"bigInt"
|
|
117
117
|
]);
|
|
118
|
+
var maxHashThreads = 8;
|
|
119
|
+
var maxListenersPerThread = 1;
|
|
118
120
|
var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
119
121
|
static async filterExcludeByHash(objs = [], hash) {
|
|
120
122
|
var _a;
|
|
@@ -140,12 +142,12 @@ var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
140
142
|
* @returns The payload hash
|
|
141
143
|
*/
|
|
142
144
|
static async hash(obj) {
|
|
145
|
+
const stringToHash = this.stringifyHashFields(obj);
|
|
143
146
|
if (_PayloadHasher.allowSubtle) {
|
|
144
147
|
try {
|
|
145
148
|
const enc = new TextEncoder();
|
|
146
|
-
const
|
|
147
|
-
const
|
|
148
|
-
const hashArray = await import_platform.subtle.digest("SHA-256", b);
|
|
149
|
+
const data = enc.encode(stringToHash);
|
|
150
|
+
const hashArray = await this.subtleHash(data);
|
|
149
151
|
return (0, import_hex.hexFromArrayBuffer)(hashArray, {
|
|
150
152
|
bitLength: 256
|
|
151
153
|
});
|
|
@@ -158,14 +160,13 @@ var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
158
160
|
}
|
|
159
161
|
await this.wasmInitialized;
|
|
160
162
|
if (this.wasmSupport.canUseWasm) {
|
|
161
|
-
const stringToHash = this.stringifyHashFields(obj);
|
|
162
163
|
try {
|
|
163
|
-
return
|
|
164
|
+
return this.wasmHash(stringToHash);
|
|
164
165
|
} catch {
|
|
165
166
|
this.wasmSupport.allowWasm = false;
|
|
166
167
|
}
|
|
167
168
|
}
|
|
168
|
-
return this.
|
|
169
|
+
return await this.jsHash(stringToHash);
|
|
169
170
|
}
|
|
170
171
|
static hashFields(obj) {
|
|
171
172
|
return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, "_")));
|
|
@@ -197,6 +198,24 @@ var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
197
198
|
static async hashes(objs) {
|
|
198
199
|
return objs ? await Promise.all(objs.map((obj) => this.hash(obj))) : void 0;
|
|
199
200
|
}
|
|
201
|
+
static async jsHash(data) {
|
|
202
|
+
await this.jsSemaphore.acquire();
|
|
203
|
+
try {
|
|
204
|
+
if (this.jsHashThreads.length < maxHashThreads) {
|
|
205
|
+
const w = new import_threads.Worker("./worker/jsHash.js");
|
|
206
|
+
const worker = await (0, import_threads.spawn)(w);
|
|
207
|
+
this.jsHashThreads.push(worker);
|
|
208
|
+
}
|
|
209
|
+
let threadToUse = this.lastJsThreadUsed === void 0 ? 0 : this.lastJsThreadUsed + 1;
|
|
210
|
+
if (threadToUse >= this.jsHashThreads.length) {
|
|
211
|
+
threadToUse = 0;
|
|
212
|
+
}
|
|
213
|
+
this.lastJsThreadUsed = threadToUse;
|
|
214
|
+
return await this.jsHashThreads[threadToUse].hash(data);
|
|
215
|
+
} finally {
|
|
216
|
+
this.jsSemaphore.release();
|
|
217
|
+
}
|
|
218
|
+
}
|
|
200
219
|
/**
|
|
201
220
|
* Returns a clone of the payload that is JSON safe
|
|
202
221
|
* @param obj A payload
|
|
@@ -213,6 +232,42 @@ var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
213
232
|
static stringifyHashFields(obj) {
|
|
214
233
|
return JSON.stringify(this.hashFields(obj));
|
|
215
234
|
}
|
|
235
|
+
static async subtleHash(data) {
|
|
236
|
+
await this.subtleSemaphore.acquire();
|
|
237
|
+
try {
|
|
238
|
+
if (this.subtleHashThreads.length < maxHashThreads) {
|
|
239
|
+
const w = new import_threads.Worker("./worker/subtleHash.js");
|
|
240
|
+
const worker = await (0, import_threads.spawn)(w);
|
|
241
|
+
this.subtleHashThreads.push(worker);
|
|
242
|
+
}
|
|
243
|
+
let threadToUse = this.lastSubtleThreadUsed === void 0 ? 0 : this.lastSubtleThreadUsed + 1;
|
|
244
|
+
if (threadToUse >= this.subtleHashThreads.length) {
|
|
245
|
+
threadToUse = 0;
|
|
246
|
+
}
|
|
247
|
+
this.lastSubtleThreadUsed = threadToUse;
|
|
248
|
+
return await this.subtleHashThreads[threadToUse].hash(data);
|
|
249
|
+
} finally {
|
|
250
|
+
this.subtleSemaphore.release();
|
|
251
|
+
}
|
|
252
|
+
}
|
|
253
|
+
static async wasmHash(data) {
|
|
254
|
+
await this.wasmSemaphore.acquire();
|
|
255
|
+
try {
|
|
256
|
+
if (this.wasmHashThreads.length < maxHashThreads) {
|
|
257
|
+
const w = new import_threads.Worker("./worker/wasmHash.js");
|
|
258
|
+
const worker = await (0, import_threads.spawn)(w);
|
|
259
|
+
this.wasmHashThreads.push(worker);
|
|
260
|
+
}
|
|
261
|
+
let threadToUse = this.lastWasmThreadUsed === void 0 ? 0 : this.lastWasmThreadUsed + 1;
|
|
262
|
+
if (threadToUse >= this.wasmHashThreads.length) {
|
|
263
|
+
threadToUse = 0;
|
|
264
|
+
}
|
|
265
|
+
this.lastWasmThreadUsed = threadToUse;
|
|
266
|
+
return await this.wasmHashThreads[threadToUse].hash(data);
|
|
267
|
+
} finally {
|
|
268
|
+
this.wasmSemaphore.release();
|
|
269
|
+
}
|
|
270
|
+
}
|
|
216
271
|
async hash() {
|
|
217
272
|
return await _PayloadHasher.hash(this.obj);
|
|
218
273
|
}
|
|
@@ -230,7 +285,19 @@ var _PayloadHasher = class _PayloadHasher extends import_object3.ObjectWrapper {
|
|
|
230
285
|
};
|
|
231
286
|
__name(_PayloadHasher, "PayloadHasher");
|
|
232
287
|
__publicField(_PayloadHasher, "allowSubtle", true);
|
|
288
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
289
|
+
__publicField(_PayloadHasher, "jsHashThreads", []);
|
|
290
|
+
__publicField(_PayloadHasher, "jsSemaphore", new import_async_mutex.Semaphore(maxHashThreads * maxListenersPerThread));
|
|
291
|
+
__publicField(_PayloadHasher, "lastJsThreadUsed");
|
|
292
|
+
__publicField(_PayloadHasher, "lastSubtleThreadUsed");
|
|
293
|
+
__publicField(_PayloadHasher, "lastWasmThreadUsed");
|
|
294
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
295
|
+
__publicField(_PayloadHasher, "subtleHashThreads", []);
|
|
296
|
+
__publicField(_PayloadHasher, "subtleSemaphore", new import_async_mutex.Semaphore(maxHashThreads * maxListenersPerThread));
|
|
297
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
298
|
+
__publicField(_PayloadHasher, "wasmHashThreads", []);
|
|
233
299
|
__publicField(_PayloadHasher, "wasmInitialized", wasmSupportStatic.initialize());
|
|
300
|
+
__publicField(_PayloadHasher, "wasmSemaphore", new import_async_mutex.Semaphore(maxHashThreads * maxListenersPerThread));
|
|
234
301
|
__publicField(_PayloadHasher, "wasmSupport", wasmSupportStatic);
|
|
235
302
|
var PayloadHasher = _PayloadHasher;
|
|
236
303
|
// Annotate the CommonJS export names for ESM import in node:
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -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":"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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","PayloadHasher","ObjectWrapper","filterExcludeByHash","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterIncludeByHash","findByHash","find","obj","allowSubtle","enc","TextEncoder","stringToHash","stringifyHashFields","b","encode","hashArray","subtle","digest","hexFromArrayBuffer","bitLength","ex","error","console","message","log","stack","wasmInitialized","wasmSupport","canUseWasm","asHash","sha256","allowWasm","hashSync","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","shajs","update","toString","undefined","json","payload","meta","jsonPayload","JSON","stringify","initialize"]}
|
|
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","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","ex","error","console","message","log","stack","wasmInitialized","wasmSupport","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","jsSemaphore","acquire","jsHashThreads","length","w","Worker","worker","spawn","push","threadToUse","lastJsThreadUsed","release","json","payload","meta","jsonPayload","JSON","stringify","subtleSemaphore","subtleHashThreads","lastSubtleThreadUsed","wasmSemaphore","wasmHashThreads","lastWasmThreadUsed","Semaphore","initialize"]}
|
package/dist/node/index.js
CHANGED
|
@@ -9,10 +9,10 @@ var __publicField = (obj, key, value) => {
|
|
|
9
9
|
// src/PayloadHasher.ts
|
|
10
10
|
import { asHash, hexFromArrayBuffer } from "@xylabs/hex";
|
|
11
11
|
import { ObjectWrapper } from "@xylabs/object";
|
|
12
|
-
import { subtle } from "@xylabs/platform";
|
|
13
12
|
import { WasmSupport } from "@xyo-network/wasm";
|
|
14
|
-
import {
|
|
13
|
+
import { Semaphore } from "async-mutex";
|
|
15
14
|
import shajs from "sha.js";
|
|
15
|
+
import { spawn, Worker } from "threads";
|
|
16
16
|
|
|
17
17
|
// src/removeEmptyFields.ts
|
|
18
18
|
import { typeOf } from "@xylabs/typeof";
|
|
@@ -76,6 +76,8 @@ var sortFields = /* @__PURE__ */ __name((obj) => {
|
|
|
76
76
|
var wasmSupportStatic = new WasmSupport([
|
|
77
77
|
"bigInt"
|
|
78
78
|
]);
|
|
79
|
+
var maxHashThreads = 8;
|
|
80
|
+
var maxListenersPerThread = 1;
|
|
79
81
|
var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
80
82
|
static async filterExcludeByHash(objs = [], hash) {
|
|
81
83
|
var _a;
|
|
@@ -101,12 +103,12 @@ var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
101
103
|
* @returns The payload hash
|
|
102
104
|
*/
|
|
103
105
|
static async hash(obj) {
|
|
106
|
+
const stringToHash = this.stringifyHashFields(obj);
|
|
104
107
|
if (_PayloadHasher.allowSubtle) {
|
|
105
108
|
try {
|
|
106
109
|
const enc = new TextEncoder();
|
|
107
|
-
const
|
|
108
|
-
const
|
|
109
|
-
const hashArray = await subtle.digest("SHA-256", b);
|
|
110
|
+
const data = enc.encode(stringToHash);
|
|
111
|
+
const hashArray = await this.subtleHash(data);
|
|
110
112
|
return hexFromArrayBuffer(hashArray, {
|
|
111
113
|
bitLength: 256
|
|
112
114
|
});
|
|
@@ -119,14 +121,13 @@ var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
119
121
|
}
|
|
120
122
|
await this.wasmInitialized;
|
|
121
123
|
if (this.wasmSupport.canUseWasm) {
|
|
122
|
-
const stringToHash = this.stringifyHashFields(obj);
|
|
123
124
|
try {
|
|
124
|
-
return
|
|
125
|
+
return this.wasmHash(stringToHash);
|
|
125
126
|
} catch {
|
|
126
127
|
this.wasmSupport.allowWasm = false;
|
|
127
128
|
}
|
|
128
129
|
}
|
|
129
|
-
return this.
|
|
130
|
+
return await this.jsHash(stringToHash);
|
|
130
131
|
}
|
|
131
132
|
static hashFields(obj) {
|
|
132
133
|
return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, "_")));
|
|
@@ -158,6 +159,24 @@ var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
158
159
|
static async hashes(objs) {
|
|
159
160
|
return objs ? await Promise.all(objs.map((obj) => this.hash(obj))) : void 0;
|
|
160
161
|
}
|
|
162
|
+
static async jsHash(data) {
|
|
163
|
+
await this.jsSemaphore.acquire();
|
|
164
|
+
try {
|
|
165
|
+
if (this.jsHashThreads.length < maxHashThreads) {
|
|
166
|
+
const w = new Worker("./worker/jsHash.js");
|
|
167
|
+
const worker = await spawn(w);
|
|
168
|
+
this.jsHashThreads.push(worker);
|
|
169
|
+
}
|
|
170
|
+
let threadToUse = this.lastJsThreadUsed === void 0 ? 0 : this.lastJsThreadUsed + 1;
|
|
171
|
+
if (threadToUse >= this.jsHashThreads.length) {
|
|
172
|
+
threadToUse = 0;
|
|
173
|
+
}
|
|
174
|
+
this.lastJsThreadUsed = threadToUse;
|
|
175
|
+
return await this.jsHashThreads[threadToUse].hash(data);
|
|
176
|
+
} finally {
|
|
177
|
+
this.jsSemaphore.release();
|
|
178
|
+
}
|
|
179
|
+
}
|
|
161
180
|
/**
|
|
162
181
|
* Returns a clone of the payload that is JSON safe
|
|
163
182
|
* @param obj A payload
|
|
@@ -174,6 +193,42 @@ var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
174
193
|
static stringifyHashFields(obj) {
|
|
175
194
|
return JSON.stringify(this.hashFields(obj));
|
|
176
195
|
}
|
|
196
|
+
static async subtleHash(data) {
|
|
197
|
+
await this.subtleSemaphore.acquire();
|
|
198
|
+
try {
|
|
199
|
+
if (this.subtleHashThreads.length < maxHashThreads) {
|
|
200
|
+
const w = new Worker("./worker/subtleHash.js");
|
|
201
|
+
const worker = await spawn(w);
|
|
202
|
+
this.subtleHashThreads.push(worker);
|
|
203
|
+
}
|
|
204
|
+
let threadToUse = this.lastSubtleThreadUsed === void 0 ? 0 : this.lastSubtleThreadUsed + 1;
|
|
205
|
+
if (threadToUse >= this.subtleHashThreads.length) {
|
|
206
|
+
threadToUse = 0;
|
|
207
|
+
}
|
|
208
|
+
this.lastSubtleThreadUsed = threadToUse;
|
|
209
|
+
return await this.subtleHashThreads[threadToUse].hash(data);
|
|
210
|
+
} finally {
|
|
211
|
+
this.subtleSemaphore.release();
|
|
212
|
+
}
|
|
213
|
+
}
|
|
214
|
+
static async wasmHash(data) {
|
|
215
|
+
await this.wasmSemaphore.acquire();
|
|
216
|
+
try {
|
|
217
|
+
if (this.wasmHashThreads.length < maxHashThreads) {
|
|
218
|
+
const w = new Worker("./worker/wasmHash.js");
|
|
219
|
+
const worker = await spawn(w);
|
|
220
|
+
this.wasmHashThreads.push(worker);
|
|
221
|
+
}
|
|
222
|
+
let threadToUse = this.lastWasmThreadUsed === void 0 ? 0 : this.lastWasmThreadUsed + 1;
|
|
223
|
+
if (threadToUse >= this.wasmHashThreads.length) {
|
|
224
|
+
threadToUse = 0;
|
|
225
|
+
}
|
|
226
|
+
this.lastWasmThreadUsed = threadToUse;
|
|
227
|
+
return await this.wasmHashThreads[threadToUse].hash(data);
|
|
228
|
+
} finally {
|
|
229
|
+
this.wasmSemaphore.release();
|
|
230
|
+
}
|
|
231
|
+
}
|
|
177
232
|
async hash() {
|
|
178
233
|
return await _PayloadHasher.hash(this.obj);
|
|
179
234
|
}
|
|
@@ -191,7 +246,19 @@ var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
191
246
|
};
|
|
192
247
|
__name(_PayloadHasher, "PayloadHasher");
|
|
193
248
|
__publicField(_PayloadHasher, "allowSubtle", true);
|
|
249
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
250
|
+
__publicField(_PayloadHasher, "jsHashThreads", []);
|
|
251
|
+
__publicField(_PayloadHasher, "jsSemaphore", new Semaphore(maxHashThreads * maxListenersPerThread));
|
|
252
|
+
__publicField(_PayloadHasher, "lastJsThreadUsed");
|
|
253
|
+
__publicField(_PayloadHasher, "lastSubtleThreadUsed");
|
|
254
|
+
__publicField(_PayloadHasher, "lastWasmThreadUsed");
|
|
255
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
256
|
+
__publicField(_PayloadHasher, "subtleHashThreads", []);
|
|
257
|
+
__publicField(_PayloadHasher, "subtleSemaphore", new Semaphore(maxHashThreads * maxListenersPerThread));
|
|
258
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
259
|
+
__publicField(_PayloadHasher, "wasmHashThreads", []);
|
|
194
260
|
__publicField(_PayloadHasher, "wasmInitialized", wasmSupportStatic.initialize());
|
|
261
|
+
__publicField(_PayloadHasher, "wasmSemaphore", new Semaphore(maxHashThreads * maxListenersPerThread));
|
|
195
262
|
__publicField(_PayloadHasher, "wasmSupport", wasmSupportStatic);
|
|
196
263
|
var PayloadHasher = _PayloadHasher;
|
|
197
264
|
export {
|