見出し画像

Node For Max ① ~触ってみる~

久しぶりに Max を起動したので、せっかくならとまだ触ったことない Node For Max を試してみました。


環境

  • Mac OSX High Sierra 10.13.6

  • Max: 8.5.5

  • Node.js: 16.20.1

Max 8.5.5 のパッケージには、Node.js 16.6.0 が含まれているので、Node のインストールは本来不要です。
ただ、開発時にわざわざ「Max を立ち上げて実行」としたくなかったので、私は同じメジャーバージョンの Node をインストールしました。
Max パッチ内で Node を実行するときは、16.6.0 が利用されることに注意しましょう。

Node.js とは

Node.js

非同期型、イベント駆動の JavaScript の実行環境です。
スケーラブルな Web アプリケーションを構築するために設計されています。
低レイヤーに 実装されたC 言語のライブラリによって、OS に依存しないノンブロッキング I/O を実現しています。

Node For Max とは

Max 8.0.0 以降では、Node の Javascript エンジンがサポートされています。
これによって、Javascript のコードを Max パッチ内から Node で実行することができるようになりました。

API を叩いてみる

The Metropolitan Museum of Art Collection API
メトロポリタン美術館が所蔵する、470,000 点以上の美術品に関する情報のデータセットを、商用・非商用に関わらず無制限で提供する API

Node.js が使えるということで、とりあえず無料の API を叩いて結果を出力してみようと思います。

ゴール

ユーザ入力で ID を受け取り、上記 API を実行してレスポンスを出力する。

準備

1. ワークスペースの準備

mkdir metropolitan-api-sample
cd metropolitan-api-sample
npm init

2. 必要パッケージのインストール

npm i --save undici readline dotenv
npm i --save-dev typescript ts-node @types/node @types/max-api

出来上がった package.json を見てみると

"dependencies": {
    "dotenv": "^16.3.1",
    "readline": "^1.3.0",
    "undici": "^5.22.1"
},
"devDependencies": {
    "@types/max-api": "^2.0.0",
    "@types/node": "^20.4.2",
    "ts-node": "^10.9.1",
    "typescript": "^5.1.6"
}
  • undici: HTTP クライアント。メトロポリタン美術館 API にリクエストする。

  • readline: NodeJS 用のシンプルなストリーミング readline モジュール。stdin 読み込み用。

  • dotenv: .env ファイルに定義された値を環境変数として使うことができる。

typescript で開発する予定なので、型定義ファイルと ts-node, typescript をインストールする。
参考: Node for Max で TypeScript を使う

※ MaxAPI のモジュールは Max によって自動で読み込まれるため、インストールは不要

開発

メトロポリタン美術館 API のクライアント部分

export default class MetropolitanMuseumApiClient {
    async fetchObject(objectId: string | number): Promise<string> {
        const url = `${process.env.METROPOLITAN_API_BASE_URL}/public/collection/v1/objects/${objectId}`;
        const method = 'GET';
        // undici を利用して、メトロポリタン美術館APIのObjectAPIを叩く
        const response = await request(url, {
            method
        });
        return await response.body.text();
    }
}

stdin から入力を受け取って、API を実行するメイン部分

const apiClient = new MetropolitanMuseumApiClient();

const rl = readline.createInterface({
    input: process.stdin,
    terminal: false
})

// 標準入力に入力があるたびに実行される。
rl.on('line', async (line: string): Promise<void> => {
    // API実行
    const response = await apiClient.fetchObject(line);
    // node.scriptオブジェクトのアウトレットからレスポンスを出力する。
    await MaxAPI.outlet(JSON.parse(response));
});

ソースコードの全体はこちら

Max パッチでは、node.script オブジェクトで、index.ts を読み込む。
stdin のメッセージを与えると、Node のプロセスがメトロポリタン美術館 API にリクエストを送り、結果を出力してくれる。

おわり

とりあえず適当な API を実行できました。
Node が自由に扱えると、外部サービスとのやりとりが楽にできるので嬉しいですね。

この記事が気に入ったらサポートをしてみませんか?