co()

in script/download_lib.js [75:131]


co(function *() {
    let urls;
    try {
        urls = yield getUrlArray();
    } catch(e) {
        console.error(`[rocketmq sdk] [error] ${e.message}`);
        process.exit(4);
    }

    yield mkdirp(LIB_DIR);
    let writeTimes = 0;
    for(const url of urls) {
        console.log(`[rocketmq sdk] [info] downloading [${url}]...`);

        const resp = yield urllib.request(url, {
            timeout: 60000 * 5,
            followRedirect: true,
            streaming: true
        });

        if(resp.status !== 200) {
            destroy(resp.res);
            console.error(`[rocketmq sdk] [error] error status ${resp.status} while downloading [${url}].`);
            process.exit(4);
        }

        const readStream = resp.res;
        const filename = path.join(LIB_DIR, path.basename(url));
        const writeStream = fs.createWriteStream(filename, {
            encoding: "binary"
        });

        // eslint-disable-next-line
        function handleDownladCallback(err) {
            if(err) {
                console.error(`[rocketmq sdk] [error] error occurred while downloading [${url}] to [${filename}].`);
                console.error(err.stack);
                process.exit(4);
            }

            writeTimes++;
            destroy(resp.res);

            console.log(`[rocketmq sdk] [info] downloaded library [${url}].`);
            if(writeTimes === urls.length) {
                console.log("[rocketmq sdk] [info] all libraries have been written to disk.");
                process.exit(0);
            }
        }

        readStream.on("error", handleDownladCallback);
        writeStream.on("error", handleDownladCallback);
        writeStream.on("finish", handleDownladCallback);

        readStream.pipe(writeStream);
    }
});