@ibgib/ts-gib 0.5.17 → 0.5.18

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.
@@ -5,6 +5,8 @@ import { IbGib_V1 } from "./types.mjs";
5
5
  * I have it all in one function for smallest, most independent version possible.
6
6
  *
7
7
  * #thanks https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
8
+ * #thanks https://stackoverflow.com/questions/49129643/how-do-i-merge-an-array-of-uint8arrays
9
+ * #thanks https://stackoverflow.com/a/49129872/3897838 (answer to above)
8
10
  *
9
11
  * @param ibGib ibGib for which to calculate the gib
10
12
  */
@@ -1 +1 @@
1
- {"version":3,"file":"sha256v1.d.mts","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAgC,MAAM,aAAa,CAAC;AAMrE;;;;;;;;GAQG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CA+C5E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B"}
1
+ {"version":3,"file":"sha256v1.d.mts","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"AACA,OAAO,EAAE,QAAQ,EAAgC,MAAM,aAAa,CAAC;AAMrE;;;;;;;;;;GAUG;AACH,wBAAgB,QAAQ,CAAC,KAAK,EAAE,QAAQ,EAAE,IAAI,GAAE,MAAW,GAAG,OAAO,CAAC,MAAM,CAAC,CAyG5E;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAC/B,OAAO,EAAE,MAAM,GAAG,SAAS,GAC5B,OAAO,CAAC,MAAM,GAAG,SAAS,CAAC,CAW7B"}
@@ -7,6 +7,8 @@ let { subtle } = crypto;
7
7
  * I have it all in one function for smallest, most independent version possible.
8
8
  *
9
9
  * #thanks https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
10
+ * #thanks https://stackoverflow.com/questions/49129643/how-do-i-merge-an-array-of-uint8arrays
11
+ * #thanks https://stackoverflow.com/a/49129872/3897838 (answer to above)
10
12
  *
11
13
  * @param ibGib ibGib for which to calculate the gib
12
14
  */
@@ -22,19 +24,60 @@ export function sha256v1(ibGib, salt = "") {
22
24
  const msgUint8 = new TextEncoder().encode(message);
23
25
  const buffer = await subtle.digest('SHA-256', msgUint8);
24
26
  const asArray = Array.from(new Uint8Array(buffer));
27
+ // return hashAsHex
25
28
  return asArray.map(b => b.toString(16).padStart(2, '0')).join('');
26
29
  };
30
+ let hashToHex_Uint8Array = async (salt, msgUint8) => {
31
+ let tohashUint8Array;
32
+ if (salt) {
33
+ const msgUint8_salt = new TextEncoder().encode(salt);
34
+ tohashUint8Array = new Uint8Array(msgUint8_salt.length + msgUint8.length);
35
+ tohashUint8Array.set(msgUint8_salt);
36
+ tohashUint8Array.set(msgUint8, msgUint8_salt.length);
37
+ }
38
+ else {
39
+ tohashUint8Array = msgUint8;
40
+ }
41
+ const hashAsBuffer = await subtle.digest('SHA-256', tohashUint8Array);
42
+ const hashAsArray = Array.from(new Uint8Array(hashAsBuffer));
43
+ // return hashAsHex
44
+ return hashAsArray.map(b => b.toString(16).padStart(2, '0')).join('');
45
+ };
27
46
  let hashFields;
28
47
  if (salt) {
29
48
  hashFields = async (ib, data, rel8ns) => {
30
49
  const hasRel8ns = Object.keys(rel8ns || {}).length > 0 &&
31
50
  Object.keys(rel8ns || {}).some(k => rel8ns[k] && rel8ns[k].length > 0);
32
- const hasData = Object.keys((data) || {}).length > 0;
51
+ let hasData = !!data;
52
+ if (hasData) {
53
+ if (typeof data === 'string') {
54
+ hasData = data.length > 0;
55
+ }
56
+ else if (data instanceof Uint8Array) {
57
+ hasData = true;
58
+ }
59
+ else if (typeof data === 'object') {
60
+ hasData = Object.keys((data) || {}).length > 0;
61
+ }
62
+ else {
63
+ hasData = true;
64
+ }
65
+ }
33
66
  const ibHash = (await hashToHex(salt + ib)).toUpperCase();
34
67
  // empty, null, undefined all treated the same at this level.
35
68
  const rel8nsHash = hasRel8ns ? (await hashToHex(salt + JSON.stringify(rel8ns))).toUpperCase() : "";
36
69
  // empty, null, undefined all treated the same at this level (though not farther down in data)
37
- const dataHash = hasData ? (await hashToHex(salt + JSON.stringify(data))).toUpperCase() : "";
70
+ // change this for binaries (Uint8Array data)
71
+ // const dataHash: string = hasData ? (await hashToHex(salt + JSON.stringify(data))).toUpperCase() : "";
72
+ let dataHash = "";
73
+ if (hasData) {
74
+ if (data instanceof Uint8Array) {
75
+ dataHash = (await hashToHex_Uint8Array(salt, data)).toUpperCase();
76
+ }
77
+ else {
78
+ dataHash = (await hashToHex(salt + JSON.stringify(data))).toUpperCase();
79
+ }
80
+ }
38
81
  // if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
39
82
  const allHash = hasRel8ns || hasData ?
40
83
  (await hashToHex(salt + ibHash + rel8nsHash + dataHash)).toUpperCase() :
@@ -46,12 +89,36 @@ export function sha256v1(ibGib, salt = "") {
46
89
  hashFields = async (ib, data, rel8ns) => {
47
90
  const hasRel8ns = Object.keys(rel8ns || {}).length > 0 &&
48
91
  Object.keys(rel8ns || {}).some(k => rel8ns[k] && rel8ns[k].length > 0);
49
- const hasData = Object.keys((data) || {}).length > 0;
92
+ // const hasData = Object.keys((data) || {}).length > 0;
93
+ let hasData = !!data;
94
+ if (hasData) {
95
+ if (typeof data === 'string') {
96
+ hasData = data.length > 0;
97
+ }
98
+ else if (data instanceof Uint8Array) {
99
+ hasData = true;
100
+ }
101
+ else if (typeof data === 'object') {
102
+ hasData = Object.keys((data) || {}).length > 0;
103
+ }
104
+ else {
105
+ hasData = true;
106
+ }
107
+ }
50
108
  const ibHash = (await hashToHex(ib)).toUpperCase();
51
109
  // empty, null, undefined all treated the same at this level.
52
110
  const rel8nsHash = hasRel8ns ? (await hashToHex(JSON.stringify(rel8ns))).toUpperCase() : "";
53
111
  // empty, null, undefined all treated the same at this level (though not farther down in data)
54
- const dataHash = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
112
+ // const dataHash: string = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
113
+ let dataHash = "";
114
+ if (hasData) {
115
+ if (data instanceof Uint8Array) {
116
+ dataHash = (await hashToHex_Uint8Array('', data)).toUpperCase();
117
+ }
118
+ else {
119
+ dataHash = (await hashToHex(JSON.stringify(data))).toUpperCase();
120
+ }
121
+ }
55
122
  // if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
56
123
  const allHash = hasRel8ns || hasData ?
57
124
  (await hashToHex(ibHash + rel8nsHash + dataHash)).toUpperCase() :
@@ -1 +1 @@
1
- {"version":3,"file":"sha256v1.mjs","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"sha256v1.mjs","sourceRoot":"","sources":["../../src/V1/sha256v1.mts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@ibgib/ts-gib",
3
- "version": "0.5.17",
3
+ "version": "0.5.18",
4
4
  "description": "ibgib library with low-level graphing-related substrate functionality, e.g. creating raw ibgibs and transformations. node19+ needed for heavily-used webcrypto hashing isomorphically consumed in node and browsers (apps).",
5
5
  "repository": {
6
6
  "url": "https://gitlab.com/ibgib/ts-gib",
@@ -11,6 +11,8 @@ let { subtle } = crypto;
11
11
  * I have it all in one function for smallest, most independent version possible.
12
12
  *
13
13
  * #thanks https://developer.mozilla.org/en-US/docs/Web/API/SubtleCrypto/digest
14
+ * #thanks https://stackoverflow.com/questions/49129643/how-do-i-merge-an-array-of-uint8arrays
15
+ * #thanks https://stackoverflow.com/a/49129872/3897838 (answer to above)
14
16
  *
15
17
  * @param ibGib ibGib for which to calculate the gib
16
18
  */
@@ -22,20 +24,58 @@ export function sha256v1(ibGib: IbGib_V1, salt: string = ""): Promise<string> {
22
24
  const msgUint8 = new TextEncoder().encode(message);
23
25
  const buffer = await subtle.digest('SHA-256', msgUint8);
24
26
  const asArray = Array.from(new Uint8Array(buffer));
27
+ // return hashAsHex
25
28
  return asArray.map(b => b.toString(16).padStart(2, '0')).join('');
26
29
  };
30
+ let hashToHex_Uint8Array = async (salt: string, msgUint8: Uint8Array) => {
31
+ let tohashUint8Array: Uint8Array;
32
+ if (salt) {
33
+ const msgUint8_salt = new TextEncoder().encode(salt);
34
+ tohashUint8Array = new Uint8Array(msgUint8_salt.length + msgUint8.length);
35
+ tohashUint8Array.set(msgUint8_salt);
36
+ tohashUint8Array.set(msgUint8, msgUint8_salt.length);
37
+ } else {
38
+ tohashUint8Array = msgUint8;
39
+ }
40
+ const hashAsBuffer = await subtle.digest('SHA-256', tohashUint8Array);
41
+ const hashAsArray = Array.from(new Uint8Array(hashAsBuffer));
42
+ // return hashAsHex
43
+ return hashAsArray.map(b => b.toString(16).padStart(2, '0')).join('');
44
+ };
27
45
  let hashFields;
28
46
  if (salt) {
29
47
  hashFields = async (ib: Ib, data: IbGibData_V1 | undefined, rel8ns: IbGibRel8ns_V1 | undefined) => {
30
48
  const hasRel8ns =
31
49
  Object.keys(rel8ns || {}).length > 0 &&
32
50
  Object.keys(rel8ns || {}).some(k => rel8ns![k] && rel8ns![k]!.length > 0);
33
- const hasData = Object.keys((data) || {}).length > 0;
51
+ let hasData = !!data;
52
+ if (hasData) {
53
+ if (typeof data === 'string') {
54
+ hasData = (data as string).length > 0;
55
+ } else if (data instanceof Uint8Array) {
56
+ hasData = true;
57
+ } else if (typeof data === 'object') {
58
+ hasData = Object.keys((data) || {}).length > 0;
59
+ } else {
60
+ hasData = true;
61
+ }
62
+ }
34
63
  const ibHash = (await hashToHex(salt + ib)).toUpperCase();
35
64
  // empty, null, undefined all treated the same at this level.
36
65
  const rel8nsHash: string = hasRel8ns ? (await hashToHex(salt + JSON.stringify(rel8ns))).toUpperCase() : "";
37
66
  // empty, null, undefined all treated the same at this level (though not farther down in data)
38
- const dataHash: string = hasData ? (await hashToHex(salt + JSON.stringify(data))).toUpperCase() : "";
67
+
68
+ // change this for binaries (Uint8Array data)
69
+ // const dataHash: string = hasData ? (await hashToHex(salt + JSON.stringify(data))).toUpperCase() : "";
70
+ let dataHash: string = "";
71
+ if (hasData) {
72
+ if (data instanceof Uint8Array) {
73
+ dataHash = (await hashToHex_Uint8Array(salt, data)).toUpperCase();
74
+ } else {
75
+ dataHash = (await hashToHex(salt + JSON.stringify(data))).toUpperCase();
76
+ }
77
+ }
78
+
39
79
  // if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
40
80
  const allHash = hasRel8ns || hasData ?
41
81
  (await hashToHex(salt + ibHash + rel8nsHash + dataHash)).toUpperCase() :
@@ -47,12 +87,32 @@ export function sha256v1(ibGib: IbGib_V1, salt: string = ""): Promise<string> {
47
87
  const hasRel8ns =
48
88
  Object.keys(rel8ns || {}).length > 0 &&
49
89
  Object.keys(rel8ns || {}).some(k => rel8ns![k] && rel8ns![k]!.length > 0);
50
- const hasData = Object.keys((data) || {}).length > 0;
90
+ // const hasData = Object.keys((data) || {}).length > 0;
91
+ let hasData = !!data;
92
+ if (hasData) {
93
+ if (typeof data === 'string') {
94
+ hasData = (data as string).length > 0;
95
+ } else if (data instanceof Uint8Array) {
96
+ hasData = true;
97
+ } else if (typeof data === 'object') {
98
+ hasData = Object.keys((data) || {}).length > 0;
99
+ } else {
100
+ hasData = true;
101
+ }
102
+ }
51
103
  const ibHash = (await hashToHex(ib)).toUpperCase();
52
104
  // empty, null, undefined all treated the same at this level.
53
105
  const rel8nsHash: string = hasRel8ns ? (await hashToHex(JSON.stringify(rel8ns))).toUpperCase() : "";
54
106
  // empty, null, undefined all treated the same at this level (though not farther down in data)
55
- const dataHash: string = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
107
+ // const dataHash: string = hasData ? (await hashToHex(JSON.stringify(data))).toUpperCase() : "";
108
+ let dataHash: string = "";
109
+ if (hasData) {
110
+ if (data instanceof Uint8Array) {
111
+ dataHash = (await hashToHex_Uint8Array('', data)).toUpperCase();
112
+ } else {
113
+ dataHash = (await hashToHex(JSON.stringify(data))).toUpperCase();
114
+ }
115
+ }
56
116
  // if the ibgib has no rel8ns or data, the hash should be just of the ib itself.
57
117
  const allHash = hasRel8ns || hasData ?
58
118
  (await hashToHex(ibHash + rel8nsHash + dataHash)).toUpperCase() :