sa2kit 1.6.34 → 1.6.36

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,55 +1,9 @@
1
1
  import * as React from 'react';
2
2
  import React__default from 'react';
3
+ import { M as MikuFireworks3DProps, F as FireworkKind, g as FireworksRealtimeConfig, h as FireworksRealtimeState, f as FireworksRealtimeUser, a as FireworkLaunchPayload, c as FireworkEngineOptions, D as DanmakuMessage, e as DanmakuControllerOptions, d as DanmakuSendResult } from '../types-DBVDr8Mu.js';
4
+ export { b as FireworkPosition } from '../types-DBVDr8Mu.js';
3
5
 
4
- type FireworkKind = 'normal' | 'miku' | 'avatar';
5
- interface DanmakuMessage {
6
- id: string;
7
- userId?: string;
8
- text: string;
9
- color?: string;
10
- timestamp: number;
11
- }
12
- interface FireworkPosition {
13
- x: number;
14
- y: number;
15
- z: number;
16
- }
17
- interface FireworkLaunchPayload {
18
- kind: FireworkKind;
19
- position?: FireworkPosition;
20
- color?: string;
21
- avatarUrl?: string;
22
- message?: DanmakuMessage;
23
- }
24
- interface FireworkEngineOptions {
25
- maxParticles?: number;
26
- maxActiveFireworks?: number;
27
- onError?: (error: Error) => void;
28
- onFpsReport?: (fps: number) => void;
29
- }
30
- interface MikuFireworks3DProps {
31
- width?: number | string;
32
- height?: number | string;
33
- className?: string;
34
- defaultKind?: FireworkKind;
35
- autoLaunchOnDanmaku?: boolean;
36
- maxParticles?: number;
37
- maxActiveFireworks?: number;
38
- defaultAvatarUrl?: string;
39
- onLaunch?: (payload: FireworkLaunchPayload) => void;
40
- onDanmakuSend?: (message: DanmakuMessage) => void;
41
- onError?: (error: Error) => void;
42
- onFpsReport?: (fps: number) => void;
43
- }
44
- interface DanmakuSendResult {
45
- message: DanmakuMessage;
46
- launchKind?: FireworkKind;
47
- }
48
- interface DanmakuControllerOptions {
49
- onSend?: (message: DanmakuMessage) => void;
50
- }
51
-
52
- declare function MikuFireworks3D({ width, height, className, defaultKind, autoLaunchOnDanmaku, maxParticles, maxActiveFireworks, defaultAvatarUrl, onLaunch, onDanmakuSend, onError, onFpsReport, }: MikuFireworks3DProps): React__default.JSX.Element;
6
+ declare function MikuFireworks3D({ width, height, className, defaultKind, autoLaunchOnDanmaku, maxParticles, maxActiveFireworks, defaultAvatarUrl, onLaunch, onDanmakuSend, onError, onFpsReport, onRealtimeStateChange, realtime, }: MikuFireworks3DProps): React__default.JSX.Element;
53
7
 
54
8
  interface FireworksCanvasProps {
55
9
  canvasRef: React__default.RefObject<HTMLCanvasElement>;
@@ -65,14 +19,103 @@ interface FireworksControlPanelProps {
65
19
  onAvatarUrlChange: (value: string) => void;
66
20
  onLaunch: () => void;
67
21
  fps: number;
22
+ realtimeConnected?: boolean;
23
+ onlineCount?: number;
68
24
  }
69
- declare function FireworksControlPanel({ selectedKind, onKindChange, autoLaunchOnDanmaku, onAutoLaunchChange, avatarUrl, onAvatarUrlChange, onLaunch, fps, }: FireworksControlPanelProps): React__default.JSX.Element;
25
+ declare function FireworksControlPanel({ selectedKind, onKindChange, autoLaunchOnDanmaku, onAutoLaunchChange, avatarUrl, onAvatarUrlChange, onLaunch, fps, realtimeConnected, onlineCount, }: FireworksControlPanelProps): React__default.JSX.Element;
70
26
 
71
27
  interface DanmakuPanelProps {
72
28
  onSend: (text: string) => void;
73
29
  }
74
30
  declare function DanmakuPanel({ onSend }: DanmakuPanelProps): React__default.JSX.Element;
75
31
 
32
+ interface RealtimeDanmakuEvent {
33
+ id: string;
34
+ roomId: string;
35
+ text: string;
36
+ color?: string;
37
+ kind?: FireworkKind;
38
+ user: FireworksRealtimeUser;
39
+ timestamp: number;
40
+ }
41
+ interface RealtimeFireworkEvent {
42
+ id: string;
43
+ roomId: string;
44
+ payload: FireworkLaunchPayload;
45
+ user: FireworksRealtimeUser;
46
+ timestamp: number;
47
+ }
48
+ type ServerMessage = {
49
+ type: 'joined';
50
+ roomId: string;
51
+ onlineCount: number;
52
+ self: FireworksRealtimeUser;
53
+ } | {
54
+ type: 'room.snapshot';
55
+ roomId: string;
56
+ users: FireworksRealtimeUser[];
57
+ danmakuHistory: RealtimeDanmakuEvent[];
58
+ fireworkHistory: RealtimeFireworkEvent[];
59
+ } | {
60
+ type: 'room.user_joined';
61
+ roomId: string;
62
+ user: FireworksRealtimeUser;
63
+ onlineCount: number;
64
+ } | {
65
+ type: 'room.user_left';
66
+ roomId: string;
67
+ userId: string;
68
+ onlineCount: number;
69
+ } | {
70
+ type: 'danmaku.broadcast';
71
+ roomId: string;
72
+ event: RealtimeDanmakuEvent;
73
+ } | {
74
+ type: 'firework.broadcast';
75
+ roomId: string;
76
+ event: RealtimeFireworkEvent;
77
+ } | {
78
+ type: 'error';
79
+ code: string;
80
+ message: string;
81
+ } | {
82
+ type: 'pong';
83
+ ts: number;
84
+ };
85
+ interface WebSocketTransportCallbacks {
86
+ onStateChange?: (state: FireworksRealtimeState) => void;
87
+ onDanmakuBroadcast?: (event: RealtimeDanmakuEvent) => void;
88
+ onFireworkBroadcast?: (event: RealtimeFireworkEvent) => void;
89
+ onSnapshot?: (snapshot: Extract<ServerMessage, {
90
+ type: 'room.snapshot';
91
+ }>) => void;
92
+ onError?: (error: Error) => void;
93
+ }
94
+ declare class WebSocketTransport {
95
+ private socket;
96
+ private reconnectTimer;
97
+ private isManualClose;
98
+ private readonly pendingQueue;
99
+ private readonly config;
100
+ private readonly callbacks;
101
+ private state;
102
+ constructor(config: FireworksRealtimeConfig, callbacks?: WebSocketTransportCallbacks);
103
+ connect(): void;
104
+ disconnect(): void;
105
+ sendDanmaku(payload: {
106
+ text: string;
107
+ color?: string;
108
+ kind?: FireworkKind;
109
+ }): void;
110
+ sendFirework(payload: FireworkLaunchPayload): void;
111
+ getState(): FireworksRealtimeState;
112
+ private send;
113
+ private updateState;
114
+ private handleServerMessage;
115
+ private scheduleReconnect;
116
+ private flushPendingQueue;
117
+ }
118
+
76
119
  interface UseFireworksEngineOptions extends FireworkEngineOptions {
77
120
  onLaunch?: (payload: FireworkLaunchPayload) => void;
78
121
  }
@@ -87,12 +130,63 @@ interface DanmakuOverlayItem extends DanmakuMessage {
87
130
  track: number;
88
131
  durationMs: number;
89
132
  }
133
+ interface SendDanmakuOptions {
134
+ optimistic?: boolean;
135
+ }
90
136
  declare function useDanmakuController(options?: DanmakuControllerOptions): {
91
137
  items: DanmakuOverlayItem[];
92
- send: (text: string, color?: string) => DanmakuSendResult | null;
138
+ send: (text: string, color?: string, sendOptions?: SendDanmakuOptions) => DanmakuSendResult | null;
139
+ addIncoming: (message: DanmakuMessage) => void;
93
140
  removeItem: (id: string) => void;
94
141
  };
95
142
 
143
+ interface UseFireworksRealtimeOptions {
144
+ config?: FireworksRealtimeConfig;
145
+ enabled?: boolean;
146
+ onDanmakuBroadcast?: (event: {
147
+ text: string;
148
+ color?: string;
149
+ kind?: FireworkKind;
150
+ userId: string;
151
+ timestamp: number;
152
+ id: string;
153
+ }) => void;
154
+ onFireworkBroadcast?: (event: {
155
+ id: string;
156
+ payload: FireworkLaunchPayload;
157
+ userId: string;
158
+ timestamp: number;
159
+ }) => void;
160
+ onSnapshot?: (snapshot: {
161
+ roomId: string;
162
+ danmakuHistory: Array<{
163
+ id: string;
164
+ text: string;
165
+ color?: string;
166
+ kind?: FireworkKind;
167
+ userId: string;
168
+ timestamp: number;
169
+ }>;
170
+ fireworkHistory: Array<{
171
+ id: string;
172
+ payload: FireworkLaunchPayload;
173
+ userId: string;
174
+ timestamp: number;
175
+ }>;
176
+ }) => void;
177
+ onError?: (error: Error) => void;
178
+ onStateChange?: (state: FireworksRealtimeState) => void;
179
+ }
180
+ declare function useFireworksRealtime(options: UseFireworksRealtimeOptions): {
181
+ state: FireworksRealtimeState;
182
+ sendDanmaku: (payload: {
183
+ text: string;
184
+ color?: string;
185
+ kind?: FireworkKind;
186
+ }) => void;
187
+ sendFirework: (payload: FireworkLaunchPayload) => void;
188
+ };
189
+
96
190
  declare const DEFAULT_MAX_PARTICLES = 5000;
97
191
  declare const DEFAULT_MAX_ACTIVE_FIREWORKS = 12;
98
192
  declare const FIREWORK_KIND_LABELS: Record<FireworkKind, string>;
@@ -101,4 +195,4 @@ declare const NORMAL_PALETTE: string[];
101
195
  declare const DANMAKU_MAX_LENGTH = 32;
102
196
  declare const DANMAKU_TRACK_COUNT = 8;
103
197
 
104
- export { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT, DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES, type DanmakuControllerOptions, type DanmakuMessage, type DanmakuOverlayItem, DanmakuPanel, type DanmakuSendResult, FIREWORK_KIND_LABELS, type FireworkEngineOptions, type FireworkKind, type FireworkLaunchPayload, type FireworkPosition, FireworksCanvas, FireworksControlPanel, MIKU_PALETTE, MikuFireworks3D, type MikuFireworks3DProps, NORMAL_PALETTE, type UseFireworksEngineOptions, useDanmakuController, useFireworksEngine };
198
+ export { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT, DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES, DanmakuControllerOptions, DanmakuMessage, type DanmakuOverlayItem, DanmakuPanel, DanmakuSendResult, FIREWORK_KIND_LABELS, FireworkEngineOptions, FireworkKind, FireworkLaunchPayload, FireworksCanvas, FireworksControlPanel, FireworksRealtimeConfig, FireworksRealtimeState, FireworksRealtimeUser, MIKU_PALETTE, MikuFireworks3D, MikuFireworks3DProps, NORMAL_PALETTE, type UseFireworksEngineOptions, WebSocketTransport, type WebSocketTransportCallbacks, useDanmakuController, useFireworksEngine, useFireworksRealtime };
@@ -1,61 +1,69 @@
1
1
  'use strict';
2
2
 
3
- var chunkB34YUZRL_js = require('../chunk-B34YUZRL.js');
3
+ var chunkXXDMARU7_js = require('../chunk-XXDMARU7.js');
4
4
  require('../chunk-DGUM43GV.js');
5
5
 
6
6
 
7
7
 
8
8
  Object.defineProperty(exports, "DANMAKU_MAX_LENGTH", {
9
9
  enumerable: true,
10
- get: function () { return chunkB34YUZRL_js.DANMAKU_MAX_LENGTH; }
10
+ get: function () { return chunkXXDMARU7_js.DANMAKU_MAX_LENGTH; }
11
11
  });
12
12
  Object.defineProperty(exports, "DANMAKU_TRACK_COUNT", {
13
13
  enumerable: true,
14
- get: function () { return chunkB34YUZRL_js.DANMAKU_TRACK_COUNT; }
14
+ get: function () { return chunkXXDMARU7_js.DANMAKU_TRACK_COUNT; }
15
15
  });
16
16
  Object.defineProperty(exports, "DEFAULT_MAX_ACTIVE_FIREWORKS", {
17
17
  enumerable: true,
18
- get: function () { return chunkB34YUZRL_js.DEFAULT_MAX_ACTIVE_FIREWORKS; }
18
+ get: function () { return chunkXXDMARU7_js.DEFAULT_MAX_ACTIVE_FIREWORKS; }
19
19
  });
20
20
  Object.defineProperty(exports, "DEFAULT_MAX_PARTICLES", {
21
21
  enumerable: true,
22
- get: function () { return chunkB34YUZRL_js.DEFAULT_MAX_PARTICLES; }
22
+ get: function () { return chunkXXDMARU7_js.DEFAULT_MAX_PARTICLES; }
23
23
  });
24
24
  Object.defineProperty(exports, "DanmakuPanel", {
25
25
  enumerable: true,
26
- get: function () { return chunkB34YUZRL_js.DanmakuPanel; }
26
+ get: function () { return chunkXXDMARU7_js.DanmakuPanel; }
27
27
  });
28
28
  Object.defineProperty(exports, "FIREWORK_KIND_LABELS", {
29
29
  enumerable: true,
30
- get: function () { return chunkB34YUZRL_js.FIREWORK_KIND_LABELS; }
30
+ get: function () { return chunkXXDMARU7_js.FIREWORK_KIND_LABELS; }
31
31
  });
32
32
  Object.defineProperty(exports, "FireworksCanvas", {
33
33
  enumerable: true,
34
- get: function () { return chunkB34YUZRL_js.FireworksCanvas; }
34
+ get: function () { return chunkXXDMARU7_js.FireworksCanvas; }
35
35
  });
36
36
  Object.defineProperty(exports, "FireworksControlPanel", {
37
37
  enumerable: true,
38
- get: function () { return chunkB34YUZRL_js.FireworksControlPanel; }
38
+ get: function () { return chunkXXDMARU7_js.FireworksControlPanel; }
39
39
  });
40
40
  Object.defineProperty(exports, "MIKU_PALETTE", {
41
41
  enumerable: true,
42
- get: function () { return chunkB34YUZRL_js.MIKU_PALETTE; }
42
+ get: function () { return chunkXXDMARU7_js.MIKU_PALETTE; }
43
43
  });
44
44
  Object.defineProperty(exports, "MikuFireworks3D", {
45
45
  enumerable: true,
46
- get: function () { return chunkB34YUZRL_js.MikuFireworks3D; }
46
+ get: function () { return chunkXXDMARU7_js.MikuFireworks3D; }
47
47
  });
48
48
  Object.defineProperty(exports, "NORMAL_PALETTE", {
49
49
  enumerable: true,
50
- get: function () { return chunkB34YUZRL_js.NORMAL_PALETTE; }
50
+ get: function () { return chunkXXDMARU7_js.NORMAL_PALETTE; }
51
+ });
52
+ Object.defineProperty(exports, "WebSocketTransport", {
53
+ enumerable: true,
54
+ get: function () { return chunkXXDMARU7_js.WebSocketTransport; }
51
55
  });
52
56
  Object.defineProperty(exports, "useDanmakuController", {
53
57
  enumerable: true,
54
- get: function () { return chunkB34YUZRL_js.useDanmakuController; }
58
+ get: function () { return chunkXXDMARU7_js.useDanmakuController; }
55
59
  });
56
60
  Object.defineProperty(exports, "useFireworksEngine", {
57
61
  enumerable: true,
58
- get: function () { return chunkB34YUZRL_js.useFireworksEngine; }
62
+ get: function () { return chunkXXDMARU7_js.useFireworksEngine; }
63
+ });
64
+ Object.defineProperty(exports, "useFireworksRealtime", {
65
+ enumerable: true,
66
+ get: function () { return chunkXXDMARU7_js.useFireworksRealtime; }
59
67
  });
60
68
  //# sourceMappingURL=index.js.map
61
69
  //# sourceMappingURL=index.js.map
@@ -1,4 +1,4 @@
1
- export { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT, DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES, DanmakuPanel, FIREWORK_KIND_LABELS, FireworksCanvas, FireworksControlPanel, MIKU_PALETTE, MikuFireworks3D, NORMAL_PALETTE, useDanmakuController, useFireworksEngine } from '../chunk-HQ7VHIEK.mjs';
1
+ export { DANMAKU_MAX_LENGTH, DANMAKU_TRACK_COUNT, DEFAULT_MAX_ACTIVE_FIREWORKS, DEFAULT_MAX_PARTICLES, DanmakuPanel, FIREWORK_KIND_LABELS, FireworksCanvas, FireworksControlPanel, MIKU_PALETTE, MikuFireworks3D, NORMAL_PALETTE, WebSocketTransport, useDanmakuController, useFireworksEngine, useFireworksRealtime } from '../chunk-55FBYGRK.mjs';
2
2
  import '../chunk-BJTO5JO5.mjs';
3
3
  //# sourceMappingURL=index.mjs.map
4
4
  //# sourceMappingURL=index.mjs.map
@@ -0,0 +1,146 @@
1
+ import { F as FireworkKind, a as FireworkLaunchPayload } from '../../types-DBVDr8Mu.mjs';
2
+
3
+ interface FireworksUserIdentity {
4
+ userId: string;
5
+ nickname?: string;
6
+ avatarUrl?: string;
7
+ }
8
+ interface DanmakuBroadcastEvent {
9
+ id: string;
10
+ roomId: string;
11
+ text: string;
12
+ color?: string;
13
+ kind?: FireworkKind;
14
+ user: FireworksUserIdentity;
15
+ timestamp: number;
16
+ }
17
+ interface FireworkBroadcastEvent {
18
+ id: string;
19
+ roomId: string;
20
+ payload: FireworkLaunchPayload;
21
+ user: FireworksUserIdentity;
22
+ timestamp: number;
23
+ }
24
+ type FireworksClientMessage = {
25
+ type: 'join';
26
+ roomId: string;
27
+ user: FireworksUserIdentity;
28
+ } | {
29
+ type: 'leave';
30
+ } | {
31
+ type: 'danmaku.send';
32
+ payload: {
33
+ text: string;
34
+ color?: string;
35
+ kind?: FireworkKind;
36
+ };
37
+ } | {
38
+ type: 'firework.launch';
39
+ payload: FireworkLaunchPayload;
40
+ } | {
41
+ type: 'ping';
42
+ ts?: number;
43
+ };
44
+ type FireworksServerMessage = {
45
+ type: 'joined';
46
+ roomId: string;
47
+ self: FireworksUserIdentity;
48
+ onlineCount: number;
49
+ } | {
50
+ type: 'room.snapshot';
51
+ roomId: string;
52
+ users: FireworksUserIdentity[];
53
+ danmakuHistory: DanmakuBroadcastEvent[];
54
+ fireworkHistory: FireworkBroadcastEvent[];
55
+ } | {
56
+ type: 'room.user_joined';
57
+ roomId: string;
58
+ user: FireworksUserIdentity;
59
+ onlineCount: number;
60
+ } | {
61
+ type: 'room.user_left';
62
+ roomId: string;
63
+ userId: string;
64
+ onlineCount: number;
65
+ } | {
66
+ type: 'danmaku.broadcast';
67
+ roomId: string;
68
+ event: DanmakuBroadcastEvent;
69
+ } | {
70
+ type: 'firework.broadcast';
71
+ roomId: string;
72
+ event: FireworkBroadcastEvent;
73
+ } | {
74
+ type: 'pong';
75
+ ts: number;
76
+ } | {
77
+ type: 'error';
78
+ code: string;
79
+ message: string;
80
+ };
81
+ interface FireworksConnectionTransport {
82
+ send: (encodedMessage: string) => void;
83
+ close?: (code?: number, reason?: string) => void;
84
+ }
85
+ interface FireworksConnection {
86
+ id: string;
87
+ handleMessage: (raw: unknown) => void;
88
+ disconnect: (reason?: string) => void;
89
+ send: (message: FireworksServerMessage) => void;
90
+ }
91
+ interface FireworksRoomHubOptions {
92
+ maxUsersPerRoom?: number;
93
+ historyLimit?: number;
94
+ maxDanmakuLength?: number;
95
+ logger?: Pick<Console, 'info' | 'warn' | 'error'>;
96
+ }
97
+ interface FireworksHubStats {
98
+ rooms: number;
99
+ connections: number;
100
+ }
101
+ interface WsLikeSocket {
102
+ send: (data: string) => void;
103
+ on: (event: 'message' | 'close' | 'error', listener: (...args: unknown[]) => void) => void;
104
+ }
105
+
106
+ declare class FireworksRoomHub {
107
+ private readonly rooms;
108
+ private readonly sessions;
109
+ private readonly maxUsersPerRoom;
110
+ private readonly historyLimit;
111
+ private readonly maxDanmakuLength;
112
+ private readonly logger?;
113
+ constructor(options?: FireworksRoomHubOptions);
114
+ connect(transport: FireworksConnectionTransport, id?: string): FireworksConnection;
115
+ disconnect(connectionId: string, reason?: string): void;
116
+ getStats(): {
117
+ rooms: number;
118
+ connections: number;
119
+ };
120
+ getRoomOnlineCount(roomId: string): number;
121
+ private handleRawMessage;
122
+ private joinRoom;
123
+ private leaveRoom;
124
+ private handleDanmaku;
125
+ private handleFirework;
126
+ private createRoom;
127
+ private sendToConnection;
128
+ private broadcastToRoom;
129
+ private sendError;
130
+ }
131
+
132
+ interface BindWsSocketOptions {
133
+ connectionId?: string;
134
+ onConnected?: (connection: FireworksConnection) => void;
135
+ onDisconnected?: (connectionId: string) => void;
136
+ }
137
+ /**
138
+ * Bind a ws-like socket to FireworksRoomHub.
139
+ *
140
+ * Example (ws package):
141
+ * const hub = new FireworksRoomHub();
142
+ * wss.on('connection', (socket) => bindWsSocket(hub, socket));
143
+ */
144
+ declare function bindWsSocket(hub: FireworksRoomHub, socket: WsLikeSocket, options?: BindWsSocketOptions): FireworksConnection;
145
+
146
+ export { type BindWsSocketOptions, type DanmakuBroadcastEvent, type FireworkBroadcastEvent, type FireworksClientMessage, type FireworksConnection, type FireworksConnectionTransport, type FireworksHubStats, FireworksRoomHub, type FireworksRoomHubOptions, type FireworksServerMessage, type FireworksUserIdentity, type WsLikeSocket, bindWsSocket };
@@ -0,0 +1,146 @@
1
+ import { F as FireworkKind, a as FireworkLaunchPayload } from '../../types-DBVDr8Mu.js';
2
+
3
+ interface FireworksUserIdentity {
4
+ userId: string;
5
+ nickname?: string;
6
+ avatarUrl?: string;
7
+ }
8
+ interface DanmakuBroadcastEvent {
9
+ id: string;
10
+ roomId: string;
11
+ text: string;
12
+ color?: string;
13
+ kind?: FireworkKind;
14
+ user: FireworksUserIdentity;
15
+ timestamp: number;
16
+ }
17
+ interface FireworkBroadcastEvent {
18
+ id: string;
19
+ roomId: string;
20
+ payload: FireworkLaunchPayload;
21
+ user: FireworksUserIdentity;
22
+ timestamp: number;
23
+ }
24
+ type FireworksClientMessage = {
25
+ type: 'join';
26
+ roomId: string;
27
+ user: FireworksUserIdentity;
28
+ } | {
29
+ type: 'leave';
30
+ } | {
31
+ type: 'danmaku.send';
32
+ payload: {
33
+ text: string;
34
+ color?: string;
35
+ kind?: FireworkKind;
36
+ };
37
+ } | {
38
+ type: 'firework.launch';
39
+ payload: FireworkLaunchPayload;
40
+ } | {
41
+ type: 'ping';
42
+ ts?: number;
43
+ };
44
+ type FireworksServerMessage = {
45
+ type: 'joined';
46
+ roomId: string;
47
+ self: FireworksUserIdentity;
48
+ onlineCount: number;
49
+ } | {
50
+ type: 'room.snapshot';
51
+ roomId: string;
52
+ users: FireworksUserIdentity[];
53
+ danmakuHistory: DanmakuBroadcastEvent[];
54
+ fireworkHistory: FireworkBroadcastEvent[];
55
+ } | {
56
+ type: 'room.user_joined';
57
+ roomId: string;
58
+ user: FireworksUserIdentity;
59
+ onlineCount: number;
60
+ } | {
61
+ type: 'room.user_left';
62
+ roomId: string;
63
+ userId: string;
64
+ onlineCount: number;
65
+ } | {
66
+ type: 'danmaku.broadcast';
67
+ roomId: string;
68
+ event: DanmakuBroadcastEvent;
69
+ } | {
70
+ type: 'firework.broadcast';
71
+ roomId: string;
72
+ event: FireworkBroadcastEvent;
73
+ } | {
74
+ type: 'pong';
75
+ ts: number;
76
+ } | {
77
+ type: 'error';
78
+ code: string;
79
+ message: string;
80
+ };
81
+ interface FireworksConnectionTransport {
82
+ send: (encodedMessage: string) => void;
83
+ close?: (code?: number, reason?: string) => void;
84
+ }
85
+ interface FireworksConnection {
86
+ id: string;
87
+ handleMessage: (raw: unknown) => void;
88
+ disconnect: (reason?: string) => void;
89
+ send: (message: FireworksServerMessage) => void;
90
+ }
91
+ interface FireworksRoomHubOptions {
92
+ maxUsersPerRoom?: number;
93
+ historyLimit?: number;
94
+ maxDanmakuLength?: number;
95
+ logger?: Pick<Console, 'info' | 'warn' | 'error'>;
96
+ }
97
+ interface FireworksHubStats {
98
+ rooms: number;
99
+ connections: number;
100
+ }
101
+ interface WsLikeSocket {
102
+ send: (data: string) => void;
103
+ on: (event: 'message' | 'close' | 'error', listener: (...args: unknown[]) => void) => void;
104
+ }
105
+
106
+ declare class FireworksRoomHub {
107
+ private readonly rooms;
108
+ private readonly sessions;
109
+ private readonly maxUsersPerRoom;
110
+ private readonly historyLimit;
111
+ private readonly maxDanmakuLength;
112
+ private readonly logger?;
113
+ constructor(options?: FireworksRoomHubOptions);
114
+ connect(transport: FireworksConnectionTransport, id?: string): FireworksConnection;
115
+ disconnect(connectionId: string, reason?: string): void;
116
+ getStats(): {
117
+ rooms: number;
118
+ connections: number;
119
+ };
120
+ getRoomOnlineCount(roomId: string): number;
121
+ private handleRawMessage;
122
+ private joinRoom;
123
+ private leaveRoom;
124
+ private handleDanmaku;
125
+ private handleFirework;
126
+ private createRoom;
127
+ private sendToConnection;
128
+ private broadcastToRoom;
129
+ private sendError;
130
+ }
131
+
132
+ interface BindWsSocketOptions {
133
+ connectionId?: string;
134
+ onConnected?: (connection: FireworksConnection) => void;
135
+ onDisconnected?: (connectionId: string) => void;
136
+ }
137
+ /**
138
+ * Bind a ws-like socket to FireworksRoomHub.
139
+ *
140
+ * Example (ws package):
141
+ * const hub = new FireworksRoomHub();
142
+ * wss.on('connection', (socket) => bindWsSocket(hub, socket));
143
+ */
144
+ declare function bindWsSocket(hub: FireworksRoomHub, socket: WsLikeSocket, options?: BindWsSocketOptions): FireworksConnection;
145
+
146
+ export { type BindWsSocketOptions, type DanmakuBroadcastEvent, type FireworkBroadcastEvent, type FireworksClientMessage, type FireworksConnection, type FireworksConnectionTransport, type FireworksHubStats, FireworksRoomHub, type FireworksRoomHubOptions, type FireworksServerMessage, type FireworksUserIdentity, type WsLikeSocket, bindWsSocket };