@flighthq/midi 0.4.1-edge.552.b5e3f33
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/LICENSE.md +9 -0
- package/README.md +17 -0
- package/dist/contract.d.ts +5 -0
- package/dist/contract.d.ts.map +1 -0
- package/dist/contract.js +5 -0
- package/dist/contract.js.map +1 -0
- package/dist/index.d.ts +2 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +2 -0
- package/dist/index.js.map +1 -0
- package/dist/midiAccess.d.ts +7 -0
- package/dist/midiAccess.d.ts.map +1 -0
- package/dist/midiAccess.js +91 -0
- package/dist/midiAccess.js.map +1 -0
- package/dist/midiPermission.d.ts +3 -0
- package/dist/midiPermission.d.ts.map +1 -0
- package/dist/midiPermission.js +9 -0
- package/dist/midiPermission.js.map +1 -0
- package/dist/midiPort.d.ts +17 -0
- package/dist/midiPort.d.ts.map +1 -0
- package/dist/midiPort.js +224 -0
- package/dist/midiPort.js.map +1 -0
- package/dist/midiResource.d.ts +33 -0
- package/dist/midiResource.d.ts.map +1 -0
- package/dist/midiResource.js +36 -0
- package/dist/midiResource.js.map +1 -0
- package/dist/midiSubscription.d.ts +14 -0
- package/dist/midiSubscription.d.ts.map +1 -0
- package/dist/midiSubscription.js +188 -0
- package/dist/midiSubscription.js.map +1 -0
- package/package.json +50 -0
- package/src/midiAccess.test.ts +130 -0
- package/src/midiPermission.test.ts +27 -0
- package/src/midiPort.test.ts +259 -0
- package/src/midiResource.test.ts +106 -0
- package/src/midiSubscription.test.ts +283 -0
package/LICENSE.md
ADDED
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
# MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2013-2026 Joshua Granick and other contributors
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
6
|
+
|
|
7
|
+
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
8
|
+
|
|
9
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
# @flighthq/midi
|
|
2
|
+
|
|
3
|
+
Explicit MIDI access, port resources, and lifecycle subscriptions
|
|
4
|
+
|
|
5
|
+
## Install
|
|
6
|
+
|
|
7
|
+
```sh
|
|
8
|
+
npm install @flighthq/midi
|
|
9
|
+
```
|
|
10
|
+
|
|
11
|
+
Import the supported application-facing API from `@flighthq/midi`. The `@flighthq/midi/contract` export is the wider package-to-package contract used to compose Flight itself.
|
|
12
|
+
|
|
13
|
+
This package is part of the locked-version Flight SDK graph. Applications may instead install and import `@flighthq/sdk` when package-level tree shaking is sufficient.
|
|
14
|
+
|
|
15
|
+
- [Flight project](https://github.com/flighthq/flight)
|
|
16
|
+
- [Source for @flighthq/midi@0.4.1-edge.552.b5e3f33](https://github.com/flighthq/flight/tree/b5e3f3322818929617b8f7a9762c6e72ffb484f8/packages/midi)
|
|
17
|
+
- [License](https://github.com/flighthq/flight/blob/b5e3f3322818929617b8f7a9762c6e72ffb484f8/LICENSE.md)
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.d.ts","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|
package/dist/contract.js
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"contract.js","sourceRoot":"","sources":["../src/contract.ts"],"names":[],"mappings":"AAAA,cAAc,cAAc,CAAC;AAC7B,cAAc,kBAAkB,CAAC;AACjC,cAAc,YAAY,CAAC;AAC3B,cAAc,oBAAoB,CAAC"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { attachMidiAccessStateSubscription, attachMidiInputMessageSubscription, attachMidiPortStateSubscription, closeMidiPort, createMidiAccessStateSubscription, createMidiInputMessageSubscription, createMidiPortStateSubscription, detachMidiAccessStateSubscription, detachMidiInputMessageSubscription, detachMidiPortStateSubscription, disposeMidiAccess, disposeMidiAccessStateSubscription, disposeMidiInputMessageSubscription, disposeMidiPort, disposeMidiPortStateSubscription, getMidiAccessInputPorts, getMidiAccessOutputPorts, getMidiPermission, getMidiPortConnection, getMidiPortState, openMidiPort, requestMidiAccess, sendMidiMessage, } from './contract';
|
|
2
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,EAC/B,aAAa,EACb,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,EAC/B,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,EAC/B,iBAAiB,EACjB,kCAAkC,EAClC,mCAAmC,EACnC,eAAe,EACf,gCAAgC,EAChC,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
export { attachMidiAccessStateSubscription, attachMidiInputMessageSubscription, attachMidiPortStateSubscription, closeMidiPort, createMidiAccessStateSubscription, createMidiInputMessageSubscription, createMidiPortStateSubscription, detachMidiAccessStateSubscription, detachMidiInputMessageSubscription, detachMidiPortStateSubscription, disposeMidiAccess, disposeMidiAccessStateSubscription, disposeMidiInputMessageSubscription, disposeMidiPort, disposeMidiPortStateSubscription, getMidiAccessInputPorts, getMidiAccessOutputPorts, getMidiPermission, getMidiPortConnection, getMidiPortState, openMidiPort, requestMidiAccess, sendMidiMessage, } from './contract';
|
|
2
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,EAC/B,aAAa,EACb,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,EAC/B,iCAAiC,EACjC,kCAAkC,EAClC,+BAA+B,EAC/B,iBAAiB,EACjB,kCAAkC,EAClC,mCAAmC,EACnC,eAAe,EACf,gCAAgC,EAChC,uBAAuB,EACvB,wBAAwB,EACxB,iBAAiB,EACjB,qBAAqB,EACrB,gBAAgB,EAChB,YAAY,EACZ,iBAAiB,EACjB,eAAe,GAChB,MAAM,YAAY,CAAC"}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
import type { HasMidiAccess, MidiAccess, MidiAccessDisposeOutcome, MidiAccessPortsOutcome, MidiAccessRequestOutcome, MidiAccessResourceOperations, MidiInputPort, MidiOutputPort } from '@flighthq/types/contract';
|
|
2
|
+
export declare function createMidiAccessResource(operations: MidiAccessResourceOperations): MidiAccess;
|
|
3
|
+
export declare function disposeMidiAccess(access: MidiAccess): Promise<MidiAccessDisposeOutcome>;
|
|
4
|
+
export declare function getMidiAccessInputPorts(access: MidiAccess): MidiAccessPortsOutcome<MidiInputPort>;
|
|
5
|
+
export declare function getMidiAccessOutputPorts(access: MidiAccess): MidiAccessPortsOutcome<MidiOutputPort>;
|
|
6
|
+
export declare function requestMidiAccess(host: HasMidiAccess): Promise<MidiAccessRequestOutcome>;
|
|
7
|
+
//# sourceMappingURL=midiAccess.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiAccess.d.ts","sourceRoot":"","sources":["../src/midiAccess.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,UAAU,EACV,wBAAwB,EACxB,sBAAsB,EACtB,wBAAwB,EACxB,4BAA4B,EAC5B,aAAa,EACb,cAAc,EAEf,MAAM,0BAA0B,CAAC;AAQlC,wBAAgB,wBAAwB,CAAC,UAAU,EAAE,4BAA4B,GAAG,UAAU,CAI7F;AAED,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,UAAU,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAWvF;AAED,wBAAgB,uBAAuB,CAAC,MAAM,EAAE,UAAU,GAAG,sBAAsB,CAAC,aAAa,CAAC,CAEjG;AAED,wBAAgB,wBAAwB,CAAC,MAAM,EAAE,UAAU,GAAG,sBAAsB,CAAC,cAAc,CAAC,CAEnG;AAED,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,aAAa,GAAG,OAAO,CAAC,wBAAwB,CAAC,CAM9F"}
|
|
@@ -0,0 +1,91 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import { disposeMidiPort } from './midiPort';
|
|
3
|
+
import { getMidiAccessResourceState, retainMidiAccessResourceState } from './midiResource';
|
|
4
|
+
import { disposeMidiAccessStateSubscription } from './midiSubscription';
|
|
5
|
+
// Provider-contract constructor. Native MIDIAccess identity stays in provider-local state; this empty
|
|
6
|
+
// public Entity is the only handle consumers retain.
|
|
7
|
+
export function createMidiAccessResource(operations) {
|
|
8
|
+
const access = createEntity({});
|
|
9
|
+
retainMidiAccessResourceState(access, operations);
|
|
10
|
+
return access;
|
|
11
|
+
}
|
|
12
|
+
export function disposeMidiAccess(access) {
|
|
13
|
+
const state = getMidiAccessResourceState(access);
|
|
14
|
+
if (state === undefined || state.disposeCompleted)
|
|
15
|
+
return Promise.resolve({ reason: 'already-disposed' });
|
|
16
|
+
if (state.disposePending !== null)
|
|
17
|
+
return state.disposePending;
|
|
18
|
+
state.disposed = true;
|
|
19
|
+
const pending = disposeMidiAccessKnownPorts(access);
|
|
20
|
+
state.disposePending = pending;
|
|
21
|
+
void pending.finally(() => {
|
|
22
|
+
if (state.disposePending === pending)
|
|
23
|
+
state.disposePending = null;
|
|
24
|
+
});
|
|
25
|
+
return pending;
|
|
26
|
+
}
|
|
27
|
+
export function getMidiAccessInputPorts(access) {
|
|
28
|
+
return getMidiAccessPorts(access, 'input');
|
|
29
|
+
}
|
|
30
|
+
export function getMidiAccessOutputPorts(access) {
|
|
31
|
+
return getMidiAccessPorts(access, 'output');
|
|
32
|
+
}
|
|
33
|
+
export async function requestMidiAccess(host) {
|
|
34
|
+
try {
|
|
35
|
+
return await host.midi.access.requestAccess();
|
|
36
|
+
}
|
|
37
|
+
catch {
|
|
38
|
+
return { reason: 'operation-failed' };
|
|
39
|
+
}
|
|
40
|
+
}
|
|
41
|
+
async function disposeMidiAccessKnownPorts(access) {
|
|
42
|
+
const state = getMidiAccessResourceState(access);
|
|
43
|
+
if (state === undefined)
|
|
44
|
+
return { reason: 'already-disposed' };
|
|
45
|
+
const failures = [];
|
|
46
|
+
for (const subscription of [...state.subscriptions]) {
|
|
47
|
+
const outcome = await disposeMidiAccessStateSubscription(subscription);
|
|
48
|
+
if (outcome.reason === 'operation-failed' && outcome.releaseFailed) {
|
|
49
|
+
failures.push({ operation: 'state-subscription-release' });
|
|
50
|
+
}
|
|
51
|
+
else
|
|
52
|
+
state.subscriptions.delete(subscription);
|
|
53
|
+
}
|
|
54
|
+
for (const port of [...state.knownPorts]) {
|
|
55
|
+
const outcome = await disposeMidiPort(port);
|
|
56
|
+
if (outcome.reason === 'operation-failed') {
|
|
57
|
+
for (const failure of outcome.failures)
|
|
58
|
+
failures.push({ id: port.id, operation: failure.operation, type: port.type });
|
|
59
|
+
}
|
|
60
|
+
else {
|
|
61
|
+
state.knownPorts.delete(port);
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
if (failures.length > 0)
|
|
65
|
+
return { failures, reason: 'operation-failed' };
|
|
66
|
+
state.disposeCompleted = true;
|
|
67
|
+
return { reason: 'ok' };
|
|
68
|
+
}
|
|
69
|
+
function getMidiAccessPorts(access, kind) {
|
|
70
|
+
const state = getMidiAccessResourceState(access);
|
|
71
|
+
if (state === undefined)
|
|
72
|
+
return { reason: 'operation-failed' };
|
|
73
|
+
if (state.disposed)
|
|
74
|
+
return { reason: 'disposed' };
|
|
75
|
+
try {
|
|
76
|
+
if (kind === 'input') {
|
|
77
|
+
const ports = [...state.operations.getInputPorts()];
|
|
78
|
+
for (const port of ports)
|
|
79
|
+
state.knownPorts.add(port);
|
|
80
|
+
return { ports, reason: 'ok' };
|
|
81
|
+
}
|
|
82
|
+
const ports = [...state.operations.getOutputPorts()];
|
|
83
|
+
for (const port of ports)
|
|
84
|
+
state.knownPorts.add(port);
|
|
85
|
+
return { ports, reason: 'ok' };
|
|
86
|
+
}
|
|
87
|
+
catch {
|
|
88
|
+
return { reason: 'operation-failed' };
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
//# sourceMappingURL=midiAccess.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiAccess.js","sourceRoot":"","sources":["../src/midiAccess.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiPermission.d.ts","sourceRoot":"","sources":["../src/midiPermission.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,iBAAiB,EAAE,sBAAsB,EAAE,MAAM,0BAA0B,CAAC;AAE1F,wBAAsB,iBAAiB,CAAC,IAAI,EAAE,iBAAiB,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAMhG"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiPermission.js","sourceRoot":"","sources":["../src/midiPermission.ts"],"names":[],"mappings":"AAEA,MAAM,CAAC,KAAK,UAAU,iBAAiB,CAAC,IAAuB;IAC7D,IAAI,CAAC;QACH,OAAO,MAAM,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,aAAa,EAAE,CAAC;IACpD,CAAC;IAAC,MAAM,CAAC;QACP,OAAO,EAAE,MAAM,EAAE,kBAAkB,EAAE,CAAC;IACxC,CAAC;AACH,CAAC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import type { MidiInputPort, MidiInputPortResourceOperations, MidiMessageSendOutcome, MidiOutputPort, MidiOutputPortResourceOperations, MidiPort, MidiPortCloseOutcome, MidiPortConnectionOutcome, MidiPortDisposeOutcome, MidiPortOpenOutcome, MidiPortStateOutcome } from '@flighthq/types/contract';
|
|
2
|
+
interface MidiPortMetadata {
|
|
3
|
+
readonly id: string;
|
|
4
|
+
readonly manufacturer: string | null;
|
|
5
|
+
readonly name: string | null;
|
|
6
|
+
readonly version: string | null;
|
|
7
|
+
}
|
|
8
|
+
export declare function closeMidiPort(port: MidiPort): Promise<MidiPortCloseOutcome>;
|
|
9
|
+
export declare function createMidiInputPortResource(metadata: Readonly<MidiPortMetadata>, operations: MidiInputPortResourceOperations): MidiInputPort;
|
|
10
|
+
export declare function createMidiOutputPortResource(metadata: Readonly<MidiPortMetadata>, operations: MidiOutputPortResourceOperations): MidiOutputPort;
|
|
11
|
+
export declare function disposeMidiPort(port: MidiPort): Promise<MidiPortDisposeOutcome>;
|
|
12
|
+
export declare function getMidiPortConnection(port: MidiPort): MidiPortConnectionOutcome;
|
|
13
|
+
export declare function getMidiPortState(port: MidiPort): MidiPortStateOutcome;
|
|
14
|
+
export declare function openMidiPort(port: MidiPort): Promise<MidiPortOpenOutcome>;
|
|
15
|
+
export declare function sendMidiMessage(port: MidiOutputPort, data: Readonly<Uint8Array>, timestamp?: number): MidiMessageSendOutcome;
|
|
16
|
+
export {};
|
|
17
|
+
//# sourceMappingURL=midiPort.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiPort.d.ts","sourceRoot":"","sources":["../src/midiPort.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,EACV,aAAa,EACb,+BAA+B,EAC/B,sBAAsB,EACtB,cAAc,EACd,gCAAgC,EAChC,QAAQ,EACR,oBAAoB,EACpB,yBAAyB,EACzB,sBAAsB,EACtB,mBAAmB,EACnB,oBAAoB,EACrB,MAAM,0BAA0B,CAAC;AASlC,UAAU,gBAAgB;IACxB,QAAQ,CAAC,EAAE,EAAE,MAAM,CAAC;IACpB,QAAQ,CAAC,YAAY,EAAE,MAAM,GAAG,IAAI,CAAC;IACrC,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,IAAI,CAAC;IAC7B,QAAQ,CAAC,OAAO,EAAE,MAAM,GAAG,IAAI,CAAC;CACjC;AAED,wBAAsB,aAAa,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,oBAAoB,CAAC,CAcjF;AAID,wBAAgB,2BAA2B,CACzC,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACpC,UAAU,EAAE,+BAA+B,GAC1C,aAAa,CAIf;AAED,wBAAgB,4BAA4B,CAC1C,QAAQ,EAAE,QAAQ,CAAC,gBAAgB,CAAC,EACpC,UAAU,EAAE,gCAAgC,GAC3C,cAAc,CAIhB;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,sBAAsB,CAAC,CAW/E;AAED,wBAAgB,qBAAqB,CAAC,IAAI,EAAE,QAAQ,GAAG,yBAAyB,CAK/E;AAED,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,QAAQ,GAAG,oBAAoB,CASrE;AAED,wBAAsB,YAAY,CAAC,IAAI,EAAE,QAAQ,GAAG,OAAO,CAAC,mBAAmB,CAAC,CAkB/E;AAED,wBAAgB,eAAe,CAC7B,IAAI,EAAE,cAAc,EACpB,IAAI,EAAE,QAAQ,CAAC,UAAU,CAAC,EAC1B,SAAS,CAAC,EAAE,MAAM,GACjB,sBAAsB,CAkBxB"}
|
package/dist/midiPort.js
ADDED
|
@@ -0,0 +1,224 @@
|
|
|
1
|
+
import { createEntity } from '@flighthq/entity/contract';
|
|
2
|
+
import { getMidiPortResourceState, retainMidiInputPortResourceState, retainMidiOutputPortResourceState, } from './midiResource';
|
|
3
|
+
import { disposeMidiInputMessageSubscription, disposeMidiPortStateSubscription } from './midiSubscription';
|
|
4
|
+
export async function closeMidiPort(port) {
|
|
5
|
+
const state = getMidiPortResourceState(port);
|
|
6
|
+
if (state === undefined)
|
|
7
|
+
return { reason: 'operation-failed' };
|
|
8
|
+
if (state.disposed)
|
|
9
|
+
return { reason: 'disposed' };
|
|
10
|
+
const connection = readMidiPortConnection(port);
|
|
11
|
+
if (connection.reason !== 'ok')
|
|
12
|
+
return { reason: 'operation-failed' };
|
|
13
|
+
if (connection.connection === 'closed')
|
|
14
|
+
return { reason: 'already-closed' };
|
|
15
|
+
try {
|
|
16
|
+
await state.operations.close();
|
|
17
|
+
state.flightOpened = false;
|
|
18
|
+
return { reason: 'closed' };
|
|
19
|
+
}
|
|
20
|
+
catch {
|
|
21
|
+
return { reason: 'operation-failed' };
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
// Provider-contract constructors retain operations privately. Matching native IDs never collapse two
|
|
25
|
+
// port Entities, even across input/output directions or access-profile origins.
|
|
26
|
+
export function createMidiInputPortResource(metadata, operations) {
|
|
27
|
+
const port = createEntity({ ...metadata, type: 'input' });
|
|
28
|
+
retainMidiInputPortResourceState(port, operations);
|
|
29
|
+
return port;
|
|
30
|
+
}
|
|
31
|
+
export function createMidiOutputPortResource(metadata, operations) {
|
|
32
|
+
const port = createEntity({ ...metadata, type: 'output' });
|
|
33
|
+
retainMidiOutputPortResourceState(port, operations);
|
|
34
|
+
return port;
|
|
35
|
+
}
|
|
36
|
+
export function disposeMidiPort(port) {
|
|
37
|
+
const state = getMidiPortResourceState(port);
|
|
38
|
+
if (state === undefined || state.disposeCompleted)
|
|
39
|
+
return Promise.resolve({ reason: 'already-disposed' });
|
|
40
|
+
if (state.disposePending !== null)
|
|
41
|
+
return state.disposePending;
|
|
42
|
+
state.disposed = true;
|
|
43
|
+
const pending = disposeOwnedMidiPort(port);
|
|
44
|
+
state.disposePending = pending;
|
|
45
|
+
void pending.finally(() => {
|
|
46
|
+
if (state.disposePending === pending)
|
|
47
|
+
state.disposePending = null;
|
|
48
|
+
});
|
|
49
|
+
return pending;
|
|
50
|
+
}
|
|
51
|
+
export function getMidiPortConnection(port) {
|
|
52
|
+
const state = getMidiPortResourceState(port);
|
|
53
|
+
if (state === undefined)
|
|
54
|
+
return { reason: 'operation-failed' };
|
|
55
|
+
if (state.disposed)
|
|
56
|
+
return { reason: 'disposed' };
|
|
57
|
+
return readMidiPortConnection(port);
|
|
58
|
+
}
|
|
59
|
+
export function getMidiPortState(port) {
|
|
60
|
+
const state = getMidiPortResourceState(port);
|
|
61
|
+
if (state === undefined)
|
|
62
|
+
return { reason: 'operation-failed' };
|
|
63
|
+
if (state.disposed)
|
|
64
|
+
return { reason: 'disposed' };
|
|
65
|
+
try {
|
|
66
|
+
return { reason: 'ok', state: state.operations.getState() };
|
|
67
|
+
}
|
|
68
|
+
catch {
|
|
69
|
+
return { reason: 'operation-failed' };
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
export async function openMidiPort(port) {
|
|
73
|
+
const state = getMidiPortResourceState(port);
|
|
74
|
+
if (state === undefined)
|
|
75
|
+
return { reason: 'operation-failed' };
|
|
76
|
+
if (state.disposed)
|
|
77
|
+
return { reason: 'disposed' };
|
|
78
|
+
const portState = getMidiPortState(port);
|
|
79
|
+
if (portState.reason !== 'ok')
|
|
80
|
+
return { reason: 'operation-failed' };
|
|
81
|
+
if (portState.state === 'disconnected')
|
|
82
|
+
return { reason: 'disconnected' };
|
|
83
|
+
const connection = readMidiPortConnection(port);
|
|
84
|
+
if (connection.reason !== 'ok')
|
|
85
|
+
return { reason: 'operation-failed' };
|
|
86
|
+
if (connection.connection === 'open')
|
|
87
|
+
return { reason: 'already-open' };
|
|
88
|
+
if (connection.connection === 'pending')
|
|
89
|
+
return { reason: 'operation-failed' };
|
|
90
|
+
try {
|
|
91
|
+
await state.operations.open();
|
|
92
|
+
state.flightOpened = true;
|
|
93
|
+
return { reason: 'opened' };
|
|
94
|
+
}
|
|
95
|
+
catch {
|
|
96
|
+
return { reason: 'operation-failed' };
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
export function sendMidiMessage(port, data, timestamp) {
|
|
100
|
+
const validation = validateBasicMidiMessage(data, timestamp);
|
|
101
|
+
if (validation !== 'valid')
|
|
102
|
+
return { reason: validation };
|
|
103
|
+
const state = getMidiPortResourceState(port);
|
|
104
|
+
if (state === undefined || state.kind !== 'output')
|
|
105
|
+
return { reason: 'operation-failed' };
|
|
106
|
+
if (state.disposed)
|
|
107
|
+
return { reason: 'disposed' };
|
|
108
|
+
const portState = getMidiPortState(port);
|
|
109
|
+
if (portState.reason !== 'ok')
|
|
110
|
+
return { reason: 'operation-failed' };
|
|
111
|
+
if (portState.state === 'disconnected')
|
|
112
|
+
return { reason: 'disconnected' };
|
|
113
|
+
const connection = readMidiPortConnection(port);
|
|
114
|
+
if (connection.reason !== 'ok')
|
|
115
|
+
return { reason: 'operation-failed' };
|
|
116
|
+
if (connection.connection !== 'open')
|
|
117
|
+
return { reason: 'not-open' };
|
|
118
|
+
try {
|
|
119
|
+
state.operations.send([...data], timestamp);
|
|
120
|
+
return { reason: 'sent' };
|
|
121
|
+
}
|
|
122
|
+
catch {
|
|
123
|
+
return { reason: 'operation-failed' };
|
|
124
|
+
}
|
|
125
|
+
}
|
|
126
|
+
async function disposeOwnedMidiPort(port) {
|
|
127
|
+
const state = getMidiPortResourceState(port);
|
|
128
|
+
if (state === undefined)
|
|
129
|
+
return { reason: 'already-disposed' };
|
|
130
|
+
const failures = [];
|
|
131
|
+
for (const subscription of [...state.stateSubscriptions]) {
|
|
132
|
+
const outcome = await disposeMidiPortStateSubscription(subscription);
|
|
133
|
+
if (outcome.reason === 'operation-failed' && outcome.releaseFailed) {
|
|
134
|
+
failures.push({ operation: 'state-subscription-release' });
|
|
135
|
+
}
|
|
136
|
+
else
|
|
137
|
+
state.stateSubscriptions.delete(subscription);
|
|
138
|
+
}
|
|
139
|
+
if (state.kind === 'input') {
|
|
140
|
+
for (const subscription of [...state.messageSubscriptions]) {
|
|
141
|
+
const outcome = await disposeMidiInputMessageSubscription(subscription);
|
|
142
|
+
if (outcome.reason === 'operation-failed' && outcome.releaseFailed) {
|
|
143
|
+
failures.push({ operation: 'message-subscription-release' });
|
|
144
|
+
}
|
|
145
|
+
else
|
|
146
|
+
state.messageSubscriptions.delete(subscription);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
if (state.flightOpened) {
|
|
150
|
+
let connectionIsClosed = false;
|
|
151
|
+
try {
|
|
152
|
+
connectionIsClosed = state.operations.getConnection() === 'closed';
|
|
153
|
+
}
|
|
154
|
+
catch {
|
|
155
|
+
// A failed diagnostic read does not waive cleanup. Attempt the owned close directly.
|
|
156
|
+
}
|
|
157
|
+
if (!connectionIsClosed) {
|
|
158
|
+
try {
|
|
159
|
+
await state.operations.close();
|
|
160
|
+
state.flightOpened = false;
|
|
161
|
+
}
|
|
162
|
+
catch {
|
|
163
|
+
failures.push({ operation: 'close' });
|
|
164
|
+
}
|
|
165
|
+
}
|
|
166
|
+
}
|
|
167
|
+
if (failures.length > 0)
|
|
168
|
+
return { failures, reason: 'operation-failed' };
|
|
169
|
+
state.flightOpened = false;
|
|
170
|
+
state.disposeCompleted = true;
|
|
171
|
+
return { reason: 'ok' };
|
|
172
|
+
}
|
|
173
|
+
function readMidiPortConnection(port) {
|
|
174
|
+
const state = getMidiPortResourceState(port);
|
|
175
|
+
if (state === undefined)
|
|
176
|
+
return { reason: 'operation-failed' };
|
|
177
|
+
try {
|
|
178
|
+
return { connection: state.operations.getConnection(), reason: 'ok' };
|
|
179
|
+
}
|
|
180
|
+
catch {
|
|
181
|
+
return { reason: 'operation-failed' };
|
|
182
|
+
}
|
|
183
|
+
}
|
|
184
|
+
function validateBasicMidiMessage(data, timestamp) {
|
|
185
|
+
if (timestamp !== undefined && (!Number.isFinite(timestamp) || timestamp < 0))
|
|
186
|
+
return 'invalid-message';
|
|
187
|
+
if (data.length === 0)
|
|
188
|
+
return 'invalid-message';
|
|
189
|
+
const status = data[0];
|
|
190
|
+
if (status === 0xf0)
|
|
191
|
+
return 'system-exclusive-not-enabled';
|
|
192
|
+
const expectedLength = getBasicMidiMessageLength(status);
|
|
193
|
+
if (expectedLength === null || data.length !== expectedLength)
|
|
194
|
+
return 'invalid-message';
|
|
195
|
+
for (let index = 1; index < data.length; index++) {
|
|
196
|
+
if (data[index] > 0x7f)
|
|
197
|
+
return 'invalid-message';
|
|
198
|
+
}
|
|
199
|
+
return 'valid';
|
|
200
|
+
}
|
|
201
|
+
function getBasicMidiMessageLength(status) {
|
|
202
|
+
if (status < 0x80)
|
|
203
|
+
return null;
|
|
204
|
+
if (status < 0xf0)
|
|
205
|
+
return status < 0xc0 || status >= 0xe0 ? 3 : 2;
|
|
206
|
+
switch (status) {
|
|
207
|
+
case 0xf1:
|
|
208
|
+
case 0xf3:
|
|
209
|
+
return 2;
|
|
210
|
+
case 0xf2:
|
|
211
|
+
return 3;
|
|
212
|
+
case 0xf6:
|
|
213
|
+
case 0xf8:
|
|
214
|
+
case 0xfa:
|
|
215
|
+
case 0xfb:
|
|
216
|
+
case 0xfc:
|
|
217
|
+
case 0xfe:
|
|
218
|
+
case 0xff:
|
|
219
|
+
return 1;
|
|
220
|
+
default:
|
|
221
|
+
return null;
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
//# sourceMappingURL=midiPort.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiPort.js","sourceRoot":"","sources":["../src/midiPort.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,33 @@
|
|
|
1
|
+
import type { MidiAccess, MidiAccessDisposeOutcome, MidiAccessResourceOperations, MidiAccessStateSubscription, MidiInputMessageSubscription, MidiInputPort, MidiInputPortResourceOperations, MidiOutputPort, MidiOutputPortResourceOperations, MidiPort, MidiPortDisposeOutcome, MidiPortStateSubscription } from '@flighthq/types/contract';
|
|
2
|
+
interface MidiAccessResourceState {
|
|
3
|
+
disposeCompleted: boolean;
|
|
4
|
+
disposePending: Promise<MidiAccessDisposeOutcome> | null;
|
|
5
|
+
disposed: boolean;
|
|
6
|
+
knownPorts: Set<MidiPort>;
|
|
7
|
+
operations: MidiAccessResourceOperations;
|
|
8
|
+
subscriptions: Set<MidiAccessStateSubscription>;
|
|
9
|
+
}
|
|
10
|
+
interface MidiPortResourceStateBase {
|
|
11
|
+
disposeCompleted: boolean;
|
|
12
|
+
disposePending: Promise<MidiPortDisposeOutcome> | null;
|
|
13
|
+
disposed: boolean;
|
|
14
|
+
flightOpened: boolean;
|
|
15
|
+
stateSubscriptions: Set<MidiPortStateSubscription>;
|
|
16
|
+
}
|
|
17
|
+
interface MidiInputPortResourceState extends MidiPortResourceStateBase {
|
|
18
|
+
kind: 'input';
|
|
19
|
+
messageSubscriptions: Set<MidiInputMessageSubscription>;
|
|
20
|
+
operations: MidiInputPortResourceOperations;
|
|
21
|
+
}
|
|
22
|
+
interface MidiOutputPortResourceState extends MidiPortResourceStateBase {
|
|
23
|
+
kind: 'output';
|
|
24
|
+
operations: MidiOutputPortResourceOperations;
|
|
25
|
+
}
|
|
26
|
+
type MidiPortResourceState = MidiInputPortResourceState | MidiOutputPortResourceState;
|
|
27
|
+
export declare function getMidiAccessResourceState(access: MidiAccess): MidiAccessResourceState | undefined;
|
|
28
|
+
export declare function getMidiPortResourceState(port: MidiPort): MidiPortResourceState | undefined;
|
|
29
|
+
export declare function retainMidiAccessResourceState(access: MidiAccess, operations: MidiAccessResourceOperations): void;
|
|
30
|
+
export declare function retainMidiInputPortResourceState(port: MidiInputPort, operations: MidiInputPortResourceOperations): void;
|
|
31
|
+
export declare function retainMidiOutputPortResourceState(port: MidiOutputPort, operations: MidiOutputPortResourceOperations): void;
|
|
32
|
+
export {};
|
|
33
|
+
//# sourceMappingURL=midiResource.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiResource.d.ts","sourceRoot":"","sources":["../src/midiResource.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,UAAU,EACV,wBAAwB,EACxB,4BAA4B,EAC5B,2BAA2B,EAC3B,4BAA4B,EAC5B,aAAa,EACb,+BAA+B,EAC/B,cAAc,EACd,gCAAgC,EAChC,QAAQ,EACR,sBAAsB,EACtB,yBAAyB,EAC1B,MAAM,0BAA0B,CAAC;AAElC,UAAU,uBAAuB;IAC/B,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC,wBAAwB,CAAC,GAAG,IAAI,CAAC;IACzD,QAAQ,EAAE,OAAO,CAAC;IAClB,UAAU,EAAE,GAAG,CAAC,QAAQ,CAAC,CAAC;IAC1B,UAAU,EAAE,4BAA4B,CAAC;IACzC,aAAa,EAAE,GAAG,CAAC,2BAA2B,CAAC,CAAC;CACjD;AAED,UAAU,yBAAyB;IACjC,gBAAgB,EAAE,OAAO,CAAC;IAC1B,cAAc,EAAE,OAAO,CAAC,sBAAsB,CAAC,GAAG,IAAI,CAAC;IACvD,QAAQ,EAAE,OAAO,CAAC;IAClB,YAAY,EAAE,OAAO,CAAC;IACtB,kBAAkB,EAAE,GAAG,CAAC,yBAAyB,CAAC,CAAC;CACpD;AAED,UAAU,0BAA2B,SAAQ,yBAAyB;IACpE,IAAI,EAAE,OAAO,CAAC;IACd,oBAAoB,EAAE,GAAG,CAAC,4BAA4B,CAAC,CAAC;IACxD,UAAU,EAAE,+BAA+B,CAAC;CAC7C;AAED,UAAU,2BAA4B,SAAQ,yBAAyB;IACrE,IAAI,EAAE,QAAQ,CAAC;IACf,UAAU,EAAE,gCAAgC,CAAC;CAC9C;AAED,KAAK,qBAAqB,GAAG,0BAA0B,GAAG,2BAA2B,CAAC;AAKtF,wBAAgB,0BAA0B,CAAC,MAAM,EAAE,UAAU,GAAG,uBAAuB,GAAG,SAAS,CAElG;AAED,wBAAgB,wBAAwB,CAAC,IAAI,EAAE,QAAQ,GAAG,qBAAqB,GAAG,SAAS,CAE1F;AAED,wBAAgB,6BAA6B,CAAC,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,4BAA4B,GAAG,IAAI,CAShH;AAED,wBAAgB,gCAAgC,CAC9C,IAAI,EAAE,aAAa,EACnB,UAAU,EAAE,+BAA+B,GAC1C,IAAI,CAEN;AAED,wBAAgB,iCAAiC,CAC/C,IAAI,EAAE,cAAc,EACpB,UAAU,EAAE,gCAAgC,GAC3C,IAAI,CAEN"}
|
|
@@ -0,0 +1,36 @@
|
|
|
1
|
+
const accessStates = new WeakMap();
|
|
2
|
+
const portStates = new WeakMap();
|
|
3
|
+
export function getMidiAccessResourceState(access) {
|
|
4
|
+
return accessStates.get(access);
|
|
5
|
+
}
|
|
6
|
+
export function getMidiPortResourceState(port) {
|
|
7
|
+
return portStates.get(port);
|
|
8
|
+
}
|
|
9
|
+
export function retainMidiAccessResourceState(access, operations) {
|
|
10
|
+
accessStates.set(access, {
|
|
11
|
+
disposeCompleted: false,
|
|
12
|
+
disposePending: null,
|
|
13
|
+
disposed: false,
|
|
14
|
+
knownPorts: new Set(),
|
|
15
|
+
operations,
|
|
16
|
+
subscriptions: new Set(),
|
|
17
|
+
});
|
|
18
|
+
}
|
|
19
|
+
export function retainMidiInputPortResourceState(port, operations) {
|
|
20
|
+
portStates.set(port, { ...createMidiPortState('input', operations), messageSubscriptions: new Set() });
|
|
21
|
+
}
|
|
22
|
+
export function retainMidiOutputPortResourceState(port, operations) {
|
|
23
|
+
portStates.set(port, createMidiPortState('output', operations));
|
|
24
|
+
}
|
|
25
|
+
function createMidiPortState(kind, operations) {
|
|
26
|
+
return {
|
|
27
|
+
disposeCompleted: false,
|
|
28
|
+
disposePending: null,
|
|
29
|
+
disposed: false,
|
|
30
|
+
flightOpened: false,
|
|
31
|
+
kind,
|
|
32
|
+
operations,
|
|
33
|
+
stateSubscriptions: new Set(),
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
//# sourceMappingURL=midiResource.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiResource.js","sourceRoot":"","sources":["../src/midiResource.ts"],"names":[],"mappings":"AA6CA,MAAM,YAAY,GAAG,IAAI,OAAO,EAAuC,CAAC;AACxE,MAAM,UAAU,GAAG,IAAI,OAAO,EAAmC,CAAC;AAElE,MAAM,UAAU,0BAA0B,CAAC,MAAkB;IAC3D,OAAO,YAAY,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC;AAClC,CAAC;AAED,MAAM,UAAU,wBAAwB,CAAC,IAAc;IACrD,OAAO,UAAU,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;AAC9B,CAAC;AAED,MAAM,UAAU,6BAA6B,CAAC,MAAkB,EAAE,UAAwC;IACxG,YAAY,CAAC,GAAG,CAAC,MAAM,EAAE;QACvB,gBAAgB,EAAE,KAAK;QACvB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,KAAK;QACf,UAAU,EAAE,IAAI,GAAG,EAAE;QACrB,UAAU;QACV,aAAa,EAAE,IAAI,GAAG,EAAE;KACzB,CAAC,CAAC;AACL,CAAC;AAED,MAAM,UAAU,gCAAgC,CAC9C,IAAmB,EACnB,UAA2C;IAE3C,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,mBAAmB,CAAC,OAAO,EAAE,UAAU,CAAC,EAAE,oBAAoB,EAAE,IAAI,GAAG,EAAE,EAAE,CAAC,CAAC;AACzG,CAAC;AAED,MAAM,UAAU,iCAAiC,CAC/C,IAAoB,EACpB,UAA4C;IAE5C,UAAU,CAAC,GAAG,CAAC,IAAI,EAAE,mBAAmB,CAAC,QAAQ,EAAE,UAAU,CAAC,CAAC,CAAC;AAClE,CAAC;AAED,SAAS,mBAAmB,CAG1B,IAAU,EAAE,UAAsB;IAClC,OAAO;QACL,gBAAgB,EAAE,KAAK;QACvB,cAAc,EAAE,IAAI;QACpB,QAAQ,EAAE,KAAK;QACf,YAAY,EAAE,KAAK;QACnB,IAAI;QACJ,UAAU;QACV,kBAAkB,EAAE,IAAI,GAAG,EAAE;KACoB,CAAC;AACtD,CAAC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import type { MidiAccess, MidiAccessStateSubscription, MidiInputMessageSubscription, MidiInputPort, MidiPort, MidiPortStateSubscription, MidiSubscriptionAttachOutcome, MidiSubscriptionDetachOutcome, MidiSubscriptionDisposeOutcome } from '@flighthq/types/contract';
|
|
2
|
+
export declare function attachMidiAccessStateSubscription(access: MidiAccess, subscription: MidiAccessStateSubscription): Promise<MidiSubscriptionAttachOutcome>;
|
|
3
|
+
export declare function attachMidiInputMessageSubscription(input: MidiInputPort, subscription: MidiInputMessageSubscription): Promise<MidiSubscriptionAttachOutcome>;
|
|
4
|
+
export declare function attachMidiPortStateSubscription(port: MidiPort, subscription: MidiPortStateSubscription): Promise<MidiSubscriptionAttachOutcome>;
|
|
5
|
+
export declare function createMidiAccessStateSubscription(): MidiAccessStateSubscription;
|
|
6
|
+
export declare function createMidiInputMessageSubscription(): MidiInputMessageSubscription;
|
|
7
|
+
export declare function createMidiPortStateSubscription(): MidiPortStateSubscription;
|
|
8
|
+
export declare function detachMidiAccessStateSubscription(subscription: MidiAccessStateSubscription): Promise<MidiSubscriptionDetachOutcome>;
|
|
9
|
+
export declare function detachMidiInputMessageSubscription(subscription: MidiInputMessageSubscription): Promise<MidiSubscriptionDetachOutcome>;
|
|
10
|
+
export declare function detachMidiPortStateSubscription(subscription: MidiPortStateSubscription): Promise<MidiSubscriptionDetachOutcome>;
|
|
11
|
+
export declare function disposeMidiAccessStateSubscription(subscription: MidiAccessStateSubscription): Promise<MidiSubscriptionDisposeOutcome>;
|
|
12
|
+
export declare function disposeMidiInputMessageSubscription(subscription: MidiInputMessageSubscription): Promise<MidiSubscriptionDisposeOutcome>;
|
|
13
|
+
export declare function disposeMidiPortStateSubscription(subscription: MidiPortStateSubscription): Promise<MidiSubscriptionDisposeOutcome>;
|
|
14
|
+
//# sourceMappingURL=midiSubscription.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"midiSubscription.d.ts","sourceRoot":"","sources":["../src/midiSubscription.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAEV,UAAU,EACV,2BAA2B,EAG3B,4BAA4B,EAC5B,aAAa,EACb,QAAQ,EACR,yBAAyB,EACzB,6BAA6B,EAC7B,6BAA6B,EAC7B,8BAA8B,EAE/B,MAAM,0BAA0B,CAAC;AAIlC,wBAAgB,iCAAiC,CAC/C,MAAM,EAAE,UAAU,EAClB,YAAY,EAAE,2BAA2B,GACxC,OAAO,CAAC,6BAA6B,CAAC,CAYxC;AAED,wBAAgB,kCAAkC,CAChD,KAAK,EAAE,aAAa,EACpB,YAAY,EAAE,4BAA4B,GACzC,OAAO,CAAC,6BAA6B,CAAC,CAUxC;AAED,wBAAgB,+BAA+B,CAC7C,IAAI,EAAE,QAAQ,EACd,YAAY,EAAE,yBAAyB,GACtC,OAAO,CAAC,6BAA6B,CAAC,CASxC;AAED,wBAAgB,iCAAiC,IAAI,2BAA2B,CAE/E;AAED,wBAAgB,kCAAkC,IAAI,4BAA4B,CAEjF;AAED,wBAAgB,+BAA+B,IAAI,yBAAyB,CAE3E;AAED,wBAAgB,iCAAiC,CAC/C,YAAY,EAAE,2BAA2B,GACxC,OAAO,CAAC,6BAA6B,CAAC,CAExC;AAED,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,4BAA4B,GACzC,OAAO,CAAC,6BAA6B,CAAC,CAExC;AAED,wBAAgB,+BAA+B,CAC7C,YAAY,EAAE,yBAAyB,GACtC,OAAO,CAAC,6BAA6B,CAAC,CAExC;AAED,wBAAgB,kCAAkC,CAChD,YAAY,EAAE,2BAA2B,GACxC,OAAO,CAAC,8BAA8B,CAAC,CAEzC;AAED,wBAAgB,mCAAmC,CACjD,YAAY,EAAE,4BAA4B,GACzC,OAAO,CAAC,8BAA8B,CAAC,CAEzC;AAED,wBAAgB,gCAAgC,CAC9C,YAAY,EAAE,yBAAyB,GACtC,OAAO,CAAC,8BAA8B,CAAC,CAEzC"}
|