@opendaw/studio-core 0.0.130 → 0.0.131

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 (58) hide show
  1. package/dist/AssetService.d.ts.map +1 -1
  2. package/dist/AssetService.js +11 -2
  3. package/dist/AudioOfflineRenderer.js +1 -1
  4. package/dist/Engine.d.ts +1 -1
  5. package/dist/Engine.d.ts.map +1 -1
  6. package/dist/EngineFacade.d.ts +1 -1
  7. package/dist/EngineFacade.d.ts.map +1 -1
  8. package/dist/EngineFacade.js +2 -2
  9. package/dist/EngineWorklet.d.ts +1 -1
  10. package/dist/EngineWorklet.d.ts.map +1 -1
  11. package/dist/EngineWorklet.js +9 -46
  12. package/dist/MonitoringRouter.d.ts +10 -0
  13. package/dist/MonitoringRouter.d.ts.map +1 -0
  14. package/dist/MonitoringRouter.js +89 -0
  15. package/dist/capture/CaptureAudio.d.ts +10 -0
  16. package/dist/capture/CaptureAudio.d.ts.map +1 -1
  17. package/dist/capture/CaptureAudio.js +105 -30
  18. package/dist/capture/RecordAudio.d.ts.map +1 -1
  19. package/dist/capture/RecordAudio.js +10 -2
  20. package/dist/capture/Recording.js +1 -1
  21. package/dist/processors.js +22 -22
  22. package/dist/processors.js.map +4 -4
  23. package/dist/project/AudioWavExport.d.ts +6 -0
  24. package/dist/project/AudioWavExport.d.ts.map +1 -0
  25. package/dist/project/AudioWavExport.js +15 -0
  26. package/dist/project/NoteMidiExport.d.ts +9 -0
  27. package/dist/project/NoteMidiExport.d.ts.map +1 -0
  28. package/dist/project/NoteMidiExport.js +27 -0
  29. package/dist/project/Project.d.ts.map +1 -1
  30. package/dist/project/Project.js +1 -2
  31. package/dist/project/ProjectApi.d.ts +3 -1
  32. package/dist/project/ProjectApi.d.ts.map +1 -1
  33. package/dist/project/ProjectApi.js +8 -0
  34. package/dist/project/ProjectStorage.d.ts.map +1 -1
  35. package/dist/project/ProjectStorage.js +1 -0
  36. package/dist/project/index.d.ts +2 -0
  37. package/dist/project/index.d.ts.map +1 -1
  38. package/dist/project/index.js +2 -0
  39. package/dist/project/migration/MigrateValueEventCollection.test.js +3 -3
  40. package/dist/samples/OpenSampleAPI.d.ts +1 -0
  41. package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
  42. package/dist/samples/OpenSampleAPI.js +1 -0
  43. package/dist/samples/SampleService.js +1 -1
  44. package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -1
  45. package/dist/soundfont/DefaultSoundfontLoader.js +3 -0
  46. package/dist/soundfont/OpenSoundfontAPI.d.ts +1 -0
  47. package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -1
  48. package/dist/soundfont/OpenSoundfontAPI.js +1 -0
  49. package/dist/soundfont/SoundfontService.js +1 -1
  50. package/dist/sync-log/SyncLogWriter.d.ts.map +1 -1
  51. package/dist/sync-log/SyncLogWriter.js +3 -2
  52. package/dist/ui/clipboard/ClipboardUtils.js +1 -1
  53. package/dist/ysync/YService.d.ts.map +1 -1
  54. package/dist/ysync/YService.js +0 -5
  55. package/dist/ysync/YSync.d.ts +1 -0
  56. package/dist/ysync/YSync.d.ts.map +1 -1
  57. package/dist/ysync/YSync.js +45 -48
  58. package/package.json +16 -15
@@ -0,0 +1,6 @@
1
+ import { Promises } from "@opendaw/lib-runtime";
2
+ import { AudioClipBoxAdapter, AudioRegionBoxAdapter } from "@opendaw/studio-adapters";
3
+ export declare namespace AudioWavExport {
4
+ const toFile: (owner: AudioRegionBoxAdapter | AudioClipBoxAdapter, suggestedName?: string) => Promise<Promises.RejectedResult | Promises.ResolveResult<string>>;
5
+ }
6
+ //# sourceMappingURL=AudioWavExport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AudioWavExport.d.ts","sourceRoot":"","sources":["../../src/project/AudioWavExport.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAC,mBAAmB,EAAE,qBAAqB,EAAC,MAAM,0BAA0B,CAAA;AAEnF,yBAAiB,cAAc,CAAC;IACrB,MAAM,MAAM,GAAU,OAAO,qBAAqB,GAAG,mBAAmB,EAClD,gBAAe,MAAoB,sEAQ/D,CAAA;CACJ"}
@@ -0,0 +1,15 @@
1
+ import { WavFile } from "@opendaw/lib-dsp";
2
+ import { Promises } from "@opendaw/lib-runtime";
3
+ import { Files } from "@opendaw/lib-dom";
4
+ export var AudioWavExport;
5
+ (function (AudioWavExport) {
6
+ AudioWavExport.toFile = async (owner, suggestedName = "audio.wav") => {
7
+ const data = owner.file.data.unwrap("Audio data is not loaded");
8
+ return Promises.tryCatch(Files.save(WavFile.encodeFloats(data), {
9
+ types: [{
10
+ description: "Wav File",
11
+ accept: { "audio/wav": [".wav"] }
12
+ }], suggestedName
13
+ }));
14
+ };
15
+ })(AudioWavExport || (AudioWavExport = {}));
@@ -0,0 +1,9 @@
1
+ import { EventCollection, NoteEvent } from "@opendaw/lib-dsp";
2
+ import { MidiTrack } from "@opendaw/lib-midi";
3
+ import { Promises } from "@opendaw/lib-runtime";
4
+ import { NoteEventCollectionBoxAdapter } from "@opendaw/studio-adapters";
5
+ export declare namespace NoteMidiExport {
6
+ const fromCollection: <E extends NoteEvent>(collection: EventCollection<E>) => MidiTrack;
7
+ const toFile: (collection: NoteEventCollectionBoxAdapter, suggestedName?: string) => Promise<Promises.RejectedResult | Promises.ResolveResult<string>>;
8
+ }
9
+ //# sourceMappingURL=NoteMidiExport.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"NoteMidiExport.d.ts","sourceRoot":"","sources":["../../src/project/NoteMidiExport.ts"],"names":[],"mappings":"AACA,OAAO,EAAC,eAAe,EAAa,SAAS,EAAa,MAAM,kBAAkB,CAAA;AAClF,OAAO,EAA+C,SAAS,EAAC,MAAM,mBAAmB,CAAA;AACzF,OAAO,EAAC,QAAQ,EAAC,MAAM,sBAAsB,CAAA;AAE7C,OAAO,EAAC,6BAA6B,EAAC,MAAM,0BAA0B,CAAA;AAEtE,yBAAiB,cAAc,CAAC;IACrB,MAAM,cAAc,GAAI,CAAC,SAAS,SAAS,EAAE,YAAY,eAAe,CAAC,CAAC,CAAC,KAAG,SAQpF,CAAA;IAEM,MAAM,MAAM,GAAU,YAAY,6BAA6B,EAAE,gBAAe,MAAoB,sEAS1G,CAAA;CACJ"}
@@ -0,0 +1,27 @@
1
+ import { ArrayMultimap } from "@opendaw/lib-std";
2
+ import { EventSpan, PPQN } from "@opendaw/lib-dsp";
3
+ import { ControlEvent, ControlType, MidiFile, MidiTrack } from "@opendaw/lib-midi";
4
+ import { Promises } from "@opendaw/lib-runtime";
5
+ import { Files } from "@opendaw/lib-dom";
6
+ export var NoteMidiExport;
7
+ (function (NoteMidiExport) {
8
+ NoteMidiExport.fromCollection = (collection) => {
9
+ const events = [];
10
+ const toTicks = (position, timeDivision = 96) => Math.floor(position / PPQN.Quarter * timeDivision);
11
+ for (const event of collection.asArray()) {
12
+ events.push(new ControlEvent(toTicks(event.position), ControlType.NOTE_ON, event.pitch, Math.round(event.velocity * 127)));
13
+ events.push(new ControlEvent(toTicks(EventSpan.complete(event)), ControlType.NOTE_OFF, event.pitch, 0));
14
+ }
15
+ return new MidiTrack(new ArrayMultimap([[0, events]], ControlEvent.Comparator), []);
16
+ };
17
+ NoteMidiExport.toFile = async (collection, suggestedName = "notes.mid") => {
18
+ const encoder = MidiFile.encoder();
19
+ encoder.addTrack(NoteMidiExport.fromCollection(collection.events));
20
+ return Promises.tryCatch(Files.save(encoder.encode().toArrayBuffer(), {
21
+ types: [{
22
+ description: "Midi File",
23
+ accept: { "application/octet-stream": [".mid", ".midi"] }
24
+ }], suggestedName
25
+ }));
26
+ };
27
+ })(NoteMidiExport || (NoteMidiExport = {}));
@@ -1 +1 @@
1
- {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"Project.d.ts","sourceRoot":"","sources":["../../src/project/Project.ts"],"names":[],"mappings":"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"}
@@ -168,7 +168,7 @@ export class Project {
168
168
  };
169
169
  worklet.addEventListener("error", handler);
170
170
  worklet.addEventListener("processorerror", handler);
171
- worklet.connect(worklet.context.destination);
171
+ worklet.connect(worklet.context.destination, 0);
172
172
  this.engine.setWorklet(worklet);
173
173
  return worklet;
174
174
  }
@@ -191,7 +191,6 @@ export class Project {
191
191
  }
192
192
  stopRecording() {
193
193
  this.engine.stopRecording();
194
- this.editing.mark();
195
194
  }
196
195
  isRecording() { return Recording.isRecording; }
197
196
  follow(box) {
@@ -3,7 +3,7 @@ import { ppqn } from "@opendaw/lib-dsp";
3
3
  import { Field, PointerField } from "@opendaw/lib-box";
4
4
  import { Pointers } from "@opendaw/studio-enums";
5
5
  import { AudioClipBox, AudioRegionBox, AudioUnitBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox } from "@opendaw/studio-boxes";
6
- import { AnyRegionBox, AnyRegionBoxAdapter, AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct } from "@opendaw/studio-adapters";
6
+ import { AnyRegionBox, AnyRegionBoxAdapter, AudioClipBoxAdapter, AudioRegionBoxAdapter, AudioUnitBoxAdapter, EffectPointerType, IndexedAdapterCollectionListener, InstrumentBox, InstrumentFactory, InstrumentOptions, InstrumentProduct, NoteEventCollectionBoxAdapter } from "@opendaw/studio-adapters";
7
7
  import { Project } from "./Project";
8
8
  import { EffectFactory } from "../EffectFactory";
9
9
  import { EffectBox } from "../EffectBox";
@@ -62,6 +62,8 @@ export declare class ProjectApi {
62
62
  duplicateRegion<R extends AnyRegionBoxAdapter>(region: R, options?: {
63
63
  findFreeSpace?: boolean;
64
64
  }): Option<R>;
65
+ exportMIDI(collection: NoteEventCollectionBoxAdapter, suggestedName?: string): Promise<import("@opendaw/lib-runtime").Promises.RejectedResult | import("@opendaw/lib-runtime").Promises.ResolveResult<string>>;
66
+ exportAudio(owner: AudioRegionBoxAdapter | AudioClipBoxAdapter, suggestedName?: string): Promise<import("@opendaw/lib-runtime").Promises.RejectedResult | import("@opendaw/lib-runtime").Promises.ResolveResult<string>>;
65
67
  quantiseNotes(collection: NoteEventCollectionBox, { positionQuantisation, durationQuantisation }: QuantiseNotesOptions): void;
66
68
  createValueClip(trackBox: TrackBox, clipIndex: int, { name, hue }?: ClipRegionOptions): ValueClipBox;
67
69
  createNoteRegion({ trackBox, position, duration, loopOffset, loopDuration, eventOffset, eventCollection, mute, name, hue }: NoteRegionParams): NoteRegionBox;
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"ProjectApi.d.ts","sourceRoot":"","sources":["../../src/project/ProjectApi.ts"],"names":[],"mappings":"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"}
@@ -5,6 +5,8 @@ import { AudioUnitType } from "@opendaw/studio-enums";
5
5
  import { AudioUnitBox, CaptureAudioBox, CaptureMidiBox, NoteClipBox, NoteEventBox, NoteEventCollectionBox, NoteRegionBox, TrackBox, ValueClipBox, ValueEventCollectionBox, ValueRegionBox } from "@opendaw/studio-boxes";
6
6
  import { AudioUnitFactory, ColorCodes, ProjectQueries, TrackType } from "@opendaw/studio-adapters";
7
7
  import { AudioContentFactory } from "./audio";
8
+ import { NoteMidiExport } from "./NoteMidiExport";
9
+ import { AudioWavExport } from "./AudioWavExport";
8
10
  // noinspection JSUnusedGlobalSymbols
9
11
  export class ProjectApi {
10
12
  #project;
@@ -140,6 +142,12 @@ export class ProjectApi {
140
142
  return Option.wrap(duplicate);
141
143
  }
142
144
  }
145
+ async exportMIDI(collection, suggestedName = "notes.mid") {
146
+ return NoteMidiExport.toFile(collection, suggestedName);
147
+ }
148
+ async exportAudio(owner, suggestedName = "audio.wav") {
149
+ return AudioWavExport.toFile(owner, suggestedName);
150
+ }
143
151
  quantiseNotes(collection, { positionQuantisation, durationQuantisation }) {
144
152
  if (isAbsent(positionQuantisation) && isAbsent(durationQuantisation)) {
145
153
  console.warn("Nothing to quantise: both quantisation parameters are absent");
@@ -1 +1 @@
1
- {"version":3,"file":"ProjectStorage.d.ts","sourceRoot":"","sources":["../../src/project/ProjectStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAyB,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrF,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AAGpE,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AAIzC,yBAAiB,cAAc,CAAC;IAC5B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAA;QAChB,IAAI,EAAE,WAAW,CAAA;QACjB,KAAK,CAAC,EAAE,WAAW,CAAA;QACnB,OAAO,CAAC,EAAE,WAAW,CAAA;KACxB,CAAA;IAED,KAAY,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAU,6CAA0C;QACzE,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACzB,KAAG,OAAO,CAAC,IAAI,CAcpB,CAAA;IAEM,MAAM,WAAW,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEvE,CAAA;IAEM,MAAM,QAAQ,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEpE,CAAA;IAEM,MAAM,SAAS,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAG7E,CAAA;IAEM,MAAM,cAAc,GAAU,MAAM,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC,KAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CAatG,CAAA;IAEM,MAAM,aAAa,GAAU,MAAM,IAAI,CAAC,KAAK,kBAMnD,CAAA;IAEM,MAAM,cAAc,QAAa,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAGjE,CAAA;CACJ"}
1
+ {"version":3,"file":"ProjectStorage.d.ts","sourceRoot":"","sources":["../../src/project/ProjectStorage.ts"],"names":[],"mappings":"AAAA,OAAO,EAAC,KAAK,EAAE,MAAM,EAAE,QAAQ,EAAyB,IAAI,EAAC,MAAM,kBAAkB,CAAA;AACrF,OAAO,EAAC,YAAY,EAAE,gBAAgB,EAAC,MAAM,uBAAuB,CAAA;AAGpE,OAAO,EAAC,WAAW,EAAC,MAAM,eAAe,CAAA;AAIzC,yBAAiB,cAAc,CAAC;IAC5B,KAAY,SAAS,GAAG;QACpB,IAAI,EAAE,IAAI,CAAC,KAAK,CAAA;QAChB,IAAI,EAAE,WAAW,CAAA;QACjB,KAAK,CAAC,EAAE,WAAW,CAAA;QACnB,OAAO,CAAC,EAAE,WAAW,CAAA;KACxB,CAAA;IAED,KAAY,IAAI,GAAG,aAAa,CAAC,SAAS,CAAC,CAAA;IAEpC,MAAM,YAAY,GAAU,6CAA0C;QACzE,YAAY,CAAC,EAAE,OAAO,CAAA;QACtB,cAAc,CAAC,EAAE,OAAO,CAAA;QACxB,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAA;KACzB,KAAG,OAAO,CAAC,IAAI,CAcpB,CAAA;IAEM,MAAM,WAAW,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEvE,CAAA;IAEM,MAAM,QAAQ,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,WAAW,CAEpE,CAAA;IAEM,MAAM,SAAS,GAAU,MAAM,IAAI,CAAC,KAAK,KAAG,OAAO,CAAC,MAAM,CAAC,WAAW,CAAC,CAG7E,CAAA;IAEM,MAAM,cAAc,GAAU,MAAM,KAAK,CAAC,YAAY,GAAG,gBAAgB,CAAC,KAAG,OAAO,CAAC,GAAG,CAAC,MAAM,CAAC,CActG,CAAA;IAEM,MAAM,aAAa,GAAU,MAAM,IAAI,CAAC,KAAK,kBAMnD,CAAA;IAEM,MAAM,cAAc,QAAa,OAAO,CAAC,KAAK,CAAC,IAAI,CAAC,MAAM,CAAC,CAGjE,CAAA;CACJ"}
@@ -31,6 +31,7 @@ export var ProjectStorage;
31
31
  .then(array => Option.wrap(array.buffer), () => Option.None);
32
32
  };
33
33
  ProjectStorage.listUsedAssets = async (type) => {
34
+ console.debug("listUsedAssets", type.name);
34
35
  const uuids = [];
35
36
  const files = await Workers.Opfs.list(ProjectPaths.Folder);
36
37
  for (const { name } of files.filter(file => file.kind === "directory")) {
@@ -1,4 +1,6 @@
1
1
  export * from "./audio";
2
+ export * from "./AudioWavExport";
3
+ export * from "./NoteMidiExport";
2
4
  export * from "./Project";
3
5
  export * from "./ProjectApi";
4
6
  export * from "./ProjectBundle";
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/project/index.ts"],"names":[],"mappings":"AAAA,cAAc,SAAS,CAAA;AACvB,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,WAAW,CAAA;AACzB,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,cAAc,CAAA;AAC5B,cAAc,eAAe,CAAA;AAC7B,cAAc,oBAAoB,CAAA;AAClC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,kBAAkB,CAAA;AAChC,cAAc,YAAY,CAAA"}
@@ -1,4 +1,6 @@
1
1
  export * from "./audio";
2
+ export * from "./AudioWavExport";
3
+ export * from "./NoteMidiExport";
2
4
  export * from "./Project";
3
5
  export * from "./ProjectApi";
4
6
  export * from "./ProjectBundle";
@@ -1,10 +1,10 @@
1
1
  import { describe, expect, it } from "vitest";
2
2
  import { BoxGraph } from "@opendaw/lib-box";
3
- import { isDefined, Option, UUID } from "@opendaw/lib-std";
4
- import { BoxIO, ValueEventBox, ValueEventCollectionBox } from "@opendaw/studio-boxes";
3
+ import { isDefined, UUID } from "@opendaw/lib-std";
4
+ import { ValueEventBox, ValueEventCollectionBox } from "@opendaw/studio-boxes";
5
5
  import { migrateValueEventCollection } from "./MigrateValueEventCollection";
6
6
  const createTestSetup = () => {
7
- const boxGraph = new BoxGraph(Option.wrap(BoxIO.create));
7
+ const boxGraph = new BoxGraph();
8
8
  boxGraph.beginTransaction();
9
9
  const collection = ValueEventCollectionBox.create(boxGraph, UUID.generate());
10
10
  boxGraph.endTransaction();
@@ -2,6 +2,7 @@ import { Procedure, unitValue, UUID } from "@opendaw/lib-std";
2
2
  import { Sample, SampleMetaData } from "@opendaw/studio-adapters";
3
3
  import { SampleAPI } from "@opendaw/studio-core";
4
4
  import { AudioData } from "@opendaw/lib-dsp";
5
+ /** @internal */
5
6
  export declare class OpenSampleAPI implements SampleAPI {
6
7
  static readonly ApiRoot = "https://api.opendaw.studio/samples";
7
8
  static readonly FileRoot = "https://assets.opendaw.studio/samples";
@@ -1 +1 @@
1
- {"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAGnD,qBAAa,aAAc,YAAW,SAAS;IAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,wCAAuC;IAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,2CAA0C;IAGlE,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAGD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IActC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAwCpF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/E,YAAY,IAAI,OAAO;CAC1B"}
1
+ {"version":3,"file":"OpenSampleAPI.d.ts","sourceRoot":"","sources":["../../src/samples/OpenSampleAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAKH,SAAS,EAGT,SAAS,EACT,IAAI,EACP,MAAM,kBAAkB,CAAA;AAEzB,OAAO,EAAC,MAAM,EAAE,cAAc,EAAC,MAAM,0BAA0B,CAAA;AAC/D,OAAO,EAAC,SAAS,EAAC,MAAM,sBAAsB,CAAA;AAG9C,OAAO,EAAC,SAAS,EAAU,MAAM,kBAAkB,CAAA;AAGnD,gBAAgB;AAChB,qBAAa,aAAc,YAAW,SAAS;IAC3C,MAAM,CAAC,QAAQ,CAAC,OAAO,wCAAuC;IAC9D,MAAM,CAAC,QAAQ,CAAC,QAAQ,2CAA0C;IAGlE,MAAM,CAAC,GAAG,IAAI,aAAa;IAE3B,OAAO;IAGD,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IAKrC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,MAAM,CAAC;IActC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,SAAS,EAAE,MAAM,CAAC,CAAC;IAwCpF,MAAM,CAAC,WAAW,EAAE,WAAW,EAAE,QAAQ,EAAE,cAAc,GAAG,OAAO,CAAC,IAAI,CAAC;IAoC/E,YAAY,IAAI,OAAO;CAC1B"}
@@ -14,6 +14,7 @@ import { base64Credentials, OpenDAWHeaders } from "../OpenDAWHeaders";
14
14
  import { z } from "zod";
15
15
  import { WavFile } from "@opendaw/lib-dsp";
16
16
  // Standard openDAW samples (considered to be non-removable)
17
+ /** @internal */
17
18
  export class OpenSampleAPI {
18
19
  static ApiRoot = "https://api.opendaw.studio/samples";
19
20
  static FileRoot = "https://assets.opendaw.studio/samples";
@@ -63,7 +63,7 @@ export class SampleService extends AssetService {
63
63
  console.debug("decoding with web-api-api (fallback)");
64
64
  const { status, value: audioBuffer } = await Promises.tryCatch(this.audioContext.decodeAudioData(arrayBuffer));
65
65
  if (status === "rejected") {
66
- return Promise.reject();
66
+ return Promise.reject(new Error("Could not decode audio file"));
67
67
  }
68
68
  const audioData = AudioData.create(audioBuffer.sampleRate, audioBuffer.length, audioBuffer.numberOfChannels);
69
69
  for (let channel = 0; channel < audioBuffer.numberOfChannels; channel++) {
@@ -1 +1 @@
1
- {"version":3,"file":"DefaultSoundfontLoader.d.ts","sourceRoot":"","sources":["../../src/soundfont/DefaultSoundfontLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,EAAY,YAAY,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAErG,OAAO,EAAC,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AACjG,OAAO,EAAC,4BAA4B,EAAC,MAAM,gCAAgC,CAAA;AAE3E,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAG1C,qBAAa,sBAAuB,YAAW,eAAe;;gBAU9C,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK;IAQnE,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,YAAY;IAQjE,UAAU,IAAI,IAAI;IAOlB,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAoB;IAC1C,IAAI,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,CAAyB;IAC5D,IAAI,IAAI,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAoB;IACzD,IAAI,KAAK,IAAI,oBAAoB,CAAqB;IAEtD,QAAQ,IAAI,MAAM;CAkDrB"}
1
+ {"version":3,"file":"DefaultSoundfontLoader.d.ts","sourceRoot":"","sources":["../../src/soundfont/DefaultSoundfontLoader.ts"],"names":[],"mappings":"AAAA,OAAO,EAAW,QAAQ,EAAE,MAAM,EAAY,YAAY,EAAc,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAErG,OAAO,EAAC,eAAe,EAAE,oBAAoB,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AACjG,OAAO,EAAC,4BAA4B,EAAC,MAAM,gCAAgC,CAAA;AAE3E,OAAO,KAAK,EAAC,UAAU,EAAC,MAAM,YAAY,CAAA;AAG1C,qBAAa,sBAAuB,YAAW,eAAe;;gBAU9C,OAAO,EAAE,4BAA4B,EAAE,IAAI,EAAE,IAAI,CAAC,KAAK;IAQnE,SAAS,CAAC,QAAQ,EAAE,QAAQ,CAAC,oBAAoB,CAAC,GAAG,YAAY;IAQjE,UAAU,IAAI,IAAI;IAOlB,IAAI,IAAI,IAAI,IAAI,CAAC,KAAK,CAAoB;IAC1C,IAAI,SAAS,IAAI,MAAM,CAAC,UAAU,CAAC,CAAyB;IAC5D,IAAI,IAAI,IAAI,MAAM,CAAC,iBAAiB,CAAC,CAAoB;IACzD,IAAI,KAAK,IAAI,oBAAoB,CAAqB;IAEtD,QAAQ,IAAI,MAAM;CAqDrB"}
@@ -53,6 +53,9 @@ export class DefaultSoundfontLoader {
53
53
  else {
54
54
  return this.#fetch();
55
55
  }
56
+ }).catch(error => {
57
+ console.warn("Failed to load soundfont:", error);
58
+ this.#setState({ type: "error", reason: error instanceof Error ? error.message : String(error) });
56
59
  });
57
60
  }
58
61
  async #fetch() {
@@ -1,5 +1,6 @@
1
1
  import { Procedure, unitValue, UUID } from "@opendaw/lib-std";
2
2
  import { Soundfont, SoundfontMetaData } from "@opendaw/studio-adapters";
3
+ /** @internal */
3
4
  export declare class OpenSoundfontAPI {
4
5
  #private;
5
6
  static readonly ApiRoot = "https://api.opendaw.studio/soundfonts";
@@ -1 +1 @@
1
- {"version":3,"file":"OpenSoundfontAPI.d.ts","sourceRoot":"","sources":["../../src/soundfont/OpenSoundfontAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAmB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAKrE,qBAAa,gBAAgB;;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,2CAA0C;IACjE,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA6C;IAGrE,MAAM,CAAC,GAAG,IAAI,gBAAgB;IAU9B,OAAO;IAED,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAExC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;IAMzC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;CAyB1G"}
1
+ {"version":3,"file":"OpenSoundfontAPI.d.ts","sourceRoot":"","sources":["../../src/soundfont/OpenSoundfontAPI.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,SAAS,EAAmB,SAAS,EAAE,IAAI,EAAC,MAAM,kBAAkB,CAAA;AAC7F,OAAO,EAAC,SAAS,EAAE,iBAAiB,EAAC,MAAM,0BAA0B,CAAA;AAKrE,gBAAgB;AAChB,qBAAa,gBAAgB;;IACzB,MAAM,CAAC,QAAQ,CAAC,OAAO,2CAA0C;IACjE,MAAM,CAAC,QAAQ,CAAC,QAAQ,8CAA6C;IAGrE,MAAM,CAAC,GAAG,IAAI,gBAAgB;IAU9B,OAAO;IAED,GAAG,IAAI,OAAO,CAAC,aAAa,CAAC,SAAS,CAAC,CAAC;IAExC,GAAG,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,GAAG,OAAO,CAAC,SAAS,CAAC;IAMzC,IAAI,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,EAAE,QAAQ,EAAE,SAAS,CAAC,SAAS,CAAC,GAAG,OAAO,CAAC,CAAC,WAAW,EAAE,iBAAiB,CAAC,CAAC;CAyB1G"}
@@ -12,6 +12,7 @@ import { Soundfont } from "@opendaw/studio-adapters";
12
12
  import { OpenDAWHeaders } from "../OpenDAWHeaders";
13
13
  import { network, Promises } from "@opendaw/lib-runtime";
14
14
  import { z } from "zod";
15
+ /** @internal */
15
16
  export class OpenSoundfontAPI {
16
17
  static ApiRoot = "https://api.opendaw.studio/soundfonts";
17
18
  static FileRoot = "https://assets.opendaw.studio/soundfonts";
@@ -21,7 +21,7 @@ export class SoundfontService extends AssetService {
21
21
  ]).then(([local, remote]) => {
22
22
  this.#local = Option.wrap(Arrays.subtract(local, remote, (a, b) => a.uuid === b.uuid));
23
23
  this.#remote = Option.wrap(remote);
24
- });
24
+ }, error => console.warn("Failed to load soundfont index:", error));
25
25
  }
26
26
  get local() { return this.#local; }
27
27
  get remote() { return this.#remote; }
@@ -1 +1 @@
1
- {"version":3,"file":"SyncLogWriter.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogWriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAgB,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAEpF,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAE/B,qBAAa,aAAc,YAAW,UAAU;;IAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa;IAW/F,OAAO;IAWP,SAAS,IAAI,IAAI;CA6BpB"}
1
+ {"version":3,"file":"SyncLogWriter.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogWriter.ts"],"names":[],"mappings":"AAAA,OAAO,EAAkB,QAAQ,EAAgB,UAAU,EAAC,MAAM,kBAAkB,CAAA;AAEpF,OAAO,EAAC,OAAO,EAAC,MAAM,oBAAoB,CAAA;AAC1C,OAAO,EAAC,MAAM,EAAC,MAAM,UAAU,CAAA;AAE/B,qBAAa,aAAc,YAAW,UAAU;;IAC5C,MAAM,CAAC,MAAM,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,EAAE,QAAQ,CAAC,MAAM,CAAC,EAAE,UAAU,CAAC,EAAE,MAAM,GAAG,aAAa;IAW/F,OAAO;IAWP,SAAS,IAAI,IAAI;CAgCpB"}
@@ -34,10 +34,11 @@ export class SyncLogWriter {
34
34
  return boxGraph.subscribeTransaction({
35
35
  onBeginTransaction: () => this.#transactionSubscription =
36
36
  boxGraph.subscribeToAllUpdatesImmediate({ onUpdate: (update) => updates.push(update) }),
37
- onEndTransaction: () => {
37
+ onEndTransaction: (rolledBack) => {
38
38
  this.#transactionSubscription.terminate();
39
39
  this.#transactionSubscription = Terminable.Empty;
40
- if (updates.length === 0) {
40
+ if (rolledBack || updates.length === 0) {
41
+ updates = [];
41
42
  return;
42
43
  }
43
44
  const ref = updates;
@@ -40,7 +40,7 @@ export var ClipboardUtils;
40
40
  const graphData = new Int8Array(graphDataLength);
41
41
  input.readBytes(graphData);
42
42
  const clipboardGraph = new BoxGraph(Option.wrap(BoxIO.create));
43
- clipboardGraph.fromArrayBuffer(graphData.buffer);
43
+ clipboardGraph.fromArrayBuffer(graphData.buffer, false);
44
44
  const skippedExternalUuids = UUID.newSet(uuid => uuid);
45
45
  clipboardGraph.boxes().forEach(box => {
46
46
  if (box.resource === "preserved" && targetGraph.findBox(box.address.uuid).nonEmpty()) {
@@ -1 +1 @@
1
- {"version":3,"file":"YService.d.ts","sourceRoot":"","sources":["../../src/ysync/YService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAyC,MAAM,kBAAkB,CAAA;AAKvF,OAAO,EAAC,OAAO,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAA;AAGhE,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAA;AAI7C,yBAAiB,QAAQ,CAAC;IAMtB,KAAY,UAAU,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,iBAAiB,CAAA;KAAE,CAAA;IAEnE,MAAM,eAAe,GAAU,YAAY,MAAM,CAAC,OAAO,CAAC,EAC3B,KAAK,UAAU,EACf,UAAU,MAAM,KAAG,OAAO,CAAC,UAAU,CA+D1E,CAAA;CACJ"}
1
+ {"version":3,"file":"YService.d.ts","sourceRoot":"","sources":["../../src/ysync/YService.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,MAAM,EAAyC,MAAM,kBAAkB,CAAA;AAKvF,OAAO,EAAC,OAAO,EAAE,UAAU,EAAmB,MAAM,YAAY,CAAA;AAGhE,OAAO,EAAC,iBAAiB,EAAC,MAAM,aAAa,CAAA;AAI7C,yBAAiB,QAAQ,CAAC;IAMtB,KAAY,UAAU,GAAG;QAAE,OAAO,EAAE,OAAO,CAAC;QAAC,QAAQ,EAAE,iBAAiB,CAAA;KAAE,CAAA;IAEnE,MAAM,eAAe,GAAU,YAAY,MAAM,CAAC,OAAO,CAAC,EAC3B,KAAK,UAAU,EACf,UAAU,MAAM,KAAG,OAAO,CAAC,UAAU,CA0D1E,CAAA;CACJ"}
@@ -46,9 +46,6 @@ export var YService;
46
46
  conflict: () => project.invalid()
47
47
  });
48
48
  project.own(sync);
49
- // TODO Remove this cast at some point
50
- const editing = project.editing;
51
- editing.disable();
52
49
  return { project, provider };
53
50
  }
54
51
  else {
@@ -75,8 +72,6 @@ export var YService;
75
72
  boxGraph.endTransaction();
76
73
  project.follow(userInterfaceBox);
77
74
  project.own(sync);
78
- const editing = project.editing;
79
- editing.disable();
80
75
  return { project, provider };
81
76
  }
82
77
  };
@@ -8,6 +8,7 @@ export type Construct<T> = {
8
8
  };
9
9
  export declare class YSync<T> implements Terminable {
10
10
  #private;
11
+ static debugging: boolean;
11
12
  /** @internal */
12
13
  static isEmpty(doc: Y.Doc): boolean;
13
14
  static populateRoom<T>({ boxGraph, boxes }: Construct<T>): Promise<YSync<T>>;
@@ -1 +1 @@
1
- {"version":3,"file":"YSync.d.ts","sourceRoot":"","sources":["../../src/ysync/YSync.ts"],"names":[],"mappings":"AAAA,OAAO,EASH,QAAQ,EAER,UAAU,EAGb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAa,QAAQ,EAA2D,MAAM,kBAAkB,CAAA;AAE/G,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAIxB,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACvB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAC/B,CAAA;AAED,qBAAa,KAAK,CAAC,CAAC,CAAE,YAAW,UAAU;;IACvC,gBAAgB;IAChB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,OAAO;WAItB,YAAY,CAAC,CAAC,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;WAcnE,QAAQ,CAAC,CAAC,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAqChE,EAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IASrD,SAAS,IAAI,IAAI;CA4LpB"}
1
+ {"version":3,"file":"YSync.d.ts","sourceRoot":"","sources":["../../src/ysync/YSync.ts"],"names":[],"mappings":"AAAA,OAAO,EASH,QAAQ,EAER,UAAU,EAIb,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAa,QAAQ,EAA2D,MAAM,kBAAkB,CAAA;AAE/G,OAAO,KAAK,CAAC,MAAM,KAAK,CAAA;AAIxB,MAAM,MAAM,SAAS,CAAC,CAAC,IAAI;IACvB,QAAQ,EAAE,QAAQ,CAAC,CAAC,CAAC,CAAC;IACtB,KAAK,EAAE,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAA;IACrB,QAAQ,CAAC,EAAE,QAAQ,CAAC,OAAO,CAAC,CAAA;CAC/B,CAAA;AAED,qBAAa,KAAK,CAAC,CAAC,CAAE,YAAW,UAAU;;IACvC,MAAM,CAAC,SAAS,EAAE,OAAO,CAAQ;IAEjC,gBAAgB;IAChB,MAAM,CAAC,OAAO,CAAC,GAAG,EAAE,CAAC,CAAC,GAAG,GAAG,OAAO;WAItB,YAAY,CAAC,CAAC,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;WAcnE,QAAQ,CAAC,CAAC,EAAE,EAAC,QAAQ,EAAE,KAAK,EAAC,EAAE,SAAS,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC;gBAqChE,EAAC,QAAQ,EAAE,KAAK,EAAE,QAAQ,EAAC,EAAE,SAAS,CAAC,CAAC,CAAC;IASrD,SAAS,IAAI,IAAI;CA0LpB"}
@@ -1,7 +1,8 @@
1
- import { asDefined, asInstanceOf, assert, EmptyExec, isUndefined, Option, panic, Terminable, Terminator, UUID } from "@opendaw/lib-std";
1
+ import { asDefined, asInstanceOf, assert, EmptyExec, isUndefined, Option, panic, Terminable, Terminator, tryCatch, UUID } from "@opendaw/lib-std";
2
2
  import { YMapper } from "./YMapper";
3
3
  import * as Y from "yjs";
4
4
  export class YSync {
5
+ static debugging = false;
5
6
  /** @internal */
6
7
  static isEmpty(doc) {
7
8
  return doc.getMap("boxes").size === 0;
@@ -62,45 +63,51 @@ export class YSync {
62
63
  terminate() { this.#terminator.terminate(); }
63
64
  #setupYjs() {
64
65
  const eventHandler = (events, { origin, local }) => {
65
- const originLabel = typeof origin === "string" ? origin : "WebsocketProvider";
66
+ const originLabel = typeof origin === "string" ? origin : "Unkown Origin";
66
67
  const isOwnOrigin = typeof origin === "string" && origin.startsWith("[openDAW]");
67
68
  const isHistoryReplay = typeof origin === "string" && origin.startsWith("[history]");
68
- console.debug(`got ${events.length} ${local ? "local" : "external"} updates from '${originLabel}', isHistoryReplay: ${isHistoryReplay}`);
69
+ console.debug(`got ${events.length} ${local ? "local" : "external"} updates from '${originLabel}', isHistoryReplay: ${isHistoryReplay}, isOwnOrigin: ${isOwnOrigin}`);
69
70
  if (isOwnOrigin || (local && !isHistoryReplay)) {
70
71
  return;
71
72
  }
72
73
  this.#boxGraph.beginTransaction();
73
- for (const event of events) {
74
- const path = this.#normalizePath(event.path);
75
- const keys = event.changes.keys;
76
- for (const [key, change] of keys.entries()) {
77
- if (change.action === "add") {
78
- assert(path.length === 0, "'Add' cannot have a path");
79
- this.#createBox(key);
80
- }
81
- else if (change.action === "update") {
82
- if (path.length === 0) {
83
- continue;
74
+ const result = tryCatch(() => {
75
+ for (const event of events) {
76
+ const path = this.#normalizePath(event.path);
77
+ const keys = event.changes.keys;
78
+ for (const [key, change] of keys.entries()) {
79
+ if (YSync.debugging) {
80
+ console.debug(`${change.action} on ${path}:${key}`);
81
+ }
82
+ if (change.action === "add") {
83
+ assert(path.length === 0, "'Add' cannot have a path");
84
+ this.#createBox(key);
85
+ }
86
+ else if (change.action === "update") {
87
+ if (path.length === 0) {
88
+ continue;
89
+ }
90
+ assert(path.length >= 2, "Invalid path: must have at least 2 elements (uuid, 'fields').");
91
+ this.#updateValue(path, key);
92
+ }
93
+ else if (change.action === "delete") {
94
+ assert(path.length === 0, "'Delete' cannot have a path");
95
+ this.#deleteBox(key);
84
96
  }
85
- assert(path.length >= 2, "Invalid path: must have at least 2 elements (uuid, 'fields').");
86
- this.#updateValue(path, key);
87
- }
88
- else if (change.action === "delete") {
89
- assert(path.length === 0, "'Delete' cannot have a path");
90
- this.#deleteBox(key);
91
97
  }
92
98
  }
93
- }
94
- try {
95
99
  this.#ignoreUpdates = true;
96
100
  this.#boxGraph.endTransaction();
97
101
  this.#ignoreUpdates = false;
98
- // TODO Only in DEV-MODE
99
- // this.#boxGraph.verifyPointers()
100
- }
101
- catch (reason) {
102
- this.terminate();
103
- return panic(reason);
102
+ });
103
+ if (result.status === "failure") {
104
+ this.#ignoreUpdates = false;
105
+ if (this.#boxGraph.inTransaction()) {
106
+ this.#boxGraph.abortTransaction();
107
+ }
108
+ console.warn(`[YSync] Transaction rejected, rolling back:`, result.error);
109
+ this.#rollbackTransaction(events);
110
+ return;
104
111
  }
105
112
  const highLevelConflict = this.#conflict.mapOr(check => check(), false);
106
113
  if (highLevelConflict) {
@@ -137,13 +144,9 @@ export class YSync {
137
144
  return path.slice(prefix.length);
138
145
  }
139
146
  #updateValue(path, key) {
140
- console.debug(`#updateValue`, path, key);
141
- const vertexOption = this.#boxGraph.findVertex(YMapper.pathToAddress(path, key));
142
- if (vertexOption.isEmpty()) {
143
- console.debug(`Vertex at '${path}' does not exist. Ignoring.`);
144
- return;
145
- }
146
- const vertex = vertexOption.unwrap("Could not find field");
147
+ const address = YMapper.pathToAddress(path, key);
148
+ const vertex = this.#boxGraph.findVertex(address)
149
+ .unwrap(`Vertex at '${address.toString()}' does not exist.`);
147
150
  const [uuidAsString, fieldsKey, ...fieldKeys] = path;
148
151
  const targetMap = YMapper.findMap(this.#boxes
149
152
  .get(String(uuidAsString))
@@ -158,17 +161,11 @@ export class YSync {
158
161
  });
159
162
  }
160
163
  #deleteBox(key) {
161
- const optBox = this.#boxGraph.findBox(UUID.parse(key));
162
- if (optBox.isEmpty()) {
163
- console.debug(`Box '${key}' has already been deleted. Ignoring.`);
164
- }
165
- else {
166
- const box = optBox.unwrap();
167
- // It is possible that Yjs have swallowed the pointer releases since they were 'inside' the box.
168
- box.outgoingEdges().forEach(([pointer]) => pointer.defer());
169
- box.incomingEdges().forEach(pointer => pointer.defer());
170
- this.#boxGraph.unstageBox(box);
171
- }
164
+ const box = this.#boxGraph.findBox(UUID.parse(key))
165
+ .unwrap(`Box '${key}' does not exist.`);
166
+ box.outgoingEdges().forEach(([pointer]) => pointer.defer());
167
+ box.incomingEdges().forEach(pointer => pointer.defer());
168
+ this.#boxGraph.unstageBox(box);
172
169
  }
173
170
  #rollbackTransaction(events) {
174
171
  console.debug(`rollback ${events.length} events...`);
@@ -202,8 +199,8 @@ export class YSync {
202
199
  #setupOpenDAW() {
203
200
  return Terminable.many(this.#boxGraph.subscribeTransaction({
204
201
  onBeginTransaction: EmptyExec,
205
- onEndTransaction: () => {
206
- if (this.#ignoreUpdates) {
202
+ onEndTransaction: (rolledBack) => {
203
+ if (this.#ignoreUpdates || rolledBack) {
207
204
  this.#updates.length = 0;
208
205
  return;
209
206
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@opendaw/studio-core",
3
- "version": "0.0.130",
3
+ "version": "0.0.131",
4
4
  "license": "LGPL-3.0-or-later",
5
5
  "publishConfig": {
6
6
  "access": "public"
@@ -33,17 +33,18 @@
33
33
  "test": "vitest run --config vitest.config.ts"
34
34
  },
35
35
  "dependencies": {
36
- "@opendaw/lib-box": "^0.0.80",
37
- "@opendaw/lib-dawproject": "^0.0.65",
38
- "@opendaw/lib-dom": "^0.0.79",
39
- "@opendaw/lib-dsp": "^0.0.79",
40
- "@opendaw/lib-fusion": "^0.0.87",
41
- "@opendaw/lib-runtime": "^0.0.75",
42
- "@opendaw/lib-std": "^0.0.74",
36
+ "@opendaw/lib-box": "^0.0.81",
37
+ "@opendaw/lib-dawproject": "^0.0.66",
38
+ "@opendaw/lib-dom": "^0.0.80",
39
+ "@opendaw/lib-dsp": "^0.0.80",
40
+ "@opendaw/lib-fusion": "^0.0.88",
41
+ "@opendaw/lib-midi": "^0.0.62",
42
+ "@opendaw/lib-runtime": "^0.0.76",
43
+ "@opendaw/lib-std": "^0.0.75",
43
44
  "@opendaw/nam-wasm": "^1.0.3",
44
- "@opendaw/studio-adapters": "^0.0.102",
45
- "@opendaw/studio-boxes": "^0.0.85",
46
- "@opendaw/studio-enums": "^0.0.70",
45
+ "@opendaw/studio-adapters": "^0.0.103",
46
+ "@opendaw/studio-boxes": "^0.0.86",
47
+ "@opendaw/studio-enums": "^0.0.71",
47
48
  "dropbox": "^10.34.0",
48
49
  "y-websocket": "^1.4.5",
49
50
  "yjs": "^13.6.27",
@@ -57,10 +58,10 @@
57
58
  "@ffmpeg/ffmpeg": "^0.12.15",
58
59
  "@ffmpeg/util": "^0.12.2",
59
60
  "@opendaw/eslint-config": "^0.0.27",
60
- "@opendaw/studio-core-processors": "^0.0.106",
61
- "@opendaw/studio-core-workers": "^0.0.97",
62
- "@opendaw/studio-forge-boxes": "^0.0.85",
61
+ "@opendaw/studio-core-processors": "^0.0.107",
62
+ "@opendaw/studio-core-workers": "^0.0.98",
63
+ "@opendaw/studio-forge-boxes": "^0.0.86",
63
64
  "@opendaw/typescript-config": "^0.0.29"
64
65
  },
65
- "gitHead": "8e46cba2c2aba3ebb2ff49c764d039e0f9b8b820"
66
+ "gitHead": "ff6efcb5332559bb0ba064be829ab0d18a6ba226"
66
67
  }