@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.
Files changed (53) hide show
  1. package/README.md +1 -0
  2. package/dist/Engine.d.ts +21 -0
  3. package/dist/Engine.d.ts.map +1 -0
  4. package/dist/Engine.js +1 -0
  5. package/dist/EngineFacade.d.ts +28 -0
  6. package/dist/EngineFacade.d.ts.map +1 -0
  7. package/dist/EngineFacade.js +50 -0
  8. package/dist/EngineWorklet.d.ts +30 -0
  9. package/dist/EngineWorklet.d.ts.map +1 -0
  10. package/dist/EngineWorklet.js +168 -0
  11. package/dist/MeterWorklet.d.ts +15 -0
  12. package/dist/MeterWorklet.d.ts.map +1 -0
  13. package/dist/MeterWorklet.js +33 -0
  14. package/dist/Mixer.d.ts +13 -0
  15. package/dist/Mixer.d.ts.map +1 -0
  16. package/dist/Mixer.js +110 -0
  17. package/dist/Project.d.ts +41 -0
  18. package/dist/Project.d.ts.map +1 -0
  19. package/dist/Project.js +173 -0
  20. package/dist/ProjectEnv.d.ts +5 -0
  21. package/dist/ProjectEnv.d.ts.map +1 -0
  22. package/dist/ProjectEnv.js +1 -0
  23. package/dist/RecordingWorklet.d.ts +9 -0
  24. package/dist/RecordingWorklet.d.ts.map +1 -0
  25. package/dist/RecordingWorklet.js +42 -0
  26. package/dist/Wav.d.ts +6 -0
  27. package/dist/Wav.d.ts.map +1 -0
  28. package/dist/Wav.js +46 -0
  29. package/dist/WorkletFactory.d.ts +8 -0
  30. package/dist/WorkletFactory.d.ts.map +1 -0
  31. package/dist/WorkletFactory.js +9 -0
  32. package/dist/Worklets.d.ts +22 -0
  33. package/dist/Worklets.d.ts.map +1 -0
  34. package/dist/Worklets.js +36 -0
  35. package/dist/engine-processor.js +6 -0
  36. package/dist/engine-processor.js.map +7 -0
  37. package/dist/index.d.ts +13 -0
  38. package/dist/index.d.ts.map +1 -0
  39. package/dist/index.js +12 -0
  40. package/dist/meter-processor.js +2 -0
  41. package/dist/meter-processor.js.map +7 -0
  42. package/dist/recording-processor.js +4 -0
  43. package/dist/recording-processor.js.map +7 -0
  44. package/dist/sync-log/Commit.d.ts +26 -0
  45. package/dist/sync-log/Commit.d.ts.map +1 -0
  46. package/dist/sync-log/Commit.js +76 -0
  47. package/dist/sync-log/SyncLogReader.d.ts +12 -0
  48. package/dist/sync-log/SyncLogReader.d.ts.map +1 -0
  49. package/dist/sync-log/SyncLogReader.js +51 -0
  50. package/dist/sync-log/SyncLogWriter.d.ts +10 -0
  51. package/dist/sync-log/SyncLogWriter.d.ts.map +1 -0
  52. package/dist/sync-log/SyncLogWriter.js +49 -0
  53. 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
+ }