@readerseye2/cr_type 1.0.71 → 1.0.72

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/index.d.ts CHANGED
@@ -2,3 +2,4 @@ export * from './session/session.type';
2
2
  export * from './socket';
3
3
  export * from './book';
4
4
  export * from './ast';
5
+ export * from './viewer/viewerEvent.types';
package/dist/index.js CHANGED
@@ -19,3 +19,4 @@ __exportStar(require("./session/session.type"), exports);
19
19
  __exportStar(require("./socket"), exports); // socket 전체 export
20
20
  __exportStar(require("./book"), exports);
21
21
  __exportStar(require("./ast"), exports); // AST 타입 (SectionData, Block 등)
22
+ __exportStar(require("./viewer/viewerEvent.types"), exports); // 뷰어 이벤트/스냅샷 타입
@@ -1,4 +1,4 @@
1
- import { ViewerEvent, ViewerSnapshot, ReadingSessionInfo } from './reading-section.types';
1
+ import { SocketViewerEvent, ViewerSnapshot, ReadingSessionInfo } from './reading-section.types';
2
2
  /** 모니터링 메타 정보 (S3 meta.json) */
3
3
  export interface MonitorMeta {
4
4
  targetSocketId: string;
@@ -18,7 +18,7 @@ export interface MonitorChunk {
18
18
  readingSessionId: string | null;
19
19
  sectionId: string | null;
20
20
  bookIdx: number | null;
21
- events: ViewerEvent[];
21
+ events: SocketViewerEvent[];
22
22
  snapshot: ViewerSnapshot | null;
23
23
  /** 청크 생성 주기 (ms) */
24
24
  delayMs: number;
@@ -1,38 +1,20 @@
1
- /** 재생에 필요한 뷰어 설정 상태 (CRViewerState의 핵심 필드) */
2
- export interface ViewerStateSnapshot {
3
- mode: 'scroll' | 'page';
4
- theme: 'light' | 'dark' | 'sepia' | 'green';
5
- fontFamily: string;
6
- fontSizePx: number;
7
- lineHeight: number;
8
- marginX: number;
9
- marginY: number;
10
- pointerStyle: 'highlight' | 'underline';
11
- pointerColor: string;
12
- breakMarks: {
13
- slash: boolean;
14
- };
15
- breakGapPx: number;
16
- showPointer: boolean;
17
- showSplit: boolean;
18
- }
19
- /** 뷰어 스냅샷 (현재 상태) */
1
+ import type { ViewerEventType, RecordingViewerState } from '../viewer/viewerEvent.types';
2
+ /** 뷰어 설정 상태 (CRViewerState에서 재사용) */
3
+ export type ViewerStateSnapshot = RecordingViewerState;
4
+ /** 뷰어 스냅샷 (소켓 통신용 - 현재 읽기 상태) */
20
5
  export interface ViewerSnapshot {
21
6
  viewMode: 'scroll' | 'page';
22
7
  globalRunIndex: number;
23
8
  pageIndex?: number;
24
9
  scrollPosition?: number;
25
10
  totalItems: number;
26
- /** 뷰어 너비 (재생 시 동일 크기로 렌더링) */
27
11
  viewportWidth?: number;
28
- /** 뷰어 높이 (재생 시 동일 크기로 렌더링) */
29
12
  viewportHeight?: number;
30
- /** 뷰어 설정 상태 (재생 시 동일하게 적용) */
31
13
  viewerState?: ViewerStateSnapshot;
32
14
  }
33
- /** 뷰어 이벤트 */
34
- export interface ViewerEvent {
35
- type: 'page_change' | 'scroll' | 'overlay_toggle' | 'range_select' | 'quiz_answer' | 'gi_change' | 'global_index_change' | 'section_change' | 'mode_change' | 'settings_change' | 'viewer_state_snapshot' | 'recording_start' | 'recording_stop' | 'audio_control';
15
+ /** 소켓 전송용 뷰어 이벤트 (간소화된 형태) */
16
+ export interface SocketViewerEvent {
17
+ type: ViewerEventType | 'overlay_toggle' | 'range_select' | 'quiz_answer' | 'gi_change';
36
18
  timestamp: number;
37
19
  data: Record<string, unknown>;
38
20
  }
@@ -83,7 +65,7 @@ export interface SessionProgressPayload {
83
65
  }
84
66
  /** 이벤트 배치 전송 페이로드 */
85
67
  export interface SessionEventPayload {
86
- events: ViewerEvent[];
68
+ events: SocketViewerEvent[];
87
69
  }
88
70
  /** 세션 구독 페이로드 (Admin용) */
89
71
  export interface SessionSubscribePayload {
@@ -125,7 +107,7 @@ export interface SessionProgressResponse {
125
107
  /** 세션 이벤트 응답 */
126
108
  export interface SessionEventsResponse {
127
109
  sessionId: string;
128
- events: ViewerEvent[];
110
+ events: SocketViewerEvent[];
129
111
  }
130
112
  /** 세션 목록 응답 */
131
113
  export interface SessionListResponse {
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  // src/socket/reading-section.types.ts
3
3
  // 읽기 섹션 모니터링용 데이터 타입 정의
4
- // 이벤트 인터페이스는 socket-clientToServerEvents.type.ts, socket-serverToClientEvents.type.ts 참조
4
+ // 뷰어 이벤트 타입은 viewer/viewerEvent.types.ts에서 가져옴
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,5 +1,5 @@
1
1
  import { MessageReadResponse, MessageResponse, NoticeMessageResult } from "./socket-message.types";
2
- import { ReadingSessionInfo, ViewerEvent, ViewerSnapshot } from "./reading-section.types";
2
+ import { ReadingSessionInfo, SocketViewerEvent, ViewerSnapshot } from "./reading-section.types";
3
3
  import { ConnectedUser, ConnectedUsersGrouped } from "./connected-user.types";
4
4
  import { MonitorStartedPayload, MonitorChunkPayload, MonitorSessionChangedPayload, MonitorStoppedPayload, MonitorErrorPayload } from "./monitor.types";
5
5
  export interface ServerToClientEvents {
@@ -35,7 +35,7 @@ export interface ReadingServerToClientEvents {
35
35
  }) => void;
36
36
  'reading-section:events': (payload: {
37
37
  sessionId: string;
38
- events: ViewerEvent[];
38
+ events: SocketViewerEvent[];
39
39
  }) => void;
40
40
  'reading-section:error': (payload: {
41
41
  message: string;
@@ -0,0 +1,132 @@
1
+ export type ViewerMode = 'scroll' | 'page';
2
+ export type ViewerTheme = 'light' | 'dark' | 'sepia' | 'green';
3
+ export type PointerStyle = 'highlight' | 'underline';
4
+ /** 뷰어 전체 상태 (CR_viewer store 상태) */
5
+ export type CRViewerState = {
6
+ mode: ViewerMode;
7
+ theme: ViewerTheme;
8
+ fontFamily: string;
9
+ fontSizePx: number;
10
+ lineHeight: number;
11
+ marginX: number;
12
+ marginY: number;
13
+ showOverlays: boolean;
14
+ isSettingsOpen: boolean;
15
+ pointerStyle: PointerStyle;
16
+ pointerColor: string;
17
+ breakMarks: {
18
+ slash: boolean;
19
+ };
20
+ breakGapPx: number;
21
+ muteAudio: boolean;
22
+ audioTargetWpm: number;
23
+ audioSpeed: number;
24
+ showPointer: boolean;
25
+ showSplit: boolean;
26
+ viewportWidth: number;
27
+ viewportHeight: number;
28
+ playbackViewportWidth: number;
29
+ playbackViewportHeight: number;
30
+ };
31
+ /** 뷰어 이벤트 타입 */
32
+ export type ViewerEventType = 'recording_start' | 'recording_stop' | 'global_index_change' | 'scroll' | 'page_change' | 'section_change' | 'mode_change' | 'settings_change' | 'viewer_state_snapshot' | 'render_start' | 'loading_start' | 'loading_end' | 'viewport_resize' | 'audio_control';
33
+ /** 오디오 상태 스냅샷 */
34
+ export type AudioSnapshot = {
35
+ status: 'idle' | 'loading' | 'playing' | 'paused' | 'ended' | 'error';
36
+ currentClip: number;
37
+ currentTimeMs: number;
38
+ };
39
+ /** 녹화용 뷰어 상태 (Partial - 모든 필드가 필수는 아님) */
40
+ export type RecordingViewerState = Partial<CRViewerState>;
41
+ /** 녹화 시작 시 저장할 초기 스냅샷 */
42
+ export type RecordingSnapshot = {
43
+ viewerState: RecordingViewerState;
44
+ globalIndex: number;
45
+ scrollY?: number;
46
+ anchorGI?: number;
47
+ anchorOffsetRatio?: number;
48
+ currentPage?: number;
49
+ sectionId: string;
50
+ viewportWidth: number;
51
+ viewportHeight: number;
52
+ audio?: AudioSnapshot;
53
+ };
54
+ /** 기본 이벤트 (뷰어에서 emit) */
55
+ export type ViewerEventBase<T extends ViewerEventType, P = Record<string, unknown>> = {
56
+ type: T;
57
+ timestamp: number;
58
+ payload: P;
59
+ };
60
+ /** 저장용 이벤트 (외부에서 relTime 추가) */
61
+ export type StoredViewerEvent<T extends ViewerEventType, P = Record<string, unknown>> = ViewerEventBase<T, P> & {
62
+ relTime: number;
63
+ };
64
+ /** 오디오 제어 액션 타입 */
65
+ export type AudioControlAction = 'play' | 'pause' | 'stop';
66
+ export type RecordingStartEvent = ViewerEventBase<'recording_start', {
67
+ snapshot: RecordingSnapshot;
68
+ }>;
69
+ export type RecordingStopEvent = ViewerEventBase<'recording_stop', {
70
+ duration: number;
71
+ }>;
72
+ export type GlobalIndexChangeEvent = ViewerEventBase<'global_index_change', {
73
+ globalIndex: number;
74
+ }>;
75
+ export type ScrollEvent = ViewerEventBase<'scroll', {
76
+ scrollTop: number;
77
+ scrollRatio: number;
78
+ anchorGI: number;
79
+ anchorOffsetRatio: number;
80
+ }>;
81
+ export type PageChangeEvent = ViewerEventBase<'page_change', {
82
+ page: number;
83
+ }>;
84
+ export type SectionChangeEvent = ViewerEventBase<'section_change', {
85
+ sectionId: string;
86
+ }>;
87
+ export type ModeChangeEvent = ViewerEventBase<'mode_change', {
88
+ mode: ViewerMode;
89
+ }>;
90
+ export type SettingsChangeEvent = ViewerEventBase<'settings_change', {
91
+ key: keyof CRViewerState;
92
+ value: unknown;
93
+ }>;
94
+ export type ViewerStateSnapshotEvent = ViewerEventBase<'viewer_state_snapshot', {
95
+ viewerState: CRViewerState;
96
+ }>;
97
+ export type RenderStartEvent = ViewerEventBase<'render_start', {
98
+ sectionId: string;
99
+ }>;
100
+ export type LoadingStartEvent = ViewerEventBase<'loading_start', Record<string, never>>;
101
+ export type LoadingEndEvent = ViewerEventBase<'loading_end', {
102
+ duration: number;
103
+ }>;
104
+ export type ViewportResizeEvent = ViewerEventBase<'viewport_resize', {
105
+ width: number;
106
+ height: number;
107
+ }>;
108
+ export type AudioControlEvent = ViewerEventBase<'audio_control', {
109
+ action: AudioControlAction;
110
+ }>;
111
+ /** 모든 뷰어 이벤트 타입 (Union) */
112
+ export type ViewerEvent = RecordingStartEvent | RecordingStopEvent | GlobalIndexChangeEvent | ScrollEvent | PageChangeEvent | SectionChangeEvent | ModeChangeEvent | SettingsChangeEvent | ViewerStateSnapshotEvent | RenderStartEvent | LoadingStartEvent | LoadingEndEvent | ViewportResizeEvent | AudioControlEvent;
113
+ export type ViewerEventCallback = (event: ViewerEvent) => void;
114
+ /** 저장용 이벤트 (any type) */
115
+ export type StoredEvent = StoredViewerEvent<ViewerEventType, unknown>;
116
+ /** 녹화 청크 */
117
+ export type RecordingChunk = {
118
+ index: number;
119
+ startTime: number;
120
+ endTime: number;
121
+ snapshot: RecordingSnapshot;
122
+ events: StoredEvent[];
123
+ };
124
+ /** 녹화 메타데이터 */
125
+ export type RecordingMeta = {
126
+ id: string;
127
+ startedAt: number;
128
+ totalDuration: number;
129
+ chunkDuration: number;
130
+ chunkCount: number;
131
+ sectionId: string;
132
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // src/viewer/viewerEvent.types.ts
3
+ // CR_viewer 이벤트 및 스냅샷 타입 정의
4
+ // 모든 프로젝트(CR_viewer, CR_app, CR_admin, CR_ws)에서 이 타입을 사용
5
+ Object.defineProperty(exports, "__esModule", { value: true });
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@readerseye2/cr_type",
3
- "version": "1.0.71",
3
+ "version": "1.0.72",
4
4
  "description": "CheckReading shared TypeScript types",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",