現在ドキュメントは制作段階にあるため、多くの情報が不完全なものになっています

報告は Discord までお願いします

テーブル

概要

キーと値のペアでデータを保存します

定義

omu.tables.json<T>(name, options)
から定義することができます

  • T?: データの型
  • name: テーブルの名前。同じ名前で複数のテーブルを作ることはできません
  • options
    • key: 型Tを引数に取り識別子となるキーを返す関数

以下が定義例です

1
type User = {
2
    id: string;
3
    name: string;
4
}
5

6
// テーブルの定義
7
const users = omu.tables.json<User>('users', {
8
    key: (item) => item.id,
9
});

アイテムの操作

.clear()
を使ってすべてのアイテムを削除します

.add(...items)
,
.update(...items)
を使ってアイテムを追加、編集します

addとupdateはどちらも値を更新しますが、呼び出されるイベントが異なります

.remove(...items)
を使ってアイテムを削除します

1
// 全削除
2
await users.clear();
3

4
// 追加
5
await users.add({
6
    id: 'user-0',
7
    name: 'foo',
8
});
9

10
// 編集
11
await users.update({
12
    id: 'user-0',
13
    name: 'bar',
14
});

アイテムの取得

.fetchAll()
を使ってすべてのアイテムを取得します
.fetchItems({ limit, backward?, cursor? })
を使って指定した量のアイテムを取得します

  • limit: 最大アイテム取得数制限
  • backward?: 最後に追加されたアイテムから取得するかどうか
  • cursor?: 取得する起点となるアイテムのキー

.fetchRange({ start, end })
を使って指定した範囲のアイテムを取得します

  • start: 取得範囲の最初のキー
  • end: 取得範囲の最後のキー
1
// 全取得
2
const allUsers = await users.fetchAll();
3

4
// 最初・最後から指定した数だけ
5
const lastUsers = await users.fetchItems({
6
    limit: 10,
7
    backward: true, // trueの場合後ろ(最後に追加された順)から取得します
8
    // 指定した場所から取得する場合cursorオプションが使えます
9
    // cursor: 'user20'
10
});
11

12
// 2つの範囲をすべて取得
13
const usersInRange = await users.fetchRange({
14
    start: 'user0',
15
    end: 'user10'
16
});

イベントを受け取る

on(event, listener)
で追加、更新、削除などを監視できます。戻り値の関数を呼び出すと、そのリスナーを解除できます。

1
const unlisten = users.on('add', (items) => {
2
    for (const user of items.values()) {
3
        console.log('追加:', user);
4
    }
5
});
6

7
unlisten();

利用できるイベントは次のとおりです。

イベント内容
add
アイテムが追加された
update
アイテムが更新された
remove
アイテムが削除された
clear
テーブルが空になった
cache
ローカルキャッシュが更新された

同じ関数を指定して

off()
から解除することもできます。

1
const onUpdate = (items: Map<string, User>) => {
2
    console.log(items);
3
};
4

5
users.on('update', onUpdate);
6
users.off('update', onUpdate);

継続的に購読する

listen()
を呼ぶとサーバーからの変更を継続的に受信し、テーブルのキャッシュへ反映します。コールバックを渡すと、キャッシュ更新時にも呼び出されます。

1
const unlisten = users.listen((cache) => {
2
    console.log([...cache.values()]);
3
});
4

5
unlisten();

すべてのアイテムを順番に処理する

データ量が多い場合は

iterate()
を使うと、すべてのアイテムを一度に読み込まず順番に処理できます。

1
for await (const user of users.iterate({ backward: false })) {
2
    console.log(user);
3
}

キャッシュ

cache
からローカルに読み込まれている値を同期的に取得できます。キャッシュにない値もあるため、確実に取得する場合は
get()
や
fetchItems()
を使ってください。

1
const cachedUser = users.cache.get('user0');
2

3
users.setCacheSize(500);