@vulcan-sql/extension-driver-ksqldb
Version:
ksqlDB driver for VulcanSQL
75 lines • 3.27 kB
JavaScript
;
Object.defineProperty(exports, "__esModule", { value: true });
exports.Compose = void 0;
const tslib_1 = require("tslib");
const Docker = require("dockerode");
const path = require("path");
const jsYaml = require("js-yaml");
const fs_1 = require("fs");
const docker = new Docker();
class Compose {
constructor() {
this.containers = new Map();
this.ksqldbName = 'ksqldb-server';
}
up() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const composeJson = yield this.getComposeJson();
yield docker.pruneContainers();
yield docker.pruneNetworks();
const network = Object.keys(composeJson.networks)[0];
this.network = yield docker.createNetwork({
Name: network,
});
for (const serviceName in composeJson.services) {
const service = composeJson.services[serviceName];
const pullStream = yield docker.pull(service.image);
// https://github.com/apocas/dockerode/issues/647
yield new Promise((res) => docker.modem.followProgress(pullStream, res));
const containerConfig = this.convertContainerConfig(service, network);
this.containers.set(serviceName, yield docker.createContainer(containerConfig));
yield this.containers.get(serviceName).start();
}
});
}
down() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
for (const container of this.containers.values()) {
yield container.stop();
}
yield docker.pruneContainers();
yield docker.pruneNetworks();
});
}
getComposeJson() {
return tslib_1.__awaiter(this, void 0, void 0, function* () {
const content = yield fs_1.promises.readFile(path.resolve(__dirname, 'docker-compose.yml'), 'utf-8');
const composeJson = jsYaml.load(content);
return composeJson;
});
}
convertContainerConfig(service, network) {
// dockerode does not support relative paths in container volumes
const Binds = (service['volumes'] || []).map((volume) => volume.replace('./', `${__dirname}/`));
return {
Image: service['image'],
name: service['hostname'],
Hostname: service['hostname'],
HostConfig: {
PortBindings: (service['ports'] || []).reduce((acc, port) => {
const [hostPort, containerPort] = port.split(':');
return Object.assign(Object.assign({}, acc), { [`${containerPort}/tcp`]: [{ HostPort: hostPort }] });
}, {}),
Binds,
NetworkMode: network,
},
Env: Object.keys(service['environment'] || {}).map((key) => `${key}=${service['environment'][key]}`),
ExposedPorts: (service['expose'] || []).reduce((acc, port) => (Object.assign(Object.assign({}, acc), { [`${port}/tcp`]: {} })), {}),
Entrypoint: service['entrypoint'] || [],
Tty: service['tty'] || false,
};
;
}
}
exports.Compose = Compose;
//# sourceMappingURL=compose.js.map