@bridgething/client 0.1.2

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.
@@ -0,0 +1,3861 @@
1
+ // THIS FILE IS GENERATED BY tools/codegen. Do not edit by hand.
2
+ // Re-generate with `just codegen` (or `just typescript`).
3
+ import { newUuid } from '@bridgething/lib/uuid';
4
+ import { BridgethingClient } from './index';
5
+ export class AssetSurface {
6
+ _client;
7
+ constructor(_client) {
8
+ this._client = _client;
9
+ }
10
+ /** Subscribe to `Asset::Got` from the daemon. */
11
+ onGot(handler) {
12
+ return this._client.on(event => {
13
+ if (event.type !== 'message')
14
+ return;
15
+ const data = event.message.data;
16
+ if (data.type !== 'asset')
17
+ return;
18
+ const inner = data.data;
19
+ if (inner.event !== 'got')
20
+ return;
21
+ handler(inner.data);
22
+ });
23
+ }
24
+ /** Subscribe to `Asset::NotFound` from the daemon. */
25
+ onNotFound(handler) {
26
+ return this._client.on(event => {
27
+ if (event.type !== 'message')
28
+ return;
29
+ const data = event.message.data;
30
+ if (data.type !== 'asset')
31
+ return;
32
+ const inner = data.data;
33
+ if (inner.event !== 'notFound')
34
+ return;
35
+ handler(inner.data);
36
+ });
37
+ }
38
+ /** Subscribe to `Asset::Ready` from the daemon. */
39
+ onReady(handler) {
40
+ return this._client.on(event => {
41
+ if (event.type !== 'message')
42
+ return;
43
+ const data = event.message.data;
44
+ if (data.type !== 'asset')
45
+ return;
46
+ const inner = data.data;
47
+ if (inner.event !== 'ready')
48
+ return;
49
+ handler(inner.data);
50
+ });
51
+ }
52
+ /** Subscribe to `Asset::Cleared` from the daemon. */
53
+ onCleared(handler) {
54
+ return this._client.on(event => {
55
+ if (event.type !== 'message')
56
+ return;
57
+ const data = event.message.data;
58
+ if (data.type !== 'asset')
59
+ return;
60
+ const inner = data.data;
61
+ if (inner.event !== 'cleared')
62
+ return;
63
+ handler(inner.data);
64
+ });
65
+ }
66
+ /** Exhaustive subscribe over all inbound `Asset` variants. */
67
+ subscribe(handlers) {
68
+ return this._subscribe(handlers, false);
69
+ }
70
+ /** Same as `subscribe` but every handler is optional. */
71
+ subscribePartial(handlers) {
72
+ return this._subscribe(handlers, true);
73
+ }
74
+ _subscribe(handlers, partial) {
75
+ return this._client.on(event => {
76
+ if (event.type !== 'message')
77
+ return;
78
+ const data = event.message.data;
79
+ if (data.type !== 'asset')
80
+ return;
81
+ const inner = data.data;
82
+ switch (inner.event) {
83
+ case 'got': {
84
+ handlers.got?.(inner.data);
85
+ return;
86
+ }
87
+ case 'notFound': {
88
+ handlers.notFound?.(inner.data);
89
+ return;
90
+ }
91
+ case 'ready': {
92
+ handlers.ready?.(inner.data);
93
+ return;
94
+ }
95
+ case 'cleared': {
96
+ handlers.cleared?.(inner.data);
97
+ return;
98
+ }
99
+ default: {
100
+ if (!partial)
101
+ this._client.logger.warn('Asset: no handler for inner', inner);
102
+ return;
103
+ }
104
+ }
105
+ });
106
+ }
107
+ /** Send `Asset::Preload` to the daemon. */
108
+ async preload(payload) {
109
+ const msg = {
110
+ id: newUuid(),
111
+ meta: { kind: 'command' },
112
+ data: { type: 'asset', data: { event: 'preload', data: payload } },
113
+ };
114
+ await this._client.send(msg);
115
+ }
116
+ /** Typed request to the daemon: webapp sends, daemon responds. */
117
+ async get(req, options) {
118
+ const wireData = { type: 'asset', data: { event: 'get', data: req } };
119
+ const response = await this._client.request(wireData, options?.timeoutMs);
120
+ const d = response.data;
121
+ if (d.type === 'asset') {
122
+ const inner = d.data;
123
+ if (inner.event === 'got')
124
+ return { ok: true, response: inner.data };
125
+ if (inner.event === 'notFound')
126
+ return { ok: false, kind: 'domain', error: inner.data };
127
+ }
128
+ if (d.type === 'error')
129
+ return { ok: false, kind: 'protocol', error: d.data };
130
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
131
+ }
132
+ }
133
+ export class AudioSurface {
134
+ _client;
135
+ constructor(_client) {
136
+ this._client = _client;
137
+ }
138
+ /** Subscribe to `Audio::TtsStarted` from the daemon. */
139
+ onTtsStarted(handler) {
140
+ return this._client.on(event => {
141
+ if (event.type !== 'message')
142
+ return;
143
+ const data = event.message.data;
144
+ if (data.type !== 'audio')
145
+ return;
146
+ const inner = data.data;
147
+ if (inner.event !== 'ttsStarted')
148
+ return;
149
+ handler(inner.data);
150
+ });
151
+ }
152
+ /** Subscribe to `Audio::TtsEnded` from the daemon. */
153
+ onTtsEnded(handler) {
154
+ return this._client.on(event => {
155
+ if (event.type !== 'message')
156
+ return;
157
+ const data = event.message.data;
158
+ if (data.type !== 'audio')
159
+ return;
160
+ const inner = data.data;
161
+ if (inner.event !== 'ttsEnded')
162
+ return;
163
+ handler(inner.data);
164
+ });
165
+ }
166
+ /** Subscribe to `Audio::VolumeChanged` from the daemon. */
167
+ onVolumeChanged(handler) {
168
+ return this._client.on(event => {
169
+ if (event.type !== 'message')
170
+ return;
171
+ const data = event.message.data;
172
+ if (data.type !== 'audio')
173
+ return;
174
+ const inner = data.data;
175
+ if (inner.event !== 'volumeChanged')
176
+ return;
177
+ handler(inner.data);
178
+ });
179
+ }
180
+ /** Exhaustive subscribe over all inbound `Audio` variants. */
181
+ subscribe(handlers) {
182
+ return this._subscribe(handlers, false);
183
+ }
184
+ /** Same as `subscribe` but every handler is optional. */
185
+ subscribePartial(handlers) {
186
+ return this._subscribe(handlers, true);
187
+ }
188
+ _subscribe(handlers, partial) {
189
+ return this._client.on(event => {
190
+ if (event.type !== 'message')
191
+ return;
192
+ const data = event.message.data;
193
+ if (data.type !== 'audio')
194
+ return;
195
+ const inner = data.data;
196
+ switch (inner.event) {
197
+ case 'ttsStarted': {
198
+ handlers.ttsStarted?.(inner.data);
199
+ return;
200
+ }
201
+ case 'ttsEnded': {
202
+ handlers.ttsEnded?.(inner.data);
203
+ return;
204
+ }
205
+ case 'volumeChanged': {
206
+ handlers.volumeChanged?.(inner.data);
207
+ return;
208
+ }
209
+ default: {
210
+ if (!partial)
211
+ this._client.logger.warn('Audio: no handler for inner', inner);
212
+ return;
213
+ }
214
+ }
215
+ });
216
+ }
217
+ /** Send `Audio::VolumeUp` to the daemon. */
218
+ async volumeUp() {
219
+ const msg = {
220
+ id: newUuid(),
221
+ meta: { kind: 'command' },
222
+ data: { type: 'audio', data: { event: 'volumeUp' } },
223
+ };
224
+ await this._client.send(msg);
225
+ }
226
+ /** Send `Audio::VolumeDown` to the daemon. */
227
+ async volumeDown() {
228
+ const msg = {
229
+ id: newUuid(),
230
+ meta: { kind: 'command' },
231
+ data: { type: 'audio', data: { event: 'volumeDown' } },
232
+ };
233
+ await this._client.send(msg);
234
+ }
235
+ /** Send `Audio::SetVolume` to the daemon. */
236
+ async setVolume(payload) {
237
+ const msg = {
238
+ id: newUuid(),
239
+ meta: { kind: 'command' },
240
+ data: { type: 'audio', data: { event: 'setVolume', data: payload } },
241
+ };
242
+ await this._client.send(msg);
243
+ }
244
+ /** Send `Audio::MuteToggle` to the daemon. */
245
+ async muteToggle() {
246
+ const msg = {
247
+ id: newUuid(),
248
+ meta: { kind: 'command' },
249
+ data: { type: 'audio', data: { event: 'muteToggle' } },
250
+ };
251
+ await this._client.send(msg);
252
+ }
253
+ /** Send `Audio::SetMute` to the daemon. */
254
+ async setMute(payload) {
255
+ const msg = {
256
+ id: newUuid(),
257
+ meta: { kind: 'command' },
258
+ data: { type: 'audio', data: { event: 'setMute', data: payload } },
259
+ };
260
+ await this._client.send(msg);
261
+ }
262
+ /** Send `Audio::Tts` to the daemon. */
263
+ async tts(payload) {
264
+ const msg = {
265
+ id: newUuid(),
266
+ meta: { kind: 'command' },
267
+ data: { type: 'audio', data: { event: 'tts', data: payload } },
268
+ };
269
+ await this._client.send(msg);
270
+ }
271
+ /** Send `Audio::TtsCancel` to the daemon. */
272
+ async ttsCancel(payload) {
273
+ const msg = {
274
+ id: newUuid(),
275
+ meta: { kind: 'command' },
276
+ data: { type: 'audio', data: { event: 'ttsCancel', data: payload } },
277
+ };
278
+ await this._client.send(msg);
279
+ }
280
+ /** Send `Audio::TtsCancelAll` to the daemon. */
281
+ async ttsCancelAll() {
282
+ const msg = {
283
+ id: newUuid(),
284
+ meta: { kind: 'command' },
285
+ data: { type: 'audio', data: { event: 'ttsCancelAll' } },
286
+ };
287
+ await this._client.send(msg);
288
+ }
289
+ /** Send `Audio::Earcon` to the daemon. */
290
+ async earcon(payload) {
291
+ const msg = {
292
+ id: newUuid(),
293
+ meta: { kind: 'command' },
294
+ data: { type: 'audio', data: { event: 'earcon', data: payload } },
295
+ };
296
+ await this._client.send(msg);
297
+ }
298
+ }
299
+ export class BluetoothSurface {
300
+ _client;
301
+ constructor(_client) {
302
+ this._client = _client;
303
+ }
304
+ /** Subscribe to `Bluetooth::Status` from the daemon. */
305
+ onStatus(handler) {
306
+ return this._client.on(event => {
307
+ if (event.type !== 'message')
308
+ return;
309
+ const data = event.message.data;
310
+ if (data.type !== 'bluetooth')
311
+ return;
312
+ const inner = data.data;
313
+ if (inner.event !== 'status')
314
+ return;
315
+ handler(inner.data);
316
+ });
317
+ }
318
+ /** Subscribe to `Bluetooth::ConnectedDevice` from the daemon. */
319
+ onConnectedDevice(handler) {
320
+ return this._client.on(event => {
321
+ if (event.type !== 'message')
322
+ return;
323
+ const data = event.message.data;
324
+ if (data.type !== 'bluetooth')
325
+ return;
326
+ const inner = data.data;
327
+ if (inner.event !== 'connectedDevice')
328
+ return;
329
+ handler(inner.data);
330
+ });
331
+ }
332
+ /** Subscribe to `Bluetooth::Interface` from the daemon. */
333
+ onInterface(handler) {
334
+ return this._client.on(event => {
335
+ if (event.type !== 'message')
336
+ return;
337
+ const data = event.message.data;
338
+ if (data.type !== 'bluetooth')
339
+ return;
340
+ const inner = data.data;
341
+ if (inner.event !== 'interface')
342
+ return;
343
+ handler(inner.data);
344
+ });
345
+ }
346
+ /** Subscribe to `Bluetooth::PairingResult` from the daemon. */
347
+ onPairingResult(handler) {
348
+ return this._client.on(event => {
349
+ if (event.type !== 'message')
350
+ return;
351
+ const data = event.message.data;
352
+ if (data.type !== 'bluetooth')
353
+ return;
354
+ const inner = data.data;
355
+ if (inner.event !== 'pairingResult')
356
+ return;
357
+ handler(inner.data);
358
+ });
359
+ }
360
+ /** Subscribe to `Bluetooth::Pin` from the daemon. */
361
+ onPin(handler) {
362
+ return this._client.on(event => {
363
+ if (event.type !== 'message')
364
+ return;
365
+ const data = event.message.data;
366
+ if (data.type !== 'bluetooth')
367
+ return;
368
+ const inner = data.data;
369
+ if (inner.event !== 'pin')
370
+ return;
371
+ handler(inner.data);
372
+ });
373
+ }
374
+ /** Subscribe to `Bluetooth::PairedDevices` from the daemon. */
375
+ onPairedDevices(handler) {
376
+ return this._client.on(event => {
377
+ if (event.type !== 'message')
378
+ return;
379
+ const data = event.message.data;
380
+ if (data.type !== 'bluetooth')
381
+ return;
382
+ const inner = data.data;
383
+ if (inner.event !== 'pairedDevices')
384
+ return;
385
+ handler(inner.data);
386
+ });
387
+ }
388
+ /** Exhaustive subscribe over all inbound `Bluetooth` variants. */
389
+ subscribe(handlers) {
390
+ return this._subscribe(handlers, false);
391
+ }
392
+ /** Same as `subscribe` but every handler is optional. */
393
+ subscribePartial(handlers) {
394
+ return this._subscribe(handlers, true);
395
+ }
396
+ _subscribe(handlers, partial) {
397
+ return this._client.on(event => {
398
+ if (event.type !== 'message')
399
+ return;
400
+ const data = event.message.data;
401
+ if (data.type !== 'bluetooth')
402
+ return;
403
+ const inner = data.data;
404
+ switch (inner.event) {
405
+ case 'status': {
406
+ handlers.status?.(inner.data);
407
+ return;
408
+ }
409
+ case 'connectedDevice': {
410
+ handlers.connectedDevice?.(inner.data);
411
+ return;
412
+ }
413
+ case 'interface': {
414
+ handlers.interface?.(inner.data);
415
+ return;
416
+ }
417
+ case 'pairingResult': {
418
+ handlers.pairingResult?.(inner.data);
419
+ return;
420
+ }
421
+ case 'pin': {
422
+ handlers.pin?.(inner.data);
423
+ return;
424
+ }
425
+ case 'pairedDevices': {
426
+ handlers.pairedDevices?.(inner.data);
427
+ return;
428
+ }
429
+ default: {
430
+ if (!partial)
431
+ this._client.logger.warn('Bluetooth: no handler for inner', inner);
432
+ return;
433
+ }
434
+ }
435
+ });
436
+ }
437
+ /** Send `Bluetooth::Connect` to the daemon. */
438
+ async connect(payload) {
439
+ const msg = {
440
+ id: newUuid(),
441
+ meta: { kind: 'command' },
442
+ data: { type: 'bluetooth', data: { event: 'connect', data: payload } },
443
+ };
444
+ await this._client.send(msg);
445
+ }
446
+ /** Send `Bluetooth::EnableDiscoverable` to the daemon. */
447
+ async enableDiscoverable() {
448
+ const msg = {
449
+ id: newUuid(),
450
+ meta: { kind: 'command' },
451
+ data: { type: 'bluetooth', data: { event: 'enableDiscoverable' } },
452
+ };
453
+ await this._client.send(msg);
454
+ }
455
+ /** Send `Bluetooth::DisableDiscoverable` to the daemon. */
456
+ async disableDiscoverable() {
457
+ const msg = {
458
+ id: newUuid(),
459
+ meta: { kind: 'command' },
460
+ data: { type: 'bluetooth', data: { event: 'disableDiscoverable' } },
461
+ };
462
+ await this._client.send(msg);
463
+ }
464
+ /** Send `Bluetooth::Forget` to the daemon. */
465
+ async forget(payload) {
466
+ const msg = {
467
+ id: newUuid(),
468
+ meta: { kind: 'command' },
469
+ data: { type: 'bluetooth', data: { event: 'forget', data: payload } },
470
+ };
471
+ await this._client.send(msg);
472
+ }
473
+ /** Send `Bluetooth::SetAlias` to the daemon. */
474
+ async setAlias(payload) {
475
+ const msg = {
476
+ id: newUuid(),
477
+ meta: { kind: 'command' },
478
+ data: { type: 'bluetooth', data: { event: 'setAlias', data: payload } },
479
+ };
480
+ await this._client.send(msg);
481
+ }
482
+ /** Typed request to the daemon: webapp sends, daemon responds. */
483
+ async list(options) {
484
+ const wireData = { type: 'bluetooth', data: { event: 'list' } };
485
+ const response = await this._client.request(wireData, options?.timeoutMs);
486
+ const d = response.data;
487
+ if (d.type === 'bluetooth') {
488
+ const inner = d.data;
489
+ if (inner.event === 'pairedDevices')
490
+ return { ok: true, response: inner.data };
491
+ }
492
+ if (d.type === 'error')
493
+ return { ok: false, kind: 'protocol', error: d.data };
494
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
495
+ }
496
+ }
497
+ export class CapabilitiesSurface {
498
+ _client;
499
+ constructor(_client) {
500
+ this._client = _client;
501
+ }
502
+ /** Subscribe to `Capabilities::Update` from the daemon. */
503
+ onUpdate(handler) {
504
+ return this._client.on(event => {
505
+ if (event.type !== 'message')
506
+ return;
507
+ const data = event.message.data;
508
+ if (data.type !== 'capabilities')
509
+ return;
510
+ const inner = data.data;
511
+ if (inner.event !== 'update')
512
+ return;
513
+ handler(inner.data);
514
+ });
515
+ }
516
+ /** Subscribe to `Capabilities::Snapshot` from the daemon. */
517
+ onSnapshot(handler) {
518
+ return this._client.on(event => {
519
+ if (event.type !== 'message')
520
+ return;
521
+ const data = event.message.data;
522
+ if (data.type !== 'capabilities')
523
+ return;
524
+ const inner = data.data;
525
+ if (inner.event !== 'snapshot')
526
+ return;
527
+ handler(inner.data);
528
+ });
529
+ }
530
+ /** Exhaustive subscribe over all inbound `Capabilities` variants. */
531
+ subscribe(handlers) {
532
+ return this._subscribe(handlers, false);
533
+ }
534
+ /** Same as `subscribe` but every handler is optional. */
535
+ subscribePartial(handlers) {
536
+ return this._subscribe(handlers, true);
537
+ }
538
+ _subscribe(handlers, partial) {
539
+ return this._client.on(event => {
540
+ if (event.type !== 'message')
541
+ return;
542
+ const data = event.message.data;
543
+ if (data.type !== 'capabilities')
544
+ return;
545
+ const inner = data.data;
546
+ switch (inner.event) {
547
+ case 'update': {
548
+ handlers.update?.(inner.data);
549
+ return;
550
+ }
551
+ case 'snapshot': {
552
+ handlers.snapshot?.(inner.data);
553
+ return;
554
+ }
555
+ default: {
556
+ if (!partial)
557
+ this._client.logger.warn('Capabilities: no handler for inner', inner);
558
+ return;
559
+ }
560
+ }
561
+ });
562
+ }
563
+ /** Typed request to the daemon: webapp sends, daemon responds. */
564
+ async get(options) {
565
+ const wireData = { type: 'capabilities', data: { event: 'get' } };
566
+ const response = await this._client.request(wireData, options?.timeoutMs);
567
+ const d = response.data;
568
+ if (d.type === 'capabilities') {
569
+ const inner = d.data;
570
+ if (inner.event === 'snapshot')
571
+ return { ok: true, response: inner.data };
572
+ }
573
+ if (d.type === 'error')
574
+ return { ok: false, kind: 'protocol', error: d.data };
575
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
576
+ }
577
+ }
578
+ export class ConfigSurface {
579
+ _client;
580
+ constructor(_client) {
581
+ this._client = _client;
582
+ }
583
+ /** Subscribe to `Config::Get` from the daemon. */
584
+ onGet(handler) {
585
+ return this._client.on(event => {
586
+ if (event.type !== 'message')
587
+ return;
588
+ const data = event.message.data;
589
+ if (data.type !== 'config')
590
+ return;
591
+ const inner = data.data;
592
+ if (inner.event !== 'get')
593
+ return;
594
+ handler(inner.data);
595
+ });
596
+ }
597
+ /** Subscribe to `Config::List` from the daemon. */
598
+ onList(handler) {
599
+ return this._client.on(event => {
600
+ if (event.type !== 'message')
601
+ return;
602
+ const data = event.message.data;
603
+ if (data.type !== 'config')
604
+ return;
605
+ const inner = data.data;
606
+ if (inner.event !== 'list')
607
+ return;
608
+ handler(inner.data);
609
+ });
610
+ }
611
+ /** Subscribe to `Config::Changed` from the daemon. */
612
+ onChanged(handler) {
613
+ return this._client.on(event => {
614
+ if (event.type !== 'message')
615
+ return;
616
+ const data = event.message.data;
617
+ if (data.type !== 'config')
618
+ return;
619
+ const inner = data.data;
620
+ if (inner.event !== 'changed')
621
+ return;
622
+ handler(inner.data);
623
+ });
624
+ }
625
+ /** Exhaustive subscribe over all inbound `Config` variants. */
626
+ subscribe(handlers) {
627
+ return this._subscribe(handlers, false);
628
+ }
629
+ /** Same as `subscribe` but every handler is optional. */
630
+ subscribePartial(handlers) {
631
+ return this._subscribe(handlers, true);
632
+ }
633
+ _subscribe(handlers, partial) {
634
+ return this._client.on(event => {
635
+ if (event.type !== 'message')
636
+ return;
637
+ const data = event.message.data;
638
+ if (data.type !== 'config')
639
+ return;
640
+ const inner = data.data;
641
+ switch (inner.event) {
642
+ case 'get': {
643
+ handlers.get?.(inner.data);
644
+ return;
645
+ }
646
+ case 'list': {
647
+ handlers.list?.(inner.data);
648
+ return;
649
+ }
650
+ case 'changed': {
651
+ handlers.changed?.(inner.data);
652
+ return;
653
+ }
654
+ default: {
655
+ if (!partial)
656
+ this._client.logger.warn('Config: no handler for inner', inner);
657
+ return;
658
+ }
659
+ }
660
+ });
661
+ }
662
+ /** Typed request to the daemon: webapp sends, daemon responds. */
663
+ async get(req, options) {
664
+ const wireData = { type: 'config', data: { event: 'get', data: req } };
665
+ const response = await this._client.request(wireData, options?.timeoutMs);
666
+ const d = response.data;
667
+ if (d.type === 'config') {
668
+ const inner = d.data;
669
+ if (inner.event === 'get')
670
+ return { ok: true, response: inner.data };
671
+ }
672
+ if (d.type === 'error')
673
+ return { ok: false, kind: 'protocol', error: d.data };
674
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
675
+ }
676
+ /** Typed request to the daemon: webapp sends, daemon responds. */
677
+ async list(options) {
678
+ const wireData = { type: 'config', data: { event: 'list' } };
679
+ const response = await this._client.request(wireData, options?.timeoutMs);
680
+ const d = response.data;
681
+ if (d.type === 'config') {
682
+ const inner = d.data;
683
+ if (inner.event === 'list')
684
+ return { ok: true, response: inner.data };
685
+ }
686
+ if (d.type === 'error')
687
+ return { ok: false, kind: 'protocol', error: d.data };
688
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
689
+ }
690
+ }
691
+ export class GeoSurface {
692
+ _client;
693
+ constructor(_client) {
694
+ this._client = _client;
695
+ }
696
+ /** Subscribe to `Geo::Position` from the daemon. */
697
+ onPosition(handler) {
698
+ return this._client.on(event => {
699
+ if (event.type !== 'message')
700
+ return;
701
+ const data = event.message.data;
702
+ if (data.type !== 'geo')
703
+ return;
704
+ const inner = data.data;
705
+ if (inner.event !== 'position')
706
+ return;
707
+ handler(inner.data);
708
+ });
709
+ }
710
+ /** Subscribe to `Geo::WatchReply` from the daemon. */
711
+ onWatchReply(handler) {
712
+ return this._client.on(event => {
713
+ if (event.type !== 'message')
714
+ return;
715
+ const data = event.message.data;
716
+ if (data.type !== 'geo')
717
+ return;
718
+ const inner = data.data;
719
+ if (inner.event !== 'watchReply')
720
+ return;
721
+ handler(inner.data);
722
+ });
723
+ }
724
+ /** Subscribe to `Geo::GetOnceReply` from the daemon. */
725
+ onGetOnceReply(handler) {
726
+ return this._client.on(event => {
727
+ if (event.type !== 'message')
728
+ return;
729
+ const data = event.message.data;
730
+ if (data.type !== 'geo')
731
+ return;
732
+ const inner = data.data;
733
+ if (inner.event !== 'getOnceReply')
734
+ return;
735
+ handler(inner.data);
736
+ });
737
+ }
738
+ /** Subscribe to `Geo::ErrorReply` from the daemon. */
739
+ onErrorReply(handler) {
740
+ return this._client.on(event => {
741
+ if (event.type !== 'message')
742
+ return;
743
+ const data = event.message.data;
744
+ if (data.type !== 'geo')
745
+ return;
746
+ const inner = data.data;
747
+ if (inner.event !== 'errorReply')
748
+ return;
749
+ handler(inner.data);
750
+ });
751
+ }
752
+ /** Exhaustive subscribe over all inbound `Geo` variants. */
753
+ subscribe(handlers) {
754
+ return this._subscribe(handlers, false);
755
+ }
756
+ /** Same as `subscribe` but every handler is optional. */
757
+ subscribePartial(handlers) {
758
+ return this._subscribe(handlers, true);
759
+ }
760
+ _subscribe(handlers, partial) {
761
+ return this._client.on(event => {
762
+ if (event.type !== 'message')
763
+ return;
764
+ const data = event.message.data;
765
+ if (data.type !== 'geo')
766
+ return;
767
+ const inner = data.data;
768
+ switch (inner.event) {
769
+ case 'position': {
770
+ handlers.position?.(inner.data);
771
+ return;
772
+ }
773
+ case 'watchReply': {
774
+ handlers.watchReply?.(inner.data);
775
+ return;
776
+ }
777
+ case 'getOnceReply': {
778
+ handlers.getOnceReply?.(inner.data);
779
+ return;
780
+ }
781
+ case 'errorReply': {
782
+ handlers.errorReply?.(inner.data);
783
+ return;
784
+ }
785
+ default: {
786
+ if (!partial)
787
+ this._client.logger.warn('Geo: no handler for inner', inner);
788
+ return;
789
+ }
790
+ }
791
+ });
792
+ }
793
+ /** Send `Geo::Unwatch` to the daemon. */
794
+ async unwatch(payload) {
795
+ const msg = {
796
+ id: newUuid(),
797
+ meta: { kind: 'command' },
798
+ data: { type: 'geo', data: { event: 'unwatch', data: payload } },
799
+ };
800
+ await this._client.send(msg);
801
+ }
802
+ /** Typed request to the daemon: webapp sends, daemon responds. */
803
+ async watch(req, options) {
804
+ const wireData = { type: 'geo', data: { event: 'watch', data: req } };
805
+ const response = await this._client.request(wireData, options?.timeoutMs);
806
+ const d = response.data;
807
+ if (d.type === 'geo') {
808
+ const inner = d.data;
809
+ if (inner.event === 'watchReply')
810
+ return { ok: true, response: inner.data };
811
+ if (inner.event === 'errorReply')
812
+ return { ok: false, kind: 'domain', error: inner.data };
813
+ }
814
+ if (d.type === 'error')
815
+ return { ok: false, kind: 'protocol', error: d.data };
816
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
817
+ }
818
+ /** Typed request to the daemon: webapp sends, daemon responds. */
819
+ async getOnce(req, options) {
820
+ const wireData = { type: 'geo', data: { event: 'getOnce', data: req } };
821
+ const response = await this._client.request(wireData, options?.timeoutMs);
822
+ const d = response.data;
823
+ if (d.type === 'geo') {
824
+ const inner = d.data;
825
+ if (inner.event === 'getOnceReply')
826
+ return { ok: true, response: inner.data };
827
+ if (inner.event === 'errorReply')
828
+ return { ok: false, kind: 'domain', error: inner.data };
829
+ }
830
+ if (d.type === 'error')
831
+ return { ok: false, kind: 'protocol', error: d.data };
832
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
833
+ }
834
+ }
835
+ export class HardwareSurface {
836
+ _client;
837
+ constructor(_client) {
838
+ this._client = _client;
839
+ }
840
+ /** Subscribe to `Hardware::AmbientLightUpdate` from the daemon. */
841
+ onAmbientLightUpdate(handler) {
842
+ return this._client.on(event => {
843
+ if (event.type !== 'message')
844
+ return;
845
+ const data = event.message.data;
846
+ if (data.type !== 'hardware')
847
+ return;
848
+ const inner = data.data;
849
+ if (inner.event !== 'ambientLightUpdate')
850
+ return;
851
+ handler(inner.data);
852
+ });
853
+ }
854
+ /** Subscribe to `Hardware::BrightnessChanged` from the daemon. */
855
+ onBrightnessChanged(handler) {
856
+ return this._client.on(event => {
857
+ if (event.type !== 'message')
858
+ return;
859
+ const data = event.message.data;
860
+ if (data.type !== 'hardware')
861
+ return;
862
+ const inner = data.data;
863
+ if (inner.event !== 'brightnessChanged')
864
+ return;
865
+ handler(inner.data);
866
+ });
867
+ }
868
+ /** Subscribe to `Hardware::StateReply` from the daemon. */
869
+ onStateReply(handler) {
870
+ return this._client.on(event => {
871
+ if (event.type !== 'message')
872
+ return;
873
+ const data = event.message.data;
874
+ if (data.type !== 'hardware')
875
+ return;
876
+ const inner = data.data;
877
+ if (inner.event !== 'stateReply')
878
+ return;
879
+ handler(inner.data);
880
+ });
881
+ }
882
+ /** Exhaustive subscribe over all inbound `Hardware` variants. */
883
+ subscribe(handlers) {
884
+ return this._subscribe(handlers, false);
885
+ }
886
+ /** Same as `subscribe` but every handler is optional. */
887
+ subscribePartial(handlers) {
888
+ return this._subscribe(handlers, true);
889
+ }
890
+ _subscribe(handlers, partial) {
891
+ return this._client.on(event => {
892
+ if (event.type !== 'message')
893
+ return;
894
+ const data = event.message.data;
895
+ if (data.type !== 'hardware')
896
+ return;
897
+ const inner = data.data;
898
+ switch (inner.event) {
899
+ case 'ambientLightUpdate': {
900
+ handlers.ambientLightUpdate?.(inner.data);
901
+ return;
902
+ }
903
+ case 'brightnessChanged': {
904
+ handlers.brightnessChanged?.(inner.data);
905
+ return;
906
+ }
907
+ case 'stateReply': {
908
+ handlers.stateReply?.(inner.data);
909
+ return;
910
+ }
911
+ default: {
912
+ if (!partial)
913
+ this._client.logger.warn('Hardware: no handler for inner', inner);
914
+ return;
915
+ }
916
+ }
917
+ });
918
+ }
919
+ /** Send `Hardware::DisplaySetMode` to the daemon. */
920
+ async displaySetMode(payload) {
921
+ const msg = {
922
+ id: newUuid(),
923
+ meta: { kind: 'command' },
924
+ data: { type: 'hardware', data: { event: 'displaySetMode', data: payload } },
925
+ };
926
+ await this._client.send(msg);
927
+ }
928
+ /** Send `Hardware::DisplaySetLevel` to the daemon. */
929
+ async displaySetLevel(payload) {
930
+ const msg = {
931
+ id: newUuid(),
932
+ meta: { kind: 'command' },
933
+ data: { type: 'hardware', data: { event: 'displaySetLevel', data: payload } },
934
+ };
935
+ await this._client.send(msg);
936
+ }
937
+ /** Typed request to the daemon: webapp sends, daemon responds. */
938
+ async stateGet(options) {
939
+ const wireData = { type: 'hardware', data: { event: 'stateGet' } };
940
+ const response = await this._client.request(wireData, options?.timeoutMs);
941
+ const d = response.data;
942
+ if (d.type === 'hardware') {
943
+ const inner = d.data;
944
+ if (inner.event === 'stateReply')
945
+ return { ok: true, response: inner.data };
946
+ }
947
+ if (d.type === 'error')
948
+ return { ok: false, kind: 'protocol', error: d.data };
949
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
950
+ }
951
+ }
952
+ export class LibrarySurface {
953
+ _client;
954
+ constructor(_client) {
955
+ this._client = _client;
956
+ }
957
+ /** Subscribe to `Library::BrowseReply` from the daemon. */
958
+ onBrowseReply(handler) {
959
+ return this._client.on(event => {
960
+ if (event.type !== 'message')
961
+ return;
962
+ const data = event.message.data;
963
+ if (data.type !== 'library')
964
+ return;
965
+ const inner = data.data;
966
+ if (inner.event !== 'browseReply')
967
+ return;
968
+ handler(inner.data);
969
+ });
970
+ }
971
+ /** Subscribe to `Library::SearchReply` from the daemon. */
972
+ onSearchReply(handler) {
973
+ return this._client.on(event => {
974
+ if (event.type !== 'message')
975
+ return;
976
+ const data = event.message.data;
977
+ if (data.type !== 'library')
978
+ return;
979
+ const inner = data.data;
980
+ if (inner.event !== 'searchReply')
981
+ return;
982
+ handler(inner.data);
983
+ });
984
+ }
985
+ /** Subscribe to `Library::RecommendationsReply` from the daemon. */
986
+ onRecommendationsReply(handler) {
987
+ return this._client.on(event => {
988
+ if (event.type !== 'message')
989
+ return;
990
+ const data = event.message.data;
991
+ if (data.type !== 'library')
992
+ return;
993
+ const inner = data.data;
994
+ if (inner.event !== 'recommendationsReply')
995
+ return;
996
+ handler(inner.data);
997
+ });
998
+ }
999
+ /** Subscribe to `Library::FavoritesListReply` from the daemon. */
1000
+ onFavoritesListReply(handler) {
1001
+ return this._client.on(event => {
1002
+ if (event.type !== 'message')
1003
+ return;
1004
+ const data = event.message.data;
1005
+ if (data.type !== 'library')
1006
+ return;
1007
+ const inner = data.data;
1008
+ if (inner.event !== 'favoritesListReply')
1009
+ return;
1010
+ handler(inner.data);
1011
+ });
1012
+ }
1013
+ /** Subscribe to `Library::FavoritesContainsReply` from the daemon. */
1014
+ onFavoritesContainsReply(handler) {
1015
+ return this._client.on(event => {
1016
+ if (event.type !== 'message')
1017
+ return;
1018
+ const data = event.message.data;
1019
+ if (data.type !== 'library')
1020
+ return;
1021
+ const inner = data.data;
1022
+ if (inner.event !== 'favoritesContainsReply')
1023
+ return;
1024
+ handler(inner.data);
1025
+ });
1026
+ }
1027
+ /** Subscribe to `Library::LibraryErrorReply` from the daemon. */
1028
+ onLibraryErrorReply(handler) {
1029
+ return this._client.on(event => {
1030
+ if (event.type !== 'message')
1031
+ return;
1032
+ const data = event.message.data;
1033
+ if (data.type !== 'library')
1034
+ return;
1035
+ const inner = data.data;
1036
+ if (inner.event !== 'libraryErrorReply')
1037
+ return;
1038
+ handler(inner.data);
1039
+ });
1040
+ }
1041
+ /** Subscribe to `Library::FavoriteChanged` from the daemon. */
1042
+ onFavoriteChanged(handler) {
1043
+ return this._client.on(event => {
1044
+ if (event.type !== 'message')
1045
+ return;
1046
+ const data = event.message.data;
1047
+ if (data.type !== 'library')
1048
+ return;
1049
+ const inner = data.data;
1050
+ if (inner.event !== 'favoriteChanged')
1051
+ return;
1052
+ handler(inner.data);
1053
+ });
1054
+ }
1055
+ /** Exhaustive subscribe over all inbound `Library` variants. */
1056
+ subscribe(handlers) {
1057
+ return this._subscribe(handlers, false);
1058
+ }
1059
+ /** Same as `subscribe` but every handler is optional. */
1060
+ subscribePartial(handlers) {
1061
+ return this._subscribe(handlers, true);
1062
+ }
1063
+ _subscribe(handlers, partial) {
1064
+ return this._client.on(event => {
1065
+ if (event.type !== 'message')
1066
+ return;
1067
+ const data = event.message.data;
1068
+ if (data.type !== 'library')
1069
+ return;
1070
+ const inner = data.data;
1071
+ switch (inner.event) {
1072
+ case 'browseReply': {
1073
+ handlers.browseReply?.(inner.data);
1074
+ return;
1075
+ }
1076
+ case 'searchReply': {
1077
+ handlers.searchReply?.(inner.data);
1078
+ return;
1079
+ }
1080
+ case 'recommendationsReply': {
1081
+ handlers.recommendationsReply?.(inner.data);
1082
+ return;
1083
+ }
1084
+ case 'favoritesListReply': {
1085
+ handlers.favoritesListReply?.(inner.data);
1086
+ return;
1087
+ }
1088
+ case 'favoritesContainsReply': {
1089
+ handlers.favoritesContainsReply?.(inner.data);
1090
+ return;
1091
+ }
1092
+ case 'libraryErrorReply': {
1093
+ handlers.libraryErrorReply?.(inner.data);
1094
+ return;
1095
+ }
1096
+ case 'favoriteChanged': {
1097
+ handlers.favoriteChanged?.(inner.data);
1098
+ return;
1099
+ }
1100
+ default: {
1101
+ if (!partial)
1102
+ this._client.logger.warn('Library: no handler for inner', inner);
1103
+ return;
1104
+ }
1105
+ }
1106
+ });
1107
+ }
1108
+ /** Send `Library::FavoritesToggle` to the daemon. */
1109
+ async favoritesToggle(payload) {
1110
+ const msg = {
1111
+ id: newUuid(),
1112
+ meta: { kind: 'command' },
1113
+ data: { type: 'library', data: { event: 'favoritesToggle', data: payload } },
1114
+ };
1115
+ await this._client.send(msg);
1116
+ }
1117
+ /** Send `Library::FavoritesSet` to the daemon. */
1118
+ async favoritesSet(payload) {
1119
+ const msg = {
1120
+ id: newUuid(),
1121
+ meta: { kind: 'command' },
1122
+ data: { type: 'library', data: { event: 'favoritesSet', data: payload } },
1123
+ };
1124
+ await this._client.send(msg);
1125
+ }
1126
+ /** Send `Library::FavoritesSetMany` to the daemon. */
1127
+ async favoritesSetMany(payload) {
1128
+ const msg = {
1129
+ id: newUuid(),
1130
+ meta: { kind: 'command' },
1131
+ data: { type: 'library', data: { event: 'favoritesSetMany', data: payload } },
1132
+ };
1133
+ await this._client.send(msg);
1134
+ }
1135
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1136
+ async browse(req, options) {
1137
+ const wireData = { type: 'library', data: { event: 'browse', data: req } };
1138
+ const response = await this._client.request(wireData, options?.timeoutMs);
1139
+ const d = response.data;
1140
+ if (d.type === 'library') {
1141
+ const inner = d.data;
1142
+ if (inner.event === 'browseReply')
1143
+ return { ok: true, response: inner.data };
1144
+ if (inner.event === 'libraryErrorReply')
1145
+ return { ok: false, kind: 'domain', error: inner.data };
1146
+ }
1147
+ if (d.type === 'error')
1148
+ return { ok: false, kind: 'protocol', error: d.data };
1149
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1150
+ }
1151
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1152
+ async search(req, options) {
1153
+ const wireData = { type: 'library', data: { event: 'search', data: req } };
1154
+ const response = await this._client.request(wireData, options?.timeoutMs);
1155
+ const d = response.data;
1156
+ if (d.type === 'library') {
1157
+ const inner = d.data;
1158
+ if (inner.event === 'searchReply')
1159
+ return { ok: true, response: inner.data };
1160
+ if (inner.event === 'libraryErrorReply')
1161
+ return { ok: false, kind: 'domain', error: inner.data };
1162
+ }
1163
+ if (d.type === 'error')
1164
+ return { ok: false, kind: 'protocol', error: d.data };
1165
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1166
+ }
1167
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1168
+ async recommendations(req, options) {
1169
+ const wireData = { type: 'library', data: { event: 'recommendations', data: req } };
1170
+ const response = await this._client.request(wireData, options?.timeoutMs);
1171
+ const d = response.data;
1172
+ if (d.type === 'library') {
1173
+ const inner = d.data;
1174
+ if (inner.event === 'recommendationsReply')
1175
+ return { ok: true, response: inner.data };
1176
+ if (inner.event === 'libraryErrorReply')
1177
+ return { ok: false, kind: 'domain', error: inner.data };
1178
+ }
1179
+ if (d.type === 'error')
1180
+ return { ok: false, kind: 'protocol', error: d.data };
1181
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1182
+ }
1183
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1184
+ async favoritesList(req, options) {
1185
+ const wireData = { type: 'library', data: { event: 'favoritesList', data: req } };
1186
+ const response = await this._client.request(wireData, options?.timeoutMs);
1187
+ const d = response.data;
1188
+ if (d.type === 'library') {
1189
+ const inner = d.data;
1190
+ if (inner.event === 'favoritesListReply')
1191
+ return { ok: true, response: inner.data };
1192
+ if (inner.event === 'libraryErrorReply')
1193
+ return { ok: false, kind: 'domain', error: inner.data };
1194
+ }
1195
+ if (d.type === 'error')
1196
+ return { ok: false, kind: 'protocol', error: d.data };
1197
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1198
+ }
1199
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1200
+ async favoritesContains(req, options) {
1201
+ const wireData = { type: 'library', data: { event: 'favoritesContains', data: req } };
1202
+ const response = await this._client.request(wireData, options?.timeoutMs);
1203
+ const d = response.data;
1204
+ if (d.type === 'library') {
1205
+ const inner = d.data;
1206
+ if (inner.event === 'favoritesContainsReply')
1207
+ return { ok: true, response: inner.data };
1208
+ if (inner.event === 'libraryErrorReply')
1209
+ return { ok: false, kind: 'domain', error: inner.data };
1210
+ }
1211
+ if (d.type === 'error')
1212
+ return { ok: false, kind: 'protocol', error: d.data };
1213
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1214
+ }
1215
+ }
1216
+ export class NetSurface {
1217
+ _client;
1218
+ constructor(_client) {
1219
+ this._client = _client;
1220
+ }
1221
+ /** Subscribe to `Net::FetchReply` from the daemon. */
1222
+ onFetchReply(handler) {
1223
+ return this._client.on(event => {
1224
+ if (event.type !== 'message')
1225
+ return;
1226
+ const data = event.message.data;
1227
+ if (data.type !== 'net')
1228
+ return;
1229
+ const inner = data.data;
1230
+ if (inner.event !== 'fetchReply')
1231
+ return;
1232
+ handler(inner.data);
1233
+ });
1234
+ }
1235
+ /** Subscribe to `Net::FetchErrorReply` from the daemon. */
1236
+ onFetchErrorReply(handler) {
1237
+ return this._client.on(event => {
1238
+ if (event.type !== 'message')
1239
+ return;
1240
+ const data = event.message.data;
1241
+ if (data.type !== 'net')
1242
+ return;
1243
+ const inner = data.data;
1244
+ if (inner.event !== 'fetchErrorReply')
1245
+ return;
1246
+ handler(inner.data);
1247
+ });
1248
+ }
1249
+ /** Subscribe to `Net::WsOpenReply` from the daemon. */
1250
+ onWsOpenReply(handler) {
1251
+ return this._client.on(event => {
1252
+ if (event.type !== 'message')
1253
+ return;
1254
+ const data = event.message.data;
1255
+ if (data.type !== 'net')
1256
+ return;
1257
+ const inner = data.data;
1258
+ if (inner.event !== 'wsOpenReply')
1259
+ return;
1260
+ handler(inner.data);
1261
+ });
1262
+ }
1263
+ /** Subscribe to `Net::WsErrorReply` from the daemon. */
1264
+ onWsErrorReply(handler) {
1265
+ return this._client.on(event => {
1266
+ if (event.type !== 'message')
1267
+ return;
1268
+ const data = event.message.data;
1269
+ if (data.type !== 'net')
1270
+ return;
1271
+ const inner = data.data;
1272
+ if (inner.event !== 'wsErrorReply')
1273
+ return;
1274
+ handler(inner.data);
1275
+ });
1276
+ }
1277
+ /** Subscribe to `Net::WsMessage` from the daemon. */
1278
+ onWsMessage(handler) {
1279
+ return this._client.on(event => {
1280
+ if (event.type !== 'message')
1281
+ return;
1282
+ const data = event.message.data;
1283
+ if (data.type !== 'net')
1284
+ return;
1285
+ const inner = data.data;
1286
+ if (inner.event !== 'wsMessage')
1287
+ return;
1288
+ handler(inner.data);
1289
+ });
1290
+ }
1291
+ /** Subscribe to `Net::WsClosed` from the daemon. */
1292
+ onWsClosed(handler) {
1293
+ return this._client.on(event => {
1294
+ if (event.type !== 'message')
1295
+ return;
1296
+ const data = event.message.data;
1297
+ if (data.type !== 'net')
1298
+ return;
1299
+ const inner = data.data;
1300
+ if (inner.event !== 'wsClosed')
1301
+ return;
1302
+ handler(inner.data);
1303
+ });
1304
+ }
1305
+ /** Subscribe to `Net::WsErrorEvent` from the daemon. */
1306
+ onWsErrorEvent(handler) {
1307
+ return this._client.on(event => {
1308
+ if (event.type !== 'message')
1309
+ return;
1310
+ const data = event.message.data;
1311
+ if (data.type !== 'net')
1312
+ return;
1313
+ const inner = data.data;
1314
+ if (inner.event !== 'wsErrorEvent')
1315
+ return;
1316
+ handler(inner.data);
1317
+ });
1318
+ }
1319
+ /** Subscribe to `Net::StreamBegin` from the daemon. */
1320
+ onStreamBegin(handler) {
1321
+ return this._client.on(event => {
1322
+ if (event.type !== 'message')
1323
+ return;
1324
+ const data = event.message.data;
1325
+ if (data.type !== 'net')
1326
+ return;
1327
+ const inner = data.data;
1328
+ if (inner.event !== 'streamBegin')
1329
+ return;
1330
+ handler(inner.data);
1331
+ });
1332
+ }
1333
+ /** Subscribe to `Net::StreamChunk` from the daemon. */
1334
+ onStreamChunk(handler) {
1335
+ return this._client.on(event => {
1336
+ if (event.type !== 'message')
1337
+ return;
1338
+ const data = event.message.data;
1339
+ if (data.type !== 'net')
1340
+ return;
1341
+ const inner = data.data;
1342
+ if (inner.event !== 'streamChunk')
1343
+ return;
1344
+ handler(inner.data);
1345
+ });
1346
+ }
1347
+ /** Subscribe to `Net::StreamEnd` from the daemon. */
1348
+ onStreamEnd(handler) {
1349
+ return this._client.on(event => {
1350
+ if (event.type !== 'message')
1351
+ return;
1352
+ const data = event.message.data;
1353
+ if (data.type !== 'net')
1354
+ return;
1355
+ const inner = data.data;
1356
+ if (inner.event !== 'streamEnd')
1357
+ return;
1358
+ handler(inner.data);
1359
+ });
1360
+ }
1361
+ /** Subscribe to `Net::StreamError` from the daemon. */
1362
+ onStreamError(handler) {
1363
+ return this._client.on(event => {
1364
+ if (event.type !== 'message')
1365
+ return;
1366
+ const data = event.message.data;
1367
+ if (data.type !== 'net')
1368
+ return;
1369
+ const inner = data.data;
1370
+ if (inner.event !== 'streamError')
1371
+ return;
1372
+ handler(inner.data);
1373
+ });
1374
+ }
1375
+ /** Exhaustive subscribe over all inbound `Net` variants. */
1376
+ subscribe(handlers) {
1377
+ return this._subscribe(handlers, false);
1378
+ }
1379
+ /** Same as `subscribe` but every handler is optional. */
1380
+ subscribePartial(handlers) {
1381
+ return this._subscribe(handlers, true);
1382
+ }
1383
+ _subscribe(handlers, partial) {
1384
+ return this._client.on(event => {
1385
+ if (event.type !== 'message')
1386
+ return;
1387
+ const data = event.message.data;
1388
+ if (data.type !== 'net')
1389
+ return;
1390
+ const inner = data.data;
1391
+ switch (inner.event) {
1392
+ case 'fetchReply': {
1393
+ handlers.fetchReply?.(inner.data);
1394
+ return;
1395
+ }
1396
+ case 'fetchErrorReply': {
1397
+ handlers.fetchErrorReply?.(inner.data);
1398
+ return;
1399
+ }
1400
+ case 'wsOpenReply': {
1401
+ handlers.wsOpenReply?.(inner.data);
1402
+ return;
1403
+ }
1404
+ case 'wsErrorReply': {
1405
+ handlers.wsErrorReply?.(inner.data);
1406
+ return;
1407
+ }
1408
+ case 'wsMessage': {
1409
+ handlers.wsMessage?.(inner.data);
1410
+ return;
1411
+ }
1412
+ case 'wsClosed': {
1413
+ handlers.wsClosed?.(inner.data);
1414
+ return;
1415
+ }
1416
+ case 'wsErrorEvent': {
1417
+ handlers.wsErrorEvent?.(inner.data);
1418
+ return;
1419
+ }
1420
+ case 'streamBegin': {
1421
+ handlers.streamBegin?.(inner.data);
1422
+ return;
1423
+ }
1424
+ case 'streamChunk': {
1425
+ handlers.streamChunk?.(inner.data);
1426
+ return;
1427
+ }
1428
+ case 'streamEnd': {
1429
+ handlers.streamEnd?.(inner.data);
1430
+ return;
1431
+ }
1432
+ case 'streamError': {
1433
+ handlers.streamError?.(inner.data);
1434
+ return;
1435
+ }
1436
+ default: {
1437
+ if (!partial)
1438
+ this._client.logger.warn('Net: no handler for inner', inner);
1439
+ return;
1440
+ }
1441
+ }
1442
+ });
1443
+ }
1444
+ /** Send `Net::WsClose` to the daemon. */
1445
+ async wsClose(payload) {
1446
+ const msg = {
1447
+ id: newUuid(),
1448
+ meta: { kind: 'command' },
1449
+ data: { type: 'net', data: { event: 'wsClose', data: payload } },
1450
+ };
1451
+ await this._client.send(msg);
1452
+ }
1453
+ /** Send `Net::WsSend` to the daemon. */
1454
+ async wsSend(payload) {
1455
+ const msg = {
1456
+ id: newUuid(),
1457
+ meta: { kind: 'command' },
1458
+ data: { type: 'net', data: { event: 'wsSend', data: payload } },
1459
+ };
1460
+ await this._client.send(msg);
1461
+ }
1462
+ /** Send `Net::StreamOpen` to the daemon. */
1463
+ async streamOpen(payload) {
1464
+ const msg = {
1465
+ id: newUuid(),
1466
+ meta: { kind: 'command' },
1467
+ data: { type: 'net', data: { event: 'streamOpen', data: payload } },
1468
+ };
1469
+ await this._client.send(msg);
1470
+ }
1471
+ /** Send `Net::StreamCancel` to the daemon. */
1472
+ async streamCancel(payload) {
1473
+ const msg = {
1474
+ id: newUuid(),
1475
+ meta: { kind: 'command' },
1476
+ data: { type: 'net', data: { event: 'streamCancel', data: payload } },
1477
+ };
1478
+ await this._client.send(msg);
1479
+ }
1480
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1481
+ async fetch(req, options) {
1482
+ const wireData = { type: 'net', data: { event: 'fetch', data: req } };
1483
+ const response = await this._client.request(wireData, options?.timeoutMs);
1484
+ const d = response.data;
1485
+ if (d.type === 'net') {
1486
+ const inner = d.data;
1487
+ if (inner.event === 'fetchReply')
1488
+ return { ok: true, response: inner.data };
1489
+ if (inner.event === 'fetchErrorReply')
1490
+ return { ok: false, kind: 'domain', error: inner.data };
1491
+ }
1492
+ if (d.type === 'error')
1493
+ return { ok: false, kind: 'protocol', error: d.data };
1494
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1495
+ }
1496
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1497
+ async wsOpen(req, options) {
1498
+ const wireData = { type: 'net', data: { event: 'wsOpen', data: req } };
1499
+ const response = await this._client.request(wireData, options?.timeoutMs);
1500
+ const d = response.data;
1501
+ if (d.type === 'net') {
1502
+ const inner = d.data;
1503
+ if (inner.event === 'wsOpenReply')
1504
+ return { ok: true, response: inner.data };
1505
+ if (inner.event === 'wsErrorReply')
1506
+ return { ok: false, kind: 'domain', error: inner.data };
1507
+ }
1508
+ if (d.type === 'error')
1509
+ return { ok: false, kind: 'protocol', error: d.data };
1510
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1511
+ }
1512
+ }
1513
+ export class NotificationsSurface {
1514
+ _client;
1515
+ constructor(_client) {
1516
+ this._client = _client;
1517
+ }
1518
+ /** Subscribe to `Notifications::Posted` from the daemon. */
1519
+ onPosted(handler) {
1520
+ return this._client.on(event => {
1521
+ if (event.type !== 'message')
1522
+ return;
1523
+ const data = event.message.data;
1524
+ if (data.type !== 'notifications')
1525
+ return;
1526
+ const inner = data.data;
1527
+ if (inner.event !== 'posted')
1528
+ return;
1529
+ handler(inner.data);
1530
+ });
1531
+ }
1532
+ /** Subscribe to `Notifications::Updated` from the daemon. */
1533
+ onUpdated(handler) {
1534
+ return this._client.on(event => {
1535
+ if (event.type !== 'message')
1536
+ return;
1537
+ const data = event.message.data;
1538
+ if (data.type !== 'notifications')
1539
+ return;
1540
+ const inner = data.data;
1541
+ if (inner.event !== 'updated')
1542
+ return;
1543
+ handler(inner.data);
1544
+ });
1545
+ }
1546
+ /** Subscribe to `Notifications::Removed` from the daemon. */
1547
+ onRemoved(handler) {
1548
+ return this._client.on(event => {
1549
+ if (event.type !== 'message')
1550
+ return;
1551
+ const data = event.message.data;
1552
+ if (data.type !== 'notifications')
1553
+ return;
1554
+ const inner = data.data;
1555
+ if (inner.event !== 'removed')
1556
+ return;
1557
+ handler(inner.data);
1558
+ });
1559
+ }
1560
+ /** Exhaustive subscribe over all inbound `Notifications` variants. */
1561
+ subscribe(handlers) {
1562
+ return this._subscribe(handlers, false);
1563
+ }
1564
+ /** Same as `subscribe` but every handler is optional. */
1565
+ subscribePartial(handlers) {
1566
+ return this._subscribe(handlers, true);
1567
+ }
1568
+ _subscribe(handlers, partial) {
1569
+ return this._client.on(event => {
1570
+ if (event.type !== 'message')
1571
+ return;
1572
+ const data = event.message.data;
1573
+ if (data.type !== 'notifications')
1574
+ return;
1575
+ const inner = data.data;
1576
+ switch (inner.event) {
1577
+ case 'posted': {
1578
+ handlers.posted?.(inner.data);
1579
+ return;
1580
+ }
1581
+ case 'updated': {
1582
+ handlers.updated?.(inner.data);
1583
+ return;
1584
+ }
1585
+ case 'removed': {
1586
+ handlers.removed?.(inner.data);
1587
+ return;
1588
+ }
1589
+ default: {
1590
+ if (!partial)
1591
+ this._client.logger.warn('Notifications: no handler for inner', inner);
1592
+ return;
1593
+ }
1594
+ }
1595
+ });
1596
+ }
1597
+ /** Send `Notifications::InvokePositive` to the daemon. */
1598
+ async invokePositive(payload) {
1599
+ const msg = {
1600
+ id: newUuid(),
1601
+ meta: { kind: 'command' },
1602
+ data: { type: 'notifications', data: { event: 'invokePositive', data: payload } },
1603
+ };
1604
+ await this._client.send(msg);
1605
+ }
1606
+ /** Send `Notifications::InvokeNegative` to the daemon. */
1607
+ async invokeNegative(payload) {
1608
+ const msg = {
1609
+ id: newUuid(),
1610
+ meta: { kind: 'command' },
1611
+ data: { type: 'notifications', data: { event: 'invokeNegative', data: payload } },
1612
+ };
1613
+ await this._client.send(msg);
1614
+ }
1615
+ }
1616
+ export class PeerSurface {
1617
+ _client;
1618
+ constructor(_client) {
1619
+ this._client = _client;
1620
+ }
1621
+ /** Subscribe to `Peer::Snapshot` from the daemon. */
1622
+ onSnapshot(handler) {
1623
+ return this._client.on(event => {
1624
+ if (event.type !== 'message')
1625
+ return;
1626
+ const data = event.message.data;
1627
+ if (data.type !== 'peer')
1628
+ return;
1629
+ const inner = data.data;
1630
+ if (inner.event !== 'snapshot')
1631
+ return;
1632
+ handler(inner.data);
1633
+ });
1634
+ }
1635
+ }
1636
+ export class PhoneSurface {
1637
+ _client;
1638
+ constructor(_client) {
1639
+ this._client = _client;
1640
+ }
1641
+ /** Subscribe to `Phone::CallStarted` from the daemon. */
1642
+ onCallStarted(handler) {
1643
+ return this._client.on(event => {
1644
+ if (event.type !== 'message')
1645
+ return;
1646
+ const data = event.message.data;
1647
+ if (data.type !== 'phone')
1648
+ return;
1649
+ const inner = data.data;
1650
+ if (inner.event !== 'callStarted')
1651
+ return;
1652
+ handler(inner.data);
1653
+ });
1654
+ }
1655
+ /** Subscribe to `Phone::CallUpdated` from the daemon. */
1656
+ onCallUpdated(handler) {
1657
+ return this._client.on(event => {
1658
+ if (event.type !== 'message')
1659
+ return;
1660
+ const data = event.message.data;
1661
+ if (data.type !== 'phone')
1662
+ return;
1663
+ const inner = data.data;
1664
+ if (inner.event !== 'callUpdated')
1665
+ return;
1666
+ handler(inner.data);
1667
+ });
1668
+ }
1669
+ /** Subscribe to `Phone::CallEnded` from the daemon. */
1670
+ onCallEnded(handler) {
1671
+ return this._client.on(event => {
1672
+ if (event.type !== 'message')
1673
+ return;
1674
+ const data = event.message.data;
1675
+ if (data.type !== 'phone')
1676
+ return;
1677
+ const inner = data.data;
1678
+ if (inner.event !== 'callEnded')
1679
+ return;
1680
+ handler(inner.data);
1681
+ });
1682
+ }
1683
+ /** Subscribe to `Phone::CommunicationsChanged` from the daemon. */
1684
+ onCommunicationsChanged(handler) {
1685
+ return this._client.on(event => {
1686
+ if (event.type !== 'message')
1687
+ return;
1688
+ const data = event.message.data;
1689
+ if (data.type !== 'phone')
1690
+ return;
1691
+ const inner = data.data;
1692
+ if (inner.event !== 'communicationsChanged')
1693
+ return;
1694
+ handler(inner.data);
1695
+ });
1696
+ }
1697
+ /** Subscribe to `Phone::StateReply` from the daemon. */
1698
+ onStateReply(handler) {
1699
+ return this._client.on(event => {
1700
+ if (event.type !== 'message')
1701
+ return;
1702
+ const data = event.message.data;
1703
+ if (data.type !== 'phone')
1704
+ return;
1705
+ const inner = data.data;
1706
+ if (inner.event !== 'stateReply')
1707
+ return;
1708
+ handler(inner.data);
1709
+ });
1710
+ }
1711
+ /** Subscribe to `Phone::ErrorReply` from the daemon. */
1712
+ onErrorReply(handler) {
1713
+ return this._client.on(event => {
1714
+ if (event.type !== 'message')
1715
+ return;
1716
+ const data = event.message.data;
1717
+ if (data.type !== 'phone')
1718
+ return;
1719
+ const inner = data.data;
1720
+ if (inner.event !== 'errorReply')
1721
+ return;
1722
+ handler(inner.data);
1723
+ });
1724
+ }
1725
+ /** Exhaustive subscribe over all inbound `Phone` variants. */
1726
+ subscribe(handlers) {
1727
+ return this._subscribe(handlers, false);
1728
+ }
1729
+ /** Same as `subscribe` but every handler is optional. */
1730
+ subscribePartial(handlers) {
1731
+ return this._subscribe(handlers, true);
1732
+ }
1733
+ _subscribe(handlers, partial) {
1734
+ return this._client.on(event => {
1735
+ if (event.type !== 'message')
1736
+ return;
1737
+ const data = event.message.data;
1738
+ if (data.type !== 'phone')
1739
+ return;
1740
+ const inner = data.data;
1741
+ switch (inner.event) {
1742
+ case 'callStarted': {
1743
+ handlers.callStarted?.(inner.data);
1744
+ return;
1745
+ }
1746
+ case 'callUpdated': {
1747
+ handlers.callUpdated?.(inner.data);
1748
+ return;
1749
+ }
1750
+ case 'callEnded': {
1751
+ handlers.callEnded?.(inner.data);
1752
+ return;
1753
+ }
1754
+ case 'communicationsChanged': {
1755
+ handlers.communicationsChanged?.(inner.data);
1756
+ return;
1757
+ }
1758
+ case 'stateReply': {
1759
+ handlers.stateReply?.(inner.data);
1760
+ return;
1761
+ }
1762
+ case 'errorReply': {
1763
+ handlers.errorReply?.(inner.data);
1764
+ return;
1765
+ }
1766
+ default: {
1767
+ if (!partial)
1768
+ this._client.logger.warn('Phone: no handler for inner', inner);
1769
+ return;
1770
+ }
1771
+ }
1772
+ });
1773
+ }
1774
+ /** Send `Phone::Answer` to the daemon. */
1775
+ async answer(payload) {
1776
+ const msg = {
1777
+ id: newUuid(),
1778
+ meta: { kind: 'command' },
1779
+ data: { type: 'phone', data: { event: 'answer', data: payload } },
1780
+ };
1781
+ await this._client.send(msg);
1782
+ }
1783
+ /** Send `Phone::Accept` to the daemon. */
1784
+ async accept(payload) {
1785
+ const msg = {
1786
+ id: newUuid(),
1787
+ meta: { kind: 'command' },
1788
+ data: { type: 'phone', data: { event: 'accept', data: payload } },
1789
+ };
1790
+ await this._client.send(msg);
1791
+ }
1792
+ /** Send `Phone::Decline` to the daemon. */
1793
+ async decline(payload) {
1794
+ const msg = {
1795
+ id: newUuid(),
1796
+ meta: { kind: 'command' },
1797
+ data: { type: 'phone', data: { event: 'decline', data: payload } },
1798
+ };
1799
+ await this._client.send(msg);
1800
+ }
1801
+ /** Send `Phone::End` to the daemon. */
1802
+ async end(payload) {
1803
+ const msg = {
1804
+ id: newUuid(),
1805
+ meta: { kind: 'command' },
1806
+ data: { type: 'phone', data: { event: 'end', data: payload } },
1807
+ };
1808
+ await this._client.send(msg);
1809
+ }
1810
+ /** Send `Phone::EndTyped` to the daemon. */
1811
+ async endTyped(payload) {
1812
+ const msg = {
1813
+ id: newUuid(),
1814
+ meta: { kind: 'command' },
1815
+ data: { type: 'phone', data: { event: 'endTyped', data: payload } },
1816
+ };
1817
+ await this._client.send(msg);
1818
+ }
1819
+ /** Send `Phone::Hold` to the daemon. */
1820
+ async hold(payload) {
1821
+ const msg = {
1822
+ id: newUuid(),
1823
+ meta: { kind: 'command' },
1824
+ data: { type: 'phone', data: { event: 'hold', data: payload } },
1825
+ };
1826
+ await this._client.send(msg);
1827
+ }
1828
+ /** Send `Phone::Unhold` to the daemon. */
1829
+ async unhold(payload) {
1830
+ const msg = {
1831
+ id: newUuid(),
1832
+ meta: { kind: 'command' },
1833
+ data: { type: 'phone', data: { event: 'unhold', data: payload } },
1834
+ };
1835
+ await this._client.send(msg);
1836
+ }
1837
+ /** Send `Phone::Initiate` to the daemon. */
1838
+ async initiate(payload) {
1839
+ const msg = {
1840
+ id: newUuid(),
1841
+ meta: { kind: 'command' },
1842
+ data: { type: 'phone', data: { event: 'initiate', data: payload } },
1843
+ };
1844
+ await this._client.send(msg);
1845
+ }
1846
+ /** Send `Phone::Swap` to the daemon. */
1847
+ async swap() {
1848
+ const msg = {
1849
+ id: newUuid(),
1850
+ meta: { kind: 'command' },
1851
+ data: { type: 'phone', data: { event: 'swap' } },
1852
+ };
1853
+ await this._client.send(msg);
1854
+ }
1855
+ /** Send `Phone::Merge` to the daemon. */
1856
+ async merge() {
1857
+ const msg = {
1858
+ id: newUuid(),
1859
+ meta: { kind: 'command' },
1860
+ data: { type: 'phone', data: { event: 'merge' } },
1861
+ };
1862
+ await this._client.send(msg);
1863
+ }
1864
+ /** Send `Phone::Mute` to the daemon. */
1865
+ async mute(payload) {
1866
+ const msg = {
1867
+ id: newUuid(),
1868
+ meta: { kind: 'command' },
1869
+ data: { type: 'phone', data: { event: 'mute', data: payload } },
1870
+ };
1871
+ await this._client.send(msg);
1872
+ }
1873
+ /** Send `Phone::Dtmf` to the daemon. */
1874
+ async dtmf(payload) {
1875
+ const msg = {
1876
+ id: newUuid(),
1877
+ meta: { kind: 'command' },
1878
+ data: { type: 'phone', data: { event: 'dtmf', data: payload } },
1879
+ };
1880
+ await this._client.send(msg);
1881
+ }
1882
+ /** Typed request to the daemon: webapp sends, daemon responds. */
1883
+ async stateGet(options) {
1884
+ const wireData = { type: 'phone', data: { event: 'stateGet' } };
1885
+ const response = await this._client.request(wireData, options?.timeoutMs);
1886
+ const d = response.data;
1887
+ if (d.type === 'phone') {
1888
+ const inner = d.data;
1889
+ if (inner.event === 'stateReply')
1890
+ return { ok: true, response: inner.data };
1891
+ }
1892
+ if (d.type === 'error')
1893
+ return { ok: false, kind: 'protocol', error: d.data };
1894
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
1895
+ }
1896
+ }
1897
+ export class PlayerSurface {
1898
+ _client;
1899
+ constructor(_client) {
1900
+ this._client = _client;
1901
+ }
1902
+ /** Subscribe to `Player::Snapshot` from the daemon. */
1903
+ onSnapshot(handler) {
1904
+ return this._client.on(event => {
1905
+ if (event.type !== 'message')
1906
+ return;
1907
+ const data = event.message.data;
1908
+ if (data.type !== 'player')
1909
+ return;
1910
+ const inner = data.data;
1911
+ if (inner.event !== 'snapshot')
1912
+ return;
1913
+ handler(inner.data);
1914
+ });
1915
+ }
1916
+ /** Subscribe to `Player::Delta` from the daemon. */
1917
+ onDelta(handler) {
1918
+ return this._client.on(event => {
1919
+ if (event.type !== 'message')
1920
+ return;
1921
+ const data = event.message.data;
1922
+ if (data.type !== 'player')
1923
+ return;
1924
+ const inner = data.data;
1925
+ if (inner.event !== 'delta')
1926
+ return;
1927
+ handler(inner.data);
1928
+ });
1929
+ }
1930
+ /** Subscribe to `Player::QueueChanged` from the daemon. */
1931
+ onQueueChanged(handler) {
1932
+ return this._client.on(event => {
1933
+ if (event.type !== 'message')
1934
+ return;
1935
+ const data = event.message.data;
1936
+ if (data.type !== 'player')
1937
+ return;
1938
+ const inner = data.data;
1939
+ if (inner.event !== 'queueChanged')
1940
+ return;
1941
+ handler(inner.data);
1942
+ });
1943
+ }
1944
+ /** Subscribe to `Player::StateReply` from the daemon. */
1945
+ onStateReply(handler) {
1946
+ return this._client.on(event => {
1947
+ if (event.type !== 'message')
1948
+ return;
1949
+ const data = event.message.data;
1950
+ if (data.type !== 'player')
1951
+ return;
1952
+ const inner = data.data;
1953
+ if (inner.event !== 'stateReply')
1954
+ return;
1955
+ handler(inner.data);
1956
+ });
1957
+ }
1958
+ /** Subscribe to `Player::QueueReply` from the daemon. */
1959
+ onQueueReply(handler) {
1960
+ return this._client.on(event => {
1961
+ if (event.type !== 'message')
1962
+ return;
1963
+ const data = event.message.data;
1964
+ if (data.type !== 'player')
1965
+ return;
1966
+ const inner = data.data;
1967
+ if (inner.event !== 'queueReply')
1968
+ return;
1969
+ handler(inner.data);
1970
+ });
1971
+ }
1972
+ /** Subscribe to `Player::ErrorReply` from the daemon. */
1973
+ onErrorReply(handler) {
1974
+ return this._client.on(event => {
1975
+ if (event.type !== 'message')
1976
+ return;
1977
+ const data = event.message.data;
1978
+ if (data.type !== 'player')
1979
+ return;
1980
+ const inner = data.data;
1981
+ if (inner.event !== 'errorReply')
1982
+ return;
1983
+ handler(inner.data);
1984
+ });
1985
+ }
1986
+ /** Exhaustive subscribe over all inbound `Player` variants. */
1987
+ subscribe(handlers) {
1988
+ return this._subscribe(handlers, false);
1989
+ }
1990
+ /** Same as `subscribe` but every handler is optional. */
1991
+ subscribePartial(handlers) {
1992
+ return this._subscribe(handlers, true);
1993
+ }
1994
+ _subscribe(handlers, partial) {
1995
+ return this._client.on(event => {
1996
+ if (event.type !== 'message')
1997
+ return;
1998
+ const data = event.message.data;
1999
+ if (data.type !== 'player')
2000
+ return;
2001
+ const inner = data.data;
2002
+ switch (inner.event) {
2003
+ case 'snapshot': {
2004
+ handlers.snapshot?.(inner.data);
2005
+ return;
2006
+ }
2007
+ case 'delta': {
2008
+ handlers.delta?.(inner.data);
2009
+ return;
2010
+ }
2011
+ case 'queueChanged': {
2012
+ handlers.queueChanged?.(inner.data);
2013
+ return;
2014
+ }
2015
+ case 'stateReply': {
2016
+ handlers.stateReply?.(inner.data);
2017
+ return;
2018
+ }
2019
+ case 'queueReply': {
2020
+ handlers.queueReply?.(inner.data);
2021
+ return;
2022
+ }
2023
+ case 'errorReply': {
2024
+ handlers.errorReply?.(inner.data);
2025
+ return;
2026
+ }
2027
+ default: {
2028
+ if (!partial)
2029
+ this._client.logger.warn('Player: no handler for inner', inner);
2030
+ return;
2031
+ }
2032
+ }
2033
+ });
2034
+ }
2035
+ /** Send `Player::Play` to the daemon. */
2036
+ async play(payload) {
2037
+ const msg = {
2038
+ id: newUuid(),
2039
+ meta: { kind: 'command' },
2040
+ data: { type: 'player', data: { event: 'play', data: payload } },
2041
+ };
2042
+ await this._client.send(msg);
2043
+ }
2044
+ /** Send `Player::Queue` to the daemon. */
2045
+ async queue(payload) {
2046
+ const msg = {
2047
+ id: newUuid(),
2048
+ meta: { kind: 'command' },
2049
+ data: { type: 'player', data: { event: 'queue', data: payload } },
2050
+ };
2051
+ await this._client.send(msg);
2052
+ }
2053
+ /** Send `Player::Pause` to the daemon. */
2054
+ async pause() {
2055
+ const msg = {
2056
+ id: newUuid(),
2057
+ meta: { kind: 'command' },
2058
+ data: { type: 'player', data: { event: 'pause' } },
2059
+ };
2060
+ await this._client.send(msg);
2061
+ }
2062
+ /** Send `Player::Resume` to the daemon. */
2063
+ async resume() {
2064
+ const msg = {
2065
+ id: newUuid(),
2066
+ meta: { kind: 'command' },
2067
+ data: { type: 'player', data: { event: 'resume' } },
2068
+ };
2069
+ await this._client.send(msg);
2070
+ }
2071
+ /** Send `Player::SkipNext` to the daemon. */
2072
+ async skipNext() {
2073
+ const msg = {
2074
+ id: newUuid(),
2075
+ meta: { kind: 'command' },
2076
+ data: { type: 'player', data: { event: 'skipNext' } },
2077
+ };
2078
+ await this._client.send(msg);
2079
+ }
2080
+ /** Send `Player::SkipPrev` to the daemon. */
2081
+ async skipPrev(payload) {
2082
+ const msg = {
2083
+ id: newUuid(),
2084
+ meta: { kind: 'command' },
2085
+ data: { type: 'player', data: { event: 'skipPrev', data: payload } },
2086
+ };
2087
+ await this._client.send(msg);
2088
+ }
2089
+ /** Send `Player::SkipToIndex` to the daemon. */
2090
+ async skipToIndex(payload) {
2091
+ const msg = {
2092
+ id: newUuid(),
2093
+ meta: { kind: 'command' },
2094
+ data: { type: 'player', data: { event: 'skipToIndex', data: payload } },
2095
+ };
2096
+ await this._client.send(msg);
2097
+ }
2098
+ /** Send `Player::SeekTo` to the daemon. */
2099
+ async seekTo(payload) {
2100
+ const msg = {
2101
+ id: newUuid(),
2102
+ meta: { kind: 'command' },
2103
+ data: { type: 'player', data: { event: 'seekTo', data: payload } },
2104
+ };
2105
+ await this._client.send(msg);
2106
+ }
2107
+ /** Send `Player::SetShuffle` to the daemon. */
2108
+ async setShuffle(payload) {
2109
+ const msg = {
2110
+ id: newUuid(),
2111
+ meta: { kind: 'command' },
2112
+ data: { type: 'player', data: { event: 'setShuffle', data: payload } },
2113
+ };
2114
+ await this._client.send(msg);
2115
+ }
2116
+ /** Send `Player::SetRepeat` to the daemon. */
2117
+ async setRepeat(payload) {
2118
+ const msg = {
2119
+ id: newUuid(),
2120
+ meta: { kind: 'command' },
2121
+ data: { type: 'player', data: { event: 'setRepeat', data: payload } },
2122
+ };
2123
+ await this._client.send(msg);
2124
+ }
2125
+ /** Send `Player::SetSpeed` to the daemon. */
2126
+ async setSpeed(payload) {
2127
+ const msg = {
2128
+ id: newUuid(),
2129
+ meta: { kind: 'command' },
2130
+ data: { type: 'player', data: { event: 'setSpeed', data: payload } },
2131
+ };
2132
+ await this._client.send(msg);
2133
+ }
2134
+ /** Send `Player::SetCrossfade` to the daemon. */
2135
+ async setCrossfade(payload) {
2136
+ const msg = {
2137
+ id: newUuid(),
2138
+ meta: { kind: 'command' },
2139
+ data: { type: 'player', data: { event: 'setCrossfade', data: payload } },
2140
+ };
2141
+ await this._client.send(msg);
2142
+ }
2143
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2144
+ async stateGet(options) {
2145
+ const wireData = { type: 'player', data: { event: 'stateGet' } };
2146
+ const response = await this._client.request(wireData, options?.timeoutMs);
2147
+ const d = response.data;
2148
+ if (d.type === 'player') {
2149
+ const inner = d.data;
2150
+ if (inner.event === 'stateReply')
2151
+ return { ok: true, response: inner.data };
2152
+ }
2153
+ if (d.type === 'error')
2154
+ return { ok: false, kind: 'protocol', error: d.data };
2155
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2156
+ }
2157
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2158
+ async queueGet(options) {
2159
+ const wireData = { type: 'player', data: { event: 'queueGet' } };
2160
+ const response = await this._client.request(wireData, options?.timeoutMs);
2161
+ const d = response.data;
2162
+ if (d.type === 'player') {
2163
+ const inner = d.data;
2164
+ if (inner.event === 'queueReply')
2165
+ return { ok: true, response: inner.data };
2166
+ }
2167
+ if (d.type === 'error')
2168
+ return { ok: false, kind: 'protocol', error: d.data };
2169
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2170
+ }
2171
+ }
2172
+ export class SystemSurface {
2173
+ _client;
2174
+ constructor(_client) {
2175
+ this._client = _client;
2176
+ }
2177
+ /** Subscribe to `System::Version` from the daemon. */
2178
+ onVersion(handler) {
2179
+ return this._client.on(event => {
2180
+ if (event.type !== 'message')
2181
+ return;
2182
+ const data = event.message.data;
2183
+ if (data.type !== 'system')
2184
+ return;
2185
+ const inner = data.data;
2186
+ if (inner.event !== 'version')
2187
+ return;
2188
+ handler(inner.data);
2189
+ });
2190
+ }
2191
+ /** Subscribe to `System::DiagnosticsReply` from the daemon. */
2192
+ onDiagnosticsReply(handler) {
2193
+ return this._client.on(event => {
2194
+ if (event.type !== 'message')
2195
+ return;
2196
+ const data = event.message.data;
2197
+ if (data.type !== 'system')
2198
+ return;
2199
+ const inner = data.data;
2200
+ if (inner.event !== 'diagnosticsReply')
2201
+ return;
2202
+ handler(inner.data);
2203
+ });
2204
+ }
2205
+ /** Subscribe to `System::LogsTailReply` from the daemon. */
2206
+ onLogsTailReply(handler) {
2207
+ return this._client.on(event => {
2208
+ if (event.type !== 'message')
2209
+ return;
2210
+ const data = event.message.data;
2211
+ if (data.type !== 'system')
2212
+ return;
2213
+ const inner = data.data;
2214
+ if (inner.event !== 'logsTailReply')
2215
+ return;
2216
+ handler(inner.data);
2217
+ });
2218
+ }
2219
+ /** Subscribe to `System::LogsSubscribeReply` from the daemon. */
2220
+ onLogsSubscribeReply(handler) {
2221
+ return this._client.on(event => {
2222
+ if (event.type !== 'message')
2223
+ return;
2224
+ const data = event.message.data;
2225
+ if (data.type !== 'system')
2226
+ return;
2227
+ const inner = data.data;
2228
+ if (inner.event !== 'logsSubscribeReply')
2229
+ return;
2230
+ handler(inner.data);
2231
+ });
2232
+ }
2233
+ /** Subscribe to `System::LogEntry` from the daemon. */
2234
+ onLogEntry(handler) {
2235
+ return this._client.on(event => {
2236
+ if (event.type !== 'message')
2237
+ return;
2238
+ const data = event.message.data;
2239
+ if (data.type !== 'system')
2240
+ return;
2241
+ const inner = data.data;
2242
+ if (inner.event !== 'logEntry')
2243
+ return;
2244
+ handler(inner.data);
2245
+ });
2246
+ }
2247
+ /** Subscribe to `System::OtaProgress` from the daemon. */
2248
+ onOtaProgress(handler) {
2249
+ return this._client.on(event => {
2250
+ if (event.type !== 'message')
2251
+ return;
2252
+ const data = event.message.data;
2253
+ if (data.type !== 'system')
2254
+ return;
2255
+ const inner = data.data;
2256
+ if (inner.event !== 'otaProgress')
2257
+ return;
2258
+ handler(inner.data);
2259
+ });
2260
+ }
2261
+ /** Subscribe to `System::OtaError` from the daemon. */
2262
+ onOtaError(handler) {
2263
+ return this._client.on(event => {
2264
+ if (event.type !== 'message')
2265
+ return;
2266
+ const data = event.message.data;
2267
+ if (data.type !== 'system')
2268
+ return;
2269
+ const inner = data.data;
2270
+ if (inner.event !== 'otaError')
2271
+ return;
2272
+ handler(inner.data);
2273
+ });
2274
+ }
2275
+ /** Subscribe to `System::DeviceNickname` from the daemon. */
2276
+ onDeviceNickname(handler) {
2277
+ return this._client.on(event => {
2278
+ if (event.type !== 'message')
2279
+ return;
2280
+ const data = event.message.data;
2281
+ if (data.type !== 'system')
2282
+ return;
2283
+ const inner = data.data;
2284
+ if (inner.event !== 'deviceNickname')
2285
+ return;
2286
+ handler(inner.data);
2287
+ });
2288
+ }
2289
+ /** Subscribe to `System::DeviceNicknameChanged` from the daemon. */
2290
+ onDeviceNicknameChanged(handler) {
2291
+ return this._client.on(event => {
2292
+ if (event.type !== 'message')
2293
+ return;
2294
+ const data = event.message.data;
2295
+ if (data.type !== 'system')
2296
+ return;
2297
+ const inner = data.data;
2298
+ if (inner.event !== 'deviceNicknameChanged')
2299
+ return;
2300
+ handler(inner.data);
2301
+ });
2302
+ }
2303
+ /** Exhaustive subscribe over all inbound `System` variants. */
2304
+ subscribe(handlers) {
2305
+ return this._subscribe(handlers, false);
2306
+ }
2307
+ /** Same as `subscribe` but every handler is optional. */
2308
+ subscribePartial(handlers) {
2309
+ return this._subscribe(handlers, true);
2310
+ }
2311
+ _subscribe(handlers, partial) {
2312
+ return this._client.on(event => {
2313
+ if (event.type !== 'message')
2314
+ return;
2315
+ const data = event.message.data;
2316
+ if (data.type !== 'system')
2317
+ return;
2318
+ const inner = data.data;
2319
+ switch (inner.event) {
2320
+ case 'version': {
2321
+ handlers.version?.(inner.data);
2322
+ return;
2323
+ }
2324
+ case 'diagnosticsReply': {
2325
+ handlers.diagnosticsReply?.(inner.data);
2326
+ return;
2327
+ }
2328
+ case 'logsTailReply': {
2329
+ handlers.logsTailReply?.(inner.data);
2330
+ return;
2331
+ }
2332
+ case 'logsSubscribeReply': {
2333
+ handlers.logsSubscribeReply?.(inner.data);
2334
+ return;
2335
+ }
2336
+ case 'logEntry': {
2337
+ handlers.logEntry?.(inner.data);
2338
+ return;
2339
+ }
2340
+ case 'otaProgress': {
2341
+ handlers.otaProgress?.(inner.data);
2342
+ return;
2343
+ }
2344
+ case 'otaError': {
2345
+ handlers.otaError?.(inner.data);
2346
+ return;
2347
+ }
2348
+ case 'deviceNickname': {
2349
+ handlers.deviceNickname?.(inner.data);
2350
+ return;
2351
+ }
2352
+ case 'deviceNicknameChanged': {
2353
+ handlers.deviceNicknameChanged?.(inner.data);
2354
+ return;
2355
+ }
2356
+ default: {
2357
+ if (!partial)
2358
+ this._client.logger.warn('System: no handler for inner', inner);
2359
+ return;
2360
+ }
2361
+ }
2362
+ });
2363
+ }
2364
+ /** Send `System::LogsUnsubscribe` to the daemon. */
2365
+ async logsUnsubscribe(payload) {
2366
+ const msg = {
2367
+ id: newUuid(),
2368
+ meta: { kind: 'command' },
2369
+ data: { type: 'system', data: { event: 'logsUnsubscribe', data: payload } },
2370
+ };
2371
+ await this._client.send(msg);
2372
+ }
2373
+ /** Send `System::Reboot` to the daemon. */
2374
+ async reboot() {
2375
+ const msg = {
2376
+ id: newUuid(),
2377
+ meta: { kind: 'command' },
2378
+ data: { type: 'system', data: { event: 'reboot' } },
2379
+ };
2380
+ await this._client.send(msg);
2381
+ }
2382
+ /** Send `System::PowerOff` to the daemon. */
2383
+ async powerOff() {
2384
+ const msg = {
2385
+ id: newUuid(),
2386
+ meta: { kind: 'command' },
2387
+ data: { type: 'system', data: { event: 'powerOff' } },
2388
+ };
2389
+ await this._client.send(msg);
2390
+ }
2391
+ /** Send `System::FactoryReset` to the daemon. */
2392
+ async factoryReset() {
2393
+ const msg = {
2394
+ id: newUuid(),
2395
+ meta: { kind: 'command' },
2396
+ data: { type: 'system', data: { event: 'factoryReset' } },
2397
+ };
2398
+ await this._client.send(msg);
2399
+ }
2400
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2401
+ async versionRequest(options) {
2402
+ const wireData = { type: 'system', data: { event: 'versionRequest' } };
2403
+ const response = await this._client.request(wireData, options?.timeoutMs);
2404
+ const d = response.data;
2405
+ if (d.type === 'system') {
2406
+ const inner = d.data;
2407
+ if (inner.event === 'version')
2408
+ return { ok: true, response: inner.data };
2409
+ }
2410
+ if (d.type === 'error')
2411
+ return { ok: false, kind: 'protocol', error: d.data };
2412
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2413
+ }
2414
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2415
+ async diagnosticsGet(options) {
2416
+ const wireData = { type: 'system', data: { event: 'diagnosticsGet' } };
2417
+ const response = await this._client.request(wireData, options?.timeoutMs);
2418
+ const d = response.data;
2419
+ if (d.type === 'system') {
2420
+ const inner = d.data;
2421
+ if (inner.event === 'diagnosticsReply')
2422
+ return { ok: true, response: inner.data };
2423
+ }
2424
+ if (d.type === 'error')
2425
+ return { ok: false, kind: 'protocol', error: d.data };
2426
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2427
+ }
2428
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2429
+ async logsTail(req, options) {
2430
+ const wireData = { type: 'system', data: { event: 'logsTail', data: req } };
2431
+ const response = await this._client.request(wireData, options?.timeoutMs);
2432
+ const d = response.data;
2433
+ if (d.type === 'system') {
2434
+ const inner = d.data;
2435
+ if (inner.event === 'logsTailReply')
2436
+ return { ok: true, response: inner.data };
2437
+ }
2438
+ if (d.type === 'error')
2439
+ return { ok: false, kind: 'protocol', error: d.data };
2440
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2441
+ }
2442
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2443
+ async logsSubscribe(req, options) {
2444
+ const wireData = { type: 'system', data: { event: 'logsSubscribe', data: req } };
2445
+ const response = await this._client.request(wireData, options?.timeoutMs);
2446
+ const d = response.data;
2447
+ if (d.type === 'system') {
2448
+ const inner = d.data;
2449
+ if (inner.event === 'logsSubscribeReply')
2450
+ return { ok: true, response: inner.data };
2451
+ }
2452
+ if (d.type === 'error')
2453
+ return { ok: false, kind: 'protocol', error: d.data };
2454
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2455
+ }
2456
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2457
+ async deviceGetNickname(options) {
2458
+ const wireData = { type: 'system', data: { event: 'deviceGetNickname' } };
2459
+ const response = await this._client.request(wireData, options?.timeoutMs);
2460
+ const d = response.data;
2461
+ if (d.type === 'system') {
2462
+ const inner = d.data;
2463
+ if (inner.event === 'deviceNickname')
2464
+ return { ok: true, response: inner.data };
2465
+ }
2466
+ if (d.type === 'error')
2467
+ return { ok: false, kind: 'protocol', error: d.data };
2468
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2469
+ }
2470
+ }
2471
+ export class TimeSurface {
2472
+ _client;
2473
+ constructor(_client) {
2474
+ this._client = _client;
2475
+ }
2476
+ /** Subscribe to `Time::Changed` from the daemon. */
2477
+ onChanged(handler) {
2478
+ return this._client.on(event => {
2479
+ if (event.type !== 'message')
2480
+ return;
2481
+ const data = event.message.data;
2482
+ if (data.type !== 'time')
2483
+ return;
2484
+ const inner = data.data;
2485
+ if (inner.event !== 'changed')
2486
+ return;
2487
+ handler(inner.data);
2488
+ });
2489
+ }
2490
+ /** Subscribe to `Time::Snapshot` from the daemon. */
2491
+ onSnapshot(handler) {
2492
+ return this._client.on(event => {
2493
+ if (event.type !== 'message')
2494
+ return;
2495
+ const data = event.message.data;
2496
+ if (data.type !== 'time')
2497
+ return;
2498
+ const inner = data.data;
2499
+ if (inner.event !== 'snapshot')
2500
+ return;
2501
+ handler(inner.data);
2502
+ });
2503
+ }
2504
+ /** Exhaustive subscribe over all inbound `Time` variants. */
2505
+ subscribe(handlers) {
2506
+ return this._subscribe(handlers, false);
2507
+ }
2508
+ /** Same as `subscribe` but every handler is optional. */
2509
+ subscribePartial(handlers) {
2510
+ return this._subscribe(handlers, true);
2511
+ }
2512
+ _subscribe(handlers, partial) {
2513
+ return this._client.on(event => {
2514
+ if (event.type !== 'message')
2515
+ return;
2516
+ const data = event.message.data;
2517
+ if (data.type !== 'time')
2518
+ return;
2519
+ const inner = data.data;
2520
+ switch (inner.event) {
2521
+ case 'changed': {
2522
+ handlers.changed?.(inner.data);
2523
+ return;
2524
+ }
2525
+ case 'snapshot': {
2526
+ handlers.snapshot?.(inner.data);
2527
+ return;
2528
+ }
2529
+ default: {
2530
+ if (!partial)
2531
+ this._client.logger.warn('Time: no handler for inner', inner);
2532
+ return;
2533
+ }
2534
+ }
2535
+ });
2536
+ }
2537
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2538
+ async get(options) {
2539
+ const wireData = { type: 'time', data: { event: 'get' } };
2540
+ const response = await this._client.request(wireData, options?.timeoutMs);
2541
+ const d = response.data;
2542
+ if (d.type === 'time') {
2543
+ const inner = d.data;
2544
+ if (inner.event === 'snapshot')
2545
+ return { ok: true, response: inner.data };
2546
+ }
2547
+ if (d.type === 'error')
2548
+ return { ok: false, kind: 'protocol', error: d.data };
2549
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2550
+ }
2551
+ }
2552
+ export class VoiceSurface {
2553
+ _client;
2554
+ constructor(_client) {
2555
+ this._client = _client;
2556
+ }
2557
+ /** Subscribe to `Voice::StateChanged` from the daemon. */
2558
+ onStateChanged(handler) {
2559
+ return this._client.on(event => {
2560
+ if (event.type !== 'message')
2561
+ return;
2562
+ const data = event.message.data;
2563
+ if (data.type !== 'voice')
2564
+ return;
2565
+ const inner = data.data;
2566
+ if (inner.event !== 'stateChanged')
2567
+ return;
2568
+ handler(inner.data);
2569
+ });
2570
+ }
2571
+ /** Subscribe to `Voice::StateReply` from the daemon. */
2572
+ onStateReply(handler) {
2573
+ return this._client.on(event => {
2574
+ if (event.type !== 'message')
2575
+ return;
2576
+ const data = event.message.data;
2577
+ if (data.type !== 'voice')
2578
+ return;
2579
+ const inner = data.data;
2580
+ if (inner.event !== 'stateReply')
2581
+ return;
2582
+ handler(inner.data);
2583
+ });
2584
+ }
2585
+ /** Exhaustive subscribe over all inbound `Voice` variants. */
2586
+ subscribe(handlers) {
2587
+ return this._subscribe(handlers, false);
2588
+ }
2589
+ /** Same as `subscribe` but every handler is optional. */
2590
+ subscribePartial(handlers) {
2591
+ return this._subscribe(handlers, true);
2592
+ }
2593
+ _subscribe(handlers, partial) {
2594
+ return this._client.on(event => {
2595
+ if (event.type !== 'message')
2596
+ return;
2597
+ const data = event.message.data;
2598
+ if (data.type !== 'voice')
2599
+ return;
2600
+ const inner = data.data;
2601
+ switch (inner.event) {
2602
+ case 'stateChanged': {
2603
+ handlers.stateChanged?.(inner.data);
2604
+ return;
2605
+ }
2606
+ case 'stateReply': {
2607
+ handlers.stateReply?.(inner.data);
2608
+ return;
2609
+ }
2610
+ default: {
2611
+ if (!partial)
2612
+ this._client.logger.warn('Voice: no handler for inner', inner);
2613
+ return;
2614
+ }
2615
+ }
2616
+ });
2617
+ }
2618
+ /** Send `Voice::Cancel` to the daemon. */
2619
+ async cancel() {
2620
+ const msg = {
2621
+ id: newUuid(),
2622
+ meta: { kind: 'command' },
2623
+ data: { type: 'voice', data: { event: 'cancel' } },
2624
+ };
2625
+ await this._client.send(msg);
2626
+ }
2627
+ /** Send `Voice::PushToTalk` to the daemon. */
2628
+ async pushToTalk() {
2629
+ const msg = {
2630
+ id: newUuid(),
2631
+ meta: { kind: 'command' },
2632
+ data: { type: 'voice', data: { event: 'pushToTalk' } },
2633
+ };
2634
+ await this._client.send(msg);
2635
+ }
2636
+ /** Send `Voice::MuteMic` to the daemon. */
2637
+ async muteMic(payload) {
2638
+ const msg = {
2639
+ id: newUuid(),
2640
+ meta: { kind: 'command' },
2641
+ data: { type: 'voice', data: { event: 'muteMic', data: payload } },
2642
+ };
2643
+ await this._client.send(msg);
2644
+ }
2645
+ /** Send `Voice::UnmuteMic` to the daemon. */
2646
+ async unmuteMic(payload) {
2647
+ const msg = {
2648
+ id: newUuid(),
2649
+ meta: { kind: 'command' },
2650
+ data: { type: 'voice', data: { event: 'unmuteMic', data: payload } },
2651
+ };
2652
+ await this._client.send(msg);
2653
+ }
2654
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2655
+ async stateGet(options) {
2656
+ const wireData = { type: 'voice', data: { event: 'stateGet' } };
2657
+ const response = await this._client.request(wireData, options?.timeoutMs);
2658
+ const d = response.data;
2659
+ if (d.type === 'voice') {
2660
+ const inner = d.data;
2661
+ if (inner.event === 'stateReply')
2662
+ return { ok: true, response: inner.data };
2663
+ }
2664
+ if (d.type === 'error')
2665
+ return { ok: false, kind: 'protocol', error: d.data };
2666
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2667
+ }
2668
+ }
2669
+ export class WebappSurface {
2670
+ _client;
2671
+ constructor(_client) {
2672
+ this._client = _client;
2673
+ }
2674
+ /** Subscribe to `Webapp::ListReply` from the daemon. */
2675
+ onListReply(handler) {
2676
+ return this._client.on(event => {
2677
+ if (event.type !== 'message')
2678
+ return;
2679
+ const data = event.message.data;
2680
+ if (data.type !== 'webapp')
2681
+ return;
2682
+ const inner = data.data;
2683
+ if (inner.event !== 'listReply')
2684
+ return;
2685
+ handler(inner.data);
2686
+ });
2687
+ }
2688
+ /** Subscribe to `Webapp::CurrentReply` from the daemon. */
2689
+ onCurrentReply(handler) {
2690
+ return this._client.on(event => {
2691
+ if (event.type !== 'message')
2692
+ return;
2693
+ const data = event.message.data;
2694
+ if (data.type !== 'webapp')
2695
+ return;
2696
+ const inner = data.data;
2697
+ if (inner.event !== 'currentReply')
2698
+ return;
2699
+ handler(inner.data);
2700
+ });
2701
+ }
2702
+ /** Subscribe to `Webapp::ActiveReply` from the daemon. */
2703
+ onActiveReply(handler) {
2704
+ return this._client.on(event => {
2705
+ if (event.type !== 'message')
2706
+ return;
2707
+ const data = event.message.data;
2708
+ if (data.type !== 'webapp')
2709
+ return;
2710
+ const inner = data.data;
2711
+ if (inner.event !== 'activeReply')
2712
+ return;
2713
+ handler(inner.data);
2714
+ });
2715
+ }
2716
+ /** Subscribe to `Webapp::IconReply` from the daemon. */
2717
+ onIconReply(handler) {
2718
+ return this._client.on(event => {
2719
+ if (event.type !== 'message')
2720
+ return;
2721
+ const data = event.message.data;
2722
+ if (data.type !== 'webapp')
2723
+ return;
2724
+ const inner = data.data;
2725
+ if (inner.event !== 'iconReply')
2726
+ return;
2727
+ handler(inner.data);
2728
+ });
2729
+ }
2730
+ /** Subscribe to `Webapp::WebappError` from the daemon. */
2731
+ onWebappError(handler) {
2732
+ return this._client.on(event => {
2733
+ if (event.type !== 'message')
2734
+ return;
2735
+ const data = event.message.data;
2736
+ if (data.type !== 'webapp')
2737
+ return;
2738
+ const inner = data.data;
2739
+ if (inner.event !== 'webappError')
2740
+ return;
2741
+ handler(inner.data);
2742
+ });
2743
+ }
2744
+ /** Subscribe to `Webapp::ActiveChanged` from the daemon. */
2745
+ onActiveChanged(handler) {
2746
+ return this._client.on(event => {
2747
+ if (event.type !== 'message')
2748
+ return;
2749
+ const data = event.message.data;
2750
+ if (data.type !== 'webapp')
2751
+ return;
2752
+ const inner = data.data;
2753
+ if (inner.event !== 'activeChanged')
2754
+ return;
2755
+ handler(inner.data);
2756
+ });
2757
+ }
2758
+ /** Subscribe to `Webapp::WebappInstalled` from the daemon. */
2759
+ onWebappInstalled(handler) {
2760
+ return this._client.on(event => {
2761
+ if (event.type !== 'message')
2762
+ return;
2763
+ const data = event.message.data;
2764
+ if (data.type !== 'webapp')
2765
+ return;
2766
+ const inner = data.data;
2767
+ if (inner.event !== 'webappInstalled')
2768
+ return;
2769
+ handler(inner.data);
2770
+ });
2771
+ }
2772
+ /** Subscribe to `Webapp::WebappUninstalled` from the daemon. */
2773
+ onWebappUninstalled(handler) {
2774
+ return this._client.on(event => {
2775
+ if (event.type !== 'message')
2776
+ return;
2777
+ const data = event.message.data;
2778
+ if (data.type !== 'webapp')
2779
+ return;
2780
+ const inner = data.data;
2781
+ if (inner.event !== 'webappUninstalled')
2782
+ return;
2783
+ handler(inner.data);
2784
+ });
2785
+ }
2786
+ /** Exhaustive subscribe over all inbound `Webapp` variants. */
2787
+ subscribe(handlers) {
2788
+ return this._subscribe(handlers, false);
2789
+ }
2790
+ /** Same as `subscribe` but every handler is optional. */
2791
+ subscribePartial(handlers) {
2792
+ return this._subscribe(handlers, true);
2793
+ }
2794
+ _subscribe(handlers, partial) {
2795
+ return this._client.on(event => {
2796
+ if (event.type !== 'message')
2797
+ return;
2798
+ const data = event.message.data;
2799
+ if (data.type !== 'webapp')
2800
+ return;
2801
+ const inner = data.data;
2802
+ switch (inner.event) {
2803
+ case 'listReply': {
2804
+ handlers.listReply?.(inner.data);
2805
+ return;
2806
+ }
2807
+ case 'currentReply': {
2808
+ handlers.currentReply?.(inner.data);
2809
+ return;
2810
+ }
2811
+ case 'activeReply': {
2812
+ handlers.activeReply?.(inner.data);
2813
+ return;
2814
+ }
2815
+ case 'iconReply': {
2816
+ handlers.iconReply?.(inner.data);
2817
+ return;
2818
+ }
2819
+ case 'webappError': {
2820
+ handlers.webappError?.(inner.data);
2821
+ return;
2822
+ }
2823
+ case 'activeChanged': {
2824
+ handlers.activeChanged?.(inner.data);
2825
+ return;
2826
+ }
2827
+ case 'webappInstalled': {
2828
+ handlers.webappInstalled?.(inner.data);
2829
+ return;
2830
+ }
2831
+ case 'webappUninstalled': {
2832
+ handlers.webappUninstalled?.(inner.data);
2833
+ return;
2834
+ }
2835
+ default: {
2836
+ if (!partial)
2837
+ this._client.logger.warn('Webapp: no handler for inner', inner);
2838
+ return;
2839
+ }
2840
+ }
2841
+ });
2842
+ }
2843
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2844
+ async list(options) {
2845
+ const wireData = { type: 'webapp', data: { event: 'list' } };
2846
+ const response = await this._client.request(wireData, options?.timeoutMs);
2847
+ const d = response.data;
2848
+ if (d.type === 'webapp') {
2849
+ const inner = d.data;
2850
+ if (inner.event === 'listReply')
2851
+ return { ok: true, response: inner.data };
2852
+ }
2853
+ if (d.type === 'error')
2854
+ return { ok: false, kind: 'protocol', error: d.data };
2855
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2856
+ }
2857
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2858
+ async current(options) {
2859
+ const wireData = { type: 'webapp', data: { event: 'current' } };
2860
+ const response = await this._client.request(wireData, options?.timeoutMs);
2861
+ const d = response.data;
2862
+ if (d.type === 'webapp') {
2863
+ const inner = d.data;
2864
+ if (inner.event === 'currentReply')
2865
+ return { ok: true, response: inner.data };
2866
+ }
2867
+ if (d.type === 'error')
2868
+ return { ok: false, kind: 'protocol', error: d.data };
2869
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2870
+ }
2871
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2872
+ async activate(req, options) {
2873
+ const wireData = { type: 'webapp', data: { event: 'activate', data: req } };
2874
+ const response = await this._client.request(wireData, options?.timeoutMs);
2875
+ const d = response.data;
2876
+ if (d.type === 'webapp') {
2877
+ const inner = d.data;
2878
+ if (inner.event === 'activeReply')
2879
+ return { ok: true, response: inner.data };
2880
+ if (inner.event === 'webappError')
2881
+ return { ok: false, kind: 'domain', error: inner.data };
2882
+ }
2883
+ if (d.type === 'error')
2884
+ return { ok: false, kind: 'protocol', error: d.data };
2885
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2886
+ }
2887
+ /** Typed request to the daemon: webapp sends, daemon responds. */
2888
+ async icon(req, options) {
2889
+ const wireData = { type: 'webapp', data: { event: 'icon', data: req } };
2890
+ const response = await this._client.request(wireData, options?.timeoutMs);
2891
+ const d = response.data;
2892
+ if (d.type === 'webapp') {
2893
+ const inner = d.data;
2894
+ if (inner.event === 'iconReply')
2895
+ return { ok: true, response: inner.data };
2896
+ if (inner.event === 'webappError')
2897
+ return { ok: false, kind: 'domain', error: inner.data };
2898
+ }
2899
+ if (d.type === 'error')
2900
+ return { ok: false, kind: 'protocol', error: d.data };
2901
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
2902
+ }
2903
+ }
2904
+ export class ForwardSurface {
2905
+ _client;
2906
+ constructor(_client) {
2907
+ this._client = _client;
2908
+ }
2909
+ /** Subscribe to `Forward::Text` from the daemon. */
2910
+ onText(handler) {
2911
+ return this._client.on(event => {
2912
+ if (event.type !== 'message')
2913
+ return;
2914
+ const data = event.message.data;
2915
+ if (data.type !== 'forward')
2916
+ return;
2917
+ const inner = data.data;
2918
+ if (inner.encoding !== 'text')
2919
+ return;
2920
+ handler(inner.data);
2921
+ });
2922
+ }
2923
+ /** Subscribe to `Forward::Json` from the daemon. */
2924
+ onJson(handler) {
2925
+ return this._client.on(event => {
2926
+ if (event.type !== 'message')
2927
+ return;
2928
+ const data = event.message.data;
2929
+ if (data.type !== 'forward')
2930
+ return;
2931
+ const inner = data.data;
2932
+ if (inner.encoding !== 'json')
2933
+ return;
2934
+ handler(inner.data);
2935
+ });
2936
+ }
2937
+ /** Subscribe to `Forward::Binary` from the daemon. */
2938
+ onBinary(handler) {
2939
+ return this._client.on(event => {
2940
+ if (event.type !== 'message')
2941
+ return;
2942
+ const data = event.message.data;
2943
+ if (data.type !== 'forward')
2944
+ return;
2945
+ const inner = data.data;
2946
+ if (inner.encoding !== 'binary')
2947
+ return;
2948
+ handler(inner.data);
2949
+ });
2950
+ }
2951
+ /** Exhaustive subscribe over all inbound `Forward` variants. */
2952
+ subscribe(handlers) {
2953
+ return this._subscribe(handlers, false);
2954
+ }
2955
+ /** Same as `subscribe` but every handler is optional. */
2956
+ subscribePartial(handlers) {
2957
+ return this._subscribe(handlers, true);
2958
+ }
2959
+ _subscribe(handlers, partial) {
2960
+ return this._client.on(event => {
2961
+ if (event.type !== 'message')
2962
+ return;
2963
+ const data = event.message.data;
2964
+ if (data.type !== 'forward')
2965
+ return;
2966
+ const inner = data.data;
2967
+ switch (inner.encoding) {
2968
+ case 'text': {
2969
+ handlers.text?.(inner.data);
2970
+ return;
2971
+ }
2972
+ case 'json': {
2973
+ handlers.json?.(inner.data);
2974
+ return;
2975
+ }
2976
+ case 'binary': {
2977
+ handlers.binary?.(inner.data);
2978
+ return;
2979
+ }
2980
+ default: {
2981
+ if (!partial)
2982
+ this._client.logger.warn('Forward: no handler for inner', inner);
2983
+ return;
2984
+ }
2985
+ }
2986
+ });
2987
+ }
2988
+ /** Send `Forward::Text` to the daemon. */
2989
+ async text(payload) {
2990
+ const msg = {
2991
+ id: newUuid(),
2992
+ meta: { kind: 'event' },
2993
+ data: { type: 'forward', data: { encoding: 'text', data: payload } },
2994
+ };
2995
+ await this._client.send(msg);
2996
+ }
2997
+ /** Send `Forward::Json` to the daemon. */
2998
+ async json(payload) {
2999
+ const msg = {
3000
+ id: newUuid(),
3001
+ meta: { kind: 'event' },
3002
+ data: { type: 'forward', data: { encoding: 'json', data: payload } },
3003
+ };
3004
+ await this._client.send(msg);
3005
+ }
3006
+ /** Send `Forward::Binary` to the daemon. */
3007
+ async binary(payload) {
3008
+ const msg = {
3009
+ id: newUuid(),
3010
+ meta: { kind: 'event' },
3011
+ data: { type: 'forward', data: { encoding: 'binary', data: payload } },
3012
+ };
3013
+ await this._client.send(msg);
3014
+ }
3015
+ }
3016
+ export class StoreSurface {
3017
+ _client;
3018
+ constructor(_client) {
3019
+ this._client = _client;
3020
+ }
3021
+ /** Typed request to the daemon: webapp sends, daemon responds. */
3022
+ async get(req, options) {
3023
+ const wireData = { type: 'store', data: { event: 'get', data: req } };
3024
+ const response = await this._client.request(wireData, options?.timeoutMs);
3025
+ const d = response.data;
3026
+ if (d.type === 'store') {
3027
+ const inner = d.data;
3028
+ if (inner.event === 'response')
3029
+ return { ok: true, response: inner.data };
3030
+ }
3031
+ if (d.type === 'error')
3032
+ return { ok: false, kind: 'protocol', error: d.data };
3033
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
3034
+ }
3035
+ /** Typed request to the daemon: webapp sends, daemon responds. */
3036
+ async put(req, options) {
3037
+ const wireData = { type: 'store', data: { event: 'put', data: req } };
3038
+ const response = await this._client.request(wireData, options?.timeoutMs);
3039
+ const d = response.data;
3040
+ if (d.type === 'store') {
3041
+ const inner = d.data;
3042
+ if (inner.event === 'response')
3043
+ return { ok: true, response: inner.data };
3044
+ }
3045
+ if (d.type === 'error')
3046
+ return { ok: false, kind: 'protocol', error: d.data };
3047
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
3048
+ }
3049
+ /** Typed request to the daemon: webapp sends, daemon responds. */
3050
+ async delete(req, options) {
3051
+ const wireData = { type: 'store', data: { event: 'delete', data: req } };
3052
+ const response = await this._client.request(wireData, options?.timeoutMs);
3053
+ const d = response.data;
3054
+ if (d.type === 'store') {
3055
+ const inner = d.data;
3056
+ if (inner.event === 'response')
3057
+ return { ok: true, response: inner.data };
3058
+ }
3059
+ if (d.type === 'error')
3060
+ return { ok: false, kind: 'protocol', error: d.data };
3061
+ return { ok: false, kind: 'protocol', error: { type: 'unsupported' } };
3062
+ }
3063
+ }
3064
+ /**
3065
+ * Apply codegen-emitted prototype augmentations to BridgethingClient.
3066
+ * Called once from `index.ts` after the class definition. Idempotent.
3067
+ */
3068
+ export function applyDispatch() {
3069
+ const surfaceCache = new WeakMap();
3070
+ function bucketFor(c) {
3071
+ let bucket = surfaceCache.get(c);
3072
+ if (!bucket) {
3073
+ bucket = {};
3074
+ surfaceCache.set(c, bucket);
3075
+ }
3076
+ return bucket;
3077
+ }
3078
+ Object.defineProperty(BridgethingClient.prototype, 'asset', {
3079
+ configurable: true,
3080
+ enumerable: true,
3081
+ get() {
3082
+ const bucket = bucketFor(this);
3083
+ return (bucket.asset ??= new AssetSurface(this));
3084
+ },
3085
+ });
3086
+ Object.defineProperty(BridgethingClient.prototype, 'audio', {
3087
+ configurable: true,
3088
+ enumerable: true,
3089
+ get() {
3090
+ const bucket = bucketFor(this);
3091
+ return (bucket.audio ??= new AudioSurface(this));
3092
+ },
3093
+ });
3094
+ Object.defineProperty(BridgethingClient.prototype, 'bluetooth', {
3095
+ configurable: true,
3096
+ enumerable: true,
3097
+ get() {
3098
+ const bucket = bucketFor(this);
3099
+ return (bucket.bluetooth ??= new BluetoothSurface(this));
3100
+ },
3101
+ });
3102
+ Object.defineProperty(BridgethingClient.prototype, 'capabilities', {
3103
+ configurable: true,
3104
+ enumerable: true,
3105
+ get() {
3106
+ const bucket = bucketFor(this);
3107
+ return (bucket.capabilities ??= new CapabilitiesSurface(this));
3108
+ },
3109
+ });
3110
+ Object.defineProperty(BridgethingClient.prototype, 'config', {
3111
+ configurable: true,
3112
+ enumerable: true,
3113
+ get() {
3114
+ const bucket = bucketFor(this);
3115
+ return (bucket.config ??= new ConfigSurface(this));
3116
+ },
3117
+ });
3118
+ Object.defineProperty(BridgethingClient.prototype, 'geo', {
3119
+ configurable: true,
3120
+ enumerable: true,
3121
+ get() {
3122
+ const bucket = bucketFor(this);
3123
+ return (bucket.geo ??= new GeoSurface(this));
3124
+ },
3125
+ });
3126
+ Object.defineProperty(BridgethingClient.prototype, 'hardware', {
3127
+ configurable: true,
3128
+ enumerable: true,
3129
+ get() {
3130
+ const bucket = bucketFor(this);
3131
+ return (bucket.hardware ??= new HardwareSurface(this));
3132
+ },
3133
+ });
3134
+ Object.defineProperty(BridgethingClient.prototype, 'library', {
3135
+ configurable: true,
3136
+ enumerable: true,
3137
+ get() {
3138
+ const bucket = bucketFor(this);
3139
+ return (bucket.library ??= new LibrarySurface(this));
3140
+ },
3141
+ });
3142
+ Object.defineProperty(BridgethingClient.prototype, 'net', {
3143
+ configurable: true,
3144
+ enumerable: true,
3145
+ get() {
3146
+ const bucket = bucketFor(this);
3147
+ return (bucket.net ??= new NetSurface(this));
3148
+ },
3149
+ });
3150
+ Object.defineProperty(BridgethingClient.prototype, 'notifications', {
3151
+ configurable: true,
3152
+ enumerable: true,
3153
+ get() {
3154
+ const bucket = bucketFor(this);
3155
+ return (bucket.notifications ??= new NotificationsSurface(this));
3156
+ },
3157
+ });
3158
+ Object.defineProperty(BridgethingClient.prototype, 'peer', {
3159
+ configurable: true,
3160
+ enumerable: true,
3161
+ get() {
3162
+ const bucket = bucketFor(this);
3163
+ return (bucket.peer ??= new PeerSurface(this));
3164
+ },
3165
+ });
3166
+ Object.defineProperty(BridgethingClient.prototype, 'phone', {
3167
+ configurable: true,
3168
+ enumerable: true,
3169
+ get() {
3170
+ const bucket = bucketFor(this);
3171
+ return (bucket.phone ??= new PhoneSurface(this));
3172
+ },
3173
+ });
3174
+ Object.defineProperty(BridgethingClient.prototype, 'player', {
3175
+ configurable: true,
3176
+ enumerable: true,
3177
+ get() {
3178
+ const bucket = bucketFor(this);
3179
+ return (bucket.player ??= new PlayerSurface(this));
3180
+ },
3181
+ });
3182
+ Object.defineProperty(BridgethingClient.prototype, 'system', {
3183
+ configurable: true,
3184
+ enumerable: true,
3185
+ get() {
3186
+ const bucket = bucketFor(this);
3187
+ return (bucket.system ??= new SystemSurface(this));
3188
+ },
3189
+ });
3190
+ Object.defineProperty(BridgethingClient.prototype, 'time', {
3191
+ configurable: true,
3192
+ enumerable: true,
3193
+ get() {
3194
+ const bucket = bucketFor(this);
3195
+ return (bucket.time ??= new TimeSurface(this));
3196
+ },
3197
+ });
3198
+ Object.defineProperty(BridgethingClient.prototype, 'voice', {
3199
+ configurable: true,
3200
+ enumerable: true,
3201
+ get() {
3202
+ const bucket = bucketFor(this);
3203
+ return (bucket.voice ??= new VoiceSurface(this));
3204
+ },
3205
+ });
3206
+ Object.defineProperty(BridgethingClient.prototype, 'webapp', {
3207
+ configurable: true,
3208
+ enumerable: true,
3209
+ get() {
3210
+ const bucket = bucketFor(this);
3211
+ return (bucket.webapp ??= new WebappSurface(this));
3212
+ },
3213
+ });
3214
+ Object.defineProperty(BridgethingClient.prototype, 'forward', {
3215
+ configurable: true,
3216
+ enumerable: true,
3217
+ get() {
3218
+ const bucket = bucketFor(this);
3219
+ return (bucket.forward ??= new ForwardSurface(this));
3220
+ },
3221
+ });
3222
+ Object.defineProperty(BridgethingClient.prototype, 'store', {
3223
+ configurable: true,
3224
+ enumerable: true,
3225
+ get() {
3226
+ const bucket = bucketFor(this);
3227
+ return (bucket.store ??= new StoreSurface(this));
3228
+ },
3229
+ });
3230
+ BridgethingClient.prototype.subscribe = function (handlers) {
3231
+ return outerSubscribe(this, handlers, false);
3232
+ };
3233
+ BridgethingClient.prototype.subscribePartial = function (handlers) {
3234
+ return outerSubscribe(this, handlers, true);
3235
+ };
3236
+ }
3237
+ function outerSubscribe(c, handlers, partial) {
3238
+ return c.on((event) => {
3239
+ if (event.type !== 'message')
3240
+ return;
3241
+ const data = event.message.data;
3242
+ switch (data.type) {
3243
+ case 'asset': {
3244
+ const innerHandlers = handlers.asset;
3245
+ if (!innerHandlers) {
3246
+ if (!partial)
3247
+ c.logger.warn('subscribe: no handler for asset');
3248
+ return;
3249
+ }
3250
+ const inner = data.data;
3251
+ switch (inner.event) {
3252
+ case 'got': {
3253
+ innerHandlers.got?.(inner.data);
3254
+ return;
3255
+ }
3256
+ case 'notFound': {
3257
+ innerHandlers.notFound?.(inner.data);
3258
+ return;
3259
+ }
3260
+ case 'ready': {
3261
+ innerHandlers.ready?.(inner.data);
3262
+ return;
3263
+ }
3264
+ case 'cleared': {
3265
+ innerHandlers.cleared?.(inner.data);
3266
+ return;
3267
+ }
3268
+ default: {
3269
+ if (!partial)
3270
+ c.logger.warn('Asset: no handler for inner', inner);
3271
+ return;
3272
+ }
3273
+ }
3274
+ }
3275
+ case 'audio': {
3276
+ const innerHandlers = handlers.audio;
3277
+ if (!innerHandlers) {
3278
+ if (!partial)
3279
+ c.logger.warn('subscribe: no handler for audio');
3280
+ return;
3281
+ }
3282
+ const inner = data.data;
3283
+ switch (inner.event) {
3284
+ case 'ttsStarted': {
3285
+ innerHandlers.ttsStarted?.(inner.data);
3286
+ return;
3287
+ }
3288
+ case 'ttsEnded': {
3289
+ innerHandlers.ttsEnded?.(inner.data);
3290
+ return;
3291
+ }
3292
+ case 'volumeChanged': {
3293
+ innerHandlers.volumeChanged?.(inner.data);
3294
+ return;
3295
+ }
3296
+ default: {
3297
+ if (!partial)
3298
+ c.logger.warn('Audio: no handler for inner', inner);
3299
+ return;
3300
+ }
3301
+ }
3302
+ }
3303
+ case 'bluetooth': {
3304
+ const innerHandlers = handlers.bluetooth;
3305
+ if (!innerHandlers) {
3306
+ if (!partial)
3307
+ c.logger.warn('subscribe: no handler for bluetooth');
3308
+ return;
3309
+ }
3310
+ const inner = data.data;
3311
+ switch (inner.event) {
3312
+ case 'status': {
3313
+ innerHandlers.status?.(inner.data);
3314
+ return;
3315
+ }
3316
+ case 'connectedDevice': {
3317
+ innerHandlers.connectedDevice?.(inner.data);
3318
+ return;
3319
+ }
3320
+ case 'interface': {
3321
+ innerHandlers.interface?.(inner.data);
3322
+ return;
3323
+ }
3324
+ case 'pairingResult': {
3325
+ innerHandlers.pairingResult?.(inner.data);
3326
+ return;
3327
+ }
3328
+ case 'pin': {
3329
+ innerHandlers.pin?.(inner.data);
3330
+ return;
3331
+ }
3332
+ case 'pairedDevices': {
3333
+ innerHandlers.pairedDevices?.(inner.data);
3334
+ return;
3335
+ }
3336
+ default: {
3337
+ if (!partial)
3338
+ c.logger.warn('Bluetooth: no handler for inner', inner);
3339
+ return;
3340
+ }
3341
+ }
3342
+ }
3343
+ case 'capabilities': {
3344
+ const innerHandlers = handlers.capabilities;
3345
+ if (!innerHandlers) {
3346
+ if (!partial)
3347
+ c.logger.warn('subscribe: no handler for capabilities');
3348
+ return;
3349
+ }
3350
+ const inner = data.data;
3351
+ switch (inner.event) {
3352
+ case 'update': {
3353
+ innerHandlers.update?.(inner.data);
3354
+ return;
3355
+ }
3356
+ case 'snapshot': {
3357
+ innerHandlers.snapshot?.(inner.data);
3358
+ return;
3359
+ }
3360
+ default: {
3361
+ if (!partial)
3362
+ c.logger.warn('Capabilities: no handler for inner', inner);
3363
+ return;
3364
+ }
3365
+ }
3366
+ }
3367
+ case 'config': {
3368
+ const innerHandlers = handlers.config;
3369
+ if (!innerHandlers) {
3370
+ if (!partial)
3371
+ c.logger.warn('subscribe: no handler for config');
3372
+ return;
3373
+ }
3374
+ const inner = data.data;
3375
+ switch (inner.event) {
3376
+ case 'get': {
3377
+ innerHandlers.get?.(inner.data);
3378
+ return;
3379
+ }
3380
+ case 'list': {
3381
+ innerHandlers.list?.(inner.data);
3382
+ return;
3383
+ }
3384
+ case 'changed': {
3385
+ innerHandlers.changed?.(inner.data);
3386
+ return;
3387
+ }
3388
+ default: {
3389
+ if (!partial)
3390
+ c.logger.warn('Config: no handler for inner', inner);
3391
+ return;
3392
+ }
3393
+ }
3394
+ }
3395
+ case 'geo': {
3396
+ const innerHandlers = handlers.geo;
3397
+ if (!innerHandlers) {
3398
+ if (!partial)
3399
+ c.logger.warn('subscribe: no handler for geo');
3400
+ return;
3401
+ }
3402
+ const inner = data.data;
3403
+ switch (inner.event) {
3404
+ case 'position': {
3405
+ innerHandlers.position?.(inner.data);
3406
+ return;
3407
+ }
3408
+ case 'watchReply': {
3409
+ innerHandlers.watchReply?.(inner.data);
3410
+ return;
3411
+ }
3412
+ case 'getOnceReply': {
3413
+ innerHandlers.getOnceReply?.(inner.data);
3414
+ return;
3415
+ }
3416
+ case 'errorReply': {
3417
+ innerHandlers.errorReply?.(inner.data);
3418
+ return;
3419
+ }
3420
+ default: {
3421
+ if (!partial)
3422
+ c.logger.warn('Geo: no handler for inner', inner);
3423
+ return;
3424
+ }
3425
+ }
3426
+ }
3427
+ case 'hardware': {
3428
+ const innerHandlers = handlers.hardware;
3429
+ if (!innerHandlers) {
3430
+ if (!partial)
3431
+ c.logger.warn('subscribe: no handler for hardware');
3432
+ return;
3433
+ }
3434
+ const inner = data.data;
3435
+ switch (inner.event) {
3436
+ case 'ambientLightUpdate': {
3437
+ innerHandlers.ambientLightUpdate?.(inner.data);
3438
+ return;
3439
+ }
3440
+ case 'brightnessChanged': {
3441
+ innerHandlers.brightnessChanged?.(inner.data);
3442
+ return;
3443
+ }
3444
+ case 'stateReply': {
3445
+ innerHandlers.stateReply?.(inner.data);
3446
+ return;
3447
+ }
3448
+ default: {
3449
+ if (!partial)
3450
+ c.logger.warn('Hardware: no handler for inner', inner);
3451
+ return;
3452
+ }
3453
+ }
3454
+ }
3455
+ case 'library': {
3456
+ const innerHandlers = handlers.library;
3457
+ if (!innerHandlers) {
3458
+ if (!partial)
3459
+ c.logger.warn('subscribe: no handler for library');
3460
+ return;
3461
+ }
3462
+ const inner = data.data;
3463
+ switch (inner.event) {
3464
+ case 'browseReply': {
3465
+ innerHandlers.browseReply?.(inner.data);
3466
+ return;
3467
+ }
3468
+ case 'searchReply': {
3469
+ innerHandlers.searchReply?.(inner.data);
3470
+ return;
3471
+ }
3472
+ case 'recommendationsReply': {
3473
+ innerHandlers.recommendationsReply?.(inner.data);
3474
+ return;
3475
+ }
3476
+ case 'favoritesListReply': {
3477
+ innerHandlers.favoritesListReply?.(inner.data);
3478
+ return;
3479
+ }
3480
+ case 'favoritesContainsReply': {
3481
+ innerHandlers.favoritesContainsReply?.(inner.data);
3482
+ return;
3483
+ }
3484
+ case 'libraryErrorReply': {
3485
+ innerHandlers.libraryErrorReply?.(inner.data);
3486
+ return;
3487
+ }
3488
+ case 'favoriteChanged': {
3489
+ innerHandlers.favoriteChanged?.(inner.data);
3490
+ return;
3491
+ }
3492
+ default: {
3493
+ if (!partial)
3494
+ c.logger.warn('Library: no handler for inner', inner);
3495
+ return;
3496
+ }
3497
+ }
3498
+ }
3499
+ case 'net': {
3500
+ const innerHandlers = handlers.net;
3501
+ if (!innerHandlers) {
3502
+ if (!partial)
3503
+ c.logger.warn('subscribe: no handler for net');
3504
+ return;
3505
+ }
3506
+ const inner = data.data;
3507
+ switch (inner.event) {
3508
+ case 'fetchReply': {
3509
+ innerHandlers.fetchReply?.(inner.data);
3510
+ return;
3511
+ }
3512
+ case 'fetchErrorReply': {
3513
+ innerHandlers.fetchErrorReply?.(inner.data);
3514
+ return;
3515
+ }
3516
+ case 'wsOpenReply': {
3517
+ innerHandlers.wsOpenReply?.(inner.data);
3518
+ return;
3519
+ }
3520
+ case 'wsErrorReply': {
3521
+ innerHandlers.wsErrorReply?.(inner.data);
3522
+ return;
3523
+ }
3524
+ case 'wsMessage': {
3525
+ innerHandlers.wsMessage?.(inner.data);
3526
+ return;
3527
+ }
3528
+ case 'wsClosed': {
3529
+ innerHandlers.wsClosed?.(inner.data);
3530
+ return;
3531
+ }
3532
+ case 'wsErrorEvent': {
3533
+ innerHandlers.wsErrorEvent?.(inner.data);
3534
+ return;
3535
+ }
3536
+ case 'streamBegin': {
3537
+ innerHandlers.streamBegin?.(inner.data);
3538
+ return;
3539
+ }
3540
+ case 'streamChunk': {
3541
+ innerHandlers.streamChunk?.(inner.data);
3542
+ return;
3543
+ }
3544
+ case 'streamEnd': {
3545
+ innerHandlers.streamEnd?.(inner.data);
3546
+ return;
3547
+ }
3548
+ case 'streamError': {
3549
+ innerHandlers.streamError?.(inner.data);
3550
+ return;
3551
+ }
3552
+ default: {
3553
+ if (!partial)
3554
+ c.logger.warn('Net: no handler for inner', inner);
3555
+ return;
3556
+ }
3557
+ }
3558
+ }
3559
+ case 'notifications': {
3560
+ const innerHandlers = handlers.notifications;
3561
+ if (!innerHandlers) {
3562
+ if (!partial)
3563
+ c.logger.warn('subscribe: no handler for notifications');
3564
+ return;
3565
+ }
3566
+ const inner = data.data;
3567
+ switch (inner.event) {
3568
+ case 'posted': {
3569
+ innerHandlers.posted?.(inner.data);
3570
+ return;
3571
+ }
3572
+ case 'updated': {
3573
+ innerHandlers.updated?.(inner.data);
3574
+ return;
3575
+ }
3576
+ case 'removed': {
3577
+ innerHandlers.removed?.(inner.data);
3578
+ return;
3579
+ }
3580
+ default: {
3581
+ if (!partial)
3582
+ c.logger.warn('Notifications: no handler for inner', inner);
3583
+ return;
3584
+ }
3585
+ }
3586
+ }
3587
+ case 'peer': {
3588
+ const handler = handlers.peer;
3589
+ if (!handler) {
3590
+ if (!partial)
3591
+ c.logger.warn('subscribe: no handler for peer');
3592
+ return;
3593
+ }
3594
+ handler(data.data.data);
3595
+ return;
3596
+ }
3597
+ case 'phone': {
3598
+ const innerHandlers = handlers.phone;
3599
+ if (!innerHandlers) {
3600
+ if (!partial)
3601
+ c.logger.warn('subscribe: no handler for phone');
3602
+ return;
3603
+ }
3604
+ const inner = data.data;
3605
+ switch (inner.event) {
3606
+ case 'callStarted': {
3607
+ innerHandlers.callStarted?.(inner.data);
3608
+ return;
3609
+ }
3610
+ case 'callUpdated': {
3611
+ innerHandlers.callUpdated?.(inner.data);
3612
+ return;
3613
+ }
3614
+ case 'callEnded': {
3615
+ innerHandlers.callEnded?.(inner.data);
3616
+ return;
3617
+ }
3618
+ case 'communicationsChanged': {
3619
+ innerHandlers.communicationsChanged?.(inner.data);
3620
+ return;
3621
+ }
3622
+ case 'stateReply': {
3623
+ innerHandlers.stateReply?.(inner.data);
3624
+ return;
3625
+ }
3626
+ case 'errorReply': {
3627
+ innerHandlers.errorReply?.(inner.data);
3628
+ return;
3629
+ }
3630
+ default: {
3631
+ if (!partial)
3632
+ c.logger.warn('Phone: no handler for inner', inner);
3633
+ return;
3634
+ }
3635
+ }
3636
+ }
3637
+ case 'player': {
3638
+ const innerHandlers = handlers.player;
3639
+ if (!innerHandlers) {
3640
+ if (!partial)
3641
+ c.logger.warn('subscribe: no handler for player');
3642
+ return;
3643
+ }
3644
+ const inner = data.data;
3645
+ switch (inner.event) {
3646
+ case 'snapshot': {
3647
+ innerHandlers.snapshot?.(inner.data);
3648
+ return;
3649
+ }
3650
+ case 'delta': {
3651
+ innerHandlers.delta?.(inner.data);
3652
+ return;
3653
+ }
3654
+ case 'queueChanged': {
3655
+ innerHandlers.queueChanged?.(inner.data);
3656
+ return;
3657
+ }
3658
+ case 'stateReply': {
3659
+ innerHandlers.stateReply?.(inner.data);
3660
+ return;
3661
+ }
3662
+ case 'queueReply': {
3663
+ innerHandlers.queueReply?.(inner.data);
3664
+ return;
3665
+ }
3666
+ case 'errorReply': {
3667
+ innerHandlers.errorReply?.(inner.data);
3668
+ return;
3669
+ }
3670
+ default: {
3671
+ if (!partial)
3672
+ c.logger.warn('Player: no handler for inner', inner);
3673
+ return;
3674
+ }
3675
+ }
3676
+ }
3677
+ case 'system': {
3678
+ const innerHandlers = handlers.system;
3679
+ if (!innerHandlers) {
3680
+ if (!partial)
3681
+ c.logger.warn('subscribe: no handler for system');
3682
+ return;
3683
+ }
3684
+ const inner = data.data;
3685
+ switch (inner.event) {
3686
+ case 'version': {
3687
+ innerHandlers.version?.(inner.data);
3688
+ return;
3689
+ }
3690
+ case 'diagnosticsReply': {
3691
+ innerHandlers.diagnosticsReply?.(inner.data);
3692
+ return;
3693
+ }
3694
+ case 'logsTailReply': {
3695
+ innerHandlers.logsTailReply?.(inner.data);
3696
+ return;
3697
+ }
3698
+ case 'logsSubscribeReply': {
3699
+ innerHandlers.logsSubscribeReply?.(inner.data);
3700
+ return;
3701
+ }
3702
+ case 'logEntry': {
3703
+ innerHandlers.logEntry?.(inner.data);
3704
+ return;
3705
+ }
3706
+ case 'otaProgress': {
3707
+ innerHandlers.otaProgress?.(inner.data);
3708
+ return;
3709
+ }
3710
+ case 'otaError': {
3711
+ innerHandlers.otaError?.(inner.data);
3712
+ return;
3713
+ }
3714
+ case 'deviceNickname': {
3715
+ innerHandlers.deviceNickname?.(inner.data);
3716
+ return;
3717
+ }
3718
+ case 'deviceNicknameChanged': {
3719
+ innerHandlers.deviceNicknameChanged?.(inner.data);
3720
+ return;
3721
+ }
3722
+ default: {
3723
+ if (!partial)
3724
+ c.logger.warn('System: no handler for inner', inner);
3725
+ return;
3726
+ }
3727
+ }
3728
+ }
3729
+ case 'time': {
3730
+ const innerHandlers = handlers.time;
3731
+ if (!innerHandlers) {
3732
+ if (!partial)
3733
+ c.logger.warn('subscribe: no handler for time');
3734
+ return;
3735
+ }
3736
+ const inner = data.data;
3737
+ switch (inner.event) {
3738
+ case 'changed': {
3739
+ innerHandlers.changed?.(inner.data);
3740
+ return;
3741
+ }
3742
+ case 'snapshot': {
3743
+ innerHandlers.snapshot?.(inner.data);
3744
+ return;
3745
+ }
3746
+ default: {
3747
+ if (!partial)
3748
+ c.logger.warn('Time: no handler for inner', inner);
3749
+ return;
3750
+ }
3751
+ }
3752
+ }
3753
+ case 'voice': {
3754
+ const innerHandlers = handlers.voice;
3755
+ if (!innerHandlers) {
3756
+ if (!partial)
3757
+ c.logger.warn('subscribe: no handler for voice');
3758
+ return;
3759
+ }
3760
+ const inner = data.data;
3761
+ switch (inner.event) {
3762
+ case 'stateChanged': {
3763
+ innerHandlers.stateChanged?.(inner.data);
3764
+ return;
3765
+ }
3766
+ case 'stateReply': {
3767
+ innerHandlers.stateReply?.(inner.data);
3768
+ return;
3769
+ }
3770
+ default: {
3771
+ if (!partial)
3772
+ c.logger.warn('Voice: no handler for inner', inner);
3773
+ return;
3774
+ }
3775
+ }
3776
+ }
3777
+ case 'webapp': {
3778
+ const innerHandlers = handlers.webapp;
3779
+ if (!innerHandlers) {
3780
+ if (!partial)
3781
+ c.logger.warn('subscribe: no handler for webapp');
3782
+ return;
3783
+ }
3784
+ const inner = data.data;
3785
+ switch (inner.event) {
3786
+ case 'listReply': {
3787
+ innerHandlers.listReply?.(inner.data);
3788
+ return;
3789
+ }
3790
+ case 'currentReply': {
3791
+ innerHandlers.currentReply?.(inner.data);
3792
+ return;
3793
+ }
3794
+ case 'activeReply': {
3795
+ innerHandlers.activeReply?.(inner.data);
3796
+ return;
3797
+ }
3798
+ case 'iconReply': {
3799
+ innerHandlers.iconReply?.(inner.data);
3800
+ return;
3801
+ }
3802
+ case 'webappError': {
3803
+ innerHandlers.webappError?.(inner.data);
3804
+ return;
3805
+ }
3806
+ case 'activeChanged': {
3807
+ innerHandlers.activeChanged?.(inner.data);
3808
+ return;
3809
+ }
3810
+ case 'webappInstalled': {
3811
+ innerHandlers.webappInstalled?.(inner.data);
3812
+ return;
3813
+ }
3814
+ case 'webappUninstalled': {
3815
+ innerHandlers.webappUninstalled?.(inner.data);
3816
+ return;
3817
+ }
3818
+ default: {
3819
+ if (!partial)
3820
+ c.logger.warn('Webapp: no handler for inner', inner);
3821
+ return;
3822
+ }
3823
+ }
3824
+ }
3825
+ case 'forward': {
3826
+ const innerHandlers = handlers.forward;
3827
+ if (!innerHandlers) {
3828
+ if (!partial)
3829
+ c.logger.warn('subscribe: no handler for forward');
3830
+ return;
3831
+ }
3832
+ const inner = data.data;
3833
+ switch (inner.encoding) {
3834
+ case 'text': {
3835
+ innerHandlers.text?.(inner.data);
3836
+ return;
3837
+ }
3838
+ case 'json': {
3839
+ innerHandlers.json?.(inner.data);
3840
+ return;
3841
+ }
3842
+ case 'binary': {
3843
+ innerHandlers.binary?.(inner.data);
3844
+ return;
3845
+ }
3846
+ default: {
3847
+ if (!partial)
3848
+ c.logger.warn('Forward: no handler for inner', inner);
3849
+ return;
3850
+ }
3851
+ }
3852
+ }
3853
+ default: {
3854
+ if (!partial)
3855
+ c.logger.warn('subscribe: no handler for unknown wire variant', data);
3856
+ return;
3857
+ }
3858
+ }
3859
+ });
3860
+ }
3861
+ //# sourceMappingURL=dispatch.generated.js.map