@xyo-network/hash 2.90.6 → 2.90.8

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (34) hide show
  1. package/dist/browser/PayloadHasher-browser.d.cts +69 -0
  2. package/dist/browser/PayloadHasher-browser.d.cts.map +1 -0
  3. package/dist/browser/PayloadHasher-browser.d.mts +69 -0
  4. package/dist/browser/PayloadHasher-browser.d.mts.map +1 -0
  5. package/dist/browser/PayloadHasher-browser.d.ts +69 -0
  6. package/dist/browser/PayloadHasher-browser.d.ts.map +1 -0
  7. package/dist/browser/{index.cjs → index-browser.cjs} +47 -31
  8. package/dist/browser/index-browser.cjs.map +1 -0
  9. package/dist/browser/index-browser.d.cts +5 -0
  10. package/dist/browser/index-browser.d.cts.map +1 -0
  11. package/dist/browser/index-browser.d.mts +5 -0
  12. package/dist/browser/index-browser.d.mts.map +1 -0
  13. package/dist/browser/index-browser.d.ts +5 -0
  14. package/dist/browser/index-browser.d.ts.map +1 -0
  15. package/dist/browser/{index.js → index-browser.js} +42 -27
  16. package/dist/browser/index-browser.js.map +1 -0
  17. package/dist/node/PayloadHasher-browser.d.cts +69 -0
  18. package/dist/node/PayloadHasher-browser.d.cts.map +1 -0
  19. package/dist/node/PayloadHasher-browser.d.mts +69 -0
  20. package/dist/node/PayloadHasher-browser.d.mts.map +1 -0
  21. package/dist/node/PayloadHasher-browser.d.ts +69 -0
  22. package/dist/node/PayloadHasher-browser.d.ts.map +1 -0
  23. package/dist/node/index-browser.d.cts +5 -0
  24. package/dist/node/index-browser.d.cts.map +1 -0
  25. package/dist/node/index-browser.d.mts +5 -0
  26. package/dist/node/index-browser.d.mts.map +1 -0
  27. package/dist/node/index-browser.d.ts +5 -0
  28. package/dist/node/index-browser.d.ts.map +1 -0
  29. package/package.json +6 -6
  30. package/src/PayloadHasher-browser.ts +248 -0
  31. package/src/index-browser.ts +4 -0
  32. package/xy.config.ts +1 -1
  33. package/dist/browser/index.cjs.map +0 -1
  34. package/dist/browser/index.js.map +0 -1
@@ -0,0 +1,69 @@
1
+ import { Hash } from '@xylabs/hex';
2
+ import { EmptyObject, ObjectWrapper } from '@xylabs/object';
3
+ import { WasmSupport } from '@xyo-network/wasm';
4
+ import { Semaphore } from 'async-mutex';
5
+ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
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 warnIfUsingJsHash: boolean;
15
+ static readonly wasmHashThreads: any[];
16
+ static readonly wasmInitialized: Promise<void>;
17
+ static readonly wasmSemaphore: Semaphore;
18
+ static readonly wasmSupport: WasmSupport;
19
+ static filterExcludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
20
+ static filterIncludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
21
+ static findByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash): Promise<T | undefined>;
22
+ /**
23
+ * Asynchronously hashes a payload
24
+ * @param obj A payload
25
+ * @returns The payload hash
26
+ */
27
+ static hash<T extends EmptyObject>(obj: T): Promise<Hash>;
28
+ static hashFields<T extends EmptyObject>(obj: T): T;
29
+ /**
30
+ * Creates an array of payload/hash tuples based on the payloads passed in
31
+ * @param objs Any array of payloads
32
+ * @returns An array of payload/hash tuples
33
+ */
34
+ static hashPairs<T extends EmptyObject>(objs: T[]): Promise<[T, Hash][]>;
35
+ /**
36
+ * Synchronously hashes a payload
37
+ * @param obj A payload
38
+ * @returns The payload hash
39
+ */
40
+ static hashSync<T extends EmptyObject>(obj: T): Hash;
41
+ /**
42
+ * Creates an array of payload hashes based on the payloads passed in
43
+ * @param objs Any array of payloads
44
+ * @returns An array of payload hashes
45
+ */
46
+ static hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined>;
47
+ static jsHash(data: string): Promise<any>;
48
+ /**
49
+ * Returns a clone of the payload that is JSON safe
50
+ * @param obj A payload
51
+ * @param meta Keeps underscore (meta) fields if set to true
52
+ * @returns Returns a clone of the payload that is JSON safe
53
+ */
54
+ static json<T extends EmptyObject>(payload: T, meta?: boolean): T;
55
+ /** @deprecated us json instead */
56
+ static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
57
+ static stringifyHashFields<T extends EmptyObject>(obj: T): string;
58
+ static subtleHash(data: Uint8Array): Promise<ArrayBuffer>;
59
+ static wasmHash(data: string): Promise<any>;
60
+ hash(): Promise<Hash>;
61
+ hashSync(): Hash;
62
+ /**
63
+ * Returns a clone of the payload that is JSON safe
64
+ * @param meta Keeps underscore (meta) fields if set to true
65
+ * @returns Returns a clone of the payload that is JSON safe
66
+ */
67
+ jsonPayload(meta?: boolean): T;
68
+ }
69
+ //# sourceMappingURL=PayloadHasher-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PayloadHasher-browser.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { Hash } from '@xylabs/hex';
2
+ import { EmptyObject, ObjectWrapper } from '@xylabs/object';
3
+ import { WasmSupport } from '@xyo-network/wasm';
4
+ import { Semaphore } from 'async-mutex';
5
+ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
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 warnIfUsingJsHash: boolean;
15
+ static readonly wasmHashThreads: any[];
16
+ static readonly wasmInitialized: Promise<void>;
17
+ static readonly wasmSemaphore: Semaphore;
18
+ static readonly wasmSupport: WasmSupport;
19
+ static filterExcludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
20
+ static filterIncludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
21
+ static findByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash): Promise<T | undefined>;
22
+ /**
23
+ * Asynchronously hashes a payload
24
+ * @param obj A payload
25
+ * @returns The payload hash
26
+ */
27
+ static hash<T extends EmptyObject>(obj: T): Promise<Hash>;
28
+ static hashFields<T extends EmptyObject>(obj: T): T;
29
+ /**
30
+ * Creates an array of payload/hash tuples based on the payloads passed in
31
+ * @param objs Any array of payloads
32
+ * @returns An array of payload/hash tuples
33
+ */
34
+ static hashPairs<T extends EmptyObject>(objs: T[]): Promise<[T, Hash][]>;
35
+ /**
36
+ * Synchronously hashes a payload
37
+ * @param obj A payload
38
+ * @returns The payload hash
39
+ */
40
+ static hashSync<T extends EmptyObject>(obj: T): Hash;
41
+ /**
42
+ * Creates an array of payload hashes based on the payloads passed in
43
+ * @param objs Any array of payloads
44
+ * @returns An array of payload hashes
45
+ */
46
+ static hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined>;
47
+ static jsHash(data: string): Promise<any>;
48
+ /**
49
+ * Returns a clone of the payload that is JSON safe
50
+ * @param obj A payload
51
+ * @param meta Keeps underscore (meta) fields if set to true
52
+ * @returns Returns a clone of the payload that is JSON safe
53
+ */
54
+ static json<T extends EmptyObject>(payload: T, meta?: boolean): T;
55
+ /** @deprecated us json instead */
56
+ static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
57
+ static stringifyHashFields<T extends EmptyObject>(obj: T): string;
58
+ static subtleHash(data: Uint8Array): Promise<ArrayBuffer>;
59
+ static wasmHash(data: string): Promise<any>;
60
+ hash(): Promise<Hash>;
61
+ hashSync(): Hash;
62
+ /**
63
+ * Returns a clone of the payload that is JSON safe
64
+ * @param meta Keeps underscore (meta) fields if set to true
65
+ * @returns Returns a clone of the payload that is JSON safe
66
+ */
67
+ jsonPayload(meta?: boolean): T;
68
+ }
69
+ //# sourceMappingURL=PayloadHasher-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PayloadHasher-browser.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,69 @@
1
+ import { Hash } from '@xylabs/hex';
2
+ import { EmptyObject, ObjectWrapper } from '@xylabs/object';
3
+ import { WasmSupport } from '@xyo-network/wasm';
4
+ import { Semaphore } from 'async-mutex';
5
+ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
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 warnIfUsingJsHash: boolean;
15
+ static readonly wasmHashThreads: any[];
16
+ static readonly wasmInitialized: Promise<void>;
17
+ static readonly wasmSemaphore: Semaphore;
18
+ static readonly wasmSupport: WasmSupport;
19
+ static filterExcludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
20
+ static filterIncludeByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
21
+ static findByHash<T extends EmptyObject>(objs: T[] | undefined, hash: Hash): Promise<T | undefined>;
22
+ /**
23
+ * Asynchronously hashes a payload
24
+ * @param obj A payload
25
+ * @returns The payload hash
26
+ */
27
+ static hash<T extends EmptyObject>(obj: T): Promise<Hash>;
28
+ static hashFields<T extends EmptyObject>(obj: T): T;
29
+ /**
30
+ * Creates an array of payload/hash tuples based on the payloads passed in
31
+ * @param objs Any array of payloads
32
+ * @returns An array of payload/hash tuples
33
+ */
34
+ static hashPairs<T extends EmptyObject>(objs: T[]): Promise<[T, Hash][]>;
35
+ /**
36
+ * Synchronously hashes a payload
37
+ * @param obj A payload
38
+ * @returns The payload hash
39
+ */
40
+ static hashSync<T extends EmptyObject>(obj: T): Hash;
41
+ /**
42
+ * Creates an array of payload hashes based on the payloads passed in
43
+ * @param objs Any array of payloads
44
+ * @returns An array of payload hashes
45
+ */
46
+ static hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined>;
47
+ static jsHash(data: string): Promise<any>;
48
+ /**
49
+ * Returns a clone of the payload that is JSON safe
50
+ * @param obj A payload
51
+ * @param meta Keeps underscore (meta) fields if set to true
52
+ * @returns Returns a clone of the payload that is JSON safe
53
+ */
54
+ static json<T extends EmptyObject>(payload: T, meta?: boolean): T;
55
+ /** @deprecated us json instead */
56
+ static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
57
+ static stringifyHashFields<T extends EmptyObject>(obj: T): string;
58
+ static subtleHash(data: Uint8Array): Promise<ArrayBuffer>;
59
+ static wasmHash(data: string): Promise<any>;
60
+ hash(): Promise<Hash>;
61
+ hashSync(): Hash;
62
+ /**
63
+ * Returns a clone of the payload that is JSON safe
64
+ * @param meta Keeps underscore (meta) fields if set to true
65
+ * @returns Returns a clone of the payload that is JSON safe
66
+ */
67
+ jsonPayload(meta?: boolean): T;
68
+ }
69
+ //# sourceMappingURL=PayloadHasher-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"PayloadHasher-browser.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher-browser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from './PayloadHasher-browser';
2
+ export * from './removeEmptyFields';
3
+ export * from './removeFields';
4
+ export * from './sortFields';
5
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './PayloadHasher-browser';
2
+ export * from './removeEmptyFields';
3
+ export * from './removeFields';
4
+ export * from './sortFields';
5
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
@@ -0,0 +1,5 @@
1
+ export * from './PayloadHasher-browser';
2
+ export * from './removeEmptyFields';
3
+ export * from './removeFields';
4
+ export * from './sortFields';
5
+ //# sourceMappingURL=index-browser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index-browser.d.ts","sourceRoot":"","sources":["../../src/index-browser.ts"],"names":[],"mappings":"AAAA,cAAc,yBAAyB,CAAA;AACvC,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
package/package.json CHANGED
@@ -16,7 +16,7 @@
16
16
  "@xylabs/object": "^2.89.1",
17
17
  "@xylabs/platform": "^2.14.1",
18
18
  "@xylabs/typeof": "^2.14.1",
19
- "@xyo-network/wasm": "~2.90.6",
19
+ "@xyo-network/wasm": "~2.90.8",
20
20
  "async-mutex": "^0.4.1",
21
21
  "hash-wasm": "^4.11.0",
22
22
  "sha.js": "^2.4.11",
@@ -34,12 +34,12 @@
34
34
  ".": {
35
35
  "browser": {
36
36
  "require": {
37
- "types": "./dist/browser/index.d.cts",
38
- "default": "./dist/browser/index.cjs"
37
+ "types": "./dist/browser/index-browser.d.cts",
38
+ "default": "./dist/browser/index-browser.cjs"
39
39
  },
40
40
  "import": {
41
- "types": "./dist/browser/index.d.mts",
42
- "default": "./dist/browser/index.js"
41
+ "types": "./dist/browser/index-browser.d.mts",
42
+ "default": "./dist/browser/index-browser.js"
43
43
  }
44
44
  },
45
45
  "node": {
@@ -68,6 +68,6 @@
68
68
  "url": "https://github.com/XYOracleNetwork/sdk-xyo-client-js.git"
69
69
  },
70
70
  "sideEffects": false,
71
- "version": "2.90.6",
71
+ "version": "2.90.8",
72
72
  "type": "module"
73
73
  }
@@ -0,0 +1,248 @@
1
+ import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'
2
+ import { EmptyObject, ObjectWrapper } from '@xylabs/object'
3
+ import { WasmSupport } from '@xyo-network/wasm'
4
+ import { Semaphore } from 'async-mutex'
5
+ import shajs from 'sha.js'
6
+ import { spawn, Worker } from 'threads'
7
+
8
+ import { removeEmptyFields } from './removeEmptyFields'
9
+ import { deepOmitPrefixedFields } from './removeFields'
10
+ import { sortFields } from './sortFields'
11
+ import { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'
12
+
13
+ const wasmSupportStatic = new WasmSupport(['bigInt'])
14
+ const maxHashThreads = 8
15
+ const maxListenersPerThread = 1
16
+
17
+ export class PayloadHasher<T extends EmptyObject = EmptyObject> extends ObjectWrapper<T> {
18
+ static allowSubtle = true
19
+
20
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
21
+ static readonly jsHashThreads: any[] = []
22
+ static readonly jsSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)
23
+
24
+ static lastJsThreadUsed: number
25
+ static lastSubtleThreadUsed: number
26
+ static lastWasmThreadUsed: number
27
+
28
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
29
+ static readonly subtleHashThreads: any[] = []
30
+ static readonly subtleSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)
31
+ static warnIfUsingJsHash = true
32
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
33
+ static readonly wasmHashThreads: any[] = []
34
+
35
+ static readonly wasmInitialized = wasmSupportStatic.initialize()
36
+ static readonly wasmSemaphore = new Semaphore(maxHashThreads * maxListenersPerThread)
37
+ static readonly wasmSupport = wasmSupportStatic
38
+
39
+ static async filterExcludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
40
+ const hashes = Array.isArray(hash) ? hash : [hash]
41
+ return (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))?.map((pair) => pair[0])
42
+ }
43
+
44
+ static async filterIncludeByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash[] | Hash): Promise<T[]> {
45
+ const hashes = Array.isArray(hash) ? hash : [hash]
46
+ return (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))?.map((pair) => pair[0])
47
+ }
48
+
49
+ static async findByHash<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {
50
+ return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]
51
+ }
52
+
53
+ /**
54
+ * Asynchronously hashes a payload
55
+ * @param obj A payload
56
+ * @returns The payload hash
57
+ */
58
+ static async hash<T extends EmptyObject>(obj: T): Promise<Hash> {
59
+ const stringToHash = this.stringifyHashFields(obj)
60
+
61
+ if (PayloadHasher.allowSubtle) {
62
+ try {
63
+ const enc = new TextEncoder()
64
+ const data = enc.encode(stringToHash)
65
+ const hashArray = await this.subtleHash(data)
66
+ return hexFromArrayBuffer(hashArray, { bitLength: 256 })
67
+ } catch {
68
+ PayloadHasher.allowSubtle = false
69
+ }
70
+ }
71
+
72
+ await this.wasmInitialized
73
+ if (this.wasmSupport.canUseWasm) {
74
+ try {
75
+ return this.wasmHash(stringToHash)
76
+ } catch {
77
+ this.wasmSupport.allowWasm = false
78
+ }
79
+ }
80
+ return await this.jsHash(stringToHash)
81
+ }
82
+
83
+ static hashFields<T extends EmptyObject>(obj: T): T {
84
+ return sortFields(removeEmptyFields(deepOmitPrefixedFields(obj, '_')))
85
+ }
86
+
87
+ /**
88
+ * Creates an array of payload/hash tuples based on the payloads passed in
89
+ * @param objs Any array of payloads
90
+ * @returns An array of payload/hash tuples
91
+ */
92
+ static async hashPairs<T extends EmptyObject>(objs: T[]): Promise<[T, Hash][]> {
93
+ return await Promise.all(objs.map<Promise<[T, string]>>(async (obj) => [obj, await PayloadHasher.hash(obj)]))
94
+ }
95
+
96
+ /**
97
+ * Synchronously hashes a payload
98
+ * @param obj A payload
99
+ * @returns The payload hash
100
+ */
101
+ static hashSync<T extends EmptyObject>(obj: T): Hash {
102
+ return asHash(shajs('sha256').update(this.stringifyHashFields(obj)).digest().toString('hex'), true)
103
+ }
104
+
105
+ /**
106
+ * Creates an array of payload hashes based on the payloads passed in
107
+ * @param objs Any array of payloads
108
+ * @returns An array of payload hashes
109
+ */
110
+ static async hashes<T extends EmptyObject>(objs?: T[]): Promise<Hash[] | undefined> {
111
+ return objs ? await Promise.all(objs.map((obj) => this.hash(obj))) : undefined
112
+ }
113
+
114
+ static async jsHash(data: string) {
115
+ await this.jsSemaphore.acquire()
116
+ if (PayloadHasher.warnIfUsingJsHash) {
117
+ console.warn('Using jsHash [No subtle or wasm?]')
118
+ }
119
+ try {
120
+ if (this.jsHashThreads.length < maxHashThreads) {
121
+ let w: Worker
122
+ try {
123
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
124
+ w = new Worker(new URL('worker/jsHash.js', import.meta.url) as any)
125
+ } catch {
126
+ //we do this to make jsdom work
127
+ const code = jsHashFunc.toString().slice(6)
128
+ w = new Worker(
129
+ code,
130
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
131
+ { fromSource: true } as any,
132
+ )
133
+ }
134
+ const worker = await spawn(w)
135
+ this.jsHashThreads.push(worker)
136
+ }
137
+ let threadToUse = this.lastJsThreadUsed === undefined ? 0 : this.lastJsThreadUsed + 1
138
+ if (threadToUse >= this.jsHashThreads.length) {
139
+ threadToUse = 0
140
+ }
141
+ this.lastJsThreadUsed = threadToUse
142
+
143
+ return await this.jsHashThreads[threadToUse].hash(data)
144
+ } finally {
145
+ this.jsSemaphore.release()
146
+ }
147
+ }
148
+
149
+ /**
150
+ * Returns a clone of the payload that is JSON safe
151
+ * @param obj A payload
152
+ * @param meta Keeps underscore (meta) fields if set to true
153
+ * @returns Returns a clone of the payload that is JSON safe
154
+ */
155
+ static json<T extends EmptyObject>(payload: T, meta = false): T {
156
+ return sortFields(removeEmptyFields(meta ? payload : deepOmitPrefixedFields(payload, '_')))
157
+ }
158
+
159
+ /** @deprecated us json instead */
160
+ static jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {
161
+ return this.json(payload, meta)
162
+ }
163
+
164
+ static stringifyHashFields<T extends EmptyObject>(obj: T) {
165
+ return JSON.stringify(this.hashFields(obj))
166
+ }
167
+
168
+ static async subtleHash(data: Uint8Array): Promise<ArrayBuffer> {
169
+ await this.subtleSemaphore.acquire()
170
+ try {
171
+ if (this.subtleHashThreads.length < maxHashThreads) {
172
+ let w: Worker
173
+ try {
174
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
175
+ w = new Worker(new URL('worker/subtleHash.js', import.meta.url) as any)
176
+ } catch {
177
+ //we do this to make jsdom work
178
+ const code = subtleHashFunc.toString().slice(6)
179
+ w = new Worker(
180
+ code,
181
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
182
+ { fromSource: true } as any,
183
+ )
184
+ }
185
+ const worker = await spawn(w)
186
+ this.subtleHashThreads.push(worker)
187
+ }
188
+ let threadToUse = this.lastSubtleThreadUsed === undefined ? 0 : this.lastSubtleThreadUsed + 1
189
+ if (threadToUse >= this.subtleHashThreads.length) {
190
+ threadToUse = 0
191
+ }
192
+ this.lastSubtleThreadUsed = threadToUse
193
+
194
+ return await this.subtleHashThreads[threadToUse].hash(data)
195
+ } finally {
196
+ this.subtleSemaphore.release()
197
+ }
198
+ }
199
+
200
+ static async wasmHash(data: string) {
201
+ await this.wasmSemaphore.acquire()
202
+ try {
203
+ if (this.wasmHashThreads.length < maxHashThreads) {
204
+ let w: Worker
205
+ try {
206
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
207
+ w = new Worker(new URL('worker/wasmHash.js', import.meta.url) as any)
208
+ } catch {
209
+ //we do this to make jsdom work
210
+ const code = wasmHashFunc.toString().slice(6)
211
+ w = new Worker(
212
+ code,
213
+ // eslint-disable-next-line @typescript-eslint/no-explicit-any
214
+ { fromSource: true } as any,
215
+ )
216
+ }
217
+ const worker = await spawn(w)
218
+ this.wasmHashThreads.push(worker)
219
+ }
220
+ let threadToUse = this.lastWasmThreadUsed === undefined ? 0 : this.lastWasmThreadUsed + 1
221
+ if (threadToUse >= this.wasmHashThreads.length) {
222
+ threadToUse = 0
223
+ }
224
+ this.lastWasmThreadUsed = threadToUse
225
+
226
+ return await this.wasmHashThreads[threadToUse].hash(data)
227
+ } finally {
228
+ this.wasmSemaphore.release()
229
+ }
230
+ }
231
+
232
+ async hash(): Promise<Hash> {
233
+ return await PayloadHasher.hash(this.obj)
234
+ }
235
+
236
+ hashSync(): Hash {
237
+ return PayloadHasher.hashSync(this.obj)
238
+ }
239
+
240
+ /**
241
+ * Returns a clone of the payload that is JSON safe
242
+ * @param meta Keeps underscore (meta) fields if set to true
243
+ * @returns Returns a clone of the payload that is JSON safe
244
+ */
245
+ jsonPayload(meta = false): T {
246
+ return PayloadHasher.jsonPayload(this.obj, meta)
247
+ }
248
+ }
@@ -0,0 +1,4 @@
1
+ export * from './PayloadHasher-browser'
2
+ export * from './removeEmptyFields'
3
+ export * from './removeFields'
4
+ export * from './sortFields'
package/xy.config.ts CHANGED
@@ -2,7 +2,7 @@ import { XyTsupConfig } from '@xylabs/ts-scripts-yarn3'
2
2
  const config: XyTsupConfig = {
3
3
  compile: {
4
4
  browser: {
5
- src: { entry: ['./src/index.ts', './src/worker/*'] },
5
+ src: { entry: ['./src/index-browser.ts', './src/worker/*'] },
6
6
  },
7
7
  node: {
8
8
  src: { entry: ['./src/index.ts', './src/worker/*'] },
@@ -1 +0,0 @@
1
- {"version":3,"sources":["../../src/index.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts","../../src/worker/jsHash.ts","../../src/worker/subtleHash.ts","../../src/worker/wasmHash.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'\nimport { jsHashFunc, subtleHashFunc, wasmHashFunc } from './worker'\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 static warnIfUsingJsHash = true\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 {\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 if (PayloadHasher.warnIfUsingJsHash) {\n console.warn('Using jsHash [No subtle or wasm?]')\n }\n try {\n if (this.jsHashThreads.length < maxHashThreads) {\n const code = jsHashFunc.toString().slice(6)\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n 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 code = subtleHashFunc.toString().slice(6)\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n 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 code = wasmHashFunc.toString().slice(6)\n const w = new Worker(\n code,\n // eslint-disable-next-line @typescript-eslint/no-explicit-any\n { fromSource: true } as any,\n )\n 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","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const jsHashFunc = () => {\n const shajs = require('sha.js')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n hash(data: string) {\n return asHash(shajs('sha256').update(data).digest().toString('hex'), true)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const subtleHashFunc = () => {\n const { subtle } = require('@xylabs/platform')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: ArrayBuffer) {\n return await subtle.digest('SHA-256', data)\n },\n })\n}\n","/* eslint-disable @typescript-eslint/no-var-requires */\nexport const wasmHashFunc = () => {\n const { sha256 } = require('hash-wasm')\n const { asHash } = require('@xylabs/hex')\n // eslint-disable-next-line import/no-internal-modules\n const { expose } = require('threads/worker')\n\n expose({\n async hash(data: string) {\n return asHash(await sha256(data), true)\n },\n })\n}\n"],"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","jsHashFunc","shajs","require","asHash","expose","hash","data","update","digest","toString","subtleHashFunc","subtle","require","expose","hash","data","digest","wasmHashFunc","sha256","require","asHash","expose","hash","data","wasmSupportStatic","WasmSupport","maxHashThreads","maxListenersPerThread","PayloadHasher","ObjectWrapper","allowSubtle","jsHashThreads","jsSemaphore","Semaphore","lastJsThreadUsed","lastSubtleThreadUsed","lastWasmThreadUsed","subtleHashThreads","subtleSemaphore","warnIfUsingJsHash","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","canUseWasm","wasmHash","allowWasm","jsHash","hashFields","sortFields","removeEmptyFields","deepOmitPrefixedFields","Promise","all","hashSync","asHash","shajs","update","digest","toString","undefined","acquire","console","warn","length","code","jsHashFunc","slice","w","Worker","fromSource","worker","spawn","push","threadToUse","release","json","payload","meta","jsonPayload","JSON","stringify","subtleHashFunc","wasmHashFunc"]}