@kajidog/voicevox-client 0.4.1 → 0.6.0

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.
Files changed (114) hide show
  1. package/LICENSE +14 -14
  2. package/dist/accent-utils.d.ts +93 -0
  3. package/dist/accent-utils.d.ts.map +1 -0
  4. package/dist/accent-utils.js +211 -0
  5. package/dist/accent-utils.js.map +1 -0
  6. package/dist/api.d.ts +40 -2
  7. package/dist/api.d.ts.map +1 -1
  8. package/dist/api.js +90 -0
  9. package/dist/api.js.map +1 -1
  10. package/dist/cache-policy.d.ts +21 -0
  11. package/dist/cache-policy.d.ts.map +1 -0
  12. package/dist/cache-policy.js +31 -0
  13. package/dist/cache-policy.js.map +1 -0
  14. package/dist/client.d.ts +28 -119
  15. package/dist/client.d.ts.map +1 -1
  16. package/dist/client.js +48 -417
  17. package/dist/client.js.map +1 -1
  18. package/dist/effect/config.d.ts +43 -0
  19. package/dist/effect/config.d.ts.map +1 -0
  20. package/dist/effect/config.js +45 -0
  21. package/dist/effect/config.js.map +1 -0
  22. package/dist/effect/context.d.ts +33 -0
  23. package/dist/effect/context.d.ts.map +1 -0
  24. package/dist/effect/context.js +10 -0
  25. package/dist/effect/context.js.map +1 -0
  26. package/dist/effect/errors.d.ts +130 -0
  27. package/dist/effect/errors.d.ts.map +1 -0
  28. package/dist/effect/errors.js +121 -0
  29. package/dist/effect/errors.js.map +1 -0
  30. package/dist/effect/index.d.ts +34 -0
  31. package/dist/effect/index.d.ts.map +1 -0
  32. package/dist/effect/index.js +67 -0
  33. package/dist/effect/index.js.map +1 -0
  34. package/dist/effect/queue-manager.d.ts +34 -0
  35. package/dist/effect/queue-manager.d.ts.map +1 -0
  36. package/dist/effect/queue-manager.js +59 -0
  37. package/dist/effect/queue-manager.js.map +1 -0
  38. package/dist/effect/services/api-service.d.ts +58 -0
  39. package/dist/effect/services/api-service.d.ts.map +1 -0
  40. package/dist/effect/services/api-service.js +90 -0
  41. package/dist/effect/services/api-service.js.map +1 -0
  42. package/dist/effect/services/audio-generator-service.d.ts +78 -0
  43. package/dist/effect/services/audio-generator-service.d.ts.map +1 -0
  44. package/dist/effect/services/audio-generator-service.js +187 -0
  45. package/dist/effect/services/audio-generator-service.js.map +1 -0
  46. package/dist/effect/services/audio-player-service.d.ts +101 -0
  47. package/dist/effect/services/audio-player-service.d.ts.map +1 -0
  48. package/dist/effect/services/audio-player-service.js +297 -0
  49. package/dist/effect/services/audio-player-service.js.map +1 -0
  50. package/dist/effect/services/event-manager-service.d.ts +96 -0
  51. package/dist/effect/services/event-manager-service.d.ts.map +1 -0
  52. package/dist/effect/services/event-manager-service.js +208 -0
  53. package/dist/effect/services/event-manager-service.js.map +1 -0
  54. package/dist/effect/services/file-manager-service.d.ts +91 -0
  55. package/dist/effect/services/file-manager-service.d.ts.map +1 -0
  56. package/dist/effect/services/file-manager-service.js +215 -0
  57. package/dist/effect/services/file-manager-service.js.map +1 -0
  58. package/dist/effect/utils.d.ts +118 -0
  59. package/dist/effect/utils.d.ts.map +1 -0
  60. package/dist/effect/utils.js +186 -0
  61. package/dist/effect/utils.js.map +1 -0
  62. package/dist/error.js.map +1 -1
  63. package/dist/index.d.ts +3 -1
  64. package/dist/index.d.ts.map +1 -1
  65. package/dist/index.js +3 -1
  66. package/dist/index.js.map +1 -1
  67. package/dist/playback/node-playback-strategy.d.ts.map +1 -1
  68. package/dist/playback/node-playback-strategy.js +2 -6
  69. package/dist/playback/node-playback-strategy.js.map +1 -1
  70. package/dist/player.d.ts +110 -0
  71. package/dist/player.d.ts.map +1 -0
  72. package/dist/player.js +183 -0
  73. package/dist/player.js.map +1 -0
  74. package/dist/queue/audio-player.d.ts +44 -0
  75. package/dist/queue/audio-player.d.ts.map +1 -0
  76. package/dist/queue/audio-player.js +344 -0
  77. package/dist/queue/audio-player.js.map +1 -0
  78. package/dist/queue/file-manager.js +9 -9
  79. package/dist/queue/file-manager.js.map +1 -1
  80. package/dist/queue/manager.d.ts +134 -0
  81. package/dist/queue/manager.d.ts.map +1 -0
  82. package/dist/queue/manager.js +564 -0
  83. package/dist/queue/manager.js.map +1 -0
  84. package/dist/queue/queue-service.d.ts.map +1 -1
  85. package/dist/queue/queue-service.js +20 -6
  86. package/dist/queue/queue-service.js.map +1 -1
  87. package/dist/queue/types.d.ts +3 -1
  88. package/dist/queue/types.d.ts.map +1 -1
  89. package/dist/queue/types.js.map +1 -1
  90. package/dist/services/dictionary-service.d.ts +35 -0
  91. package/dist/services/dictionary-service.d.ts.map +1 -0
  92. package/dist/services/dictionary-service.js +188 -0
  93. package/dist/services/dictionary-service.js.map +1 -0
  94. package/dist/services/speech-service.d.ts +43 -0
  95. package/dist/services/speech-service.d.ts.map +1 -0
  96. package/dist/services/speech-service.js +236 -0
  97. package/dist/services/speech-service.js.map +1 -0
  98. package/dist/shared-queue-manager.d.ts +119 -0
  99. package/dist/shared-queue-manager.d.ts.map +1 -0
  100. package/dist/shared-queue-manager.js +487 -0
  101. package/dist/shared-queue-manager.js.map +1 -0
  102. package/dist/state/queue-state-machine.d.ts.map +1 -1
  103. package/dist/state/queue-state-machine.js +13 -0
  104. package/dist/state/queue-state-machine.js.map +1 -1
  105. package/dist/state/types.d.ts +2 -0
  106. package/dist/state/types.d.ts.map +1 -1
  107. package/dist/state/types.js.map +1 -1
  108. package/dist/types.d.ts +28 -0
  109. package/dist/types.d.ts.map +1 -1
  110. package/dist/utils.d.ts +16 -0
  111. package/dist/utils.d.ts.map +1 -1
  112. package/dist/utils.js +36 -0
  113. package/dist/utils.js.map +1 -1
  114. package/package.json +1 -1
@@ -0,0 +1,297 @@
1
+ "use strict";
2
+ /**
3
+ * Effect-based AudioPlayer service implementation
4
+ * Provides structured error handling and resource management for audio playback
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.withManagedAudioPlayer = exports.playAudioWithProgress = exports.playAudioParallel = exports.playAudioSequence = exports.EffectAudioPlayerServiceScoped = exports.EffectAudioPlayerServiceLive = exports.makeEffectAudioPlayerService = exports.EffectAudioPlayerServiceImpl = exports.EffectAudioPlayerContext = void 0;
8
+ const effect_1 = require("effect");
9
+ const effect_2 = require("effect");
10
+ const node_child_process_1 = require("node:child_process");
11
+ const errors_1 = require("../errors");
12
+ const utils_1 = require("../utils");
13
+ exports.EffectAudioPlayerContext = effect_1.Context.GenericTag('@voicevox/EffectAudioPlayer');
14
+ /**
15
+ * Cross-platform audio player utilities
16
+ */
17
+ const detectPlatformAudioCommand = () => {
18
+ const platform = process.platform;
19
+ switch (platform) {
20
+ case 'darwin': // macOS
21
+ return {
22
+ command: 'afplay',
23
+ args: (filePath) => [filePath]
24
+ };
25
+ case 'win32': // Windows
26
+ return {
27
+ command: 'powershell',
28
+ args: (filePath) => [
29
+ '-Command',
30
+ `Add-Type -AssemblyName PresentationCore; $player = New-Object System.Windows.Media.MediaPlayer; $player.Open('file:///${filePath.replace(/\\/g, '/')}'); $player.Play(); while ($player.NaturalDuration.HasTimeSpan -eq $false) { Start-Sleep -Milliseconds 100 }; Start-Sleep -Milliseconds ($player.NaturalDuration.TimeSpan.TotalMilliseconds); $player.Close()`
31
+ ]
32
+ };
33
+ default: // Linux and others
34
+ // Try different audio players in order of preference
35
+ const linuxPlayers = ['paplay', 'aplay', 'play', 'ffplay'];
36
+ for (const player of linuxPlayers) {
37
+ try {
38
+ // Simple check if command exists
39
+ require('child_process').execSync(`which ${player}`, { stdio: 'ignore' });
40
+ if (player === 'ffplay') {
41
+ return {
42
+ command: player,
43
+ args: (filePath) => ['-nodisp', '-autoexit', filePath]
44
+ };
45
+ }
46
+ return {
47
+ command: player,
48
+ args: (filePath) => [filePath]
49
+ };
50
+ }
51
+ catch {
52
+ continue;
53
+ }
54
+ }
55
+ // Fallback to aplay
56
+ return {
57
+ command: 'aplay',
58
+ args: (filePath) => [filePath]
59
+ };
60
+ }
61
+ };
62
+ /**
63
+ * Effect-based implementation of AudioPlayer service
64
+ */
65
+ class EffectAudioPlayerServiceImpl {
66
+ constructor(playerState) {
67
+ /**
68
+ * Traditional playAudio method (Promise-based)
69
+ */
70
+ this.playAudio = (filePath) => {
71
+ return new Promise((resolve, reject) => {
72
+ const child = (0, node_child_process_1.spawn)(this.audioCommand.command, this.audioCommand.args(filePath), {
73
+ stdio: 'ignore',
74
+ windowsHide: true
75
+ });
76
+ child.on('close', (code) => {
77
+ if (code === 0) {
78
+ resolve();
79
+ }
80
+ else {
81
+ reject(new Error(`Audio playback failed with exit code ${code}`));
82
+ }
83
+ });
84
+ child.on('error', (error) => {
85
+ reject(error);
86
+ });
87
+ });
88
+ };
89
+ /**
90
+ * Play audio with Effect-based error handling and state management
91
+ */
92
+ this.playAudioEffect = (filePath) => {
93
+ const self = this;
94
+ return (0, utils_1.logTimed)(`playAudioEffect-${filePath}`, effect_1.Effect.gen(function* () {
95
+ // Update state to playing
96
+ yield* effect_1.Ref.update(self.playerState, (state) => ({
97
+ ...state,
98
+ isPlaying: true,
99
+ currentFilePath: filePath,
100
+ playbackStartTime: new Date(),
101
+ }));
102
+ try {
103
+ // Perform the actual playback
104
+ yield* (0, errors_1.safeAsync)(() => self.playAudio(filePath), (error) => (0, errors_1.makePlaybackError)('Failed to play audio file', filePath, error));
105
+ // Update state to not playing
106
+ yield* effect_1.Ref.update(self.playerState, (state) => ({
107
+ ...state,
108
+ isPlaying: false,
109
+ currentFilePath: undefined,
110
+ playbackStartTime: undefined,
111
+ }));
112
+ }
113
+ catch (error) {
114
+ // Ensure state is reset on error
115
+ yield* effect_1.Ref.update(self.playerState, (state) => ({
116
+ ...state,
117
+ isPlaying: false,
118
+ currentFilePath: undefined,
119
+ playbackStartTime: undefined,
120
+ }));
121
+ throw error;
122
+ }
123
+ }));
124
+ };
125
+ /**
126
+ * Play audio with timeout protection
127
+ */
128
+ this.playAudioWithTimeout = (filePath, timeoutMs) => (0, utils_1.logTimed)(`playAudioWithTimeout-${filePath}-${timeoutMs}ms`, (0, utils_1.withTimeout)(this.playAudioEffect(filePath), effect_2.Duration.millis(timeoutMs)).pipe(effect_1.Effect.mapError((error) => error instanceof Error && error.message.includes('timeout')
129
+ ? (0, errors_1.makePlaybackError)('Audio playback timed out', filePath, error)
130
+ : error)));
131
+ /**
132
+ * Play audio with retry logic
133
+ */
134
+ this.playAudioWithRetry = (filePath, maxRetries = 3) => (0, utils_1.logTimed)(`playAudioWithRetry-${filePath}-retries-${maxRetries}`, (0, errors_1.retryWithJitter)(this.playAudioEffect(filePath), maxRetries, 500));
135
+ /**
136
+ * Check if audio is currently playing
137
+ */
138
+ this.isPlaying = () => {
139
+ const self = this;
140
+ return effect_1.Ref.get(self.playerState).pipe(effect_1.Effect.map((state) => state.isPlaying));
141
+ };
142
+ /**
143
+ * Stop current playback (best effort, may not work on all platforms)
144
+ */
145
+ this.stopPlayback = () => {
146
+ const self = this;
147
+ return (0, utils_1.logTimed)('stopPlayback', effect_1.Effect.gen(function* () {
148
+ // Update state to not playing
149
+ yield* effect_1.Ref.update(self.playerState, (state) => ({
150
+ ...state,
151
+ isPlaying: false,
152
+ currentFilePath: undefined,
153
+ playbackStartTime: undefined,
154
+ }));
155
+ // Note: Actual stopping of playback depends on platform and implementation
156
+ // This is mainly for state management
157
+ yield* effect_1.Effect.log('Playback stopped (state updated)');
158
+ }));
159
+ };
160
+ /**
161
+ * Health check to verify audio playback capabilities
162
+ */
163
+ this.healthCheck = () => {
164
+ const self = this;
165
+ return (0, utils_1.logTimed)('audioPlayerHealthCheck', effect_1.Effect.gen(function* () {
166
+ // Check if we can create an AudioPlayer instance without errors
167
+ const result = yield* effect_1.Effect.sync(() => {
168
+ try {
169
+ // Simple validation - check if audio command is available
170
+ return typeof self.audioCommand.command === 'string' && self.audioCommand.command.length > 0;
171
+ }
172
+ catch {
173
+ return false;
174
+ }
175
+ }).pipe(effect_1.Effect.catchAll(() => effect_1.Effect.succeed(false)));
176
+ return result;
177
+ }));
178
+ };
179
+ /**
180
+ * Clean up audio player resources
181
+ */
182
+ this.cleanup = () => {
183
+ const self = this;
184
+ return (0, utils_1.logTimed)('audioPlayerCleanup', effect_1.Effect.gen(function* () {
185
+ // Stop any current playback
186
+ yield* self.stopPlayback();
187
+ // Reset state
188
+ yield* effect_1.Ref.set(self.playerState, {
189
+ isPlaying: false,
190
+ currentFilePath: undefined,
191
+ playbackStartTime: undefined,
192
+ });
193
+ yield* effect_1.Effect.log('AudioPlayer service cleaned up');
194
+ }));
195
+ };
196
+ this.playerState = playerState;
197
+ this.audioCommand = detectPlatformAudioCommand();
198
+ }
199
+ }
200
+ exports.EffectAudioPlayerServiceImpl = EffectAudioPlayerServiceImpl;
201
+ /**
202
+ * Create AudioPlayer service instance
203
+ */
204
+ const makeEffectAudioPlayerService = () => effect_1.Effect.gen(function* () {
205
+ const playerState = yield* effect_1.Ref.make({
206
+ isPlaying: false,
207
+ currentFilePath: undefined,
208
+ playbackStartTime: undefined,
209
+ });
210
+ return new EffectAudioPlayerServiceImpl(playerState);
211
+ });
212
+ exports.makeEffectAudioPlayerService = makeEffectAudioPlayerService;
213
+ /**
214
+ * Layer providing Effect AudioPlayer service
215
+ */
216
+ exports.EffectAudioPlayerServiceLive = effect_1.Layer.effect(exports.EffectAudioPlayerContext, (0, exports.makeEffectAudioPlayerService)());
217
+ /**
218
+ * Scoped layer that automatically cleans up resources on scope close
219
+ */
220
+ exports.EffectAudioPlayerServiceScoped = effect_1.Layer.scoped(exports.EffectAudioPlayerContext, effect_1.Effect.gen(function* () {
221
+ const service = yield* (0, exports.makeEffectAudioPlayerService)();
222
+ // Add finalizer to cleanup resources when scope closes
223
+ yield* effect_1.Effect.addFinalizer(() => service.cleanup());
224
+ return service;
225
+ }));
226
+ /**
227
+ * Helper functions for audio playback workflows
228
+ */
229
+ /**
230
+ * Play multiple audio files in sequence
231
+ */
232
+ const playAudioSequence = (filePaths) => {
233
+ const playerService = exports.EffectAudioPlayerContext;
234
+ return effect_1.Effect.gen(function* () {
235
+ const service = yield* playerService;
236
+ // Play each file in sequence
237
+ for (const filePath of filePaths) {
238
+ yield* service.playAudioEffect(filePath);
239
+ }
240
+ });
241
+ };
242
+ exports.playAudioSequence = playAudioSequence;
243
+ /**
244
+ * Play multiple audio files in parallel (useful for sound effects)
245
+ */
246
+ const playAudioParallel = (filePaths, concurrency = 3) => {
247
+ const playerService = exports.EffectAudioPlayerContext;
248
+ return effect_1.Effect.gen(function* () {
249
+ const service = yield* playerService;
250
+ // Play all files in parallel with limited concurrency
251
+ yield* effect_1.Effect.all(filePaths.map((filePath) => service.playAudioEffect(filePath)), { concurrency });
252
+ });
253
+ };
254
+ exports.playAudioParallel = playAudioParallel;
255
+ /**
256
+ * Play audio with progress monitoring
257
+ */
258
+ const playAudioWithProgress = (filePath, onProgress) => {
259
+ const playerService = exports.EffectAudioPlayerContext;
260
+ return effect_1.Effect.gen(function* () {
261
+ const service = yield* playerService;
262
+ if (!onProgress) {
263
+ return yield* service.playAudioEffect(filePath);
264
+ }
265
+ // Start playback in a fiber
266
+ const playbackFiber = yield* effect_1.Effect.fork(service.playAudioEffect(filePath));
267
+ // Monitor progress
268
+ const progressFiber = yield* effect_1.Effect.fork(effect_1.Effect.gen(function* () {
269
+ const startTime = Date.now();
270
+ while (true) {
271
+ const isPlaying = yield* service.isPlaying();
272
+ if (!isPlaying)
273
+ break;
274
+ const elapsed = Date.now() - startTime;
275
+ onProgress(elapsed);
276
+ yield* effect_1.Effect.sleep(effect_2.Duration.millis(100));
277
+ }
278
+ }));
279
+ // Wait for playback to complete
280
+ yield* effect_1.Fiber.await(playbackFiber);
281
+ // Interrupt progress monitoring
282
+ yield* effect_1.Fiber.interrupt(progressFiber);
283
+ });
284
+ };
285
+ exports.playAudioWithProgress = playAudioWithProgress;
286
+ /**
287
+ * Create a managed audio player that automatically stops on scope exit
288
+ */
289
+ const withManagedAudioPlayer = (program) => {
290
+ const playerService = exports.EffectAudioPlayerContext;
291
+ return effect_1.Effect.gen(function* () {
292
+ const service = yield* playerService;
293
+ return yield* effect_1.Effect.acquireUseRelease(effect_1.Effect.void, () => program, () => service.stopPlayback());
294
+ });
295
+ };
296
+ exports.withManagedAudioPlayer = withManagedAudioPlayer;
297
+ //# sourceMappingURL=audio-player-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audio-player-service.js","sourceRoot":"","sources":["../../../src/effect/services/audio-player-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,96 @@
1
+ /**
2
+ * Effect-based EventManager service implementation
3
+ * Provides structured event handling and resource management for queue events
4
+ */
5
+ import { Context, Effect, Layer, Ref } from 'effect';
6
+ import { EventManager } from '../../queue/event-manager';
7
+ import { QueueEventType, type QueueItem } from '../../queue/types';
8
+ import { type EventManagerService } from '../context';
9
+ /**
10
+ * Effect-based event listener type
11
+ */
12
+ export type EffectEventListener = (event: QueueEventType, item?: QueueItem) => Effect.Effect<void, never>;
13
+ /**
14
+ * Enhanced EventManager service with Effect-based operations
15
+ */
16
+ export interface EffectEventManagerService extends EventManagerService {
17
+ readonly addEffectEventListener: (event: QueueEventType, listener: EffectEventListener) => Effect.Effect<void, never>;
18
+ readonly removeEffectEventListener: (event: QueueEventType, listener: EffectEventListener) => Effect.Effect<void, never>;
19
+ readonly emitEffectEvent: (event: QueueEventType, item?: QueueItem) => Effect.Effect<void, never>;
20
+ readonly getListenerCount: (event: QueueEventType) => Effect.Effect<number, never>;
21
+ readonly clearAllListeners: () => Effect.Effect<void, never>;
22
+ readonly cleanup: () => Effect.Effect<void, never>;
23
+ }
24
+ export declare const EffectEventManagerContext: Context.Tag<EffectEventManagerService, EffectEventManagerService>;
25
+ /**
26
+ * Effect-based implementation of EventManager service
27
+ */
28
+ export declare class EffectEventManagerServiceImpl implements EffectEventManagerService {
29
+ private readonly eventManager;
30
+ private readonly effectListeners;
31
+ constructor(eventManager: EventManager, effectListeners: Ref.Ref<Map<QueueEventType, EffectEventListener[]>>);
32
+ /**
33
+ * Add traditional event listener (synchronous)
34
+ */
35
+ addEventListener: (eventType: string, listener: (...args: any[]) => void) => void;
36
+ /**
37
+ * Remove traditional event listener (synchronous)
38
+ */
39
+ removeEventListener: (eventType: string, listener: (...args: any[]) => void) => void;
40
+ /**
41
+ * Emit traditional event (synchronous)
42
+ */
43
+ emitEvent: (eventType: string, data?: any) => void;
44
+ /**
45
+ * Add Effect-based event listener with proper resource management
46
+ */
47
+ addEffectEventListener: (event: QueueEventType, listener: EffectEventListener) => Effect.Effect<void, never>;
48
+ /**
49
+ * Remove Effect-based event listener
50
+ */
51
+ removeEffectEventListener: (event: QueueEventType, listener: EffectEventListener) => Effect.Effect<void, never>;
52
+ /**
53
+ * Emit event to both traditional and Effect-based listeners
54
+ */
55
+ emitEffectEvent: (event: QueueEventType, item?: QueueItem) => Effect.Effect<void, never>;
56
+ /**
57
+ * Get the number of listeners for a specific event type
58
+ */
59
+ getListenerCount: (event: QueueEventType) => Effect.Effect<number, never>;
60
+ /**
61
+ * Clear all Effect-based event listeners
62
+ */
63
+ clearAllListeners: () => Effect.Effect<void, never>;
64
+ /**
65
+ * Cleanup all resources and listeners
66
+ */
67
+ cleanup: () => Effect.Effect<void, never>;
68
+ }
69
+ /**
70
+ * Create EventManager service instance
71
+ */
72
+ export declare const makeEffectEventManagerService: () => Effect.Effect<EffectEventManagerService, never>;
73
+ /**
74
+ * Layer providing Effect EventManager service
75
+ */
76
+ export declare const EffectEventManagerServiceLive: Layer.Layer<EffectEventManagerService, never>;
77
+ /**
78
+ * Scoped layer that automatically cleans up resources on scope close
79
+ */
80
+ export declare const EffectEventManagerServiceScoped: Layer.Layer<EffectEventManagerService, never, never>;
81
+ /**
82
+ * Helper functions for common event operations
83
+ */
84
+ /**
85
+ * Subscribe to multiple events with a single listener
86
+ */
87
+ export declare const subscribeToEvents: (events: QueueEventType[], listener: EffectEventListener) => Effect.Effect<void, never, EffectEventManagerService>;
88
+ /**
89
+ * Create a temporary event subscription that automatically unsubscribes when the scope closes
90
+ */
91
+ export declare const withEventSubscription: <A, E>(event: QueueEventType, listener: EffectEventListener, program: Effect.Effect<A, E, EffectEventManagerService>) => Effect.Effect<A, E, EffectEventManagerService>;
92
+ /**
93
+ * Wait for a specific event to occur
94
+ */
95
+ export declare const waitForEvent: (event: QueueEventType, predicate?: (item?: QueueItem) => boolean) => Effect.Effect<QueueItem | undefined, never, EffectEventManagerService>;
96
+ //# sourceMappingURL=event-manager-service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-manager-service.d.ts","sourceRoot":"","sources":["../../../src/effect/services/event-manager-service.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,208 @@
1
+ "use strict";
2
+ /**
3
+ * Effect-based EventManager service implementation
4
+ * Provides structured event handling and resource management for queue events
5
+ */
6
+ Object.defineProperty(exports, "__esModule", { value: true });
7
+ exports.waitForEvent = exports.withEventSubscription = exports.subscribeToEvents = exports.EffectEventManagerServiceScoped = exports.EffectEventManagerServiceLive = exports.makeEffectEventManagerService = exports.EffectEventManagerServiceImpl = exports.EffectEventManagerContext = void 0;
8
+ const effect_1 = require("effect");
9
+ const event_manager_1 = require("../../queue/event-manager");
10
+ const types_1 = require("../../queue/types");
11
+ const utils_1 = require("../utils");
12
+ exports.EffectEventManagerContext = effect_1.Context.GenericTag('@voicevox/EffectEventManager');
13
+ /**
14
+ * Effect-based implementation of EventManager service
15
+ */
16
+ class EffectEventManagerServiceImpl {
17
+ constructor(eventManager, effectListeners) {
18
+ this.eventManager = eventManager;
19
+ /**
20
+ * Add traditional event listener (synchronous)
21
+ */
22
+ this.addEventListener = (eventType, listener) => {
23
+ if (Object.values(types_1.QueueEventType).includes(eventType)) {
24
+ this.eventManager.addEventListener(eventType, listener);
25
+ }
26
+ };
27
+ /**
28
+ * Remove traditional event listener (synchronous)
29
+ */
30
+ this.removeEventListener = (eventType, listener) => {
31
+ if (Object.values(types_1.QueueEventType).includes(eventType)) {
32
+ this.eventManager.removeEventListener(eventType, listener);
33
+ }
34
+ };
35
+ /**
36
+ * Emit traditional event (synchronous)
37
+ */
38
+ this.emitEvent = (eventType, data) => {
39
+ if (Object.values(types_1.QueueEventType).includes(eventType)) {
40
+ this.eventManager.emitEvent(eventType, data);
41
+ }
42
+ };
43
+ /**
44
+ * Add Effect-based event listener with proper resource management
45
+ */
46
+ this.addEffectEventListener = (event, listener) => {
47
+ const self = this;
48
+ return (0, utils_1.logTimed)(`addEffectEventListener-${event}`, effect_1.Ref.update(self.effectListeners, (listeners) => {
49
+ const eventListeners = listeners.get(event) || [];
50
+ if (!eventListeners.includes(listener)) {
51
+ eventListeners.push(listener);
52
+ listeners.set(event, eventListeners);
53
+ }
54
+ return listeners;
55
+ }));
56
+ };
57
+ /**
58
+ * Remove Effect-based event listener
59
+ */
60
+ this.removeEffectEventListener = (event, listener) => {
61
+ const self = this;
62
+ return (0, utils_1.logTimed)(`removeEffectEventListener-${event}`, effect_1.Ref.update(self.effectListeners, (listeners) => {
63
+ const eventListeners = listeners.get(event) || [];
64
+ const index = eventListeners.indexOf(listener);
65
+ if (index !== -1) {
66
+ eventListeners.splice(index, 1);
67
+ listeners.set(event, eventListeners);
68
+ }
69
+ return listeners;
70
+ }));
71
+ };
72
+ /**
73
+ * Emit event to both traditional and Effect-based listeners
74
+ */
75
+ this.emitEffectEvent = (event, item) => {
76
+ const self = this;
77
+ return (0, utils_1.logTimed)(`emitEffectEvent-${event}`, effect_1.Effect.gen(function* () {
78
+ // Emit to traditional listeners (synchronous)
79
+ self.eventManager.emitEvent(event, item);
80
+ // Emit to Effect-based listeners (asynchronous)
81
+ const listeners = yield* effect_1.Ref.get(self.effectListeners);
82
+ const eventListeners = listeners.get(event) || [];
83
+ if (eventListeners.length > 0) {
84
+ // Run all Effect listeners in parallel
85
+ yield* effect_1.Effect.all(eventListeners.map((listener) => listener(event, item).pipe(effect_1.Effect.catchAll((error) => {
86
+ // Log listener errors but don't fail the emission
87
+ console.error(`Effect event listener error (${event}):`, error);
88
+ return effect_1.Effect.void;
89
+ }))), { concurrency: 'unbounded' });
90
+ }
91
+ }));
92
+ };
93
+ /**
94
+ * Get the number of listeners for a specific event type
95
+ */
96
+ this.getListenerCount = (event) => {
97
+ const self = this;
98
+ return effect_1.Effect.gen(function* () {
99
+ const listeners = yield* effect_1.Ref.get(self.effectListeners);
100
+ const eventListeners = listeners.get(event) || [];
101
+ return eventListeners.length;
102
+ });
103
+ };
104
+ /**
105
+ * Clear all Effect-based event listeners
106
+ */
107
+ this.clearAllListeners = () => {
108
+ const self = this;
109
+ return (0, utils_1.logTimed)('clearAllListeners', effect_1.Effect.gen(function* () {
110
+ yield* effect_1.Ref.set(self.effectListeners, new Map());
111
+ }));
112
+ };
113
+ /**
114
+ * Cleanup all resources and listeners
115
+ */
116
+ this.cleanup = () => {
117
+ const self = this;
118
+ return (0, utils_1.logTimed)('eventManagerCleanup', effect_1.Effect.gen(function* () {
119
+ // Clear all Effect-based listeners
120
+ yield* self.clearAllListeners();
121
+ // Note: Traditional listeners are managed by the underlying EventManager
122
+ // and will be cleaned up when the service is disposed
123
+ }));
124
+ };
125
+ this.effectListeners = effectListeners;
126
+ }
127
+ }
128
+ exports.EffectEventManagerServiceImpl = EffectEventManagerServiceImpl;
129
+ /**
130
+ * Create EventManager service instance
131
+ */
132
+ const makeEffectEventManagerService = () => effect_1.Effect.gen(function* () {
133
+ const eventManager = new event_manager_1.EventManager();
134
+ const effectListeners = yield* effect_1.Ref.make(new Map());
135
+ // Initialize Effect listeners map with empty arrays for each event type
136
+ const initialMap = new Map();
137
+ for (const eventType of Object.values(types_1.QueueEventType)) {
138
+ initialMap.set(eventType, []);
139
+ }
140
+ yield* effect_1.Ref.set(effectListeners, initialMap);
141
+ return new EffectEventManagerServiceImpl(eventManager, effectListeners);
142
+ });
143
+ exports.makeEffectEventManagerService = makeEffectEventManagerService;
144
+ /**
145
+ * Layer providing Effect EventManager service
146
+ */
147
+ exports.EffectEventManagerServiceLive = effect_1.Layer.effect(exports.EffectEventManagerContext, (0, exports.makeEffectEventManagerService)());
148
+ /**
149
+ * Scoped layer that automatically cleans up resources on scope close
150
+ */
151
+ exports.EffectEventManagerServiceScoped = effect_1.Layer.scoped(exports.EffectEventManagerContext, effect_1.Effect.gen(function* () {
152
+ const service = yield* (0, exports.makeEffectEventManagerService)();
153
+ // Add finalizer to cleanup resources when scope closes
154
+ yield* effect_1.Effect.addFinalizer(() => service.cleanup());
155
+ return service;
156
+ }));
157
+ /**
158
+ * Helper functions for common event operations
159
+ */
160
+ /**
161
+ * Subscribe to multiple events with a single listener
162
+ */
163
+ const subscribeToEvents = (events, listener) => {
164
+ const eventService = exports.EffectEventManagerContext;
165
+ return effect_1.Effect.gen(function* () {
166
+ const service = yield* eventService;
167
+ yield* effect_1.Effect.all(events.map((event) => service.addEffectEventListener(event, listener)), { concurrency: 'unbounded' });
168
+ });
169
+ };
170
+ exports.subscribeToEvents = subscribeToEvents;
171
+ /**
172
+ * Create a temporary event subscription that automatically unsubscribes when the scope closes
173
+ */
174
+ const withEventSubscription = (event, listener, program) => {
175
+ const eventService = exports.EffectEventManagerContext;
176
+ return effect_1.Effect.gen(function* () {
177
+ const service = yield* eventService;
178
+ // Subscribe to the event
179
+ yield* service.addEffectEventListener(event, listener);
180
+ // Run the program with automatic cleanup
181
+ return yield* effect_1.Effect.acquireUseRelease(effect_1.Effect.void, () => program, () => service.removeEffectEventListener(event, listener));
182
+ });
183
+ };
184
+ exports.withEventSubscription = withEventSubscription;
185
+ /**
186
+ * Wait for a specific event to occur
187
+ */
188
+ const waitForEvent = (event, predicate) => {
189
+ const eventService = exports.EffectEventManagerContext;
190
+ return effect_1.Effect.gen(function* () {
191
+ const service = yield* eventService;
192
+ return yield* effect_1.Effect.async((resume) => {
193
+ const listener = (eventType, item) => effect_1.Effect.sync(() => {
194
+ if (eventType === event && (!predicate || predicate(item))) {
195
+ resume(effect_1.Effect.succeed(item));
196
+ }
197
+ });
198
+ // Subscribe to the event
199
+ effect_1.Effect.runPromise(service.addEffectEventListener(event, listener));
200
+ // Return cleanup function
201
+ return effect_1.Effect.sync(() => {
202
+ effect_1.Effect.runPromise(service.removeEffectEventListener(event, listener));
203
+ });
204
+ });
205
+ });
206
+ };
207
+ exports.waitForEvent = waitForEvent;
208
+ //# sourceMappingURL=event-manager-service.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event-manager-service.js","sourceRoot":"","sources":["../../../src/effect/services/event-manager-service.ts"],"names":[],"mappings":"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"}