UNPKG

@vulcan-sql/extension-driver-ksqldb

Version:

ksqlDB driver for VulcanSQL

75 lines 3.27 kB
"use strict"; 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