コンテンツにスキップ
UniKVS
Esc
↑↓移動↵開く⌘Jプレビュー
このページの内容

ストリーム

@unikvs/core のストリーム型。Web 標準ストリームのエイリアスとチャンク型の扱い、変換との関係を説明します。

概要

ストリーム型は Web 標準のエイリアスです。独自の実装は持ちません。IStorage のストリーム取得や、変換系コンテキストの source・destination で使われます。

型 実体 説明
IReadableStream<T> ReadableStream<T> 読み取り用ストリーム
IWritableStream<T> WritableStream<T> 書き込み用ストリーム
ITransformStream<TIn, TOut> { readable, writable } readable: IReadableStream<TOut> と writable: IWritableStream<TIn> の組
import type { IReadableStream, IWritableStream, ITransformStream } from "@unikvs/core";

declare const readable: IReadableStream<Uint8Array>;
declare const writable: IWritableStream<Uint8Array>;
declare const transform: ITransformStream<ArrayBuffer, number>;

const out: IReadableStream<number> = transform.readable;
const input: IWritableStream<ArrayBuffer> = transform.writable;

チャンクの型

チャンク型は使う側の型引数で決まります。読み書きのデータ型と混同しないよう、型引数の位置を確認します。

使う側 チャンクを決める型引数 既定値
IStorage<TWriteData, TReadData, TWriteChunk, TReadChunk> TWriteChunk・TReadChunk any・TWriteChunk
IMiddleware<TEncodeData, TDecodeData, TEncodeChunk, TDecodeChunk> TEncodeChunk・TDecodeChunk any
import type { IStorage } from "@unikvs/core";

// 書き込みチャンクは ArrayBuffer、読み取りチャンクは number
type Foursome = IStorage<Uint8Array, string, ArrayBuffer, number>;

// getWritable は IWritableStream<ArrayBuffer> を返し、
// getReadable は IReadableStream<number> を返す

TReadChunk を省略すると TWriteChunk が使われます。チャンクを使わないストレージやミドルウェアでは、チャンクの型引数を省略して any のままにします。

変換との関係

変換系のコンテキストでは、データ変換とストリーム変換で source・destination の中身が変わります。

変換の種類 コンテキスト source・destination の中身
データ変換 IEncodeContext・IDecodeContext 値そのもの
ストリーム変換 IEncodeStreamContext・IDecodeStreamContext IReadableStream
import type { IEncodeContext, IEncodeStreamContext, IReadableStream } from "@unikvs/core";

declare const dataCtx: IEncodeContext<string, number>;
const srcValue: string = dataCtx.source; // 値
const destValue: number | undefined = dataCtx.destination;

declare const streamCtx: IEncodeStreamContext<ArrayBuffer, number>;
const srcStream: IReadableStream<ArrayBuffer> = streamCtx.source; // ストリーム
const destStream: IReadableStream<number> | undefined = streamCtx.destination;

ストリーム変換では、チャンクではなくストリーム全体を差し替える点に注意します。チャンク単位の変換は、ストリームの中身として TransformStream などを組み立てて destination に代入します。

使用例

ストレージ側でストリーム取得を実装する例です。getReadable は読み取り用のストリームを、getWritable は書き込み用のストリームを返します。

import type { IReadableStream, IStorage, IWritableStream } from "@unikvs/core";

export class ChunkedMemory implements IStorage<Uint8Array, Uint8Array, Uint8Array> {
  public readonly name = "ChunkedMemory";
  public isOpen = false;
  private readonly data = new Map<string, Uint8Array[]>();

  public getWritable(c: IStorage.GetWritableContext): IWritableStream<Uint8Array> {
    const chunks: Uint8Array[] = [];
    return new WritableStream<Uint8Array>({
      write: (chunk) => {
        chunks.push(chunk);
      },
      close: () => {
        this.data.set(c.key, chunks);
      },
    });
  }

  public getReadable(c: IStorage.GetReadableContext): IReadableStream<Uint8Array> {
    const chunks = this.data.get(c.key) ?? [];
    return new ReadableStream<Uint8Array>({
      start(controller) {
        for (const chunk of chunks) {
          controller.enqueue(chunk);
        }
        controller.close();
      },
    });
  }
}

API リファレンス

ITransformStream

読み取り用と書き込み用のストリームの組です。

プロパティ型
readableIReadableStream<TOut>

読み取り用ストリームです。

型IReadableStream<TOut>
writableIWritableStream<TIn>

書き込み用ストリームです。

型IWritableStream<TIn>

このページは役に立ちましたか?