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

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

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) => {
    const client = zookeeper.createClient(server);

    client.once('connected', function () {
        _exists(client, path).then(stat => {
            client.close();
            resolve(stat);
        });
    });

    client.connect();
});

const creator = (server, path, value, iscover) => new Promise((resolve, reject) => {
    const client = zookeeper.createClient(server);

    client.once('connected', function () {
        _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);
                    }
                });
            }
        });
    });

    client.connect();
});

const getter = (server, path) => new Promise((resolve, reject) => {
    const client = zookeeper.createClient(server);

    client.once('connected', function () {
        _exists(client, path).then(stat => {
            if (stat) {
                client.getData(
                    path,
                    (err, data, statData) => {
                        if (err) {
                            console.log('Got 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();
            }
        })
    });

    client.connect();
});

const setter = (server, path, value) => new Promise((resolve, reject) => {
    const client = zookeeper.createClient(server);

    client.once('connected', function () {
        _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 {
                        console.log('path %s data change to', path, value);
                        resolve(true);
                    }
                });
            } else {
                client.close();
                resolve(false);
            }
        });
    });

    client.connect();
});


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