@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,91 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect-based AudioFileManager service implementation
|
|
3
|
+
* Provides structured error handling and resource management for file operations
|
|
4
|
+
*/
|
|
5
|
+
import { Context, Effect, Layer, type Scope } from 'effect';
|
|
6
|
+
import { type FileOperationError } from '../errors';
|
|
7
|
+
/**
|
|
8
|
+
* EffectFileManagerService interface
|
|
9
|
+
*/
|
|
10
|
+
export interface EffectFileManagerService {
|
|
11
|
+
readonly saveTempAudioFile: (audioData: ArrayBuffer) => Effect.Effect<string, FileOperationError>;
|
|
12
|
+
readonly saveAudioFile: (audioData: ArrayBuffer, output: string, forceDownload?: boolean) => Effect.Effect<string, FileOperationError>;
|
|
13
|
+
readonly deleteTempFile: (filePath: string) => Effect.Effect<void, FileOperationError>;
|
|
14
|
+
readonly createTempFilePath: () => Effect.Effect<string, FileOperationError>;
|
|
15
|
+
readonly createBlobUrl: (blob: Blob) => Effect.Effect<string, FileOperationError>;
|
|
16
|
+
readonly releaseBlobUrl: (url: string) => Effect.Effect<void, never>;
|
|
17
|
+
readonly releaseAllBlobUrls: () => Effect.Effect<void, never>;
|
|
18
|
+
readonly withTempFile: <A, E>(audioData: ArrayBuffer, use: (filePath: string) => Effect.Effect<A, E>) => Effect.Effect<A, E | FileOperationError>;
|
|
19
|
+
readonly deleteMultipleTempFiles: (filePaths: readonly string[]) => Effect.Effect<void, FileOperationError>;
|
|
20
|
+
readonly saveMultipleTempAudioFiles: (audioDataArray: readonly ArrayBuffer[]) => Effect.Effect<readonly string[], FileOperationError>;
|
|
21
|
+
readonly getFileSize: (filePath: string) => Effect.Effect<number | null, FileOperationError>;
|
|
22
|
+
readonly cleanup: () => Effect.Effect<void, never>;
|
|
23
|
+
}
|
|
24
|
+
export declare const EffectFileManagerContext: Context.Tag<EffectFileManagerService, EffectFileManagerService>;
|
|
25
|
+
/**
|
|
26
|
+
* Effect-based implementation of AudioFileManager service
|
|
27
|
+
*/
|
|
28
|
+
export declare class EffectFileManagerServiceImpl implements EffectFileManagerService {
|
|
29
|
+
private blobUrls;
|
|
30
|
+
/**
|
|
31
|
+
* Save audio data to temporary file with Effect-based error handling
|
|
32
|
+
*/
|
|
33
|
+
saveTempAudioFile: (audioData: ArrayBuffer) => Effect.Effect<string, FileOperationError>;
|
|
34
|
+
/**
|
|
35
|
+
* Save audio data to specific file path with Effect-based error handling
|
|
36
|
+
*/
|
|
37
|
+
saveAudioFile: (audioData: ArrayBuffer, output: string, forceDownload?: boolean) => Effect.Effect<string, FileOperationError>;
|
|
38
|
+
/**
|
|
39
|
+
* Delete temporary file with Effect-based error handling
|
|
40
|
+
*/
|
|
41
|
+
deleteTempFile: (filePath: string) => Effect.Effect<void, FileOperationError>;
|
|
42
|
+
/**
|
|
43
|
+
* Create temporary file path with Effect-based error handling
|
|
44
|
+
*/
|
|
45
|
+
createTempFilePath: () => Effect.Effect<string, FileOperationError>;
|
|
46
|
+
/**
|
|
47
|
+
* Create blob URL with Effect-based error handling
|
|
48
|
+
*/
|
|
49
|
+
createBlobUrl: (blob: Blob) => Effect.Effect<string, FileOperationError>;
|
|
50
|
+
/**
|
|
51
|
+
* Release blob URL (infallible operation)
|
|
52
|
+
*/
|
|
53
|
+
releaseBlobUrl: (url: string) => Effect.Effect<void, never>;
|
|
54
|
+
/**
|
|
55
|
+
* Release all blob URLs (infallible operation)
|
|
56
|
+
*/
|
|
57
|
+
releaseAllBlobUrls: () => Effect.Effect<void, never>;
|
|
58
|
+
/**
|
|
59
|
+
* Create temporary file with automatic cleanup using Scope
|
|
60
|
+
*/
|
|
61
|
+
withTempFile: <A, E>(audioData: ArrayBuffer, use: (filePath: string) => Effect.Effect<A, E>) => Effect.Effect<A, E | FileOperationError>;
|
|
62
|
+
/**
|
|
63
|
+
* Batch delete multiple temporary files
|
|
64
|
+
*/
|
|
65
|
+
deleteMultipleTempFiles: (filePaths: readonly string[]) => Effect.Effect<void, FileOperationError>;
|
|
66
|
+
/**
|
|
67
|
+
* Create multiple temporary files from audio data array
|
|
68
|
+
*/
|
|
69
|
+
saveMultipleTempAudioFiles: (audioDataArray: readonly ArrayBuffer[]) => Effect.Effect<readonly string[], FileOperationError>;
|
|
70
|
+
/**
|
|
71
|
+
* Get file size information (Node.js only, returns null in browser)
|
|
72
|
+
*/
|
|
73
|
+
getFileSize: (filePath: string) => Effect.Effect<number | null, FileOperationError>;
|
|
74
|
+
/**
|
|
75
|
+
* Clean up all resources (blob URLs and temp files)
|
|
76
|
+
*/
|
|
77
|
+
cleanup: () => Effect.Effect<void, never>;
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Create FileManager service instance
|
|
81
|
+
*/
|
|
82
|
+
export declare const makeEffectFileManagerService: () => Effect.Effect<EffectFileManagerService, never>;
|
|
83
|
+
/**
|
|
84
|
+
* Layer providing Effect FileManager service
|
|
85
|
+
*/
|
|
86
|
+
export declare const EffectFileManagerServiceLive: Layer.Layer<EffectFileManagerService, never, never>;
|
|
87
|
+
/**
|
|
88
|
+
* Scoped layer that automatically cleans up resources on scope close
|
|
89
|
+
*/
|
|
90
|
+
export declare const EffectFileManagerServiceScoped: Layer.Layer<EffectFileManagerService, never, Scope.Scope>;
|
|
91
|
+
//# sourceMappingURL=file-manager-service.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-manager-service.d.ts","sourceRoot":"","sources":["../../../src/effect/services/file-manager-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,215 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effect-based AudioFileManager service implementation
|
|
4
|
+
* Provides structured error handling and resource management for file operations
|
|
5
|
+
*/
|
|
6
|
+
var __createBinding = (this && this.__createBinding) || (Object.create ? (function(o, m, k, k2) {
|
|
7
|
+
if (k2 === undefined) k2 = k;
|
|
8
|
+
var desc = Object.getOwnPropertyDescriptor(m, k);
|
|
9
|
+
if (!desc || ("get" in desc ? !m.__esModule : desc.writable || desc.configurable)) {
|
|
10
|
+
desc = { enumerable: true, get: function() { return m[k]; } };
|
|
11
|
+
}
|
|
12
|
+
Object.defineProperty(o, k2, desc);
|
|
13
|
+
}) : (function(o, m, k, k2) {
|
|
14
|
+
if (k2 === undefined) k2 = k;
|
|
15
|
+
o[k2] = m[k];
|
|
16
|
+
}));
|
|
17
|
+
var __setModuleDefault = (this && this.__setModuleDefault) || (Object.create ? (function(o, v) {
|
|
18
|
+
Object.defineProperty(o, "default", { enumerable: true, value: v });
|
|
19
|
+
}) : function(o, v) {
|
|
20
|
+
o["default"] = v;
|
|
21
|
+
});
|
|
22
|
+
var __importStar = (this && this.__importStar) || (function () {
|
|
23
|
+
var ownKeys = function(o) {
|
|
24
|
+
ownKeys = Object.getOwnPropertyNames || function (o) {
|
|
25
|
+
var ar = [];
|
|
26
|
+
for (var k in o) if (Object.prototype.hasOwnProperty.call(o, k)) ar[ar.length] = k;
|
|
27
|
+
return ar;
|
|
28
|
+
};
|
|
29
|
+
return ownKeys(o);
|
|
30
|
+
};
|
|
31
|
+
return function (mod) {
|
|
32
|
+
if (mod && mod.__esModule) return mod;
|
|
33
|
+
var result = {};
|
|
34
|
+
if (mod != null) for (var k = ownKeys(mod), i = 0; i < k.length; i++) if (k[i] !== "default") __createBinding(result, mod, k[i]);
|
|
35
|
+
__setModuleDefault(result, mod);
|
|
36
|
+
return result;
|
|
37
|
+
};
|
|
38
|
+
})();
|
|
39
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
40
|
+
exports.EffectFileManagerServiceScoped = exports.EffectFileManagerServiceLive = exports.makeEffectFileManagerService = exports.EffectFileManagerServiceImpl = exports.EffectFileManagerContext = void 0;
|
|
41
|
+
const effect_1 = require("effect");
|
|
42
|
+
const fs = __importStar(require("node:fs/promises"));
|
|
43
|
+
const path = __importStar(require("node:path"));
|
|
44
|
+
const os = __importStar(require("node:os"));
|
|
45
|
+
const errors_1 = require("../errors");
|
|
46
|
+
const utils_1 = require("../utils");
|
|
47
|
+
exports.EffectFileManagerContext = effect_1.Context.GenericTag('@voicevox/EffectFileManager');
|
|
48
|
+
/**
|
|
49
|
+
* Effect-based implementation of AudioFileManager service
|
|
50
|
+
*/
|
|
51
|
+
class EffectFileManagerServiceImpl {
|
|
52
|
+
constructor() {
|
|
53
|
+
this.blobUrls = new Set();
|
|
54
|
+
/**
|
|
55
|
+
* Save audio data to temporary file with Effect-based error handling
|
|
56
|
+
*/
|
|
57
|
+
this.saveTempAudioFile = (audioData) => (0, utils_1.logTimed)('saveTempAudioFile', (0, errors_1.safeAsync)(async () => {
|
|
58
|
+
const tempDir = os.tmpdir();
|
|
59
|
+
const fileName = `voicevox_${Date.now()}_${Math.random().toString(36).substring(2)}.wav`;
|
|
60
|
+
const filePath = path.join(tempDir, fileName);
|
|
61
|
+
const buffer = Buffer.from(audioData);
|
|
62
|
+
await fs.writeFile(filePath, buffer);
|
|
63
|
+
return filePath;
|
|
64
|
+
}, (error) => (0, errors_1.makeFileOperationError)('Failed to save audio data to temporary file', 'write', undefined, error)));
|
|
65
|
+
/**
|
|
66
|
+
* Save audio data to specific file path with Effect-based error handling
|
|
67
|
+
*/
|
|
68
|
+
this.saveAudioFile = (audioData, output, forceDownload = true) => (0, utils_1.logTimed)(`saveAudioFile-${output}`, (0, errors_1.safeAsync)(async () => {
|
|
69
|
+
const buffer = Buffer.from(audioData);
|
|
70
|
+
const outputPath = path.resolve(output);
|
|
71
|
+
// Ensure directory exists
|
|
72
|
+
const dir = path.dirname(outputPath);
|
|
73
|
+
await fs.mkdir(dir, { recursive: true });
|
|
74
|
+
await fs.writeFile(outputPath, buffer);
|
|
75
|
+
return outputPath;
|
|
76
|
+
}, (error) => (0, errors_1.makeFileOperationError)('Failed to save audio file', 'write', output, error)));
|
|
77
|
+
/**
|
|
78
|
+
* Delete temporary file with Effect-based error handling
|
|
79
|
+
*/
|
|
80
|
+
this.deleteTempFile = (filePath) => (0, utils_1.logTimed)(`deleteTempFile-${filePath}`, (0, errors_1.safeAsync)(async () => {
|
|
81
|
+
try {
|
|
82
|
+
await fs.unlink(filePath);
|
|
83
|
+
}
|
|
84
|
+
catch (error) {
|
|
85
|
+
// Ignore file not found errors
|
|
86
|
+
if (error.code !== 'ENOENT') {
|
|
87
|
+
throw error;
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}, (error) => (0, errors_1.makeFileOperationError)('Failed to delete temporary file', 'delete', filePath, error)));
|
|
91
|
+
/**
|
|
92
|
+
* Create temporary file path with Effect-based error handling
|
|
93
|
+
*/
|
|
94
|
+
this.createTempFilePath = () => (0, errors_1.safeSync)(() => {
|
|
95
|
+
const tempDir = os.tmpdir();
|
|
96
|
+
const fileName = `voicevox_${Date.now()}_${Math.random().toString(36).substring(2)}.wav`;
|
|
97
|
+
return path.join(tempDir, fileName);
|
|
98
|
+
}, (error) => (0, errors_1.makeFileOperationError)('Failed to create temporary file path', 'write', undefined, error));
|
|
99
|
+
/**
|
|
100
|
+
* Create blob URL with Effect-based error handling
|
|
101
|
+
*/
|
|
102
|
+
this.createBlobUrl = (blob) => (0, errors_1.safeSync)(() => {
|
|
103
|
+
if (typeof URL !== 'undefined' && URL.createObjectURL) {
|
|
104
|
+
const url = URL.createObjectURL(blob);
|
|
105
|
+
this.blobUrls.add(url);
|
|
106
|
+
return url;
|
|
107
|
+
}
|
|
108
|
+
throw new Error('Blob URL creation not supported in this environment');
|
|
109
|
+
}, (error) => (0, errors_1.makeFileOperationError)('Failed to create blob URL', 'write', undefined, error));
|
|
110
|
+
/**
|
|
111
|
+
* Release blob URL (infallible operation)
|
|
112
|
+
*/
|
|
113
|
+
this.releaseBlobUrl = (url) => effect_1.Effect.sync(() => {
|
|
114
|
+
if (typeof URL !== 'undefined' && URL.revokeObjectURL) {
|
|
115
|
+
URL.revokeObjectURL(url);
|
|
116
|
+
this.blobUrls.delete(url);
|
|
117
|
+
}
|
|
118
|
+
});
|
|
119
|
+
/**
|
|
120
|
+
* Release all blob URLs (infallible operation)
|
|
121
|
+
*/
|
|
122
|
+
this.releaseAllBlobUrls = () => effect_1.Effect.sync(() => {
|
|
123
|
+
if (typeof URL !== 'undefined' && URL.revokeObjectURL) {
|
|
124
|
+
for (const url of this.blobUrls) {
|
|
125
|
+
URL.revokeObjectURL(url);
|
|
126
|
+
}
|
|
127
|
+
this.blobUrls.clear();
|
|
128
|
+
}
|
|
129
|
+
});
|
|
130
|
+
/**
|
|
131
|
+
* Create temporary file with automatic cleanup using Scope
|
|
132
|
+
*/
|
|
133
|
+
this.withTempFile = (audioData, use) => {
|
|
134
|
+
const self = this;
|
|
135
|
+
return effect_1.Effect.gen(function* () {
|
|
136
|
+
// Create temp file
|
|
137
|
+
const filePath = yield* self.saveTempAudioFile(audioData);
|
|
138
|
+
// Use the file with automatic cleanup
|
|
139
|
+
return yield* effect_1.Effect.acquireUseRelease(effect_1.Effect.succeed(filePath), use, (path) => self.deleteTempFile(path).pipe(effect_1.Effect.catchAll((error) => {
|
|
140
|
+
// Log cleanup errors but don't fail the operation
|
|
141
|
+
console.warn(`Failed to cleanup temp file ${path}:`, error);
|
|
142
|
+
return effect_1.Effect.void;
|
|
143
|
+
})));
|
|
144
|
+
});
|
|
145
|
+
};
|
|
146
|
+
/**
|
|
147
|
+
* Batch delete multiple temporary files
|
|
148
|
+
*/
|
|
149
|
+
this.deleteMultipleTempFiles = (filePaths) => {
|
|
150
|
+
const self = this;
|
|
151
|
+
return effect_1.Effect.gen(function* () {
|
|
152
|
+
// Delete all files in parallel with limited concurrency
|
|
153
|
+
yield* effect_1.Effect.all(filePaths.map((path) => self.deleteTempFile(path)), { concurrency: 5 });
|
|
154
|
+
});
|
|
155
|
+
};
|
|
156
|
+
/**
|
|
157
|
+
* Create multiple temporary files from audio data array
|
|
158
|
+
*/
|
|
159
|
+
this.saveMultipleTempAudioFiles = (audioDataArray) => {
|
|
160
|
+
const self = this;
|
|
161
|
+
return effect_1.Effect.gen(function* () {
|
|
162
|
+
// Save all files in parallel with limited concurrency
|
|
163
|
+
const filePaths = yield* effect_1.Effect.all(audioDataArray.map((data) => self.saveTempAudioFile(data)), { concurrency: 3 });
|
|
164
|
+
return filePaths;
|
|
165
|
+
});
|
|
166
|
+
};
|
|
167
|
+
/**
|
|
168
|
+
* Get file size information (Node.js only, returns null in browser)
|
|
169
|
+
*/
|
|
170
|
+
this.getFileSize = (filePath) => (0, errors_1.safeAsync)(async () => {
|
|
171
|
+
try {
|
|
172
|
+
const stats = await fs.stat(filePath);
|
|
173
|
+
return stats.size;
|
|
174
|
+
}
|
|
175
|
+
catch (error) {
|
|
176
|
+
if (error.code === 'ENOENT') {
|
|
177
|
+
return null;
|
|
178
|
+
}
|
|
179
|
+
throw error;
|
|
180
|
+
}
|
|
181
|
+
}, (error) => (0, errors_1.makeFileOperationError)('Failed to get file size', 'read', filePath, error));
|
|
182
|
+
/**
|
|
183
|
+
* Clean up all resources (blob URLs and temp files)
|
|
184
|
+
*/
|
|
185
|
+
this.cleanup = () => {
|
|
186
|
+
const self = this;
|
|
187
|
+
return effect_1.Effect.gen(function* () {
|
|
188
|
+
// Release all blob URLs
|
|
189
|
+
yield* self.releaseAllBlobUrls();
|
|
190
|
+
// Note: We can't automatically clean up all temp files since we don't track them
|
|
191
|
+
// This should be handled by the application or OS temp cleanup
|
|
192
|
+
});
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
}
|
|
196
|
+
exports.EffectFileManagerServiceImpl = EffectFileManagerServiceImpl;
|
|
197
|
+
/**
|
|
198
|
+
* Create FileManager service instance
|
|
199
|
+
*/
|
|
200
|
+
const makeEffectFileManagerService = () => effect_1.Effect.sync(() => new EffectFileManagerServiceImpl());
|
|
201
|
+
exports.makeEffectFileManagerService = makeEffectFileManagerService;
|
|
202
|
+
/**
|
|
203
|
+
* Layer providing Effect FileManager service
|
|
204
|
+
*/
|
|
205
|
+
exports.EffectFileManagerServiceLive = effect_1.Layer.effect(exports.EffectFileManagerContext, (0, exports.makeEffectFileManagerService)());
|
|
206
|
+
/**
|
|
207
|
+
* Scoped layer that automatically cleans up resources on scope close
|
|
208
|
+
*/
|
|
209
|
+
exports.EffectFileManagerServiceScoped = effect_1.Layer.scoped(exports.EffectFileManagerContext, effect_1.Effect.gen(function* () {
|
|
210
|
+
const service = yield* (0, exports.makeEffectFileManagerService)();
|
|
211
|
+
// Add finalizer to cleanup resources when scope closes
|
|
212
|
+
yield* effect_1.Effect.addFinalizer(() => service.cleanup());
|
|
213
|
+
return service;
|
|
214
|
+
}));
|
|
215
|
+
//# sourceMappingURL=file-manager-service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"file-manager-service.js","sourceRoot":"","sources":["../../../src/effect/services/file-manager-service.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Effect utility functions and common patterns
|
|
3
|
+
* Provides reusable Effect combinators for the VOICEVOX system
|
|
4
|
+
*/
|
|
5
|
+
import { Deferred, Duration, Effect, Option } from 'effect';
|
|
6
|
+
/**
|
|
7
|
+
* Resource management utilities
|
|
8
|
+
*/
|
|
9
|
+
/**
|
|
10
|
+
* Safely execute an operation with automatic cleanup
|
|
11
|
+
*/
|
|
12
|
+
export declare const withResource: <R, E, A, B>(acquire: Effect.Effect<A, E, R>, release: (resource: A) => Effect.Effect<void, never, R>, use: (resource: A) => Effect.Effect<B, E, R>) => Effect.Effect<B, E, R>;
|
|
13
|
+
/**
|
|
14
|
+
* Manage a temporary file with automatic cleanup
|
|
15
|
+
*/
|
|
16
|
+
export declare const withTempFile: <R, E, A>(createFile: () => Effect.Effect<string, E, R>, deleteFile: (path: string) => Effect.Effect<void, never, R>, use: (filePath: string) => Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
17
|
+
/**
|
|
18
|
+
* Async coordination utilities
|
|
19
|
+
*/
|
|
20
|
+
/**
|
|
21
|
+
* Create a deferred promise that can be resolved later
|
|
22
|
+
*/
|
|
23
|
+
export declare const createDeferred: <A>() => Effect.Effect<Deferred.Deferred<A, never>, never>;
|
|
24
|
+
/**
|
|
25
|
+
* Wait for a condition to be true with timeout
|
|
26
|
+
*/
|
|
27
|
+
export declare const waitForCondition: <R, E>(condition: Effect.Effect<boolean, E, R>, timeout: Duration.Duration, checkInterval?: Duration.Duration) => Effect.Effect<void, E | Error, R>;
|
|
28
|
+
/**
|
|
29
|
+
* Execute effects in parallel with concurrency limit
|
|
30
|
+
*/
|
|
31
|
+
export declare const parallelWithLimit: <R, E, A>(effects: readonly Effect.Effect<A, E, R>[], concurrency: number) => Effect.Effect<readonly A[], E, R>;
|
|
32
|
+
/**
|
|
33
|
+
* Queue utilities
|
|
34
|
+
*/
|
|
35
|
+
/**
|
|
36
|
+
* Process items from a queue with a given processor function
|
|
37
|
+
*/
|
|
38
|
+
export declare const processQueueItems: <A, R, E>(getItems: Effect.Effect<readonly A[], E, R>, processItem: (item: A) => Effect.Effect<void, E, R>, maxConcurrency?: number) => Effect.Effect<void, E, R>;
|
|
39
|
+
/**
|
|
40
|
+
* State management utilities
|
|
41
|
+
*/
|
|
42
|
+
/**
|
|
43
|
+
* Create a thread-safe counter
|
|
44
|
+
*/
|
|
45
|
+
export declare const createCounter: (initialValue?: number) => Effect.Effect<{
|
|
46
|
+
readonly increment: Effect.Effect<number, never>;
|
|
47
|
+
readonly decrement: Effect.Effect<number, never>;
|
|
48
|
+
readonly get: Effect.Effect<number, never>;
|
|
49
|
+
readonly set: (value: number) => Effect.Effect<void, never>;
|
|
50
|
+
}, never>;
|
|
51
|
+
/**
|
|
52
|
+
* Create a thread-safe boolean flag
|
|
53
|
+
*/
|
|
54
|
+
export declare const createFlag: (initialValue?: boolean) => Effect.Effect<{
|
|
55
|
+
readonly set: Effect.Effect<void, never>;
|
|
56
|
+
readonly unset: Effect.Effect<void, never>;
|
|
57
|
+
readonly get: Effect.Effect<boolean, never>;
|
|
58
|
+
readonly toggle: Effect.Effect<boolean, never>;
|
|
59
|
+
}, never>;
|
|
60
|
+
/**
|
|
61
|
+
* Scheduling utilities
|
|
62
|
+
*/
|
|
63
|
+
/**
|
|
64
|
+
* Execute with timeout
|
|
65
|
+
*/
|
|
66
|
+
export declare const withTimeout: <R, E, A>(effect: Effect.Effect<A, E, R>, timeout: Duration.Duration) => Effect.Effect<A, E | Error, R>;
|
|
67
|
+
/**
|
|
68
|
+
* Logging utilities
|
|
69
|
+
*/
|
|
70
|
+
/**
|
|
71
|
+
* Log an effect's execution with timing
|
|
72
|
+
*/
|
|
73
|
+
export declare const logTimed: <R, E, A>(label: string, effect: Effect.Effect<A, E, R>) => Effect.Effect<A, E, R>;
|
|
74
|
+
/**
|
|
75
|
+
* Collection utilities
|
|
76
|
+
*/
|
|
77
|
+
/**
|
|
78
|
+
* Find the first item in a collection that matches a predicate
|
|
79
|
+
*/
|
|
80
|
+
export declare const findFirst: <A>(items: readonly A[], predicate: (item: A) => boolean) => Option.Option<A>;
|
|
81
|
+
/**
|
|
82
|
+
* Remove an item from an array by ID
|
|
83
|
+
*/
|
|
84
|
+
export declare const removeById: <A extends {
|
|
85
|
+
id: string;
|
|
86
|
+
}>(items: readonly A[], id: string) => readonly A[];
|
|
87
|
+
/**
|
|
88
|
+
* Update an item in an array by ID
|
|
89
|
+
*/
|
|
90
|
+
export declare const updateById: <A extends {
|
|
91
|
+
id: string;
|
|
92
|
+
}>(items: readonly A[], id: string, updater: (item: A) => A) => readonly A[];
|
|
93
|
+
/**
|
|
94
|
+
* Error handling utilities
|
|
95
|
+
*/
|
|
96
|
+
/**
|
|
97
|
+
* Catch and transform errors
|
|
98
|
+
*/
|
|
99
|
+
export declare const catchAndMap: <R, E1, E2, A>(effect: Effect.Effect<A, E1, R>, mapper: (error: E1) => E2) => Effect.Effect<A, E2, R>;
|
|
100
|
+
/**
|
|
101
|
+
* Provide a fallback value in case of error
|
|
102
|
+
*/
|
|
103
|
+
export declare const orElse: <R, E, A>(effect: Effect.Effect<A, E, R>, fallback: A) => Effect.Effect<A, never, R>;
|
|
104
|
+
/**
|
|
105
|
+
* Convert common patterns to Effect-friendly operations
|
|
106
|
+
*/
|
|
107
|
+
/**
|
|
108
|
+
* Convert a callback-based operation to Effect
|
|
109
|
+
*/
|
|
110
|
+
export declare const fromCallback: <A, E = Error>(fn: (callback: (error: E | null, result?: A) => void) => void) => Effect.Effect<A, E>;
|
|
111
|
+
/**
|
|
112
|
+
* Convert an event-based operation to Effect with timeout
|
|
113
|
+
*/
|
|
114
|
+
export declare const fromEvent: <A>(target: {
|
|
115
|
+
addEventListener: (eventName: string, handler: (event: A) => void) => void;
|
|
116
|
+
removeEventListener: (eventName: string, handler: (event: A) => void) => void;
|
|
117
|
+
}, eventName: string, timeout?: Duration.Duration) => Effect.Effect<A, Error>;
|
|
118
|
+
//# sourceMappingURL=utils.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../../src/effect/utils.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,186 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* Effect utility functions and common patterns
|
|
4
|
+
* Provides reusable Effect combinators for the VOICEVOX system
|
|
5
|
+
*/
|
|
6
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
7
|
+
exports.fromEvent = exports.fromCallback = exports.orElse = exports.catchAndMap = exports.updateById = exports.removeById = exports.findFirst = exports.logTimed = exports.withTimeout = exports.createFlag = exports.createCounter = exports.processQueueItems = exports.parallelWithLimit = exports.waitForCondition = exports.createDeferred = exports.withTempFile = exports.withResource = void 0;
|
|
8
|
+
const effect_1 = require("effect");
|
|
9
|
+
/**
|
|
10
|
+
* Resource management utilities
|
|
11
|
+
*/
|
|
12
|
+
/**
|
|
13
|
+
* Safely execute an operation with automatic cleanup
|
|
14
|
+
*/
|
|
15
|
+
const withResource = (acquire, release, use) => effect_1.Effect.acquireUseRelease(acquire, use, release);
|
|
16
|
+
exports.withResource = withResource;
|
|
17
|
+
/**
|
|
18
|
+
* Manage a temporary file with automatic cleanup
|
|
19
|
+
*/
|
|
20
|
+
const withTempFile = (createFile, deleteFile, use) => (0, exports.withResource)(createFile(), deleteFile, use);
|
|
21
|
+
exports.withTempFile = withTempFile;
|
|
22
|
+
/**
|
|
23
|
+
* Async coordination utilities
|
|
24
|
+
*/
|
|
25
|
+
/**
|
|
26
|
+
* Create a deferred promise that can be resolved later
|
|
27
|
+
*/
|
|
28
|
+
const createDeferred = () => effect_1.Deferred.make();
|
|
29
|
+
exports.createDeferred = createDeferred;
|
|
30
|
+
/**
|
|
31
|
+
* Wait for a condition to be true with timeout
|
|
32
|
+
*/
|
|
33
|
+
const waitForCondition = (condition, timeout, checkInterval = effect_1.Duration.millis(50)) => effect_1.Effect.gen(function* () {
|
|
34
|
+
const deadline = yield* effect_1.Effect.sync(() => Date.now() + effect_1.Duration.toMillis(timeout));
|
|
35
|
+
while (true) {
|
|
36
|
+
const isReady = yield* condition;
|
|
37
|
+
if (isReady)
|
|
38
|
+
return;
|
|
39
|
+
if (Date.now() > deadline) {
|
|
40
|
+
throw new Error('Condition timeout');
|
|
41
|
+
}
|
|
42
|
+
yield* effect_1.Effect.sleep(checkInterval);
|
|
43
|
+
}
|
|
44
|
+
});
|
|
45
|
+
exports.waitForCondition = waitForCondition;
|
|
46
|
+
/**
|
|
47
|
+
* Execute effects in parallel with concurrency limit
|
|
48
|
+
*/
|
|
49
|
+
const parallelWithLimit = (effects, concurrency) => effect_1.Effect.all(effects, { concurrency });
|
|
50
|
+
exports.parallelWithLimit = parallelWithLimit;
|
|
51
|
+
/**
|
|
52
|
+
* Queue utilities
|
|
53
|
+
*/
|
|
54
|
+
/**
|
|
55
|
+
* Process items from a queue with a given processor function
|
|
56
|
+
*/
|
|
57
|
+
const processQueueItems = (getItems, processItem, maxConcurrency = 1) => effect_1.Effect.gen(function* () {
|
|
58
|
+
const items = yield* getItems;
|
|
59
|
+
if (items.length === 0)
|
|
60
|
+
return;
|
|
61
|
+
yield* (0, exports.parallelWithLimit)(items.map(processItem), maxConcurrency);
|
|
62
|
+
});
|
|
63
|
+
exports.processQueueItems = processQueueItems;
|
|
64
|
+
/**
|
|
65
|
+
* State management utilities
|
|
66
|
+
*/
|
|
67
|
+
/**
|
|
68
|
+
* Create a thread-safe counter
|
|
69
|
+
*/
|
|
70
|
+
const createCounter = (initialValue = 0) => effect_1.Effect.gen(function* () {
|
|
71
|
+
const ref = yield* effect_1.Ref.make(initialValue);
|
|
72
|
+
return {
|
|
73
|
+
increment: effect_1.Ref.updateAndGet(ref, (n) => n + 1),
|
|
74
|
+
decrement: effect_1.Ref.updateAndGet(ref, (n) => n - 1),
|
|
75
|
+
get: effect_1.Ref.get(ref),
|
|
76
|
+
set: (value) => effect_1.Ref.set(ref, value),
|
|
77
|
+
};
|
|
78
|
+
});
|
|
79
|
+
exports.createCounter = createCounter;
|
|
80
|
+
/**
|
|
81
|
+
* Create a thread-safe boolean flag
|
|
82
|
+
*/
|
|
83
|
+
const createFlag = (initialValue = false) => effect_1.Effect.gen(function* () {
|
|
84
|
+
const ref = yield* effect_1.Ref.make(initialValue);
|
|
85
|
+
return {
|
|
86
|
+
set: effect_1.Ref.set(ref, true),
|
|
87
|
+
unset: effect_1.Ref.set(ref, false),
|
|
88
|
+
get: effect_1.Ref.get(ref),
|
|
89
|
+
toggle: effect_1.Ref.updateAndGet(ref, (b) => !b),
|
|
90
|
+
};
|
|
91
|
+
});
|
|
92
|
+
exports.createFlag = createFlag;
|
|
93
|
+
/**
|
|
94
|
+
* Scheduling utilities
|
|
95
|
+
*/
|
|
96
|
+
/**
|
|
97
|
+
* Execute with timeout
|
|
98
|
+
*/
|
|
99
|
+
const withTimeout = (effect, timeout) => effect_1.Effect.race(effect, effect_1.Effect.sleep(timeout).pipe(effect_1.Effect.andThen(effect_1.Effect.fail(new Error(`Operation timed out after ${effect_1.Duration.toMillis(timeout)}ms`)))));
|
|
100
|
+
exports.withTimeout = withTimeout;
|
|
101
|
+
/**
|
|
102
|
+
* Logging utilities
|
|
103
|
+
*/
|
|
104
|
+
/**
|
|
105
|
+
* Log an effect's execution with timing
|
|
106
|
+
*/
|
|
107
|
+
const logTimed = (label, effect) => effect_1.Effect.gen(function* () {
|
|
108
|
+
const start = yield* effect_1.Effect.sync(() => Date.now());
|
|
109
|
+
yield* effect_1.Effect.log(`[${label}] Starting...`);
|
|
110
|
+
const result = yield* effect;
|
|
111
|
+
const end = yield* effect_1.Effect.sync(() => Date.now());
|
|
112
|
+
yield* effect_1.Effect.log(`[${label}] Completed in ${end - start}ms`);
|
|
113
|
+
return result;
|
|
114
|
+
});
|
|
115
|
+
exports.logTimed = logTimed;
|
|
116
|
+
/**
|
|
117
|
+
* Collection utilities
|
|
118
|
+
*/
|
|
119
|
+
/**
|
|
120
|
+
* Find the first item in a collection that matches a predicate
|
|
121
|
+
*/
|
|
122
|
+
const findFirst = (items, predicate) => effect_1.Option.fromNullable(items.find(predicate));
|
|
123
|
+
exports.findFirst = findFirst;
|
|
124
|
+
/**
|
|
125
|
+
* Remove an item from an array by ID
|
|
126
|
+
*/
|
|
127
|
+
const removeById = (items, id) => items.filter((item) => item.id !== id);
|
|
128
|
+
exports.removeById = removeById;
|
|
129
|
+
/**
|
|
130
|
+
* Update an item in an array by ID
|
|
131
|
+
*/
|
|
132
|
+
const updateById = (items, id, updater) => items.map((item) => (item.id === id ? updater(item) : item));
|
|
133
|
+
exports.updateById = updateById;
|
|
134
|
+
/**
|
|
135
|
+
* Error handling utilities
|
|
136
|
+
*/
|
|
137
|
+
/**
|
|
138
|
+
* Catch and transform errors
|
|
139
|
+
*/
|
|
140
|
+
const catchAndMap = (effect, mapper) => effect.pipe(effect_1.Effect.catchAll((error) => effect_1.Effect.fail(mapper(error))));
|
|
141
|
+
exports.catchAndMap = catchAndMap;
|
|
142
|
+
/**
|
|
143
|
+
* Provide a fallback value in case of error
|
|
144
|
+
*/
|
|
145
|
+
const orElse = (effect, fallback) => effect.pipe(effect_1.Effect.orElse(() => effect_1.Effect.succeed(fallback)));
|
|
146
|
+
exports.orElse = orElse;
|
|
147
|
+
/**
|
|
148
|
+
* Convert common patterns to Effect-friendly operations
|
|
149
|
+
*/
|
|
150
|
+
/**
|
|
151
|
+
* Convert a callback-based operation to Effect
|
|
152
|
+
*/
|
|
153
|
+
const fromCallback = (fn) => effect_1.Effect.async((resume) => {
|
|
154
|
+
fn((error, result) => {
|
|
155
|
+
if (error) {
|
|
156
|
+
resume(effect_1.Effect.fail(error));
|
|
157
|
+
}
|
|
158
|
+
else if (result !== undefined) {
|
|
159
|
+
resume(effect_1.Effect.succeed(result));
|
|
160
|
+
}
|
|
161
|
+
else {
|
|
162
|
+
resume(effect_1.Effect.fail(new Error('No result provided')));
|
|
163
|
+
}
|
|
164
|
+
});
|
|
165
|
+
});
|
|
166
|
+
exports.fromCallback = fromCallback;
|
|
167
|
+
/**
|
|
168
|
+
* Convert an event-based operation to Effect with timeout
|
|
169
|
+
*/
|
|
170
|
+
const fromEvent = (target, eventName, timeout) => effect_1.Effect.async((resume) => {
|
|
171
|
+
const handler = (event) => {
|
|
172
|
+
target.removeEventListener(eventName, handler);
|
|
173
|
+
resume(effect_1.Effect.succeed(event));
|
|
174
|
+
};
|
|
175
|
+
target.addEventListener(eventName, handler);
|
|
176
|
+
if (timeout) {
|
|
177
|
+
const timeoutId = setTimeout(() => {
|
|
178
|
+
target.removeEventListener(eventName, handler);
|
|
179
|
+
resume(effect_1.Effect.fail(new Error(`Event ${eventName} timed out`)));
|
|
180
|
+
}, effect_1.Duration.toMillis(timeout));
|
|
181
|
+
return effect_1.Effect.sync(() => clearTimeout(timeoutId));
|
|
182
|
+
}
|
|
183
|
+
return effect_1.Effect.void;
|
|
184
|
+
});
|
|
185
|
+
exports.fromEvent = fromEvent;
|
|
186
|
+
//# sourceMappingURL=utils.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"utils.js","sourceRoot":"","sources":["../../src/effect/utils.ts"],"names":[],"mappings":";AAAA;;;GAGG;;;AAEH,mCAAiF;AAGjF;;GAEG;AAEH;;GAEG;AACI,MAAM,YAAY,GAAG,CAC1B,OAA+B,EAC/B,OAAuD,EACvD,GAA4C,EACpB,EAAE,CAAC,eAAM,CAAC,iBAAiB,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,CAAA;AAJ/D,QAAA,YAAY,gBAImD;AAE5E;;GAEG;AACI,MAAM,YAAY,GAAG,CAC1B,UAA6C,EAC7C,UAA2D,EAC3D,GAAiD,EACzB,EAAE,CAAC,IAAA,oBAAY,EAAC,UAAU,EAAE,EAAE,UAAU,EAAE,GAAG,CAAC,CAAA;AAJ3D,QAAA,YAAY,gBAI+C;AAExE;;GAEG;AAEH;;GAEG;AACI,MAAM,cAAc,GAAG,GAAyD,EAAE,CAAC,iBAAQ,CAAC,IAAI,EAAY,CAAA;AAAtG,QAAA,cAAc,kBAAwF;AAEnH;;GAEG;AACI,MAAM,gBAAgB,GAAG,CAC9B,SAAuC,EACvC,OAA0B,EAC1B,gBAAmC,iBAAQ,CAAC,MAAM,CAAC,EAAE,CAAC,EACnB,EAAE,CACrC,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,QAAQ,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,GAAG,iBAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;IAElF,OAAO,IAAI,EAAE,CAAC;QACZ,MAAM,OAAO,GAAG,KAAK,CAAC,CAAC,SAAS,CAAA;QAChC,IAAI,OAAO;YAAE,OAAM;QAEnB,IAAI,IAAI,CAAC,GAAG,EAAE,GAAG,QAAQ,EAAE,CAAC;YAC1B,MAAM,IAAI,KAAK,CAAC,mBAAmB,CAAC,CAAA;QACtC,CAAC;QAED,KAAK,CAAC,CAAC,eAAM,CAAC,KAAK,CAAC,aAAa,CAAC,CAAA;IACpC,CAAC;AACH,CAAC,CAAC,CAAA;AAlBS,QAAA,gBAAgB,oBAkBzB;AAEJ;;GAEG;AACI,MAAM,iBAAiB,GAAG,CAC/B,OAA0C,EAC1C,WAAmB,EACgB,EAAE,CAAC,eAAM,CAAC,GAAG,CAAC,OAAO,EAAE,EAAE,WAAW,EAAE,CAAC,CAAA;AAH/D,QAAA,iBAAiB,qBAG8C;AAE5E;;GAEG;AAEH;;GAEG;AACI,MAAM,iBAAiB,GAAG,CAC/B,QAA2C,EAC3C,WAAmD,EACnD,cAAc,GAAG,CAAC,EACS,EAAE,CAC7B,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,QAAQ,CAAA;IAC7B,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;QAAE,OAAM;IAE9B,KAAK,CAAC,CAAC,IAAA,yBAAiB,EAAC,KAAK,CAAC,GAAG,CAAC,WAAW,CAAC,EAAE,cAAc,CAAC,CAAA;AAClE,CAAC,CAAC,CAAA;AAVS,QAAA,iBAAiB,qBAU1B;AAEJ;;GAEG;AAEH;;GAEG;AACI,MAAM,aAAa,GAAG,CAC3B,YAAY,GAAG,CAAC,EAShB,EAAE,CACF,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,YAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAEzC,OAAO;QACL,SAAS,EAAE,YAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,SAAS,EAAE,YAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC;QAC9C,GAAG,EAAE,YAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACjB,GAAG,EAAE,CAAC,KAAa,EAAE,EAAE,CAAC,YAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;KAC5C,CAAA;AACH,CAAC,CAAC,CAAA;AApBS,QAAA,aAAa,iBAoBtB;AAEJ;;GAEG;AACI,MAAM,UAAU,GAAG,CACxB,YAAY,GAAG,KAAK,EASpB,EAAE,CACF,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,YAAG,CAAC,IAAI,CAAC,YAAY,CAAC,CAAA;IAEzC,OAAO;QACL,GAAG,EAAE,YAAG,CAAC,GAAG,CAAC,GAAG,EAAE,IAAI,CAAC;QACvB,KAAK,EAAE,YAAG,CAAC,GAAG,CAAC,GAAG,EAAE,KAAK,CAAC;QAC1B,GAAG,EAAE,YAAG,CAAC,GAAG,CAAC,GAAG,CAAC;QACjB,MAAM,EAAE,YAAG,CAAC,YAAY,CAAC,GAAG,EAAE,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC;KACzC,CAAA;AACH,CAAC,CAAC,CAAA;AApBS,QAAA,UAAU,cAoBnB;AAEJ;;GAEG;AAEH;;GAEG;AACI,MAAM,WAAW,GAAG,CACzB,MAA8B,EAC9B,OAA0B,EACM,EAAE,CAClC,eAAM,CAAC,IAAI,CACT,MAAM,EACN,eAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC,IAAI,CACxB,eAAM,CAAC,OAAO,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,6BAA6B,iBAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CACpG,CACF,CAAA;AATU,QAAA,WAAW,eASrB;AAEH;;GAEG;AAEH;;GAEG;AACI,MAAM,QAAQ,GAAG,CAAU,KAAa,EAAE,MAA8B,EAA0B,EAAE,CACzG,eAAM,CAAC,GAAG,CAAC,QAAQ,CAAC;IAClB,MAAM,KAAK,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAClD,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,IAAI,KAAK,eAAe,CAAC,CAAA;IAE3C,MAAM,MAAM,GAAG,KAAK,CAAC,CAAC,MAAM,CAAA;IAE5B,MAAM,GAAG,GAAG,KAAK,CAAC,CAAC,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,CAAA;IAChD,KAAK,CAAC,CAAC,eAAM,CAAC,GAAG,CAAC,IAAI,KAAK,kBAAkB,GAAG,GAAG,KAAK,IAAI,CAAC,CAAA;IAE7D,OAAO,MAAM,CAAA;AACf,CAAC,CAAC,CAAA;AAXS,QAAA,QAAQ,YAWjB;AAEJ;;GAEG;AAEH;;GAEG;AACI,MAAM,SAAS,GAAG,CAAI,KAAmB,EAAE,SAA+B,EAAoB,EAAE,CACrG,eAAM,CAAC,YAAY,CAAC,KAAK,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC,CAAA;AAD/B,QAAA,SAAS,aACsB;AAE5C;;GAEG;AACI,MAAM,UAAU,GAAG,CAA2B,KAAmB,EAAE,EAAU,EAAgB,EAAE,CACpG,KAAK,CAAC,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAA;AAD3B,QAAA,UAAU,cACiB;AAExC;;GAEG;AACI,MAAM,UAAU,GAAG,CACxB,KAAmB,EACnB,EAAU,EACV,OAAuB,EACT,EAAE,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,CAAC,OAAO,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAA;AAJlE,QAAA,UAAU,cAIwD;AAE/E;;GAEG;AAEH;;GAEG;AACI,MAAM,WAAW,GAAG,CACzB,MAA+B,EAC/B,MAAyB,EACA,EAAE,CAAC,MAAM,CAAC,IAAI,CAAC,eAAM,CAAC,QAAQ,CAAC,CAAC,KAAK,EAAE,EAAE,CAAC,eAAM,CAAC,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,CAAA;AAHpF,QAAA,WAAW,eAGyE;AAEjG;;GAEG;AACI,MAAM,MAAM,GAAG,CAAU,MAA8B,EAAE,QAAW,EAA8B,EAAE,CACzG,MAAM,CAAC,IAAI,CAAC,eAAM,CAAC,MAAM,CAAC,GAAG,EAAE,CAAC,eAAM,CAAC,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAA;AAD/C,QAAA,MAAM,UACyC;AAE5D;;GAEG;AAEH;;GAEG;AACI,MAAM,YAAY,GAAG,CAC1B,EAA6D,EACxC,EAAE,CACvB,eAAM,CAAC,KAAK,CAAO,CAAC,MAAM,EAAE,EAAE;IAC5B,EAAE,CAAC,CAAC,KAAK,EAAE,MAAM,EAAE,EAAE;QACnB,IAAI,KAAK,EAAE,CAAC;YACV,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC,CAAA;QAC5B,CAAC;aAAM,IAAI,MAAM,KAAK,SAAS,EAAE,CAAC;YAChC,MAAM,CAAC,eAAM,CAAC,OAAO,CAAC,MAAM,CAAC,CAAC,CAAA;QAChC,CAAC;aAAM,CAAC;YACN,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,oBAAoB,CAAM,CAAC,CAAC,CAAA;QAC3D,CAAC;IACH,CAAC,CAAC,CAAA;AACJ,CAAC,CAAC,CAAA;AAbS,QAAA,YAAY,gBAarB;AAEJ;;GAEG;AACI,MAAM,SAAS,GAAG,CACvB,MAGC,EACD,SAAiB,EACjB,OAA2B,EACF,EAAE,CAC3B,eAAM,CAAC,KAAK,CAAW,CAAC,MAAM,EAAE,EAAE;IAChC,MAAM,OAAO,GAAG,CAAC,KAAQ,EAAE,EAAE;QAC3B,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;QAC9C,MAAM,CAAC,eAAM,CAAC,OAAO,CAAC,KAAK,CAAC,CAAC,CAAA;IAC/B,CAAC,CAAA;IAED,MAAM,CAAC,gBAAgB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;IAE3C,IAAI,OAAO,EAAE,CAAC;QACZ,MAAM,SAAS,GAAG,UAAU,CAAC,GAAG,EAAE;YAChC,MAAM,CAAC,mBAAmB,CAAC,SAAS,EAAE,OAAO,CAAC,CAAA;YAC9C,MAAM,CAAC,eAAM,CAAC,IAAI,CAAC,IAAI,KAAK,CAAC,SAAS,SAAS,YAAY,CAAC,CAAC,CAAC,CAAA;QAChE,CAAC,EAAE,iBAAQ,CAAC,QAAQ,CAAC,OAAO,CAAC,CAAC,CAAA;QAE9B,OAAO,eAAM,CAAC,IAAI,CAAC,GAAG,EAAE,CAAC,YAAY,CAAC,SAAS,CAAC,CAAC,CAAA;IACnD,CAAC;IAED,OAAO,eAAM,CAAC,IAAI,CAAA;AACpB,CAAC,CAAC,CAAA;AA1BS,QAAA,SAAS,aA0BlB"}
|