prool 0.1.1 → 0.2.1
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/Instance.d.ts +1 -1
- package/dist/Instance.d.ts.map +1 -1
- package/dist/Instance.js +1 -1
- package/dist/Instance.js.map +1 -1
- package/dist/instances/tempo.d.ts +0 -44
- package/dist/instances/tempo.d.ts.map +1 -1
- package/dist/instances/tempo.js +2 -82
- package/dist/instances/tempo.js.map +1 -1
- package/dist/testcontainers/Instance.d.ts +48 -0
- package/dist/testcontainers/Instance.d.ts.map +1 -0
- package/dist/testcontainers/Instance.js +83 -0
- package/dist/testcontainers/Instance.js.map +1 -0
- package/dist/testcontainers/index.d.ts +2 -0
- package/dist/testcontainers/index.d.ts.map +1 -0
- package/dist/testcontainers/index.js +2 -0
- package/dist/testcontainers/index.js.map +1 -0
- package/package.json +6 -1
- package/src/Instance.ts +1 -1
- package/src/instances/tempo.ts +3 -117
- package/src/testcontainers/Instance.test.ts +84 -0
- package/src/testcontainers/Instance.ts +119 -0
- package/src/testcontainers/index.ts +1 -0
package/dist/Instance.d.ts
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'eventemitter3';
|
|
2
2
|
export { alto } from './instances/alto.js';
|
|
3
3
|
export { anvil } from './instances/anvil.js';
|
|
4
|
-
export { tempo
|
|
4
|
+
export { tempo } from './instances/tempo.js';
|
|
5
5
|
type EventTypes = {
|
|
6
6
|
exit: [code: number | null, signal: NodeJS.Signals | null];
|
|
7
7
|
listening: [];
|
package/dist/Instance.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instance.d.ts","sourceRoot":"","sources":["../src/Instance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Instance.d.ts","sourceRoot":"","sources":["../src/Instance.ts"],"names":[],"mappings":"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"}
|
package/dist/Instance.js
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
import { EventEmitter } from 'eventemitter3';
|
|
2
2
|
export { alto } from './instances/alto.js';
|
|
3
3
|
export { anvil } from './instances/anvil.js';
|
|
4
|
-
export { tempo
|
|
4
|
+
export { tempo } from './instances/tempo.js';
|
|
5
5
|
/**
|
|
6
6
|
* Creates an instance definition.
|
|
7
7
|
*
|
package/dist/Instance.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"Instance.js","sourceRoot":"","sources":["../src/Instance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,
|
|
1
|
+
{"version":3,"file":"Instance.js","sourceRoot":"","sources":["../src/Instance.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AAE5C,OAAO,EAAE,IAAI,EAAE,MAAM,qBAAqB,CAAA;AAC1C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAC5C,OAAO,EAAE,KAAK,EAAE,MAAM,sBAAsB,CAAA;AAqF5C;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,UAAU,MAAM,CAIpB,EAA0C;IAE1C,OAAO,CAAC,GAAG,CAAC,mBAAmB,EAAE,QAAQ,CAAC,EAAE,EAAE;QAC5C,SAAS,MAAM,CAAC,mBAAsD,EAAE;YACtE,MAAM,UAAU,GAAG,mBAAiC,CAAA;YACpD,MAAM,OAAO,GAAG,QAAQ,IAAI,mBAAmB,IAAI,EAAE,CAAA;YAErD,MAAM,QAAQ,GAAG,EAAE,CAAC,UAAU,CAAC,CAAA;YAC/B,MAAM,EAAE,SAAS,EAAE,IAAI,EAAE,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,IAAI,EAAE,GAAG;gBACnD,GAAG,QAAQ;gBACX,GAAG,gBAAgB;gBACnB,IAAI,EAAE,gBAAgB,CAAC,IAAI,IAAI,QAAQ,CAAC,IAAI;aAC7C,CAAA;YACD,MAAM,EAAE,aAAa,GAAG,EAAE,EAAE,OAAO,EAAE,GAAG,OAAO,CAAA;YAE/C,IAAI,eAAe,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAA;YACnD,IAAI,aAAa,GAAG,OAAO,CAAC,aAAa,EAAc,CAAA;YACvD,IAAI,YAAY,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAA;YAEhD,MAAM,OAAO,GAAG,IAAI,YAAY,EAAc,CAAA;YAE9C,IAAI,QAAQ,GAAa,EAAE,CAAA;YAC3B,IAAI,MAAM,GAAuB,MAAM,CAAA;YACvC,IAAI,UAAU,GAAG,KAAK,CAAA;YAEtB,SAAS,MAAM;gBACb,MAAM,GAAG,SAAS,CAAA;YACpB,CAAC;YACD,SAAS,WAAW;gBAClB,MAAM,GAAG,SAAS,CAAA;YACpB,CAAC;YACD,SAAS,SAAS,CAAC,OAAe;gBAChC,QAAQ,CAAC,IAAI,CAAC,OAAO,CAAC,CAAA;gBACtB,IAAI,QAAQ,CAAC,MAAM,GAAG,aAAa;oBAAE,QAAQ,CAAC,KAAK,EAAE,CAAA;YACvD,CAAC;YAED,OAAO;gBACL,SAAS,EAAE,SAAsB;gBACjC,QAAQ,EAAE;oBACR,KAAK;wBACH,QAAQ,GAAG,EAAE,CAAA;oBACf,CAAC;oBACD,GAAG;wBACD,OAAO,QAAQ,CAAA;oBACjB,CAAC;iBACF;gBACD,IAAI;gBACJ,IAAI;gBACJ,IAAI;gBACJ,IAAI,MAAM;oBACR,IAAI,UAAU;wBAAE,OAAO,YAAY,CAAA;oBACnC,OAAO,MAAM,CAAA;gBACf,CAAC;gBACD,KAAK,CAAC,KAAK;oBACT,IAAI,MAAM,KAAK,UAAU;wBAAE,OAAO,aAAa,CAAC,OAAO,CAAA;oBACvD,IAAI,MAAM,KAAK,MAAM,IAAI,MAAM,KAAK,SAAS;wBAC3C,MAAM,IAAI,KAAK,CACb,aAAa,IAAI,iDAAiD,MAAM,EAAE,CAC3E,CAAA;oBAEH,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;wBAChC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;4BAC5B,YAAY,CAAC,KAAK,CAAC,CAAA;4BACnB,aAAa,CAAC,MAAM,CAClB,IAAI,KAAK,CAAC,aAAa,IAAI,4BAA4B,CAAC,CACzD,CAAA;wBACH,CAAC,EAAE,OAAO,CAAC,CAAA;oBACb,CAAC;oBAED,OAAO,CAAC,EAAE,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;oBAChC,OAAO,CAAC,EAAE,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;oBACpC,OAAO,CAAC,EAAE,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;oBAE1B,MAAM,GAAG,UAAU,CAAA;oBACnB,KAAK,CACH;wBACE,IAAI;qBACL,EACD;wBACE,OAAO;wBACP,MAAM,EAAE,IAAI,CAAC,MAAM;qBACpB,CACF;yBACE,IAAI,CAAC,GAAG,EAAE;wBACT,MAAM,GAAG,SAAS,CAAA;wBAElB,YAAY,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAA;wBAC5C,aAAa,CAAC,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAA;oBAC7C,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBACf,MAAM,GAAG,MAAM,CAAA;wBACf,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;wBACrB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;wBACjC,aAAa,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBAC7B,CAAC,CAAC,CAAA;oBAEJ,OAAO,aAAa,CAAC,OAAO,CAAA;gBAC9B,CAAC;gBACD,KAAK,CAAC,IAAI;oBACR,IAAI,MAAM,KAAK,UAAU;wBAAE,OAAO,YAAY,CAAC,OAAO,CAAA;oBACtD,IAAI,MAAM,KAAK,UAAU;wBACvB,MAAM,IAAI,KAAK,CAAC,aAAa,IAAI,gBAAgB,CAAC,CAAA;oBAEpD,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;wBAChC,MAAM,KAAK,GAAG,UAAU,CAAC,GAAG,EAAE;4BAC5B,YAAY,CAAC,KAAK,CAAC,CAAA;4BACnB,YAAY,CAAC,MAAM,CACjB,IAAI,KAAK,CAAC,aAAa,IAAI,2BAA2B,CAAC,CACxD,CAAA;wBACH,CAAC,EAAE,OAAO,CAAC,CAAA;oBACb,CAAC;oBAED,MAAM,GAAG,UAAU,CAAA;oBACnB,IAAI,CAAC;wBACH,OAAO;wBACP,MAAM,EAAE,IAAI,CAAC,MAAM;qBACpB,CAAC;yBACC,IAAI,CAAC,CAAC,GAAG,IAAI,EAAE,EAAE;wBAChB,MAAM,GAAG,SAAS,CAAA;wBAClB,IAAI,CAAC,QAAQ,CAAC,KAAK,EAAE,CAAA;wBAErB,OAAO,CAAC,GAAG,CAAC,SAAS,EAAE,SAAS,CAAC,CAAA;wBACjC,OAAO,CAAC,GAAG,CAAC,WAAW,EAAE,WAAW,CAAC,CAAA;wBACrC,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAA;wBAE3B,aAAa,GAAG,OAAO,CAAC,aAAa,EAAc,CAAA;wBACnD,YAAY,CAAC,OAAO,CAAC,GAAG,IAAI,CAAC,CAAA;oBAC/B,CAAC,CAAC;yBACD,KAAK,CAAC,CAAC,KAAK,EAAE,EAAE;wBACf,MAAM,GAAG,SAAS,CAAA;wBAClB,YAAY,CAAC,MAAM,CAAC,KAAK,CAAC,CAAA;oBAC5B,CAAC,CAAC,CAAA;oBAEJ,OAAO,YAAY,CAAC,OAAO,CAAA;gBAC7B,CAAC;gBACD,KAAK,CAAC,OAAO;oBACX,IAAI,UAAU;wBAAE,OAAO,eAAe,CAAC,OAAO,CAAA;oBAE9C,UAAU,GAAG,IAAI,CAAA;oBAEjB,IAAI,CAAC,IAAI,EAAE;yBACR,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;yBACnC,IAAI,CAAC,GAAG,EAAE,CAAC,eAAe,CAAC,OAAO,EAAE,CAAC;yBACrC,KAAK,CAAC,eAAe,CAAC,MAAM,CAAC;yBAC7B,OAAO,CAAC,GAAG,EAAE;wBACZ,eAAe,GAAG,OAAO,CAAC,aAAa,EAAQ,CAAA;wBAC/C,UAAU,GAAG,KAAK,CAAA;oBACpB,CAAC,CAAC,CAAA;oBAEJ,OAAO,eAAe,CAAC,OAAO,CAAA;gBAChC,CAAC;gBAED,WAAW,EAAE,OAAO,CAAC,WAAW,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC9C,GAAG,EAAE,OAAO,CAAC,GAAG,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC9B,EAAE,EAAE,OAAO,CAAC,EAAE,CAAC,IAAI,CAAC,OAAO,CAAC;gBAC5B,IAAI,EAAE,OAAO,CAAC,IAAI,CAAC,IAAI,CAAC,OAAO,CAAC;gBAChC,cAAc,EAAE,OAAO,CAAC,cAAc,CAAC,IAAI,CAAC,OAAO,CAAC;gBACpD,kBAAkB,EAAE,OAAO,CAAC,kBAAkB,CAAC,IAAI,CAAC,OAAO,CAAC;aAC7D,CAAA;QACH,CAAC;QAED,OAAO,MAAM,CAAC,MAAM,CAAC,MAAM,EAAE,EAAE,EAAE,MAAM,EAAE,CAAC,CAAA;IAC5C,CAAC,CAAA;AACH,CAAC"}
|
|
@@ -142,48 +142,4 @@ export declare namespace tempo {
|
|
|
142
142
|
port?: number | undefined;
|
|
143
143
|
} & Record<string, unknown>;
|
|
144
144
|
}
|
|
145
|
-
/**
|
|
146
|
-
* Defines a Tempo instance.
|
|
147
|
-
*
|
|
148
|
-
* @example
|
|
149
|
-
* ```ts
|
|
150
|
-
* const instance = Instance.tempoDocker({ port: 8545 })
|
|
151
|
-
* await instance.start()
|
|
152
|
-
* // ...
|
|
153
|
-
* await instance.stop()
|
|
154
|
-
* ```
|
|
155
|
-
*/
|
|
156
|
-
export declare const tempoDocker: Instance.define.ReturnType<{
|
|
157
|
-
args: {
|
|
158
|
-
[x: string]: unknown;
|
|
159
|
-
/**
|
|
160
|
-
* Host the server will listen on.
|
|
161
|
-
*/
|
|
162
|
-
host?: string | undefined;
|
|
163
|
-
/**
|
|
164
|
-
* Port the server will listen on.
|
|
165
|
-
*/
|
|
166
|
-
port?: number | undefined;
|
|
167
|
-
};
|
|
168
|
-
}, Instance.tempoDocker.Parameters | undefined>;
|
|
169
|
-
export declare namespace tempoDocker {
|
|
170
|
-
type Parameters = Omit<tempo.Parameters, 'binary'> & {
|
|
171
|
-
/**
|
|
172
|
-
* Name of the container.
|
|
173
|
-
*/
|
|
174
|
-
containerName?: string | undefined;
|
|
175
|
-
/**
|
|
176
|
-
* Docker image to use.
|
|
177
|
-
*/
|
|
178
|
-
image?: string | undefined;
|
|
179
|
-
/**
|
|
180
|
-
* Host the server will listen on.
|
|
181
|
-
*/
|
|
182
|
-
host?: string | undefined;
|
|
183
|
-
/**
|
|
184
|
-
* Port the server will listen on.
|
|
185
|
-
*/
|
|
186
|
-
port?: number | undefined;
|
|
187
|
-
};
|
|
188
|
-
}
|
|
189
145
|
//# sourceMappingURL=tempo.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"tempo.d.ts","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAI1C,wBAAgB,OAAO,CAAC,UAAU,EAAE,KAAK,CAAC,UAAU,GAAG,MAAM,EAAE,CAoD9D;AAED;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;;QAgEd;;WAEG;oBACS,MAAM,GAAG,SAAS;QAC9B;;WAEG;+BACoB,MAAM,GAAG,SAAS;QACzC;;WAEG;iBACM,MAAM,GAAG,SAAS;QAC3B;;;;;;;;WAQG;gBACK,MAAM,GAAG,SAAS;QAC1B;;WAEG;kBACO,MAAM,GAAG,SAAS;QAC5B;;WAEG;iBAEC;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS;QAcb;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;;WAGG;mBACQ,MAAM,GAAG,SAAS;QAC7B;;WAEG;eACI,MAAM,GAAG,SAAS;;;yCA9E3B,CAAA;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,UAAU,GAAG;QACvB;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;WAEG;QACH,SAAS,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC9B;;WAEG;QACH,oBAAoB,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzC;;WAEG;QACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC3B;;;;;;;;WAQG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;WAEG;QACH,OAAO,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC5B;;WAEG;QACH,MAAM,CAAC,EACH;YACE;;eAEG;YACH,SAAS,CAAC,EAAE,MAAM,EAAE,GAAG,SAAS,CAAA;YAChC;;eAEG;YACH,MAAM,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;YAC3B;;eAEG;YACH,UAAU,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;SAChC,GACD,SAAS,CAAA;QACb;;;WAGG;QACH,GAAG,CAAC,EACA,OAAO,GACP,OAAO,GACP,MAAM,GACN,MAAM,GACN,OAAO,GACP,CAAC,MAAM,GAAG,EAAE,CAAC,GACb,OAAO,GACP,SAAS,CAAA;QACb;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;;WAGG;QACH,QAAQ,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC7B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAA;CAC5B"}
|
package/dist/instances/tempo.js
CHANGED
|
@@ -1,6 +1,5 @@
|
|
|
1
1
|
import * as os from 'node:os';
|
|
2
2
|
import * as path from 'node:path';
|
|
3
|
-
import { GenericContainer, Wait, } from 'testcontainers';
|
|
4
3
|
import * as Instance from '../Instance.js';
|
|
5
4
|
import { deepAssign, toArgs } from '../internal/utils.js';
|
|
6
5
|
import { execa } from '../processes/execa.js';
|
|
@@ -94,13 +93,13 @@ export const tempo = Instance.define((parameters) => {
|
|
|
94
93
|
},
|
|
95
94
|
}) `${[binary, ...command({ ...args, port })]}`, {
|
|
96
95
|
...options,
|
|
97
|
-
// Resolve when the process is listening via "
|
|
96
|
+
// Resolve when the process is listening via "Received block from consensus engine" message.
|
|
98
97
|
resolver({ process, reject, resolve }) {
|
|
99
98
|
process.stdout.on('data', (data) => {
|
|
100
99
|
const message = data.toString();
|
|
101
100
|
if (log)
|
|
102
101
|
console.log(message);
|
|
103
|
-
if (message.includes('
|
|
102
|
+
if (message.includes('Received block from consensus engine'))
|
|
104
103
|
resolve();
|
|
105
104
|
if (message.includes('shutting down'))
|
|
106
105
|
reject('shutting down');
|
|
@@ -118,83 +117,4 @@ export const tempo = Instance.define((parameters) => {
|
|
|
118
117
|
},
|
|
119
118
|
};
|
|
120
119
|
});
|
|
121
|
-
/**
|
|
122
|
-
* Defines a Tempo instance.
|
|
123
|
-
*
|
|
124
|
-
* @example
|
|
125
|
-
* ```ts
|
|
126
|
-
* const instance = Instance.tempoDocker({ port: 8545 })
|
|
127
|
-
* await instance.start()
|
|
128
|
-
* // ...
|
|
129
|
-
* await instance.stop()
|
|
130
|
-
* ```
|
|
131
|
-
*/
|
|
132
|
-
export const tempoDocker = Instance.define((parameters) => {
|
|
133
|
-
const { containerName = `tempo.${crypto.randomUUID()}`, image = 'ghcr.io/tempoxyz/tempo:latest', log: log_, ...args } = parameters || {};
|
|
134
|
-
const log = (() => {
|
|
135
|
-
try {
|
|
136
|
-
return JSON.parse(log_);
|
|
137
|
-
}
|
|
138
|
-
catch {
|
|
139
|
-
return log_;
|
|
140
|
-
}
|
|
141
|
-
})();
|
|
142
|
-
const RUST_LOG = log && typeof log !== 'boolean' ? log : '';
|
|
143
|
-
const name = 'tempo';
|
|
144
|
-
let container;
|
|
145
|
-
return {
|
|
146
|
-
_internal: {
|
|
147
|
-
args,
|
|
148
|
-
},
|
|
149
|
-
host: args.host ?? 'localhost',
|
|
150
|
-
name,
|
|
151
|
-
port: args.port ?? 8545,
|
|
152
|
-
async start({ port = args.port }, { emitter }) {
|
|
153
|
-
const promise = Promise.withResolvers();
|
|
154
|
-
const c = new GenericContainer(image)
|
|
155
|
-
.withPlatform('linux/x86_64')
|
|
156
|
-
.withNetworkMode('host')
|
|
157
|
-
.withExtraHosts([
|
|
158
|
-
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
159
|
-
{ host: 'localhost', ipAddress: 'host-gateway' },
|
|
160
|
-
])
|
|
161
|
-
.withName(containerName)
|
|
162
|
-
.withEnvironment({ RUST_LOG })
|
|
163
|
-
.withCommand(command({ ...args, port }))
|
|
164
|
-
.withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/))
|
|
165
|
-
.withLogConsumer((stream) => {
|
|
166
|
-
stream.on('data', (data) => {
|
|
167
|
-
const message = data.toString();
|
|
168
|
-
emitter.emit('message', message);
|
|
169
|
-
emitter.emit('stdout', message);
|
|
170
|
-
if (log)
|
|
171
|
-
console.log(message);
|
|
172
|
-
if (message.includes('shutting down'))
|
|
173
|
-
promise.reject(new Error(`Failed to start: ${message}`));
|
|
174
|
-
});
|
|
175
|
-
stream.on('error', (error) => {
|
|
176
|
-
if (log)
|
|
177
|
-
console.error(error.message);
|
|
178
|
-
emitter.emit('message', error.message);
|
|
179
|
-
emitter.emit('stderr', error.message);
|
|
180
|
-
promise.reject(new Error(`Failed to start: ${error.message}`));
|
|
181
|
-
});
|
|
182
|
-
})
|
|
183
|
-
.withStartupTimeout(10_000);
|
|
184
|
-
c.start()
|
|
185
|
-
.then((c) => {
|
|
186
|
-
container = c;
|
|
187
|
-
promise.resolve();
|
|
188
|
-
})
|
|
189
|
-
.catch(promise.reject);
|
|
190
|
-
return promise.promise;
|
|
191
|
-
},
|
|
192
|
-
async stop() {
|
|
193
|
-
if (!container)
|
|
194
|
-
return;
|
|
195
|
-
await container.stop();
|
|
196
|
-
container = undefined;
|
|
197
|
-
},
|
|
198
|
-
};
|
|
199
|
-
});
|
|
200
120
|
//# sourceMappingURL=tempo.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"tempo.js","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,
|
|
1
|
+
{"version":3,"file":"tempo.js","sourceRoot":"","sources":["../../src/instances/tempo.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,MAAM,SAAS,CAAA;AAC7B,OAAO,KAAK,IAAI,MAAM,WAAW,CAAA;AACjC,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,sBAAsB,CAAA;AACzD,OAAO,EAAE,KAAK,EAAE,MAAM,uBAAuB,CAAA;AAE7C,MAAM,UAAU,OAAO,CAAC,UAA4B;IAClD,MAAM,EAAE,oBAAoB,EAAE,SAAS,EAAE,QAAQ,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAChE,UAAU,CAAA;IAEZ,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC,MAAM,EAAE,EAAE,QAAQ,EAAE,SAAS,IAAI,EAAE,CAAC,CAAA;IACjE,MAAM,iBAAiB,GAAG;QACxB,OAAO,EAAE;YACP,IAAI,EAAE,IAAK,GAAG,EAAE;SACjB;QACD,OAAO;QACP,GAAG,EAAE;YACH,IAAI;YACJ;gBACE,SAAS,EAAE,SAAS,IAAI,MAAM;gBAC9B,GAAG,CAAC,oBAAoB,CAAC,CAAC,CAAC,EAAE,oBAAoB,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;gBACzD,GAAG,CAAC,QAAQ,CAAC,CAAC,CAAC,EAAE,QAAQ,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;aAClC;SACF;QACD,MAAM,EAAE;YACN,sBAAsB,EAAE,IAAI;YAC5B,eAAe,EAAE,IAAI;SACtB;QACD,MAAM,EAAE;YACN,OAAO,EAAE;gBACP,4CAA4C;gBAC5C,4CAA4C;gBAC5C,4CAA4C;gBAC5C,4CAA4C;aAC7C;YACD,MAAM,EAAE,eAAe;YACvB,OAAO,EAAE,IAAI;YACb,UAAU,EACR,oEAAoE;SACvE;QACD,IAAI,EAAE;YACJ,IAAI,EAAE,SAAS;YACf,GAAG,EAAE,KAAK;YACV,UAAU,EAAE,GAAG;YACf,IAAI,EAAE,IAAK;SACZ;QACD,IAAI,EAAE,IAAK,GAAG,EAAE;QAChB,EAAE,EAAE;YACF,IAAI,EAAE,IAAK,GAAG,EAAE;SACjB;KACF,CAAA;IAED,OAAO;QACL,MAAM;QACN,GAAG,MAAM,CAAC,UAAU,CAAC,iBAAiB,EAAE,IAAI,CAAC,EAAE;YAC7C,cAAc,EAAE,IAAI;SACrB,CAAC;KACH,CAAA;AACH,CAAC;AAED;;;;;;;;;;GAUG;AACH,MAAM,CAAC,MAAM,KAAK,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC,UAA6B,EAAE,EAAE;IACrE,MAAM,EAAE,MAAM,GAAG,OAAO,EAAE,GAAG,EAAE,IAAI,EAAE,GAAG,IAAI,EAAE,GAAG,UAAU,IAAI,EAAE,CAAA;IAEjE,MAAM,GAAG,GAAG,CAAC,GAAG,EAAE;QAChB,IAAI,CAAC;YACH,OAAO,IAAI,CAAC,KAAK,CAAC,IAAc,CAAC,CAAA;QACnC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,IAAI,CAAA;QACb,CAAC;IACH,CAAC,CAAC,EAAE,CAAA;IACJ,MAAM,QAAQ,GAAG,GAAG,IAAI,OAAO,GAAG,KAAK,SAAS,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAA;IAE3D,MAAM,IAAI,GAAG,OAAO,CAAA;IACpB,MAAM,OAAO,GAAG,KAAK,CAAC,EAAE,IAAI,EAAE,CAAC,CAAA;IAE/B,OAAO;QACL,SAAS,EAAE;YACT,IAAI;YACJ,IAAI,OAAO;gBACT,OAAO,OAAO,CAAC,SAAS,CAAC,OAAO,CAAA;YAClC,CAAC;SACF;QACD,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,WAAW;QAC9B,IAAI;QACJ,IAAI,EAAE,IAAI,CAAC,IAAI,IAAI,IAAI;QACvB,KAAK,CAAC,KAAK,CAAC,EAAE,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,EAAE,OAAO;YACvC,OAAO,MAAM,OAAO,CAAC,KAAK,CACxB,CAAC,CAAC,EAAE,EAAE,CACJ,CAAC,CAAC;gBACA,GAAG,EAAE;oBACH,QAAQ;iBACT;aACF,CAAC,CAAA,GAAG,CAAC,MAAM,EAAE,GAAG,OAAO,CAAC,EAAE,GAAG,IAAI,EAAE,IAAI,EAAE,CAAC,CAAC,EAAE,EAChD;gBACE,GAAG,OAAO;gBACV,4FAA4F;gBAC5F,QAAQ,CAAC,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE;oBACnC,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;wBAC/B,IAAI,GAAG;4BAAE,OAAO,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;wBAC7B,IAAI,OAAO,CAAC,QAAQ,CAAC,sCAAsC,CAAC;4BAC1D,OAAO,EAAE,CAAA;wBACX,IAAI,OAAO,CAAC,QAAQ,CAAC,eAAe,CAAC;4BAAE,MAAM,CAAC,eAAe,CAAC,CAAA;oBAChE,CAAC,CAAC,CAAA;oBACF,OAAO,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,IAAI,EAAE,EAAE;wBACjC,MAAM,OAAO,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAA;wBAC/B,IAAI,GAAG;4BAAE,OAAO,CAAC,KAAK,CAAC,OAAO,CAAC,CAAA;oBACjC,CAAC,CAAC,CAAA;gBACJ,CAAC;aACF,CACF,CAAA;QACH,CAAC;QACD,KAAK,CAAC,IAAI;YACR,MAAM,OAAO,CAAC,IAAI,EAAE,CAAA;QACtB,CAAC;KACF,CAAA;AACH,CAAC,CAAC,CAAA"}
|
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
import * as Instance from '../Instance.js';
|
|
2
|
+
import { type tempo as core_tempo } from '../instances/tempo.js';
|
|
3
|
+
export type { Instance, InstanceOptions } from '../Instance.js';
|
|
4
|
+
/**
|
|
5
|
+
* Defines a Tempo instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const instance = Instance.tempo({ port: 8545 })
|
|
10
|
+
* await instance.start()
|
|
11
|
+
* // ...
|
|
12
|
+
* await instance.stop()
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export declare const tempo: Instance.define.ReturnType<{
|
|
16
|
+
args: {
|
|
17
|
+
[x: string]: unknown;
|
|
18
|
+
/**
|
|
19
|
+
* Host the server will listen on.
|
|
20
|
+
*/
|
|
21
|
+
host?: string | undefined;
|
|
22
|
+
/**
|
|
23
|
+
* Port the server will listen on.
|
|
24
|
+
*/
|
|
25
|
+
port?: number | undefined;
|
|
26
|
+
};
|
|
27
|
+
}, tempo.Parameters | undefined>;
|
|
28
|
+
export declare namespace tempo {
|
|
29
|
+
type Parameters = Omit<core_tempo.Parameters, 'binary'> & {
|
|
30
|
+
/**
|
|
31
|
+
* Name of the container.
|
|
32
|
+
*/
|
|
33
|
+
containerName?: string | undefined;
|
|
34
|
+
/**
|
|
35
|
+
* Docker image to use.
|
|
36
|
+
*/
|
|
37
|
+
image?: string | undefined;
|
|
38
|
+
/**
|
|
39
|
+
* Host the server will listen on.
|
|
40
|
+
*/
|
|
41
|
+
host?: string | undefined;
|
|
42
|
+
/**
|
|
43
|
+
* Port the server will listen on.
|
|
44
|
+
*/
|
|
45
|
+
port?: number | undefined;
|
|
46
|
+
};
|
|
47
|
+
}
|
|
48
|
+
//# sourceMappingURL=Instance.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Instance.d.ts","sourceRoot":"","sources":["../../src/testcontainers/Instance.ts"],"names":[],"mappings":"AAKA,OAAO,KAAK,QAAQ,MAAM,gBAAgB,CAAA;AAC1C,OAAO,EAAW,KAAK,KAAK,IAAI,UAAU,EAAE,MAAM,uBAAuB,CAAA;AAEzE,YAAY,EAAE,QAAQ,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAA;AAE/D;;;;;;;;;;GAUG;AACH,eAAO,MAAM,KAAK;;;QAwFd;;WAEG;eACI,MAAM,GAAG,SAAS;QACzB;;WAEG;eACI,MAAM,GAAG,SAAS;;gCAnB3B,CAAA;AAEF,MAAM,CAAC,OAAO,WAAW,KAAK,CAAC;IAC7B,KAAY,UAAU,GAAG,IAAI,CAAC,UAAU,CAAC,UAAU,EAAE,QAAQ,CAAC,GAAG;QAC/D;;WAEG;QACH,aAAa,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAClC;;WAEG;QACH,KAAK,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QAC1B;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;QACzB;;WAEG;QACH,IAAI,CAAC,EAAE,MAAM,GAAG,SAAS,CAAA;KAC1B,CAAA;CACF"}
|
|
@@ -0,0 +1,83 @@
|
|
|
1
|
+
import { GenericContainer, Wait, } from 'testcontainers';
|
|
2
|
+
import * as Instance from '../Instance.js';
|
|
3
|
+
import { command } from '../instances/tempo.js';
|
|
4
|
+
/**
|
|
5
|
+
* Defines a Tempo instance.
|
|
6
|
+
*
|
|
7
|
+
* @example
|
|
8
|
+
* ```ts
|
|
9
|
+
* const instance = Instance.tempo({ port: 8545 })
|
|
10
|
+
* await instance.start()
|
|
11
|
+
* // ...
|
|
12
|
+
* await instance.stop()
|
|
13
|
+
* ```
|
|
14
|
+
*/
|
|
15
|
+
export const tempo = Instance.define((parameters) => {
|
|
16
|
+
const { containerName = `tempo.${crypto.randomUUID()}`, image = 'ghcr.io/tempoxyz/tempo:latest', log: log_, ...args } = parameters || {};
|
|
17
|
+
const log = (() => {
|
|
18
|
+
try {
|
|
19
|
+
return JSON.parse(log_);
|
|
20
|
+
}
|
|
21
|
+
catch {
|
|
22
|
+
return log_;
|
|
23
|
+
}
|
|
24
|
+
})();
|
|
25
|
+
const RUST_LOG = log && typeof log !== 'boolean' ? log : '';
|
|
26
|
+
const name = 'tempo';
|
|
27
|
+
let container;
|
|
28
|
+
return {
|
|
29
|
+
_internal: {
|
|
30
|
+
args,
|
|
31
|
+
},
|
|
32
|
+
host: args.host ?? 'localhost',
|
|
33
|
+
name,
|
|
34
|
+
port: args.port ?? 8545,
|
|
35
|
+
async start({ port = args.port }, { emitter }) {
|
|
36
|
+
const promise = Promise.withResolvers();
|
|
37
|
+
const c = new GenericContainer(image)
|
|
38
|
+
.withPlatform('linux/x86_64')
|
|
39
|
+
.withNetworkMode('host')
|
|
40
|
+
.withExtraHosts([
|
|
41
|
+
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
42
|
+
{ host: 'localhost', ipAddress: 'host-gateway' },
|
|
43
|
+
])
|
|
44
|
+
.withName(containerName)
|
|
45
|
+
.withEnvironment({ RUST_LOG })
|
|
46
|
+
.withCommand(command({ ...args, port }))
|
|
47
|
+
.withWaitStrategy(Wait.forLogMessage(/Received block from consensus engine/))
|
|
48
|
+
.withLogConsumer((stream) => {
|
|
49
|
+
stream.on('data', (data) => {
|
|
50
|
+
const message = data.toString();
|
|
51
|
+
emitter.emit('message', message);
|
|
52
|
+
emitter.emit('stdout', message);
|
|
53
|
+
if (log)
|
|
54
|
+
console.log(message);
|
|
55
|
+
if (message.includes('shutting down'))
|
|
56
|
+
promise.reject(new Error(`Failed to start: ${message}`));
|
|
57
|
+
});
|
|
58
|
+
stream.on('error', (error) => {
|
|
59
|
+
if (log)
|
|
60
|
+
console.error(error.message);
|
|
61
|
+
emitter.emit('message', error.message);
|
|
62
|
+
emitter.emit('stderr', error.message);
|
|
63
|
+
promise.reject(new Error(`Failed to start: ${error.message}`));
|
|
64
|
+
});
|
|
65
|
+
})
|
|
66
|
+
.withStartupTimeout(10_000);
|
|
67
|
+
c.start()
|
|
68
|
+
.then((c) => {
|
|
69
|
+
container = c;
|
|
70
|
+
promise.resolve();
|
|
71
|
+
})
|
|
72
|
+
.catch(promise.reject);
|
|
73
|
+
return promise.promise;
|
|
74
|
+
},
|
|
75
|
+
async stop() {
|
|
76
|
+
if (!container)
|
|
77
|
+
return;
|
|
78
|
+
await container.stop();
|
|
79
|
+
container = undefined;
|
|
80
|
+
},
|
|
81
|
+
};
|
|
82
|
+
});
|
|
83
|
+
//# sourceMappingURL=Instance.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Instance.js","sourceRoot":"","sources":["../../src/testcontainers/Instance.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/testcontainers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/testcontainers/index.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,QAAQ,MAAM,eAAe,CAAA"}
|
package/package.json
CHANGED
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "prool",
|
|
3
3
|
"description": "HTTP testing instances for Ethereum",
|
|
4
|
-
"version": "0.
|
|
4
|
+
"version": "0.2.1",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"sideEffects": false,
|
|
7
7
|
"files": [
|
|
@@ -16,6 +16,11 @@
|
|
|
16
16
|
"src": "./src/index.ts",
|
|
17
17
|
"types": "./dist/index.d.ts",
|
|
18
18
|
"default": "./dist/index.js"
|
|
19
|
+
},
|
|
20
|
+
"./testcontainers": {
|
|
21
|
+
"src": "./src/testcontainers/index.ts",
|
|
22
|
+
"types": "./dist/testcontainers/index.d.ts",
|
|
23
|
+
"default": "./dist/testcontainers/index.js"
|
|
19
24
|
}
|
|
20
25
|
},
|
|
21
26
|
"dependencies": {
|
package/src/Instance.ts
CHANGED
|
@@ -2,7 +2,7 @@ import { EventEmitter } from 'eventemitter3'
|
|
|
2
2
|
|
|
3
3
|
export { alto } from './instances/alto.js'
|
|
4
4
|
export { anvil } from './instances/anvil.js'
|
|
5
|
-
export { tempo
|
|
5
|
+
export { tempo } from './instances/tempo.js'
|
|
6
6
|
|
|
7
7
|
type EventTypes = {
|
|
8
8
|
exit: [code: number | null, signal: NodeJS.Signals | null]
|
package/src/instances/tempo.ts
CHANGED
|
@@ -1,10 +1,5 @@
|
|
|
1
1
|
import * as os from 'node:os'
|
|
2
2
|
import * as path from 'node:path'
|
|
3
|
-
import {
|
|
4
|
-
GenericContainer,
|
|
5
|
-
type StartedTestContainer,
|
|
6
|
-
Wait,
|
|
7
|
-
} from 'testcontainers'
|
|
8
3
|
import * as Instance from '../Instance.js'
|
|
9
4
|
import { deepAssign, toArgs } from '../internal/utils.js'
|
|
10
5
|
import { execa } from '../processes/execa.js'
|
|
@@ -109,12 +104,13 @@ export const tempo = Instance.define((parameters?: tempo.Parameters) => {
|
|
|
109
104
|
})`${[binary, ...command({ ...args, port })]}`,
|
|
110
105
|
{
|
|
111
106
|
...options,
|
|
112
|
-
// Resolve when the process is listening via "
|
|
107
|
+
// Resolve when the process is listening via "Received block from consensus engine" message.
|
|
113
108
|
resolver({ process, reject, resolve }) {
|
|
114
109
|
process.stdout.on('data', (data) => {
|
|
115
110
|
const message = data.toString()
|
|
116
111
|
if (log) console.log(message)
|
|
117
|
-
if (message.includes('
|
|
112
|
+
if (message.includes('Received block from consensus engine'))
|
|
113
|
+
resolve()
|
|
118
114
|
if (message.includes('shutting down')) reject('shutting down')
|
|
119
115
|
})
|
|
120
116
|
process.stderr.on('data', (data) => {
|
|
@@ -210,113 +206,3 @@ export declare namespace tempo {
|
|
|
210
206
|
port?: number | undefined
|
|
211
207
|
} & Record<string, unknown>
|
|
212
208
|
}
|
|
213
|
-
|
|
214
|
-
/**
|
|
215
|
-
* Defines a Tempo instance.
|
|
216
|
-
*
|
|
217
|
-
* @example
|
|
218
|
-
* ```ts
|
|
219
|
-
* const instance = Instance.tempoDocker({ port: 8545 })
|
|
220
|
-
* await instance.start()
|
|
221
|
-
* // ...
|
|
222
|
-
* await instance.stop()
|
|
223
|
-
* ```
|
|
224
|
-
*/
|
|
225
|
-
export const tempoDocker = Instance.define(
|
|
226
|
-
(parameters?: tempoDocker.Parameters) => {
|
|
227
|
-
const {
|
|
228
|
-
containerName = `tempo.${crypto.randomUUID()}`,
|
|
229
|
-
image = 'ghcr.io/tempoxyz/tempo:latest',
|
|
230
|
-
log: log_,
|
|
231
|
-
...args
|
|
232
|
-
} = parameters || {}
|
|
233
|
-
|
|
234
|
-
const log = (() => {
|
|
235
|
-
try {
|
|
236
|
-
return JSON.parse(log_ as string)
|
|
237
|
-
} catch {
|
|
238
|
-
return log_
|
|
239
|
-
}
|
|
240
|
-
})()
|
|
241
|
-
const RUST_LOG = log && typeof log !== 'boolean' ? log : ''
|
|
242
|
-
|
|
243
|
-
const name = 'tempo'
|
|
244
|
-
let container: StartedTestContainer | undefined
|
|
245
|
-
|
|
246
|
-
return {
|
|
247
|
-
_internal: {
|
|
248
|
-
args,
|
|
249
|
-
},
|
|
250
|
-
host: args.host ?? 'localhost',
|
|
251
|
-
name,
|
|
252
|
-
port: args.port ?? 8545,
|
|
253
|
-
async start({ port = args.port }, { emitter }) {
|
|
254
|
-
const promise = Promise.withResolvers<void>()
|
|
255
|
-
|
|
256
|
-
const c = new GenericContainer(image)
|
|
257
|
-
.withPlatform('linux/x86_64')
|
|
258
|
-
.withNetworkMode('host')
|
|
259
|
-
.withExtraHosts([
|
|
260
|
-
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
261
|
-
{ host: 'localhost', ipAddress: 'host-gateway' },
|
|
262
|
-
])
|
|
263
|
-
.withName(containerName)
|
|
264
|
-
.withEnvironment({ RUST_LOG })
|
|
265
|
-
.withCommand(command({ ...args, port }))
|
|
266
|
-
.withWaitStrategy(Wait.forLogMessage(/RPC HTTP server started/))
|
|
267
|
-
.withLogConsumer((stream) => {
|
|
268
|
-
stream.on('data', (data) => {
|
|
269
|
-
const message = data.toString()
|
|
270
|
-
emitter.emit('message', message)
|
|
271
|
-
emitter.emit('stdout', message)
|
|
272
|
-
if (log) console.log(message)
|
|
273
|
-
if (message.includes('shutting down'))
|
|
274
|
-
promise.reject(new Error(`Failed to start: ${message}`))
|
|
275
|
-
})
|
|
276
|
-
stream.on('error', (error) => {
|
|
277
|
-
if (log) console.error(error.message)
|
|
278
|
-
emitter.emit('message', error.message)
|
|
279
|
-
emitter.emit('stderr', error.message)
|
|
280
|
-
promise.reject(new Error(`Failed to start: ${error.message}`))
|
|
281
|
-
})
|
|
282
|
-
})
|
|
283
|
-
.withStartupTimeout(10_000)
|
|
284
|
-
|
|
285
|
-
c.start()
|
|
286
|
-
.then((c) => {
|
|
287
|
-
container = c
|
|
288
|
-
promise.resolve()
|
|
289
|
-
})
|
|
290
|
-
.catch(promise.reject)
|
|
291
|
-
|
|
292
|
-
return promise.promise
|
|
293
|
-
},
|
|
294
|
-
async stop() {
|
|
295
|
-
if (!container) return
|
|
296
|
-
await container.stop()
|
|
297
|
-
container = undefined
|
|
298
|
-
},
|
|
299
|
-
}
|
|
300
|
-
},
|
|
301
|
-
)
|
|
302
|
-
|
|
303
|
-
export declare namespace tempoDocker {
|
|
304
|
-
export type Parameters = Omit<tempo.Parameters, 'binary'> & {
|
|
305
|
-
/**
|
|
306
|
-
* Name of the container.
|
|
307
|
-
*/
|
|
308
|
-
containerName?: string | undefined
|
|
309
|
-
/**
|
|
310
|
-
* Docker image to use.
|
|
311
|
-
*/
|
|
312
|
-
image?: string | undefined
|
|
313
|
-
/**
|
|
314
|
-
* Host the server will listen on.
|
|
315
|
-
*/
|
|
316
|
-
host?: string | undefined
|
|
317
|
-
/**
|
|
318
|
-
* Port the server will listen on.
|
|
319
|
-
*/
|
|
320
|
-
port?: number | undefined
|
|
321
|
-
}
|
|
322
|
-
}
|
|
@@ -0,0 +1,84 @@
|
|
|
1
|
+
import getPort from 'get-port'
|
|
2
|
+
import { Instance } from 'prool/testcontainers'
|
|
3
|
+
import { afterEach, expect, test } from 'vitest'
|
|
4
|
+
|
|
5
|
+
const instances: Instance.Instance[] = []
|
|
6
|
+
|
|
7
|
+
const port = await getPort()
|
|
8
|
+
|
|
9
|
+
const defineInstance = (parameters: Instance.tempo.Parameters = {}) => {
|
|
10
|
+
const instance = Instance.tempo({ port, ...parameters })
|
|
11
|
+
instances.push(instance)
|
|
12
|
+
return instance
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
afterEach(async () => {
|
|
16
|
+
for (const instance of instances) await instance.stop().catch(() => {})
|
|
17
|
+
})
|
|
18
|
+
|
|
19
|
+
test('default', async () => {
|
|
20
|
+
const messages: string[] = []
|
|
21
|
+
const stdouts: string[] = []
|
|
22
|
+
|
|
23
|
+
const instance = defineInstance()
|
|
24
|
+
|
|
25
|
+
instance.on('message', (m) => messages.push(m))
|
|
26
|
+
instance.on('stdout', (m) => stdouts.push(m))
|
|
27
|
+
|
|
28
|
+
expect(instance.messages.get()).toMatchInlineSnapshot('[]')
|
|
29
|
+
|
|
30
|
+
await instance.start()
|
|
31
|
+
expect(instance.status).toEqual('started')
|
|
32
|
+
|
|
33
|
+
expect(messages.join('')).toBeDefined()
|
|
34
|
+
expect(stdouts.join('')).toBeDefined()
|
|
35
|
+
expect(instance.messages.get().join('')).toBeDefined()
|
|
36
|
+
|
|
37
|
+
await instance.stop()
|
|
38
|
+
expect(instance.status).toEqual('stopped')
|
|
39
|
+
|
|
40
|
+
expect(messages.join('')).toBeDefined()
|
|
41
|
+
expect(stdouts.join('')).toBeDefined()
|
|
42
|
+
expect(instance.messages.get()).toMatchInlineSnapshot('[]')
|
|
43
|
+
})
|
|
44
|
+
|
|
45
|
+
test('behavior: instance errored (duplicate ports)', async () => {
|
|
46
|
+
const instance_1 = defineInstance({ port: 8546 })
|
|
47
|
+
const instance_2 = defineInstance({ port: 8546 })
|
|
48
|
+
|
|
49
|
+
await instance_1.start()
|
|
50
|
+
await expect(() => instance_2.start()).rejects.toThrowError('Failed to start')
|
|
51
|
+
})
|
|
52
|
+
|
|
53
|
+
test('behavior: start and stop multiple times', async () => {
|
|
54
|
+
const instance = defineInstance()
|
|
55
|
+
|
|
56
|
+
await instance.start()
|
|
57
|
+
await instance.stop()
|
|
58
|
+
await instance.start()
|
|
59
|
+
await instance.stop()
|
|
60
|
+
await instance.start()
|
|
61
|
+
await instance.stop()
|
|
62
|
+
await instance.start()
|
|
63
|
+
await instance.stop()
|
|
64
|
+
})
|
|
65
|
+
|
|
66
|
+
test('behavior: can subscribe to stdout', async () => {
|
|
67
|
+
const messages: string[] = []
|
|
68
|
+
const instance = defineInstance()
|
|
69
|
+
instance.on('stdout', (message) => messages.push(message))
|
|
70
|
+
|
|
71
|
+
await instance.start()
|
|
72
|
+
expect(messages.length).toBeGreaterThanOrEqual(1)
|
|
73
|
+
})
|
|
74
|
+
|
|
75
|
+
test('behavior: can subscribe to stderr', async () => {
|
|
76
|
+
const messages: string[] = []
|
|
77
|
+
|
|
78
|
+
const instance_1 = defineInstance({ port: 8546 })
|
|
79
|
+
const instance_2 = defineInstance({ port: 8546 })
|
|
80
|
+
|
|
81
|
+
await instance_1.start()
|
|
82
|
+
instance_2.on('stderr', (message) => messages.push(message))
|
|
83
|
+
await expect(instance_2.start()).rejects.toThrow('Failed to start')
|
|
84
|
+
})
|
|
@@ -0,0 +1,119 @@
|
|
|
1
|
+
import {
|
|
2
|
+
GenericContainer,
|
|
3
|
+
type StartedTestContainer,
|
|
4
|
+
Wait,
|
|
5
|
+
} from 'testcontainers'
|
|
6
|
+
import * as Instance from '../Instance.js'
|
|
7
|
+
import { command, type tempo as core_tempo } from '../instances/tempo.js'
|
|
8
|
+
|
|
9
|
+
export type { Instance, InstanceOptions } from '../Instance.js'
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Defines a Tempo instance.
|
|
13
|
+
*
|
|
14
|
+
* @example
|
|
15
|
+
* ```ts
|
|
16
|
+
* const instance = Instance.tempo({ port: 8545 })
|
|
17
|
+
* await instance.start()
|
|
18
|
+
* // ...
|
|
19
|
+
* await instance.stop()
|
|
20
|
+
* ```
|
|
21
|
+
*/
|
|
22
|
+
export const tempo = Instance.define((parameters?: tempo.Parameters) => {
|
|
23
|
+
const {
|
|
24
|
+
containerName = `tempo.${crypto.randomUUID()}`,
|
|
25
|
+
image = 'ghcr.io/tempoxyz/tempo:latest',
|
|
26
|
+
log: log_,
|
|
27
|
+
...args
|
|
28
|
+
} = parameters || {}
|
|
29
|
+
|
|
30
|
+
const log = (() => {
|
|
31
|
+
try {
|
|
32
|
+
return JSON.parse(log_ as string)
|
|
33
|
+
} catch {
|
|
34
|
+
return log_
|
|
35
|
+
}
|
|
36
|
+
})()
|
|
37
|
+
const RUST_LOG = log && typeof log !== 'boolean' ? log : ''
|
|
38
|
+
|
|
39
|
+
const name = 'tempo'
|
|
40
|
+
let container: StartedTestContainer | undefined
|
|
41
|
+
|
|
42
|
+
return {
|
|
43
|
+
_internal: {
|
|
44
|
+
args,
|
|
45
|
+
},
|
|
46
|
+
host: args.host ?? 'localhost',
|
|
47
|
+
name,
|
|
48
|
+
port: args.port ?? 8545,
|
|
49
|
+
async start({ port = args.port }, { emitter }) {
|
|
50
|
+
const promise = Promise.withResolvers<void>()
|
|
51
|
+
|
|
52
|
+
const c = new GenericContainer(image)
|
|
53
|
+
.withPlatform('linux/x86_64')
|
|
54
|
+
.withNetworkMode('host')
|
|
55
|
+
.withExtraHosts([
|
|
56
|
+
{ host: 'host.docker.internal', ipAddress: 'host-gateway' },
|
|
57
|
+
{ host: 'localhost', ipAddress: 'host-gateway' },
|
|
58
|
+
])
|
|
59
|
+
.withName(containerName)
|
|
60
|
+
.withEnvironment({ RUST_LOG })
|
|
61
|
+
.withCommand(command({ ...args, port }))
|
|
62
|
+
.withWaitStrategy(
|
|
63
|
+
Wait.forLogMessage(/Received block from consensus engine/),
|
|
64
|
+
)
|
|
65
|
+
.withLogConsumer((stream) => {
|
|
66
|
+
stream.on('data', (data) => {
|
|
67
|
+
const message = data.toString()
|
|
68
|
+
emitter.emit('message', message)
|
|
69
|
+
emitter.emit('stdout', message)
|
|
70
|
+
if (log) console.log(message)
|
|
71
|
+
if (message.includes('shutting down'))
|
|
72
|
+
promise.reject(new Error(`Failed to start: ${message}`))
|
|
73
|
+
})
|
|
74
|
+
stream.on('error', (error) => {
|
|
75
|
+
if (log) console.error(error.message)
|
|
76
|
+
emitter.emit('message', error.message)
|
|
77
|
+
emitter.emit('stderr', error.message)
|
|
78
|
+
promise.reject(new Error(`Failed to start: ${error.message}`))
|
|
79
|
+
})
|
|
80
|
+
})
|
|
81
|
+
.withStartupTimeout(10_000)
|
|
82
|
+
|
|
83
|
+
c.start()
|
|
84
|
+
.then((c) => {
|
|
85
|
+
container = c
|
|
86
|
+
promise.resolve()
|
|
87
|
+
})
|
|
88
|
+
.catch(promise.reject)
|
|
89
|
+
|
|
90
|
+
return promise.promise
|
|
91
|
+
},
|
|
92
|
+
async stop() {
|
|
93
|
+
if (!container) return
|
|
94
|
+
await container.stop()
|
|
95
|
+
container = undefined
|
|
96
|
+
},
|
|
97
|
+
}
|
|
98
|
+
})
|
|
99
|
+
|
|
100
|
+
export declare namespace tempo {
|
|
101
|
+
export type Parameters = Omit<core_tempo.Parameters, 'binary'> & {
|
|
102
|
+
/**
|
|
103
|
+
* Name of the container.
|
|
104
|
+
*/
|
|
105
|
+
containerName?: string | undefined
|
|
106
|
+
/**
|
|
107
|
+
* Docker image to use.
|
|
108
|
+
*/
|
|
109
|
+
image?: string | undefined
|
|
110
|
+
/**
|
|
111
|
+
* Host the server will listen on.
|
|
112
|
+
*/
|
|
113
|
+
host?: string | undefined
|
|
114
|
+
/**
|
|
115
|
+
* Port the server will listen on.
|
|
116
|
+
*/
|
|
117
|
+
port?: number | undefined
|
|
118
|
+
}
|
|
119
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export * as Instance from './Instance.js'
|