@kusinta/iot-schema 0.2.0-beta.25 → 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.
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.26",
4
4
  "type": "module",
5
5
  "license": "MIT",
6
6
  "files": ["src"],
@@ -33,6 +33,7 @@
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",
36
37
  "./webrtc/management": "./src/kusinta/iot/webrtc/v1/management_pb.js",
37
38
  "./webrtc/permission-push": "./src/kusinta/iot/webrtc/v1/permission_push_pb.js",
38
39
  "./webrtc/setpoint-mode": "./src/kusinta/iot/webrtc/v1/setpoint_mode_pb.js",
@@ -841,6 +841,105 @@ export declare type ReportMembersResponse = Message<"kusinta.iot.reporting.v1.Re
841
841
  */
842
842
  export declare const ReportMembersResponseSchema: GenMessage<ReportMembersResponse>;
843
843
 
844
+ /**
845
+ * Which invite secrets this gateway answers for, by hash alone (webrtc.v1 invite.proto
846
+ * gives the hash), so the api-server can route a redeem (signaling.v1.RedeemInvite) to the
847
+ * one gateway that can decide it. Nothing else of an invite leaves the gateway here — not
848
+ * its space, relation, address, creator or expiry — and the hash of a secret says nothing
849
+ * of the secret.
850
+ *
851
+ * A secret's hash is reported from when the secret is issued until it expires, used or not,
852
+ * so that a user who redeemed it can redeem again and be told what came of it
853
+ * (signaling.v1.RedeemOutcome). A revoke, and a resend for the old secrets, removes them at
854
+ * once; an expiry removes them at or soon after the moment, not necessarily to the second,
855
+ * and the gateway still answers INVALID for an expired secret meanwhile. Changes are sent
856
+ * at once.
857
+ *
858
+ * The api-server keeps the hashes of a gateway's current snapshot and changes only, drops
859
+ * them all with the gateway, and routes no redeem by a hash it does not hold.
860
+ *
861
+ * A gateway MUST NOT report more than 10000 hashes at once (two for each of the at most
862
+ * 5000 invites webrtc.v1 CreateInvite allows). The api-server MAY ignore hashes past that.
863
+ *
864
+ * @generated from message kusinta.iot.reporting.v1.ReportInviteRoutesRequest
865
+ */
866
+ export declare type ReportInviteRoutesRequest = Message<"kusinta.iot.reporting.v1.ReportInviteRoutesRequest"> & {
867
+ /**
868
+ * This concern's stream; see SnapshotPart.
869
+ *
870
+ * @generated from field: string stream_id = 1;
871
+ */
872
+ streamId: string;
873
+
874
+ /**
875
+ * The streams this one replaced; see SnapshotPart. Empty on the gateway's first.
876
+ *
877
+ * @generated from field: repeated string previous_stream_ids = 2;
878
+ */
879
+ previousStreamIds: string[];
880
+
881
+ /**
882
+ * As ReportServiceReachRequest.seq, on this concern's own stream.
883
+ *
884
+ * @generated from field: uint64 seq = 3;
885
+ */
886
+ seq: bigint;
887
+
888
+ /**
889
+ * Secret hashes (32 bytes each) this gateway answers for from now.
890
+ *
891
+ * @generated from field: repeated bytes secret_hashes = 4;
892
+ */
893
+ secretHashes: Uint8Array[];
894
+
895
+ /**
896
+ * Secret hashes it no longer answers for. A hash named here and in secret_hashes is
897
+ * removed.
898
+ *
899
+ * @generated from field: repeated bytes removed_secret_hashes = 5;
900
+ */
901
+ removedSecretHashes: Uint8Array[];
902
+
903
+ /**
904
+ * Set when this request is part of a snapshot of every hash; hashes absent from a whole
905
+ * snapshot are routed here no more.
906
+ *
907
+ * @generated from field: kusinta.iot.reporting.v1.SnapshotPart snapshot = 6;
908
+ */
909
+ snapshot?: SnapshotPart | undefined;
910
+ };
911
+
912
+ /**
913
+ * Describes the message kusinta.iot.reporting.v1.ReportInviteRoutesRequest.
914
+ * Use `create(ReportInviteRoutesRequestSchema)` to create a new message.
915
+ */
916
+ export declare const ReportInviteRoutesRequestSchema: GenMessage<ReportInviteRoutesRequest>;
917
+
918
+ /**
919
+ * @generated from message kusinta.iot.reporting.v1.ReportInviteRoutesResponse
920
+ */
921
+ export declare type ReportInviteRoutesResponse = Message<"kusinta.iot.reporting.v1.ReportInviteRoutesResponse"> & {
922
+ /**
923
+ * As ReportServiceReachResponse.applied_seq.
924
+ *
925
+ * @generated from field: uint64 applied_seq = 1;
926
+ */
927
+ appliedSeq: bigint;
928
+
929
+ /**
930
+ * As ReportServiceReachResponse.resync_required.
931
+ *
932
+ * @generated from field: bool resync_required = 2;
933
+ */
934
+ resyncRequired: boolean;
935
+ };
936
+
937
+ /**
938
+ * Describes the message kusinta.iot.reporting.v1.ReportInviteRoutesResponse.
939
+ * Use `create(ReportInviteRoutesResponseSchema)` to create a new message.
940
+ */
941
+ export declare const ReportInviteRoutesResponseSchema: GenMessage<ReportInviteRoutesResponse>;
942
+
844
943
  /**
845
944
  * What kind of problem is open. The device kinds mirror what service staff are given of a
846
945
  * 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,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
 
@@ -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.
@@ -0,0 +1,400 @@
1
+ // @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
2
+ // @generated from file kusinta/iot/webrtc/v1/invite.proto (package kusinta.iot.webrtc.v1, syntax proto3)
3
+ /* eslint-disable */
4
+
5
+ import type { GenFile, GenMessage } from "@bufbuild/protobuf/codegenv2";
6
+ import type { Message } from "@bufbuild/protobuf";
7
+ import type { SpaceId, UserId } from "../../identity/v1/identity_pb.js";
8
+ import type { MembershipRelation } from "../../access/v1/roles_pb.js";
9
+ import type { Timestamp } from "@bufbuild/protobuf/wkt";
10
+
11
+ /**
12
+ * Describes the file kusinta/iot/webrtc/v1/invite.proto.
13
+ */
14
+ export declare const file_kusinta_iot_webrtc_v1_invite: GenFile;
15
+
16
+ /**
17
+ * Creates an invite on a space.
18
+ *
19
+ * relation is RESIDENT or SERVICE and nothing else, and it decides the role the person
20
+ * will hold: a resident for RESIDENT, a technician for SERVICE. RESIDENT is refused
21
+ * anywhere but a home (access.v1.MembershipRelation). No invite ever makes anyone a
22
+ * gateway administrator or a property owner: those come only by promotion of someone
23
+ * already a member, and any other relation is refused as INVALID_REQUEST.
24
+ *
25
+ * Who may create one is the gateway's decision, as for AssignUserToSpace. The gateway may
26
+ * let a home's residents invite residents into their own home only, within a limit per
27
+ * home. A caller over that limit is refused as FAILED_PRECONDITION with metadata
28
+ * {"reason": "household_full"}.
29
+ *
30
+ * A gateway holds at most 5000 invites whose secrets it reports
31
+ * (reporting.v1.ReportInviteRoutesRequest), used ones included until their secrets
32
+ * expire. Past that, CreateInvite MUST be refused as FAILED_PRECONDITION with metadata
33
+ * {"reason": "too_many_invites"}, so no invite exists that the api-server cannot route.
34
+ *
35
+ * Answered with IssuedInvite.
36
+ *
37
+ * @generated from message kusinta.iot.webrtc.v1.CreateInvite
38
+ */
39
+ export declare type CreateInvite = Message<"kusinta.iot.webrtc.v1.CreateInvite"> & {
40
+ /**
41
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 1;
42
+ */
43
+ spaceId?: SpaceId | undefined;
44
+
45
+ /**
46
+ * @generated from field: kusinta.iot.access.v1.MembershipRelation relation = 2;
47
+ */
48
+ relation: MembershipRelation;
49
+
50
+ /**
51
+ * When set, the invite is bound to this address: only an account whose verified email
52
+ * is this address can redeem it (see RedeemInvite). Compared trimmed and
53
+ * case-insensitively over the whole address, with no other folding.
54
+ *
55
+ * One pending invite per space and address: a second for the same address on the same
56
+ * space is refused as FAILED_PRECONDITION with metadata {"reason": "already_invited",
57
+ * "invite_id": <the pending one>}, so the app can offer to resend that one instead.
58
+ *
59
+ * The gateway keeps the address only while the invite is pending, and drops it once the
60
+ * invite is redeemed, revoked or expired.
61
+ *
62
+ * @generated from field: string email = 3;
63
+ */
64
+ email: string;
65
+ };
66
+
67
+ /**
68
+ * Describes the message kusinta.iot.webrtc.v1.CreateInvite.
69
+ * Use `create(CreateInviteSchema)` to create a new message.
70
+ */
71
+ export declare const CreateInviteSchema: GenMessage<CreateInvite>;
72
+
73
+ /**
74
+ * Gives a pending invite new secrets. The old token and code stop working at once, so
75
+ * only the newest link, code or email does. Both expiries restart from now. Answered
76
+ * with IssuedInvite. An invite's bound address cannot be changed: revoke it and create
77
+ * another.
78
+ *
79
+ * @generated from message kusinta.iot.webrtc.v1.ResendInvite
80
+ */
81
+ export declare type ResendInvite = Message<"kusinta.iot.webrtc.v1.ResendInvite"> & {
82
+ /**
83
+ * @generated from field: string invite_id = 1;
84
+ */
85
+ inviteId: string;
86
+ };
87
+
88
+ /**
89
+ * Describes the message kusinta.iot.webrtc.v1.ResendInvite.
90
+ * Use `create(ResendInviteSchema)` to create a new message.
91
+ */
92
+ export declare const ResendInviteSchema: GenMessage<ResendInvite>;
93
+
94
+ /**
95
+ * Ends a pending invite: neither secret works from now on. Answered with ManagementAck.
96
+ *
97
+ * @generated from message kusinta.iot.webrtc.v1.RevokeInvite
98
+ */
99
+ export declare type RevokeInvite = Message<"kusinta.iot.webrtc.v1.RevokeInvite"> & {
100
+ /**
101
+ * @generated from field: string invite_id = 1;
102
+ */
103
+ inviteId: string;
104
+ };
105
+
106
+ /**
107
+ * Describes the message kusinta.iot.webrtc.v1.RevokeInvite.
108
+ * Use `create(RevokeInviteSchema)` to create a new message.
109
+ */
110
+ export declare const RevokeInviteSchema: GenMessage<RevokeInvite>;
111
+
112
+ /**
113
+ * Records that the email carrying this invite's newest secrets was sent, so the list can
114
+ * say whether it ever left. Sent by the app after the api-server has accepted the email,
115
+ * and again after each resend. Only the time is kept. Answered with ManagementAck.
116
+ *
117
+ * @generated from message kusinta.iot.webrtc.v1.MarkInviteEmailSent
118
+ */
119
+ export declare type MarkInviteEmailSent = Message<"kusinta.iot.webrtc.v1.MarkInviteEmailSent"> & {
120
+ /**
121
+ * @generated from field: string invite_id = 1;
122
+ */
123
+ inviteId: string;
124
+ };
125
+
126
+ /**
127
+ * Describes the message kusinta.iot.webrtc.v1.MarkInviteEmailSent.
128
+ * Use `create(MarkInviteEmailSentSchema)` to create a new message.
129
+ */
130
+ export declare const MarkInviteEmailSentSchema: GenMessage<MarkInviteEmailSent>;
131
+
132
+ /**
133
+ * The pending invites and join requests of a space. Answered with SpaceInvites. Listed
134
+ * only to a caller who may create invites on the space; anyone else is refused as
135
+ * NOT_ENTITLED. A resident is listed only the invites a resident of their home made,
136
+ * and the join requests those made: nothing they cannot act on.
137
+ *
138
+ * @generated from message kusinta.iot.webrtc.v1.ListSpaceInvites
139
+ */
140
+ export declare type ListSpaceInvites = Message<"kusinta.iot.webrtc.v1.ListSpaceInvites"> & {
141
+ /**
142
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 1;
143
+ */
144
+ spaceId?: SpaceId | undefined;
145
+ };
146
+
147
+ /**
148
+ * Describes the message kusinta.iot.webrtc.v1.ListSpaceInvites.
149
+ * Use `create(ListSpaceInvitesSchema)` to create a new message.
150
+ */
151
+ export declare const ListSpaceInvitesSchema: GenMessage<ListSpaceInvites>;
152
+
153
+ /**
154
+ * Files the person who made a join request on its space, with its relation, and the role
155
+ * that relation gives. Answered with ManagementAck.
156
+ *
157
+ * Who may approve is the gateway's decision: whoever may put people on that space, and,
158
+ * for a request that came from an invite a resident created, a resident of that home.
159
+ *
160
+ * @generated from message kusinta.iot.webrtc.v1.ApproveJoinRequest
161
+ */
162
+ export declare type ApproveJoinRequest = Message<"kusinta.iot.webrtc.v1.ApproveJoinRequest"> & {
163
+ /**
164
+ * @generated from field: string request_id = 1;
165
+ */
166
+ requestId: string;
167
+ };
168
+
169
+ /**
170
+ * Describes the message kusinta.iot.webrtc.v1.ApproveJoinRequest.
171
+ * Use `create(ApproveJoinRequestSchema)` to create a new message.
172
+ */
173
+ export declare const ApproveJoinRequestSchema: GenMessage<ApproveJoinRequest>;
174
+
175
+ /**
176
+ * Drops a join request. The person is told nothing beyond never being let in. Answered
177
+ * with ManagementAck.
178
+ *
179
+ * @generated from message kusinta.iot.webrtc.v1.DenyJoinRequest
180
+ */
181
+ export declare type DenyJoinRequest = Message<"kusinta.iot.webrtc.v1.DenyJoinRequest"> & {
182
+ /**
183
+ * @generated from field: string request_id = 1;
184
+ */
185
+ requestId: string;
186
+ };
187
+
188
+ /**
189
+ * Describes the message kusinta.iot.webrtc.v1.DenyJoinRequest.
190
+ * Use `create(DenyJoinRequestSchema)` to create a new message.
191
+ */
192
+ export declare const DenyJoinRequestSchema: GenMessage<DenyJoinRequest>;
193
+
194
+ /**
195
+ * A pending invite, as listed. Never carries a secret: the gateway does not keep them.
196
+ *
197
+ * @generated from message kusinta.iot.webrtc.v1.Invite
198
+ */
199
+ export declare type Invite = Message<"kusinta.iot.webrtc.v1.Invite"> & {
200
+ /**
201
+ * Minted by the gateway, opaque.
202
+ *
203
+ * @generated from field: string invite_id = 1;
204
+ */
205
+ inviteId: string;
206
+
207
+ /**
208
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 2;
209
+ */
210
+ spaceId?: SpaceId | undefined;
211
+
212
+ /**
213
+ * @generated from field: kusinta.iot.access.v1.MembershipRelation relation = 3;
214
+ */
215
+ relation: MembershipRelation;
216
+
217
+ /**
218
+ * Who created it, and when. A resend changes neither.
219
+ *
220
+ * @generated from field: kusinta.iot.identity.v1.UserId created_by = 4;
221
+ */
222
+ createdBy?: UserId | undefined;
223
+
224
+ /**
225
+ * @generated from field: google.protobuf.Timestamp created_at = 5;
226
+ */
227
+ createdAt?: Timestamp | undefined;
228
+
229
+ /**
230
+ * Until when each secret can be redeemed. The app shows them in local time and never
231
+ * works them out itself. Once both have passed the invite is gone: it is not listed, and
232
+ * the gateway drops it with its address.
233
+ *
234
+ * @generated from field: google.protobuf.Timestamp token_expires_at = 6;
235
+ */
236
+ tokenExpiresAt?: Timestamp | undefined;
237
+
238
+ /**
239
+ * @generated from field: google.protobuf.Timestamp code_expires_at = 7;
240
+ */
241
+ codeExpiresAt?: Timestamp | undefined;
242
+
243
+ /**
244
+ * The address it is bound to; empty when it is bound to none.
245
+ *
246
+ * @generated from field: string email = 8;
247
+ */
248
+ email: string;
249
+
250
+ /**
251
+ * When the email with the newest secrets was sent (MarkInviteEmailSent). Unset when no
252
+ * email was sent since the last resend.
253
+ *
254
+ * @generated from field: google.protobuf.Timestamp email_sent_at = 9;
255
+ */
256
+ emailSentAt?: Timestamp | undefined;
257
+ };
258
+
259
+ /**
260
+ * Describes the message kusinta.iot.webrtc.v1.Invite.
261
+ * Use `create(InviteSchema)` to create a new message.
262
+ */
263
+ export declare const InviteSchema: GenMessage<Invite>;
264
+
265
+ /**
266
+ * A new invite or a resent one, with its secrets. This is the only time they are told:
267
+ * the gateway keeps only their hashes, and the app does not keep them beyond handing them
268
+ * over.
269
+ *
270
+ * @generated from message kusinta.iot.webrtc.v1.IssuedInvite
271
+ */
272
+ export declare type IssuedInvite = Message<"kusinta.iot.webrtc.v1.IssuedInvite"> & {
273
+ /**
274
+ * @generated from field: kusinta.iot.webrtc.v1.Invite invite = 1;
275
+ */
276
+ invite?: Invite | undefined;
277
+
278
+ /**
279
+ * @generated from field: string token = 2;
280
+ */
281
+ token: string;
282
+
283
+ /**
284
+ * @generated from field: string code = 3;
285
+ */
286
+ code: string;
287
+ };
288
+
289
+ /**
290
+ * Describes the message kusinta.iot.webrtc.v1.IssuedInvite.
291
+ * Use `create(IssuedInviteSchema)` to create a new message.
292
+ */
293
+ export declare const IssuedInviteSchema: GenMessage<IssuedInvite>;
294
+
295
+ /**
296
+ * A person who redeemed an invite that needs approval, waiting for it.
297
+ *
298
+ * @generated from message kusinta.iot.webrtc.v1.JoinRequest
299
+ */
300
+ export declare type JoinRequest = Message<"kusinta.iot.webrtc.v1.JoinRequest"> & {
301
+ /**
302
+ * Minted by the gateway, opaque.
303
+ *
304
+ * @generated from field: string request_id = 1;
305
+ */
306
+ requestId: string;
307
+
308
+ /**
309
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 2;
310
+ */
311
+ spaceId?: SpaceId | undefined;
312
+
313
+ /**
314
+ * @generated from field: kusinta.iot.access.v1.MembershipRelation relation = 3;
315
+ */
316
+ relation: MembershipRelation;
317
+
318
+ /**
319
+ * Who is asking to join, and the display name their account gave when they redeemed.
320
+ *
321
+ * @generated from field: kusinta.iot.identity.v1.UserId user_id = 4;
322
+ */
323
+ userId?: UserId | undefined;
324
+
325
+ /**
326
+ * @generated from field: string display_name = 5;
327
+ */
328
+ displayName: string;
329
+
330
+ /**
331
+ * Who created the invite that was redeemed.
332
+ *
333
+ * @generated from field: kusinta.iot.identity.v1.UserId invited_by = 6;
334
+ */
335
+ invitedBy?: UserId | undefined;
336
+
337
+ /**
338
+ * @generated from field: google.protobuf.Timestamp requested_at = 7;
339
+ */
340
+ requestedAt?: Timestamp | undefined;
341
+
342
+ /**
343
+ * When the request lapses unanswered, and the gateway drops it as if denied.
344
+ *
345
+ * @generated from field: google.protobuf.Timestamp expires_at = 8;
346
+ */
347
+ expiresAt?: Timestamp | undefined;
348
+
349
+ /**
350
+ * The verified email address of the account asking (signaling.v1.RedeemInvite), shown to
351
+ * whoever may approve the request, a resident approver included. A display name is
352
+ * whatever the person chose; this is what lets an approver tell who is really asking. The
353
+ * app tells a person redeeming that their address will be shown so. Kept only while the
354
+ * request is pending.
355
+ *
356
+ * @generated from field: string email = 9;
357
+ */
358
+ email: string;
359
+ };
360
+
361
+ /**
362
+ * Describes the message kusinta.iot.webrtc.v1.JoinRequest.
363
+ * Use `create(JoinRequestSchema)` to create a new message.
364
+ */
365
+ export declare const JoinRequestSchema: GenMessage<JoinRequest>;
366
+
367
+ /**
368
+ * What a space is waiting on: its pending invites and its join requests.
369
+ *
370
+ * The answer to ListSpaceInvites, and pushed as GatewayMessage.space_invites whenever
371
+ * either list changes — a create, resend, revoke, redeem, approval, denial or expiry — to
372
+ * every session that may list it, so the app shows the change without reloading. A push
373
+ * always carries the whole of both lists for its space, as ListSpaceInvites would list
374
+ * them to that session.
375
+ *
376
+ * @generated from message kusinta.iot.webrtc.v1.SpaceInvites
377
+ */
378
+ export declare type SpaceInvites = Message<"kusinta.iot.webrtc.v1.SpaceInvites"> & {
379
+ /**
380
+ * @generated from field: kusinta.iot.identity.v1.SpaceId space_id = 1;
381
+ */
382
+ spaceId?: SpaceId | undefined;
383
+
384
+ /**
385
+ * @generated from field: repeated kusinta.iot.webrtc.v1.Invite invites = 2;
386
+ */
387
+ invites: Invite[];
388
+
389
+ /**
390
+ * @generated from field: repeated kusinta.iot.webrtc.v1.JoinRequest join_requests = 3;
391
+ */
392
+ joinRequests: JoinRequest[];
393
+ };
394
+
395
+ /**
396
+ * Describes the message kusinta.iot.webrtc.v1.SpaceInvites.
397
+ * Use `create(SpaceInvitesSchema)` to create a new message.
398
+ */
399
+ export declare const SpaceInvitesSchema: GenMessage<SpaceInvites>;
400
+
@@ -0,0 +1,92 @@
1
+ // @generated by protoc-gen-es v2.12.0 with parameter "target=js+dts,import_extension=js"
2
+ // @generated from file kusinta/iot/webrtc/v1/invite.proto (package kusinta.iot.webrtc.v1, syntax proto3)
3
+ /* eslint-disable */
4
+
5
+ import { fileDesc, messageDesc } from "@bufbuild/protobuf/codegenv2";
6
+ import { file_google_protobuf_timestamp } from "@bufbuild/protobuf/wkt";
7
+ import { file_kusinta_iot_access_v1_roles } from "../../access/v1/roles_pb.js";
8
+ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identity_pb.js";
9
+
10
+ /**
11
+ * Describes the file kusinta/iot/webrtc/v1/invite.proto.
12
+ */
13
+ export const file_kusinta_iot_webrtc_v1_invite = /*@__PURE__*/
14
+ fileDesc("CiJrdXNpbnRhL2lvdC93ZWJydGMvdjEvaW52aXRlLnByb3RvEhVrdXNpbnRhLmlvdC53ZWJydGMudjEijgEKDENyZWF0ZUludml0ZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSOwoIcmVsYXRpb24YAiABKA4yKS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuTWVtYmVyc2hpcFJlbGF0aW9uEg0KBWVtYWlsGAMgASgJIiEKDFJlc2VuZEludml0ZRIRCglpbnZpdGVfaWQYASABKAkiIQoMUmV2b2tlSW52aXRlEhEKCWludml0ZV9pZBgBIAEoCSIoChNNYXJrSW52aXRlRW1haWxTZW50EhEKCWludml0ZV9pZBgBIAEoCSJGChBMaXN0U3BhY2VJbnZpdGVzEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZCIoChJBcHByb3ZlSm9pblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCSIlCg9EZW55Sm9pblJlcXVlc3QSEgoKcmVxdWVzdF9pZBgBIAEoCSKeAwoGSW52aXRlEhEKCWludml0ZV9pZBgBIAEoCRIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSOwoIcmVsYXRpb24YAyABKA4yKS5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuTWVtYmVyc2hpcFJlbGF0aW9uEjMKCmNyZWF0ZWRfYnkYBCABKAsyHy5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Vc2VySWQSLgoKY3JlYXRlZF9hdBgFIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASNAoQdG9rZW5fZXhwaXJlc19hdBgGIAEoCzIaLmdvb2dsZS5wcm90b2J1Zi5UaW1lc3RhbXASMwoPY29kZV9leHBpcmVzX2F0GAcgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcBINCgVlbWFpbBgIIAEoCRIxCg1lbWFpbF9zZW50X2F0GAkgASgLMhouZ29vZ2xlLnByb3RvYnVmLlRpbWVzdGFtcCJaCgxJc3N1ZWRJbnZpdGUSLQoGaW52aXRlGAEgASgLMh0ua3VzaW50YS5pb3Qud2VicnRjLnYxLkludml0ZRINCgV0b2tlbhgCIAEoCRIMCgRjb2RlGAMgASgJIoADCgtKb2luUmVxdWVzdBISCgpyZXF1ZXN0X2lkGAEgASgJEjIKCHNwYWNlX2lkGAIgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI7CghyZWxhdGlvbhgDIAEoDjIpLmt1c2ludGEuaW90LmFjY2Vzcy52MS5NZW1iZXJzaGlwUmVsYXRpb24SMAoHdXNlcl9pZBgEIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBIUCgxkaXNwbGF5X25hbWUYBSABKAkSMwoKaW52aXRlZF9ieRgGIAEoCzIfLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlVzZXJJZBIwCgxyZXF1ZXN0ZWRfYXQYByABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEi4KCmV4cGlyZXNfYXQYCCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEg0KBWVtYWlsGAkgASgJIq0BCgxTcGFjZUludml0ZXMSMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEi4KB2ludml0ZXMYAiADKAsyHS5rdXNpbnRhLmlvdC53ZWJydGMudjEuSW52aXRlEjkKDWpvaW5fcmVxdWVzdHMYAyADKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuSm9pblJlcXVlc3RCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_roles, file_kusinta_iot_identity_v1_identity]);
15
+
16
+ /**
17
+ * Describes the message kusinta.iot.webrtc.v1.CreateInvite.
18
+ * Use `create(CreateInviteSchema)` to create a new message.
19
+ */
20
+ export const CreateInviteSchema = /*@__PURE__*/
21
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 0);
22
+
23
+ /**
24
+ * Describes the message kusinta.iot.webrtc.v1.ResendInvite.
25
+ * Use `create(ResendInviteSchema)` to create a new message.
26
+ */
27
+ export const ResendInviteSchema = /*@__PURE__*/
28
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 1);
29
+
30
+ /**
31
+ * Describes the message kusinta.iot.webrtc.v1.RevokeInvite.
32
+ * Use `create(RevokeInviteSchema)` to create a new message.
33
+ */
34
+ export const RevokeInviteSchema = /*@__PURE__*/
35
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 2);
36
+
37
+ /**
38
+ * Describes the message kusinta.iot.webrtc.v1.MarkInviteEmailSent.
39
+ * Use `create(MarkInviteEmailSentSchema)` to create a new message.
40
+ */
41
+ export const MarkInviteEmailSentSchema = /*@__PURE__*/
42
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 3);
43
+
44
+ /**
45
+ * Describes the message kusinta.iot.webrtc.v1.ListSpaceInvites.
46
+ * Use `create(ListSpaceInvitesSchema)` to create a new message.
47
+ */
48
+ export const ListSpaceInvitesSchema = /*@__PURE__*/
49
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 4);
50
+
51
+ /**
52
+ * Describes the message kusinta.iot.webrtc.v1.ApproveJoinRequest.
53
+ * Use `create(ApproveJoinRequestSchema)` to create a new message.
54
+ */
55
+ export const ApproveJoinRequestSchema = /*@__PURE__*/
56
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 5);
57
+
58
+ /**
59
+ * Describes the message kusinta.iot.webrtc.v1.DenyJoinRequest.
60
+ * Use `create(DenyJoinRequestSchema)` to create a new message.
61
+ */
62
+ export const DenyJoinRequestSchema = /*@__PURE__*/
63
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 6);
64
+
65
+ /**
66
+ * Describes the message kusinta.iot.webrtc.v1.Invite.
67
+ * Use `create(InviteSchema)` to create a new message.
68
+ */
69
+ export const InviteSchema = /*@__PURE__*/
70
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 7);
71
+
72
+ /**
73
+ * Describes the message kusinta.iot.webrtc.v1.IssuedInvite.
74
+ * Use `create(IssuedInviteSchema)` to create a new message.
75
+ */
76
+ export const IssuedInviteSchema = /*@__PURE__*/
77
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 8);
78
+
79
+ /**
80
+ * Describes the message kusinta.iot.webrtc.v1.JoinRequest.
81
+ * Use `create(JoinRequestSchema)` to create a new message.
82
+ */
83
+ export const JoinRequestSchema = /*@__PURE__*/
84
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 9);
85
+
86
+ /**
87
+ * Describes the message kusinta.iot.webrtc.v1.SpaceInvites.
88
+ * Use `create(SpaceInvitesSchema)` to create a new message.
89
+ */
90
+ export const SpaceInvitesSchema = /*@__PURE__*/
91
+ messageDesc(file_kusinta_iot_webrtc_v1_invite, 10);
92
+
@@ -13,6 +13,7 @@ import type { LinkFunction, LinkMode, LinkSettings } from "../../link/v1/link_pb
13
13
  import type { ClimateModeKind, ClimateSummaryPeriod } from "../../climate/v1/climate_pb.js";
14
14
  import type { Timestamp } from "@bufbuild/protobuf/wkt";
15
15
  import type { ServiceSignal } from "../../access/v1/acl_pb.js";
16
+ import type { ApproveJoinRequest, CreateInvite, DenyJoinRequest, ListSpaceInvites, MarkInviteEmailSent, ResendInvite, RevokeInvite } from "./invite_pb.js";
16
17
 
17
18
  /**
18
19
  * Describes the file kusinta/iot/webrtc/v1/management.proto.
@@ -1295,6 +1296,50 @@ export declare type ManagementRequest = Message<"kusinta.iot.webrtc.v1.Managemen
1295
1296
  */
1296
1297
  value: ReconnectConnector;
1297
1298
  case: "reconnectConnector";
1299
+ } | {
1300
+ /**
1301
+ * Invites; see invite.proto.
1302
+ *
1303
+ * @generated from field: kusinta.iot.webrtc.v1.CreateInvite create_invite = 24;
1304
+ */
1305
+ value: CreateInvite;
1306
+ case: "createInvite";
1307
+ } | {
1308
+ /**
1309
+ * @generated from field: kusinta.iot.webrtc.v1.ResendInvite resend_invite = 25;
1310
+ */
1311
+ value: ResendInvite;
1312
+ case: "resendInvite";
1313
+ } | {
1314
+ /**
1315
+ * @generated from field: kusinta.iot.webrtc.v1.RevokeInvite revoke_invite = 26;
1316
+ */
1317
+ value: RevokeInvite;
1318
+ case: "revokeInvite";
1319
+ } | {
1320
+ /**
1321
+ * @generated from field: kusinta.iot.webrtc.v1.MarkInviteEmailSent mark_invite_email_sent = 27;
1322
+ */
1323
+ value: MarkInviteEmailSent;
1324
+ case: "markInviteEmailSent";
1325
+ } | {
1326
+ /**
1327
+ * @generated from field: kusinta.iot.webrtc.v1.ListSpaceInvites list_space_invites = 28;
1328
+ */
1329
+ value: ListSpaceInvites;
1330
+ case: "listSpaceInvites";
1331
+ } | {
1332
+ /**
1333
+ * @generated from field: kusinta.iot.webrtc.v1.ApproveJoinRequest approve_join_request = 29;
1334
+ */
1335
+ value: ApproveJoinRequest;
1336
+ case: "approveJoinRequest";
1337
+ } | {
1338
+ /**
1339
+ * @generated from field: kusinta.iot.webrtc.v1.DenyJoinRequest deny_join_request = 30;
1340
+ */
1341
+ value: DenyJoinRequest;
1342
+ case: "denyJoinRequest";
1298
1343
  } | { case: undefined; value?: undefined };
1299
1344
  };
1300
1345
 
@@ -12,12 +12,13 @@ import { file_kusinta_iot_identity_v1_identity } from "../../identity/v1/identit
12
12
  import { file_kusinta_iot_link_v1_link } from "../../link/v1/link_pb.js";
13
13
  import { file_kusinta_iot_space_v1_space } from "../../space/v1/space_pb.js";
14
14
  import { file_kusinta_iot_vendor_lorawan_v1_lorawan } from "../../vendor/lorawan/v1/lorawan_pb.js";
15
+ import { file_kusinta_iot_webrtc_v1_invite } from "./invite_pb.js";
15
16
 
16
17
  /**
17
18
  * Describes the file kusinta/iot/webrtc/v1/management.proto.
18
19
  */
19
20
  export const file_kusinta_iot_webrtc_v1_management = /*@__PURE__*/
20
- fileDesc("CiZrdXNpbnRhL2lvdC93ZWJydGMvdjEvbWFuYWdlbWVudC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxItYBCgtDcmVhdGVTcGFjZRI0CgpzcGFjZV90eXBlGAEgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg0KBWZsb29yGAQgASgFEjkKD3BhcmVudF9zcGFjZV9pZBgFIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSFgoJdGltZV96b25lGAYgASgJSACIAQFCDAoKX3RpbWVfem9uZSL1AgoLVXBkYXRlU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjkKCnNwYWNlX3R5cGUYAiABKA4yIC5rdXNpbnRhLmlvdC5jb21tb24udjEuU3BhY2VUeXBlSAGIAQESEQoEbmFtZRgDIAEoCUgCiAEBEhgKC2Rlc2NyaXB0aW9uGAQgASgJSAOIAQESEgoFZmxvb3IYBSABKAVIBIgBARI7Cg9wYXJlbnRfc3BhY2VfaWQYBiABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkSAASEAoGZGV0YWNoGAcgASgISAASFgoJdGltZV96b25lGAggASgJSAWIAQFCDwoNcGFyZW50X2NoYW5nZUINCgtfc3BhY2VfdHlwZUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb25CCAoGX2Zsb29yQgwKCl90aW1lX3pvbmUiUgoLRGVsZXRlU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEg8KB2Nhc2NhZGUYAiABKAgivAEKEUFzc2lnblVzZXJUb1NwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEjsKCHJlbGF0aW9uGAQgASgOMikua3VzaW50YS5pb3QuYWNjZXNzLnYxLk1lbWJlcnNoaXBSZWxhdGlvbkoECAMQBCJ7ChNSZW1vdmVVc2VyRnJvbVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkIn4KElBsYWNlRGV2aWNlSW5TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQigQEKFVJlbW92ZURldmljZUZyb21TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQi2AEKC0NsYWltRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEj0KCW93bmVyc2hpcBgCIAEoDjIqLmt1c2ludGEuaW90LmNvbW1vbi52MS5EZXZpY2VPd25lcnNoaXBUeXBlEjoKEGluaXRpYWxfc3BhY2VfaWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEhgKEHBvc3Nlc3Npb25fcHJvb2YYBCABKAkiRQoNUmVsZWFzZURldmljZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCKjAQoPUHJvdmlzaW9uRGV2aWNlEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEkUKB2xvcmF3YW4YAiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IubG9yYXdhbi52MS5Mb3Jhd2FuUHJvdmlzaW9uaW5nSABCDQoLY3JlZGVudGlhbHMiRQoKTGlzdFNwYWNlcxI3Cg1yb290X3NwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZCI4CglTcGFjZVRyZWUSKwoGc3BhY2VzGAEgAygLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2UiDwoNTWFuYWdlbWVudEFjayKRAgoQQ3JlYXRlRGV2aWNlTGluaxIxCgZzZW5kZXIYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCghyZWNlaXZlchgCIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjMKCGZ1bmN0aW9uGAMgASgOMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rRnVuY3Rpb24SKwoEbW9kZRgEIAEoDjIdLmt1c2ludGEuaW90LmxpbmsudjEuTGlua01vZGUSMwoIc2V0dGluZ3MYBSABKAsyIS5rdXNpbnRhLmlvdC5saW5rLnYxLkxpbmtTZXR0aW5ncyIjChBSZW1vdmVEZXZpY2VMaW5rEg8KB2xpbmtfaWQYASABKAkiWAoQVXBkYXRlRGV2aWNlTGluaxIPCgdsaW5rX2lkGAEgASgJEjMKCHNldHRpbmdzGAIgASgLMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rU2V0dGluZ3MiRwoPTGlzdERldmljZUxpbmtzEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkInwKDVNldFJvb21UYXJnZXQSMQoHcm9vbV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSIAoTdGFyZ2V0X2NlbnRpZGVncmVlcxgCIAEoEUgAiAEBQhYKFF90YXJnZXRfY2VudGlkZWdyZWVzIkQKC1Jvb21TZW5zb3JzEjUKCnNlbnNvcl9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJ0CgpSb29tTGltaXRzEh0KEG1pbl9jZW50aWRlZ3JlZXMYASABKBFIAIgBARIdChBtYXhfY2VudGlkZWdyZWVzGAIgASgRSAGIAQFCEwoRX21pbl9jZW50aWRlZ3JlZXNCEwoRX21heF9jZW50aWRlZ3JlZXMi7QEKFENvbmZpZ3VyZVJvb21DbGltYXRlEjEKB3Jvb21faWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjEKBmxpbWl0cxgCIAEoCzIhLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Sb29tTGltaXRzEjMKB3NlbnNvcnMYAyABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUm9vbVNlbnNvcnMSIQoUbG9ja19kZXZpY2VfY29udHJvbHMYBCABKAhIAIgBAUIXChVfbG9ja19kZXZpY2VfY29udHJvbHMikwIKDlNldENsaW1hdGVNb2RlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI1CgRraW5kGAIgASgOMicua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlTW9kZUtpbmQSIQoUc2V0YmFja19jZW50aWRlZ3JlZXMYAyABKBFIAIgBARItCglzdGFydHNfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB2VuZHNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQhcKFV9zZXRiYWNrX2NlbnRpZGVncmVlcyJLChBMaXN0Um9vbUNsaW1hdGVzEjcKDXJvb3Rfc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkIp8BCg5HZXRSb29tSGlzdG9yeRIxCgdyb29tX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBItCglmcm9tX3RpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB3RvX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIt8BChFQcml2YWN5RGlzY2xvc3VyZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPAoPc2VydmljZV9wYXJ0aWVzGAUgAygLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VQYXJ0eRJMChZjbGltYXRlX3N1bW1hcnlfcGVyaW9kGAQgASgOMiwua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlU3VtbWFyeVBlcmlvZEoECAIQA0oECAMQBCJwCgxTZXJ2aWNlUGFydHkSKQoEcm9sZRgBIAEoDjIbLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Sb2xlEjUKB3NpZ25hbHMYAiADKA4yJC5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuU2VydmljZVNpZ25hbCJKChRHZXRQcml2YWN5RGlzY2xvc3VyZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQi7gEKGkdldEFwYXJ0bWVudENsaW1hdGVTdW1tYXJ5EjYKDGFwYXJ0bWVudF9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPAoGcGVyaW9kGAIgASgOMiwua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlU3VtbWFyeVBlcmlvZBItCglmcm9tX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB3RvX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKElJlY29ubmVjdENvbm5lY3RvchI6Cgxjb25uZWN0b3JfaWQYASABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZCLuDAoRTWFuYWdlbWVudFJlcXVlc3QSOgoMY3JlYXRlX3NwYWNlGAEgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkNyZWF0ZVNwYWNlSAASOgoMdXBkYXRlX3NwYWNlGAIgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLlVwZGF0ZVNwYWNlSAASOgoMZGVsZXRlX3NwYWNlGAMgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkRlbGV0ZVNwYWNlSAASSAoUYXNzaWduX3VzZXJfdG9fc3BhY2UYBCABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXNzaWduVXNlclRvU3BhY2VIABJMChZyZW1vdmVfdXNlcl9mcm9tX3NwYWNlGAUgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLlJlbW92ZVVzZXJGcm9tU3BhY2VIABJKChVwbGFjZV9kZXZpY2VfaW5fc3BhY2UYBiABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGxhY2VEZXZpY2VJblNwYWNlSAASUAoYcmVtb3ZlX2RldmljZV9mcm9tX3NwYWNlGAcgASgLMiwua3VzaW50YS5pb3Qud2VicnRjLnYxLlJlbW92ZURldmljZUZyb21TcGFjZUgAEjoKDGNsYWltX2RldmljZRgIIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5DbGFpbURldmljZUgAEj4KDnJlbGVhc2VfZGV2aWNlGAkgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLlJlbGVhc2VEZXZpY2VIABI4CgtsaXN0X3NwYWNlcxgKIAEoCzIhLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaXN0U3BhY2VzSAASRQoSY3JlYXRlX2RldmljZV9saW5rGAsgASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLkNyZWF0ZURldmljZUxpbmtIABJFChJyZW1vdmVfZGV2aWNlX2xpbmsYDCABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVtb3ZlRGV2aWNlTGlua0gAEkMKEWxpc3RfZGV2aWNlX2xpbmtzGA0gASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpc3REZXZpY2VMaW5rc0gAEkUKEnVwZGF0ZV9kZXZpY2VfbGluaxgOIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5VcGRhdGVEZXZpY2VMaW5rSAASQgoQcHJvdmlzaW9uX2RldmljZRgPIAEoCzImLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcm92aXNpb25EZXZpY2VIABI/Cg9zZXRfcm9vbV90YXJnZXQYECABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuU2V0Um9vbVRhcmdldEgAEk0KFmNvbmZpZ3VyZV9yb29tX2NsaW1hdGUYESABKAsyKy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29uZmlndXJlUm9vbUNsaW1hdGVIABJBChBzZXRfY2xpbWF0ZV9tb2RlGBIgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldENsaW1hdGVNb2RlSAASRQoSbGlzdF9yb29tX2NsaW1hdGVzGBMgASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpc3RSb29tQ2xpbWF0ZXNIABJBChBnZXRfcm9vbV9oaXN0b3J5GBQgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLkdldFJvb21IaXN0b3J5SAASTQoWZ2V0X3ByaXZhY3lfZGlzY2xvc3VyZRgVIAEoCzIrLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HZXRQcml2YWN5RGlzY2xvc3VyZUgAEloKHWdldF9hcGFydG1lbnRfY2xpbWF0ZV9zdW1tYXJ5GBYgASgLMjEua3VzaW50YS5pb3Qud2VicnRjLnYxLkdldEFwYXJ0bWVudENsaW1hdGVTdW1tYXJ5SAASSAoTcmVjb25uZWN0X2Nvbm5lY3RvchgXIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5SZWNvbm5lY3RDb25uZWN0b3JIAEIJCgdyZXF1ZXN0QgJIAWIGcHJvdG8z", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_access_v1_roles, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_vendor_lorawan_v1_lorawan]);
21
+ fileDesc("CiZrdXNpbnRhL2lvdC93ZWJydGMvdjEvbWFuYWdlbWVudC5wcm90bxIVa3VzaW50YS5pb3Qud2VicnRjLnYxItYBCgtDcmVhdGVTcGFjZRI0CgpzcGFjZV90eXBlGAEgASgOMiAua3VzaW50YS5pb3QuY29tbW9uLnYxLlNwYWNlVHlwZRIMCgRuYW1lGAIgASgJEhMKC2Rlc2NyaXB0aW9uGAMgASgJEg0KBWZsb29yGAQgASgFEjkKD3BhcmVudF9zcGFjZV9pZBgFIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSFgoJdGltZV96b25lGAYgASgJSACIAQFCDAoKX3RpbWVfem9uZSL1AgoLVXBkYXRlU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjkKCnNwYWNlX3R5cGUYAiABKA4yIC5rdXNpbnRhLmlvdC5jb21tb24udjEuU3BhY2VUeXBlSAGIAQESEQoEbmFtZRgDIAEoCUgCiAEBEhgKC2Rlc2NyaXB0aW9uGAQgASgJSAOIAQESEgoFZmxvb3IYBSABKAVIBIgBARI7Cg9wYXJlbnRfc3BhY2VfaWQYBiABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkSAASEAoGZGV0YWNoGAcgASgISAASFgoJdGltZV96b25lGAggASgJSAWIAQFCDwoNcGFyZW50X2NoYW5nZUINCgtfc3BhY2VfdHlwZUIHCgVfbmFtZUIOCgxfZGVzY3JpcHRpb25CCAoGX2Zsb29yQgwKCl90aW1lX3pvbmUiUgoLRGVsZXRlU3BhY2USMgoIc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEg8KB2Nhc2NhZGUYAiABKAgivAEKEUFzc2lnblVzZXJUb1NwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkEjsKCHJlbGF0aW9uGAQgASgOMikua3VzaW50YS5pb3QuYWNjZXNzLnYxLk1lbWJlcnNoaXBSZWxhdGlvbkoECAMQBCJ7ChNSZW1vdmVVc2VyRnJvbVNwYWNlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBIwCgd1c2VyX2lkGAIgASgLMh8ua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuVXNlcklkIn4KElBsYWNlRGV2aWNlSW5TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQigQEKFVJlbW92ZURldmljZUZyb21TcGFjZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIyCghzcGFjZV9pZBgCIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQi2AEKC0NsYWltRGV2aWNlEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEj0KCW93bmVyc2hpcBgCIAEoDjIqLmt1c2ludGEuaW90LmNvbW1vbi52MS5EZXZpY2VPd25lcnNoaXBUeXBlEjoKEGluaXRpYWxfc3BhY2VfaWQYAyABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEhgKEHBvc3Nlc3Npb25fcHJvb2YYBCABKAkiRQoNUmVsZWFzZURldmljZRI0CglkZXZpY2VfaWQYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCKjAQoPUHJvdmlzaW9uRGV2aWNlEjoKDGNvbm5lY3Rvcl9pZBgBIAEoCzIkLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkNvbm5lY3RvcklkEkUKB2xvcmF3YW4YAiABKAsyMi5rdXNpbnRhLmlvdC52ZW5kb3IubG9yYXdhbi52MS5Mb3Jhd2FuUHJvdmlzaW9uaW5nSABCDQoLY3JlZGVudGlhbHMiRQoKTGlzdFNwYWNlcxI3Cg1yb290X3NwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZCI4CglTcGFjZVRyZWUSKwoGc3BhY2VzGAEgAygLMhsua3VzaW50YS5pb3Quc3BhY2UudjEuU3BhY2UiDwoNTWFuYWdlbWVudEFjayKRAgoQQ3JlYXRlRGV2aWNlTGluaxIxCgZzZW5kZXIYASABKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZBIzCghyZWNlaXZlchgCIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkEjMKCGZ1bmN0aW9uGAMgASgOMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rRnVuY3Rpb24SKwoEbW9kZRgEIAEoDjIdLmt1c2ludGEuaW90LmxpbmsudjEuTGlua01vZGUSMwoIc2V0dGluZ3MYBSABKAsyIS5rdXNpbnRhLmlvdC5saW5rLnYxLkxpbmtTZXR0aW5ncyIjChBSZW1vdmVEZXZpY2VMaW5rEg8KB2xpbmtfaWQYASABKAkiWAoQVXBkYXRlRGV2aWNlTGluaxIPCgdsaW5rX2lkGAEgASgJEjMKCHNldHRpbmdzGAIgASgLMiEua3VzaW50YS5pb3QubGluay52MS5MaW5rU2V0dGluZ3MiRwoPTGlzdERldmljZUxpbmtzEjQKCWRldmljZV9pZBgBIAEoCzIhLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLkRldmljZUlkInwKDVNldFJvb21UYXJnZXQSMQoHcm9vbV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSIAoTdGFyZ2V0X2NlbnRpZGVncmVlcxgCIAEoEUgAiAEBQhYKFF90YXJnZXRfY2VudGlkZWdyZWVzIkQKC1Jvb21TZW5zb3JzEjUKCnNlbnNvcl9pZHMYASADKAsyIS5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5EZXZpY2VJZCJ0CgpSb29tTGltaXRzEh0KEG1pbl9jZW50aWRlZ3JlZXMYASABKBFIAIgBARIdChBtYXhfY2VudGlkZWdyZWVzGAIgASgRSAGIAQFCEwoRX21pbl9jZW50aWRlZ3JlZXNCEwoRX21heF9jZW50aWRlZ3JlZXMi7QEKFENvbmZpZ3VyZVJvb21DbGltYXRlEjEKB3Jvb21faWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkEjEKBmxpbWl0cxgCIAEoCzIhLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Sb29tTGltaXRzEjMKB3NlbnNvcnMYAyABKAsyIi5rdXNpbnRhLmlvdC53ZWJydGMudjEuUm9vbVNlbnNvcnMSIQoUbG9ja19kZXZpY2VfY29udHJvbHMYBCABKAhIAIgBAUIXChVfbG9ja19kZXZpY2VfY29udHJvbHMikwIKDlNldENsaW1hdGVNb2RlEjIKCHNwYWNlX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBI1CgRraW5kGAIgASgOMicua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlTW9kZUtpbmQSIQoUc2V0YmFja19jZW50aWRlZ3JlZXMYAyABKBFIAIgBARItCglzdGFydHNfYXQYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB2VuZHNfYXQYBSABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wQhcKFV9zZXRiYWNrX2NlbnRpZGVncmVlcyJLChBMaXN0Um9vbUNsaW1hdGVzEjcKDXJvb3Rfc3BhY2VfaWQYASABKAsyIC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5TcGFjZUlkIp8BCg5HZXRSb29tSGlzdG9yeRIxCgdyb29tX2lkGAEgASgLMiAua3VzaW50YS5pb3QuaWRlbnRpdHkudjEuU3BhY2VJZBItCglmcm9tX3RpbWUYAiABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB3RvX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIt8BChFQcml2YWN5RGlzY2xvc3VyZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPAoPc2VydmljZV9wYXJ0aWVzGAUgAygLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLlNlcnZpY2VQYXJ0eRJMChZjbGltYXRlX3N1bW1hcnlfcGVyaW9kGAQgASgOMiwua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlU3VtbWFyeVBlcmlvZEoECAIQA0oECAMQBCJwCgxTZXJ2aWNlUGFydHkSKQoEcm9sZRgBIAEoDjIbLmt1c2ludGEuaW90LmFjY2Vzcy52MS5Sb2xlEjUKB3NpZ25hbHMYAiADKA4yJC5rdXNpbnRhLmlvdC5hY2Nlc3MudjEuU2VydmljZVNpZ25hbCJKChRHZXRQcml2YWN5RGlzY2xvc3VyZRIyCghzcGFjZV9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQi7gEKGkdldEFwYXJ0bWVudENsaW1hdGVTdW1tYXJ5EjYKDGFwYXJ0bWVudF9pZBgBIAEoCzIgLmt1c2ludGEuaW90LmlkZW50aXR5LnYxLlNwYWNlSWQSPAoGcGVyaW9kGAIgASgOMiwua3VzaW50YS5pb3QuY2xpbWF0ZS52MS5DbGltYXRlU3VtbWFyeVBlcmlvZBItCglmcm9tX3RpbWUYAyABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wEisKB3RvX3RpbWUYBCABKAsyGi5nb29nbGUucHJvdG9idWYuVGltZXN0YW1wIlAKElJlY29ubmVjdENvbm5lY3RvchI6Cgxjb25uZWN0b3JfaWQYASABKAsyJC5rdXNpbnRhLmlvdC5pZGVudGl0eS52MS5Db25uZWN0b3JJZCLNEAoRTWFuYWdlbWVudFJlcXVlc3QSOgoMY3JlYXRlX3NwYWNlGAEgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkNyZWF0ZVNwYWNlSAASOgoMdXBkYXRlX3NwYWNlGAIgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLlVwZGF0ZVNwYWNlSAASOgoMZGVsZXRlX3NwYWNlGAMgASgLMiIua3VzaW50YS5pb3Qud2VicnRjLnYxLkRlbGV0ZVNwYWNlSAASSAoUYXNzaWduX3VzZXJfdG9fc3BhY2UYBCABKAsyKC5rdXNpbnRhLmlvdC53ZWJydGMudjEuQXNzaWduVXNlclRvU3BhY2VIABJMChZyZW1vdmVfdXNlcl9mcm9tX3NwYWNlGAUgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLlJlbW92ZVVzZXJGcm9tU3BhY2VIABJKChVwbGFjZV9kZXZpY2VfaW5fc3BhY2UYBiABKAsyKS5rdXNpbnRhLmlvdC53ZWJydGMudjEuUGxhY2VEZXZpY2VJblNwYWNlSAASUAoYcmVtb3ZlX2RldmljZV9mcm9tX3NwYWNlGAcgASgLMiwua3VzaW50YS5pb3Qud2VicnRjLnYxLlJlbW92ZURldmljZUZyb21TcGFjZUgAEjoKDGNsYWltX2RldmljZRgIIAEoCzIiLmt1c2ludGEuaW90LndlYnJ0Yy52MS5DbGFpbURldmljZUgAEj4KDnJlbGVhc2VfZGV2aWNlGAkgASgLMiQua3VzaW50YS5pb3Qud2VicnRjLnYxLlJlbGVhc2VEZXZpY2VIABI4CgtsaXN0X3NwYWNlcxgKIAEoCzIhLmt1c2ludGEuaW90LndlYnJ0Yy52MS5MaXN0U3BhY2VzSAASRQoSY3JlYXRlX2RldmljZV9saW5rGAsgASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLkNyZWF0ZURldmljZUxpbmtIABJFChJyZW1vdmVfZGV2aWNlX2xpbmsYDCABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVtb3ZlRGV2aWNlTGlua0gAEkMKEWxpc3RfZGV2aWNlX2xpbmtzGA0gASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpc3REZXZpY2VMaW5rc0gAEkUKEnVwZGF0ZV9kZXZpY2VfbGluaxgOIAEoCzInLmt1c2ludGEuaW90LndlYnJ0Yy52MS5VcGRhdGVEZXZpY2VMaW5rSAASQgoQcHJvdmlzaW9uX2RldmljZRgPIAEoCzImLmt1c2ludGEuaW90LndlYnJ0Yy52MS5Qcm92aXNpb25EZXZpY2VIABI/Cg9zZXRfcm9vbV90YXJnZXQYECABKAsyJC5rdXNpbnRhLmlvdC53ZWJydGMudjEuU2V0Um9vbVRhcmdldEgAEk0KFmNvbmZpZ3VyZV9yb29tX2NsaW1hdGUYESABKAsyKy5rdXNpbnRhLmlvdC53ZWJydGMudjEuQ29uZmlndXJlUm9vbUNsaW1hdGVIABJBChBzZXRfY2xpbWF0ZV9tb2RlGBIgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLlNldENsaW1hdGVNb2RlSAASRQoSbGlzdF9yb29tX2NsaW1hdGVzGBMgASgLMicua3VzaW50YS5pb3Qud2VicnRjLnYxLkxpc3RSb29tQ2xpbWF0ZXNIABJBChBnZXRfcm9vbV9oaXN0b3J5GBQgASgLMiUua3VzaW50YS5pb3Qud2VicnRjLnYxLkdldFJvb21IaXN0b3J5SAASTQoWZ2V0X3ByaXZhY3lfZGlzY2xvc3VyZRgVIAEoCzIrLmt1c2ludGEuaW90LndlYnJ0Yy52MS5HZXRQcml2YWN5RGlzY2xvc3VyZUgAEloKHWdldF9hcGFydG1lbnRfY2xpbWF0ZV9zdW1tYXJ5GBYgASgLMjEua3VzaW50YS5pb3Qud2VicnRjLnYxLkdldEFwYXJ0bWVudENsaW1hdGVTdW1tYXJ5SAASSAoTcmVjb25uZWN0X2Nvbm5lY3RvchgXIAEoCzIpLmt1c2ludGEuaW90LndlYnJ0Yy52MS5SZWNvbm5lY3RDb25uZWN0b3JIABI8Cg1jcmVhdGVfaW52aXRlGBggASgLMiMua3VzaW50YS5pb3Qud2VicnRjLnYxLkNyZWF0ZUludml0ZUgAEjwKDXJlc2VuZF9pbnZpdGUYGSABKAsyIy5rdXNpbnRhLmlvdC53ZWJydGMudjEuUmVzZW5kSW52aXRlSAASPAoNcmV2b2tlX2ludml0ZRgaIAEoCzIjLmt1c2ludGEuaW90LndlYnJ0Yy52MS5SZXZva2VJbnZpdGVIABJMChZtYXJrX2ludml0ZV9lbWFpbF9zZW50GBsgASgLMioua3VzaW50YS5pb3Qud2VicnRjLnYxLk1hcmtJbnZpdGVFbWFpbFNlbnRIABJFChJsaXN0X3NwYWNlX2ludml0ZXMYHCABKAsyJy5rdXNpbnRhLmlvdC53ZWJydGMudjEuTGlzdFNwYWNlSW52aXRlc0gAEkkKFGFwcHJvdmVfam9pbl9yZXF1ZXN0GB0gASgLMikua3VzaW50YS5pb3Qud2VicnRjLnYxLkFwcHJvdmVKb2luUmVxdWVzdEgAEkMKEWRlbnlfam9pbl9yZXF1ZXN0GB4gASgLMiYua3VzaW50YS5pb3Qud2VicnRjLnYxLkRlbnlKb2luUmVxdWVzdEgAQgkKB3JlcXVlc3RCAkgBYgZwcm90bzM", [file_google_protobuf_timestamp, file_kusinta_iot_access_v1_acl, file_kusinta_iot_access_v1_roles, file_kusinta_iot_climate_v1_climate, file_kusinta_iot_common_v1_types, file_kusinta_iot_identity_v1_identity, file_kusinta_iot_link_v1_link, file_kusinta_iot_space_v1_space, file_kusinta_iot_vendor_lorawan_v1_lorawan, file_kusinta_iot_webrtc_v1_invite]);
21
22
 
22
23
  /**
23
24
  * Describes the message kusinta.iot.webrtc.v1.CreateSpace.