@prosopo/datasets 3.0.34 → 3.0.42

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (72) hide show
  1. package/CHANGELOG.md +70 -0
  2. package/coverage/base.css +224 -0
  3. package/coverage/block-navigation.js +87 -0
  4. package/coverage/clover.xml +493 -0
  5. package/coverage/coverage-final.json +7 -0
  6. package/coverage/favicon.png +0 -0
  7. package/coverage/index.html +131 -0
  8. package/coverage/prettify.css +1 -0
  9. package/coverage/prettify.js +2 -0
  10. package/coverage/sort-arrow-sprite.png +0 -0
  11. package/coverage/sorter.js +210 -0
  12. package/coverage/src/captcha/captcha.ts.html +1093 -0
  13. package/coverage/src/captcha/dataset.ts.html +490 -0
  14. package/coverage/src/captcha/index.html +176 -0
  15. package/coverage/src/captcha/index.ts.html +136 -0
  16. package/coverage/src/captcha/merkle.ts.html +610 -0
  17. package/coverage/src/captcha/util.ts.html +187 -0
  18. package/coverage/src/index.html +116 -0
  19. package/coverage/src/index.ts.html +139 -0
  20. package/dist/captcha/captcha.d.ts +21 -0
  21. package/dist/captcha/captcha.d.ts.map +1 -0
  22. package/dist/captcha/captcha.js +154 -173
  23. package/dist/captcha/captcha.js.map +1 -0
  24. package/dist/captcha/dataset.d.ts +8 -0
  25. package/dist/captcha/dataset.d.ts.map +1 -0
  26. package/dist/captcha/dataset.js +69 -83
  27. package/dist/captcha/dataset.js.map +1 -0
  28. package/dist/captcha/index.d.ts +5 -0
  29. package/dist/captcha/index.d.ts.map +1 -0
  30. package/dist/captcha/index.js +5 -27
  31. package/dist/captcha/index.js.map +1 -0
  32. package/dist/captcha/merkle.d.ts +20 -0
  33. package/dist/captcha/merkle.d.ts.map +1 -0
  34. package/dist/captcha/merkle.js +109 -112
  35. package/dist/captcha/merkle.js.map +1 -0
  36. package/dist/captcha/util.d.ts +2 -0
  37. package/dist/captcha/util.d.ts.map +1 -0
  38. package/dist/captcha/util.js +18 -19
  39. package/dist/captcha/util.js.map +1 -0
  40. package/dist/index.d.ts +3 -0
  41. package/dist/index.d.ts.map +1 -0
  42. package/dist/index.js +3 -31
  43. package/dist/index.js.map +1 -0
  44. package/dist/tests/captcha.unit.test.d.ts +2 -0
  45. package/dist/tests/captcha.unit.test.d.ts.map +1 -0
  46. package/dist/tests/captcha.unit.test.js +357 -0
  47. package/dist/tests/captcha.unit.test.js.map +1 -0
  48. package/dist/tests/dataset.unit.test.d.ts +2 -0
  49. package/dist/tests/dataset.unit.test.d.ts.map +1 -0
  50. package/dist/tests/dataset.unit.test.js +126 -0
  51. package/dist/tests/dataset.unit.test.js.map +1 -0
  52. package/dist/tests/merkle.unit.test.d.ts +2 -0
  53. package/dist/tests/merkle.unit.test.d.ts.map +1 -0
  54. package/dist/tests/merkle.unit.test.js +171 -0
  55. package/dist/tests/merkle.unit.test.js.map +1 -0
  56. package/dist/tests/mocks/data/captchas.d.ts +24 -0
  57. package/dist/tests/mocks/data/captchas.d.ts.map +1 -0
  58. package/dist/tests/mocks/data/captchas.js +1033 -1039
  59. package/dist/tests/mocks/data/captchas.js.map +1 -0
  60. package/dist/tests/mocks/data/captchas.json +886 -886
  61. package/dist/tests/mocks/data/captchas1.json +132 -132
  62. package/dist/tests/mocks/data/captchas2.json +175 -175
  63. package/dist/tests/mocks/data/captchas3.json +133 -133
  64. package/dist/tests/mocks/data/captchas4.json +132 -132
  65. package/package.json +13 -13
  66. package/dist/cjs/captcha/captcha.cjs +0 -195
  67. package/dist/cjs/captcha/dataset.cjs +0 -93
  68. package/dist/cjs/captcha/index.cjs +0 -27
  69. package/dist/cjs/captcha/merkle.cjs +0 -128
  70. package/dist/cjs/captcha/util.cjs +0 -23
  71. package/dist/cjs/index.cjs +0 -31
  72. package/dist/cjs/tests/mocks/data/captchas.cjs +0 -1044
@@ -1,195 +1,176 @@
1
1
  import { isHex } from "@polkadot/util";
2
2
  import { ProsopoDatasetError, ProsopoEnvError } from "@prosopo/common";
3
- import { DatasetWithNumericSolutionSchema, CaptchaSolutionArraySchema } from "@prosopo/types";
3
+ import { CaptchaSolutionArraySchema, DatasetWithNumericSolutionSchema, } from "@prosopo/types";
4
4
  import { at } from "@prosopo/util";
5
- import { hexHashArray, hexHash } from "@prosopo/util-crypto";
5
+ import { hexHash, hexHashArray } from "@prosopo/util-crypto";
6
6
  import { downloadImage } from "./util.js";
7
- const NO_SOLUTION_VALUE = "NO_SOLUTION";
8
- function parseCaptchaDataset(datasetJSON) {
9
- try {
10
- const result = DatasetWithNumericSolutionSchema.parse(datasetJSON);
11
- const result2 = {
12
- format: result.format,
13
- captchas: result.captchas.map((captcha) => {
14
- return {
15
- ...captcha,
16
- solution: captcha.solution ? matchItemsToSolutions(captcha.solution, captcha.items) : [],
17
- unlabelled: captcha.unlabelled ? matchItemsToSolutions(captcha.unlabelled, captcha.items) : []
7
+ export const NO_SOLUTION_VALUE = "NO_SOLUTION";
8
+ export function parseCaptchaDataset(datasetJSON) {
9
+ try {
10
+ const result = DatasetWithNumericSolutionSchema.parse(datasetJSON);
11
+ const result2 = {
12
+ format: result.format,
13
+ captchas: result.captchas.map((captcha) => {
14
+ return {
15
+ ...captcha,
16
+ solution: captcha.solution
17
+ ? matchItemsToSolutions(captcha.solution, captcha.items)
18
+ : [],
19
+ unlabelled: captcha.unlabelled
20
+ ? matchItemsToSolutions(captcha.unlabelled, captcha.items)
21
+ : [],
22
+ };
23
+ }),
18
24
  };
19
- })
20
- };
21
- if (result.datasetId !== void 0) result2.datasetId = result.datasetId;
22
- if (result.contentTree !== void 0)
23
- result2.contentTree = result.contentTree;
24
- if (result.datasetContentId !== void 0)
25
- result2.datasetContentId = result.datasetContentId;
26
- if (result.solutionTree !== void 0)
27
- result2.solutionTree = result.solutionTree;
28
- return result2;
29
- } catch (err) {
30
- throw new ProsopoDatasetError("DATASET.DATASET_PARSE_ERROR", {
31
- context: { error: err }
32
- });
33
- }
34
- }
35
- function parseAndSortCaptchaSolutions(captchaJSON) {
36
- try {
37
- return CaptchaSolutionArraySchema.parse(captchaJSON).map((captcha) => ({
38
- ...captcha,
39
- solution: captcha.solution.sort()
40
- }));
41
- } catch (err) {
42
- throw new ProsopoDatasetError("DATASET.SOLUTION_PARSE_ERROR", {
43
- context: { error: err }
44
- });
45
- }
46
- }
47
- function captchaSort(a, b) {
48
- return a.captchaId.localeCompare(b.captchaId);
49
- }
50
- function sortAndComputeHashes(received, stored) {
51
- received.sort(captchaSort);
52
- stored.sort(captchaSort);
53
- return stored.map(
54
- ({ salt, items = [], target = "", captchaId, solved }, index) => {
55
- const item = at(received, index);
56
- if (captchaId !== item.captchaId) {
57
- throw new ProsopoEnvError("CAPTCHA.ID_MISMATCH");
58
- }
59
- return {
60
- hash: computeCaptchaHash(
61
- {
62
- solution: solved ? item.solution : [],
63
- salt,
64
- items,
65
- target
66
- },
67
- true,
68
- true,
69
- false
70
- ),
71
- captchaId
72
- };
25
+ if (result.datasetId !== undefined)
26
+ result2.datasetId = result.datasetId;
27
+ if (result.contentTree !== undefined)
28
+ result2.contentTree = result.contentTree;
29
+ if (result.datasetContentId !== undefined)
30
+ result2.datasetContentId = result.datasetContentId;
31
+ if (result.solutionTree !== undefined)
32
+ result2.solutionTree = result.solutionTree;
33
+ return result2;
34
+ }
35
+ catch (err) {
36
+ throw new ProsopoDatasetError("DATASET.DATASET_PARSE_ERROR", {
37
+ context: { error: err },
38
+ });
73
39
  }
74
- );
75
40
  }
76
- function compareCaptchaSolutions(received, solutions, totalImages, threshold) {
77
- received.sort(captchaSort);
78
- solutions.sort(captchaSort);
79
- if (received.length !== solutions.length) {
80
- return false;
81
- }
82
- if (received.length && solutions.length && received.length === solutions.length) {
83
- const captchaIdMismatch = received.some(
84
- (captcha, index) => solutions[index] && captcha.captchaId !== solutions[index].captchaId
85
- );
86
- if (captchaIdMismatch) {
87
- return false;
41
+ export function parseAndSortCaptchaSolutions(captchaJSON) {
42
+ try {
43
+ return CaptchaSolutionArraySchema.parse(captchaJSON).map((captcha) => ({
44
+ ...captcha,
45
+ solution: captcha.solution.sort(),
46
+ }));
88
47
  }
89
- }
90
- return received.every((captcha, index) => {
91
- const sortedReceivedSolution = captcha.solution.sort();
92
- const targetSolution = solutions[index]?.solution.sort();
93
- if (!targetSolution) {
94
- return false;
48
+ catch (err) {
49
+ throw new ProsopoDatasetError("DATASET.SOLUTION_PARSE_ERROR", {
50
+ context: { error: err },
51
+ });
95
52
  }
96
- const incorrectCount = sortedReceivedSolution.filter(
97
- (solution) => !targetSolution.includes(solution)
98
- ).length;
99
- const missingCount = targetSolution.filter(
100
- (solution) => !sortedReceivedSolution.includes(solution)
101
- ).length;
102
- const totalIncorrect = incorrectCount + missingCount;
103
- const percentageCorrect = 1 - totalIncorrect / totalImages;
104
- return percentageCorrect >= threshold;
105
- });
106
53
  }
107
- function computeCaptchaHash(captcha, includeSolution, includeSalt, sortItemHashes) {
108
- try {
109
- const itemHashes = captcha.items.map((item, index) => {
110
- if (item.hash) {
111
- return item.hash;
112
- }
113
- throw new ProsopoDatasetError("CAPTCHA.MISSING_ITEM_HASH", {
114
- context: {
115
- computeCaptchaHashName: computeCaptchaHash.name,
116
- index
54
+ export function captchaSort(a, b) {
55
+ return a.captchaId.localeCompare(b.captchaId);
56
+ }
57
+ export function sortAndComputeHashes(received, stored) {
58
+ received.sort(captchaSort);
59
+ stored.sort(captchaSort);
60
+ return stored.map(({ salt, items = [], target = "", captchaId, solved }, index) => {
61
+ const item = at(received, index);
62
+ if (captchaId !== item.captchaId) {
63
+ throw new ProsopoEnvError("CAPTCHA.ID_MISMATCH");
117
64
  }
118
- });
65
+ return {
66
+ hash: computeCaptchaHash({
67
+ solution: solved ? item.solution : [],
68
+ salt,
69
+ items,
70
+ target,
71
+ }, true, true, false),
72
+ captchaId,
73
+ };
119
74
  });
120
- return hexHashArray([
121
- captcha.target,
122
- // empty array hashes as empty string, undefined solution results in the array [`NO_SOLUTION`]
123
- // [undefined] also hashes as empty string, which is why we don't use it
124
- ...includeSolution ? getSolutionValueToHash(captcha.solution) : [],
125
- includeSalt ? captcha.salt : "",
126
- sortItemHashes ? itemHashes.sort() : itemHashes
127
- ]);
128
- } catch (err) {
129
- throw new ProsopoDatasetError("DATASET.HASH_ERROR", {
130
- context: { error: err }
75
+ }
76
+ export function compareCaptchaSolutions(received, solutions, totalImages, threshold) {
77
+ received.sort(captchaSort);
78
+ solutions.sort(captchaSort);
79
+ if (received.length !== solutions.length) {
80
+ return false;
81
+ }
82
+ if (received.length &&
83
+ solutions.length &&
84
+ received.length === solutions.length) {
85
+ const captchaIdMismatch = received.some((captcha, index) => solutions[index] && captcha.captchaId !== solutions[index].captchaId);
86
+ if (captchaIdMismatch) {
87
+ return false;
88
+ }
89
+ }
90
+ return received.every((captcha, index) => {
91
+ const sortedReceivedSolution = captcha.solution.sort();
92
+ const targetSolution = solutions[index]?.solution.sort();
93
+ if (!targetSolution) {
94
+ return false;
95
+ }
96
+ const incorrectCount = sortedReceivedSolution.filter((solution) => !targetSolution.includes(solution)).length;
97
+ const missingCount = targetSolution.filter((solution) => !sortedReceivedSolution.includes(solution)).length;
98
+ const totalIncorrect = incorrectCount + missingCount;
99
+ const percentageCorrect = 1 - totalIncorrect / totalImages;
100
+ return percentageCorrect >= threshold;
131
101
  });
132
- }
133
102
  }
134
- function getSolutionValueToHash(solution) {
135
- return solution !== void 0 ? solution.sort() : [NO_SOLUTION_VALUE];
103
+ export function computeCaptchaHash(captcha, includeSolution, includeSalt, sortItemHashes) {
104
+ try {
105
+ const itemHashes = captcha.items.map((item, index) => {
106
+ if (item.hash) {
107
+ return item.hash;
108
+ }
109
+ throw new ProsopoDatasetError("CAPTCHA.MISSING_ITEM_HASH", {
110
+ context: {
111
+ computeCaptchaHashName: computeCaptchaHash.name,
112
+ index,
113
+ },
114
+ });
115
+ });
116
+ return hexHashArray([
117
+ captcha.target,
118
+ ...(includeSolution ? getSolutionValueToHash(captcha.solution) : []),
119
+ includeSalt ? captcha.salt : "",
120
+ sortItemHashes ? itemHashes.sort() : itemHashes,
121
+ ]);
122
+ }
123
+ catch (err) {
124
+ throw new ProsopoDatasetError("DATASET.HASH_ERROR", {
125
+ context: { error: err },
126
+ });
127
+ }
136
128
  }
137
- async function computeItemHash(item) {
138
- if (item.type === "text") {
139
- return { ...item, hash: hexHash(item.data) };
140
- }
141
- if (item.type === "image") {
142
- return { ...item, hash: hexHash(await downloadImage(item.data)) };
143
- }
144
- throw new ProsopoDatasetError("CAPTCHA.INVALID_ITEM_FORMAT");
129
+ export function getSolutionValueToHash(solution) {
130
+ return solution !== undefined ? solution.sort() : [NO_SOLUTION_VALUE];
145
131
  }
146
- function matchItemsToSolutions(solutions, items) {
147
- if (!items) {
148
- return [];
149
- }
150
- return solutions.map((solution) => {
151
- if (typeof solution === "string" && isHex(solution)) {
152
- if (!items?.some((item) => item.hash === solution)) {
153
- throw new ProsopoDatasetError("CAPTCHA.INVALID_ITEM_HASH");
154
- }
155
- return solution;
132
+ export async function computeItemHash(item) {
133
+ if (item.type === "text") {
134
+ return { ...item, hash: hexHash(item.data) };
135
+ }
136
+ if (item.type === "image") {
137
+ return { ...item, hash: hexHash(await downloadImage(item.data)) };
156
138
  }
157
- if (typeof solution === "number") {
158
- const item = at(items, solution);
159
- return item.hash;
139
+ throw new ProsopoDatasetError("CAPTCHA.INVALID_ITEM_FORMAT");
140
+ }
141
+ export function matchItemsToSolutions(solutions, items) {
142
+ if (!items) {
143
+ return [];
160
144
  }
161
- throw new ProsopoDatasetError("CAPTCHA.INVALID_SOLUTION_TYPE");
162
- });
145
+ return solutions.map((solution) => {
146
+ if (typeof solution === "string" && isHex(solution)) {
147
+ if (!items?.some((item) => item.hash === solution)) {
148
+ throw new ProsopoDatasetError("CAPTCHA.INVALID_ITEM_HASH");
149
+ }
150
+ return solution;
151
+ }
152
+ if (typeof solution === "number") {
153
+ const item = at(items, solution);
154
+ return item.hash;
155
+ }
156
+ throw new ProsopoDatasetError("CAPTCHA.INVALID_SOLUTION_TYPE");
157
+ });
163
158
  }
164
- function computeCaptchaSolutionHash(captcha) {
165
- return hexHashArray([
166
- captcha.captchaId,
167
- captcha.captchaContentId,
168
- [...captcha.solution].sort(),
169
- captcha.salt
170
- ]);
159
+ export function computeCaptchaSolutionHash(captcha) {
160
+ return hexHashArray([
161
+ captcha.captchaId,
162
+ captcha.captchaContentId,
163
+ [...captcha.solution].sort(),
164
+ captcha.salt,
165
+ ]);
171
166
  }
172
- function computePendingRequestHash(captchaIds, userAccount, salt) {
173
- return hexHashArray([...captchaIds.sort(), userAccount, salt]);
167
+ export function computePendingRequestHash(captchaIds, userAccount, salt) {
168
+ return hexHashArray([...captchaIds.sort(), userAccount, salt]);
174
169
  }
175
- function parseCaptchaAssets(item, assetsResolver) {
176
- return {
177
- ...item,
178
- data: assetsResolver?.resolveAsset(item.data).getURL() || item.data
179
- };
170
+ export function parseCaptchaAssets(item, assetsResolver) {
171
+ return {
172
+ ...item,
173
+ data: assetsResolver?.resolveAsset(item.data).getURL() || item.data,
174
+ };
180
175
  }
181
- export {
182
- NO_SOLUTION_VALUE,
183
- captchaSort,
184
- compareCaptchaSolutions,
185
- computeCaptchaHash,
186
- computeCaptchaSolutionHash,
187
- computeItemHash,
188
- computePendingRequestHash,
189
- getSolutionValueToHash,
190
- matchItemsToSolutions,
191
- parseAndSortCaptchaSolutions,
192
- parseCaptchaAssets,
193
- parseCaptchaDataset,
194
- sortAndComputeHashes
195
- };
176
+ //# sourceMappingURL=captcha.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"captcha.js","sourceRoot":"","sources":["../../src/captcha/captcha.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,8 @@
1
+ import type { Captcha, Dataset, DatasetRaw } from "@prosopo/types";
2
+ import { CaptchaMerkleTree } from "./merkle.js";
3
+ export declare function hashDatasetItems(datasetRaw: Dataset | DatasetRaw): Promise<Promise<Captcha>[]>;
4
+ export declare function validateDatasetContent(datasetOriginal: Dataset): Promise<boolean>;
5
+ export declare function buildDataset(datasetRaw: DatasetRaw): Promise<Dataset>;
6
+ export declare function buildCaptchaTree(dataset: Dataset, includeSolution: boolean, includeSalt: boolean, sortItemHashes: boolean): Promise<CaptchaMerkleTree>;
7
+ export declare function addSolutionHashesToDataset(datasetRaw: DatasetRaw): Dataset;
8
+ //# sourceMappingURL=dataset.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset.d.ts","sourceRoot":"","sources":["../../src/captcha/dataset.ts"],"names":[],"mappings":"AAcA,OAAO,KAAK,EACX,OAAO,EAEP,OAAO,EACP,UAAU,EACV,MAAM,gBAAgB,CAAC;AAOxB,OAAO,EAAE,iBAAiB,EAAE,MAAM,aAAa,CAAC;AAIhD,wBAAsB,gBAAgB,CACrC,UAAU,EAAE,OAAO,GAAG,UAAU,GAC9B,OAAO,CAAC,OAAO,CAAC,OAAO,CAAC,EAAE,CAAC,CAU7B;AAMD,wBAAsB,sBAAsB,CAC3C,eAAe,EAAE,OAAO,GACtB,OAAO,CAAC,OAAO,CAAC,CAwBlB;AAED,wBAAsB,YAAY,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAAC,OAAO,CAAC,CAqB3E;AAED,wBAAsB,gBAAgB,CACrC,OAAO,EAAE,OAAO,EAChB,eAAe,EAAE,OAAO,EACxB,WAAW,EAAE,OAAO,EACpB,cAAc,EAAE,OAAO,GACrB,OAAO,CAAC,iBAAiB,CAAC,CAY5B;AAED,wBAAgB,0BAA0B,CAAC,UAAU,EAAE,UAAU,GAAG,OAAO,CAgB1E"}
@@ -1,93 +1,79 @@
1
- import { getLogger, ProsopoEnvError } from "@prosopo/common";
1
+ import { ProsopoEnvError, getLogger } from "@prosopo/common";
2
2
  import { at } from "@prosopo/util";
3
- import { computeItemHash, computeCaptchaHash, matchItemsToSolutions } from "./captcha.js";
3
+ import { computeCaptchaHash, computeItemHash, matchItemsToSolutions, } from "./captcha.js";
4
4
  import { CaptchaMerkleTree } from "./merkle.js";
5
5
  const logger = getLogger("info", import.meta.url);
6
- async function hashDatasetItems(datasetRaw) {
7
- return datasetRaw.captchas.map(async (captcha) => {
8
- const items = await Promise.all(
9
- captcha.items.map(async (item) => computeItemHash(item))
10
- );
11
- return {
12
- ...captcha,
13
- items
14
- };
15
- });
6
+ export async function hashDatasetItems(datasetRaw) {
7
+ return datasetRaw.captchas.map(async (captcha) => {
8
+ const items = await Promise.all(captcha.items.map(async (item) => computeItemHash(item)));
9
+ return {
10
+ ...captcha,
11
+ items,
12
+ };
13
+ });
16
14
  }
17
- async function validateDatasetContent(datasetOriginal) {
18
- const captchaPromises = await hashDatasetItems(datasetOriginal);
19
- const captchas = await Promise.all(captchaPromises);
20
- const dataset = {
21
- ...datasetOriginal,
22
- captchas
23
- };
24
- const hashes = dataset.captchas.map((captcha) => {
25
- const captchaRaw = datasetOriginal.captchas.find(
26
- (captchaRaw2) => "captchaId" in captchaRaw2 ? captchaRaw2.captchaId === captcha.captchaId : false
27
- );
28
- if (captchaRaw) {
29
- return captcha.items.every(
30
- (item, index) => item.hash === at(captchaRaw.items, index).hash
31
- );
32
- }
33
- return false;
34
- });
35
- return hashes.every((hash) => hash);
15
+ export async function validateDatasetContent(datasetOriginal) {
16
+ const captchaPromises = await hashDatasetItems(datasetOriginal);
17
+ const captchas = await Promise.all(captchaPromises);
18
+ const dataset = {
19
+ ...datasetOriginal,
20
+ captchas,
21
+ };
22
+ const hashes = dataset.captchas.map((captcha) => {
23
+ const captchaRaw = datasetOriginal.captchas.find((captchaRaw) => "captchaId" in captchaRaw
24
+ ? captchaRaw.captchaId === captcha.captchaId
25
+ : false);
26
+ if (captchaRaw) {
27
+ return captcha.items.every((item, index) => item.hash === at(captchaRaw.items, index).hash);
28
+ }
29
+ return false;
30
+ });
31
+ return hashes.every((hash) => hash);
36
32
  }
37
- async function buildDataset(datasetRaw) {
38
- logger.debug(() => ({ msg: "Adding solution hashes to dataset" }));
39
- const dataset = await addSolutionHashesToDataset(datasetRaw);
40
- logger.debug(() => ({ msg: "Building dataset merkle trees" }));
41
- const contentTree = await buildCaptchaTree(dataset, false, false, true);
42
- const solutionTree = await buildCaptchaTree(dataset, true, true, false);
43
- dataset.captchas = dataset.captchas.map(
44
- (captcha, index) => ({
45
- ...captcha,
46
- captchaId: at(solutionTree.leaves, index).hash,
47
- captchaContentId: at(contentTree.leaves, index).hash,
48
- datasetId: solutionTree.root?.hash,
49
- datasetContentId: contentTree.root?.hash
50
- })
51
- );
52
- dataset.solutionTree = solutionTree.layers;
53
- dataset.contentTree = contentTree.layers;
54
- dataset.datasetId = solutionTree.root?.hash;
55
- dataset.datasetContentId = contentTree.root?.hash;
56
- return dataset;
33
+ export async function buildDataset(datasetRaw) {
34
+ logger.debug(() => ({ msg: "Adding solution hashes to dataset" }));
35
+ const dataset = await addSolutionHashesToDataset(datasetRaw);
36
+ logger.debug(() => ({ msg: "Building dataset merkle trees" }));
37
+ const contentTree = await buildCaptchaTree(dataset, false, false, true);
38
+ const solutionTree = await buildCaptchaTree(dataset, true, true, false);
39
+ dataset.captchas = dataset.captchas.map((captcha, index) => ({
40
+ ...captcha,
41
+ captchaId: at(solutionTree.leaves, index).hash,
42
+ captchaContentId: at(contentTree.leaves, index).hash,
43
+ datasetId: solutionTree.root?.hash,
44
+ datasetContentId: contentTree.root?.hash,
45
+ }));
46
+ dataset.solutionTree = solutionTree.layers;
47
+ dataset.contentTree = contentTree.layers;
48
+ dataset.datasetId = solutionTree.root?.hash;
49
+ dataset.datasetContentId = contentTree.root?.hash;
50
+ return dataset;
57
51
  }
58
- async function buildCaptchaTree(dataset, includeSolution, includeSalt, sortItemHashes) {
59
- try {
60
- const tree = new CaptchaMerkleTree();
61
- const datasetWithItemHashes = { ...dataset };
62
- const captchaHashes = datasetWithItemHashes.captchas.map(
63
- (captcha) => computeCaptchaHash(captcha, includeSolution, includeSalt, sortItemHashes)
64
- );
65
- tree.build(captchaHashes);
66
- return tree;
67
- } catch (err) {
68
- throw new ProsopoEnvError("DATASET.HASH_ERROR");
69
- }
52
+ export async function buildCaptchaTree(dataset, includeSolution, includeSalt, sortItemHashes) {
53
+ try {
54
+ const tree = new CaptchaMerkleTree();
55
+ const datasetWithItemHashes = { ...dataset };
56
+ const captchaHashes = datasetWithItemHashes.captchas.map((captcha) => computeCaptchaHash(captcha, includeSolution, includeSalt, sortItemHashes));
57
+ tree.build(captchaHashes);
58
+ return tree;
59
+ }
60
+ catch (err) {
61
+ throw new ProsopoEnvError("DATASET.HASH_ERROR");
62
+ }
70
63
  }
71
- function addSolutionHashesToDataset(datasetRaw) {
72
- const captchas = datasetRaw.captchas.map((captcha) => {
64
+ export function addSolutionHashesToDataset(datasetRaw) {
65
+ const captchas = datasetRaw.captchas.map((captcha) => {
66
+ return {
67
+ ...captcha,
68
+ items: captcha.items,
69
+ ...(captcha.solution !== undefined && {
70
+ solution: matchItemsToSolutions(captcha.solution, captcha.items),
71
+ }),
72
+ };
73
+ });
73
74
  return {
74
- ...captcha,
75
- items: captcha.items,
76
- // some captcha challenges will not have a solution
77
- ...captcha.solution !== void 0 && {
78
- solution: matchItemsToSolutions(captcha.solution, captcha.items)
79
- }
75
+ ...datasetRaw,
76
+ captchas,
80
77
  };
81
- });
82
- return {
83
- ...datasetRaw,
84
- captchas
85
- };
86
78
  }
87
- export {
88
- addSolutionHashesToDataset,
89
- buildCaptchaTree,
90
- buildDataset,
91
- hashDatasetItems,
92
- validateDatasetContent
93
- };
79
+ //# sourceMappingURL=dataset.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"dataset.js","sourceRoot":"","sources":["../../src/captcha/dataset.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,5 @@
1
+ export * from "./captcha.js";
2
+ export * from "./merkle.js";
3
+ export * from "./util.js";
4
+ export * from "./dataset.js";
5
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/captcha/index.ts"],"names":[],"mappings":"AAaA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
@@ -1,27 +1,5 @@
1
- import { NO_SOLUTION_VALUE, captchaSort, compareCaptchaSolutions, computeCaptchaHash, computeCaptchaSolutionHash, computeItemHash, computePendingRequestHash, getSolutionValueToHash, matchItemsToSolutions, parseAndSortCaptchaSolutions, parseCaptchaAssets, parseCaptchaDataset, sortAndComputeHashes } from "./captcha.js";
2
- import { CaptchaMerkleTree, verifyProof } from "./merkle.js";
3
- import { downloadImage } from "./util.js";
4
- import { addSolutionHashesToDataset, buildCaptchaTree, buildDataset, hashDatasetItems, validateDatasetContent } from "./dataset.js";
5
- export {
6
- CaptchaMerkleTree,
7
- NO_SOLUTION_VALUE,
8
- addSolutionHashesToDataset,
9
- buildCaptchaTree,
10
- buildDataset,
11
- captchaSort,
12
- compareCaptchaSolutions,
13
- computeCaptchaHash,
14
- computeCaptchaSolutionHash,
15
- computeItemHash,
16
- computePendingRequestHash,
17
- downloadImage,
18
- getSolutionValueToHash,
19
- hashDatasetItems,
20
- matchItemsToSolutions,
21
- parseAndSortCaptchaSolutions,
22
- parseCaptchaAssets,
23
- parseCaptchaDataset,
24
- sortAndComputeHashes,
25
- validateDatasetContent,
26
- verifyProof
27
- };
1
+ export * from "./captcha.js";
2
+ export * from "./merkle.js";
3
+ export * from "./util.js";
4
+ export * from "./dataset.js";
5
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/captcha/index.ts"],"names":[],"mappings":"AAaA,cAAc,cAAc,CAAC;AAC7B,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,CAAC;AAC1B,cAAc,cAAc,CAAC"}
@@ -0,0 +1,20 @@
1
+ import type { MerkleLayer, MerkleLeaf, MerkleNodeInterface, MerkleProof } from "@prosopo/types";
2
+ declare class MerkleNode implements MerkleNodeInterface {
3
+ hash: string;
4
+ parent: string | null;
5
+ constructor(hash: string);
6
+ }
7
+ export declare class CaptchaMerkleTree {
8
+ leaves: MerkleNode[];
9
+ layers: MerkleLayer[];
10
+ root: MerkleNode | undefined;
11
+ constructor();
12
+ getRoot(): MerkleNode;
13
+ build(leaves: string[]): void;
14
+ buildMerkleTree(leaves: MerkleNode[]): MerkleNode[];
15
+ createParent(leftChild: MerkleNode, rightChild: MerkleNode): MerkleNode;
16
+ proof(leafHash: MerkleLeaf): MerkleProof;
17
+ }
18
+ export declare function verifyProof(leaf: MerkleLeaf, proof: MerkleProof): boolean;
19
+ export {};
20
+ //# sourceMappingURL=merkle.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"merkle.d.ts","sourceRoot":"","sources":["../../src/captcha/merkle.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EACX,WAAW,EACX,UAAU,EACV,mBAAmB,EACnB,WAAW,EAEX,MAAM,gBAAgB,CAAC;AAIxB,cAAM,UAAW,YAAW,mBAAmB;IAC9C,IAAI,EAAE,MAAM,CAAC;IAEb,MAAM,EAAE,MAAM,GAAG,IAAI,CAAC;gBAEV,IAAI,EAAE,MAAM;CAIxB;AAED,qBAAa,iBAAiB;IAC7B,MAAM,EAAE,UAAU,EAAE,CAAC;IAErB,MAAM,EAAE,WAAW,EAAE,CAAC;IAEtB,IAAI,EAAE,UAAU,GAAG,SAAS,CAAC;;IAO7B,OAAO;IAYP,KAAK,CAAC,MAAM,EAAE,MAAM,EAAE;IAetB,eAAe,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,UAAU,EAAE;IA+BnD,YAAY,CAAC,SAAS,EAAE,UAAU,EAAE,UAAU,EAAE,UAAU,GAAG,UAAU;IASvE,KAAK,CAAC,QAAQ,EAAE,UAAU,GAAG,WAAW;CAsCxC;AAED,wBAAgB,WAAW,CAAC,IAAI,EAAE,UAAU,EAAE,KAAK,EAAE,WAAW,GAAG,OAAO,CAmBzE"}