@prosopo/provider 5.3.8 → 5.3.10

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@prosopo/provider",
3
- "version": "5.3.8",
3
+ "version": "5.3.10",
4
4
  "author": "PROSOPO LIMITED <info@prosopo.io>",
5
5
  "license": "Apache-2.0",
6
6
  "type": "module",
@@ -23,32 +23,32 @@
23
23
  "dependencies": {
24
24
  "@noble/hashes": "1.8.0",
25
25
  "@polkadot/util": "13.5.7",
26
- "@prosopo/api": "4.0.13",
27
- "@prosopo/api-express-router": "3.1.70",
28
- "@prosopo/api-route": "2.6.55",
29
- "@prosopo/common": "3.1.50",
30
- "@prosopo/logger": "2.0.6",
31
- "@prosopo/database": "4.0.16",
32
- "@prosopo/datasets": "3.1.69",
33
- "@prosopo/env": "3.6.39",
34
- "@prosopo/ipinfo": "0.3.14",
35
- "@prosopo/keyring": "2.9.76",
36
- "@prosopo/load-balancer": "2.10.30",
37
- "@prosopo/puzzle-assets": "0.1.2",
38
- "@prosopo/redis-client": "1.0.32",
39
- "@prosopo/locale": "3.3.0",
26
+ "@prosopo/api": "4.0.14",
27
+ "@prosopo/api-express-router": "3.1.72",
28
+ "@prosopo/api-route": "2.6.56",
29
+ "@prosopo/common": "3.1.51",
30
+ "@prosopo/database": "4.0.18",
31
+ "@prosopo/datasets": "3.1.70",
32
+ "@prosopo/env": "3.6.41",
33
+ "@prosopo/ipinfo": "0.3.15",
34
+ "@prosopo/keyring": "2.9.77",
35
+ "@prosopo/load-balancer": "2.10.31",
36
+ "@prosopo/locale": "3.3.1",
37
+ "@prosopo/logger": "2.0.7",
40
38
  "@prosopo/native-ja4": "0.0.3",
41
39
  "@prosopo/native-merkle": "0.0.3",
42
- "@prosopo/types": "5.2.5",
43
- "@prosopo/types-database": "5.1.9",
44
- "@prosopo/types-env": "2.10.34",
45
- "@prosopo/user-access-policy": "3.12.24",
46
- "@prosopo/util": "3.3.6",
40
+ "@prosopo/puzzle-assets": "0.1.3",
41
+ "@prosopo/redis-client": "1.0.33",
42
+ "@prosopo/types": "5.2.6",
43
+ "@prosopo/types-database": "5.1.11",
44
+ "@prosopo/types-env": "2.10.36",
45
+ "@prosopo/user-access-policy": "3.12.25",
46
+ "@prosopo/util": "3.3.7",
47
47
  "@prosopo/util-crypto": "13.5.30",
48
48
  "cron": "3.1.7",
49
- "express": "4.21.2",
49
+ "express": "4.22.2",
50
50
  "express-rate-limit": "7.4.0",
51
- "geolib": "3.3.4",
51
+ "geolib": "3.3.14",
52
52
  "i18next": "24.1.0",
53
53
  "ip-address": "10.5.0",
54
54
  "mongoose": "8.24.1",
@@ -57,9 +57,9 @@
57
57
  "zod": "3.23.8"
58
58
  },
59
59
  "devDependencies": {
60
- "@prosopo/config": "3.3.11",
60
+ "@prosopo/config": "3.3.12",
61
61
  "@types/node": "22.5.5",
62
- "@types/pg": "8.16.0",
62
+ "@types/pg": "8.23.1",
63
63
  "@types/uuid": "10.0.0",
64
64
  "@vitest/coverage-v8": "4.1.10",
65
65
  "concurrently": "9.0.1",
@@ -1,38 +0,0 @@
1
- const require_util = require("../util.cjs");
2
- const require_tasks = require("../tasks/tasks.cjs");
3
- let _prosopo_types = require("@prosopo/types");
4
- let _prosopo_env = require("@prosopo/env");
5
- let cron = require("cron");
6
- //#region src/schedulers/setClientEntropy.ts
7
- /**
8
- * Sets up a cron job to periodically set client entropy
9
- * @param pair
10
- * @param cronSchedule
11
- * @param config
12
- */
13
- async function setClientEntropy(pair, cronSchedule, config) {
14
- const env = new _prosopo_env.ProviderEnvironment(config, pair);
15
- await env.isReady();
16
- const tasks = new require_tasks.Tasks(env);
17
- new cron.CronJob(cronSchedule, async () => {
18
- const taskRunning = await require_util.checkIfTaskIsRunning(_prosopo_types.ScheduledTaskNames.SetClientEntropy, env.getDb());
19
- env.logger.info(() => ({
20
- msg: `${_prosopo_types.ScheduledTaskNames.SetClientEntropy} task running: ${taskRunning}`,
21
- data: { taskRunning }
22
- }));
23
- if (!taskRunning) {
24
- env.logger.info(() => ({
25
- msg: `${_prosopo_types.ScheduledTaskNames.SetClientEntropy} task....`,
26
- data: {}
27
- }));
28
- await tasks.clientTaskManager.calculateClientEntropy().catch((err) => {
29
- env.logger.error(() => ({
30
- err,
31
- msg: "Error setting client entropy"
32
- }));
33
- });
34
- }
35
- }).start();
36
- }
37
- //#endregion
38
- exports.setClientEntropy = setClientEntropy;
@@ -1,4 +0,0 @@
1
- import type { KeyringPair } from "@prosopo/types";
2
- import { type ProsopoConfigOutput } from "@prosopo/types";
3
- export declare function setClientEntropy(pair: KeyringPair, cronSchedule: string, config: ProsopoConfigOutput): Promise<void>;
4
- //# sourceMappingURL=setClientEntropy.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setClientEntropy.d.ts","sourceRoot":"","sources":["../../src/schedulers/setClientEntropy.ts"],"names":[],"mappings":"AAeA,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,gBAAgB,CAAC;AAClD,OAAO,EAAE,KAAK,mBAAmB,EAAsB,MAAM,gBAAgB,CAAC;AAW9E,wBAAsB,gBAAgB,CACrC,IAAI,EAAE,WAAW,EACjB,YAAY,EAAE,MAAM,EACpB,MAAM,EAAE,mBAAmB,iBA+B3B"}
@@ -1,38 +0,0 @@
1
- import { checkIfTaskIsRunning } from "../util.js";
2
- import { Tasks } from "../tasks/tasks.js";
3
- import { ScheduledTaskNames } from "@prosopo/types";
4
- import { ProviderEnvironment } from "@prosopo/env";
5
- import { CronJob } from "cron";
6
- //#region src/schedulers/setClientEntropy.ts
7
- /**
8
- * Sets up a cron job to periodically set client entropy
9
- * @param pair
10
- * @param cronSchedule
11
- * @param config
12
- */
13
- async function setClientEntropy(pair, cronSchedule, config) {
14
- const env = new ProviderEnvironment(config, pair);
15
- await env.isReady();
16
- const tasks = new Tasks(env);
17
- new CronJob(cronSchedule, async () => {
18
- const taskRunning = await checkIfTaskIsRunning(ScheduledTaskNames.SetClientEntropy, env.getDb());
19
- env.logger.info(() => ({
20
- msg: `${ScheduledTaskNames.SetClientEntropy} task running: ${taskRunning}`,
21
- data: { taskRunning }
22
- }));
23
- if (!taskRunning) {
24
- env.logger.info(() => ({
25
- msg: `${ScheduledTaskNames.SetClientEntropy} task....`,
26
- data: {}
27
- }));
28
- await tasks.clientTaskManager.calculateClientEntropy().catch((err) => {
29
- env.logger.error(() => ({
30
- err,
31
- msg: "Error setting client entropy"
32
- }));
33
- });
34
- }
35
- }).start();
36
- }
37
- //#endregion
38
- export { setClientEntropy };
@@ -1 +0,0 @@
1
- {"version":3,"file":"setClientEntropy.js","sourceRoot":"","sources":["../../src/schedulers/setClientEntropy.ts"],"names":[],"mappings":"AAcA,OAAO,EAAE,mBAAmB,EAAE,MAAM,cAAc,CAAC;AAEnD,OAAO,EAA4B,kBAAkB,EAAE,MAAM,gBAAgB,CAAC;AAC9E,OAAO,EAAE,OAAO,EAAE,MAAM,MAAM,CAAC;AAC/B,OAAO,EAAE,KAAK,EAAE,MAAM,mBAAmB,CAAC;AAC1C,OAAO,EAAE,oBAAoB,EAAE,MAAM,YAAY,CAAC;AAQlD,MAAM,CAAC,KAAK,UAAU,gBAAgB,CACrC,IAAiB,EACjB,YAAoB,EACpB,MAA2B;IAE3B,MAAM,GAAG,GAAG,IAAI,mBAAmB,CAAC,MAAM,EAAE,IAAI,CAAC,CAAC;IAClD,MAAM,GAAG,CAAC,OAAO,EAAE,CAAC;IAEpB,MAAM,KAAK,GAAG,IAAI,KAAK,CAAC,GAAG,CAAC,CAAC;IAE7B,MAAM,GAAG,GAAG,IAAI,OAAO,CAAC,YAAY,EAAE,KAAK,IAAI,EAAE;QAChD,MAAM,WAAW,GAAG,MAAM,oBAAoB,CAC7C,kBAAkB,CAAC,gBAAgB,EACnC,GAAG,CAAC,KAAK,EAAE,CACX,CAAC;QACF,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;YACtB,GAAG,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,kBAAkB,WAAW,EAAE;YAC1E,IAAI,EAAE,EAAE,WAAW,EAAE;SACrB,CAAC,CAAC,CAAC;QACJ,IAAI,CAAC,WAAW,EAAE,CAAC;YAClB,GAAG,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAC;gBACtB,GAAG,EAAE,GAAG,kBAAkB,CAAC,gBAAgB,WAAW;gBACtD,IAAI,EAAE,EAAE;aACR,CAAC,CAAC,CAAC;YACJ,MAAM,KAAK,CAAC,iBAAiB,CAAC,sBAAsB,EAAE,CAAC,KAAK,CAAC,CAAC,GAAG,EAAE,EAAE;gBACpE,GAAG,CAAC,MAAM,CAAC,KAAK,CAAC,GAAG,EAAE,CAAC,CAAC;oBACvB,GAAG;oBACH,GAAG,EAAE,8BAA8B;iBACnC,CAAC,CAAC,CAAC;YACL,CAAC,CAAC,CAAC;QACJ,CAAC;IACF,CAAC,CAAC,CAAC;IAEH,GAAG,CAAC,KAAK,EAAE,CAAC;AACb,CAAC"}
@@ -1,2 +0,0 @@
1
- export {};
2
- //# sourceMappingURL=setClientEntropy.unit.test.d.ts.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setClientEntropy.unit.test.d.ts","sourceRoot":"","sources":["../../../../src/tests/unit/schedulers/setClientEntropy.unit.test.ts"],"names":[],"mappings":""}
@@ -1,120 +0,0 @@
1
- import { ProviderEnvironment } from "@prosopo/env";
2
- import { ScheduledTaskNames } from "@prosopo/types";
3
- import { CronJob } from "cron";
4
- import { beforeEach, describe, expect, it, vi } from "vitest";
5
- import { setClientEntropy } from "../../../schedulers/setClientEntropy.js";
6
- import { Tasks } from "../../../tasks/tasks.js";
7
- import { checkIfTaskIsRunning } from "../../../util.js";
8
- vi.mock("@prosopo/env", async () => {
9
- const { getLogger } = await import("@prosopo/logger");
10
- const loggerOuter = getLogger("info", "test:set-client-entropy");
11
- const mockLogger = {
12
- debug: vi.fn().mockImplementation(loggerOuter.debug.bind(loggerOuter)),
13
- log: vi.fn().mockImplementation(loggerOuter.log.bind(loggerOuter)),
14
- info: vi.fn().mockImplementation(loggerOuter.info.bind(loggerOuter)),
15
- error: vi.fn().mockImplementation(loggerOuter.error.bind(loggerOuter)),
16
- trace: vi.fn().mockImplementation(loggerOuter.trace.bind(loggerOuter)),
17
- fatal: vi.fn().mockImplementation(loggerOuter.fatal.bind(loggerOuter)),
18
- warn: vi.fn().mockImplementation(loggerOuter.warn.bind(loggerOuter)),
19
- };
20
- return {
21
- ProviderEnvironment: vi.fn().mockImplementation(function () {
22
- return {
23
- isReady: vi.fn().mockResolvedValue(true),
24
- logger: mockLogger,
25
- getDb: vi.fn().mockReturnValue({
26
- getLastScheduledTaskStatus: vi.fn().mockResolvedValue(undefined),
27
- }),
28
- };
29
- }),
30
- };
31
- });
32
- vi.mock("../../../tasks/tasks.js", () => ({
33
- Tasks: vi.fn(),
34
- }));
35
- vi.mock("../../../util.js", () => ({
36
- checkIfTaskIsRunning: vi.fn(),
37
- }));
38
- vi.mock("cron", () => ({
39
- CronJob: vi.fn(),
40
- }));
41
- describe("setClientEntropy", () => {
42
- let mockPair;
43
- let mockConfig;
44
- let mockTasks;
45
- let mockCronJob;
46
- beforeEach(() => {
47
- vi.clearAllMocks();
48
- mockPair = {};
49
- mockConfig = {};
50
- mockTasks = {
51
- clientTaskManager: {
52
- calculateClientEntropy: vi.fn().mockResolvedValue(undefined),
53
- },
54
- };
55
- mockCronJob = {
56
- start: vi.fn(),
57
- };
58
- vi.mocked(Tasks).mockImplementation(function () {
59
- return mockTasks;
60
- });
61
- vi.mocked(checkIfTaskIsRunning).mockResolvedValue(false);
62
- vi.mocked(CronJob).mockImplementation(function (cronSchedule, onTick) {
63
- return {
64
- start: mockCronJob.start,
65
- cronSchedule,
66
- onTick,
67
- };
68
- });
69
- });
70
- it("creates ProviderEnvironment and waits for readiness", async () => {
71
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
72
- expect(ProviderEnvironment).toHaveBeenCalledWith(mockConfig, mockPair);
73
- const envInstance = vi.mocked(ProviderEnvironment).mock.results[0]?.value;
74
- expect(envInstance?.isReady).toHaveBeenCalled();
75
- });
76
- it("creates Tasks instance", async () => {
77
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
78
- expect(Tasks).toHaveBeenCalled();
79
- });
80
- it("creates CronJob with correct schedule", async () => {
81
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
82
- expect(CronJob).toHaveBeenCalledWith("0 0 * * *", expect.any(Function));
83
- });
84
- it("starts the cron job", async () => {
85
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
86
- expect(mockCronJob.start).toHaveBeenCalled();
87
- });
88
- it("checks if task is running before executing", async () => {
89
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
90
- const cronJobCall = vi.mocked(CronJob).mock.calls[0];
91
- const onTick = cronJobCall?.[1];
92
- await onTick();
93
- expect(checkIfTaskIsRunning).toHaveBeenCalledWith(ScheduledTaskNames.SetClientEntropy, expect.anything());
94
- });
95
- it("executes calculateClientEntropy when task is not running", async () => {
96
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
97
- const cronJobCall = vi.mocked(CronJob).mock.calls[0];
98
- const onTick = cronJobCall?.[1];
99
- await onTick();
100
- expect(mockTasks.clientTaskManager.calculateClientEntropy).toHaveBeenCalled();
101
- });
102
- it("does not execute calculateClientEntropy when task is already running", async () => {
103
- vi.mocked(checkIfTaskIsRunning).mockResolvedValue(true);
104
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
105
- const cronJobCall = vi.mocked(CronJob).mock.calls[0];
106
- const onTick = cronJobCall?.[1];
107
- await onTick();
108
- expect(mockTasks.clientTaskManager.calculateClientEntropy).not.toHaveBeenCalled();
109
- });
110
- it("handles errors in calculateClientEntropy", async () => {
111
- const error = new Error("Test error");
112
- mockTasks.clientTaskManager.calculateClientEntropy.mockRejectedValue(error);
113
- await setClientEntropy(mockPair, "0 0 * * *", mockConfig);
114
- const cronJobCall = vi.mocked(CronJob).mock.calls[0];
115
- const onTick = cronJobCall?.[1];
116
- await onTick();
117
- expect(mockTasks.clientTaskManager.calculateClientEntropy).toHaveBeenCalled();
118
- });
119
- });
120
- //# sourceMappingURL=setClientEntropy.unit.test.js.map
@@ -1 +0,0 @@
1
- {"version":3,"file":"setClientEntropy.unit.test.js","sourceRoot":"","sources":["../../../../src/tests/unit/schedulers/setClientEntropy.unit.test.ts"],"names":[],"mappings":"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"}