@kusinta/iot-schema 0.2.0-beta.25 → 0.2.0-beta.27

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@kusinta/iot-schema",
3
- "version": "0.2.0-beta.25",
3
+ "version": "0.2.0-beta.27",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -33,6 +33,8 @@
33
33
  "./webrtc/app-token": "./src/kusinta/iot/webrtc/v1/app_token_pb.js",
34
34
  "./webrtc/command": "./src/kusinta/iot/webrtc/v1/command_pb.js",
35
35
  "./webrtc/device-state": "./src/kusinta/iot/webrtc/v1/device_state_pb.js",
36
+ "./webrtc/invite": "./src/kusinta/iot/webrtc/v1/invite_pb.js",
37
+ "./webrtc/members": "./src/kusinta/iot/webrtc/v1/members_pb.js",
36
38
  "./webrtc/management": "./src/kusinta/iot/webrtc/v1/management_pb.js",
37
39
  "./webrtc/permission-push": "./src/kusinta/iot/webrtc/v1/permission_push_pb.js",
38
40
  "./webrtc/setpoint-mode": "./src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js",
@@ -236,7 +236,9 @@ export declare const PermissionActionSchema: GenEnum<PermissionAction>;
236
236
  * who service the building get the service view above and no more. It does not keep the
237
237
  * property owner or the administrator out by force — they hold the building's filing
238
238
  * authority and the gateway itself — but it makes their seeing in a deliberate act on the
239
- * home, such as filing themselves on it, rather than something handed out by default.
239
+ * home, such as filing themselves on it, rather than something handed out by default. Who
240
+ * lives where is the exception: they are shown every member and membership
241
+ * (webrtc.v1.ListGatewayMembers), since they remove a resident who moves out.
240
242
  *
241
243
  * A membership recorded with no relation, made before relations existed, sees no more than
242
244
  * either relation would where it is held: on an apartment or a room, a home as service; on a
@@ -140,7 +140,9 @@ export const MembershipRelationSchema = /*@__PURE__*/
140
140
  * who service the building get the service view above and no more. It does not keep the
141
141
  * property owner or the administrator out by force — they hold the building's filing
142
142
  * authority and the gateway itself — but it makes their seeing in a deliberate act on the
143
- * home, such as filing themselves on it, rather than something handed out by default.
143
+ * home, such as filing themselves on it, rather than something handed out by default. Who
144
+ * lives where is the exception: they are shown every member and membership
145
+ * (webrtc.v1.ListGatewayMembers), since they remove a resident who moves out.
144
146
  *
145
147
  * A membership recorded with no relation, made before relations existed, sees no more than
146
148
  * either relation would where it is held: on an apartment or a room, a home as service; on a
@@ -726,6 +726,12 @@ export declare const ReportServedSpacesResponseSchema: GenMessage<ReportServedSp
726
726
  * administrator is also reported so, the api-server's record governs: their administration
727
727
  * counts from the earlier of its own start and administrator_since.
728
728
  *
729
+ * A member here is a user the gateway holds a membership or a role for, and no one else. The
730
+ * registering administrator is reported only when the gateway holds one of those for them —
731
+ * a membership, or ROLE_PROPERTY_OWNER they were given — and never with the
732
+ * ROLE_GATEWAY_ADMIN their token carries. That the gateway recognises them otherwise
733
+ * (webrtc.v1.MemberDetail.registering_admin) does not make them a member of this report.
734
+ *
729
735
  * @generated from message kusinta.iot.reporting.v1.GatewayMember
730
736
  */
731
737
  export declare type GatewayMember = Message<"kusinta.iot.reporting.v1.GatewayMember"> & {
@@ -841,6 +847,105 @@ export declare type ReportMembersResponse = Message<"kusinta.iot.reporting.v1.Re
841
847
  */
842
848
  export declare const ReportMembersResponseSchema: GenMessage<ReportMembersResponse>;
843
849
 
850
+ /**
851
+ * Which invite secrets this gateway answers for, by hash alone (webrtc.v1 invite.proto
852
+ * gives the hash), so the api-server can route a redeem (signaling.v1.RedeemInvite) to the
853
+ * one gateway that can decide it. Nothing else of an invite leaves the gateway here — not
854
+ * its space, relation, address, creator or expiry — and the hash of a secret says nothing
855
+ * of the secret.
856
+ *
857
+ * A secret's hash is reported from when the secret is issued until it expires, used or not,
858
+ * so that a user who redeemed it can redeem again and be told what came of it
859
+ * (signaling.v1.RedeemOutcome). A revoke, and a resend for the old secrets, removes them at
860
+ * once; an expiry removes them at or soon after the moment, not necessarily to the second,
861
+ * and the gateway still answers INVALID for an expired secret meanwhile. Changes are sent
862
+ * at once.
863
+ *
864
+ * The api-server keeps the hashes of a gateway's current snapshot and changes only, drops
865
+ * them all with the gateway, and routes no redeem by a hash it does not hold.
866
+ *
867
+ * A gateway MUST NOT report more than 10000 hashes at once (two for each of the at most
868
+ * 5000 invites webrtc.v1 CreateInvite allows). The api-server MAY ignore hashes past that.
869
+ *
870
+ * @generated from message kusinta.iot.reporting.v1.ReportInviteRoutesRequest
871
+ */
872
+ export declare type ReportInviteRoutesRequest = Message<"kusinta.iot.reporting.v1.ReportInviteRoutesRequest"> & {
873
+ /**
874
+ * This concern's stream; see SnapshotPart.
875
+ *
876
+ * @generated from field: string stream_id = 1;
877
+ */
878
+ streamId: string;
879
+
880
+ /**
881
+ * The streams this one replaced; see SnapshotPart. Empty on the gateway's first.
882
+ *
883
+ * @generated from field: repeated string previous_stream_ids = 2;
884
+ */
885
+ previousStreamIds: string[];
886
+
887
+ /**
888
+ * As ReportServiceReachRequest.seq, on this concern's own stream.
889
+ *
890
+ * @generated from field: uint64 seq = 3;
891
+ */
892
+ seq: bigint;
893
+
894
+ /**
895
+ * Secret hashes (32 bytes each) this gateway answers for from now.
896
+ *
897
+ * @generated from field: repeated bytes secret_hashes = 4;
898
+ */
899
+ secretHashes: Uint8Array[];
900
+
901
+ /**
902
+ * Secret hashes it no longer answers for. A hash named here and in secret_hashes is
903
+ * removed.
904
+ *
905
+ * @generated from field: repeated bytes removed_secret_hashes = 5;
906
+ */
907
+ removedSecretHashes: Uint8Array[];
908
+
909
+ /**
910
+ * Set when this request is part of a snapshot of every hash; hashes absent from a whole
911
+ * snapshot are routed here no more.
912
+ *
913
+ * @generated from field: kusinta.iot.reporting.v1.SnapshotPart snapshot = 6;
914
+ */
915
+ snapshot?: SnapshotPart | undefined;
916
+ };
917
+
918
+ /**
919
+ * Describes the message kusinta.iot.reporting.v1.ReportInviteRoutesRequest.
920
+ * Use `create(ReportInviteRoutesRequestSchema)` to create a new message.
921
+ */
922
+ export declare const ReportInviteRoutesRequestSchema: GenMessage<ReportInviteRoutesRequest>;
923
+
924
+ /**
925
+ * @generated from message kusinta.iot.reporting.v1.ReportInviteRoutesResponse
926
+ */
927
+ export declare type ReportInviteRoutesResponse = Message<"kusinta.iot.reporting.v1.ReportInviteRoutesResponse"> & {
928
+ /**
929
+ * As ReportServiceReachResponse.applied_seq.
930
+ *
931
+ * @generated from field: uint64 applied_seq = 1;
932
+ */
933
+ appliedSeq: bigint;
934
+
935
+ /**
936
+ * As ReportServiceReachResponse.resync_required.
937
+ *
938
+ * @generated from field: bool resync_required = 2;
939
+ */
940
+ resyncRequired: boolean;
941
+ };
942
+
943
+ /**
944
+ * Describes the message kusinta.iot.reporting.v1.ReportInviteRoutesResponse.
945
+ * Use `create(ReportInviteRoutesResponseSchema)` to create a new message.
946
+ */
947
+ export declare const ReportInviteRoutesResponseSchema: GenMessage<ReportInviteRoutesResponse>;
948
+
844
949
  /**
845
950
  * What kind of problem is open. The device kinds mirror what service staff are given of a
846
951
  * device (webrtc.v1.ServiceStatus: reachability, the battery flags, the ServiceFault values);
@@ -12,7 +12,7 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
12
12
  * Describes the file kusinta/iot/reporting/v1/reporting.proto.
13
13
  */
14
14
  export const file_kusinta_iot_reporting_v1_reporting = /*@__PURE__*/
15
- fileDesc("CihrdXNpbnRhL2lvdC9yZXBvcnRpbmcvdjEvcmVwb3J0aW5nLnByb3RvEhhrdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEiPwoMU25hcHNob3RQYXJ0EhMKC3NuYXBzaG90X2lkGAEgASgJEgwKBHBhcnQYAiABKA0SDAoEbGFzdBgDIAEoCCLZAQoOUHJvYmxlbVN1YmplY3QSNgoJZGV2aWNlX2lkGAEgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWRIABI8Cgxjb25uZWN0b3JfaWQYAiABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZEgAEjMKB3Jvb21faWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkSAASEQoHZ2F0ZXdheRgEIAEoCEgAQgkKB3N1YmplY3Qi6gIKB1Byb2JsZW0SMwoEa2luZBgCIAEoDjIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5Qcm9ibGVtS2luZBI5CgdzdWJqZWN0GAMgASgLMigua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlByb2JsZW1TdWJqZWN0EjIKCHNwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhwKD2JhdHRlcnlfcGVyY2VudBgGIAEoDUgAiAEBEhQKDGRldmljZV9jb3VudBgHIAEoDRJECg9iYWNrZW5kX2ZhaWx1cmUYCCABKA4yKy5rdXNpbnRhLmlvdC5jb21tb24udjEuQmFja2VuZEZhaWx1cmVSZWFzb25CEgoQX2JhdHRlcnlfcGVyY2VudCJ3Cg5Qcm9ibGVtQ2xlYXJlZBIuCgpjbGVhcmVkX2F0GAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI1CgZyZWFzb24YAiABKA4yJS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuQ2xlYXJSZWFzb24irgEKEVByb2JsZW1UcmFuc2l0aW9uEhIKCnByb2JsZW1faWQYASABKAkSCwoDc2VxGAIgASgEEjEKBG9wZW4YAyABKAsyIS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUgAEjsKB2NsZWFyZWQYBCABKAsyKC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUNsZWFyZWRIAEIICgZjaGFuZ2Ui0AEKFVJlcG9ydFByb2JsZW1zUmVxdWVzdBIRCglzdHJlYW1faWQYAyABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgFIAMoCRILCgNzZXEYBCABKAQSQAoLdHJhbnNpdGlvbnMYASADKAsyKy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbVRyYW5zaXRpb24SOAoIc25hcHNob3QYAiABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0ImUKDVRyYW5zaXRpb25BY2sSEgoKcHJvYmxlbV9pZBgBIAEoCRILCgNzZXEYAiABKAQSMwoGc3RhdHVzGAMgASgOMiMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkFja1N0YXR1cyJ9ChZSZXBvcnRQcm9ibGVtc1Jlc3BvbnNlEjUKBGFja3MYASADKAsyJy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuVHJhbnNpdGlvbkFjaxITCgthcHBsaWVkX3NlcRgDIAEoBBIXCg9yZXN5bmNfcmVxdWlyZWQYAiABKAgieAoMU2VydmljZVJlYWNoEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNgoGc3BhY2VzGAMgAygLMiYua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlYWNoZWRTcGFjZSJtCgxSZWFjaGVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEikKBXNpbmNlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKEAgoZUmVwb3J0U2VydmljZVJlYWNoUmVxdWVzdBIRCglzdHJlYW1faWQYBSABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgGIAMoCRILCgNzZXEYASABKAQSNQoFcmVhY2gYAiADKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU2VydmljZVJlYWNoEjkKEHJlbW92ZWRfdXNlcl9pZHMYAyADKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZpY2VSZWFjaFJlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCLiAQoLU2VydmVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjQKCnNwYWNlX3R5cGUYAiABKA4yIC5rdXNpbnRhLmlvdC5jb21tb24udjEuU3BhY2VUeXBlEgwKBG5hbWUYAyABKAkSOQoPcGFyZW50X3NwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBINCgVmbG9vchgFIAEoBRIRCgl0aW1lX3pvbmUYBiABKAkihgIKGVJlcG9ydFNlcnZlZFNwYWNlc1JlcXVlc3QSEQoJc3RyZWFtX2lkGAUgASgJEhsKE3ByZXZpb3VzX3N0cmVhbV9pZHMYBiADKAkSCwoDc2VxGAEgASgEEjUKBnNwYWNlcxgCIAMoCzIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TZXJ2ZWRTcGFjZRI7ChFyZW1vdmVkX3NwYWNlX2lkcxgDIAMoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZlZFNwYWNlc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCKmAQoNR2F0ZXdheU1lbWJlchIwCgd1c2VyX2lkGAEgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEioKBXJvbGVzGAIgAygOMhsua3VzaW50YS5pb3QuYWNjZXNzLnYxLlJvbGUSNwoTYWRtaW5pc3RyYXRvcl9zaW5jZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiggIKFFJlcG9ydE1lbWJlcnNSZXF1ZXN0EhEKCXN0cmVhbV9pZBgBIAEoCRIbChNwcmV2aW91c19zdHJlYW1faWRzGAIgAygJEgsKA3NlcRgDIAEoBBI4CgdtZW1iZXJzGAQgAygLMicua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkdhdGV3YXlNZW1iZXISOQoQcmVtb3ZlZF91c2VyX2lkcxgFIAMoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI4CghzbmFwc2hvdBgGIAEoCzImLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TbmFwc2hvdFBhcnQiRQoVUmVwb3J0TWVtYmVyc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCrcAgoLUHJvYmxlbUtpbmQSHAoYUFJPQkxFTV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobUFJPQkxFTV9LSU5EX0RFVklDRV9PRkZMSU5FEAESHAoYUFJPQkxFTV9LSU5EX0JBVFRFUllfTE9XEAISKwonUFJPQkxFTV9LSU5EX0JBVFRFUllfUkVQTEFDRU1FTlRfTkVFREVEEAMSHQoZUFJPQkxFTV9LSU5EX0RFVklDRV9FUlJPUhAEEh4KGlBST0JMRU1fS0lORF9ERVZJQ0VfVEFNUEVSEAUSIgoeUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9PRkZMSU5FEAYSIAocUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9FUlJPUhAHEiAKHFBST0JMRU1fS0lORF9VTkZJTEVEX0RFVklDRVMQCBIcChhQUk9CTEVNX0tJTkRfV0lORE9XX09QRU4QCSqfAgoLQ2xlYXJSZWFzb24SHAoYQ0xFQVJfUkVBU09OX1VOU1BFQ0lGSUVEEAASGgoWQ0xFQVJfUkVBU09OX1JFQ09WRVJFRBABEhYKEkNMRUFSX1JFQVNPTl9GSUxFRBACEh8KG0NMRUFSX1JFQVNPTl9ERVZJQ0VfUkVNT1ZFRBADEjAKLENMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9PRkZMSU5FEAQSIwofQ0xFQVJfUkVBU09OX05PX0xPTkdFUl9SRVBPUlRFRBAFEhYKEkNMRUFSX1JFQVNPTl9NT1ZFRBAGEi4KKkNMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9FUlJPUhAHKocBCglBY2tTdGF0dXMSGgoWQUNLX1NUQVRVU19VTlNQRUNJRklFRBAAEhYKEkFDS19TVEFUVVNfQVBQTElFRBABEhgKFEFDS19TVEFUVVNfRFVQTElDQVRFEAISFwoTQUNLX1NUQVRVU19SRUpFQ1RFRBADEhMKD0FDS19TVEFUVVNfSEVMRBAEQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity]);
15
+ fileDesc("CihrdXNpbnRhL2lvdC9yZXBvcnRpbmcvdjEvcmVwb3J0aW5nLnByb3RvEhhrdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEiPwoMU25hcHNob3RQYXJ0EhMKC3NuYXBzaG90X2lkGAEgASgJEgwKBHBhcnQYAiABKA0SDAoEbGFzdBgDIAEoCCLZAQoOUHJvYmxlbVN1YmplY3QSNgoJZGV2aWNlX2lkGAEgASgLMiEua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuRGV2aWNlSWRIABI8Cgxjb25uZWN0b3JfaWQYAiABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZEgAEjMKB3Jvb21faWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkSAASEQoHZ2F0ZXdheRgEIAEoCEgAQgkKB3N1YmplY3Qi6gIKB1Byb2JsZW0SMwoEa2luZBgCIAEoDjIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5Qcm9ibGVtS2luZBI5CgdzdWJqZWN0GAMgASgLMigua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlByb2JsZW1TdWJqZWN0EjIKCHNwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBItCglvcGVuZWRfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEhwKD2JhdHRlcnlfcGVyY2VudBgGIAEoDUgAiAEBEhQKDGRldmljZV9jb3VudBgHIAEoDRJECg9iYWNrZW5kX2ZhaWx1cmUYCCABKA4yKy5rdXNpbnRhLmlvdC5jb21tb24udjEuQmFja2VuZEZhaWx1cmVSZWFzb25CEgoQX2JhdHRlcnlfcGVyY2VudCJ3Cg5Qcm9ibGVtQ2xlYXJlZBIuCgpjbGVhcmVkX2F0GAEgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBI1CgZyZWFzb24YAiABKA4yJS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuQ2xlYXJSZWFzb24irgEKEVByb2JsZW1UcmFuc2l0aW9uEhIKCnByb2JsZW1faWQYASABKAkSCwoDc2VxGAIgASgEEjEKBG9wZW4YAyABKAsyIS5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUgAEjsKB2NsZWFyZWQYBCABKAsyKC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbUNsZWFyZWRIAEIICgZjaGFuZ2Ui0AEKFVJlcG9ydFByb2JsZW1zUmVxdWVzdBIRCglzdHJlYW1faWQYAyABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgFIAMoCRILCgNzZXEYBCABKAQSQAoLdHJhbnNpdGlvbnMYASADKAsyKy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUHJvYmxlbVRyYW5zaXRpb24SOAoIc25hcHNob3QYAiABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0ImUKDVRyYW5zaXRpb25BY2sSEgoKcHJvYmxlbV9pZBgBIAEoCRILCgNzZXEYAiABKAQSMwoGc3RhdHVzGAMgASgOMiMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkFja1N0YXR1cyJ9ChZSZXBvcnRQcm9ibGVtc1Jlc3BvbnNlEjUKBGFja3MYASADKAsyJy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuVHJhbnNpdGlvbkFjaxITCgthcHBsaWVkX3NlcRgDIAEoBBIXCg9yZXN5bmNfcmVxdWlyZWQYAiABKAgieAoMU2VydmljZVJlYWNoEjAKB3VzZXJfaWQYASABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSNgoGc3BhY2VzGAMgAygLMiYua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlYWNoZWRTcGFjZSJtCgxSZWFjaGVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEikKBXNpbmNlGAIgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCKEAgoZUmVwb3J0U2VydmljZVJlYWNoUmVxdWVzdBIRCglzdHJlYW1faWQYBSABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgGIAMoCRILCgNzZXEYASABKAQSNQoFcmVhY2gYAiADKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU2VydmljZVJlYWNoEjkKEHJlbW92ZWRfdXNlcl9pZHMYAyADKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZpY2VSZWFjaFJlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCLiAQoLU2VydmVkU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjQKCnNwYWNlX3R5cGUYAiABKA4yIC5rdXNpbnRhLmlvdC5jb21tb24udjEuU3BhY2VUeXBlEgwKBG5hbWUYAyABKAkSOQoPcGFyZW50X3NwYWNlX2lkGAQgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBINCgVmbG9vchgFIAEoBRIRCgl0aW1lX3pvbmUYBiABKAkihgIKGVJlcG9ydFNlcnZlZFNwYWNlc1JlcXVlc3QSEQoJc3RyZWFtX2lkGAUgASgJEhsKE3ByZXZpb3VzX3N0cmVhbV9pZHMYBiADKAkSCwoDc2VxGAEgASgEEjUKBnNwYWNlcxgCIAMoCzIlLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TZXJ2ZWRTcGFjZRI7ChFyZW1vdmVkX3NwYWNlX2lkcxgDIAMoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSOAoIc25hcHNob3QYBCABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydFNlcnZlZFNwYWNlc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCKmAQoNR2F0ZXdheU1lbWJlchIwCgd1c2VyX2lkGAEgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEioKBXJvbGVzGAIgAygOMhsua3VzaW50YS5pb3QuYWNjZXNzLnYxLlJvbGUSNwoTYWRtaW5pc3RyYXRvcl9zaW5jZRgDIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXAiggIKFFJlcG9ydE1lbWJlcnNSZXF1ZXN0EhEKCXN0cmVhbV9pZBgBIAEoCRIbChNwcmV2aW91c19zdHJlYW1faWRzGAIgAygJEgsKA3NlcRgDIAEoBBI4CgdtZW1iZXJzGAQgAygLMicua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLkdhdGV3YXlNZW1iZXISOQoQcmVtb3ZlZF91c2VyX2lkcxgFIAMoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBI4CghzbmFwc2hvdBgGIAEoCzImLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5TbmFwc2hvdFBhcnQiRQoVUmVwb3J0TWVtYmVyc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCLIAQoZUmVwb3J0SW52aXRlUm91dGVzUmVxdWVzdBIRCglzdHJlYW1faWQYASABKAkSGwoTcHJldmlvdXNfc3RyZWFtX2lkcxgCIAMoCRILCgNzZXEYAyABKAQSFQoNc2VjcmV0X2hhc2hlcxgEIAMoDBIdChVyZW1vdmVkX3NlY3JldF9oYXNoZXMYBSADKAwSOAoIc25hcHNob3QYBiABKAsyJi5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuU25hcHNob3RQYXJ0IkoKGlJlcG9ydEludml0ZVJvdXRlc1Jlc3BvbnNlEhMKC2FwcGxpZWRfc2VxGAEgASgEEhcKD3Jlc3luY19yZXF1aXJlZBgCIAEoCCrcAgoLUHJvYmxlbUtpbmQSHAoYUFJPQkxFTV9LSU5EX1VOU1BFQ0lGSUVEEAASHwobUFJPQkxFTV9LSU5EX0RFVklDRV9PRkZMSU5FEAESHAoYUFJPQkxFTV9LSU5EX0JBVFRFUllfTE9XEAISKwonUFJPQkxFTV9LSU5EX0JBVFRFUllfUkVQTEFDRU1FTlRfTkVFREVEEAMSHQoZUFJPQkxFTV9LSU5EX0RFVklDRV9FUlJPUhAEEh4KGlBST0JMRU1fS0lORF9ERVZJQ0VfVEFNUEVSEAUSIgoeUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9PRkZMSU5FEAYSIAocUFJPQkxFTV9LSU5EX0NPTk5FQ1RPUl9FUlJPUhAHEiAKHFBST0JMRU1fS0lORF9VTkZJTEVEX0RFVklDRVMQCBIcChhQUk9CTEVNX0tJTkRfV0lORE9XX09QRU4QCSqfAgoLQ2xlYXJSZWFzb24SHAoYQ0xFQVJfUkVBU09OX1VOU1BFQ0lGSUVEEAASGgoWQ0xFQVJfUkVBU09OX1JFQ09WRVJFRBABEhYKEkNMRUFSX1JFQVNPTl9GSUxFRBACEh8KG0NMRUFSX1JFQVNPTl9ERVZJQ0VfUkVNT1ZFRBADEjAKLENMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9PRkZMSU5FEAQSIwofQ0xFQVJfUkVBU09OX05PX0xPTkdFUl9SRVBPUlRFRBAFEhYKEkNMRUFSX1JFQVNPTl9NT1ZFRBAGEi4KKkNMRUFSX1JFQVNPTl9TVVBFUlNFREVEX0JZX0NPTk5FQ1RPUl9FUlJPUhAHKocBCglBY2tTdGF0dXMSGgoWQUNLX1NUQVRVU19VTlNQRUNJRklFRBAAEhYKEkFDS19TVEFUVVNfQVBQTElFRBABEhgKFEFDS19TVEFUVVNfRFVQTElDQVRFEAISFwoTQUNLX1NUQVRVU19SRUpFQ1RFRBADEhMKD0FDS19TVEFUVVNfSEVMRBAEQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity]);
16
16
 
17
17
  /**
18
18
  * Describes the message kusinta.iot.reporting.v1.SnapshotPart.
@@ -140,6 +140,20 @@ export const ReportMembersRequestSchema = /*@__PURE__*/
140
140
  export const ReportMembersResponseSchema = /*@__PURE__*/
141
141
  messageDesc(file_kusinta_iot_reporting_v1_reporting, 17);
142
142
 
143
+ /**
144
+ * Describes the message kusinta.iot.reporting.v1.ReportInviteRoutesRequest.
145
+ * Use `create(ReportInviteRoutesRequestSchema)` to create a new message.
146
+ */
147
+ export const ReportInviteRoutesRequestSchema = /*@__PURE__*/
148
+ messageDesc(file_kusinta_iot_reporting_v1_reporting, 18);
149
+
150
+ /**
151
+ * Describes the message kusinta.iot.reporting.v1.ReportInviteRoutesResponse.
152
+ * Use `create(ReportInviteRoutesResponseSchema)` to create a new message.
153
+ */
154
+ export const ReportInviteRoutesResponseSchema = /*@__PURE__*/
155
+ messageDesc(file_kusinta_iot_reporting_v1_reporting, 19);
156
+
143
157
  /**
144
158
  * Describes the enum kusinta.iot.reporting.v1.ProblemKind.
145
159
  */
@@ -3,7 +3,7 @@
3
3
  /* eslint-disable */
4
4
 
5
5
  import type { GenFile, GenService } from "@bufbuild/protobuf/codegenv2";
6
- import type { ReportMembersRequestSchema, ReportMembersResponseSchema, ReportProblemsRequestSchema, ReportProblemsResponseSchema, ReportServedSpacesRequestSchema, ReportServedSpacesResponseSchema, ReportServiceReachRequestSchema, ReportServiceReachResponseSchema } from "./reporting_pb.js";
6
+ import type { ReportInviteRoutesRequestSchema, ReportInviteRoutesResponseSchema, ReportMembersRequestSchema, ReportMembersResponseSchema, ReportProblemsRequestSchema, ReportProblemsResponseSchema, ReportServedSpacesRequestSchema, ReportServedSpacesResponseSchema, ReportServiceReachRequestSchema, ReportServiceReachResponseSchema } from "./reporting_pb.js";
7
7
 
8
8
  /**
9
9
  * Describes the file kusinta/iot/reporting/v1/reporting_service.proto.
@@ -51,5 +51,13 @@ export declare const GatewayReportingService: GenService<{
51
51
  input: typeof ReportMembersRequestSchema;
52
52
  output: typeof ReportMembersResponseSchema;
53
53
  },
54
+ /**
55
+ * @generated from rpc kusinta.iot.reporting.v1.GatewayReportingService.ReportInviteRoutes
56
+ */
57
+ reportInviteRoutes: {
58
+ methodKind: "unary";
59
+ input: typeof ReportInviteRoutesRequestSchema;
60
+ output: typeof ReportInviteRoutesResponseSchema;
61
+ },
54
62
  }>;
55
63
 
@@ -9,7 +9,7 @@ import { file_kusinta_iot_reporting_v1_reporting } from "./reporting_pb.js";
9
9
  * Describes the file kusinta/iot/reporting/v1/reporting_service.proto.
10
10
  */
11
11
  export const file_kusinta_iot_reporting_v1_reporting_service = /*@__PURE__*/
12
- fileDesc("CjBrdXNpbnRhL2lvdC9yZXBvcnRpbmcvdjEvcmVwb3J0aW5nX3NlcnZpY2UucHJvdG8SGGt1c2ludGEuaW90LnJlcG9ydGluZy52MTKCBAoXR2F0ZXdheVJlcG9ydGluZ1NlcnZpY2UScwoOUmVwb3J0UHJvYmxlbXMSLy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUmVwb3J0UHJvYmxlbXNSZXF1ZXN0GjAua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlcG9ydFByb2JsZW1zUmVzcG9uc2USfwoSUmVwb3J0U2VydmljZVJlYWNoEjMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlcG9ydFNlcnZpY2VSZWFjaFJlcXVlc3QaNC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUmVwb3J0U2VydmljZVJlYWNoUmVzcG9uc2USfwoSUmVwb3J0U2VydmVkU3BhY2VzEjMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlcG9ydFNlcnZlZFNwYWNlc1JlcXVlc3QaNC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUmVwb3J0U2VydmVkU3BhY2VzUmVzcG9uc2UScAoNUmVwb3J0TWVtYmVycxIuLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5SZXBvcnRNZW1iZXJzUmVxdWVzdBovLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5SZXBvcnRNZW1iZXJzUmVzcG9uc2VCAkgBYgZwcm90bzM", [file_kusinta_iot_reporting_v1_reporting]);
12
+ fileDesc("CjBrdXNpbnRhL2lvdC9yZXBvcnRpbmcvdjEvcmVwb3J0aW5nX3NlcnZpY2UucHJvdG8SGGt1c2ludGEuaW90LnJlcG9ydGluZy52MTKDBQoXR2F0ZXdheVJlcG9ydGluZ1NlcnZpY2UScwoOUmVwb3J0UHJvYmxlbXMSLy5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUmVwb3J0UHJvYmxlbXNSZXF1ZXN0GjAua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlcG9ydFByb2JsZW1zUmVzcG9uc2USfwoSUmVwb3J0U2VydmljZVJlYWNoEjMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlcG9ydFNlcnZpY2VSZWFjaFJlcXVlc3QaNC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUmVwb3J0U2VydmljZVJlYWNoUmVzcG9uc2USfwoSUmVwb3J0U2VydmVkU3BhY2VzEjMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlcG9ydFNlcnZlZFNwYWNlc1JlcXVlc3QaNC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUmVwb3J0U2VydmVkU3BhY2VzUmVzcG9uc2UScAoNUmVwb3J0TWVtYmVycxIuLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5SZXBvcnRNZW1iZXJzUmVxdWVzdBovLmt1c2ludGEuaW90LnJlcG9ydGluZy52MS5SZXBvcnRNZW1iZXJzUmVzcG9uc2USfwoSUmVwb3J0SW52aXRlUm91dGVzEjMua3VzaW50YS5pb3QucmVwb3J0aW5nLnYxLlJlcG9ydEludml0ZVJvdXRlc1JlcXVlc3QaNC5rdXNpbnRhLmlvdC5yZXBvcnRpbmcudjEuUmVwb3J0SW52aXRlUm91dGVzUmVzcG9uc2VCAkgBYgZwcm90bzM", [file_kusinta_iot_reporting_v1_reporting]);
13
13
 
14
14
  /**
15
15
  * The building-server gateway's reports to the api-server, over the gateway's client
@@ -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,104 @@ 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, 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
+
263
379
  /**
264
380
  * Messages sent by the app (GatewaySignalingService.UserConnect stream).
265
381
  * Auth: Authorization: Bearer <jwt> in gRPC request metadata (validated by interceptor).
@@ -491,3 +607,68 @@ export declare type UserSendResponse = Message<"kusinta.iot.signaling.v1.UserSen
491
607
  */
492
608
  export declare const UserSendResponseSchema: GenMessage<UserSendResponse>;
493
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("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
 
@@ -108,7 +108,7 @@ export declare type Space = Message<"kusinta.iot.space.v1.Space"> & {
108
108
  * live with, and anyone filed on their home as service, since being filed on a home
109
109
  * is an act on it its residents should see. Service reach from a building or floor
110
110
  * above is not listed; webrtc.v1.PrivacyDisclosure tells them what kinds of party
111
- * hold it, without naming anyone;
111
+ * hold it, and who, without saying where anyone lives;
112
112
  * * anyone else sees none, residents of a building or floor included.
113
113
  *
114
114
  * @generated from field: repeated kusinta.iot.space.v1.SpaceMember members = 13;
@@ -117,6 +117,20 @@ export declare type AppTokenClaims = Message<"kusinta.iot.webrtc.v1.AppTokenClai
117
117
  * @generated from field: kusinta.iot.webrtc.v1.Confirmation cnf = 7;
118
118
  */
119
119
  cnf?: Confirmation | undefined;
120
+
121
+ /**
122
+ * The user's display name as the identity provider holds it, or empty. The issuer MUST
123
+ * take it from the provider's display-name claim alone and send it empty rather than
124
+ * fall back to a username, an email address or any other field, since a username is an
125
+ * email address wherever accounts log in by email. The gateway records it only to name the
126
+ * user to the people who may see who they are (MemberDetail.name, ServiceParty.names),
127
+ * and treats it as self-chosen: it removes control and format characters (bidirectional
128
+ * overrides among them) and keeps at most 80 Unicode code points. A validator accepts a
129
+ * token without it. Carried in the JWT as "name".
130
+ *
131
+ * @generated from field: string name = 8;
132
+ */
133
+ name: string;
120
134
  };
121
135
 
122
136
  /**
@@ -10,7 +10,7 @@ import { file_kusinta_iot_access_v1_roles } from "../../access/v1/roles_pb.js";
10
10
  * Describes the file kusinta/iot/webrtc/v1/app_token.proto.
11
11
  */
12
12
  export const file_kusinta_iot_webrtc_v1_app_token = /*@__PURE__*/
13
- fileDesc("CiVrdXNpbnRhL2lvdC93ZWJydGMvdjEvYXBwX3Rva2VuLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEi5wEKDkFwcFRva2VuQ2xhaW1zEgsKA2lzcxgBIAEoCRILCgNhdWQYAiABKAkSCwoDc3ViGAMgASgJEicKA2lhdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASJwoDZXhwGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIqCgVyb2xlcxgGIAMoDjIbLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Sb2xlEjAKA2NuZhgHIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25maXJtYXRpb24iIAoMQ29uZmlybWF0aW9uEhAKCHg1dF9zMjU2GAEgASgJQgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles]);
13
+ fileDesc("CiVrdXNpbnRhL2lvdC93ZWJydGMvdjEvYXBwX3Rva2VuLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEi9QEKDkFwcFRva2VuQ2xhaW1zEgsKA2lzcxgBIAEoCRILCgNhdWQYAiABKAkSCwoDc3ViGAMgASgJEicKA2lhdBgEIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASJwoDZXhwGAUgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBIqCgVyb2xlcxgGIAMoDjIbLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Sb2xlEjAKA2NuZhgHIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Db25maXJtYXRpb24SDAoEbmFtZRgIIAEoCSIgCgxDb25maXJtYXRpb24SEAoIeDV0X3MyNTYYASABKAlCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles]);
14
14
 
15
15
  /**
16
16
  * Describes the message kusinta.iot.webrtc.v1.AppTokenClaims.