@react-text-game/core 0.4.1 → 0.5.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 (38) hide show
  1. package/README.md +389 -0
  2. package/dist/audio/audioTrack.d.ts +407 -0
  3. package/dist/audio/audioTrack.d.ts.map +1 -0
  4. package/dist/audio/audioTrack.js +656 -0
  5. package/dist/audio/audioTrack.js.map +1 -0
  6. package/dist/audio/constants.d.ts +19 -0
  7. package/dist/audio/constants.d.ts.map +1 -0
  8. package/dist/audio/constants.js +20 -0
  9. package/dist/audio/constants.js.map +1 -0
  10. package/dist/audio/fabric.d.ts +35 -0
  11. package/dist/audio/fabric.d.ts.map +1 -0
  12. package/dist/audio/fabric.js +36 -0
  13. package/dist/audio/fabric.js.map +1 -0
  14. package/dist/audio/index.d.ts +33 -0
  15. package/dist/audio/index.d.ts.map +1 -0
  16. package/dist/audio/index.js +32 -0
  17. package/dist/audio/index.js.map +1 -0
  18. package/dist/audio/types.d.ts +105 -0
  19. package/dist/audio/types.d.ts.map +1 -0
  20. package/dist/audio/types.js +2 -0
  21. package/dist/audio/types.js.map +1 -0
  22. package/dist/hooks/index.d.ts +2 -0
  23. package/dist/hooks/index.d.ts.map +1 -1
  24. package/dist/hooks/index.js +2 -0
  25. package/dist/hooks/index.js.map +1 -1
  26. package/dist/hooks/useAudio.d.ts +50 -0
  27. package/dist/hooks/useAudio.d.ts.map +1 -0
  28. package/dist/hooks/useAudio.js +42 -0
  29. package/dist/hooks/useAudio.js.map +1 -0
  30. package/dist/hooks/useAudioManager.d.ts +66 -0
  31. package/dist/hooks/useAudioManager.d.ts.map +1 -0
  32. package/dist/hooks/useAudioManager.js +70 -0
  33. package/dist/hooks/useAudioManager.js.map +1 -0
  34. package/dist/tests/audio.test.d.ts +2 -0
  35. package/dist/tests/audio.test.d.ts.map +1 -0
  36. package/dist/tests/audio.test.js +605 -0
  37. package/dist/tests/audio.test.js.map +1 -0
  38. package/package.json +5 -1
@@ -0,0 +1,656 @@
1
+ import { proxy, subscribe } from "valtio";
2
+ import { logger } from "../logger";
3
+ import { Storage } from "../storage";
4
+ import { AUDIO_STORAGE_PATH, DEFAULT_AUDIO_OPTIONS } from "./constants";
5
+ /**
6
+ * Individual audio track with reactive state management.
7
+ *
8
+ * AudioTrack wraps the HTMLAudioElement API with Valtio reactive state,
9
+ * making it easy to integrate with React components and the game's save system.
10
+ *
11
+ * Features:
12
+ * - Reactive state updates via Valtio
13
+ * - Automatic persistence with save/load
14
+ * - Volume, loop, and playback rate controls
15
+ * - Fade in/out effects
16
+ * - Event-driven state synchronization
17
+ *
18
+ * @example
19
+ * ```typescript
20
+ * const music = new AudioTrack('assets/music.mp3', {
21
+ * id: 'bg-music',
22
+ * loop: true,
23
+ * volume: 0.7,
24
+ * });
25
+ *
26
+ * await music.play();
27
+ * music.setVolume(0.5);
28
+ * ```
29
+ */
30
+ export class AudioTrack {
31
+ id;
32
+ src;
33
+ audioElement;
34
+ state;
35
+ jsonPath;
36
+ unsubscribe;
37
+ constructor(src, options = {}) {
38
+ this.id = options.id || `audio-${Date.now()}-${Math.random()}`;
39
+ this.src = src;
40
+ this.jsonPath = `${AUDIO_STORAGE_PATH}.${this.id}`;
41
+ // Create reactive state with Valtio
42
+ this.state = proxy({
43
+ isPlaying: false,
44
+ isPaused: false,
45
+ isStopped: true,
46
+ currentTime: 0,
47
+ duration: 0,
48
+ volume: options.volume ?? DEFAULT_AUDIO_OPTIONS.volume,
49
+ loop: options.loop ?? DEFAULT_AUDIO_OPTIONS.loop,
50
+ playbackRate: options.playbackRate ?? DEFAULT_AUDIO_OPTIONS.playbackRate,
51
+ muted: options.muted ?? DEFAULT_AUDIO_OPTIONS.muted,
52
+ });
53
+ // Create audio element
54
+ this.audioElement = new Audio(src);
55
+ this.audioElement.loop = this.state.loop;
56
+ this.audioElement.playbackRate = this.state.playbackRate;
57
+ this.audioElement.muted = this.state.muted;
58
+ this.audioElement.preload =
59
+ options.preload ?? DEFAULT_AUDIO_OPTIONS.preload;
60
+ // Attach event listeners
61
+ this.attachEventListeners();
62
+ // Register with AudioManager
63
+ AudioManager._registerTrack(this);
64
+ // Apply effective volume (considering master volume)
65
+ // Must be called after registration since it needs AudioManager
66
+ this._applyEffectiveVolume();
67
+ // Setup auto-save subscription if ID provided
68
+ if (options.id) {
69
+ // Subscribe to state changes for auto-save
70
+ // Audio will be saved whenever state changes, matching the pattern
71
+ // of other game objects that persist their state
72
+ //
73
+ // Note: Initial state is not auto-saved here to avoid overwriting
74
+ // existing saved states during load operations. Call save() manually
75
+ // or trigger a state change to persist the initial state.
76
+ this.unsubscribe = subscribe(this.state, () => {
77
+ this.save();
78
+ });
79
+ }
80
+ // Auto-play if requested (may be blocked by browser)
81
+ if (options.autoPlay) {
82
+ this.play().catch((error) => {
83
+ logger.warn(`Auto-play blocked for "${this.id}". User interaction required.`, error);
84
+ });
85
+ }
86
+ logger.log(`Audio track created: ${this.id} (${src})`);
87
+ }
88
+ /**
89
+ * Attaches event listeners to sync HTMLAudioElement state with reactive state.
90
+ * @private
91
+ */
92
+ attachEventListeners() {
93
+ this.audioElement.addEventListener("loadedmetadata", () => {
94
+ this.state.duration = this.audioElement.duration;
95
+ });
96
+ this.audioElement.addEventListener("timeupdate", () => {
97
+ this.state.currentTime = this.audioElement.currentTime;
98
+ });
99
+ this.audioElement.addEventListener("play", () => {
100
+ this.state.isPlaying = true;
101
+ this.state.isPaused = false;
102
+ this.state.isStopped = false;
103
+ });
104
+ this.audioElement.addEventListener("pause", () => {
105
+ this.state.isPlaying = false;
106
+ this.state.isPaused = true;
107
+ });
108
+ this.audioElement.addEventListener("ended", () => {
109
+ if (!this.state.loop) {
110
+ this.state.isPlaying = false;
111
+ this.state.isStopped = true;
112
+ this.state.isPaused = false;
113
+ this.state.currentTime = 0;
114
+ }
115
+ });
116
+ this.audioElement.addEventListener("volumechange", () => {
117
+ // Only sync muted state, not volume
118
+ // Volume state is managed separately to support master volume
119
+ this.state.muted = this.audioElement.muted;
120
+ });
121
+ this.audioElement.addEventListener("ratechange", () => {
122
+ this.state.playbackRate = this.audioElement.playbackRate;
123
+ });
124
+ }
125
+ /**
126
+ * Plays the audio track.
127
+ *
128
+ * @returns Promise that resolves when playback starts
129
+ * @throws Error if playback fails
130
+ *
131
+ * @example
132
+ * ```typescript
133
+ * try {
134
+ * await audio.play();
135
+ * } catch (error) {
136
+ * console.error('Playback failed:', error);
137
+ * }
138
+ * ```
139
+ */
140
+ async play() {
141
+ try {
142
+ await this.audioElement.play();
143
+ }
144
+ catch (error) {
145
+ logger.error(`Failed to play audio: ${this.src}`, error);
146
+ throw error;
147
+ }
148
+ }
149
+ /**
150
+ * Pauses the audio track.
151
+ *
152
+ * @example
153
+ * ```typescript
154
+ * audio.pause();
155
+ * ```
156
+ */
157
+ pause() {
158
+ this.audioElement.pause();
159
+ }
160
+ /**
161
+ * Resumes playback if the audio is paused.
162
+ *
163
+ * @example
164
+ * ```typescript
165
+ * audio.resume();
166
+ * ```
167
+ */
168
+ resume() {
169
+ if (this.state.isPaused) {
170
+ this.play().catch((error) => {
171
+ logger.error(`Failed to resume audio: ${this.src}`, error);
172
+ });
173
+ }
174
+ }
175
+ /**
176
+ * Stops the audio track and resets to the beginning.
177
+ *
178
+ * @example
179
+ * ```typescript
180
+ * audio.stop();
181
+ * ```
182
+ */
183
+ stop() {
184
+ this.audioElement.pause();
185
+ this.audioElement.currentTime = 0;
186
+ this.state.isPlaying = false;
187
+ this.state.isPaused = false;
188
+ this.state.isStopped = true;
189
+ }
190
+ /**
191
+ * Sets the volume level.
192
+ *
193
+ * @param volume - Volume level (0.0 to 1.0), clamped to valid range
194
+ *
195
+ * @example
196
+ * ```typescript
197
+ * audio.setVolume(0.5); // 50% volume
198
+ * ```
199
+ */
200
+ setVolume(volume) {
201
+ const clampedVolume = Math.max(0, Math.min(1, volume));
202
+ this.state.volume = clampedVolume;
203
+ this._applyEffectiveVolume();
204
+ }
205
+ /**
206
+ * Applies the effective volume (track volume * master volume) to the audio element.
207
+ * Internal method used by AudioManager to apply master volume changes.
208
+ *
209
+ * @internal
210
+ */
211
+ _applyEffectiveVolume() {
212
+ const masterVolume = AudioManager.getMasterVolume();
213
+ const effectiveVolume = this.state.volume * masterVolume;
214
+ this.audioElement.volume = effectiveVolume;
215
+ }
216
+ /**
217
+ * Sets whether the audio should loop.
218
+ *
219
+ * @param loop - True to enable looping, false to disable
220
+ *
221
+ * @example
222
+ * ```typescript
223
+ * audio.setLoop(true);
224
+ * ```
225
+ */
226
+ setLoop(loop) {
227
+ this.audioElement.loop = loop;
228
+ this.state.loop = loop;
229
+ }
230
+ /**
231
+ * Sets the playback rate.
232
+ *
233
+ * @param rate - Playback rate multiplier (0.5 = half speed, 2.0 = double speed)
234
+ *
235
+ * @example
236
+ * ```typescript
237
+ * audio.setPlaybackRate(1.5); // 1.5x speed
238
+ * ```
239
+ */
240
+ setPlaybackRate(rate) {
241
+ this.audioElement.playbackRate = rate;
242
+ this.state.playbackRate = rate;
243
+ }
244
+ /**
245
+ * Sets whether the audio is muted.
246
+ *
247
+ * @param muted - True to mute, false to unmute
248
+ *
249
+ * @example
250
+ * ```typescript
251
+ * audio.setMuted(true);
252
+ * ```
253
+ */
254
+ setMuted(muted) {
255
+ this.audioElement.muted = muted;
256
+ this.state.muted = muted;
257
+ }
258
+ /**
259
+ * Seeks to a specific time in the audio.
260
+ *
261
+ * @param time - Time in seconds, clamped to [0, duration]
262
+ *
263
+ * @example
264
+ * ```typescript
265
+ * audio.seek(30); // Seek to 30 seconds
266
+ * ```
267
+ */
268
+ seek(time) {
269
+ const clampedTime = Math.max(0, Math.min(this.state.duration, time));
270
+ this.audioElement.currentTime = clampedTime;
271
+ }
272
+ /**
273
+ * Fades in the audio over a specified duration.
274
+ *
275
+ * Starts at volume 0 and gradually increases to the target volume.
276
+ *
277
+ * @param duration - Fade duration in milliseconds
278
+ * @returns Promise that resolves when fade completes
279
+ *
280
+ * @example
281
+ * ```typescript
282
+ * await audio.fadeIn(2000); // Fade in over 2 seconds
283
+ * ```
284
+ */
285
+ async fadeIn(duration = 1000) {
286
+ const targetVolume = this.state.volume;
287
+ this.state.volume = 0;
288
+ this.audioElement.volume = 0;
289
+ await this.play();
290
+ return this.fadeTo(targetVolume, duration);
291
+ }
292
+ /**
293
+ * Fades out the audio over a specified duration and stops.
294
+ *
295
+ * @param duration - Fade duration in milliseconds
296
+ * @returns Promise that resolves when fade completes
297
+ *
298
+ * @example
299
+ * ```typescript
300
+ * await audio.fadeOut(1500); // Fade out over 1.5 seconds
301
+ * ```
302
+ */
303
+ async fadeOut(duration = 1000) {
304
+ await this.fadeTo(0, duration);
305
+ this.stop();
306
+ }
307
+ /**
308
+ * Fades to a target volume over a specified duration.
309
+ *
310
+ * @private
311
+ * @param targetVolume - Target volume level (0.0 to 1.0)
312
+ * @param duration - Fade duration in milliseconds
313
+ * @returns Promise that resolves when fade completes
314
+ */
315
+ async fadeTo(targetVolume, duration) {
316
+ const startVolume = this.audioElement.volume;
317
+ const startTime = Date.now();
318
+ return new Promise((resolve) => {
319
+ const fade = () => {
320
+ const elapsed = Date.now() - startTime;
321
+ const progress = Math.min(elapsed / duration, 1);
322
+ const currentVolume = startVolume + (targetVolume - startVolume) * progress;
323
+ this.audioElement.volume = currentVolume;
324
+ this.state.volume = currentVolume;
325
+ if (progress < 1) {
326
+ requestAnimationFrame(fade);
327
+ }
328
+ else {
329
+ resolve();
330
+ }
331
+ };
332
+ requestAnimationFrame(fade);
333
+ });
334
+ }
335
+ /**
336
+ * Gets the reactive audio state.
337
+ *
338
+ * This state is a Valtio proxy and can be used with useSnapshot() in React.
339
+ *
340
+ * @returns The reactive audio state
341
+ *
342
+ * @example
343
+ * ```typescript
344
+ * const state = audio.getState();
345
+ * console.log(state.isPlaying); // true/false
346
+ * ```
347
+ */
348
+ getState() {
349
+ return this.state;
350
+ }
351
+ /**
352
+ * Saves the current audio state to storage.
353
+ *
354
+ * Called automatically when auto-save is enabled.
355
+ *
356
+ * @example
357
+ * ```typescript
358
+ * audio.save();
359
+ * ```
360
+ */
361
+ save() {
362
+ const saveState = {
363
+ id: this.id,
364
+ src: this.src,
365
+ volume: this.state.volume,
366
+ loop: this.state.loop,
367
+ playbackRate: this.state.playbackRate,
368
+ muted: this.state.muted,
369
+ currentTime: this.state.currentTime,
370
+ isPlaying: this.state.isPlaying,
371
+ isPaused: this.state.isPaused,
372
+ };
373
+ Storage.setValue(this.jsonPath, saveState, true);
374
+ }
375
+ /**
376
+ * Loads the audio state from storage.
377
+ *
378
+ * Restores volume, loop, playback rate, muted status, and playback position.
379
+ * Optionally resumes playback if the audio was playing when saved.
380
+ *
381
+ * @example
382
+ * ```typescript
383
+ * audio.load();
384
+ * ```
385
+ */
386
+ load() {
387
+ const savedState = Storage.getValue(this.jsonPath);
388
+ if (savedState.length > 0) {
389
+ const state = savedState[0];
390
+ this.state.volume = state.volume;
391
+ this.state.loop = state.loop;
392
+ this.state.playbackRate = state.playbackRate;
393
+ this.state.muted = state.muted;
394
+ // Apply effective volume (considering master volume)
395
+ this._applyEffectiveVolume();
396
+ this.audioElement.loop = state.loop;
397
+ this.audioElement.playbackRate = state.playbackRate;
398
+ this.audioElement.muted = state.muted;
399
+ this.audioElement.currentTime = state.currentTime;
400
+ // Restore playback state
401
+ if (state.isPlaying && !state.isPaused) {
402
+ this.play().catch((error) => {
403
+ logger.warn(`Could not auto-resume audio "${this.id}" on load. User interaction may be required.`, error);
404
+ });
405
+ }
406
+ }
407
+ }
408
+ /**
409
+ * Cleans up the audio track and removes all listeners.
410
+ *
411
+ * Should be called when the audio track is no longer needed.
412
+ *
413
+ * @example
414
+ * ```typescript
415
+ * audio.dispose();
416
+ * ```
417
+ */
418
+ dispose() {
419
+ this.stop();
420
+ this.unsubscribe?.();
421
+ AudioManager._unregisterTrack(this);
422
+ // Remove all event listeners by cloning the element
423
+ const clone = this.audioElement.cloneNode();
424
+ this.audioElement.parentNode?.replaceChild(clone, this.audioElement);
425
+ logger.log(`Audio track disposed: ${this.id}`);
426
+ }
427
+ }
428
+ /**
429
+ * Global audio manager for controlling all audio tracks.
430
+ *
431
+ * AudioManager provides a singleton interface for game-wide audio operations
432
+ * like master volume control, muting all tracks, or pausing all audio.
433
+ *
434
+ * @example
435
+ * ```typescript
436
+ * // Global volume control
437
+ * AudioManager.setMasterVolume(0.5);
438
+ *
439
+ * // Mute all audio
440
+ * AudioManager.muteAll();
441
+ *
442
+ * // Pause all playing tracks
443
+ * AudioManager.pauseAll();
444
+ * ```
445
+ */
446
+ class AudioManagerClass {
447
+ tracks = new Map();
448
+ state = proxy({
449
+ masterVolume: 1,
450
+ isMuted: false,
451
+ });
452
+ /**
453
+ * Internal method to register a track.
454
+ * Called automatically by AudioTrack constructor.
455
+ *
456
+ * @internal
457
+ * @param track - The audio track to register
458
+ */
459
+ _registerTrack(track) {
460
+ this.tracks.set(track.id, track);
461
+ logger.log(`AudioManager registered track: ${track.id}`);
462
+ }
463
+ /**
464
+ * Internal method to unregister a track.
465
+ * Called automatically by AudioTrack.dispose().
466
+ *
467
+ * @internal
468
+ * @param track - The audio track to unregister
469
+ */
470
+ _unregisterTrack(track) {
471
+ this.tracks.delete(track.id);
472
+ logger.log(`AudioManager unregistered track: ${track.id}`);
473
+ }
474
+ /**
475
+ * Sets the master volume for all audio tracks.
476
+ *
477
+ * The master volume is multiplied with each track's individual volume.
478
+ * This does not modify individual track volumes - it applies a global multiplier.
479
+ *
480
+ * @param volume - Master volume level (0.0 to 1.0), clamped to valid range
481
+ *
482
+ * @example
483
+ * ```typescript
484
+ * AudioManager.setMasterVolume(0.5); // 50% master volume
485
+ * ```
486
+ */
487
+ setMasterVolume(volume) {
488
+ const clampedVolume = Math.max(0, Math.min(1, volume));
489
+ this.state.masterVolume = clampedVolume;
490
+ // Apply to all tracks without modifying their base volume
491
+ this.tracks.forEach((track) => {
492
+ track._applyEffectiveVolume();
493
+ });
494
+ logger.log(`Master volume set to: ${clampedVolume}`);
495
+ }
496
+ /**
497
+ * Gets the current master volume.
498
+ *
499
+ * @returns The master volume level (0.0 to 1.0)
500
+ *
501
+ * @example
502
+ * ```typescript
503
+ * const volume = AudioManager.getMasterVolume();
504
+ * ```
505
+ */
506
+ getMasterVolume() {
507
+ return this.state.masterVolume;
508
+ }
509
+ /**
510
+ * Mutes all audio tracks.
511
+ *
512
+ * @example
513
+ * ```typescript
514
+ * AudioManager.muteAll();
515
+ * ```
516
+ */
517
+ muteAll() {
518
+ this.state.isMuted = true;
519
+ this.tracks.forEach((track) => track.setMuted(true));
520
+ logger.log("All audio tracks muted");
521
+ }
522
+ /**
523
+ * Unmutes all audio tracks.
524
+ *
525
+ * @example
526
+ * ```typescript
527
+ * AudioManager.unmuteAll();
528
+ * ```
529
+ */
530
+ unmuteAll() {
531
+ this.state.isMuted = false;
532
+ this.tracks.forEach((track) => track.setMuted(false));
533
+ logger.log("All audio tracks unmuted");
534
+ }
535
+ /**
536
+ * Pauses all currently playing audio tracks.
537
+ *
538
+ * @example
539
+ * ```typescript
540
+ * AudioManager.pauseAll();
541
+ * ```
542
+ */
543
+ pauseAll() {
544
+ this.tracks.forEach((track) => {
545
+ if (track.getState().isPlaying) {
546
+ track.pause();
547
+ }
548
+ });
549
+ logger.log("All audio tracks paused");
550
+ }
551
+ /**
552
+ * Resumes all paused audio tracks.
553
+ *
554
+ * @example
555
+ * ```typescript
556
+ * AudioManager.resumeAll();
557
+ * ```
558
+ */
559
+ resumeAll() {
560
+ this.tracks.forEach((track) => {
561
+ if (track.getState().isPaused) {
562
+ track.resume();
563
+ }
564
+ });
565
+ logger.log("All audio tracks resumed");
566
+ }
567
+ /**
568
+ * Stops all audio tracks.
569
+ *
570
+ * @example
571
+ * ```typescript
572
+ * AudioManager.stopAll();
573
+ * ```
574
+ */
575
+ stopAll() {
576
+ this.tracks.forEach((track) => track.stop());
577
+ logger.log("All audio tracks stopped");
578
+ }
579
+ /**
580
+ * Gets all registered audio tracks.
581
+ *
582
+ * @returns Array of all audio tracks
583
+ *
584
+ * @example
585
+ * ```typescript
586
+ * const tracks = AudioManager.getAllTracks();
587
+ * console.log(`Total tracks: ${tracks.length}`);
588
+ * ```
589
+ */
590
+ getAllTracks() {
591
+ return Array.from(this.tracks.values());
592
+ }
593
+ /**
594
+ * Gets an audio track by its ID.
595
+ *
596
+ * @param id - The unique identifier of the audio track
597
+ * @returns The audio track, or undefined if not found
598
+ *
599
+ * @example
600
+ * ```typescript
601
+ * const music = AudioManager.getTrackById('bg-music');
602
+ * if (music) {
603
+ * music.play();
604
+ * }
605
+ * ```
606
+ */
607
+ getTrackById(id) {
608
+ return this.tracks.get(id);
609
+ }
610
+ /**
611
+ * Gets the reactive audio manager state.
612
+ *
613
+ * This state is a Valtio proxy and can be used with useSnapshot() in React.
614
+ *
615
+ * @returns The reactive audio manager state
616
+ *
617
+ * @example
618
+ * ```typescript
619
+ * const state = AudioManager.getState();
620
+ * console.log(state.masterVolume); // 1.0
621
+ * ```
622
+ */
623
+ getState() {
624
+ return this.state;
625
+ }
626
+ /**
627
+ * Disposes all audio tracks.
628
+ *
629
+ * Useful for cleanup when shutting down the game.
630
+ *
631
+ * @example
632
+ * ```typescript
633
+ * AudioManager.disposeAll();
634
+ * ```
635
+ */
636
+ disposeAll() {
637
+ this.tracks.forEach((track) => track.dispose());
638
+ this.tracks.clear();
639
+ logger.log("All audio tracks disposed");
640
+ }
641
+ }
642
+ /**
643
+ * Singleton instance of the AudioManager.
644
+ *
645
+ * Use this to control all audio tracks globally.
646
+ *
647
+ * @example
648
+ * ```typescript
649
+ * import { AudioManager } from '@react-text-game/core/audio';
650
+ *
651
+ * AudioManager.setMasterVolume(0.8);
652
+ * AudioManager.muteAll();
653
+ * ```
654
+ */
655
+ export const AudioManager = new AudioManagerClass();
656
+ //# sourceMappingURL=audioTrack.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"audioTrack.js","sourceRoot":"","sources":["../../src/audio/audioTrack.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /**
2
+ * Base JSONPath for audio storage within the system path.
3
+ *
4
+ * All audio tracks with IDs will be stored under this path.
5
+ * Individual tracks are stored at: $._system.audio.{id}
6
+ */
7
+ export declare const AUDIO_STORAGE_PATH: "$._system.audio";
8
+ /**
9
+ * Default audio configuration values.
10
+ */
11
+ export declare const DEFAULT_AUDIO_OPTIONS: {
12
+ readonly volume: 1;
13
+ readonly loop: false;
14
+ readonly playbackRate: 1;
15
+ readonly muted: false;
16
+ readonly autoPlay: false;
17
+ readonly preload: "metadata";
18
+ };
19
+ //# sourceMappingURL=constants.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"constants.d.ts","sourceRoot":"","sources":["../../src/audio/constants.ts"],"names":[],"mappings":"AAGA;;;;;GAKG;AACH,eAAO,MAAM,kBAAkB,mBAA6D,CAAC;AAE7F;;GAEG;AACH,eAAO,MAAM,qBAAqB;;;;;;;CAOxB,CAAC"}