@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.
- package/LICENSE +14 -14
- package/dist/accent-utils.d.ts +93 -0
- package/dist/accent-utils.d.ts.map +1 -0
- package/dist/accent-utils.js +211 -0
- package/dist/accent-utils.js.map +1 -0
- package/dist/api.d.ts +40 -2
- package/dist/api.d.ts.map +1 -1
- package/dist/api.js +90 -0
- package/dist/api.js.map +1 -1
- package/dist/cache-policy.d.ts +21 -0
- package/dist/cache-policy.d.ts.map +1 -0
- package/dist/cache-policy.js +31 -0
- package/dist/cache-policy.js.map +1 -0
- package/dist/client.d.ts +28 -119
- package/dist/client.d.ts.map +1 -1
- package/dist/client.js +48 -417
- package/dist/client.js.map +1 -1
- package/dist/effect/config.d.ts +43 -0
- package/dist/effect/config.d.ts.map +1 -0
- package/dist/effect/config.js +45 -0
- package/dist/effect/config.js.map +1 -0
- package/dist/effect/context.d.ts +33 -0
- package/dist/effect/context.d.ts.map +1 -0
- package/dist/effect/context.js +10 -0
- package/dist/effect/context.js.map +1 -0
- package/dist/effect/errors.d.ts +130 -0
- package/dist/effect/errors.d.ts.map +1 -0
- package/dist/effect/errors.js +121 -0
- package/dist/effect/errors.js.map +1 -0
- package/dist/effect/index.d.ts +34 -0
- package/dist/effect/index.d.ts.map +1 -0
- package/dist/effect/index.js +67 -0
- package/dist/effect/index.js.map +1 -0
- package/dist/effect/queue-manager.d.ts +34 -0
- package/dist/effect/queue-manager.d.ts.map +1 -0
- package/dist/effect/queue-manager.js +59 -0
- package/dist/effect/queue-manager.js.map +1 -0
- package/dist/effect/services/api-service.d.ts +58 -0
- package/dist/effect/services/api-service.d.ts.map +1 -0
- package/dist/effect/services/api-service.js +90 -0
- package/dist/effect/services/api-service.js.map +1 -0
- package/dist/effect/services/audio-generator-service.d.ts +78 -0
- package/dist/effect/services/audio-generator-service.d.ts.map +1 -0
- package/dist/effect/services/audio-generator-service.js +187 -0
- package/dist/effect/services/audio-generator-service.js.map +1 -0
- package/dist/effect/services/audio-player-service.d.ts +101 -0
- package/dist/effect/services/audio-player-service.d.ts.map +1 -0
- package/dist/effect/services/audio-player-service.js +297 -0
- package/dist/effect/services/audio-player-service.js.map +1 -0
- package/dist/effect/services/event-manager-service.d.ts +96 -0
- package/dist/effect/services/event-manager-service.d.ts.map +1 -0
- package/dist/effect/services/event-manager-service.js +208 -0
- package/dist/effect/services/event-manager-service.js.map +1 -0
- package/dist/effect/services/file-manager-service.d.ts +91 -0
- package/dist/effect/services/file-manager-service.d.ts.map +1 -0
- package/dist/effect/services/file-manager-service.js +215 -0
- package/dist/effect/services/file-manager-service.js.map +1 -0
- package/dist/effect/utils.d.ts +118 -0
- package/dist/effect/utils.d.ts.map +1 -0
- package/dist/effect/utils.js +186 -0
- package/dist/effect/utils.js.map +1 -0
- package/dist/error.js.map +1 -1
- package/dist/index.d.ts +3 -1
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -1
- package/dist/index.js.map +1 -1
- package/dist/playback/node-playback-strategy.d.ts.map +1 -1
- package/dist/playback/node-playback-strategy.js +2 -6
- package/dist/playback/node-playback-strategy.js.map +1 -1
- package/dist/player.d.ts +110 -0
- package/dist/player.d.ts.map +1 -0
- package/dist/player.js +183 -0
- package/dist/player.js.map +1 -0
- package/dist/queue/audio-player.d.ts +44 -0
- package/dist/queue/audio-player.d.ts.map +1 -0
- package/dist/queue/audio-player.js +344 -0
- package/dist/queue/audio-player.js.map +1 -0
- package/dist/queue/file-manager.js +9 -9
- package/dist/queue/file-manager.js.map +1 -1
- package/dist/queue/manager.d.ts +134 -0
- package/dist/queue/manager.d.ts.map +1 -0
- package/dist/queue/manager.js +564 -0
- package/dist/queue/manager.js.map +1 -0
- package/dist/queue/queue-service.d.ts.map +1 -1
- package/dist/queue/queue-service.js +20 -6
- package/dist/queue/queue-service.js.map +1 -1
- package/dist/queue/types.d.ts +3 -1
- package/dist/queue/types.d.ts.map +1 -1
- package/dist/queue/types.js.map +1 -1
- package/dist/services/dictionary-service.d.ts +35 -0
- package/dist/services/dictionary-service.d.ts.map +1 -0
- package/dist/services/dictionary-service.js +188 -0
- package/dist/services/dictionary-service.js.map +1 -0
- package/dist/services/speech-service.d.ts +43 -0
- package/dist/services/speech-service.d.ts.map +1 -0
- package/dist/services/speech-service.js +236 -0
- package/dist/services/speech-service.js.map +1 -0
- package/dist/shared-queue-manager.d.ts +119 -0
- package/dist/shared-queue-manager.d.ts.map +1 -0
- package/dist/shared-queue-manager.js +487 -0
- package/dist/shared-queue-manager.js.map +1 -0
- package/dist/state/queue-state-machine.d.ts.map +1 -1
- package/dist/state/queue-state-machine.js +13 -0
- package/dist/state/queue-state-machine.js.map +1 -1
- package/dist/state/types.d.ts +2 -0
- package/dist/state/types.d.ts.map +1 -1
- package/dist/state/types.js.map +1 -1
- package/dist/types.d.ts +28 -0
- package/dist/types.d.ts.map +1 -1
- package/dist/utils.d.ts +16 -0
- package/dist/utils.d.ts.map +1 -1
- package/dist/utils.js +36 -0
- package/dist/utils.js.map +1 -1
- 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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"}
|