@no-witness-labs/midday-sdk 0.1.2 → 0.2.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/dist/devnet/Cluster.d.ts +282 -0
- package/dist/devnet/Cluster.d.ts.map +1 -0
- package/dist/devnet/Cluster.js +487 -0
- package/dist/devnet/Cluster.js.map +1 -0
- package/dist/devnet/Config.d.ts +119 -0
- package/dist/devnet/Config.d.ts.map +1 -0
- package/dist/devnet/Config.js +75 -0
- package/dist/devnet/Config.js.map +1 -0
- package/dist/devnet/Container.d.ts +180 -0
- package/dist/devnet/Container.d.ts.map +1 -0
- package/dist/devnet/Container.js +390 -0
- package/dist/devnet/Container.js.map +1 -0
- package/dist/devnet/Health.d.ts +129 -0
- package/dist/devnet/Health.d.ts.map +1 -0
- package/dist/devnet/Health.js +304 -0
- package/dist/devnet/Health.js.map +1 -0
- package/dist/devnet/Images.d.ts +43 -0
- package/dist/devnet/Images.d.ts.map +1 -0
- package/dist/devnet/Images.js +96 -0
- package/dist/devnet/Images.js.map +1 -0
- package/dist/devnet/errors.d.ts +65 -0
- package/dist/devnet/errors.d.ts.map +1 -0
- package/dist/devnet/errors.js +40 -0
- package/dist/devnet/errors.js.map +1 -0
- package/dist/devnet/index.d.ts +72 -0
- package/dist/devnet/index.d.ts.map +1 -0
- package/dist/devnet/index.js +73 -0
- package/dist/devnet/index.js.map +1 -0
- package/package.json +14 -4
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Config.js","sourceRoot":"","sources":["../../src/devnet/Config.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AAyEH;;;;;GAKG;AACH,MAAM,CAAC,MAAM,mBAAmB,GAAyB;IACvD,KAAK,EAAE,oCAAoC;IAC3C,IAAI,EAAE,IAAI;IACV,SAAS,EAAE,KAAK;CACR,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,sBAAsB,GAA4B;IAC7D,KAAK,EAAE,iDAAiD;IACxD,IAAI,EAAE,IAAI;IACV,QAAQ,EAAE,MAAM;CACR,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,2BAA2B,GAAgC;IACtE,KAAK,EAAE,wCAAwC;IAC/C,IAAI,EAAE,IAAI;IACV,YAAY,EAAE,EAAE;CACR,CAAC;AAEX;;;;;GAKG;AACH,MAAM,CAAC,MAAM,qBAAqB,GAA2B;IAC3D,WAAW,EAAE,eAAe;IAC5B,IAAI,EAAE,mBAAmB;IACzB,OAAO,EAAE,sBAAsB;IAC/B,WAAW,EAAE,2BAA2B;CAChC,CAAC;AAEX;;;;;;GAMG;AACH,MAAM,CAAC,MAAM,kBAAkB,GAC7B,oEAAoE,CAAC;AAEvE;;;;;GAKG;AACH,MAAM,UAAU,eAAe,CAAC,KAI/B;IACC,OAAO;QACL,SAAS,EAAE,YAAY;QACvB,OAAO,EAAE,oBAAoB,KAAK,CAAC,OAAO,iBAAiB;QAC3D,SAAS,EAAE,kBAAkB,KAAK,CAAC,OAAO,oBAAoB;QAC9D,IAAI,EAAE,kBAAkB,KAAK,CAAC,IAAI,EAAE;QACpC,WAAW,EAAE,oBAAoB,KAAK,CAAC,WAAW,EAAE;KACrD,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,180 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker container management for DevNet.
|
|
3
|
+
*
|
|
4
|
+
* ## API Design
|
|
5
|
+
*
|
|
6
|
+
* This module uses a **module-function pattern**:
|
|
7
|
+
*
|
|
8
|
+
* - **Stateless**: Functions operate on Container data
|
|
9
|
+
* - **Module functions**: `Container.start(container)`, `Container.stop(container)`
|
|
10
|
+
* - **Data-oriented**: Container is plain data, not an instance with methods
|
|
11
|
+
*
|
|
12
|
+
* This is appropriate because:
|
|
13
|
+
* - Container operations are stateless transformations
|
|
14
|
+
* - No need to encapsulate state in the Container itself
|
|
15
|
+
* - Simpler API for lower-level operations
|
|
16
|
+
*
|
|
17
|
+
* ### Usage Patterns
|
|
18
|
+
*
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // Promise user
|
|
21
|
+
* await Container.start(container);
|
|
22
|
+
* await Container.stop(container);
|
|
23
|
+
*
|
|
24
|
+
* // Effect user
|
|
25
|
+
* yield* Container.effect.start(container);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @since 0.2.0
|
|
29
|
+
* @module
|
|
30
|
+
*/
|
|
31
|
+
import Docker from 'dockerode';
|
|
32
|
+
import { Context, Effect, Layer } from 'effect';
|
|
33
|
+
import type { ResolvedDevNetConfig } from './Config.js';
|
|
34
|
+
import { ContainerError } from './errors.js';
|
|
35
|
+
/**
|
|
36
|
+
* Represents a Docker container.
|
|
37
|
+
*
|
|
38
|
+
* @since 0.2.0
|
|
39
|
+
* @category model
|
|
40
|
+
*/
|
|
41
|
+
export interface Container {
|
|
42
|
+
readonly id: string;
|
|
43
|
+
readonly name: string;
|
|
44
|
+
}
|
|
45
|
+
/**
|
|
46
|
+
* Service interface for Container operations.
|
|
47
|
+
*
|
|
48
|
+
* Use with Effect's dependency injection system.
|
|
49
|
+
*
|
|
50
|
+
* @since 0.2.0
|
|
51
|
+
* @category service
|
|
52
|
+
*/
|
|
53
|
+
export interface ContainerServiceImpl {
|
|
54
|
+
readonly start: (container: Container) => Effect.Effect<void, ContainerError>;
|
|
55
|
+
readonly stop: (container: Container) => Effect.Effect<void, ContainerError>;
|
|
56
|
+
readonly remove: (container: Container) => Effect.Effect<void, ContainerError>;
|
|
57
|
+
readonly getStatus: (container: Container) => Effect.Effect<Docker.ContainerInspectInfo | undefined, ContainerError>;
|
|
58
|
+
readonly isRunning: (container: Container) => Effect.Effect<boolean, never>;
|
|
59
|
+
}
|
|
60
|
+
declare const ContainerService_base: Context.TagClass<ContainerService, "ContainerService", ContainerServiceImpl>;
|
|
61
|
+
/**
|
|
62
|
+
* Context.Tag for ContainerService dependency injection.
|
|
63
|
+
*
|
|
64
|
+
* @since 0.2.0
|
|
65
|
+
* @category service
|
|
66
|
+
*/
|
|
67
|
+
export declare class ContainerService extends ContainerService_base {
|
|
68
|
+
}
|
|
69
|
+
declare function startEffect(container: Container): Effect.Effect<void, ContainerError>;
|
|
70
|
+
/**
|
|
71
|
+
* Start a container.
|
|
72
|
+
*
|
|
73
|
+
* @since 0.2.0
|
|
74
|
+
* @category lifecycle
|
|
75
|
+
*/
|
|
76
|
+
export declare function start(container: Container): Promise<void>;
|
|
77
|
+
declare function stopEffect(container: Container): Effect.Effect<void, ContainerError>;
|
|
78
|
+
/**
|
|
79
|
+
* Stop a container.
|
|
80
|
+
*
|
|
81
|
+
* @since 0.2.0
|
|
82
|
+
* @category lifecycle
|
|
83
|
+
*/
|
|
84
|
+
export declare function stop(container: Container): Promise<void>;
|
|
85
|
+
declare function removeEffect(container: Container): Effect.Effect<void, ContainerError>;
|
|
86
|
+
/**
|
|
87
|
+
* Remove a container (stops it first if running).
|
|
88
|
+
*
|
|
89
|
+
* @since 0.2.0
|
|
90
|
+
* @category lifecycle
|
|
91
|
+
*/
|
|
92
|
+
export declare function remove(container: Container): Promise<void>;
|
|
93
|
+
declare function getStatusEffect(container: Container): Effect.Effect<Docker.ContainerInspectInfo | undefined, ContainerError>;
|
|
94
|
+
/**
|
|
95
|
+
* Get container status information.
|
|
96
|
+
*
|
|
97
|
+
* @since 0.2.0
|
|
98
|
+
* @category inspection
|
|
99
|
+
*/
|
|
100
|
+
export declare function getStatus(container: Container): Promise<Docker.ContainerInspectInfo | undefined>;
|
|
101
|
+
/**
|
|
102
|
+
* Check if a container is running.
|
|
103
|
+
*
|
|
104
|
+
* @since 0.2.0
|
|
105
|
+
* @category inspection
|
|
106
|
+
*/
|
|
107
|
+
export declare function isRunning(container: Container): Promise<boolean>;
|
|
108
|
+
declare function findByNameEffect(containerName: string): Effect.Effect<Docker.Container | undefined, ContainerError>;
|
|
109
|
+
/**
|
|
110
|
+
* Find a container by name.
|
|
111
|
+
*
|
|
112
|
+
* @since 0.2.0
|
|
113
|
+
* @category utilities
|
|
114
|
+
* @internal
|
|
115
|
+
*/
|
|
116
|
+
export declare function findByName(containerName: string): Promise<Docker.Container | undefined>;
|
|
117
|
+
declare function removeByNameEffect(containerName: string): Effect.Effect<void, ContainerError>;
|
|
118
|
+
/**
|
|
119
|
+
* Remove a container by name if it exists.
|
|
120
|
+
*
|
|
121
|
+
* @since 0.2.0
|
|
122
|
+
* @category utilities
|
|
123
|
+
* @internal
|
|
124
|
+
*/
|
|
125
|
+
export declare function removeByName(containerName: string): Promise<void>;
|
|
126
|
+
declare function createNodeEffect(config: ResolvedDevNetConfig): Effect.Effect<Docker.Container, ContainerError>;
|
|
127
|
+
/**
|
|
128
|
+
* Create a Midnight node container.
|
|
129
|
+
*
|
|
130
|
+
* @since 0.2.0
|
|
131
|
+
* @category constructors
|
|
132
|
+
* @internal
|
|
133
|
+
*/
|
|
134
|
+
export declare function createNode(config: ResolvedDevNetConfig): Promise<Docker.Container>;
|
|
135
|
+
declare function createIndexerEffect(config: ResolvedDevNetConfig): Effect.Effect<Docker.Container, ContainerError>;
|
|
136
|
+
/**
|
|
137
|
+
* Create an indexer container.
|
|
138
|
+
*
|
|
139
|
+
* @since 0.2.0
|
|
140
|
+
* @category constructors
|
|
141
|
+
* @internal
|
|
142
|
+
*/
|
|
143
|
+
export declare function createIndexer(config: ResolvedDevNetConfig): Promise<Docker.Container>;
|
|
144
|
+
declare function createProofServerEffect(config: ResolvedDevNetConfig): Effect.Effect<Docker.Container, ContainerError>;
|
|
145
|
+
/**
|
|
146
|
+
* Create a proof server container.
|
|
147
|
+
*
|
|
148
|
+
* @since 0.2.0
|
|
149
|
+
* @category constructors
|
|
150
|
+
* @internal
|
|
151
|
+
*/
|
|
152
|
+
export declare function createProofServer(config: ResolvedDevNetConfig): Promise<Docker.Container>;
|
|
153
|
+
/**
|
|
154
|
+
* Raw Effect APIs for advanced users.
|
|
155
|
+
*
|
|
156
|
+
* @since 0.2.0
|
|
157
|
+
* @category effect
|
|
158
|
+
*/
|
|
159
|
+
export declare const effect: {
|
|
160
|
+
start: typeof startEffect;
|
|
161
|
+
stop: typeof stopEffect;
|
|
162
|
+
remove: typeof removeEffect;
|
|
163
|
+
getStatus: typeof getStatusEffect;
|
|
164
|
+
findByName: typeof findByNameEffect;
|
|
165
|
+
removeByName: typeof removeByNameEffect;
|
|
166
|
+
createNode: typeof createNodeEffect;
|
|
167
|
+
createIndexer: typeof createIndexerEffect;
|
|
168
|
+
createProofServer: typeof createProofServerEffect;
|
|
169
|
+
};
|
|
170
|
+
/**
|
|
171
|
+
* Live Layer for ContainerService.
|
|
172
|
+
*
|
|
173
|
+
* Provides the default implementation of ContainerService for Effect DI.
|
|
174
|
+
*
|
|
175
|
+
* @since 0.2.0
|
|
176
|
+
* @category layer
|
|
177
|
+
*/
|
|
178
|
+
export declare const Live: Layer.Layer<ContainerService>;
|
|
179
|
+
export {};
|
|
180
|
+
//# sourceMappingURL=Container.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Container.d.ts","sourceRoot":"","sources":["../../src/devnet/Container.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,390 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Docker container management for DevNet.
|
|
3
|
+
*
|
|
4
|
+
* ## API Design
|
|
5
|
+
*
|
|
6
|
+
* This module uses a **module-function pattern**:
|
|
7
|
+
*
|
|
8
|
+
* - **Stateless**: Functions operate on Container data
|
|
9
|
+
* - **Module functions**: `Container.start(container)`, `Container.stop(container)`
|
|
10
|
+
* - **Data-oriented**: Container is plain data, not an instance with methods
|
|
11
|
+
*
|
|
12
|
+
* This is appropriate because:
|
|
13
|
+
* - Container operations are stateless transformations
|
|
14
|
+
* - No need to encapsulate state in the Container itself
|
|
15
|
+
* - Simpler API for lower-level operations
|
|
16
|
+
*
|
|
17
|
+
* ### Usage Patterns
|
|
18
|
+
*
|
|
19
|
+
* ```typescript
|
|
20
|
+
* // Promise user
|
|
21
|
+
* await Container.start(container);
|
|
22
|
+
* await Container.stop(container);
|
|
23
|
+
*
|
|
24
|
+
* // Effect user
|
|
25
|
+
* yield* Container.effect.start(container);
|
|
26
|
+
* ```
|
|
27
|
+
*
|
|
28
|
+
* @since 0.2.0
|
|
29
|
+
* @module
|
|
30
|
+
*/
|
|
31
|
+
import Docker from 'dockerode';
|
|
32
|
+
import { Context, Effect, Layer } from 'effect';
|
|
33
|
+
import * as Config from './Config.js';
|
|
34
|
+
import * as Images from './Images.js';
|
|
35
|
+
import { ContainerError } from './errors.js';
|
|
36
|
+
/**
|
|
37
|
+
* Context.Tag for ContainerService dependency injection.
|
|
38
|
+
*
|
|
39
|
+
* @since 0.2.0
|
|
40
|
+
* @category service
|
|
41
|
+
*/
|
|
42
|
+
export class ContainerService extends Context.Tag('ContainerService')() {
|
|
43
|
+
}
|
|
44
|
+
// Internal Effect implementation
|
|
45
|
+
function startEffect(container) {
|
|
46
|
+
return Effect.gen(function* () {
|
|
47
|
+
yield* Effect.tryPromise({
|
|
48
|
+
try: async () => {
|
|
49
|
+
const docker = new Docker();
|
|
50
|
+
await docker.getContainer(container.id).start();
|
|
51
|
+
},
|
|
52
|
+
catch: (cause) => new ContainerError({
|
|
53
|
+
operation: 'start',
|
|
54
|
+
container: container.name,
|
|
55
|
+
cause,
|
|
56
|
+
}),
|
|
57
|
+
});
|
|
58
|
+
});
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Start a container.
|
|
62
|
+
*
|
|
63
|
+
* @since 0.2.0
|
|
64
|
+
* @category lifecycle
|
|
65
|
+
*/
|
|
66
|
+
export async function start(container) {
|
|
67
|
+
return Effect.runPromise(startEffect(container));
|
|
68
|
+
}
|
|
69
|
+
// Internal Effect implementation
|
|
70
|
+
function stopEffect(container) {
|
|
71
|
+
return Effect.gen(function* () {
|
|
72
|
+
yield* Effect.tryPromise({
|
|
73
|
+
try: async () => {
|
|
74
|
+
const docker = new Docker();
|
|
75
|
+
const dockerContainer = docker.getContainer(container.id);
|
|
76
|
+
const info = await dockerContainer.inspect();
|
|
77
|
+
if (info.State.Running) {
|
|
78
|
+
await dockerContainer.stop();
|
|
79
|
+
}
|
|
80
|
+
},
|
|
81
|
+
catch: (cause) => new ContainerError({
|
|
82
|
+
operation: 'stop',
|
|
83
|
+
container: container.name,
|
|
84
|
+
cause,
|
|
85
|
+
}),
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
}
|
|
89
|
+
/**
|
|
90
|
+
* Stop a container.
|
|
91
|
+
*
|
|
92
|
+
* @since 0.2.0
|
|
93
|
+
* @category lifecycle
|
|
94
|
+
*/
|
|
95
|
+
export async function stop(container) {
|
|
96
|
+
return Effect.runPromise(stopEffect(container));
|
|
97
|
+
}
|
|
98
|
+
// Internal Effect implementation
|
|
99
|
+
function removeEffect(container) {
|
|
100
|
+
return Effect.gen(function* () {
|
|
101
|
+
yield* stopEffect(container);
|
|
102
|
+
yield* Effect.tryPromise({
|
|
103
|
+
try: async () => {
|
|
104
|
+
const docker = new Docker();
|
|
105
|
+
await docker.getContainer(container.id).remove();
|
|
106
|
+
},
|
|
107
|
+
catch: (cause) => new ContainerError({
|
|
108
|
+
operation: 'remove',
|
|
109
|
+
container: container.name,
|
|
110
|
+
cause,
|
|
111
|
+
}),
|
|
112
|
+
});
|
|
113
|
+
});
|
|
114
|
+
}
|
|
115
|
+
/**
|
|
116
|
+
* Remove a container (stops it first if running).
|
|
117
|
+
*
|
|
118
|
+
* @since 0.2.0
|
|
119
|
+
* @category lifecycle
|
|
120
|
+
*/
|
|
121
|
+
export async function remove(container) {
|
|
122
|
+
return Effect.runPromise(removeEffect(container));
|
|
123
|
+
}
|
|
124
|
+
// Internal Effect implementation
|
|
125
|
+
function getStatusEffect(container) {
|
|
126
|
+
return Effect.gen(function* () {
|
|
127
|
+
return yield* Effect.tryPromise({
|
|
128
|
+
try: async () => {
|
|
129
|
+
const docker = new Docker();
|
|
130
|
+
return await docker.getContainer(container.id).inspect();
|
|
131
|
+
},
|
|
132
|
+
catch: (cause) => new ContainerError({
|
|
133
|
+
operation: 'inspect',
|
|
134
|
+
container: container.name,
|
|
135
|
+
cause,
|
|
136
|
+
}),
|
|
137
|
+
});
|
|
138
|
+
});
|
|
139
|
+
}
|
|
140
|
+
/**
|
|
141
|
+
* Get container status information.
|
|
142
|
+
*
|
|
143
|
+
* @since 0.2.0
|
|
144
|
+
* @category inspection
|
|
145
|
+
*/
|
|
146
|
+
export async function getStatus(container) {
|
|
147
|
+
return Effect.runPromise(getStatusEffect(container));
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Check if a container is running.
|
|
151
|
+
*
|
|
152
|
+
* @since 0.2.0
|
|
153
|
+
* @category inspection
|
|
154
|
+
*/
|
|
155
|
+
export async function isRunning(container) {
|
|
156
|
+
try {
|
|
157
|
+
const status = await getStatus(container);
|
|
158
|
+
return status?.State.Running ?? false;
|
|
159
|
+
}
|
|
160
|
+
catch {
|
|
161
|
+
return false;
|
|
162
|
+
}
|
|
163
|
+
}
|
|
164
|
+
// Internal Effect implementation
|
|
165
|
+
function findByNameEffect(containerName) {
|
|
166
|
+
return Effect.gen(function* () {
|
|
167
|
+
return yield* Effect.tryPromise({
|
|
168
|
+
try: async () => {
|
|
169
|
+
const docker = new Docker();
|
|
170
|
+
const containers = await docker.listContainers({ all: true });
|
|
171
|
+
const found = containers.find((c) => c.Names.includes(`/${containerName}`));
|
|
172
|
+
return found ? docker.getContainer(found.Id) : undefined;
|
|
173
|
+
},
|
|
174
|
+
catch: (cause) => new ContainerError({
|
|
175
|
+
operation: 'lookup',
|
|
176
|
+
container: containerName,
|
|
177
|
+
cause,
|
|
178
|
+
}),
|
|
179
|
+
});
|
|
180
|
+
});
|
|
181
|
+
}
|
|
182
|
+
/**
|
|
183
|
+
* Find a container by name.
|
|
184
|
+
*
|
|
185
|
+
* @since 0.2.0
|
|
186
|
+
* @category utilities
|
|
187
|
+
* @internal
|
|
188
|
+
*/
|
|
189
|
+
export async function findByName(containerName) {
|
|
190
|
+
return Effect.runPromise(findByNameEffect(containerName));
|
|
191
|
+
}
|
|
192
|
+
// Internal Effect implementation
|
|
193
|
+
function removeByNameEffect(containerName) {
|
|
194
|
+
return Effect.gen(function* () {
|
|
195
|
+
const existing = yield* findByNameEffect(containerName);
|
|
196
|
+
if (existing) {
|
|
197
|
+
yield* Effect.tryPromise({
|
|
198
|
+
try: async () => {
|
|
199
|
+
const info = await existing.inspect();
|
|
200
|
+
if (info.State.Running) {
|
|
201
|
+
await existing.stop();
|
|
202
|
+
}
|
|
203
|
+
await existing.remove();
|
|
204
|
+
},
|
|
205
|
+
catch: (cause) => new ContainerError({
|
|
206
|
+
operation: 'remove',
|
|
207
|
+
container: containerName,
|
|
208
|
+
cause,
|
|
209
|
+
}),
|
|
210
|
+
});
|
|
211
|
+
}
|
|
212
|
+
});
|
|
213
|
+
}
|
|
214
|
+
/**
|
|
215
|
+
* Remove a container by name if it exists.
|
|
216
|
+
*
|
|
217
|
+
* @since 0.2.0
|
|
218
|
+
* @category utilities
|
|
219
|
+
* @internal
|
|
220
|
+
*/
|
|
221
|
+
export async function removeByName(containerName) {
|
|
222
|
+
return Effect.runPromise(removeByNameEffect(containerName));
|
|
223
|
+
}
|
|
224
|
+
// Internal Effect implementation
|
|
225
|
+
function createNodeEffect(config) {
|
|
226
|
+
return Effect.gen(function* () {
|
|
227
|
+
return yield* Effect.tryPromise({
|
|
228
|
+
try: async () => {
|
|
229
|
+
const docker = new Docker();
|
|
230
|
+
const containerName = `${config.clusterName}-node`;
|
|
231
|
+
await Images.ensureAvailable(config.node.image);
|
|
232
|
+
return docker.createContainer({
|
|
233
|
+
Image: config.node.image,
|
|
234
|
+
name: containerName,
|
|
235
|
+
ExposedPorts: {
|
|
236
|
+
[`${config.node.port}/tcp`]: {},
|
|
237
|
+
},
|
|
238
|
+
HostConfig: {
|
|
239
|
+
PortBindings: {
|
|
240
|
+
// Node exposes 9944 internally, we map to configured port
|
|
241
|
+
['9944/tcp']: [{ HostPort: String(config.node.port) }],
|
|
242
|
+
},
|
|
243
|
+
},
|
|
244
|
+
Env: [`CFG_PRESET=${config.node.cfgPreset}`],
|
|
245
|
+
});
|
|
246
|
+
},
|
|
247
|
+
catch: (cause) => new ContainerError({
|
|
248
|
+
operation: 'create',
|
|
249
|
+
container: `${config.clusterName}-node`,
|
|
250
|
+
cause,
|
|
251
|
+
}),
|
|
252
|
+
});
|
|
253
|
+
});
|
|
254
|
+
}
|
|
255
|
+
/**
|
|
256
|
+
* Create a Midnight node container.
|
|
257
|
+
*
|
|
258
|
+
* @since 0.2.0
|
|
259
|
+
* @category constructors
|
|
260
|
+
* @internal
|
|
261
|
+
*/
|
|
262
|
+
export async function createNode(config) {
|
|
263
|
+
return Effect.runPromise(createNodeEffect(config));
|
|
264
|
+
}
|
|
265
|
+
// Internal Effect implementation
|
|
266
|
+
function createIndexerEffect(config) {
|
|
267
|
+
return Effect.gen(function* () {
|
|
268
|
+
return yield* Effect.tryPromise({
|
|
269
|
+
try: async () => {
|
|
270
|
+
const docker = new Docker();
|
|
271
|
+
const containerName = `${config.clusterName}-indexer`;
|
|
272
|
+
const nodeUrl = `ws://${config.clusterName}-node:9944`;
|
|
273
|
+
await Images.ensureAvailable(config.indexer.image);
|
|
274
|
+
return docker.createContainer({
|
|
275
|
+
Image: config.indexer.image,
|
|
276
|
+
name: containerName,
|
|
277
|
+
ExposedPorts: {
|
|
278
|
+
[`${config.indexer.port}/tcp`]: {},
|
|
279
|
+
},
|
|
280
|
+
HostConfig: {
|
|
281
|
+
PortBindings: {
|
|
282
|
+
// Indexer exposes 8088 internally
|
|
283
|
+
['8088/tcp']: [{ HostPort: String(config.indexer.port) }],
|
|
284
|
+
},
|
|
285
|
+
Links: [`${config.clusterName}-node:${config.clusterName}-node`],
|
|
286
|
+
},
|
|
287
|
+
Env: [
|
|
288
|
+
`RUST_LOG=indexer=${config.indexer.logLevel},chain_indexer=${config.indexer.logLevel},indexer_api=${config.indexer.logLevel},wallet_indexer=${config.indexer.logLevel},indexer_common=${config.indexer.logLevel},fastrace_opentelemetry=${config.indexer.logLevel},${config.indexer.logLevel}`,
|
|
289
|
+
`APP__INFRA__SECRET=${Config.DEV_INDEXER_SECRET}`,
|
|
290
|
+
`APP__INFRA__NODE__URL=${nodeUrl}`,
|
|
291
|
+
],
|
|
292
|
+
});
|
|
293
|
+
},
|
|
294
|
+
catch: (cause) => new ContainerError({
|
|
295
|
+
operation: 'create',
|
|
296
|
+
container: `${config.clusterName}-indexer`,
|
|
297
|
+
cause,
|
|
298
|
+
}),
|
|
299
|
+
});
|
|
300
|
+
});
|
|
301
|
+
}
|
|
302
|
+
/**
|
|
303
|
+
* Create an indexer container.
|
|
304
|
+
*
|
|
305
|
+
* @since 0.2.0
|
|
306
|
+
* @category constructors
|
|
307
|
+
* @internal
|
|
308
|
+
*/
|
|
309
|
+
export async function createIndexer(config) {
|
|
310
|
+
return Effect.runPromise(createIndexerEffect(config));
|
|
311
|
+
}
|
|
312
|
+
// Internal Effect implementation
|
|
313
|
+
function createProofServerEffect(config) {
|
|
314
|
+
return Effect.gen(function* () {
|
|
315
|
+
return yield* Effect.tryPromise({
|
|
316
|
+
try: async () => {
|
|
317
|
+
const docker = new Docker();
|
|
318
|
+
const containerName = `${config.clusterName}-proof-server`;
|
|
319
|
+
await Images.ensureAvailable(config.proofServer.image);
|
|
320
|
+
const binds = [];
|
|
321
|
+
if (config.proofServer.zkParamsPath) {
|
|
322
|
+
binds.push(`${config.proofServer.zkParamsPath}:/root/.cache/midnight/zk-params`);
|
|
323
|
+
}
|
|
324
|
+
return docker.createContainer({
|
|
325
|
+
Image: config.proofServer.image,
|
|
326
|
+
name: containerName,
|
|
327
|
+
ExposedPorts: {
|
|
328
|
+
[`${config.proofServer.port}/tcp`]: {},
|
|
329
|
+
},
|
|
330
|
+
HostConfig: {
|
|
331
|
+
PortBindings: {
|
|
332
|
+
// Proof server exposes 6300 internally
|
|
333
|
+
['6300/tcp']: [{ HostPort: String(config.proofServer.port) }],
|
|
334
|
+
},
|
|
335
|
+
Binds: binds.length > 0 ? binds : undefined,
|
|
336
|
+
},
|
|
337
|
+
Env: ['HOME=/root'],
|
|
338
|
+
});
|
|
339
|
+
},
|
|
340
|
+
catch: (cause) => new ContainerError({
|
|
341
|
+
operation: 'create',
|
|
342
|
+
container: `${config.clusterName}-proof-server`,
|
|
343
|
+
cause,
|
|
344
|
+
}),
|
|
345
|
+
});
|
|
346
|
+
});
|
|
347
|
+
}
|
|
348
|
+
/**
|
|
349
|
+
* Create a proof server container.
|
|
350
|
+
*
|
|
351
|
+
* @since 0.2.0
|
|
352
|
+
* @category constructors
|
|
353
|
+
* @internal
|
|
354
|
+
*/
|
|
355
|
+
export async function createProofServer(config) {
|
|
356
|
+
return Effect.runPromise(createProofServerEffect(config));
|
|
357
|
+
}
|
|
358
|
+
/**
|
|
359
|
+
* Raw Effect APIs for advanced users.
|
|
360
|
+
*
|
|
361
|
+
* @since 0.2.0
|
|
362
|
+
* @category effect
|
|
363
|
+
*/
|
|
364
|
+
export const effect = {
|
|
365
|
+
start: startEffect,
|
|
366
|
+
stop: stopEffect,
|
|
367
|
+
remove: removeEffect,
|
|
368
|
+
getStatus: getStatusEffect,
|
|
369
|
+
findByName: findByNameEffect,
|
|
370
|
+
removeByName: removeByNameEffect,
|
|
371
|
+
createNode: createNodeEffect,
|
|
372
|
+
createIndexer: createIndexerEffect,
|
|
373
|
+
createProofServer: createProofServerEffect,
|
|
374
|
+
};
|
|
375
|
+
/**
|
|
376
|
+
* Live Layer for ContainerService.
|
|
377
|
+
*
|
|
378
|
+
* Provides the default implementation of ContainerService for Effect DI.
|
|
379
|
+
*
|
|
380
|
+
* @since 0.2.0
|
|
381
|
+
* @category layer
|
|
382
|
+
*/
|
|
383
|
+
export const Live = Layer.succeed(ContainerService, {
|
|
384
|
+
start: startEffect,
|
|
385
|
+
stop: stopEffect,
|
|
386
|
+
remove: removeEffect,
|
|
387
|
+
getStatus: getStatusEffect,
|
|
388
|
+
isRunning: (container) => getStatusEffect(container).pipe(Effect.map((status) => status?.State.Running ?? false), Effect.catchAll(() => Effect.succeed(false))),
|
|
389
|
+
});
|
|
390
|
+
//# sourceMappingURL=Container.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"Container.js","sourceRoot":"","sources":["../../src/devnet/Container.ts"],"names":[],"mappings":"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"}
|