dockest
Version:
Dockest is an integration testing tool aimed at alleviating the process of evaluating unit tests whilst running multi-container Docker applications.
55 lines • 2.19 kB
JavaScript
;
var __importDefault = (this && this.__importDefault) || function (mod) {
return (mod && mod.__esModule) ? mod : { "default": mod };
};
Object.defineProperty(exports, "__esModule", { value: true });
exports.createDockerEventEmitter = exports.isKillEvent = exports.isDieEvent = void 0;
const events_1 = require("events");
const execa_1 = __importDefault(require("execa")); /* eslint-disable-line import/default */
const parseJsonSafe = (data) => {
try {
return JSON.parse(data);
}
catch (err) {
return null;
}
};
const isDieEvent = (event) => event.action === 'die';
exports.isDieEvent = isDieEvent;
const isKillEvent = (event) => event.action === 'kill';
exports.isKillEvent = isKillEvent;
const createDockerEventEmitter = (composeFilePath) => {
const command = `docker-compose --file ${composeFilePath} events --json`;
const childProcess = (0, execa_1.default)(command, { shell: true, reject: false });
if (!childProcess.stdout) {
childProcess.kill();
throw new Error('Event Process has not output stream.');
}
const emitter = new events_1.EventEmitter();
// without this line only the first data event is fired (in some undefinable cases)
childProcess.then(() => {
return undefined;
});
childProcess.stdout.addListener('data', (chunk) => {
const lines = chunk.toString().split(`\n`).filter(Boolean);
for (const line of lines) {
const data = parseJsonSafe(line);
if (!data)
return;
// convert health status to friendlier format
if (data.action.startsWith('health_status: ')) {
const healthStatus = data.action
.replace('health_status: ', '')
.trim();
data.action = 'health_status';
data.attributes.healthStatus = healthStatus;
}
emitter.emit(data.service, data);
}
});
return Object.assign(emitter, {
destroy: () => childProcess.cancel(),
});
};
exports.createDockerEventEmitter = createDockerEventEmitter;
//# sourceMappingURL=create-docker-event-emitter.js.map