@prosopo/provider 0.1.18 → 0.1.19
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/api/admin.d.ts +2 -0
- package/dist/api/admin.d.ts.map +1 -0
- package/dist/api/admin.js +58 -0
- package/dist/api/admin.js.map +1 -0
- package/dist/api/captcha.d.ts +10 -0
- package/dist/api/captcha.d.ts.map +1 -0
- package/dist/api/captcha.js +166 -0
- package/dist/api/captcha.js.map +1 -0
- package/dist/batch/commitments.d.ts +23 -0
- package/dist/batch/commitments.d.ts.map +1 -0
- package/dist/batch/commitments.js +145 -0
- package/dist/batch/commitments.js.map +1 -0
- package/dist/batch/index.d.ts +2 -0
- package/dist/batch/index.d.ts.map +1 -0
- package/dist/batch/index.js +15 -0
- package/dist/batch/index.js.map +1 -0
- package/dist/index.d.ts +5 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +18 -0
- package/dist/index.js.map +1 -0
- package/dist/scheduler.d.ts +5 -0
- package/dist/scheduler.d.ts.map +1 -0
- package/dist/scheduler.js +49 -0
- package/dist/scheduler.js.map +1 -0
- package/dist/tasks/calculateSolutions.d.ts +10 -0
- package/dist/tasks/calculateSolutions.d.ts.map +1 -0
- package/dist/tasks/calculateSolutions.js +92 -0
- package/dist/tasks/calculateSolutions.js.map +1 -0
- package/dist/tasks/index.d.ts +3 -0
- package/dist/tasks/index.d.ts.map +1 -0
- package/dist/tasks/index.js +16 -0
- package/dist/tasks/index.js.map +1 -0
- package/dist/tasks/tasks.d.ts +109 -0
- package/dist/tasks/tasks.d.ts.map +1 -0
- package/dist/tasks/tasks.js +365 -0
- package/dist/tasks/tasks.js.map +1 -0
- package/dist/util.d.ts +28 -0
- package/dist/util.d.ts.map +1 -0
- package/dist/util.js +117 -0
- package/dist/util.js.map +1 -0
- package/package.json +9 -9
- package/Dockerfile +0 -12
package/dist/util.d.ts
ADDED
|
@@ -0,0 +1,28 @@
|
|
|
1
|
+
import { Captcha, CaptchaSolution, ScheduledTaskNames } from '@prosopo/types';
|
|
2
|
+
import { Database } from '@prosopo/types-database';
|
|
3
|
+
import { Logger } from '@prosopo/common';
|
|
4
|
+
import pl from 'nodejs-polars';
|
|
5
|
+
export declare function encodeStringAddress(address: string): string;
|
|
6
|
+
export declare function shuffleArray<T>(array: T[]): T[];
|
|
7
|
+
type PromiseQueueRes<T> = {
|
|
8
|
+
data?: T;
|
|
9
|
+
error?: Error;
|
|
10
|
+
}[];
|
|
11
|
+
/**
|
|
12
|
+
* Executes promises in order
|
|
13
|
+
* @param array - array of promises
|
|
14
|
+
* @returns PromiseQueueRes\<T\>
|
|
15
|
+
*/
|
|
16
|
+
export declare function promiseQueue<T>(array: (() => Promise<T>)[]): Promise<PromiseQueueRes<T>>;
|
|
17
|
+
export declare function parseBlockNumber(blockNumberString: string): number;
|
|
18
|
+
export declare function calculateNewSolutions(solutions: CaptchaSolution[], winningNumberOfSolutions: number): pl.DataFrame;
|
|
19
|
+
export declare function updateSolutions(solutions: pl.DataFrame, captchas: Captcha[], logger: Logger): Captcha[];
|
|
20
|
+
/**
|
|
21
|
+
* Check if there is a batch running.
|
|
22
|
+
* If the batch task is running and not completed, return true.
|
|
23
|
+
* If the batch task is running and completed, return false.
|
|
24
|
+
* Otherwise, the batch task is not running, return false.
|
|
25
|
+
*/
|
|
26
|
+
export declare function checkIfTaskIsRunning(taskName: ScheduledTaskNames, db: Database): Promise<boolean>;
|
|
27
|
+
export {};
|
|
28
|
+
//# sourceMappingURL=util.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.d.ts","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"AAaA,OAAO,EAAE,OAAO,EAAE,eAAe,EAAE,kBAAkB,EAAuB,MAAM,gBAAgB,CAAA;AAClG,OAAO,EAAE,QAAQ,EAAE,MAAM,yBAAyB,CAAA;AAClD,OAAO,EAAE,MAAM,EAAmB,MAAM,iBAAiB,CAAA;AAKzD,OAAO,EAAE,MAAM,eAAe,CAAA;AAE9B,wBAAgB,mBAAmB,CAAC,OAAO,EAAE,MAAM,UAOlD;AAED,wBAAgB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,EAAE,GAAG,CAAC,EAAE,CAQ/C;AAED,KAAK,eAAe,CAAC,CAAC,IAAI;IACtB,IAAI,CAAC,EAAE,CAAC,CAAA;IACR,KAAK,CAAC,EAAE,KAAK,CAAA;CAChB,EAAE,CAAA;AAEH;;;;GAIG;AACH,wBAAsB,YAAY,CAAC,CAAC,EAAE,KAAK,EAAE,CAAC,MAAM,OAAO,CAAC,CAAC,CAAC,CAAC,EAAE,GAAG,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC,CAAC,CAmB9F;AAED,wBAAgB,gBAAgB,CAAC,iBAAiB,EAAE,MAAM,UAEzD;AAED,wBAAgB,qBAAqB,CAAC,SAAS,EAAE,eAAe,EAAE,EAAE,wBAAwB,EAAE,MAAM,gBAcnG;AAED,wBAAgB,eAAe,CAAC,SAAS,EAAE,EAAE,CAAC,SAAS,EAAE,QAAQ,EAAE,OAAO,EAAE,EAAE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,CAuBvG;AAED;;;;;GAKG;AACH,wBAAsB,oBAAoB,CAAC,QAAQ,EAAE,kBAAkB,EAAE,EAAE,EAAE,QAAQ,GAAG,OAAO,CAAC,OAAO,CAAC,CAOvG"}
|
package/dist/util.js
ADDED
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
// Copyright 2021-2023 Prosopo (UK) Ltd.
|
|
2
|
+
//
|
|
3
|
+
// Licensed under the Apache License, Version 2.0 (the "License");
|
|
4
|
+
// you may not use this file except in compliance with the License.
|
|
5
|
+
// You may obtain a copy of the License at
|
|
6
|
+
//
|
|
7
|
+
// http://www.apache.org/licenses/LICENSE-2.0
|
|
8
|
+
//
|
|
9
|
+
// Unless required by applicable law or agreed to in writing, software
|
|
10
|
+
// distributed under the License is distributed on an "AS IS" BASIS,
|
|
11
|
+
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
12
|
+
// See the License for the specific language governing permissions and
|
|
13
|
+
// limitations under the License.
|
|
14
|
+
import { ScheduledTaskStatus } from '@prosopo/types';
|
|
15
|
+
import { ProsopoEnvError } from '@prosopo/common';
|
|
16
|
+
import { arrayJoin } from '@prosopo/common';
|
|
17
|
+
import { at } from '@prosopo/util';
|
|
18
|
+
import { decodeAddress, encodeAddress } from '@polkadot/keyring';
|
|
19
|
+
import { hexToU8a, isHex } from '@polkadot/util';
|
|
20
|
+
import pl from 'nodejs-polars';
|
|
21
|
+
export function encodeStringAddress(address) {
|
|
22
|
+
try {
|
|
23
|
+
return encodeAddress(isHex(address) ? hexToU8a(address) : decodeAddress(address));
|
|
24
|
+
}
|
|
25
|
+
catch (error) {
|
|
26
|
+
// TODO fix error handling
|
|
27
|
+
throw new ProsopoEnvError(error, 'CONTRACT.INVALID_ADDRESS', {}, address);
|
|
28
|
+
}
|
|
29
|
+
}
|
|
30
|
+
export function shuffleArray(array) {
|
|
31
|
+
for (let arrayIndex = array.length - 1; arrayIndex > 0; arrayIndex--) {
|
|
32
|
+
const randIndex = Math.floor(Math.random() * (arrayIndex + 1));
|
|
33
|
+
const tmp = at(array, randIndex, { required: false });
|
|
34
|
+
array[randIndex] = at(array, arrayIndex, { required: false });
|
|
35
|
+
array[arrayIndex] = tmp;
|
|
36
|
+
}
|
|
37
|
+
return array;
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Executes promises in order
|
|
41
|
+
* @param array - array of promises
|
|
42
|
+
* @returns PromiseQueueRes\<T\>
|
|
43
|
+
*/
|
|
44
|
+
export async function promiseQueue(array) {
|
|
45
|
+
const ret = [];
|
|
46
|
+
await [...array, () => Promise.resolve(undefined)].reduce((promise, curr, i) => {
|
|
47
|
+
return promise
|
|
48
|
+
.then((res) => {
|
|
49
|
+
// first iteration has no res (initial reduce result)
|
|
50
|
+
if (res) {
|
|
51
|
+
ret.push({ data: res });
|
|
52
|
+
}
|
|
53
|
+
return curr();
|
|
54
|
+
})
|
|
55
|
+
.catch((err) => {
|
|
56
|
+
ret.push({ data: err });
|
|
57
|
+
return curr();
|
|
58
|
+
});
|
|
59
|
+
}, Promise.resolve(undefined));
|
|
60
|
+
return ret;
|
|
61
|
+
}
|
|
62
|
+
export function parseBlockNumber(blockNumberString) {
|
|
63
|
+
return parseInt(blockNumberString.replace(/,/g, ''));
|
|
64
|
+
}
|
|
65
|
+
export function calculateNewSolutions(solutions, winningNumberOfSolutions) {
|
|
66
|
+
if (solutions.length === 0) {
|
|
67
|
+
return pl.DataFrame([]);
|
|
68
|
+
}
|
|
69
|
+
const solutionsNoEmptyArrays = solutions.map(({ solution, ...otherAttrs }) => {
|
|
70
|
+
return { solutionKey: arrayJoin(solution, ','), ...otherAttrs };
|
|
71
|
+
});
|
|
72
|
+
let df = pl.readRecords(solutionsNoEmptyArrays);
|
|
73
|
+
df = df.drop('salt');
|
|
74
|
+
const group = df.groupBy(['captchaId', 'solutionKey']).agg(pl.count('captchaContentId').alias('count'));
|
|
75
|
+
const filtered = group.filter(pl.col('count').gt(winningNumberOfSolutions));
|
|
76
|
+
// TODO is below correct? 'solutionKey' does not exist in the type
|
|
77
|
+
const key = filtered['solutionKey'];
|
|
78
|
+
return filtered.withColumn(key.str.split(',').rename('solution'));
|
|
79
|
+
}
|
|
80
|
+
export function updateSolutions(solutions, captchas, logger) {
|
|
81
|
+
// Note - loading the dataset in nodejs-polars doesn't work because of nested objects, which is why this is done in
|
|
82
|
+
// a map instead of a join
|
|
83
|
+
return captchas.map((captcha) => {
|
|
84
|
+
// try to find the solution in the solutions dataframe
|
|
85
|
+
if (!captcha.solution) {
|
|
86
|
+
try {
|
|
87
|
+
const captchaSolutions = [
|
|
88
|
+
// TODO is below correct? 'solution' is not in the type
|
|
89
|
+
...solutions.filter(pl.col('captchaId').eq(pl.lit(captcha.captchaId)))['solution'].values(),
|
|
90
|
+
];
|
|
91
|
+
if (captchaSolutions.length > 0) {
|
|
92
|
+
captcha.solution = captchaSolutions[0];
|
|
93
|
+
captcha.solved = true;
|
|
94
|
+
}
|
|
95
|
+
}
|
|
96
|
+
catch {
|
|
97
|
+
logger.debug('No solution found for captchaId', captcha.captchaId);
|
|
98
|
+
}
|
|
99
|
+
}
|
|
100
|
+
return captcha;
|
|
101
|
+
});
|
|
102
|
+
}
|
|
103
|
+
/**
|
|
104
|
+
* Check if there is a batch running.
|
|
105
|
+
* If the batch task is running and not completed, return true.
|
|
106
|
+
* If the batch task is running and completed, return false.
|
|
107
|
+
* Otherwise, the batch task is not running, return false.
|
|
108
|
+
*/
|
|
109
|
+
export async function checkIfTaskIsRunning(taskName, db) {
|
|
110
|
+
const runningTask = await db.getLastScheduledTaskStatus(taskName, ScheduledTaskStatus.Running);
|
|
111
|
+
if (runningTask) {
|
|
112
|
+
const completedTask = await db.getScheduledTaskStatus(runningTask.taskId, ScheduledTaskStatus.Completed);
|
|
113
|
+
return !completedTask;
|
|
114
|
+
}
|
|
115
|
+
return false;
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=util.js.map
|
package/dist/util.js.map
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"util.js","sourceRoot":"","sources":["../src/util.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@prosopo/provider",
|
|
3
|
-
"version": "0.1.
|
|
3
|
+
"version": "0.1.19",
|
|
4
4
|
"author": "PROSOPO LIMITED <info@prosopo.io>",
|
|
5
5
|
"license": "Apache-2.0",
|
|
6
6
|
"main": "./dist/index.js",
|
|
@@ -23,14 +23,14 @@
|
|
|
23
23
|
"@polkadot/types": "10.9.1",
|
|
24
24
|
"@polkadot/util": "12.3.2",
|
|
25
25
|
"@polkadot/util-crypto": "12.3.2",
|
|
26
|
-
"@prosopo/common": "^0.1.
|
|
27
|
-
"@prosopo/contract": "^0.1.
|
|
28
|
-
"@prosopo/database": "^0.1.
|
|
29
|
-
"@prosopo/datasets": "^0.1.
|
|
30
|
-
"@prosopo/env": "^0.1.
|
|
31
|
-
"@prosopo/types": "^0.1.
|
|
32
|
-
"@prosopo/types-database": "^0.1.
|
|
33
|
-
"@prosopo/types-env": "^0.1.
|
|
26
|
+
"@prosopo/common": "^0.1.19",
|
|
27
|
+
"@prosopo/contract": "^0.1.19",
|
|
28
|
+
"@prosopo/database": "^0.1.19",
|
|
29
|
+
"@prosopo/datasets": "^0.1.19",
|
|
30
|
+
"@prosopo/env": "^0.1.19",
|
|
31
|
+
"@prosopo/types": "^0.1.19",
|
|
32
|
+
"@prosopo/types-database": "^0.1.19",
|
|
33
|
+
"@prosopo/types-env": "^0.1.19",
|
|
34
34
|
"cron": "^2.1.0",
|
|
35
35
|
"cron-parser": "^4.5.0",
|
|
36
36
|
"express": "^4.18.1",
|