zookeeper-helpers.js 4.56 KB
'usu strict';

const _ = require('lodash');
const zookeeper = require('node-zookeeper-client');

const _createClient = (server) => new Promise((resolve, reject) => {
    const client = zookeeper.createClient(server);
    let isServerStart = false;

    client.once('connected', function (err) {
        isServerStart = true;
        err ? reject(err) : resolve(client);
    });

    setTimeout(() => {
        !isServerStart && reject({message: 'Failed to authenticate with the server.', code: -1});
    }, 5000);

    client.connect();
});

const _exists = (client, path) => new Promise((resolve, reject) => {
    client.exists(path, (err, stat) => {
        if (err) {
            console.log('path %s exits error', path, err.stack);
            resolve(false);
        } else {
            resolve(stat ? true : false);
        }
    });
});

const exists = (server, path) => new Promise((resolve, reject) => {
    return _createClient(server).then(client => {
        _exists(client, path).then(stat => {
            client.close();
            resolve(stat);
        });
    }).catch(state => {
        reject(state);
    });
});

const creator = (server, path, value, iscover) => new Promise((resolve, reject) => {
    return _createClient(server).then(client => {
        _exists(client, path).then(stat => {
            if (stat && iscover) {
                client.setData(path, new Buffer(value.toString()), function(err, data, stat) {
                    client.close();
                    if (err) {
                        console.log('update path %s data error');
                        resolve(false);
                    } else {
                        console.log('path %s data change to', path, value);
                        resolve(true);
                    }
                });
            } else if (stat) {
                client.close();
                resolve(true);
            } else {
                client.mkdirp(path, new Buffer(value), (err, path) => {
                    client.close();
                    if (err) {
                        console.log('Node %s create err', path, err.stack);
                        resolve(false);
                    } else {
                        console.log('Node %s is created', path);
                        resolve(true);
                    }
                });
            }
        });
    }).catch(state => {
        reject(state);
    });
});

const getter = (server, path) => new Promise((resolve, reject) => {
    return _createClient(server).then(client => {
        _exists(client, path).then(stat => {
            if (stat) {
                client.getData(
                    path,
                    (err, data, statData) => {
                        if (err) {
                            console.log('Get path %s data error', path, err.stack);
                        }

                        client.close();
                        resolve(data && data.toString('utf8'));
                    }
                )
            } else {
                // 不存在的路径
                console.log('no path %s, we will create it with value "false" automatic', path);
                client.close();
                resolve();
            }
        });
    }).catch(state => {
        reject(state);
    });
});

const setter = (server, path, value) => new Promise((resolve, reject) => {
    return _createClient(server).then(client => {
        _exists(client, path).then(stat => {
            if (stat) {
                client.setData(path, new Buffer(val.toString()), function(err, data, stat) {
                    client.close();
                    if (err) {
                        console.log('update path %s data error');
                        resolve(false);
                    } else {
                        resolve(true);
                    }
                });
            } else {
                client.close();
                resolve(false);
            }
        });
    }).catch(state => {
        reject(state);
    });
});


const remove = (server, path) => new Promise((resolve, reject) => {
    return _createClient(server).then(client => {
        _exists(client, path).then(stat => {
            if (stat) {
                client.remove(path, function(err) {
                    client.close();
                    err ? resolve(false) : resolve(true);
                });
            } else {
                client.close();
                resolve(false);
            }
        });
    }).catch(state => {
        reject(state);
    });
});


module.exports = {
    exists,
    creator,
    setter,
    getter,
    remove
};