@opendaw/studio-core 0.0.129 → 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.
- package/dist/AssetService.d.ts.map +1 -1
- package/dist/AssetService.js +11 -2
- package/dist/AudioOfflineRenderer.js +1 -1
- package/dist/Engine.d.ts +1 -1
- package/dist/Engine.d.ts.map +1 -1
- package/dist/EngineFacade.d.ts +1 -1
- package/dist/EngineFacade.d.ts.map +1 -1
- package/dist/EngineFacade.js +2 -2
- package/dist/EngineWorklet.d.ts +1 -1
- package/dist/EngineWorklet.d.ts.map +1 -1
- package/dist/EngineWorklet.js +9 -46
- package/dist/MonitoringRouter.d.ts +10 -0
- package/dist/MonitoringRouter.d.ts.map +1 -0
- package/dist/MonitoringRouter.js +89 -0
- package/dist/capture/CaptureAudio.d.ts +10 -0
- package/dist/capture/CaptureAudio.d.ts.map +1 -1
- package/dist/capture/CaptureAudio.js +106 -31
- package/dist/capture/RecordAudio.d.ts.map +1 -1
- package/dist/capture/RecordAudio.js +10 -2
- package/dist/capture/Recording.js +1 -1
- package/dist/processors.js +22 -22
- package/dist/processors.js.map +4 -4
- package/dist/project/AudioWavExport.d.ts +6 -0
- package/dist/project/AudioWavExport.d.ts.map +1 -0
- package/dist/project/AudioWavExport.js +15 -0
- package/dist/project/NoteMidiExport.d.ts +9 -0
- package/dist/project/NoteMidiExport.d.ts.map +1 -0
- package/dist/project/NoteMidiExport.js +27 -0
- package/dist/project/Project.d.ts.map +1 -1
- package/dist/project/Project.js +1 -2
- package/dist/project/ProjectApi.d.ts +3 -1
- package/dist/project/ProjectApi.d.ts.map +1 -1
- package/dist/project/ProjectApi.js +8 -0
- package/dist/project/ProjectStorage.d.ts.map +1 -1
- package/dist/project/ProjectStorage.js +1 -0
- package/dist/project/index.d.ts +2 -0
- package/dist/project/index.d.ts.map +1 -1
- package/dist/project/index.js +2 -0
- package/dist/project/migration/MigrateValueEventCollection.test.js +3 -3
- package/dist/samples/OpenSampleAPI.d.ts +1 -0
- package/dist/samples/OpenSampleAPI.d.ts.map +1 -1
- package/dist/samples/OpenSampleAPI.js +1 -0
- package/dist/samples/SampleService.js +1 -1
- package/dist/soundfont/DefaultSoundfontLoader.d.ts.map +1 -1
- package/dist/soundfont/DefaultSoundfontLoader.js +3 -0
- package/dist/soundfont/OpenSoundfontAPI.d.ts +1 -0
- package/dist/soundfont/OpenSoundfontAPI.d.ts.map +1 -1
- package/dist/soundfont/OpenSoundfontAPI.js +1 -0
- package/dist/soundfont/SoundfontService.js +1 -1
- package/dist/sync-log/SyncLogWriter.d.ts.map +1 -1
- package/dist/sync-log/SyncLogWriter.js +3 -2
- package/dist/ui/clipboard/ClipboardUtils.js +1 -1
- package/dist/ysync/YService.d.ts.map +1 -1
- package/dist/ysync/YService.js +0 -5
- package/dist/ysync/YSync.d.ts +2 -0
- package/dist/ysync/YSync.d.ts.map +1 -1
- package/dist/ysync/YSync.js +72 -49
- 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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"}
|
package/dist/project/Project.js
CHANGED
|
@@ -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":"AAAA,OAAO,EAGH,OAAO,EAGP,KAAK,EACL,GAAG,EAIH,QAAQ,EACR,MAAM,EAIN,YAAY,EAEf,MAAM,kBAAkB,CAAA;AACzB,OAAO,EAAC,IAAI,EAAO,MAAM,kBAAkB,CAAA;AAC3C,OAAO,EAAW,KAAK,EAAc,YAAY,EAAC,MAAM,kBAAkB,CAAA;AAC1E,OAAO,EAAgB,QAAQ,EAAC,MAAM,uBAAuB,CAAA;AAC7D,OAAO,EACH,YAAY,EACZ,cAAc,EACd,YAAY,EAGZ,WAAW,EACX,YAAY,EACZ,sBAAsB,EACtB,aAAa,EACb,QAAQ,EACR,YAAY,EAGf,MAAM,uBAAuB,CAAA;AAC9B,OAAO,EACH,YAAY,EACZ,mBAAmB,EACnB,mBAAmB,EAInB,iBAAiB,EACjB,gCAAgC,EAChC,aAAa,EACb,iBAAiB,EACjB,iBAAiB,EACjB,iBAAiB,
|
|
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,
|
|
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")) {
|
package/dist/project/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/project/index.js
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { describe, expect, it } from "vitest";
|
|
2
2
|
import { BoxGraph } from "@opendaw/lib-box";
|
|
3
|
-
import { isDefined,
|
|
4
|
-
import {
|
|
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(
|
|
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;
|
|
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;
|
|
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,
|
|
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"}
|
package/dist/ysync/YService.js
CHANGED
|
@@ -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
|
};
|
package/dist/ysync/YSync.d.ts
CHANGED
|
@@ -8,6 +8,8 @@ export type Construct<T> = {
|
|
|
8
8
|
};
|
|
9
9
|
export declare class YSync<T> implements Terminable {
|
|
10
10
|
#private;
|
|
11
|
+
static debugging: boolean;
|
|
12
|
+
/** @internal */
|
|
11
13
|
static isEmpty(doc: Y.Doc): boolean;
|
|
12
14
|
static populateRoom<T>({ boxGraph, boxes }: Construct<T>): Promise<YSync<T>>;
|
|
13
15
|
static joinRoom<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,
|
|
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"}
|
package/dist/ysync/YSync.js
CHANGED
|
@@ -1,7 +1,9 @@
|
|
|
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;
|
|
6
|
+
/** @internal */
|
|
5
7
|
static isEmpty(doc) {
|
|
6
8
|
return doc.getMap("boxes").size === 0;
|
|
7
9
|
}
|
|
@@ -33,60 +35,79 @@ export class YSync {
|
|
|
33
35
|
boxGraph.endTransaction();
|
|
34
36
|
return sync;
|
|
35
37
|
}
|
|
38
|
+
static #computePathPrefix(boxes) {
|
|
39
|
+
const prefix = [];
|
|
40
|
+
let item = boxes._item;
|
|
41
|
+
while (item !== null) {
|
|
42
|
+
prefix.unshift(item.parentSub);
|
|
43
|
+
const parent = item.parent;
|
|
44
|
+
item = parent._item;
|
|
45
|
+
}
|
|
46
|
+
return prefix;
|
|
47
|
+
}
|
|
36
48
|
#terminator = new Terminator();
|
|
37
49
|
#boxGraph;
|
|
38
50
|
#conflict;
|
|
39
51
|
#boxes;
|
|
40
52
|
#updates;
|
|
53
|
+
#pathPrefix;
|
|
41
54
|
#ignoreUpdates = false;
|
|
42
55
|
constructor({ boxGraph, boxes, conflict }) {
|
|
43
56
|
this.#boxGraph = boxGraph;
|
|
44
57
|
this.#conflict = Option.wrap(conflict);
|
|
45
58
|
this.#boxes = boxes;
|
|
46
59
|
this.#updates = [];
|
|
60
|
+
this.#pathPrefix = YSync.#computePathPrefix(boxes);
|
|
47
61
|
this.#terminator.ownAll(this.#setupYjs(), this.#setupOpenDAW());
|
|
48
62
|
}
|
|
49
63
|
terminate() { this.#terminator.terminate(); }
|
|
50
64
|
#setupYjs() {
|
|
51
65
|
const eventHandler = (events, { origin, local }) => {
|
|
52
|
-
const originLabel = typeof origin === "string" ? origin : "
|
|
66
|
+
const originLabel = typeof origin === "string" ? origin : "Unkown Origin";
|
|
67
|
+
const isOwnOrigin = typeof origin === "string" && origin.startsWith("[openDAW]");
|
|
53
68
|
const isHistoryReplay = typeof origin === "string" && origin.startsWith("[history]");
|
|
54
|
-
console.debug(`got ${events.length} ${local ? "local" : "external"} updates from '${originLabel}, isHistoryReplay: ${isHistoryReplay}
|
|
55
|
-
if (local && !isHistoryReplay) {
|
|
69
|
+
console.debug(`got ${events.length} ${local ? "local" : "external"} updates from '${originLabel}', isHistoryReplay: ${isHistoryReplay}, isOwnOrigin: ${isOwnOrigin}`);
|
|
70
|
+
if (isOwnOrigin || (local && !isHistoryReplay)) {
|
|
56
71
|
return;
|
|
57
72
|
}
|
|
58
73
|
this.#boxGraph.beginTransaction();
|
|
59
|
-
|
|
60
|
-
const
|
|
61
|
-
|
|
62
|
-
|
|
63
|
-
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
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);
|
|
70
96
|
}
|
|
71
|
-
assert(path.length >= 2, "Invalid path: must have at least 2 elements (uuid, 'fields').");
|
|
72
|
-
this.#updateValue(path, key);
|
|
73
|
-
}
|
|
74
|
-
else if (change.action === "delete") {
|
|
75
|
-
assert(path.length === 0, "'Delete' cannot have a path");
|
|
76
|
-
this.#deleteBox(key);
|
|
77
97
|
}
|
|
78
98
|
}
|
|
79
|
-
}
|
|
80
|
-
try {
|
|
81
99
|
this.#ignoreUpdates = true;
|
|
82
100
|
this.#boxGraph.endTransaction();
|
|
83
101
|
this.#ignoreUpdates = false;
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
-
|
|
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;
|
|
90
111
|
}
|
|
91
112
|
const highLevelConflict = this.#conflict.mapOr(check => check(), false);
|
|
92
113
|
if (highLevelConflict) {
|
|
@@ -110,14 +131,22 @@ export class YSync {
|
|
|
110
131
|
YMapper.applyFromBoxMap(optBox.unwrap(), fields);
|
|
111
132
|
}
|
|
112
133
|
}
|
|
113
|
-
#
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
|
|
117
|
-
console.debug(`Vertex at '${path}' does not exist. Ignoring.`);
|
|
118
|
-
return;
|
|
134
|
+
#normalizePath(path) {
|
|
135
|
+
const prefix = this.#pathPrefix;
|
|
136
|
+
if (prefix.length === 0 || path.length < prefix.length) {
|
|
137
|
+
return path;
|
|
119
138
|
}
|
|
120
|
-
|
|
139
|
+
for (let i = 0; i < prefix.length; i++) {
|
|
140
|
+
if (path[i] !== prefix[i]) {
|
|
141
|
+
return path;
|
|
142
|
+
}
|
|
143
|
+
}
|
|
144
|
+
return path.slice(prefix.length);
|
|
145
|
+
}
|
|
146
|
+
#updateValue(path, key) {
|
|
147
|
+
const address = YMapper.pathToAddress(path, key);
|
|
148
|
+
const vertex = this.#boxGraph.findVertex(address)
|
|
149
|
+
.unwrap(`Vertex at '${address.toString()}' does not exist.`);
|
|
121
150
|
const [uuidAsString, fieldsKey, ...fieldKeys] = path;
|
|
122
151
|
const targetMap = YMapper.findMap(this.#boxes
|
|
123
152
|
.get(String(uuidAsString))
|
|
@@ -132,17 +161,11 @@ export class YSync {
|
|
|
132
161
|
});
|
|
133
162
|
}
|
|
134
163
|
#deleteBox(key) {
|
|
135
|
-
const
|
|
136
|
-
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
const box = optBox.unwrap();
|
|
141
|
-
// It is possible that Yjs have swallowed the pointer releases since they were 'inside' the box.
|
|
142
|
-
box.outgoingEdges().forEach(([pointer]) => pointer.defer());
|
|
143
|
-
box.incomingEdges().forEach(pointer => pointer.defer());
|
|
144
|
-
this.#boxGraph.unstageBox(box);
|
|
145
|
-
}
|
|
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);
|
|
146
169
|
}
|
|
147
170
|
#rollbackTransaction(events) {
|
|
148
171
|
console.debug(`rollback ${events.length} events...`);
|
|
@@ -176,8 +199,8 @@ export class YSync {
|
|
|
176
199
|
#setupOpenDAW() {
|
|
177
200
|
return Terminable.many(this.#boxGraph.subscribeTransaction({
|
|
178
201
|
onBeginTransaction: EmptyExec,
|
|
179
|
-
onEndTransaction: () => {
|
|
180
|
-
if (this.#ignoreUpdates) {
|
|
202
|
+
onEndTransaction: (rolledBack) => {
|
|
203
|
+
if (this.#ignoreUpdates || rolledBack) {
|
|
181
204
|
this.#updates.length = 0;
|
|
182
205
|
return;
|
|
183
206
|
}
|