メインコンテンツへスキップ

コンポーネントと状態のユーティリティ

@blocklet/metaライブラリは、BlockletStateオブジェクトとの対話を簡素化するために設計された、包括的なユーティリティ関数のスイートを提供します。Blocklet、特に複合Blockletは、コンポーネントのツリーとして表現されます。これらのユーティリティは、このツリーを走査し

@blocklet/metaライブラリは、BlockletStateオブジェクトとの対話を簡素化するために設計された、包括的なユーティリティ関数のスイートを提供します。Blocklet、特に複合Blockletは、コンポーネントのツリーとして表現されます。これらのユーティリティは、このツリーを走査し、特定のコンポーネントを見つけ、その状態を確認し、ランタイム操作、UIレンダリング、および管理タスクのための重要な情報を抽出するための強力で効率的な方法を提供します。

このセクションでは、ツリー走査、コンポーネント検索、状態確認、設定管理、および情報抽出のための関数について説明します。

ツリー走査

これらの関数を使用すると、Blockletアプリケーションのコンポーネントツリーを反復処理できます。これらは、すべてのコンポーネントに操作を適用したり、データを集約したりするための基本です。

forEachBlocklet & forEachBlockletSync

中心となる走査関数です。forEachBlockletは非同期で、直列(デフォルト)または並列で実行できます。一方、forEachBlockletSyncはその同期版です。

Function Signature

typescript
function forEachBlocklet(
  blocklet: TComponentPro,
  cb: (blocklet: TComponentPro, context: object) => any,
  options?: {
    parallel?: boolean;
    concurrencyLimit?: number;
    sync?: boolean;
  }
): Promise<any> | null;

function forEachBlockletSync(
  blocklet: any,
  cb: Function
): void;

コールバック関数 cb は、現在のコンポーネントと { parent, root, level, ancestors, id } を含むコンテキストオブジェクトを受け取ります。

例:すべてのコンポーネントDIDを収集する

javascript
import { forEachBlockletSync } from '@blocklet/meta/lib/util';

const appState = {
  meta: { did: 'z1' },
  children: [
    { meta: { did: 'z2' } },
    {
      meta: { did: 'z3' },
      children: [{ meta: { did: 'z4' } }],
    },
  ],
};

const allDids = [];
forEachBlockletSync(appState, (component) => {
  if (component.meta?.did) {
    allDids.push(component.meta.did);
  }
});

console.log(allDids);
// Output: ['z1', 'z2', 'z3', 'z4']

forEachChild & forEachChildSync

これらは forEachBlocklet のラッパーであり、ルートBlocklet自体(level > 0 の場合)をスキップして、Blockletのすべての子孫を便利に反復処理します。

コンポーネントの検索とフィルタリング

状態ツリー内で特定のコンポーネントを見つけることは一般的な要件です。これらの関数は、さまざまな基準に基づいて1つ以上のコンポーネントを見つけるためのさまざまな方法を提供します。

findComponent

コンポーネントツリーを走査し、提供された述語関数を満たす最初のコンポーネントを返す汎用検索関数です。

Function Signature

typescript
function findComponent(
  blocklet: TComponent,
  isEqualFn: (component: TComponent, context: { ancestors: Array<TComponent> }) => boolean
): TComponent | null;

例:bundleNameでコンポーネントを検索する

javascript
import { findComponent } from '@blocklet/meta/lib/util';

const appState = {
  meta: { did: 'z1', bundleName: 'app' },
  children: [
    { meta: { did: 'z2', bundleName: 'component-a' } },
    { meta: { did: 'z3', bundleName: 'component-b' } },
  ],
};

const componentB = findComponent(
  appState,
  (component) => component.meta?.bundleName === 'component-b'
);

console.log(componentB.meta.did);
// Output: 'z3'

findComponentById

findComponent の特化版で、一意の複合ID(例: app-did/component-did)でコンポーネントを検索します。

Function Signature

typescript
function findComponentById(
  blocklet: TComponent,
  componentId: string | string[]
): TComponent | null;

filterComponentsV2

アプリの直接の子を反復処理し、述語関数を満たすすべてのコンポーネントの配列を返します。

IDと命名

これらのユーティリティは、アプリケーションの状態内のコンポーネントのさまざまな識別子と名前を生成および取得するのに役立ちます。

FunctionDescription
getComponentId先祖のDIDを使用して、コンポーネントの一意なパスベースのIDを構築します(例:root_did/child_did)。
getComponentName先祖の名前を使用して、コンポーネントの一意なパスベースの名前を構築します。
getParentComponentName指定されたコンポーネント名パスから親コンポーネントの名前を抽出します。
getAppNameBlockletの表示名を取得します。メタデータよりも BLOCKLET_APP_NAME 環境変数を優先します。
getAppDescriptionBlockletの説明を取得します。BLOCKLET_APP_DESCRIPTION を優先します。
getComponentProcessIdファイルシステムエラーを防ぐために長い名前にMD5ハッシュを使用して、コンポーネントのファイルシステムセーフなプロセスIDを生成します。

設定と状態管理

設定の管理は、特に設定を共有できる複合Blockletにおいて重要です。これらのヘルパーはそのプロセスを簡素化します。

getSharedConfigObj

アプリケーション内の特定のコンポーネントの共有設定オブジェクトを計算します。親アプリケーションと shared: true とマークされた兄弟コンポーネントからの設定をインテリジェントにマージします。

getAppMissingConfigs & getComponentMissingConfigs

これらの関数は検証に不可欠です。アプリケーションまたは単一のコンポーネントをスキャンし、required: true とマークされているが、直接または共有設定メカニズムを介して値が割り当てられていないすべての設定のリストを返します。

例:不足している設定の確認

javascript
import { getAppMissingConfigs } from '@blocklet/meta/lib/util';

const appWithMissingConfig = {
  meta: { did: 'z1' },
  children: [
    {
      meta: { did: 'z2' },
      configs: [
        { key: 'API_KEY', required: true, value: null, description: 'Service API Key' },
      ],
    },
  ],
};

const missing = getAppMissingConfigs(appWithMissingConfig);

console.log(missing);
// Output: [{ did: 'z2', key: 'API_KEY', description: 'Service API Key' }]

wipeSensitiveData

Blockletの状態オブジェクトのディープクローンを作成し、すべての機密情報を編集するセキュリティ重視のユーティリティです。secure: true とマークされたフィールドの値と、特定の機密環境変数(BLOCKLET_APP_SKなど)の値を __encrypted__ に置き換えます。

状態チェック

これらのブール関数は、生のステータスコードを直接処理することなく、Blockletまたはコンポーネントの現在の状態を確認する簡単な方法を提供します。

FunctionDescriptionCorresponding Statuses
isRunningコンポーネントが安定した実行状態にあるかどうかを確認します。running
isInProgressコンポーネントが移行状態にあるかどうかを確認します。downloading、installing、starting、stopping、upgradingなど。
isBeforeInstalledコンポーネントが最初のインストールをまだ完了していないかどうかを確認します。added、waiting、downloading、installing
isAccessibleコンポーネントのWebインターフェースがアクセス可能である可能性があるかどうかを確認します。running、waiting、downloading

インターフェースとサービスの検出

Blockletのメタデータで定義されたインターフェースとサービスを見つけるためのユーティリティです。

FunctionDescription
findWebInterfaceコンポーネントのメタデータ内で最初の web タイプのインターフェースを見つけます。
findDockerInterfaceコンポーネントのメタデータ内で最初の docker タイプのインターフェースを見つけます。
findWebInterfacePortコンポーネントのWebインターフェースにマッピングされたホストポートを取得します。
getBlockletServicesBlocklet内のすべてのコンポーネントで定義されているすべてのサービスのフラットなリストを返します。これには、名前、プロトコル、ポートの詳細が含まれます。

情報抽出

これらの関数は、生のBlocklet状態から特定の処理済み情報を抽出します。

getComponentsInternalInfo

この関数はBlockletアプリケーションを走査し、各コンポーネントの主要な内部詳細を含む構造化された配列を返します。これはシステム管理やサービス間通信に非常に便利です。

戻り値

  • components array — 内部コンポーネント情報オブジェクトの配列。
    • title string — コンポーネントの表示タイトル。
    • did string — コンポーネントの一意のDID。
    • name string — コンポーネントの機械可読名。
    • version string — コンポーネントのバージョン。
    • mountPoint string — コンポーネントがマウントされているURLパス。
    • status number — コンポーネントの数値ステータスコード。
    • port number — コンポーネントのWebインターフェースに割り当てられたホストポート。
    • containerPort string — Webインターフェースの内部コンテナポート。
    • resourcesV2 array — コンポーネントにバンドルされているリソースアセットのリスト。
      • path string — リソースへの絶対パス。
      • public boolean — リソースが公開アクセス可能かどうかを示します。
    • group string — コンポーネントの機能グループ(例:'gateway'、'dapp')。

getMountPoints

コンポーネントツリー全体をスキャンし、マウントポイントを持つすべてのコンポーネントの構造化されたリストを返します。これにより、ナビゲーションやルーティングテーブルの構築が容易になります。

getAppUrl

site.domainAliases を分析して、Blockletアプリケーションのプライマリなユーザー向けURLを決定します。アクセス可能で保護されていないURLを優先するようにドメインをインテリジェントにソートします。

その他のユーティリティ

その他の便利なチェックとヘルパーのコレクション。

FunctionDescription
isFreeBlockletBlockletの支払い価格がゼロであるかどうかを確認します。
isDeletableBlockletBLOCKLET_DELETABLE 環境変数に基づいてBlockletの削除が許可されているかどうかを確認します。
hasRunnableComponentアプリケーションに実行可能な非ゲートウェイコンポーネントが含まれているかどうかを判断します。
isExternalBlockletBlockletが外部コントローラーによって管理されているかどうかを確認します。
isGatewayBlockletコンポーネントのグループが gateway であるかどうかを確認します。
isPackBlockletコンポーネントのグループが pack であるかどうかを確認します。
hasStartEngineコンポーネントのメタデータが起動可能なエンジン(例:main または docker.image)を定義しているかどうかを確認します。
hasMountPointコンポーネントがその設定に基づいてマウントポイントを持つべきかどうかを判断します。
getBlockletChainInfoBlockletとその子からチェーン設定(タイプ、ID、ホスト)を抽出し、統合します。
checkPublicAccessBlockletのセキュリティ設定がパブリックアクセスを許可しているかどうかを確認します。