UNPKG

mysql-wait

Version:

A promise based API to wait for a MySQL database to become available.

54 lines (47 loc) 1.25 kB
'use strict' const mysql = require('mysql') const merge = require('lodash.merge') const DEFAULT_STEP_TIME = 1000 const DEFAULT_TIMEOUT = 60 * DEFAULT_STEP_TIME const EXPECTED_ERRORS = ['ECONNREFUSED', 'PROTOCOL_CONNECTION_LOST'] function wait (timeout) { return new Promise(resolve => { setTimeout(resolve, timeout) }) } function connect (options) { var connection = mysql.createConnection(options) return new Promise((resolve, reject) => { connection.connect(err => { if (err) { reject(err) } else { connection.end() resolve() } }) }) } function tryConnect (options, step) { step = step || 0 return connect(options).catch(err => { if (EXPECTED_ERRORS.indexOf(err.code) !== -1) { if (options.stepTime * step < options.timeout) { return wait(options.stepTime).then(() => tryConnect(options, step + 1)) } } let error = new Error('MySQL not up: ' + err.code) error.code = err.code throw error }) } function waitForDatabase (options) { return tryConnect(merge({ host: 'localhost', user: 'root', port: 3306, timeout: DEFAULT_TIMEOUT, stepTime: DEFAULT_STEP_TIME }, options)) } module.exports = waitForDatabase