@peccul is peccu

(love peccu '(emacs lisp cat outdoor bicycle mac linux coffee))

標準入力の内容をチャットに投稿する2 (Node.js版)

peccu.hatenablog.com

こんな記事を書きましたが、結局渡す内容によってcurlが実行できないことがあったのでNode.jsで書き直しました。 依存パッケージなしで書いてみました。

ただ、プロキシ越えは未実装です。。。

#!/usr/bin/env node

const hook_url = 'https://web/hooks/url';
const channel = 'channel-name';
const icon=':deciduous_tree:';

const getStdin = function(){
  return new Promise((resolve, reject) => {
    process.stdin.setEncoding('utf8');

    var input = [];
    process.stdin.on('readable', () => {
      const chunk = process.stdin.read();
      if (chunk !== null) {
        input.push(chunk);
      }
    });

    process.stdin.on('end', () => {
      process.stdout.write(`> sending data:\n${input.join('')}`);
      resolve(input.join(''));
    });
  });
};

const postContent = function(url, data){
  return new Promise((resolve, reject) => {
    const postData = require('querystring').stringify(data);
    const urllib = require('url');
    const parsedUrl = urllib.parse(url);
    const options = {
      hostname: parsedUrl.host,
      port: url.startsWith('https') ? 443 : 80,
      path: parsedUrl.path,
      method: 'POST',
      headers: {
        'Content-Type': 'application/x-www-form-urlencoded',
        'Content-Length': Buffer.byteLength(postData)
      }
    };

    const lib = url.startsWith('https') ? require('https') : require('http');
    const req = lib.request(options, (res) => {
      // handle http errors
      if (res.statusCode < 200 || res.statusCode > 299) {
        reject(new Error('Failed to load page, status code: ' + res.statusCode));
      }


      // console.log(`STATUS: ${res.statusCode}`);
      // console.log(`HEADERS: ${JSON.stringify(res.headers)}`);
      res.setEncoding('utf8');

      const body = [];
      res.on('data', (chunk) => {
        // console.log(`BODY: ${chunk}`);
        body.push(chunk);
      });
      res.on('end', () => {
        // console.log('No more data in response.');
        resolve(body.join(''));
      });
    });

    req.on('error', (e) => {
      console.error(`problem with request: ${e.message}`);
      reject(e);
    });

    // write data to request body
    req.write(postData);
    req.end();
  });
};

getStdin().then(function(input){
  const mes = input;
  const data = {
    payload: JSON.stringify({
      icon_emoji: icon,
      text: '```' + mes + '```',
      channel: channel
    })
  };
  return postContent(hook_url, data);
})
.then(function(out){
  console.log('> done');
})
.catch(function(e){
  console.log('error', e);
});

参考