LineSplitTransform 은 스트림에서 받은 바이너리 데이터(Uint8Array)를 텍스트로 변환하고 줄바꿈 기준으로 나누기 위한 TransformStream 구현이다.
연속적인 데이터 청크를 처리하면서 각 줄을 별도로 출력하므로 로그 파일이나 큰 텍스트 파일을 순차 처리할 때 적합하다.
구현
TextDecoder 로 바이트열을 문자열로 변환하고, 정규식 /\r?\n/ 으로 줄바꿈마다 분할한다.
버퍼에 남아 있는 미완성 줄은 다음 청크에서 이어 받고, 스트림 종료 시 남은 내용도 함께 출력하는 구조다.
export class LineSplitTransform extends TransformStream<Uint8Array, string> { constructor() { let buffer = ""; const decoder = new TextDecoder(); const delimiterRegex = /\r?\n/;
super({ transform(chunk, ctrl) { buffer += decoder.decode(chunk, { stream: true }); const lines = buffer.split(delimiterRegex); buffer = lines.pop() || "";
for (const line of lines) { ctrl.enqueue(line); } }, flush(ctrl) { buffer += decoder.decode(); if (buffer.length > 0) { ctrl.enqueue(buffer); } }, }); }}사용 예시
표준 입력 데이터를 LineSplitTransform 에 흘려 보내 줄 단위로 나누고, 각 줄을 콘솔에 출력하는 예시다.
import { LineSplitTransform } from './LineSplitTransform';
// 표준 입력을 LineSplitTransform에 연결process.stdin.pipeThrough(new LineSplitTransform()) .on('data', (line: string) => { console.log(`수신한 줄: ${line}`); });활용 장면
- 로그 파일이나 텍스트 파일의 실시간 분석
- 네트워크에서 수신한 데이터의 순차적인 줄 처리
- 줄바꿈 구분 텍스트 프로토콜 구현
정리
TransformStream 을 사용하면 스트림 데이터를 줄 단위로 처리하는 구조를 간단하게 만들 수 있다.
큰 파일을 한 번에 메모리에 올리지 않고 순차 처리할 수 있어서 메모리 효율이 좋은 텍스트 처리가 가능하다.
hsb.horse