@kusinta/iot-schema 0.2.0-beta.24 → 0.2.0-beta.26

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.
@@ -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
 
@@ -174,13 +174,16 @@ export declare const UserHandshakeAckSchema: GenMessage<UserHandshakeAck>;
174
174
  */
175
175
  export declare type GatewayConnectRequest = Message<"kusinta.iot.signaling.v1.GatewayConnectRequest"> & {
176
176
  /**
177
+ * On redeem_invite_result, the user who redeemed (RedeemInvite).
178
+ *
177
179
  * @generated from field: kusinta.iot.identity.v1.UserId target_user_id = 1;
178
180
  */
179
181
  targetUserId?: UserId | undefined;
180
182
 
181
183
  /**
182
184
  * The session of target_user_id this message answers. See the contract above.
183
- * 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.
184
187
  *
185
188
  * @generated from field: string session_id = 5;
186
189
  */
@@ -207,6 +210,12 @@ export declare type GatewayConnectRequest = Message<"kusinta.iot.signaling.v1.Ga
207
210
  */
208
211
  value: HeartBeat;
209
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";
210
219
  } | { case: undefined; value?: undefined };
211
220
  };
212
221
 
@@ -223,6 +232,9 @@ export declare const GatewayConnectRequestSchema: GenMessage<GatewayConnectReque
223
232
  */
224
233
  export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.GatewayConnectResponse"> & {
225
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
+ *
226
238
  * @generated from field: kusinta.iot.identity.v1.UserId from_user_id = 1;
227
239
  */
228
240
  fromUserId?: UserId | undefined;
@@ -230,7 +242,7 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
230
242
  /**
231
243
  * The session of from_user_id this message originates from — the value the
232
244
  * gateway must echo on the GatewayConnectRequest that answers it. See the
233
- * contract above.
245
+ * contract above. Unset on redeem_invite, which belongs to no session.
234
246
  *
235
247
  * @generated from field: string session_id = 4;
236
248
  */
@@ -251,6 +263,12 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
251
263
  */
252
264
  value: IceCandidate;
253
265
  case: "iceCandidate";
266
+ } | {
267
+ /**
268
+ * @generated from field: kusinta.iot.signaling.v1.RedeemInvite redeem_invite = 5;
269
+ */
270
+ value: RedeemInvite;
271
+ case: "redeemInvite";
254
272
  } | { case: undefined; value?: undefined };
255
273
  };
256
274
 
@@ -260,6 +278,103 @@ export declare type GatewayConnectResponse = Message<"kusinta.iot.signaling.v1.G
260
278
  */
261
279
  export declare const GatewayConnectResponseSchema: GenMessage<GatewayConnectResponse>;
262
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.
332
+ * May be empty.
333
+ *
334
+ * @generated from field: string display_name = 4;
335
+ */
336
+ displayName: string;
337
+
338
+ /**
339
+ * The verified email address of the user's account, as their token states it.
340
+ * Never an address the token does not mark verified.
341
+ *
342
+ * @generated from field: string verified_email = 5;
343
+ */
344
+ verifiedEmail: string;
345
+ };
346
+
347
+ /**
348
+ * Describes the message kusinta.iot.signaling.v1.RedeemInvite.
349
+ * Use `create(RedeemInviteSchema)` to create a new message.
350
+ */
351
+ export declare const RedeemInviteSchema: GenMessage<RedeemInvite>;
352
+
353
+ /**
354
+ * The answer to a RedeemInvite, gateway → api-server.
355
+ *
356
+ * @generated from message kusinta.iot.signaling.v1.RedeemInviteResult
357
+ */
358
+ export declare type RedeemInviteResult = Message<"kusinta.iot.signaling.v1.RedeemInviteResult"> & {
359
+ /**
360
+ * As RedeemInvite.request_id.
361
+ *
362
+ * @generated from field: string request_id = 1;
363
+ */
364
+ requestId: string;
365
+
366
+ /**
367
+ * @generated from field: kusinta.iot.signaling.v1.RedeemOutcome outcome = 2;
368
+ */
369
+ outcome: RedeemOutcome;
370
+ };
371
+
372
+ /**
373
+ * Describes the message kusinta.iot.signaling.v1.RedeemInviteResult.
374
+ * Use `create(RedeemInviteResultSchema)` to create a new message.
375
+ */
376
+ export declare const RedeemInviteResultSchema: GenMessage<RedeemInviteResult>;
377
+
263
378
  /**
264
379
  * Messages sent by the app (GatewaySignalingService.UserConnect stream).
265
380
  * Auth: Authorization: Bearer <jwt> in gRPC request metadata (validated by interceptor).
@@ -491,3 +606,68 @@ export declare type UserSendResponse = Message<"kusinta.iot.signaling.v1.UserSen
491
606
  */
492
607
  export declare const UserSendResponseSchema: GenMessage<UserSendResponse>;
493
608
 
609
+ /**
610
+ * What redeeming an invite did, as the gateway decided it.
611
+ *
612
+ * A redeem is idempotent for its user: redeemed again by the same user, for as
613
+ * long as its secret would have lasted unused, a used invite answers JOINED if
614
+ * the user is filed on its space by then, and otherwise as it did the first time
615
+ * — so a denied request still answers PENDING_APPROVAL — except that one which
616
+ * filed the user, who has left that space since, answers INVALID. To anyone
617
+ * else it answers INVALID. So a user who never saw the first answer can safely
618
+ * try again.
619
+ *
620
+ * @generated from enum kusinta.iot.signaling.v1.RedeemOutcome
621
+ */
622
+ export enum RedeemOutcome {
623
+ /**
624
+ * @generated from enum value: REDEEM_OUTCOME_UNSPECIFIED = 0;
625
+ */
626
+ UNSPECIFIED = 0,
627
+
628
+ /**
629
+ * The user is a member of the invite's space. Answered only once the
630
+ * api-server has applied the member report that names them
631
+ * (reporting.v1.GatewayMember), so the user can connect as soon as they are
632
+ * told. Also the answer for a user already filed on that space: the invite is
633
+ * used up, and their membership is left exactly as it was.
634
+ *
635
+ * @generated from enum value: REDEEM_OUTCOME_JOINED = 1;
636
+ */
637
+ JOINED = 1,
638
+
639
+ /**
640
+ * A join request was made (webrtc.v1.JoinRequest); the user becomes a member
641
+ * once it is approved. Also the answer for a user who already has one on that
642
+ * space.
643
+ *
644
+ * @generated from enum value: REDEEM_OUTCOME_PENDING_APPROVAL = 2;
645
+ */
646
+ PENDING_APPROVAL = 2,
647
+
648
+ /**
649
+ * No invite: unknown, expired, revoked, already used by someone else, a code
650
+ * for an invite bound to another address, or anything else that is not a
651
+ * live invite. One answer for all of them, so a redeem tells nothing about
652
+ * which secrets exist.
653
+ *
654
+ * @generated from enum value: REDEEM_OUTCOME_INVALID = 3;
655
+ */
656
+ INVALID = 3,
657
+
658
+ /**
659
+ * The invite is bound to an address (webrtc.v1.CreateInvite.email) that is not
660
+ * the user's verified one. Answered only to a token, which cannot be guessed;
661
+ * a code bound to another address answers INVALID. Never says which address
662
+ * it is bound to, and leaves the invite pending.
663
+ *
664
+ * @generated from enum value: REDEEM_OUTCOME_WRONG_ACCOUNT = 4;
665
+ */
666
+ WRONG_ACCOUNT = 4,
667
+ }
668
+
669
+ /**
670
+ * Describes the enum kusinta.iot.signaling.v1.RedeemOutcome.
671
+ */
672
+ export declare const RedeemOutcomeSchema: GenEnum<RedeemOutcome>;
673
+
@@ -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("CihrdXNpbnRhL2lvdC9zaWduYWxpbmcvdjEvc2lnbmFsaW5nLnByb3RvEhhrdXNpbnRhLmlvdC5zaWduYWxpbmcudjEiFwoIU2RwT2ZmZXISCwoDc2RwGAEgASgJIhgKCVNkcEFuc3dlchILCgNzZHAYASABKAkiSwoMSWNlQ2FuZGlkYXRlEhEKCWNhbmRpZGF0ZRgBIAEoCRIPCgdzZHBfbWlkGAIgASgJEhcKD3NkcF9tbGluZV9pbmRleBgDIAEoBSILCglIZWFydEJlYXQiTgoNVXNlckhhbmRzaGFrZRI9ChF0YXJnZXRfZ2F0ZXdheV9pZBgBIAEoCzIiLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkdhdGV3YXlJZCJTChBVc2VySGFuZHNoYWtlQWNrEhAKCGFjY2VwdGVkGAEgASgIEg4KBnJlYXNvbhgCIAEoCRIdChVoZWFydGJlYXRfaW50ZXJ2YWxfbXMYAyABKA0ioQIKFUdhdGV3YXlDb25uZWN0UmVxdWVzdBI3Cg50YXJnZXRfdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBISCgpzZXNzaW9uX2lkGAUgASgJEjUKBmFuc3dlchgCIAEoCzIjLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5TZHBBbnN3ZXJIABI/Cg1pY2VfY2FuZGlkYXRlGAMgASgLMiYua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkljZUNhbmRpZGF0ZUgAEjgKCWhlYXJ0YmVhdBgEIAEoCzIjLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5IZWFydEJlYXRIAEIJCgdwYXlsb2FkIuQBChZHYXRld2F5Q29ubmVjdFJlc3BvbnNlEjUKDGZyb21fdXNlcl9pZBgBIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBISCgpzZXNzaW9uX2lkGAQgASgJEjMKBW9mZmVyGAIgASgLMiIua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlNkcE9mZmVySAASPwoNaWNlX2NhbmRpZGF0ZRgDIAEoCzImLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5JY2VDYW5kaWRhdGVIAEIJCgdwYXlsb2FkIucBChJVc2VyQ29ubmVjdFJlcXVlc3QSEgoKc2Vzc2lvbl9pZBgEIAEoCRI8CgloYW5kc2hha2UYASABKAsyJy5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuVXNlckhhbmRzaGFrZUgAEjMKBW9mZmVyGAIgASgLMiIua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlNkcE9mZmVySAASPwoNaWNlX2NhbmRpZGF0ZRgDIAEoCzImLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5JY2VDYW5kaWRhdGVIAEIJCgdwYXlsb2FkIqsCChNVc2VyQ29ubmVjdFJlc3BvbnNlEhIKCnNlc3Npb25faWQYBCABKAkSQwoNaGFuZHNoYWtlX2FjaxgBIAEoCzIqLmt1c2ludGEuaW90LnNpZ25hbGluZy52MS5Vc2VySGFuZHNoYWtlQWNrSAASNQoGYW5zd2VyGAIgASgLMiMua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlNkcEFuc3dlckgAEj8KDWljZV9jYW5kaWRhdGUYAyABKAsyJi5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuSWNlQ2FuZGlkYXRlSAASOAoJaGVhcnRiZWF0GAUgASgLMiMua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkhlYXJ0QmVhdEgAQgkKB3BheWxvYWQibwoRVXNlckxpc3RlblJlcXVlc3QSOgoJaGFuZHNoYWtlGAEgASgLMicua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLlVzZXJIYW5kc2hha2USEgoKc2Vzc2lvbl9pZBgEIAEoCUoECAIQA0oECAMQBCJVChJVc2VyTGlzdGVuUmVzcG9uc2USPwoIcmVzcG9uc2UYASABKAsyLS5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuVXNlckNvbm5lY3RSZXNwb25zZSK3AQoPVXNlclNlbmRSZXF1ZXN0EhIKCnNlc3Npb25faWQYBCABKAkSMwoFb2ZmZXIYAiABKAsyIi5rdXNpbnRhLmlvdC5zaWduYWxpbmcudjEuU2RwT2ZmZXJIABI/Cg1pY2VfY2FuZGlkYXRlGAMgASgLMiYua3VzaW50YS5pb3Quc2lnbmFsaW5nLnYxLkljZUNhbmRpZGF0ZUgAQgkKB3BheWxvYWRKBAgBEAJSCWhhbmRzaGFrZSISChBVc2VyU2VuZFJlc3BvbnNlQgJIAWIGcHJvdG8z", [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,45 +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);
83
97
 
84
98
  /**
85
99
  * Describes the message kusinta.iot.signaling.v1.UserListenRequest.
86
100
  * Use `create(UserListenRequestSchema)` to create a new message.
87
101
  */
88
102
  export const UserListenRequestSchema = /*@__PURE__*/
89
- messageDesc(file_kusinta_iot_signaling_v1_signaling, 10);
103
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 12);
90
104
 
91
105
  /**
92
106
  * Describes the message kusinta.iot.signaling.v1.UserListenResponse.
93
107
  * Use `create(UserListenResponseSchema)` to create a new message.
94
108
  */
95
109
  export const UserListenResponseSchema = /*@__PURE__*/
96
- messageDesc(file_kusinta_iot_signaling_v1_signaling, 11);
110
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 13);
97
111
 
98
112
  /**
99
113
  * Describes the message kusinta.iot.signaling.v1.UserSendRequest.
100
114
  * Use `create(UserSendRequestSchema)` to create a new message.
101
115
  */
102
116
  export const UserSendRequestSchema = /*@__PURE__*/
103
- messageDesc(file_kusinta_iot_signaling_v1_signaling, 12);
117
+ messageDesc(file_kusinta_iot_signaling_v1_signaling, 14);
104
118
 
105
119
  /**
106
120
  * Describes the message kusinta.iot.signaling.v1.UserSendResponse.
107
121
  * Use `create(UserSendResponseSchema)` to create a new message.
108
122
  */
109
123
  export const UserSendResponseSchema = /*@__PURE__*/
110
- messageDesc(file_kusinta_iot_signaling_v1_signaling, 13);
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);
111
147
 
@@ -67,11 +67,23 @@ export declare type AppTokenClaims = Message<"kusinta.iot.webrtc.v1.AppTokenClai
67
67
 
68
68
  /**
69
69
  * Custom claims.
70
- * A user may hold several roles at once (e.g. resident + gateway admin), so
71
- * this is a list. Carried in the JWT as an array of enum NAME strings
72
- * (e.g. ["ROLE_RESIDENT", "ROLE_GATEWAY_ADMIN"]), matching proto3 canonical
73
- * JSON enum encoding — not integer values. This keeps the claim
74
- * self-describing and aligns with text-typed role storage on the api-server.
70
+ * The roles the api-server holds for the user on this gateway: the service
71
+ * roles the gateway reported (reporting.v1.GatewayMember) other than
72
+ * ROLE_GATEWAY_ADMIN, and ROLE_GATEWAY_ADMIN for whoever registered the
73
+ * gateway. A resident's token names none. Carried in the JWT as an array of
74
+ * enum NAME strings (e.g. ["ROLE_TECHNICIAN"]), not integer values. The
75
+ * issuer writes the claim even when it names no role ([]), and a validator
76
+ * refuses a token without it.
77
+ *
78
+ * The gateway authorises from the roles it holds itself, and takes from
79
+ * this claim ROLE_GATEWAY_ADMIN alone. So the api-server MUST set
80
+ * ROLE_GATEWAY_ADMIN here only for the administrator who registered the
81
+ * gateway, never because the gateway reported someone as one: the gateway
82
+ * holds those itself, and a copy in a token would outlive their demotion
83
+ * until the token expired. A gateway that holds roles itself must be
84
+ * deployed before an api-server issues tokens under this rule, since a
85
+ * gateway that authorised from this claim would find residents and
86
+ * reported service roles missing.
75
87
  *
76
88
  * @generated from field: repeated kusinta.iot.access.v1.Role roles = 6;
77
89
  */
@@ -10,6 +10,7 @@ import type { Space } from "../../space/v1/space_pb.js";
10
10
  import type { ManagementAck, ManagementRequest, PrivacyDisclosure, SpaceTree } from "./management_pb.js";
11
11
  import type { DeviceLink, DeviceLinkList } from "../../link/v1/link_pb.js";
12
12
  import type { ApartmentClimateSummary, ClimateMode, RoomClimate, RoomClimateList, RoomHistory } from "../../climate/v1/climate_pb.js";
13
+ import type { IssuedInvite, SpaceInvites } from "./invite_pb.js";
13
14
  import type { PairingErrorDetail, PairingWindow } from "../../common/v1/pairing_pb.js";
14
15
  import type { BackendHealth, ConnectorKind, DeviceOwnershipType } from "../../common/v1/types_pb.js";
15
16
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
@@ -360,6 +361,22 @@ export declare type ManagementResult = Message<"kusinta.iot.webrtc.v1.Management
360
361
  */
361
362
  value: ApartmentClimateSummary;
362
363
  case: "apartmentClimateSummary";
364
+ } | {
365
+ /**
366
+ * create_invite, resend_invite
367
+ *
368
+ * @generated from field: kusinta.iot.webrtc.v1.IssuedInvite issued_invite = 11;
369
+ */
370
+ value: IssuedInvite;
371
+ case: "issuedInvite";
372
+ } | {
373
+ /**
374
+ * list_space_invites
375
+ *
376
+ * @generated from field: kusinta.iot.webrtc.v1.SpaceInvites space_invites = 12;
377
+ */
378
+ value: SpaceInvites;
379
+ case: "spaceInvites";
363
380
  } | { case: undefined; value?: undefined };
364
381
  };
365
382
 
@@ -881,6 +898,14 @@ export declare type GatewayMessage = Message<"kusinta.iot.webrtc.v1.GatewayMessa
881
898
  */
882
899
  value: ServiceStatusChanged;
883
900
  case: "serviceStatusChanged";
901
+ } | {
902
+ /**
903
+ * A space's pending invites and join requests changed; see SpaceInvites.
904
+ *
905
+ * @generated from field: kusinta.iot.webrtc.v1.SpaceInvites space_invites = 24;
906
+ */
907
+ value: SpaceInvites;
908
+ case: "spaceInvites";
884
909
  } | { case: undefined; value?: undefined };
885
910
  };
886
911
 
@@ -14,6 +14,7 @@ import { file_kusinta_iot_link_v1_link } from "../../link/v1/link_pb.js";
14
14
  import { file_kusinta_iot_space_v1_space } from "../../space/v1/space_pb.js";
15
15
  import { file_kusinta_iot_webrtc_v1_command } from "./command_pb.js";
16
16
  import { file_kusinta_iot_webrtc_v1_device_state } from "./device_state_pb.js";
17
+ import { file_kusinta_iot_webrtc_v1_invite } from "./invite_pb.js";
17
18
  import { file_kusinta_iot_webrtc_v1_management } from "./management_pb.js";
18
19
  import { file_kusinta_iot_webrtc_v1_permission_push } from "./permission_push_pb.js";
19
20
 
@@ -21,7 +22,7 @@ import { file_kusinta_iot_webrtc_v1_permission_push } from "./permission_push_pb
21
22
  * Describes the file kusinta/iot/webrtc/v1/envelope.proto.
22
23
  */
23
24
  export const file_kusinta_iot_webrtc_v1_envelope = /*@__PURE__*/
24
- fileDesc("CiRrdXNpbnRhL2lvdC93ZWJydGMvdjEvZW52ZWxvcGUucHJvdG8SFWt1c2ludGEuaW90LndlYnJ0Yy52MSIGCgRQaW5nIgYKBFBvbmciIwoRSGFuZHNoYWtlUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlwKDEFwcEhhbmRzaGFrZRILCgNqd3QYASABKAkSPwoUc3Vic2NyaWJlX2RldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJJChBTdWJzY3JpYmVEZXZpY2VzEjUKCmRldmljZV9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJLChJVbnN1YnNjcmliZURldmljZXMSNQoKZGV2aWNlX2lkcxgBIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpMBChNSZWZ1c2VkU3Vic2NyaXB0aW9uEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjUKBGNvZGUYAiABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yQ29kZRIPCgdtZXNzYWdlGAMgASgJIpoBCg9TdWJzY3JpcHRpb25BY2sSEwoLaW5fcmVwbHlfdG8YASABKAkSNQoKc3Vic2NyaWJlZBgCIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjsKB3JlZnVzZWQYAyADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVmdXNlZFN1YnNjcmlwdGlvbiLRAQoTUHJvcGVydHlSZWFkUmVxdWVzdBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYByABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmSgQIAhAHUg5hdHRyaWJ1dGVfbmFtZVIOY2x1c3Rlcl9pZF9oZXhSCmNsdXN0ZXJfaWRSC2VuZHBvaW50X2lkUhB2ZW5kb3JfZXh0ZW5zaW9uIswBCgxHYXRld2F5RXJyb3ISNQoEY29kZRgBIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSQwoIbWV0YWRhdGEYAyADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBItUEChBNYW5hZ2VtZW50UmVzdWx0EhMKC2luX3JlcGx5X3RvGAEgASgJEjQKBWVycm9yGAIgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEiwKBXNwYWNlGAMgASgLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2VIABI2CgpzcGFjZV90cmVlGAQgASgLMiAua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlVHJlZUgAEjMKA2FjaxgFIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50QWNrSAASNAoFbGlua3MYBiABKAsyIy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmtMaXN0SAASQAoNcm9vbV9jbGltYXRlcxgHIAEoCzInLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUNsaW1hdGVMaXN0SAASOwoMcm9vbV9oaXN0b3J5GAggASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tSGlzdG9yeUgAEkYKEnByaXZhY3lfZGlzY2xvc3VyZRgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcml2YWN5RGlzY2xvc3VyZUgAElQKGWFwYXJ0bWVudF9jbGltYXRlX3N1bW1hcnkYCiABKAsyLy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkFwYXJ0bWVudENsaW1hdGVTdW1tYXJ5SABCCAoGcmVzdWx0IvsBCgxTdGFydFBhaXJpbmcSOgoMY29ubmVjdG9yX2lkGAEgASgLMiQua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuQ29ubmVjdG9ySWQSNAoGd2luZG93GAIgASgLMiQua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdXaW5kb3cSOgoQaW5pdGlhbF9zcGFjZV9pZBgDIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPQoJb3duZXJzaGlwGAQgASgOMioua3VzaW50YS5pb3QuY29tbW9uLnYxLkRldmljZU93bmVyc2hpcFR5cGUijwEKDlBhaXJpbmdTdGFydGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEi4KCmV4cGlyZXNfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjgKBWVycm9yGAMgASgLMikua3VzaW50YS5pb3QuY29tbW9uLnYxLlBhaXJpbmdFcnJvckRldGFpbCKXAQoPUGFpcmluZ0ZpbmlzaGVkEhMKC2luX3JlcGx5X3RvGAEgASgJEjUKCmRldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBI4CgVlcnJvchgDIAEoCzIpLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nRXJyb3JEZXRhaWwiTQoLTGlua0NoYW5nZWQSLQoEbGluaxgBIAEoCzIfLmt1c2ludGEuaW90LmxpbmsudjEuRGV2aWNlTGluaxIPCgdyZW1vdmVkGAIgASgIIogDChNDb25uZWN0b3JEZXNjcmlwdG9yEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEhQKDGRpc3BsYXlfbmFtZRgCIAEoCRIhChlzdXBwb3J0ZWRfZGV2aWNlX3R5cGVfaWRzGAMgAygNEhgKEHN1cHBvcnRzX3BhaXJpbmcYBCABKAgSHQoVc3VwcG9ydHNfcHJvdmlzaW9uaW5nGAUgASgIEhUKDWJyb2tlcnNfbGlua3MYBiABKAgSMgoEa2luZBgHIAEoDjIkLmt1c2ludGEuaW90LmNvbW1vbi52MS5Db25uZWN0b3JLaW5kEhMKC2Rlc2NyaXB0aW9uGAggASgJEjwKDmJhY2tlbmRfaGVhbHRoGAkgASgLMiQua3VzaW50YS5pb3QuY29tbW9uLnYxLkJhY2tlbmRIZWFsdGgSJQodc3VwcG9ydHNfYmFja2VuZF9yZWluaXRpYWxpemUYCiABKAgiVQoTQ29ubmVjdG9yc0Fubm91bmNlZBI+Cgpjb25uZWN0b3JzGAEgAygLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbm5lY3RvckRlc2NyaXB0b3IiRwoSUm9vbUNsaW1hdGVDaGFuZ2VkEjEKBHJvb20YASABKAsyIy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLlJvb21DbGltYXRlIlYKEkNsaW1hdGVNb2RlQ2hhbmdlZBIxCgRtb2RlGAEgASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlTW9kZRINCgVlbmRlZBgCIAEoCCKICwoOR2F0ZXdheU1lc3NhZ2USEgoKbWVzc2FnZV9pZBgBIAEoCRIrCgdzZW50X2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBJECg5zdGF0ZV9zbmFwc2hvdBgDIAEoCzIqLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VTdGF0ZVNuYXBzaG90SAASQAoPcHJvcGVydHlfcmVwb3J0GAQgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLlByb3BlcnR5UmVwb3J0SAASSAoRcGVybWlzc2lvbl91cGRhdGUYBSABKAsyKy5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGl2ZVBlcm1pc3Npb25VcGRhdGVIABI+Cg5jb21tYW5kX3Jlc3VsdBgGIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db21tYW5kUmVzdWx0SAASKwoEcG9uZxgIIAEoCzIbLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qb25nSAASRgoSaGFuZHNoYWtlX3JlamVjdGVkGAkgASgLMigua3VzaW50YS5pb3Qud2VicnRjLnYxLkhhbmRzaGFrZVJlamVjdGVkSAASNAoFZXJyb3IYCiABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9ySAASQgoQc3Vic2NyaXB0aW9uX2FjaxgLIAEoCzImLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TdWJzY3JpcHRpb25BY2tIABI6CgxkZXZpY2VfYWRkZWQYDCABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGV2aWNlQWRkZWRIABI+Cg5kZXZpY2VfcmVtb3ZlZBgNIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5EZXZpY2VSZW1vdmVkSAASRAoRbWFuYWdlbWVudF9yZXN1bHQYDiABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuTWFuYWdlbWVudFJlc3VsdEgAEkAKDWRldmljZV9ldmVudHMYECABKAsyJy5rdXNpbnRhLmlvdC5kZXZpY2UudjEuRGV2aWNlRXZlbnRCYXRjaEgAEkAKD3BhaXJpbmdfc3RhcnRlZBgRIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5QYWlyaW5nU3RhcnRlZEgAEkIKEHBhaXJpbmdfZmluaXNoZWQYEiABKAsyJi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGFpcmluZ0ZpbmlzaGVkSAASOgoMbGlua19jaGFuZ2VkGBMgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpbmtDaGFuZ2VkSAASSgoUY29ubmVjdG9yc19hbm5vdW5jZWQYFCABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29ubmVjdG9yc0Fubm91bmNlZEgAEkkKFHJvb21fY2xpbWF0ZV9jaGFuZ2VkGBUgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLlJvb21DbGltYXRlQ2hhbmdlZEgAEkkKFGNsaW1hdGVfbW9kZV9jaGFuZ2VkGBYgASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkNsaW1hdGVNb2RlQ2hhbmdlZEgAEk0KFnNlcnZpY2Vfc3RhdHVzX2NoYW5nZWQYFyABKAsyKy5rdXNpbnRhLmlvdC53ZWJydGMudjEuU2VydmljZVN0YXR1c0NoYW5nZWRIAEIJCgdwYXlsb2FkSgQIDxAQSgQIBxAIUhZhdHRyaWJ1dGVfd3JpdGVfcmVzdWx0Ug5wcm9wZXJ0eV9ldmVudCKDBQoKQXBwTWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjgKCWhhbmRzaGFrZRgDIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BcHBIYW5kc2hha2VIABI3Cgdjb21tYW5kGAQgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUNvbW1hbmRIABJCCgxyZWFkX3JlcXVlc3QYBSABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUHJvcGVydHlSZWFkUmVxdWVzdEgAEisKBHBpbmcYBiABKAsyGy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGluZ0gAEjwKCXN1YnNjcmliZRgHIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TdWJzY3JpYmVEZXZpY2VzSAASQAoLdW5zdWJzY3JpYmUYCCABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuVW5zdWJzY3JpYmVEZXZpY2VzSAASPgoKbWFuYWdlbWVudBgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50UmVxdWVzdEgAEkcKD2F0dHJpYnV0ZV93cml0ZRgKIAEoCzIsLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BdHRyaWJ1dGVXcml0ZVJlcXVlc3RIABI8Cg1zdGFydF9wYWlyaW5nGAsgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlN0YXJ0UGFpcmluZ0gAQgkKB3BheWxvYWQqogIKEEdhdGV3YXlFcnJvckNvZGUSIgoeR0FURVdBWV9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASIwofR0FURVdBWV9FUlJPUl9DT0RFX05PVF9FTlRJVExFRBABEiYKIkdBVEVXQVlfRVJST1JfQ09ERV9JTlZBTElEX1JFUVVFU1QQAhIiCh5HQVRFV0FZX0VSUk9SX0NPREVfVU5BVkFJTEFCTEUQAxIfChtHQVRFV0FZX0VSUk9SX0NPREVfSU5URVJOQUwQBBIsCihHQVRFV0FZX0VSUk9SX0NPREVfU0VTU0lPTl9MSU1JVF9SRUFDSEVEEAUSKgomR0FURVdBWV9FUlJPUl9DT0RFX0ZBSUxFRF9QUkVDT05ESVRJT04QBkICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_pairing, file_kusinta_iot_common_v1_types, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_webrtc_v1_command, file_kusinta_iot_webrtc_v1_device_state, file_kusinta_iot_webrtc_v1_management, file_kusinta_iot_webrtc_v1_permission_push]);
25
+ fileDesc("CiRrdXNpbnRhL2lvdC93ZWJydGMvdjEvZW52ZWxvcGUucHJvdG8SFWt1c2ludGEuaW90LndlYnJ0Yy52MSIGCgRQaW5nIgYKBFBvbmciIwoRSGFuZHNoYWtlUmVqZWN0ZWQSDgoGcmVhc29uGAEgASgJIlwKDEFwcEhhbmRzaGFrZRILCgNqd3QYASABKAkSPwoUc3Vic2NyaWJlX2RldmljZV9pZHMYAiADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJJChBTdWJzY3JpYmVEZXZpY2VzEjUKCmRldmljZV9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJLChJVbnN1YnNjcmliZURldmljZXMSNQoKZGV2aWNlX2lkcxgBIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkIpMBChNSZWZ1c2VkU3Vic2NyaXB0aW9uEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjUKBGNvZGUYAiABKA4yJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yQ29kZRIPCgdtZXNzYWdlGAMgASgJIpoBCg9TdWJzY3JpcHRpb25BY2sSEwoLaW5fcmVwbHlfdG8YASABKAkSNQoKc3Vic2NyaWJlZBgCIAMoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjsKB3JlZnVzZWQYAyADKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVmdXNlZFN1YnNjcmlwdGlvbiLRAQoTUHJvcGVydHlSZWFkUmVxdWVzdBI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCgZ0YXJnZXQYByABKAsyIy5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuQXR0cmlidXRlUmVmSgQIAhAHUg5hdHRyaWJ1dGVfbmFtZVIOY2x1c3Rlcl9pZF9oZXhSCmNsdXN0ZXJfaWRSC2VuZHBvaW50X2lkUhB2ZW5kb3JfZXh0ZW5zaW9uIswBCgxHYXRld2F5RXJyb3ISNQoEY29kZRgBIAEoDjInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HYXRld2F5RXJyb3JDb2RlEg8KB21lc3NhZ2UYAiABKAkSQwoIbWV0YWRhdGEYAyADKAsyMS5rdXNpbnRhLmlvdC53ZWJydGMudjEuR2F0ZXdheUVycm9yLk1ldGFkYXRhRW50cnkaLwoNTWV0YWRhdGFFbnRyeRILCgNrZXkYASABKAkSDQoFdmFsdWUYAiABKAk6AjgBItEFChBNYW5hZ2VtZW50UmVzdWx0EhMKC2luX3JlcGx5X3RvGAEgASgJEjQKBWVycm9yGAIgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEiwKBXNwYWNlGAMgASgLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2VIABI2CgpzcGFjZV90cmVlGAQgASgLMiAua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlVHJlZUgAEjMKA2FjaxgFIAEoCzIkLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50QWNrSAASNAoFbGlua3MYBiABKAsyIy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmtMaXN0SAASQAoNcm9vbV9jbGltYXRlcxgHIAEoCzInLmt1c2ludGEuaW90LmNsaW1hdGUudjEuUm9vbUNsaW1hdGVMaXN0SAASOwoMcm9vbV9oaXN0b3J5GAggASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tSGlzdG9yeUgAEkYKEnByaXZhY3lfZGlzY2xvc3VyZRgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcml2YWN5RGlzY2xvc3VyZUgAElQKGWFwYXJ0bWVudF9jbGltYXRlX3N1bW1hcnkYCiABKAsyLy5rdXNpbnRhLmlvdC5jbGltYXRlLnYxLkFwYXJ0bWVudENsaW1hdGVTdW1tYXJ5SAASPAoNaXNzdWVkX2ludml0ZRgLIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Jc3N1ZWRJbnZpdGVIABI8Cg1zcGFjZV9pbnZpdGVzGAwgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlNwYWNlSW52aXRlc0gAQggKBnJlc3VsdCL7AQoMU3RhcnRQYWlyaW5nEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEjQKBndpbmRvdxgCIAEoCzIkLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nV2luZG93EjoKEGluaXRpYWxfc3BhY2VfaWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEj0KCW93bmVyc2hpcBgEIAEoDjIqLmt1c2ludGEuaW90LmNvbW1vbi52MS5EZXZpY2VPd25lcnNoaXBUeXBlIo8BCg5QYWlyaW5nU3RhcnRlZBITCgtpbl9yZXBseV90bxgBIAEoCRIuCgpleHBpcmVzX2F0GAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI4CgVlcnJvchgDIAEoCzIpLmt1c2ludGEuaW90LmNvbW1vbi52MS5QYWlyaW5nRXJyb3JEZXRhaWwilwEKD1BhaXJpbmdGaW5pc2hlZBITCgtpbl9yZXBseV90bxgBIAEoCRI1CgpkZXZpY2VfaWRzGAIgAygLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWQSOAoFZXJyb3IYAyABKAsyKS5rdXNpbnRhLmlvdC5jb21tb24udjEuUGFpcmluZ0Vycm9yRGV0YWlsIk0KC0xpbmtDaGFuZ2VkEi0KBGxpbmsYASABKAsyHy5rdXNpbnRhLmlvdC5saW5rLnYxLkRldmljZUxpbmsSDwoHcmVtb3ZlZBgCIAEoCCKIAwoTQ29ubmVjdG9yRGVzY3JpcHRvchI6Cgxjb25uZWN0b3JfaWQYASABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZBIUCgxkaXNwbGF5X25hbWUYAiABKAkSIQoZc3VwcG9ydGVkX2RldmljZV90eXBlX2lkcxgDIAMoDRIYChBzdXBwb3J0c19wYWlyaW5nGAQgASgIEh0KFXN1cHBvcnRzX3Byb3Zpc2lvbmluZxgFIAEoCBIVCg1icm9rZXJzX2xpbmtzGAYgASgIEjIKBGtpbmQYByABKA4yJC5rdXNpbnRhLmlvdC5jb21tb24udjEuQ29ubmVjdG9yS2luZBITCgtkZXNjcmlwdGlvbhgIIAEoCRI8Cg5iYWNrZW5kX2hlYWx0aBgJIAEoCzIkLmt1c2ludGEuaW90LmNvbW1vbi52MS5CYWNrZW5kSGVhbHRoEiUKHXN1cHBvcnRzX2JhY2tlbmRfcmVpbml0aWFsaXplGAogASgIIlUKE0Nvbm5lY3RvcnNBbm5vdW5jZWQSPgoKY29ubmVjdG9ycxgBIAMoCzIqLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25uZWN0b3JEZXNjcmlwdG9yIkcKElJvb21DbGltYXRlQ2hhbmdlZBIxCgRyb29tGAEgASgLMiMua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5Sb29tQ2xpbWF0ZSJWChJDbGltYXRlTW9kZUNoYW5nZWQSMQoEbW9kZRgBIAEoCzIjLmt1c2ludGEuaW90LmNsaW1hdGUudjEuQ2xpbWF0ZU1vZGUSDQoFZW5kZWQYAiABKAgixgsKDkdhdGV3YXlNZXNzYWdlEhIKCm1lc3NhZ2VfaWQYASABKAkSKwoHc2VudF9hdBgCIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASRAoOc3RhdGVfc25hcHNob3QYAyABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGV2aWNlU3RhdGVTbmFwc2hvdEgAEkAKD3Byb3BlcnR5X3JlcG9ydBgEIAEoCzIlLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcm9wZXJ0eVJlcG9ydEgAEkgKEXBlcm1pc3Npb25fdXBkYXRlGAUgASgLMisua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpdmVQZXJtaXNzaW9uVXBkYXRlSAASPgoOY29tbWFuZF9yZXN1bHQYBiABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29tbWFuZFJlc3VsdEgAEisKBHBvbmcYCCABKAsyGy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUG9uZ0gAEkYKEmhhbmRzaGFrZV9yZWplY3RlZBgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5IYW5kc2hha2VSZWplY3RlZEgAEjQKBWVycm9yGAogASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkdhdGV3YXlFcnJvckgAEkIKEHN1YnNjcmlwdGlvbl9hY2sYCyABKAsyJi5rdXNpbnRhLmlvdC53ZWJydGMudjEuU3Vic2NyaXB0aW9uQWNrSAASOgoMZGV2aWNlX2FkZGVkGAwgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUFkZGVkSAASPgoOZGV2aWNlX3JlbW92ZWQYDSABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuRGV2aWNlUmVtb3ZlZEgAEkQKEW1hbmFnZW1lbnRfcmVzdWx0GA4gASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLk1hbmFnZW1lbnRSZXN1bHRIABJACg1kZXZpY2VfZXZlbnRzGBAgASgLMicua3VzaW50YS5pb3QuZGV2aWNlLnYxLkRldmljZUV2ZW50QmF0Y2hIABJACg9wYWlyaW5nX3N0YXJ0ZWQYESABKAsyJS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGFpcmluZ1N0YXJ0ZWRIABJCChBwYWlyaW5nX2ZpbmlzaGVkGBIgASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLlBhaXJpbmdGaW5pc2hlZEgAEjoKDGxpbmtfY2hhbmdlZBgTIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaW5rQ2hhbmdlZEgAEkoKFGNvbm5lY3RvcnNfYW5ub3VuY2VkGBQgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLkNvbm5lY3RvcnNBbm5vdW5jZWRIABJJChRyb29tX2NsaW1hdGVfY2hhbmdlZBgVIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Sb29tQ2xpbWF0ZUNoYW5nZWRIABJJChRjbGltYXRlX21vZGVfY2hhbmdlZBgWIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5DbGltYXRlTW9kZUNoYW5nZWRIABJNChZzZXJ2aWNlX3N0YXR1c19jaGFuZ2VkGBcgASgLMisua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VTdGF0dXNDaGFuZ2VkSAASPAoNc3BhY2VfaW52aXRlcxgYIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TcGFjZUludml0ZXNIAEIJCgdwYXlsb2FkSgQIDxAQSgQIBxAIUhZhdHRyaWJ1dGVfd3JpdGVfcmVzdWx0Ug5wcm9wZXJ0eV9ldmVudCKDBQoKQXBwTWVzc2FnZRISCgptZXNzYWdlX2lkGAEgASgJEisKB3NlbnRfYXQYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEjgKCWhhbmRzaGFrZRgDIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BcHBIYW5kc2hha2VIABI3Cgdjb21tYW5kGAQgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLkRldmljZUNvbW1hbmRIABJCCgxyZWFkX3JlcXVlc3QYBSABKAsyKi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUHJvcGVydHlSZWFkUmVxdWVzdEgAEisKBHBpbmcYBiABKAsyGy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGluZ0gAEjwKCXN1YnNjcmliZRgHIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5TdWJzY3JpYmVEZXZpY2VzSAASQAoLdW5zdWJzY3JpYmUYCCABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuVW5zdWJzY3JpYmVEZXZpY2VzSAASPgoKbWFuYWdlbWVudBgJIAEoCzIoLmt1c2ludGEuaW90LndlYnJ0Yy52MS5NYW5hZ2VtZW50UmVxdWVzdEgAEkcKD2F0dHJpYnV0ZV93cml0ZRgKIAEoCzIsLmt1c2ludGEuaW90LndlYnJ0Yy52MS5BdHRyaWJ1dGVXcml0ZVJlcXVlc3RIABI8Cg1zdGFydF9wYWlyaW5nGAsgASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlN0YXJ0UGFpcmluZ0gAQgkKB3BheWxvYWQqogIKEEdhdGV3YXlFcnJvckNvZGUSIgoeR0FURVdBWV9FUlJPUl9DT0RFX1VOU1BFQ0lGSUVEEAASIwofR0FURVdBWV9FUlJPUl9DT0RFX05PVF9FTlRJVExFRBABEiYKIkdBVEVXQVlfRVJST1JfQ09ERV9JTlZBTElEX1JFUVVFU1QQAhIiCh5HQVRFV0FZX0VSUk9SX0NPREVfVU5BVkFJTEFCTEUQAxIfChtHQVRFV0FZX0VSUk9SX0NPREVfSU5URVJOQUwQBBIsCihHQVRFV0FZX0VSUk9SX0NPREVfU0VTU0lPTl9MSU1JVF9SRUFDSEVEEAUSKgomR0FURVdBWV9FUlJPUl9DT0RFX0ZBSUxFRF9QUkVDT05ESVRJT04QBkICSAFiBnByb3RvMw", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_pairing, file_kusinta_iot_common_v1_types, file_kusinta_iot_device_v1_device_event, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_webrtc_v1_command, file_kusinta_iot_webrtc_v1_device_state, file_kusinta_iot_webrtc_v1_invite, file_kusinta_iot_webrtc_v1_management, file_kusinta_iot_webrtc_v1_permission_push]);
25
26
 
26
27
  /**
27
28
  * Describes the message kusinta.iot.webrtc.v1.Ping.