@readerseye2/cr_type 1.0.83 → 1.0.85

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.
@@ -1,3 +1,4 @@
1
+ export * from './viewer-events.types';
1
2
  export * from './socket-clientToServerEvents.type';
2
3
  export * from './socket-serverToClientEvents.type';
3
4
  export * from './socket-message.types';
@@ -15,6 +15,7 @@ var __exportStar = (this && this.__exportStar) || function(m, exports) {
15
15
  };
16
16
  Object.defineProperty(exports, "__esModule", { value: true });
17
17
  // src/socket/index.ts
18
+ __exportStar(require("./viewer-events.types"), exports);
18
19
  __exportStar(require("./socket-clientToServerEvents.type"), exports);
19
20
  __exportStar(require("./socket-serverToClientEvents.type"), exports);
20
21
  __exportStar(require("./socket-message.types"), exports);
@@ -1,5 +1,4 @@
1
- /** 뷰어 설정 상태 (소켓 통신용, 유연한 구조) */
2
- export type ViewerStateSnapshot = Record<string, unknown>;
1
+ import type { CRViewerState, ViewerEvent, AudioSnapshot } from './viewer-events.types';
3
2
  /** 뷰어 스냅샷 (소켓 통신용 - 현재 읽기 상태) */
4
3
  export interface ViewerSnapshot {
5
4
  viewMode: 'scroll' | 'page';
@@ -9,26 +8,10 @@ export interface ViewerSnapshot {
9
8
  totalItems: number;
10
9
  viewportWidth?: number;
11
10
  viewportHeight?: number;
12
- viewerState?: ViewerStateSnapshot;
13
- }
14
- /** 소켓 전송용 뷰어 이벤트 (간소화된 형태) */
15
- export interface SocketViewerEvent {
16
- type: string;
17
- timestamp: number;
18
- data: Record<string, unknown>;
19
- }
20
- /** 뷰어 초기 설정 */
21
- export interface ViewerConfig {
22
- fontSize?: number;
23
- lineHeight?: number;
24
- theme?: 'light' | 'dark' | 'sepia';
25
- viewMode?: 'scroll' | 'page';
26
- }
27
- /** 읽기 진행 상황 */
28
- export interface ReadingProgress {
29
- currentPage?: number;
30
- totalPages?: number;
31
- percentage?: number;
11
+ viewerState?: Partial<CRViewerState>;
12
+ anchorGI?: number;
13
+ anchorOffsetRatio?: number;
14
+ audio?: AudioSnapshot;
32
15
  }
33
16
  /** 책/섹션 메타데이터 */
34
17
  export interface SessionMeta {
@@ -48,7 +31,6 @@ export interface SessionStartPayload {
48
31
  bookIdx: number;
49
32
  sectionId: string;
50
33
  snapshot: ViewerSnapshot;
51
- viewerConfig?: ViewerConfig;
52
34
  meta?: SessionMeta;
53
35
  }
54
36
  /** 섹션 읽기 종료 페이로드 */
@@ -60,11 +42,10 @@ export interface SessionEndPayload {
60
42
  /** 진행 상황 업데이트 페이로드 */
61
43
  export interface SessionProgressPayload {
62
44
  snapshot: ViewerSnapshot;
63
- progress?: ReadingProgress;
64
45
  }
65
46
  /** 이벤트 배치 전송 페이로드 */
66
47
  export interface SessionEventPayload {
67
- events: SocketViewerEvent[];
48
+ events: ViewerEvent[];
68
49
  }
69
50
  /** 세션 구독 페이로드 (Admin용) */
70
51
  export interface SessionSubscribePayload {
@@ -84,7 +65,6 @@ export interface ReadingSessionInfo {
84
65
  totalSections?: number;
85
66
  startedAt: string;
86
67
  snapshot: ViewerSnapshot;
87
- viewerConfig?: ViewerConfig;
88
68
  lastEventAt?: string;
89
69
  }
90
70
  /** 세션 시작 응답 */
@@ -101,12 +81,11 @@ export interface SessionEndedResponse {
101
81
  export interface SessionProgressResponse {
102
82
  sessionId: string;
103
83
  snapshot: ViewerSnapshot;
104
- progress?: ReadingProgress;
105
84
  }
106
85
  /** 세션 이벤트 응답 */
107
86
  export interface SessionEventsResponse {
108
87
  sessionId: string;
109
- events: SocketViewerEvent[];
88
+ events: ViewerEvent[];
110
89
  }
111
90
  /** 세션 목록 응답 */
112
91
  export interface SessionListResponse {
@@ -1,5 +1,5 @@
1
1
  "use strict";
2
2
  // src/socket/reading-section.types.ts
3
3
  // 읽기 섹션 모니터링용 데이터 타입 정의
4
- // 뷰어 이벤트 상세 타입은 @readerseye2/cr_viewer에서 정의
4
+ // 뷰어 이벤트 상세 타입은 viewer-events.types.ts에서 정의
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
@@ -1,4 +1,5 @@
1
- import type { ViewerSnapshot, SocketViewerEvent } from './reading-section.types';
1
+ import type { ViewerSnapshot } from './reading-section.types';
2
+ import type { ViewerEvent } from './viewer-events.types';
2
3
  /** 녹화 요청자 타입 */
3
4
  export type RecordingRequesterType = 'admin' | 'parent';
4
5
  /** 뷰어 사용자 타입 (실제로 책 읽는 사람) */
@@ -15,7 +16,7 @@ export type SegmentStatus = 'active' | 'ended';
15
16
  export interface ChunkFile {
16
17
  startTimestamp: number;
17
18
  endTimestamp: number;
18
- events: SocketViewerEvent[];
19
+ events: ViewerEvent[];
19
20
  /** 청크 시작 시점의 뷰어 상태 (Seek 시 이 상태로 초기화 후 이벤트 재생) */
20
21
  snapshot?: ViewerSnapshot;
21
22
  }
@@ -283,7 +284,7 @@ export interface ActiveSegment {
283
284
  sectionId: string;
284
285
  sectionTitle?: string;
285
286
  startedAt: number;
286
- eventBuffer: SocketViewerEvent[];
287
+ eventBuffer: ViewerEvent[];
287
288
  chunkStartTimestamp: number;
288
289
  /** 현재 청크 시작 시점의 스냅샷 (청크에 포함됨) */
289
290
  chunkStartSnapshot: ViewerSnapshot | null;
@@ -1,5 +1,6 @@
1
1
  import { MessageReadResponse, MessageResponse, NoticeMessageResult } from "./socket-message.types";
2
- import { ReadingSessionInfo, SocketViewerEvent, ViewerSnapshot } from "./reading-section.types";
2
+ import { ReadingSessionInfo, ViewerSnapshot } from "./reading-section.types";
3
+ import { ViewerEvent } from "./viewer-events.types";
3
4
  import { ConnectedUser, ConnectedUsersGrouped } from "./connected-user.types";
4
5
  import { RecordingStartedPayload, RecordingStoppedPayload, RecordingChunkPayload, SegmentStartedPayload, SegmentEndedPayload, RecordingListResultPayload, RecordingManifestPayload, SegmentMetaPayload, ChunksResultPayload } from "./recording.types";
5
6
  export interface ServerToClientEvents {
@@ -35,7 +36,7 @@ export interface ReadingServerToClientEvents {
35
36
  }) => void;
36
37
  'reading-section:events': (payload: {
37
38
  sessionId: string;
38
- events: SocketViewerEvent[];
39
+ events: ViewerEvent[];
39
40
  }) => void;
40
41
  'reading-section:error': (payload: {
41
42
  message: string;
@@ -0,0 +1,124 @@
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
+ /** 컴팩트 오버레이 모드 (topbar 숨김 + bottombar 축소) */
15
+ overlayCompactMode: boolean;
16
+ isSettingsOpen: boolean;
17
+ pointerStyle: PointerStyle;
18
+ pointerColor: string;
19
+ breakMarks: {
20
+ slash: boolean;
21
+ };
22
+ breakGapPx: number;
23
+ muteAudio: boolean;
24
+ /** 오디오 재생 속도 (1.0 = 기본, 0.05 단위 증감, 범위: 0.3~2.0) */
25
+ audioSpeed: number;
26
+ showPointer: boolean;
27
+ showSplit: boolean;
28
+ viewportWidth: number;
29
+ viewportHeight: number;
30
+ };
31
+ /** 뷰어 이벤트 타입 */
32
+ export type ViewerEventType = 'global_index_change' | 'scroll' | 'page_change' | 'section_change' | 'mode_change' | 'settings_change' | '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
+ /** 오디오 제어 액션 타입 */
40
+ export type AudioControlAction = 'play' | 'pause' | 'stop';
41
+ /** 기본 이벤트 (뷰어에서 emit) */
42
+ export type ViewerEventBase<T extends ViewerEventType, P = Record<string, unknown>> = {
43
+ type: T;
44
+ timestamp: number;
45
+ payload: P;
46
+ };
47
+ /** 저장용 이벤트 (외부에서 relTime 추가) */
48
+ export type StoredViewerEvent<T extends ViewerEventType, P = Record<string, unknown>> = ViewerEventBase<T, P> & {
49
+ relTime: number;
50
+ };
51
+ export type GlobalIndexChangeEvent = ViewerEventBase<'global_index_change', {
52
+ globalIndex: number;
53
+ }>;
54
+ export type ScrollEvent = ViewerEventBase<'scroll', {
55
+ scrollTop: number;
56
+ scrollRatio: number;
57
+ anchorGI: number;
58
+ anchorOffsetRatio: number;
59
+ }>;
60
+ export type PageChangeEvent = ViewerEventBase<'page_change', {
61
+ page: number;
62
+ pageIndex?: number;
63
+ }>;
64
+ export type SectionChangeEvent = ViewerEventBase<'section_change', {
65
+ sectionId: string;
66
+ }>;
67
+ export type ModeChangeEvent = ViewerEventBase<'mode_change', {
68
+ mode: ViewerMode;
69
+ }>;
70
+ export type SettingsChangeEvent = ViewerEventBase<'settings_change', {
71
+ key: keyof CRViewerState;
72
+ value: unknown;
73
+ }>;
74
+ export type RenderStartEvent = ViewerEventBase<'render_start', {
75
+ sectionId: string;
76
+ }>;
77
+ export type LoadingStartEvent = ViewerEventBase<'loading_start', Record<string, never>>;
78
+ export type LoadingEndEvent = ViewerEventBase<'loading_end', {
79
+ duration: number;
80
+ }>;
81
+ export type ViewportResizeEvent = ViewerEventBase<'viewport_resize', {
82
+ width: number;
83
+ height: number;
84
+ }>;
85
+ export type AudioControlEvent = ViewerEventBase<'audio_control', {
86
+ action: AudioControlAction;
87
+ }>;
88
+ /** 모든 뷰어 이벤트 타입 (Union) */
89
+ export type ViewerEvent = GlobalIndexChangeEvent | ScrollEvent | PageChangeEvent | SectionChangeEvent | ModeChangeEvent | SettingsChangeEvent | RenderStartEvent | LoadingStartEvent | LoadingEndEvent | ViewportResizeEvent | AudioControlEvent;
90
+ export type ViewerEventCallback = (event: ViewerEvent) => void;
91
+ /** 저장용 이벤트 (any type) */
92
+ export type StoredEvent = StoredViewerEvent<ViewerEventType, unknown>;
93
+ /** 녹화용 뷰어 상태 (Partial - 모든 필드가 필수는 아님) */
94
+ export type RecordingViewerState = Partial<CRViewerState>;
95
+ /** 녹화/재생용 뷰어 스냅샷 (정확한 구조) */
96
+ export type RecordingSnapshot = {
97
+ viewerState: RecordingViewerState;
98
+ globalIndex: number;
99
+ scrollY?: number;
100
+ anchorGI?: number;
101
+ anchorOffsetRatio?: number;
102
+ currentPage?: number;
103
+ sectionId: string;
104
+ viewportWidth: number;
105
+ viewportHeight: number;
106
+ audio?: AudioSnapshot;
107
+ };
108
+ /** 녹화 청크 */
109
+ export type RecordingChunk = {
110
+ index: number;
111
+ startTime: number;
112
+ endTime: number;
113
+ snapshot: RecordingSnapshot;
114
+ events: StoredEvent[];
115
+ };
116
+ /** 녹화 메타데이터 */
117
+ export type RecordingMeta = {
118
+ id: string;
119
+ startedAt: number;
120
+ totalDuration: number;
121
+ chunkDuration: number;
122
+ chunkCount: number;
123
+ sectionId: string;
124
+ };
@@ -0,0 +1,5 @@
1
+ "use strict";
2
+ // src/socket/viewer-events.types.ts
3
+ // 뷰어 이벤트 타입 정의 (source of truth)
4
+ // CR_viewer의 viewerEvent.types.ts에서 이관
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.83",
3
+ "version": "1.0.85",
4
4
  "description": "CheckReading shared TypeScript types",
5
5
  "main": "dist/index.js",
6
6
  "types": "dist/index.d.ts",