effect-web-midi 0.1.4 → 0.1.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 CHANGED
@@ -13,29 +13,24 @@ Huge thanks to [Web MIDI spec](https://www.w3.org/TR/webmidi/)!
13
13
  import { Atom, Result, useAtom, useAtomValue } from '@effect-atom/atom-react';
14
14
  import { styled } from '@linaria/react';
15
15
  import * as Cause from 'effect/Cause';
16
- import * as Chunk from 'effect/Chunk';
17
16
  import * as Console from 'effect/Console';
18
17
  import * as Effect from 'effect/Effect';
19
18
  import { flow, pipe } from 'effect/Function';
19
+ import * as Record from 'effect/Record';
20
20
  import * as Stream from 'effect/Stream';
21
- import {
22
- EMIDIAccess,
23
- EMIDIInput,
24
- EMIDIOutput,
25
- Parsing,
26
- Util,
27
- } from 'effect-web-midi';
28
-
29
- const nanoPadInputId1 = EMIDIInput.Id(
30
- '1A0CE1F47C19C43DAEB93B9595F6E4BA822ED318FE8D8BF2750B66286B5BEC38'
31
- );
32
- const nanoPadInputId2 = EMIDIInput.Id(
33
- 'EF5E7457082713264B5DBD318651DA2134B6A34EB9F32BFD2C8E0B121508D10A'
21
+ import * as EMIDIAccess from 'effect-web-midi/EMIDIAccess';
22
+ import * as EMIDIInput from 'effect-web-midi/EMIDIInput';
23
+ import * as EMIDIOutput from 'effect-web-midi/EMIDIOutput';
24
+ import * as EMIDIPort from 'effect-web-midi/EMIDIPort';
25
+ import * as Parsing from 'effect-web-midi/Parsing';
26
+ import * as Util from 'effect-web-midi/Util';
27
+
28
+ const nanoPadInputId = EMIDIInput.Id(
29
+ '380CB1F6BC0A21C5AAA0CDF95170A996937337454636CDDE223EEA6812283B07'
34
30
  );
35
- const nanoPadInputId = nanoPadInputId2;
36
31
 
37
32
  const nanoPadOutputId = EMIDIOutput.Id(
38
- '380CB1F6BC0A21C5AAA0CDF95170A996937337454636CDDE223EEA6812283B07'
33
+ '045297AACE044DA224B59E92DBC0E874160B85D0D43BE505CBB053747F4AA90A'
39
34
  );
40
35
 
41
36
  const globalDataDumpRequest = new Uint8Array([
@@ -46,23 +41,94 @@ const globalDataDumpRequest = new Uint8Array([
46
41
  0x1f, 0x0e, 0x00, 0xf7,
47
42
  ]);
48
43
 
49
- const _MIDIDeviceConnectionEventsStringLog = EMIDIAccess.request().pipe(
44
+ const _MIDIDeviceConnectionEventsStringLog = pipe(
45
+ // The lib supports both ways of working with access. You can either work with
46
+ // its instance directly, or provide it through DI. All of the functions have
47
+ // equivalents supporting both approaches. In this case we work with it directly
48
+ EMIDIAccess.request(),
49
+ // ⬆️ Effect<
50
+ // EMIDIAccess.EMIDIAccessInstance,
51
+ // | AbortError
52
+ // | UnderlyingSystemError
53
+ // | MIDIAccessNotSupportedError
54
+ // | MIDIAccessNotAllowedError,
55
+ // never
56
+ // >
50
57
  Effect.catchTag(
51
58
  'MIDIAccessNotSupportedError',
52
59
  flow(Console.log, Effect.andThen(Effect.never))
53
60
  ),
61
+ // notice that function below consumed access. It can consume access
62
+ // regardless if it's wrapped in effect or not. It also has both
63
+ // data-first and data-last signatures supported. Every function in this lib
64
+ // conforms that rule
54
65
  EMIDIAccess.makeAllPortsStateChangesStream(),
66
+ // ⬆️ Stream<
67
+ // {
68
+ // readonly _tag: "MIDIPortStateChange";
69
+ // readonly cameFrom: EMIDIAccess.EMIDIAccessInstance;
70
+ // readonly capturedAt: Date;
71
+ // readonly newState: {
72
+ // readonly ofDevice: MIDIPortDeviceState;
73
+ // readonly ofConnection: MIDIPortConnectionState;
74
+ // };
75
+ // readonly port: EMIDIOutput | EMIDIInput;
76
+ // },
77
+ // | AbortError
78
+ // | UnderlyingSystemError
79
+ // | MIDIAccessNotAllowedError,
80
+ // never
81
+ // >
82
+ // This is just a helper to render a list of objects to a string in nice-ish way
55
83
  Util.mapToGlidingStringLogOfLimitedEntriesCount(50, 'latestFirst', (_) => ({
56
84
  time: _.capturedAt.toISOString(),
57
85
  id: _.port.id.slice(-10),
58
86
  device: _.newState.ofDevice.padStart(12),
59
87
  connection: _.newState.ofConnection.padStart(7),
60
88
  }))
89
+ // ⬆️ Stream<
90
+ // string,
91
+ // | AbortError
92
+ // | UnderlyingSystemError
93
+ // | MIDIAccessNotAllowedError,
94
+ // never
95
+ // >
61
96
  );
62
97
 
63
98
  const MIDIMessageEventsStringLog = pipe(
99
+ // if the ID below turned out to be output's, it would cause defect (by design),
100
+ // because messages can only come from inputs. Notice that instead of demanding
101
+ // access from arguments, this particular method expects it to be provided in
102
+ // requirements.
64
103
  EMIDIInput.makeMessagesStreamById(nanoPadInputId),
104
+ // ⬆️ Stream<
105
+ // {
106
+ // readonly _tag: "MIDIMessage";
107
+ // readonly cameFrom: EMIDIInput;
108
+ // readonly capturedAt: Date;
109
+ // readonly midiMessage: Uint8Array<ArrayBuffer>;
110
+ // },
111
+ // PortNotFoundError,
112
+ // EMIDIAccess
113
+ // >
65
114
  Parsing.withParsedDataField,
115
+ // ⬆️ Stream<
116
+ // {
117
+ // readonly _tag: "ParsedMIDIMessage";
118
+ // readonly cameFrom: EMIDIInput;
119
+ // readonly capturedAt: Date;
120
+ // readonly midiMessage: | NoteRelease
121
+ // | NotePress
122
+ // | UnknownReply
123
+ // | ControlChange
124
+ // | TouchpadRelease
125
+ // | PitchBendChange
126
+ // },
127
+ // PortNotFoundError,
128
+ // EMIDIAccess
129
+ // >
130
+ // function below adds new member to the midiMessage union inferred from
131
+ // ControlChange, PitchBendChange, and TouchpadRelease
66
132
  Parsing.withTouchpadPositionUpdates,
67
133
  Stream.filter(
68
134
  (a) =>
@@ -71,8 +137,9 @@ const MIDIMessageEventsStringLog = pipe(
71
137
  a.midiMessage._tag === 'Note Press' ||
72
138
  a.midiMessage._tag === 'Note Release'
73
139
  ),
140
+ // Just for the demo, show only select list of events
74
141
  Util.mapToGlidingStringLogOfLimitedEntriesCount(
75
- 5,
142
+ 50,
76
143
  'latestFirst',
77
144
  (current) => ({
78
145
  time: current.capturedAt.toISOString(),
@@ -80,30 +147,65 @@ const MIDIMessageEventsStringLog = pipe(
80
147
  ...current.midiMessage,
81
148
  })
82
149
  ),
83
- Stream.catchTag('PortNotFound', () =>
84
- Stream.succeed(`KORG nanoPAD not found in the list of connected devices`)
150
+ // ⬆️ Stream<string, PortNotFoundError, EMIDIAccess>
151
+ Stream.catchTag('PortNotFound', (err) =>
152
+ Stream.fromEffect(
153
+ EMIDIPort.FullRecord.pipe(
154
+ // ⬆️ Effect<
155
+ // {
156
+ // [id: EMIDIPort.Id<'input'>]: EMIDIPort<'input'>
157
+ // } & {
158
+ // [id: EMIDIPort.Id<'output'>]: EMIDIPort<'output'>
159
+ // },
160
+ // never,
161
+ // EMIDIAccess.EMIDIAccess
162
+ // >
163
+ Effect.map(
164
+ Record.reduce(
165
+ `Port with id=${err.portId} is not found. Currently available ports: \n`,
166
+ (acc, { type, version, name }, id) =>
167
+ acc + type.padEnd(7) + id + ' ' + version + ' ' + name + '\n'
168
+ )
169
+ ),
170
+ Effect.flatMap(Console.log),
171
+ Effect.andThen(
172
+ `KORG nanoPAD not found in the list of connected devices`
173
+ )
174
+ )
175
+ )
85
176
  ),
177
+ // ⬆️ Stream.Stream<string, never, EMIDIAccess>
86
178
  Stream.provideLayer(EMIDIAccess.layerSystemExclusiveSupported),
179
+ // ⬆️ Stream.Stream<
180
+ // string,
181
+ // | AbortError
182
+ // | UnderlyingSystemError
183
+ // | MIDIAccessNotSupportedError
184
+ // | MIDIAccessNotAllowedError,
185
+ // never
186
+ // >
87
187
  Stream.catchTag('MIDIAccessNotSupportedError', (e) =>
88
188
  Stream.succeed(e.cause.message)
89
189
  )
90
190
  );
91
191
 
92
192
  const dumpRequester = Atom.fn(() =>
193
+ // A particular example of methods flexibility. Here EMIDIAccess.send is a
194
+ // data-first signature and accepts EMIDIAccess wrapped by Effect
93
195
  EMIDIAccess.send(
94
196
  EMIDIAccess.request({ sysex: true }),
95
- // ^ Effect.Effect<
96
- // EMIDIAccess.EMIDIAccessInstance,
97
- // | AbortError
98
- // | UnderlyingSystemError
99
- // | MIDIAccessNotAllowedError
100
- // | MIDIAccessNotSupportedError,
101
- // never
102
- // >
197
+ // ⬆️ Effect.Effect<
198
+ // EMIDIAccess.EMIDIAccessInstance,
199
+ // | AbortError
200
+ // | UnderlyingSystemError
201
+ // | MIDIAccessNotAllowedError
202
+ // | MIDIAccessNotSupportedError,
203
+ // never
204
+ // >
103
205
  nanoPadOutputId,
104
- // ^ string & Brand<"MIDIPortId"> & Brand<"output">
206
+ // ⬆️ string & Brand<"MIDIPortId"> & Brand<"output">
105
207
  globalDataDumpRequest
106
- // ^ Uint8Array<ArrayBuffer>
208
+ // ⬆️ Uint8Array<ArrayBuffer>
107
209
  )
108
210
  );
109
211
 
@@ -114,6 +216,7 @@ const textAtom = Atom.make(
114
216
 
115
217
  export default function Home() {
116
218
  const text = useAtomValue(textAtom);
219
+ console.log(text);
117
220
  const [, mutate] = useAtom(dumpRequester);
118
221
 
119
222
  return (
@@ -121,12 +224,10 @@ export default function Home() {
121
224
  <form
122
225
  onSubmit={(event) => {
123
226
  event.preventDefault();
124
- console.log('hex', new FormData(event.target as any).get('hex'));
125
227
  mutate();
126
228
  }}
127
229
  >
128
- <input type='text' name='hex' />
129
- <input type='submit' value='send' />
230
+ <input type='submit' value='dump' />
130
231
  </form>
131
232
 
132
233
  {Result.match(text, {
@@ -134,10 +235,7 @@ export default function Home() {
134
235
  <>
135
236
  failure:
136
237
  <br />
137
- {Cause.failures(_.cause).pipe(
138
- Chunk.map((e) => e.message),
139
- Chunk.join('\n')
140
- )}
238
+ {Cause.pretty(_.cause)}
141
239
  </>
142
240
  ),
143
241
  onInitial: (e) => <>initial waiting: {e.waiting.toString()}</>,
@@ -151,3 +249,7 @@ const Wrapper = styled.div`
151
249
  color: wheat;
152
250
  `;
153
251
  ```
252
+
253
+ <img width="1567" height="946" alt="Screenshot From 2025-12-29 01-46-34" src="https://github.com/user-attachments/assets/7411d393-0ef4-485a-954d-0d8d4e56a42e" />
254
+
255
+ ![photo_2025-11-17_22-00-08](https://github.com/user-attachments/assets/e45ead32-6675-4fed-aff3-aeb416ba8ead)
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "effect-web-midi",
3
- "version": "0.1.4",
3
+ "version": "0.1.6",
4
4
  "type": "module",
5
5
  "description": "Effect WEB MIDI",
6
6
  "license": "MIT",
package/src/EMIDIInput.ts CHANGED
@@ -133,12 +133,12 @@ export {
133
133
  // openPortConnectionByPort,
134
134
  } from './internal/MIDIPortMethodCalls/openPortConnection/openPortConnectionByPort.ts'
135
135
  export {
136
- openInputConnectionByPortIdAndAccess as openConnectionById,
136
+ openInputConnectionByPortIdAndAccess as openConnectionByIdAndAccess,
137
137
  // openOutputConnectionByPortIdAndAccess,
138
138
  // openPortConnectionByPortIdAndAccess,
139
139
  } from './internal/MIDIPortMethodCalls/openPortConnection/openPortConnectionByPortIdAndAccess.ts'
140
140
  export {
141
- openInputConnectionByPortIdInContext as openConnectionByIdAndAccess,
141
+ openInputConnectionByPortIdInContext as openConnectionById,
142
142
  // openOutputConnectionByPortIdInContext,
143
143
  // openPortConnectionByPortIdInContext,
144
144
  } from './internal/MIDIPortMethodCalls/openPortConnection/openPortConnectionByPortIdInContext.ts'
@@ -595,7 +595,7 @@ export const makeMessagesStreamByInputId = <
595
595
 
596
596
  // TODO: makeMessagesStreamByInputIdAndAccess
597
597
  export const makeMessagesStreamByInputIdAndAccess = () => {
598
- throw new Error('not implemented')
598
+ throw new Error('Not implemented 😿 YET!! 🤩')
599
599
  }
600
600
 
601
601
  /**
@@ -22,9 +22,13 @@ export const withParsedDataField = <
22
22
  ) =>
23
23
  Stream.map(self, ({ midiMessage, ...obj }) => ({
24
24
  ...obj,
25
+ _tag: 'ParsedMIDIMessage' as const,
25
26
  midiMessage: dataEntryParser(midiMessage),
26
27
  })) as Stream.Stream<
27
- Omit<A, 'midiMessage'> & { readonly midiMessage: ParsedMIDIMessages },
28
+ Omit<A, 'midiMessage' | '_tag'> & {
29
+ readonly _tag: 'ParsedMIDIMessage'
30
+ readonly midiMessage: ParsedMIDIMessages
31
+ },
28
32
  E,
29
33
  R
30
34
  >
@@ -1,14 +1,14 @@
1
1
  // TODO: makeInputStateChangesStreamByPortIdAndAccess
2
2
  export const makeInputStateChangesStreamByPortIdAndAccess = () => {
3
- throw new Error('not implemented')
3
+ throw new Error('Not implemented 😿 YET!! 🤩')
4
4
  }
5
5
 
6
6
  // TODO: makeOutputStateChangesStreamByPortIdAndAccess
7
7
  export const makeOutputStateChangesStreamByPortIdAndAccess = () => {
8
- throw new Error('not implemented')
8
+ throw new Error('Not implemented 😿 YET!! 🤩')
9
9
  }
10
10
 
11
11
  // TODO: makePortStateChangesStreamByPortIdAndAccess
12
12
  export const makePortStateChangesStreamByPortIdAndAccess = () => {
13
- throw new Error('not implemented')
13
+ throw new Error('Not implemented 😿 YET!! 🤩')
14
14
  }
@@ -1,74 +1,74 @@
1
1
  // TODO: isInputConnectionClosedByPortIdAndAccess
2
2
  export const isInputConnectionClosedByPortIdAndAccess = () => {
3
- throw new Error('not implemented')
3
+ throw new Error('Not implemented 😿 YET!! 🤩')
4
4
  }
5
5
 
6
6
  // TODO: isInputConnectionOpenByPortIdAndAccess
7
7
  export const isInputConnectionOpenByPortIdAndAccess = () => {
8
- throw new Error('not implemented')
8
+ throw new Error('Not implemented 😿 YET!! 🤩')
9
9
  }
10
10
 
11
11
  // TODO: isInputConnectionPendingByPortIdAndAccess
12
12
  export const isInputConnectionPendingByPortIdAndAccess = () => {
13
- throw new Error('not implemented')
13
+ throw new Error('Not implemented 😿 YET!! 🤩')
14
14
  }
15
15
 
16
16
  // TODO: isInputDeviceConnectedByPortIdAndAccess
17
17
  export const isInputDeviceConnectedByPortIdAndAccess = () => {
18
- throw new Error('not implemented')
18
+ throw new Error('Not implemented 😿 YET!! 🤩')
19
19
  }
20
20
 
21
21
  // TODO: isInputDeviceDisconnectedByPortIdAndAccess
22
22
  export const isInputDeviceDisconnectedByPortIdAndAccess = () => {
23
- throw new Error('not implemented')
23
+ throw new Error('Not implemented 😿 YET!! 🤩')
24
24
  }
25
25
 
26
26
  // TODO: isOutputConnectionClosedByPortIdAndAccess
27
27
  export const isOutputConnectionClosedByPortIdAndAccess = () => {
28
- throw new Error('not implemented')
28
+ throw new Error('Not implemented 😿 YET!! 🤩')
29
29
  }
30
30
 
31
31
  // TODO: isOutputConnectionOpenByPortIdAndAccess
32
32
  export const isOutputConnectionOpenByPortIdAndAccess = () => {
33
- throw new Error('not implemented')
33
+ throw new Error('Not implemented 😿 YET!! 🤩')
34
34
  }
35
35
 
36
36
  // TODO: isOutputConnectionPendingByPortIdAndAccess
37
37
  export const isOutputConnectionPendingByPortIdAndAccess = () => {
38
- throw new Error('not implemented')
38
+ throw new Error('Not implemented 😿 YET!! 🤩')
39
39
  }
40
40
 
41
41
  // TODO: isOutputDeviceConnectedByPortIdAndAccess
42
42
  export const isOutputDeviceConnectedByPortIdAndAccess = () => {
43
- throw new Error('not implemented')
43
+ throw new Error('Not implemented 😿 YET!! 🤩')
44
44
  }
45
45
 
46
46
  // TODO: isOutputDeviceDisconnectedByPortIdAndAccess
47
47
  export const isOutputDeviceDisconnectedByPortIdAndAccess = () => {
48
- throw new Error('not implemented')
48
+ throw new Error('Not implemented 😿 YET!! 🤩')
49
49
  }
50
50
 
51
51
  // TODO: isPortConnectionClosedByPortIdAndAccess
52
52
  export const isPortConnectionClosedByPortIdAndAccess = () => {
53
- throw new Error('not implemented')
53
+ throw new Error('Not implemented 😿 YET!! 🤩')
54
54
  }
55
55
 
56
56
  // TODO: isPortConnectionOpenByPortIdAndAccess
57
57
  export const isPortConnectionOpenByPortIdAndAccess = () => {
58
- throw new Error('not implemented')
58
+ throw new Error('Not implemented 😿 YET!! 🤩')
59
59
  }
60
60
 
61
61
  // TODO: isPortConnectionPendingByPortIdAndAccess
62
62
  export const isPortConnectionPendingByPortIdAndAccess = () => {
63
- throw new Error('not implemented')
63
+ throw new Error('Not implemented 😿 YET!! 🤩')
64
64
  }
65
65
 
66
66
  // TODO: isPortDeviceConnectedByPortIdAndAccess
67
67
  export const isPortDeviceConnectedByPortIdAndAccess = () => {
68
- throw new Error('not implemented')
68
+ throw new Error('Not implemented 😿 YET!! 🤩')
69
69
  }
70
70
 
71
71
  // TODO: isPortDeviceDisconnectedByPortIdAndAccess
72
72
  export const isPortDeviceDisconnectedByPortIdAndAccess = () => {
73
- throw new Error('not implemented')
73
+ throw new Error('Not implemented 😿 YET!! 🤩')
74
74
  }
@@ -1,74 +1,74 @@
1
1
  // TODO: isInputConnectionClosedByPortIdInContext
2
2
  export const isInputConnectionClosedByPortIdInContext = () => {
3
- throw new Error('not implemented')
3
+ throw new Error('Not implemented 😿 YET!! 🤩')
4
4
  }
5
5
 
6
6
  // TODO: isInputConnectionOpenByPortIdInContext
7
7
  export const isInputConnectionOpenByPortIdInContext = () => {
8
- throw new Error('not implemented')
8
+ throw new Error('Not implemented 😿 YET!! 🤩')
9
9
  }
10
10
 
11
11
  // TODO: isInputConnectionPendingByPortIdInContext
12
12
  export const isInputConnectionPendingByPortIdInContext = () => {
13
- throw new Error('not implemented')
13
+ throw new Error('Not implemented 😿 YET!! 🤩')
14
14
  }
15
15
 
16
16
  // TODO: isInputDeviceConnectedByPortIdInContext
17
17
  export const isInputDeviceConnectedByPortIdInContext = () => {
18
- throw new Error('not implemented')
18
+ throw new Error('Not implemented 😿 YET!! 🤩')
19
19
  }
20
20
 
21
21
  // TODO: isInputDeviceDisconnectedByPortIdInContext
22
22
  export const isInputDeviceDisconnectedByPortIdInContext = () => {
23
- throw new Error('not implemented')
23
+ throw new Error('Not implemented 😿 YET!! 🤩')
24
24
  }
25
25
 
26
26
  // TODO: isOutputConnectionClosedByPortIdInContext
27
27
  export const isOutputConnectionClosedByPortIdInContext = () => {
28
- throw new Error('not implemented')
28
+ throw new Error('Not implemented 😿 YET!! 🤩')
29
29
  }
30
30
 
31
31
  // TODO: isOutputConnectionOpenByPortIdInContext
32
32
  export const isOutputConnectionOpenByPortIdInContext = () => {
33
- throw new Error('not implemented')
33
+ throw new Error('Not implemented 😿 YET!! 🤩')
34
34
  }
35
35
 
36
36
  // TODO: isOutputConnectionPendingByPortIdInContext
37
37
  export const isOutputConnectionPendingByPortIdInContext = () => {
38
- throw new Error('not implemented')
38
+ throw new Error('Not implemented 😿 YET!! 🤩')
39
39
  }
40
40
 
41
41
  // TODO: isOutputDeviceConnectedByPortIdInContext
42
42
  export const isOutputDeviceConnectedByPortIdInContext = () => {
43
- throw new Error('not implemented')
43
+ throw new Error('Not implemented 😿 YET!! 🤩')
44
44
  }
45
45
 
46
46
  // TODO: isOutputDeviceDisconnectedByPortIdInContext
47
47
  export const isOutputDeviceDisconnectedByPortIdInContext = () => {
48
- throw new Error('not implemented')
48
+ throw new Error('Not implemented 😿 YET!! 🤩')
49
49
  }
50
50
 
51
51
  // TODO: isPortConnectionClosedByPortIdInContext
52
52
  export const isPortConnectionClosedByPortIdInContext = () => {
53
- throw new Error('not implemented')
53
+ throw new Error('Not implemented 😿 YET!! 🤩')
54
54
  }
55
55
 
56
56
  // TODO: isPortConnectionOpenByPortIdInContext
57
57
  export const isPortConnectionOpenByPortIdInContext = () => {
58
- throw new Error('not implemented')
58
+ throw new Error('Not implemented 😿 YET!! 🤩')
59
59
  }
60
60
 
61
61
  // TODO: isPortConnectionPendingByPortIdInContext
62
62
  export const isPortConnectionPendingByPortIdInContext = () => {
63
- throw new Error('not implemented')
63
+ throw new Error('Not implemented 😿 YET!! 🤩')
64
64
  }
65
65
 
66
66
  // TODO: isPortDeviceConnectedByPortIdInContext
67
67
  export const isPortDeviceConnectedByPortIdInContext = () => {
68
- throw new Error('not implemented')
68
+ throw new Error('Not implemented 😿 YET!! 🤩')
69
69
  }
70
70
 
71
71
  // TODO: isPortDeviceDisconnectedByPortIdInContext
72
72
  export const isPortDeviceDisconnectedByPortIdInContext = () => {
73
- throw new Error('not implemented')
73
+ throw new Error('Not implemented 😿 YET!! 🤩')
74
74
  }
@@ -91,20 +91,20 @@ export const getPortConnectionStateByPortIdAndAccess = <TE = never, TR = never>(
91
91
 
92
92
  // TODO: getInputConnectionStateByPortIdAndAccess
93
93
  export const getInputConnectionStateByPortIdAndAccess = () => {
94
- throw new Error('not implemented')
94
+ throw new Error('Not implemented 😿 YET!! 🤩')
95
95
  }
96
96
 
97
97
  // TODO: getInputDeviceStateByPortIdAndAccess
98
98
  export const getInputDeviceStateByPortIdAndAccess = () => {
99
- throw new Error('not implemented')
99
+ throw new Error('Not implemented 😿 YET!! 🤩')
100
100
  }
101
101
 
102
102
  // TODO: getOutputConnectionStateByPortIdAndAccess
103
103
  export const getOutputConnectionStateByPortIdAndAccess = () => {
104
- throw new Error('not implemented')
104
+ throw new Error('Not implemented 😿 YET!! 🤩')
105
105
  }
106
106
 
107
107
  // TODO: getOutputDeviceStateByPortIdAndAccess
108
108
  export const getOutputDeviceStateByPortIdAndAccess = () => {
109
- throw new Error('not implemented')
109
+ throw new Error('Not implemented 😿 YET!! 🤩')
110
110
  }
@@ -18,20 +18,20 @@ export const getPortConnectionStateByPortId = (id: EMIDIPort.BothId) =>
18
18
 
19
19
  // TODO: getInputConnectionStateByPortId
20
20
  export const getInputConnectionStateByPortId = () => {
21
- throw new Error('not implemented')
21
+ throw new Error('Not implemented 😿 YET!! 🤩')
22
22
  }
23
23
 
24
24
  // TODO: getInputDeviceStateByPortId
25
25
  export const getInputDeviceStateByPortId = () => {
26
- throw new Error('not implemented')
26
+ throw new Error('Not implemented 😿 YET!! 🤩')
27
27
  }
28
28
 
29
29
  // TODO: getOutputConnectionStateByPortId
30
30
  export const getOutputConnectionStateByPortId = () => {
31
- throw new Error('not implemented')
31
+ throw new Error('Not implemented 😿 YET!! 🤩')
32
32
  }
33
33
 
34
34
  // TODO: getOutputDeviceStateByPortId
35
35
  export const getOutputDeviceStateByPortId = () => {
36
- throw new Error('not implemented')
36
+ throw new Error('Not implemented 😿 YET!! 🤩')
37
37
  }
@@ -1,29 +1,29 @@
1
1
  // TODO: matchInputConnectionStateByPortIdAndAccess
2
2
  export const matchInputConnectionStateByPortIdAndAccess = () => {
3
- throw new Error('not implemented')
3
+ throw new Error('Not implemented 😿 YET!! 🤩')
4
4
  }
5
5
 
6
6
  // TODO: matchInputDeviceStateByPortIdAndAccess
7
7
  export const matchInputDeviceStateByPortIdAndAccess = () => {
8
- throw new Error('not implemented')
8
+ throw new Error('Not implemented 😿 YET!! 🤩')
9
9
  }
10
10
 
11
11
  // TODO: matchOutputConnectionStateByPortIdAndAccess
12
12
  export const matchOutputConnectionStateByPortIdAndAccess = () => {
13
- throw new Error('not implemented')
13
+ throw new Error('Not implemented 😿 YET!! 🤩')
14
14
  }
15
15
 
16
16
  // TODO: matchOutputDeviceStateByPortIdAndAccess
17
17
  export const matchOutputDeviceStateByPortIdAndAccess = () => {
18
- throw new Error('not implemented')
18
+ throw new Error('Not implemented 😿 YET!! 🤩')
19
19
  }
20
20
 
21
21
  // TODO: matchPortConnectionStateByPortIdAndAccess
22
22
  export const matchPortConnectionStateByPortIdAndAccess = () => {
23
- throw new Error('not implemented')
23
+ throw new Error('Not implemented 😿 YET!! 🤩')
24
24
  }
25
25
 
26
26
  // TODO: matchPortDeviceStateByPortIdAndAccess
27
27
  export const matchPortDeviceStateByPortIdAndAccess = () => {
28
- throw new Error('not implemented')
28
+ throw new Error('Not implemented 😿 YET!! 🤩')
29
29
  }