@kusinta/iot-schema 0.2.0-beta.3 → 0.2.0-beta.31

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (60) hide show
  1. package/package.json +9 -1
  2. package/src/kusinta/iot/access/v1/acl_pb.d.ts +118 -2
  3. package/src/kusinta/iot/access/v1/acl_pb.js +20 -3
  4. package/src/kusinta/iot/access/v1/roles_pb.d.ts +119 -4
  5. package/src/kusinta/iot/access/v1/roles_pb.js +98 -5
  6. package/src/kusinta/iot/climate/v1/climate_pb.d.ts +726 -0
  7. package/src/kusinta/iot/climate/v1/climate_pb.js +142 -0
  8. package/src/kusinta/iot/common/v1/pairing_pb.d.ts +217 -0
  9. package/src/kusinta/iot/common/v1/pairing_pb.js +50 -0
  10. package/src/kusinta/iot/common/v1/types_pb.d.ts +175 -0
  11. package/src/kusinta/iot/common/v1/types_pb.js +70 -1
  12. package/src/kusinta/iot/connector/v1/connector_pb.d.ts +691 -2
  13. package/src/kusinta/iot/connector/v1/connector_pb.js +104 -13
  14. package/src/kusinta/iot/device/v1/cluster_state_pb.d.ts +44 -0
  15. package/src/kusinta/iot/device/v1/cluster_state_pb.js +1 -1
  16. package/src/kusinta/iot/device/v1/descriptor_pb.d.ts +22 -2
  17. package/src/kusinta/iot/device/v1/descriptor_pb.js +2 -1
  18. package/src/kusinta/iot/device/v1/device_event_pb.d.ts +87 -5
  19. package/src/kusinta/iot/device/v1/device_event_pb.js +1 -1
  20. package/src/kusinta/iot/device/v1/device_pb.d.ts +150 -6
  21. package/src/kusinta/iot/device/v1/device_pb.js +33 -2
  22. package/src/kusinta/iot/device/v1/matter_options_pb.d.ts +26 -0
  23. package/src/kusinta/iot/device/v1/matter_options_pb.js +31 -4
  24. package/src/kusinta/iot/device/v1/properties_pb.d.ts +14 -0
  25. package/src/kusinta/iot/device/v1/properties_pb.js +1 -1
  26. package/src/kusinta/iot/device/v1/property_update_pb.d.ts +3 -2
  27. package/src/kusinta/iot/link/v1/link_pb.d.ts +438 -0
  28. package/src/kusinta/iot/link/v1/link_pb.js +121 -0
  29. package/src/kusinta/iot/reporting/v1/reporting_pb.d.ts +1219 -0
  30. package/src/kusinta/iot/reporting/v1/reporting_pb.js +238 -0
  31. package/src/kusinta/iot/reporting/v1/reporting_service_pb.d.ts +63 -0
  32. package/src/kusinta/iot/reporting/v1/reporting_service_pb.js +24 -0
  33. package/src/kusinta/iot/signaling/v1/signaling_pb.d.ts +361 -7
  34. package/src/kusinta/iot/signaling/v1/signaling_pb.js +68 -4
  35. package/src/kusinta/iot/signaling/v1/signaling_service_pb.d.ts +24 -1
  36. package/src/kusinta/iot/signaling/v1/signaling_service_pb.js +1 -1
  37. package/src/kusinta/iot/space/v1/space_pb.d.ts +103 -2
  38. package/src/kusinta/iot/space/v1/space_pb.js +10 -1
  39. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.d.ts +162 -13
  40. package/src/kusinta/iot/vendor/homematic/v1/homematic_pb.js +8 -1
  41. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.d.ts +69 -0
  42. package/src/kusinta/iot/vendor/lorawan/v1/lorawan_pb.js +19 -0
  43. package/src/kusinta/iot/vendor/v1/vendor_options_pb.d.ts +25 -4
  44. package/src/kusinta/iot/vendor/v1/vendor_options_pb.js +28 -6
  45. package/src/kusinta/iot/webrtc/v1/app_token_pb.d.ts +45 -5
  46. package/src/kusinta/iot/webrtc/v1/app_token_pb.js +1 -1
  47. package/src/kusinta/iot/webrtc/v1/command_pb.d.ts +14 -0
  48. package/src/kusinta/iot/webrtc/v1/command_pb.js +1 -1
  49. package/src/kusinta/iot/webrtc/v1/device_state_pb.d.ts +179 -5
  50. package/src/kusinta/iot/webrtc/v1/device_state_pb.js +35 -6
  51. package/src/kusinta/iot/webrtc/v1/envelope_pb.d.ts +520 -3
  52. package/src/kusinta/iot/webrtc/v1/envelope_pb.js +65 -3
  53. package/src/kusinta/iot/webrtc/v1/invite_pb.d.ts +498 -0
  54. package/src/kusinta/iot/webrtc/v1/invite_pb.js +108 -0
  55. package/src/kusinta/iot/webrtc/v1/management_pb.d.ts +982 -12
  56. package/src/kusinta/iot/webrtc/v1/management_pb.js +132 -5
  57. package/src/kusinta/iot/webrtc/v1/members_pb.d.ts +328 -0
  58. package/src/kusinta/iot/webrtc/v1/members_pb.js +78 -0
  59. package/src/kusinta/iot/webrtc/v1/permission_push_pb.d.ts +66 -4
  60. package/src/kusinta/iot/webrtc/v1/permission_push_pb.js +10 -2
@@ -2,7 +2,7 @@
2
2
  // @generated from file kusinta/iot/signaling/v1/signaling.proto (package kusinta.iot.signaling.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
5
+ import type { GenEnum, GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
6
  import type { Message } from "@bufbuild/protobuf";
7
7
  import type { GatewayId, UserId } from "../../identity/v1/identity_pb.js";
8
8
 
@@ -76,10 +76,26 @@ export declare type IceCandidate = Message<"kusinta.iot.signaling.v1.IceCandidat
76
76
  export declare const IceCandidateSchema: GenMessage<IceCandidate>;
77
77
 
78
78
  /**
79
- * Empty keepalive. The gateway sends this periodically on the GatewayConnect
80
- * stream so the otherwise-idle bidi request keeps producing DATA frames, which
81
- * resets the inactivity timers on any proxy between the two ends and stops it
82
- * from tearing the stream down. Carries no routing target and is dropped on receipt.
79
+ * Empty keepalive, sent periodically on a stream that would otherwise fall
80
+ * silent. The DATA frames it produces reset the inactivity timers on any proxy
81
+ * between the two ends and stop it tearing the stream down. Carries no routing
82
+ * target and is dropped on receipt.
83
+ *
84
+ * Carried on two arms, each covering a half that falls silent while neither end
85
+ * has anything to say: the building-server gateway sends it upstream on
86
+ * GatewayConnect, and the api-server sends it downstream to the app on
87
+ * UserConnectResponse. The remaining halves have no arm — an app leg's upstream
88
+ * that goes idle is one the client can write on whenever it needs to.
89
+ *
90
+ * Never an acknowledgement. A heartbeat answers no message and must not be
91
+ * treated as confirming one.
92
+ *
93
+ * On GatewayConnect it also lets the api-server judge whether the gateway is
94
+ * present. A gateway is present while its stream is open, and never lets it
95
+ * carry nothing for more than 30 seconds: a heartbeat fills any longer silence.
96
+ * A stream that has carried nothing for 90 seconds may be taken as gone, even
97
+ * when the transport has not yet said so. That is the gateway's presence and
98
+ * nothing more: a present gateway may still have lost its devices.
83
99
  *
84
100
  * @generated from message kusinta.iot.signaling.v1.HeartBeat
85
101
  */
@@ -124,6 +140,23 @@ export declare type UserHandshakeAck = Message<"kusinta.iot.signaling.v1.UserHan
124
140
  * @generated from field: string reason = 2;
125
141
  */
126
142
  reason: string;
143
+
144
+ /**
145
+ * How often the api-server will send a HeartBeat on this stream, in
146
+ * milliseconds.
147
+ *
148
+ * Advisory, and a client must not refuse a stream over it: a client that has
149
+ * seen no traffic at all for a small multiple of this may take the stream for
150
+ * gone and reattach with the same session_id, which is the difference between
151
+ * a renegotiation that stalls and one that reconnects. The server is free to
152
+ * answer with a different value on the next session.
153
+ *
154
+ * Zero means the server is not heartbeating this stream, and a client must
155
+ * then not infer anything from silence.
156
+ *
157
+ * @generated from field: uint32 heartbeat_interval_ms = 3;
158
+ */
159
+ heartbeatIntervalMs: number;
127
160
  };
128
161
 
129
162
  /**
@@ -141,13 +174,16 @@ export declare const UserHandshakeAckSchema: GenMessage<UserHandshakeAck>;
141
174
  */
142
175
  export declare type GatewayConnectRequest = Message<"kusinta.iot.signaling.v1.GatewayConnectRequest"> & {
143
176
  /**
177
+ * On redeem_invite_result, the user who redeemed (RedeemInvite).
178
+ *
144
179
  * @generated from field: kusinta.iot.identity.v1.UserId target_user_id = 1;
145
180
  */
146
181
  targetUserId?: UserId | undefined;
147
182
 
148
183
  /**
149
184
  * The session of target_user_id this message answers. See the contract above.
150
- * Ignored on a heartbeat, which carries no routing target at all.
185
+ * Ignored on a heartbeat, which carries no routing target at all, and on
186
+ * redeem_invite_result, which belongs to no session.
151
187
  *
152
188
  * @generated from field: string session_id = 5;
153
189
  */
@@ -174,6 +210,12 @@ export declare type GatewayConnectRequest = Message<"kusinta.iot.signaling.v1.Ga
174
210
  */
175
211
  value: HeartBeat;
176
212
  case: "heartbeat";
213
+ } | {
214
+ /**
215
+ * @generated from field: kusinta.iot.signaling.v1.RedeemInviteResult redeem_invite_result = 6;
216
+ */
217
+ value: RedeemInviteResult;
218
+ case: "redeemInviteResult";
177
219
  } | { case: undefined; value?: undefined };
178
220
  };
179
221
 
@@ -190,6 +232,9 @@ export declare const GatewayConnectRequestSchema: GenMessage<GatewayConnectReque
190
232
  */
191
233
  export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.GatewayConnectResponse"> & {
192
234
  /**
235
+ * On redeem_invite, the user redeeming: the sub of the token the api-server
236
+ * verified, and never a value the user supplied.
237
+ *
193
238
  * @generated from field: kusinta.iot.identity.v1.UserId from_user_id = 1;
194
239
  */
195
240
  fromUserId?: UserId | undefined;
@@ -197,7 +242,7 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
197
242
  /**
198
243
  * The session of from_user_id this message originates from — the value the
199
244
  * gateway must echo on the GatewayConnectRequest that answers it. See the
200
- * contract above.
245
+ * contract above. Unset on redeem_invite, which belongs to no session.
201
246
  *
202
247
  * @generated from field: string session_id = 4;
203
248
  */
@@ -218,6 +263,12 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
218
263
  */
219
264
  value: IceCandidate;
220
265
  case: "iceCandidate";
266
+ } | {
267
+ /**
268
+ * @generated from field: kusinta.iot.signaling.v1.RedeemInvite redeem_invite = 5;
269
+ */
270
+ value: RedeemInvite;
271
+ case: "redeemInvite";
221
272
  } | { case: undefined; value?: undefined };
222
273
  };
223
274
 
@@ -227,6 +278,104 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
227
278
  */
228
279
  export declare const GatewayConnectResponseSchema: GenMessage<GatewayConnectResponse>;
229
280
 
281
+ /**
282
+ * A person redeeming an invite (webrtc.v1 CreateInvite), api-server → gateway.
283
+ * The one request on this stream that the gateway answers, with a
284
+ * RedeemInviteResult carrying the same request_id.
285
+ *
286
+ * The api-server sends it only to the gateway whose invite routes hold the
287
+ * secret's hash (reporting.v1.ReportInviteRoutesRequest), and only for a user
288
+ * whose account has a verified email: it answers a user without one itself,
289
+ * before routing. A hash held by more than one gateway routes nowhere and is
290
+ * answered as INVALID.
291
+ *
292
+ * A code is 40 bits, few enough to guess at. The api-server limits how often each
293
+ * user, and each client address, may redeem, and answers past that limit itself.
294
+ *
295
+ * The api-server waits at least 30 seconds for the result. With no result by
296
+ * then, or no stream to send on, it tells the user to try again later; the redeem
297
+ * may or may not have been done. Trying again is safe: a redeem is idempotent for
298
+ * its user (see RedeemOutcome).
299
+ *
300
+ * @generated from message kusinta.iot.signaling.v1.RedeemInvite
301
+ */
302
+ export declare type RedeemInvite = Message<"kusinta.iot.signaling.v1.RedeemInvite"> & {
303
+ /**
304
+ * Minted by the api-server, opaque, unique among its redeems in flight.
305
+ *
306
+ * @generated from field: string request_id = 1;
307
+ */
308
+ requestId: string;
309
+
310
+ /**
311
+ * The secret as the user gave it: the token from a link, or the code as typed.
312
+ * The gateway hashes and normalises as webrtc.v1 invite.proto says.
313
+ *
314
+ * @generated from oneof kusinta.iot.signaling.v1.RedeemInvite.secret
315
+ */
316
+ secret: {
317
+ /**
318
+ * @generated from field: string token = 2;
319
+ */
320
+ value: string;
321
+ case: "token";
322
+ } | {
323
+ /**
324
+ * @generated from field: string code = 3;
325
+ */
326
+ value: string;
327
+ case: "code";
328
+ } | { case: undefined; value?: undefined };
329
+
330
+ /**
331
+ * The display name the user's token carries, for the join request it may make, by the
332
+ * same rule as webrtc.v1.AppTokenClaims.name: the identity provider's display-name claim
333
+ * alone, never a username or an email address. May be empty.
334
+ *
335
+ * @generated from field: string display_name = 4;
336
+ */
337
+ displayName: string;
338
+
339
+ /**
340
+ * The verified email address of the user's account, as their token states it.
341
+ * Never an address the token does not mark verified.
342
+ *
343
+ * @generated from field: string verified_email = 5;
344
+ */
345
+ verifiedEmail: string;
346
+ };
347
+
348
+ /**
349
+ * Describes the message kusinta.iot.signaling.v1.RedeemInvite.
350
+ * Use `create(RedeemInviteSchema)` to create a new message.
351
+ */
352
+ export declare const RedeemInviteSchema: GenMessage<RedeemInvite>;
353
+
354
+ /**
355
+ * The answer to a RedeemInvite, gateway → api-server.
356
+ *
357
+ * @generated from message kusinta.iot.signaling.v1.RedeemInviteResult
358
+ */
359
+ export declare type RedeemInviteResult = Message<"kusinta.iot.signaling.v1.RedeemInviteResult"> & {
360
+ /**
361
+ * As RedeemInvite.request_id.
362
+ *
363
+ * @generated from field: string request_id = 1;
364
+ */
365
+ requestId: string;
366
+
367
+ /**
368
+ * @generated from field: kusinta.iot.signaling.v1.RedeemOutcome outcome = 2;
369
+ */
370
+ outcome: RedeemOutcome;
371
+ };
372
+
373
+ /**
374
+ * Describes the message kusinta.iot.signaling.v1.RedeemInviteResult.
375
+ * Use `create(RedeemInviteResultSchema)` to create a new message.
376
+ */
377
+ export declare const RedeemInviteResultSchema: GenMessage<RedeemInviteResult>;
378
+
230
379
  /**
231
380
  * Messages sent by the app (GatewaySignalingService.UserConnect stream).
232
381
  * Auth: Authorization: Bearer <jwt> in gRPC request metadata (validated by interceptor).
@@ -244,6 +393,10 @@ export declare type UserConnectRequest = Message<"kusinta.iot.signaling.v1.UserC
244
393
  sessionId: string;
245
394
 
246
395
  /**
396
+ * A payload added here, the handshake aside, belongs in UserSendRequest too:
397
+ * the half-duplex form of this leg carries the same upstream messages, and
398
+ * nothing fails if one of them is only added to one of the two.
399
+ *
247
400
  * @generated from oneof kusinta.iot.signaling.v1.UserConnectRequest.payload
248
401
  */
249
402
  payload: {
@@ -276,6 +429,10 @@ export declare const UserConnectRequestSchema: GenMessage<UserConnectRequest>;
276
429
  /**
277
430
  * Messages sent by the api-server to the app.
278
431
  *
432
+ * One oneof serves both forms of the leg: UserListenResponse wraps this message
433
+ * rather than restating its payloads, so an arm added here reaches the bidi and
434
+ * half-duplex forms alike.
435
+ *
279
436
  * @generated from message kusinta.iot.signaling.v1.UserConnectResponse
280
437
  */
281
438
  export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.UserConnectResponse"> & {
@@ -283,6 +440,7 @@ export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.User
283
440
  * Echoes the session_id of the stream this message is delivered on, so a
284
441
  * client can assert the relay routed to the session it thinks it is. See the
285
442
  * contract above.
443
+ * Ignored on a heartbeat, which carries no routing target at all.
286
444
  *
287
445
  * @generated from field: string session_id = 4;
288
446
  */
@@ -309,6 +467,22 @@ export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.User
309
467
  */
310
468
  value: IceCandidate;
311
469
  case: "iceCandidate";
470
+ } | {
471
+ /**
472
+ * Keeps a silent stream alive. UserListen is downstream-only — the client
473
+ * opens it with a handshake and then writes nothing — so between the
474
+ * acknowledgement and an answer there is no traffic in either direction, and
475
+ * an idle negotiation can outlast a proxy's patience. Upstream cannot help:
476
+ * the client has nothing to send, and it is traffic *to* the client that
477
+ * resets a client-side idle timer.
478
+ *
479
+ * A client that does not know this arm sees an unset payload rather than an
480
+ * error, which is what the oneof buys.
481
+ *
482
+ * @generated from field: kusinta.iot.signaling.v1.HeartBeat heartbeat = 5;
483
+ */
484
+ value: HeartBeat;
485
+ case: "heartbeat";
312
486
  } | { case: undefined; value?: undefined };
313
487
  };
314
488
 
@@ -318,3 +492,183 @@ export declare type UserConnectResponse = Message<"kusinta.iot.signaling.v1.User
318
492
  */
319
493
  export declare const UserConnectResponseSchema: GenMessage<UserConnectResponse>;
320
494
 
495
+ /**
496
+ * The app leg of the protocol exists twice. UserConnect is one bidi stream, and
497
+ * is what a client uses when its transport can stream a request body. A client
498
+ * whose transport cannot — a browser, whose fetch API has no full-duplex request
499
+ * stream — uses UserListen and UserSend instead. Both forms carry the same
500
+ * messages and are served by the same relay: once a session is live, how it was
501
+ * opened is not observable.
502
+ *
503
+ * Opens the downstream half of a half-duplex app session, and carries the
504
+ * handshake that is the first frame of the bidi form. Field numbers are those of
505
+ * the equivalent UserConnectRequest, so the two cannot be confused on the wire.
506
+ *
507
+ * @generated from message kusinta.iot.signaling.v1.UserListenRequest
508
+ */
509
+ export declare type UserListenRequest = Message<"kusinta.iot.signaling.v1.UserListenRequest"> & {
510
+ /**
511
+ * @generated from field: kusinta.iot.signaling.v1.UserHandshake handshake = 1;
512
+ */
513
+ handshake?: UserHandshake | undefined;
514
+
515
+ /**
516
+ * This client's session: opaque, minted by the client, stable across
517
+ * reconnects, never a credential, and required. See the contract above.
518
+ *
519
+ * @generated from field: string session_id = 4;
520
+ */
521
+ sessionId: string;
522
+ };
523
+
524
+ /**
525
+ * Describes the message kusinta.iot.signaling.v1.UserListenRequest.
526
+ * Use `create(UserListenRequestSchema)` to create a new message.
527
+ */
528
+ export declare const UserListenRequestSchema: GenMessage<UserListenRequest>;
529
+
530
+ /**
531
+ * One message of the downstream half. Wraps the response the bidi form delivers
532
+ * directly, rather than restating its payloads: a response message is not shared
533
+ * between two rpcs, and a second copy of the oneof would be free to drift from
534
+ * the first.
535
+ *
536
+ * @generated from message kusinta.iot.signaling.v1.UserListenResponse
537
+ */
538
+ export declare type UserListenResponse = Message<"kusinta.iot.signaling.v1.UserListenResponse"> & {
539
+ /**
540
+ * @generated from field: kusinta.iot.signaling.v1.UserConnectResponse response = 1;
541
+ */
542
+ response?: UserConnectResponse | undefined;
543
+ };
544
+
545
+ /**
546
+ * Describes the message kusinta.iot.signaling.v1.UserListenResponse.
547
+ * Use `create(UserListenResponseSchema)` to create a new message.
548
+ */
549
+ export declare const UserListenResponseSchema: GenMessage<UserListenResponse>;
550
+
551
+ /**
552
+ * One upstream message of a half-duplex app session, delivered by its own call.
553
+ *
554
+ * The session must already be open, which is what makes ordering the caller's
555
+ * job: the handshake is acknowledged on the UserListen stream, and a UserSend
556
+ * issued before that acknowledgement names a session the relay does not hold
557
+ * yet. It is refused, not queued. Two sends racing each other can also arrive
558
+ * out of order, so a caller that must preserve order — an offer before the
559
+ * candidates that belong to it — issues them one at a time.
560
+ *
561
+ * @generated from message kusinta.iot.signaling.v1.UserSendRequest
562
+ */
563
+ export declare type UserSendRequest = Message<"kusinta.iot.signaling.v1.UserSendRequest"> & {
564
+ /**
565
+ * The session to deliver into. See the contract above.
566
+ *
567
+ * @generated from field: string session_id = 4;
568
+ */
569
+ sessionId: string;
570
+
571
+ /**
572
+ * @generated from oneof kusinta.iot.signaling.v1.UserSendRequest.payload
573
+ */
574
+ payload: {
575
+ /**
576
+ * @generated from field: kusinta.iot.signaling.v1.SdpOffer offer = 2;
577
+ */
578
+ value: SdpOffer;
579
+ case: "offer";
580
+ } | {
581
+ /**
582
+ * @generated from field: kusinta.iot.signaling.v1.IceCandidate ice_candidate = 3;
583
+ */
584
+ value: IceCandidate;
585
+ case: "iceCandidate";
586
+ } | { case: undefined; value?: undefined };
587
+ };
588
+
589
+ /**
590
+ * Describes the message kusinta.iot.signaling.v1.UserSendRequest.
591
+ * Use `create(UserSendRequestSchema)` to create a new message.
592
+ */
593
+ export declare const UserSendRequestSchema: GenMessage<UserSendRequest>;
594
+
595
+ /**
596
+ * Empty. Delivery is acknowledged by the call succeeding; a message that could
597
+ * not be routed fails the call instead.
598
+ *
599
+ * @generated from message kusinta.iot.signaling.v1.UserSendResponse
600
+ */
601
+ export declare type UserSendResponse = Message<"kusinta.iot.signaling.v1.UserSendResponse"> & {
602
+ };
603
+
604
+ /**
605
+ * Describes the message kusinta.iot.signaling.v1.UserSendResponse.
606
+ * Use `create(UserSendResponseSchema)` to create a new message.
607
+ */
608
+ export declare const UserSendResponseSchema: GenMessage<UserSendResponse>;
609
+
610
+ /**
611
+ * What redeeming an invite did, as the gateway decided it.
612
+ *
613
+ * A redeem is idempotent for its user: redeemed again by the same user, for as
614
+ * long as its secret would have lasted unused, a used invite answers JOINED if
615
+ * the user is filed on its space by then, and otherwise as it did the first time
616
+ * — so a denied request still answers PENDING_APPROVAL — except that one which
617
+ * filed the user, who has left that space since, answers INVALID. To anyone
618
+ * else it answers INVALID. So a user who never saw the first answer can safely
619
+ * try again.
620
+ *
621
+ * @generated from enum kusinta.iot.signaling.v1.RedeemOutcome
622
+ */
623
+ export enum RedeemOutcome {
624
+ /**
625
+ * @generated from enum value: REDEEM_OUTCOME_UNSPECIFIED = 0;
626
+ */
627
+ UNSPECIFIED = 0,
628
+
629
+ /**
630
+ * The user is a member of the invite's space. Answered only once the
631
+ * api-server has applied the member report that names them
632
+ * (reporting.v1.GatewayMember), so the user can connect as soon as they are
633
+ * told. Also the answer for a user already filed on that space: the invite is
634
+ * used up, and their membership is left exactly as it was.
635
+ *
636
+ * @generated from enum value: REDEEM_OUTCOME_JOINED = 1;
637
+ */
638
+ JOINED = 1,
639
+
640
+ /**
641
+ * A join request was made (webrtc.v1.JoinRequest); the user becomes a member
642
+ * once it is approved. Also the answer for a user who already has one on that
643
+ * space.
644
+ *
645
+ * @generated from enum value: REDEEM_OUTCOME_PENDING_APPROVAL = 2;
646
+ */
647
+ PENDING_APPROVAL = 2,
648
+
649
+ /**
650
+ * No invite: unknown, expired, revoked, already used by someone else, a code
651
+ * for an invite bound to another address, or anything else that is not a
652
+ * live invite. One answer for all of them, so a redeem tells nothing about
653
+ * which secrets exist.
654
+ *
655
+ * @generated from enum value: REDEEM_OUTCOME_INVALID = 3;
656
+ */
657
+ INVALID = 3,
658
+
659
+ /**
660
+ * The invite is bound to an address (webrtc.v1.CreateInvite.email) that is not
661
+ * the user's verified one. Answered only to a token, which cannot be guessed;
662
+ * a code bound to another address answers INVALID. Never says which address
663
+ * it is bound to, and leaves the invite pending.
664
+ *
665
+ * @generated from enum value: REDEEM_OUTCOME_WRONG_ACCOUNT = 4;
666
+ */
667
+ WRONG_ACCOUNT = 4,
668
+ }
669
+
670
+ /**
671
+ * Describes the enum kusinta.iot.signaling.v1.RedeemOutcome.
672
+ */
673
+ export declare const RedeemOutcomeSchema: GenEnum<RedeemOutcome>;
674
+
@@ -2,14 +2,14 @@
2
2
  // @generated from file kusinta/iot/signaling/v1/signaling.proto (package kusinta.iot.signaling.v1, syntax proto3)
3
3
  /* eslint-disable */
4
4
 
5
- import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
5
+ import { enumDesc, fileDesc, messageDesc, tsEnum } from "@bufbuild/protobuf/codegenv2";
6
6
  import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
7
7
 
8
8
  /**
9
9
  * Describes the file kusinta/iot/signaling/v1/signaling.proto.
10
10
  */
11
11
  export const file_kusinta_iot_signaling_v1_signaling = /*@__PURE__*/
12
- fileDesc("CihrdXNpbnRhL2lvdC9zaWduYWxpbmcvdjEvc2lnbmFsaW5nLnByb3RvEhhrdXNpbnRhLmlvdC5zaWduYWxpbmcudjEiFwoIU2RwT2ZmZXISCwoDc2RwGAEgASgJIhgKCVNkcEFuc3dlchILCgNzZHAYASABKAkiSwoMSWNlQ2FuZGlkYXRlEhEKCWNhbmRpZGF0ZRgBIAEoCRIPCgdzZHBfbWlkGAIgASgJEhcKD3NkcF9tbGluZV9pbmRleBgDIAEoBSILCglIZWFydEJlYXQiTgoNVXNlckhhbmRzaGFrZRI9ChF0YXJnZXRfZ2F0ZXdheV9pZBgBIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZCI0ChBVc2VySGFuZHNoYWtlQWNrEhAKCGFjY2VwdGVkGAEgASgIEg4KBnJlYXNvbhgCIAEoCSKhAgoVR2F0ZXdheUNvbm5lY3RSZXF1ZXN0EjcKDnRhcmdldF91c2VyX2lkGAEgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEhIKCnNlc3Npb25faWQYBSABKAkSNQoGYW5zd2VyGAIgASgLMiMua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlNkcEFuc3dlckgAEj8KDWljZV9jYW5kaWRhdGUYAyABKAsyJi5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuSWNlQ2FuZGlkYXRlSAASOAoJaGVhcnRiZWF0GAQgASgLMiMua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkhlYXJ0QmVhdEgAQgkKB3BheWxvYWQi5AEKFkdhdGV3YXlDb25uZWN0UmVzcG9uc2USNQoMZnJvbV91c2VyX2lkGAEgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEhIKCnNlc3Npb25faWQYBCABKAkSMwoFb2ZmZXIYAiABKAsyIi5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuU2RwT2ZmZXJIABI/Cg1pY2VfY2FuZGlkYXRlGAMgASgLMiYua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkljZUNhbmRpZGF0ZUgAQgkKB3BheWxvYWQi5wEKElVzZXJDb25uZWN0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAQgASgJEjwKCWhhbmRzaGFrZRgBIAEoCzInLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5Vc2VySGFuZHNoYWtlSAASMwoFb2ZmZXIYAiABKAsyIi5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuU2RwT2ZmZXJIABI/Cg1pY2VfY2FuZGlkYXRlGAMgASgLMiYua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkljZUNhbmRpZGF0ZUgAQgkKB3BheWxvYWQi8QEKE1VzZXJDb25uZWN0UmVzcG9uc2USEgoKc2Vzc2lvbl9pZBgEIAEoCRJDCg1oYW5kc2hha2VfYWNrGAEgASgLMioua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJIYW5kc2hha2VBY2tIABI1CgZhbnN3ZXIYAiABKAsyIy5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuU2RwQW5zd2VySAASPwoNaWNlX2NhbmRpZGF0ZRgDIAEoCzImLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5JY2VDYW5kaWRhdGVIAEIJCgdwYXlsb2FkQgJIAWIGcHJvdG8z", [file_kusinta_iot_identity_v1_identity]);
12
+ fileDesc("CihrdXNpbnRhL2lvdC9zaWduYWxpbmcvdjEvc2lnbmFsaW5nLnByb3RvEhhrdXNpbnRhLmlvdC5zaWduYWxpbmcudjEiFwoIU2RwT2ZmZXISCwoDc2RwGAEgASgJIhgKCVNkcEFuc3dlchILCgNzZHAYASABKAkiSwoMSWNlQ2FuZGlkYXRlEhEKCWNhbmRpZGF0ZRgBIAEoCRIPCgdzZHBfbWlkGAIgASgJEhcKD3NkcF9tbGluZV9pbmRleBgDIAEoBSILCglIZWFydEJlYXQiTgoNVXNlckhhbmRzaGFrZRI9ChF0YXJnZXRfZ2F0ZXdheV9pZBgBIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZCJTChBVc2VySGFuZHNoYWtlQWNrEhAKCGFjY2VwdGVkGAEgASgIEg4KBnJlYXNvbhgCIAEoCRIdChVoZWFydGJlYXRfaW50ZXJ2YWxfbXMYAyABKA0i7wIKFUdhdGV3YXlDb25uZWN0UmVxdWVzdBI3Cg50YXJnZXRfdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBISCgpzZXNzaW9uX2lkGAUgASgJEjUKBmFuc3dlchgCIAEoCzIjLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5TZHBBbnN3ZXJIABI/Cg1pY2VfY2FuZGlkYXRlGAMgASgLMiYua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkljZUNhbmRpZGF0ZUgAEjgKCWhlYXJ0YmVhdBgEIAEoCzIjLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5IZWFydEJlYXRIABJMChRyZWRlZW1faW52aXRlX3Jlc3VsdBgGIAEoCzIsLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5SZWRlZW1JbnZpdGVSZXN1bHRIAEIJCgdwYXlsb2FkIqUCChZHYXRld2F5Q29ubmVjdFJlc3BvbnNlEjUKDGZyb21fdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBISCgpzZXNzaW9uX2lkGAQgASgJEjMKBW9mZmVyGAIgASgLMiIua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlNkcE9mZmVySAASPwoNaWNlX2NhbmRpZGF0ZRgDIAEoCzImLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5JY2VDYW5kaWRhdGVIABI/Cg1yZWRlZW1faW52aXRlGAUgASgLMiYua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlJlZGVlbUludml0ZUgAQgkKB3BheWxvYWQiewoMUmVkZWVtSW52aXRlEhIKCnJlcXVlc3RfaWQYASABKAkSDwoFdG9rZW4YAiABKAlIABIOCgRjb2RlGAMgASgJSAASFAoMZGlzcGxheV9uYW1lGAQgASgJEhYKDnZlcmlmaWVkX2VtYWlsGAUgASgJQggKBnNlY3JldCJiChJSZWRlZW1JbnZpdGVSZXN1bHQSEgoKcmVxdWVzdF9pZBgBIAEoCRI4CgdvdXRjb21lGAIgASgOMicua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlJlZGVlbU91dGNvbWUi5wEKElVzZXJDb25uZWN0UmVxdWVzdBISCgpzZXNzaW9uX2lkGAQgASgJEjwKCWhhbmRzaGFrZRgBIAEoCzInLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5Vc2VySGFuZHNoYWtlSAASMwoFb2ZmZXIYAiABKAsyIi5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuU2RwT2ZmZXJIABI/Cg1pY2VfY2FuZGlkYXRlGAMgASgLMiYua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkljZUNhbmRpZGF0ZUgAQgkKB3BheWxvYWQiqwIKE1VzZXJDb25uZWN0UmVzcG9uc2USEgoKc2Vzc2lvbl9pZBgEIAEoCRJDCg1oYW5kc2hha2VfYWNrGAEgASgLMioua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJIYW5kc2hha2VBY2tIABI1CgZhbnN3ZXIYAiABKAsyIy5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuU2RwQW5zd2VySAASPwoNaWNlX2NhbmRpZGF0ZRgDIAEoCzImLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5JY2VDYW5kaWRhdGVIABI4CgloZWFydGJlYXQYBSABKAsyIy5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuSGVhcnRCZWF0SABCCQoHcGF5bG9hZCJvChFVc2VyTGlzdGVuUmVxdWVzdBI6CgloYW5kc2hha2UYASABKAsyJy5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuVXNlckhhbmRzaGFrZRISCgpzZXNzaW9uX2lkGAQgASgJSgQIAhADSgQIAxAEIlUKElVzZXJMaXN0ZW5SZXNwb25zZRI/CghyZXNwb25zZRgBIAEoCzItLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5Vc2VyQ29ubmVjdFJlc3BvbnNlIrcBCg9Vc2VyU2VuZFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgEIAEoCRIzCgVvZmZlchgCIAEoCzIiLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5TZHBPZmZlckgAEj8KDWljZV9jYW5kaWRhdGUYAyABKAsyJi5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuSWNlQ2FuZGlkYXRlSABCCQoHcGF5bG9hZEoECAEQAlIJaGFuZHNoYWtlIhIKEFVzZXJTZW5kUmVzcG9uc2UqrQEKDVJlZGVlbU91dGNvbWUSHgoaUkVERUVNX09VVENPTUVfVU5TUEVDSUZJRUQQABIZChVSRURFRU1fT1VUQ09NRV9KT0lORUQQARIjCh9SRURFRU1fT1VUQ09NRV9QRU5ESU5HX0FQUFJPVkFMEAISGgoWUkVERUVNX09VVENPTUVfSU5WQUxJRBADEiAKHFJFREVFTV9PVVRDT01FX1dST05HX0FDQ09VTlQQBEICSAFiBnByb3RvMw", [file_kusinta_iot_identity_v1_identity]);
13
13
 
14
14
  /**
15
15
  * Describes the message kusinta.iot.signaling.v1.SdpOffer.
@@ -67,17 +67,81 @@ export const GatewayConnectRequestSchema = /*@__PURE__*/
67
67
  export const GatewayConnectResponseSchema = /*@__PURE__*/
68
68
  messageDesc(file_kusinta_iot_signaling_v1_signaling, 7);
69
69
 
70
+ /**
71
+ * Describes the message kusinta.iot.signaling.v1.RedeemInvite.
72
+ * Use `create(RedeemInviteSchema)` to create a new message.
73
+ */
74
+ export const RedeemInviteSchema = /*@__PURE__*/
75
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 8);
76
+
77
+ /**
78
+ * Describes the message kusinta.iot.signaling.v1.RedeemInviteResult.
79
+ * Use `create(RedeemInviteResultSchema)` to create a new message.
80
+ */
81
+ export const RedeemInviteResultSchema = /*@__PURE__*/
82
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 9);
83
+
70
84
  /**
71
85
  * Describes the message kusinta.iot.signaling.v1.UserConnectRequest.
72
86
  * Use `create(UserConnectRequestSchema)` to create a new message.
73
87
  */
74
88
  export const UserConnectRequestSchema = /*@__PURE__*/
75
- messageDesc(file_kusinta_iot_signaling_v1_signaling, 8);
89
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 10);
76
90
 
77
91
  /**
78
92
  * Describes the message kusinta.iot.signaling.v1.UserConnectResponse.
79
93
  * Use `create(UserConnectResponseSchema)` to create a new message.
80
94
  */
81
95
  export const UserConnectResponseSchema = /*@__PURE__*/
82
- messageDesc(file_kusinta_iot_signaling_v1_signaling, 9);
96
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 11);
97
+
98
+ /**
99
+ * Describes the message kusinta.iot.signaling.v1.UserListenRequest.
100
+ * Use `create(UserListenRequestSchema)` to create a new message.
101
+ */
102
+ export const UserListenRequestSchema = /*@__PURE__*/
103
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 12);
104
+
105
+ /**
106
+ * Describes the message kusinta.iot.signaling.v1.UserListenResponse.
107
+ * Use `create(UserListenResponseSchema)` to create a new message.
108
+ */
109
+ export const UserListenResponseSchema = /*@__PURE__*/
110
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 13);
111
+
112
+ /**
113
+ * Describes the message kusinta.iot.signaling.v1.UserSendRequest.
114
+ * Use `create(UserSendRequestSchema)` to create a new message.
115
+ */
116
+ export const UserSendRequestSchema = /*@__PURE__*/
117
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 14);
118
+
119
+ /**
120
+ * Describes the message kusinta.iot.signaling.v1.UserSendResponse.
121
+ * Use `create(UserSendResponseSchema)` to create a new message.
122
+ */
123
+ export const UserSendResponseSchema = /*@__PURE__*/
124
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 15);
125
+
126
+ /**
127
+ * Describes the enum kusinta.iot.signaling.v1.RedeemOutcome.
128
+ */
129
+ export const RedeemOutcomeSchema = /*@__PURE__*/
130
+ enumDesc(file_kusinta_iot_signaling_v1_signaling, 0);
131
+
132
+ /**
133
+ * What redeeming an invite did, as the gateway decided it.
134
+ *
135
+ * A redeem is idempotent for its user: redeemed again by the same user, for as
136
+ * long as its secret would have lasted unused, a used invite answers JOINED if
137
+ * the user is filed on its space by then, and otherwise as it did the first time
138
+ * — so a denied request still answers PENDING_APPROVAL — except that one which
139
+ * filed the user, who has left that space since, answers INVALID. To anyone
140
+ * else it answers INVALID. So a user who never saw the first answer can safely
141
+ * try again.
142
+ *
143
+ * @generated from enum kusinta.iot.signaling.v1.RedeemOutcome
144
+ */
145
+ export const RedeemOutcome = /*@__PURE__*/
146
+ tsEnum(RedeemOutcomeSchema);
83
147
 
@@ -3,7 +3,7 @@
3
3
  /* eslint-disable */
4
4
 
5
5
  import type { GenFile, GenService } from "@bufbuild/protobuf/codegenv2";
6
- import type { GatewayConnectRequestSchema, GatewayConnectResponseSchema, UserConnectRequestSchema, UserConnectResponseSchema } from "./signaling_pb.js";
6
+ import type { GatewayConnectRequestSchema, GatewayConnectResponseSchema, UserConnectRequestSchema, UserConnectResponseSchema, UserListenRequestSchema, UserListenResponseSchema, UserSendRequestSchema, UserSendResponseSchema } from "./signaling_pb.js";
7
7
 
8
8
  /**
9
9
  * Describes the file kusinta/iot/signaling/v1/signaling_service.proto.
@@ -30,5 +30,28 @@ export declare const GatewaySignalingService: GenService<{
30
30
  input: typeof UserConnectRequestSchema;
31
31
  output: typeof UserConnectResponseSchema;
32
32
  },
33
+ /**
34
+ * Opens the session and its downstream half, for a client whose transport
35
+ * cannot stream a request body and so cannot call UserConnect. The handshake
36
+ * travels in the request; the acknowledgement is the stream's first message.
37
+ *
38
+ * @generated from rpc kusinta.iot.signaling.v1.GatewaySignalingService.UserListen
39
+ */
40
+ userListen: {
41
+ methodKind: "server_streaming";
42
+ input: typeof UserListenRequestSchema;
43
+ output: typeof UserListenResponseSchema;
44
+ },
45
+ /**
46
+ * Delivers one upstream message into a session UserListen has already opened.
47
+ * A call naming a session the relay does not hold is refused, not queued.
48
+ *
49
+ * @generated from rpc kusinta.iot.signaling.v1.GatewaySignalingService.UserSend
50
+ */
51
+ userSend: {
52
+ methodKind: "unary";
53
+ input: typeof UserSendRequestSchema;
54
+ output: typeof UserSendResponseSchema;
55
+ },
33
56
  }>;
34
57
 
@@ -9,7 +9,7 @@ import { file_kusinta_iot_signaling_v1_signaling } from "./signaling_pb.js";
9
9
  * Describes the file kusinta/iot/signaling/v1/signaling_service.proto.
10
10
  */
11
11
  export const file_kusinta_iot_signaling_v1_signaling_service = /*@__PURE__*/
12
- fileDesc("CjBrdXNpbnRhL2lvdC9zaWduYWxpbmcvdjEvc2lnbmFsaW5nX3NlcnZpY2UucHJvdG8SGGt1c2ludGEuaW90LnNpZ25hbGluZy52MTKCAgoXR2F0ZXdheVNpZ25hbGluZ1NlcnZpY2USdwoOR2F0ZXdheUNvbm5lY3QSLy5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuR2F0ZXdheUNvbm5lY3RSZXF1ZXN0GjAua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkdhdGV3YXlDb25uZWN0UmVzcG9uc2UoATABEm4KC1VzZXJDb25uZWN0Eiwua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJDb25uZWN0UmVxdWVzdBotLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5Vc2VyQ29ubmVjdFJlc3BvbnNlKAEwAUICSAFiBnByb3RvMw", [file_kusinta_iot_signaling_v1_signaling]);
12
+ fileDesc("CjBrdXNpbnRhL2lvdC9zaWduYWxpbmcvdjEvc2lnbmFsaW5nX3NlcnZpY2UucHJvdG8SGGt1c2ludGEuaW90LnNpZ25hbGluZy52MTLQAwoXR2F0ZXdheVNpZ25hbGluZ1NlcnZpY2USdwoOR2F0ZXdheUNvbm5lY3QSLy5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuR2F0ZXdheUNvbm5lY3RSZXF1ZXN0GjAua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkdhdGV3YXlDb25uZWN0UmVzcG9uc2UoATABEm4KC1VzZXJDb25uZWN0Eiwua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJDb25uZWN0UmVxdWVzdBotLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5Vc2VyQ29ubmVjdFJlc3BvbnNlKAEwARJpCgpVc2VyTGlzdGVuEisua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJMaXN0ZW5SZXF1ZXN0Giwua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJMaXN0ZW5SZXNwb25zZTABEmEKCFVzZXJTZW5kEikua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJTZW5kUmVxdWVzdBoqLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5Vc2VyU2VuZFJlc3BvbnNlQgJIAWIGcHJvdG8z", [file_kusinta_iot_signaling_v1_signaling]);
13
13
 
14
14
  /**
15
15
  * @generated from service kusinta.iot.signaling.v1.GatewaySignalingService