@xyo-network/hash 2.84.19 → 2.85.1
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/index.cjs +67 -58
- package/dist/browser/index.cjs.map +1 -1
- package/dist/browser/index.d.cts +0 -1
- package/dist/browser/index.d.cts.map +1 -1
- package/dist/browser/index.d.mts +0 -1
- package/dist/browser/index.d.mts.map +1 -1
- package/dist/browser/index.d.ts +0 -1
- package/dist/browser/index.d.ts.map +1 -1
- package/dist/browser/index.js +68 -57
- package/dist/browser/index.js.map +1 -1
- package/dist/node/index.cjs +75 -63
- package/dist/node/index.cjs.map +1 -1
- package/dist/node/index.d.cts +0 -1
- package/dist/node/index.d.cts.map +1 -1
- package/dist/node/index.d.mts +0 -1
- package/dist/node/index.d.mts.map +1 -1
- package/dist/node/index.d.ts +0 -1
- package/dist/node/index.d.ts.map +1 -1
- package/dist/node/index.js +76 -61
- package/dist/node/index.js.map +1 -1
- package/package.json +3 -3
- package/src/index.ts +0 -1
- package/dist/browser/model.d.cts +0 -7
- package/dist/browser/model.d.cts.map +0 -1
- package/dist/browser/model.d.mts +0 -7
- package/dist/browser/model.d.mts.map +0 -1
- package/dist/browser/model.d.ts +0 -7
- package/dist/browser/model.d.ts.map +0 -1
- package/dist/node/model.d.cts +0 -7
- package/dist/node/model.d.cts.map +0 -1
- package/dist/node/model.d.mts +0 -7
- package/dist/node/model.d.mts.map +0 -1
- package/dist/node/model.d.ts +0 -7
- package/dist/node/model.d.ts.map +0 -1
- package/src/model.ts +0 -11
package/dist/node/index.cjs
CHANGED
|
@@ -5,6 +5,8 @@ var __getOwnPropDesc = Object.getOwnPropertyDescriptor;
|
|
|
5
5
|
var __getOwnPropNames = Object.getOwnPropertyNames;
|
|
6
6
|
var __getProtoOf = Object.getPrototypeOf;
|
|
7
7
|
var __hasOwnProp = Object.prototype.hasOwnProperty;
|
|
8
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
9
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
8
10
|
var __export = (target, all) => {
|
|
9
11
|
for (var name in all)
|
|
10
12
|
__defProp(target, name, { get: all[name], enumerable: true });
|
|
@@ -26,6 +28,10 @@ var __toESM = (mod, isNodeMode, target) => (target = mod != null ? __create(__ge
|
|
|
26
28
|
mod
|
|
27
29
|
));
|
|
28
30
|
var __toCommonJS = (mod) => __copyProps(__defProp({}, "__esModule", { value: true }), mod);
|
|
31
|
+
var __publicField = (obj, key, value) => {
|
|
32
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
33
|
+
return value;
|
|
34
|
+
};
|
|
29
35
|
|
|
30
36
|
// src/index.ts
|
|
31
37
|
var src_exports = {};
|
|
@@ -34,16 +40,11 @@ __export(src_exports, {
|
|
|
34
40
|
deepBy: () => deepBy,
|
|
35
41
|
deepOmitUnderscoreFields: () => deepOmitUnderscoreFields,
|
|
36
42
|
deepPickUnderscoreFields: () => deepPickUnderscoreFields,
|
|
37
|
-
isHex: () => isHex,
|
|
38
43
|
removeEmptyFields: () => removeEmptyFields,
|
|
39
44
|
sortFields: () => sortFields
|
|
40
45
|
});
|
|
41
46
|
module.exports = __toCommonJS(src_exports);
|
|
42
47
|
|
|
43
|
-
// src/model.ts
|
|
44
|
-
var hexRegex = /[\da-f]+/i;
|
|
45
|
-
var isHex = (value) => hexRegex.test(value);
|
|
46
|
-
|
|
47
48
|
// src/PayloadHasher.ts
|
|
48
49
|
var import_hex = require("@xylabs/hex");
|
|
49
50
|
var import_platform = require("@xylabs/platform");
|
|
@@ -54,7 +55,7 @@ var import_sha = __toESM(require("sha.js"), 1);
|
|
|
54
55
|
|
|
55
56
|
// src/removeEmptyFields.ts
|
|
56
57
|
var import_typeof = require("@xylabs/typeof");
|
|
57
|
-
var removeEmptyFields = (obj) => {
|
|
58
|
+
var removeEmptyFields = /* @__PURE__ */ __name((obj) => {
|
|
58
59
|
if (obj === null || Array.isArray(obj))
|
|
59
60
|
return obj;
|
|
60
61
|
const newObject = {};
|
|
@@ -66,11 +67,11 @@ var removeEmptyFields = (obj) => {
|
|
|
66
67
|
}
|
|
67
68
|
}
|
|
68
69
|
return newObject;
|
|
69
|
-
};
|
|
70
|
+
}, "removeEmptyFields");
|
|
70
71
|
|
|
71
72
|
// src/removeFields.ts
|
|
72
73
|
var import_lodash = require("@xylabs/lodash");
|
|
73
|
-
var deepBy = (obj, predicate, func) => {
|
|
74
|
+
var deepBy = /* @__PURE__ */ __name((obj, predicate, func) => {
|
|
74
75
|
if (Array.isArray(obj)) {
|
|
75
76
|
return obj;
|
|
76
77
|
}
|
|
@@ -80,42 +81,45 @@ var deepBy = (obj, predicate, func) => {
|
|
|
80
81
|
const pickedNonObjects = (0, import_lodash.omitBy)(nonObjects, predicate);
|
|
81
82
|
const processedObjects = (0, import_lodash.mapValues)(pickedObjects, (obj2) => deepBy(obj2, predicate, func));
|
|
82
83
|
return (0, import_lodash.merge)({}, pickedNonObjects, processedObjects);
|
|
83
|
-
};
|
|
84
|
-
var deepOmitUnderscoreFields = (obj) => {
|
|
84
|
+
}, "deepBy");
|
|
85
|
+
var deepOmitUnderscoreFields = /* @__PURE__ */ __name((obj) => {
|
|
85
86
|
return deepBy(obj, (_, key) => key.startsWith("_"), import_lodash.omitBy);
|
|
86
|
-
};
|
|
87
|
-
var deepPickUnderscoreFields = (obj) => {
|
|
87
|
+
}, "deepOmitUnderscoreFields");
|
|
88
|
+
var deepPickUnderscoreFields = /* @__PURE__ */ __name((obj) => {
|
|
88
89
|
return deepBy(obj, (_, key) => key.startsWith("_"), import_lodash.pickBy);
|
|
89
|
-
};
|
|
90
|
+
}, "deepPickUnderscoreFields");
|
|
90
91
|
|
|
91
92
|
// src/sortFields.ts
|
|
92
93
|
var import_object = require("@xyo-network/object");
|
|
93
|
-
var subSort = (value) => {
|
|
94
|
+
var subSort = /* @__PURE__ */ __name((value) => {
|
|
94
95
|
return (0, import_object.isObject)(value) ? sortFields(value) : value;
|
|
95
|
-
};
|
|
96
|
-
var sortFields = (obj) => {
|
|
96
|
+
}, "subSort");
|
|
97
|
+
var sortFields = /* @__PURE__ */ __name((obj) => {
|
|
97
98
|
const result = {};
|
|
98
99
|
const keys = Object.keys(obj);
|
|
99
100
|
for (const key of keys.sort()) {
|
|
100
101
|
result[key] = subSort(obj[key]);
|
|
101
102
|
}
|
|
102
103
|
return result;
|
|
103
|
-
};
|
|
104
|
+
}, "sortFields");
|
|
104
105
|
|
|
105
106
|
// src/PayloadHasher.ts
|
|
106
|
-
var wasmSupportStatic = new import_wasm.WasmSupport([
|
|
107
|
-
|
|
108
|
-
|
|
109
|
-
|
|
110
|
-
static wasmSupport = wasmSupportStatic;
|
|
107
|
+
var wasmSupportStatic = new import_wasm.WasmSupport([
|
|
108
|
+
"bigInt"
|
|
109
|
+
]);
|
|
110
|
+
var _PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
111
111
|
static async filterExclude(objs = [], hash) {
|
|
112
112
|
var _a;
|
|
113
|
-
const hashes = Array.isArray(hash) ? hash : [
|
|
113
|
+
const hashes = Array.isArray(hash) ? hash : [
|
|
114
|
+
hash
|
|
115
|
+
];
|
|
114
116
|
return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
|
|
115
117
|
}
|
|
116
118
|
static async filterInclude(objs = [], hash) {
|
|
117
119
|
var _a;
|
|
118
|
-
const hashes = Array.isArray(hash) ? hash : [
|
|
120
|
+
const hashes = Array.isArray(hash) ? hash : [
|
|
121
|
+
hash
|
|
122
|
+
];
|
|
119
123
|
return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
|
|
120
124
|
}
|
|
121
125
|
static async find(objs = [], hash) {
|
|
@@ -123,10 +127,10 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
123
127
|
return (_a = (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)) == null ? void 0 : _a[0];
|
|
124
128
|
}
|
|
125
129
|
/**
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
130
|
+
* Asynchronously hashes a payload
|
|
131
|
+
* @param obj A payload
|
|
132
|
+
* @returns The payload hash
|
|
133
|
+
*/
|
|
130
134
|
static async hashAsync(obj) {
|
|
131
135
|
if (_PayloadHasher.allowSubtle) {
|
|
132
136
|
try {
|
|
@@ -134,7 +138,9 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
134
138
|
const stringToHash = this.stringifyHashFields(obj);
|
|
135
139
|
const b = enc.encode(stringToHash);
|
|
136
140
|
const hashArray = await import_platform.subtle.digest("SHA-256", b);
|
|
137
|
-
return (0, import_hex.hexFromArrayBuffer)(hashArray, {
|
|
141
|
+
return (0, import_hex.hexFromArrayBuffer)(hashArray, {
|
|
142
|
+
bitLength: 256
|
|
143
|
+
});
|
|
138
144
|
} catch (ex) {
|
|
139
145
|
const error = ex;
|
|
140
146
|
console.error(`Setting allowSubtle to false [${error.message}]`);
|
|
@@ -157,35 +163,38 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
157
163
|
return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
|
|
158
164
|
}
|
|
159
165
|
/**
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
166
|
+
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
167
|
+
* @param objs Any array of payloads
|
|
168
|
+
* @returns An array of payload/hash tuples
|
|
169
|
+
*/
|
|
164
170
|
static async hashPairs(objs) {
|
|
165
|
-
return await Promise.all(objs.map(async (obj) => [
|
|
171
|
+
return await Promise.all(objs.map(async (obj) => [
|
|
172
|
+
obj,
|
|
173
|
+
await _PayloadHasher.hashAsync(obj)
|
|
174
|
+
]));
|
|
166
175
|
}
|
|
167
176
|
/**
|
|
168
|
-
|
|
169
|
-
|
|
170
|
-
|
|
171
|
-
|
|
177
|
+
* Synchronously hashes a payload
|
|
178
|
+
* @param obj A payload
|
|
179
|
+
* @returns The payload hash
|
|
180
|
+
*/
|
|
172
181
|
static hashSync(obj) {
|
|
173
182
|
return (0, import_hex.asHash)((0, import_sha.default)("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex"), true);
|
|
174
183
|
}
|
|
175
184
|
/**
|
|
176
|
-
|
|
177
|
-
|
|
178
|
-
|
|
179
|
-
|
|
185
|
+
* Creates an array of payload hashes based on the payloads passed in
|
|
186
|
+
* @param objs Any array of payloads
|
|
187
|
+
* @returns An array of payload hashes
|
|
188
|
+
*/
|
|
180
189
|
static async hashes(objs) {
|
|
181
190
|
return await Promise.all(objs.map((obj) => this.hashAsync(obj)));
|
|
182
191
|
}
|
|
183
192
|
/**
|
|
184
|
-
|
|
185
|
-
|
|
186
|
-
|
|
187
|
-
|
|
188
|
-
|
|
193
|
+
* Returns a clone of the payload that is JSON safe
|
|
194
|
+
* @param obj A payload
|
|
195
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
196
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
197
|
+
*/
|
|
189
198
|
static jsonPayload(payload, meta = false) {
|
|
190
199
|
return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)));
|
|
191
200
|
}
|
|
@@ -193,18 +202,17 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
193
202
|
return JSON.stringify(this.hashFields(obj));
|
|
194
203
|
}
|
|
195
204
|
/**
|
|
196
|
-
|
|
197
|
-
|
|
198
|
-
|
|
199
|
-
|
|
205
|
+
* Creates an object map of payload hashes to payloads based on the payloads passed in
|
|
206
|
+
* @param objs Any array of payloads
|
|
207
|
+
* @returns A map of hashes to payloads
|
|
208
|
+
*/
|
|
200
209
|
static async toMap(objs) {
|
|
201
|
-
return Object.fromEntries(
|
|
202
|
-
|
|
203
|
-
|
|
204
|
-
|
|
205
|
-
|
|
206
|
-
|
|
207
|
-
);
|
|
210
|
+
return Object.fromEntries(await Promise.all(objs.map(async (obj) => {
|
|
211
|
+
return [
|
|
212
|
+
await _PayloadHasher.hashAsync(obj),
|
|
213
|
+
obj
|
|
214
|
+
];
|
|
215
|
+
})));
|
|
208
216
|
}
|
|
209
217
|
async hashAsync() {
|
|
210
218
|
return await _PayloadHasher.hashAsync(this.obj);
|
|
@@ -213,21 +221,25 @@ var PayloadHasher = class _PayloadHasher extends import_object2.ObjectWrapper {
|
|
|
213
221
|
return _PayloadHasher.hashSync(this.obj);
|
|
214
222
|
}
|
|
215
223
|
/**
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
224
|
+
* Returns a clone of the payload that is JSON safe
|
|
225
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
226
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
227
|
+
*/
|
|
220
228
|
jsonPayload(meta = false) {
|
|
221
229
|
return _PayloadHasher.jsonPayload(this.obj, meta);
|
|
222
230
|
}
|
|
223
231
|
};
|
|
232
|
+
__name(_PayloadHasher, "PayloadHasher");
|
|
233
|
+
__publicField(_PayloadHasher, "allowSubtle", true);
|
|
234
|
+
__publicField(_PayloadHasher, "wasmInitialized", wasmSupportStatic.initialize());
|
|
235
|
+
__publicField(_PayloadHasher, "wasmSupport", wasmSupportStatic);
|
|
236
|
+
var PayloadHasher = _PayloadHasher;
|
|
224
237
|
// Annotate the CommonJS export names for ESM import in node:
|
|
225
238
|
0 && (module.exports = {
|
|
226
239
|
PayloadHasher,
|
|
227
240
|
deepBy,
|
|
228
241
|
deepOmitUnderscoreFields,
|
|
229
242
|
deepPickUnderscoreFields,
|
|
230
|
-
isHex,
|
|
231
243
|
removeEmptyFields,
|
|
232
244
|
sortFields
|
|
233
245
|
});
|
package/dist/node/index.cjs.map
CHANGED
|
@@ -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 = /[\\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"]}
|
|
1
|
+
{"version":3,"sources":["../../src/index.ts","../../src/PayloadHasher.ts","../../src/removeEmptyFields.ts","../../src/removeFields.ts","../../src/sortFields.ts"],"sourcesContent":["export * from './PayloadHasher'\nexport * from './removeEmptyFields'\nexport * from './removeFields'\nexport * from './sortFields'\n","import { asHash, Hash, hexFromArrayBuffer } from '@xylabs/hex'\nimport { 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","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","deepOmitUnderscoreFields","_","key","startsWith","deepPickUnderscoreFields","subSort","value","isObject","sortFields","obj","result","keys","Object","key","sort","wasmSupportStatic","WasmSupport","PayloadHasher","ObjectWrapper","filterExclude","objs","hash","hashes","Array","isArray","hashPairs","filter","_","objHash","includes","map","pair","filterInclude","find","hashAsync","obj","allowSubtle","enc","TextEncoder","stringToHash","stringifyHashFields","b","encode","hashArray","subtle","digest","hexFromArrayBuffer","bitLength","ex","error","console","message","log","stack","wasmInitialized","wasmSupport","canUseWasm","asHash","sha256","allowWasm","hashSync","hashFields","sortFields","removeEmptyFields","deepOmitUnderscoreFields","Promise","all","shajs","update","toString","jsonPayload","payload","meta","JSON","stringify","toMap","Object","fromEntries","initialize"]}
|
package/dist/node/index.d.cts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
|
package/dist/node/index.d.mts
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
|
package/dist/node/index.d.ts
CHANGED
package/dist/node/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAA;AAC/B,cAAc,qBAAqB,CAAA;AACnC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA"}
|
package/dist/node/index.js
CHANGED
|
@@ -1,6 +1,10 @@
|
|
|
1
|
-
|
|
2
|
-
var
|
|
3
|
-
var
|
|
1
|
+
var __defProp = Object.defineProperty;
|
|
2
|
+
var __defNormalProp = (obj, key, value) => key in obj ? __defProp(obj, key, { enumerable: true, configurable: true, writable: true, value }) : obj[key] = value;
|
|
3
|
+
var __name = (target, value) => __defProp(target, "name", { value, configurable: true });
|
|
4
|
+
var __publicField = (obj, key, value) => {
|
|
5
|
+
__defNormalProp(obj, typeof key !== "symbol" ? key + "" : key, value);
|
|
6
|
+
return value;
|
|
7
|
+
};
|
|
4
8
|
|
|
5
9
|
// src/PayloadHasher.ts
|
|
6
10
|
import { asHash, hexFromArrayBuffer } from "@xylabs/hex";
|
|
@@ -12,7 +16,7 @@ import shajs from "sha.js";
|
|
|
12
16
|
|
|
13
17
|
// src/removeEmptyFields.ts
|
|
14
18
|
import { typeOf } from "@xylabs/typeof";
|
|
15
|
-
var removeEmptyFields = (obj) => {
|
|
19
|
+
var removeEmptyFields = /* @__PURE__ */ __name((obj) => {
|
|
16
20
|
if (obj === null || Array.isArray(obj))
|
|
17
21
|
return obj;
|
|
18
22
|
const newObject = {};
|
|
@@ -24,11 +28,11 @@ var removeEmptyFields = (obj) => {
|
|
|
24
28
|
}
|
|
25
29
|
}
|
|
26
30
|
return newObject;
|
|
27
|
-
};
|
|
31
|
+
}, "removeEmptyFields");
|
|
28
32
|
|
|
29
33
|
// src/removeFields.ts
|
|
30
34
|
import { isObject, mapValues, merge, omitBy, pickBy } from "@xylabs/lodash";
|
|
31
|
-
var deepBy = (obj, predicate, func) => {
|
|
35
|
+
var deepBy = /* @__PURE__ */ __name((obj, predicate, func) => {
|
|
32
36
|
if (Array.isArray(obj)) {
|
|
33
37
|
return obj;
|
|
34
38
|
}
|
|
@@ -38,42 +42,45 @@ var deepBy = (obj, predicate, func) => {
|
|
|
38
42
|
const pickedNonObjects = omitBy(nonObjects, predicate);
|
|
39
43
|
const processedObjects = mapValues(pickedObjects, (obj2) => deepBy(obj2, predicate, func));
|
|
40
44
|
return merge({}, pickedNonObjects, processedObjects);
|
|
41
|
-
};
|
|
42
|
-
var deepOmitUnderscoreFields = (obj) => {
|
|
45
|
+
}, "deepBy");
|
|
46
|
+
var deepOmitUnderscoreFields = /* @__PURE__ */ __name((obj) => {
|
|
43
47
|
return deepBy(obj, (_, key) => key.startsWith("_"), omitBy);
|
|
44
|
-
};
|
|
45
|
-
var deepPickUnderscoreFields = (obj) => {
|
|
48
|
+
}, "deepOmitUnderscoreFields");
|
|
49
|
+
var deepPickUnderscoreFields = /* @__PURE__ */ __name((obj) => {
|
|
46
50
|
return deepBy(obj, (_, key) => key.startsWith("_"), pickBy);
|
|
47
|
-
};
|
|
51
|
+
}, "deepPickUnderscoreFields");
|
|
48
52
|
|
|
49
53
|
// src/sortFields.ts
|
|
50
54
|
import { isObject as isObject2 } from "@xyo-network/object";
|
|
51
|
-
var subSort = (value) => {
|
|
55
|
+
var subSort = /* @__PURE__ */ __name((value) => {
|
|
52
56
|
return isObject2(value) ? sortFields(value) : value;
|
|
53
|
-
};
|
|
54
|
-
var sortFields = (obj) => {
|
|
57
|
+
}, "subSort");
|
|
58
|
+
var sortFields = /* @__PURE__ */ __name((obj) => {
|
|
55
59
|
const result = {};
|
|
56
60
|
const keys = Object.keys(obj);
|
|
57
61
|
for (const key of keys.sort()) {
|
|
58
62
|
result[key] = subSort(obj[key]);
|
|
59
63
|
}
|
|
60
64
|
return result;
|
|
61
|
-
};
|
|
65
|
+
}, "sortFields");
|
|
62
66
|
|
|
63
67
|
// src/PayloadHasher.ts
|
|
64
|
-
var wasmSupportStatic = new WasmSupport([
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
static wasmSupport = wasmSupportStatic;
|
|
68
|
+
var wasmSupportStatic = new WasmSupport([
|
|
69
|
+
"bigInt"
|
|
70
|
+
]);
|
|
71
|
+
var _PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
69
72
|
static async filterExclude(objs = [], hash) {
|
|
70
73
|
var _a;
|
|
71
|
-
const hashes = Array.isArray(hash) ? hash : [
|
|
74
|
+
const hashes = Array.isArray(hash) ? hash : [
|
|
75
|
+
hash
|
|
76
|
+
];
|
|
72
77
|
return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => !hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
|
|
73
78
|
}
|
|
74
79
|
static async filterInclude(objs = [], hash) {
|
|
75
80
|
var _a;
|
|
76
|
-
const hashes = Array.isArray(hash) ? hash : [
|
|
81
|
+
const hashes = Array.isArray(hash) ? hash : [
|
|
82
|
+
hash
|
|
83
|
+
];
|
|
77
84
|
return (_a = (await this.hashPairs(objs)).filter(([_, objHash]) => hashes.includes(objHash))) == null ? void 0 : _a.map((pair) => pair[0]);
|
|
78
85
|
}
|
|
79
86
|
static async find(objs = [], hash) {
|
|
@@ -81,10 +88,10 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
81
88
|
return (_a = (await this.hashPairs(objs)).find(([_, objHash]) => objHash === hash)) == null ? void 0 : _a[0];
|
|
82
89
|
}
|
|
83
90
|
/**
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
91
|
+
* Asynchronously hashes a payload
|
|
92
|
+
* @param obj A payload
|
|
93
|
+
* @returns The payload hash
|
|
94
|
+
*/
|
|
88
95
|
static async hashAsync(obj) {
|
|
89
96
|
if (_PayloadHasher.allowSubtle) {
|
|
90
97
|
try {
|
|
@@ -92,7 +99,9 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
92
99
|
const stringToHash = this.stringifyHashFields(obj);
|
|
93
100
|
const b = enc.encode(stringToHash);
|
|
94
101
|
const hashArray = await subtle.digest("SHA-256", b);
|
|
95
|
-
return hexFromArrayBuffer(hashArray, {
|
|
102
|
+
return hexFromArrayBuffer(hashArray, {
|
|
103
|
+
bitLength: 256
|
|
104
|
+
});
|
|
96
105
|
} catch (ex) {
|
|
97
106
|
const error = ex;
|
|
98
107
|
console.error(`Setting allowSubtle to false [${error.message}]`);
|
|
@@ -115,35 +124,38 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
115
124
|
return sortFields(removeEmptyFields(deepOmitUnderscoreFields(obj)));
|
|
116
125
|
}
|
|
117
126
|
/**
|
|
118
|
-
|
|
119
|
-
|
|
120
|
-
|
|
121
|
-
|
|
127
|
+
* Creates an array of payload/hash tuples based on the payloads passed in
|
|
128
|
+
* @param objs Any array of payloads
|
|
129
|
+
* @returns An array of payload/hash tuples
|
|
130
|
+
*/
|
|
122
131
|
static async hashPairs(objs) {
|
|
123
|
-
return await Promise.all(objs.map(async (obj) => [
|
|
132
|
+
return await Promise.all(objs.map(async (obj) => [
|
|
133
|
+
obj,
|
|
134
|
+
await _PayloadHasher.hashAsync(obj)
|
|
135
|
+
]));
|
|
124
136
|
}
|
|
125
137
|
/**
|
|
126
|
-
|
|
127
|
-
|
|
128
|
-
|
|
129
|
-
|
|
138
|
+
* Synchronously hashes a payload
|
|
139
|
+
* @param obj A payload
|
|
140
|
+
* @returns The payload hash
|
|
141
|
+
*/
|
|
130
142
|
static hashSync(obj) {
|
|
131
143
|
return asHash(shajs("sha256").update(this.stringifyHashFields(obj)).digest().toString("hex"), true);
|
|
132
144
|
}
|
|
133
145
|
/**
|
|
134
|
-
|
|
135
|
-
|
|
136
|
-
|
|
137
|
-
|
|
146
|
+
* Creates an array of payload hashes based on the payloads passed in
|
|
147
|
+
* @param objs Any array of payloads
|
|
148
|
+
* @returns An array of payload hashes
|
|
149
|
+
*/
|
|
138
150
|
static async hashes(objs) {
|
|
139
151
|
return await Promise.all(objs.map((obj) => this.hashAsync(obj)));
|
|
140
152
|
}
|
|
141
153
|
/**
|
|
142
|
-
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
154
|
+
* Returns a clone of the payload that is JSON safe
|
|
155
|
+
* @param obj A payload
|
|
156
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
157
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
158
|
+
*/
|
|
147
159
|
static jsonPayload(payload, meta = false) {
|
|
148
160
|
return sortFields(removeEmptyFields(meta ? payload : deepOmitUnderscoreFields(payload)));
|
|
149
161
|
}
|
|
@@ -151,18 +163,17 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
151
163
|
return JSON.stringify(this.hashFields(obj));
|
|
152
164
|
}
|
|
153
165
|
/**
|
|
154
|
-
|
|
155
|
-
|
|
156
|
-
|
|
157
|
-
|
|
166
|
+
* Creates an object map of payload hashes to payloads based on the payloads passed in
|
|
167
|
+
* @param objs Any array of payloads
|
|
168
|
+
* @returns A map of hashes to payloads
|
|
169
|
+
*/
|
|
158
170
|
static async toMap(objs) {
|
|
159
|
-
return Object.fromEntries(
|
|
160
|
-
|
|
161
|
-
|
|
162
|
-
|
|
163
|
-
|
|
164
|
-
|
|
165
|
-
);
|
|
171
|
+
return Object.fromEntries(await Promise.all(objs.map(async (obj) => {
|
|
172
|
+
return [
|
|
173
|
+
await _PayloadHasher.hashAsync(obj),
|
|
174
|
+
obj
|
|
175
|
+
];
|
|
176
|
+
})));
|
|
166
177
|
}
|
|
167
178
|
async hashAsync() {
|
|
168
179
|
return await _PayloadHasher.hashAsync(this.obj);
|
|
@@ -171,20 +182,24 @@ var PayloadHasher = class _PayloadHasher extends ObjectWrapper {
|
|
|
171
182
|
return _PayloadHasher.hashSync(this.obj);
|
|
172
183
|
}
|
|
173
184
|
/**
|
|
174
|
-
|
|
175
|
-
|
|
176
|
-
|
|
177
|
-
|
|
185
|
+
* Returns a clone of the payload that is JSON safe
|
|
186
|
+
* @param meta Keeps underscore (meta) fields if set to true
|
|
187
|
+
* @returns Returns a clone of the payload that is JSON safe
|
|
188
|
+
*/
|
|
178
189
|
jsonPayload(meta = false) {
|
|
179
190
|
return _PayloadHasher.jsonPayload(this.obj, meta);
|
|
180
191
|
}
|
|
181
192
|
};
|
|
193
|
+
__name(_PayloadHasher, "PayloadHasher");
|
|
194
|
+
__publicField(_PayloadHasher, "allowSubtle", true);
|
|
195
|
+
__publicField(_PayloadHasher, "wasmInitialized", wasmSupportStatic.initialize());
|
|
196
|
+
__publicField(_PayloadHasher, "wasmSupport", wasmSupportStatic);
|
|
197
|
+
var PayloadHasher = _PayloadHasher;
|
|
182
198
|
export {
|
|
183
199
|
PayloadHasher,
|
|
184
200
|
deepBy,
|
|
185
201
|
deepOmitUnderscoreFields,
|
|
186
202
|
deepPickUnderscoreFields,
|
|
187
|
-
isHex,
|
|
188
203
|
removeEmptyFields,
|
|
189
204
|
sortFields
|
|
190
205
|
};
|