@aztec/foundation 0.67.1 → 0.68.0
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/dest/abi/abi.d.ts +18 -18
- package/dest/blob/index.d.ts +41 -0
- package/dest/blob/index.d.ts.map +1 -0
- package/dest/blob/index.js +118 -0
- package/dest/config/env_var.d.ts +1 -1
- package/dest/config/env_var.d.ts.map +1 -1
- package/dest/index.d.ts +1 -0
- package/dest/index.d.ts.map +1 -1
- package/dest/index.js +2 -1
- package/dest/log/pino-logger.d.ts.map +1 -1
- package/dest/log/pino-logger.js +37 -2
- package/dest/noir/noir_package_config.d.ts +4 -4
- package/dest/promise/running-promise.d.ts +2 -1
- package/dest/promise/running-promise.d.ts.map +1 -1
- package/dest/promise/running-promise.js +10 -3
- package/dest/retry/index.js +2 -2
- package/dest/serialize/field_reader.d.ts +5 -0
- package/dest/serialize/field_reader.d.ts.map +1 -1
- package/dest/serialize/field_reader.js +8 -1
- package/dest/string/index.d.ts +1 -0
- package/dest/string/index.d.ts.map +1 -1
- package/dest/string/index.js +4 -1
- package/dest/testing/files/index.d.ts +18 -0
- package/dest/testing/files/index.d.ts.map +1 -0
- package/dest/testing/files/index.js +57 -0
- package/dest/testing/index.d.ts +1 -1
- package/dest/testing/index.d.ts.map +1 -1
- package/dest/testing/index.js +2 -2
- package/dest/testing/test_data.d.ts +0 -22
- package/dest/testing/test_data.d.ts.map +1 -1
- package/dest/testing/test_data.js +1 -67
- package/dest/timer/date.d.ts +13 -0
- package/dest/timer/date.d.ts.map +1 -0
- package/dest/timer/date.js +22 -0
- package/dest/timer/index.d.ts +1 -0
- package/dest/timer/index.d.ts.map +1 -1
- package/dest/timer/index.js +2 -1
- package/package.json +8 -6
- package/src/blob/index.ts +152 -0
- package/src/config/env_var.ts +2 -4
- package/src/index.ts +1 -0
- package/src/log/pino-logger.ts +40 -1
- package/src/promise/running-promise.ts +11 -2
- package/src/retry/index.ts +1 -1
- package/src/serialize/field_reader.ts +8 -0
- package/src/string/index.ts +4 -0
- package/src/testing/files/index.ts +63 -0
- package/src/testing/index.ts +1 -1
- package/src/testing/test_data.ts +0 -75
- package/src/timer/date.ts +24 -0
- package/src/timer/index.ts +1 -0
package/src/log/pino-logger.ts
CHANGED
|
@@ -69,7 +69,46 @@ const [logLevel, logFilters] = parseEnv(process.env.LOG_LEVEL, defaultLogLevel);
|
|
|
69
69
|
|
|
70
70
|
// Define custom logging levels for pino.
|
|
71
71
|
const customLevels = { verbose: 25 };
|
|
72
|
-
|
|
72
|
+
|
|
73
|
+
// inspired by https://github.com/pinojs/pino/issues/726#issuecomment-605814879
|
|
74
|
+
const levelToSeverityFormatter = (label: string, level: number): object => {
|
|
75
|
+
// Severity labels https://cloud.google.com/logging/docs/reference/v2/rest/v2/LogEntry#LogSeverity
|
|
76
|
+
let severity: string;
|
|
77
|
+
|
|
78
|
+
switch (label as pino.Level | keyof typeof customLevels) {
|
|
79
|
+
case 'trace':
|
|
80
|
+
case 'debug':
|
|
81
|
+
severity = 'DEBUG';
|
|
82
|
+
break;
|
|
83
|
+
case 'verbose':
|
|
84
|
+
case 'info':
|
|
85
|
+
severity = 'INFO';
|
|
86
|
+
break;
|
|
87
|
+
case 'warn':
|
|
88
|
+
severity = 'WARNING';
|
|
89
|
+
break;
|
|
90
|
+
case 'error':
|
|
91
|
+
severity = 'ERROR';
|
|
92
|
+
break;
|
|
93
|
+
case 'fatal':
|
|
94
|
+
severity = 'CRITICAL';
|
|
95
|
+
break;
|
|
96
|
+
default:
|
|
97
|
+
severity = 'DEFAULT';
|
|
98
|
+
break;
|
|
99
|
+
}
|
|
100
|
+
|
|
101
|
+
return { severity, level };
|
|
102
|
+
};
|
|
103
|
+
|
|
104
|
+
const pinoOpts: pino.LoggerOptions<keyof typeof customLevels> = {
|
|
105
|
+
customLevels,
|
|
106
|
+
useOnlyCustomLevels: false,
|
|
107
|
+
level: logLevel,
|
|
108
|
+
formatters: {
|
|
109
|
+
level: levelToSeverityFormatter,
|
|
110
|
+
},
|
|
111
|
+
};
|
|
73
112
|
|
|
74
113
|
export const levels = {
|
|
75
114
|
labels: { ...pino.levels.labels, ...Object.fromEntries(Object.entries(customLevels).map(e => e.reverse())) },
|
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { createLogger } from '../log/pino-logger.js';
|
|
1
2
|
import { InterruptibleSleep } from '../sleep/index.js';
|
|
2
3
|
import { type PromiseWithResolvers, promiseWithResolvers } from './utils.js';
|
|
3
4
|
|
|
@@ -12,7 +13,11 @@ export class RunningPromise {
|
|
|
12
13
|
private interruptibleSleep = new InterruptibleSleep();
|
|
13
14
|
private requested: PromiseWithResolvers<void> | undefined = undefined;
|
|
14
15
|
|
|
15
|
-
constructor(
|
|
16
|
+
constructor(
|
|
17
|
+
private fn: () => void | Promise<void>,
|
|
18
|
+
private logger = createLogger('running-promise'),
|
|
19
|
+
private pollingIntervalMS = 10000,
|
|
20
|
+
) {}
|
|
16
21
|
|
|
17
22
|
/**
|
|
18
23
|
* Starts the running promise.
|
|
@@ -23,7 +28,11 @@ export class RunningPromise {
|
|
|
23
28
|
const poll = async () => {
|
|
24
29
|
while (this.running) {
|
|
25
30
|
const hasRequested = this.requested !== undefined;
|
|
26
|
-
|
|
31
|
+
try {
|
|
32
|
+
await this.fn();
|
|
33
|
+
} catch (err) {
|
|
34
|
+
this.logger.error('Error in running promise', err);
|
|
35
|
+
}
|
|
27
36
|
|
|
28
37
|
// If an immediate run had been requested *before* the function started running, resolve the request.
|
|
29
38
|
if (hasRequested) {
|
package/src/retry/index.ts
CHANGED
|
@@ -64,7 +64,7 @@ export async function retry<Result>(
|
|
|
64
64
|
throw err;
|
|
65
65
|
}
|
|
66
66
|
log.verbose(`${name} failed. Will retry in ${s}s...`);
|
|
67
|
-
!failSilently && log.error(err);
|
|
67
|
+
!failSilently && log.error(`Error while retrying ${name}`, err);
|
|
68
68
|
await sleep(s * 1000);
|
|
69
69
|
continue;
|
|
70
70
|
}
|
|
@@ -140,4 +140,12 @@ export class FieldReader {
|
|
|
140
140
|
}): T {
|
|
141
141
|
return deserializer.fromFields(this);
|
|
142
142
|
}
|
|
143
|
+
|
|
144
|
+
/**
|
|
145
|
+
* Returns whether the reader has finished reading all fields.
|
|
146
|
+
* @returns A bool.
|
|
147
|
+
*/
|
|
148
|
+
public isFinished(): boolean {
|
|
149
|
+
return this.index === this.length;
|
|
150
|
+
}
|
|
143
151
|
}
|
package/src/string/index.ts
CHANGED
|
@@ -25,3 +25,7 @@ export function pluralize(str: string, count: number | bigint, plural?: string):
|
|
|
25
25
|
export function count(count: number | bigint, str: string, plural?: string): string {
|
|
26
26
|
return `${count} ${pluralize(str, count, plural)}`;
|
|
27
27
|
}
|
|
28
|
+
|
|
29
|
+
export function truncate(str: string, length: number = 64): string {
|
|
30
|
+
return str.length > length ? str.slice(0, length) + '...' : str;
|
|
31
|
+
}
|
|
@@ -0,0 +1,63 @@
|
|
|
1
|
+
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
+
import { dirname, join, resolve } from 'path';
|
|
3
|
+
|
|
4
|
+
import { createConsoleLogger } from '../../log/console.js';
|
|
5
|
+
import { fileURLToPath } from '../../url/index.js';
|
|
6
|
+
import { isGenerateTestDataEnabled } from '../test_data.js';
|
|
7
|
+
|
|
8
|
+
/** Writes the contents specified to the target file if test data generation is enabled. */
|
|
9
|
+
export function writeTestData(targetFileFromRepoRoot: string, contents: string | Buffer) {
|
|
10
|
+
if (!isGenerateTestDataEnabled()) {
|
|
11
|
+
return;
|
|
12
|
+
}
|
|
13
|
+
const targetFile = getPathToFile(targetFileFromRepoRoot);
|
|
14
|
+
const toWrite = typeof contents === 'string' ? contents : contents.toString('hex');
|
|
15
|
+
writeFileSync(targetFile, toWrite);
|
|
16
|
+
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
17
|
+
logger(`Wrote test data to ${targetFile}`);
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
|
|
22
|
+
* Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
|
|
23
|
+
* but running nargo fmt on it panics since the comment would be erased, so we roll with this for now.
|
|
24
|
+
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
|
|
25
|
+
*/
|
|
26
|
+
export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: string, value: string) {
|
|
27
|
+
if (!isGenerateTestDataEnabled()) {
|
|
28
|
+
return;
|
|
29
|
+
}
|
|
30
|
+
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
31
|
+
const targetFile = getPathToFile(targetFileFromRepoRoot);
|
|
32
|
+
const contents = readFileSync(targetFile, 'utf8').toString();
|
|
33
|
+
const regex = new RegExp(`let ${itemName} =[\\s\\S]*?;`, 'g');
|
|
34
|
+
if (!regex.exec(contents)) {
|
|
35
|
+
throw new Error(`Test data marker for ${itemName} not found in ${targetFile}`);
|
|
36
|
+
}
|
|
37
|
+
|
|
38
|
+
const updatedContents = contents.replaceAll(regex, `let ${itemName} = ${value};`);
|
|
39
|
+
writeFileSync(targetFile, updatedContents);
|
|
40
|
+
logger(`Updated test data in ${targetFile} for ${itemName} to ${value}`);
|
|
41
|
+
}
|
|
42
|
+
|
|
43
|
+
/**
|
|
44
|
+
* Updates the sample Prover.toml files in noir-projects/noir-protocol-circuits/crates/.
|
|
45
|
+
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 & generateProtocolCircuitTestData=true to be set
|
|
46
|
+
* To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn workspace @aztec/end-to-end test full.test'
|
|
47
|
+
*/
|
|
48
|
+
export function updateProtocolCircuitSampleInputs(circuitName: string, value: string) {
|
|
49
|
+
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
50
|
+
const targetFileFromRepoRoot = `noir-projects/noir-protocol-circuits/crates/${circuitName}/Prover.toml`;
|
|
51
|
+
const targetFile = getPathToFile(targetFileFromRepoRoot);
|
|
52
|
+
writeFileSync(targetFile, value);
|
|
53
|
+
logger(`Updated test data in ${targetFile} for ${circuitName}`);
|
|
54
|
+
}
|
|
55
|
+
|
|
56
|
+
function getPathToFile(targetFileFromRepoRoot: string) {
|
|
57
|
+
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../../');
|
|
58
|
+
if (!existsSync(join(repoRoot, 'CODEOWNERS'))) {
|
|
59
|
+
throw new Error(`Path to repo root is incorrect (got ${repoRoot})`);
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
return join(repoRoot, targetFileFromRepoRoot);
|
|
63
|
+
}
|
package/src/testing/index.ts
CHANGED
package/src/testing/test_data.ts
CHANGED
|
@@ -1,25 +1,10 @@
|
|
|
1
|
-
import { existsSync, readFileSync, writeFileSync } from 'fs';
|
|
2
|
-
import { dirname, join, resolve } from 'path';
|
|
3
|
-
|
|
4
|
-
import { createConsoleLogger } from '../log/console.js';
|
|
5
|
-
import { fileURLToPath } from '../url/index.js';
|
|
6
|
-
|
|
7
1
|
const testData: { [key: string]: unknown[] } = {};
|
|
8
|
-
let generateProtocolCircuitTestData = false;
|
|
9
2
|
|
|
10
3
|
/** Returns whether test data generation is enabled */
|
|
11
4
|
export function isGenerateTestDataEnabled() {
|
|
12
5
|
return ['1', 'true'].includes(process.env.AZTEC_GENERATE_TEST_DATA ?? '') && typeof expect !== 'undefined';
|
|
13
6
|
}
|
|
14
7
|
|
|
15
|
-
/**
|
|
16
|
-
* This is separate so Prover.tomls don't get edited everytime any test is run,
|
|
17
|
-
* Only full.test updates prover tomls, then switches this off.
|
|
18
|
-
*/
|
|
19
|
-
export function switchGenerateProtocolCircuitTestData() {
|
|
20
|
-
generateProtocolCircuitTestData = !generateProtocolCircuitTestData;
|
|
21
|
-
}
|
|
22
|
-
|
|
23
8
|
/** Pushes test data with the given name, only if test data generation is enabled. */
|
|
24
9
|
export function pushTestData<T>(itemName: string, data: T) {
|
|
25
10
|
if (!isGenerateTestDataEnabled()) {
|
|
@@ -49,63 +34,3 @@ export function getTestData(itemName: string): unknown[] {
|
|
|
49
34
|
const fullItemName = `${testName} ${itemName}`;
|
|
50
35
|
return testData[fullItemName];
|
|
51
36
|
}
|
|
52
|
-
|
|
53
|
-
/** Writes the contents specified to the target file if test data generation is enabled. */
|
|
54
|
-
export function writeTestData(targetFileFromRepoRoot: string, contents: string | Buffer) {
|
|
55
|
-
if (!isGenerateTestDataEnabled()) {
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
const targetFile = getPathToFile(targetFileFromRepoRoot);
|
|
59
|
-
const toWrite = typeof contents === 'string' ? contents : contents.toString('hex');
|
|
60
|
-
writeFileSync(targetFile, toWrite);
|
|
61
|
-
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
62
|
-
logger(`Wrote test data to ${targetFile}`);
|
|
63
|
-
}
|
|
64
|
-
|
|
65
|
-
/**
|
|
66
|
-
* Looks for a variable assignment in the target file and updates the value, only if test data generation is enabled.
|
|
67
|
-
* Note that a magic inline comment would be a cleaner approach, like `/* TEST-DATA-START *\/` and `/* TEST-DATA-END *\/`,
|
|
68
|
-
* but running nargo fmt on it panics since the comment would be erased, so we roll with this for now.
|
|
69
|
-
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 to be set
|
|
70
|
-
*/
|
|
71
|
-
export function updateInlineTestData(targetFileFromRepoRoot: string, itemName: string, value: string) {
|
|
72
|
-
if (!isGenerateTestDataEnabled()) {
|
|
73
|
-
return;
|
|
74
|
-
}
|
|
75
|
-
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
76
|
-
const targetFile = getPathToFile(targetFileFromRepoRoot);
|
|
77
|
-
const contents = readFileSync(targetFile, 'utf8').toString();
|
|
78
|
-
const regex = new RegExp(`let ${itemName} =[\\s\\S]*?;`, 'g');
|
|
79
|
-
if (!regex.exec(contents)) {
|
|
80
|
-
throw new Error(`Test data marker for ${itemName} not found in ${targetFile}`);
|
|
81
|
-
}
|
|
82
|
-
|
|
83
|
-
const updatedContents = contents.replaceAll(regex, `let ${itemName} = ${value};`);
|
|
84
|
-
writeFileSync(targetFile, updatedContents);
|
|
85
|
-
logger(`Updated test data in ${targetFile} for ${itemName} to ${value}`);
|
|
86
|
-
}
|
|
87
|
-
|
|
88
|
-
/**
|
|
89
|
-
* Updates the sample Prover.toml files in noir-projects/noir-protocol-circuits/crates/.
|
|
90
|
-
* @remarks Requires AZTEC_GENERATE_TEST_DATA=1 & generateProtocolCircuitTestData=true to be set
|
|
91
|
-
* To re-gen, run 'AZTEC_GENERATE_TEST_DATA=1 FAKE_PROOFS=1 yarn workspace @aztec/end-to-end test full.test'
|
|
92
|
-
*/
|
|
93
|
-
export function updateProtocolCircuitSampleInputs(circuitName: string, value: string) {
|
|
94
|
-
if (!isGenerateTestDataEnabled() || !generateProtocolCircuitTestData) {
|
|
95
|
-
return;
|
|
96
|
-
}
|
|
97
|
-
const logger = createConsoleLogger('aztec:testing:test_data');
|
|
98
|
-
const targetFileFromRepoRoot = `noir-projects/noir-protocol-circuits/crates/${circuitName}/Prover.toml`;
|
|
99
|
-
const targetFile = getPathToFile(targetFileFromRepoRoot);
|
|
100
|
-
writeFileSync(targetFile, value);
|
|
101
|
-
logger(`Updated test data in ${targetFile} for ${circuitName}`);
|
|
102
|
-
}
|
|
103
|
-
|
|
104
|
-
function getPathToFile(targetFileFromRepoRoot: string) {
|
|
105
|
-
const repoRoot = resolve(dirname(fileURLToPath(import.meta.url)), '../../../../');
|
|
106
|
-
if (!existsSync(join(repoRoot, 'CODEOWNERS'))) {
|
|
107
|
-
throw new Error(`Path to repo root is incorrect (got ${repoRoot})`);
|
|
108
|
-
}
|
|
109
|
-
|
|
110
|
-
return join(repoRoot, targetFileFromRepoRoot);
|
|
111
|
-
}
|
|
@@ -0,0 +1,24 @@
|
|
|
1
|
+
import { createLogger } from '../log/pino-logger.js';
|
|
2
|
+
|
|
3
|
+
/** Returns current datetime. */
|
|
4
|
+
export class DateProvider {
|
|
5
|
+
public now(): number {
|
|
6
|
+
return Date.now();
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Returns current datetime and allows to override it. */
|
|
11
|
+
export class TestDateProvider implements DateProvider {
|
|
12
|
+
private offset = 0;
|
|
13
|
+
|
|
14
|
+
constructor(private readonly logger = createLogger('foundation:test-date-provider')) {}
|
|
15
|
+
|
|
16
|
+
public now(): number {
|
|
17
|
+
return Date.now() + this.offset;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
public setTime(timeMs: number) {
|
|
21
|
+
this.offset = timeMs - Date.now();
|
|
22
|
+
this.logger.warn(`Time set to ${timeMs}`);
|
|
23
|
+
}
|
|
24
|
+
}
|
package/src/timer/index.ts
CHANGED