@opendaw/studio-core 0.0.6
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/README.md +1 -0
- package/dist/Engine.d.ts +21 -0
- package/dist/Engine.d.ts.map +1 -0
- package/dist/Engine.js +1 -0
- package/dist/EngineFacade.d.ts +28 -0
- package/dist/EngineFacade.d.ts.map +1 -0
- package/dist/EngineFacade.js +50 -0
- package/dist/EngineWorklet.d.ts +30 -0
- package/dist/EngineWorklet.d.ts.map +1 -0
- package/dist/EngineWorklet.js +168 -0
- package/dist/MeterWorklet.d.ts +15 -0
- package/dist/MeterWorklet.d.ts.map +1 -0
- package/dist/MeterWorklet.js +33 -0
- package/dist/Mixer.d.ts +13 -0
- package/dist/Mixer.d.ts.map +1 -0
- package/dist/Mixer.js +110 -0
- package/dist/Project.d.ts +41 -0
- package/dist/Project.d.ts.map +1 -0
- package/dist/Project.js +173 -0
- package/dist/ProjectEnv.d.ts +5 -0
- package/dist/ProjectEnv.d.ts.map +1 -0
- package/dist/ProjectEnv.js +1 -0
- package/dist/RecordingWorklet.d.ts +9 -0
- package/dist/RecordingWorklet.d.ts.map +1 -0
- package/dist/RecordingWorklet.js +42 -0
- package/dist/Wav.d.ts +6 -0
- package/dist/Wav.d.ts.map +1 -0
- package/dist/Wav.js +46 -0
- package/dist/WorkletFactory.d.ts +8 -0
- package/dist/WorkletFactory.d.ts.map +1 -0
- package/dist/WorkletFactory.js +9 -0
- package/dist/Worklets.d.ts +22 -0
- package/dist/Worklets.d.ts.map +1 -0
- package/dist/Worklets.js +36 -0
- package/dist/engine-processor.js +6 -0
- package/dist/engine-processor.js.map +7 -0
- package/dist/index.d.ts +13 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +12 -0
- package/dist/meter-processor.js +2 -0
- package/dist/meter-processor.js.map +7 -0
- package/dist/recording-processor.js +4 -0
- package/dist/recording-processor.js.map +7 -0
- package/dist/sync-log/Commit.d.ts +26 -0
- package/dist/sync-log/Commit.d.ts.map +1 -0
- package/dist/sync-log/Commit.js +76 -0
- package/dist/sync-log/SyncLogReader.d.ts +12 -0
- package/dist/sync-log/SyncLogReader.d.ts.map +1 -0
- package/dist/sync-log/SyncLogReader.js +51 -0
- package/dist/sync-log/SyncLogWriter.d.ts +10 -0
- package/dist/sync-log/SyncLogWriter.d.ts.map +1 -0
- package/dist/sync-log/SyncLogWriter.js +49 -0
- package/package.json +48 -0
@@ -0,0 +1,26 @@
|
|
1
|
+
import { ByteArrayInput } from "@opendaw/lib-std";
|
2
|
+
import { Update } from "@opendaw/lib-box";
|
3
|
+
import { Project } from "../Project";
|
4
|
+
export declare const enum CommitType {
|
5
|
+
Init = 0,
|
6
|
+
Open = 1,
|
7
|
+
Updates = 2,
|
8
|
+
NewVersion = 3
|
9
|
+
}
|
10
|
+
export declare class Commit {
|
11
|
+
#private;
|
12
|
+
readonly type: CommitType;
|
13
|
+
readonly prevHash: ArrayBuffer;
|
14
|
+
readonly thisHash: ArrayBuffer;
|
15
|
+
readonly payload: ArrayBuffer;
|
16
|
+
readonly date: number;
|
17
|
+
static readonly VERSION = 1;
|
18
|
+
static createFirst(project: Project): Promise<Commit>;
|
19
|
+
static createOpen(prevHash: ArrayBuffer): Promise<Commit>;
|
20
|
+
static createUpdate(prevHash: ArrayBuffer, updates: ReadonlyArray<Update>): Promise<Commit>;
|
21
|
+
static deserialize(input: ByteArrayInput): Commit;
|
22
|
+
private constructor();
|
23
|
+
serialize(): ArrayBuffer;
|
24
|
+
toString(): string;
|
25
|
+
}
|
26
|
+
//# sourceMappingURL=Commit.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"Commit.d.ts","sourceRoot":"","sources":["../../src/sync-log/Commit.ts"],"names":[],"mappings":"AAAA,OAAO,EAAS,cAAc,EAAwB,MAAM,kBAAkB,CAAA;AAC9E,OAAO,EAAC,MAAM,EAAC,MAAM,kBAAkB,CAAA;AACvC,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAElC,0BAAkB,UAAU;IAAG,IAAI,IAAA;IAAE,IAAI,IAAA;IAAE,OAAO,IAAA;IAAE,UAAU,IAAA;CAAE;AAEhE,qBAAa,MAAM;;IAiDK,QAAQ,CAAC,IAAI,EAAE,UAAU;IACzB,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAC9B,QAAQ,CAAC,QAAQ,EAAE,WAAW;IAC9B,QAAQ,CAAC,OAAO,EAAE,WAAW;IAC7B,QAAQ,CAAC,IAAI,EAAE,MAAM;IApDzC,MAAM,CAAC,QAAQ,CAAC,OAAO,KAAI;IAK3B,MAAM,CAAC,WAAW,CAAC,OAAO,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAKrD,MAAM,CAAC,UAAU,CAAC,QAAQ,EAAE,WAAW,GAAG,OAAO,CAAC,MAAM,CAAC;WAI5C,YAAY,CAAC,QAAQ,EAAE,WAAW,EAAE,OAAO,EAAE,aAAa,CAAC,MAAM,CAAC,GAAG,OAAO,CAAC,MAAM,CAAC;IAejG,MAAM,CAAC,WAAW,CAAC,KAAK,EAAE,cAAc,GAAG,MAAM;IAmBjD,OAAO;IAMP,SAAS,IAAI,WAAW;IAYxB,QAAQ,IAAI,MAAM;CAGrB"}
|
@@ -0,0 +1,76 @@
|
|
1
|
+
import { assert, ByteArrayOutput, Hash } from "@opendaw/lib-std";
|
2
|
+
export var CommitType;
|
3
|
+
(function (CommitType) {
|
4
|
+
CommitType[CommitType["Init"] = 0] = "Init";
|
5
|
+
CommitType[CommitType["Open"] = 1] = "Open";
|
6
|
+
CommitType[CommitType["Updates"] = 2] = "Updates";
|
7
|
+
CommitType[CommitType["NewVersion"] = 3] = "NewVersion";
|
8
|
+
})(CommitType || (CommitType = {}));
|
9
|
+
export class Commit {
|
10
|
+
type;
|
11
|
+
prevHash;
|
12
|
+
thisHash;
|
13
|
+
payload;
|
14
|
+
date;
|
15
|
+
static VERSION = 1; // For devs: walk your way to dynamic versioning from here
|
16
|
+
static #NO_PAYLOAD = new Uint8Array(1).buffer;
|
17
|
+
static #EMPTY_HASH = new Uint8Array(32).buffer;
|
18
|
+
static createFirst(project) {
|
19
|
+
const payload = project.toArrayBuffer();
|
20
|
+
return this.#create(CommitType.Init, Commit.#EMPTY_HASH, payload);
|
21
|
+
}
|
22
|
+
static createOpen(prevHash) {
|
23
|
+
return this.#create(CommitType.Open, prevHash, Commit.#NO_PAYLOAD);
|
24
|
+
}
|
25
|
+
static async createUpdate(prevHash, updates) {
|
26
|
+
const output = ByteArrayOutput.create();
|
27
|
+
output.writeInt(updates.length);
|
28
|
+
updates.forEach(update => update.write(output));
|
29
|
+
return this.#create(CommitType.Updates, prevHash, output.toArrayBuffer());
|
30
|
+
}
|
31
|
+
static async #create(type, prevHash, payload) {
|
32
|
+
const date = Date.now();
|
33
|
+
const output = ByteArrayOutput.create();
|
34
|
+
const data = output.toArrayBuffer();
|
35
|
+
const thisHash = await Hash.fromBuffers(data, prevHash, new Float64Array([date]).buffer);
|
36
|
+
return new Commit(type, prevHash, thisHash, payload, date);
|
37
|
+
}
|
38
|
+
static deserialize(input) {
|
39
|
+
const type = input.readInt();
|
40
|
+
assert(type === CommitType.Init
|
41
|
+
|| type === CommitType.Open
|
42
|
+
|| type === CommitType.Updates
|
43
|
+
|| type === CommitType.NewVersion, `Unknown commit type "${type}"`);
|
44
|
+
const version = input.readInt();
|
45
|
+
assert(version === Commit.VERSION, "version mismatch");
|
46
|
+
const prevHash = new Int8Array(32);
|
47
|
+
input.readBytes(prevHash);
|
48
|
+
const thisHash = new Int8Array(32);
|
49
|
+
input.readBytes(thisHash);
|
50
|
+
const data = new Int8Array(input.readInt());
|
51
|
+
input.readBytes(data);
|
52
|
+
const date = input.readDouble();
|
53
|
+
return new Commit(type, prevHash.buffer, thisHash.buffer, data.buffer, date);
|
54
|
+
}
|
55
|
+
constructor(type, prevHash, thisHash, payload, date) {
|
56
|
+
this.type = type;
|
57
|
+
this.prevHash = prevHash;
|
58
|
+
this.thisHash = thisHash;
|
59
|
+
this.payload = payload;
|
60
|
+
this.date = date;
|
61
|
+
}
|
62
|
+
serialize() {
|
63
|
+
const output = ByteArrayOutput.create();
|
64
|
+
output.writeInt(this.type);
|
65
|
+
output.writeInt(Commit.VERSION);
|
66
|
+
output.writeBytes(new Int8Array(this.prevHash));
|
67
|
+
output.writeBytes(new Int8Array(this.thisHash));
|
68
|
+
output.writeInt(this.payload.byteLength);
|
69
|
+
output.writeBytes(new Int8Array(this.payload));
|
70
|
+
output.writeDouble(this.date);
|
71
|
+
return output.toArrayBuffer();
|
72
|
+
}
|
73
|
+
toString() {
|
74
|
+
return `{prevHash: ${Hash.toString(this.prevHash)}, thisHash: ${Hash.toString(this.thisHash)}, payload: ${this.payload.byteLength}bytes}`;
|
75
|
+
}
|
76
|
+
}
|
@@ -0,0 +1,12 @@
|
|
1
|
+
import { int } from "@opendaw/lib-std";
|
2
|
+
import { Project } from "../Project";
|
3
|
+
import { Commit } from "./Commit";
|
4
|
+
import { ProjectEnv } from "../ProjectEnv";
|
5
|
+
export declare class SyncLogReader {
|
6
|
+
static unwrap(env: ProjectEnv, buffer: ArrayBuffer): Promise<{
|
7
|
+
project: Project;
|
8
|
+
lastCommit: Commit;
|
9
|
+
numCommits: int;
|
10
|
+
}>;
|
11
|
+
}
|
12
|
+
//# sourceMappingURL=SyncLogReader.d.ts.map
|
@@ -0,0 +1 @@
|
|
1
|
+
{"version":3,"file":"SyncLogReader.d.ts","sourceRoot":"","sources":["../../src/sync-log/SyncLogReader.ts"],"names":[],"mappings":"AAAA,OAAO,EAA+B,GAAG,EAAW,MAAM,kBAAkB,CAAA;AAG5E,OAAO,EAAC,OAAO,EAAC,MAAM,YAAY,CAAA;AAClC,OAAO,EAAC,MAAM,EAAa,MAAM,UAAU,CAAA;AAC3C,OAAO,EAAC,UAAU,EAAC,MAAM,eAAe,CAAA;AAExC,qBAAa,aAAa;WACT,MAAM,CAAC,GAAG,EAAE,UAAU,EAAE,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC;QAC/D,OAAO,EAAE,OAAO,CAAC;QACjB,UAAU,EAAE,MAAM,CAAC;QACnB,UAAU,EAAE,GAAG,CAAA;KAClB,CAAC;CA2CL"}
|
@@ -0,0 +1,51 @@
|
|
1
|
+
import { assert, ByteArrayInput, Hash, tryCatch } from "@opendaw/lib-std";
|
2
|
+
import { Updates } from "@opendaw/lib-box";
|
3
|
+
import { Wait } from "@opendaw/lib-runtime";
|
4
|
+
import { Project } from "../Project";
|
5
|
+
import { Commit, CommitType } from "./Commit";
|
6
|
+
export class SyncLogReader {
|
7
|
+
static async unwrap(env, buffer) {
|
8
|
+
console.debug("SyncLogReader.unwrapping begin");
|
9
|
+
const input = new ByteArrayInput(buffer);
|
10
|
+
const firstCommit = Commit.deserialize(input);
|
11
|
+
assert(firstCommit.type === CommitType.Init, "First commit must be typed with CommitType.Init");
|
12
|
+
const project = Project.load(env, firstCommit.payload);
|
13
|
+
const { boxGraph } = project;
|
14
|
+
const label = document.createElement("div");
|
15
|
+
label.style.margin = "1em 0";
|
16
|
+
let prevCommit = firstCommit;
|
17
|
+
let lastFrame = Date.now();
|
18
|
+
let numCommits = 0 | 0;
|
19
|
+
while (true) {
|
20
|
+
const { status, error, value: nextCommit } = tryCatch(() => Commit.deserialize(input));
|
21
|
+
numCommits++;
|
22
|
+
label.textContent = `${numCommits} commits unwrapped.`;
|
23
|
+
if (status === "failure") {
|
24
|
+
if (error instanceof RangeError) { // end of log
|
25
|
+
break;
|
26
|
+
}
|
27
|
+
throw error;
|
28
|
+
}
|
29
|
+
assert(Hash.equals(prevCommit.thisHash, nextCommit.prevHash), "SyncLog inconsistency");
|
30
|
+
// We have not implemented any other types, so let's accept only updates
|
31
|
+
if (nextCommit.type === CommitType.Open) {
|
32
|
+
console.debug("Opened at", new Date(nextCommit.date).toISOString());
|
33
|
+
}
|
34
|
+
else if (nextCommit.type === CommitType.Updates) {
|
35
|
+
const updates = Updates.decode(new ByteArrayInput(nextCommit.payload));
|
36
|
+
boxGraph.beginTransaction();
|
37
|
+
updates.forEach(update => update.forward(boxGraph));
|
38
|
+
boxGraph.endTransaction();
|
39
|
+
}
|
40
|
+
prevCommit = nextCommit;
|
41
|
+
const now = Date.now();
|
42
|
+
if (now - lastFrame > 16) {
|
43
|
+
console.debug("Pause unwrapping to allow browser to render a frame.");
|
44
|
+
await Wait.frame();
|
45
|
+
lastFrame = now;
|
46
|
+
}
|
47
|
+
}
|
48
|
+
console.debug("SyncLogReader.unwrapping complete");
|
49
|
+
return Promise.resolve({ project, lastCommit: prevCommit, numCommits });
|
50
|
+
}
|
51
|
+
}
|
@@ -0,0 +1,10 @@
|
|
1
|
+
import { Observer, Terminable } from "@opendaw/lib-std";
|
2
|
+
import { Project } from "../Project";
|
3
|
+
import { Commit } from "./Commit";
|
4
|
+
export declare class SyncLogWriter implements Terminable {
|
5
|
+
#private;
|
6
|
+
static attach(project: Project, observer: Observer<Commit>, lastCommit?: Commit): SyncLogWriter;
|
7
|
+
private constructor();
|
8
|
+
terminate(): void;
|
9
|
+
}
|
10
|
+
//# sourceMappingURL=SyncLogWriter.d.ts.map
|
@@ -0,0 +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,YAAY,CAAA;AAClC,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"}
|
@@ -0,0 +1,49 @@
|
|
1
|
+
import { isDefined, Terminable } from "@opendaw/lib-std";
|
2
|
+
import { Commit } from "./Commit";
|
3
|
+
export class SyncLogWriter {
|
4
|
+
static attach(project, observer, lastCommit) {
|
5
|
+
console.debug("SyncLogWriter.attach", project.rootBox.created.getValue(), isDefined(lastCommit) ? "append" : "new");
|
6
|
+
return project.own(new SyncLogWriter(project, observer, lastCommit));
|
7
|
+
}
|
8
|
+
#observer;
|
9
|
+
#subscription;
|
10
|
+
#transactionSubscription = Terminable.Empty;
|
11
|
+
#lastPromise;
|
12
|
+
constructor(project, observer, lastCommit) {
|
13
|
+
this.#observer = observer;
|
14
|
+
this.#lastPromise = Promise.resolve(lastCommit ?? Commit.createFirst(project).then(commit => {
|
15
|
+
this.#observer(commit);
|
16
|
+
return commit;
|
17
|
+
}));
|
18
|
+
this.#appendCommit(previous => Commit.createOpen(previous.thisHash));
|
19
|
+
this.#subscription = this.#listen(project.boxGraph);
|
20
|
+
}
|
21
|
+
terminate() {
|
22
|
+
console.debug("SyncLogWriter.terminate");
|
23
|
+
this.#subscription.terminate();
|
24
|
+
}
|
25
|
+
#appendCommit(factory) {
|
26
|
+
return this.#lastPromise = this.#lastPromise.then(async (previous) => {
|
27
|
+
const commit = await factory(previous);
|
28
|
+
this.#observer(commit);
|
29
|
+
return commit;
|
30
|
+
});
|
31
|
+
}
|
32
|
+
#listen(boxGraph) {
|
33
|
+
let updates = [];
|
34
|
+
return boxGraph.subscribeTransaction({
|
35
|
+
onBeginTransaction: () => this.#transactionSubscription =
|
36
|
+
boxGraph.subscribeToAllUpdatesImmediate({ onUpdate: (update) => updates.push(update) }),
|
37
|
+
onEndTransaction: () => {
|
38
|
+
this.#transactionSubscription.terminate();
|
39
|
+
this.#transactionSubscription = Terminable.Empty;
|
40
|
+
if (updates.length === 0) {
|
41
|
+
return;
|
42
|
+
}
|
43
|
+
const ref = updates;
|
44
|
+
updates = [];
|
45
|
+
this.#appendCommit(previous => Commit.createUpdate(previous.thisHash, ref));
|
46
|
+
}
|
47
|
+
});
|
48
|
+
}
|
49
|
+
}
|
package/package.json
ADDED
@@ -0,0 +1,48 @@
|
|
1
|
+
{
|
2
|
+
"name": "@opendaw/studio-core",
|
3
|
+
"version": "0.0.6",
|
4
|
+
"license": "LGPL-3.0-or-later",
|
5
|
+
"publishConfig": {
|
6
|
+
"access": "public"
|
7
|
+
},
|
8
|
+
"main": "./dist/index.js",
|
9
|
+
"types": "./dist/index.d.ts",
|
10
|
+
"exports": {
|
11
|
+
".": {
|
12
|
+
"types": "./dist/index.d.ts",
|
13
|
+
"default": "./dist/index.js"
|
14
|
+
},
|
15
|
+
"./engine-processor.js": "./dist/engine-processor.js",
|
16
|
+
"./meter-processor.js": "./dist/meter-processor.js",
|
17
|
+
"./recording-processor.js": "./dist/recording-processor.js"
|
18
|
+
},
|
19
|
+
"files": [
|
20
|
+
"dist/**/*",
|
21
|
+
"dist/engine-processor.js",
|
22
|
+
"dist/meter-processor.js",
|
23
|
+
"dist/recording-processor.js"
|
24
|
+
],
|
25
|
+
"scripts": {
|
26
|
+
"build": "tsc",
|
27
|
+
"lint": "eslint \"**/*.ts\"",
|
28
|
+
"test": "echo \"No tests to run\""
|
29
|
+
},
|
30
|
+
"dependencies": {
|
31
|
+
"@opendaw/lib-box": "^0.0.6",
|
32
|
+
"@opendaw/lib-dom": "^0.0.6",
|
33
|
+
"@opendaw/lib-dsp": "^0.0.6",
|
34
|
+
"@opendaw/lib-fusion": "^0.0.6",
|
35
|
+
"@opendaw/lib-runtime": "^0.0.6",
|
36
|
+
"@opendaw/lib-std": "^0.0.6",
|
37
|
+
"@opendaw/studio-adapters": "^0.0.6",
|
38
|
+
"@opendaw/studio-boxes": "^0.0.6",
|
39
|
+
"@opendaw/studio-enums": "^0.0.6"
|
40
|
+
},
|
41
|
+
"devDependencies": {
|
42
|
+
"@opendaw/eslint-config": "^0.0.6",
|
43
|
+
"@opendaw/studio-core-processors": "^0.0.6",
|
44
|
+
"@opendaw/studio-forge-boxes": "^0.0.6",
|
45
|
+
"@opendaw/typescript-config": "^0.0.6"
|
46
|
+
},
|
47
|
+
"gitHead": "04e5363a9851c7e116a306c2e933c5f410980fbe"
|
48
|
+
}
|