Hexabase TypeScript SDKを使ってプログラム拡張（FaaS）を実行する

[Hexabase（ヘキサベース）](https://www.hexabase.com/)は企業においても安心して利用できるBaaS（Backend as a Service）を提供しています。多くのBaaSがそうであるように、主にフロントエンド開発者に利用してもらいたいと考えています。そこで現在、TypeScript SDKの開発が進められています。

この記事ではHexabase TypeScript SDKのインストールと、プロジェクトに対して設定したプログラム拡張を呼び出す方法について紹介します。

## インストール

インストールはnpmやyarnを使って行います。

```jsx
# npmの場合
npm install @hexabase/hexabase-js

# yarnの場合
yarn add @hexabase/hexabase-js
```

## インポート

インポートすると、 `HexabaseClient` というオブジェクトが取得できます。

```jsx
import { HexabaseClient } from "@hexabase/hexabase-js";
```

## 初期化

HexabaseClientを初期化します。

```jsx
const client = new HexabaseClient();
```

## 認証

Hexabaseでは業務利用を想定しているため、利用する際に認証情報が必須になります。最初はメールアドレスとパスワードで認証し、その後はトークンを使ってGraphQLにアクセスします。 `client` を使って処理します。

初回の認証は次のようになります。emailとパスワード、またはトークンが必須です。

```jsx
await client.login({email, password, token});
```

後はこの `client` に対して処理を行います。

## プロジェクトを取得する

プロジェクトはワークスペースに所属しています。そのため、以下のように段階を踏んでプロジェクトを取得します。 `async/await` を使っているので、注意してください。

```ts
// ワークスペースを取得
await client.setWorkspace('workspace_id');
const project = await client.currentWorkspace.project('project_id');
```

## プログラム拡張とは

Hexabaseではプログラム拡張という機能を提供しています。これは、FaaS（Function as a Service）として呼び出せる機能で、任意のJavaScriptコード（Node.js）をクラウドに保存し、実行できる機能です。

プログラム拡張では、定数を登録できます。

![1778 app.hexabase.com - 1126175211.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/e51248f1-fc71-8b10-d7bb-54b5cd4030a2.jpeg)


この定数は環境変数とは異なり、プログラムコード中で `{NAME}` のように記述された部分が、定数の値に置き換えられます。

## プログラム拡張の作成

プログラム拡張はプロジェクトの設定メニューから作成できます。関数を選択して、追加を押します。

![1777 app.hexabase.com - 1126161602.jpg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/197026/b8e4482e-faca-02e9-4a1f-974f6e790ff6.jpeg)


中央のエディタ部に、JavaScriptコードを記述します。以下のようなコードを記述してみましょう。必ず `main` 関数を定義してください。

```js
async function main (data) {
    // call your sub function
    const res = await sub(data);
    return res;
}

// you can define your sub-functions. (but should be kept to a minimum chars)
async function sub(data){
    return new Promise((resolve, reject) => {
        var ok = true; //some logics;
        if (ok) {
            resolve({result: "OK", data }); // return {result: "OK" } object to API result
        } else {
            reject({result: "NG", data });
        }
    });
}
```

この時、外部からリクエストするパラメーターは `data.params` の中に入っています。また、ベースになる `data` は、実行ユーザー情報が含まれています。

```json
{
	"u_id": "62bac0fd2c87b9c2bf23a313",
	"user_name": "username",
	"email": "user@example.jp",
	"w_id": "644f6e5ab30d853869ec919f",
	"ws_key": "development",
	"p_id": "650a30501222568b1ae7a2c2",
	"p_display_id": "APP-FPtta3Hk",
	"real_ip": "",
	"user_code": ""
}
```

レスポンスはJSONなどを返せば、そのままAPIのレスポンスとして返されます。

## プログラム拡張の呼び出し

プログラム拡張を呼び出すには、 `execute` メソッドを使います。このメソッドは、プログラム拡張のIDと、パラメーターを指定します。 `program_id` はプログラム拡張の、関数IDになります。

```ts
const res = await project.execute('program_id', {name: 'value'});
```

レスポンスの形式は任意なので、TypeScriptの場合はジェネリクスを使って定義します。

```ts
interface Response {
	result: string;
	data: any;
}
const res = await project.execute<Response>('program_id', {name: 'value'});

console.log(res.result);
```

## まとめ

Hexabaseのプログラム拡張を使えば、サーバーがなくとも自分の書いたコードをサーバー上で実行できます。CORS制限や、セキュリティキーなどを公開せずにプログラミングコードを実行できるので安全です。

Hexabaseを使いこなす上でも、ぜひプログラム拡張を使ってみてください。

[Hexabase \| 新規事業向け開発・競争領域でのDX実現をサポート](https://www.hexabase.com/)