@xyo-network/hash 2.84.6 → 2.84.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.
- package/dist/browser/PayloadHasher.d.cts +38 -10
- package/dist/browser/PayloadHasher.d.cts.map +1 -1
- package/dist/browser/PayloadHasher.d.mts +38 -10
- package/dist/browser/PayloadHasher.d.mts.map +1 -1
- package/dist/browser/PayloadHasher.d.ts +38 -10
- package/dist/browser/PayloadHasher.d.ts.map +1 -1
- package/dist/browser/index.cjs +49 -11
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.js +49 -11
- package/dist/browser/index.js.map +1 -1
- package/dist/node/PayloadHasher.d.cts +38 -10
- package/dist/node/PayloadHasher.d.cts.map +1 -1
- package/dist/node/PayloadHasher.d.mts +38 -10
- package/dist/node/PayloadHasher.d.mts.map +1 -1
- package/dist/node/PayloadHasher.d.ts +38 -10
- package/dist/node/PayloadHasher.d.ts.map +1 -1
- package/dist/node/index.cjs +49 -11
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.js +49 -11
- package/dist/node/index.js.map +1 -1
- package/package.json +6 -6
- package/src/PayloadHasher.ts +46 -16
- package/src/model.ts +1 -1
- package/src/removeEmptyFields.ts +2 -2
- package/src/sortFields.ts +2 -2
|
@@ -8,24 +8,52 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
8
8
|
static filterExclude<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
9
9
|
static filterInclude<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
10
10
|
static find<T extends EmptyObject>(objs: T[] | undefined, hash: Hash): Promise<T | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* Asynchronously hashes a payload
|
|
13
|
+
* @param obj A payload
|
|
14
|
+
* @returns The payload hash
|
|
15
|
+
*/
|
|
11
16
|
static hashAsync<T extends EmptyObject>(obj: T): Promise<Hash>;
|
|
12
17
|
static hashFields<T extends EmptyObject>(obj: T): T;
|
|
18
|
+
/**
|
|
19
|
+
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
20
|
+
* @param objs Any array of payloads
|
|
21
|
+
* @returns An array of payload/hash tuples
|
|
22
|
+
*/
|
|
13
23
|
static hashPairs<T extends EmptyObject>(objs: T[]): Promise<[T, Hash][]>;
|
|
24
|
+
/**
|
|
25
|
+
* Synchronously hashes a payload
|
|
26
|
+
* @param obj A payload
|
|
27
|
+
* @returns The payload hash
|
|
28
|
+
*/
|
|
14
29
|
static hashSync<T extends EmptyObject>(obj: T): Hash;
|
|
30
|
+
/**
|
|
31
|
+
* Creates an array of payload hashes based on the payloads passed in
|
|
32
|
+
* @param objs Any array of payloads
|
|
33
|
+
* @returns An array of payload hashes
|
|
34
|
+
*/
|
|
15
35
|
static hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]>;
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Returns a clone of the payload that is JSON safe
|
|
38
|
+
* @param obj A payload
|
|
39
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
40
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
41
|
+
*/
|
|
42
|
+
static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
|
|
22
43
|
static stringifyHashFields<T extends EmptyObject>(obj: T): string;
|
|
44
|
+
/**
|
|
45
|
+
* Creates an object map of payload hashes to payloads based on the payloads passed in
|
|
46
|
+
* @param objs Any array of payloads
|
|
47
|
+
* @returns A map of hashes to payloads
|
|
48
|
+
*/
|
|
23
49
|
static toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>>;
|
|
24
50
|
hashAsync(): Promise<Hash>;
|
|
25
51
|
hashSync(): Hash;
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Returns a clone of the payload that is JSON safe
|
|
54
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
55
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
56
|
+
*/
|
|
57
|
+
jsonPayload(meta?: boolean): T;
|
|
30
58
|
}
|
|
31
59
|
//# sourceMappingURL=PayloadHasher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,WAAW,UAAO;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,gBAAiC;IAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,cAAoB;WAElC,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,WAAW,UAAO;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,gBAAiC;IAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,cAAoB;WAElC,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAI5F;;;;OAIG;WACU,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BpE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IAInD;;;;OAIG;WACU,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IAI9E;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IAIpD;;;;OAIG;WACU,MAAM,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAItE;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,UAAQ,GAAG,CAAC;IAItE,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC;IAIxD;;;;OAIG;WACU,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAUxE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,QAAQ,IAAI,IAAI;IAIhB;;;;OAIG;IACH,WAAW,CAAC,IAAI,UAAQ,GAAG,CAAC;CAG7B"}
|
|
@@ -8,24 +8,52 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
8
8
|
static filterExclude<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
9
9
|
static filterInclude<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
10
10
|
static find<T extends EmptyObject>(objs: T[] | undefined, hash: Hash): Promise<T | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* Asynchronously hashes a payload
|
|
13
|
+
* @param obj A payload
|
|
14
|
+
* @returns The payload hash
|
|
15
|
+
*/
|
|
11
16
|
static hashAsync<T extends EmptyObject>(obj: T): Promise<Hash>;
|
|
12
17
|
static hashFields<T extends EmptyObject>(obj: T): T;
|
|
18
|
+
/**
|
|
19
|
+
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
20
|
+
* @param objs Any array of payloads
|
|
21
|
+
* @returns An array of payload/hash tuples
|
|
22
|
+
*/
|
|
13
23
|
static hashPairs<T extends EmptyObject>(objs: T[]): Promise<[T, Hash][]>;
|
|
24
|
+
/**
|
|
25
|
+
* Synchronously hashes a payload
|
|
26
|
+
* @param obj A payload
|
|
27
|
+
* @returns The payload hash
|
|
28
|
+
*/
|
|
14
29
|
static hashSync<T extends EmptyObject>(obj: T): Hash;
|
|
30
|
+
/**
|
|
31
|
+
* Creates an array of payload hashes based on the payloads passed in
|
|
32
|
+
* @param objs Any array of payloads
|
|
33
|
+
* @returns An array of payload hashes
|
|
34
|
+
*/
|
|
15
35
|
static hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]>;
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Returns a clone of the payload that is JSON safe
|
|
38
|
+
* @param obj A payload
|
|
39
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
40
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
41
|
+
*/
|
|
42
|
+
static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
|
|
22
43
|
static stringifyHashFields<T extends EmptyObject>(obj: T): string;
|
|
44
|
+
/**
|
|
45
|
+
* Creates an object map of payload hashes to payloads based on the payloads passed in
|
|
46
|
+
* @param objs Any array of payloads
|
|
47
|
+
* @returns A map of hashes to payloads
|
|
48
|
+
*/
|
|
23
49
|
static toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>>;
|
|
24
50
|
hashAsync(): Promise<Hash>;
|
|
25
51
|
hashSync(): Hash;
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Returns a clone of the payload that is JSON safe
|
|
54
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
55
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
56
|
+
*/
|
|
57
|
+
jsonPayload(meta?: boolean): T;
|
|
30
58
|
}
|
|
31
59
|
//# sourceMappingURL=PayloadHasher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,WAAW,UAAO;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,gBAAiC;IAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,cAAoB;WAElC,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,WAAW,UAAO;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,gBAAiC;IAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,cAAoB;WAElC,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAI5F;;;;OAIG;WACU,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BpE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IAInD;;;;OAIG;WACU,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IAI9E;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IAIpD;;;;OAIG;WACU,MAAM,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAItE;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,UAAQ,GAAG,CAAC;IAItE,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC;IAIxD;;;;OAIG;WACU,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAUxE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,QAAQ,IAAI,IAAI;IAIhB;;;;OAIG;IACH,WAAW,CAAC,IAAI,UAAQ,GAAG,CAAC;CAG7B"}
|
|
@@ -8,24 +8,52 @@ export declare class PayloadHasher<T extends EmptyObject = EmptyObject> extends
|
|
|
8
8
|
static filterExclude<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
9
9
|
static filterInclude<T extends EmptyObject>(objs: T[] | undefined, hash: Hash[] | Hash): Promise<T[]>;
|
|
10
10
|
static find<T extends EmptyObject>(objs: T[] | undefined, hash: Hash): Promise<T | undefined>;
|
|
11
|
+
/**
|
|
12
|
+
* Asynchronously hashes a payload
|
|
13
|
+
* @param obj A payload
|
|
14
|
+
* @returns The payload hash
|
|
15
|
+
*/
|
|
11
16
|
static hashAsync<T extends EmptyObject>(obj: T): Promise<Hash>;
|
|
12
17
|
static hashFields<T extends EmptyObject>(obj: T): T;
|
|
18
|
+
/**
|
|
19
|
+
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
20
|
+
* @param objs Any array of payloads
|
|
21
|
+
* @returns An array of payload/hash tuples
|
|
22
|
+
*/
|
|
13
23
|
static hashPairs<T extends EmptyObject>(objs: T[]): Promise<[T, Hash][]>;
|
|
24
|
+
/**
|
|
25
|
+
* Synchronously hashes a payload
|
|
26
|
+
* @param obj A payload
|
|
27
|
+
* @returns The payload hash
|
|
28
|
+
*/
|
|
14
29
|
static hashSync<T extends EmptyObject>(obj: T): Hash;
|
|
30
|
+
/**
|
|
31
|
+
* Creates an array of payload hashes based on the payloads passed in
|
|
32
|
+
* @param objs Any array of payloads
|
|
33
|
+
* @returns An array of payload hashes
|
|
34
|
+
*/
|
|
15
35
|
static hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]>;
|
|
16
|
-
/**
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
36
|
+
/**
|
|
37
|
+
* Returns a clone of the payload that is JSON safe
|
|
38
|
+
* @param obj A payload
|
|
39
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
40
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
41
|
+
*/
|
|
42
|
+
static jsonPayload<T extends EmptyObject>(payload: T, meta?: boolean): T;
|
|
22
43
|
static stringifyHashFields<T extends EmptyObject>(obj: T): string;
|
|
44
|
+
/**
|
|
45
|
+
* Creates an object map of payload hashes to payloads based on the payloads passed in
|
|
46
|
+
* @param objs Any array of payloads
|
|
47
|
+
* @returns A map of hashes to payloads
|
|
48
|
+
*/
|
|
23
49
|
static toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>>;
|
|
24
50
|
hashAsync(): Promise<Hash>;
|
|
25
51
|
hashSync(): Hash;
|
|
26
|
-
/**
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
52
|
+
/**
|
|
53
|
+
* Returns a clone of the payload that is JSON safe
|
|
54
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
55
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
56
|
+
*/
|
|
57
|
+
jsonPayload(meta?: boolean): T;
|
|
30
58
|
}
|
|
31
59
|
//# sourceMappingURL=PayloadHasher.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,WAAW,UAAO;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,gBAAiC;IAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,cAAoB;WAElC,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;
|
|
1
|
+
{"version":3,"file":"PayloadHasher.d.ts","sourceRoot":"","sources":["../../src/PayloadHasher.ts"],"names":[],"mappings":"AAAA,OAAO,EAAU,IAAI,EAAsB,MAAM,aAAa,CAAA;AAE9D,OAAO,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,WAAW,EAAE,MAAM,mBAAmB,CAAA;AAU/C,qBAAa,aAAa,CAAC,CAAC,SAAS,WAAW,GAAG,WAAW,CAAE,SAAQ,aAAa,CAAC,CAAC,CAAC;IACtF,MAAM,CAAC,WAAW,UAAO;IACzB,MAAM,CAAC,QAAQ,CAAC,eAAe,gBAAiC;IAChE,MAAM,CAAC,QAAQ,CAAC,WAAW,cAAoB;WAElC,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,aAAa,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,EAAE,GAAG,IAAI,GAAG,OAAO,CAAC,CAAC,EAAE,CAAC;WAKvF,IAAI,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,iBAAU,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,SAAS,CAAC;IAI5F;;;;OAIG;WACU,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,OAAO,CAAC,IAAI,CAAC;IA4BpE,MAAM,CAAC,UAAU,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC;IAInD;;;;OAIG;WACU,SAAS,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,CAAC,CAAC,EAAE,IAAI,CAAC,EAAE,CAAC;IAI9E;;;;OAIG;IACH,MAAM,CAAC,QAAQ,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC,GAAG,IAAI;IAIpD;;;;OAIG;WACU,MAAM,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,IAAI,EAAE,CAAC;IAItE;;;;;OAKG;IACH,MAAM,CAAC,WAAW,CAAC,CAAC,SAAS,WAAW,EAAE,OAAO,EAAE,CAAC,EAAE,IAAI,UAAQ,GAAG,CAAC;IAItE,MAAM,CAAC,mBAAmB,CAAC,CAAC,SAAS,WAAW,EAAE,GAAG,EAAE,CAAC;IAIxD;;;;OAIG;WACU,KAAK,CAAC,CAAC,SAAS,WAAW,EAAE,IAAI,EAAE,CAAC,EAAE,GAAG,OAAO,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC;IAUxE,SAAS,IAAI,OAAO,CAAC,IAAI,CAAC;IAIhC,QAAQ,IAAI,IAAI;IAIhB;;;;OAIG;IACH,WAAW,CAAC,IAAI,UAAQ,GAAG,CAAC;CAG7B"}
|
package/dist/browser/index.cjs
CHANGED
|
@@ -41,7 +41,7 @@ __export(src_exports, {
|
|
|
41
41
|
module.exports = __toCommonJS(src_exports);
|
|
42
42
|
|
|
43
43
|
// src/model.ts
|
|
44
|
-
var hexRegex = /[
|
|
44
|
+
var hexRegex = /[\da-f]+/i;
|
|
45
45
|
var isHex = (value) => hexRegex.test(value);
|
|
46
46
|
|
|
47
47
|
// src/PayloadHasher.ts
|
|
@@ -58,13 +58,13 @@ var removeEmptyFields = (obj) => {
|
|
|
58
58
|
if (obj === null || Array.isArray(obj))
|
|
59
59
|
return obj;
|
|
60
60
|
const newObject = {};
|
|
61
|
-
|
|
61
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
62
62
|
if ((0, import_typeof.typeOf)(value) === "object") {
|
|
63
63
|
newObject[key] = removeEmptyFields(value);
|
|
64
64
|
} else if (value !== void 0) {
|
|
65
65
|
newObject[key] = value;
|
|
66
66
|
}
|
|
67
|
-
}
|
|
67
|
+
}
|
|
68
68
|
return newObject;
|
|
69
69
|
};
|
|
70
70
|
|
|
@@ -96,9 +96,9 @@ var subSort = (value) => {
|
|
|
96
96
|
var sortFields = (obj) => {
|
|
97
97
|
const result = {};
|
|
98
98
|
const keys = Object.keys(obj);
|
|
99
|
-
keys.sort()
|
|
99
|
+
for (const key of keys.sort()) {
|
|
100
100
|
result[key] = subSort(obj[key]);
|
|
101
|
-
}
|
|
101
|
+
}
|
|
102
102
|
return result;
|
|
103
103
|
};
|
|
104
104
|
|
|
@@ -119,6 +119,11 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
119
119
|
static async find(objs = [], hash) {
|
|
120
120
|
return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0];
|
|
121
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Asynchronously hashes a payload
|
|
124
|
+
* @param obj A payload
|
|
125
|
+
* @returns The payload hash
|
|
126
|
+
*/
|
|
122
127
|
static async hashAsync(obj) {
|
|
123
128
|
if (_PayloadHasher.allowSubtle) {
|
|
124
129
|
try {
|
|
@@ -139,7 +144,7 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
139
144
|
const stringToHash = this.stringifyHashFields(obj);
|
|
140
145
|
try {
|
|
141
146
|
return (0, import_hex.asHash)(await (0, import_hash_wasm.sha256)(stringToHash), true);
|
|
142
|
-
} catch
|
|
147
|
+
} catch {
|
|
143
148
|
this.wasmSupport.allowWasm = false;
|
|
144
149
|
}
|
|
145
150
|
}
|
|
@@ -148,26 +153,55 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
148
153
|
static hashFields(obj) {
|
|
149
154
|
return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
|
|
150
155
|
}
|
|
156
|
+
/**
|
|
157
|
+
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
158
|
+
* @param objs Any array of payloads
|
|
159
|
+
* @returns An array of payload/hash tuples
|
|
160
|
+
*/
|
|
151
161
|
static async hashPairs(objs) {
|
|
152
162
|
return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hashAsync(obj)]));
|
|
153
163
|
}
|
|
164
|
+
/**
|
|
165
|
+
* Synchronously hashes a payload
|
|
166
|
+
* @param obj A payload
|
|
167
|
+
* @returns The payload hash
|
|
168
|
+
*/
|
|
154
169
|
static hashSync(obj) {
|
|
155
170
|
return (0, import_hex.asHash)((0, import_sha.default)("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex"), true);
|
|
156
171
|
}
|
|
172
|
+
/**
|
|
173
|
+
* Creates an array of payload hashes based on the payloads passed in
|
|
174
|
+
* @param objs Any array of payloads
|
|
175
|
+
* @returns An array of payload hashes
|
|
176
|
+
*/
|
|
157
177
|
static async hashes(objs) {
|
|
158
178
|
return await Promise.all(objs.map((obj) => this.hashAsync(obj)));
|
|
159
179
|
}
|
|
160
|
-
/**
|
|
180
|
+
/**
|
|
181
|
+
* Returns a clone of the payload that is JSON safe
|
|
182
|
+
* @param obj A payload
|
|
183
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
184
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
185
|
+
*/
|
|
161
186
|
static jsonPayload(payload, meta = false) {
|
|
162
187
|
return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)));
|
|
163
188
|
}
|
|
164
189
|
static stringifyHashFields(obj) {
|
|
165
190
|
return JSON.stringify(this.hashFields(obj));
|
|
166
191
|
}
|
|
192
|
+
/**
|
|
193
|
+
* Creates an object map of payload hashes to payloads based on the payloads passed in
|
|
194
|
+
* @param objs Any array of payloads
|
|
195
|
+
* @returns A map of hashes to payloads
|
|
196
|
+
*/
|
|
167
197
|
static async toMap(objs) {
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
198
|
+
return Object.fromEntries(
|
|
199
|
+
await Promise.all(
|
|
200
|
+
objs.map(async (obj) => {
|
|
201
|
+
return [await _PayloadHasher.hashAsync(obj), obj];
|
|
202
|
+
})
|
|
203
|
+
)
|
|
204
|
+
);
|
|
171
205
|
}
|
|
172
206
|
async hashAsync() {
|
|
173
207
|
return await _PayloadHasher.hashAsync(this.obj);
|
|
@@ -175,7 +209,11 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
175
209
|
hashSync() {
|
|
176
210
|
return _PayloadHasher.hashSync(this.obj);
|
|
177
211
|
}
|
|
178
|
-
/**
|
|
212
|
+
/**
|
|
213
|
+
* Returns a clone of the payload that is JSON safe
|
|
214
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
215
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
216
|
+
*/
|
|
179
217
|
jsonPayload(meta = false) {
|
|
180
218
|
return _PayloadHasher.jsonPayload(this.obj, meta);
|
|
181
219
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/index.ts","../../src/model.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["export * from './model'\nexport * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","/** @deprecated use @xylabs/hex instead */\nconst hexRegex = /[0-9a-f]+/i\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hex = string\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hash = Hex\n\n/** @deprecated use @xylabs/hex instead */\nexport const isHex = (value: string): value is Hex => hexRegex.test(value)\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } 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 filterExclude<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 filterInclude<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 find<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hashAsync<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 (ex) {\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(deepOmitUnderscoreFields(obj)))\n }\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.hashAsync(obj)]))\n }\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 static async hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n /** @function jsonPayload Returns a clone of the payload that is JSON safe */\n static jsonPayload<T extends EmptyObject>(\n /** @param payload The payload to process */\n payload: T,\n /** @param meta Keeps underscore (meta) fields if set to true */\n meta = false,\n ): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<string, T> = {}\n await Promise.all(objs.map(async (obj) => (result[await PayloadHasher.hashAsync(obj)] = obj)))\n return result\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(this.obj)\n }\n\n /** @function jsonPayload Returns a clone of the payload that is JSON safe */\n jsonPayload(\n /** @param meta Keeps underscore (meta) fields if set to true */\n meta = false,\n ): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\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 Object.entries(obj).forEach(([key, value]) => {\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 { isObject, mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\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 deepOmitUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } from '@xyo-network/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 keys.sort().forEach((key: keyof T) => {\n result[key] = subSort(obj[key])\n })\n return result as T\n}\n"],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;;;ACCA,IAAM,WAAW;AASV,IAAM,QAAQ,CAAC,UAAgC,SAAS,KAAK,KAAK;;;ACVzE,iBAAiD;AACjD,sBAAuB;AACvB,IAAAA,iBAA2C;AAC3C,kBAA4B;AAC5B,uBAAuB;AACvB,iBAAkB;;;ACLlB,oBAAuB;AAGhB,IAAM,oBAAoB,CAAwB,QAAc;AACrE,MAAI,QAAQ,QAAQ,MAAM,QAAQ,GAAG;AAAG,WAAO;AAE/C,QAAM,YAAuB,CAAC;AAC9B,SAAO,QAAQ,GAAG,EAAE,QAAQ,CAAC,CAAC,KAAK,KAAK,MAAM;AAC5C,YAAI,sBAAO,KAAK,MAAM,UAAU;AAC9B,gBAAU,GAAG,IAAI,kBAAkB,KAAgC;AAAA,IACrE,WAAW,UAAU,QAAW;AAC9B,gBAAU,GAAG,IAAI;AAAA,IACnB;AAAA,EACF,CAAC;AACD,SAAO;AACT;;;ACfA,oBAA2D;AAKpD,IAAM,SAAS,CAAwB,KAAQ,WAAgC,SAA2C;AAC/H,MAAI,MAAM,QAAQ,GAAG,GAAG;AACtB,WAAO;AAAA,EACT;AAGA,QAAM,kBAAc,sBAAU,KAAK,sBAAQ;AAG3C,QAAM,iBAAa,sBAAU,KAAK,CAAC,UAAU,KAAC,wBAAS,KAAK,CAAC;AAE7D,QAAM,oBAAgB,sBAAO,aAAa,SAAS;AACnD,QAAM,uBAAmB,sBAAO,YAAY,SAAS;AAErD,QAAM,uBAAmB,yBAAU,eAAe,CAACC,SAAW,OAAOA,MAAK,WAAW,IAAI,CAAC;AAE1F,aAAO,qBAAM,CAAC,GAAG,kBAAkB,gBAAgB;AACrD;AAEO,IAAM,2BAA2B,CAAwB,QAAc;AAC5E,SAAO,OAAO,KAAK,CAAC,GAAG,QAAQ,IAAI,WAAW,GAAG,GAAG,oBAAM;AAC5D;AAEO,IAAM,2BAA2B,CAAwB,QAAc;AAC5E,SAAO,OAAO,KAAK,CAAC,GAAG,QAAQ,IAAI,WAAW,GAAG,GAAG,oBAAM;AAC5D;;;AC9BA,oBAAiD;AAGjD,IAAM,UAAU,CAAC,UAAmB;AAClC,aAAO,wBAAS,KAAK,IAAI,WAAW,KAAK,IAAI;AAC/C;AAEO,IAAM,aAAa,CAAwB,QAAW;AAC3D,QAAM,SAAoB,CAAC;AAC3B,QAAM,OAAO,OAAO,KAAK,GAAG;AAC5B,OAAK,KAAK,EAAE,QAAQ,CAAC,QAAiB;AACpC,WAAO,GAAG,IAAI,QAAQ,IAAI,GAAG,CAAC;AAAA,EAChC,CAAC;AACD,SAAO;AACT;;;AHHA,IAAM,oBAAoB,IAAI,wBAAY,CAAC,QAAQ,CAAC;AAE7C,IAAM,gBAAN,MAAM,uBAA2D,6BAAiB;AAAA,EACvF,OAAO,cAAc;AAAA,EACrB,OAAgB,kBAAkB,kBAAkB,WAAW;AAAA,EAC/D,OAAgB,cAAc;AAAA,EAE9B,aAAa,cAAqC,OAAY,CAAC,GAAG,MAAmC;AACnG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,CAAC,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAChH;AAAA,EAEA,aAAa,cAAqC,OAAY,CAAC,GAAG,MAAmC;AACnG,UAAM,SAAS,MAAM,QAAQ,IAAI,IAAI,OAAO,CAAC,IAAI;AACjD,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,OAAO,CAAC,CAAC,GAAG,OAAO,MAAM,OAAO,SAAS,OAAO,CAAC,GAAG,IAAI,CAAC,SAAS,KAAK,CAAC,CAAC;AAAA,EAC/G;AAAA,EAEA,aAAa,KAA4B,OAAY,CAAC,GAAG,MAAoC;AAC3F,YAAQ,MAAM,KAAK,UAAU,IAAI,GAAG,KAAK,CAAC,CAAC,GAAG,OAAO,MAAM,YAAY,IAAI,IAAI,CAAC;AAAA,EAClF;AAAA,EAEA,aAAa,UAAiC,KAAuB;AACnE,QAAI,eAAc,aAAa;AAC7B,UAAI;AACF,cAAM,MAAM,IAAI,YAAY;AAC5B,cAAM,eAAe,KAAK,oBAAoB,GAAG;AACjD,cAAM,IAAI,IAAI,OAAO,YAAY;AACjC,cAAM,YAAY,MAAM,uBAAO,OAAO,WAAW,CAAC;AAClD,mBAAO,+BAAmB,WAAW,EAAE,WAAW,IAAI,CAAC;AAAA,MACzD,SAAS,IAAI;AACX,cAAM,QAAQ;AACd,gBAAQ,MAAM,iCAAiC,MAAM,OAAO,GAAG;AAC/D,gBAAQ,IAAI,MAAM,KAAK;AACvB,uBAAc,cAAc;AAAA,MAC9B;AAAA,IACF;AAEA,UAAM,KAAK;AACX,QAAI,KAAK,YAAY,YAAY;AAC/B,YAAM,eAAe,KAAK,oBAAoB,GAAG;AACjD,UAAI;AACF,mBAAO,mBAAO,UAAM,yBAAO,YAAY,GAAG,IAAI;AAAA,MAChD,SAAS,IAAI;AACX,aAAK,YAAY,YAAY;AAAA,MAC/B;AAAA,IACF;AACA,WAAO,KAAK,SAAS,GAAG;AAAA,EAC1B;AAAA,EAEA,OAAO,WAAkC,KAAW;AAClD,WAAO,WAAW,kBAAkB,yBAAyB,GAAG,CAAC,CAAC;AAAA,EACpE;AAAA,EAEA,aAAa,UAAiC,MAAiC;AAC7E,WAAO,MAAM,QAAQ,IAAI,KAAK,IAA0B,OAAO,QAAQ,CAAC,KAAK,MAAM,eAAc,UAAU,GAAG,CAAC,CAAC,CAAC;AAAA,EACnH;AAAA,EAEA,OAAO,SAAgC,KAAc;AACnD,eAAO,uBAAO,WAAAC,SAAM,QAAQ,EAAE,OAAO,KAAK,oBAAoB,GAAG,CAAC,EAAE,OAAO,EAAE,SAAS,KAAK,GAAG,IAAI;AAAA,EACpG;AAAA,EAEA,aAAa,OAA8B,MAA4B;AACrE,WAAO,MAAM,QAAQ,IAAI,KAAK,IAAI,CAAC,QAAQ,KAAK,UAAU,GAAG,CAAC,CAAC;AAAA,EACjE;AAAA;AAAA,EAGA,OAAO,YAEL,SAEA,OAAO,OACJ;AACH,WAAO,WAAW,kBAAkB,OAAO,UAAU,yBAAyB,OAAO,CAAC,CAAC;AAAA,EACzF;AAAA,EAEA,OAAO,oBAA2C,KAAQ;AACxD,WAAO,KAAK,UAAU,KAAK,WAAW,GAAG,CAAC;AAAA,EAC5C;AAAA,EAEA,aAAa,MAA6B,MAAqC;AAC7E,UAAM,SAA4B,CAAC;AACnC,UAAM,QAAQ,IAAI,KAAK,IAAI,OAAO,QAAS,OAAO,MAAM,eAAc,UAAU,GAAG,CAAC,IAAI,GAAI,CAAC;AAC7F,WAAO;AAAA,EACT;AAAA,EAEA,MAAM,YAA2B;AAC/B,WAAO,MAAM,eAAc,UAAU,KAAK,GAAG;AAAA,EAC/C;AAAA,EAEA,WAAiB;AACf,WAAO,eAAc,SAAS,KAAK,GAAG;AAAA,EACxC;AAAA;AAAA,EAGA,YAEE,OAAO,OACJ;AACH,WAAO,eAAc,YAAY,KAAK,KAAK,IAAI;AAAA,EACjD;AACF;","names":["import_object","obj","shajs"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/model.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["export * from './model'\nexport * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","/** @deprecated use @xylabs/hex instead */\nconst hexRegex = /[\\da-f]+/i\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hex = string\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hash = Hex\n\n/** @deprecated use @xylabs/hex instead */\nexport const isHex = (value: string): value is Hex => hexRegex.test(value)\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } 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 filterExclude<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 filterInclude<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 find<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 hashAsync<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(deepOmitUnderscoreFields(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.hashAsync(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[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\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 jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n return Object.fromEntries(\n await Promise.all(\n objs.map(async (obj) => {\n return [await PayloadHasher.hashAsync(obj), obj]\n }),\n ),\n )\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(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 { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\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 { isObject, mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\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 deepOmitUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } from '@xyo-network/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","obj","shajs"]}
|
package/dist/browser/index.js
CHANGED
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
// src/model.ts
|
|
2
|
-
var hexRegex = /[
|
|
2
|
+
var hexRegex = /[\da-f]+/i;
|
|
3
3
|
var isHex = (value) => hexRegex.test(value);
|
|
4
4
|
|
|
5
5
|
// src/PayloadHasher.ts
|
|
@@ -16,13 +16,13 @@ var removeEmptyFields = (obj) => {
|
|
|
16
16
|
if (obj === null || Array.isArray(obj))
|
|
17
17
|
return obj;
|
|
18
18
|
const newObject = {};
|
|
19
|
-
|
|
19
|
+
for (const [key, value] of Object.entries(obj)) {
|
|
20
20
|
if (typeOf(value) === "object") {
|
|
21
21
|
newObject[key] = removeEmptyFields(value);
|
|
22
22
|
} else if (value !== void 0) {
|
|
23
23
|
newObject[key] = value;
|
|
24
24
|
}
|
|
25
|
-
}
|
|
25
|
+
}
|
|
26
26
|
return newObject;
|
|
27
27
|
};
|
|
28
28
|
|
|
@@ -54,9 +54,9 @@ var subSort = (value) => {
|
|
|
54
54
|
var sortFields = (obj) => {
|
|
55
55
|
const result = {};
|
|
56
56
|
const keys = Object.keys(obj);
|
|
57
|
-
keys.sort()
|
|
57
|
+
for (const key of keys.sort()) {
|
|
58
58
|
result[key] = subSort(obj[key]);
|
|
59
|
-
}
|
|
59
|
+
}
|
|
60
60
|
return result;
|
|
61
61
|
};
|
|
62
62
|
|
|
@@ -77,6 +77,11 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
77
77
|
static async find(objs = [], hash) {
|
|
78
78
|
return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0];
|
|
79
79
|
}
|
|
80
|
+
/**
|
|
81
|
+
* Asynchronously hashes a payload
|
|
82
|
+
* @param obj A payload
|
|
83
|
+
* @returns The payload hash
|
|
84
|
+
*/
|
|
80
85
|
static async hashAsync(obj) {
|
|
81
86
|
if (_PayloadHasher.allowSubtle) {
|
|
82
87
|
try {
|
|
@@ -97,7 +102,7 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
97
102
|
const stringToHash = this.stringifyHashFields(obj);
|
|
98
103
|
try {
|
|
99
104
|
return asHash(await sha256(stringToHash), true);
|
|
100
|
-
} catch
|
|
105
|
+
} catch {
|
|
101
106
|
this.wasmSupport.allowWasm = false;
|
|
102
107
|
}
|
|
103
108
|
}
|
|
@@ -106,26 +111,55 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
106
111
|
static hashFields(obj) {
|
|
107
112
|
return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
|
|
108
113
|
}
|
|
114
|
+
/**
|
|
115
|
+
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
116
|
+
* @param objs Any array of payloads
|
|
117
|
+
* @returns An array of payload/hash tuples
|
|
118
|
+
*/
|
|
109
119
|
static async hashPairs(objs) {
|
|
110
120
|
return await Promise.all(objs.map(async (obj) => [obj, await _PayloadHasher.hashAsync(obj)]));
|
|
111
121
|
}
|
|
122
|
+
/**
|
|
123
|
+
* Synchronously hashes a payload
|
|
124
|
+
* @param obj A payload
|
|
125
|
+
* @returns The payload hash
|
|
126
|
+
*/
|
|
112
127
|
static hashSync(obj) {
|
|
113
128
|
return asHash(shajs("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex"), true);
|
|
114
129
|
}
|
|
130
|
+
/**
|
|
131
|
+
* Creates an array of payload hashes based on the payloads passed in
|
|
132
|
+
* @param objs Any array of payloads
|
|
133
|
+
* @returns An array of payload hashes
|
|
134
|
+
*/
|
|
115
135
|
static async hashes(objs) {
|
|
116
136
|
return await Promise.all(objs.map((obj) => this.hashAsync(obj)));
|
|
117
137
|
}
|
|
118
|
-
/**
|
|
138
|
+
/**
|
|
139
|
+
* Returns a clone of the payload that is JSON safe
|
|
140
|
+
* @param obj A payload
|
|
141
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
142
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
143
|
+
*/
|
|
119
144
|
static jsonPayload(payload, meta = false) {
|
|
120
145
|
return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)));
|
|
121
146
|
}
|
|
122
147
|
static stringifyHashFields(obj) {
|
|
123
148
|
return JSON.stringify(this.hashFields(obj));
|
|
124
149
|
}
|
|
150
|
+
/**
|
|
151
|
+
* Creates an object map of payload hashes to payloads based on the payloads passed in
|
|
152
|
+
* @param objs Any array of payloads
|
|
153
|
+
* @returns A map of hashes to payloads
|
|
154
|
+
*/
|
|
125
155
|
static async toMap(objs) {
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
156
|
+
return Object.fromEntries(
|
|
157
|
+
await Promise.all(
|
|
158
|
+
objs.map(async (obj) => {
|
|
159
|
+
return [await _PayloadHasher.hashAsync(obj), obj];
|
|
160
|
+
})
|
|
161
|
+
)
|
|
162
|
+
);
|
|
129
163
|
}
|
|
130
164
|
async hashAsync() {
|
|
131
165
|
return await _PayloadHasher.hashAsync(this.obj);
|
|
@@ -133,7 +167,11 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
133
167
|
hashSync() {
|
|
134
168
|
return _PayloadHasher.hashSync(this.obj);
|
|
135
169
|
}
|
|
136
|
-
/**
|
|
170
|
+
/**
|
|
171
|
+
* Returns a clone of the payload that is JSON safe
|
|
172
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
173
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
174
|
+
*/
|
|
137
175
|
jsonPayload(meta = false) {
|
|
138
176
|
return _PayloadHasher.jsonPayload(this.obj, meta);
|
|
139
177
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../src/model.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["/** @deprecated use @xylabs/hex instead */\nconst hexRegex = /[0-9a-f]+/i\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hex = string\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hash = Hex\n\n/** @deprecated use @xylabs/hex instead */\nexport const isHex = (value: string): value is Hex => hexRegex.test(value)\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } 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 filterExclude<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 filterInclude<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 find<T extends EmptyObject>(objs: T[] = [], hash: Hash): Promise<T | undefined> {\n return (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)?.[0]\n }\n\n static async hashAsync<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 (ex) {\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(deepOmitUnderscoreFields(obj)))\n }\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.hashAsync(obj)]))\n }\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 static async hashes<T extends EmptyObject>(objs: T[]): Promise<Hash[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\n }\n\n /** @function jsonPayload Returns a clone of the payload that is JSON safe */\n static jsonPayload<T extends EmptyObject>(\n /** @param payload The payload to process */\n payload: T,\n /** @param meta Keeps underscore (meta) fields if set to true */\n meta = false,\n ): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n const result: Record<string, T> = {}\n await Promise.all(objs.map(async (obj) => (result[await PayloadHasher.hashAsync(obj)] = obj)))\n return result\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(this.obj)\n }\n\n hashSync(): Hash {\n return PayloadHasher.hashSync(this.obj)\n }\n\n /** @function jsonPayload Returns a clone of the payload that is JSON safe */\n jsonPayload(\n /** @param meta Keeps underscore (meta) fields if set to true */\n meta = false,\n ): T {\n return PayloadHasher.jsonPayload(this.obj, meta)\n }\n}\n","import { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\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 Object.entries(obj).forEach(([key, value]) => {\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 { isObject, mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\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 deepOmitUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } from '@xyo-network/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 keys.sort().forEach((key: keyof T) => {\n result[key] = subSort(obj[key])\n })\n return result as T\n}\n"],"mappings":"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","names":["obj","isObject"]}
|
|
1
|
+
{"version":3,"sources":["../../src/model.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["/** @deprecated use @xylabs/hex instead */\nconst hexRegex = /[\\da-f]+/i\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hex = string\n\n/** @deprecated use @xylabs/hex instead */\nexport type Hash = Hex\n\n/** @deprecated use @xylabs/hex instead */\nexport const isHex = (value: string): value is Hex => hexRegex.test(value)\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { subtle } from '@xylabs/platform'\nimport { EmptyObject, ObjectWrapper } from '@xyo-network/object'\nimport { WasmSupport } from '@xyo-network/wasm'\nimport { sha256 } from 'hash-wasm'\nimport shajs from 'sha.js'\n\nimport { removeEmptyFields } from './removeEmptyFields'\nimport { deepOmitUnderscoreFields } 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 filterExclude<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 filterInclude<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 find<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 hashAsync<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(deepOmitUnderscoreFields(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.hashAsync(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[]> {\n return await Promise.all(objs.map((obj) => this.hashAsync(obj)))\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 jsonPayload<T extends EmptyObject>(payload: T, meta = false): T {\n return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)))\n }\n\n static stringifyHashFields<T extends EmptyObject>(obj: T) {\n return JSON.stringify(this.hashFields(obj))\n }\n\n /**\n * Creates an object map of payload hashes to payloads based on the payloads passed in\n * @param objs Any array of payloads\n * @returns A map of hashes to payloads\n */\n static async toMap<T extends EmptyObject>(objs: T[]): Promise<Record<Hash, T>> {\n return Object.fromEntries(\n await Promise.all(\n objs.map(async (obj) => {\n return [await PayloadHasher.hashAsync(obj), obj]\n }),\n ),\n )\n }\n\n async hashAsync(): Promise<Hash> {\n return await PayloadHasher.hashAsync(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 { typeOf } from '@xylabs/typeof'\nimport { AnyObject, EmptyObject } from '@xyo-network/object'\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 { isObject, mapValues, merge, omitBy, pickBy } from '@xylabs/lodash'\nimport { EmptyObject } from '@xyo-network/object'\n// eslint-disable-next-line no-restricted-imports\nimport type { ValueKeyIteratee } from 'lodash'\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 deepOmitUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), omitBy)\n}\n\nexport const deepPickUnderscoreFields = <T extends EmptyObject>(obj: T): T => {\n return deepBy(obj, (_, key) => key.startsWith('_'), pickBy)\n}\n","import { AnyObject, EmptyObject, isObject } from '@xyo-network/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":["obj","isObject"]}
|